106f32e7eSjoerg //===-- PPCSubtarget.h - Define Subtarget for the PPC ----------*- C++ -*--===// 206f32e7eSjoerg // 306f32e7eSjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 406f32e7eSjoerg // See https://llvm.org/LICENSE.txt for license information. 506f32e7eSjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 606f32e7eSjoerg // 706f32e7eSjoerg //===----------------------------------------------------------------------===// 806f32e7eSjoerg // 906f32e7eSjoerg // This file declares the PowerPC specific subclass of TargetSubtargetInfo. 1006f32e7eSjoerg // 1106f32e7eSjoerg //===----------------------------------------------------------------------===// 1206f32e7eSjoerg 1306f32e7eSjoerg #ifndef LLVM_LIB_TARGET_POWERPC_PPCSUBTARGET_H 1406f32e7eSjoerg #define LLVM_LIB_TARGET_POWERPC_PPCSUBTARGET_H 1506f32e7eSjoerg 1606f32e7eSjoerg #include "PPCFrameLowering.h" 1706f32e7eSjoerg #include "PPCISelLowering.h" 1806f32e7eSjoerg #include "PPCInstrInfo.h" 1906f32e7eSjoerg #include "llvm/ADT/Triple.h" 20*da58b97aSjoerg #include "llvm/CodeGen/GlobalISel/CallLowering.h" 21*da58b97aSjoerg #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h" 22*da58b97aSjoerg #include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h" 2306f32e7eSjoerg #include "llvm/CodeGen/SelectionDAGTargetInfo.h" 2406f32e7eSjoerg #include "llvm/CodeGen/TargetSubtargetInfo.h" 2506f32e7eSjoerg #include "llvm/IR/DataLayout.h" 2606f32e7eSjoerg #include "llvm/MC/MCInstrItineraries.h" 2706f32e7eSjoerg #include <string> 2806f32e7eSjoerg 2906f32e7eSjoerg #define GET_SUBTARGETINFO_HEADER 3006f32e7eSjoerg #include "PPCGenSubtargetInfo.inc" 3106f32e7eSjoerg 3206f32e7eSjoerg // GCC #defines PPC on Linux but we use it as our namespace name 3306f32e7eSjoerg #undef PPC 3406f32e7eSjoerg 3506f32e7eSjoerg namespace llvm { 3606f32e7eSjoerg class StringRef; 3706f32e7eSjoerg 3806f32e7eSjoerg namespace PPC { 3906f32e7eSjoerg // -m directive values. 4006f32e7eSjoerg enum { 4106f32e7eSjoerg DIR_NONE, 4206f32e7eSjoerg DIR_32, 4306f32e7eSjoerg DIR_440, 4406f32e7eSjoerg DIR_601, 4506f32e7eSjoerg DIR_602, 4606f32e7eSjoerg DIR_603, 4706f32e7eSjoerg DIR_7400, 4806f32e7eSjoerg DIR_750, 4906f32e7eSjoerg DIR_970, 5006f32e7eSjoerg DIR_A2, 5106f32e7eSjoerg DIR_E500, 5206f32e7eSjoerg DIR_E500mc, 5306f32e7eSjoerg DIR_E5500, 5406f32e7eSjoerg DIR_PWR3, 5506f32e7eSjoerg DIR_PWR4, 5606f32e7eSjoerg DIR_PWR5, 5706f32e7eSjoerg DIR_PWR5X, 5806f32e7eSjoerg DIR_PWR6, 5906f32e7eSjoerg DIR_PWR6X, 6006f32e7eSjoerg DIR_PWR7, 6106f32e7eSjoerg DIR_PWR8, 6206f32e7eSjoerg DIR_PWR9, 63*da58b97aSjoerg DIR_PWR10, 64*da58b97aSjoerg DIR_PWR_FUTURE, 6506f32e7eSjoerg DIR_64 6606f32e7eSjoerg }; 6706f32e7eSjoerg } 6806f32e7eSjoerg 6906f32e7eSjoerg class GlobalValue; 7006f32e7eSjoerg 7106f32e7eSjoerg class PPCSubtarget : public PPCGenSubtargetInfo { 7206f32e7eSjoerg public: 7306f32e7eSjoerg enum POPCNTDKind { 7406f32e7eSjoerg POPCNTD_Unavailable, 7506f32e7eSjoerg POPCNTD_Slow, 7606f32e7eSjoerg POPCNTD_Fast 7706f32e7eSjoerg }; 7806f32e7eSjoerg 7906f32e7eSjoerg protected: 8006f32e7eSjoerg /// TargetTriple - What processor and OS we're targeting. 8106f32e7eSjoerg Triple TargetTriple; 8206f32e7eSjoerg 8306f32e7eSjoerg /// stackAlignment - The minimum alignment known to hold of the stack frame on 8406f32e7eSjoerg /// entry to the function and which must be maintained by every function. 8506f32e7eSjoerg Align StackAlignment; 8606f32e7eSjoerg 8706f32e7eSjoerg /// Selected instruction itineraries (one entry per itinerary class.) 8806f32e7eSjoerg InstrItineraryData InstrItins; 8906f32e7eSjoerg 9006f32e7eSjoerg /// Which cpu directive was used. 91*da58b97aSjoerg unsigned CPUDirective; 9206f32e7eSjoerg 9306f32e7eSjoerg /// Used by the ISel to turn in optimizations for POWER4-derived architectures 9406f32e7eSjoerg bool HasMFOCRF; 9506f32e7eSjoerg bool Has64BitSupport; 9606f32e7eSjoerg bool Use64BitRegs; 9706f32e7eSjoerg bool UseCRBits; 9806f32e7eSjoerg bool HasHardFloat; 9906f32e7eSjoerg bool IsPPC64; 10006f32e7eSjoerg bool HasAltivec; 10106f32e7eSjoerg bool HasFPU; 10206f32e7eSjoerg bool HasSPE; 103*da58b97aSjoerg bool HasEFPU2; 10406f32e7eSjoerg bool HasVSX; 10506f32e7eSjoerg bool NeedsTwoConstNR; 10606f32e7eSjoerg bool HasP8Vector; 10706f32e7eSjoerg bool HasP8Altivec; 10806f32e7eSjoerg bool HasP8Crypto; 10906f32e7eSjoerg bool HasP9Vector; 11006f32e7eSjoerg bool HasP9Altivec; 111*da58b97aSjoerg bool HasP10Vector; 112*da58b97aSjoerg bool HasPrefixInstrs; 113*da58b97aSjoerg bool HasPCRelativeMemops; 114*da58b97aSjoerg bool HasMMA; 115*da58b97aSjoerg bool HasROPProtect; 116*da58b97aSjoerg bool HasPrivileged; 11706f32e7eSjoerg bool HasFCPSGN; 11806f32e7eSjoerg bool HasFSQRT; 11906f32e7eSjoerg bool HasFRE, HasFRES, HasFRSQRTE, HasFRSQRTES; 12006f32e7eSjoerg bool HasRecipPrec; 12106f32e7eSjoerg bool HasSTFIWX; 12206f32e7eSjoerg bool HasLFIWAX; 12306f32e7eSjoerg bool HasFPRND; 12406f32e7eSjoerg bool HasFPCVT; 12506f32e7eSjoerg bool HasISEL; 12606f32e7eSjoerg bool HasBPERMD; 12706f32e7eSjoerg bool HasExtDiv; 12806f32e7eSjoerg bool HasCMPB; 12906f32e7eSjoerg bool HasLDBRX; 13006f32e7eSjoerg bool IsBookE; 13106f32e7eSjoerg bool HasOnlyMSYNC; 13206f32e7eSjoerg bool IsE500; 13306f32e7eSjoerg bool IsPPC4xx; 13406f32e7eSjoerg bool IsPPC6xx; 13506f32e7eSjoerg bool FeatureMFTB; 136*da58b97aSjoerg bool AllowsUnalignedFPAccess; 13706f32e7eSjoerg bool DeprecatedDST; 13806f32e7eSjoerg bool IsLittleEndian; 13906f32e7eSjoerg bool HasICBT; 14006f32e7eSjoerg bool HasInvariantFunctionDescriptors; 14106f32e7eSjoerg bool HasPartwordAtomics; 14206f32e7eSjoerg bool HasDirectMove; 14306f32e7eSjoerg bool HasHTM; 14406f32e7eSjoerg bool HasFloat128; 145*da58b97aSjoerg bool HasFusion; 146*da58b97aSjoerg bool HasStoreFusion; 147*da58b97aSjoerg bool HasAddiLoadFusion; 148*da58b97aSjoerg bool HasAddisLoadFusion; 14906f32e7eSjoerg bool IsISA3_0; 150*da58b97aSjoerg bool IsISA3_1; 15106f32e7eSjoerg bool UseLongCalls; 15206f32e7eSjoerg bool SecurePlt; 15306f32e7eSjoerg bool VectorsUseTwoUnits; 15406f32e7eSjoerg bool UsePPCPreRASchedStrategy; 15506f32e7eSjoerg bool UsePPCPostRASchedStrategy; 156*da58b97aSjoerg bool PairedVectorMemops; 157*da58b97aSjoerg bool PredictableSelectIsExpensive; 158*da58b97aSjoerg bool HasModernAIXAs; 159*da58b97aSjoerg bool IsAIX; 16006f32e7eSjoerg 16106f32e7eSjoerg POPCNTDKind HasPOPCNTD; 16206f32e7eSjoerg 16306f32e7eSjoerg const PPCTargetMachine &TM; 16406f32e7eSjoerg PPCFrameLowering FrameLowering; 16506f32e7eSjoerg PPCInstrInfo InstrInfo; 16606f32e7eSjoerg PPCTargetLowering TLInfo; 16706f32e7eSjoerg SelectionDAGTargetInfo TSInfo; 16806f32e7eSjoerg 169*da58b97aSjoerg /// GlobalISel related APIs. 170*da58b97aSjoerg std::unique_ptr<CallLowering> CallLoweringInfo; 171*da58b97aSjoerg std::unique_ptr<LegalizerInfo> Legalizer; 172*da58b97aSjoerg std::unique_ptr<RegisterBankInfo> RegBankInfo; 173*da58b97aSjoerg std::unique_ptr<InstructionSelector> InstSelector; 174*da58b97aSjoerg 17506f32e7eSjoerg public: 17606f32e7eSjoerg /// This constructor initializes the data members to match that 17706f32e7eSjoerg /// of the specified triple. 17806f32e7eSjoerg /// 17906f32e7eSjoerg PPCSubtarget(const Triple &TT, const std::string &CPU, const std::string &FS, 18006f32e7eSjoerg const PPCTargetMachine &TM); 18106f32e7eSjoerg 18206f32e7eSjoerg /// ParseSubtargetFeatures - Parses features string setting specified 18306f32e7eSjoerg /// subtarget options. Definition of function is auto generated by tblgen. 184*da58b97aSjoerg void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS); 18506f32e7eSjoerg 18606f32e7eSjoerg /// getStackAlignment - Returns the minimum alignment known to hold of the 18706f32e7eSjoerg /// stack frame on entry to the function and which must be maintained by every 18806f32e7eSjoerg /// function for this subtarget. getStackAlignment()18906f32e7eSjoerg Align getStackAlignment() const { return StackAlignment; } 19006f32e7eSjoerg 191*da58b97aSjoerg /// getCPUDirective - Returns the -m directive specified for the cpu. 19206f32e7eSjoerg /// getCPUDirective()193*da58b97aSjoerg unsigned getCPUDirective() const { return CPUDirective; } 19406f32e7eSjoerg 19506f32e7eSjoerg /// getInstrItins - Return the instruction itineraries based on subtarget 19606f32e7eSjoerg /// selection. getInstrItineraryData()19706f32e7eSjoerg const InstrItineraryData *getInstrItineraryData() const override { 19806f32e7eSjoerg return &InstrItins; 19906f32e7eSjoerg } 20006f32e7eSjoerg getFrameLowering()20106f32e7eSjoerg const PPCFrameLowering *getFrameLowering() const override { 20206f32e7eSjoerg return &FrameLowering; 20306f32e7eSjoerg } getInstrInfo()20406f32e7eSjoerg const PPCInstrInfo *getInstrInfo() const override { return &InstrInfo; } getTargetLowering()20506f32e7eSjoerg const PPCTargetLowering *getTargetLowering() const override { 20606f32e7eSjoerg return &TLInfo; 20706f32e7eSjoerg } getSelectionDAGInfo()20806f32e7eSjoerg const SelectionDAGTargetInfo *getSelectionDAGInfo() const override { 20906f32e7eSjoerg return &TSInfo; 21006f32e7eSjoerg } getRegisterInfo()21106f32e7eSjoerg const PPCRegisterInfo *getRegisterInfo() const override { 21206f32e7eSjoerg return &getInstrInfo()->getRegisterInfo(); 21306f32e7eSjoerg } getTargetMachine()21406f32e7eSjoerg const PPCTargetMachine &getTargetMachine() const { return TM; } 21506f32e7eSjoerg 21606f32e7eSjoerg /// initializeSubtargetDependencies - Initializes using a CPU and feature string 21706f32e7eSjoerg /// so that we can use initializer lists for subtarget initialization. 21806f32e7eSjoerg PPCSubtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS); 21906f32e7eSjoerg 22006f32e7eSjoerg private: 22106f32e7eSjoerg void initializeEnvironment(); 22206f32e7eSjoerg void initSubtargetFeatures(StringRef CPU, StringRef FS); 22306f32e7eSjoerg 22406f32e7eSjoerg public: 22506f32e7eSjoerg /// isPPC64 - Return true if we are generating code for 64-bit pointer mode. 22606f32e7eSjoerg /// 22706f32e7eSjoerg bool isPPC64() const; 22806f32e7eSjoerg 22906f32e7eSjoerg /// has64BitSupport - Return true if the selected CPU supports 64-bit 23006f32e7eSjoerg /// instructions, regardless of whether we are in 32-bit or 64-bit mode. has64BitSupport()23106f32e7eSjoerg bool has64BitSupport() const { return Has64BitSupport; } 23206f32e7eSjoerg // useSoftFloat - Return true if soft-float option is turned on. useSoftFloat()23306f32e7eSjoerg bool useSoftFloat() const { 23406f32e7eSjoerg if (isAIXABI() && !HasHardFloat) 23506f32e7eSjoerg report_fatal_error("soft-float is not yet supported on AIX."); 23606f32e7eSjoerg return !HasHardFloat; 23706f32e7eSjoerg } 23806f32e7eSjoerg 23906f32e7eSjoerg /// use64BitRegs - Return true if in 64-bit mode or if we should use 64-bit 24006f32e7eSjoerg /// registers in 32-bit mode when possible. This can only true if 24106f32e7eSjoerg /// has64BitSupport() returns true. use64BitRegs()24206f32e7eSjoerg bool use64BitRegs() const { return Use64BitRegs; } 24306f32e7eSjoerg 24406f32e7eSjoerg /// useCRBits - Return true if we should store and manipulate i1 values in 24506f32e7eSjoerg /// the individual condition register bits. useCRBits()24606f32e7eSjoerg bool useCRBits() const { return UseCRBits; } 24706f32e7eSjoerg 24806f32e7eSjoerg // isLittleEndian - True if generating little-endian code isLittleEndian()24906f32e7eSjoerg bool isLittleEndian() const { return IsLittleEndian; } 25006f32e7eSjoerg 25106f32e7eSjoerg // Specific obvious features. hasFCPSGN()25206f32e7eSjoerg bool hasFCPSGN() const { return HasFCPSGN; } hasFSQRT()25306f32e7eSjoerg bool hasFSQRT() const { return HasFSQRT; } hasFRE()25406f32e7eSjoerg bool hasFRE() const { return HasFRE; } hasFRES()25506f32e7eSjoerg bool hasFRES() const { return HasFRES; } hasFRSQRTE()25606f32e7eSjoerg bool hasFRSQRTE() const { return HasFRSQRTE; } hasFRSQRTES()25706f32e7eSjoerg bool hasFRSQRTES() const { return HasFRSQRTES; } hasRecipPrec()25806f32e7eSjoerg bool hasRecipPrec() const { return HasRecipPrec; } hasSTFIWX()25906f32e7eSjoerg bool hasSTFIWX() const { return HasSTFIWX; } hasLFIWAX()26006f32e7eSjoerg bool hasLFIWAX() const { return HasLFIWAX; } hasFPRND()26106f32e7eSjoerg bool hasFPRND() const { return HasFPRND; } hasFPCVT()26206f32e7eSjoerg bool hasFPCVT() const { return HasFPCVT; } hasAltivec()26306f32e7eSjoerg bool hasAltivec() const { return HasAltivec; } hasSPE()26406f32e7eSjoerg bool hasSPE() const { return HasSPE; } hasEFPU2()265*da58b97aSjoerg bool hasEFPU2() const { return HasEFPU2; } hasFPU()26606f32e7eSjoerg bool hasFPU() const { return HasFPU; } hasVSX()26706f32e7eSjoerg bool hasVSX() const { return HasVSX; } needsTwoConstNR()26806f32e7eSjoerg bool needsTwoConstNR() const { return NeedsTwoConstNR; } hasP8Vector()26906f32e7eSjoerg bool hasP8Vector() const { return HasP8Vector; } hasP8Altivec()27006f32e7eSjoerg bool hasP8Altivec() const { return HasP8Altivec; } hasP8Crypto()27106f32e7eSjoerg bool hasP8Crypto() const { return HasP8Crypto; } hasP9Vector()27206f32e7eSjoerg bool hasP9Vector() const { return HasP9Vector; } hasP9Altivec()27306f32e7eSjoerg bool hasP9Altivec() const { return HasP9Altivec; } hasP10Vector()274*da58b97aSjoerg bool hasP10Vector() const { return HasP10Vector; } hasPrefixInstrs()275*da58b97aSjoerg bool hasPrefixInstrs() const { return HasPrefixInstrs; } hasPCRelativeMemops()276*da58b97aSjoerg bool hasPCRelativeMemops() const { return HasPCRelativeMemops; } hasMMA()277*da58b97aSjoerg bool hasMMA() const { return HasMMA; } hasROPProtect()278*da58b97aSjoerg bool hasROPProtect() const { return HasROPProtect; } hasPrivileged()279*da58b97aSjoerg bool hasPrivileged() const { return HasPrivileged; } pairedVectorMemops()280*da58b97aSjoerg bool pairedVectorMemops() const { return PairedVectorMemops; } hasMFOCRF()28106f32e7eSjoerg bool hasMFOCRF() const { return HasMFOCRF; } hasISEL()28206f32e7eSjoerg bool hasISEL() const { return HasISEL; } hasBPERMD()28306f32e7eSjoerg bool hasBPERMD() const { return HasBPERMD; } hasExtDiv()28406f32e7eSjoerg bool hasExtDiv() const { return HasExtDiv; } hasCMPB()28506f32e7eSjoerg bool hasCMPB() const { return HasCMPB; } hasLDBRX()28606f32e7eSjoerg bool hasLDBRX() const { return HasLDBRX; } isBookE()28706f32e7eSjoerg bool isBookE() const { return IsBookE; } hasOnlyMSYNC()28806f32e7eSjoerg bool hasOnlyMSYNC() const { return HasOnlyMSYNC; } isPPC4xx()28906f32e7eSjoerg bool isPPC4xx() const { return IsPPC4xx; } isPPC6xx()29006f32e7eSjoerg bool isPPC6xx() const { return IsPPC6xx; } isSecurePlt()29106f32e7eSjoerg bool isSecurePlt() const {return SecurePlt; } vectorsUseTwoUnits()29206f32e7eSjoerg bool vectorsUseTwoUnits() const {return VectorsUseTwoUnits; } isE500()29306f32e7eSjoerg bool isE500() const { return IsE500; } isFeatureMFTB()29406f32e7eSjoerg bool isFeatureMFTB() const { return FeatureMFTB; } allowsUnalignedFPAccess()295*da58b97aSjoerg bool allowsUnalignedFPAccess() const { return AllowsUnalignedFPAccess; } isDeprecatedDST()29606f32e7eSjoerg bool isDeprecatedDST() const { return DeprecatedDST; } hasICBT()29706f32e7eSjoerg bool hasICBT() const { return HasICBT; } hasInvariantFunctionDescriptors()29806f32e7eSjoerg bool hasInvariantFunctionDescriptors() const { 29906f32e7eSjoerg return HasInvariantFunctionDescriptors; 30006f32e7eSjoerg } usePPCPreRASchedStrategy()30106f32e7eSjoerg bool usePPCPreRASchedStrategy() const { return UsePPCPreRASchedStrategy; } usePPCPostRASchedStrategy()30206f32e7eSjoerg bool usePPCPostRASchedStrategy() const { return UsePPCPostRASchedStrategy; } hasPartwordAtomics()30306f32e7eSjoerg bool hasPartwordAtomics() const { return HasPartwordAtomics; } hasDirectMove()30406f32e7eSjoerg bool hasDirectMove() const { return HasDirectMove; } 30506f32e7eSjoerg getPlatformStackAlignment()30606f32e7eSjoerg Align getPlatformStackAlignment() const { 30706f32e7eSjoerg return Align(16); 30806f32e7eSjoerg } 30906f32e7eSjoerg getRedZoneSize()31006f32e7eSjoerg unsigned getRedZoneSize() const { 311*da58b97aSjoerg if (isPPC64()) 312*da58b97aSjoerg // 288 bytes = 18*8 (FPRs) + 18*8 (GPRs, GPR13 reserved) 313*da58b97aSjoerg return 288; 314*da58b97aSjoerg 315*da58b97aSjoerg // AIX PPC32: 220 bytes = 18*8 (FPRs) + 19*4 (GPRs); 316*da58b97aSjoerg // PPC32 SVR4ABI has no redzone. 317*da58b97aSjoerg return isAIXABI() ? 220 : 0; 31806f32e7eSjoerg } 31906f32e7eSjoerg hasHTM()32006f32e7eSjoerg bool hasHTM() const { return HasHTM; } hasFloat128()32106f32e7eSjoerg bool hasFloat128() const { return HasFloat128; } isISA3_0()32206f32e7eSjoerg bool isISA3_0() const { return IsISA3_0; } isISA3_1()323*da58b97aSjoerg bool isISA3_1() const { return IsISA3_1; } useLongCalls()32406f32e7eSjoerg bool useLongCalls() const { return UseLongCalls; } hasFusion()325*da58b97aSjoerg bool hasFusion() const { return HasFusion; } hasStoreFusion()326*da58b97aSjoerg bool hasStoreFusion() const { return HasStoreFusion; } hasAddiLoadFusion()327*da58b97aSjoerg bool hasAddiLoadFusion() const { return HasAddiLoadFusion; } hasAddisLoadFusion()328*da58b97aSjoerg bool hasAddisLoadFusion() const { return HasAddisLoadFusion; } needsSwapsForVSXMemOps()32906f32e7eSjoerg bool needsSwapsForVSXMemOps() const { 33006f32e7eSjoerg return hasVSX() && isLittleEndian() && !hasP9Vector(); 33106f32e7eSjoerg } 33206f32e7eSjoerg hasPOPCNTD()33306f32e7eSjoerg POPCNTDKind hasPOPCNTD() const { return HasPOPCNTD; } 33406f32e7eSjoerg getTargetTriple()33506f32e7eSjoerg const Triple &getTargetTriple() const { return TargetTriple; } 33606f32e7eSjoerg isTargetELF()33706f32e7eSjoerg bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); } isTargetMachO()33806f32e7eSjoerg bool isTargetMachO() const { return TargetTriple.isOSBinFormatMachO(); } isTargetLinux()33906f32e7eSjoerg bool isTargetLinux() const { return TargetTriple.isOSLinux(); } 34006f32e7eSjoerg isAIXABI()34106f32e7eSjoerg bool isAIXABI() const { return TargetTriple.isOSAIX(); } isSVR4ABI()342*da58b97aSjoerg bool isSVR4ABI() const { return !isAIXABI(); } 34306f32e7eSjoerg bool isELFv2ABI() const; 34406f32e7eSjoerg is64BitELFABI()34506f32e7eSjoerg bool is64BitELFABI() const { return isSVR4ABI() && isPPC64(); } is32BitELFABI()34606f32e7eSjoerg bool is32BitELFABI() const { return isSVR4ABI() && !isPPC64(); } 347*da58b97aSjoerg bool isUsingPCRelativeCalls() const; 34806f32e7eSjoerg 34906f32e7eSjoerg /// Originally, this function return hasISEL(). Now we always enable it, 35006f32e7eSjoerg /// but may expand the ISEL instruction later. enableEarlyIfConversion()35106f32e7eSjoerg bool enableEarlyIfConversion() const override { return true; } 35206f32e7eSjoerg 35306f32e7eSjoerg /// Scheduling customization. 35406f32e7eSjoerg bool enableMachineScheduler() const override; 35506f32e7eSjoerg /// Pipeliner customization. 35606f32e7eSjoerg bool enableMachinePipeliner() const override; 35706f32e7eSjoerg /// Machine Pipeliner customization 35806f32e7eSjoerg bool useDFAforSMS() const override; 35906f32e7eSjoerg /// This overrides the PostRAScheduler bit in the SchedModel for each CPU. 36006f32e7eSjoerg bool enablePostRAScheduler() const override; 36106f32e7eSjoerg AntiDepBreakMode getAntiDepBreakMode() const override; 36206f32e7eSjoerg void getCriticalPathRCs(RegClassVector &CriticalPathRCs) const override; 36306f32e7eSjoerg 36406f32e7eSjoerg void overrideSchedPolicy(MachineSchedPolicy &Policy, 36506f32e7eSjoerg unsigned NumRegionInstrs) const override; 36606f32e7eSjoerg bool useAA() const override; 36706f32e7eSjoerg 36806f32e7eSjoerg bool enableSubRegLiveness() const override; 36906f32e7eSjoerg 37006f32e7eSjoerg /// True if the GV will be accessed via an indirect symbol. 37106f32e7eSjoerg bool isGVIndirectSymbol(const GlobalValue *GV) const; 37206f32e7eSjoerg 373*da58b97aSjoerg /// True if the ABI is descriptor based. usesFunctionDescriptors()374*da58b97aSjoerg bool usesFunctionDescriptors() const { 375*da58b97aSjoerg // Both 32-bit and 64-bit AIX are descriptor based. For ELF only the 64-bit 376*da58b97aSjoerg // v1 ABI uses descriptors. 377*da58b97aSjoerg return isAIXABI() || (is64BitELFABI() && !isELFv2ABI()); 378*da58b97aSjoerg } 379*da58b97aSjoerg descriptorTOCAnchorOffset()380*da58b97aSjoerg unsigned descriptorTOCAnchorOffset() const { 381*da58b97aSjoerg assert(usesFunctionDescriptors() && 382*da58b97aSjoerg "Should only be called when the target uses descriptors."); 383*da58b97aSjoerg return IsPPC64 ? 8 : 4; 384*da58b97aSjoerg } 385*da58b97aSjoerg descriptorEnvironmentPointerOffset()386*da58b97aSjoerg unsigned descriptorEnvironmentPointerOffset() const { 387*da58b97aSjoerg assert(usesFunctionDescriptors() && 388*da58b97aSjoerg "Should only be called when the target uses descriptors."); 389*da58b97aSjoerg return IsPPC64 ? 16 : 8; 390*da58b97aSjoerg } 391*da58b97aSjoerg getEnvironmentPointerRegister()392*da58b97aSjoerg MCRegister getEnvironmentPointerRegister() const { 393*da58b97aSjoerg assert(usesFunctionDescriptors() && 394*da58b97aSjoerg "Should only be called when the target uses descriptors."); 395*da58b97aSjoerg return IsPPC64 ? PPC::X11 : PPC::R11; 396*da58b97aSjoerg } 397*da58b97aSjoerg getTOCPointerRegister()398*da58b97aSjoerg MCRegister getTOCPointerRegister() const { 399*da58b97aSjoerg assert((is64BitELFABI() || isAIXABI()) && 400*da58b97aSjoerg "Should only be called when the target is a TOC based ABI."); 401*da58b97aSjoerg return IsPPC64 ? PPC::X2 : PPC::R2; 402*da58b97aSjoerg } 403*da58b97aSjoerg getStackPointerRegister()404*da58b97aSjoerg MCRegister getStackPointerRegister() const { 405*da58b97aSjoerg return IsPPC64 ? PPC::X1 : PPC::R1; 406*da58b97aSjoerg } 407*da58b97aSjoerg isXRaySupported()40806f32e7eSjoerg bool isXRaySupported() const override { return IsPPC64 && IsLittleEndian; } 409*da58b97aSjoerg isPredictableSelectIsExpensive()410*da58b97aSjoerg bool isPredictableSelectIsExpensive() const { 411*da58b97aSjoerg return PredictableSelectIsExpensive; 412*da58b97aSjoerg } 413*da58b97aSjoerg 414*da58b97aSjoerg // GlobalISEL 415*da58b97aSjoerg const CallLowering *getCallLowering() const override; 416*da58b97aSjoerg const RegisterBankInfo *getRegBankInfo() const override; 417*da58b97aSjoerg const LegalizerInfo *getLegalizerInfo() const override; 418*da58b97aSjoerg InstructionSelector *getInstructionSelector() const override; 41906f32e7eSjoerg }; 42006f32e7eSjoerg } // End llvm namespace 42106f32e7eSjoerg 42206f32e7eSjoerg #endif 423