xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/AMDGPU/R600Subtarget.h (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
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