Skip to content

Commit e895528

Browse files
committed
Add high field
1 parent 23e15a5 commit e895528

File tree

5 files changed

+75
-27
lines changed

5 files changed

+75
-27
lines changed

src/coreclr/jit/compiler.hpp

+34-8
Original file line numberDiff line numberDiff line change
@@ -933,7 +933,7 @@ inline unsigned Compiler::funGetFuncIdx(BasicBlock* block)
933933
// Assumptions:
934934
// The mask contains one and only one register.
935935

936-
inline regNumber genRegNumFromMask(regMaskTP mask)
936+
inline regNumber genRegNumFromMask(const regMaskTP& mask)
937937
{
938938
assert(mask.IsNonEmpty()); // Must have one bit set, so can't have a mask of zero
939939

@@ -947,6 +947,27 @@ inline regNumber genRegNumFromMask(regMaskTP mask)
947947
return regNum;
948948
}
949949

950+
//------------------------------------------------------------------------------
951+
// genFirstRegNumFromMask : Maps first bit set in the register mask to a register number.
952+
//
953+
// Arguments:
954+
// mask - the register mask
955+
//
956+
// Return Value:
957+
// The number of the first register contained in the mask.
958+
//
959+
960+
inline regNumber genFirstRegNumFromMask(const regMaskTP& mask)
961+
{
962+
assert(mask.IsNonEmpty()); // Must have one bit set, so can't have a mask of zero
963+
964+
/* Convert the mask to a register number */
965+
966+
regNumber regNum = (regNumber)BitScanForward(mask);
967+
968+
return regNum;
969+
}
970+
950971
//------------------------------------------------------------------------------
951972
// genFirstRegNumFromMaskAndToggle : Maps first bit set in the register mask to a
952973
// register number and also toggle the bit in the `mask`.
@@ -964,34 +985,39 @@ inline regNumber genFirstRegNumFromMaskAndToggle(regMaskTP& mask)
964985

965986
/* Convert the mask to a register number */
966987

967-
regNumber regNum = (regNumber)BitScanForward(mask);
988+
regNumber regNum = (regNumber)genFirstRegNumFromMask(mask);
968989

969-
mask ^= genRegMask(regNum);
990+
mask ^= regNum;
970991

971992
return regNum;
972993
}
973994

974995
//------------------------------------------------------------------------------
975-
// genFirstRegNumFromMask : Maps first bit set in the register mask to a register number.
976-
//
996+
// genFirstRegNumFromMaskAndToggle : Maps first bit set in the register mask to a
997+
// register number and also toggle the bit in the `mask`.
977998
// Arguments:
978999
// mask - the register mask
9791000
//
9801001
// Return Value:
981-
// The number of the first register contained in the mask.
1002+
// The number of the first register contained in the mask and updates the `mask` to toggle
1003+
// the bit.
9821004
//
9831005

984-
inline regNumber genFirstRegNumFromMask(regMaskTP mask)
1006+
inline regNumber genFirstRegNumFromMaskAndToggle(SingleTypeRegSet& mask)
9851007
{
986-
assert(mask.IsNonEmpty()); // Must have one bit set, so can't have a mask of zero
1008+
assert(mask != RBM_NONE); // Must have one bit set, so can't have a mask of zero
9871009

9881010
/* Convert the mask to a register number */
9891011

9901012
regNumber regNum = (regNumber)BitScanForward(mask);
9911013

1014+
mask ^= genRegMask(regNum);
1015+
9921016
return regNum;
9931017
}
9941018

1019+
1020+
9951021
/*****************************************************************************
9961022
*
9971023
* Return the size in bytes of the given type.

src/coreclr/jit/lsra.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -4039,7 +4039,7 @@ void LinearScan::processKills(RefPosition* killRefPosition)
40394039
{
40404040
RefPosition* nextKill = killRefPosition->nextRefPosition;
40414041

4042-
regMaskTP killedRegs = killRefPosition->registerAssignment;
4042+
SingleTypeRegSet killedRegs = killRefPosition->registerAssignment;
40434043
while (killedRegs != RBM_NONE)
40444044
{
40454045
regNumber killedReg = genFirstRegNumFromMaskAndToggle(killedRegs);
@@ -4081,7 +4081,7 @@ void LinearScan::spillGCRefs(RefPosition* killRefPosition)
40814081
{
40824082
// For each physical register that can hold a GC type,
40834083
// if it is occupied by an interval of a GC type, spill that interval.
4084-
regMaskTP candidateRegs = killRefPosition->registerAssignment;
4084+
SingleTypeRegSet candidateRegs = killRefPosition->registerAssignment;
40854085
INDEBUG(bool killedRegs = false);
40864086
while (candidateRegs != RBM_NONE)
40874087
{
@@ -4174,7 +4174,7 @@ regNumber LinearScan::rotateBlockStartLocation(Interval* interval, regNumber tar
41744174
{
41754175
// If we're rotating the register locations at block boundaries, try to use
41764176
// the next higher register number of the appropriate register type.
4177-
regMaskTP candidateRegs = allRegs(interval->registerType) & availableRegs;
4177+
SingleTypeRegSet candidateRegs = allRegs(interval->registerType) & availableRegs.GetRegSetForType(interval->registerType);
41784178
regNumber firstReg = REG_NA;
41794179
regNumber newReg = REG_NA;
41804180
while (candidateRegs != RBM_NONE)
@@ -12205,7 +12205,7 @@ void LinearScan::verifyFinalAllocation()
1220512205
// However, we will assert that, at resolution time, no registers contain GC refs.
1220612206
{
1220712207
DBEXEC(VERBOSE, printf(" "));
12208-
regMaskTP candidateRegs = currentRefPosition.registerAssignment;
12208+
SingleTypeRegSet candidateRegs = currentRefPosition.registerAssignment;
1220912209
while (candidateRegs != RBM_NONE)
1221012210
{
1221112211
regNumber nextReg = genFirstRegNumFromMaskAndToggle(candidateRegs);

src/coreclr/jit/lsrabuild.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -2825,6 +2825,9 @@ void LinearScan::buildIntervals()
28252825
availableRegCount = REG_INT_COUNT;
28262826
}
28272827

2828+
#ifdef HAS_MORE_THAN_64_REGISTERS
2829+
actualRegistersMask = regMaskTP(~RBM_NONE);
2830+
#else
28282831
if (availableRegCount < (sizeof(regMaskTP) * 8))
28292832
{
28302833
// Mask out the bits that are between 64 ~ availableRegCount
@@ -2834,6 +2837,7 @@ void LinearScan::buildIntervals()
28342837
{
28352838
actualRegistersMask = ~RBM_NONE;
28362839
}
2840+
#endif
28372841

28382842
#ifdef DEBUG
28392843
// Make sure we don't have any blocks that were not visited

src/coreclr/jit/regset.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ class RegSet
119119
bool rsRegsModified(regMaskTP mask) const
120120
{
121121
assert(rsModifiedRegsMaskInitialized);
122-
return (rsModifiedRegsMask & mask) != 0;
122+
return (rsModifiedRegsMask & mask).IsNonEmpty();
123123
}
124124

125125
void verifyRegUsed(regNumber reg);

src/coreclr/jit/target.h

+32-14
Original file line numberDiff line numberDiff line change
@@ -229,16 +229,28 @@ typedef uint64_t regMaskSmall;
229229
#define REG_MASK_ALL_FMT "%016llX"
230230
#endif
231231

232+
#ifdef TARGET_ARM64
233+
#define HAS_MORE_THAN_64_REGISTERS 1
234+
#define MORE_THAN_64_REGISTERS(x) x
235+
#else
236+
#define MORE_THAN_64_REGISTERS(x)
237+
#endif // TARGET_ARM64
238+
232239
typedef regMaskSmall SingleTypeRegSet;
240+
inline SingleTypeRegSet genRegMask(regNumber reg);
241+
inline SingleTypeRegSet genRegMaskFloat(regNumber reg ARM_ARG(var_types type = TYP_DOUBLE));
233242

234243
struct regMaskTP
235244
{
236245
private:
237246
regMaskSmall low;
247+
MORE_THAN_64_REGISTERS(regMaskSmall high);
248+
238249
public:
239-
constexpr regMaskTP(regMaskSmall regMask)
250+
regMaskTP(regMaskSmall regMask)
240251
: low(regMask)
241252
{
253+
242254
}
243255

244256
regMaskTP()
@@ -278,12 +290,12 @@ struct regMaskTP
278290
return low;
279291
}
280292

281-
bool IsEmpty()
293+
bool IsEmpty() const
282294
{
283295
return low == RBM_NONE;
284296
}
285297

286-
bool IsNonEmpty()
298+
bool IsNonEmpty() const
287299
{
288300
return !IsEmpty();
289301
}
@@ -313,48 +325,54 @@ struct regMaskTP
313325
bool IsRegNumInMask(regNumber reg);
314326
};
315327

316-
static regMaskTP operator^(regMaskTP first, regMaskTP second)
328+
static regMaskTP operator^(const regMaskTP& first, const regMaskTP& second)
317329
{
318330
regMaskTP result(first.getLow() ^ second.getLow());
319331
return result;
320332
}
321333

322-
static regMaskTP operator&(regMaskTP first, regMaskTP second)
334+
static regMaskTP operator&(const regMaskTP& first, const regMaskTP& second)
323335
{
324336
regMaskTP result(first.getLow() & second.getLow());
325337
return result;
326338
}
327339

328-
static regMaskTP operator|(regMaskTP first, regMaskTP second)
340+
static regMaskTP operator|(const regMaskTP& first, const regMaskTP& second)
329341
{
330342
regMaskTP result(first.getLow() | second.getLow());
331343
return result;
332344
}
333345

334-
static regMaskTP& operator|=(regMaskTP& first, regMaskTP second)
346+
static regMaskTP& operator|=(regMaskTP& first, const regMaskTP& second)
335347
{
336348
first = first | second;
337349
return first;
338350
}
339351

340-
static regMaskTP& operator^=(regMaskTP& first, regMaskTP second)
352+
static regMaskTP& operator^=(regMaskTP& first, const regMaskTP& second)
341353
{
342354
first = first ^ second;
343355
return first;
344356
}
345357

346-
static regMaskTP& operator&=(regMaskTP& first, regMaskTP second)
358+
static regMaskTP& operator^=(regMaskTP& first, const regNumber reg)
359+
{
360+
first = first ^ genRegMask(reg);
361+
return first;
362+
}
363+
364+
static regMaskTP& operator&=(regMaskTP& first, const regMaskTP& second)
347365
{
348366
first = first & second;
349367
return first;
350368
}
351369

352-
static bool operator==(regMaskTP first, regMaskTP second)
370+
static bool operator==(const regMaskTP& first, const regMaskTP& second)
353371
{
354372
return (first.getLow() == second.getLow());
355373
}
356374

357-
static bool operator!=(regMaskTP first, regMaskTP second)
375+
static bool operator!=(const regMaskTP& first, const regMaskTP& second)
358376
{
359377
return !(first == second);
360378
}
@@ -390,18 +408,18 @@ static regMaskTP& operator<<=(regMaskTP& first, const int b)
390408
}
391409
#endif
392410

393-
static regMaskTP operator~(regMaskTP first)
411+
static regMaskTP operator~(const regMaskTP& first)
394412
{
395413
regMaskTP result(~first.getLow());
396414
return result;
397415
}
398416

399-
static uint32_t PopCount(regMaskTP value)
417+
static uint32_t PopCount(const regMaskTP& value)
400418
{
401419
return BitOperations::PopCount(value.getLow());
402420
}
403421

404-
static uint32_t BitScanForward(regMaskTP mask)
422+
static uint32_t BitScanForward(const regMaskTP& mask)
405423
{
406424
return BitOperations::BitScanForward(mask.getLow());
407425
}

0 commit comments

Comments
 (0)