xref: /aosp_15_r20/external/llvm/lib/Target/PowerPC/PPCSubtarget.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- PPCSubtarget.h - Define Subtarget for the PPC ----------*- 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 PowerPC 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_POWERPC_PPCSUBTARGET_H
15*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_POWERPC_PPCSUBTARGET_H
16*9880d681SAndroid Build Coastguard Worker 
17*9880d681SAndroid Build Coastguard Worker #include "PPCFrameLowering.h"
18*9880d681SAndroid Build Coastguard Worker #include "PPCISelLowering.h"
19*9880d681SAndroid Build Coastguard Worker #include "PPCInstrInfo.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Triple.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/Target/TargetSubtargetInfo.h"
25*9880d681SAndroid Build Coastguard Worker #include <string>
26*9880d681SAndroid Build Coastguard Worker 
27*9880d681SAndroid Build Coastguard Worker #define GET_SUBTARGETINFO_HEADER
28*9880d681SAndroid Build Coastguard Worker #include "PPCGenSubtargetInfo.inc"
29*9880d681SAndroid Build Coastguard Worker 
30*9880d681SAndroid Build Coastguard Worker // GCC #defines PPC on Linux but we use it as our namespace name
31*9880d681SAndroid Build Coastguard Worker #undef PPC
32*9880d681SAndroid Build Coastguard Worker 
33*9880d681SAndroid Build Coastguard Worker namespace llvm {
34*9880d681SAndroid Build Coastguard Worker class StringRef;
35*9880d681SAndroid Build Coastguard Worker 
36*9880d681SAndroid Build Coastguard Worker namespace PPC {
37*9880d681SAndroid Build Coastguard Worker   // -m directive values.
38*9880d681SAndroid Build Coastguard Worker   enum {
39*9880d681SAndroid Build Coastguard Worker     DIR_NONE,
40*9880d681SAndroid Build Coastguard Worker     DIR_32,
41*9880d681SAndroid Build Coastguard Worker     DIR_440,
42*9880d681SAndroid Build Coastguard Worker     DIR_601,
43*9880d681SAndroid Build Coastguard Worker     DIR_602,
44*9880d681SAndroid Build Coastguard Worker     DIR_603,
45*9880d681SAndroid Build Coastguard Worker     DIR_7400,
46*9880d681SAndroid Build Coastguard Worker     DIR_750,
47*9880d681SAndroid Build Coastguard Worker     DIR_970,
48*9880d681SAndroid Build Coastguard Worker     DIR_A2,
49*9880d681SAndroid Build Coastguard Worker     DIR_E500mc,
50*9880d681SAndroid Build Coastguard Worker     DIR_E5500,
51*9880d681SAndroid Build Coastguard Worker     DIR_PWR3,
52*9880d681SAndroid Build Coastguard Worker     DIR_PWR4,
53*9880d681SAndroid Build Coastguard Worker     DIR_PWR5,
54*9880d681SAndroid Build Coastguard Worker     DIR_PWR5X,
55*9880d681SAndroid Build Coastguard Worker     DIR_PWR6,
56*9880d681SAndroid Build Coastguard Worker     DIR_PWR6X,
57*9880d681SAndroid Build Coastguard Worker     DIR_PWR7,
58*9880d681SAndroid Build Coastguard Worker     DIR_PWR8,
59*9880d681SAndroid Build Coastguard Worker     DIR_PWR9,
60*9880d681SAndroid Build Coastguard Worker     DIR_64
61*9880d681SAndroid Build Coastguard Worker   };
62*9880d681SAndroid Build Coastguard Worker }
63*9880d681SAndroid Build Coastguard Worker 
64*9880d681SAndroid Build Coastguard Worker class GlobalValue;
65*9880d681SAndroid Build Coastguard Worker class TargetMachine;
66*9880d681SAndroid Build Coastguard Worker 
67*9880d681SAndroid Build Coastguard Worker class PPCSubtarget : public PPCGenSubtargetInfo {
68*9880d681SAndroid Build Coastguard Worker public:
69*9880d681SAndroid Build Coastguard Worker   enum POPCNTDKind {
70*9880d681SAndroid Build Coastguard Worker     POPCNTD_Unavailable,
71*9880d681SAndroid Build Coastguard Worker     POPCNTD_Slow,
72*9880d681SAndroid Build Coastguard Worker     POPCNTD_Fast
73*9880d681SAndroid Build Coastguard Worker   };
74*9880d681SAndroid Build Coastguard Worker 
75*9880d681SAndroid Build Coastguard Worker protected:
76*9880d681SAndroid Build Coastguard Worker   /// TargetTriple - What processor and OS we're targeting.
77*9880d681SAndroid Build Coastguard Worker   Triple TargetTriple;
78*9880d681SAndroid Build Coastguard Worker 
79*9880d681SAndroid Build Coastguard Worker   /// stackAlignment - The minimum alignment known to hold of the stack frame on
80*9880d681SAndroid Build Coastguard Worker   /// entry to the function and which must be maintained by every function.
81*9880d681SAndroid Build Coastguard Worker   unsigned StackAlignment;
82*9880d681SAndroid Build Coastguard Worker 
83*9880d681SAndroid Build Coastguard Worker   /// Selected instruction itineraries (one entry per itinerary class.)
84*9880d681SAndroid Build Coastguard Worker   InstrItineraryData InstrItins;
85*9880d681SAndroid Build Coastguard Worker 
86*9880d681SAndroid Build Coastguard Worker   /// Which cpu directive was used.
87*9880d681SAndroid Build Coastguard Worker   unsigned DarwinDirective;
88*9880d681SAndroid Build Coastguard Worker 
89*9880d681SAndroid Build Coastguard Worker   /// Used by the ISel to turn in optimizations for POWER4-derived architectures
90*9880d681SAndroid Build Coastguard Worker   bool HasMFOCRF;
91*9880d681SAndroid Build Coastguard Worker   bool Has64BitSupport;
92*9880d681SAndroid Build Coastguard Worker   bool Use64BitRegs;
93*9880d681SAndroid Build Coastguard Worker   bool UseCRBits;
94*9880d681SAndroid Build Coastguard Worker   bool UseSoftFloat;
95*9880d681SAndroid Build Coastguard Worker   bool IsPPC64;
96*9880d681SAndroid Build Coastguard Worker   bool HasAltivec;
97*9880d681SAndroid Build Coastguard Worker   bool HasSPE;
98*9880d681SAndroid Build Coastguard Worker   bool HasQPX;
99*9880d681SAndroid Build Coastguard Worker   bool HasVSX;
100*9880d681SAndroid Build Coastguard Worker   bool HasP8Vector;
101*9880d681SAndroid Build Coastguard Worker   bool HasP8Altivec;
102*9880d681SAndroid Build Coastguard Worker   bool HasP8Crypto;
103*9880d681SAndroid Build Coastguard Worker   bool HasP9Vector;
104*9880d681SAndroid Build Coastguard Worker   bool HasP9Altivec;
105*9880d681SAndroid Build Coastguard Worker   bool HasFCPSGN;
106*9880d681SAndroid Build Coastguard Worker   bool HasFSQRT;
107*9880d681SAndroid Build Coastguard Worker   bool HasFRE, HasFRES, HasFRSQRTE, HasFRSQRTES;
108*9880d681SAndroid Build Coastguard Worker   bool HasRecipPrec;
109*9880d681SAndroid Build Coastguard Worker   bool HasSTFIWX;
110*9880d681SAndroid Build Coastguard Worker   bool HasLFIWAX;
111*9880d681SAndroid Build Coastguard Worker   bool HasFPRND;
112*9880d681SAndroid Build Coastguard Worker   bool HasFPCVT;
113*9880d681SAndroid Build Coastguard Worker   bool HasISEL;
114*9880d681SAndroid Build Coastguard Worker   bool HasBPERMD;
115*9880d681SAndroid Build Coastguard Worker   bool HasExtDiv;
116*9880d681SAndroid Build Coastguard Worker   bool HasCMPB;
117*9880d681SAndroid Build Coastguard Worker   bool HasLDBRX;
118*9880d681SAndroid Build Coastguard Worker   bool IsBookE;
119*9880d681SAndroid Build Coastguard Worker   bool HasOnlyMSYNC;
120*9880d681SAndroid Build Coastguard Worker   bool IsE500;
121*9880d681SAndroid Build Coastguard Worker   bool IsPPC4xx;
122*9880d681SAndroid Build Coastguard Worker   bool IsPPC6xx;
123*9880d681SAndroid Build Coastguard Worker   bool FeatureMFTB;
124*9880d681SAndroid Build Coastguard Worker   bool DeprecatedDST;
125*9880d681SAndroid Build Coastguard Worker   bool HasLazyResolverStubs;
126*9880d681SAndroid Build Coastguard Worker   bool IsLittleEndian;
127*9880d681SAndroid Build Coastguard Worker   bool HasICBT;
128*9880d681SAndroid Build Coastguard Worker   bool HasInvariantFunctionDescriptors;
129*9880d681SAndroid Build Coastguard Worker   bool HasPartwordAtomics;
130*9880d681SAndroid Build Coastguard Worker   bool HasDirectMove;
131*9880d681SAndroid Build Coastguard Worker   bool HasHTM;
132*9880d681SAndroid Build Coastguard Worker   bool HasFusion;
133*9880d681SAndroid Build Coastguard Worker   bool HasFloat128;
134*9880d681SAndroid Build Coastguard Worker   bool IsISA3_0;
135*9880d681SAndroid Build Coastguard Worker 
136*9880d681SAndroid Build Coastguard Worker   POPCNTDKind HasPOPCNTD;
137*9880d681SAndroid Build Coastguard Worker 
138*9880d681SAndroid Build Coastguard Worker   /// When targeting QPX running a stock PPC64 Linux kernel where the stack
139*9880d681SAndroid Build Coastguard Worker   /// alignment has not been changed, we need to keep the 16-byte alignment
140*9880d681SAndroid Build Coastguard Worker   /// of the stack.
141*9880d681SAndroid Build Coastguard Worker   bool IsQPXStackUnaligned;
142*9880d681SAndroid Build Coastguard Worker 
143*9880d681SAndroid Build Coastguard Worker   const PPCTargetMachine &TM;
144*9880d681SAndroid Build Coastguard Worker   PPCFrameLowering FrameLowering;
145*9880d681SAndroid Build Coastguard Worker   PPCInstrInfo InstrInfo;
146*9880d681SAndroid Build Coastguard Worker   PPCTargetLowering TLInfo;
147*9880d681SAndroid Build Coastguard Worker   SelectionDAGTargetInfo TSInfo;
148*9880d681SAndroid Build Coastguard Worker 
149*9880d681SAndroid Build Coastguard Worker public:
150*9880d681SAndroid Build Coastguard Worker   /// This constructor initializes the data members to match that
151*9880d681SAndroid Build Coastguard Worker   /// of the specified triple.
152*9880d681SAndroid Build Coastguard Worker   ///
153*9880d681SAndroid Build Coastguard Worker   PPCSubtarget(const Triple &TT, const std::string &CPU, const std::string &FS,
154*9880d681SAndroid Build Coastguard Worker                const PPCTargetMachine &TM);
155*9880d681SAndroid Build Coastguard Worker 
156*9880d681SAndroid Build Coastguard Worker   /// ParseSubtargetFeatures - Parses features string setting specified
157*9880d681SAndroid Build Coastguard Worker   /// subtarget options.  Definition of function is auto generated by tblgen.
158*9880d681SAndroid Build Coastguard Worker   void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
159*9880d681SAndroid Build Coastguard Worker 
160*9880d681SAndroid Build Coastguard Worker   /// getStackAlignment - Returns the minimum alignment known to hold of the
161*9880d681SAndroid Build Coastguard Worker   /// stack frame on entry to the function and which must be maintained by every
162*9880d681SAndroid Build Coastguard Worker   /// function for this subtarget.
getStackAlignment()163*9880d681SAndroid Build Coastguard Worker   unsigned getStackAlignment() const { return StackAlignment; }
164*9880d681SAndroid Build Coastguard Worker 
165*9880d681SAndroid Build Coastguard Worker   /// getDarwinDirective - Returns the -m directive specified for the cpu.
166*9880d681SAndroid Build Coastguard Worker   ///
getDarwinDirective()167*9880d681SAndroid Build Coastguard Worker   unsigned getDarwinDirective() const { return DarwinDirective; }
168*9880d681SAndroid Build Coastguard Worker 
169*9880d681SAndroid Build Coastguard Worker   /// getInstrItins - Return the instruction itineraries based on subtarget
170*9880d681SAndroid Build Coastguard Worker   /// selection.
getInstrItineraryData()171*9880d681SAndroid Build Coastguard Worker   const InstrItineraryData *getInstrItineraryData() const override {
172*9880d681SAndroid Build Coastguard Worker     return &InstrItins;
173*9880d681SAndroid Build Coastguard Worker   }
174*9880d681SAndroid Build Coastguard Worker 
getFrameLowering()175*9880d681SAndroid Build Coastguard Worker   const PPCFrameLowering *getFrameLowering() const override {
176*9880d681SAndroid Build Coastguard Worker     return &FrameLowering;
177*9880d681SAndroid Build Coastguard Worker   }
getInstrInfo()178*9880d681SAndroid Build Coastguard Worker   const PPCInstrInfo *getInstrInfo() const override { return &InstrInfo; }
getTargetLowering()179*9880d681SAndroid Build Coastguard Worker   const PPCTargetLowering *getTargetLowering() const override {
180*9880d681SAndroid Build Coastguard Worker     return &TLInfo;
181*9880d681SAndroid Build Coastguard Worker   }
getSelectionDAGInfo()182*9880d681SAndroid Build Coastguard Worker   const SelectionDAGTargetInfo *getSelectionDAGInfo() const override {
183*9880d681SAndroid Build Coastguard Worker     return &TSInfo;
184*9880d681SAndroid Build Coastguard Worker   }
getRegisterInfo()185*9880d681SAndroid Build Coastguard Worker   const PPCRegisterInfo *getRegisterInfo() const override {
186*9880d681SAndroid Build Coastguard Worker     return &getInstrInfo()->getRegisterInfo();
187*9880d681SAndroid Build Coastguard Worker   }
getTargetMachine()188*9880d681SAndroid Build Coastguard Worker   const PPCTargetMachine &getTargetMachine() const { return TM; }
189*9880d681SAndroid Build Coastguard Worker 
190*9880d681SAndroid Build Coastguard Worker   /// initializeSubtargetDependencies - Initializes using a CPU and feature string
191*9880d681SAndroid Build Coastguard Worker   /// so that we can use initializer lists for subtarget initialization.
192*9880d681SAndroid Build Coastguard Worker   PPCSubtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS);
193*9880d681SAndroid Build Coastguard Worker 
194*9880d681SAndroid Build Coastguard Worker private:
195*9880d681SAndroid Build Coastguard Worker   void initializeEnvironment();
196*9880d681SAndroid Build Coastguard Worker   void initSubtargetFeatures(StringRef CPU, StringRef FS);
197*9880d681SAndroid Build Coastguard Worker 
198*9880d681SAndroid Build Coastguard Worker public:
199*9880d681SAndroid Build Coastguard Worker   /// isPPC64 - Return true if we are generating code for 64-bit pointer mode.
200*9880d681SAndroid Build Coastguard Worker   ///
201*9880d681SAndroid Build Coastguard Worker   bool isPPC64() const;
202*9880d681SAndroid Build Coastguard Worker 
203*9880d681SAndroid Build Coastguard Worker   /// has64BitSupport - Return true if the selected CPU supports 64-bit
204*9880d681SAndroid Build Coastguard Worker   /// instructions, regardless of whether we are in 32-bit or 64-bit mode.
has64BitSupport()205*9880d681SAndroid Build Coastguard Worker   bool has64BitSupport() const { return Has64BitSupport; }
206*9880d681SAndroid Build Coastguard Worker   // useSoftFloat - Return true if soft-float option is turned on.
useSoftFloat()207*9880d681SAndroid Build Coastguard Worker   bool useSoftFloat() const { return UseSoftFloat; }
208*9880d681SAndroid Build Coastguard Worker 
209*9880d681SAndroid Build Coastguard Worker   /// use64BitRegs - Return true if in 64-bit mode or if we should use 64-bit
210*9880d681SAndroid Build Coastguard Worker   /// registers in 32-bit mode when possible.  This can only true if
211*9880d681SAndroid Build Coastguard Worker   /// has64BitSupport() returns true.
use64BitRegs()212*9880d681SAndroid Build Coastguard Worker   bool use64BitRegs() const { return Use64BitRegs; }
213*9880d681SAndroid Build Coastguard Worker 
214*9880d681SAndroid Build Coastguard Worker   /// useCRBits - Return true if we should store and manipulate i1 values in
215*9880d681SAndroid Build Coastguard Worker   /// the individual condition register bits.
useCRBits()216*9880d681SAndroid Build Coastguard Worker   bool useCRBits() const { return UseCRBits; }
217*9880d681SAndroid Build Coastguard Worker 
218*9880d681SAndroid Build Coastguard Worker   /// hasLazyResolverStub - Return true if accesses to the specified global have
219*9880d681SAndroid Build Coastguard Worker   /// to go through a dyld lazy resolution stub.  This means that an extra load
220*9880d681SAndroid Build Coastguard Worker   /// is required to get the address of the global.
221*9880d681SAndroid Build Coastguard Worker   bool hasLazyResolverStub(const GlobalValue *GV) const;
222*9880d681SAndroid Build Coastguard Worker 
223*9880d681SAndroid Build Coastguard Worker   // isLittleEndian - True if generating little-endian code
isLittleEndian()224*9880d681SAndroid Build Coastguard Worker   bool isLittleEndian() const { return IsLittleEndian; }
225*9880d681SAndroid Build Coastguard Worker 
226*9880d681SAndroid Build Coastguard Worker   // Specific obvious features.
hasFCPSGN()227*9880d681SAndroid Build Coastguard Worker   bool hasFCPSGN() const { return HasFCPSGN; }
hasFSQRT()228*9880d681SAndroid Build Coastguard Worker   bool hasFSQRT() const { return HasFSQRT; }
hasFRE()229*9880d681SAndroid Build Coastguard Worker   bool hasFRE() const { return HasFRE; }
hasFRES()230*9880d681SAndroid Build Coastguard Worker   bool hasFRES() const { return HasFRES; }
hasFRSQRTE()231*9880d681SAndroid Build Coastguard Worker   bool hasFRSQRTE() const { return HasFRSQRTE; }
hasFRSQRTES()232*9880d681SAndroid Build Coastguard Worker   bool hasFRSQRTES() const { return HasFRSQRTES; }
hasRecipPrec()233*9880d681SAndroid Build Coastguard Worker   bool hasRecipPrec() const { return HasRecipPrec; }
hasSTFIWX()234*9880d681SAndroid Build Coastguard Worker   bool hasSTFIWX() const { return HasSTFIWX; }
hasLFIWAX()235*9880d681SAndroid Build Coastguard Worker   bool hasLFIWAX() const { return HasLFIWAX; }
hasFPRND()236*9880d681SAndroid Build Coastguard Worker   bool hasFPRND() const { return HasFPRND; }
hasFPCVT()237*9880d681SAndroid Build Coastguard Worker   bool hasFPCVT() const { return HasFPCVT; }
hasAltivec()238*9880d681SAndroid Build Coastguard Worker   bool hasAltivec() const { return HasAltivec; }
hasSPE()239*9880d681SAndroid Build Coastguard Worker   bool hasSPE() const { return HasSPE; }
hasQPX()240*9880d681SAndroid Build Coastguard Worker   bool hasQPX() const { return HasQPX; }
hasVSX()241*9880d681SAndroid Build Coastguard Worker   bool hasVSX() const { return HasVSX; }
hasP8Vector()242*9880d681SAndroid Build Coastguard Worker   bool hasP8Vector() const { return HasP8Vector; }
hasP8Altivec()243*9880d681SAndroid Build Coastguard Worker   bool hasP8Altivec() const { return HasP8Altivec; }
hasP8Crypto()244*9880d681SAndroid Build Coastguard Worker   bool hasP8Crypto() const { return HasP8Crypto; }
hasP9Vector()245*9880d681SAndroid Build Coastguard Worker   bool hasP9Vector() const { return HasP9Vector; }
hasP9Altivec()246*9880d681SAndroid Build Coastguard Worker   bool hasP9Altivec() const { return HasP9Altivec; }
hasMFOCRF()247*9880d681SAndroid Build Coastguard Worker   bool hasMFOCRF() const { return HasMFOCRF; }
hasISEL()248*9880d681SAndroid Build Coastguard Worker   bool hasISEL() const { return HasISEL; }
hasBPERMD()249*9880d681SAndroid Build Coastguard Worker   bool hasBPERMD() const { return HasBPERMD; }
hasExtDiv()250*9880d681SAndroid Build Coastguard Worker   bool hasExtDiv() const { return HasExtDiv; }
hasCMPB()251*9880d681SAndroid Build Coastguard Worker   bool hasCMPB() const { return HasCMPB; }
hasLDBRX()252*9880d681SAndroid Build Coastguard Worker   bool hasLDBRX() const { return HasLDBRX; }
isBookE()253*9880d681SAndroid Build Coastguard Worker   bool isBookE() const { return IsBookE; }
hasOnlyMSYNC()254*9880d681SAndroid Build Coastguard Worker   bool hasOnlyMSYNC() const { return HasOnlyMSYNC; }
isPPC4xx()255*9880d681SAndroid Build Coastguard Worker   bool isPPC4xx() const { return IsPPC4xx; }
isPPC6xx()256*9880d681SAndroid Build Coastguard Worker   bool isPPC6xx() const { return IsPPC6xx; }
isE500()257*9880d681SAndroid Build Coastguard Worker   bool isE500() const { return IsE500; }
isFeatureMFTB()258*9880d681SAndroid Build Coastguard Worker   bool isFeatureMFTB() const { return FeatureMFTB; }
isDeprecatedDST()259*9880d681SAndroid Build Coastguard Worker   bool isDeprecatedDST() const { return DeprecatedDST; }
hasICBT()260*9880d681SAndroid Build Coastguard Worker   bool hasICBT() const { return HasICBT; }
hasInvariantFunctionDescriptors()261*9880d681SAndroid Build Coastguard Worker   bool hasInvariantFunctionDescriptors() const {
262*9880d681SAndroid Build Coastguard Worker     return HasInvariantFunctionDescriptors;
263*9880d681SAndroid Build Coastguard Worker   }
hasPartwordAtomics()264*9880d681SAndroid Build Coastguard Worker   bool hasPartwordAtomics() const { return HasPartwordAtomics; }
hasDirectMove()265*9880d681SAndroid Build Coastguard Worker   bool hasDirectMove() const { return HasDirectMove; }
266*9880d681SAndroid Build Coastguard Worker 
isQPXStackUnaligned()267*9880d681SAndroid Build Coastguard Worker   bool isQPXStackUnaligned() const { return IsQPXStackUnaligned; }
getPlatformStackAlignment()268*9880d681SAndroid Build Coastguard Worker   unsigned getPlatformStackAlignment() const {
269*9880d681SAndroid Build Coastguard Worker     if ((hasQPX() || isBGQ()) && !isQPXStackUnaligned())
270*9880d681SAndroid Build Coastguard Worker       return 32;
271*9880d681SAndroid Build Coastguard Worker 
272*9880d681SAndroid Build Coastguard Worker     return 16;
273*9880d681SAndroid Build Coastguard Worker   }
hasHTM()274*9880d681SAndroid Build Coastguard Worker   bool hasHTM() const { return HasHTM; }
hasFusion()275*9880d681SAndroid Build Coastguard Worker   bool hasFusion() const { return HasFusion; }
hasFloat128()276*9880d681SAndroid Build Coastguard Worker   bool hasFloat128() const { return HasFloat128; }
isISA3_0()277*9880d681SAndroid Build Coastguard Worker   bool isISA3_0() const { return IsISA3_0; }
278*9880d681SAndroid Build Coastguard Worker 
hasPOPCNTD()279*9880d681SAndroid Build Coastguard Worker   POPCNTDKind hasPOPCNTD() const { return HasPOPCNTD; }
280*9880d681SAndroid Build Coastguard Worker 
getTargetTriple()281*9880d681SAndroid Build Coastguard Worker   const Triple &getTargetTriple() const { return TargetTriple; }
282*9880d681SAndroid Build Coastguard Worker 
283*9880d681SAndroid Build Coastguard Worker   /// isDarwin - True if this is any darwin platform.
isDarwin()284*9880d681SAndroid Build Coastguard Worker   bool isDarwin() const { return TargetTriple.isMacOSX(); }
285*9880d681SAndroid Build Coastguard Worker   /// isBGQ - True if this is a BG/Q platform.
isBGQ()286*9880d681SAndroid Build Coastguard Worker   bool isBGQ() const { return TargetTriple.getVendor() == Triple::BGQ; }
287*9880d681SAndroid Build Coastguard Worker 
isTargetELF()288*9880d681SAndroid Build Coastguard Worker   bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); }
isTargetMachO()289*9880d681SAndroid Build Coastguard Worker   bool isTargetMachO() const { return TargetTriple.isOSBinFormatMachO(); }
isTargetLinux()290*9880d681SAndroid Build Coastguard Worker   bool isTargetLinux() const { return TargetTriple.isOSLinux(); }
291*9880d681SAndroid Build Coastguard Worker 
isDarwinABI()292*9880d681SAndroid Build Coastguard Worker   bool isDarwinABI() const { return isTargetMachO() || isDarwin(); }
isSVR4ABI()293*9880d681SAndroid Build Coastguard Worker   bool isSVR4ABI() const { return !isDarwinABI(); }
294*9880d681SAndroid Build Coastguard Worker   bool isELFv2ABI() const;
295*9880d681SAndroid Build Coastguard Worker 
enableEarlyIfConversion()296*9880d681SAndroid Build Coastguard Worker   bool enableEarlyIfConversion() const override { return hasISEL(); }
297*9880d681SAndroid Build Coastguard Worker 
298*9880d681SAndroid Build Coastguard Worker   // Scheduling customization.
299*9880d681SAndroid Build Coastguard Worker   bool enableMachineScheduler() const override;
300*9880d681SAndroid Build Coastguard Worker   // This overrides the PostRAScheduler bit in the SchedModel for each CPU.
301*9880d681SAndroid Build Coastguard Worker   bool enablePostRAScheduler() const override;
302*9880d681SAndroid Build Coastguard Worker   AntiDepBreakMode getAntiDepBreakMode() const override;
303*9880d681SAndroid Build Coastguard Worker   void getCriticalPathRCs(RegClassVector &CriticalPathRCs) const override;
304*9880d681SAndroid Build Coastguard Worker 
305*9880d681SAndroid Build Coastguard Worker   void overrideSchedPolicy(MachineSchedPolicy &Policy,
306*9880d681SAndroid Build Coastguard Worker                            unsigned NumRegionInstrs) const override;
307*9880d681SAndroid Build Coastguard Worker   bool useAA() const override;
308*9880d681SAndroid Build Coastguard Worker 
309*9880d681SAndroid Build Coastguard Worker   bool enableSubRegLiveness() const override;
310*9880d681SAndroid Build Coastguard Worker 
311*9880d681SAndroid Build Coastguard Worker   /// classifyGlobalReference - Classify a global variable reference for the
312*9880d681SAndroid Build Coastguard Worker   /// current subtarget accourding to how we should reference it.
313*9880d681SAndroid Build Coastguard Worker   unsigned char classifyGlobalReference(const GlobalValue *GV) const;
314*9880d681SAndroid Build Coastguard Worker };
315*9880d681SAndroid Build Coastguard Worker } // End llvm namespace
316*9880d681SAndroid Build Coastguard Worker 
317*9880d681SAndroid Build Coastguard Worker #endif
318