blob: 90179d79d25d051420c47b6e5d76a9d4dd41c0a8 [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"
Chandler Carruthd9903882015-01-14 11:23:27 +000025#include "llvm/IR/DataLayout.h"
Tom Stellard75aadc22012-12-11 21:25:42 +000026#include "llvm/Target/TargetSubtargetInfo.h"
27
28#define GET_SUBTARGETINFO_HEADER
29#include "AMDGPUGenSubtargetInfo.inc"
30
Tom Stellard75aadc22012-12-11 21:25:42 +000031namespace llvm {
32
33class AMDGPUSubtarget : public AMDGPUGenSubtargetInfo {
Tom Stellard2e59a452014-06-13 01:32:00 +000034
Tom Stellarda6c6e1b2013-06-07 20:37:48 +000035public:
36 enum Generation {
37 R600 = 0,
38 R700,
39 EVERGREEN,
40 NORTHERN_ISLANDS,
Tom Stellard6e1ee472013-10-29 16:37:28 +000041 SOUTHERN_ISLANDS,
Marek Olsak5df00d62014-12-07 12:18:57 +000042 SEA_ISLANDS,
43 VOLCANIC_ISLANDS,
Tom Stellarda6c6e1b2013-06-07 20:37:48 +000044 };
45
Tom Stellard75aadc22012-12-11 21:25:42 +000046private:
Tom Stellard75aadc22012-12-11 21:25:42 +000047 std::string DevName;
48 bool Is64bit;
Tom Stellard75aadc22012-12-11 21:25:42 +000049 bool DumpCode;
50 bool R600ALUInst;
Vincent Lejeunec2991642013-04-30 00:13:39 +000051 bool HasVertexCache;
Vincent Lejeunef9f4e1e2013-05-17 16:49:55 +000052 short TexVTXClauseSize;
Matt Arsenaultd782d052014-06-27 17:57:00 +000053 Generation Gen;
Tom Stellarda6c6e1b2013-06-07 20:37:48 +000054 bool FP64;
Matt Arsenaultf171cf22014-07-14 23:40:49 +000055 bool FP64Denormals;
56 bool FP32Denormals;
Tom Stellarda6c6e1b2013-06-07 20:37:48 +000057 bool CaymanISA;
Matt Arsenault3f981402014-09-15 15:41:53 +000058 bool FlatAddressSpace;
Tom Stellarded0ceec2013-10-10 17:11:12 +000059 bool EnableIRStructurizer;
Matt Arsenaultd9a23ab2014-07-13 02:08:26 +000060 bool EnablePromoteAlloca;
Tom Stellard783893a2013-11-18 19:43:33 +000061 bool EnableIfCvt;
Matt Arsenault41033282014-10-10 22:01:59 +000062 bool EnableLoadStoreOpt;
Tom Stellard8c347b02014-01-22 21:55:40 +000063 unsigned WavefrontSize;
Tom Stellard348273d2014-01-23 16:18:02 +000064 bool CFALUBug;
Tom Stellard880a80a2014-06-17 16:53:14 +000065 int LocalMemorySize;
Tom Stellard75aadc22012-12-11 21:25:42 +000066
Eric Christopherac4b69e2014-07-25 22:22:39 +000067 const DataLayout DL;
68 AMDGPUFrameLowering FrameLowering;
Eric Christopherac4b69e2014-07-25 22:22:39 +000069 std::unique_ptr<AMDGPUTargetLowering> TLInfo;
70 std::unique_ptr<AMDGPUInstrInfo> InstrInfo;
Tom Stellard75aadc22012-12-11 21:25:42 +000071 InstrItineraryData InstrItins;
Tom Stellard794c8c02014-12-02 17:05:41 +000072 Triple TargetTriple;
Tom Stellard75aadc22012-12-11 21:25:42 +000073
74public:
Eric Christopherac4b69e2014-07-25 22:22:39 +000075 AMDGPUSubtarget(StringRef TT, StringRef CPU, StringRef FS, TargetMachine &TM);
76 AMDGPUSubtarget &initializeSubtargetDependencies(StringRef GPU, StringRef FS);
Tom Stellard75aadc22012-12-11 21:25:42 +000077
Eric Christopherd9134482014-08-04 21:25:23 +000078 const AMDGPUFrameLowering *getFrameLowering() const override {
79 return &FrameLowering;
80 }
81 const AMDGPUInstrInfo *getInstrInfo() const override {
82 return InstrInfo.get();
83 }
84 const AMDGPURegisterInfo *getRegisterInfo() const override {
Eric Christopherac4b69e2014-07-25 22:22:39 +000085 return &InstrInfo->getRegisterInfo();
Tom Stellard2e59a452014-06-13 01:32:00 +000086 }
Eric Christopherd9134482014-08-04 21:25:23 +000087 AMDGPUTargetLowering *getTargetLowering() const override {
88 return TLInfo.get();
89 }
90 const DataLayout *getDataLayout() const override { return &DL; }
91 const InstrItineraryData *getInstrItineraryData() const override {
92 return &InstrItins;
93 }
Matt Arsenaultd782d052014-06-27 17:57:00 +000094
Craig Topperee7b0f32014-04-30 05:53:27 +000095 void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
Tom Stellard75aadc22012-12-11 21:25:42 +000096
Matt Arsenaultd782d052014-06-27 17:57:00 +000097 bool is64bit() const {
98 return Is64bit;
99 }
100
101 bool hasVertexCache() const {
102 return HasVertexCache;
103 }
104
105 short getTexVTXClauseSize() const {
Matt Arsenaultd9a23ab2014-07-13 02:08:26 +0000106 return TexVTXClauseSize;
Matt Arsenaultd782d052014-06-27 17:57:00 +0000107 }
108
109 Generation getGeneration() const {
110 return Gen;
111 }
112
113 bool hasHWFP64() const {
114 return FP64;
115 }
116
117 bool hasCaymanISA() const {
118 return CaymanISA;
119 }
Matt Arsenaultfae02982014-03-17 18:58:11 +0000120
Matt Arsenaultf171cf22014-07-14 23:40:49 +0000121 bool hasFP32Denormals() const {
122 return FP32Denormals;
123 }
124
125 bool hasFP64Denormals() const {
126 return FP64Denormals;
127 }
128
Matt Arsenault3f981402014-09-15 15:41:53 +0000129 bool hasFlatAddressSpace() const {
130 return FlatAddressSpace;
131 }
132
Matt Arsenaultfae02982014-03-17 18:58:11 +0000133 bool hasBFE() const {
134 return (getGeneration() >= EVERGREEN);
135 }
136
Matt Arsenault6e439652014-06-10 19:00:20 +0000137 bool hasBFI() const {
138 return (getGeneration() >= EVERGREEN);
139 }
140
Matt Arsenaultfae02982014-03-17 18:58:11 +0000141 bool hasBFM() const {
142 return hasBFE();
143 }
144
Matt Arsenault60425062014-06-10 19:18:28 +0000145 bool hasBCNT(unsigned Size) const {
146 if (Size == 32)
147 return (getGeneration() >= EVERGREEN);
148
Matt Arsenault3dd43fc2014-07-18 06:07:13 +0000149 if (Size == 64)
150 return (getGeneration() >= SOUTHERN_ISLANDS);
151
152 return false;
Matt Arsenault60425062014-06-10 19:18:28 +0000153 }
154
Tom Stellard50122a52014-04-07 19:45:41 +0000155 bool hasMulU24() const {
156 return (getGeneration() >= EVERGREEN);
157 }
158
159 bool hasMulI24() const {
160 return (getGeneration() >= SOUTHERN_ISLANDS ||
161 hasCaymanISA());
162 }
163
Jan Vesely6ddb8dd2014-07-15 15:51:09 +0000164 bool hasFFBL() const {
165 return (getGeneration() >= EVERGREEN);
166 }
167
168 bool hasFFBH() const {
169 return (getGeneration() >= EVERGREEN);
170 }
171
Matt Arsenaultd782d052014-06-27 17:57:00 +0000172 bool IsIRStructurizerEnabled() const {
173 return EnableIRStructurizer;
174 }
175
Matt Arsenaultd9a23ab2014-07-13 02:08:26 +0000176 bool isPromoteAllocaEnabled() const {
177 return EnablePromoteAlloca;
178 }
179
Matt Arsenaultd782d052014-06-27 17:57:00 +0000180 bool isIfCvtEnabled() const {
181 return EnableIfCvt;
182 }
183
Matt Arsenault41033282014-10-10 22:01:59 +0000184 bool loadStoreOptEnabled() const {
185 return EnableLoadStoreOpt;
186 }
187
Matt Arsenaultd782d052014-06-27 17:57:00 +0000188 unsigned getWavefrontSize() const {
189 return WavefrontSize;
190 }
191
Tom Stellarda40f9712014-01-22 21:55:43 +0000192 unsigned getStackEntrySize() const;
Matt Arsenaultd782d052014-06-27 17:57:00 +0000193
194 bool hasCFAluBug() const {
195 assert(getGeneration() <= NORTHERN_ISLANDS);
196 return CFALUBug;
197 }
198
199 int getLocalMemorySize() const {
200 return LocalMemorySize;
201 }
Tom Stellard75aadc22012-12-11 21:25:42 +0000202
Tom Stellardb8fd6ef2014-12-02 22:00:07 +0000203 unsigned getAmdKernelCodeChipID() const;
204
Craig Topper5656db42014-04-29 07:57:24 +0000205 bool enableMachineScheduler() const override {
Andrew Trick978674b2013-09-20 05:14:41 +0000206 return getGeneration() <= NORTHERN_ISLANDS;
207 }
208
Tom Stellard75aadc22012-12-11 21:25:42 +0000209 // Helper functions to simplify if statements
Matt Arsenaultd782d052014-06-27 17:57:00 +0000210 bool isTargetELF() const {
211 return false;
212 }
Tom Stellard75aadc22012-12-11 21:25:42 +0000213
Matt Arsenaultd782d052014-06-27 17:57:00 +0000214 StringRef getDeviceName() const {
215 return DevName;
216 }
217
218 bool dumpCode() const {
219 return DumpCode;
220 }
221 bool r600ALUEncoding() const {
222 return R600ALUInst;
223 }
Tom Stellard794c8c02014-12-02 17:05:41 +0000224 bool isAmdHsaOS() const {
225 return TargetTriple.getOS() == Triple::AMDHSA;
226 }
Tom Stellard75aadc22012-12-11 21:25:42 +0000227};
228
229} // End namespace llvm
230
Benjamin Kramera7c40ef2014-08-13 16:26:38 +0000231#endif