xref: /aosp_15_r20/external/llvm/lib/Target/Mips/MCTargetDesc/MipsABIFlagsSection.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- MipsABIFlagsSection.h - Mips ELF ABI Flags Section -----*- C++ -*--===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker 
10*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSABIFLAGSSECTION_H
11*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSABIFLAGSSECTION_H
12*9880d681SAndroid Build Coastguard Worker 
13*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCStreamer.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/MipsABIFlags.h"
16*9880d681SAndroid Build Coastguard Worker 
17*9880d681SAndroid Build Coastguard Worker namespace llvm {
18*9880d681SAndroid Build Coastguard Worker 
19*9880d681SAndroid Build Coastguard Worker class MCStreamer;
20*9880d681SAndroid Build Coastguard Worker 
21*9880d681SAndroid Build Coastguard Worker struct MipsABIFlagsSection {
22*9880d681SAndroid Build Coastguard Worker   // Internal representation of the fp_abi related values used in .module.
23*9880d681SAndroid Build Coastguard Worker   enum class FpABIKind { ANY, XX, S32, S64, SOFT };
24*9880d681SAndroid Build Coastguard Worker 
25*9880d681SAndroid Build Coastguard Worker   // Version of flags structure.
26*9880d681SAndroid Build Coastguard Worker   uint16_t Version;
27*9880d681SAndroid Build Coastguard Worker   // The level of the ISA: 1-5, 32, 64.
28*9880d681SAndroid Build Coastguard Worker   uint8_t ISALevel;
29*9880d681SAndroid Build Coastguard Worker   // The revision of ISA: 0 for MIPS V and below, 1-n otherwise.
30*9880d681SAndroid Build Coastguard Worker   uint8_t ISARevision;
31*9880d681SAndroid Build Coastguard Worker   // The size of general purpose registers.
32*9880d681SAndroid Build Coastguard Worker   Mips::AFL_REG GPRSize;
33*9880d681SAndroid Build Coastguard Worker   // The size of co-processor 1 registers.
34*9880d681SAndroid Build Coastguard Worker   Mips::AFL_REG CPR1Size;
35*9880d681SAndroid Build Coastguard Worker   // The size of co-processor 2 registers.
36*9880d681SAndroid Build Coastguard Worker   Mips::AFL_REG CPR2Size;
37*9880d681SAndroid Build Coastguard Worker   // Processor-specific extension.
38*9880d681SAndroid Build Coastguard Worker   Mips::AFL_EXT ISAExtension;
39*9880d681SAndroid Build Coastguard Worker   // Mask of ASEs used.
40*9880d681SAndroid Build Coastguard Worker   uint32_t ASESet;
41*9880d681SAndroid Build Coastguard Worker 
42*9880d681SAndroid Build Coastguard Worker   bool OddSPReg;
43*9880d681SAndroid Build Coastguard Worker 
44*9880d681SAndroid Build Coastguard Worker   bool Is32BitABI;
45*9880d681SAndroid Build Coastguard Worker 
46*9880d681SAndroid Build Coastguard Worker protected:
47*9880d681SAndroid Build Coastguard Worker   // The floating-point ABI.
48*9880d681SAndroid Build Coastguard Worker   FpABIKind FpABI;
49*9880d681SAndroid Build Coastguard Worker 
50*9880d681SAndroid Build Coastguard Worker public:
MipsABIFlagsSectionMipsABIFlagsSection51*9880d681SAndroid Build Coastguard Worker   MipsABIFlagsSection()
52*9880d681SAndroid Build Coastguard Worker       : Version(0), ISALevel(0), ISARevision(0), GPRSize(Mips::AFL_REG_NONE),
53*9880d681SAndroid Build Coastguard Worker         CPR1Size(Mips::AFL_REG_NONE), CPR2Size(Mips::AFL_REG_NONE),
54*9880d681SAndroid Build Coastguard Worker         ISAExtension(Mips::AFL_EXT_NONE), ASESet(0), OddSPReg(false),
55*9880d681SAndroid Build Coastguard Worker         Is32BitABI(false), FpABI(FpABIKind::ANY) {}
56*9880d681SAndroid Build Coastguard Worker 
getVersionValueMipsABIFlagsSection57*9880d681SAndroid Build Coastguard Worker   uint16_t getVersionValue() { return (uint16_t)Version; }
getISALevelValueMipsABIFlagsSection58*9880d681SAndroid Build Coastguard Worker   uint8_t getISALevelValue() { return (uint8_t)ISALevel; }
getISARevisionValueMipsABIFlagsSection59*9880d681SAndroid Build Coastguard Worker   uint8_t getISARevisionValue() { return (uint8_t)ISARevision; }
getGPRSizeValueMipsABIFlagsSection60*9880d681SAndroid Build Coastguard Worker   uint8_t getGPRSizeValue() { return (uint8_t)GPRSize; }
61*9880d681SAndroid Build Coastguard Worker   uint8_t getCPR1SizeValue();
getCPR2SizeValueMipsABIFlagsSection62*9880d681SAndroid Build Coastguard Worker   uint8_t getCPR2SizeValue() { return (uint8_t)CPR2Size; }
63*9880d681SAndroid Build Coastguard Worker   uint8_t getFpABIValue();
getISAExtensionValueMipsABIFlagsSection64*9880d681SAndroid Build Coastguard Worker   uint32_t getISAExtensionValue() { return (uint32_t)ISAExtension; }
getASESetValueMipsABIFlagsSection65*9880d681SAndroid Build Coastguard Worker   uint32_t getASESetValue() { return (uint32_t)ASESet; }
66*9880d681SAndroid Build Coastguard Worker 
getFlags1ValueMipsABIFlagsSection67*9880d681SAndroid Build Coastguard Worker   uint32_t getFlags1Value() {
68*9880d681SAndroid Build Coastguard Worker     uint32_t Value = 0;
69*9880d681SAndroid Build Coastguard Worker 
70*9880d681SAndroid Build Coastguard Worker     if (OddSPReg)
71*9880d681SAndroid Build Coastguard Worker       Value |= (uint32_t)Mips::AFL_FLAGS1_ODDSPREG;
72*9880d681SAndroid Build Coastguard Worker 
73*9880d681SAndroid Build Coastguard Worker     return Value;
74*9880d681SAndroid Build Coastguard Worker   }
75*9880d681SAndroid Build Coastguard Worker 
getFlags2ValueMipsABIFlagsSection76*9880d681SAndroid Build Coastguard Worker   uint32_t getFlags2Value() { return 0; }
77*9880d681SAndroid Build Coastguard Worker 
getFpABIMipsABIFlagsSection78*9880d681SAndroid Build Coastguard Worker   FpABIKind getFpABI() { return FpABI; }
setFpABIMipsABIFlagsSection79*9880d681SAndroid Build Coastguard Worker   void setFpABI(FpABIKind Value, bool IsABI32Bit) {
80*9880d681SAndroid Build Coastguard Worker     FpABI = Value;
81*9880d681SAndroid Build Coastguard Worker     Is32BitABI = IsABI32Bit;
82*9880d681SAndroid Build Coastguard Worker   }
83*9880d681SAndroid Build Coastguard Worker   StringRef getFpABIString(FpABIKind Value);
84*9880d681SAndroid Build Coastguard Worker 
85*9880d681SAndroid Build Coastguard Worker   template <class PredicateLibrary>
setISALevelAndRevisionFromPredicatesMipsABIFlagsSection86*9880d681SAndroid Build Coastguard Worker   void setISALevelAndRevisionFromPredicates(const PredicateLibrary &P) {
87*9880d681SAndroid Build Coastguard Worker     if (P.hasMips64()) {
88*9880d681SAndroid Build Coastguard Worker       ISALevel = 64;
89*9880d681SAndroid Build Coastguard Worker       if (P.hasMips64r6())
90*9880d681SAndroid Build Coastguard Worker         ISARevision = 6;
91*9880d681SAndroid Build Coastguard Worker       else if (P.hasMips64r5())
92*9880d681SAndroid Build Coastguard Worker         ISARevision = 5;
93*9880d681SAndroid Build Coastguard Worker       else if (P.hasMips64r3())
94*9880d681SAndroid Build Coastguard Worker         ISARevision = 3;
95*9880d681SAndroid Build Coastguard Worker       else if (P.hasMips64r2())
96*9880d681SAndroid Build Coastguard Worker         ISARevision = 2;
97*9880d681SAndroid Build Coastguard Worker       else
98*9880d681SAndroid Build Coastguard Worker         ISARevision = 1;
99*9880d681SAndroid Build Coastguard Worker     } else if (P.hasMips32()) {
100*9880d681SAndroid Build Coastguard Worker       ISALevel = 32;
101*9880d681SAndroid Build Coastguard Worker       if (P.hasMips32r6())
102*9880d681SAndroid Build Coastguard Worker         ISARevision = 6;
103*9880d681SAndroid Build Coastguard Worker       else if (P.hasMips32r5())
104*9880d681SAndroid Build Coastguard Worker         ISARevision = 5;
105*9880d681SAndroid Build Coastguard Worker       else if (P.hasMips32r3())
106*9880d681SAndroid Build Coastguard Worker         ISARevision = 3;
107*9880d681SAndroid Build Coastguard Worker       else if (P.hasMips32r2())
108*9880d681SAndroid Build Coastguard Worker         ISARevision = 2;
109*9880d681SAndroid Build Coastguard Worker       else
110*9880d681SAndroid Build Coastguard Worker         ISARevision = 1;
111*9880d681SAndroid Build Coastguard Worker     } else {
112*9880d681SAndroid Build Coastguard Worker       ISARevision = 0;
113*9880d681SAndroid Build Coastguard Worker       if (P.hasMips5())
114*9880d681SAndroid Build Coastguard Worker         ISALevel = 5;
115*9880d681SAndroid Build Coastguard Worker       else if (P.hasMips4())
116*9880d681SAndroid Build Coastguard Worker         ISALevel = 4;
117*9880d681SAndroid Build Coastguard Worker       else if (P.hasMips3())
118*9880d681SAndroid Build Coastguard Worker         ISALevel = 3;
119*9880d681SAndroid Build Coastguard Worker       else if (P.hasMips2())
120*9880d681SAndroid Build Coastguard Worker         ISALevel = 2;
121*9880d681SAndroid Build Coastguard Worker       else if (P.hasMips1())
122*9880d681SAndroid Build Coastguard Worker         ISALevel = 1;
123*9880d681SAndroid Build Coastguard Worker       else
124*9880d681SAndroid Build Coastguard Worker         llvm_unreachable("Unknown ISA level!");
125*9880d681SAndroid Build Coastguard Worker     }
126*9880d681SAndroid Build Coastguard Worker   }
127*9880d681SAndroid Build Coastguard Worker 
128*9880d681SAndroid Build Coastguard Worker   template <class PredicateLibrary>
setGPRSizeFromPredicatesMipsABIFlagsSection129*9880d681SAndroid Build Coastguard Worker   void setGPRSizeFromPredicates(const PredicateLibrary &P) {
130*9880d681SAndroid Build Coastguard Worker     GPRSize = P.isGP64bit() ? Mips::AFL_REG_64 : Mips::AFL_REG_32;
131*9880d681SAndroid Build Coastguard Worker   }
132*9880d681SAndroid Build Coastguard Worker 
133*9880d681SAndroid Build Coastguard Worker   template <class PredicateLibrary>
setCPR1SizeFromPredicatesMipsABIFlagsSection134*9880d681SAndroid Build Coastguard Worker   void setCPR1SizeFromPredicates(const PredicateLibrary &P) {
135*9880d681SAndroid Build Coastguard Worker     if (P.useSoftFloat())
136*9880d681SAndroid Build Coastguard Worker       CPR1Size = Mips::AFL_REG_NONE;
137*9880d681SAndroid Build Coastguard Worker     else if (P.hasMSA())
138*9880d681SAndroid Build Coastguard Worker       CPR1Size = Mips::AFL_REG_128;
139*9880d681SAndroid Build Coastguard Worker     else
140*9880d681SAndroid Build Coastguard Worker       CPR1Size = P.isFP64bit() ? Mips::AFL_REG_64 : Mips::AFL_REG_32;
141*9880d681SAndroid Build Coastguard Worker   }
142*9880d681SAndroid Build Coastguard Worker 
143*9880d681SAndroid Build Coastguard Worker   template <class PredicateLibrary>
setISAExtensionFromPredicatesMipsABIFlagsSection144*9880d681SAndroid Build Coastguard Worker   void setISAExtensionFromPredicates(const PredicateLibrary &P) {
145*9880d681SAndroid Build Coastguard Worker     if (P.hasCnMips())
146*9880d681SAndroid Build Coastguard Worker       ISAExtension = Mips::AFL_EXT_OCTEON;
147*9880d681SAndroid Build Coastguard Worker     else
148*9880d681SAndroid Build Coastguard Worker       ISAExtension = Mips::AFL_EXT_NONE;
149*9880d681SAndroid Build Coastguard Worker   }
150*9880d681SAndroid Build Coastguard Worker 
151*9880d681SAndroid Build Coastguard Worker   template <class PredicateLibrary>
setASESetFromPredicatesMipsABIFlagsSection152*9880d681SAndroid Build Coastguard Worker   void setASESetFromPredicates(const PredicateLibrary &P) {
153*9880d681SAndroid Build Coastguard Worker     ASESet = 0;
154*9880d681SAndroid Build Coastguard Worker     if (P.hasDSP())
155*9880d681SAndroid Build Coastguard Worker       ASESet |= Mips::AFL_ASE_DSP;
156*9880d681SAndroid Build Coastguard Worker     if (P.hasDSPR2())
157*9880d681SAndroid Build Coastguard Worker       ASESet |= Mips::AFL_ASE_DSPR2;
158*9880d681SAndroid Build Coastguard Worker     if (P.hasMSA())
159*9880d681SAndroid Build Coastguard Worker       ASESet |= Mips::AFL_ASE_MSA;
160*9880d681SAndroid Build Coastguard Worker     if (P.inMicroMipsMode())
161*9880d681SAndroid Build Coastguard Worker       ASESet |= Mips::AFL_ASE_MICROMIPS;
162*9880d681SAndroid Build Coastguard Worker     if (P.inMips16Mode())
163*9880d681SAndroid Build Coastguard Worker       ASESet |= Mips::AFL_ASE_MIPS16;
164*9880d681SAndroid Build Coastguard Worker   }
165*9880d681SAndroid Build Coastguard Worker 
166*9880d681SAndroid Build Coastguard Worker   template <class PredicateLibrary>
setFpAbiFromPredicatesMipsABIFlagsSection167*9880d681SAndroid Build Coastguard Worker   void setFpAbiFromPredicates(const PredicateLibrary &P) {
168*9880d681SAndroid Build Coastguard Worker     Is32BitABI = P.isABI_O32();
169*9880d681SAndroid Build Coastguard Worker 
170*9880d681SAndroid Build Coastguard Worker     FpABI = FpABIKind::ANY;
171*9880d681SAndroid Build Coastguard Worker     if (P.useSoftFloat())
172*9880d681SAndroid Build Coastguard Worker       FpABI = FpABIKind::SOFT;
173*9880d681SAndroid Build Coastguard Worker     else if (P.isABI_N32() || P.isABI_N64())
174*9880d681SAndroid Build Coastguard Worker       FpABI = FpABIKind::S64;
175*9880d681SAndroid Build Coastguard Worker     else if (P.isABI_O32()) {
176*9880d681SAndroid Build Coastguard Worker       if (P.isABI_FPXX())
177*9880d681SAndroid Build Coastguard Worker         FpABI = FpABIKind::XX;
178*9880d681SAndroid Build Coastguard Worker       else if (P.isFP64bit())
179*9880d681SAndroid Build Coastguard Worker         FpABI = FpABIKind::S64;
180*9880d681SAndroid Build Coastguard Worker       else
181*9880d681SAndroid Build Coastguard Worker         FpABI = FpABIKind::S32;
182*9880d681SAndroid Build Coastguard Worker     }
183*9880d681SAndroid Build Coastguard Worker   }
184*9880d681SAndroid Build Coastguard Worker 
185*9880d681SAndroid Build Coastguard Worker   template <class PredicateLibrary>
setAllFromPredicatesMipsABIFlagsSection186*9880d681SAndroid Build Coastguard Worker   void setAllFromPredicates(const PredicateLibrary &P) {
187*9880d681SAndroid Build Coastguard Worker     setISALevelAndRevisionFromPredicates(P);
188*9880d681SAndroid Build Coastguard Worker     setGPRSizeFromPredicates(P);
189*9880d681SAndroid Build Coastguard Worker     setCPR1SizeFromPredicates(P);
190*9880d681SAndroid Build Coastguard Worker     setISAExtensionFromPredicates(P);
191*9880d681SAndroid Build Coastguard Worker     setASESetFromPredicates(P);
192*9880d681SAndroid Build Coastguard Worker     setFpAbiFromPredicates(P);
193*9880d681SAndroid Build Coastguard Worker     OddSPReg = P.useOddSPReg();
194*9880d681SAndroid Build Coastguard Worker   }
195*9880d681SAndroid Build Coastguard Worker };
196*9880d681SAndroid Build Coastguard Worker 
197*9880d681SAndroid Build Coastguard Worker MCStreamer &operator<<(MCStreamer &OS, MipsABIFlagsSection &ABIFlagsSection);
198*9880d681SAndroid Build Coastguard Worker }
199*9880d681SAndroid Build Coastguard Worker 
200*9880d681SAndroid Build Coastguard Worker #endif
201