| Index: src/IceTargetLoweringX8632Traits.h | 
| diff --git a/src/IceTargetLoweringX8632Traits.h b/src/IceTargetLoweringX8632Traits.h | 
| index 918a5852b9d514585cd248930b78628026c6ff8e..7f3b97e17cb7d78cc06b6c34437e73c7b261b069 100644 | 
| --- a/src/IceTargetLoweringX8632Traits.h | 
| +++ b/src/IceTargetLoweringX8632Traits.h | 
| @@ -61,7 +61,6 @@ template <> struct MachineTraits<TargetX8632> { | 
|  | 
| using GPRRegister = ::Ice::RegX8632::GPRRegister; | 
| using XmmRegister = ::Ice::RegX8632::XmmRegister; | 
| -  using ByteRegister = ::Ice::RegX8632::ByteRegister; | 
| using X87STRegister = ::Ice::RegX8632::X87STRegister; | 
|  | 
| using Cond = ::Ice::CondX86; | 
| @@ -277,60 +276,146 @@ template <> struct MachineTraits<TargetX8632> { | 
| static const char *TargetName; | 
| static constexpr Type WordType = IceType_i32; | 
|  | 
| -  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, | 
| +        REGX8632_TABLE | 
| +#undef X | 
| +    }; | 
| +    assert(RegNum >= 0); | 
| assert(RegNum < RegisterSet::Reg_NUM); | 
| -    static const char *RegNames8[] = { | 
| -#define X(val, encode, name, name16, name8, scratch, preserved, stackptr,      \ | 
| -          frameptr, isI8, isInt, isFP)                                         \ | 
| -  name8, | 
| +    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), | 
| REGX8632_TABLE | 
| #undef X | 
| }; | 
| +    assert(RegNum >= 0); | 
| +    assert(RegNum < RegisterSet::Reg_NUM); | 
| +    assert(GPRRegs[RegNum] != GPRRegister::Encoded_Not_GPR); | 
| +    return GPRRegs[RegNum]; | 
| +  } | 
|  | 
| -    static const char *RegNames16[] = { | 
| -#define X(val, encode, name, name16, name8, scratch, preserved, stackptr,      \ | 
| -          frameptr, isI8, isInt, isFP)                                         \ | 
| -  name16, | 
| +  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), | 
| REGX8632_TABLE | 
| #undef X | 
| }; | 
| +    assert(RegNum >= 0); | 
| +    assert(RegNum < RegisterSet::Reg_NUM); | 
| +    assert(XmmRegs[RegNum] != XmmRegister::Encoded_Not_Xmm); | 
| +    return XmmRegs[RegNum]; | 
| +  } | 
|  | 
| -    static const char *RegNames[] = { | 
| -#define X(val, encode, name, name16, name8, scratch, preserved, stackptr,      \ | 
| -          frameptr, isI8, isInt, isFP)                                         \ | 
| -  name, | 
| +  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, | 
| REGX8632_TABLE | 
| #undef X | 
| }; | 
| +    assert(RegNum >= 0); | 
| +    assert(RegNum < RegisterSet::Reg_NUM); | 
| +    return Encoding[RegNum]; | 
| +  } | 
|  | 
| -    switch (Ty) { | 
| -    case IceType_i1: | 
| -    case IceType_i8: | 
| -      return RegNames8[RegNum]; | 
| -    case IceType_i16: | 
| -      return RegNames16[RegNum]; | 
| -    default: | 
| -      return RegNames[RegNum]; | 
| +  static 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, | 
| +        REGX8632_TABLE | 
| +#undef X | 
| +    }; | 
| +    assert(RegNum >= 0); | 
| +    assert(RegNum < RegisterSet::Reg_NUM); | 
| +    return BaseRegs[RegNum]; | 
| +  } | 
| + | 
| +  // Return a register in RegNum's alias set that is suitable for Ty. | 
| +  static int32_t getGprForType(Type Ty, int32_t RegNum) { | 
| +    assert(RegNum != Variable::NoRegister); | 
| +    // TODO(stichnot): Rewrite this as a table lookup from a table computed in a | 
| +    // TargetLowering static initializer. | 
| +    RegNum = getBaseReg(RegNum); | 
| +    if (Ty == IceType_i8 || Ty == IceType_i1) { | 
| +      switch (RegNum) { | 
| +      default: | 
| +        assert(0); | 
| +      case RegisterSet::Reg_eax: | 
| +        return RegisterSet::Reg_al; | 
| +      case RegisterSet::Reg_ecx: | 
| +        return RegisterSet::Reg_cl; | 
| +      case RegisterSet::Reg_edx: | 
| +        return RegisterSet::Reg_dl; | 
| +      case RegisterSet::Reg_ebx: | 
| +        return RegisterSet::Reg_bl; | 
| +      } | 
| +    } | 
| +    if (Ty == IceType_i16) { | 
| +      switch (RegNum) { | 
| +      default: | 
| +        assert(0); | 
| +      case RegisterSet::Reg_eax: | 
| +        return RegisterSet::Reg_ax; | 
| +      case RegisterSet::Reg_ecx: | 
| +        return RegisterSet::Reg_cx; | 
| +      case RegisterSet::Reg_edx: | 
| +        return RegisterSet::Reg_dx; | 
| +      case RegisterSet::Reg_ebx: | 
| +        return RegisterSet::Reg_bx; | 
| +      case RegisterSet::Reg_ebp: | 
| +        return RegisterSet::Reg_bp; | 
| +      case RegisterSet::Reg_esi: | 
| +        return RegisterSet::Reg_si; | 
| +      case RegisterSet::Reg_edi: | 
| +        return RegisterSet::Reg_di; | 
| +      } | 
| } | 
| +    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 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, name, name16, name8, scratch, preserved, stackptr,      \ | 
| -          frameptr, isI8, isInt, isFP)                                         \ | 
| -  (IntegerRegisters)[RegisterSet::val] = isInt;                                \ | 
| -  (IntegerRegistersI8)[RegisterSet::val] = isI8;                               \ | 
| -  (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)                                     \ | 
| +  (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; | 
| REGX8632_TABLE; | 
| @@ -339,9 +424,9 @@ template <> struct MachineTraits<TargetX8632> { | 
| (*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] = IntegerRegistersI32; | 
| (*TypeToRegisterSet)[IceType_f32] = FloatRegisters; | 
| (*TypeToRegisterSet)[IceType_f64] = FloatRegisters; | 
| (*TypeToRegisterSet)[IceType_v4i1] = VectorRegisters; | 
| @@ -358,8 +443,9 @@ template <> struct MachineTraits<TargetX8632> { | 
| TargetLowering::RegSetMask Exclude) { | 
| llvm::SmallBitVector Registers(RegisterSet::Reg_NUM); | 
|  | 
| -#define X(val, encode, name, name16, name8, scratch, preserved, stackptr,      \ | 
| -          frameptr, isI8, 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))       \ | 
| @@ -404,15 +490,16 @@ template <> struct MachineTraits<TargetX8632> { | 
| // 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, name, name16, name8, scratch, preserved, stackptr,      \ | 
| -          frameptr, isI8, 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 << 2) |   \ | 
| -                           (isInt << 3) | (isFP << 4);                         \ | 
| +    const uint32_t Index = (scratch << 0) | (preserved << 1) | (is8 << 2) |    \ | 
| +                           (is16 << 3) | (is32 << 4) | (isXmm << 5);           \ | 
| /* val is assigned to an equivalence class based on its properties. */     \ | 
| EquivalenceClasses[Index].push_back(RegisterSet::val);                     \ | 
| } | 
| @@ -449,7 +536,7 @@ template <> struct MachineTraits<TargetX8632> { | 
| if (!First) | 
| Str << " "; | 
| First = false; | 
| -          Str << getRegName(Register, IceType_i32); | 
| +          Str << getRegName(Register); | 
| } | 
| Str << "}\n"; | 
| } | 
|  |