@@ -3199,9 +3199,24 @@ size_t GCInfo::gcMakeRegPtrTable(BYTE* dest, int mask, const InfoHdr& header, un
3199
3199
3200
3200
callArgCnt = genRegPtrTemp->rpdPtrArg ;
3201
3201
3202
- unsigned gcrefRegMask = genRegPtrTemp-> rpdCallGCrefRegs ;
3202
+ unsigned gcrefRegMask = 0 ;
3203
3203
3204
- byrefRegMask = genRegPtrTemp->rpdCallByrefRegs ;
3204
+ byrefRegMask = 0 ;
3205
+
3206
+ // The order here is fixed: it must agree with the order assumed in eetwain.
3207
+ // NB: x86 GC decoder does not report return registers at call sites.
3208
+ static const regNumber calleeSaveOrder[] = {REG_EDI, REG_ESI, REG_EBX, REG_EBP};
3209
+ for (unsigned i = 0 ; i < ArrLen (calleeSaveOrder); i++)
3210
+ {
3211
+ if ((genRegPtrTemp->rpdCallGCrefRegs & (1 << (calleeSaveOrder[i] - REG_INT_FIRST))) != 0 )
3212
+ {
3213
+ gcrefRegMask |= 1u << i;
3214
+ }
3215
+ if ((genRegPtrTemp->rpdCallByrefRegs & (1 << (calleeSaveOrder[i] - REG_INT_FIRST))) != 0 )
3216
+ {
3217
+ byrefRegMask |= 1u << i;
3218
+ }
3219
+ }
3205
3220
3206
3221
assert ((gcrefRegMask & byrefRegMask) == 0 );
3207
3222
@@ -4465,8 +4480,8 @@ void GCInfo::gcMakeRegPtrTable(
4465
4480
assert (call->u1 .cdArgMask == 0 && call->cdArgCnt == 0 );
4466
4481
4467
4482
// Other than that, we just have to deal with the regmasks.
4468
- regMaskSmall gcrefRegMask = call->cdGCrefRegs & RBM_CALL_GC_REGS. GetIntRegSet () ;
4469
- regMaskSmall byrefRegMask = call->cdByrefRegs & RBM_CALL_GC_REGS. GetIntRegSet () ;
4483
+ regMaskSmall gcrefRegMask = call->cdGCrefRegs ;
4484
+ regMaskSmall byrefRegMask = call->cdByrefRegs ;
4470
4485
4471
4486
assert ((gcrefRegMask & byrefRegMask) == 0 );
4472
4487
@@ -4552,11 +4567,8 @@ void GCInfo::gcMakeRegPtrTable(
4552
4567
{
4553
4568
// This is a true call site.
4554
4569
4555
- regMaskSmall gcrefRegMask =
4556
- genRegMaskFromCalleeSavedMask (genRegPtrTemp->rpdCallGCrefRegs ).GetIntRegSet ();
4557
-
4558
- regMaskSmall byrefRegMask =
4559
- genRegMaskFromCalleeSavedMask (genRegPtrTemp->rpdCallByrefRegs ).GetIntRegSet ();
4570
+ regMaskSmall gcrefRegMask = regMaskSmall (genRegPtrTemp->rpdCallGCrefRegs << REG_INT_FIRST);
4571
+ regMaskSmall byrefRegMask = regMaskSmall (genRegPtrTemp->rpdCallByrefRegs << REG_INT_FIRST);
4560
4572
4561
4573
assert ((gcrefRegMask & byrefRegMask) == 0 );
4562
4574
0 commit comments