@@ -1441,9 +1441,7 @@ void CodeGen::genSetRegToConst(regNumber targetReg, var_types targetType, GenTre
1441
1441
else
1442
1442
{
1443
1443
// Get a temp integer register to compute long address.
1444
- regMaskTP addrRegMask = tree->gtRsvdRegs ;
1445
- regNumber addrReg = genRegNumFromMask (addrRegMask);
1446
- noway_assert (addrReg != REG_NA);
1444
+ regNumber addrReg = tree->GetSingleTempReg ();
1447
1445
1448
1446
// We must load the FP constant from the constant pool
1449
1447
// Emit a data section constant for the float or double constant.
@@ -2854,7 +2852,6 @@ void CodeGen::genLclHeap(GenTreePtr tree)
2854
2852
noway_assert ((genActualType (size->gtType ) == TYP_INT) || (genActualType (size->gtType ) == TYP_I_IMPL));
2855
2853
2856
2854
regNumber targetReg = tree->gtRegNum ;
2857
- regMaskTP tmpRegsMask = tree->gtRsvdRegs ;
2858
2855
regNumber regCnt = REG_NA;
2859
2856
regNumber pspSymReg = REG_NA;
2860
2857
var_types type = genActualType (size->gtType );
@@ -2923,17 +2920,16 @@ void CodeGen::genLclHeap(GenTreePtr tree)
2923
2920
// since we don't need any internal registers.
2924
2921
if (!hasPspSym && compiler->info .compInitMem )
2925
2922
{
2926
- assert (genCountBits (tmpRegsMask ) == 0 );
2923
+ assert (tree-> AvailableTempRegCount ( ) == 0 );
2927
2924
regCnt = targetReg;
2928
2925
}
2929
2926
else
2930
2927
{
2931
- assert (genCountBits (tmpRegsMask) >= 1 );
2932
- regMaskTP regCntMask = genFindLowestBit (tmpRegsMask);
2933
- tmpRegsMask &= ~regCntMask;
2934
- regCnt = genRegNumFromMask (regCntMask);
2928
+ regCnt = tree->ExtractTempReg ();
2935
2929
if (regCnt != targetReg)
2930
+ {
2936
2931
inst_RV_RV (INS_mov, regCnt, targetReg, size->TypeGet ());
2932
+ }
2937
2933
}
2938
2934
2939
2935
// Align to STACK_ALIGN
@@ -2950,10 +2946,7 @@ void CodeGen::genLclHeap(GenTreePtr tree)
2950
2946
stackAdjustment += STACK_ALIGN;
2951
2947
2952
2948
// Save a copy of PSPSym
2953
- assert (genCountBits (tmpRegsMask) >= 1 );
2954
- regMaskTP pspSymRegMask = genFindLowestBit (tmpRegsMask);
2955
- tmpRegsMask &= ~pspSymRegMask;
2956
- pspSymReg = genRegNumFromMask (pspSymRegMask);
2949
+ pspSymReg = tree->ExtractTempReg ();
2957
2950
getEmitter ()->emitIns_R_S (ins_Load (TYP_I_IMPL), EA_PTRSIZE, pspSymReg, compiler->lvaPSPSym , 0 );
2958
2951
}
2959
2952
#endif
@@ -3021,15 +3014,12 @@ void CodeGen::genLclHeap(GenTreePtr tree)
3021
3014
assert (regCnt == REG_NA);
3022
3015
if (!hasPspSym && compiler->info .compInitMem )
3023
3016
{
3024
- assert (genCountBits (tmpRegsMask ) == 0 );
3017
+ assert (tree-> AvailableTempRegCount ( ) == 0 );
3025
3018
regCnt = targetReg;
3026
3019
}
3027
3020
else
3028
3021
{
3029
- assert (genCountBits (tmpRegsMask) >= 1 );
3030
- regMaskTP regCntMask = genFindLowestBit (tmpRegsMask);
3031
- tmpRegsMask &= ~regCntMask;
3032
- regCnt = genRegNumFromMask (regCntMask);
3022
+ regCnt = tree->ExtractTempReg ();
3033
3023
}
3034
3024
genSetRegToIcon (regCnt, amount, ((int )amount == amount) ? TYP_INT : TYP_LONG);
3035
3025
}
@@ -3094,9 +3084,7 @@ void CodeGen::genLclHeap(GenTreePtr tree)
3094
3084
//
3095
3085
3096
3086
// Setup the regTmp
3097
- assert (tmpRegsMask != RBM_NONE);
3098
- assert (genCountBits (tmpRegsMask) == 1 );
3099
- regNumber regTmp = genRegNumFromMask (tmpRegsMask);
3087
+ regNumber regTmp = tree->GetSingleTempReg ();
3100
3088
3101
3089
BasicBlock* loop = genCreateTempLabel ();
3102
3090
BasicBlock* done = genCreateTempLabel ();
@@ -3391,13 +3379,11 @@ void CodeGen::genCodeForCpBlkUnroll(GenTreeBlk* cpBlkNode)
3391
3379
unsigned offset = 0 ;
3392
3380
3393
3381
// Grab the integer temp register to emit the loads and stores.
3394
- regMaskTP tmpMask = genFindLowestBit (cpBlkNode->gtRsvdRegs & RBM_ALLINT);
3395
- regNumber tmpReg = genRegNumFromMask (tmpMask);
3382
+ regNumber tmpReg = cpBlkNode->ExtractTempReg (RBM_ALLINT);
3396
3383
3397
3384
if (size >= 2 * REGSIZE_BYTES)
3398
3385
{
3399
- regMaskTP tmp2Mask = cpBlkNode->gtRsvdRegs & RBM_ALLINT & ~tmpMask;
3400
- regNumber tmp2Reg = genRegNumFromMask (tmp2Mask);
3386
+ regNumber tmp2Reg = cpBlkNode->ExtractTempReg (RBM_ALLINT);
3401
3387
3402
3388
size_t slots = size / (2 * REGSIZE_BYTES);
3403
3389
@@ -3498,13 +3484,8 @@ void CodeGen::genCodeForCpObj(GenTreeObj* cpObjNode)
3498
3484
gcInfo.gcMarkRegPtrVal (REG_WRITE_BARRIER_DST_BYREF, dstAddr->TypeGet ());
3499
3485
3500
3486
// Temp register used to perform the sequence of loads and stores.
3501
- regNumber tmpReg = genRegNumFromMask (cpObjNode->gtRsvdRegs );
3502
-
3503
- #ifdef DEBUG
3504
- assert (cpObjNode->gtRsvdRegs != RBM_NONE);
3505
- assert (genCountBits (cpObjNode->gtRsvdRegs ) == 1 );
3487
+ regNumber tmpReg = cpObjNode->GetSingleTempReg ();
3506
3488
assert (genIsValidIntReg (tmpReg));
3507
- #endif // DEBUG
3508
3489
3509
3490
unsigned slots = cpObjNode->gtSlots ;
3510
3491
emitter* emit = getEmitter ();
@@ -3571,7 +3552,7 @@ void CodeGen::genTableBasedSwitch(GenTree* treeNode)
3571
3552
regNumber idxReg = treeNode->gtOp .gtOp1 ->gtRegNum ;
3572
3553
regNumber baseReg = treeNode->gtOp .gtOp2 ->gtRegNum ;
3573
3554
3574
- regNumber tmpReg = genRegNumFromMask ( treeNode->gtRsvdRegs );
3555
+ regNumber tmpReg = treeNode->GetSingleTempReg ( );
3575
3556
3576
3557
// load the ip-relative offset (which is relative to start of fgFirstBB)
3577
3558
getEmitter ()->emitIns_R_R_R (INS_ldr, EA_4BYTE, baseReg, baseReg, idxReg, INS_OPTS_LSL);
@@ -4022,9 +4003,7 @@ void CodeGen::genLeaInstruction(GenTreeAddrMode* lea)
4022
4003
4023
4004
if (offset != 0 )
4024
4005
{
4025
- regMaskTP tmpRegMask = lea->gtRsvdRegs ;
4026
- regNumber tmpReg = genRegNumFromMask (tmpRegMask);
4027
- noway_assert (tmpReg != REG_NA);
4006
+ regNumber tmpReg = lea->GetSingleTempReg ();
4028
4007
4029
4008
if (emitter::emitIns_valid_imm_for_add (offset, EA_8BYTE))
4030
4009
{
@@ -4041,7 +4020,6 @@ void CodeGen::genLeaInstruction(GenTreeAddrMode* lea)
4041
4020
4042
4021
// Then compute target reg from [tmpReg + offset]
4043
4022
emit->emitIns_R_R_I (INS_add, size, lea->gtRegNum , tmpReg, offset);
4044
- ;
4045
4023
}
4046
4024
else // large offset
4047
4025
{
@@ -4091,9 +4069,7 @@ void CodeGen::genLeaInstruction(GenTreeAddrMode* lea)
4091
4069
else
4092
4070
{
4093
4071
// We require a tmpReg to hold the offset
4094
- regMaskTP tmpRegMask = lea->gtRsvdRegs ;
4095
- regNumber tmpReg = genRegNumFromMask (tmpRegMask);
4096
- noway_assert (tmpReg != REG_NA);
4072
+ regNumber tmpReg = lea->GetSingleTempReg ();
4097
4073
4098
4074
// First load tmpReg with the large offset constant
4099
4075
instGen_Set_Reg_To_Imm (EA_PTRSIZE, tmpReg, offset);
@@ -4484,9 +4460,8 @@ void CodeGen::genCkfinite(GenTreePtr treeNode)
4484
4460
emitter* emit = getEmitter ();
4485
4461
4486
4462
// Extract exponent into a register.
4487
- regNumber intReg = genRegNumFromMask ( treeNode->gtRsvdRegs );
4463
+ regNumber intReg = treeNode->GetSingleTempReg ( );
4488
4464
regNumber fpReg = genConsumeReg (op1);
4489
- assert (intReg != REG_NA);
4490
4465
4491
4466
emit->emitIns_R_R (ins_Copy (targetType), emitTypeSize (treeNode), intReg, fpReg);
4492
4467
emit->emitIns_R_R_I (INS_lsr, emitTypeSize (targetType), intReg, intReg, shiftAmount);
0 commit comments