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