blob: 3f525efedee3a30ce77e725a551b803ebd79cd3a [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
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000104class MIMG <dag outs, string dns = "">
105 : InstSI <outs, (ins), "", []> {
106
107 let VM_CNT = 1;
108 let EXP_CNT = 1;
109 let MIMG = 1;
110 let Uses = [EXEC];
Changpeng Fangb28fe032016-09-01 17:54:54 +0000111 let mayLoad = 1;
112 let mayStore = 0;
113 let hasPostISelHook = 1;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000114 let SchedRW = [WriteVMEM];
115 let UseNamedOperandTable = 1;
116 let hasSideEffects = 0; // XXX ????
117
Changpeng Fangb28fe032016-09-01 17:54:54 +0000118 let DecoderNamespace = dns;
119 let isAsmParserOnly = !if(!eq(dns,""), 1, 0);
120 let AsmMatchConverter = "cvtMIMG";
Tom Stellard244891d2016-12-20 15:52:17 +0000121 let usesCustomInserter = 1;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000122
123 Instruction Opcode = !cast<Instruction>(NAME);
124 MIMGBaseOpcode BaseOpcode;
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000125 MIMGEncoding MIMGEncoding;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000126 bits<8> VDataDwords;
127 bits<8> VAddrDwords;
128}
129
130def MIMGInfoTable : GenericTable {
131 let FilterClass = "MIMG";
132 let CppTypeName = "MIMGInfo";
133 let Fields = ["Opcode", "BaseOpcode", "MIMGEncoding", "VDataDwords", "VAddrDwords"];
134 GenericEnum TypeOf_BaseOpcode = MIMGBaseOpcode;
135 GenericEnum TypeOf_MIMGEncoding = MIMGEncoding;
136
137 let PrimaryKey = ["BaseOpcode", "MIMGEncoding", "VDataDwords", "VAddrDwords"];
138 let PrimaryKeyName = "getMIMGOpcodeHelper";
139}
140
141def getMIMGInfo : SearchIndex {
142 let Table = MIMGInfoTable;
143 let Key = ["Opcode"];
Changpeng Fangb28fe032016-09-01 17:54:54 +0000144}
145
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000146// This is a separate class so that TableGen memoizes the computations.
147class MIMGNSAHelper<int num_addrs> {
148 list<string> AddrAsmNames =
149 !foldl([]<string>, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], lhs, i,
150 !if(!lt(i, num_addrs), !listconcat(lhs, ["vaddr"#!size(lhs)]), lhs));
151 dag AddrIns = !dag(ins, !foreach(arg, AddrAsmNames, VGPR_32), AddrAsmNames);
152 string AddrAsm = "[" # !foldl("$" # !head(AddrAsmNames), !tail(AddrAsmNames), lhs, rhs,
153 lhs # ", $" # rhs) # "]";
154
155 int NSA = !if(!le(num_addrs, 1), ?,
156 !if(!le(num_addrs, 5), 1,
157 !if(!le(num_addrs, 9), 2,
158 !if(!le(num_addrs, 13), 3, ?))));
159}
160
161// Base class of all pre-gfx10 MIMG instructions.
162class MIMG_gfx6789<bits<7> op, dag outs, string dns = "">
163 : MIMG<outs, dns>, MIMGe_gfx6789<op> {
164 let SubtargetPredicate = isGFX6GFX7GFX8GFX9;
165 let AssemblerPredicates = [isGFX6GFX7GFX8GFX9];
166
167 let MIMGEncoding = MIMGEncGfx6;
168
169 let d16 = !if(BaseOpcode.HasD16, ?, 0);
170}
171
172// Base class of all non-NSA gfx10 MIMG instructions.
173class MIMG_gfx10<int op, dag outs, string dns = "">
174 : MIMG<outs, dns>, MIMGe_gfx10<op> {
175 let SubtargetPredicate = isGFX10Plus;
176 let AssemblerPredicates = [isGFX10Plus];
177
178 let MIMGEncoding = MIMGEncGfx10Default;
179
180 let d16 = !if(BaseOpcode.HasD16, ?, 0);
181 let nsa = 0;
182}
183
184// Base class for all NSA MIMG instructions. Note that 1-dword addresses always
185// use non-NSA variants.
186class MIMG_nsa_gfx10<int op, dag outs, int num_addrs, string dns="">
187 : MIMG<outs, dns>, MIMGe_gfx10<op> {
188 let SubtargetPredicate = isGFX10Plus;
189 let AssemblerPredicates = [isGFX10Plus];
190
191 let MIMGEncoding = MIMGEncGfx10NSA;
192
193 MIMGNSAHelper nsah = MIMGNSAHelper<num_addrs>;
194 dag AddrIns = nsah.AddrIns;
195 string AddrAsm = nsah.AddrAsm;
196
197 let d16 = !if(BaseOpcode.HasD16, ?, 0);
198 let nsa = nsah.NSA;
199}
200
Changpeng Fangb28fe032016-09-01 17:54:54 +0000201class MIMG_NoSampler_Helper <bits<7> op, string asm,
202 RegisterClass dst_rc,
203 RegisterClass addr_rc,
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000204 string dns="">
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000205 : MIMG_gfx6789 <op, (outs dst_rc:$vdata), dns> {
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000206 let InOperandList = !con((ins addr_rc:$vaddr, SReg_256:$srsrc,
207 DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc,
Ryan Taylor1f334d02018-08-28 15:07:30 +0000208 R128A16:$r128, TFE:$tfe, LWE:$lwe, DA:$da),
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000209 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
210 let AsmString = asm#" $vdata, $vaddr, $srsrc$dmask$unorm$glc$slc$r128$tfe$lwe$da"
211 #!if(BaseOpcode.HasD16, "$d16", "");
Changpeng Fangb28fe032016-09-01 17:54:54 +0000212}
213
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000214class MIMG_NoSampler_gfx10<int op, string opcode,
215 RegisterClass DataRC, RegisterClass AddrRC,
216 string dns="">
217 : MIMG_gfx10<op, (outs DataRC:$vdata), dns> {
218 let InOperandList = !con((ins AddrRC:$vaddr0, SReg_256:$srsrc, DMask:$dmask,
219 Dim:$dim, UNorm:$unorm, DLC:$dlc, GLC:$glc,
220 SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe),
221 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
222 let AsmString = opcode#" $vdata, $vaddr0, $srsrc$dmask$dim$unorm$dlc$glc$slc$r128$tfe$lwe"
223 #!if(BaseOpcode.HasD16, "$d16", "");
224}
225
226class MIMG_NoSampler_nsa_gfx10<int op, string opcode,
227 RegisterClass DataRC, int num_addrs,
228 string dns="">
229 : MIMG_nsa_gfx10<op, (outs DataRC:$vdata), num_addrs, dns> {
230 let InOperandList = !con(AddrIns,
231 (ins SReg_256:$srsrc, DMask:$dmask,
232 Dim:$dim, UNorm:$unorm, DLC:$dlc, GLC:$glc,
233 SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe),
234 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
235 let AsmString = opcode#" $vdata, "#AddrAsm#", $srsrc$dmask$dim$unorm$dlc$glc$slc$r128$tfe$lwe"
236 #!if(BaseOpcode.HasD16, "$d16", "");
237}
238
Changpeng Fangb28fe032016-09-01 17:54:54 +0000239multiclass MIMG_NoSampler_Src_Helper <bits<7> op, string asm,
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000240 RegisterClass dst_rc,
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000241 bit enableDisasm> {
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000242 let ssamp = 0 in {
243 let VAddrDwords = 1 in {
244 def _V1 : MIMG_NoSampler_Helper <op, asm, dst_rc, VGPR_32,
245 !if(enableDisasm, "AMDGPU", "")>;
246 def _V1_gfx10 : MIMG_NoSampler_gfx10<op, asm, dst_rc, VGPR_32,
247 !if(enableDisasm, "AMDGPU", "")>;
248 }
249
250 let VAddrDwords = 2 in {
251 def _V2 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_64>;
252 def _V2_gfx10 : MIMG_NoSampler_gfx10<op, asm, dst_rc, VReg_64>;
253 def _V2_nsa_gfx10 : MIMG_NoSampler_nsa_gfx10<op, asm, dst_rc, 2>;
254 }
255
256 let VAddrDwords = 3 in {
257 def _V3 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_96>;
258 def _V3_gfx10 : MIMG_NoSampler_gfx10<op, asm, dst_rc, VReg_96>;
259 def _V3_nsa_gfx10 : MIMG_NoSampler_nsa_gfx10<op, asm, dst_rc, 3>;
260 }
261
262 let VAddrDwords = 4 in {
263 def _V4 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_128>;
264 def _V4_gfx10 : MIMG_NoSampler_gfx10<op, asm, dst_rc, VReg_128>;
265 def _V4_nsa_gfx10 : MIMG_NoSampler_nsa_gfx10<op, asm, dst_rc, 4,
266 !if(enableDisasm, "AMDGPU", "")>;
267 }
268 }
Changpeng Fangb28fe032016-09-01 17:54:54 +0000269}
270
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000271multiclass MIMG_NoSampler <bits<7> op, string asm, bit has_d16, bit mip = 0,
272 bit isResInfo = 0> {
273 def "" : MIMGBaseOpcode {
274 let Coordinates = !if(isResInfo, 0, 1);
275 let LodOrClampOrMip = mip;
276 let HasD16 = has_d16;
277 }
278
279 let BaseOpcode = !cast<MIMGBaseOpcode>(NAME),
280 mayLoad = !if(isResInfo, 0, 1) in {
281 let VDataDwords = 1 in
282 defm _V1 : MIMG_NoSampler_Src_Helper <op, asm, VGPR_32, 1>;
283 let VDataDwords = 2 in
284 defm _V2 : MIMG_NoSampler_Src_Helper <op, asm, VReg_64, 0>;
285 let VDataDwords = 3 in
286 defm _V3 : MIMG_NoSampler_Src_Helper <op, asm, VReg_96, 0>;
287 let VDataDwords = 4 in
288 defm _V4 : MIMG_NoSampler_Src_Helper <op, asm, VReg_128, 0>;
Tim Renouf6f0191a2019-03-22 15:21:11 +0000289 let VDataDwords = 5 in
290 defm _V5 : MIMG_NoSampler_Src_Helper <op, asm, VReg_160, 0>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000291 }
Dmitry Preobrazhensky2456ac62018-03-28 15:44:16 +0000292}
293
Changpeng Fangb28fe032016-09-01 17:54:54 +0000294class MIMG_Store_Helper <bits<7> op, string asm,
295 RegisterClass data_rc,
Matt Arsenaultcad7fa82017-12-13 21:07:51 +0000296 RegisterClass addr_rc,
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000297 string dns = "">
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000298 : MIMG_gfx6789<op, (outs), dns> {
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000299 let InOperandList = !con((ins data_rc:$vdata, addr_rc:$vaddr, SReg_256:$srsrc,
300 DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc,
Ryan Taylor1f334d02018-08-28 15:07:30 +0000301 R128A16:$r128, TFE:$tfe, LWE:$lwe, DA:$da),
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000302 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
303 let AsmString = asm#" $vdata, $vaddr, $srsrc$dmask$unorm$glc$slc$r128$tfe$lwe$da"
304 #!if(BaseOpcode.HasD16, "$d16", "");
Changpeng Fangb28fe032016-09-01 17:54:54 +0000305}
306
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000307class MIMG_Store_gfx10<int op, string opcode,
308 RegisterClass DataRC, RegisterClass AddrRC,
309 string dns="">
310 : MIMG_gfx10<op, (outs), dns> {
311 let InOperandList = !con((ins DataRC:$vdata, AddrRC:$vaddr0, SReg_256:$srsrc,
312 DMask:$dmask, Dim:$dim, UNorm:$unorm, DLC:$dlc,
313 GLC:$glc, SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe),
314 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
315 let AsmString = opcode#" $vdata, $vaddr0, $srsrc$dmask$dim$unorm$dlc$glc$slc$r128$tfe$lwe"
316 #!if(BaseOpcode.HasD16, "$d16", "");
317}
318
319class MIMG_Store_nsa_gfx10<int op, string opcode,
320 RegisterClass DataRC, int num_addrs,
321 string dns="">
322 : MIMG_nsa_gfx10<op, (outs), num_addrs, dns> {
323 let InOperandList = !con((ins DataRC:$vdata),
324 AddrIns,
325 (ins SReg_256:$srsrc, DMask:$dmask,
326 Dim:$dim, UNorm:$unorm, DLC:$dlc, GLC:$glc,
327 SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe),
328 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
329 let AsmString = opcode#" $vdata, "#AddrAsm#", $srsrc$dmask$dim$unorm$dlc$glc$slc$r128$tfe$lwe"
330 #!if(BaseOpcode.HasD16, "$d16", "");
331}
332
333multiclass MIMG_Store_Addr_Helper <int op, string asm,
Changpeng Fangb28fe032016-09-01 17:54:54 +0000334 RegisterClass data_rc,
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000335 bit enableDisasm> {
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000336 let mayLoad = 0, mayStore = 1, hasSideEffects = 0, hasPostISelHook = 0,
337 DisableWQM = 1, ssamp = 0 in {
338 let VAddrDwords = 1 in {
339 def _V1 : MIMG_Store_Helper <op, asm, data_rc, VGPR_32,
340 !if(enableDisasm, "AMDGPU", "")>;
341 def _V1_gfx10 : MIMG_Store_gfx10 <op, asm, data_rc, VGPR_32,
342 !if(enableDisasm, "AMDGPU", "")>;
343 }
344 let VAddrDwords = 2 in {
345 def _V2 : MIMG_Store_Helper <op, asm, data_rc, VReg_64>;
346 def _V2_gfx10 : MIMG_Store_gfx10 <op, asm, data_rc, VReg_64>;
347 def _V2_nsa_gfx10 : MIMG_Store_nsa_gfx10 <op, asm, data_rc, 2>;
348 }
349 let VAddrDwords = 3 in {
350 def _V3 : MIMG_Store_Helper <op, asm, data_rc, VReg_96>;
351 def _V3_gfx10 : MIMG_Store_gfx10 <op, asm, data_rc, VReg_96>;
352 def _V3_nsa_gfx10 : MIMG_Store_nsa_gfx10 <op, asm, data_rc, 3>;
353 }
354 let VAddrDwords = 4 in {
355 def _V4 : MIMG_Store_Helper <op, asm, data_rc, VReg_128>;
356 def _V4_gfx10 : MIMG_Store_gfx10 <op, asm, data_rc, VReg_128>;
357 def _V4_nsa_gfx10 : MIMG_Store_nsa_gfx10 <op, asm, data_rc, 4,
358 !if(enableDisasm, "AMDGPU", "")>;
359 }
360 }
Changpeng Fangb28fe032016-09-01 17:54:54 +0000361}
362
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000363multiclass MIMG_Store <bits<7> op, string asm, bit has_d16, bit mip = 0> {
364 def "" : MIMGBaseOpcode {
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000365 let Store = 1;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000366 let LodOrClampOrMip = mip;
367 let HasD16 = has_d16;
368 }
369
370 let BaseOpcode = !cast<MIMGBaseOpcode>(NAME) in {
371 let VDataDwords = 1 in
372 defm _V1 : MIMG_Store_Addr_Helper <op, asm, VGPR_32, 1>;
373 let VDataDwords = 2 in
374 defm _V2 : MIMG_Store_Addr_Helper <op, asm, VReg_64, 0>;
375 let VDataDwords = 3 in
376 defm _V3 : MIMG_Store_Addr_Helper <op, asm, VReg_96, 0>;
377 let VDataDwords = 4 in
378 defm _V4 : MIMG_Store_Addr_Helper <op, asm, VReg_128, 0>;
379 }
Dmitry Preobrazhensky2456ac62018-03-28 15:44:16 +0000380}
381
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000382class MIMG_Atomic_gfx6789_base <bits<7> op, string asm, RegisterClass data_rc,
383 RegisterClass addr_rc, string dns="">
384 : MIMG_gfx6789 <op, (outs data_rc:$vdst), dns> {
Changpeng Fangb28fe032016-09-01 17:54:54 +0000385 let Constraints = "$vdst = $vdata";
386 let AsmMatchConverter = "cvtMIMGAtomic";
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000387
388 let InOperandList = (ins data_rc:$vdata, addr_rc:$vaddr, SReg_256:$srsrc,
389 DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc,
Ryan Taylor1f334d02018-08-28 15:07:30 +0000390 R128A16:$r128, TFE:$tfe, LWE:$lwe, DA:$da);
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000391 let AsmString = asm#" $vdst, $vaddr, $srsrc$dmask$unorm$glc$slc$r128$tfe$lwe$da";
Changpeng Fangb28fe032016-09-01 17:54:54 +0000392}
393
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000394class MIMG_Atomic_si<mimg op, string asm, RegisterClass data_rc,
395 RegisterClass addr_rc, bit enableDasm = 0>
396 : MIMG_Atomic_gfx6789_base<op.SI_GFX10, asm, data_rc, addr_rc,
397 !if(enableDasm, "GFX6GFX7", "")> {
398 let AssemblerPredicates = [isGFX6GFX7];
399}
Changpeng Fangb28fe032016-09-01 17:54:54 +0000400
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000401class MIMG_Atomic_vi<mimg op, string asm, RegisterClass data_rc,
402 RegisterClass addr_rc, bit enableDasm = 0>
403 : MIMG_Atomic_gfx6789_base<op.VI, asm, data_rc, addr_rc, !if(enableDasm, "GFX8", "")> {
404 let AssemblerPredicates = [isGFX8GFX9];
405 let MIMGEncoding = MIMGEncGfx8;
406}
407
408class MIMG_Atomic_gfx10<mimg op, string opcode,
409 RegisterClass DataRC, RegisterClass AddrRC,
410 bit enableDisasm = 0>
411 : MIMG_gfx10<!cast<int>(op.SI_GFX10), (outs DataRC:$vdst),
412 !if(enableDisasm, "AMDGPU", "")> {
413 let Constraints = "$vdst = $vdata";
414 let AsmMatchConverter = "cvtMIMGAtomic";
415
416 let InOperandList = (ins DataRC:$vdata, AddrRC:$vaddr0, SReg_256:$srsrc,
417 DMask:$dmask, Dim:$dim, UNorm:$unorm, DLC:$dlc,
418 GLC:$glc, SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe);
419 let AsmString = opcode#" $vdst, $vaddr0, $srsrc$dmask$dim$unorm$dlc$glc$slc$r128$tfe$lwe";
420}
421
422class MIMG_Atomic_nsa_gfx10<mimg op, string opcode,
423 RegisterClass DataRC, int num_addrs,
424 bit enableDisasm = 0>
425 : MIMG_nsa_gfx10<!cast<int>(op.SI_GFX10), (outs DataRC:$vdst), num_addrs,
426 !if(enableDisasm, "AMDGPU", "")> {
427 let Constraints = "$vdst = $vdata";
428 let AsmMatchConverter = "cvtMIMGAtomic";
429
430 let InOperandList = !con((ins DataRC:$vdata),
431 AddrIns,
432 (ins SReg_256:$srsrc, DMask:$dmask,
433 Dim:$dim, UNorm:$unorm, DLC:$dlc, GLC:$glc,
434 SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe));
435 let AsmString = opcode#" $vdata, "#AddrAsm#", $srsrc$dmask$dim$unorm$dlc$glc$slc$r128$tfe$lwe";
Changpeng Fangb28fe032016-09-01 17:54:54 +0000436}
437
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000438multiclass MIMG_Atomic_Addr_Helper_m <mimg op, string asm,
Dmitry Preobrazhensky0b4eb1e2018-01-26 15:43:29 +0000439 RegisterClass data_rc,
Dmitry Preobrazhensky0b4eb1e2018-01-26 15:43:29 +0000440 bit enableDasm = 0> {
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000441 let hasSideEffects = 1, // FIXME: remove this
442 mayLoad = 1, mayStore = 1, hasPostISelHook = 0, DisableWQM = 1,
443 ssamp = 0 in {
444 let VAddrDwords = 1 in {
445 def _V1_si : MIMG_Atomic_si <op, asm, data_rc, VGPR_32, enableDasm>;
446 def _V1_vi : MIMG_Atomic_vi <op, asm, data_rc, VGPR_32, enableDasm>;
447 def _V1_gfx10 : MIMG_Atomic_gfx10 <op, asm, data_rc, VGPR_32, enableDasm>;
448 }
449 let VAddrDwords = 2 in {
450 def _V2_si : MIMG_Atomic_si <op, asm, data_rc, VReg_64, 0>;
451 def _V2_vi : MIMG_Atomic_vi <op, asm, data_rc, VReg_64, 0>;
452 def _V2_gfx10 : MIMG_Atomic_gfx10 <op, asm, data_rc, VReg_64, 0>;
453 def _V2_nsa_gfx10 : MIMG_Atomic_nsa_gfx10 <op, asm, data_rc, 2, 0>;
454 }
455 let VAddrDwords = 3 in {
456 def _V3_si : MIMG_Atomic_si <op, asm, data_rc, VReg_96, 0>;
457 def _V3_vi : MIMG_Atomic_vi <op, asm, data_rc, VReg_96, 0>;
458 def _V3_gfx10 : MIMG_Atomic_gfx10 <op, asm, data_rc, VReg_96, 0>;
459 def _V3_nsa_gfx10 : MIMG_Atomic_nsa_gfx10 <op, asm, data_rc, 3, 0>;
460 }
461 let VAddrDwords = 4 in {
462 def _V4_si : MIMG_Atomic_si <op, asm, data_rc, VReg_128, 0>;
463 def _V4_vi : MIMG_Atomic_vi <op, asm, data_rc, VReg_128, 0>;
464 def _V4_gfx10 : MIMG_Atomic_gfx10 <op, asm, data_rc, VReg_128, 0>;
465 def _V4_nsa_gfx10 : MIMG_Atomic_nsa_gfx10 <op, asm, data_rc, 4, enableDasm>;
466 }
467 }
Dmitry Preobrazhensky0b4eb1e2018-01-26 15:43:29 +0000468}
469
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000470multiclass MIMG_Atomic <mimg op, string asm, bit isCmpSwap = 0> { // 64-bit atomics
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000471 def "" : MIMGBaseOpcode {
472 let Atomic = 1;
473 let AtomicX2 = isCmpSwap;
474 }
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000475
476 let BaseOpcode = !cast<MIMGBaseOpcode>(NAME) in {
477 // _V* variants have different dst size, but the size is encoded implicitly,
478 // using dmask and tfe. Only 32-bit variant is registered with disassembler.
479 // Other variants are reconstructed by disassembler using dmask and tfe.
480 let VDataDwords = !if(isCmpSwap, 2, 1) in
481 defm _V1 : MIMG_Atomic_Addr_Helper_m <op, asm, !if(isCmpSwap, VReg_64, VGPR_32), 1>;
482 let VDataDwords = !if(isCmpSwap, 4, 2) in
483 defm _V2 : MIMG_Atomic_Addr_Helper_m <op, asm, !if(isCmpSwap, VReg_128, VReg_64)>;
484 }
Changpeng Fangb28fe032016-09-01 17:54:54 +0000485}
486
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000487class MIMG_Sampler_Helper <bits<7> op, string asm, RegisterClass dst_rc,
488 RegisterClass src_rc, string dns="">
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000489 : MIMG_gfx6789 <op, (outs dst_rc:$vdata), dns> {
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000490 let InOperandList = !con((ins src_rc:$vaddr, SReg_256:$srsrc, SReg_128:$ssamp,
491 DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc,
Ryan Taylor1f334d02018-08-28 15:07:30 +0000492 R128A16:$r128, TFE:$tfe, LWE:$lwe, DA:$da),
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000493 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
494 let AsmString = asm#" $vdata, $vaddr, $srsrc, $ssamp$dmask$unorm$glc$slc$r128$tfe$lwe$da"
495 #!if(BaseOpcode.HasD16, "$d16", "");
Changpeng Fangb28fe032016-09-01 17:54:54 +0000496}
497
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000498class MIMG_Sampler_gfx10<int op, string opcode,
499 RegisterClass DataRC, RegisterClass AddrRC,
500 string dns="">
501 : MIMG_gfx10<op, (outs DataRC:$vdata), dns> {
502 let InOperandList = !con((ins AddrRC:$vaddr0, SReg_256:$srsrc, SReg_128:$ssamp,
503 DMask:$dmask, Dim:$dim, UNorm:$unorm, DLC:$dlc,
504 GLC:$glc, SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe),
505 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
506 let AsmString = opcode#" $vdata, $vaddr0, $srsrc, $ssamp$dmask$dim$unorm"
507 #"$dlc$glc$slc$r128$tfe$lwe"
508 #!if(BaseOpcode.HasD16, "$d16", "");
509}
510
511class MIMG_Sampler_nsa_gfx10<int op, string opcode,
512 RegisterClass DataRC, int num_addrs,
513 string dns="">
514 : MIMG_nsa_gfx10<op, (outs DataRC:$vdata), num_addrs, dns> {
515 let InOperandList = !con(AddrIns,
516 (ins SReg_256:$srsrc, SReg_128:$ssamp, DMask:$dmask,
517 Dim:$dim, UNorm:$unorm, DLC:$dlc, GLC:$glc,
518 SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe),
519 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
520 let AsmString = opcode#" $vdata, "#AddrAsm#", $srsrc, $ssamp$dmask$dim$unorm"
521 #"$dlc$glc$slc$r128$tfe$lwe"
522 #!if(BaseOpcode.HasD16, "$d16", "");
523}
524
Nicolai Haehnle15745ba2018-06-21 13:37:55 +0000525class MIMGAddrSize<int dw, bit enable_disasm> {
526 int NumWords = dw;
527
528 RegisterClass RegClass = !if(!le(NumWords, 0), ?,
529 !if(!eq(NumWords, 1), VGPR_32,
530 !if(!eq(NumWords, 2), VReg_64,
531 !if(!eq(NumWords, 3), VReg_96,
532 !if(!eq(NumWords, 4), VReg_128,
533 !if(!le(NumWords, 8), VReg_256,
534 !if(!le(NumWords, 16), VReg_512, ?)))))));
535
536 // Whether the instruction variant with this vaddr size should be enabled for
537 // the auto-generated disassembler.
538 bit Disassemble = enable_disasm;
539}
540
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000541// Return whether x is in lst.
542class isIntInList<int x, list<int> lst> {
543 bit ret = !foldl(0, lst, lhs, y, !or(lhs, !eq(x, y)));
544}
545
Nicolai Haehnle15745ba2018-06-21 13:37:55 +0000546// Return whether a value inside the range [min, max] (endpoints inclusive)
547// is in the given list.
548class isRangeInList<int min, int max, list<int> lst> {
549 bit ret = !foldl(0, lst, lhs, y, !or(lhs, !and(!le(min, y), !le(y, max))));
550}
551
552class MIMGAddrSizes_tmp<list<MIMGAddrSize> lst, int min> {
553 list<MIMGAddrSize> List = lst;
554 int Min = min;
555}
556
557class MIMG_Sampler_AddrSizes<AMDGPUSampleVariant sample> {
558 // List of all possible numbers of address words, taking all combinations of
559 // A16 and image dimension into account (note: no MSAA, since this is for
560 // sample/gather ops).
561 list<int> AllNumAddrWords =
562 !foreach(dw, !if(sample.Gradients,
563 !if(!eq(sample.LodOrClamp, ""),
564 [2, 3, 4, 5, 6, 7, 9],
565 [2, 3, 4, 5, 7, 8, 10]),
566 !if(!eq(sample.LodOrClamp, ""),
567 [1, 2, 3],
568 [1, 2, 3, 4])),
569 !add(dw, !size(sample.ExtraAddrArgs)));
570
571 // Generate machine instructions based on possible register classes for the
572 // required numbers of address words. The disassembler defaults to the
573 // smallest register class.
574 list<MIMGAddrSize> MachineInstrs =
575 !foldl(MIMGAddrSizes_tmp<[], 0>, [1, 2, 3, 4, 8, 16], lhs, dw,
576 !if(isRangeInList<lhs.Min, dw, AllNumAddrWords>.ret,
577 MIMGAddrSizes_tmp<
578 !listconcat(lhs.List, [MIMGAddrSize<dw, !empty(lhs.List)>]),
579 !if(!eq(dw, 3), 3, !add(dw, 1))>, // we still need _V4 for codegen w/ 3 dwords
580 lhs)).List;
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000581
582 // For NSA, generate machine instructions for all possible numbers of words
583 // except 1 (which is already covered by the non-NSA case).
584 // The disassembler defaults to the largest number of arguments among the
585 // variants with the same number of NSA words, and custom code then derives
586 // the exact variant based on the sample variant and the image dimension.
587 list<MIMGAddrSize> NSAInstrs =
588 !foldl([]<MIMGAddrSize>, [[12, 11, 10], [9, 8, 7, 6], [5, 4, 3, 2]], prev, nsa_group,
589 !listconcat(prev,
590 !foldl([]<MIMGAddrSize>, nsa_group, lhs, dw,
591 !if(isIntInList<dw, AllNumAddrWords>.ret,
592 !listconcat(lhs, [MIMGAddrSize<dw, !empty(lhs)>]),
593 lhs))));
Nicolai Haehnle15745ba2018-06-21 13:37:55 +0000594}
595
596multiclass MIMG_Sampler_Src_Helper <bits<7> op, string asm,
597 AMDGPUSampleVariant sample, RegisterClass dst_rc,
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000598 bit enableDisasm = 0> {
Nicolai Haehnle15745ba2018-06-21 13:37:55 +0000599 foreach addr = MIMG_Sampler_AddrSizes<sample>.MachineInstrs in {
Stanislav Mekhanoshin692560d2019-05-01 16:32:58 +0000600 let VAddrDwords = addr.NumWords in {
601 def _V # addr.NumWords
602 : MIMG_Sampler_Helper <op, asm, dst_rc, addr.RegClass,
603 !if(!and(enableDisasm, addr.Disassemble), "AMDGPU", "")>;
604 def _V # addr.NumWords # _gfx10
605 : MIMG_Sampler_gfx10 <op, asm, dst_rc, addr.RegClass,
606 !if(!and(enableDisasm, addr.Disassemble), "AMDGPU", "")>;
607 }
608 }
609
610 foreach addr = MIMG_Sampler_AddrSizes<sample>.NSAInstrs in {
611 let VAddrDwords = addr.NumWords in {
612 def _V # addr.NumWords # _nsa_gfx10
613 : MIMG_Sampler_nsa_gfx10<op, asm, dst_rc, addr.NumWords,
614 !if(!and(enableDisasm, addr.Disassemble), "AMDGPU", "")>;
615 }
Nicolai Haehnle15745ba2018-06-21 13:37:55 +0000616 }
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000617}
618
619class MIMG_Sampler_BaseOpcode<AMDGPUSampleVariant sample>
620 : MIMGBaseOpcode {
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000621 let Sampler = 1;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000622 let NumExtraArgs = !size(sample.ExtraAddrArgs);
623 let Gradients = sample.Gradients;
624 let LodOrClampOrMip = !ne(sample.LodOrClamp, "");
Changpeng Fangb28fe032016-09-01 17:54:54 +0000625}
626
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000627multiclass MIMG_Sampler <bits<7> op, AMDGPUSampleVariant sample, bit wqm = 0,
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000628 bit isGetLod = 0,
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000629 string asm = "image_sample"#sample.LowerCaseMod> {
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000630 def "" : MIMG_Sampler_BaseOpcode<sample> {
631 let HasD16 = !if(isGetLod, 0, 1);
632 }
633
634 let BaseOpcode = !cast<MIMGBaseOpcode>(NAME), WQM = wqm,
635 mayLoad = !if(isGetLod, 0, 1) in {
636 let VDataDwords = 1 in
Nicolai Haehnle15745ba2018-06-21 13:37:55 +0000637 defm _V1 : MIMG_Sampler_Src_Helper<op, asm, sample, VGPR_32, 1>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000638 let VDataDwords = 2 in
Nicolai Haehnle15745ba2018-06-21 13:37:55 +0000639 defm _V2 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_64>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000640 let VDataDwords = 3 in
Nicolai Haehnle15745ba2018-06-21 13:37:55 +0000641 defm _V3 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_96>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000642 let VDataDwords = 4 in
Nicolai Haehnle15745ba2018-06-21 13:37:55 +0000643 defm _V4 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_128>;
Tim Renouf6f0191a2019-03-22 15:21:11 +0000644 let VDataDwords = 5 in
645 defm _V5 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_160>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000646 }
Changpeng Fangb28fe032016-09-01 17:54:54 +0000647}
648
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000649multiclass MIMG_Sampler_WQM <bits<7> op, AMDGPUSampleVariant sample>
650 : MIMG_Sampler<op, sample, 1>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000651
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000652multiclass MIMG_Gather <bits<7> op, AMDGPUSampleVariant sample, bit wqm = 0,
653 string asm = "image_gather4"#sample.LowerCaseMod> {
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000654 def "" : MIMG_Sampler_BaseOpcode<sample> {
655 let HasD16 = 1;
David Stuttardf77079f2019-01-14 11:55:24 +0000656 let Gather4 = 1;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000657 }
658
659 let BaseOpcode = !cast<MIMGBaseOpcode>(NAME), WQM = wqm,
660 Gather4 = 1, hasPostISelHook = 0 in {
661 let VDataDwords = 2 in
Nicolai Haehnle15745ba2018-06-21 13:37:55 +0000662 defm _V2 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_64>; /* for packed D16 only */
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000663 let VDataDwords = 4 in
Nicolai Haehnle15745ba2018-06-21 13:37:55 +0000664 defm _V4 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_128, 1>;
Tim Renouf6f0191a2019-03-22 15:21:11 +0000665 let VDataDwords = 5 in
666 defm _V5 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_160>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000667 }
Changpeng Fangb28fe032016-09-01 17:54:54 +0000668}
669
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000670multiclass MIMG_Gather_WQM <bits<7> op, AMDGPUSampleVariant sample>
671 : MIMG_Gather<op, sample, 1>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000672
673//===----------------------------------------------------------------------===//
674// MIMG Instructions
675//===----------------------------------------------------------------------===//
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000676defm IMAGE_LOAD : MIMG_NoSampler <0x00000000, "image_load", 1>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000677defm IMAGE_LOAD_MIP : MIMG_NoSampler <0x00000001, "image_load_mip", 1, 1>;
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000678defm IMAGE_LOAD_PCK : MIMG_NoSampler <0x00000002, "image_load_pck", 0>;
679defm IMAGE_LOAD_PCK_SGN : MIMG_NoSampler <0x00000003, "image_load_pck_sgn", 0>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000680defm IMAGE_LOAD_MIP_PCK : MIMG_NoSampler <0x00000004, "image_load_mip_pck", 0, 1>;
681defm IMAGE_LOAD_MIP_PCK_SGN : MIMG_NoSampler <0x00000005, "image_load_mip_pck_sgn", 0, 1>;
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000682defm IMAGE_STORE : MIMG_Store <0x00000008, "image_store", 1>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000683defm IMAGE_STORE_MIP : MIMG_Store <0x00000009, "image_store_mip", 1, 1>;
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000684defm IMAGE_STORE_PCK : MIMG_Store <0x0000000a, "image_store_pck", 0>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000685defm IMAGE_STORE_MIP_PCK : MIMG_Store <0x0000000b, "image_store_mip_pck", 0, 1>;
Matt Arsenault856777d2017-12-08 20:00:57 +0000686
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000687defm IMAGE_GET_RESINFO : MIMG_NoSampler <0x0000000e, "image_get_resinfo", 0, 1, 1>;
Matt Arsenault856777d2017-12-08 20:00:57 +0000688
Changpeng Fangb28fe032016-09-01 17:54:54 +0000689defm IMAGE_ATOMIC_SWAP : MIMG_Atomic <mimg<0x0f, 0x10>, "image_atomic_swap">;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000690defm IMAGE_ATOMIC_CMPSWAP : MIMG_Atomic <mimg<0x10, 0x11>, "image_atomic_cmpswap", 1>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000691defm IMAGE_ATOMIC_ADD : MIMG_Atomic <mimg<0x11, 0x12>, "image_atomic_add">;
692defm IMAGE_ATOMIC_SUB : MIMG_Atomic <mimg<0x12, 0x13>, "image_atomic_sub">;
693//def IMAGE_ATOMIC_RSUB : MIMG_NoPattern_ <"image_atomic_rsub", 0x00000013>; -- not on VI
694defm IMAGE_ATOMIC_SMIN : MIMG_Atomic <mimg<0x14>, "image_atomic_smin">;
695defm IMAGE_ATOMIC_UMIN : MIMG_Atomic <mimg<0x15>, "image_atomic_umin">;
696defm IMAGE_ATOMIC_SMAX : MIMG_Atomic <mimg<0x16>, "image_atomic_smax">;
697defm IMAGE_ATOMIC_UMAX : MIMG_Atomic <mimg<0x17>, "image_atomic_umax">;
698defm IMAGE_ATOMIC_AND : MIMG_Atomic <mimg<0x18>, "image_atomic_and">;
699defm IMAGE_ATOMIC_OR : MIMG_Atomic <mimg<0x19>, "image_atomic_or">;
700defm IMAGE_ATOMIC_XOR : MIMG_Atomic <mimg<0x1a>, "image_atomic_xor">;
701defm IMAGE_ATOMIC_INC : MIMG_Atomic <mimg<0x1b>, "image_atomic_inc">;
702defm IMAGE_ATOMIC_DEC : MIMG_Atomic <mimg<0x1c>, "image_atomic_dec">;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000703//def IMAGE_ATOMIC_FCMPSWAP : MIMG_NoPattern_ <"image_atomic_fcmpswap", 0x0000001d, 1>; -- not on VI
Changpeng Fangb28fe032016-09-01 17:54:54 +0000704//def IMAGE_ATOMIC_FMIN : MIMG_NoPattern_ <"image_atomic_fmin", 0x0000001e>; -- not on VI
705//def IMAGE_ATOMIC_FMAX : MIMG_NoPattern_ <"image_atomic_fmax", 0x0000001f>; -- not on VI
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000706defm IMAGE_SAMPLE : MIMG_Sampler_WQM <0x00000020, AMDGPUSample>;
707defm IMAGE_SAMPLE_CL : MIMG_Sampler_WQM <0x00000021, AMDGPUSample_cl>;
708defm IMAGE_SAMPLE_D : MIMG_Sampler <0x00000022, AMDGPUSample_d>;
709defm IMAGE_SAMPLE_D_CL : MIMG_Sampler <0x00000023, AMDGPUSample_d_cl>;
710defm IMAGE_SAMPLE_L : MIMG_Sampler <0x00000024, AMDGPUSample_l>;
711defm IMAGE_SAMPLE_B : MIMG_Sampler_WQM <0x00000025, AMDGPUSample_b>;
712defm IMAGE_SAMPLE_B_CL : MIMG_Sampler_WQM <0x00000026, AMDGPUSample_b_cl>;
713defm IMAGE_SAMPLE_LZ : MIMG_Sampler <0x00000027, AMDGPUSample_lz>;
714defm IMAGE_SAMPLE_C : MIMG_Sampler_WQM <0x00000028, AMDGPUSample_c>;
715defm IMAGE_SAMPLE_C_CL : MIMG_Sampler_WQM <0x00000029, AMDGPUSample_c_cl>;
716defm IMAGE_SAMPLE_C_D : MIMG_Sampler <0x0000002a, AMDGPUSample_c_d>;
717defm IMAGE_SAMPLE_C_D_CL : MIMG_Sampler <0x0000002b, AMDGPUSample_c_d_cl>;
718defm IMAGE_SAMPLE_C_L : MIMG_Sampler <0x0000002c, AMDGPUSample_c_l>;
719defm IMAGE_SAMPLE_C_B : MIMG_Sampler_WQM <0x0000002d, AMDGPUSample_c_b>;
720defm IMAGE_SAMPLE_C_B_CL : MIMG_Sampler_WQM <0x0000002e, AMDGPUSample_c_b_cl>;
721defm IMAGE_SAMPLE_C_LZ : MIMG_Sampler <0x0000002f, AMDGPUSample_c_lz>;
722defm IMAGE_SAMPLE_O : MIMG_Sampler_WQM <0x00000030, AMDGPUSample_o>;
723defm IMAGE_SAMPLE_CL_O : MIMG_Sampler_WQM <0x00000031, AMDGPUSample_cl_o>;
724defm IMAGE_SAMPLE_D_O : MIMG_Sampler <0x00000032, AMDGPUSample_d_o>;
725defm IMAGE_SAMPLE_D_CL_O : MIMG_Sampler <0x00000033, AMDGPUSample_d_cl_o>;
726defm IMAGE_SAMPLE_L_O : MIMG_Sampler <0x00000034, AMDGPUSample_l_o>;
727defm IMAGE_SAMPLE_B_O : MIMG_Sampler_WQM <0x00000035, AMDGPUSample_b_o>;
728defm IMAGE_SAMPLE_B_CL_O : MIMG_Sampler_WQM <0x00000036, AMDGPUSample_b_cl_o>;
729defm IMAGE_SAMPLE_LZ_O : MIMG_Sampler <0x00000037, AMDGPUSample_lz_o>;
730defm IMAGE_SAMPLE_C_O : MIMG_Sampler_WQM <0x00000038, AMDGPUSample_c_o>;
731defm IMAGE_SAMPLE_C_CL_O : MIMG_Sampler_WQM <0x00000039, AMDGPUSample_c_cl_o>;
732defm IMAGE_SAMPLE_C_D_O : MIMG_Sampler <0x0000003a, AMDGPUSample_c_d_o>;
733defm IMAGE_SAMPLE_C_D_CL_O : MIMG_Sampler <0x0000003b, AMDGPUSample_c_d_cl_o>;
734defm IMAGE_SAMPLE_C_L_O : MIMG_Sampler <0x0000003c, AMDGPUSample_c_l_o>;
735defm IMAGE_SAMPLE_C_B_CL_O : MIMG_Sampler_WQM <0x0000003e, AMDGPUSample_c_b_cl_o>;
736defm IMAGE_SAMPLE_C_B_O : MIMG_Sampler_WQM <0x0000003d, AMDGPUSample_c_b_o>;
737defm IMAGE_SAMPLE_C_LZ_O : MIMG_Sampler <0x0000003f, AMDGPUSample_c_lz_o>;
738defm IMAGE_GATHER4 : MIMG_Gather_WQM <0x00000040, AMDGPUSample>;
739defm IMAGE_GATHER4_CL : MIMG_Gather_WQM <0x00000041, AMDGPUSample_cl>;
740defm IMAGE_GATHER4_L : MIMG_Gather <0x00000044, AMDGPUSample_l>;
741defm IMAGE_GATHER4_B : MIMG_Gather_WQM <0x00000045, AMDGPUSample_b>;
742defm IMAGE_GATHER4_B_CL : MIMG_Gather_WQM <0x00000046, AMDGPUSample_b_cl>;
743defm IMAGE_GATHER4_LZ : MIMG_Gather <0x00000047, AMDGPUSample_lz>;
744defm IMAGE_GATHER4_C : MIMG_Gather_WQM <0x00000048, AMDGPUSample_c>;
745defm IMAGE_GATHER4_C_CL : MIMG_Gather_WQM <0x00000049, AMDGPUSample_c_cl>;
746defm IMAGE_GATHER4_C_L : MIMG_Gather <0x0000004c, AMDGPUSample_c_l>;
747defm IMAGE_GATHER4_C_B : MIMG_Gather_WQM <0x0000004d, AMDGPUSample_c_b>;
748defm IMAGE_GATHER4_C_B_CL : MIMG_Gather_WQM <0x0000004e, AMDGPUSample_c_b_cl>;
749defm IMAGE_GATHER4_C_LZ : MIMG_Gather <0x0000004f, AMDGPUSample_c_lz>;
750defm IMAGE_GATHER4_O : MIMG_Gather_WQM <0x00000050, AMDGPUSample_o>;
751defm IMAGE_GATHER4_CL_O : MIMG_Gather_WQM <0x00000051, AMDGPUSample_cl_o>;
752defm IMAGE_GATHER4_L_O : MIMG_Gather <0x00000054, AMDGPUSample_l_o>;
753defm IMAGE_GATHER4_B_O : MIMG_Gather_WQM <0x00000055, AMDGPUSample_b_o>;
754defm IMAGE_GATHER4_B_CL_O : MIMG_Gather <0x00000056, AMDGPUSample_b_cl_o>;
755defm IMAGE_GATHER4_LZ_O : MIMG_Gather <0x00000057, AMDGPUSample_lz_o>;
756defm IMAGE_GATHER4_C_O : MIMG_Gather_WQM <0x00000058, AMDGPUSample_c_o>;
757defm IMAGE_GATHER4_C_CL_O : MIMG_Gather_WQM <0x00000059, AMDGPUSample_c_cl_o>;
758defm IMAGE_GATHER4_C_L_O : MIMG_Gather <0x0000005c, AMDGPUSample_c_l_o>;
759defm IMAGE_GATHER4_C_B_O : MIMG_Gather_WQM <0x0000005d, AMDGPUSample_c_b_o>;
760defm IMAGE_GATHER4_C_B_CL_O : MIMG_Gather_WQM <0x0000005e, AMDGPUSample_c_b_cl_o>;
761defm IMAGE_GATHER4_C_LZ_O : MIMG_Gather <0x0000005f, AMDGPUSample_c_lz_o>;
Matt Arsenault856777d2017-12-08 20:00:57 +0000762
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000763defm IMAGE_GET_LOD : MIMG_Sampler <0x00000060, AMDGPUSample, 1, 1, "image_get_lod">;
Matt Arsenault856777d2017-12-08 20:00:57 +0000764
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000765defm IMAGE_SAMPLE_CD : MIMG_Sampler <0x00000068, AMDGPUSample_cd>;
766defm IMAGE_SAMPLE_CD_CL : MIMG_Sampler <0x00000069, AMDGPUSample_cd_cl>;
767defm IMAGE_SAMPLE_C_CD : MIMG_Sampler <0x0000006a, AMDGPUSample_c_cd>;
768defm IMAGE_SAMPLE_C_CD_CL : MIMG_Sampler <0x0000006b, AMDGPUSample_c_cd_cl>;
769defm IMAGE_SAMPLE_CD_O : MIMG_Sampler <0x0000006c, AMDGPUSample_cd_o>;
770defm IMAGE_SAMPLE_CD_CL_O : MIMG_Sampler <0x0000006d, AMDGPUSample_cd_cl_o>;
771defm IMAGE_SAMPLE_C_CD_O : MIMG_Sampler <0x0000006e, AMDGPUSample_c_cd_o>;
772defm IMAGE_SAMPLE_C_CD_CL_O : MIMG_Sampler <0x0000006f, AMDGPUSample_c_cd_cl_o>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000773//def IMAGE_RSRC256 : MIMG_NoPattern_RSRC256 <"image_rsrc256", 0x0000007e>;
774//def IMAGE_SAMPLER : MIMG_NoPattern_ <"image_sampler", 0x0000007f>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000775
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000776/********** ========================================= **********/
777/********** Table of dimension-aware image intrinsics **********/
778/********** ========================================= **********/
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000779
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000780class ImageDimIntrinsicInfo<AMDGPUImageDimIntrinsic I> {
781 Intrinsic Intr = I;
782 MIMGBaseOpcode BaseOpcode = !cast<MIMGBaseOpcode>(!strconcat("IMAGE_", I.P.OpMod));
783 AMDGPUDimProps Dim = I.P.Dim;
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000784}
785
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000786def ImageDimIntrinsicTable : GenericTable {
787 let FilterClass = "ImageDimIntrinsicInfo";
788 let Fields = ["Intr", "BaseOpcode", "Dim"];
789 GenericEnum TypeOf_BaseOpcode = MIMGBaseOpcode;
790 GenericEnum TypeOf_Dim = MIMGDim;
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000791
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000792 let PrimaryKey = ["Intr"];
793 let PrimaryKeyName = "getImageDimIntrinsicInfo";
794 let PrimaryKeyEarlyOut = 1;
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000795}
796
797foreach intr = !listconcat(AMDGPUImageDimIntrinsics,
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000798 AMDGPUImageDimAtomicIntrinsics) in {
799 def : ImageDimIntrinsicInfo<intr>;
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000800}
Ryan Taylor894c8fd2018-08-01 12:12:01 +0000801
802// L to LZ Optimization Mapping
803def : MIMGLZMapping<IMAGE_SAMPLE_L, IMAGE_SAMPLE_LZ>;
804def : MIMGLZMapping<IMAGE_SAMPLE_C_L, IMAGE_SAMPLE_C_LZ>;
805def : MIMGLZMapping<IMAGE_SAMPLE_L_O, IMAGE_SAMPLE_LZ_O>;
806def : MIMGLZMapping<IMAGE_SAMPLE_C_L_O, IMAGE_SAMPLE_C_LZ_O>;
807def : MIMGLZMapping<IMAGE_GATHER4_L, IMAGE_GATHER4_LZ>;
808def : MIMGLZMapping<IMAGE_GATHER4_C_L, IMAGE_GATHER4_C_LZ>;
809def : MIMGLZMapping<IMAGE_GATHER4_L_O, IMAGE_GATHER4_LZ_O>;
810def : MIMGLZMapping<IMAGE_GATHER4_C_L_O, IMAGE_GATHER4_C_LZ_O>;