//===-- SystemZSubtarget.h - SystemZ subtarget information -----*- C++ -*--===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file declares the SystemZ specific subclass of TargetSubtargetInfo. // //===----------------------------------------------------------------------===// #ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZSUBTARGET_H #define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZSUBTARGET_H #include "SystemZFrameLowering.h" #include "SystemZISelLowering.h" #include "SystemZInstrInfo.h" #include "SystemZRegisterInfo.h" #include "SystemZSelectionDAGInfo.h" #include "llvm/ADT/Triple.h" #include "llvm/CodeGen/TargetSubtargetInfo.h" #include "llvm/IR/DataLayout.h" #include <string> #define GET_SUBTARGETINFO_HEADER #include "SystemZGenSubtargetInfo.inc" namespace llvm { class GlobalValue; class StringRef; class SystemZSubtarget : public SystemZGenSubtargetInfo { virtual void anchor(); protected: bool HasDistinctOps; bool HasLoadStoreOnCond; bool HasHighWord; bool HasFPExtension; bool HasPopulationCount; bool HasMessageSecurityAssist3; bool HasMessageSecurityAssist4; bool HasResetReferenceBitsMultiple; bool HasFastSerialization; bool HasInterlockedAccess1; bool HasMiscellaneousExtensions; bool HasExecutionHint; bool HasLoadAndTrap; bool HasTransactionalExecution; bool HasProcessorAssist; bool HasDFPZonedConversion; bool HasEnhancedDAT2; bool HasVector; bool HasLoadStoreOnCond2; bool HasLoadAndZeroRightmostByte; bool HasMessageSecurityAssist5; bool HasDFPPackedConversion; bool HasMiscellaneousExtensions2; bool HasGuardedStorage; bool HasMessageSecurityAssist7; bool HasMessageSecurityAssist8; bool HasVectorEnhancements1; bool HasVectorPackedDecimal; bool HasInsertReferenceBitsMultiple; private: Triple TargetTriple; SystemZInstrInfo InstrInfo; SystemZTargetLowering TLInfo; SystemZSelectionDAGInfo TSInfo; SystemZFrameLowering FrameLowering; SystemZSubtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS); public: SystemZSubtarget(const Triple &TT, const std::string &CPU, const std::string &FS, const TargetMachine &TM); const TargetFrameLowering *getFrameLowering() const override { return &FrameLowering; } const SystemZInstrInfo *getInstrInfo() const override { return &InstrInfo; } const SystemZRegisterInfo *getRegisterInfo() const override { return &InstrInfo.getRegisterInfo(); } const SystemZTargetLowering *getTargetLowering() const override { return &TLInfo; } const SelectionDAGTargetInfo *getSelectionDAGInfo() const override { return &TSInfo; } // True if the subtarget should run MachineScheduler after aggressive // coalescing. This currently replaces the SelectionDAG scheduler with the // "source" order scheduler. bool enableMachineScheduler() const override { return true; } // This is important for reducing register pressure in vector code. bool useAA() const override { return true; } // Always enable the early if-conversion pass. bool enableEarlyIfConversion() const override { return true; } // Automatically generated by tblgen. void ParseSubtargetFeatures(StringRef CPU, StringRef FS); // Return true if the target has the distinct-operands facility. bool hasDistinctOps() const { return HasDistinctOps; } // Return true if the target has the load/store-on-condition facility. bool hasLoadStoreOnCond() const { return HasLoadStoreOnCond; } // Return true if the target has the load/store-on-condition facility 2. bool hasLoadStoreOnCond2() const { return HasLoadStoreOnCond2; } // Return true if the target has the high-word facility. bool hasHighWord() const { return HasHighWord; } // Return true if the target has the floating-point extension facility. bool hasFPExtension() const { return HasFPExtension; } // Return true if the target has the population-count facility. bool hasPopulationCount() const { return HasPopulationCount; } // Return true if the target has the message-security-assist // extension facility 3. bool hasMessageSecurityAssist3() const { return HasMessageSecurityAssist3; } // Return true if the target has the message-security-assist // extension facility 4. bool hasMessageSecurityAssist4() const { return HasMessageSecurityAssist4; } // Return true if the target has the reset-reference-bits-multiple facility. bool hasResetReferenceBitsMultiple() const { return HasResetReferenceBitsMultiple; } // Return true if the target has the fast-serialization facility. bool hasFastSerialization() const { return HasFastSerialization; } // Return true if the target has interlocked-access facility 1. bool hasInterlockedAccess1() const { return HasInterlockedAccess1; } // Return true if the target has the miscellaneous-extensions facility. bool hasMiscellaneousExtensions() const { return HasMiscellaneousExtensions; } // Return true if the target has the execution-hint facility. bool hasExecutionHint() const { return HasExecutionHint; } // Return true if the target has the load-and-trap facility. bool hasLoadAndTrap() const { return HasLoadAndTrap; } // Return true if the target has the transactional-execution facility. bool hasTransactionalExecution() const { return HasTransactionalExecution; } // Return true if the target has the processor-assist facility. bool hasProcessorAssist() const { return HasProcessorAssist; } // Return true if the target has the DFP zoned-conversion facility. bool hasDFPZonedConversion() const { return HasDFPZonedConversion; } // Return true if the target has the enhanced-DAT facility 2. bool hasEnhancedDAT2() const { return HasEnhancedDAT2; } // Return true if the target has the load-and-zero-rightmost-byte facility. bool hasLoadAndZeroRightmostByte() const { return HasLoadAndZeroRightmostByte; } // Return true if the target has the message-security-assist // extension facility 5. bool hasMessageSecurityAssist5() const { return HasMessageSecurityAssist5; } // Return true if the target has the DFP packed-conversion facility. bool hasDFPPackedConversion() const { return HasDFPPackedConversion; } // Return true if the target has the vector facility. bool hasVector() const { return HasVector; } // Return true if the target has the miscellaneous-extensions facility 2. bool hasMiscellaneousExtensions2() const { return HasMiscellaneousExtensions2; } // Return true if the target has the guarded-storage facility. bool hasGuardedStorage() const { return HasGuardedStorage; } // Return true if the target has the message-security-assist // extension facility 7. bool hasMessageSecurityAssist7() const { return HasMessageSecurityAssist7; } // Return true if the target has the message-security-assist // extension facility 8. bool hasMessageSecurityAssist8() const { return HasMessageSecurityAssist8; } // Return true if the target has the vector-enhancements facility 1. bool hasVectorEnhancements1() const { return HasVectorEnhancements1; } // Return true if the target has the vector-packed-decimal facility. bool hasVectorPackedDecimal() const { return HasVectorPackedDecimal; } // Return true if the target has the insert-reference-bits-multiple facility. bool hasInsertReferenceBitsMultiple() const { return HasInsertReferenceBitsMultiple; } // Return true if GV can be accessed using LARL for reloc model RM // and code model CM. bool isPC32DBLSymbol(const GlobalValue *GV, CodeModel::Model CM) const; bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); } }; } // end namespace llvm #endif