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