1*9880d681SAndroid Build Coastguard Worker //===-- MipsSubtarget.h - Define Subtarget for the Mips ---------*- 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 // This file declares the Mips specific subclass of TargetSubtargetInfo. 11*9880d681SAndroid Build Coastguard Worker // 12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_MIPS_MIPSSUBTARGET_H 15*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_MIPS_MIPSSUBTARGET_H 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker #include "MCTargetDesc/MipsABIInfo.h" 18*9880d681SAndroid Build Coastguard Worker #include "MipsFrameLowering.h" 19*9880d681SAndroid Build Coastguard Worker #include "MipsISelLowering.h" 20*9880d681SAndroid Build Coastguard Worker #include "MipsInstrInfo.h" 21*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/SelectionDAGTargetInfo.h" 22*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DataLayout.h" 23*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCInstrItineraries.h" 24*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h" 25*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetSubtargetInfo.h" 26*9880d681SAndroid Build Coastguard Worker #include <string> 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker #define GET_SUBTARGETINFO_HEADER 29*9880d681SAndroid Build Coastguard Worker #include "MipsGenSubtargetInfo.inc" 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker namespace llvm { 32*9880d681SAndroid Build Coastguard Worker class StringRef; 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker class MipsTargetMachine; 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker class MipsSubtarget : public MipsGenSubtargetInfo { 37*9880d681SAndroid Build Coastguard Worker virtual void anchor(); 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker enum MipsArchEnum { 40*9880d681SAndroid Build Coastguard Worker MipsDefault, 41*9880d681SAndroid Build Coastguard Worker Mips1, Mips2, Mips32, Mips32r2, Mips32r3, Mips32r5, Mips32r6, Mips32Max, 42*9880d681SAndroid Build Coastguard Worker Mips3, Mips4, Mips5, Mips64, Mips64r2, Mips64r3, Mips64r5, Mips64r6 43*9880d681SAndroid Build Coastguard Worker }; 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker enum class CPU { P5600 }; 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker // Mips architecture version 48*9880d681SAndroid Build Coastguard Worker MipsArchEnum MipsArchVersion; 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker // Processor implementation (unused but required to exist by 51*9880d681SAndroid Build Coastguard Worker // tablegen-erated code). 52*9880d681SAndroid Build Coastguard Worker CPU ProcImpl; 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker // IsLittle - The target is Little Endian 55*9880d681SAndroid Build Coastguard Worker bool IsLittle; 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker // IsSoftFloat - The target does not support any floating point instructions. 58*9880d681SAndroid Build Coastguard Worker bool IsSoftFloat; 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker // IsSingleFloat - The target only supports single precision float 61*9880d681SAndroid Build Coastguard Worker // point operations. This enable the target to use all 32 32-bit 62*9880d681SAndroid Build Coastguard Worker // floating point registers instead of only using even ones. 63*9880d681SAndroid Build Coastguard Worker bool IsSingleFloat; 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker // IsFPXX - MIPS O32 modeless ABI. 66*9880d681SAndroid Build Coastguard Worker bool IsFPXX; 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker // NoABICalls - Disable SVR4-style position-independent code. 69*9880d681SAndroid Build Coastguard Worker bool NoABICalls; 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker // IsFP64bit - The target processor has 64-bit floating point registers. 72*9880d681SAndroid Build Coastguard Worker bool IsFP64bit; 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker /// Are odd single-precision registers permitted? 75*9880d681SAndroid Build Coastguard Worker /// This corresponds to -modd-spreg and -mno-odd-spreg 76*9880d681SAndroid Build Coastguard Worker bool UseOddSPReg; 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker // IsNan2008 - IEEE 754-2008 NaN encoding. 79*9880d681SAndroid Build Coastguard Worker bool IsNaN2008bit; 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker // IsFP64bit - General-purpose registers are 64 bits wide 82*9880d681SAndroid Build Coastguard Worker bool IsGP64bit; 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker // IsPTR64bit - Pointers are 64 bit wide 85*9880d681SAndroid Build Coastguard Worker bool IsPTR64bit; 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker // HasVFPU - Processor has a vector floating point unit. 88*9880d681SAndroid Build Coastguard Worker bool HasVFPU; 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker // CPU supports cnMIPS (Cavium Networks Octeon CPU). 91*9880d681SAndroid Build Coastguard Worker bool HasCnMips; 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker // isLinux - Target system is Linux. Is false we consider ELFOS for now. 94*9880d681SAndroid Build Coastguard Worker bool IsLinux; 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker // UseSmallSection - Small section is used. 97*9880d681SAndroid Build Coastguard Worker bool UseSmallSection; 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker /// Features related to the presence of specific instructions. 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker // HasMips3_32 - The subset of MIPS-III instructions added to MIPS32 102*9880d681SAndroid Build Coastguard Worker bool HasMips3_32; 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker // HasMips3_32r2 - The subset of MIPS-III instructions added to MIPS32r2 105*9880d681SAndroid Build Coastguard Worker bool HasMips3_32r2; 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker // HasMips4_32 - Has the subset of MIPS-IV present in MIPS32 108*9880d681SAndroid Build Coastguard Worker bool HasMips4_32; 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker // HasMips4_32r2 - Has the subset of MIPS-IV present in MIPS32r2 111*9880d681SAndroid Build Coastguard Worker bool HasMips4_32r2; 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker // HasMips5_32r2 - Has the subset of MIPS-V present in MIPS32r2 114*9880d681SAndroid Build Coastguard Worker bool HasMips5_32r2; 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker // InMips16 -- can process Mips16 instructions 117*9880d681SAndroid Build Coastguard Worker bool InMips16Mode; 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker // Mips16 hard float 120*9880d681SAndroid Build Coastguard Worker bool InMips16HardFloat; 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker // PreviousInMips16 -- the function we just processed was in Mips 16 Mode 123*9880d681SAndroid Build Coastguard Worker bool PreviousInMips16Mode; 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker // InMicroMips -- can process MicroMips instructions 126*9880d681SAndroid Build Coastguard Worker bool InMicroMipsMode; 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker // HasDSP, HasDSPR2, HasDSPR3 -- supports DSP ASE. 129*9880d681SAndroid Build Coastguard Worker bool HasDSP, HasDSPR2, HasDSPR3; 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker // Allow mixed Mips16 and Mips32 in one source file 132*9880d681SAndroid Build Coastguard Worker bool AllowMixed16_32; 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker // Optimize for space by compiling all functions as Mips 16 unless 135*9880d681SAndroid Build Coastguard Worker // it needs floating point. Functions needing floating point are 136*9880d681SAndroid Build Coastguard Worker // compiled as Mips32 137*9880d681SAndroid Build Coastguard Worker bool Os16; 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Worker // HasMSA -- supports MSA ASE. 140*9880d681SAndroid Build Coastguard Worker bool HasMSA; 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker // UseTCCInDIV -- Enables the use of trapping in the assembler. 143*9880d681SAndroid Build Coastguard Worker bool UseTCCInDIV; 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker // HasEVA -- supports EVA ASE. 146*9880d681SAndroid Build Coastguard Worker bool HasEVA; 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker InstrItineraryData InstrItins; 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker // We can override the determination of whether we are in mips16 mode 151*9880d681SAndroid Build Coastguard Worker // as from the command line 152*9880d681SAndroid Build Coastguard Worker enum {NoOverride, Mips16Override, NoMips16Override} OverrideMode; 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker const MipsTargetMachine &TM; 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Worker Triple TargetTriple; 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Worker const SelectionDAGTargetInfo TSInfo; 159*9880d681SAndroid Build Coastguard Worker std::unique_ptr<const MipsInstrInfo> InstrInfo; 160*9880d681SAndroid Build Coastguard Worker std::unique_ptr<const MipsFrameLowering> FrameLowering; 161*9880d681SAndroid Build Coastguard Worker std::unique_ptr<const MipsTargetLowering> TLInfo; 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Worker public: 164*9880d681SAndroid Build Coastguard Worker bool isPositionIndependent() const; 165*9880d681SAndroid Build Coastguard Worker /// This overrides the PostRAScheduler bit in the SchedModel for each CPU. 166*9880d681SAndroid Build Coastguard Worker bool enablePostRAScheduler() const override; 167*9880d681SAndroid Build Coastguard Worker void getCriticalPathRCs(RegClassVector &CriticalPathRCs) const override; 168*9880d681SAndroid Build Coastguard Worker CodeGenOpt::Level getOptLevelToEnablePostRAScheduler() const override; 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Worker bool isABI_N64() const; 171*9880d681SAndroid Build Coastguard Worker bool isABI_N32() const; 172*9880d681SAndroid Build Coastguard Worker bool isABI_O32() const; 173*9880d681SAndroid Build Coastguard Worker const MipsABIInfo &getABI() const; isABI_FPXX()174*9880d681SAndroid Build Coastguard Worker bool isABI_FPXX() const { return isABI_O32() && IsFPXX; } 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Worker /// This constructor initializes the data members to match that 177*9880d681SAndroid Build Coastguard Worker /// of the specified triple. 178*9880d681SAndroid Build Coastguard Worker MipsSubtarget(const Triple &TT, const std::string &CPU, const std::string &FS, 179*9880d681SAndroid Build Coastguard Worker bool little, const MipsTargetMachine &TM); 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Worker /// ParseSubtargetFeatures - Parses features string setting specified 182*9880d681SAndroid Build Coastguard Worker /// subtarget options. Definition of function is auto generated by tblgen. 183*9880d681SAndroid Build Coastguard Worker void ParseSubtargetFeatures(StringRef CPU, StringRef FS); 184*9880d681SAndroid Build Coastguard Worker hasMips1()185*9880d681SAndroid Build Coastguard Worker bool hasMips1() const { return MipsArchVersion >= Mips1; } hasMips2()186*9880d681SAndroid Build Coastguard Worker bool hasMips2() const { return MipsArchVersion >= Mips2; } hasMips3()187*9880d681SAndroid Build Coastguard Worker bool hasMips3() const { return MipsArchVersion >= Mips3; } hasMips4()188*9880d681SAndroid Build Coastguard Worker bool hasMips4() const { return MipsArchVersion >= Mips4; } hasMips5()189*9880d681SAndroid Build Coastguard Worker bool hasMips5() const { return MipsArchVersion >= Mips5; } hasMips4_32()190*9880d681SAndroid Build Coastguard Worker bool hasMips4_32() const { return HasMips4_32; } hasMips4_32r2()191*9880d681SAndroid Build Coastguard Worker bool hasMips4_32r2() const { return HasMips4_32r2; } hasMips32()192*9880d681SAndroid Build Coastguard Worker bool hasMips32() const { 193*9880d681SAndroid Build Coastguard Worker return (MipsArchVersion >= Mips32 && MipsArchVersion < Mips32Max) || 194*9880d681SAndroid Build Coastguard Worker hasMips64(); 195*9880d681SAndroid Build Coastguard Worker } hasMips32r2()196*9880d681SAndroid Build Coastguard Worker bool hasMips32r2() const { 197*9880d681SAndroid Build Coastguard Worker return (MipsArchVersion >= Mips32r2 && MipsArchVersion < Mips32Max) || 198*9880d681SAndroid Build Coastguard Worker hasMips64r2(); 199*9880d681SAndroid Build Coastguard Worker } hasMips32r3()200*9880d681SAndroid Build Coastguard Worker bool hasMips32r3() const { 201*9880d681SAndroid Build Coastguard Worker return (MipsArchVersion >= Mips32r3 && MipsArchVersion < Mips32Max) || 202*9880d681SAndroid Build Coastguard Worker hasMips64r2(); 203*9880d681SAndroid Build Coastguard Worker } hasMips32r5()204*9880d681SAndroid Build Coastguard Worker bool hasMips32r5() const { 205*9880d681SAndroid Build Coastguard Worker return (MipsArchVersion >= Mips32r5 && MipsArchVersion < Mips32Max) || 206*9880d681SAndroid Build Coastguard Worker hasMips64r5(); 207*9880d681SAndroid Build Coastguard Worker } hasMips32r6()208*9880d681SAndroid Build Coastguard Worker bool hasMips32r6() const { 209*9880d681SAndroid Build Coastguard Worker return (MipsArchVersion >= Mips32r6 && MipsArchVersion < Mips32Max) || 210*9880d681SAndroid Build Coastguard Worker hasMips64r6(); 211*9880d681SAndroid Build Coastguard Worker } hasMips64()212*9880d681SAndroid Build Coastguard Worker bool hasMips64() const { return MipsArchVersion >= Mips64; } hasMips64r2()213*9880d681SAndroid Build Coastguard Worker bool hasMips64r2() const { return MipsArchVersion >= Mips64r2; } hasMips64r3()214*9880d681SAndroid Build Coastguard Worker bool hasMips64r3() const { return MipsArchVersion >= Mips64r3; } hasMips64r5()215*9880d681SAndroid Build Coastguard Worker bool hasMips64r5() const { return MipsArchVersion >= Mips64r5; } hasMips64r6()216*9880d681SAndroid Build Coastguard Worker bool hasMips64r6() const { return MipsArchVersion >= Mips64r6; } 217*9880d681SAndroid Build Coastguard Worker hasCnMips()218*9880d681SAndroid Build Coastguard Worker bool hasCnMips() const { return HasCnMips; } 219*9880d681SAndroid Build Coastguard Worker isLittle()220*9880d681SAndroid Build Coastguard Worker bool isLittle() const { return IsLittle; } isABICalls()221*9880d681SAndroid Build Coastguard Worker bool isABICalls() const { return !NoABICalls; } isFPXX()222*9880d681SAndroid Build Coastguard Worker bool isFPXX() const { return IsFPXX; } isFP64bit()223*9880d681SAndroid Build Coastguard Worker bool isFP64bit() const { return IsFP64bit; } useOddSPReg()224*9880d681SAndroid Build Coastguard Worker bool useOddSPReg() const { return UseOddSPReg; } noOddSPReg()225*9880d681SAndroid Build Coastguard Worker bool noOddSPReg() const { return !UseOddSPReg; } isNaN2008()226*9880d681SAndroid Build Coastguard Worker bool isNaN2008() const { return IsNaN2008bit; } isGP64bit()227*9880d681SAndroid Build Coastguard Worker bool isGP64bit() const { return IsGP64bit; } isGP32bit()228*9880d681SAndroid Build Coastguard Worker bool isGP32bit() const { return !IsGP64bit; } getGPRSizeInBytes()229*9880d681SAndroid Build Coastguard Worker unsigned getGPRSizeInBytes() const { return isGP64bit() ? 8 : 4; } isPTR64bit()230*9880d681SAndroid Build Coastguard Worker bool isPTR64bit() const { return IsPTR64bit; } isPTR32bit()231*9880d681SAndroid Build Coastguard Worker bool isPTR32bit() const { return !IsPTR64bit; } isSingleFloat()232*9880d681SAndroid Build Coastguard Worker bool isSingleFloat() const { return IsSingleFloat; } hasVFPU()233*9880d681SAndroid Build Coastguard Worker bool hasVFPU() const { return HasVFPU; } inMips16Mode()234*9880d681SAndroid Build Coastguard Worker bool inMips16Mode() const { return InMips16Mode; } inMips16ModeDefault()235*9880d681SAndroid Build Coastguard Worker bool inMips16ModeDefault() const { 236*9880d681SAndroid Build Coastguard Worker return InMips16Mode; 237*9880d681SAndroid Build Coastguard Worker } 238*9880d681SAndroid Build Coastguard Worker // Hard float for mips16 means essentially to compile as soft float 239*9880d681SAndroid Build Coastguard Worker // but to use a runtime library for soft float that is written with 240*9880d681SAndroid Build Coastguard Worker // native mips32 floating point instructions (those runtime routines 241*9880d681SAndroid Build Coastguard Worker // run in mips32 hard float mode). inMips16HardFloat()242*9880d681SAndroid Build Coastguard Worker bool inMips16HardFloat() const { 243*9880d681SAndroid Build Coastguard Worker return inMips16Mode() && InMips16HardFloat; 244*9880d681SAndroid Build Coastguard Worker } inMicroMipsMode()245*9880d681SAndroid Build Coastguard Worker bool inMicroMipsMode() const { return InMicroMipsMode; } inMicroMips32r6Mode()246*9880d681SAndroid Build Coastguard Worker bool inMicroMips32r6Mode() const { return InMicroMipsMode && hasMips32r6(); } inMicroMips64r6Mode()247*9880d681SAndroid Build Coastguard Worker bool inMicroMips64r6Mode() const { return InMicroMipsMode && hasMips64r6(); } hasDSP()248*9880d681SAndroid Build Coastguard Worker bool hasDSP() const { return HasDSP; } hasDSPR2()249*9880d681SAndroid Build Coastguard Worker bool hasDSPR2() const { return HasDSPR2; } hasDSPR3()250*9880d681SAndroid Build Coastguard Worker bool hasDSPR3() const { return HasDSPR3; } hasMSA()251*9880d681SAndroid Build Coastguard Worker bool hasMSA() const { return HasMSA; } hasEVA()252*9880d681SAndroid Build Coastguard Worker bool hasEVA() const { return HasEVA; } useSmallSection()253*9880d681SAndroid Build Coastguard Worker bool useSmallSection() const { return UseSmallSection; } 254*9880d681SAndroid Build Coastguard Worker hasStandardEncoding()255*9880d681SAndroid Build Coastguard Worker bool hasStandardEncoding() const { return !inMips16Mode(); } 256*9880d681SAndroid Build Coastguard Worker useSoftFloat()257*9880d681SAndroid Build Coastguard Worker bool useSoftFloat() const { return IsSoftFloat; } 258*9880d681SAndroid Build Coastguard Worker enableLongBranchPass()259*9880d681SAndroid Build Coastguard Worker bool enableLongBranchPass() const { 260*9880d681SAndroid Build Coastguard Worker return hasStandardEncoding() || allowMixed16_32(); 261*9880d681SAndroid Build Coastguard Worker } 262*9880d681SAndroid Build Coastguard Worker 263*9880d681SAndroid Build Coastguard Worker /// Features related to the presence of specific instructions. hasExtractInsert()264*9880d681SAndroid Build Coastguard Worker bool hasExtractInsert() const { return !inMips16Mode() && hasMips32r2(); } hasMTHC1()265*9880d681SAndroid Build Coastguard Worker bool hasMTHC1() const { return hasMips32r2(); } 266*9880d681SAndroid Build Coastguard Worker allowMixed16_32()267*9880d681SAndroid Build Coastguard Worker bool allowMixed16_32() const { return inMips16ModeDefault() | 268*9880d681SAndroid Build Coastguard Worker AllowMixed16_32; } 269*9880d681SAndroid Build Coastguard Worker os16()270*9880d681SAndroid Build Coastguard Worker bool os16() const { return Os16; } 271*9880d681SAndroid Build Coastguard Worker isTargetNaCl()272*9880d681SAndroid Build Coastguard Worker bool isTargetNaCl() const { return TargetTriple.isOSNaCl(); } 273*9880d681SAndroid Build Coastguard Worker 274*9880d681SAndroid Build Coastguard Worker // for now constant islands are on for the whole compilation unit but we only 275*9880d681SAndroid Build Coastguard Worker // really use them if in addition we are in mips16 mode 276*9880d681SAndroid Build Coastguard Worker static bool useConstantIslands(); 277*9880d681SAndroid Build Coastguard Worker stackAlignment()278*9880d681SAndroid Build Coastguard Worker unsigned stackAlignment() const { return hasMips64() ? 16 : 8; } 279*9880d681SAndroid Build Coastguard Worker 280*9880d681SAndroid Build Coastguard Worker // Grab relocation model 281*9880d681SAndroid Build Coastguard Worker Reloc::Model getRelocationModel() const; 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Worker MipsSubtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS, 284*9880d681SAndroid Build Coastguard Worker const TargetMachine &TM); 285*9880d681SAndroid Build Coastguard Worker 286*9880d681SAndroid Build Coastguard Worker /// Does the system support unaligned memory access. 287*9880d681SAndroid Build Coastguard Worker /// 288*9880d681SAndroid Build Coastguard Worker /// MIPS32r6/MIPS64r6 require full unaligned access support but does not 289*9880d681SAndroid Build Coastguard Worker /// specify which component of the system provides it. Hardware, software, and 290*9880d681SAndroid Build Coastguard Worker /// hybrid implementations are all valid. systemSupportsUnalignedAccess()291*9880d681SAndroid Build Coastguard Worker bool systemSupportsUnalignedAccess() const { return hasMips32r6(); } 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Worker // Set helper classes 294*9880d681SAndroid Build Coastguard Worker void setHelperClassesMips16(); 295*9880d681SAndroid Build Coastguard Worker void setHelperClassesMipsSE(); 296*9880d681SAndroid Build Coastguard Worker getSelectionDAGInfo()297*9880d681SAndroid Build Coastguard Worker const SelectionDAGTargetInfo *getSelectionDAGInfo() const override { 298*9880d681SAndroid Build Coastguard Worker return &TSInfo; 299*9880d681SAndroid Build Coastguard Worker } getInstrInfo()300*9880d681SAndroid Build Coastguard Worker const MipsInstrInfo *getInstrInfo() const override { return InstrInfo.get(); } getFrameLowering()301*9880d681SAndroid Build Coastguard Worker const TargetFrameLowering *getFrameLowering() const override { 302*9880d681SAndroid Build Coastguard Worker return FrameLowering.get(); 303*9880d681SAndroid Build Coastguard Worker } getRegisterInfo()304*9880d681SAndroid Build Coastguard Worker const MipsRegisterInfo *getRegisterInfo() const override { 305*9880d681SAndroid Build Coastguard Worker return &InstrInfo->getRegisterInfo(); 306*9880d681SAndroid Build Coastguard Worker } getTargetLowering()307*9880d681SAndroid Build Coastguard Worker const MipsTargetLowering *getTargetLowering() const override { 308*9880d681SAndroid Build Coastguard Worker return TLInfo.get(); 309*9880d681SAndroid Build Coastguard Worker } getInstrItineraryData()310*9880d681SAndroid Build Coastguard Worker const InstrItineraryData *getInstrItineraryData() const override { 311*9880d681SAndroid Build Coastguard Worker return &InstrItins; 312*9880d681SAndroid Build Coastguard Worker } 313*9880d681SAndroid Build Coastguard Worker }; 314*9880d681SAndroid Build Coastguard Worker } // End llvm namespace 315*9880d681SAndroid Build Coastguard Worker 316*9880d681SAndroid Build Coastguard Worker #endif 317