Skip to content

Commit e975cfe

Browse files
authored
[RISC-V] Clean up code gen for floating comparisons (#111626)
* Clean up code gen for floating comparisons * Don't allocate temp reg for floating comparisons
1 parent 574c48c commit e975cfe

File tree

2 files changed

+8
-47
lines changed

2 files changed

+8
-47
lines changed

src/coreclr/jit/codegenriscv64.cpp

Lines changed: 7 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3240,7 +3240,6 @@ void CodeGen::genCodeForCompare(GenTreeOp* tree)
32403240

32413241
if (isUnordered)
32423242
{
3243-
BasicBlock* skipLabel = nullptr;
32443243
if (tree->OperIs(GT_LT))
32453244
{
32463245
emit->emitIns_R_R_R(cmpSize == EA_4BYTE ? INS_fle_s : INS_fle_d, cmpSize, targetReg, regOp2, regOp1);
@@ -3249,19 +3248,6 @@ void CodeGen::genCodeForCompare(GenTreeOp* tree)
32493248
{
32503249
emit->emitIns_R_R_R(cmpSize == EA_4BYTE ? INS_flt_s : INS_flt_d, cmpSize, targetReg, regOp2, regOp1);
32513250
}
3252-
else if (tree->OperIs(GT_EQ))
3253-
{
3254-
regNumber tempReg = internalRegisters.GetSingle(tree);
3255-
skipLabel = genCreateTempLabel();
3256-
emit->emitIns_R_R(cmpSize == EA_4BYTE ? INS_fclass_s : INS_fclass_d, cmpSize, targetReg, regOp1);
3257-
emit->emitIns_R_R(cmpSize == EA_4BYTE ? INS_fclass_s : INS_fclass_d, cmpSize, tempReg, regOp2);
3258-
emit->emitIns_R_R_R(INS_or, EA_8BYTE, tempReg, targetReg, tempReg);
3259-
emit->emitIns_R_R_I(INS_andi, EA_8BYTE, tempReg, tempReg, 0x300);
3260-
emit->emitIns_R_R_I(INS_addi, EA_8BYTE, targetReg, REG_R0, 1);
3261-
emit->emitIns_J(INS_bnez, skipLabel, tempReg);
3262-
emit->emitIns_R_R_R(cmpSize == EA_4BYTE ? INS_feq_s : INS_feq_d, cmpSize, targetReg, regOp1, regOp2);
3263-
genDefineTempLabel(skipLabel);
3264-
}
32653251
else if (tree->OperIs(GT_NE))
32663252
{
32673253
emit->emitIns_R_R_R(cmpSize == EA_4BYTE ? INS_feq_s : INS_feq_d, cmpSize, targetReg, regOp1, regOp2);
@@ -3274,11 +3260,11 @@ void CodeGen::genCodeForCompare(GenTreeOp* tree)
32743260
{
32753261
emit->emitIns_R_R_R(cmpSize == EA_4BYTE ? INS_flt_s : INS_flt_d, cmpSize, targetReg, regOp1, regOp2);
32763262
}
3277-
if (skipLabel == nullptr)
3263+
else
32783264
{
3279-
emit->emitIns_R_R_R(INS_sub, EA_8BYTE, targetReg, REG_R0, targetReg);
3280-
emit->emitIns_R_R_I(INS_addi, EA_8BYTE, targetReg, targetReg, 1);
3265+
unreached();
32813266
}
3267+
emit->emitIns_R_R_I(INS_xori, EA_8BYTE, targetReg, targetReg, 1);
32823268
}
32833269
else
32843270
{
@@ -3294,21 +3280,6 @@ void CodeGen::genCodeForCompare(GenTreeOp* tree)
32943280
{
32953281
emit->emitIns_R_R_R(cmpSize == EA_4BYTE ? INS_feq_s : INS_feq_d, cmpSize, targetReg, regOp1, regOp2);
32963282
}
3297-
else if (tree->OperIs(GT_NE))
3298-
{
3299-
regNumber tempReg = internalRegisters.GetSingle(tree);
3300-
emit->emitIns_R_R(cmpSize == EA_4BYTE ? INS_fclass_s : INS_fclass_d, cmpSize, targetReg, regOp1);
3301-
emit->emitIns_R_R(cmpSize == EA_4BYTE ? INS_fclass_s : INS_fclass_d, cmpSize, tempReg, regOp2);
3302-
emit->emitIns_R_R_R(INS_or, EA_8BYTE, tempReg, targetReg, tempReg);
3303-
emit->emitIns_R_R_I(INS_andi, EA_8BYTE, tempReg, tempReg, 0x300);
3304-
emit->emitIns_R_R_I(INS_addi, EA_8BYTE, targetReg, REG_R0, 0);
3305-
BasicBlock* skipLabel = genCreateTempLabel();
3306-
emit->emitIns_J(INS_bnez, skipLabel, tempReg);
3307-
emit->emitIns_R_R_R(cmpSize == EA_4BYTE ? INS_feq_s : INS_feq_d, cmpSize, targetReg, regOp1, regOp2);
3308-
emit->emitIns_R_R_R(INS_sub, EA_8BYTE, targetReg, REG_R0, targetReg);
3309-
emit->emitIns_R_R_I(INS_addi, EA_8BYTE, targetReg, targetReg, 1);
3310-
genDefineTempLabel(skipLabel);
3311-
}
33123283
else if (tree->OperIs(GT_GT))
33133284
{
33143285
emit->emitIns_R_R_R(cmpSize == EA_4BYTE ? INS_flt_s : INS_flt_d, cmpSize, targetReg, regOp2, regOp1);
@@ -3317,6 +3288,10 @@ void CodeGen::genCodeForCompare(GenTreeOp* tree)
33173288
{
33183289
emit->emitIns_R_R_R(cmpSize == EA_4BYTE ? INS_fle_s : INS_fle_d, cmpSize, targetReg, regOp2, regOp1);
33193290
}
3291+
else
3292+
{
3293+
unreached();
3294+
}
33203295
}
33213296
}
33223297
else

src/coreclr/jit/lsrariscv64.cpp

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -406,21 +406,7 @@ int LinearScan::BuildNode(GenTree* tree)
406406
case GT_GT:
407407
{
408408
var_types op1Type = genActualType(tree->gtGetOp1()->TypeGet());
409-
if (varTypeIsFloating(op1Type))
410-
{
411-
bool isUnordered = (tree->gtFlags & GTF_RELOP_NAN_UN) != 0;
412-
if (isUnordered)
413-
{
414-
if (tree->OperIs(GT_EQ))
415-
buildInternalIntRegisterDefForNode(tree);
416-
}
417-
else
418-
{
419-
if (tree->OperIs(GT_NE))
420-
buildInternalIntRegisterDefForNode(tree);
421-
}
422-
}
423-
else
409+
if (!varTypeIsFloating(op1Type))
424410
{
425411
emitAttr cmpSize = EA_ATTR(genTypeSize(op1Type));
426412
if (tree->gtGetOp2()->isContainedIntOrIImmed())

0 commit comments

Comments
 (0)