blob: bb0c9306f53d63b73c4b3d4469330b00533bd1b3 [file] [log] [blame]
Changpeng Fangb28fe032016-09-01 17:54:54 +00001//===-- MIMGInstructions.td - MIMG Instruction Defintions -----------------===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Changpeng Fangb28fe032016-09-01 17:54:54 +00006//
7//===----------------------------------------------------------------------===//
8
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +00009// MIMG-specific encoding families to distinguish between semantically
10// equivalent machine instructions with different encoding.
11//
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +000012// - MIMGEncGfx6: encoding introduced with gfx6 (obsoleted for atomics in gfx8)
13// - MIMGEncGfx8: encoding introduced with gfx8 for atomics
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +000014// - MIMGEncGfx10Default: gfx default (non-NSA) encoding
15// - MIMGEncGfx10NSA: gfx10 NSA encoding
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +000016class MIMGEncoding;
17
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +000018def MIMGEncGfx6 : MIMGEncoding;
19def MIMGEncGfx8 : MIMGEncoding;
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +000020def MIMGEncGfx10Default : MIMGEncoding;
21def MIMGEncGfx10NSA : MIMGEncoding;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +000022
23def MIMGEncoding : GenericEnum {
24 let FilterClass = "MIMGEncoding";
Changpeng Fangb28fe032016-09-01 17:54:54 +000025}
26
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +000027// Represent an ISA-level opcode, independent of the encoding and the
28// vdata/vaddr size.
29class MIMGBaseOpcode {
30 MIMGBaseOpcode BaseOpcode = !cast<MIMGBaseOpcode>(NAME);
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +000031 bit Store = 0;
32 bit Atomic = 0;
33 bit AtomicX2 = 0; // (f)cmpswap
34 bit Sampler = 0;
David Stuttardf77079f2019-01-14 11:55:24 +000035 bit Gather4 = 0;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +000036 bits<8> NumExtraArgs = 0;
37 bit Gradients = 0;
38 bit Coordinates = 1;
39 bit LodOrClampOrMip = 0;
40 bit HasD16 = 0;
Dmitry Preobrazhensky0b4eb1e2018-01-26 15:43:29 +000041}
42
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +000043def MIMGBaseOpcode : GenericEnum {
44 let FilterClass = "MIMGBaseOpcode";
45}
46
47def MIMGBaseOpcodesTable : GenericTable {
48 let FilterClass = "MIMGBaseOpcode";
49 let CppTypeName = "MIMGBaseOpcodeInfo";
David Stuttardf77079f2019-01-14 11:55:24 +000050 let Fields = ["BaseOpcode", "Store", "Atomic", "AtomicX2", "Sampler", "Gather4",
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +000051 "NumExtraArgs", "Gradients", "Coordinates", "LodOrClampOrMip",
52 "HasD16"];
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +000053 GenericEnum TypeOf_BaseOpcode = MIMGBaseOpcode;
54
55 let PrimaryKey = ["BaseOpcode"];
56 let PrimaryKeyName = "getMIMGBaseOpcodeInfo";
Nicolai Haehnlef2674312018-06-21 13:36:01 +000057}
58
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +000059def MIMGDim : GenericEnum {
60 let FilterClass = "AMDGPUDimProps";
61}
62
63def MIMGDimInfoTable : GenericTable {
64 let FilterClass = "AMDGPUDimProps";
65 let CppTypeName = "MIMGDimInfo";
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +000066 let Fields = ["Dim", "NumCoords", "NumGradients", "DA", "Encoding", "AsmSuffix"];
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +000067 GenericEnum TypeOf_Dim = MIMGDim;
68
69 let PrimaryKey = ["Dim"];
70 let PrimaryKeyName = "getMIMGDimInfo";
71}
72
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +000073def getMIMGDimInfoByEncoding : SearchIndex {
74 let Table = MIMGDimInfoTable;
75 let Key = ["Encoding"];
76}
77
78def getMIMGDimInfoByAsmSuffix : SearchIndex {
79 let Table = MIMGDimInfoTable;
80 let Key = ["AsmSuffix"];
81}
82
83class mimg <bits<7> si_gfx10, bits<7> vi = si_gfx10> {
84 field bits<7> SI_GFX10 = si_gfx10;
85 field bits<7> VI = vi;
86}
87
Ryan Taylor894c8fd2018-08-01 12:12:01 +000088class MIMGLZMapping<MIMGBaseOpcode l, MIMGBaseOpcode lz> {
89 MIMGBaseOpcode L = l;
90 MIMGBaseOpcode LZ = lz;
91}
92
93def MIMGLZMappingTable : GenericTable {
94 let FilterClass = "MIMGLZMapping";
95 let CppTypeName = "MIMGLZMappingInfo";
96 let Fields = ["L", "LZ"];
97 GenericEnum TypeOf_L = MIMGBaseOpcode;
98 GenericEnum TypeOf_LZ = MIMGBaseOpcode;
99
100 let PrimaryKey = ["L"];
101 let PrimaryKeyName = "getMIMGLZMappingInfo";
102}
103
Piotr Sobczak9b11e932019-06-10 15:58:51 +0000104class MIMGMIPMapping<MIMGBaseOpcode mip, MIMGBaseOpcode nonmip> {
105 MIMGBaseOpcode MIP = mip;
106 MIMGBaseOpcode NONMIP = nonmip;
107}
108
109def MIMGMIPMappingTable : GenericTable {
110 let FilterClass = "MIMGMIPMapping";
111 let CppTypeName = "MIMGMIPMappingInfo";
112 let Fields = ["MIP", "NONMIP"];
113 GenericEnum TypeOf_MIP = MIMGBaseOpcode;
114 GenericEnum TypeOf_NONMIP = MIMGBaseOpcode;
115
116 let PrimaryKey = ["MIP"];
117 let PrimaryKeyName = "getMIMGMIPMappingInfo";
118}
119
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000120class MIMG <dag outs, string dns = "">
121 : InstSI <outs, (ins), "", []> {
122
123 let VM_CNT = 1;
124 let EXP_CNT = 1;
125 let MIMG = 1;
126 let Uses = [EXEC];
Changpeng Fangb28fe032016-09-01 17:54:54 +0000127 let mayLoad = 1;
128 let mayStore = 0;
129 let hasPostISelHook = 1;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000130 let SchedRW = [WriteVMEM];
131 let UseNamedOperandTable = 1;
132 let hasSideEffects = 0; // XXX ????
133
Changpeng Fangb28fe032016-09-01 17:54:54 +0000134 let DecoderNamespace = dns;
135 let isAsmParserOnly = !if(!eq(dns,""), 1, 0);
136 let AsmMatchConverter = "cvtMIMG";
Tom Stellard244891d2016-12-20 15:52:17 +0000137 let usesCustomInserter = 1;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000138
139 Instruction Opcode = !cast<Instruction>(NAME);
140 MIMGBaseOpcode BaseOpcode;
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000141 MIMGEncoding MIMGEncoding;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000142 bits<8> VDataDwords;
143 bits<8> VAddrDwords;
144}
145
146def MIMGInfoTable : GenericTable {
147 let FilterClass = "MIMG";
148 let CppTypeName = "MIMGInfo";
149 let Fields = ["Opcode", "BaseOpcode", "MIMGEncoding", "VDataDwords", "VAddrDwords"];
150 GenericEnum TypeOf_BaseOpcode = MIMGBaseOpcode;
151 GenericEnum TypeOf_MIMGEncoding = MIMGEncoding;
152
153 let PrimaryKey = ["BaseOpcode", "MIMGEncoding", "VDataDwords", "VAddrDwords"];
154 let PrimaryKeyName = "getMIMGOpcodeHelper";
155}
156
157def getMIMGInfo : SearchIndex {
158 let Table = MIMGInfoTable;
159 let Key = ["Opcode"];
Changpeng Fangb28fe032016-09-01 17:54:54 +0000160}
161
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000162// This is a separate class so that TableGen memoizes the computations.
163class MIMGNSAHelper<int num_addrs> {
164 list<string> AddrAsmNames =
165 !foldl([]<string>, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], lhs, i,
166 !if(!lt(i, num_addrs), !listconcat(lhs, ["vaddr"#!size(lhs)]), lhs));
167 dag AddrIns = !dag(ins, !foreach(arg, AddrAsmNames, VGPR_32), AddrAsmNames);
168 string AddrAsm = "[" # !foldl("$" # !head(AddrAsmNames), !tail(AddrAsmNames), lhs, rhs,
169 lhs # ", $" # rhs) # "]";
170
171 int NSA = !if(!le(num_addrs, 1), ?,
172 !if(!le(num_addrs, 5), 1,
173 !if(!le(num_addrs, 9), 2,
174 !if(!le(num_addrs, 13), 3, ?))));
175}
176
177// Base class of all pre-gfx10 MIMG instructions.
178class MIMG_gfx6789<bits<7> op, dag outs, string dns = "">
179 : MIMG<outs, dns>, MIMGe_gfx6789<op> {
180 let SubtargetPredicate = isGFX6GFX7GFX8GFX9;
181 let AssemblerPredicates = [isGFX6GFX7GFX8GFX9];
182
183 let MIMGEncoding = MIMGEncGfx6;
184
185 let d16 = !if(BaseOpcode.HasD16, ?, 0);
186}
187
188// Base class of all non-NSA gfx10 MIMG instructions.
189class MIMG_gfx10<int op, dag outs, string dns = "">
190 : MIMG<outs, dns>, MIMGe_gfx10<op> {
191 let SubtargetPredicate = isGFX10Plus;
192 let AssemblerPredicates = [isGFX10Plus];
193
194 let MIMGEncoding = MIMGEncGfx10Default;
195
196 let d16 = !if(BaseOpcode.HasD16, ?, 0);
197 let nsa = 0;
198}
199
200// Base class for all NSA MIMG instructions. Note that 1-dword addresses always
201// use non-NSA variants.
202class MIMG_nsa_gfx10<int op, dag outs, int num_addrs, string dns="">
203 : MIMG<outs, dns>, MIMGe_gfx10<op> {
204 let SubtargetPredicate = isGFX10Plus;
205 let AssemblerPredicates = [isGFX10Plus];
206
207 let MIMGEncoding = MIMGEncGfx10NSA;
208
209 MIMGNSAHelper nsah = MIMGNSAHelper<num_addrs>;
210 dag AddrIns = nsah.AddrIns;
211 string AddrAsm = nsah.AddrAsm;
212
213 let d16 = !if(BaseOpcode.HasD16, ?, 0);
214 let nsa = nsah.NSA;
215}
216
Changpeng Fangb28fe032016-09-01 17:54:54 +0000217class MIMG_NoSampler_Helper <bits<7> op, string asm,
218 RegisterClass dst_rc,
219 RegisterClass addr_rc,
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000220 string dns="">
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000221 : MIMG_gfx6789 <op, (outs dst_rc:$vdata), dns> {
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000222 let InOperandList = !con((ins addr_rc:$vaddr, SReg_256:$srsrc,
223 DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc,
Ryan Taylor1f334d02018-08-28 15:07:30 +0000224 R128A16:$r128, TFE:$tfe, LWE:$lwe, DA:$da),
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000225 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
226 let AsmString = asm#" $vdata, $vaddr, $srsrc$dmask$unorm$glc$slc$r128$tfe$lwe$da"
227 #!if(BaseOpcode.HasD16, "$d16", "");
Changpeng Fangb28fe032016-09-01 17:54:54 +0000228}
229
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000230class MIMG_NoSampler_gfx10<int op, string opcode,
231 RegisterClass DataRC, RegisterClass AddrRC,
232 string dns="">
233 : MIMG_gfx10<op, (outs DataRC:$vdata), dns> {
234 let InOperandList = !con((ins AddrRC:$vaddr0, SReg_256:$srsrc, DMask:$dmask,
235 Dim:$dim, UNorm:$unorm, DLC:$dlc, GLC:$glc,
236 SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe),
237 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
238 let AsmString = opcode#" $vdata, $vaddr0, $srsrc$dmask$dim$unorm$dlc$glc$slc$r128$tfe$lwe"
239 #!if(BaseOpcode.HasD16, "$d16", "");
240}
241
242class MIMG_NoSampler_nsa_gfx10<int op, string opcode,
243 RegisterClass DataRC, int num_addrs,
244 string dns="">
245 : MIMG_nsa_gfx10<op, (outs DataRC:$vdata), num_addrs, dns> {
246 let InOperandList = !con(AddrIns,
247 (ins SReg_256:$srsrc, DMask:$dmask,
248 Dim:$dim, UNorm:$unorm, DLC:$dlc, GLC:$glc,
249 SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe),
250 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
251 let AsmString = opcode#" $vdata, "#AddrAsm#", $srsrc$dmask$dim$unorm$dlc$glc$slc$r128$tfe$lwe"
252 #!if(BaseOpcode.HasD16, "$d16", "");
253}
254
Changpeng Fangb28fe032016-09-01 17:54:54 +0000255multiclass MIMG_NoSampler_Src_Helper <bits<7> op, string asm,
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000256 RegisterClass dst_rc,
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000257 bit enableDisasm> {
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000258 let ssamp = 0 in {
259 let VAddrDwords = 1 in {
260 def _V1 : MIMG_NoSampler_Helper <op, asm, dst_rc, VGPR_32,
261 !if(enableDisasm, "AMDGPU", "")>;
262 def _V1_gfx10 : MIMG_NoSampler_gfx10<op, asm, dst_rc, VGPR_32,
263 !if(enableDisasm, "AMDGPU", "")>;
264 }
265
266 let VAddrDwords = 2 in {
267 def _V2 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_64>;
268 def _V2_gfx10 : MIMG_NoSampler_gfx10<op, asm, dst_rc, VReg_64>;
269 def _V2_nsa_gfx10 : MIMG_NoSampler_nsa_gfx10<op, asm, dst_rc, 2>;
270 }
271
272 let VAddrDwords = 3 in {
273 def _V3 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_96>;
274 def _V3_gfx10 : MIMG_NoSampler_gfx10<op, asm, dst_rc, VReg_96>;
275 def _V3_nsa_gfx10 : MIMG_NoSampler_nsa_gfx10<op, asm, dst_rc, 3>;
276 }
277
278 let VAddrDwords = 4 in {
279 def _V4 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_128>;
280 def _V4_gfx10 : MIMG_NoSampler_gfx10<op, asm, dst_rc, VReg_128>;
281 def _V4_nsa_gfx10 : MIMG_NoSampler_nsa_gfx10<op, asm, dst_rc, 4,
282 !if(enableDisasm, "AMDGPU", "")>;
283 }
284 }
Changpeng Fangb28fe032016-09-01 17:54:54 +0000285}
286
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000287multiclass MIMG_NoSampler <bits<7> op, string asm, bit has_d16, bit mip = 0,
288 bit isResInfo = 0> {
289 def "" : MIMGBaseOpcode {
290 let Coordinates = !if(isResInfo, 0, 1);
291 let LodOrClampOrMip = mip;
292 let HasD16 = has_d16;
293 }
294
295 let BaseOpcode = !cast<MIMGBaseOpcode>(NAME),
296 mayLoad = !if(isResInfo, 0, 1) in {
297 let VDataDwords = 1 in
298 defm _V1 : MIMG_NoSampler_Src_Helper <op, asm, VGPR_32, 1>;
299 let VDataDwords = 2 in
300 defm _V2 : MIMG_NoSampler_Src_Helper <op, asm, VReg_64, 0>;
301 let VDataDwords = 3 in
302 defm _V3 : MIMG_NoSampler_Src_Helper <op, asm, VReg_96, 0>;
303 let VDataDwords = 4 in
304 defm _V4 : MIMG_NoSampler_Src_Helper <op, asm, VReg_128, 0>;
Tim Renouf6f0191a2019-03-22 15:21:11 +0000305 let VDataDwords = 5 in
306 defm _V5 : MIMG_NoSampler_Src_Helper <op, asm, VReg_160, 0>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000307 }
Dmitry Preobrazhensky2456ac62018-03-28 15:44:16 +0000308}
309
Changpeng Fangb28fe032016-09-01 17:54:54 +0000310class MIMG_Store_Helper <bits<7> op, string asm,
311 RegisterClass data_rc,
Matt Arsenaultcad7fa82017-12-13 21:07:51 +0000312 RegisterClass addr_rc,
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000313 string dns = "">
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000314 : MIMG_gfx6789<op, (outs), dns> {
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000315 let InOperandList = !con((ins data_rc:$vdata, addr_rc:$vaddr, SReg_256:$srsrc,
316 DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc,
Ryan Taylor1f334d02018-08-28 15:07:30 +0000317 R128A16:$r128, TFE:$tfe, LWE:$lwe, DA:$da),
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000318 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
319 let AsmString = asm#" $vdata, $vaddr, $srsrc$dmask$unorm$glc$slc$r128$tfe$lwe$da"
320 #!if(BaseOpcode.HasD16, "$d16", "");
Changpeng Fangb28fe032016-09-01 17:54:54 +0000321}
322
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000323class MIMG_Store_gfx10<int op, string opcode,
324 RegisterClass DataRC, RegisterClass AddrRC,
325 string dns="">
326 : MIMG_gfx10<op, (outs), dns> {
327 let InOperandList = !con((ins DataRC:$vdata, AddrRC:$vaddr0, SReg_256:$srsrc,
328 DMask:$dmask, Dim:$dim, UNorm:$unorm, DLC:$dlc,
329 GLC:$glc, SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe),
330 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
331 let AsmString = opcode#" $vdata, $vaddr0, $srsrc$dmask$dim$unorm$dlc$glc$slc$r128$tfe$lwe"
332 #!if(BaseOpcode.HasD16, "$d16", "");
333}
334
335class MIMG_Store_nsa_gfx10<int op, string opcode,
336 RegisterClass DataRC, int num_addrs,
337 string dns="">
338 : MIMG_nsa_gfx10<op, (outs), num_addrs, dns> {
339 let InOperandList = !con((ins DataRC:$vdata),
340 AddrIns,
341 (ins SReg_256:$srsrc, DMask:$dmask,
342 Dim:$dim, UNorm:$unorm, DLC:$dlc, GLC:$glc,
343 SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe),
344 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
345 let AsmString = opcode#" $vdata, "#AddrAsm#", $srsrc$dmask$dim$unorm$dlc$glc$slc$r128$tfe$lwe"
346 #!if(BaseOpcode.HasD16, "$d16", "");
347}
348
349multiclass MIMG_Store_Addr_Helper <int op, string asm,
Changpeng Fangb28fe032016-09-01 17:54:54 +0000350 RegisterClass data_rc,
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000351 bit enableDisasm> {
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000352 let mayLoad = 0, mayStore = 1, hasSideEffects = 0, hasPostISelHook = 0,
353 DisableWQM = 1, ssamp = 0 in {
354 let VAddrDwords = 1 in {
355 def _V1 : MIMG_Store_Helper <op, asm, data_rc, VGPR_32,
356 !if(enableDisasm, "AMDGPU", "")>;
357 def _V1_gfx10 : MIMG_Store_gfx10 <op, asm, data_rc, VGPR_32,
358 !if(enableDisasm, "AMDGPU", "")>;
359 }
360 let VAddrDwords = 2 in {
361 def _V2 : MIMG_Store_Helper <op, asm, data_rc, VReg_64>;
362 def _V2_gfx10 : MIMG_Store_gfx10 <op, asm, data_rc, VReg_64>;
363 def _V2_nsa_gfx10 : MIMG_Store_nsa_gfx10 <op, asm, data_rc, 2>;
364 }
365 let VAddrDwords = 3 in {
366 def _V3 : MIMG_Store_Helper <op, asm, data_rc, VReg_96>;
367 def _V3_gfx10 : MIMG_Store_gfx10 <op, asm, data_rc, VReg_96>;
368 def _V3_nsa_gfx10 : MIMG_Store_nsa_gfx10 <op, asm, data_rc, 3>;
369 }
370 let VAddrDwords = 4 in {
371 def _V4 : MIMG_Store_Helper <op, asm, data_rc, VReg_128>;
372 def _V4_gfx10 : MIMG_Store_gfx10 <op, asm, data_rc, VReg_128>;
373 def _V4_nsa_gfx10 : MIMG_Store_nsa_gfx10 <op, asm, data_rc, 4,
374 !if(enableDisasm, "AMDGPU", "")>;
375 }
376 }
Changpeng Fangb28fe032016-09-01 17:54:54 +0000377}
378
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000379multiclass MIMG_Store <bits<7> op, string asm, bit has_d16, bit mip = 0> {
380 def "" : MIMGBaseOpcode {
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000381 let Store = 1;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000382 let LodOrClampOrMip = mip;
383 let HasD16 = has_d16;
384 }
385
386 let BaseOpcode = !cast<MIMGBaseOpcode>(NAME) in {
387 let VDataDwords = 1 in
388 defm _V1 : MIMG_Store_Addr_Helper <op, asm, VGPR_32, 1>;
389 let VDataDwords = 2 in
390 defm _V2 : MIMG_Store_Addr_Helper <op, asm, VReg_64, 0>;
391 let VDataDwords = 3 in
392 defm _V3 : MIMG_Store_Addr_Helper <op, asm, VReg_96, 0>;
393 let VDataDwords = 4 in
394 defm _V4 : MIMG_Store_Addr_Helper <op, asm, VReg_128, 0>;
395 }
Dmitry Preobrazhensky2456ac62018-03-28 15:44:16 +0000396}
397
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000398class MIMG_Atomic_gfx6789_base <bits<7> op, string asm, RegisterClass data_rc,
399 RegisterClass addr_rc, string dns="">
400 : MIMG_gfx6789 <op, (outs data_rc:$vdst), dns> {
Changpeng Fangb28fe032016-09-01 17:54:54 +0000401 let Constraints = "$vdst = $vdata";
402 let AsmMatchConverter = "cvtMIMGAtomic";
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000403
404 let InOperandList = (ins data_rc:$vdata, addr_rc:$vaddr, SReg_256:$srsrc,
405 DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc,
Ryan Taylor1f334d02018-08-28 15:07:30 +0000406 R128A16:$r128, TFE:$tfe, LWE:$lwe, DA:$da);
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000407 let AsmString = asm#" $vdst, $vaddr, $srsrc$dmask$unorm$glc$slc$r128$tfe$lwe$da";
Changpeng Fangb28fe032016-09-01 17:54:54 +0000408}
409
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000410class MIMG_Atomic_si<mimg op, string asm, RegisterClass data_rc,
411 RegisterClass addr_rc, bit enableDasm = 0>
412 : MIMG_Atomic_gfx6789_base<op.SI_GFX10, asm, data_rc, addr_rc,
413 !if(enableDasm, "GFX6GFX7", "")> {
414 let AssemblerPredicates = [isGFX6GFX7];
415}
Changpeng Fangb28fe032016-09-01 17:54:54 +0000416
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000417class MIMG_Atomic_vi<mimg op, string asm, RegisterClass data_rc,
418 RegisterClass addr_rc, bit enableDasm = 0>
419 : MIMG_Atomic_gfx6789_base<op.VI, asm, data_rc, addr_rc, !if(enableDasm, "GFX8", "")> {
420 let AssemblerPredicates = [isGFX8GFX9];
421 let MIMGEncoding = MIMGEncGfx8;
422}
423
424class MIMG_Atomic_gfx10<mimg op, string opcode,
425 RegisterClass DataRC, RegisterClass AddrRC,
426 bit enableDisasm = 0>
427 : MIMG_gfx10<!cast<int>(op.SI_GFX10), (outs DataRC:$vdst),
428 !if(enableDisasm, "AMDGPU", "")> {
429 let Constraints = "$vdst = $vdata";
430 let AsmMatchConverter = "cvtMIMGAtomic";
431
432 let InOperandList = (ins DataRC:$vdata, AddrRC:$vaddr0, SReg_256:$srsrc,
433 DMask:$dmask, Dim:$dim, UNorm:$unorm, DLC:$dlc,
434 GLC:$glc, SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe);
435 let AsmString = opcode#" $vdst, $vaddr0, $srsrc$dmask$dim$unorm$dlc$glc$slc$r128$tfe$lwe";
436}
437
438class MIMG_Atomic_nsa_gfx10<mimg op, string opcode,
439 RegisterClass DataRC, int num_addrs,
440 bit enableDisasm = 0>
441 : MIMG_nsa_gfx10<!cast<int>(op.SI_GFX10), (outs DataRC:$vdst), num_addrs,
442 !if(enableDisasm, "AMDGPU", "")> {
443 let Constraints = "$vdst = $vdata";
444 let AsmMatchConverter = "cvtMIMGAtomic";
445
446 let InOperandList = !con((ins DataRC:$vdata),
447 AddrIns,
448 (ins SReg_256:$srsrc, DMask:$dmask,
449 Dim:$dim, UNorm:$unorm, DLC:$dlc, GLC:$glc,
450 SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe));
451 let AsmString = opcode#" $vdata, "#AddrAsm#", $srsrc$dmask$dim$unorm$dlc$glc$slc$r128$tfe$lwe";
Changpeng Fangb28fe032016-09-01 17:54:54 +0000452}
453
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000454multiclass MIMG_Atomic_Addr_Helper_m <mimg op, string asm,
Dmitry Preobrazhensky0b4eb1e2018-01-26 15:43:29 +0000455 RegisterClass data_rc,
Dmitry Preobrazhensky0b4eb1e2018-01-26 15:43:29 +0000456 bit enableDasm = 0> {
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000457 let hasSideEffects = 1, // FIXME: remove this
458 mayLoad = 1, mayStore = 1, hasPostISelHook = 0, DisableWQM = 1,
459 ssamp = 0 in {
460 let VAddrDwords = 1 in {
461 def _V1_si : MIMG_Atomic_si <op, asm, data_rc, VGPR_32, enableDasm>;
462 def _V1_vi : MIMG_Atomic_vi <op, asm, data_rc, VGPR_32, enableDasm>;
463 def _V1_gfx10 : MIMG_Atomic_gfx10 <op, asm, data_rc, VGPR_32, enableDasm>;
464 }
465 let VAddrDwords = 2 in {
466 def _V2_si : MIMG_Atomic_si <op, asm, data_rc, VReg_64, 0>;
467 def _V2_vi : MIMG_Atomic_vi <op, asm, data_rc, VReg_64, 0>;
468 def _V2_gfx10 : MIMG_Atomic_gfx10 <op, asm, data_rc, VReg_64, 0>;
469 def _V2_nsa_gfx10 : MIMG_Atomic_nsa_gfx10 <op, asm, data_rc, 2, 0>;
470 }
471 let VAddrDwords = 3 in {
472 def _V3_si : MIMG_Atomic_si <op, asm, data_rc, VReg_96, 0>;
473 def _V3_vi : MIMG_Atomic_vi <op, asm, data_rc, VReg_96, 0>;
474 def _V3_gfx10 : MIMG_Atomic_gfx10 <op, asm, data_rc, VReg_96, 0>;
475 def _V3_nsa_gfx10 : MIMG_Atomic_nsa_gfx10 <op, asm, data_rc, 3, 0>;
476 }
477 let VAddrDwords = 4 in {
478 def _V4_si : MIMG_Atomic_si <op, asm, data_rc, VReg_128, 0>;
479 def _V4_vi : MIMG_Atomic_vi <op, asm, data_rc, VReg_128, 0>;
480 def _V4_gfx10 : MIMG_Atomic_gfx10 <op, asm, data_rc, VReg_128, 0>;
481 def _V4_nsa_gfx10 : MIMG_Atomic_nsa_gfx10 <op, asm, data_rc, 4, enableDasm>;
482 }
483 }
Dmitry Preobrazhensky0b4eb1e2018-01-26 15:43:29 +0000484}
485
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000486multiclass MIMG_Atomic <mimg op, string asm, bit isCmpSwap = 0> { // 64-bit atomics
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000487 def "" : MIMGBaseOpcode {
488 let Atomic = 1;
489 let AtomicX2 = isCmpSwap;
490 }
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000491
492 let BaseOpcode = !cast<MIMGBaseOpcode>(NAME) in {
493 // _V* variants have different dst size, but the size is encoded implicitly,
494 // using dmask and tfe. Only 32-bit variant is registered with disassembler.
495 // Other variants are reconstructed by disassembler using dmask and tfe.
496 let VDataDwords = !if(isCmpSwap, 2, 1) in
497 defm _V1 : MIMG_Atomic_Addr_Helper_m <op, asm, !if(isCmpSwap, VReg_64, VGPR_32), 1>;
498 let VDataDwords = !if(isCmpSwap, 4, 2) in
499 defm _V2 : MIMG_Atomic_Addr_Helper_m <op, asm, !if(isCmpSwap, VReg_128, VReg_64)>;
500 }
Changpeng Fangb28fe032016-09-01 17:54:54 +0000501}
502
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000503class MIMG_Sampler_Helper <bits<7> op, string asm, RegisterClass dst_rc,
504 RegisterClass src_rc, string dns="">
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000505 : MIMG_gfx6789 <op, (outs dst_rc:$vdata), dns> {
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000506 let InOperandList = !con((ins src_rc:$vaddr, SReg_256:$srsrc, SReg_128:$ssamp,
507 DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc,
Ryan Taylor1f334d02018-08-28 15:07:30 +0000508 R128A16:$r128, TFE:$tfe, LWE:$lwe, DA:$da),
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000509 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
510 let AsmString = asm#" $vdata, $vaddr, $srsrc, $ssamp$dmask$unorm$glc$slc$r128$tfe$lwe$da"
511 #!if(BaseOpcode.HasD16, "$d16", "");
Changpeng Fangb28fe032016-09-01 17:54:54 +0000512}
513
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000514class MIMG_Sampler_gfx10<int op, string opcode,
515 RegisterClass DataRC, RegisterClass AddrRC,
516 string dns="">
517 : MIMG_gfx10<op, (outs DataRC:$vdata), dns> {
518 let InOperandList = !con((ins AddrRC:$vaddr0, SReg_256:$srsrc, SReg_128:$ssamp,
519 DMask:$dmask, Dim:$dim, UNorm:$unorm, DLC:$dlc,
520 GLC:$glc, SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe),
521 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
522 let AsmString = opcode#" $vdata, $vaddr0, $srsrc, $ssamp$dmask$dim$unorm"
523 #"$dlc$glc$slc$r128$tfe$lwe"
524 #!if(BaseOpcode.HasD16, "$d16", "");
525}
526
527class MIMG_Sampler_nsa_gfx10<int op, string opcode,
528 RegisterClass DataRC, int num_addrs,
529 string dns="">
530 : MIMG_nsa_gfx10<op, (outs DataRC:$vdata), num_addrs, dns> {
531 let InOperandList = !con(AddrIns,
532 (ins SReg_256:$srsrc, SReg_128:$ssamp, DMask:$dmask,
533 Dim:$dim, UNorm:$unorm, DLC:$dlc, GLC:$glc,
534 SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe),
535 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
536 let AsmString = opcode#" $vdata, "#AddrAsm#", $srsrc, $ssamp$dmask$dim$unorm"
537 #"$dlc$glc$slc$r128$tfe$lwe"
538 #!if(BaseOpcode.HasD16, "$d16", "");
539}
540
Nicolai Haehnle15745ba2018-06-21 13:37:55 +0000541class MIMGAddrSize<int dw, bit enable_disasm> {
542 int NumWords = dw;
543
544 RegisterClass RegClass = !if(!le(NumWords, 0), ?,
545 !if(!eq(NumWords, 1), VGPR_32,
546 !if(!eq(NumWords, 2), VReg_64,
547 !if(!eq(NumWords, 3), VReg_96,
548 !if(!eq(NumWords, 4), VReg_128,
549 !if(!le(NumWords, 8), VReg_256,
550 !if(!le(NumWords, 16), VReg_512, ?)))))));
551
552 // Whether the instruction variant with this vaddr size should be enabled for
553 // the auto-generated disassembler.
554 bit Disassemble = enable_disasm;
555}
556
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000557// Return whether x is in lst.
558class isIntInList<int x, list<int> lst> {
559 bit ret = !foldl(0, lst, lhs, y, !or(lhs, !eq(x, y)));
560}
561
Nicolai Haehnle15745ba2018-06-21 13:37:55 +0000562// Return whether a value inside the range [min, max] (endpoints inclusive)
563// is in the given list.
564class isRangeInList<int min, int max, list<int> lst> {
565 bit ret = !foldl(0, lst, lhs, y, !or(lhs, !and(!le(min, y), !le(y, max))));
566}
567
568class MIMGAddrSizes_tmp<list<MIMGAddrSize> lst, int min> {
569 list<MIMGAddrSize> List = lst;
570 int Min = min;
571}
572
573class MIMG_Sampler_AddrSizes<AMDGPUSampleVariant sample> {
574 // List of all possible numbers of address words, taking all combinations of
575 // A16 and image dimension into account (note: no MSAA, since this is for
576 // sample/gather ops).
577 list<int> AllNumAddrWords =
578 !foreach(dw, !if(sample.Gradients,
579 !if(!eq(sample.LodOrClamp, ""),
580 [2, 3, 4, 5, 6, 7, 9],
581 [2, 3, 4, 5, 7, 8, 10]),
582 !if(!eq(sample.LodOrClamp, ""),
583 [1, 2, 3],
584 [1, 2, 3, 4])),
585 !add(dw, !size(sample.ExtraAddrArgs)));
586
587 // Generate machine instructions based on possible register classes for the
588 // required numbers of address words. The disassembler defaults to the
589 // smallest register class.
590 list<MIMGAddrSize> MachineInstrs =
591 !foldl(MIMGAddrSizes_tmp<[], 0>, [1, 2, 3, 4, 8, 16], lhs, dw,
592 !if(isRangeInList<lhs.Min, dw, AllNumAddrWords>.ret,
593 MIMGAddrSizes_tmp<
594 !listconcat(lhs.List, [MIMGAddrSize<dw, !empty(lhs.List)>]),
595 !if(!eq(dw, 3), 3, !add(dw, 1))>, // we still need _V4 for codegen w/ 3 dwords
596 lhs)).List;
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000597
598 // For NSA, generate machine instructions for all possible numbers of words
599 // except 1 (which is already covered by the non-NSA case).
600 // The disassembler defaults to the largest number of arguments among the
601 // variants with the same number of NSA words, and custom code then derives
602 // the exact variant based on the sample variant and the image dimension.
603 list<MIMGAddrSize> NSAInstrs =
604 !foldl([]<MIMGAddrSize>, [[12, 11, 10], [9, 8, 7, 6], [5, 4, 3, 2]], prev, nsa_group,
605 !listconcat(prev,
606 !foldl([]<MIMGAddrSize>, nsa_group, lhs, dw,
607 !if(isIntInList<dw, AllNumAddrWords>.ret,
608 !listconcat(lhs, [MIMGAddrSize<dw, !empty(lhs)>]),
609 lhs))));
Nicolai Haehnle15745ba2018-06-21 13:37:55 +0000610}
611
612multiclass MIMG_Sampler_Src_Helper <bits<7> op, string asm,
613 AMDGPUSampleVariant sample, RegisterClass dst_rc,
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000614 bit enableDisasm = 0> {
Nicolai Haehnle15745ba2018-06-21 13:37:55 +0000615 foreach addr = MIMG_Sampler_AddrSizes<sample>.MachineInstrs in {
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000616 let VAddrDwords = addr.NumWords in {
617 def _V # addr.NumWords
618 : MIMG_Sampler_Helper <op, asm, dst_rc, addr.RegClass,
619 !if(!and(enableDisasm, addr.Disassemble), "AMDGPU", "")>;
620 def _V # addr.NumWords # _gfx10
621 : MIMG_Sampler_gfx10 <op, asm, dst_rc, addr.RegClass,
622 !if(!and(enableDisasm, addr.Disassemble), "AMDGPU", "")>;
623 }
624 }
625
626 foreach addr = MIMG_Sampler_AddrSizes<sample>.NSAInstrs in {
627 let VAddrDwords = addr.NumWords in {
628 def _V # addr.NumWords # _nsa_gfx10
629 : MIMG_Sampler_nsa_gfx10<op, asm, dst_rc, addr.NumWords,
630 !if(!and(enableDisasm, addr.Disassemble), "AMDGPU", "")>;
631 }
Nicolai Haehnle15745ba2018-06-21 13:37:55 +0000632 }
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000633}
634
635class MIMG_Sampler_BaseOpcode<AMDGPUSampleVariant sample>
636 : MIMGBaseOpcode {
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000637 let Sampler = 1;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000638 let NumExtraArgs = !size(sample.ExtraAddrArgs);
639 let Gradients = sample.Gradients;
640 let LodOrClampOrMip = !ne(sample.LodOrClamp, "");
Changpeng Fangb28fe032016-09-01 17:54:54 +0000641}
642
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000643multiclass MIMG_Sampler <bits<7> op, AMDGPUSampleVariant sample, bit wqm = 0,
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000644 bit isGetLod = 0,
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000645 string asm = "image_sample"#sample.LowerCaseMod> {
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000646 def "" : MIMG_Sampler_BaseOpcode<sample> {
647 let HasD16 = !if(isGetLod, 0, 1);
648 }
649
650 let BaseOpcode = !cast<MIMGBaseOpcode>(NAME), WQM = wqm,
651 mayLoad = !if(isGetLod, 0, 1) in {
652 let VDataDwords = 1 in
Nicolai Haehnle15745ba2018-06-21 13:37:55 +0000653 defm _V1 : MIMG_Sampler_Src_Helper<op, asm, sample, VGPR_32, 1>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000654 let VDataDwords = 2 in
Nicolai Haehnle15745ba2018-06-21 13:37:55 +0000655 defm _V2 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_64>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000656 let VDataDwords = 3 in
Nicolai Haehnle15745ba2018-06-21 13:37:55 +0000657 defm _V3 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_96>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000658 let VDataDwords = 4 in
Nicolai Haehnle15745ba2018-06-21 13:37:55 +0000659 defm _V4 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_128>;
Tim Renouf6f0191a2019-03-22 15:21:11 +0000660 let VDataDwords = 5 in
661 defm _V5 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_160>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000662 }
Changpeng Fangb28fe032016-09-01 17:54:54 +0000663}
664
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000665multiclass MIMG_Sampler_WQM <bits<7> op, AMDGPUSampleVariant sample>
666 : MIMG_Sampler<op, sample, 1>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000667
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000668multiclass MIMG_Gather <bits<7> op, AMDGPUSampleVariant sample, bit wqm = 0,
669 string asm = "image_gather4"#sample.LowerCaseMod> {
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000670 def "" : MIMG_Sampler_BaseOpcode<sample> {
671 let HasD16 = 1;
David Stuttardf77079f2019-01-14 11:55:24 +0000672 let Gather4 = 1;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000673 }
674
675 let BaseOpcode = !cast<MIMGBaseOpcode>(NAME), WQM = wqm,
676 Gather4 = 1, hasPostISelHook = 0 in {
677 let VDataDwords = 2 in
Nicolai Haehnle15745ba2018-06-21 13:37:55 +0000678 defm _V2 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_64>; /* for packed D16 only */
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000679 let VDataDwords = 4 in
Nicolai Haehnle15745ba2018-06-21 13:37:55 +0000680 defm _V4 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_128, 1>;
Tim Renouf6f0191a2019-03-22 15:21:11 +0000681 let VDataDwords = 5 in
682 defm _V5 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_160>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000683 }
Changpeng Fangb28fe032016-09-01 17:54:54 +0000684}
685
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000686multiclass MIMG_Gather_WQM <bits<7> op, AMDGPUSampleVariant sample>
687 : MIMG_Gather<op, sample, 1>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000688
689//===----------------------------------------------------------------------===//
690// MIMG Instructions
691//===----------------------------------------------------------------------===//
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000692defm IMAGE_LOAD : MIMG_NoSampler <0x00000000, "image_load", 1>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000693defm IMAGE_LOAD_MIP : MIMG_NoSampler <0x00000001, "image_load_mip", 1, 1>;
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000694defm IMAGE_LOAD_PCK : MIMG_NoSampler <0x00000002, "image_load_pck", 0>;
695defm IMAGE_LOAD_PCK_SGN : MIMG_NoSampler <0x00000003, "image_load_pck_sgn", 0>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000696defm IMAGE_LOAD_MIP_PCK : MIMG_NoSampler <0x00000004, "image_load_mip_pck", 0, 1>;
697defm IMAGE_LOAD_MIP_PCK_SGN : MIMG_NoSampler <0x00000005, "image_load_mip_pck_sgn", 0, 1>;
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000698defm IMAGE_STORE : MIMG_Store <0x00000008, "image_store", 1>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000699defm IMAGE_STORE_MIP : MIMG_Store <0x00000009, "image_store_mip", 1, 1>;
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000700defm IMAGE_STORE_PCK : MIMG_Store <0x0000000a, "image_store_pck", 0>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000701defm IMAGE_STORE_MIP_PCK : MIMG_Store <0x0000000b, "image_store_mip_pck", 0, 1>;
Matt Arsenault856777d2017-12-08 20:00:57 +0000702
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000703defm IMAGE_GET_RESINFO : MIMG_NoSampler <0x0000000e, "image_get_resinfo", 0, 1, 1>;
Matt Arsenault856777d2017-12-08 20:00:57 +0000704
Changpeng Fangb28fe032016-09-01 17:54:54 +0000705defm IMAGE_ATOMIC_SWAP : MIMG_Atomic <mimg<0x0f, 0x10>, "image_atomic_swap">;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000706defm IMAGE_ATOMIC_CMPSWAP : MIMG_Atomic <mimg<0x10, 0x11>, "image_atomic_cmpswap", 1>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000707defm IMAGE_ATOMIC_ADD : MIMG_Atomic <mimg<0x11, 0x12>, "image_atomic_add">;
708defm IMAGE_ATOMIC_SUB : MIMG_Atomic <mimg<0x12, 0x13>, "image_atomic_sub">;
709//def IMAGE_ATOMIC_RSUB : MIMG_NoPattern_ <"image_atomic_rsub", 0x00000013>; -- not on VI
710defm IMAGE_ATOMIC_SMIN : MIMG_Atomic <mimg<0x14>, "image_atomic_smin">;
711defm IMAGE_ATOMIC_UMIN : MIMG_Atomic <mimg<0x15>, "image_atomic_umin">;
712defm IMAGE_ATOMIC_SMAX : MIMG_Atomic <mimg<0x16>, "image_atomic_smax">;
713defm IMAGE_ATOMIC_UMAX : MIMG_Atomic <mimg<0x17>, "image_atomic_umax">;
714defm IMAGE_ATOMIC_AND : MIMG_Atomic <mimg<0x18>, "image_atomic_and">;
715defm IMAGE_ATOMIC_OR : MIMG_Atomic <mimg<0x19>, "image_atomic_or">;
716defm IMAGE_ATOMIC_XOR : MIMG_Atomic <mimg<0x1a>, "image_atomic_xor">;
717defm IMAGE_ATOMIC_INC : MIMG_Atomic <mimg<0x1b>, "image_atomic_inc">;
718defm IMAGE_ATOMIC_DEC : MIMG_Atomic <mimg<0x1c>, "image_atomic_dec">;
Stanislav Mekhanoshinbdf7f812019-06-21 16:30:14 +0000719//let FPAtomic = 1 in {
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000720//def IMAGE_ATOMIC_FCMPSWAP : MIMG_NoPattern_ <"image_atomic_fcmpswap", 0x0000001d, 1>; -- not on VI
Changpeng Fangb28fe032016-09-01 17:54:54 +0000721//def IMAGE_ATOMIC_FMIN : MIMG_NoPattern_ <"image_atomic_fmin", 0x0000001e>; -- not on VI
722//def IMAGE_ATOMIC_FMAX : MIMG_NoPattern_ <"image_atomic_fmax", 0x0000001f>; -- not on VI
Stanislav Mekhanoshinbdf7f812019-06-21 16:30:14 +0000723//} // End let FPAtomic = 1
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000724defm IMAGE_SAMPLE : MIMG_Sampler_WQM <0x00000020, AMDGPUSample>;
725defm IMAGE_SAMPLE_CL : MIMG_Sampler_WQM <0x00000021, AMDGPUSample_cl>;
726defm IMAGE_SAMPLE_D : MIMG_Sampler <0x00000022, AMDGPUSample_d>;
727defm IMAGE_SAMPLE_D_CL : MIMG_Sampler <0x00000023, AMDGPUSample_d_cl>;
728defm IMAGE_SAMPLE_L : MIMG_Sampler <0x00000024, AMDGPUSample_l>;
729defm IMAGE_SAMPLE_B : MIMG_Sampler_WQM <0x00000025, AMDGPUSample_b>;
730defm IMAGE_SAMPLE_B_CL : MIMG_Sampler_WQM <0x00000026, AMDGPUSample_b_cl>;
731defm IMAGE_SAMPLE_LZ : MIMG_Sampler <0x00000027, AMDGPUSample_lz>;
732defm IMAGE_SAMPLE_C : MIMG_Sampler_WQM <0x00000028, AMDGPUSample_c>;
733defm IMAGE_SAMPLE_C_CL : MIMG_Sampler_WQM <0x00000029, AMDGPUSample_c_cl>;
734defm IMAGE_SAMPLE_C_D : MIMG_Sampler <0x0000002a, AMDGPUSample_c_d>;
735defm IMAGE_SAMPLE_C_D_CL : MIMG_Sampler <0x0000002b, AMDGPUSample_c_d_cl>;
736defm IMAGE_SAMPLE_C_L : MIMG_Sampler <0x0000002c, AMDGPUSample_c_l>;
737defm IMAGE_SAMPLE_C_B : MIMG_Sampler_WQM <0x0000002d, AMDGPUSample_c_b>;
738defm IMAGE_SAMPLE_C_B_CL : MIMG_Sampler_WQM <0x0000002e, AMDGPUSample_c_b_cl>;
739defm IMAGE_SAMPLE_C_LZ : MIMG_Sampler <0x0000002f, AMDGPUSample_c_lz>;
740defm IMAGE_SAMPLE_O : MIMG_Sampler_WQM <0x00000030, AMDGPUSample_o>;
741defm IMAGE_SAMPLE_CL_O : MIMG_Sampler_WQM <0x00000031, AMDGPUSample_cl_o>;
742defm IMAGE_SAMPLE_D_O : MIMG_Sampler <0x00000032, AMDGPUSample_d_o>;
743defm IMAGE_SAMPLE_D_CL_O : MIMG_Sampler <0x00000033, AMDGPUSample_d_cl_o>;
744defm IMAGE_SAMPLE_L_O : MIMG_Sampler <0x00000034, AMDGPUSample_l_o>;
745defm IMAGE_SAMPLE_B_O : MIMG_Sampler_WQM <0x00000035, AMDGPUSample_b_o>;
746defm IMAGE_SAMPLE_B_CL_O : MIMG_Sampler_WQM <0x00000036, AMDGPUSample_b_cl_o>;
747defm IMAGE_SAMPLE_LZ_O : MIMG_Sampler <0x00000037, AMDGPUSample_lz_o>;
748defm IMAGE_SAMPLE_C_O : MIMG_Sampler_WQM <0x00000038, AMDGPUSample_c_o>;
749defm IMAGE_SAMPLE_C_CL_O : MIMG_Sampler_WQM <0x00000039, AMDGPUSample_c_cl_o>;
750defm IMAGE_SAMPLE_C_D_O : MIMG_Sampler <0x0000003a, AMDGPUSample_c_d_o>;
751defm IMAGE_SAMPLE_C_D_CL_O : MIMG_Sampler <0x0000003b, AMDGPUSample_c_d_cl_o>;
752defm IMAGE_SAMPLE_C_L_O : MIMG_Sampler <0x0000003c, AMDGPUSample_c_l_o>;
753defm IMAGE_SAMPLE_C_B_CL_O : MIMG_Sampler_WQM <0x0000003e, AMDGPUSample_c_b_cl_o>;
754defm IMAGE_SAMPLE_C_B_O : MIMG_Sampler_WQM <0x0000003d, AMDGPUSample_c_b_o>;
755defm IMAGE_SAMPLE_C_LZ_O : MIMG_Sampler <0x0000003f, AMDGPUSample_c_lz_o>;
756defm IMAGE_GATHER4 : MIMG_Gather_WQM <0x00000040, AMDGPUSample>;
757defm IMAGE_GATHER4_CL : MIMG_Gather_WQM <0x00000041, AMDGPUSample_cl>;
758defm IMAGE_GATHER4_L : MIMG_Gather <0x00000044, AMDGPUSample_l>;
759defm IMAGE_GATHER4_B : MIMG_Gather_WQM <0x00000045, AMDGPUSample_b>;
760defm IMAGE_GATHER4_B_CL : MIMG_Gather_WQM <0x00000046, AMDGPUSample_b_cl>;
761defm IMAGE_GATHER4_LZ : MIMG_Gather <0x00000047, AMDGPUSample_lz>;
762defm IMAGE_GATHER4_C : MIMG_Gather_WQM <0x00000048, AMDGPUSample_c>;
763defm IMAGE_GATHER4_C_CL : MIMG_Gather_WQM <0x00000049, AMDGPUSample_c_cl>;
764defm IMAGE_GATHER4_C_L : MIMG_Gather <0x0000004c, AMDGPUSample_c_l>;
765defm IMAGE_GATHER4_C_B : MIMG_Gather_WQM <0x0000004d, AMDGPUSample_c_b>;
766defm IMAGE_GATHER4_C_B_CL : MIMG_Gather_WQM <0x0000004e, AMDGPUSample_c_b_cl>;
767defm IMAGE_GATHER4_C_LZ : MIMG_Gather <0x0000004f, AMDGPUSample_c_lz>;
768defm IMAGE_GATHER4_O : MIMG_Gather_WQM <0x00000050, AMDGPUSample_o>;
769defm IMAGE_GATHER4_CL_O : MIMG_Gather_WQM <0x00000051, AMDGPUSample_cl_o>;
770defm IMAGE_GATHER4_L_O : MIMG_Gather <0x00000054, AMDGPUSample_l_o>;
771defm IMAGE_GATHER4_B_O : MIMG_Gather_WQM <0x00000055, AMDGPUSample_b_o>;
772defm IMAGE_GATHER4_B_CL_O : MIMG_Gather <0x00000056, AMDGPUSample_b_cl_o>;
773defm IMAGE_GATHER4_LZ_O : MIMG_Gather <0x00000057, AMDGPUSample_lz_o>;
774defm IMAGE_GATHER4_C_O : MIMG_Gather_WQM <0x00000058, AMDGPUSample_c_o>;
775defm IMAGE_GATHER4_C_CL_O : MIMG_Gather_WQM <0x00000059, AMDGPUSample_c_cl_o>;
776defm IMAGE_GATHER4_C_L_O : MIMG_Gather <0x0000005c, AMDGPUSample_c_l_o>;
777defm IMAGE_GATHER4_C_B_O : MIMG_Gather_WQM <0x0000005d, AMDGPUSample_c_b_o>;
778defm IMAGE_GATHER4_C_B_CL_O : MIMG_Gather_WQM <0x0000005e, AMDGPUSample_c_b_cl_o>;
779defm IMAGE_GATHER4_C_LZ_O : MIMG_Gather <0x0000005f, AMDGPUSample_c_lz_o>;
Matt Arsenault856777d2017-12-08 20:00:57 +0000780
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000781defm IMAGE_GET_LOD : MIMG_Sampler <0x00000060, AMDGPUSample, 1, 1, "image_get_lod">;
Matt Arsenault856777d2017-12-08 20:00:57 +0000782
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000783defm IMAGE_SAMPLE_CD : MIMG_Sampler <0x00000068, AMDGPUSample_cd>;
784defm IMAGE_SAMPLE_CD_CL : MIMG_Sampler <0x00000069, AMDGPUSample_cd_cl>;
785defm IMAGE_SAMPLE_C_CD : MIMG_Sampler <0x0000006a, AMDGPUSample_c_cd>;
786defm IMAGE_SAMPLE_C_CD_CL : MIMG_Sampler <0x0000006b, AMDGPUSample_c_cd_cl>;
787defm IMAGE_SAMPLE_CD_O : MIMG_Sampler <0x0000006c, AMDGPUSample_cd_o>;
788defm IMAGE_SAMPLE_CD_CL_O : MIMG_Sampler <0x0000006d, AMDGPUSample_cd_cl_o>;
789defm IMAGE_SAMPLE_C_CD_O : MIMG_Sampler <0x0000006e, AMDGPUSample_c_cd_o>;
790defm IMAGE_SAMPLE_C_CD_CL_O : MIMG_Sampler <0x0000006f, AMDGPUSample_c_cd_cl_o>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000791//def IMAGE_RSRC256 : MIMG_NoPattern_RSRC256 <"image_rsrc256", 0x0000007e>;
792//def IMAGE_SAMPLER : MIMG_NoPattern_ <"image_sampler", 0x0000007f>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000793
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000794/********** ========================================= **********/
795/********** Table of dimension-aware image intrinsics **********/
796/********** ========================================= **********/
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000797
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000798class ImageDimIntrinsicInfo<AMDGPUImageDimIntrinsic I> {
799 Intrinsic Intr = I;
800 MIMGBaseOpcode BaseOpcode = !cast<MIMGBaseOpcode>(!strconcat("IMAGE_", I.P.OpMod));
801 AMDGPUDimProps Dim = I.P.Dim;
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000802}
803
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000804def ImageDimIntrinsicTable : GenericTable {
805 let FilterClass = "ImageDimIntrinsicInfo";
806 let Fields = ["Intr", "BaseOpcode", "Dim"];
807 GenericEnum TypeOf_BaseOpcode = MIMGBaseOpcode;
808 GenericEnum TypeOf_Dim = MIMGDim;
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000809
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000810 let PrimaryKey = ["Intr"];
811 let PrimaryKeyName = "getImageDimIntrinsicInfo";
812 let PrimaryKeyEarlyOut = 1;
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000813}
814
815foreach intr = !listconcat(AMDGPUImageDimIntrinsics,
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000816 AMDGPUImageDimAtomicIntrinsics) in {
817 def : ImageDimIntrinsicInfo<intr>;
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000818}
Ryan Taylor894c8fd2018-08-01 12:12:01 +0000819
820// L to LZ Optimization Mapping
821def : MIMGLZMapping<IMAGE_SAMPLE_L, IMAGE_SAMPLE_LZ>;
822def : MIMGLZMapping<IMAGE_SAMPLE_C_L, IMAGE_SAMPLE_C_LZ>;
823def : MIMGLZMapping<IMAGE_SAMPLE_L_O, IMAGE_SAMPLE_LZ_O>;
824def : MIMGLZMapping<IMAGE_SAMPLE_C_L_O, IMAGE_SAMPLE_C_LZ_O>;
825def : MIMGLZMapping<IMAGE_GATHER4_L, IMAGE_GATHER4_LZ>;
826def : MIMGLZMapping<IMAGE_GATHER4_C_L, IMAGE_GATHER4_C_LZ>;
827def : MIMGLZMapping<IMAGE_GATHER4_L_O, IMAGE_GATHER4_LZ_O>;
828def : MIMGLZMapping<IMAGE_GATHER4_C_L_O, IMAGE_GATHER4_C_LZ_O>;
Piotr Sobczak9b11e932019-06-10 15:58:51 +0000829
830// MIP to NONMIP Optimization Mapping
831def : MIMGMIPMapping<IMAGE_LOAD_MIP, IMAGE_LOAD>;
832def : MIMGMIPMapping<IMAGE_STORE_MIP, IMAGE_STORE>;