Skip to content

Commit 761c9a5

Browse files
authored
Handle more than 64 registers - Part 2 (#102297)
* Make regMaskTP struct for non-arm64 platforms * some refactoring * jit format * fix missing paranethesis in arm * fix riscv64 and loongarch build * minor change * review feedback
1 parent 0709995 commit 761c9a5

File tree

13 files changed

+84
-101
lines changed

13 files changed

+84
-101
lines changed

src/coreclr/jit/codegenarm.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1927,14 +1927,15 @@ void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pIni
19271927

19281928
void CodeGen::genPushFltRegs(regMaskTP regMask)
19291929
{
1930-
assert(regMask != 0); // Don't call uness we have some registers to push
1931-
assert((regMask & RBM_ALLFLOAT) == regMask); // Only floasting point registers should be in regMask
1930+
assert(regMask != 0); // Don't call unless we have some registers to push
1931+
assert((regMask & RBM_ALLFLOAT) == regMask); // Only floating point registers should be in regMask
19321932

19331933
regNumber lowReg = genRegNumFromMask(genFindLowestBit(regMask));
19341934
int slots = genCountBits(regMask);
1935+
19351936
// regMask should be contiguously set
1936-
regMaskTP tmpMask = ((regMask >> lowReg) + 1); // tmpMask should have a single bit set
1937-
assert((tmpMask & (tmpMask - 1)) == 0);
1937+
regMaskSmall tmpMask = ((regMask.getLow() >> lowReg) + 1); // tmpMask should have a single bit set
1938+
assert(genMaxOneBit(tmpMask));
19381939
assert(lowReg == REG_F16); // Currently we expect to start at F16 in the unwind codes
19391940

19401941
// Our calling convention requires that we only use vpush for TYP_DOUBLE registers
@@ -1952,8 +1953,8 @@ void CodeGen::genPopFltRegs(regMaskTP regMask)
19521953
regNumber lowReg = genRegNumFromMask(genFindLowestBit(regMask));
19531954
int slots = genCountBits(regMask);
19541955
// regMask should be contiguously set
1955-
regMaskTP tmpMask = ((regMask >> lowReg) + 1); // tmpMask should have a single bit set
1956-
assert((tmpMask & (tmpMask - 1)) == 0);
1956+
regMaskSmall tmpMask = ((regMask.getLow() >> lowReg) + 1); // tmpMask should have a single bit set
1957+
assert(genMaxOneBit(tmpMask));
19571958

19581959
// Our calling convention requires that we only use vpop for TYP_DOUBLE registers
19591960
noway_assert(floatRegCanHoldType(lowReg, TYP_DOUBLE));
@@ -2192,7 +2193,7 @@ void CodeGen::genPopCalleeSavedRegisters(bool jmpEpilog)
21922193
genUsedPopToReturn = false;
21932194
}
21942195

2195-
assert(FitsIn<int>(maskPopRegsInt));
2196+
assert(FitsIn<int>(maskPopRegsInt.getLow()));
21962197
inst_IV(INS_pop, (int)maskPopRegsInt);
21972198
compiler->unwindPopMaskInt(maskPopRegsInt);
21982199
}
@@ -2320,7 +2321,7 @@ void CodeGen::genFuncletProlog(BasicBlock* block)
23202321
regMaskTP maskStackAlloc = genStackAllocRegisterMask(genFuncletInfo.fiSpDelta, maskPushRegsFloat);
23212322
maskPushRegsInt |= maskStackAlloc;
23222323

2323-
assert(FitsIn<int>(maskPushRegsInt));
2324+
assert(FitsIn<int>(maskPushRegsInt.getLow()));
23242325
inst_IV(INS_push, (int)maskPushRegsInt);
23252326
compiler->unwindPushMaskInt(maskPushRegsInt);
23262327

@@ -2437,7 +2438,7 @@ void CodeGen::genFuncletEpilog()
24372438
compiler->unwindPopMaskFloat(maskPopRegsFloat);
24382439
}
24392440

2440-
assert(FitsIn<int>(maskPopRegsInt));
2441+
assert(FitsIn<int>(maskPopRegsInt.getLow()));
24412442
inst_IV(INS_pop, (int)maskPopRegsInt);
24422443
compiler->unwindPopMaskInt(maskPopRegsInt);
24432444

src/coreclr/jit/codegenarm64.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -922,7 +922,7 @@ void CodeGen::genSaveCalleeSavedRegistersHelp(regMaskTP regsToSaveMask, int lowe
922922
assert((spDelta % 16) == 0);
923923

924924
// We also can save FP and LR, even though they are not in RBM_CALLEE_SAVED.
925-
assert(regsToSaveCount <= genCountBits(RBM_CALLEE_SAVED | RBM_FP | RBM_LR));
925+
assert(regsToSaveCount <= genCountBits(regMaskTP(RBM_CALLEE_SAVED | RBM_FP | RBM_LR)));
926926

927927
// Save integer registers at higher addresses than floating-point registers.
928928

@@ -1035,7 +1035,7 @@ void CodeGen::genRestoreCalleeSavedRegistersHelp(regMaskTP regsToRestoreMask, in
10351035
assert((spDelta % 16) == 0);
10361036

10371037
// We also can restore FP and LR, even though they are not in RBM_CALLEE_SAVED.
1038-
assert(regsToRestoreCount <= genCountBits(RBM_CALLEE_SAVED | RBM_FP | RBM_LR));
1038+
assert(regsToRestoreCount <= genCountBits(regMaskTP(RBM_CALLEE_SAVED | RBM_FP | RBM_LR)));
10391039

10401040
// Point past the end, to start. We predecrement to find the offset to load from.
10411041
static_assert_no_msg(REGSIZE_BYTES == FPSAVE_REGSIZE_BYTES);

src/coreclr/jit/codegenarmarch.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4687,7 +4687,7 @@ void CodeGen::genPushCalleeSavedRegisters()
46874687

46884688
maskPushRegsInt |= genStackAllocRegisterMask(compiler->compLclFrameSize, maskPushRegsFloat);
46894689

4690-
assert(FitsIn<int>(maskPushRegsInt));
4690+
assert(FitsIn<int>(maskPushRegsInt.getLow()));
46914691
inst_IV(INS_push, (int)maskPushRegsInt);
46924692
compiler->unwindPushMaskInt(maskPushRegsInt);
46934693

src/coreclr/jit/codegenloongarch64.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,7 @@ void CodeGen::genSaveCalleeSavedRegistersHelp(regMaskTP regsToSaveMask, int lowe
535535
return;
536536
}
537537

538-
assert(genCountBits(regsToSaveMask) <= genCountBits(RBM_CALLEE_SAVED));
538+
assert(genCountBits(regsToSaveMask) <= genCountBits(regMaskTP(RBM_CALLEE_SAVED)));
539539

540540
// Save integer registers at higher addresses than floating-point registers.
541541

@@ -626,7 +626,7 @@ void CodeGen::genRestoreCalleeSavedRegistersHelp(regMaskTP regsToRestoreMask, in
626626

627627
unsigned regsToRestoreCount = genCountBits(regsToRestoreMask);
628628
// The FP and RA are not in RBM_CALLEE_SAVED.
629-
assert(regsToRestoreCount <= genCountBits(RBM_CALLEE_SAVED));
629+
assert(regsToRestoreCount <= genCountBits(regMaskTP(RBM_CALLEE_SAVED)));
630630

631631
// Point past the end, to start. We predecrement to find the offset to load from.
632632
static_assert_no_msg(REGSIZE_BYTES == FPSAVE_REGSIZE_BYTES);

src/coreclr/jit/codegenriscv64.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,7 @@ void CodeGen::genSaveCalleeSavedRegistersHelp(regMaskTP regsToSaveMask, int lowe
607607

608608
assert((spDelta % STACK_ALIGN) == 0);
609609

610-
assert(regsToSaveCount <= genCountBits(RBM_CALLEE_SAVED));
610+
assert(regsToSaveCount <= genCountBits(regMaskTP(RBM_CALLEE_SAVED)));
611611

612612
// Save integer registers at higher addresses than floating-point registers.
613613
regMaskTP maskSaveRegsFloat = regsToSaveMask & RBM_ALLFLOAT;
@@ -718,7 +718,7 @@ void CodeGen::genRestoreCalleeSavedRegistersHelp(regMaskTP regsToRestoreMask, in
718718
assert((spDelta % STACK_ALIGN) == 0);
719719

720720
// We also can restore FP and RA, even though they are not in RBM_CALLEE_SAVED.
721-
assert(regsToRestoreCount <= genCountBits(RBM_CALLEE_SAVED | RBM_FP | RBM_RA));
721+
assert(regsToRestoreCount <= genCountBits(regMaskTP(RBM_CALLEE_SAVED | RBM_FP | RBM_RA)));
722722

723723
// Point past the end, to start. We predecrement to find the offset to load from.
724724
static_assert_no_msg(REGSIZE_BYTES == FPSAVE_REGSIZE_BYTES);

src/coreclr/jit/compiler.hpp

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ inline bool genExactlyOneBit(T value)
9999
return ((value != 0) && genMaxOneBit(value));
100100
}
101101

102-
#ifdef TARGET_ARM64
103102
inline regMaskTP genFindLowestBit(regMaskTP value)
104103
{
105104
return regMaskTP(genFindLowestBit(value.getLow()));
@@ -124,7 +123,6 @@ inline bool genExactlyOneBit(regMaskTP value)
124123
{
125124
return genExactlyOneBit(value.getLow());
126125
}
127-
#endif
128126

129127
/*****************************************************************************
130128
*
@@ -169,17 +167,10 @@ inline unsigned uhi32(uint64_t value)
169167
* A rather simple routine that counts the number of bits in a given number.
170168
*/
171169

172-
inline unsigned genCountBits(uint64_t bits)
173-
{
174-
return BitOperations::PopCount(bits);
175-
}
176-
177-
#ifdef TARGET_ARM64
178170
inline unsigned genCountBits(regMaskTP mask)
179171
{
180172
return BitOperations::PopCount(mask.getLow());
181173
}
182-
#endif
183174

184175
/*****************************************************************************
185176
*
@@ -948,19 +939,11 @@ inline regNumber genRegNumFromMask(regMaskTP mask)
948939

949940
/* Convert the mask to a register number */
950941

951-
#ifdef TARGET_ARM64
952942
regNumber regNum = (regNumber)genLog2(mask.getLow());
953943

954944
/* Make sure we got it right */
955945
assert(genRegMask(regNum) == mask.getLow());
956946

957-
#else
958-
regNumber regNum = (regNumber)genLog2(mask);
959-
960-
/* Make sure we got it right */
961-
assert(genRegMask(regNum) == mask);
962-
#endif
963-
964947
return regNum;
965948
}
966949

@@ -4505,46 +4488,30 @@ inline void* operator new[](size_t sz, Compiler* compiler, CompMemKind cmk)
45054488

45064489
inline void printRegMask(regMaskTP mask)
45074490
{
4508-
#ifdef TARGET_ARM64
45094491
printf(REG_MASK_ALL_FMT, mask.getLow());
4510-
#else
4511-
printf(REG_MASK_ALL_FMT, mask);
4512-
#endif
45134492
}
45144493

45154494
inline char* regMaskToString(regMaskTP mask, Compiler* context)
45164495
{
45174496
const size_t cchRegMask = 24;
45184497
char* regmask = new (context, CMK_Unknown) char[cchRegMask];
45194498

4520-
#ifdef TARGET_ARM64
45214499
sprintf_s(regmask, cchRegMask, REG_MASK_ALL_FMT, mask.getLow());
4522-
#else
4523-
sprintf_s(regmask, cchRegMask, REG_MASK_ALL_FMT, mask);
4524-
#endif
45254500

45264501
return regmask;
45274502
}
45284503

45294504
inline void printRegMaskInt(regMaskTP mask)
45304505
{
4531-
#ifdef TARGET_ARM64
45324506
printf(REG_MASK_INT_FMT, (mask & RBM_ALLINT).getLow());
4533-
#else
4534-
printf(REG_MASK_INT_FMT, (mask & RBM_ALLINT));
4535-
#endif
45364507
}
45374508

45384509
inline char* regMaskIntToString(regMaskTP mask, Compiler* context)
45394510
{
45404511
const size_t cchRegMask = 24;
45414512
char* regmask = new (context, CMK_Unknown) char[cchRegMask];
45424513

4543-
#ifdef TARGET_ARM64
45444514
sprintf_s(regmask, cchRegMask, REG_MASK_INT_FMT, (mask & RBM_ALLINT).getLow());
4545-
#else
4546-
sprintf_s(regmask, cchRegMask, REG_MASK_INT_FMT, (mask & RBM_ALLINT));
4547-
#endif
45484515

45494516
return regmask;
45504517
}

src/coreclr/jit/emit.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8787,7 +8787,7 @@ void emitter::emitRecordGCcall(BYTE* codePos, unsigned char callInstrSize)
87878787
callDsc* call;
87888788

87898789
#ifdef JIT32_GCENCODER
8790-
unsigned regs = (emitThisGCrefRegs | emitThisByrefRegs) & ~RBM_INTRET;
8790+
unsigned regs = (unsigned)(emitThisGCrefRegs | emitThisByrefRegs) & ~RBM_INTRET;
87918791

87928792
// The JIT32 GCInfo encoder allows us to (as the comment previously here said):
87938793
// "Bail if this is a totally boring call", but the GCInfoEncoder/Decoder interface

src/coreclr/jit/emitarm.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5771,15 +5771,15 @@ size_t emitter::emitOutputInstr(insGroup* ig, instrDesc* id, BYTE** dp)
57715771
assert(REG_NA == (int)REG_NA);
57725772

57735773
VARSET_TP GCvars(VarSetOps::UninitVal());
5774+
regMaskTP gcrefRegs;
5775+
regMaskTP byrefRegs;
57745776

57755777
/* What instruction format have we got? */
57765778

57775779
switch (fmt)
57785780
{
5779-
int imm;
5780-
BYTE* addr;
5781-
regMaskTP gcrefRegs;
5782-
regMaskTP byrefRegs;
5781+
int imm;
5782+
BYTE* addr;
57835783

57845784
case IF_T1_A: // T1_A ................
57855785
sz = SMALL_IDSC_SIZE;

src/coreclr/jit/emitxarch.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15795,6 +15795,7 @@ BYTE* emitter::emitOutputRI(BYTE* dst, instrDesc* id)
1579515795
break;
1579615796

1579715797
case IF_RRW_CNS:
15798+
{
1579815799
assert(id->idGCref() == GCT_BYREF);
1579915800

1580015801
#ifdef DEBUG
@@ -15816,7 +15817,7 @@ BYTE* emitter::emitOutputRI(BYTE* dst, instrDesc* id)
1581615817
// Mark it as holding a GCT_BYREF
1581715818
emitGCregLiveUpd(GCT_BYREF, id->idReg1(), dst);
1581815819
break;
15819-
15820+
}
1582015821
default:
1582115822
#ifdef DEBUG
1582215823
emitDispIns(id, false, false, false);
@@ -16609,6 +16610,8 @@ size_t emitter::emitOutputInstr(insGroup* ig, instrDesc* id, BYTE** dp)
1660916610
assert(instrIs3opImul(id->idIns()) == 0 || size >= EA_4BYTE); // Has no 'w' bit
1661016611

1661116612
VARSET_TP GCvars(VarSetOps::UninitVal());
16613+
regMaskTP gcrefRegs;
16614+
regMaskTP byrefRegs;
1661216615

1661316616
// What instruction format have we got?
1661416617
switch (insFmt)
@@ -16621,9 +16624,6 @@ size_t emitter::emitOutputInstr(insGroup* ig, instrDesc* id, BYTE** dp)
1662116624
BYTE* addr;
1662216625
bool recCall;
1662316626

16624-
regMaskTP gcrefRegs;
16625-
regMaskTP byrefRegs;
16626-
1662716627
/********************************************************************/
1662816628
/* No operands */
1662916629
/********************************************************************/

src/coreclr/jit/gcencode.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2874,7 +2874,7 @@ size_t GCInfo::gcMakeRegPtrTable(BYTE* dest, int mask, const InfoHdr& header, un
28742874

28752875
if (compiler->lvaKeepAliveAndReportThis() && compiler->lvaTable[compiler->info.compThisArg].lvRegister)
28762876
{
2877-
unsigned thisRegMask = genRegMask(compiler->lvaTable[compiler->info.compThisArg].GetRegNum());
2877+
unsigned thisRegMask = (unsigned)genRegMask(compiler->lvaTable[compiler->info.compThisArg].GetRegNum());
28782878
unsigned thisPtrRegEnc = gceEncodeCalleeSavedRegs(thisRegMask) << 4;
28792879

28802880
if (thisPtrRegEnc)

0 commit comments

Comments
 (0)