| //===- subzero/src/IceRegistersARM32.h - Register information ---*- C++ -*-===// |
| // |
| // The Subzero Code Generator |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| /// |
| /// \file |
| /// \brief Declares the registers and their encodings for ARM32. |
| /// |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef SUBZERO_SRC_ICEREGISTERSARM32_H |
| #define SUBZERO_SRC_ICEREGISTERSARM32_H |
| |
| #include "IceDefs.h" |
| #include "IceInstARM32.def" |
| #include "IceOperand.h" // RC_Target |
| #include "IceTypes.h" |
| |
| namespace Ice { |
| namespace ARM32 { |
| namespace RegARM32 { |
| |
| /// 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 |
| #undef X |
| Reg_NUM, |
| #define X(val, init) val init, |
| 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 { |
| #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 |
| #undef X |
| 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 { |
| #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 |
| #undef X |
| 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 { |
| #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 |
| #undef X |
| 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 { |
| #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 |
| #undef X |
| Encoded_Not_QReg = -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]; |
| #undef NUM_ALIASES_BITS |
| } RegTable[Reg_NUM]; |
| |
| static inline void assertValidRegNum(RegNumT RegNum) { |
| (void)RegNum; |
| assert(RegNum.hasValue()); |
| } |
| |
| static inline bool isGPRegister(RegNumT RegNum) { |
| RegNum.assertIsValid(); |
| return RegTable[RegNum].IsGPR; |
| } |
| |
| 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 |
| #undef X |
| ; |
| } |
| |
| static inline GPRRegister getEncodedGPR(RegNumT RegNum) { |
| RegNum.assertIsValid(); |
| return GPRRegister(RegTable[RegNum].Encoding); |
| } |
| |
| 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 |
| #undef X |
| ; |
| } |
| |
| static inline bool isGPR(RegNumT RegNum) { |
| RegNum.assertIsValid(); |
| return RegTable[RegNum].IsGPR; |
| } |
| |
| static inline GPRRegister getI64PairFirstGPRNum(RegNumT RegNum) { |
| RegNum.assertIsValid(); |
| return GPRRegister(RegTable[RegNum].Encoding); |
| } |
| |
| static inline GPRRegister getI64PairSecondGPRNum(RegNumT RegNum) { |
| RegNum.assertIsValid(); |
| return GPRRegister(RegTable[RegNum].Encoding + 1); |
| } |
| |
| static inline bool isI64RegisterPair(RegNumT RegNum) { |
| RegNum.assertIsValid(); |
| return RegTable[RegNum].IsI64Pair; |
| } |
| |
| static inline bool isEncodedSReg(RegNumT RegNum) { |
| RegNum.assertIsValid(); |
| 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 |
| #undef X |
| ; |
| } |
| |
| static inline SRegister getEncodedSReg(RegNumT RegNum) { |
| RegNum.assertIsValid(); |
| return SRegister(RegTable[RegNum].Encoding); |
| } |
| |
| static inline bool isEncodedDReg(RegNumT RegNum) { |
| RegNum.assertIsValid(); |
| 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 |
| #undef X |
| ; |
| } |
| |
| static inline DRegister getEncodedDReg(RegNumT RegNum) { |
| RegNum.assertIsValid(); |
| return DRegister(RegTable[RegNum].Encoding); |
| } |
| |
| static inline bool isEncodedQReg(RegNumT RegNum) { |
| RegNum.assertIsValid(); |
| return RegTable[RegNum].IsVec128; |
| } |
| |
| static inline QRegister getEncodedQReg(RegNumT RegNum) { |
| assert(isEncodedQReg(RegNum)); |
| return QRegister(RegTable[RegNum].Encoding); |
| } |
| |
| static inline const char *getRegName(RegNumT RegNum) { |
| RegNum.assertIsValid(); |
| return RegTable[RegNum].Name; |
| } |
| |
| // Extend enum RegClass with ARM32-specific register classes. |
| enum RegClassARM32 : uint8_t { |
| RCARM32_QtoS = RC_Target, // Denotes Q registers that are aliased by S |
| // registers. |
| RCARM32_NUM |
| }; |
| |
| } // end of namespace RegARM32 |
| } // end of namespace ARM32 |
| } // end of namespace Ice |
| |
| #endif // SUBZERO_SRC_ICEREGISTERSARM32_H |