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