Index: src/IceTargetLoweringX8664Traits.h |
diff --git a/src/IceTargetLoweringX8664Traits.h b/src/IceTargetLoweringX8664Traits.h |
index 41a27d77566b3747af98515ef291dd399eac4008..dbc4a5fbb33a8830b51dd897378eb7813fbff740 100644 |
--- a/src/IceTargetLoweringX8664Traits.h |
+++ b/src/IceTargetLoweringX8664Traits.h |
@@ -382,7 +382,69 @@ template <> struct MachineTraits<TargetX8664> { |
return BaseRegs[RegNum]; |
} |
- static int32_t getGprForType(Type, int32_t RegNum) { return RegNum; } |
+private: |
+ static int32_t getFirstGprForType(Type Ty) { |
+ switch (Ty) { |
+ default: |
+ llvm_unreachable("Invalid type for GPR."); |
+ case IceType_i1: |
+ case IceType_i8: |
+ return RegisterSet::Reg_al; |
+ case IceType_i16: |
+ return RegisterSet::Reg_ax; |
+ case IceType_i32: |
+ return RegisterSet::Reg_eax; |
+ case IceType_i64: |
+ return RegisterSet::Reg_rax; |
+ } |
+ } |
+ |
+public: |
+ static int32_t getGprForType(Type Ty, int32_t RegNum) { |
Jim Stichnoth
2015/12/22 20:38:06
Yuck. :(
No matter, though, the x86-32 version is
John
2015/12/23 18:30:43
One could build a [BaseReg] -> {Reg_i8, Reg_i16, R
|
+ assert(RegNum != Variable::NoRegister); |
+ |
+ if (!isScalarIntegerType(Ty)) { |
+ return RegNum; |
+ } |
+ |
+ assert(Ty == IceType_i1 || Ty == IceType_i8 || Ty == IceType_i16 || |
+ Ty == IceType_i32 || Ty == IceType_i64); |
+ |
+ assert(RegNum != RegisterSet::Reg_ah); |
+ assert(RegNum != RegisterSet::Reg_bh); |
+ assert(RegNum != RegisterSet::Reg_ch); |
+ assert(RegNum != RegisterSet::Reg_dh); |
+ |
+ const int32_t FirstGprForType = getFirstGprForType(Ty); |
+ |
+ switch (RegNum) { |
+ default: |
+ llvm::report_fatal_error("Unknown register."); |
+#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \ |
+ isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \ |
+ isTrunc8Rcvr, isAhRcvr, aliases) \ |
+ case RegisterSet::val: { \ |
+ assert(isGPR); \ |
+ assert((is64) || (is32) || (is16) || (is8) || \ |
+ getBaseReg(RegisterSet::val) == RegisterSet::Reg_rsp); \ |
+ const int32_t FirstGprWithRegNumSize = \ |
+ ((is64) || RegisterSet::val == RegisterSet::Reg_rsp) \ |
+ ? RegisterSet::Reg_rax \ |
+ : (((is32) || RegisterSet::val == RegisterSet::Reg_esp) \ |
+ ? RegisterSet::Reg_eax \ |
+ : (((is16) || RegisterSet::val == RegisterSet::Reg_sp) \ |
+ ? RegisterSet::Reg_ax \ |
+ : RegisterSet::Reg_al)); \ |
+ const int32_t NewRegNum = \ |
+ RegNum - FirstGprWithRegNumSize + FirstGprForType; \ |
+ assert(getBaseReg(RegNum) == getBaseReg(NewRegNum) && \ |
+ "Error involving " #val); \ |
+ return NewRegNum; \ |
+ } |
+ REGX8664_TABLE |
+#undef X |
+ } |
+ } |
static void initRegisterSet( |
std::array<llvm::SmallBitVector, RCX86_NUM> *TypeToRegisterSet, |