blob: 3410dc3ff20cbaefb546191b4bef87c351205cc9 [file] [log] [blame]
Changpeng Fangb28fe032016-09-01 17:54:54 +00001//===-- MIMGInstructions.td - MIMG Instruction Defintions -----------------===//
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
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +000010// MIMG-specific encoding families to distinguish between semantically
11// equivalent machine instructions with different encoding.
12//
13// - MIMGEncPseudo: pseudo instruction, only used for atomics
14// - MIMGEncGfx6: encoding introduced with gfx6 (obsoleted for atomics in gfx8)
15// - MIMGEncGfx8: encoding introduced with gfx8 for atomics
16class MIMGEncoding;
17
18def MIMGEncPseudo : MIMGEncoding;
19def MIMGEncGfx6 : MIMGEncoding;
20def MIMGEncGfx8 : MIMGEncoding;
21
22def MIMGEncoding : GenericEnum {
23 let FilterClass = "MIMGEncoding";
Changpeng Fangb28fe032016-09-01 17:54:54 +000024}
25
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +000026// Represent an ISA-level opcode, independent of the encoding and the
27// vdata/vaddr size.
28class MIMGBaseOpcode {
29 MIMGBaseOpcode BaseOpcode = !cast<MIMGBaseOpcode>(NAME);
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +000030 bit Store = 0;
31 bit Atomic = 0;
32 bit AtomicX2 = 0; // (f)cmpswap
33 bit Sampler = 0;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +000034 bits<8> NumExtraArgs = 0;
35 bit Gradients = 0;
36 bit Coordinates = 1;
37 bit LodOrClampOrMip = 0;
38 bit HasD16 = 0;
Dmitry Preobrazhensky0b4eb1e2018-01-26 15:43:29 +000039}
40
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +000041def MIMGBaseOpcode : GenericEnum {
42 let FilterClass = "MIMGBaseOpcode";
43}
44
45def MIMGBaseOpcodesTable : GenericTable {
46 let FilterClass = "MIMGBaseOpcode";
47 let CppTypeName = "MIMGBaseOpcodeInfo";
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +000048 let Fields = ["BaseOpcode", "Store", "Atomic", "AtomicX2", "Sampler",
49 "NumExtraArgs", "Gradients", "Coordinates", "LodOrClampOrMip",
50 "HasD16"];
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +000051 GenericEnum TypeOf_BaseOpcode = MIMGBaseOpcode;
52
53 let PrimaryKey = ["BaseOpcode"];
54 let PrimaryKeyName = "getMIMGBaseOpcodeInfo";
Nicolai Haehnlef2674312018-06-21 13:36:01 +000055}
56
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +000057def MIMGDim : GenericEnum {
58 let FilterClass = "AMDGPUDimProps";
59}
60
61def MIMGDimInfoTable : GenericTable {
62 let FilterClass = "AMDGPUDimProps";
63 let CppTypeName = "MIMGDimInfo";
64 let Fields = ["Dim", "NumCoords", "NumGradients", "DA"];
65 GenericEnum TypeOf_Dim = MIMGDim;
66
67 let PrimaryKey = ["Dim"];
68 let PrimaryKeyName = "getMIMGDimInfo";
69}
70
Changpeng Fangb28fe032016-09-01 17:54:54 +000071class mimg <bits<7> si, bits<7> vi = si> {
72 field bits<7> SI = si;
73 field bits<7> VI = vi;
74}
75
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +000076class MIMG <dag outs, string dns = "">
77 : InstSI <outs, (ins), "", []> {
78
79 let VM_CNT = 1;
80 let EXP_CNT = 1;
81 let MIMG = 1;
82 let Uses = [EXEC];
Changpeng Fangb28fe032016-09-01 17:54:54 +000083 let mayLoad = 1;
84 let mayStore = 0;
85 let hasPostISelHook = 1;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +000086 let SchedRW = [WriteVMEM];
87 let UseNamedOperandTable = 1;
88 let hasSideEffects = 0; // XXX ????
89
90 let SubtargetPredicate = isGCN;
Changpeng Fangb28fe032016-09-01 17:54:54 +000091 let DecoderNamespace = dns;
92 let isAsmParserOnly = !if(!eq(dns,""), 1, 0);
93 let AsmMatchConverter = "cvtMIMG";
Tom Stellard244891d2016-12-20 15:52:17 +000094 let usesCustomInserter = 1;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +000095
96 Instruction Opcode = !cast<Instruction>(NAME);
97 MIMGBaseOpcode BaseOpcode;
98 MIMGEncoding MIMGEncoding = MIMGEncGfx6;
99 bits<8> VDataDwords;
100 bits<8> VAddrDwords;
101}
102
103def MIMGInfoTable : GenericTable {
104 let FilterClass = "MIMG";
105 let CppTypeName = "MIMGInfo";
106 let Fields = ["Opcode", "BaseOpcode", "MIMGEncoding", "VDataDwords", "VAddrDwords"];
107 GenericEnum TypeOf_BaseOpcode = MIMGBaseOpcode;
108 GenericEnum TypeOf_MIMGEncoding = MIMGEncoding;
109
110 let PrimaryKey = ["BaseOpcode", "MIMGEncoding", "VDataDwords", "VAddrDwords"];
111 let PrimaryKeyName = "getMIMGOpcodeHelper";
112}
113
114def getMIMGInfo : SearchIndex {
115 let Table = MIMGInfoTable;
116 let Key = ["Opcode"];
Changpeng Fangb28fe032016-09-01 17:54:54 +0000117}
118
119class MIMG_NoSampler_Helper <bits<7> op, string asm,
120 RegisterClass dst_rc,
121 RegisterClass addr_rc,
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000122 string dns="">
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000123 : MIMG <(outs dst_rc:$vdata), dns>,
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000124 MIMGe<op> {
Changpeng Fangb28fe032016-09-01 17:54:54 +0000125 let ssamp = 0;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000126 let d16 = !if(BaseOpcode.HasD16, ?, 0);
Changpeng Fang4737e892018-01-18 22:08:53 +0000127
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000128 let InOperandList = !con((ins addr_rc:$vaddr, SReg_256:$srsrc,
129 DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc,
130 R128:$r128, TFE:$tfe, LWE:$lwe, DA:$da),
131 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
132 let AsmString = asm#" $vdata, $vaddr, $srsrc$dmask$unorm$glc$slc$r128$tfe$lwe$da"
133 #!if(BaseOpcode.HasD16, "$d16", "");
Changpeng Fangb28fe032016-09-01 17:54:54 +0000134}
135
136multiclass MIMG_NoSampler_Src_Helper <bits<7> op, string asm,
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000137 RegisterClass dst_rc,
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000138 bit enableDisasm> {
139 let VAddrDwords = 1 in
140 def NAME # _V1 : MIMG_NoSampler_Helper <op, asm, dst_rc, VGPR_32,
141 !if(enableDisasm, "AMDGPU", "")>;
142 let VAddrDwords = 2 in
143 def NAME # _V2 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_64>;
144 let VAddrDwords = 3 in
145 def NAME # _V3 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_96>;
146 let VAddrDwords = 4 in
147 def NAME # _V4 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_128>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000148}
149
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000150multiclass MIMG_NoSampler <bits<7> op, string asm, bit has_d16, bit mip = 0,
151 bit isResInfo = 0> {
152 def "" : MIMGBaseOpcode {
153 let Coordinates = !if(isResInfo, 0, 1);
154 let LodOrClampOrMip = mip;
155 let HasD16 = has_d16;
156 }
157
158 let BaseOpcode = !cast<MIMGBaseOpcode>(NAME),
159 mayLoad = !if(isResInfo, 0, 1) in {
160 let VDataDwords = 1 in
161 defm _V1 : MIMG_NoSampler_Src_Helper <op, asm, VGPR_32, 1>;
162 let VDataDwords = 2 in
163 defm _V2 : MIMG_NoSampler_Src_Helper <op, asm, VReg_64, 0>;
164 let VDataDwords = 3 in
165 defm _V3 : MIMG_NoSampler_Src_Helper <op, asm, VReg_96, 0>;
166 let VDataDwords = 4 in
167 defm _V4 : MIMG_NoSampler_Src_Helper <op, asm, VReg_128, 0>;
168 }
Dmitry Preobrazhensky2456ac62018-03-28 15:44:16 +0000169}
170
Changpeng Fangb28fe032016-09-01 17:54:54 +0000171class MIMG_Store_Helper <bits<7> op, string asm,
172 RegisterClass data_rc,
Matt Arsenaultcad7fa82017-12-13 21:07:51 +0000173 RegisterClass addr_rc,
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000174 string dns = "">
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000175 : MIMG <(outs), dns>,
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000176 MIMGe<op> {
Changpeng Fangb28fe032016-09-01 17:54:54 +0000177 let ssamp = 0;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000178 let d16 = !if(BaseOpcode.HasD16, ?, 0);
179
Matt Arsenaultd94b63d2017-12-29 17:18:18 +0000180 let mayLoad = 0;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000181 let mayStore = 1;
Matt Arsenaultd94b63d2017-12-29 17:18:18 +0000182 let hasSideEffects = 0;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000183 let hasPostISelHook = 0;
184 let DisableWQM = 1;
Changpeng Fang4737e892018-01-18 22:08:53 +0000185
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000186 let InOperandList = !con((ins data_rc:$vdata, addr_rc:$vaddr, SReg_256:$srsrc,
187 DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc,
188 R128:$r128, TFE:$tfe, LWE:$lwe, DA:$da),
189 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
190 let AsmString = asm#" $vdata, $vaddr, $srsrc$dmask$unorm$glc$slc$r128$tfe$lwe$da"
191 #!if(BaseOpcode.HasD16, "$d16", "");
Changpeng Fangb28fe032016-09-01 17:54:54 +0000192}
193
194multiclass MIMG_Store_Addr_Helper <bits<7> op, string asm,
195 RegisterClass data_rc,
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000196 bit enableDisasm> {
197 let VAddrDwords = 1 in
198 def NAME # _V1 : MIMG_Store_Helper <op, asm, data_rc, VGPR_32,
199 !if(enableDisasm, "AMDGPU", "")>;
200 let VAddrDwords = 2 in
201 def NAME # _V2 : MIMG_Store_Helper <op, asm, data_rc, VReg_64>;
202 let VAddrDwords = 3 in
203 def NAME # _V3 : MIMG_Store_Helper <op, asm, data_rc, VReg_96>;
204 let VAddrDwords = 4 in
205 def NAME # _V4 : MIMG_Store_Helper <op, asm, data_rc, VReg_128>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000206}
207
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000208multiclass MIMG_Store <bits<7> op, string asm, bit has_d16, bit mip = 0> {
209 def "" : MIMGBaseOpcode {
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000210 let Store = 1;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000211 let LodOrClampOrMip = mip;
212 let HasD16 = has_d16;
213 }
214
215 let BaseOpcode = !cast<MIMGBaseOpcode>(NAME) in {
216 let VDataDwords = 1 in
217 defm _V1 : MIMG_Store_Addr_Helper <op, asm, VGPR_32, 1>;
218 let VDataDwords = 2 in
219 defm _V2 : MIMG_Store_Addr_Helper <op, asm, VReg_64, 0>;
220 let VDataDwords = 3 in
221 defm _V3 : MIMG_Store_Addr_Helper <op, asm, VReg_96, 0>;
222 let VDataDwords = 4 in
223 defm _V4 : MIMG_Store_Addr_Helper <op, asm, VReg_128, 0>;
224 }
Dmitry Preobrazhensky2456ac62018-03-28 15:44:16 +0000225}
226
Changpeng Fangb28fe032016-09-01 17:54:54 +0000227class MIMG_Atomic_Helper <string asm, RegisterClass data_rc,
Dmitry Preobrazhensky6cb42e72018-01-26 14:07:38 +0000228 RegisterClass addr_rc, string dns="",
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000229 bit enableDasm = 0>
230 : MIMG <(outs data_rc:$vdst), !if(enableDasm, dns, "")> {
Matt Arsenaultd94b63d2017-12-29 17:18:18 +0000231 let mayLoad = 1;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000232 let mayStore = 1;
Matt Arsenaultd94b63d2017-12-29 17:18:18 +0000233 let hasSideEffects = 1; // FIXME: Remove this
Changpeng Fangb28fe032016-09-01 17:54:54 +0000234 let hasPostISelHook = 0;
235 let DisableWQM = 1;
236 let Constraints = "$vdst = $vdata";
237 let AsmMatchConverter = "cvtMIMGAtomic";
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000238
239 let InOperandList = (ins data_rc:$vdata, addr_rc:$vaddr, SReg_256:$srsrc,
240 DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc,
241 R128:$r128, TFE:$tfe, LWE:$lwe, DA:$da);
242 let AsmString = asm#" $vdst, $vaddr, $srsrc$dmask$unorm$glc$slc$r128$tfe$lwe$da";
Changpeng Fangb28fe032016-09-01 17:54:54 +0000243}
244
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000245multiclass MIMG_Atomic_Helper_m <mimg op, string asm, RegisterClass data_rc,
246 RegisterClass addr_rc, bit enableDasm = 0> {
247 let isPseudo = 1, isCodeGenOnly = 1, MIMGEncoding = MIMGEncPseudo in {
Changpeng Fangb28fe032016-09-01 17:54:54 +0000248 def "" : MIMG_Atomic_Helper<asm, data_rc, addr_rc>,
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000249 SIMCInstr<NAME, SIEncodingFamily.NONE>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000250 }
251
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000252 let ssamp = 0, d16 = 0, isCodeGenOnly = 0 in {
253 def _si : MIMG_Atomic_Helper<asm, data_rc, addr_rc, "SICI", enableDasm>,
254 SIMCInstr<NAME, SIEncodingFamily.SI>,
255 MIMGe<op.SI> {
256 let AssemblerPredicates = [isSICI];
257 let DisableDecoder = DisableSIDecoder;
258 }
Changpeng Fangb28fe032016-09-01 17:54:54 +0000259
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000260 def _vi : MIMG_Atomic_Helper<asm, data_rc, addr_rc, "VI", enableDasm>,
261 SIMCInstr<NAME, SIEncodingFamily.VI>,
262 MIMGe<op.VI> {
263 let AssemblerPredicates = [isVI];
264 let DisableDecoder = DisableVIDecoder;
265 let MIMGEncoding = MIMGEncGfx8;
266 }
Changpeng Fangb28fe032016-09-01 17:54:54 +0000267 }
268}
269
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000270multiclass MIMG_Atomic_Addr_Helper_m <mimg op, string asm,
Dmitry Preobrazhensky0b4eb1e2018-01-26 15:43:29 +0000271 RegisterClass data_rc,
Dmitry Preobrazhensky0b4eb1e2018-01-26 15:43:29 +0000272 bit enableDasm = 0> {
Dmitry Preobrazhensky6cb42e72018-01-26 14:07:38 +0000273 // _V* variants have different address size, but the size is not encoded.
274 // So only one variant can be disassembled. V1 looks the safest to decode.
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000275 let VAddrDwords = 1 in
276 defm _V1 : MIMG_Atomic_Helper_m <op, asm, data_rc, VGPR_32, enableDasm>;
277 let VAddrDwords = 2 in
278 defm _V2 : MIMG_Atomic_Helper_m <op, asm, data_rc, VReg_64>;
279 let VAddrDwords = 3 in
280 defm _V3 : MIMG_Atomic_Helper_m <op, asm, data_rc, VReg_96>;
281 let VAddrDwords = 4 in
282 defm _V4 : MIMG_Atomic_Helper_m <op, asm, data_rc, VReg_128>;
Dmitry Preobrazhensky0b4eb1e2018-01-26 15:43:29 +0000283}
284
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000285multiclass MIMG_Atomic <mimg op, string asm, bit isCmpSwap = 0> { // 64-bit atomics
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000286 def "" : MIMGBaseOpcode {
287 let Atomic = 1;
288 let AtomicX2 = isCmpSwap;
289 }
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000290
291 let BaseOpcode = !cast<MIMGBaseOpcode>(NAME) in {
292 // _V* variants have different dst size, but the size is encoded implicitly,
293 // using dmask and tfe. Only 32-bit variant is registered with disassembler.
294 // Other variants are reconstructed by disassembler using dmask and tfe.
295 let VDataDwords = !if(isCmpSwap, 2, 1) in
296 defm _V1 : MIMG_Atomic_Addr_Helper_m <op, asm, !if(isCmpSwap, VReg_64, VGPR_32), 1>;
297 let VDataDwords = !if(isCmpSwap, 4, 2) in
298 defm _V2 : MIMG_Atomic_Addr_Helper_m <op, asm, !if(isCmpSwap, VReg_128, VReg_64)>;
299 }
Changpeng Fangb28fe032016-09-01 17:54:54 +0000300}
301
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000302class MIMG_Sampler_Helper <bits<7> op, string asm, RegisterClass dst_rc,
303 RegisterClass src_rc, string dns="">
304 : MIMG <(outs dst_rc:$vdata), dns>,
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000305 MIMGe<op> {
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000306 let d16 = !if(BaseOpcode.HasD16, ?, 0);
Changpeng Fang4737e892018-01-18 22:08:53 +0000307
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000308 let InOperandList = !con((ins src_rc:$vaddr, SReg_256:$srsrc, SReg_128:$ssamp,
309 DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc,
310 R128:$r128, TFE:$tfe, LWE:$lwe, DA:$da),
311 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
312 let AsmString = asm#" $vdata, $vaddr, $srsrc, $ssamp$dmask$unorm$glc$slc$r128$tfe$lwe$da"
313 #!if(BaseOpcode.HasD16, "$d16", "");
Changpeng Fangb28fe032016-09-01 17:54:54 +0000314}
315
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000316multiclass MIMG_Sampler_Src_Helper <bits<7> op, string asm, RegisterClass dst_rc,
317 bit enableDisasm = 0> {
318 let VAddrDwords = 1 in
319 def _V1 : MIMG_Sampler_Helper <op, asm, dst_rc, VGPR_32,
320 !if(enableDisasm, "AMDGPU", "")>;
321 let VAddrDwords = 2 in
322 def _V2 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_64>;
323 let VAddrDwords = 3 in
324 def _V3 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_96>;
325 let VAddrDwords = 4 in
326 def _V4 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_128>;
327 let VAddrDwords = 8 in
328 def _V8 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_256>;
329 let VAddrDwords = 16 in
330 def _V16 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_512>;
331}
332
333class MIMG_Sampler_BaseOpcode<AMDGPUSampleVariant sample>
334 : MIMGBaseOpcode {
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000335 let Sampler = 1;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000336 let NumExtraArgs = !size(sample.ExtraAddrArgs);
337 let Gradients = sample.Gradients;
338 let LodOrClampOrMip = !ne(sample.LodOrClamp, "");
Changpeng Fangb28fe032016-09-01 17:54:54 +0000339}
340
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000341multiclass MIMG_Sampler <bits<7> op, AMDGPUSampleVariant sample, bit wqm = 0,
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000342 bit isGetLod = 0,
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000343 string asm = "image_sample"#sample.LowerCaseMod> {
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000344 def "" : MIMG_Sampler_BaseOpcode<sample> {
345 let HasD16 = !if(isGetLod, 0, 1);
346 }
347
348 let BaseOpcode = !cast<MIMGBaseOpcode>(NAME), WQM = wqm,
349 mayLoad = !if(isGetLod, 0, 1) in {
350 let VDataDwords = 1 in
351 defm _V1 : MIMG_Sampler_Src_Helper<op, asm, VGPR_32, 1>;
352 let VDataDwords = 2 in
353 defm _V2 : MIMG_Sampler_Src_Helper<op, asm, VReg_64>;
354 let VDataDwords = 3 in
355 defm _V3 : MIMG_Sampler_Src_Helper<op, asm, VReg_96>;
356 let VDataDwords = 4 in
357 defm _V4 : MIMG_Sampler_Src_Helper<op, asm, VReg_128>;
358 }
Changpeng Fangb28fe032016-09-01 17:54:54 +0000359}
360
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000361multiclass MIMG_Sampler_WQM <bits<7> op, AMDGPUSampleVariant sample>
362 : MIMG_Sampler<op, sample, 1>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000363
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000364multiclass MIMG_Gather <bits<7> op, AMDGPUSampleVariant sample, bit wqm = 0,
365 string asm = "image_gather4"#sample.LowerCaseMod> {
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000366 def "" : MIMG_Sampler_BaseOpcode<sample> {
367 let HasD16 = 1;
368 }
369
370 let BaseOpcode = !cast<MIMGBaseOpcode>(NAME), WQM = wqm,
371 Gather4 = 1, hasPostISelHook = 0 in {
372 let VDataDwords = 2 in
373 defm _V2 : MIMG_Sampler_Src_Helper<op, asm, VReg_64>; /* for packed D16 only */
374 let VDataDwords = 4 in
375 defm _V4 : MIMG_Sampler_Src_Helper<op, asm, VReg_128, 1>;
376 }
Changpeng Fangb28fe032016-09-01 17:54:54 +0000377}
378
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000379multiclass MIMG_Gather_WQM <bits<7> op, AMDGPUSampleVariant sample>
380 : MIMG_Gather<op, sample, 1>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000381
382//===----------------------------------------------------------------------===//
383// MIMG Instructions
384//===----------------------------------------------------------------------===//
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000385defm IMAGE_LOAD : MIMG_NoSampler <0x00000000, "image_load", 1>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000386defm IMAGE_LOAD_MIP : MIMG_NoSampler <0x00000001, "image_load_mip", 1, 1>;
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000387defm IMAGE_LOAD_PCK : MIMG_NoSampler <0x00000002, "image_load_pck", 0>;
388defm IMAGE_LOAD_PCK_SGN : MIMG_NoSampler <0x00000003, "image_load_pck_sgn", 0>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000389defm IMAGE_LOAD_MIP_PCK : MIMG_NoSampler <0x00000004, "image_load_mip_pck", 0, 1>;
390defm IMAGE_LOAD_MIP_PCK_SGN : MIMG_NoSampler <0x00000005, "image_load_mip_pck_sgn", 0, 1>;
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000391defm IMAGE_STORE : MIMG_Store <0x00000008, "image_store", 1>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000392defm IMAGE_STORE_MIP : MIMG_Store <0x00000009, "image_store_mip", 1, 1>;
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000393defm IMAGE_STORE_PCK : MIMG_Store <0x0000000a, "image_store_pck", 0>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000394defm IMAGE_STORE_MIP_PCK : MIMG_Store <0x0000000b, "image_store_mip_pck", 0, 1>;
Matt Arsenault856777d2017-12-08 20:00:57 +0000395
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000396defm IMAGE_GET_RESINFO : MIMG_NoSampler <0x0000000e, "image_get_resinfo", 0, 1, 1>;
Matt Arsenault856777d2017-12-08 20:00:57 +0000397
Changpeng Fangb28fe032016-09-01 17:54:54 +0000398defm IMAGE_ATOMIC_SWAP : MIMG_Atomic <mimg<0x0f, 0x10>, "image_atomic_swap">;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000399defm IMAGE_ATOMIC_CMPSWAP : MIMG_Atomic <mimg<0x10, 0x11>, "image_atomic_cmpswap", 1>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000400defm IMAGE_ATOMIC_ADD : MIMG_Atomic <mimg<0x11, 0x12>, "image_atomic_add">;
401defm IMAGE_ATOMIC_SUB : MIMG_Atomic <mimg<0x12, 0x13>, "image_atomic_sub">;
402//def IMAGE_ATOMIC_RSUB : MIMG_NoPattern_ <"image_atomic_rsub", 0x00000013>; -- not on VI
403defm IMAGE_ATOMIC_SMIN : MIMG_Atomic <mimg<0x14>, "image_atomic_smin">;
404defm IMAGE_ATOMIC_UMIN : MIMG_Atomic <mimg<0x15>, "image_atomic_umin">;
405defm IMAGE_ATOMIC_SMAX : MIMG_Atomic <mimg<0x16>, "image_atomic_smax">;
406defm IMAGE_ATOMIC_UMAX : MIMG_Atomic <mimg<0x17>, "image_atomic_umax">;
407defm IMAGE_ATOMIC_AND : MIMG_Atomic <mimg<0x18>, "image_atomic_and">;
408defm IMAGE_ATOMIC_OR : MIMG_Atomic <mimg<0x19>, "image_atomic_or">;
409defm IMAGE_ATOMIC_XOR : MIMG_Atomic <mimg<0x1a>, "image_atomic_xor">;
410defm IMAGE_ATOMIC_INC : MIMG_Atomic <mimg<0x1b>, "image_atomic_inc">;
411defm IMAGE_ATOMIC_DEC : MIMG_Atomic <mimg<0x1c>, "image_atomic_dec">;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000412//def IMAGE_ATOMIC_FCMPSWAP : MIMG_NoPattern_ <"image_atomic_fcmpswap", 0x0000001d, 1>; -- not on VI
Changpeng Fangb28fe032016-09-01 17:54:54 +0000413//def IMAGE_ATOMIC_FMIN : MIMG_NoPattern_ <"image_atomic_fmin", 0x0000001e>; -- not on VI
414//def IMAGE_ATOMIC_FMAX : MIMG_NoPattern_ <"image_atomic_fmax", 0x0000001f>; -- not on VI
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000415defm IMAGE_SAMPLE : MIMG_Sampler_WQM <0x00000020, AMDGPUSample>;
416defm IMAGE_SAMPLE_CL : MIMG_Sampler_WQM <0x00000021, AMDGPUSample_cl>;
417defm IMAGE_SAMPLE_D : MIMG_Sampler <0x00000022, AMDGPUSample_d>;
418defm IMAGE_SAMPLE_D_CL : MIMG_Sampler <0x00000023, AMDGPUSample_d_cl>;
419defm IMAGE_SAMPLE_L : MIMG_Sampler <0x00000024, AMDGPUSample_l>;
420defm IMAGE_SAMPLE_B : MIMG_Sampler_WQM <0x00000025, AMDGPUSample_b>;
421defm IMAGE_SAMPLE_B_CL : MIMG_Sampler_WQM <0x00000026, AMDGPUSample_b_cl>;
422defm IMAGE_SAMPLE_LZ : MIMG_Sampler <0x00000027, AMDGPUSample_lz>;
423defm IMAGE_SAMPLE_C : MIMG_Sampler_WQM <0x00000028, AMDGPUSample_c>;
424defm IMAGE_SAMPLE_C_CL : MIMG_Sampler_WQM <0x00000029, AMDGPUSample_c_cl>;
425defm IMAGE_SAMPLE_C_D : MIMG_Sampler <0x0000002a, AMDGPUSample_c_d>;
426defm IMAGE_SAMPLE_C_D_CL : MIMG_Sampler <0x0000002b, AMDGPUSample_c_d_cl>;
427defm IMAGE_SAMPLE_C_L : MIMG_Sampler <0x0000002c, AMDGPUSample_c_l>;
428defm IMAGE_SAMPLE_C_B : MIMG_Sampler_WQM <0x0000002d, AMDGPUSample_c_b>;
429defm IMAGE_SAMPLE_C_B_CL : MIMG_Sampler_WQM <0x0000002e, AMDGPUSample_c_b_cl>;
430defm IMAGE_SAMPLE_C_LZ : MIMG_Sampler <0x0000002f, AMDGPUSample_c_lz>;
431defm IMAGE_SAMPLE_O : MIMG_Sampler_WQM <0x00000030, AMDGPUSample_o>;
432defm IMAGE_SAMPLE_CL_O : MIMG_Sampler_WQM <0x00000031, AMDGPUSample_cl_o>;
433defm IMAGE_SAMPLE_D_O : MIMG_Sampler <0x00000032, AMDGPUSample_d_o>;
434defm IMAGE_SAMPLE_D_CL_O : MIMG_Sampler <0x00000033, AMDGPUSample_d_cl_o>;
435defm IMAGE_SAMPLE_L_O : MIMG_Sampler <0x00000034, AMDGPUSample_l_o>;
436defm IMAGE_SAMPLE_B_O : MIMG_Sampler_WQM <0x00000035, AMDGPUSample_b_o>;
437defm IMAGE_SAMPLE_B_CL_O : MIMG_Sampler_WQM <0x00000036, AMDGPUSample_b_cl_o>;
438defm IMAGE_SAMPLE_LZ_O : MIMG_Sampler <0x00000037, AMDGPUSample_lz_o>;
439defm IMAGE_SAMPLE_C_O : MIMG_Sampler_WQM <0x00000038, AMDGPUSample_c_o>;
440defm IMAGE_SAMPLE_C_CL_O : MIMG_Sampler_WQM <0x00000039, AMDGPUSample_c_cl_o>;
441defm IMAGE_SAMPLE_C_D_O : MIMG_Sampler <0x0000003a, AMDGPUSample_c_d_o>;
442defm IMAGE_SAMPLE_C_D_CL_O : MIMG_Sampler <0x0000003b, AMDGPUSample_c_d_cl_o>;
443defm IMAGE_SAMPLE_C_L_O : MIMG_Sampler <0x0000003c, AMDGPUSample_c_l_o>;
444defm IMAGE_SAMPLE_C_B_CL_O : MIMG_Sampler_WQM <0x0000003e, AMDGPUSample_c_b_cl_o>;
445defm IMAGE_SAMPLE_C_B_O : MIMG_Sampler_WQM <0x0000003d, AMDGPUSample_c_b_o>;
446defm IMAGE_SAMPLE_C_LZ_O : MIMG_Sampler <0x0000003f, AMDGPUSample_c_lz_o>;
447defm IMAGE_GATHER4 : MIMG_Gather_WQM <0x00000040, AMDGPUSample>;
448defm IMAGE_GATHER4_CL : MIMG_Gather_WQM <0x00000041, AMDGPUSample_cl>;
449defm IMAGE_GATHER4_L : MIMG_Gather <0x00000044, AMDGPUSample_l>;
450defm IMAGE_GATHER4_B : MIMG_Gather_WQM <0x00000045, AMDGPUSample_b>;
451defm IMAGE_GATHER4_B_CL : MIMG_Gather_WQM <0x00000046, AMDGPUSample_b_cl>;
452defm IMAGE_GATHER4_LZ : MIMG_Gather <0x00000047, AMDGPUSample_lz>;
453defm IMAGE_GATHER4_C : MIMG_Gather_WQM <0x00000048, AMDGPUSample_c>;
454defm IMAGE_GATHER4_C_CL : MIMG_Gather_WQM <0x00000049, AMDGPUSample_c_cl>;
455defm IMAGE_GATHER4_C_L : MIMG_Gather <0x0000004c, AMDGPUSample_c_l>;
456defm IMAGE_GATHER4_C_B : MIMG_Gather_WQM <0x0000004d, AMDGPUSample_c_b>;
457defm IMAGE_GATHER4_C_B_CL : MIMG_Gather_WQM <0x0000004e, AMDGPUSample_c_b_cl>;
458defm IMAGE_GATHER4_C_LZ : MIMG_Gather <0x0000004f, AMDGPUSample_c_lz>;
459defm IMAGE_GATHER4_O : MIMG_Gather_WQM <0x00000050, AMDGPUSample_o>;
460defm IMAGE_GATHER4_CL_O : MIMG_Gather_WQM <0x00000051, AMDGPUSample_cl_o>;
461defm IMAGE_GATHER4_L_O : MIMG_Gather <0x00000054, AMDGPUSample_l_o>;
462defm IMAGE_GATHER4_B_O : MIMG_Gather_WQM <0x00000055, AMDGPUSample_b_o>;
463defm IMAGE_GATHER4_B_CL_O : MIMG_Gather <0x00000056, AMDGPUSample_b_cl_o>;
464defm IMAGE_GATHER4_LZ_O : MIMG_Gather <0x00000057, AMDGPUSample_lz_o>;
465defm IMAGE_GATHER4_C_O : MIMG_Gather_WQM <0x00000058, AMDGPUSample_c_o>;
466defm IMAGE_GATHER4_C_CL_O : MIMG_Gather_WQM <0x00000059, AMDGPUSample_c_cl_o>;
467defm IMAGE_GATHER4_C_L_O : MIMG_Gather <0x0000005c, AMDGPUSample_c_l_o>;
468defm IMAGE_GATHER4_C_B_O : MIMG_Gather_WQM <0x0000005d, AMDGPUSample_c_b_o>;
469defm IMAGE_GATHER4_C_B_CL_O : MIMG_Gather_WQM <0x0000005e, AMDGPUSample_c_b_cl_o>;
470defm IMAGE_GATHER4_C_LZ_O : MIMG_Gather <0x0000005f, AMDGPUSample_c_lz_o>;
Matt Arsenault856777d2017-12-08 20:00:57 +0000471
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000472defm IMAGE_GET_LOD : MIMG_Sampler <0x00000060, AMDGPUSample, 1, 1, "image_get_lod">;
Matt Arsenault856777d2017-12-08 20:00:57 +0000473
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000474defm IMAGE_SAMPLE_CD : MIMG_Sampler <0x00000068, AMDGPUSample_cd>;
475defm IMAGE_SAMPLE_CD_CL : MIMG_Sampler <0x00000069, AMDGPUSample_cd_cl>;
476defm IMAGE_SAMPLE_C_CD : MIMG_Sampler <0x0000006a, AMDGPUSample_c_cd>;
477defm IMAGE_SAMPLE_C_CD_CL : MIMG_Sampler <0x0000006b, AMDGPUSample_c_cd_cl>;
478defm IMAGE_SAMPLE_CD_O : MIMG_Sampler <0x0000006c, AMDGPUSample_cd_o>;
479defm IMAGE_SAMPLE_CD_CL_O : MIMG_Sampler <0x0000006d, AMDGPUSample_cd_cl_o>;
480defm IMAGE_SAMPLE_C_CD_O : MIMG_Sampler <0x0000006e, AMDGPUSample_c_cd_o>;
481defm IMAGE_SAMPLE_C_CD_CL_O : MIMG_Sampler <0x0000006f, AMDGPUSample_c_cd_cl_o>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000482//def IMAGE_RSRC256 : MIMG_NoPattern_RSRC256 <"image_rsrc256", 0x0000007e>;
483//def IMAGE_SAMPLER : MIMG_NoPattern_ <"image_sampler", 0x0000007f>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000484
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000485/********** ========================================= **********/
486/********** Table of dimension-aware image intrinsics **********/
487/********** ========================================= **********/
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000488
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000489class ImageDimIntrinsicInfo<AMDGPUImageDimIntrinsic I> {
490 Intrinsic Intr = I;
491 MIMGBaseOpcode BaseOpcode = !cast<MIMGBaseOpcode>(!strconcat("IMAGE_", I.P.OpMod));
492 AMDGPUDimProps Dim = I.P.Dim;
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000493}
494
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000495def ImageDimIntrinsicTable : GenericTable {
496 let FilterClass = "ImageDimIntrinsicInfo";
497 let Fields = ["Intr", "BaseOpcode", "Dim"];
498 GenericEnum TypeOf_BaseOpcode = MIMGBaseOpcode;
499 GenericEnum TypeOf_Dim = MIMGDim;
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000500
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000501 let PrimaryKey = ["Intr"];
502 let PrimaryKeyName = "getImageDimIntrinsicInfo";
503 let PrimaryKeyEarlyOut = 1;
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000504}
505
506foreach intr = !listconcat(AMDGPUImageDimIntrinsics,
Nicolai Haehnle7a9c03f2018-06-21 13:36:57 +0000507 AMDGPUImageDimAtomicIntrinsics) in {
508 def : ImageDimIntrinsicInfo<intr>;
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000509}
510
Changpeng Fangb28fe032016-09-01 17:54:54 +0000511/********** ======================= **********/
512/********** Image sampling patterns **********/
513/********** ======================= **********/
514
Changpeng Fang4737e892018-01-18 22:08:53 +0000515// ImageSample for amdgcn
Changpeng Fangb28fe032016-09-01 17:54:54 +0000516// TODO:
Changpeng Fang4737e892018-01-18 22:08:53 +0000517// 1. Handle v4i32 rsrc type (Register Class for the instruction to be SReg_128).
518// 2. Add A16 support when we pass address of half type.
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000519multiclass ImageSamplePattern<SDPatternOperator name, MIMG opcode,
520 ValueType dt, ValueType vt, bit d16> {
Matt Arsenault90c75932017-10-03 00:06:41 +0000521 def : GCNPat<
Changpeng Fang8236fe12016-11-14 18:33:18 +0000522 (dt (name vt:$addr, v8i32:$rsrc, v4i32:$sampler, i32:$dmask, i1:$unorm, i1:$glc,
Changpeng Fangb28fe032016-09-01 17:54:54 +0000523 i1:$slc, i1:$lwe, i1:$da)),
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000524 !con((opcode $addr, $rsrc, $sampler, (as_i32imm $dmask), (as_i1imm $unorm),
525 (as_i1imm $glc), (as_i1imm $slc), 0, 0, (as_i1imm $lwe),
526 (as_i1imm $da)),
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000527 !if(opcode.BaseOpcode.HasD16, (opcode d16), (opcode)))
Changpeng Fangb28fe032016-09-01 17:54:54 +0000528 >;
529}
530
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000531multiclass ImageSampleDataPatterns<SDPatternOperator name, string opcode,
532 ValueType dt, bit d16> {
533 defm : ImageSamplePattern<name, !cast<MIMG>(opcode # _V1), dt, f32, d16>;
534 defm : ImageSamplePattern<name, !cast<MIMG>(opcode # _V2), dt, v2f32, d16>;
535 defm : ImageSamplePattern<name, !cast<MIMG>(opcode # _V4), dt, v4f32, d16>;
536 defm : ImageSamplePattern<name, !cast<MIMG>(opcode # _V8), dt, v8f32, d16>;
537 defm : ImageSamplePattern<name, !cast<MIMG>(opcode # _V16), dt, v16f32, d16>;
Changpeng Fang8236fe12016-11-14 18:33:18 +0000538}
539
Changpeng Fang4737e892018-01-18 22:08:53 +0000540// ImageSample patterns.
541multiclass ImageSamplePatterns<SDPatternOperator name, string opcode> {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000542 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V1), f32, 0>;
543 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V2), v2f32, 0>;
544 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V4), v4f32, 0>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000545
546 let SubtargetPredicate = HasUnpackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000547 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V1), f16, 1>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000548 } // End HasUnpackedD16VMem.
549
550 let SubtargetPredicate = HasPackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000551 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V1), f16, 1>;
552 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V1), v2f16, 1>;
553 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V2), v4f16, 1>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000554 } // End HasPackedD16VMem.
Changpeng Fangb28fe032016-09-01 17:54:54 +0000555}
556
Changpeng Fang4737e892018-01-18 22:08:53 +0000557// ImageSample alternative patterns for illegal vector half Types.
558multiclass ImageSampleAltPatterns<SDPatternOperator name, string opcode> {
559 let SubtargetPredicate = HasUnpackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000560 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V2), v2i32, 1>;
561 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V4), v4i32, 1>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000562 } // End HasUnpackedD16VMem.
Changpeng Fangb28fe032016-09-01 17:54:54 +0000563}
564
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +0000565// ImageGather4 patterns.
566multiclass ImageGather4Patterns<SDPatternOperator name, string opcode> {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000567 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V4), v4f32, 0>;
Matt Arsenault02dc7e12018-06-15 15:15:46 +0000568
569 let SubtargetPredicate = HasPackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000570 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V2), v4f16, 1>;
Matt Arsenault02dc7e12018-06-15 15:15:46 +0000571 } // End HasPackedD16VMem.
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +0000572}
573
574// ImageGather4 alternative patterns for illegal vector half Types.
575multiclass ImageGather4AltPatterns<SDPatternOperator name, string opcode> {
576 let SubtargetPredicate = HasUnpackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000577 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V4), v4i32, 1>;
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +0000578 } // End HasUnpackedD16VMem.
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +0000579}
580
Changpeng Fang4737e892018-01-18 22:08:53 +0000581// ImageLoad for amdgcn.
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000582multiclass ImageLoadPattern<SDPatternOperator name, MIMG opcode,
583 ValueType dt, ValueType vt, bit d16> {
Matt Arsenault90c75932017-10-03 00:06:41 +0000584 def : GCNPat <
Changpeng Fang8236fe12016-11-14 18:33:18 +0000585 (dt (name vt:$addr, v8i32:$rsrc, i32:$dmask, i1:$glc, i1:$slc, i1:$lwe,
Tom Stellardfac248c2016-10-12 16:35:29 +0000586 i1:$da)),
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000587 !con((opcode $addr, $rsrc, (as_i32imm $dmask), 1, (as_i1imm $glc),
588 (as_i1imm $slc), 0, 0, (as_i1imm $lwe), (as_i1imm $da)),
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000589 !if(opcode.BaseOpcode.HasD16, (opcode d16), (opcode)))
Tom Stellardfac248c2016-10-12 16:35:29 +0000590 >;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000591}
592
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000593multiclass ImageLoadDataPatterns<SDPatternOperator name, string opcode,
594 ValueType dt, bit d16> {
595 defm : ImageLoadPattern<name, !cast<MIMG>(opcode # _V1), dt, i32, d16>;
596 defm : ImageLoadPattern<name, !cast<MIMG>(opcode # _V2), dt, v2i32, d16>;
597 defm : ImageLoadPattern<name, !cast<MIMG>(opcode # _V4), dt, v4i32, d16>;
Tom Stellardfac248c2016-10-12 16:35:29 +0000598}
599
Changpeng Fang4737e892018-01-18 22:08:53 +0000600// ImageLoad patterns.
Changpeng Fang8236fe12016-11-14 18:33:18 +0000601// TODO: support v3f32.
602multiclass ImageLoadPatterns<SDPatternOperator name, string opcode> {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000603 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V1), f32, 0>;
604 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V2), v2f32, 0>;
605 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V4), v4f32, 0>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000606
607 let SubtargetPredicate = HasUnpackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000608 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V1), f16, 1>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000609 } // End HasUnpackedD16VMem.
610
611 let SubtargetPredicate = HasPackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000612 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V1), f16, 1>;
613 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V1), v2f16, 1>;
614 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V2), v4f16, 1>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000615 } // End HasPackedD16VMem.
Changpeng Fang8236fe12016-11-14 18:33:18 +0000616}
617
Changpeng Fang4737e892018-01-18 22:08:53 +0000618// ImageLoad alternative patterns for illegal vector half Types.
619multiclass ImageLoadAltPatterns<SDPatternOperator name, string opcode> {
620 let SubtargetPredicate = HasUnpackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000621 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V2), v2i32, 1>;
622 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V4), v4i32, 1>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000623 } // End HasUnPackedD16VMem.
Changpeng Fang4737e892018-01-18 22:08:53 +0000624}
625
626// ImageStore for amdgcn.
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000627multiclass ImageStorePattern<SDPatternOperator name, MIMG opcode,
628 ValueType dt, ValueType vt, bit d16> {
Matt Arsenault90c75932017-10-03 00:06:41 +0000629 def : GCNPat <
Changpeng Fang8236fe12016-11-14 18:33:18 +0000630 (name dt:$data, vt:$addr, v8i32:$rsrc, i32:$dmask, i1:$glc, i1:$slc,
Tom Stellardfac248c2016-10-12 16:35:29 +0000631 i1:$lwe, i1:$da),
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000632 !con((opcode $data, $addr, $rsrc, (as_i32imm $dmask), 1, (as_i1imm $glc),
633 (as_i1imm $slc), 0, 0, (as_i1imm $lwe), (as_i1imm $da)),
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000634 !if(opcode.BaseOpcode.HasD16, (opcode d16), (opcode)))
Tom Stellardfac248c2016-10-12 16:35:29 +0000635 >;
636}
Changpeng Fangb28fe032016-09-01 17:54:54 +0000637
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000638multiclass ImageStoreDataPatterns<SDPatternOperator name, string opcode,
639 ValueType dt, bit d16> {
640 defm : ImageStorePattern<name, !cast<MIMG>(opcode # _V1), dt, i32, d16>;
641 defm : ImageStorePattern<name, !cast<MIMG>(opcode # _V2), dt, v2i32, d16>;
642 defm : ImageStorePattern<name, !cast<MIMG>(opcode # _V4), dt, v4i32, d16>;
Changpeng Fang8236fe12016-11-14 18:33:18 +0000643}
644
Changpeng Fang4737e892018-01-18 22:08:53 +0000645// ImageStore patterns.
Changpeng Fang8236fe12016-11-14 18:33:18 +0000646// TODO: support v3f32.
Changpeng Fangb28fe032016-09-01 17:54:54 +0000647multiclass ImageStorePatterns<SDPatternOperator name, string opcode> {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000648 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V1), f32, 0>;
649 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V2), v2f32, 0>;
650 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V4), v4f32, 0>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000651
652 let SubtargetPredicate = HasUnpackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000653 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V1), f16, 1>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000654 } // End HasUnpackedD16VMem.
655
656 let SubtargetPredicate = HasPackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000657 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V1), f16, 1>;
658 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V1), v2f16, 1>;
659 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V2), v4f16, 1>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000660 } // End HasPackedD16VMem.
Changpeng Fangb28fe032016-09-01 17:54:54 +0000661}
662
Changpeng Fang4737e892018-01-18 22:08:53 +0000663// ImageStore alternative patterns.
664multiclass ImageStoreAltPatterns<SDPatternOperator name, string opcode> {
665 let SubtargetPredicate = HasUnpackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000666 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V2), v2i32, 1>;
667 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V4), v4i32, 1>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000668 } // End HasUnpackedD16VMem.
669
670 let SubtargetPredicate = HasPackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000671 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V1), i32, 1>;
672 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V2), v2i32, 1>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000673 } // End HasPackedD16VMem.
674}
675
676// ImageAtomic for amdgcn.
Matt Arsenault90c75932017-10-03 00:06:41 +0000677class ImageAtomicPattern<SDPatternOperator name, MIMG opcode, ValueType vt> : GCNPat <
Changpeng Fangb28fe032016-09-01 17:54:54 +0000678 (name i32:$vdata, vt:$addr, v8i32:$rsrc, imm:$r128, imm:$da, imm:$slc),
679 (opcode $vdata, $addr, $rsrc, 1, 1, 1, (as_i1imm $slc), (as_i1imm $r128), 0, 0, (as_i1imm $da))
680>;
681
Changpeng Fang4737e892018-01-18 22:08:53 +0000682// ImageAtomic patterns.
Changpeng Fangb28fe032016-09-01 17:54:54 +0000683multiclass ImageAtomicPatterns<SDPatternOperator name, string opcode> {
Dmitry Preobrazhensky0b4eb1e2018-01-26 15:43:29 +0000684 def : ImageAtomicPattern<name, !cast<MIMG>(opcode # _V1_V1), i32>;
685 def : ImageAtomicPattern<name, !cast<MIMG>(opcode # _V1_V2), v2i32>;
686 def : ImageAtomicPattern<name, !cast<MIMG>(opcode # _V1_V4), v4i32>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000687}
688
Changpeng Fang4737e892018-01-18 22:08:53 +0000689// ImageAtomicCmpSwap for amdgcn.
Matt Arsenault90c75932017-10-03 00:06:41 +0000690class ImageAtomicCmpSwapPattern<MIMG opcode, ValueType vt> : GCNPat <
Changpeng Fangb28fe032016-09-01 17:54:54 +0000691 (int_amdgcn_image_atomic_cmpswap i32:$vsrc, i32:$vcmp, vt:$addr, v8i32:$rsrc,
692 imm:$r128, imm:$da, imm:$slc),
693 (EXTRACT_SUBREG
694 (opcode (REG_SEQUENCE VReg_64, $vsrc, sub0, $vcmp, sub1),
695 $addr, $rsrc, 3, 1, 1, (as_i1imm $slc), (as_i1imm $r128), 0, 0, (as_i1imm $da)),
696 sub0)
697>;
698
Changpeng Fangb28fe032016-09-01 17:54:54 +0000699// ======= amdgcn Image Intrinsics ==============
700
Changpeng Fang4737e892018-01-18 22:08:53 +0000701// Image load.
Changpeng Fangb28fe032016-09-01 17:54:54 +0000702defm : ImageLoadPatterns<int_amdgcn_image_load, "IMAGE_LOAD">;
703defm : ImageLoadPatterns<int_amdgcn_image_load_mip, "IMAGE_LOAD_MIP">;
Changpeng Fang8236fe12016-11-14 18:33:18 +0000704defm : ImageLoadPatterns<int_amdgcn_image_getresinfo, "IMAGE_GET_RESINFO">;
Changpeng Fang4737e892018-01-18 22:08:53 +0000705defm : ImageLoadAltPatterns<SIImage_load, "IMAGE_LOAD">;
706defm : ImageLoadAltPatterns<SIImage_load_mip, "IMAGE_LOAD_MIP">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000707
Changpeng Fang4737e892018-01-18 22:08:53 +0000708// Image store.
Matt Arsenault1349a042018-05-22 06:32:10 +0000709defm : ImageStorePatterns<int_amdgcn_image_store, "IMAGE_STORE">;
710defm : ImageStorePatterns<int_amdgcn_image_store_mip, "IMAGE_STORE_MIP">;
Changpeng Fang4737e892018-01-18 22:08:53 +0000711defm : ImageStoreAltPatterns<SIImage_store, "IMAGE_STORE">;
712defm : ImageStoreAltPatterns<SIImage_store_mip, "IMAGE_STORE_MIP">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000713
Changpeng Fang4737e892018-01-18 22:08:53 +0000714// Basic sample.
715defm : ImageSamplePatterns<int_amdgcn_image_sample, "IMAGE_SAMPLE">;
716defm : ImageSamplePatterns<int_amdgcn_image_sample_cl, "IMAGE_SAMPLE_CL">;
717defm : ImageSamplePatterns<int_amdgcn_image_sample_d, "IMAGE_SAMPLE_D">;
718defm : ImageSamplePatterns<int_amdgcn_image_sample_d_cl, "IMAGE_SAMPLE_D_CL">;
719defm : ImageSamplePatterns<int_amdgcn_image_sample_l, "IMAGE_SAMPLE_L">;
720defm : ImageSamplePatterns<int_amdgcn_image_sample_b, "IMAGE_SAMPLE_B">;
721defm : ImageSamplePatterns<int_amdgcn_image_sample_b_cl, "IMAGE_SAMPLE_B_CL">;
722defm : ImageSamplePatterns<int_amdgcn_image_sample_lz, "IMAGE_SAMPLE_LZ">;
723defm : ImageSamplePatterns<int_amdgcn_image_sample_cd, "IMAGE_SAMPLE_CD">;
724defm : ImageSamplePatterns<int_amdgcn_image_sample_cd_cl, "IMAGE_SAMPLE_CD_CL">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000725
Changpeng Fang4737e892018-01-18 22:08:53 +0000726// Sample with comparison.
727defm : ImageSamplePatterns<int_amdgcn_image_sample_c, "IMAGE_SAMPLE_C">;
728defm : ImageSamplePatterns<int_amdgcn_image_sample_c_cl, "IMAGE_SAMPLE_C_CL">;
729defm : ImageSamplePatterns<int_amdgcn_image_sample_c_d, "IMAGE_SAMPLE_C_D">;
730defm : ImageSamplePatterns<int_amdgcn_image_sample_c_d_cl, "IMAGE_SAMPLE_C_D_CL">;
731defm : ImageSamplePatterns<int_amdgcn_image_sample_c_l, "IMAGE_SAMPLE_C_L">;
732defm : ImageSamplePatterns<int_amdgcn_image_sample_c_b, "IMAGE_SAMPLE_C_B">;
733defm : ImageSamplePatterns<int_amdgcn_image_sample_c_b_cl, "IMAGE_SAMPLE_C_B_CL">;
734defm : ImageSamplePatterns<int_amdgcn_image_sample_c_lz, "IMAGE_SAMPLE_C_LZ">;
735defm : ImageSamplePatterns<int_amdgcn_image_sample_c_cd, "IMAGE_SAMPLE_C_CD">;
736defm : ImageSamplePatterns<int_amdgcn_image_sample_c_cd_cl, "IMAGE_SAMPLE_C_CD_CL">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000737
Changpeng Fang4737e892018-01-18 22:08:53 +0000738// Sample with offsets.
739defm : ImageSamplePatterns<int_amdgcn_image_sample_o, "IMAGE_SAMPLE_O">;
740defm : ImageSamplePatterns<int_amdgcn_image_sample_cl_o, "IMAGE_SAMPLE_CL_O">;
741defm : ImageSamplePatterns<int_amdgcn_image_sample_d_o, "IMAGE_SAMPLE_D_O">;
742defm : ImageSamplePatterns<int_amdgcn_image_sample_d_cl_o, "IMAGE_SAMPLE_D_CL_O">;
743defm : ImageSamplePatterns<int_amdgcn_image_sample_l_o, "IMAGE_SAMPLE_L_O">;
744defm : ImageSamplePatterns<int_amdgcn_image_sample_b_o, "IMAGE_SAMPLE_B_O">;
745defm : ImageSamplePatterns<int_amdgcn_image_sample_b_cl_o, "IMAGE_SAMPLE_B_CL_O">;
746defm : ImageSamplePatterns<int_amdgcn_image_sample_lz_o, "IMAGE_SAMPLE_LZ_O">;
747defm : ImageSamplePatterns<int_amdgcn_image_sample_cd_o, "IMAGE_SAMPLE_CD_O">;
748defm : ImageSamplePatterns<int_amdgcn_image_sample_cd_cl_o, "IMAGE_SAMPLE_CD_CL_O">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000749
Changpeng Fang4737e892018-01-18 22:08:53 +0000750// Sample with comparison and offsets.
751defm : ImageSamplePatterns<int_amdgcn_image_sample_c_o, "IMAGE_SAMPLE_C_O">;
752defm : ImageSamplePatterns<int_amdgcn_image_sample_c_cl_o, "IMAGE_SAMPLE_C_CL_O">;
753defm : ImageSamplePatterns<int_amdgcn_image_sample_c_d_o, "IMAGE_SAMPLE_C_D_O">;
754defm : ImageSamplePatterns<int_amdgcn_image_sample_c_d_cl_o, "IMAGE_SAMPLE_C_D_CL_O">;
755defm : ImageSamplePatterns<int_amdgcn_image_sample_c_l_o, "IMAGE_SAMPLE_C_L_O">;
756defm : ImageSamplePatterns<int_amdgcn_image_sample_c_b_o, "IMAGE_SAMPLE_C_B_O">;
757defm : ImageSamplePatterns<int_amdgcn_image_sample_c_b_cl_o, "IMAGE_SAMPLE_C_B_CL_O">;
758defm : ImageSamplePatterns<int_amdgcn_image_sample_c_lz_o, "IMAGE_SAMPLE_C_LZ_O">;
759defm : ImageSamplePatterns<int_amdgcn_image_sample_c_cd_o, "IMAGE_SAMPLE_C_CD_O">;
760defm : ImageSamplePatterns<int_amdgcn_image_sample_c_cd_cl_o, "IMAGE_SAMPLE_C_CD_CL_O">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000761
Changpeng Fang4737e892018-01-18 22:08:53 +0000762// Basic gather4.
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +0000763defm : ImageGather4Patterns<int_amdgcn_image_gather4, "IMAGE_GATHER4">;
764defm : ImageGather4Patterns<int_amdgcn_image_gather4_cl, "IMAGE_GATHER4_CL">;
765defm : ImageGather4Patterns<int_amdgcn_image_gather4_l, "IMAGE_GATHER4_L">;
766defm : ImageGather4Patterns<int_amdgcn_image_gather4_b, "IMAGE_GATHER4_B">;
767defm : ImageGather4Patterns<int_amdgcn_image_gather4_b_cl, "IMAGE_GATHER4_B_CL">;
768defm : ImageGather4Patterns<int_amdgcn_image_gather4_lz, "IMAGE_GATHER4_LZ">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000769
Changpeng Fang4737e892018-01-18 22:08:53 +0000770// Gather4 with comparison.
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +0000771defm : ImageGather4Patterns<int_amdgcn_image_gather4_c, "IMAGE_GATHER4_C">;
772defm : ImageGather4Patterns<int_amdgcn_image_gather4_c_cl, "IMAGE_GATHER4_C_CL">;
773defm : ImageGather4Patterns<int_amdgcn_image_gather4_c_l, "IMAGE_GATHER4_C_L">;
774defm : ImageGather4Patterns<int_amdgcn_image_gather4_c_b, "IMAGE_GATHER4_C_B">;
775defm : ImageGather4Patterns<int_amdgcn_image_gather4_c_b_cl, "IMAGE_GATHER4_C_B_CL">;
776defm : ImageGather4Patterns<int_amdgcn_image_gather4_c_lz, "IMAGE_GATHER4_C_LZ">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000777
Changpeng Fang4737e892018-01-18 22:08:53 +0000778// Gather4 with offsets.
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +0000779defm : ImageGather4Patterns<int_amdgcn_image_gather4_o, "IMAGE_GATHER4_O">;
780defm : ImageGather4Patterns<int_amdgcn_image_gather4_cl_o, "IMAGE_GATHER4_CL_O">;
781defm : ImageGather4Patterns<int_amdgcn_image_gather4_l_o, "IMAGE_GATHER4_L_O">;
782defm : ImageGather4Patterns<int_amdgcn_image_gather4_b_o, "IMAGE_GATHER4_B_O">;
783defm : ImageGather4Patterns<int_amdgcn_image_gather4_b_cl_o, "IMAGE_GATHER4_B_CL_O">;
784defm : ImageGather4Patterns<int_amdgcn_image_gather4_lz_o, "IMAGE_GATHER4_LZ_O">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000785
Changpeng Fang4737e892018-01-18 22:08:53 +0000786// Gather4 with comparison and offsets.
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +0000787defm : ImageGather4Patterns<int_amdgcn_image_gather4_c_o, "IMAGE_GATHER4_C_O">;
788defm : ImageGather4Patterns<int_amdgcn_image_gather4_c_cl_o, "IMAGE_GATHER4_C_CL_O">;
789defm : ImageGather4Patterns<int_amdgcn_image_gather4_c_l_o, "IMAGE_GATHER4_C_L_O">;
790defm : ImageGather4Patterns<int_amdgcn_image_gather4_c_b_o, "IMAGE_GATHER4_C_B_O">;
791defm : ImageGather4Patterns<int_amdgcn_image_gather4_c_b_cl_o, "IMAGE_GATHER4_C_B_CL_O">;
792defm : ImageGather4Patterns<int_amdgcn_image_gather4_c_lz_o, "IMAGE_GATHER4_C_LZ_O">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000793
Changpeng Fang4737e892018-01-18 22:08:53 +0000794// Basic sample alternative.
795defm : ImageSampleAltPatterns<SIImage_sample, "IMAGE_SAMPLE">;
796defm : ImageSampleAltPatterns<SIImage_sample_cl, "IMAGE_SAMPLE_CL">;
797defm : ImageSampleAltPatterns<SIImage_sample_d, "IMAGE_SAMPLE_D">;
798defm : ImageSampleAltPatterns<SIImage_sample_d_cl, "IMAGE_SAMPLE_D_CL">;
799defm : ImageSampleAltPatterns<SIImage_sample_l, "IMAGE_SAMPLE_L">;
800defm : ImageSampleAltPatterns<SIImage_sample_b, "IMAGE_SAMPLE_B">;
801defm : ImageSampleAltPatterns<SIImage_sample_b_cl, "IMAGE_SAMPLE_B_CL">;
802defm : ImageSampleAltPatterns<SIImage_sample_lz, "IMAGE_SAMPLE_LZ">;
803defm : ImageSampleAltPatterns<SIImage_sample_cd, "IMAGE_SAMPLE_CD">;
804defm : ImageSampleAltPatterns<SIImage_sample_cd_cl, "IMAGE_SAMPLE_CD_CL">;
805
806// Sample with comparison alternative.
807defm : ImageSampleAltPatterns<SIImage_sample_c, "IMAGE_SAMPLE_C">;
808defm : ImageSampleAltPatterns<SIImage_sample_c_cl, "IMAGE_SAMPLE_C_CL">;
809defm : ImageSampleAltPatterns<SIImage_sample_c_d, "IMAGE_SAMPLE_C_D">;
810defm : ImageSampleAltPatterns<SIImage_sample_c_d_cl, "IMAGE_SAMPLE_C_D_CL">;
811defm : ImageSampleAltPatterns<SIImage_sample_c_l, "IMAGE_SAMPLE_C_L">;
812defm : ImageSampleAltPatterns<SIImage_sample_c_b, "IMAGE_SAMPLE_C_B">;
813defm : ImageSampleAltPatterns<SIImage_sample_c_b_cl, "IMAGE_SAMPLE_C_B_CL">;
814defm : ImageSampleAltPatterns<SIImage_sample_c_lz, "IMAGE_SAMPLE_C_LZ">;
815defm : ImageSampleAltPatterns<SIImage_sample_c_cd, "IMAGE_SAMPLE_C_CD">;
816defm : ImageSampleAltPatterns<SIImage_sample_c_cd_cl, "IMAGE_SAMPLE_C_CD_CL">;
817
818// Sample with offsets alternative.
819defm : ImageSampleAltPatterns<SIImage_sample_o, "IMAGE_SAMPLE_O">;
820defm : ImageSampleAltPatterns<SIImage_sample_cl_o, "IMAGE_SAMPLE_CL_O">;
821defm : ImageSampleAltPatterns<SIImage_sample_d_o, "IMAGE_SAMPLE_D_O">;
822defm : ImageSampleAltPatterns<SIImage_sample_d_cl_o, "IMAGE_SAMPLE_D_CL_O">;
823defm : ImageSampleAltPatterns<SIImage_sample_l_o, "IMAGE_SAMPLE_L_O">;
824defm : ImageSampleAltPatterns<SIImage_sample_b_o, "IMAGE_SAMPLE_B_O">;
825defm : ImageSampleAltPatterns<SIImage_sample_b_cl_o, "IMAGE_SAMPLE_B_CL_O">;
826defm : ImageSampleAltPatterns<SIImage_sample_lz_o, "IMAGE_SAMPLE_LZ_O">;
827defm : ImageSampleAltPatterns<SIImage_sample_cd_o, "IMAGE_SAMPLE_CD_O">;
828defm : ImageSampleAltPatterns<SIImage_sample_cd_cl_o, "IMAGE_SAMPLE_CD_CL_O">;
829
830// Sample with comparison and offsets alternative.
831defm : ImageSampleAltPatterns<SIImage_sample_c_o, "IMAGE_SAMPLE_C_O">;
832defm : ImageSampleAltPatterns<SIImage_sample_c_cl_o, "IMAGE_SAMPLE_C_CL_O">;
833defm : ImageSampleAltPatterns<SIImage_sample_c_d_o, "IMAGE_SAMPLE_C_D_O">;
834defm : ImageSampleAltPatterns<SIImage_sample_c_d_cl_o, "IMAGE_SAMPLE_C_D_CL_O">;
835defm : ImageSampleAltPatterns<SIImage_sample_c_l_o, "IMAGE_SAMPLE_C_L_O">;
836defm : ImageSampleAltPatterns<SIImage_sample_c_b_o, "IMAGE_SAMPLE_C_B_O">;
837defm : ImageSampleAltPatterns<SIImage_sample_c_b_cl_o, "IMAGE_SAMPLE_C_B_CL_O">;
838defm : ImageSampleAltPatterns<SIImage_sample_c_lz_o, "IMAGE_SAMPLE_C_LZ_O">;
839defm : ImageSampleAltPatterns<SIImage_sample_c_cd_o, "IMAGE_SAMPLE_C_CD_O">;
840defm : ImageSampleAltPatterns<SIImage_sample_c_cd_cl_o, "IMAGE_SAMPLE_C_CD_CL_O">;
841
842// Basic gather4 alternative.
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +0000843defm : ImageGather4AltPatterns<SIImage_gather4, "IMAGE_GATHER4">;
844defm : ImageGather4AltPatterns<SIImage_gather4_cl, "IMAGE_GATHER4_CL">;
845defm : ImageGather4AltPatterns<SIImage_gather4_l, "IMAGE_GATHER4_L">;
846defm : ImageGather4AltPatterns<SIImage_gather4_b, "IMAGE_GATHER4_B">;
847defm : ImageGather4AltPatterns<SIImage_gather4_b_cl, "IMAGE_GATHER4_B_CL">;
848defm : ImageGather4AltPatterns<SIImage_gather4_lz, "IMAGE_GATHER4_LZ">;
Changpeng Fang4737e892018-01-18 22:08:53 +0000849
850// Gather4 with comparison alternative.
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +0000851defm : ImageGather4AltPatterns<SIImage_gather4_c, "IMAGE_GATHER4_C">;
852defm : ImageGather4AltPatterns<SIImage_gather4_c_cl, "IMAGE_GATHER4_C_CL">;
853defm : ImageGather4AltPatterns<SIImage_gather4_c_l, "IMAGE_GATHER4_C_L">;
854defm : ImageGather4AltPatterns<SIImage_gather4_c_b, "IMAGE_GATHER4_C_B">;
855defm : ImageGather4AltPatterns<SIImage_gather4_c_b_cl, "IMAGE_GATHER4_C_B_CL">;
856defm : ImageGather4AltPatterns<SIImage_gather4_c_lz, "IMAGE_GATHER4_C_LZ">;
Changpeng Fang4737e892018-01-18 22:08:53 +0000857
858// Gather4 with offsets alternative.
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +0000859defm : ImageGather4AltPatterns<SIImage_gather4_o, "IMAGE_GATHER4_O">;
860defm : ImageGather4AltPatterns<SIImage_gather4_cl_o, "IMAGE_GATHER4_CL_O">;
861defm : ImageGather4AltPatterns<SIImage_gather4_l_o, "IMAGE_GATHER4_L_O">;
862defm : ImageGather4AltPatterns<SIImage_gather4_b_o, "IMAGE_GATHER4_B_O">;
863defm : ImageGather4AltPatterns<SIImage_gather4_b_cl_o, "IMAGE_GATHER4_B_CL_O">;
864defm : ImageGather4AltPatterns<SIImage_gather4_lz_o, "IMAGE_GATHER4_LZ_O">;
Changpeng Fang4737e892018-01-18 22:08:53 +0000865
866// Gather4 with comparison and offsets alternative.
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +0000867defm : ImageGather4AltPatterns<SIImage_gather4_c_o, "IMAGE_GATHER4_C_O">;
868defm : ImageGather4AltPatterns<SIImage_gather4_c_cl_o, "IMAGE_GATHER4_C_CL_O">;
869defm : ImageGather4AltPatterns<SIImage_gather4_c_l_o, "IMAGE_GATHER4_C_L_O">;
870defm : ImageGather4AltPatterns<SIImage_gather4_c_b_o, "IMAGE_GATHER4_C_B_O">;
871defm : ImageGather4AltPatterns<SIImage_gather4_c_b_cl_o, "IMAGE_GATHER4_C_B_CL_O">;
872defm : ImageGather4AltPatterns<SIImage_gather4_c_lz_o, "IMAGE_GATHER4_C_LZ_O">;
Changpeng Fang4737e892018-01-18 22:08:53 +0000873
874defm : ImageSamplePatterns<int_amdgcn_image_getlod, "IMAGE_GET_LOD">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000875
876// Image atomics
877defm : ImageAtomicPatterns<int_amdgcn_image_atomic_swap, "IMAGE_ATOMIC_SWAP">;
Dmitry Preobrazhensky0b4eb1e2018-01-26 15:43:29 +0000878def : ImageAtomicCmpSwapPattern<IMAGE_ATOMIC_CMPSWAP_V1_V1, i32>;
879def : ImageAtomicCmpSwapPattern<IMAGE_ATOMIC_CMPSWAP_V1_V2, v2i32>;
880def : ImageAtomicCmpSwapPattern<IMAGE_ATOMIC_CMPSWAP_V1_V4, v4i32>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000881defm : ImageAtomicPatterns<int_amdgcn_image_atomic_add, "IMAGE_ATOMIC_ADD">;
882defm : ImageAtomicPatterns<int_amdgcn_image_atomic_sub, "IMAGE_ATOMIC_SUB">;
883defm : ImageAtomicPatterns<int_amdgcn_image_atomic_smin, "IMAGE_ATOMIC_SMIN">;
884defm : ImageAtomicPatterns<int_amdgcn_image_atomic_umin, "IMAGE_ATOMIC_UMIN">;
885defm : ImageAtomicPatterns<int_amdgcn_image_atomic_smax, "IMAGE_ATOMIC_SMAX">;
886defm : ImageAtomicPatterns<int_amdgcn_image_atomic_umax, "IMAGE_ATOMIC_UMAX">;
887defm : ImageAtomicPatterns<int_amdgcn_image_atomic_and, "IMAGE_ATOMIC_AND">;
888defm : ImageAtomicPatterns<int_amdgcn_image_atomic_or, "IMAGE_ATOMIC_OR">;
889defm : ImageAtomicPatterns<int_amdgcn_image_atomic_xor, "IMAGE_ATOMIC_XOR">;
890defm : ImageAtomicPatterns<int_amdgcn_image_atomic_inc, "IMAGE_ATOMIC_INC">;
891defm : ImageAtomicPatterns<int_amdgcn_image_atomic_dec, "IMAGE_ATOMIC_DEC">;