9c528d63bd0e849ff4a51cbd8d72b2cad02398af
[oota-llvm.git] / lib / Target / AMDGPU / SIMachineFunctionInfo.h
1 //===- 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
15 #ifndef LLVM_LIB_TARGET_R600_SIMACHINEFUNCTIONINFO_H
16 #define LLVM_LIB_TARGET_R600_SIMACHINEFUNCTIONINFO_H
17
18 #include "AMDGPUMachineFunction.h"
19 #include "SIRegisterInfo.h"
20 #include <map>
21
22 namespace llvm {
23
24 class MachineRegisterInfo;
25
26 /// This class keeps track of the SPI_SP_INPUT_ADDR config register, which
27 /// tells the hardware which interpolation parameters to load.
28 class SIMachineFunctionInfo : public AMDGPUMachineFunction {
29   // FIXME: This should be removed and getPreloadedValue moved here.
30   friend struct SIRegisterInfo;
31   void anchor() override;
32
33   unsigned TIDReg;
34
35   // Registers that may be reserved for spilling purposes. These may be the same
36   // as the input registers.
37   unsigned ScratchRSrcReg;
38   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;
59
60 public:
61   // FIXME: Make private
62   unsigned LDSWaveSpillSize;
63   unsigned PSInputAddr;
64   std::map<unsigned, unsigned> LaneVGPRs;
65   unsigned ScratchOffsetReg;
66   unsigned NumUserSGPRs;
67   unsigned NumSystemSGPRs;
68
69 private:
70   bool HasSpilledSGPRs;
71   bool HasSpilledVGPRs;
72
73   // Feature bits required for inputs passed in user SGPRs.
74   bool PrivateSegmentBuffer : 1;
75   bool DispatchPtr : 1;
76   bool QueuePtr : 1;
77   bool DispatchID : 1;
78   bool KernargSegmentPtr : 1;
79   bool FlatScratchInit : 1;
80   bool GridWorkgroupCountX : 1;
81   bool GridWorkgroupCountY : 1;
82   bool GridWorkgroupCountZ : 1;
83
84   // Feature bits required for inputs passed in system SGPRs.
85   bool WorkGroupIDX : 1; // Always initialized.
86   bool WorkGroupIDY : 1;
87   bool WorkGroupIDZ : 1;
88   bool WorkGroupInfo : 1;
89   bool PrivateSegmentWaveByteOffset : 1;
90
91   bool WorkItemIDX : 1; // Always initialized.
92   bool WorkItemIDY : 1;
93   bool WorkItemIDZ : 1;
94
95
96   MCPhysReg getNextUserSGPR() const {
97     assert(NumSystemSGPRs == 0 && "System SGPRs must be added after user SGPRs");
98     return AMDGPU::SGPR0 + NumUserSGPRs;
99   }
100
101   MCPhysReg getNextSystemSGPR() const {
102     return AMDGPU::SGPR0 + NumUserSGPRs + NumSystemSGPRs;
103   }
104
105 public:
106   struct SpilledReg {
107     unsigned VGPR;
108     int Lane;
109     SpilledReg(unsigned R, int L) : VGPR (R), Lane (L) { }
110     SpilledReg() : VGPR(0), Lane(-1) { }
111     bool hasLane() { return Lane != -1;}
112   };
113
114   // SIMachineFunctionInfo definition
115
116   SIMachineFunctionInfo(const MachineFunction &MF);
117   SpilledReg getSpilledReg(MachineFunction *MF, unsigned FrameIndex,
118                            unsigned SubIdx);
119   bool hasCalculatedTID() const { return TIDReg != AMDGPU::NoRegister; };
120   unsigned getTIDReg() const { return TIDReg; };
121   void setTIDReg(unsigned Reg) { TIDReg = Reg; }
122
123   // Add user SGPRs.
124   unsigned addPrivateSegmentBuffer(const SIRegisterInfo &TRI);
125   unsigned addDispatchPtr(const SIRegisterInfo &TRI);
126   unsigned addQueuePtr(const SIRegisterInfo &TRI);
127   unsigned addKernargSegmentPtr(const SIRegisterInfo &TRI);
128
129   // Add system SGPRs.
130   unsigned addWorkGroupIDX() {
131     WorkGroupIDXSystemSGPR = getNextSystemSGPR();
132     NumSystemSGPRs += 1;
133     return WorkGroupIDXSystemSGPR;
134   }
135
136   unsigned addWorkGroupIDY() {
137     WorkGroupIDYSystemSGPR = getNextSystemSGPR();
138     NumSystemSGPRs += 1;
139     return WorkGroupIDYSystemSGPR;
140   }
141
142   unsigned addWorkGroupIDZ() {
143     WorkGroupIDZSystemSGPR = getNextSystemSGPR();
144     NumSystemSGPRs += 1;
145     return WorkGroupIDZSystemSGPR;
146   }
147
148   unsigned addWorkGroupInfo() {
149     WorkGroupInfoSystemSGPR = getNextSystemSGPR();
150     NumSystemSGPRs += 1;
151     return WorkGroupInfoSystemSGPR;
152   }
153
154   unsigned addPrivateSegmentWaveByteOffset() {
155     PrivateSegmentWaveByteOffsetSystemSGPR = getNextSystemSGPR();
156     NumSystemSGPRs += 1;
157     return PrivateSegmentWaveByteOffsetSystemSGPR;
158   }
159
160   bool hasPrivateSegmentBuffer() const {
161     return PrivateSegmentBuffer;
162   }
163
164   bool hasDispatchPtr() const {
165     return DispatchPtr;
166   }
167
168   bool hasQueuePtr() const {
169     return QueuePtr;
170   }
171
172   bool hasDispatchID() const {
173     return DispatchID;
174   }
175
176   bool hasKernargSegmentPtr() const {
177     return KernargSegmentPtr;
178   }
179
180   bool hasFlatScratchInit() const {
181     return FlatScratchInit;
182   }
183
184   bool hasGridWorkgroupCountX() const {
185     return GridWorkgroupCountX;
186   }
187
188   bool hasGridWorkgroupCountY() const {
189     return GridWorkgroupCountY;
190   }
191
192   bool hasGridWorkgroupCountZ() const {
193     return GridWorkgroupCountZ;
194   }
195
196   bool hasWorkGroupIDX() const {
197     return WorkGroupIDX;
198   }
199
200   bool hasWorkGroupIDY() const {
201     return WorkGroupIDY;
202   }
203
204   bool hasWorkGroupIDZ() const {
205     return WorkGroupIDZ;
206   }
207
208   bool hasWorkGroupInfo() const {
209     return WorkGroupInfo;
210   }
211
212   bool hasPrivateSegmentWaveByteOffset() const {
213     return PrivateSegmentWaveByteOffset;
214   }
215
216   bool hasWorkItemIDX() const {
217     return WorkItemIDX;
218   }
219
220   bool hasWorkItemIDY() const {
221     return WorkItemIDY;
222   }
223
224   bool hasWorkItemIDZ() const {
225     return WorkItemIDZ;
226   }
227
228   unsigned getNumUserSGPRs() const {
229     return NumUserSGPRs;
230   }
231
232   unsigned getNumPreloadedSGPRs() const {
233     return NumUserSGPRs + NumSystemSGPRs;
234   }
235
236   unsigned getPrivateSegmentWaveByteOffsetSystemSGPR() const {
237     return PrivateSegmentWaveByteOffsetSystemSGPR;
238   }
239
240   /// \brief Returns the physical register reserved for use as the resource
241   /// descriptor for scratch accesses.
242   unsigned getScratchRSrcReg() const {
243     return ScratchRSrcReg;
244   }
245
246   void setScratchRSrcReg(unsigned Reg) {
247     assert(Reg != AMDGPU::NoRegister && "Should never be unset");
248     ScratchRSrcReg = Reg;
249   }
250
251   unsigned getScratchWaveOffsetReg() const {
252     return ScratchWaveOffsetReg;
253   }
254
255   void setScratchWaveOffsetReg(unsigned Reg) {
256     assert(Reg != AMDGPU::NoRegister && "Should never be unset");
257     ScratchWaveOffsetReg = Reg;
258   }
259
260   bool hasSpilledSGPRs() const {
261     return HasSpilledSGPRs;
262   }
263
264   void setHasSpilledSGPRs(bool Spill = true) {
265     HasSpilledSGPRs = Spill;
266   }
267
268   bool hasSpilledVGPRs() const {
269     return HasSpilledVGPRs;
270   }
271
272   void setHasSpilledVGPRs(bool Spill = true) {
273     HasSpilledVGPRs = Spill;
274   }
275
276   unsigned getMaximumWorkGroupSize(const MachineFunction &MF) const;
277 };
278
279 } // End namespace llvm
280
281
282 #endif