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