Chromium Code Reviews| Index: src/IceRegistersARM32.h |
| diff --git a/src/IceRegistersARM32.h b/src/IceRegistersARM32.h |
| index 31323c250b9d725410133ec4e9094ba2d8512233..6de99ada14b114b5b5c37773a40717b028b21872 100644 |
| --- a/src/IceRegistersARM32.h |
| +++ b/src/IceRegistersARM32.h |
| @@ -22,255 +22,219 @@ |
| namespace Ice { |
| namespace ARM32 { |
| +namespace RegARM32 { |
| -/// 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; |
| -}; |
| - |
| -class RegARM32 { |
| -private: |
| - RegARM32() = delete; |
| - RegARM32(const RegARM32 &) = delete; |
| - RegARM32 &operator=(const RegARM32 &) = delete; |
| - ~RegARM32() = delete; |
| - |
| -public: |
| - /// An enum of every register. The enum value may not match the encoding used |
| - /// to binary encode register operands in instructions. |
| - enum AllRegisters { |
| +/// An enum of every register. The enum value may not match the encoding used |
| +/// to binary encode register operands in instructions. |
| +enum AllRegisters { |
| #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ |
| isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ |
| val, |
| - REGARM32_TABLE |
| + REGARM32_TABLE |
| #undef X |
| - Reg_NUM, |
| + Reg_NUM, |
| #define X(val, init) val init, |
| - REGARM32_TABLE_BOUNDS |
| + REGARM32_TABLE_BOUNDS |
| #undef X |
| - }; |
| +}; |
| - /// An enum of GPR Registers. The enum value does match the encoding used to |
| - /// binary encode register operands in instructions. |
| - enum GPRRegister { |
| +/// An enum of GPR Registers. The enum value does match the encoding used to |
| +/// binary encode register operands in instructions. |
| +enum GPRRegister { |
| #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ |
| isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ |
| Encoded_##val = encode, |
| - REGARM32_GPR_TABLE |
| + REGARM32_GPR_TABLE |
| #undef X |
| - Encoded_Not_GPR = -1 |
| - }; |
| + Encoded_Not_GPR = -1 |
| +}; |
| - /// An enum of FP32 S-Registers. The enum value does match the encoding used |
| - /// to binary encode register operands in instructions. |
| - enum SRegister { |
| +/// An enum of FP32 S-Registers. The enum value does match the encoding used |
| +/// to binary encode register operands in instructions. |
| +enum SRegister { |
| #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ |
| isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ |
| Encoded_##val = encode, |
| - REGARM32_FP32_TABLE |
| + REGARM32_FP32_TABLE |
| #undef X |
| - Encoded_Not_SReg = -1 |
| - }; |
| + Encoded_Not_SReg = -1 |
| +}; |
| - /// An enum of FP64 D-Registers. The enum value does match the encoding used |
| - /// to binary encode register operands in instructions. |
| - enum DRegister { |
| +/// An enum of FP64 D-Registers. The enum value does match the encoding used |
| +/// to binary encode register operands in instructions. |
| +enum DRegister { |
| #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ |
| isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ |
| Encoded_##val = encode, |
| - REGARM32_FP64_TABLE |
| + REGARM32_FP64_TABLE |
| #undef X |
| - Encoded_Not_DReg = -1 |
| - }; |
| + Encoded_Not_DReg = -1 |
| +}; |
| - /// An enum of 128-bit Q-Registers. The enum value does match the encoding |
| - /// used to binary encode register operands in instructions. |
| - enum QRegister { |
| +/// An enum of 128-bit Q-Registers. The enum value does match the encoding |
| +/// used to binary encode register operands in instructions. |
| +enum QRegister { |
| #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ |
| isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ |
| Encoded_##val = encode, |
| - REGARM32_VEC128_TABLE |
| + REGARM32_VEC128_TABLE |
| #undef X |
| - Encoded_Not_QReg = -1 |
| - }; |
| + Encoded_Not_QReg = -1 |
| +}; |
| - static constexpr struct TableType { |
| - const char *Name; |
| - unsigned Encoding : 10; |
| - unsigned CCArg : 6; |
| - unsigned Scratch : 1; |
| - unsigned Preserved : 1; |
| - unsigned StackPtr : 1; |
| - unsigned FramePtr : 1; |
| - unsigned IsGPR : 1; |
| - unsigned IsInt : 1; |
| - unsigned IsI64Pair : 1; |
| - unsigned IsFP32 : 1; |
| - unsigned IsFP64 : 1; |
| - unsigned IsVec128 : 1; |
| +extern struct RegTableType { |
| + const char *Name; |
| + unsigned Encoding : 10; |
| + unsigned CCArg : 6; |
| + unsigned Scratch : 1; |
| + unsigned Preserved : 1; |
| + unsigned StackPtr : 1; |
| + unsigned FramePtr : 1; |
| + unsigned IsGPR : 1; |
| + unsigned IsInt : 1; |
| + unsigned IsI64Pair : 1; |
| + unsigned IsFP32 : 1; |
| + unsigned IsFP64 : 1; |
| + unsigned IsVec128 : 1; |
| #define NUM_ALIASES_BITS 3 |
| - SizeT NumAliases : (NUM_ALIASES_BITS + 1); |
| - uint16_t Aliases[1 << NUM_ALIASES_BITS]; |
| + SizeT NumAliases : (NUM_ALIASES_BITS + 1); |
| + uint16_t Aliases[1 << NUM_ALIASES_BITS]; |
| #undef NUM_ALIASES_BITS |
| - } Table[Reg_NUM] = { |
| -#define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ |
| - isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ |
| - { \ |
| - name, encode, cc_arg, scratch, preserved, stackptr, frameptr, isGPR, \ |
| - isInt, isI64Pair, isFP32, isFP64, isVec128, \ |
| - (SizeOf alias_init).size(), alias_init \ |
| - } \ |
| - , |
| - REGARM32_TABLE |
| -#undef X |
| - }; |
| - |
| - static inline void assertRegisterDefined(int32_t RegNum) { |
| - (void)RegNum; |
| - assert(RegNum >= 0); |
| - assert(RegNum < Reg_NUM); |
| - } |
| +} RegTable[Reg_NUM]; |
| - static inline bool isGPRegister(int32_t RegNum) { |
| - assertRegisterDefined(RegNum); |
| - return Table[RegNum].IsGPR; |
| - } |
| +static inline bool isGPRegister(int32_t RegNum) { |
| + assert(RegNum >= 0); |
| + assert(RegNum < Reg_NUM); |
| + return RegTable[RegNum].IsGPR; |
| +} |
| - static constexpr SizeT getNumGPRegs() { |
| - return 0 |
| +static constexpr inline SizeT getNumGPRegs() { |
| + return 0 |
| #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ |
| isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ |
| +(isGPR) |
| - REGARM32_TABLE |
| + REGARM32_TABLE |
| #undef X |
| - ; |
| - } |
| + ; |
| +} |
| - static inline GPRRegister getEncodedGPR(int32_t RegNum) { |
| - assert(isGPRegister(RegNum)); |
| - return GPRRegister(Table[RegNum].Encoding); |
| - } |
| +static inline GPRRegister getEncodedGPR(int32_t RegNum) { |
| + assert(RegNum >= 0); |
| + assert(RegNum < Reg_NUM); |
| + return GPRRegister(RegTable[RegNum].Encoding); |
| +} |
| - static constexpr SizeT getNumGPRs() { |
| - return 0 |
| +static constexpr inline SizeT getNumGPRs() { |
| + return 0 |
| #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ |
| isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ |
| +(isGPR) |
| - REGARM32_TABLE |
| + REGARM32_TABLE |
| #undef X |
| - ; |
| - } |
| - |
| - static inline bool isGPR(SizeT RegNum) { |
| - assertRegisterDefined(RegNum); |
| - return Table[RegNum].IsGPR; |
| - } |
| - |
| - static inline IceString getGPRName(SizeT RegNum) { |
| - assert(isGPR(RegNum)); |
| - return Table[RegNum].Name; |
| - } |
| - |
| - static inline GPRRegister getI64PairFirstGPRNum(int32_t RegNum) { |
| - assert(isI64RegisterPair(RegNum)); |
| - return GPRRegister(Table[RegNum].Encoding); |
| - } |
| - |
| - static inline GPRRegister getI64PairSecondGPRNum(int32_t RegNum) { |
| - assert(isI64RegisterPair(RegNum)); |
| - return GPRRegister(Table[RegNum].Encoding + 1); |
| - } |
| - |
| - static inline bool isI64RegisterPair(int32_t RegNum) { |
| - assertRegisterDefined(RegNum); |
| - return Table[RegNum].IsI64Pair; |
| - } |
| - |
| - static inline bool isEncodedSReg(int32_t RegNum) { |
| - assertRegisterDefined(RegNum); |
| - return Table[RegNum].IsFP32; |
| - } |
| - |
| - static constexpr SizeT getNumSRegs() { |
| - return 0 |
| + ; |
| +} |
| + |
| +static inline bool isGPR(SizeT RegNum) { |
| + assert(RegNum >= 0); |
| + assert(RegNum < Reg_NUM); |
| + return RegTable[RegNum].IsGPR; |
| +} |
| + |
| +static inline IceString getGPRName(SizeT RegNum) { |
|
Jim Stichnoth
2016/01/15 01:17:15
Remove this because it is identical to getRegName(
Karl
2016/01/15 16:11:19
Done.
|
| + assert(RegNum >= 0); |
| + assert(RegNum < Reg_NUM); |
| + return RegTable[RegNum].Name; |
| +} |
| + |
| +static inline GPRRegister getI64PairFirstGPRNum(int32_t RegNum) { |
| + assert(RegNum >= 0); |
| + assert(RegNum < Reg_NUM); |
| + return GPRRegister(RegTable[RegNum].Encoding); |
| +} |
| + |
| +static inline GPRRegister getI64PairSecondGPRNum(int32_t RegNum) { |
| + assert(RegNum >= 0); |
| + assert(RegNum < Reg_NUM); |
| + return GPRRegister(RegTable[RegNum].Encoding + 1); |
| +} |
| + |
| +static inline bool isI64RegisterPair(int32_t RegNum) { |
| + assert(RegNum >= 0); |
| + assert(RegNum < Reg_NUM); |
| + return RegTable[RegNum].IsI64Pair; |
| +} |
| + |
| +static inline bool isEncodedSReg(int32_t RegNum) { |
| + assert(RegNum >= 0); |
| + assert(RegNum < Reg_NUM); |
| + return RegTable[RegNum].IsFP32; |
| +} |
| + |
| +static constexpr inline SizeT getNumSRegs() { |
| + return 0 |
| #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ |
| isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ |
| +(isFP32) |
| - REGARM32_TABLE |
| + REGARM32_TABLE |
| #undef X |
| - ; |
| - } |
| - |
| - static inline IceString getSRegName(SizeT RegNum) { |
| - assert(isEncodedSReg(RegNum)); |
| - return Table[RegNum].Name; |
| - } |
| - |
| - static inline SRegister getEncodedSReg(int32_t RegNum) { |
| - assert(isEncodedSReg(RegNum)); |
| - return SRegister(Table[RegNum].Encoding); |
| - } |
| - |
| - static inline bool isEncodedDReg(int32_t RegNum) { |
| - assertRegisterDefined(RegNum); |
| - return Table[RegNum].IsFP64; |
| - } |
| - |
| - static constexpr inline SizeT getNumDRegs() { |
| - return 0 |
| + ; |
| +} |
| + |
| +static inline IceString getSRegName(SizeT RegNum) { |
|
Jim Stichnoth
2016/01/15 01:17:15
Remove this because it is identical to getRegName(
Karl
2016/01/15 16:11:19
Done.
|
| + assert(RegNum >= 0); |
| + assert(RegNum < Reg_NUM); |
| + return RegTable[RegNum].Name; |
| +} |
| + |
| +static inline SRegister getEncodedSReg(int32_t RegNum) { |
| + assert(RegNum >= 0); |
| + assert(RegNum < Reg_NUM); |
| + return SRegister(RegTable[RegNum].Encoding); |
| +} |
| + |
| +static inline bool isEncodedDReg(int32_t RegNum) { |
| + assert(RegNum >= 0); |
| + assert(RegNum < Reg_NUM); |
| + return RegTable[RegNum].IsFP64; |
| +} |
| + |
| +static constexpr inline SizeT getNumDRegs() { |
| + return 0 |
| #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ |
| isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ |
| +(isFP64) |
| - REGARM32_TABLE |
| + REGARM32_TABLE |
| #undef X |
| - ; |
| - } |
| - |
| - static inline DRegister getEncodedDReg(int32_t RegNum) { |
| - assert(isEncodedDReg(RegNum)); |
| - return DRegister(Table[RegNum].Encoding); |
| - } |
| - |
| - static inline bool isEncodedQReg(int32_t RegNum) { |
| - assertRegisterDefined(RegNum); |
| - return Table[RegNum].IsVec128; |
| - } |
| - |
| - static inline QRegister getEncodedQReg(int32_t RegNum) { |
| - assert(isEncodedQReg(RegNum)); |
| - return QRegister(Table[RegNum].Encoding); |
| - } |
| - |
| - static inline IceString getRegName(int32_t RegNum) { |
| - assertRegisterDefined(RegNum); |
| - return Table[RegNum].Name; |
| - } |
| -}; |
| + ; |
| +} |
| + |
| +static inline DRegister getEncodedDReg(int32_t RegNum) { |
| + assert(RegNum >= 0); |
| + assert(RegNum < Reg_NUM); |
| + return DRegister(RegTable[RegNum].Encoding); |
| +} |
| + |
| +static inline bool isEncodedQReg(int32_t RegNum) { |
| + assert(RegNum >= 0); |
| + assert(RegNum < Reg_NUM); |
| + return RegTable[RegNum].IsVec128; |
| +} |
| + |
| +static inline QRegister getEncodedQReg(int32_t RegNum) { |
| + assert(isEncodedQReg(RegNum)); |
| + return QRegister(RegTable[RegNum].Encoding); |
| +} |
| + |
| +static inline IceString getRegName(int32_t RegNum) { |
| + assert(RegNum >= 0); |
| + assert(RegNum < Reg_NUM); |
| + return RegTable[RegNum].Name; |
| +} |
| // Extend enum RegClass with ARM32-specific register classes (if any). |
| enum RegClassARM32 : uint8_t { RCARM32_NUM = RC_Target }; |
| +} // end of namespace RegARM32 |
| } // end of namespace ARM32 |
| } // end of namespace Ice |