blob: 61d575385ffa4195dea212e71be84aac62b1e8ee [file] [log] [blame]
Tom Stellard75aadc22012-12-11 21:25:42 +00001//===- SIMachineFunctionInfo.h - SIMachineFunctionInfo interface -*- 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//
12//===----------------------------------------------------------------------===//
13
14
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000015#ifndef LLVM_LIB_TARGET_R600_SIMACHINEFUNCTIONINFO_H
16#define LLVM_LIB_TARGET_R600_SIMACHINEFUNCTIONINFO_H
Tom Stellard75aadc22012-12-11 21:25:42 +000017
Vincent Lejeuneace6f732013-04-01 21:47:53 +000018#include "AMDGPUMachineFunction.h"
Tom Stellard96468902014-09-24 01:33:17 +000019#include "SIRegisterInfo.h"
Tom Stellardc149dc02013-11-27 21:23:35 +000020#include <map>
Tom Stellard75aadc22012-12-11 21:25:42 +000021
22namespace llvm {
23
Tom Stellardc149dc02013-11-27 21:23:35 +000024class MachineRegisterInfo;
25
Tom Stellard75aadc22012-12-11 21:25:42 +000026/// This class keeps track of the SPI_SP_INPUT_ADDR config register, which
27/// tells the hardware which interpolation parameters to load.
Vincent Lejeuneace6f732013-04-01 21:47:53 +000028class SIMachineFunctionInfo : public AMDGPUMachineFunction {
Matt Arsenault26f8f3d2015-11-30 21:16:03 +000029 // FIXME: This should be removed and getPreloadedValue moved here.
30 friend struct SIRegisterInfo;
Craig Topper5656db42014-04-29 07:57:24 +000031 void anchor() override;
Tom Stellard96468902014-09-24 01:33:17 +000032
33 unsigned TIDReg;
Matt Arsenault26f8f3d2015-11-30 21:16:03 +000034
35 // Registers that may be reserved for spilling purposes. These may be the same
36 // as the input registers.
Matt Arsenault49affb82015-11-25 20:55:12 +000037 unsigned ScratchRSrcReg;
Matt Arsenault26f8f3d2015-11-30 21:16:03 +000038 unsigned ScratchWaveOffsetReg;
39
40 // Input registers setup for the HSA ABI.
41 // User SGPRs in allocation order.
42 unsigned PrivateSegmentBufferUserSGPR;
43 unsigned DispatchPtrUserSGPR;
44 unsigned QueuePtrUserSGPR;
45 unsigned KernargSegmentPtrUserSGPR;
46 unsigned DispatchIDUserSGPR;
47 unsigned FlatScratchInitUserSGPR;
48 unsigned PrivateSegmentSizeUserSGPR;
49 unsigned GridWorkGroupCountXUserSGPR;
50 unsigned GridWorkGroupCountYUserSGPR;
51 unsigned GridWorkGroupCountZUserSGPR;
52
53 // System SGPRs in allocation order.
54 unsigned WorkGroupIDXSystemSGPR;
55 unsigned WorkGroupIDYSystemSGPR;
56 unsigned WorkGroupIDZSystemSGPR;
57 unsigned WorkGroupInfoSystemSGPR;
58 unsigned PrivateSegmentWaveByteOffsetSystemSGPR;
Matt Arsenault49affb82015-11-25 20:55:12 +000059
Marek Olsakfccabaf2016-01-13 11:45:36 +000060 // Graphics info.
61 unsigned PSInputAddr;
62
Matt Arsenault49affb82015-11-25 20:55:12 +000063public:
64 // FIXME: Make private
65 unsigned LDSWaveSpillSize;
Marek Olsakfccabaf2016-01-13 11:45:36 +000066 unsigned PSInputEna;
Matt Arsenault49affb82015-11-25 20:55:12 +000067 std::map<unsigned, unsigned> LaneVGPRs;
68 unsigned ScratchOffsetReg;
69 unsigned NumUserSGPRs;
Matt Arsenault26f8f3d2015-11-30 21:16:03 +000070 unsigned NumSystemSGPRs;
Matt Arsenault49affb82015-11-25 20:55:12 +000071
72private:
Matt Arsenault5b22dfa2015-11-05 05:27:10 +000073 bool HasSpilledSGPRs;
Tom Stellard42fb60e2015-01-14 15:42:31 +000074 bool HasSpilledVGPRs;
Tom Stellard96468902014-09-24 01:33:17 +000075
Matt Arsenault26f8f3d2015-11-30 21:16:03 +000076 // Feature bits required for inputs passed in user SGPRs.
77 bool PrivateSegmentBuffer : 1;
Matt Arsenault49affb82015-11-25 20:55:12 +000078 bool DispatchPtr : 1;
79 bool QueuePtr : 1;
80 bool DispatchID : 1;
81 bool KernargSegmentPtr : 1;
82 bool FlatScratchInit : 1;
83 bool GridWorkgroupCountX : 1;
84 bool GridWorkgroupCountY : 1;
85 bool GridWorkgroupCountZ : 1;
Tom Stellardc149dc02013-11-27 21:23:35 +000086
Matt Arsenault26f8f3d2015-11-30 21:16:03 +000087 // Feature bits required for inputs passed in system SGPRs.
Matt Arsenault49affb82015-11-25 20:55:12 +000088 bool WorkGroupIDX : 1; // Always initialized.
89 bool WorkGroupIDY : 1;
90 bool WorkGroupIDZ : 1;
91 bool WorkGroupInfo : 1;
Matt Arsenault26f8f3d2015-11-30 21:16:03 +000092 bool PrivateSegmentWaveByteOffset : 1;
Matt Arsenault49affb82015-11-25 20:55:12 +000093
94 bool WorkItemIDX : 1; // Always initialized.
95 bool WorkItemIDY : 1;
96 bool WorkItemIDZ : 1;
97
Matt Arsenault26f8f3d2015-11-30 21:16:03 +000098
99 MCPhysReg getNextUserSGPR() const {
100 assert(NumSystemSGPRs == 0 && "System SGPRs must be added after user SGPRs");
101 return AMDGPU::SGPR0 + NumUserSGPRs;
102 }
103
104 MCPhysReg getNextSystemSGPR() const {
105 return AMDGPU::SGPR0 + NumUserSGPRs + NumSystemSGPRs;
106 }
107
Matt Arsenault49affb82015-11-25 20:55:12 +0000108public:
Tom Stellardc149dc02013-11-27 21:23:35 +0000109 struct SpilledReg {
110 unsigned VGPR;
111 int Lane;
112 SpilledReg(unsigned R, int L) : VGPR (R), Lane (L) { }
113 SpilledReg() : VGPR(0), Lane(-1) { }
114 bool hasLane() { return Lane != -1;}
115 };
116
Tom Stellardc149dc02013-11-27 21:23:35 +0000117 // SIMachineFunctionInfo definition
118
Tom Stellard75aadc22012-12-11 21:25:42 +0000119 SIMachineFunctionInfo(const MachineFunction &MF);
Tom Stellardc5cf2f02014-08-21 20:40:54 +0000120 SpilledReg getSpilledReg(MachineFunction *MF, unsigned FrameIndex,
121 unsigned SubIdx);
Tom Stellard96468902014-09-24 01:33:17 +0000122 bool hasCalculatedTID() const { return TIDReg != AMDGPU::NoRegister; };
123 unsigned getTIDReg() const { return TIDReg; };
124 void setTIDReg(unsigned Reg) { TIDReg = Reg; }
Matt Arsenault5b22dfa2015-11-05 05:27:10 +0000125
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000126 // Add user SGPRs.
127 unsigned addPrivateSegmentBuffer(const SIRegisterInfo &TRI);
128 unsigned addDispatchPtr(const SIRegisterInfo &TRI);
129 unsigned addQueuePtr(const SIRegisterInfo &TRI);
130 unsigned addKernargSegmentPtr(const SIRegisterInfo &TRI);
131
132 // Add system SGPRs.
133 unsigned addWorkGroupIDX() {
134 WorkGroupIDXSystemSGPR = getNextSystemSGPR();
135 NumSystemSGPRs += 1;
136 return WorkGroupIDXSystemSGPR;
137 }
138
139 unsigned addWorkGroupIDY() {
140 WorkGroupIDYSystemSGPR = getNextSystemSGPR();
141 NumSystemSGPRs += 1;
142 return WorkGroupIDYSystemSGPR;
143 }
144
145 unsigned addWorkGroupIDZ() {
146 WorkGroupIDZSystemSGPR = getNextSystemSGPR();
147 NumSystemSGPRs += 1;
148 return WorkGroupIDZSystemSGPR;
149 }
150
151 unsigned addWorkGroupInfo() {
152 WorkGroupInfoSystemSGPR = getNextSystemSGPR();
153 NumSystemSGPRs += 1;
154 return WorkGroupInfoSystemSGPR;
155 }
156
157 unsigned addPrivateSegmentWaveByteOffset() {
158 PrivateSegmentWaveByteOffsetSystemSGPR = getNextSystemSGPR();
159 NumSystemSGPRs += 1;
160 return PrivateSegmentWaveByteOffsetSystemSGPR;
161 }
162
163 bool hasPrivateSegmentBuffer() const {
164 return PrivateSegmentBuffer;
165 }
166
Matt Arsenault49affb82015-11-25 20:55:12 +0000167 bool hasDispatchPtr() const {
168 return DispatchPtr;
169 }
170
171 bool hasQueuePtr() const {
172 return QueuePtr;
173 }
174
175 bool hasDispatchID() const {
176 return DispatchID;
177 }
178
179 bool hasKernargSegmentPtr() const {
180 return KernargSegmentPtr;
181 }
182
183 bool hasFlatScratchInit() const {
184 return FlatScratchInit;
185 }
186
187 bool hasGridWorkgroupCountX() const {
188 return GridWorkgroupCountX;
189 }
190
191 bool hasGridWorkgroupCountY() const {
192 return GridWorkgroupCountY;
193 }
194
195 bool hasGridWorkgroupCountZ() const {
196 return GridWorkgroupCountZ;
197 }
198
199 bool hasWorkGroupIDX() const {
200 return WorkGroupIDX;
201 }
202
203 bool hasWorkGroupIDY() const {
204 return WorkGroupIDY;
205 }
206
207 bool hasWorkGroupIDZ() const {
208 return WorkGroupIDZ;
209 }
210
211 bool hasWorkGroupInfo() const {
212 return WorkGroupInfo;
213 }
214
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000215 bool hasPrivateSegmentWaveByteOffset() const {
216 return PrivateSegmentWaveByteOffset;
217 }
218
Matt Arsenault49affb82015-11-25 20:55:12 +0000219 bool hasWorkItemIDX() const {
220 return WorkItemIDX;
221 }
222
223 bool hasWorkItemIDY() const {
224 return WorkItemIDY;
225 }
226
227 bool hasWorkItemIDZ() const {
228 return WorkItemIDZ;
229 }
230
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000231 unsigned getNumUserSGPRs() const {
232 return NumUserSGPRs;
233 }
234
235 unsigned getNumPreloadedSGPRs() const {
236 return NumUserSGPRs + NumSystemSGPRs;
237 }
238
239 unsigned getPrivateSegmentWaveByteOffsetSystemSGPR() const {
240 return PrivateSegmentWaveByteOffsetSystemSGPR;
241 }
242
Matt Arsenault49affb82015-11-25 20:55:12 +0000243 /// \brief Returns the physical register reserved for use as the resource
244 /// descriptor for scratch accesses.
245 unsigned getScratchRSrcReg() const {
246 return ScratchRSrcReg;
247 }
248
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000249 void setScratchRSrcReg(unsigned Reg) {
250 assert(Reg != AMDGPU::NoRegister && "Should never be unset");
251 ScratchRSrcReg = Reg;
252 }
253
254 unsigned getScratchWaveOffsetReg() const {
255 return ScratchWaveOffsetReg;
256 }
257
258 void setScratchWaveOffsetReg(unsigned Reg) {
259 assert(Reg != AMDGPU::NoRegister && "Should never be unset");
260 ScratchWaveOffsetReg = Reg;
261 }
Matt Arsenault49affb82015-11-25 20:55:12 +0000262
Matt Arsenault5b22dfa2015-11-05 05:27:10 +0000263 bool hasSpilledSGPRs() const {
264 return HasSpilledSGPRs;
265 }
266
267 void setHasSpilledSGPRs(bool Spill = true) {
268 HasSpilledSGPRs = Spill;
269 }
270
271 bool hasSpilledVGPRs() const {
272 return HasSpilledVGPRs;
273 }
274
275 void setHasSpilledVGPRs(bool Spill = true) {
276 HasSpilledVGPRs = Spill;
277 }
Tom Stellard96468902014-09-24 01:33:17 +0000278
Marek Olsakfccabaf2016-01-13 11:45:36 +0000279 unsigned getPSInputAddr() const {
280 return PSInputAddr;
281 }
282
283 bool isPSInputAllocated(unsigned Index) const {
284 return PSInputAddr & (1 << Index);
285 }
286
287 void markPSInputAllocated(unsigned Index) {
288 PSInputAddr |= 1 << Index;
289 }
290
Tom Stellard96468902014-09-24 01:33:17 +0000291 unsigned getMaximumWorkGroupSize(const MachineFunction &MF) const;
Tom Stellard75aadc22012-12-11 21:25:42 +0000292};
293
294} // End namespace llvm
295
296
Benjamin Kramera7c40ef2014-08-13 16:26:38 +0000297#endif