Skip to content

Commit 44c46e1

Browse files
authored
[RISC-V] Fix GitHub_* tests (#88640)
* [RISC-V] Fix GitHub_17585 test failure * [RISC-V] Fix GitHub_23147 test failure * [RISC-V] Remove lvIsHfaRegArg assertion * [RISC-V] Update
1 parent 6c29448 commit 44c46e1

File tree

2 files changed

+35
-22
lines changed

2 files changed

+35
-22
lines changed

src/coreclr/jit/codegenriscv64.cpp

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6515,7 +6515,14 @@ void CodeGen::genJmpMethod(GenTree* jmp)
65156515
// Must be <= 16 bytes or else it wouldn't be passed in registers, except for HFA,
65166516
// which can be bigger (and is handled above).
65176517
noway_assert(EA_SIZE_IN_BYTES(varDsc->lvSize()) <= 16);
6518-
loadType = varDsc->GetLayout()->GetGCPtrType(0);
6518+
if (emitter::isFloatReg(argReg))
6519+
{
6520+
loadType = varDsc->lvIs4Field1 ? TYP_FLOAT : TYP_DOUBLE;
6521+
}
6522+
else
6523+
{
6524+
loadType = varDsc->GetLayout()->GetGCPtrType(0);
6525+
}
65196526
}
65206527
else
65216528
{
@@ -6532,14 +6539,23 @@ void CodeGen::genJmpMethod(GenTree* jmp)
65326539
regSet.AddMaskVars(genRegMask(argReg));
65336540
gcInfo.gcMarkRegPtrVal(argReg, loadType);
65346541

6535-
if (compiler->lvaIsMultiregStruct(varDsc, compiler->info.compIsVarArgs))
6542+
if (varDsc->GetOtherArgReg() < REG_STK)
65366543
{
65376544
// Restore the second register.
6538-
argRegNext = genRegArgNext(argReg);
6545+
argRegNext = varDsc->GetOtherArgReg();
6546+
6547+
if (emitter::isFloatReg(argRegNext))
6548+
{
6549+
loadType = varDsc->lvIs4Field2 ? TYP_FLOAT : TYP_DOUBLE;
6550+
}
6551+
else
6552+
{
6553+
loadType = varDsc->GetLayout()->GetGCPtrType(1);
6554+
}
65396555

6540-
loadType = varDsc->GetLayout()->GetGCPtrType(1);
65416556
loadSize = emitActualTypeSize(loadType);
6542-
GetEmitter()->emitIns_R_S(ins_Load(loadType), loadSize, argRegNext, varNum, TARGET_POINTER_SIZE);
6557+
int offs = loadSize == EA_4BYTE ? 4 : 8;
6558+
GetEmitter()->emitIns_R_S(ins_Load(loadType), loadSize, argRegNext, varNum, offs);
65436559

65446560
regSet.AddMaskVars(genRegMask(argRegNext));
65456561
gcInfo.gcMarkRegPtrVal(argRegNext, loadType);

src/coreclr/vm/riscv64/virtualcallstubcpu.hpp

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,7 @@ struct DispatchStub
8282
private:
8383
friend struct DispatchHolder;
8484

85-
DWORD _entryPoint[9];
86-
DWORD _pad;
85+
DWORD _entryPoint[8];
8786
size_t _expectedMT;
8887
PCODE _implTarget;
8988
PCODE _failTarget;
@@ -102,30 +101,28 @@ struct DispatchHolder
102101
void Initialize(DispatchHolder* pDispatchHolderRX, PCODE implTarget, PCODE failTarget, size_t expectedMT)
103102
{
104103
// auipc t4,0
105-
// addi t4, t4, 36
106-
// ld t0,0(a0) ; methodTable from object in $a0
107-
// ld t6,0(t4) // t6 _expectedMT
108-
// bne t6, t0, failLabel
109-
// ld t4, 8(t4) // t4 _implTarget
104+
// ld t0, 0(a0) // methodTable from object in $a0
105+
// ld t6, 32(t4) // t6 _expectedMT
106+
// bne t6, t0, failLabel
107+
// ld t4, 40(t4) // t4 _implTarget
110108
// jalr x0, t4, 0
111109
// failLabel:
112-
// ld t4, 16(t4) // t4 _failTarget
110+
// ld t4, 48(t4) // t4 _failTarget
113111
// jalr x0, t4, 0
114112
//
115113
//
116114
// _expectedMT
117115
// _implTarget
118116
// _failTarget
119117

120-
_stub._entryPoint[0] = DISPATCH_STUB_FIRST_DWORD; // auipc t4,0 // 0x00000e97
121-
_stub._entryPoint[1] = 0x028e8e93; // addi t4, t4, 40
122-
_stub._entryPoint[2] = 0x00053283; // ld t0, 0(a0) //; methodTable from object in $a0
123-
_stub._entryPoint[3] = 0x000ebf83; // ld r6, 0(t4) // t6 _expectedMT
124-
_stub._entryPoint[4] = 0x005f9663; // bne t6, t0, failLabel
125-
_stub._entryPoint[5] = 0x008ebe83; // ld t4, 8(t4) // t4 _implTarget
126-
_stub._entryPoint[6] = 0x000e8067; // jalr x0, t4, 0
127-
_stub._entryPoint[7] = 0x010ebe83; // ld t4, 16(t4) // t4 _failTarget
128-
_stub._entryPoint[8] = 0x000e8067; // jalr x0, t4, 0
118+
_stub._entryPoint[0] = DISPATCH_STUB_FIRST_DWORD; // auipc t4,0 // 0x00000e97
119+
_stub._entryPoint[1] = 0x00053283; // ld t0, 0(a0) // methodTable from object in $a0
120+
_stub._entryPoint[2] = 0x020ebf83; // ld t6, 32(t4) // t6 _expectedMT
121+
_stub._entryPoint[3] = 0x005f9663; // bne t6, t0, failLabel
122+
_stub._entryPoint[4] = 0x028ebe83; // ld t4, 40(t4) // t4 _implTarget
123+
_stub._entryPoint[5] = 0x000e8067; // jalr x0, t4, 0
124+
_stub._entryPoint[6] = 0x030ebe83; // ld t4, 48(t4) // t4 _failTarget
125+
_stub._entryPoint[7] = 0x000e8067; // jalr x0, t4, 0
129126

130127
_stub._expectedMT = expectedMT;
131128
_stub._implTarget = implTarget;

0 commit comments

Comments
 (0)