xref: /aosp_15_r20/external/llvm/lib/Target/Mips/MipsSubtarget.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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