blob: b262cdf5771214c50aa2830e924f9c39e3bd8251 [file] [log] [blame]
Tom Stellard75aadc22012-12-11 21:25:42 +00001//=====-- AMDGPUSubtarget.h - Define Subtarget for the AMDIL ---*- C++ -*-====//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//==-----------------------------------------------------------------------===//
9//
10/// \file
11/// \brief AMDGPU specific subclass of TargetSubtarget.
12//
13//===----------------------------------------------------------------------===//
14
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000015#ifndef LLVM_LIB_TARGET_R600_AMDGPUSUBTARGET_H
16#define LLVM_LIB_TARGET_R600_AMDGPUSUBTARGET_H
Tom Stellarda6c6e1b2013-06-07 20:37:48 +000017#include "AMDGPU.h"
Eric Christopherac4b69e2014-07-25 22:22:39 +000018#include "AMDGPUFrameLowering.h"
Tom Stellard2e59a452014-06-13 01:32:00 +000019#include "AMDGPUInstrInfo.h"
Eric Christopherac4b69e2014-07-25 22:22:39 +000020#include "AMDGPUIntrinsicInfo.h"
21#include "AMDGPUSubtarget.h"
22#include "R600ISelLowering.h"
Tom Stellard75aadc22012-12-11 21:25:42 +000023#include "llvm/ADT/StringExtras.h"
24#include "llvm/ADT/StringRef.h"
25#include "llvm/Target/TargetSubtargetInfo.h"
26
27#define GET_SUBTARGETINFO_HEADER
28#include "AMDGPUGenSubtargetInfo.inc"
29
Tom Stellard75aadc22012-12-11 21:25:42 +000030namespace llvm {
31
Tom Stellarde99fb652015-01-20 19:33:04 +000032class SIMachineFunctionInfo;
33
Tom Stellard75aadc22012-12-11 21:25:42 +000034class AMDGPUSubtarget : public AMDGPUGenSubtargetInfo {
Tom Stellard2e59a452014-06-13 01:32:00 +000035
Tom Stellarda6c6e1b2013-06-07 20:37:48 +000036public:
37 enum Generation {
38 R600 = 0,
39 R700,
40 EVERGREEN,
41 NORTHERN_ISLANDS,
Tom Stellard6e1ee472013-10-29 16:37:28 +000042 SOUTHERN_ISLANDS,
Marek Olsak5df00d62014-12-07 12:18:57 +000043 SEA_ISLANDS,
44 VOLCANIC_ISLANDS,
Tom Stellarda6c6e1b2013-06-07 20:37:48 +000045 };
46
Marek Olsak4d00dd22015-03-09 15:48:09 +000047 enum {
48 FIXED_SGPR_COUNT_FOR_INIT_BUG = 80
49 };
50
Tom Stellard75aadc22012-12-11 21:25:42 +000051private:
Tom Stellard75aadc22012-12-11 21:25:42 +000052 std::string DevName;
53 bool Is64bit;
Tom Stellard75aadc22012-12-11 21:25:42 +000054 bool DumpCode;
55 bool R600ALUInst;
Vincent Lejeunec2991642013-04-30 00:13:39 +000056 bool HasVertexCache;
Vincent Lejeunef9f4e1e2013-05-17 16:49:55 +000057 short TexVTXClauseSize;
Matt Arsenaultd782d052014-06-27 17:57:00 +000058 Generation Gen;
Tom Stellarda6c6e1b2013-06-07 20:37:48 +000059 bool FP64;
Matt Arsenaultf171cf22014-07-14 23:40:49 +000060 bool FP64Denormals;
61 bool FP32Denormals;
Matt Arsenaultb035a572015-01-29 19:34:25 +000062 bool FastFMAF32;
Tom Stellarda6c6e1b2013-06-07 20:37:48 +000063 bool CaymanISA;
Matt Arsenault3f981402014-09-15 15:41:53 +000064 bool FlatAddressSpace;
Tom Stellarded0ceec2013-10-10 17:11:12 +000065 bool EnableIRStructurizer;
Matt Arsenaultd9a23ab2014-07-13 02:08:26 +000066 bool EnablePromoteAlloca;
Tom Stellard783893a2013-11-18 19:43:33 +000067 bool EnableIfCvt;
Matt Arsenault41033282014-10-10 22:01:59 +000068 bool EnableLoadStoreOpt;
Tom Stellard8c347b02014-01-22 21:55:40 +000069 unsigned WavefrontSize;
Tom Stellard348273d2014-01-23 16:18:02 +000070 bool CFALUBug;
Tom Stellard880a80a2014-06-17 16:53:14 +000071 int LocalMemorySize;
Tom Stellarde99fb652015-01-20 19:33:04 +000072 bool EnableVGPRSpilling;
Marek Olsak4d00dd22015-03-09 15:48:09 +000073 bool SGPRInitBug;
Tom Stellardd7e6f132015-04-08 01:09:26 +000074 bool IsGCN;
75 bool GCN1Encoding;
76 bool GCN3Encoding;
Tom Stellardd1f0f022015-04-23 19:33:54 +000077 bool CIInsts;
78 bool FeatureDisable;
Tom Stellardec87f842015-05-25 16:15:54 +000079 int LDSBankCount;
Tom Stellard75aadc22012-12-11 21:25:42 +000080
Eric Christopherac4b69e2014-07-25 22:22:39 +000081 AMDGPUFrameLowering FrameLowering;
Eric Christopherac4b69e2014-07-25 22:22:39 +000082 std::unique_ptr<AMDGPUTargetLowering> TLInfo;
83 std::unique_ptr<AMDGPUInstrInfo> InstrInfo;
Tom Stellard75aadc22012-12-11 21:25:42 +000084 InstrItineraryData InstrItins;
Tom Stellard794c8c02014-12-02 17:05:41 +000085 Triple TargetTriple;
Tom Stellard75aadc22012-12-11 21:25:42 +000086
87public:
Eric Christopherac4b69e2014-07-25 22:22:39 +000088 AMDGPUSubtarget(StringRef TT, StringRef CPU, StringRef FS, TargetMachine &TM);
Tom Stellardeba56482015-01-28 15:38:42 +000089 AMDGPUSubtarget &initializeSubtargetDependencies(StringRef TT, StringRef GPU,
90 StringRef FS);
Tom Stellard75aadc22012-12-11 21:25:42 +000091
Eric Christopherd9134482014-08-04 21:25:23 +000092 const AMDGPUFrameLowering *getFrameLowering() const override {
93 return &FrameLowering;
94 }
95 const AMDGPUInstrInfo *getInstrInfo() const override {
96 return InstrInfo.get();
97 }
98 const AMDGPURegisterInfo *getRegisterInfo() const override {
Eric Christopherac4b69e2014-07-25 22:22:39 +000099 return &InstrInfo->getRegisterInfo();
Tom Stellard2e59a452014-06-13 01:32:00 +0000100 }
Eric Christopherd9134482014-08-04 21:25:23 +0000101 AMDGPUTargetLowering *getTargetLowering() const override {
102 return TLInfo.get();
103 }
Eric Christopherd9134482014-08-04 21:25:23 +0000104 const InstrItineraryData *getInstrItineraryData() const override {
105 return &InstrItins;
106 }
Matt Arsenaultd782d052014-06-27 17:57:00 +0000107
Craig Topperee7b0f32014-04-30 05:53:27 +0000108 void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
Tom Stellard75aadc22012-12-11 21:25:42 +0000109
Matt Arsenaultd782d052014-06-27 17:57:00 +0000110 bool is64bit() const {
111 return Is64bit;
112 }
113
114 bool hasVertexCache() const {
115 return HasVertexCache;
116 }
117
118 short getTexVTXClauseSize() const {
Matt Arsenaultd9a23ab2014-07-13 02:08:26 +0000119 return TexVTXClauseSize;
Matt Arsenaultd782d052014-06-27 17:57:00 +0000120 }
121
122 Generation getGeneration() const {
123 return Gen;
124 }
125
126 bool hasHWFP64() const {
127 return FP64;
128 }
129
130 bool hasCaymanISA() const {
131 return CaymanISA;
132 }
Matt Arsenaultfae02982014-03-17 18:58:11 +0000133
Matt Arsenaultf171cf22014-07-14 23:40:49 +0000134 bool hasFP32Denormals() const {
135 return FP32Denormals;
136 }
137
138 bool hasFP64Denormals() const {
139 return FP64Denormals;
140 }
141
Matt Arsenaultb035a572015-01-29 19:34:25 +0000142 bool hasFastFMAF32() const {
143 return FastFMAF32;
144 }
145
Matt Arsenault3f981402014-09-15 15:41:53 +0000146 bool hasFlatAddressSpace() const {
147 return FlatAddressSpace;
148 }
149
Matt Arsenaultfae02982014-03-17 18:58:11 +0000150 bool hasBFE() const {
151 return (getGeneration() >= EVERGREEN);
152 }
153
Matt Arsenault6e439652014-06-10 19:00:20 +0000154 bool hasBFI() const {
155 return (getGeneration() >= EVERGREEN);
156 }
157
Matt Arsenaultfae02982014-03-17 18:58:11 +0000158 bool hasBFM() const {
159 return hasBFE();
160 }
161
Matt Arsenault60425062014-06-10 19:18:28 +0000162 bool hasBCNT(unsigned Size) const {
163 if (Size == 32)
164 return (getGeneration() >= EVERGREEN);
165
Matt Arsenault3dd43fc2014-07-18 06:07:13 +0000166 if (Size == 64)
167 return (getGeneration() >= SOUTHERN_ISLANDS);
168
169 return false;
Matt Arsenault60425062014-06-10 19:18:28 +0000170 }
171
Tom Stellard50122a52014-04-07 19:45:41 +0000172 bool hasMulU24() const {
173 return (getGeneration() >= EVERGREEN);
174 }
175
176 bool hasMulI24() const {
177 return (getGeneration() >= SOUTHERN_ISLANDS ||
178 hasCaymanISA());
179 }
180
Jan Vesely6ddb8dd2014-07-15 15:51:09 +0000181 bool hasFFBL() const {
182 return (getGeneration() >= EVERGREEN);
183 }
184
185 bool hasFFBH() const {
186 return (getGeneration() >= EVERGREEN);
187 }
188
Jan Vesely808fff52015-04-30 17:15:56 +0000189 bool hasCARRY() const {
190 return (getGeneration() >= EVERGREEN);
191 }
192
193 bool hasBORROW() const {
194 return (getGeneration() >= EVERGREEN);
195 }
196
Matt Arsenaultd782d052014-06-27 17:57:00 +0000197 bool IsIRStructurizerEnabled() const {
198 return EnableIRStructurizer;
199 }
200
Matt Arsenaultd9a23ab2014-07-13 02:08:26 +0000201 bool isPromoteAllocaEnabled() const {
202 return EnablePromoteAlloca;
203 }
204
Matt Arsenaultd782d052014-06-27 17:57:00 +0000205 bool isIfCvtEnabled() const {
206 return EnableIfCvt;
207 }
208
Matt Arsenault41033282014-10-10 22:01:59 +0000209 bool loadStoreOptEnabled() const {
210 return EnableLoadStoreOpt;
211 }
212
Matt Arsenaultd782d052014-06-27 17:57:00 +0000213 unsigned getWavefrontSize() const {
214 return WavefrontSize;
215 }
216
Tom Stellarda40f9712014-01-22 21:55:43 +0000217 unsigned getStackEntrySize() const;
Matt Arsenaultd782d052014-06-27 17:57:00 +0000218
219 bool hasCFAluBug() const {
220 assert(getGeneration() <= NORTHERN_ISLANDS);
221 return CFALUBug;
222 }
223
224 int getLocalMemorySize() const {
225 return LocalMemorySize;
226 }
Tom Stellard75aadc22012-12-11 21:25:42 +0000227
Marek Olsak4d00dd22015-03-09 15:48:09 +0000228 bool hasSGPRInitBug() const {
229 return SGPRInitBug;
230 }
231
Tom Stellardec87f842015-05-25 16:15:54 +0000232 int getLDSBankCount() const {
233 return LDSBankCount;
234 }
235
Tom Stellardb8fd6ef2014-12-02 22:00:07 +0000236 unsigned getAmdKernelCodeChipID() const;
237
Craig Topper5656db42014-04-29 07:57:24 +0000238 bool enableMachineScheduler() const override {
Tom Stellard83f0bce2015-01-29 16:55:25 +0000239 return true;
Andrew Trick978674b2013-09-20 05:14:41 +0000240 }
241
Tom Stellard83f0bce2015-01-29 16:55:25 +0000242 void overrideSchedPolicy(MachineSchedPolicy &Policy,
243 MachineInstr *begin, MachineInstr *end,
244 unsigned NumRegionInstrs) const override;
245
Tom Stellard75aadc22012-12-11 21:25:42 +0000246 // Helper functions to simplify if statements
Matt Arsenaultd782d052014-06-27 17:57:00 +0000247 bool isTargetELF() const {
248 return false;
249 }
Tom Stellard75aadc22012-12-11 21:25:42 +0000250
Matt Arsenaultd782d052014-06-27 17:57:00 +0000251 StringRef getDeviceName() const {
252 return DevName;
253 }
254
255 bool dumpCode() const {
256 return DumpCode;
257 }
258 bool r600ALUEncoding() const {
259 return R600ALUInst;
260 }
Tom Stellard794c8c02014-12-02 17:05:41 +0000261 bool isAmdHsaOS() const {
262 return TargetTriple.getOS() == Triple::AMDHSA;
263 }
Tom Stellarde99fb652015-01-20 19:33:04 +0000264 bool isVGPRSpillingEnabled(const SIMachineFunctionInfo *MFI) const;
Tom Stellard83f0bce2015-01-29 16:55:25 +0000265
266 unsigned getMaxWavesPerCU() const {
267 if (getGeneration() >= AMDGPUSubtarget::SOUTHERN_ISLANDS)
268 return 10;
269
270 // FIXME: Not sure what this is for other subtagets.
271 llvm_unreachable("do not know max waves per CU for this subtarget.");
272 }
Tom Stellardf6afc802015-02-04 23:14:18 +0000273
274 bool enableSubRegLiveness() const override {
Tom Stellard06485882015-02-11 18:24:53 +0000275 return false;
Tom Stellardf6afc802015-02-04 23:14:18 +0000276 }
Tom Stellard75aadc22012-12-11 21:25:42 +0000277};
278
279} // End namespace llvm
280
Benjamin Kramera7c40ef2014-08-13 16:26:38 +0000281#endif