xref: /aosp_15_r20/external/swiftshader/third_party/subzero/src/IceRegistersARM32.h (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1*03ce13f7SAndroid Build Coastguard Worker //===- subzero/src/IceRegistersARM32.h - Register information ---*- C++ -*-===//
2*03ce13f7SAndroid Build Coastguard Worker //
3*03ce13f7SAndroid Build Coastguard Worker //                        The Subzero Code Generator
4*03ce13f7SAndroid Build Coastguard Worker //
5*03ce13f7SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*03ce13f7SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*03ce13f7SAndroid Build Coastguard Worker //
8*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*03ce13f7SAndroid Build Coastguard Worker ///
10*03ce13f7SAndroid Build Coastguard Worker /// \file
11*03ce13f7SAndroid Build Coastguard Worker /// \brief Declares the registers and their encodings for ARM32.
12*03ce13f7SAndroid Build Coastguard Worker ///
13*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*03ce13f7SAndroid Build Coastguard Worker 
15*03ce13f7SAndroid Build Coastguard Worker #ifndef SUBZERO_SRC_ICEREGISTERSARM32_H
16*03ce13f7SAndroid Build Coastguard Worker #define SUBZERO_SRC_ICEREGISTERSARM32_H
17*03ce13f7SAndroid Build Coastguard Worker 
18*03ce13f7SAndroid Build Coastguard Worker #include "IceDefs.h"
19*03ce13f7SAndroid Build Coastguard Worker #include "IceInstARM32.def"
20*03ce13f7SAndroid Build Coastguard Worker #include "IceOperand.h" // RC_Target
21*03ce13f7SAndroid Build Coastguard Worker #include "IceTypes.h"
22*03ce13f7SAndroid Build Coastguard Worker 
23*03ce13f7SAndroid Build Coastguard Worker namespace Ice {
24*03ce13f7SAndroid Build Coastguard Worker namespace ARM32 {
25*03ce13f7SAndroid Build Coastguard Worker namespace RegARM32 {
26*03ce13f7SAndroid Build Coastguard Worker 
27*03ce13f7SAndroid Build Coastguard Worker /// An enum of every register. The enum value may not match the encoding used
28*03ce13f7SAndroid Build Coastguard Worker /// to binary encode register operands in instructions.
29*03ce13f7SAndroid Build Coastguard Worker enum AllRegisters {
30*03ce13f7SAndroid Build Coastguard Worker #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr,   \
31*03ce13f7SAndroid Build Coastguard Worker           isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init)       \
32*03ce13f7SAndroid Build Coastguard Worker   val,
33*03ce13f7SAndroid Build Coastguard Worker   REGARM32_TABLE
34*03ce13f7SAndroid Build Coastguard Worker #undef X
35*03ce13f7SAndroid Build Coastguard Worker       Reg_NUM,
36*03ce13f7SAndroid Build Coastguard Worker #define X(val, init) val init,
37*03ce13f7SAndroid Build Coastguard Worker   REGARM32_TABLE_BOUNDS
38*03ce13f7SAndroid Build Coastguard Worker #undef X
39*03ce13f7SAndroid Build Coastguard Worker };
40*03ce13f7SAndroid Build Coastguard Worker 
41*03ce13f7SAndroid Build Coastguard Worker /// An enum of GPR Registers. The enum value does match the encoding used to
42*03ce13f7SAndroid Build Coastguard Worker /// binary encode register operands in instructions.
43*03ce13f7SAndroid Build Coastguard Worker enum GPRRegister {
44*03ce13f7SAndroid Build Coastguard Worker #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr,   \
45*03ce13f7SAndroid Build Coastguard Worker           isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init)       \
46*03ce13f7SAndroid Build Coastguard Worker   Encoded_##val = encode,
47*03ce13f7SAndroid Build Coastguard Worker   REGARM32_GPR_TABLE
48*03ce13f7SAndroid Build Coastguard Worker #undef X
49*03ce13f7SAndroid Build Coastguard Worker       Encoded_Not_GPR = -1
50*03ce13f7SAndroid Build Coastguard Worker };
51*03ce13f7SAndroid Build Coastguard Worker 
52*03ce13f7SAndroid Build Coastguard Worker /// An enum of FP32 S-Registers. The enum value does match the encoding used
53*03ce13f7SAndroid Build Coastguard Worker /// to binary encode register operands in instructions.
54*03ce13f7SAndroid Build Coastguard Worker enum SRegister {
55*03ce13f7SAndroid Build Coastguard Worker #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr,   \
56*03ce13f7SAndroid Build Coastguard Worker           isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init)       \
57*03ce13f7SAndroid Build Coastguard Worker   Encoded_##val = encode,
58*03ce13f7SAndroid Build Coastguard Worker   REGARM32_FP32_TABLE
59*03ce13f7SAndroid Build Coastguard Worker #undef X
60*03ce13f7SAndroid Build Coastguard Worker       Encoded_Not_SReg = -1
61*03ce13f7SAndroid Build Coastguard Worker };
62*03ce13f7SAndroid Build Coastguard Worker 
63*03ce13f7SAndroid Build Coastguard Worker /// An enum of FP64 D-Registers. The enum value does match the encoding used
64*03ce13f7SAndroid Build Coastguard Worker /// to binary encode register operands in instructions.
65*03ce13f7SAndroid Build Coastguard Worker enum DRegister {
66*03ce13f7SAndroid Build Coastguard Worker #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr,   \
67*03ce13f7SAndroid Build Coastguard Worker           isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init)       \
68*03ce13f7SAndroid Build Coastguard Worker   Encoded_##val = encode,
69*03ce13f7SAndroid Build Coastguard Worker   REGARM32_FP64_TABLE
70*03ce13f7SAndroid Build Coastguard Worker #undef X
71*03ce13f7SAndroid Build Coastguard Worker       Encoded_Not_DReg = -1
72*03ce13f7SAndroid Build Coastguard Worker };
73*03ce13f7SAndroid Build Coastguard Worker 
74*03ce13f7SAndroid Build Coastguard Worker /// An enum of 128-bit Q-Registers. The enum value does match the encoding
75*03ce13f7SAndroid Build Coastguard Worker /// used to binary encode register operands in instructions.
76*03ce13f7SAndroid Build Coastguard Worker enum QRegister {
77*03ce13f7SAndroid Build Coastguard Worker #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr,   \
78*03ce13f7SAndroid Build Coastguard Worker           isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init)       \
79*03ce13f7SAndroid Build Coastguard Worker   Encoded_##val = encode,
80*03ce13f7SAndroid Build Coastguard Worker   REGARM32_VEC128_TABLE
81*03ce13f7SAndroid Build Coastguard Worker #undef X
82*03ce13f7SAndroid Build Coastguard Worker       Encoded_Not_QReg = -1
83*03ce13f7SAndroid Build Coastguard Worker };
84*03ce13f7SAndroid Build Coastguard Worker 
85*03ce13f7SAndroid Build Coastguard Worker extern struct RegTableType {
86*03ce13f7SAndroid Build Coastguard Worker   const char *Name;
87*03ce13f7SAndroid Build Coastguard Worker   unsigned Encoding : 10;
88*03ce13f7SAndroid Build Coastguard Worker   unsigned CCArg : 6;
89*03ce13f7SAndroid Build Coastguard Worker   unsigned Scratch : 1;
90*03ce13f7SAndroid Build Coastguard Worker   unsigned Preserved : 1;
91*03ce13f7SAndroid Build Coastguard Worker   unsigned StackPtr : 1;
92*03ce13f7SAndroid Build Coastguard Worker   unsigned FramePtr : 1;
93*03ce13f7SAndroid Build Coastguard Worker   unsigned IsGPR : 1;
94*03ce13f7SAndroid Build Coastguard Worker   unsigned IsInt : 1;
95*03ce13f7SAndroid Build Coastguard Worker   unsigned IsI64Pair : 1;
96*03ce13f7SAndroid Build Coastguard Worker   unsigned IsFP32 : 1;
97*03ce13f7SAndroid Build Coastguard Worker   unsigned IsFP64 : 1;
98*03ce13f7SAndroid Build Coastguard Worker   unsigned IsVec128 : 1;
99*03ce13f7SAndroid Build Coastguard Worker #define NUM_ALIASES_BITS 3
100*03ce13f7SAndroid Build Coastguard Worker   SizeT NumAliases : (NUM_ALIASES_BITS + 1);
101*03ce13f7SAndroid Build Coastguard Worker   uint16_t Aliases[1 << NUM_ALIASES_BITS];
102*03ce13f7SAndroid Build Coastguard Worker #undef NUM_ALIASES_BITS
103*03ce13f7SAndroid Build Coastguard Worker } RegTable[Reg_NUM];
104*03ce13f7SAndroid Build Coastguard Worker 
assertValidRegNum(RegNumT RegNum)105*03ce13f7SAndroid Build Coastguard Worker static inline void assertValidRegNum(RegNumT RegNum) {
106*03ce13f7SAndroid Build Coastguard Worker   (void)RegNum;
107*03ce13f7SAndroid Build Coastguard Worker   assert(RegNum.hasValue());
108*03ce13f7SAndroid Build Coastguard Worker }
109*03ce13f7SAndroid Build Coastguard Worker 
isGPRegister(RegNumT RegNum)110*03ce13f7SAndroid Build Coastguard Worker static inline bool isGPRegister(RegNumT RegNum) {
111*03ce13f7SAndroid Build Coastguard Worker   RegNum.assertIsValid();
112*03ce13f7SAndroid Build Coastguard Worker   return RegTable[RegNum].IsGPR;
113*03ce13f7SAndroid Build Coastguard Worker }
114*03ce13f7SAndroid Build Coastguard Worker 
getNumGPRegs()115*03ce13f7SAndroid Build Coastguard Worker static constexpr inline SizeT getNumGPRegs() {
116*03ce13f7SAndroid Build Coastguard Worker   return 0
117*03ce13f7SAndroid Build Coastguard Worker #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr,   \
118*03ce13f7SAndroid Build Coastguard Worker           isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init)       \
119*03ce13f7SAndroid Build Coastguard Worker   +(isGPR)
120*03ce13f7SAndroid Build Coastguard Worker       REGARM32_TABLE
121*03ce13f7SAndroid Build Coastguard Worker #undef X
122*03ce13f7SAndroid Build Coastguard Worker       ;
123*03ce13f7SAndroid Build Coastguard Worker }
124*03ce13f7SAndroid Build Coastguard Worker 
getEncodedGPR(RegNumT RegNum)125*03ce13f7SAndroid Build Coastguard Worker static inline GPRRegister getEncodedGPR(RegNumT RegNum) {
126*03ce13f7SAndroid Build Coastguard Worker   RegNum.assertIsValid();
127*03ce13f7SAndroid Build Coastguard Worker   return GPRRegister(RegTable[RegNum].Encoding);
128*03ce13f7SAndroid Build Coastguard Worker }
129*03ce13f7SAndroid Build Coastguard Worker 
getNumGPRs()130*03ce13f7SAndroid Build Coastguard Worker static constexpr inline SizeT getNumGPRs() {
131*03ce13f7SAndroid Build Coastguard Worker   return 0
132*03ce13f7SAndroid Build Coastguard Worker #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr,   \
133*03ce13f7SAndroid Build Coastguard Worker           isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init)       \
134*03ce13f7SAndroid Build Coastguard Worker   +(isGPR)
135*03ce13f7SAndroid Build Coastguard Worker       REGARM32_TABLE
136*03ce13f7SAndroid Build Coastguard Worker #undef X
137*03ce13f7SAndroid Build Coastguard Worker       ;
138*03ce13f7SAndroid Build Coastguard Worker }
139*03ce13f7SAndroid Build Coastguard Worker 
isGPR(RegNumT RegNum)140*03ce13f7SAndroid Build Coastguard Worker static inline bool isGPR(RegNumT RegNum) {
141*03ce13f7SAndroid Build Coastguard Worker   RegNum.assertIsValid();
142*03ce13f7SAndroid Build Coastguard Worker   return RegTable[RegNum].IsGPR;
143*03ce13f7SAndroid Build Coastguard Worker }
144*03ce13f7SAndroid Build Coastguard Worker 
getI64PairFirstGPRNum(RegNumT RegNum)145*03ce13f7SAndroid Build Coastguard Worker static inline GPRRegister getI64PairFirstGPRNum(RegNumT RegNum) {
146*03ce13f7SAndroid Build Coastguard Worker   RegNum.assertIsValid();
147*03ce13f7SAndroid Build Coastguard Worker   return GPRRegister(RegTable[RegNum].Encoding);
148*03ce13f7SAndroid Build Coastguard Worker }
149*03ce13f7SAndroid Build Coastguard Worker 
getI64PairSecondGPRNum(RegNumT RegNum)150*03ce13f7SAndroid Build Coastguard Worker static inline GPRRegister getI64PairSecondGPRNum(RegNumT RegNum) {
151*03ce13f7SAndroid Build Coastguard Worker   RegNum.assertIsValid();
152*03ce13f7SAndroid Build Coastguard Worker   return GPRRegister(RegTable[RegNum].Encoding + 1);
153*03ce13f7SAndroid Build Coastguard Worker }
154*03ce13f7SAndroid Build Coastguard Worker 
isI64RegisterPair(RegNumT RegNum)155*03ce13f7SAndroid Build Coastguard Worker static inline bool isI64RegisterPair(RegNumT RegNum) {
156*03ce13f7SAndroid Build Coastguard Worker   RegNum.assertIsValid();
157*03ce13f7SAndroid Build Coastguard Worker   return RegTable[RegNum].IsI64Pair;
158*03ce13f7SAndroid Build Coastguard Worker }
159*03ce13f7SAndroid Build Coastguard Worker 
isEncodedSReg(RegNumT RegNum)160*03ce13f7SAndroid Build Coastguard Worker static inline bool isEncodedSReg(RegNumT RegNum) {
161*03ce13f7SAndroid Build Coastguard Worker   RegNum.assertIsValid();
162*03ce13f7SAndroid Build Coastguard Worker   return RegTable[RegNum].IsFP32;
163*03ce13f7SAndroid Build Coastguard Worker }
164*03ce13f7SAndroid Build Coastguard Worker 
getNumSRegs()165*03ce13f7SAndroid Build Coastguard Worker static constexpr inline SizeT getNumSRegs() {
166*03ce13f7SAndroid Build Coastguard Worker   return 0
167*03ce13f7SAndroid Build Coastguard Worker #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr,   \
168*03ce13f7SAndroid Build Coastguard Worker           isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init)       \
169*03ce13f7SAndroid Build Coastguard Worker   +(isFP32)
170*03ce13f7SAndroid Build Coastguard Worker       REGARM32_TABLE
171*03ce13f7SAndroid Build Coastguard Worker #undef X
172*03ce13f7SAndroid Build Coastguard Worker       ;
173*03ce13f7SAndroid Build Coastguard Worker }
174*03ce13f7SAndroid Build Coastguard Worker 
getEncodedSReg(RegNumT RegNum)175*03ce13f7SAndroid Build Coastguard Worker static inline SRegister getEncodedSReg(RegNumT RegNum) {
176*03ce13f7SAndroid Build Coastguard Worker   RegNum.assertIsValid();
177*03ce13f7SAndroid Build Coastguard Worker   return SRegister(RegTable[RegNum].Encoding);
178*03ce13f7SAndroid Build Coastguard Worker }
179*03ce13f7SAndroid Build Coastguard Worker 
isEncodedDReg(RegNumT RegNum)180*03ce13f7SAndroid Build Coastguard Worker static inline bool isEncodedDReg(RegNumT RegNum) {
181*03ce13f7SAndroid Build Coastguard Worker   RegNum.assertIsValid();
182*03ce13f7SAndroid Build Coastguard Worker   return RegTable[RegNum].IsFP64;
183*03ce13f7SAndroid Build Coastguard Worker }
184*03ce13f7SAndroid Build Coastguard Worker 
getNumDRegs()185*03ce13f7SAndroid Build Coastguard Worker static constexpr inline SizeT getNumDRegs() {
186*03ce13f7SAndroid Build Coastguard Worker   return 0
187*03ce13f7SAndroid Build Coastguard Worker #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr,   \
188*03ce13f7SAndroid Build Coastguard Worker           isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init)       \
189*03ce13f7SAndroid Build Coastguard Worker   +(isFP64)
190*03ce13f7SAndroid Build Coastguard Worker       REGARM32_TABLE
191*03ce13f7SAndroid Build Coastguard Worker #undef X
192*03ce13f7SAndroid Build Coastguard Worker       ;
193*03ce13f7SAndroid Build Coastguard Worker }
194*03ce13f7SAndroid Build Coastguard Worker 
getEncodedDReg(RegNumT RegNum)195*03ce13f7SAndroid Build Coastguard Worker static inline DRegister getEncodedDReg(RegNumT RegNum) {
196*03ce13f7SAndroid Build Coastguard Worker   RegNum.assertIsValid();
197*03ce13f7SAndroid Build Coastguard Worker   return DRegister(RegTable[RegNum].Encoding);
198*03ce13f7SAndroid Build Coastguard Worker }
199*03ce13f7SAndroid Build Coastguard Worker 
isEncodedQReg(RegNumT RegNum)200*03ce13f7SAndroid Build Coastguard Worker static inline bool isEncodedQReg(RegNumT RegNum) {
201*03ce13f7SAndroid Build Coastguard Worker   RegNum.assertIsValid();
202*03ce13f7SAndroid Build Coastguard Worker   return RegTable[RegNum].IsVec128;
203*03ce13f7SAndroid Build Coastguard Worker }
204*03ce13f7SAndroid Build Coastguard Worker 
getEncodedQReg(RegNumT RegNum)205*03ce13f7SAndroid Build Coastguard Worker static inline QRegister getEncodedQReg(RegNumT RegNum) {
206*03ce13f7SAndroid Build Coastguard Worker   assert(isEncodedQReg(RegNum));
207*03ce13f7SAndroid Build Coastguard Worker   return QRegister(RegTable[RegNum].Encoding);
208*03ce13f7SAndroid Build Coastguard Worker }
209*03ce13f7SAndroid Build Coastguard Worker 
getRegName(RegNumT RegNum)210*03ce13f7SAndroid Build Coastguard Worker static inline const char *getRegName(RegNumT RegNum) {
211*03ce13f7SAndroid Build Coastguard Worker   RegNum.assertIsValid();
212*03ce13f7SAndroid Build Coastguard Worker   return RegTable[RegNum].Name;
213*03ce13f7SAndroid Build Coastguard Worker }
214*03ce13f7SAndroid Build Coastguard Worker 
215*03ce13f7SAndroid Build Coastguard Worker // Extend enum RegClass with ARM32-specific register classes.
216*03ce13f7SAndroid Build Coastguard Worker enum RegClassARM32 : uint8_t {
217*03ce13f7SAndroid Build Coastguard Worker   RCARM32_QtoS = RC_Target, // Denotes Q registers that are aliased by S
218*03ce13f7SAndroid Build Coastguard Worker                             // registers.
219*03ce13f7SAndroid Build Coastguard Worker   RCARM32_NUM
220*03ce13f7SAndroid Build Coastguard Worker };
221*03ce13f7SAndroid Build Coastguard Worker 
222*03ce13f7SAndroid Build Coastguard Worker } // end of namespace RegARM32
223*03ce13f7SAndroid Build Coastguard Worker } // end of namespace ARM32
224*03ce13f7SAndroid Build Coastguard Worker } // end of namespace Ice
225*03ce13f7SAndroid Build Coastguard Worker 
226*03ce13f7SAndroid Build Coastguard Worker #endif // SUBZERO_SRC_ICEREGISTERSARM32_H
227