Subzero. X86. Refactors initRegisterSet.
initRegisterSet() for x8632 and x8664 were both huge. This CL refactors
those methods to use a pre-initialized table instead of the result of
expanding the x-macros.
BUG=
R=stichnot@chromium.org
Review URL: https://codereview.chromium.org/1546373003 .
diff --git a/src/IceInstX8632.def b/src/IceInstX8632.def
index 5a3ff7d..0ed4b80 100644
--- a/src/IceInstX8632.def
+++ b/src/IceInstX8632.def
@@ -122,21 +122,21 @@
is64To8,is32To8,is16To8,isTrunc8Rcvr,isAhRcvr, aliases */ \
/* xmm registers */ \
X(Reg_xmm0, 0, "xmm0", Reg_xmm0, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8632, xmm0)) \
+ NO_ALIASES()) \
X(Reg_xmm1, 1, "xmm1", Reg_xmm1, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8632, xmm1)) \
+ NO_ALIASES()) \
X(Reg_xmm2, 2, "xmm2", Reg_xmm2, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8632, xmm2)) \
+ NO_ALIASES()) \
X(Reg_xmm3, 3, "xmm3", Reg_xmm3, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8632, xmm3)) \
+ NO_ALIASES()) \
X(Reg_xmm4, 4, "xmm4", Reg_xmm4, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8632, xmm4)) \
+ NO_ALIASES()) \
X(Reg_xmm5, 5, "xmm5", Reg_xmm5, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8632, xmm5)) \
+ NO_ALIASES()) \
X(Reg_xmm6, 6, "xmm6", Reg_xmm6, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8632, xmm6)) \
+ NO_ALIASES()) \
X(Reg_xmm7, 7, "xmm7", Reg_xmm7, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8632, xmm7)) \
+ NO_ALIASES()) \
/* End of xmm register set */
//#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr,
// isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8,
diff --git a/src/IceInstX8664.def b/src/IceInstX8664.def
index 6ebec1b..9c3b0f5 100644
--- a/src/IceInstX8664.def
+++ b/src/IceInstX8664.def
@@ -212,37 +212,37 @@
is64To8,is32To8,is16To8,isTrunc8Rcvr,isAhRcvr, aliases */ \
/* xmm registers */ \
X(Reg_xmm0, 0, "xmm0", Reg_xmm0, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8664, xmm0)) \
+ NO_ALIASES()) \
X(Reg_xmm1, 1, "xmm1", Reg_xmm1, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8664, xmm1)) \
+ NO_ALIASES()) \
X(Reg_xmm2, 2, "xmm2", Reg_xmm2, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8664, xmm2)) \
+ NO_ALIASES()) \
X(Reg_xmm3, 3, "xmm3", Reg_xmm3, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8664, xmm3)) \
+ NO_ALIASES()) \
X(Reg_xmm4, 4, "xmm4", Reg_xmm4, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8664, xmm4)) \
+ NO_ALIASES()) \
X(Reg_xmm5, 5, "xmm5", Reg_xmm5, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8664, xmm5)) \
+ NO_ALIASES()) \
X(Reg_xmm6, 6, "xmm6", Reg_xmm6, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8664, xmm6)) \
+ NO_ALIASES()) \
X(Reg_xmm7, 7, "xmm7", Reg_xmm7, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8664, xmm7)) \
+ NO_ALIASES()) \
X(Reg_xmm8, 8, "xmm8", Reg_xmm8, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8664, xmm8)) \
+ NO_ALIASES()) \
X(Reg_xmm9, 9, "xmm9", Reg_xmm9, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8664, xmm9)) \
+ NO_ALIASES()) \
X(Reg_xmm10, 10, "xmm10", Reg_xmm10, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8664, xmm10)) \
+ NO_ALIASES()) \
X(Reg_xmm11, 11, "xmm11", Reg_xmm11, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8664, xmm11)) \
+ NO_ALIASES()) \
X(Reg_xmm12, 12, "xmm12", Reg_xmm12, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8664, xmm12)) \
+ NO_ALIASES()) \
X(Reg_xmm13, 13, "xmm13", Reg_xmm13, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8664, xmm13)) \
+ NO_ALIASES()) \
X(Reg_xmm14, 14, "xmm14", Reg_xmm14, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8664, xmm14)) \
+ NO_ALIASES()) \
X(Reg_xmm15, 15, "xmm15", Reg_xmm15, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
- REGLIST1(RegX8664, xmm15)) \
+ NO_ALIASES()) \
/* End of xmm register set */
//#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr,
// isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8,
diff --git a/src/IceRegList.h b/src/IceRegList.h
index 87e1492..6437474 100644
--- a/src/IceRegList.h
+++ b/src/IceRegList.h
@@ -19,6 +19,8 @@
// indicates how many register aliases are being provided to the macro. It
// assumes the parameters are register names declared in the "ns"
// namespace/class, but with the common "Reg_" prefix removed for brevity.
+#define NO_ALIASES() \
+ {}
#define REGLIST1(ns, r0) \
{ ns::Reg_##r0 }
#define REGLIST2(ns, r0, r1) \
diff --git a/src/IceTargetLoweringX8632Traits.h b/src/IceTargetLoweringX8632Traits.h
index d02f69a..49a0115 100644
--- a/src/IceTargetLoweringX8632Traits.h
+++ b/src/IceTargetLoweringX8632Traits.h
@@ -271,7 +271,7 @@
static constexpr Type WordType = IceType_i32;
static IceString getRegName(int32_t RegNum) {
- static const char *const RegNames[] = {
+ static const char *const RegNames[RegisterSet::Reg_NUM] = {
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
isTrunc8Rcvr, isAhRcvr, aliases) \
@@ -285,7 +285,7 @@
}
static GPRRegister getEncodedGPR(int32_t RegNum) {
- static const GPRRegister GPRRegs[] = {
+ static const GPRRegister GPRRegs[RegisterSet::Reg_NUM] = {
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
isTrunc8Rcvr, isAhRcvr, aliases) \
@@ -300,7 +300,7 @@
}
static ByteRegister getEncodedByteReg(int32_t RegNum) {
- static const ByteRegister ByteRegs[] = {
+ static const ByteRegister ByteRegs[RegisterSet::Reg_NUM] = {
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
isTrunc8Rcvr, isAhRcvr, aliases) \
@@ -315,7 +315,7 @@
}
static XmmRegister getEncodedXmm(int32_t RegNum) {
- static const XmmRegister XmmRegs[] = {
+ static const XmmRegister XmmRegs[RegisterSet::Reg_NUM] = {
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
isTrunc8Rcvr, isAhRcvr, aliases) \
@@ -330,7 +330,7 @@
}
static uint32_t getEncoding(int32_t RegNum) {
- static const uint32_t Encoding[] = {
+ static const uint32_t Encoding[RegisterSet::Reg_NUM] = {
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
isTrunc8Rcvr, isAhRcvr, aliases) \
@@ -344,7 +344,7 @@
}
static int32_t getBaseReg(int32_t RegNum) {
- static const int32_t BaseRegs[] = {
+ static const int32_t BaseRegs[RegisterSet::Reg_NUM] = {
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
isTrunc8Rcvr, isAhRcvr, aliases) \
@@ -400,6 +400,34 @@
return RegNum;
}
+private:
+ /// SizeOf is used to obtain the size of an initializer list as a constexpr
+ /// expression. This is only needed until our C++ library is updated to
+ /// C++ 14 -- which defines constexpr members to std::initializer_list.
+ class SizeOf {
+ SizeOf(const SizeOf &) = delete;
+ SizeOf &operator=(const SizeOf &) = delete;
+
+ public:
+ constexpr SizeOf() : Size(0) {}
+ template <typename... T>
+ explicit constexpr SizeOf(T...)
+ : Size(__length<T...>::value) {}
+ constexpr SizeT size() const { return Size; }
+
+ private:
+ template <typename T, typename... U> struct __length {
+ static constexpr std::size_t value = 1 + __length<U...>::value;
+ };
+
+ template <typename T> struct __length<T> {
+ static constexpr std::size_t value = 1;
+ };
+
+ const std::size_t Size;
+ };
+
+public:
static void initRegisterSet(
std::array<llvm::SmallBitVector, RCX86_NUM> *TypeToRegisterSet,
std::array<llvm::SmallBitVector, RegisterSet::Reg_NUM> *RegisterAliases,
@@ -416,29 +444,58 @@
llvm::SmallBitVector AhRcvrRegisters(RegisterSet::Reg_NUM);
llvm::SmallBitVector InvalidRegisters(RegisterSet::Reg_NUM);
ScratchRegs->resize(RegisterSet::Reg_NUM);
+
+ static constexpr struct {
+ uint16_t Val;
+ int Is64 : 1;
+ int Is32 : 1;
+ int Is16 : 1;
+ int Is8 : 1;
+ int IsXmm : 1;
+ int Is64To8 : 1;
+ int Is32To8 : 1;
+ int Is16To8 : 1;
+ int IsTrunc8Rcvr : 1;
+ int IsAhRcvr : 1;
+ int Scratch : 1;
+#define NUM_ALIASES_BITS 2
+ SizeT NumAliases : (NUM_ALIASES_BITS + 1);
+ uint16_t Aliases[1 << NUM_ALIASES_BITS];
+#undef NUM_ALIASES_BITS
+ } X8632RegTable[RegisterSet::Reg_NUM] = {
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
isTrunc8Rcvr, isAhRcvr, aliases) \
- (IntegerRegistersI32)[RegisterSet::val] = is32; \
- (IntegerRegistersI16)[RegisterSet::val] = is16; \
- (IntegerRegistersI8)[RegisterSet::val] = is8; \
- (FloatRegisters)[RegisterSet::val] = isXmm; \
- (VectorRegisters)[RegisterSet::val] = isXmm; \
- (Trunc64To8Registers)[RegisterSet::val] = is64To8; \
- (Trunc32To8Registers)[RegisterSet::val] = is32To8; \
- (Trunc16To8Registers)[RegisterSet::val] = is16To8; \
- (Trunc8RcvrRegisters)[RegisterSet::val] = isTrunc8Rcvr; \
- (AhRcvrRegisters)[RegisterSet::val] = isAhRcvr; \
- (*RegisterAliases)[RegisterSet::val].resize(RegisterSet::Reg_NUM); \
- for (SizeT RegAlias : aliases) { \
- assert(!(*RegisterAliases)[RegisterSet::val][RegAlias] && \
- "Duplicate alias for " #val); \
- (*RegisterAliases)[RegisterSet::val].set(RegAlias); \
+ { \
+ RegisterSet::val, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
+ isTrunc8Rcvr, isAhRcvr, scratch, (SizeOf aliases).size(), aliases, \
} \
- (*RegisterAliases)[RegisterSet::val].set(RegisterSet::val); \
- (*ScratchRegs)[RegisterSet::val] = scratch;
- REGX8632_TABLE;
+ ,
+ REGX8632_TABLE
#undef X
+ };
+
+ for (SizeT ii = 0; ii < llvm::array_lengthof(X8632RegTable); ++ii) {
+ const auto &Entry = X8632RegTable[ii];
+ (IntegerRegistersI32)[Entry.Val] = Entry.Is32;
+ (IntegerRegistersI16)[Entry.Val] = Entry.Is16;
+ (IntegerRegistersI8)[Entry.Val] = Entry.Is8;
+ (FloatRegisters)[Entry.Val] = Entry.IsXmm;
+ (VectorRegisters)[Entry.Val] = Entry.IsXmm;
+ (Trunc64To8Registers)[Entry.Val] = Entry.Is64To8;
+ (Trunc32To8Registers)[Entry.Val] = Entry.Is32To8;
+ (Trunc16To8Registers)[Entry.Val] = Entry.Is16To8;
+ (Trunc8RcvrRegisters)[Entry.Val] = Entry.IsTrunc8Rcvr;
+ (AhRcvrRegisters)[Entry.Val] = Entry.IsAhRcvr;
+ (*RegisterAliases)[Entry.Val].resize(RegisterSet::Reg_NUM);
+ for (int J = 0; J < Entry.NumAliases; J++) {
+ SizeT Alias = Entry.Aliases[J];
+ assert(!(*RegisterAliases)[Entry.Val][Alias] && "Duplicate alias");
+ (*RegisterAliases)[Entry.Val].set(Alias);
+ }
+ (*RegisterAliases)[Entry.Val].set(Entry.Val);
+ (*ScratchRegs)[Entry.Val] = Entry.Scratch;
+ }
(*TypeToRegisterSet)[RC_void] = InvalidRegisters;
(*TypeToRegisterSet)[RC_i1] = IntegerRegistersI8;
diff --git a/src/IceTargetLoweringX8664Traits.h b/src/IceTargetLoweringX8664Traits.h
index f49bb6b..2822e6a 100644
--- a/src/IceTargetLoweringX8664Traits.h
+++ b/src/IceTargetLoweringX8664Traits.h
@@ -27,6 +27,7 @@
#include "IceTargetLoweringX86RegClass.h"
#include <array>
+#include <initializer_list>
namespace Ice {
@@ -296,7 +297,7 @@
static constexpr Type WordType = IceType_i64;
static IceString getRegName(int32_t RegNum) {
- static const char *const RegNames[] = {
+ static const char *const RegNames[RegisterSet::Reg_NUM] = {
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
isTrunc8Rcvr, isAhRcvr, aliases) \
@@ -310,7 +311,7 @@
}
static GPRRegister getEncodedGPR(int32_t RegNum) {
- static const GPRRegister GPRRegs[] = {
+ static const GPRRegister GPRRegs[RegisterSet::Reg_NUM] = {
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
isTrunc8Rcvr, isAhRcvr, aliases) \
@@ -325,7 +326,7 @@
}
static ByteRegister getEncodedByteReg(int32_t RegNum) {
- static const ByteRegister ByteRegs[] = {
+ static const ByteRegister ByteRegs[RegisterSet::Reg_NUM] = {
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
isTrunc8Rcvr, isAhRcvr, aliases) \
@@ -340,7 +341,7 @@
}
static XmmRegister getEncodedXmm(int32_t RegNum) {
- static const XmmRegister XmmRegs[] = {
+ static const XmmRegister XmmRegs[RegisterSet::Reg_NUM] = {
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
isTrunc8Rcvr, isAhRcvr, aliases) \
@@ -355,7 +356,7 @@
}
static uint32_t getEncoding(int32_t RegNum) {
- static const uint32_t Encoding[] = {
+ static const uint32_t Encoding[RegisterSet::Reg_NUM] = {
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
isTrunc8Rcvr, isAhRcvr, aliases) \
@@ -369,7 +370,7 @@
}
static inline int32_t getBaseReg(int32_t RegNum) {
- static const int32_t BaseRegs[] = {
+ static const int32_t BaseRegs[RegisterSet::Reg_NUM] = {
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
isTrunc8Rcvr, isAhRcvr, aliases) \
@@ -450,6 +451,34 @@
}
}
+private:
+ /// SizeOf is used to obtain the size of an initializer list as a constexpr
+ /// expression. This is only needed until our C++ library is updated to
+ /// C++ 14 -- which defines constexpr members to std::initializer_list.
+ class SizeOf {
+ SizeOf(const SizeOf &) = delete;
+ SizeOf &operator=(const SizeOf &) = delete;
+
+ public:
+ constexpr SizeOf() : Size(0) {}
+ template <typename... T>
+ explicit constexpr SizeOf(T...)
+ : Size(__length<T...>::value) {}
+ constexpr SizeT size() const { return Size; }
+
+ private:
+ template <typename T, typename... U> struct __length {
+ static constexpr std::size_t value = 1 + __length<U...>::value;
+ };
+
+ template <typename T> struct __length<T> {
+ static constexpr std::size_t value = 1;
+ };
+
+ const std::size_t Size;
+ };
+
+public:
static void initRegisterSet(
std::array<llvm::SmallBitVector, RCX86_NUM> *TypeToRegisterSet,
std::array<llvm::SmallBitVector, RegisterSet::Reg_NUM> *RegisterAliases,
@@ -468,30 +497,58 @@
llvm::SmallBitVector InvalidRegisters(RegisterSet::Reg_NUM);
ScratchRegs->resize(RegisterSet::Reg_NUM);
+ static constexpr struct {
+ uint16_t Val;
+ int Is64 : 1;
+ int Is32 : 1;
+ int Is16 : 1;
+ int Is8 : 1;
+ int IsXmm : 1;
+ int Is64To8 : 1;
+ int Is32To8 : 1;
+ int Is16To8 : 1;
+ int IsTrunc8Rcvr : 1;
+ int IsAhRcvr : 1;
+ int Scratch : 1;
+#define NUM_ALIASES_BITS 2
+ SizeT NumAliases : (NUM_ALIASES_BITS + 1);
+ uint16_t Aliases[1 << NUM_ALIASES_BITS];
+#undef NUM_ALIASES_BITS
+ } X8664RegTable[RegisterSet::Reg_NUM] = {
#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
isTrunc8Rcvr, isAhRcvr, aliases) \
- (IntegerRegistersI64)[RegisterSet::val] = is64; \
- (IntegerRegistersI32)[RegisterSet::val] = is32; \
- (IntegerRegistersI16)[RegisterSet::val] = is16; \
- (IntegerRegistersI8)[RegisterSet::val] = is8; \
- (FloatRegisters)[RegisterSet::val] = isXmm; \
- (VectorRegisters)[RegisterSet::val] = isXmm; \
- (Trunc64To8Registers)[RegisterSet::val] = is64To8; \
- (Trunc32To8Registers)[RegisterSet::val] = is32To8; \
- (Trunc16To8Registers)[RegisterSet::val] = is16To8; \
- (Trunc8RcvrRegisters)[RegisterSet::val] = isTrunc8Rcvr; \
- (AhRcvrRegisters)[RegisterSet::val] = isAhRcvr; \
- (*RegisterAliases)[RegisterSet::val].resize(RegisterSet::Reg_NUM); \
- for (SizeT RegAlias : aliases) { \
- assert(!(*RegisterAliases)[RegisterSet::val][RegAlias] && \
- "Duplicate alias for " #val); \
- (*RegisterAliases)[RegisterSet::val].set(RegAlias); \
+ { \
+ RegisterSet::val, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
+ isTrunc8Rcvr, isAhRcvr, scratch, (SizeOf aliases).size(), aliases, \
} \
- (*RegisterAliases)[RegisterSet::val].set(RegisterSet::val); \
- (*ScratchRegs)[RegisterSet::val] = scratch;
- REGX8664_TABLE;
+ ,
+ REGX8664_TABLE
#undef X
+ };
+
+ for (SizeT ii = 0; ii < llvm::array_lengthof(X8664RegTable); ++ii) {
+ const auto &Entry = X8664RegTable[ii];
+ (IntegerRegistersI64)[Entry.Val] = Entry.Is64;
+ (IntegerRegistersI32)[Entry.Val] = Entry.Is32;
+ (IntegerRegistersI16)[Entry.Val] = Entry.Is16;
+ (IntegerRegistersI8)[Entry.Val] = Entry.Is8;
+ (FloatRegisters)[Entry.Val] = Entry.IsXmm;
+ (VectorRegisters)[Entry.Val] = Entry.IsXmm;
+ (Trunc64To8Registers)[Entry.Val] = Entry.Is64To8;
+ (Trunc32To8Registers)[Entry.Val] = Entry.Is32To8;
+ (Trunc16To8Registers)[Entry.Val] = Entry.Is16To8;
+ (Trunc8RcvrRegisters)[Entry.Val] = Entry.IsTrunc8Rcvr;
+ (AhRcvrRegisters)[Entry.Val] = Entry.IsAhRcvr;
+ (*RegisterAliases)[Entry.Val].resize(RegisterSet::Reg_NUM);
+ for (int J = 0; J < Entry.NumAliases; ++J) {
+ SizeT Alias = Entry.Aliases[J];
+ assert(!(*RegisterAliases)[Entry.Val][Alias] && "Duplicate alias");
+ (*RegisterAliases)[Entry.Val].set(Alias);
+ }
+ (*RegisterAliases)[Entry.Val].set(Entry.Val);
+ (*ScratchRegs)[Entry.Val] = Entry.Scratch;
+ }
(*TypeToRegisterSet)[RC_void] = InvalidRegisters;
(*TypeToRegisterSet)[RC_i1] = IntegerRegistersI8;