| Index: src/IceTargetLoweringX8664Traits.h
|
| diff --git a/src/IceTargetLoweringX8664Traits.h b/src/IceTargetLoweringX8664Traits.h
|
| index 4f1c6e4c9b6d54bce19ee2ef7d905fc61aa76be2..331f07677ca9c3ad54d89a0da50e4434879c2b32 100644
|
| --- a/src/IceTargetLoweringX8664Traits.h
|
| +++ b/src/IceTargetLoweringX8664Traits.h
|
| @@ -60,8 +60,8 @@ template <> struct MachineTraits<TargetX8664> {
|
| enum ScaleFactor { TIMES_1 = 0, TIMES_2 = 1, TIMES_4 = 2, TIMES_8 = 3 };
|
|
|
| using GPRRegister = ::Ice::RegX8664::GPRRegister;
|
| - using XmmRegister = ::Ice::RegX8664::XmmRegister;
|
| using ByteRegister = ::Ice::RegX8664::ByteRegister;
|
| + using XmmRegister = ::Ice::RegX8664::XmmRegister;
|
|
|
| using Cond = ::Ice::CondX8664;
|
|
|
| @@ -289,53 +289,123 @@ template <> struct MachineTraits<TargetX8664> {
|
| static const char *TargetName;
|
| static constexpr Type WordType = IceType_i64;
|
|
|
| - static IceString getRegName(SizeT RegNum, Type Ty) {
|
| + static IceString getRegName(int32_t RegNum) {
|
| + static const char *const RegNames[] = {
|
| +#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
|
| + isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
|
| + isTrunc8Rcvr, isAhRcvr, aliases) \
|
| + name,
|
| + REGX8664_TABLE
|
| +#undef X
|
| + };
|
| + assert(RegNum >= 0);
|
| assert(RegNum < RegisterSet::Reg_NUM);
|
| - static const struct {
|
| - const char *const Name8;
|
| - const char *const Name16;
|
| - const char *const Name /*32*/;
|
| - const char *const Name64;
|
| - } RegNames[] = {
|
| -#define X(val, encode, name64, name32, name16, name8, scratch, preserved, \
|
| - stackptr, frameptr, isInt, isFP) \
|
| - { name8, name16, name32, name64 } \
|
| - ,
|
| + return RegNames[RegNum];
|
| + }
|
| +
|
| + static GPRRegister getEncodedGPR(int32_t RegNum) {
|
| + static const GPRRegister GPRRegs[] = {
|
| +#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
|
| + isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
|
| + isTrunc8Rcvr, isAhRcvr, aliases) \
|
| + GPRRegister(isGPR ? encode : GPRRegister::Encoded_Not_GPR),
|
| REGX8664_TABLE
|
| #undef X
|
| };
|
| + assert(RegNum >= 0);
|
| + assert(RegNum < RegisterSet::Reg_NUM);
|
| + assert(GPRRegs[RegNum] != GPRRegister::Encoded_Not_GPR);
|
| + return GPRRegs[RegNum];
|
| + }
|
|
|
| - switch (Ty) {
|
| - case IceType_i1:
|
| - case IceType_i8:
|
| - return RegNames[RegNum].Name8;
|
| - case IceType_i16:
|
| - return RegNames[RegNum].Name16;
|
| - case IceType_i64:
|
| - return RegNames[RegNum].Name64;
|
| - default:
|
| - return RegNames[RegNum].Name;
|
| - }
|
| + static ByteRegister getEncodedByteReg(int32_t RegNum) {
|
| + static const ByteRegister ByteRegs[] = {
|
| +#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
|
| + isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
|
| + isTrunc8Rcvr, isAhRcvr, aliases) \
|
| + ByteRegister(is8 ? encode : ByteRegister::Encoded_Not_ByteReg),
|
| + REGX8664_TABLE
|
| +#undef X
|
| + };
|
| + assert(RegNum >= 0);
|
| + assert(RegNum < RegisterSet::Reg_NUM);
|
| + assert(ByteRegs[RegNum] != ByteRegister::Encoded_Not_ByteReg);
|
| + return ByteRegs[RegNum];
|
| }
|
|
|
| + static XmmRegister getEncodedXmm(int32_t RegNum) {
|
| + static const XmmRegister XmmRegs[] = {
|
| +#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
|
| + isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
|
| + isTrunc8Rcvr, isAhRcvr, aliases) \
|
| + XmmRegister(isXmm ? encode : XmmRegister::Encoded_Not_Xmm),
|
| + REGX8664_TABLE
|
| +#undef X
|
| + };
|
| + assert(RegNum >= 0);
|
| + assert(RegNum < RegisterSet::Reg_NUM);
|
| + assert(XmmRegs[RegNum] != XmmRegister::Encoded_Not_Xmm);
|
| + return XmmRegs[RegNum];
|
| + }
|
| +
|
| + static uint32_t getEncoding(int32_t RegNum) {
|
| + static const uint32_t Encoding[] = {
|
| +#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
|
| + isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
|
| + isTrunc8Rcvr, isAhRcvr, aliases) \
|
| + encode,
|
| + REGX8664_TABLE
|
| +#undef X
|
| + };
|
| + assert(RegNum >= 0);
|
| + assert(RegNum < RegisterSet::Reg_NUM);
|
| + return Encoding[RegNum];
|
| + }
|
| +
|
| + static inline int32_t getBaseReg(int32_t RegNum) {
|
| + static const int32_t BaseRegs[] = {
|
| +#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
|
| + isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
|
| + isTrunc8Rcvr, isAhRcvr, aliases) \
|
| + RegisterSet::base,
|
| + REGX8664_TABLE
|
| +#undef X
|
| + };
|
| + assert(RegNum >= 0);
|
| + assert(RegNum < RegisterSet::Reg_NUM);
|
| + return BaseRegs[RegNum];
|
| + }
|
| +
|
| + static int32_t getGprForType(Type, int32_t RegNum) { return RegNum; }
|
| +
|
| static void initRegisterSet(
|
| std::array<llvm::SmallBitVector, IceType_NUM> *TypeToRegisterSet,
|
| std::array<llvm::SmallBitVector, RegisterSet::Reg_NUM> *RegisterAliases,
|
| llvm::SmallBitVector *ScratchRegs) {
|
| - llvm::SmallBitVector IntegerRegisters(RegisterSet::Reg_NUM);
|
| + llvm::SmallBitVector IntegerRegistersI64(RegisterSet::Reg_NUM);
|
| + llvm::SmallBitVector IntegerRegistersI32(RegisterSet::Reg_NUM);
|
| + llvm::SmallBitVector IntegerRegistersI16(RegisterSet::Reg_NUM);
|
| llvm::SmallBitVector IntegerRegistersI8(RegisterSet::Reg_NUM);
|
| llvm::SmallBitVector FloatRegisters(RegisterSet::Reg_NUM);
|
| llvm::SmallBitVector VectorRegisters(RegisterSet::Reg_NUM);
|
| llvm::SmallBitVector InvalidRegisters(RegisterSet::Reg_NUM);
|
| ScratchRegs->resize(RegisterSet::Reg_NUM);
|
|
|
| -#define X(val, encode, name64, name32, name16, name8, scratch, preserved, \
|
| - stackptr, frameptr, isInt, isFP) \
|
| - (IntegerRegisters)[RegisterSet::val] = isInt; \
|
| - (IntegerRegistersI8)[RegisterSet::val] = isInt; \
|
| - (FloatRegisters)[RegisterSet::val] = isFP; \
|
| - (VectorRegisters)[RegisterSet::val] = isFP; \
|
| +#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; \
|
| (*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); \
|
| + } \
|
| (*RegisterAliases)[RegisterSet::val].set(RegisterSet::val); \
|
| (*ScratchRegs)[RegisterSet::val] = scratch;
|
| REGX8664_TABLE;
|
| @@ -344,9 +414,9 @@ template <> struct MachineTraits<TargetX8664> {
|
| (*TypeToRegisterSet)[IceType_void] = InvalidRegisters;
|
| (*TypeToRegisterSet)[IceType_i1] = IntegerRegistersI8;
|
| (*TypeToRegisterSet)[IceType_i8] = IntegerRegistersI8;
|
| - (*TypeToRegisterSet)[IceType_i16] = IntegerRegisters;
|
| - (*TypeToRegisterSet)[IceType_i32] = IntegerRegisters;
|
| - (*TypeToRegisterSet)[IceType_i64] = IntegerRegisters;
|
| + (*TypeToRegisterSet)[IceType_i16] = IntegerRegistersI16;
|
| + (*TypeToRegisterSet)[IceType_i32] = IntegerRegistersI32;
|
| + (*TypeToRegisterSet)[IceType_i64] = IntegerRegistersI64;
|
| (*TypeToRegisterSet)[IceType_f32] = FloatRegisters;
|
| (*TypeToRegisterSet)[IceType_f64] = FloatRegisters;
|
| (*TypeToRegisterSet)[IceType_v4i1] = VectorRegisters;
|
| @@ -363,8 +433,9 @@ template <> struct MachineTraits<TargetX8664> {
|
| TargetLowering::RegSetMask Exclude) {
|
| llvm::SmallBitVector Registers(RegisterSet::Reg_NUM);
|
|
|
| -#define X(val, encode, name64, name32, name16, name8, scratch, preserved, \
|
| - stackptr, frameptr, isInt, isFP) \
|
| +#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
|
| + isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
|
| + isTrunc8Rcvr, isAhRcvr, aliases) \
|
| if (scratch && (Include & ::Ice::TargetLowering::RegSet_CallerSave)) \
|
| Registers[RegisterSet::val] = true; \
|
| if (preserved && (Include & ::Ice::TargetLowering::RegSet_CalleeSave)) \
|
| @@ -409,15 +480,24 @@ template <> struct MachineTraits<TargetX8664> {
|
| // Build up the equivalence classes of registers by looking at the register
|
| // properties as well as whether the registers should be explicitly excluded
|
| // from shuffling.
|
| -#define X(val, encode, name64, name32, name16, name8, scratch, preserved, \
|
| - stackptr, frameptr, isInt, isFP) \
|
| +#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
|
| + isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
|
| + isTrunc8Rcvr, isAhRcvr, aliases) \
|
| if (ExcludeRegisters[RegisterSet::val]) { \
|
| /* val stays the same in the resulting permutation. */ \
|
| Permutation[RegisterSet::val] = RegisterSet::val; \
|
| ++NumPreserved; \
|
| } else { \
|
| - const uint32_t Index = (scratch << 0) | (preserved << 1) | \
|
| - (/*isI8=*/1 << 2) | (isInt << 3) | (isFP << 4); \
|
| + uint32_t AttrKey = 0; \
|
| + uint32_t Index = 0; \
|
| + /* Combine relevant attributes into an equivalence class key. */ \
|
| + Index |= (scratch << (AttrKey++)); \
|
| + Index |= (preserved << (AttrKey++)); \
|
| + Index |= (is8 << (AttrKey++)); \
|
| + Index |= (is16 << (AttrKey++)); \
|
| + Index |= (is32 << (AttrKey++)); \
|
| + Index |= (is64 << (AttrKey++)); \
|
| + Index |= (isXmm << (AttrKey++)); \
|
| /* val is assigned to an equivalence class based on its properties. */ \
|
| EquivalenceClasses[Index].push_back(RegisterSet::val); \
|
| }
|
| @@ -454,7 +534,7 @@ template <> struct MachineTraits<TargetX8664> {
|
| if (!First)
|
| Str << " ";
|
| First = false;
|
| - Str << getRegName(Register, IceType_i32);
|
| + Str << getRegName(Register);
|
| }
|
| Str << "}\n";
|
| }
|
|
|