//===- 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