@@ -3877,17 +3877,24 @@ void CodeGen::genFloatToIntCast(GenTree* treeNode)
3877
3877
}
3878
3878
3879
3879
if (srcType == TYP_DOUBLE)
3880
+ {
3880
3881
GetEmitter ()->emitIns_R_R_I (INS_lu52i_d, EA_8BYTE, REG_R21, REG_R0, imm >> 8 );
3882
+ }
3881
3883
else
3884
+ {
3882
3885
GetEmitter ()->emitIns_R_I (INS_lu12i_w, EA_PTRSIZE, REG_R21, imm);
3886
+ }
3883
3887
3884
3888
GetEmitter ()->emitIns_R_R (srcType == TYP_DOUBLE ? INS_movgr2fr_d : INS_movgr2fr_w, EA_8BYTE, tmpReg, REG_R21);
3885
3889
3886
3890
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
3888
3895
3889
3896
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
3891
3898
3892
3899
GetEmitter ()->emitIns_R_R_R (srcType == TYP_DOUBLE ? INS_fsub_d : INS_fsub_s, EA_8BYTE, tmpReg, op1->GetRegNum (),
3893
3900
tmpReg);
@@ -3901,6 +3908,9 @@ void CodeGen::genFloatToIntCast(GenTree* treeNode)
3901
3908
GetEmitter ()->emitIns_R_R (ins1, dstSize, tmpReg, tmpReg);
3902
3909
GetEmitter ()->emitIns_R_R (ins2, dstSize, treeNode->GetRegNum (), tmpReg);
3903
3910
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
+
3904
3914
GetEmitter ()->emitIns_R_R_R (INS_or, dstSize, treeNode->GetRegNum (), REG_R21, treeNode->GetRegNum ());
3905
3915
}
3906
3916
else
@@ -4104,20 +4114,22 @@ void CodeGen::genCodeForCompare(GenTreeOp* tree)
4104
4114
switch (cmpSize)
4105
4115
{
4106
4116
case EA_4BYTE:
4117
+ {
4118
+ regNumber tmpRegOp1 = REG_R21;
4119
+ assert (regOp1 != tmpRegOp1);
4107
4120
if (IsUnsigned)
4108
4121
{
4109
4122
imm = static_cast <uint32_t >(imm);
4110
-
4111
- regNumber tmpRegOp1 = REG_R21;
4112
- assert (regOp1 != tmpRegOp1);
4113
4123
emit->emitIns_R_R_I_I (INS_bstrpick_d, EA_8BYTE, tmpRegOp1, regOp1, 31 , 0 );
4114
- regOp1 = tmpRegOp1;
4115
4124
}
4116
4125
else
4117
4126
{
4118
4127
imm = static_cast <int32_t >(imm);
4128
+ emit->emitIns_R_R_I (INS_slli_w, EA_8BYTE, tmpRegOp1, regOp1, 0 );
4119
4129
}
4130
+ regOp1 = tmpRegOp1;
4120
4131
break ;
4132
+ }
4121
4133
case EA_8BYTE:
4122
4134
break ;
4123
4135
case EA_1BYTE:
@@ -5932,6 +5944,11 @@ void CodeGen::genRangeCheck(GenTree* oper)
5932
5944
}
5933
5945
else
5934
5946
{
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
+ }
5935
5952
reg2 = src2->GetRegNum ();
5936
5953
}
5937
5954
}
0 commit comments