| //=====-- 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 |