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