Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions src/coreclr/gcinfo/gcinfoencoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -720,7 +720,8 @@ template <typename GcInfoEncoding> void TGcInfoEncoder<GcInfoEncoding>::SetStack
_ASSERTE(GcInfoEncoding::DENORMALIZE_STACK_BASE_REGISTER(GcInfoEncoding::NORMALIZE_STACK_BASE_REGISTER(regNum)) == regNum);
_ASSERTE( m_StackBaseRegister == NO_STACK_BASE_REGISTER || m_StackBaseRegister == regNum );
#if defined(TARGET_LOONGARCH64)
assert(regNum == 3 || 22 == regNum);
// Note that the regNum == 0 only occurs under interpreter.
assert(regNum == 3 || 22 == regNum || 0 == regNum);
#elif defined(TARGET_RISCV64)
assert(regNum == 2 || 8 == regNum);

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @am11 , does riscv64 also need to modify here? I'm curious why riscv64 can pass the assertion here.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@LuckyXu-HF, tests were passing in May #127919 (comment) so I'm not sure why it wasn't failing if you think it's needed there. Are you running the same test command (with Debug configuration), I can test with latest main branch.

#endif
Expand Down Expand Up @@ -961,7 +962,8 @@ template <typename GcInfoEncoding> void TGcInfoEncoder<GcInfoEncoding>::Build()
// Slim encoding means nothing special, partially interruptible, maybe a default frame register
GCINFO_WRITE(m_Info1, 0, 1, FlagsSize); // Slim encoding
#if defined(TARGET_LOONGARCH64)
assert(m_StackBaseRegister == 22 || 3 == m_StackBaseRegister);
// Note that the m_StackBaseRegister == 0 only occurs under interpreter.
assert(m_StackBaseRegister == 22 || 3 == m_StackBaseRegister || 0 == m_StackBaseRegister);
#elif defined(TARGET_RISCV64)
assert(m_StackBaseRegister == 8 || 2 == m_StackBaseRegister);
#endif
Expand All @@ -976,7 +978,8 @@ template <typename GcInfoEncoding> void TGcInfoEncoder<GcInfoEncoding>::Build()
GCINFO_WRITE(m_Info1, 0 /* unused - was hasPSPSymStackSlot */, 1, FlagsSize);
GCINFO_WRITE(m_Info1, m_contextParamType, 2, FlagsSize);
#if defined(TARGET_LOONGARCH64)
assert(m_StackBaseRegister == 22 || 3 == m_StackBaseRegister);
// Note that the m_StackBaseRegister == 0 only occurs under interpreter.
assert(m_StackBaseRegister == 22 || 3 == m_StackBaseRegister || 0 == m_StackBaseRegister);
#elif defined(TARGET_RISCV64)
assert(m_StackBaseRegister == 8 || 2 == m_StackBaseRegister);
#endif
Expand Down Expand Up @@ -1060,7 +1063,8 @@ template <typename GcInfoEncoding> void TGcInfoEncoder<GcInfoEncoding>::Build()
if(!slimHeader && (m_StackBaseRegister != NO_STACK_BASE_REGISTER))
{
#if defined(TARGET_LOONGARCH64)
assert(m_StackBaseRegister == 22 || 3 == m_StackBaseRegister);
// Note that the m_StackBaseRegister == 0 only occurs under interpreter.
assert(m_StackBaseRegister == 22 || 3 == m_StackBaseRegister || 0 == m_StackBaseRegister);
#elif defined(TARGET_RISCV64)
assert(m_StackBaseRegister == 8 || 2 == m_StackBaseRegister);
#endif
Expand Down
82 changes: 40 additions & 42 deletions src/coreclr/vm/loongarch64/asmhelpers.S
Original file line number Diff line number Diff line change
Expand Up @@ -1201,7 +1201,7 @@ Load_Ref A7, $a7
// $a3 - stack arguments size (properly aligned)
// $a4 - address of continuation return value
NESTED_ENTRY CallJittedMethodRetVoid, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -32
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 32
st.d $a4, $fp, 16
sub.d $sp, $sp, $a3
ori $t2, $a0, 0
Expand All @@ -1222,7 +1222,7 @@ NESTED_END CallJittedMethodRetVoid, _TEXT
// $a3 - stack arguments size (properly aligned)
// $a4 - address of continuation return value
NESTED_ENTRY CallJittedMethodRetBuff, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -32
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 32
st.d $a4, $fp, 16
sub.d $sp, $sp, $a3
ori $t2, $a0, 0
Expand All @@ -1244,7 +1244,7 @@ NESTED_END CallJittedMethodRetBuff, _TEXT
// $a3 - stack arguments size (properly aligned)
// $a4 - address of continuation return value
NESTED_ENTRY CallJittedMethodRetI1, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -32
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 32
st.d $a2, $fp, 16
st.d $a4, $fp, 24
sub.d $sp, $sp, $a3
Expand All @@ -1271,7 +1271,7 @@ NESTED_END CallJittedMethodRetI1, _TEXT
// $a3 - stack arguments size (properly aligned)
// $a4 - address of continuation return value
NESTED_ENTRY CallJittedMethodRetI2, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -32
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 32
st.d $a2, $fp, 16
st.d $a4, $fp, 24
sub.d $sp, $sp, $a3
Expand All @@ -1298,7 +1298,7 @@ NESTED_END CallJittedMethodRetI2, _TEXT
// $a3 - stack arguments size (properly aligned)
// $a4 - address of continuation return value
NESTED_ENTRY CallJittedMethodRetU1, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -32
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 32
st.d $a2, $fp, 16
st.d $a4, $fp, 24
sub.d $sp, $sp, $a3
Expand All @@ -1325,7 +1325,7 @@ NESTED_END CallJittedMethodRetU1, _TEXT
// $a3 - stack arguments size (properly aligned)
// $a4 - address of continuation return value
NESTED_ENTRY CallJittedMethodRetU2, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -32
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 32
st.d $a2, $fp, 16
st.d $a4, $fp, 24
sub.d $sp, $sp, $a3
Expand All @@ -1352,7 +1352,7 @@ NESTED_END CallJittedMethodRetU2, _TEXT
// $a3 - stack arguments size (properly aligned)
// $a4 - address of continuation return value
NESTED_ENTRY CallJittedMethodRetI8, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -32
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 32
st.d $a2, $fp, 16
st.d $a4, $fp, 24
sub.d $sp, $sp, $a3
Expand All @@ -1376,7 +1376,7 @@ NESTED_END CallJittedMethodRetI8, _TEXT
// $a3 - stack arguments size (properly aligned)
// $a4 - address of continuation return value
NESTED_ENTRY CallJittedMethodRetDouble, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -32
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 32
st.d $a2, $fp, 16
st.d $a4, $fp, 24
sub.d $sp, $sp, $a3
Expand All @@ -1400,7 +1400,7 @@ NESTED_END CallJittedMethodRetDouble, _TEXT
// $a3 - stack arguments size (properly aligned)
// $a4 - address of continuation return value
NESTED_ENTRY CallJittedMethodRetFloat, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -32
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 32
st.d $a2, $fp, 16
st.d $a4, $fp, 24
sub.d $sp, $sp, $a3
Expand All @@ -1424,7 +1424,7 @@ NESTED_END CallJittedMethodRetFloat, _TEXT
// $a3 - stack arguments size (properly aligned)
// $a4 - address of continuation return value
NESTED_ENTRY CallJittedMethodRet2I8, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -32
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 32
st.d $a2, $fp, 16
st.d $a4, $fp, 24
sub.d $sp, $sp, $a3
Expand All @@ -1449,7 +1449,7 @@ NESTED_END CallJittedMethodRet2I8, _TEXT
// $a3 - stack arguments size (properly aligned)
// $a4 - address of continuation return value
NESTED_ENTRY CallJittedMethodRet2Double, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -32
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 32
st.d $a2, $fp, 16
st.d $a4, $fp, 24
sub.d $sp, $sp, $a3
Expand All @@ -1474,7 +1474,7 @@ NESTED_END CallJittedMethodRet2Double, _TEXT
// $a3 - stack arguments size (properly aligned)
// $a4 - address of continuation return value
NESTED_ENTRY CallJittedMethodRet2Float, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -32
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 32
st.d $a2, $fp, 16
st.d $a4, $fp, 24
sub.d $sp, $sp, $a3
Expand All @@ -1499,7 +1499,7 @@ NESTED_END CallJittedMethodRet2Float, _TEXT
// $a3 - stack arguments size (properly aligned)
// $a4 - address of continuation return value
NESTED_ENTRY CallJittedMethodRetFloatInt, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -32
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 32
st.d $a2, $fp, 16
st.d $a4, $fp, 24
sub.d $sp, $sp, $a3
Expand All @@ -1524,7 +1524,7 @@ NESTED_END CallJittedMethodRetFloatInt, _TEXT
// $a3 - stack arguments size (properly aligned)
// $a4 - address of continuation return value
NESTED_ENTRY CallJittedMethodRetIntFloat, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -32
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 32
st.d $a2, $fp, 16
st.d $a4, $fp, 24
sub.d $sp, $sp, $a3
Expand All @@ -1548,19 +1548,18 @@ NESTED_ENTRY InterpreterStub, _TEXT, NoHandler
PROLOG_WITH_TRANSITION_BLOCK

// IR bytecode address
ori $t6, $METHODDESC_REGISTER, 0
ori $s0, $METHODDESC_REGISTER, 0

INLINE_GETTHREAD $t5 // thrashes $a0
beq $t5, $zero, LOCAL_LABEL(NoManagedThreadOrCallStub)

li.d $t1, OFFSETOF__Thread__m_pInterpThreadContext
add.d $t1, $t5, $t1
addi.d $t1, $t5, OFFSETOF__Thread__m_pInterpThreadContext
ld.d $t4, $t1, 0
bne $t4, $zero, LOCAL_LABEL(HaveInterpThreadContext)

LOCAL_LABEL(NoManagedThreadOrCallStub):
addi.d $a0, $sp, __PWTB_TransitionBlock
ori $a1, $t6, 0
ori $a1, $s0, 0
bl C_FUNC(GetInterpThreadContextWithPossiblyMissingThreadOrCallStub)
ori $t4, $a0, 0

Expand All @@ -1569,13 +1568,12 @@ LOCAL_LABEL(HaveInterpThreadContext):
RESTORE_ARGUMENT_REGISTERS $sp, __PWTB_ArgumentRegisters
RESTORE_FLOAT_ARGUMENT_REGISTERS $sp, __PWTB_FloatArgumentRegisters

ld.d $t3, $t6, 0 // InterpMethod*
ld.d $t3, $s0, 0 // InterpMethod*
ld.d $t3, $t3, OFFSETOF__InterpMethod__pCallStub
beq $t3, $zero, LOCAL_LABEL(NoManagedThreadOrCallStub)
li.d $t2, OFFSETOF__CallStubHeader__Routines
add.d $t2, $t3, $t2
addi.d $t2, $t3, OFFSETOF__CallStubHeader__Routines
ld.d $t3, $t4, OFFSETOF__InterpThreadContext__pStackPointer
// $t6 contains IR bytecode address
// $s0 contains IR bytecode address
// Copy the arguments to the interpreter stack, invoke the InterpExecMethod and load the return value
ld.d $t4, $t2, 0
addi.d $t2, $t2, 8
Expand All @@ -1588,21 +1586,21 @@ LOCAL_LABEL(HaveInterpThreadContext):
NESTED_END InterpreterStub, _TEXT

NESTED_ENTRY InterpreterStubRetVoid, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -16
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 16
// The +16 is for the $fp, $ra above
addi.d $a0, $sp, __PWTB_TransitionBlock + 16
ori $a1, $t6, 0 // the IR bytecode pointer
ori $a1, $s0, 0 // the IR bytecode pointer
ori $a2, $zero, 0
bl C_FUNC(ExecuteInterpretedMethod)
EPILOG_RESTORE_REG_PAIR_INDEXED 22, 1, 16
EPILOG_RETURN
NESTED_END InterpreterStubRetVoid, _TEXT

NESTED_ENTRY InterpreterStubRetI8, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -16
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 16
// The +16 is for the $fp, $ra above
addi.d $a0, $sp, __PWTB_TransitionBlock + 16
ori $a1, $t6, 0 // the IR bytecode pointer
ori $a1, $s0, 0 // the IR bytecode pointer
ori $a2, $zero, 0
bl C_FUNC(ExecuteInterpretedMethod)
ld.d $a0, $a0, 0
Expand All @@ -1611,10 +1609,10 @@ NESTED_ENTRY InterpreterStubRetI8, _TEXT, NoHandler
NESTED_END InterpreterStubRetI8, _TEXT

NESTED_ENTRY InterpreterStubRetDouble, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -16
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 16
// The +16 is for the $fp, $ra above
addi.d $a0, $sp, __PWTB_TransitionBlock + 16
ori $a1, $t6, 0 // the IR bytecode pointer
ori $a1, $s0, 0 // the IR bytecode pointer
ori $a2, $zero, 0
bl C_FUNC(ExecuteInterpretedMethod)
fld.d $fa0, $a0, 0
Expand All @@ -1623,21 +1621,21 @@ NESTED_ENTRY InterpreterStubRetDouble, _TEXT, NoHandler
NESTED_END InterpreterStubRetDouble, _TEXT

NESTED_ENTRY InterpreterStubRetBuff, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -16
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 16
// The +16 is for the $fp, $ra above
ori $a2, $a0, 0 // save caller's return buffer in $a2
addi.d $a0, $sp, __PWTB_TransitionBlock + 16
ori $a1, $t6, 0 // the IR bytecode pointer (x19)
ori $a1, $s0, 0 // the IR bytecode pointer (x19)
bl C_FUNC(ExecuteInterpretedMethod)
EPILOG_RESTORE_REG_PAIR_INDEXED 22, 1, 16
EPILOG_RETURN
NESTED_END InterpreterStubRetBuff, _TEXT

NESTED_ENTRY InterpreterStubRet2I8, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -16
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 16
// The +16 is for the $fp, $ra above
addi.d $a0, $sp, __PWTB_TransitionBlock + 16
ori $a1, $t6, 0 // the IR bytecode pointer
ori $a1, $s0, 0 // the IR bytecode pointer
ori $a2, $zero, 0
bl C_FUNC(ExecuteInterpretedMethod)
ld.d $a1, $a0, 8
Expand All @@ -1647,10 +1645,10 @@ NESTED_ENTRY InterpreterStubRet2I8, _TEXT, NoHandler
NESTED_END InterpreterStubRet2I8, _TEXT

NESTED_ENTRY InterpreterStubRet2Double, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -16
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 16
// The +16 is for the $fp, $ra above
addi.d $a0, $sp, __PWTB_TransitionBlock + 16
ori $a1, $t6, 0 // the IR bytecode pointer
ori $a1, $s0, 0 // the IR bytecode pointer
ori $a2, $zero, 0
bl C_FUNC(ExecuteInterpretedMethod)
fld.d $fa0, $a0, 0
Expand All @@ -1660,10 +1658,10 @@ NESTED_ENTRY InterpreterStubRet2Double, _TEXT, NoHandler
NESTED_END InterpreterStubRet2Double, _TEXT

NESTED_ENTRY InterpreterStubRetFloat, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -16
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 16
// The +16 is for the $fp, $ra above
addi.d $a0, $sp, __PWTB_TransitionBlock + 16
ori $a1, $t6, 0 // the IR bytecode pointer
ori $a1, $s0, 0 // the IR bytecode pointer
ori $a2, $zero, 0
bl C_FUNC(ExecuteInterpretedMethod)
fld.s $fa0, $a0, 0
Expand All @@ -1672,10 +1670,10 @@ NESTED_ENTRY InterpreterStubRetFloat, _TEXT, NoHandler
NESTED_END InterpreterStubRetFloat, _TEXT

NESTED_ENTRY InterpreterStubRet2Float, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -16
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 16
// The +16 is for the $fp, $ra above
addi.d $a0, $sp, __PWTB_TransitionBlock + 16
ori $a1, $t6, 0 // the IR bytecode pointer
ori $a1, $s0, 0 // the IR bytecode pointer
ori $a2, $zero, 0
bl C_FUNC(ExecuteInterpretedMethod)
fld.s $fa0, $a0, 0
Expand All @@ -1685,10 +1683,10 @@ NESTED_ENTRY InterpreterStubRet2Float, _TEXT, NoHandler
NESTED_END InterpreterStubRet2Float, _TEXT

NESTED_ENTRY InterpreterStubRetFloatInt, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -16
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 16
// The +16 is for the $fp, $ra above
addi.d $a0, $sp, __PWTB_TransitionBlock + 16
ori $a1, $t6, 0 // the IR bytecode pointer
ori $a1, $s0, 0 // the IR bytecode pointer
ori $a2, $zero, 0
bl C_FUNC(ExecuteInterpretedMethod)
fld.d $fa0, $a0, 0
Expand All @@ -1698,10 +1696,10 @@ NESTED_ENTRY InterpreterStubRetFloatInt, _TEXT, NoHandler
NESTED_END InterpreterStubRetFloatInt, _TEXT

NESTED_ENTRY InterpreterStubRetIntFloat, _TEXT, NoHandler
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, -16
PROLOG_SAVE_REG_PAIR_INDEXED 22, 1, 16
// The +16 is for the $fp, $ra above
addi.d $a0, $sp, __PWTB_TransitionBlock + 16
ori $a1, $t6, 0 // the IR bytecode pointer
ori $a1, $s0, 0 // the IR bytecode pointer
ori $a2, $zero, 0
bl C_FUNC(ExecuteInterpretedMethod)
ld.d $a1, $a0, 0
Expand Down
Loading