1e8d8bef9SDimitry Andric //=====-- R600Subtarget.h - Define Subtarget for AMDGPU R600 ----*- C++ -*-===// 2e8d8bef9SDimitry Andric // 3e8d8bef9SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e8d8bef9SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5e8d8bef9SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e8d8bef9SDimitry Andric // 7e8d8bef9SDimitry Andric //==-----------------------------------------------------------------------===// 8e8d8bef9SDimitry Andric // 9e8d8bef9SDimitry Andric /// \file 10e8d8bef9SDimitry Andric /// AMDGPU R600 specific subclass of TargetSubtarget. 11e8d8bef9SDimitry Andric // 12e8d8bef9SDimitry Andric //===----------------------------------------------------------------------===// 13e8d8bef9SDimitry Andric 14e8d8bef9SDimitry Andric #ifndef LLVM_LIB_TARGET_AMDGPU_R600SUBTARGET_H 15e8d8bef9SDimitry Andric #define LLVM_LIB_TARGET_AMDGPU_R600SUBTARGET_H 16e8d8bef9SDimitry Andric 17e8d8bef9SDimitry Andric #include "AMDGPUSubtarget.h" 18e8d8bef9SDimitry Andric #include "R600FrameLowering.h" 19e8d8bef9SDimitry Andric #include "R600ISelLowering.h" 20e8d8bef9SDimitry Andric #include "R600InstrInfo.h" 21e8d8bef9SDimitry Andric #include "Utils/AMDGPUBaseInfo.h" 22e8d8bef9SDimitry Andric #include "llvm/CodeGen/SelectionDAGTargetInfo.h" 23e8d8bef9SDimitry Andric 24e8d8bef9SDimitry Andric #define GET_SUBTARGETINFO_HEADER 25e8d8bef9SDimitry Andric #include "R600GenSubtargetInfo.inc" 26e8d8bef9SDimitry Andric 27e8d8bef9SDimitry Andric namespace llvm { 28e8d8bef9SDimitry Andric 29e8d8bef9SDimitry Andric class R600Subtarget final : public R600GenSubtargetInfo, 30e8d8bef9SDimitry Andric public AMDGPUSubtarget { 31e8d8bef9SDimitry Andric private: 32e8d8bef9SDimitry Andric R600InstrInfo InstrInfo; 33e8d8bef9SDimitry Andric R600FrameLowering FrameLowering; 34*81ad6265SDimitry Andric bool FMA = false; 35*81ad6265SDimitry Andric bool CaymanISA = false; 36*81ad6265SDimitry Andric bool CFALUBug = false; 37*81ad6265SDimitry Andric bool HasVertexCache = false; 38*81ad6265SDimitry Andric bool R600ALUInst = false; 39*81ad6265SDimitry Andric bool FP64 = false; 40*81ad6265SDimitry Andric short TexVTXClauseSize = 0; 41*81ad6265SDimitry Andric Generation Gen = R600; 42e8d8bef9SDimitry Andric R600TargetLowering TLInfo; 43e8d8bef9SDimitry Andric InstrItineraryData InstrItins; 44e8d8bef9SDimitry Andric SelectionDAGTargetInfo TSInfo; 45e8d8bef9SDimitry Andric 46e8d8bef9SDimitry Andric public: 47e8d8bef9SDimitry Andric R600Subtarget(const Triple &TT, StringRef CPU, StringRef FS, 48e8d8bef9SDimitry Andric const TargetMachine &TM); 49e8d8bef9SDimitry Andric getInstrInfo()50e8d8bef9SDimitry Andric const R600InstrInfo *getInstrInfo() const override { return &InstrInfo; } 51e8d8bef9SDimitry Andric getFrameLowering()52e8d8bef9SDimitry Andric const R600FrameLowering *getFrameLowering() const override { 53e8d8bef9SDimitry Andric return &FrameLowering; 54e8d8bef9SDimitry Andric } 55e8d8bef9SDimitry Andric getTargetLowering()56e8d8bef9SDimitry Andric const R600TargetLowering *getTargetLowering() const override { 57e8d8bef9SDimitry Andric return &TLInfo; 58e8d8bef9SDimitry Andric } 59e8d8bef9SDimitry Andric getRegisterInfo()60e8d8bef9SDimitry Andric const R600RegisterInfo *getRegisterInfo() const override { 61e8d8bef9SDimitry Andric return &InstrInfo.getRegisterInfo(); 62e8d8bef9SDimitry Andric } 63e8d8bef9SDimitry Andric getInstrItineraryData()64e8d8bef9SDimitry Andric const InstrItineraryData *getInstrItineraryData() const override { 65e8d8bef9SDimitry Andric return &InstrItins; 66e8d8bef9SDimitry Andric } 67e8d8bef9SDimitry Andric 68e8d8bef9SDimitry Andric // Nothing implemented, just prevent crashes on use. getSelectionDAGInfo()69e8d8bef9SDimitry Andric const SelectionDAGTargetInfo *getSelectionDAGInfo() const override { 70e8d8bef9SDimitry Andric return &TSInfo; 71e8d8bef9SDimitry Andric } 72e8d8bef9SDimitry Andric 73e8d8bef9SDimitry Andric void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS); 74e8d8bef9SDimitry Andric getGeneration()75e8d8bef9SDimitry Andric Generation getGeneration() const { 76e8d8bef9SDimitry Andric return Gen; 77e8d8bef9SDimitry Andric } 78e8d8bef9SDimitry Andric getStackAlignment()79e8d8bef9SDimitry Andric Align getStackAlignment() const { return Align(4); } 80e8d8bef9SDimitry Andric 81e8d8bef9SDimitry Andric R600Subtarget &initializeSubtargetDependencies(const Triple &TT, 82e8d8bef9SDimitry Andric StringRef GPU, StringRef FS); 83e8d8bef9SDimitry Andric hasBFE()84e8d8bef9SDimitry Andric bool hasBFE() const { 85e8d8bef9SDimitry Andric return (getGeneration() >= EVERGREEN); 86e8d8bef9SDimitry Andric } 87e8d8bef9SDimitry Andric hasBFI()88e8d8bef9SDimitry Andric bool hasBFI() const { 89e8d8bef9SDimitry Andric return (getGeneration() >= EVERGREEN); 90e8d8bef9SDimitry Andric } 91e8d8bef9SDimitry Andric hasBCNT(unsigned Size)92e8d8bef9SDimitry Andric bool hasBCNT(unsigned Size) const { 93e8d8bef9SDimitry Andric if (Size == 32) 94e8d8bef9SDimitry Andric return (getGeneration() >= EVERGREEN); 95e8d8bef9SDimitry Andric 96e8d8bef9SDimitry Andric return false; 97e8d8bef9SDimitry Andric } 98e8d8bef9SDimitry Andric hasBORROW()99e8d8bef9SDimitry Andric bool hasBORROW() const { 100e8d8bef9SDimitry Andric return (getGeneration() >= EVERGREEN); 101e8d8bef9SDimitry Andric } 102e8d8bef9SDimitry Andric hasCARRY()103e8d8bef9SDimitry Andric bool hasCARRY() const { 104e8d8bef9SDimitry Andric return (getGeneration() >= EVERGREEN); 105e8d8bef9SDimitry Andric } 106e8d8bef9SDimitry Andric hasCaymanISA()107e8d8bef9SDimitry Andric bool hasCaymanISA() const { 108e8d8bef9SDimitry Andric return CaymanISA; 109e8d8bef9SDimitry Andric } 110e8d8bef9SDimitry Andric hasFFBL()111e8d8bef9SDimitry Andric bool hasFFBL() const { 112e8d8bef9SDimitry Andric return (getGeneration() >= EVERGREEN); 113e8d8bef9SDimitry Andric } 114e8d8bef9SDimitry Andric hasFFBH()115e8d8bef9SDimitry Andric bool hasFFBH() const { 116e8d8bef9SDimitry Andric return (getGeneration() >= EVERGREEN); 117e8d8bef9SDimitry Andric } 118e8d8bef9SDimitry Andric hasFMA()119e8d8bef9SDimitry Andric bool hasFMA() const { return FMA; } 120e8d8bef9SDimitry Andric hasCFAluBug()121e8d8bef9SDimitry Andric bool hasCFAluBug() const { return CFALUBug; } 122e8d8bef9SDimitry Andric hasVertexCache()123e8d8bef9SDimitry Andric bool hasVertexCache() const { return HasVertexCache; } 124e8d8bef9SDimitry Andric getTexVTXClauseSize()125e8d8bef9SDimitry Andric short getTexVTXClauseSize() const { return TexVTXClauseSize; } 126e8d8bef9SDimitry Andric enableMachineScheduler()127e8d8bef9SDimitry Andric bool enableMachineScheduler() const override { 128e8d8bef9SDimitry Andric return true; 129e8d8bef9SDimitry Andric } 130e8d8bef9SDimitry Andric enableSubRegLiveness()131e8d8bef9SDimitry Andric bool enableSubRegLiveness() const override { 132e8d8bef9SDimitry Andric return true; 133e8d8bef9SDimitry Andric } 134e8d8bef9SDimitry Andric 135e8d8bef9SDimitry Andric /// \returns Maximum number of work groups per compute unit supported by the 136e8d8bef9SDimitry Andric /// subtarget and limited by given \p FlatWorkGroupSize. getMaxWorkGroupsPerCU(unsigned FlatWorkGroupSize)137e8d8bef9SDimitry Andric unsigned getMaxWorkGroupsPerCU(unsigned FlatWorkGroupSize) const override { 138e8d8bef9SDimitry Andric return AMDGPU::IsaInfo::getMaxWorkGroupsPerCU(this, FlatWorkGroupSize); 139e8d8bef9SDimitry Andric } 140e8d8bef9SDimitry Andric 141e8d8bef9SDimitry Andric /// \returns Minimum flat work group size supported by the subtarget. getMinFlatWorkGroupSize()142e8d8bef9SDimitry Andric unsigned getMinFlatWorkGroupSize() const override { 143e8d8bef9SDimitry Andric return AMDGPU::IsaInfo::getMinFlatWorkGroupSize(this); 144e8d8bef9SDimitry Andric } 145e8d8bef9SDimitry Andric 146e8d8bef9SDimitry Andric /// \returns Maximum flat work group size supported by the subtarget. getMaxFlatWorkGroupSize()147e8d8bef9SDimitry Andric unsigned getMaxFlatWorkGroupSize() const override { 148e8d8bef9SDimitry Andric return AMDGPU::IsaInfo::getMaxFlatWorkGroupSize(this); 149e8d8bef9SDimitry Andric } 150e8d8bef9SDimitry Andric 151e8d8bef9SDimitry Andric /// \returns Number of waves per execution unit required to support the given 152e8d8bef9SDimitry Andric /// \p FlatWorkGroupSize. 153e8d8bef9SDimitry Andric unsigned getWavesPerEUForWorkGroup(unsigned FlatWorkGroupSize)154e8d8bef9SDimitry Andric getWavesPerEUForWorkGroup(unsigned FlatWorkGroupSize) const override { 155e8d8bef9SDimitry Andric return AMDGPU::IsaInfo::getWavesPerEUForWorkGroup(this, FlatWorkGroupSize); 156e8d8bef9SDimitry Andric } 157e8d8bef9SDimitry Andric 158e8d8bef9SDimitry Andric /// \returns Minimum number of waves per execution unit supported by the 159e8d8bef9SDimitry Andric /// subtarget. getMinWavesPerEU()160e8d8bef9SDimitry Andric unsigned getMinWavesPerEU() const override { 161e8d8bef9SDimitry Andric return AMDGPU::IsaInfo::getMinWavesPerEU(this); 162e8d8bef9SDimitry Andric } 163e8d8bef9SDimitry Andric }; 164e8d8bef9SDimitry Andric 165e8d8bef9SDimitry Andric } // end namespace llvm 166e8d8bef9SDimitry Andric 167e8d8bef9SDimitry Andric #endif // LLVM_LIB_TARGET_AMDGPU_R600SUBTARGET_H 168