Skip to content

Commit b380e2c

Browse files
authored
[LoongArch64] Fix some bugs in the test sets 'System.Runtime.Tests' and 'System.Linq.Expressions.Tests' for loongarch64. (#86435)
* Fix the error of the Truncate/Saturate convert from Float/Double NAN to UINT32/UINT64. * fix some random failed testcases in System.Runtime.Tests. * Update codegenloongarch64.cpp Fix the RangeCheck bug of the TYP_INT case in CodeGen::genRangeCheck().
1 parent f11e9ac commit b380e2c

File tree

2 files changed

+24
-7
lines changed

2 files changed

+24
-7
lines changed

src/coreclr/jit/codegencommon.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5827,7 +5827,7 @@ void CodeGen::genFnProlog()
58275827
//
58285828
extraFrameSize = compiler->compCalleeRegsPushed * REGSIZE_BYTES;
58295829
}
5830-
#endif // TARGET_ARM64
5830+
#endif // TARGET_AMD64
58315831

58325832
if (doubleAlignOrFramePointerUsed())
58335833
{

src/coreclr/jit/codegenloongarch64.cpp

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3877,17 +3877,24 @@ void CodeGen::genFloatToIntCast(GenTree* treeNode)
38773877
}
38783878

38793879
if (srcType == TYP_DOUBLE)
3880+
{
38803881
GetEmitter()->emitIns_R_R_I(INS_lu52i_d, EA_8BYTE, REG_R21, REG_R0, imm >> 8);
3882+
}
38813883
else
3884+
{
38823885
GetEmitter()->emitIns_R_I(INS_lu12i_w, EA_PTRSIZE, REG_R21, imm);
3886+
}
38833887

38843888
GetEmitter()->emitIns_R_R(srcType == TYP_DOUBLE ? INS_movgr2fr_d : INS_movgr2fr_w, EA_8BYTE, tmpReg, REG_R21);
38853889

38863890
GetEmitter()->emitIns_R_R_I(srcType == TYP_DOUBLE ? INS_fcmp_clt_d : INS_fcmp_clt_s, EA_8BYTE, op1->GetRegNum(),
3887-
tmpReg, 2);
3891+
tmpReg, 2); // cc=2
3892+
3893+
GetEmitter()->emitIns_R_R_I(srcType == TYP_DOUBLE ? INS_fcmp_ceq_d : INS_fcmp_ceq_s, EA_8BYTE, op1->GetRegNum(),
3894+
tmpReg, 3); // cc=3
38883895

38893896
GetEmitter()->emitIns_R_R_I(INS_ori, EA_PTRSIZE, REG_R21, REG_R0, 0);
3890-
GetEmitter()->emitIns_I_I(INS_bcnez, EA_PTRSIZE, 2, 4 << 2);
3897+
GetEmitter()->emitIns_I_I(INS_bcnez, EA_PTRSIZE, 2, 4 << 2); // cc=2
38913898

38923899
GetEmitter()->emitIns_R_R_R(srcType == TYP_DOUBLE ? INS_fsub_d : INS_fsub_s, EA_8BYTE, tmpReg, op1->GetRegNum(),
38933900
tmpReg);
@@ -3901,6 +3908,9 @@ void CodeGen::genFloatToIntCast(GenTree* treeNode)
39013908
GetEmitter()->emitIns_R_R(ins1, dstSize, tmpReg, tmpReg);
39023909
GetEmitter()->emitIns_R_R(ins2, dstSize, treeNode->GetRegNum(), tmpReg);
39033910

3911+
GetEmitter()->emitIns_I_I(INS_bcnez, EA_PTRSIZE, 3, 2 << 2); // cc=3
3912+
GetEmitter()->emitIns_R_I(INS_beqz, EA_PTRSIZE, treeNode->GetRegNum(), 2 << 2);
3913+
39043914
GetEmitter()->emitIns_R_R_R(INS_or, dstSize, treeNode->GetRegNum(), REG_R21, treeNode->GetRegNum());
39053915
}
39063916
else
@@ -4104,20 +4114,22 @@ void CodeGen::genCodeForCompare(GenTreeOp* tree)
41044114
switch (cmpSize)
41054115
{
41064116
case EA_4BYTE:
4117+
{
4118+
regNumber tmpRegOp1 = REG_R21;
4119+
assert(regOp1 != tmpRegOp1);
41074120
if (IsUnsigned)
41084121
{
41094122
imm = static_cast<uint32_t>(imm);
4110-
4111-
regNumber tmpRegOp1 = REG_R21;
4112-
assert(regOp1 != tmpRegOp1);
41134123
emit->emitIns_R_R_I_I(INS_bstrpick_d, EA_8BYTE, tmpRegOp1, regOp1, 31, 0);
4114-
regOp1 = tmpRegOp1;
41154124
}
41164125
else
41174126
{
41184127
imm = static_cast<int32_t>(imm);
4128+
emit->emitIns_R_R_I(INS_slli_w, EA_8BYTE, tmpRegOp1, regOp1, 0);
41194129
}
4130+
regOp1 = tmpRegOp1;
41204131
break;
4132+
}
41214133
case EA_8BYTE:
41224134
break;
41234135
case EA_1BYTE:
@@ -5932,6 +5944,11 @@ void CodeGen::genRangeCheck(GenTree* oper)
59325944
}
59335945
else
59345946
{
5947+
if (genActualType(src1->TypeGet()) == TYP_INT)
5948+
{
5949+
GetEmitter()->emitIns_R_R_I(INS_slli_w, EA_4BYTE, REG_R21, reg1, 0);
5950+
reg1 = REG_R21;
5951+
}
59355952
reg2 = src2->GetRegNum();
59365953
}
59375954
}

0 commit comments

Comments
 (0)