xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/SystemZ/SystemZSubtarget.h (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
10b57cec5SDimitry Andric //===-- SystemZSubtarget.h - SystemZ subtarget information -----*- C++ -*--===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file declares the SystemZ specific subclass of TargetSubtargetInfo.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZSUBTARGET_H
140b57cec5SDimitry Andric #define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZSUBTARGET_H
150b57cec5SDimitry Andric 
160b57cec5SDimitry Andric #include "SystemZFrameLowering.h"
170b57cec5SDimitry Andric #include "SystemZISelLowering.h"
180b57cec5SDimitry Andric #include "SystemZInstrInfo.h"
190b57cec5SDimitry Andric #include "SystemZRegisterInfo.h"
200b57cec5SDimitry Andric #include "SystemZSelectionDAGInfo.h"
210b57cec5SDimitry Andric #include "llvm/CodeGen/TargetSubtargetInfo.h"
220b57cec5SDimitry Andric #include "llvm/IR/DataLayout.h"
23*06c3fb27SDimitry Andric #include "llvm/TargetParser/Triple.h"
240b57cec5SDimitry Andric #include <string>
250b57cec5SDimitry Andric 
260b57cec5SDimitry Andric #define GET_SUBTARGETINFO_HEADER
270b57cec5SDimitry Andric #include "SystemZGenSubtargetInfo.inc"
280b57cec5SDimitry Andric 
290b57cec5SDimitry Andric namespace llvm {
300b57cec5SDimitry Andric class GlobalValue;
310b57cec5SDimitry Andric class StringRef;
320b57cec5SDimitry Andric 
330b57cec5SDimitry Andric class SystemZSubtarget : public SystemZGenSubtargetInfo {
340b57cec5SDimitry Andric   virtual void anchor();
350b57cec5SDimitry Andric protected:
36bdd1243dSDimitry Andric // Bool members corresponding to the SubtargetFeatures defined in tablegen.
37bdd1243dSDimitry Andric #define GET_SUBTARGETINFO_MACRO(ATTRIBUTE, DEFAULT, GETTER)                    \
38bdd1243dSDimitry Andric   bool ATTRIBUTE = DEFAULT;
39bdd1243dSDimitry Andric #include "SystemZGenSubtargetInfo.inc"
400b57cec5SDimitry Andric 
410b57cec5SDimitry Andric private:
420b57cec5SDimitry Andric   Triple TargetTriple;
43349cc55cSDimitry Andric   std::unique_ptr<SystemZCallingConventionRegisters> SpecialRegisters;
440b57cec5SDimitry Andric   SystemZInstrInfo InstrInfo;
450b57cec5SDimitry Andric   SystemZTargetLowering TLInfo;
460b57cec5SDimitry Andric   SystemZSelectionDAGInfo TSInfo;
47349cc55cSDimitry Andric   std::unique_ptr<const SystemZFrameLowering> FrameLowering;
480b57cec5SDimitry Andric 
490b57cec5SDimitry Andric   SystemZSubtarget &initializeSubtargetDependencies(StringRef CPU,
5081ad6265SDimitry Andric                                                     StringRef TuneCPU,
510b57cec5SDimitry Andric                                                     StringRef FS);
5204eeddc0SDimitry Andric   SystemZCallingConventionRegisters *initializeSpecialRegisters();
53fe6060f1SDimitry Andric 
540b57cec5SDimitry Andric public:
550b57cec5SDimitry Andric   SystemZSubtarget(const Triple &TT, const std::string &CPU,
5681ad6265SDimitry Andric                    const std::string &TuneCPU, const std::string &FS,
5781ad6265SDimitry Andric                    const TargetMachine &TM);
580b57cec5SDimitry Andric 
getSpecialRegisters()59fe6060f1SDimitry Andric   SystemZCallingConventionRegisters *getSpecialRegisters() const {
60fe6060f1SDimitry Andric     assert(SpecialRegisters && "Unsupported SystemZ calling convention");
61349cc55cSDimitry Andric     return SpecialRegisters.get();
62349cc55cSDimitry Andric   }
63349cc55cSDimitry Andric 
getSpecialRegisters()64349cc55cSDimitry Andric   template <class SR> SR &getSpecialRegisters() const {
65349cc55cSDimitry Andric     return *static_cast<SR *>(getSpecialRegisters());
66fe6060f1SDimitry Andric   }
67fe6060f1SDimitry Andric 
getFrameLowering()680b57cec5SDimitry Andric   const TargetFrameLowering *getFrameLowering() const override {
69349cc55cSDimitry Andric     return FrameLowering.get();
700b57cec5SDimitry Andric   }
71349cc55cSDimitry Andric 
getFrameLowering()72349cc55cSDimitry Andric   template <class TFL> const TFL *getFrameLowering() const {
73349cc55cSDimitry Andric     return static_cast<const TFL *>(getFrameLowering());
74349cc55cSDimitry Andric   }
75349cc55cSDimitry Andric 
getInstrInfo()760b57cec5SDimitry Andric   const SystemZInstrInfo *getInstrInfo() const override { return &InstrInfo; }
getRegisterInfo()770b57cec5SDimitry Andric   const SystemZRegisterInfo *getRegisterInfo() const override {
780b57cec5SDimitry Andric     return &InstrInfo.getRegisterInfo();
790b57cec5SDimitry Andric   }
getTargetLowering()800b57cec5SDimitry Andric   const SystemZTargetLowering *getTargetLowering() const override {
810b57cec5SDimitry Andric     return &TLInfo;
820b57cec5SDimitry Andric   }
getSelectionDAGInfo()830b57cec5SDimitry Andric   const SelectionDAGTargetInfo *getSelectionDAGInfo() const override {
840b57cec5SDimitry Andric     return &TSInfo;
850b57cec5SDimitry Andric   }
860b57cec5SDimitry Andric 
870b57cec5SDimitry Andric   // True if the subtarget should run MachineScheduler after aggressive
880b57cec5SDimitry Andric   // coalescing. This currently replaces the SelectionDAG scheduler with the
890b57cec5SDimitry Andric   // "source" order scheduler.
enableMachineScheduler()900b57cec5SDimitry Andric   bool enableMachineScheduler() const override { return true; }
910b57cec5SDimitry Andric 
920b57cec5SDimitry Andric   // This is important for reducing register pressure in vector code.
useAA()930b57cec5SDimitry Andric   bool useAA() const override { return true; }
940b57cec5SDimitry Andric 
950b57cec5SDimitry Andric   // Always enable the early if-conversion pass.
enableEarlyIfConversion()960b57cec5SDimitry Andric   bool enableEarlyIfConversion() const override { return true; }
970b57cec5SDimitry Andric 
980b57cec5SDimitry Andric   // Enable tracking of subregister liveness in register allocator.
990b57cec5SDimitry Andric   bool enableSubRegLiveness() const override;
1000b57cec5SDimitry Andric 
1010b57cec5SDimitry Andric   // Automatically generated by tblgen.
102e8d8bef9SDimitry Andric   void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS);
1030b57cec5SDimitry Andric 
104bdd1243dSDimitry Andric // Getters for SubtargetFeatures defined in tablegen.
105bdd1243dSDimitry Andric #define GET_SUBTARGETINFO_MACRO(ATTRIBUTE, DEFAULT, GETTER)                    \
106bdd1243dSDimitry Andric   bool GETTER() const { return ATTRIBUTE; }
107bdd1243dSDimitry Andric #include "SystemZGenSubtargetInfo.inc"
1085ffd83dbSDimitry Andric 
109*06c3fb27SDimitry Andric   bool isAddressedViaADA(const GlobalValue *GV) const;
110*06c3fb27SDimitry Andric 
1110b57cec5SDimitry Andric   // Return true if GV can be accessed using LARL for reloc model RM
1120b57cec5SDimitry Andric   // and code model CM.
1130b57cec5SDimitry Andric   bool isPC32DBLSymbol(const GlobalValue *GV, CodeModel::Model CM) const;
1140b57cec5SDimitry Andric 
isTargetELF()1150b57cec5SDimitry Andric   bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); }
116fe6060f1SDimitry Andric 
117fe6060f1SDimitry Andric   // Returns TRUE if we are generating GOFF object code
isTargetGOFF()118fe6060f1SDimitry Andric   bool isTargetGOFF() const { return TargetTriple.isOSBinFormatGOFF(); }
119fe6060f1SDimitry Andric 
120fe6060f1SDimitry Andric   // Returns TRUE if we are using XPLINK64 linkage convention
isTargetXPLINK64()121fe6060f1SDimitry Andric   bool isTargetXPLINK64() const { return (isTargetGOFF() && isTargetzOS()); }
122fe6060f1SDimitry Andric 
123fe6060f1SDimitry Andric   // Returns TRUE if we are generating code for a s390x machine running zOS
isTargetzOS()124fe6060f1SDimitry Andric   bool isTargetzOS() const { return TargetTriple.isOSzOS(); }
1250b57cec5SDimitry Andric };
1260b57cec5SDimitry Andric } // end namespace llvm
1270b57cec5SDimitry Andric 
1280b57cec5SDimitry Andric #endif
129