//=====-- R600Subtarget.h - Define Subtarget for AMDGPU R600 ----*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //==-----------------------------------------------------------------------===// // /// \file /// AMDGPU R600 specific subclass of TargetSubtarget. // //===----------------------------------------------------------------------===// #ifndef LLVM_LIB_TARGET_AMDGPU_R600SUBTARGET_H #define LLVM_LIB_TARGET_AMDGPU_R600SUBTARGET_H #include "AMDGPUSubtarget.h" #include "R600FrameLowering.h" #include "R600ISelLowering.h" #include "R600InstrInfo.h" #include "Utils/AMDGPUBaseInfo.h" #include "llvm/CodeGen/SelectionDAGTargetInfo.h" #define GET_SUBTARGETINFO_HEADER #include "R600GenSubtargetInfo.inc" namespace llvm { class R600Subtarget final : public R600GenSubtargetInfo, public AMDGPUSubtarget { private: R600InstrInfo InstrInfo; R600FrameLowering FrameLowering; bool FMA = false; bool CaymanISA = false; bool CFALUBug = false; bool HasVertexCache = false; bool R600ALUInst = false; bool FP64 = false; short TexVTXClauseSize = 0; Generation Gen = R600; R600TargetLowering TLInfo; InstrItineraryData InstrItins; SelectionDAGTargetInfo TSInfo; public: R600Subtarget(const Triple &TT, StringRef CPU, StringRef FS, const TargetMachine &TM); const R600InstrInfo *getInstrInfo() const override { return &InstrInfo; } const R600FrameLowering *getFrameLowering() const override { return &FrameLowering; } const R600TargetLowering *getTargetLowering() const override { return &TLInfo; } const R600RegisterInfo *getRegisterInfo() const override { return &InstrInfo.getRegisterInfo(); } const InstrItineraryData *getInstrItineraryData() const override { return &InstrItins; } // Nothing implemented, just prevent crashes on use. const SelectionDAGTargetInfo *getSelectionDAGInfo() const override { return &TSInfo; } void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS); Generation getGeneration() const { return Gen; } Align getStackAlignment() const { return Align(4); } R600Subtarget &initializeSubtargetDependencies(const Triple &TT, StringRef GPU, StringRef FS); bool hasBFE() const { return (getGeneration() >= EVERGREEN); } bool hasBFI() const { return (getGeneration() >= EVERGREEN); } bool hasBCNT(unsigned Size) const { if (Size == 32) return (getGeneration() >= EVERGREEN); return false; } bool hasBORROW() const { return (getGeneration() >= EVERGREEN); } bool hasCARRY() const { return (getGeneration() >= EVERGREEN); } bool hasCaymanISA() const { return CaymanISA; } bool hasFFBL() const { return (getGeneration() >= EVERGREEN); } bool hasFFBH() const { return (getGeneration() >= EVERGREEN); } bool hasFMA() const { return FMA; } bool hasCFAluBug() const { return CFALUBug; } bool hasVertexCache() const { return HasVertexCache; } short getTexVTXClauseSize() const { return TexVTXClauseSize; } bool enableMachineScheduler() const override { return true; } bool enableSubRegLiveness() const override { return true; } /// \returns Maximum number of work groups per compute unit supported by the /// subtarget and limited by given \p FlatWorkGroupSize. unsigned getMaxWorkGroupsPerCU(unsigned FlatWorkGroupSize) const override { return AMDGPU::IsaInfo::getMaxWorkGroupsPerCU(this, FlatWorkGroupSize); } /// \returns Minimum flat work group size supported by the subtarget. unsigned getMinFlatWorkGroupSize() const override { return AMDGPU::IsaInfo::getMinFlatWorkGroupSize(this); } /// \returns Maximum flat work group size supported by the subtarget. unsigned getMaxFlatWorkGroupSize() const override { return AMDGPU::IsaInfo::getMaxFlatWorkGroupSize(this); } /// \returns Number of waves per execution unit required to support the given /// \p FlatWorkGroupSize. unsigned getWavesPerEUForWorkGroup(unsigned FlatWorkGroupSize) const override { return AMDGPU::IsaInfo::getWavesPerEUForWorkGroup(this, FlatWorkGroupSize); } /// \returns Minimum number of waves per execution unit supported by the /// subtarget. unsigned getMinWavesPerEU() const override { return AMDGPU::IsaInfo::getMinWavesPerEU(this); } }; } // end namespace llvm #endif // LLVM_LIB_TARGET_AMDGPU_R600SUBTARGET_H