diff --git a/src/coreclr/jit/lsrabuild.cpp b/src/coreclr/jit/lsrabuild.cpp index de3de78a8b704..ef1e02af69c0a 100644 --- a/src/coreclr/jit/lsrabuild.cpp +++ b/src/coreclr/jit/lsrabuild.cpp @@ -2825,19 +2825,24 @@ void LinearScan::buildIntervals() availableRegCount = REG_INT_COUNT; } -#ifdef HAS_MORE_THAN_64_REGISTERS - actualRegistersMask = regMaskTP(~RBM_NONE); -#else - if (availableRegCount < (sizeof(regMaskTP) * 8)) + static_assert(sizeof(regMaskTP) == 2 * sizeof(regMaskSmall)); + + if (availableRegCount < (sizeof(regMaskSmall) * 8)) { - // Mask out the bits that are between 64 ~ availableRegCount - actualRegistersMask = (1ULL << availableRegCount) - 1; + // Mask out the bits that are between (8 * regMaskSmall) ~ availableRegCount + actualRegistersMask = regMaskTP((1ULL << availableRegCount) - 1); + } + else if (availableRegCount < (sizeof(regMaskTP) * 8)) + { + // Mask out the bits that are between (8 * regMaskTP) ~ availableRegCount + // Subtract one extra for stack. + unsigned topRegCount = availableRegCount - sizeof(regMaskSmall) * 8 - 1; + actualRegistersMask = regMaskTP(~RBM_NONE, (1ULL << topRegCount) - 1); } else { - actualRegistersMask = ~RBM_NONE; + actualRegistersMask = regMaskTP(~RBM_NONE, ~RBM_NONE); } -#endif #ifdef DEBUG // Make sure we don't have any blocks that were not visited diff --git a/src/coreclr/jit/target.h b/src/coreclr/jit/target.h index 091f9d9705976..2c990c70d5bfc 100644 --- a/src/coreclr/jit/target.h +++ b/src/coreclr/jit/target.h @@ -229,13 +229,6 @@ typedef uint64_t regMaskSmall; #define REG_MASK_ALL_FMT "%016llX" #endif -#ifdef TARGET_ARM64 -#define HAS_MORE_THAN_64_REGISTERS 1 -#define MORE_THAN_64_REGISTERS(x) x -#else -#define MORE_THAN_64_REGISTERS(x) -#endif // TARGET_ARM64 - typedef regMaskSmall SingleTypeRegSet; inline SingleTypeRegSet genRegMask(regNumber reg); inline SingleTypeRegSet genRegMaskFloat(regNumber reg ARM_ARG(var_types type = TYP_DOUBLE)); @@ -244,9 +237,16 @@ struct regMaskTP { private: regMaskSmall low; - MORE_THAN_64_REGISTERS(regMaskSmall high); + regMaskSmall high; public: + + regMaskTP(regMaskSmall lowMask, regMaskSmall highMask) + : low(lowMask) + , high(highMask) + { + } + regMaskTP(regMaskSmall regMask) : low(regMask) {