xref: /aosp_15_r20/external/swiftshader/third_party/subzero/src/IceRegistersMIPS32.h (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1*03ce13f7SAndroid Build Coastguard Worker //===- subzero/src/IceRegistersMIPS32.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 MIPS32.
12*03ce13f7SAndroid Build Coastguard Worker ///
13*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*03ce13f7SAndroid Build Coastguard Worker 
15*03ce13f7SAndroid Build Coastguard Worker #ifndef SUBZERO_SRC_ICEREGISTERSMIPS32_H
16*03ce13f7SAndroid Build Coastguard Worker #define SUBZERO_SRC_ICEREGISTERSMIPS32_H
17*03ce13f7SAndroid Build Coastguard Worker 
18*03ce13f7SAndroid Build Coastguard Worker #include "IceDefs.h"
19*03ce13f7SAndroid Build Coastguard Worker #include "IceInstMIPS32.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 MIPS32 {
25*03ce13f7SAndroid Build Coastguard Worker namespace RegMIPS32 {
26*03ce13f7SAndroid Build Coastguard Worker 
27*03ce13f7SAndroid Build Coastguard Worker /// An enum of every register. The enum value may not match the encoding used to
28*03ce13f7SAndroid Build Coastguard Worker /// binary encode register operands in instructions.
29*03ce13f7SAndroid Build Coastguard Worker enum AllRegisters {
30*03ce13f7SAndroid Build Coastguard Worker #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt,    \
31*03ce13f7SAndroid Build Coastguard Worker           isI64Pair, isFP32, isFP64, isVec128, alias_init)                     \
32*03ce13f7SAndroid Build Coastguard Worker   val,
33*03ce13f7SAndroid Build Coastguard Worker   REGMIPS32_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   REGMIPS32_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, scratch, preserved, stackptr, frameptr, isInt,    \
45*03ce13f7SAndroid Build Coastguard Worker           isI64Pair, isFP32, isFP64, isVec128, alias_init)                     \
46*03ce13f7SAndroid Build Coastguard Worker                                                                                \
47*03ce13f7SAndroid Build Coastguard Worker   Encoded_##val = encode,
48*03ce13f7SAndroid Build Coastguard Worker   REGMIPS32_GPR_TABLE
49*03ce13f7SAndroid Build Coastguard Worker #undef X
50*03ce13f7SAndroid Build Coastguard Worker       Encoded_Not_GPR = -1
51*03ce13f7SAndroid Build Coastguard Worker };
52*03ce13f7SAndroid Build Coastguard Worker 
53*03ce13f7SAndroid Build Coastguard Worker /// An enum of FPR Registers. The enum value does match the encoding used to
54*03ce13f7SAndroid Build Coastguard Worker /// binary encode register operands in instructions.
55*03ce13f7SAndroid Build Coastguard Worker enum FPRRegister {
56*03ce13f7SAndroid Build Coastguard Worker #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt,    \
57*03ce13f7SAndroid Build Coastguard Worker           isI64Pair, isFP32, isFP64, isVec128, alias_init)                     \
58*03ce13f7SAndroid Build Coastguard Worker                                                                                \
59*03ce13f7SAndroid Build Coastguard Worker   Encoded_##val = encode,
60*03ce13f7SAndroid Build Coastguard Worker   REGMIPS32_FPR_TABLE
61*03ce13f7SAndroid Build Coastguard Worker #undef X
62*03ce13f7SAndroid Build Coastguard Worker       Encoded_Not_FPR = -1
63*03ce13f7SAndroid Build Coastguard Worker };
64*03ce13f7SAndroid Build Coastguard Worker 
65*03ce13f7SAndroid Build Coastguard Worker // TODO(jvoung): Floating point and vector registers...
66*03ce13f7SAndroid Build Coastguard Worker // Need to model overlap and difference in encoding too.
67*03ce13f7SAndroid Build Coastguard Worker 
getEncodedGPR(RegNumT RegNum)68*03ce13f7SAndroid Build Coastguard Worker static inline GPRRegister getEncodedGPR(RegNumT RegNum) {
69*03ce13f7SAndroid Build Coastguard Worker   assert(int(Reg_GPR_First) <= int(RegNum));
70*03ce13f7SAndroid Build Coastguard Worker   assert(unsigned(RegNum) <= Reg_GPR_Last);
71*03ce13f7SAndroid Build Coastguard Worker   return GPRRegister(RegNum - Reg_GPR_First);
72*03ce13f7SAndroid Build Coastguard Worker }
73*03ce13f7SAndroid Build Coastguard Worker 
isGPRReg(RegNumT RegNum)74*03ce13f7SAndroid Build Coastguard Worker static inline bool isGPRReg(RegNumT RegNum) {
75*03ce13f7SAndroid Build Coastguard Worker   bool IsGPR = ((int(Reg_GPR_First) <= int(RegNum)) &&
76*03ce13f7SAndroid Build Coastguard Worker                 (unsigned(RegNum) <= Reg_GPR_Last)) ||
77*03ce13f7SAndroid Build Coastguard Worker                ((int(Reg_I64PAIR_First) <= int(RegNum)) &&
78*03ce13f7SAndroid Build Coastguard Worker                 (unsigned(RegNum) <= Reg_I64PAIR_Last));
79*03ce13f7SAndroid Build Coastguard Worker   return IsGPR;
80*03ce13f7SAndroid Build Coastguard Worker }
81*03ce13f7SAndroid Build Coastguard Worker 
getEncodedFPR(RegNumT RegNum)82*03ce13f7SAndroid Build Coastguard Worker static inline FPRRegister getEncodedFPR(RegNumT RegNum) {
83*03ce13f7SAndroid Build Coastguard Worker   assert(int(Reg_FPR_First) <= int(RegNum));
84*03ce13f7SAndroid Build Coastguard Worker   assert(unsigned(RegNum) <= Reg_FPR_Last);
85*03ce13f7SAndroid Build Coastguard Worker   return FPRRegister(RegNum - Reg_FPR_First);
86*03ce13f7SAndroid Build Coastguard Worker }
87*03ce13f7SAndroid Build Coastguard Worker 
isFPRReg(RegNumT RegNum)88*03ce13f7SAndroid Build Coastguard Worker static inline bool isFPRReg(RegNumT RegNum) {
89*03ce13f7SAndroid Build Coastguard Worker   return ((int(Reg_FPR_First) <= int(RegNum)) &&
90*03ce13f7SAndroid Build Coastguard Worker           (unsigned(RegNum) <= Reg_FPR_Last));
91*03ce13f7SAndroid Build Coastguard Worker }
92*03ce13f7SAndroid Build Coastguard Worker 
getEncodedFPR64(RegNumT RegNum)93*03ce13f7SAndroid Build Coastguard Worker static inline FPRRegister getEncodedFPR64(RegNumT RegNum) {
94*03ce13f7SAndroid Build Coastguard Worker   assert(int(Reg_F64PAIR_First) <= int(RegNum));
95*03ce13f7SAndroid Build Coastguard Worker   assert(unsigned(RegNum) <= Reg_F64PAIR_Last);
96*03ce13f7SAndroid Build Coastguard Worker   return FPRRegister((RegNum - Reg_F64PAIR_First) * 2);
97*03ce13f7SAndroid Build Coastguard Worker }
98*03ce13f7SAndroid Build Coastguard Worker 
isFPR64Reg(RegNumT RegNum)99*03ce13f7SAndroid Build Coastguard Worker static inline bool isFPR64Reg(RegNumT RegNum) {
100*03ce13f7SAndroid Build Coastguard Worker   return (int(Reg_F64PAIR_First) <= int(RegNum)) &&
101*03ce13f7SAndroid Build Coastguard Worker          (unsigned(RegNum) <= Reg_F64PAIR_Last);
102*03ce13f7SAndroid Build Coastguard Worker }
103*03ce13f7SAndroid Build Coastguard Worker 
104*03ce13f7SAndroid Build Coastguard Worker const char *getRegName(RegNumT RegNum);
105*03ce13f7SAndroid Build Coastguard Worker 
get64PairFirstRegNum(RegNumT RegNum)106*03ce13f7SAndroid Build Coastguard Worker static inline RegNumT get64PairFirstRegNum(RegNumT RegNum) {
107*03ce13f7SAndroid Build Coastguard Worker   assert(unsigned(RegNum) >= Reg_I64PAIR_First);
108*03ce13f7SAndroid Build Coastguard Worker   assert(unsigned(RegNum) <= Reg_F64PAIR_Last);
109*03ce13f7SAndroid Build Coastguard Worker   if (unsigned(RegNum) >= Reg_F64PAIR_First &&
110*03ce13f7SAndroid Build Coastguard Worker       unsigned(RegNum) <= Reg_F64PAIR_Last)
111*03ce13f7SAndroid Build Coastguard Worker     return RegNumT::fixme(((RegNum - Reg_F64PAIR_First) * 2) +
112*03ce13f7SAndroid Build Coastguard Worker                           unsigned(Reg_FPR_First));
113*03ce13f7SAndroid Build Coastguard Worker   if (unsigned(RegNum) >= Reg_I64PAIR_First && unsigned(RegNum) <= Reg_T8T9)
114*03ce13f7SAndroid Build Coastguard Worker     return RegNumT::fixme(((RegNum - Reg_I64PAIR_First) * 2) +
115*03ce13f7SAndroid Build Coastguard Worker                           unsigned(Reg_V0));
116*03ce13f7SAndroid Build Coastguard Worker   return RegMIPS32::Reg_LO;
117*03ce13f7SAndroid Build Coastguard Worker }
118*03ce13f7SAndroid Build Coastguard Worker 
get64PairSecondRegNum(RegNumT RegNum)119*03ce13f7SAndroid Build Coastguard Worker static inline RegNumT get64PairSecondRegNum(RegNumT RegNum) {
120*03ce13f7SAndroid Build Coastguard Worker   assert(unsigned(RegNum) >= Reg_I64PAIR_First);
121*03ce13f7SAndroid Build Coastguard Worker   assert(unsigned(RegNum) <= Reg_F64PAIR_Last);
122*03ce13f7SAndroid Build Coastguard Worker   if (unsigned(RegNum) >= Reg_F64PAIR_First &&
123*03ce13f7SAndroid Build Coastguard Worker       unsigned(RegNum) <= Reg_F64PAIR_Last)
124*03ce13f7SAndroid Build Coastguard Worker     return RegNumT::fixme(((RegNum - Reg_F64PAIR_First) * 2) +
125*03ce13f7SAndroid Build Coastguard Worker                           unsigned(Reg_FPR_First) + 1);
126*03ce13f7SAndroid Build Coastguard Worker   if (unsigned(RegNum) >= Reg_I64PAIR_First && unsigned(RegNum) <= Reg_T8T9)
127*03ce13f7SAndroid Build Coastguard Worker     return RegNumT::fixme(((RegNum - Reg_I64PAIR_First) * 2) +
128*03ce13f7SAndroid Build Coastguard Worker                           unsigned(Reg_V1));
129*03ce13f7SAndroid Build Coastguard Worker   return RegMIPS32::Reg_HI;
130*03ce13f7SAndroid Build Coastguard Worker }
131*03ce13f7SAndroid Build Coastguard Worker 
132*03ce13f7SAndroid Build Coastguard Worker } // end of namespace RegMIPS32
133*03ce13f7SAndroid Build Coastguard Worker 
134*03ce13f7SAndroid Build Coastguard Worker // Extend enum RegClass with MIPS32-specific register classes (if any).
135*03ce13f7SAndroid Build Coastguard Worker enum RegClassMIPS32 : uint8_t { RCMIPS32_NUM = RC_Target };
136*03ce13f7SAndroid Build Coastguard Worker 
137*03ce13f7SAndroid Build Coastguard Worker } // end of namespace MIPS32
138*03ce13f7SAndroid Build Coastguard Worker } // end of namespace Ice
139*03ce13f7SAndroid Build Coastguard Worker 
140*03ce13f7SAndroid Build Coastguard Worker #endif // SUBZERO_SRC_ICEREGISTERSMIPS32_H
141