blob: c584fe24b71c478c4eb10564e0797b4af365ac8e [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);
30 bits<8> NumExtraArgs = 0;
31 bit Gradients = 0;
32 bit Coordinates = 1;
33 bit LodOrClampOrMip = 0;
34 bit HasD16 = 0;
Dmitry Preobrazhensky0b4eb1e2018-01-26 15:43:29 +000035}
36
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +000037def MIMGBaseOpcode : GenericEnum {
38 let FilterClass = "MIMGBaseOpcode";
39}
40
41def MIMGBaseOpcodesTable : GenericTable {
42 let FilterClass = "MIMGBaseOpcode";
43 let CppTypeName = "MIMGBaseOpcodeInfo";
44 let Fields = ["BaseOpcode", "NumExtraArgs", "Gradients", "Coordinates",
45 "LodOrClampOrMip", "HasD16"];
46 GenericEnum TypeOf_BaseOpcode = MIMGBaseOpcode;
47
48 let PrimaryKey = ["BaseOpcode"];
49 let PrimaryKeyName = "getMIMGBaseOpcodeInfo";
Nicolai Haehnlef2674312018-06-21 13:36:01 +000050}
51
Changpeng Fangb28fe032016-09-01 17:54:54 +000052class mimg <bits<7> si, bits<7> vi = si> {
53 field bits<7> SI = si;
54 field bits<7> VI = vi;
55}
56
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +000057class MIMG <dag outs, string dns = "">
58 : InstSI <outs, (ins), "", []> {
59
60 let VM_CNT = 1;
61 let EXP_CNT = 1;
62 let MIMG = 1;
63 let Uses = [EXEC];
Changpeng Fangb28fe032016-09-01 17:54:54 +000064 let mayLoad = 1;
65 let mayStore = 0;
66 let hasPostISelHook = 1;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +000067 let SchedRW = [WriteVMEM];
68 let UseNamedOperandTable = 1;
69 let hasSideEffects = 0; // XXX ????
70
71 let SubtargetPredicate = isGCN;
Changpeng Fangb28fe032016-09-01 17:54:54 +000072 let DecoderNamespace = dns;
73 let isAsmParserOnly = !if(!eq(dns,""), 1, 0);
74 let AsmMatchConverter = "cvtMIMG";
Tom Stellard244891d2016-12-20 15:52:17 +000075 let usesCustomInserter = 1;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +000076
77 Instruction Opcode = !cast<Instruction>(NAME);
78 MIMGBaseOpcode BaseOpcode;
79 MIMGEncoding MIMGEncoding = MIMGEncGfx6;
80 bits<8> VDataDwords;
81 bits<8> VAddrDwords;
82}
83
84def MIMGInfoTable : GenericTable {
85 let FilterClass = "MIMG";
86 let CppTypeName = "MIMGInfo";
87 let Fields = ["Opcode", "BaseOpcode", "MIMGEncoding", "VDataDwords", "VAddrDwords"];
88 GenericEnum TypeOf_BaseOpcode = MIMGBaseOpcode;
89 GenericEnum TypeOf_MIMGEncoding = MIMGEncoding;
90
91 let PrimaryKey = ["BaseOpcode", "MIMGEncoding", "VDataDwords", "VAddrDwords"];
92 let PrimaryKeyName = "getMIMGOpcodeHelper";
93}
94
95def getMIMGInfo : SearchIndex {
96 let Table = MIMGInfoTable;
97 let Key = ["Opcode"];
Changpeng Fangb28fe032016-09-01 17:54:54 +000098}
99
100class MIMG_NoSampler_Helper <bits<7> op, string asm,
101 RegisterClass dst_rc,
102 RegisterClass addr_rc,
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000103 string dns="">
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000104 : MIMG <(outs dst_rc:$vdata), dns>,
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000105 MIMGe<op> {
Changpeng Fangb28fe032016-09-01 17:54:54 +0000106 let ssamp = 0;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000107 let d16 = !if(BaseOpcode.HasD16, ?, 0);
Changpeng Fang4737e892018-01-18 22:08:53 +0000108
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000109 let InOperandList = !con((ins addr_rc:$vaddr, SReg_256:$srsrc,
110 DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc,
111 R128:$r128, TFE:$tfe, LWE:$lwe, DA:$da),
112 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
113 let AsmString = asm#" $vdata, $vaddr, $srsrc$dmask$unorm$glc$slc$r128$tfe$lwe$da"
114 #!if(BaseOpcode.HasD16, "$d16", "");
Changpeng Fangb28fe032016-09-01 17:54:54 +0000115}
116
117multiclass MIMG_NoSampler_Src_Helper <bits<7> op, string asm,
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000118 RegisterClass dst_rc,
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000119 bit enableDisasm> {
120 let VAddrDwords = 1 in
121 def NAME # _V1 : MIMG_NoSampler_Helper <op, asm, dst_rc, VGPR_32,
122 !if(enableDisasm, "AMDGPU", "")>;
123 let VAddrDwords = 2 in
124 def NAME # _V2 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_64>;
125 let VAddrDwords = 3 in
126 def NAME # _V3 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_96>;
127 let VAddrDwords = 4 in
128 def NAME # _V4 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_128>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000129}
130
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000131multiclass MIMG_NoSampler <bits<7> op, string asm, bit has_d16, bit mip = 0,
132 bit isResInfo = 0> {
133 def "" : MIMGBaseOpcode {
134 let Coordinates = !if(isResInfo, 0, 1);
135 let LodOrClampOrMip = mip;
136 let HasD16 = has_d16;
137 }
138
139 let BaseOpcode = !cast<MIMGBaseOpcode>(NAME),
140 mayLoad = !if(isResInfo, 0, 1) in {
141 let VDataDwords = 1 in
142 defm _V1 : MIMG_NoSampler_Src_Helper <op, asm, VGPR_32, 1>;
143 let VDataDwords = 2 in
144 defm _V2 : MIMG_NoSampler_Src_Helper <op, asm, VReg_64, 0>;
145 let VDataDwords = 3 in
146 defm _V3 : MIMG_NoSampler_Src_Helper <op, asm, VReg_96, 0>;
147 let VDataDwords = 4 in
148 defm _V4 : MIMG_NoSampler_Src_Helper <op, asm, VReg_128, 0>;
149 }
Dmitry Preobrazhensky2456ac62018-03-28 15:44:16 +0000150}
151
Changpeng Fangb28fe032016-09-01 17:54:54 +0000152class MIMG_Store_Helper <bits<7> op, string asm,
153 RegisterClass data_rc,
Matt Arsenaultcad7fa82017-12-13 21:07:51 +0000154 RegisterClass addr_rc,
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000155 string dns = "">
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000156 : MIMG <(outs), dns>,
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000157 MIMGe<op> {
Changpeng Fangb28fe032016-09-01 17:54:54 +0000158 let ssamp = 0;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000159 let d16 = !if(BaseOpcode.HasD16, ?, 0);
160
Matt Arsenaultd94b63d2017-12-29 17:18:18 +0000161 let mayLoad = 0;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000162 let mayStore = 1;
Matt Arsenaultd94b63d2017-12-29 17:18:18 +0000163 let hasSideEffects = 0;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000164 let hasPostISelHook = 0;
165 let DisableWQM = 1;
Changpeng Fang4737e892018-01-18 22:08:53 +0000166
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000167 let InOperandList = !con((ins data_rc:$vdata, addr_rc:$vaddr, SReg_256:$srsrc,
168 DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc,
169 R128:$r128, TFE:$tfe, LWE:$lwe, DA:$da),
170 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
171 let AsmString = asm#" $vdata, $vaddr, $srsrc$dmask$unorm$glc$slc$r128$tfe$lwe$da"
172 #!if(BaseOpcode.HasD16, "$d16", "");
Changpeng Fangb28fe032016-09-01 17:54:54 +0000173}
174
175multiclass MIMG_Store_Addr_Helper <bits<7> op, string asm,
176 RegisterClass data_rc,
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000177 bit enableDisasm> {
178 let VAddrDwords = 1 in
179 def NAME # _V1 : MIMG_Store_Helper <op, asm, data_rc, VGPR_32,
180 !if(enableDisasm, "AMDGPU", "")>;
181 let VAddrDwords = 2 in
182 def NAME # _V2 : MIMG_Store_Helper <op, asm, data_rc, VReg_64>;
183 let VAddrDwords = 3 in
184 def NAME # _V3 : MIMG_Store_Helper <op, asm, data_rc, VReg_96>;
185 let VAddrDwords = 4 in
186 def NAME # _V4 : MIMG_Store_Helper <op, asm, data_rc, VReg_128>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000187}
188
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000189multiclass MIMG_Store <bits<7> op, string asm, bit has_d16, bit mip = 0> {
190 def "" : MIMGBaseOpcode {
191 let LodOrClampOrMip = mip;
192 let HasD16 = has_d16;
193 }
194
195 let BaseOpcode = !cast<MIMGBaseOpcode>(NAME) in {
196 let VDataDwords = 1 in
197 defm _V1 : MIMG_Store_Addr_Helper <op, asm, VGPR_32, 1>;
198 let VDataDwords = 2 in
199 defm _V2 : MIMG_Store_Addr_Helper <op, asm, VReg_64, 0>;
200 let VDataDwords = 3 in
201 defm _V3 : MIMG_Store_Addr_Helper <op, asm, VReg_96, 0>;
202 let VDataDwords = 4 in
203 defm _V4 : MIMG_Store_Addr_Helper <op, asm, VReg_128, 0>;
204 }
Dmitry Preobrazhensky2456ac62018-03-28 15:44:16 +0000205}
206
Changpeng Fangb28fe032016-09-01 17:54:54 +0000207class MIMG_Atomic_Helper <string asm, RegisterClass data_rc,
Dmitry Preobrazhensky6cb42e72018-01-26 14:07:38 +0000208 RegisterClass addr_rc, string dns="",
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000209 bit enableDasm = 0>
210 : MIMG <(outs data_rc:$vdst), !if(enableDasm, dns, "")> {
Matt Arsenaultd94b63d2017-12-29 17:18:18 +0000211 let mayLoad = 1;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000212 let mayStore = 1;
Matt Arsenaultd94b63d2017-12-29 17:18:18 +0000213 let hasSideEffects = 1; // FIXME: Remove this
Changpeng Fangb28fe032016-09-01 17:54:54 +0000214 let hasPostISelHook = 0;
215 let DisableWQM = 1;
216 let Constraints = "$vdst = $vdata";
217 let AsmMatchConverter = "cvtMIMGAtomic";
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000218
219 let InOperandList = (ins data_rc:$vdata, addr_rc:$vaddr, SReg_256:$srsrc,
220 DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc,
221 R128:$r128, TFE:$tfe, LWE:$lwe, DA:$da);
222 let AsmString = asm#" $vdst, $vaddr, $srsrc$dmask$unorm$glc$slc$r128$tfe$lwe$da";
Changpeng Fangb28fe032016-09-01 17:54:54 +0000223}
224
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000225multiclass MIMG_Atomic_Helper_m <mimg op, string asm, RegisterClass data_rc,
226 RegisterClass addr_rc, bit enableDasm = 0> {
227 let isPseudo = 1, isCodeGenOnly = 1, MIMGEncoding = MIMGEncPseudo in {
Changpeng Fangb28fe032016-09-01 17:54:54 +0000228 def "" : MIMG_Atomic_Helper<asm, data_rc, addr_rc>,
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000229 SIMCInstr<NAME, SIEncodingFamily.NONE>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000230 }
231
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000232 let ssamp = 0, d16 = 0, isCodeGenOnly = 0 in {
233 def _si : MIMG_Atomic_Helper<asm, data_rc, addr_rc, "SICI", enableDasm>,
234 SIMCInstr<NAME, SIEncodingFamily.SI>,
235 MIMGe<op.SI> {
236 let AssemblerPredicates = [isSICI];
237 let DisableDecoder = DisableSIDecoder;
238 }
Changpeng Fangb28fe032016-09-01 17:54:54 +0000239
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000240 def _vi : MIMG_Atomic_Helper<asm, data_rc, addr_rc, "VI", enableDasm>,
241 SIMCInstr<NAME, SIEncodingFamily.VI>,
242 MIMGe<op.VI> {
243 let AssemblerPredicates = [isVI];
244 let DisableDecoder = DisableVIDecoder;
245 let MIMGEncoding = MIMGEncGfx8;
246 }
Changpeng Fangb28fe032016-09-01 17:54:54 +0000247 }
248}
249
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000250multiclass MIMG_Atomic_Addr_Helper_m <mimg op, string asm,
Dmitry Preobrazhensky0b4eb1e2018-01-26 15:43:29 +0000251 RegisterClass data_rc,
Dmitry Preobrazhensky0b4eb1e2018-01-26 15:43:29 +0000252 bit enableDasm = 0> {
Dmitry Preobrazhensky6cb42e72018-01-26 14:07:38 +0000253 // _V* variants have different address size, but the size is not encoded.
254 // So only one variant can be disassembled. V1 looks the safest to decode.
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000255 let VAddrDwords = 1 in
256 defm _V1 : MIMG_Atomic_Helper_m <op, asm, data_rc, VGPR_32, enableDasm>;
257 let VAddrDwords = 2 in
258 defm _V2 : MIMG_Atomic_Helper_m <op, asm, data_rc, VReg_64>;
259 let VAddrDwords = 3 in
260 defm _V3 : MIMG_Atomic_Helper_m <op, asm, data_rc, VReg_96>;
261 let VAddrDwords = 4 in
262 defm _V4 : MIMG_Atomic_Helper_m <op, asm, data_rc, VReg_128>;
Dmitry Preobrazhensky0b4eb1e2018-01-26 15:43:29 +0000263}
264
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000265multiclass MIMG_Atomic <mimg op, string asm, bit isCmpSwap = 0> { // 64-bit atomics
266 def "" : MIMGBaseOpcode;
267
268 let BaseOpcode = !cast<MIMGBaseOpcode>(NAME) in {
269 // _V* variants have different dst size, but the size is encoded implicitly,
270 // using dmask and tfe. Only 32-bit variant is registered with disassembler.
271 // Other variants are reconstructed by disassembler using dmask and tfe.
272 let VDataDwords = !if(isCmpSwap, 2, 1) in
273 defm _V1 : MIMG_Atomic_Addr_Helper_m <op, asm, !if(isCmpSwap, VReg_64, VGPR_32), 1>;
274 let VDataDwords = !if(isCmpSwap, 4, 2) in
275 defm _V2 : MIMG_Atomic_Addr_Helper_m <op, asm, !if(isCmpSwap, VReg_128, VReg_64)>;
276 }
Changpeng Fangb28fe032016-09-01 17:54:54 +0000277}
278
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000279class MIMG_Sampler_Helper <bits<7> op, string asm, RegisterClass dst_rc,
280 RegisterClass src_rc, string dns="">
281 : MIMG <(outs dst_rc:$vdata), dns>,
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000282 MIMGe<op> {
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000283 let d16 = !if(BaseOpcode.HasD16, ?, 0);
Changpeng Fang4737e892018-01-18 22:08:53 +0000284
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000285 let InOperandList = !con((ins src_rc:$vaddr, SReg_256:$srsrc, SReg_128:$ssamp,
286 DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc,
287 R128:$r128, TFE:$tfe, LWE:$lwe, DA:$da),
288 !if(BaseOpcode.HasD16, (ins D16:$d16), (ins)));
289 let AsmString = asm#" $vdata, $vaddr, $srsrc, $ssamp$dmask$unorm$glc$slc$r128$tfe$lwe$da"
290 #!if(BaseOpcode.HasD16, "$d16", "");
Changpeng Fangb28fe032016-09-01 17:54:54 +0000291}
292
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000293multiclass MIMG_Sampler_Src_Helper <bits<7> op, string asm, RegisterClass dst_rc,
294 bit enableDisasm = 0> {
295 let VAddrDwords = 1 in
296 def _V1 : MIMG_Sampler_Helper <op, asm, dst_rc, VGPR_32,
297 !if(enableDisasm, "AMDGPU", "")>;
298 let VAddrDwords = 2 in
299 def _V2 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_64>;
300 let VAddrDwords = 3 in
301 def _V3 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_96>;
302 let VAddrDwords = 4 in
303 def _V4 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_128>;
304 let VAddrDwords = 8 in
305 def _V8 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_256>;
306 let VAddrDwords = 16 in
307 def _V16 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_512>;
308}
309
310class MIMG_Sampler_BaseOpcode<AMDGPUSampleVariant sample>
311 : MIMGBaseOpcode {
312 let NumExtraArgs = !size(sample.ExtraAddrArgs);
313 let Gradients = sample.Gradients;
314 let LodOrClampOrMip = !ne(sample.LodOrClamp, "");
Changpeng Fangb28fe032016-09-01 17:54:54 +0000315}
316
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000317multiclass MIMG_Sampler <bits<7> op, AMDGPUSampleVariant sample, bit wqm = 0,
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000318 bit isGetLod = 0,
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000319 string asm = "image_sample"#sample.LowerCaseMod> {
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000320 def "" : MIMG_Sampler_BaseOpcode<sample> {
321 let HasD16 = !if(isGetLod, 0, 1);
322 }
323
324 let BaseOpcode = !cast<MIMGBaseOpcode>(NAME), WQM = wqm,
325 mayLoad = !if(isGetLod, 0, 1) in {
326 let VDataDwords = 1 in
327 defm _V1 : MIMG_Sampler_Src_Helper<op, asm, VGPR_32, 1>;
328 let VDataDwords = 2 in
329 defm _V2 : MIMG_Sampler_Src_Helper<op, asm, VReg_64>;
330 let VDataDwords = 3 in
331 defm _V3 : MIMG_Sampler_Src_Helper<op, asm, VReg_96>;
332 let VDataDwords = 4 in
333 defm _V4 : MIMG_Sampler_Src_Helper<op, asm, VReg_128>;
334 }
Changpeng Fangb28fe032016-09-01 17:54:54 +0000335}
336
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000337multiclass MIMG_Sampler_WQM <bits<7> op, AMDGPUSampleVariant sample>
338 : MIMG_Sampler<op, sample, 1>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000339
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000340multiclass MIMG_Gather <bits<7> op, AMDGPUSampleVariant sample, bit wqm = 0,
341 string asm = "image_gather4"#sample.LowerCaseMod> {
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000342 def "" : MIMG_Sampler_BaseOpcode<sample> {
343 let HasD16 = 1;
344 }
345
346 let BaseOpcode = !cast<MIMGBaseOpcode>(NAME), WQM = wqm,
347 Gather4 = 1, hasPostISelHook = 0 in {
348 let VDataDwords = 2 in
349 defm _V2 : MIMG_Sampler_Src_Helper<op, asm, VReg_64>; /* for packed D16 only */
350 let VDataDwords = 4 in
351 defm _V4 : MIMG_Sampler_Src_Helper<op, asm, VReg_128, 1>;
352 }
Changpeng Fangb28fe032016-09-01 17:54:54 +0000353}
354
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000355multiclass MIMG_Gather_WQM <bits<7> op, AMDGPUSampleVariant sample>
356 : MIMG_Gather<op, sample, 1>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000357
358//===----------------------------------------------------------------------===//
359// MIMG Instructions
360//===----------------------------------------------------------------------===//
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000361defm IMAGE_LOAD : MIMG_NoSampler <0x00000000, "image_load", 1>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000362defm IMAGE_LOAD_MIP : MIMG_NoSampler <0x00000001, "image_load_mip", 1, 1>;
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000363defm IMAGE_LOAD_PCK : MIMG_NoSampler <0x00000002, "image_load_pck", 0>;
364defm IMAGE_LOAD_PCK_SGN : MIMG_NoSampler <0x00000003, "image_load_pck_sgn", 0>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000365defm IMAGE_LOAD_MIP_PCK : MIMG_NoSampler <0x00000004, "image_load_mip_pck", 0, 1>;
366defm IMAGE_LOAD_MIP_PCK_SGN : MIMG_NoSampler <0x00000005, "image_load_mip_pck_sgn", 0, 1>;
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000367defm IMAGE_STORE : MIMG_Store <0x00000008, "image_store", 1>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000368defm IMAGE_STORE_MIP : MIMG_Store <0x00000009, "image_store_mip", 1, 1>;
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000369defm IMAGE_STORE_PCK : MIMG_Store <0x0000000a, "image_store_pck", 0>;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000370defm IMAGE_STORE_MIP_PCK : MIMG_Store <0x0000000b, "image_store_mip_pck", 0, 1>;
Matt Arsenault856777d2017-12-08 20:00:57 +0000371
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000372defm IMAGE_GET_RESINFO : MIMG_NoSampler <0x0000000e, "image_get_resinfo", 0, 1, 1>;
Matt Arsenault856777d2017-12-08 20:00:57 +0000373
Changpeng Fangb28fe032016-09-01 17:54:54 +0000374defm IMAGE_ATOMIC_SWAP : MIMG_Atomic <mimg<0x0f, 0x10>, "image_atomic_swap">;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000375defm IMAGE_ATOMIC_CMPSWAP : MIMG_Atomic <mimg<0x10, 0x11>, "image_atomic_cmpswap", 1>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000376defm IMAGE_ATOMIC_ADD : MIMG_Atomic <mimg<0x11, 0x12>, "image_atomic_add">;
377defm IMAGE_ATOMIC_SUB : MIMG_Atomic <mimg<0x12, 0x13>, "image_atomic_sub">;
378//def IMAGE_ATOMIC_RSUB : MIMG_NoPattern_ <"image_atomic_rsub", 0x00000013>; -- not on VI
379defm IMAGE_ATOMIC_SMIN : MIMG_Atomic <mimg<0x14>, "image_atomic_smin">;
380defm IMAGE_ATOMIC_UMIN : MIMG_Atomic <mimg<0x15>, "image_atomic_umin">;
381defm IMAGE_ATOMIC_SMAX : MIMG_Atomic <mimg<0x16>, "image_atomic_smax">;
382defm IMAGE_ATOMIC_UMAX : MIMG_Atomic <mimg<0x17>, "image_atomic_umax">;
383defm IMAGE_ATOMIC_AND : MIMG_Atomic <mimg<0x18>, "image_atomic_and">;
384defm IMAGE_ATOMIC_OR : MIMG_Atomic <mimg<0x19>, "image_atomic_or">;
385defm IMAGE_ATOMIC_XOR : MIMG_Atomic <mimg<0x1a>, "image_atomic_xor">;
386defm IMAGE_ATOMIC_INC : MIMG_Atomic <mimg<0x1b>, "image_atomic_inc">;
387defm IMAGE_ATOMIC_DEC : MIMG_Atomic <mimg<0x1c>, "image_atomic_dec">;
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000388//def IMAGE_ATOMIC_FCMPSWAP : MIMG_NoPattern_ <"image_atomic_fcmpswap", 0x0000001d, 1>; -- not on VI
Changpeng Fangb28fe032016-09-01 17:54:54 +0000389//def IMAGE_ATOMIC_FMIN : MIMG_NoPattern_ <"image_atomic_fmin", 0x0000001e>; -- not on VI
390//def IMAGE_ATOMIC_FMAX : MIMG_NoPattern_ <"image_atomic_fmax", 0x0000001f>; -- not on VI
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000391defm IMAGE_SAMPLE : MIMG_Sampler_WQM <0x00000020, AMDGPUSample>;
392defm IMAGE_SAMPLE_CL : MIMG_Sampler_WQM <0x00000021, AMDGPUSample_cl>;
393defm IMAGE_SAMPLE_D : MIMG_Sampler <0x00000022, AMDGPUSample_d>;
394defm IMAGE_SAMPLE_D_CL : MIMG_Sampler <0x00000023, AMDGPUSample_d_cl>;
395defm IMAGE_SAMPLE_L : MIMG_Sampler <0x00000024, AMDGPUSample_l>;
396defm IMAGE_SAMPLE_B : MIMG_Sampler_WQM <0x00000025, AMDGPUSample_b>;
397defm IMAGE_SAMPLE_B_CL : MIMG_Sampler_WQM <0x00000026, AMDGPUSample_b_cl>;
398defm IMAGE_SAMPLE_LZ : MIMG_Sampler <0x00000027, AMDGPUSample_lz>;
399defm IMAGE_SAMPLE_C : MIMG_Sampler_WQM <0x00000028, AMDGPUSample_c>;
400defm IMAGE_SAMPLE_C_CL : MIMG_Sampler_WQM <0x00000029, AMDGPUSample_c_cl>;
401defm IMAGE_SAMPLE_C_D : MIMG_Sampler <0x0000002a, AMDGPUSample_c_d>;
402defm IMAGE_SAMPLE_C_D_CL : MIMG_Sampler <0x0000002b, AMDGPUSample_c_d_cl>;
403defm IMAGE_SAMPLE_C_L : MIMG_Sampler <0x0000002c, AMDGPUSample_c_l>;
404defm IMAGE_SAMPLE_C_B : MIMG_Sampler_WQM <0x0000002d, AMDGPUSample_c_b>;
405defm IMAGE_SAMPLE_C_B_CL : MIMG_Sampler_WQM <0x0000002e, AMDGPUSample_c_b_cl>;
406defm IMAGE_SAMPLE_C_LZ : MIMG_Sampler <0x0000002f, AMDGPUSample_c_lz>;
407defm IMAGE_SAMPLE_O : MIMG_Sampler_WQM <0x00000030, AMDGPUSample_o>;
408defm IMAGE_SAMPLE_CL_O : MIMG_Sampler_WQM <0x00000031, AMDGPUSample_cl_o>;
409defm IMAGE_SAMPLE_D_O : MIMG_Sampler <0x00000032, AMDGPUSample_d_o>;
410defm IMAGE_SAMPLE_D_CL_O : MIMG_Sampler <0x00000033, AMDGPUSample_d_cl_o>;
411defm IMAGE_SAMPLE_L_O : MIMG_Sampler <0x00000034, AMDGPUSample_l_o>;
412defm IMAGE_SAMPLE_B_O : MIMG_Sampler_WQM <0x00000035, AMDGPUSample_b_o>;
413defm IMAGE_SAMPLE_B_CL_O : MIMG_Sampler_WQM <0x00000036, AMDGPUSample_b_cl_o>;
414defm IMAGE_SAMPLE_LZ_O : MIMG_Sampler <0x00000037, AMDGPUSample_lz_o>;
415defm IMAGE_SAMPLE_C_O : MIMG_Sampler_WQM <0x00000038, AMDGPUSample_c_o>;
416defm IMAGE_SAMPLE_C_CL_O : MIMG_Sampler_WQM <0x00000039, AMDGPUSample_c_cl_o>;
417defm IMAGE_SAMPLE_C_D_O : MIMG_Sampler <0x0000003a, AMDGPUSample_c_d_o>;
418defm IMAGE_SAMPLE_C_D_CL_O : MIMG_Sampler <0x0000003b, AMDGPUSample_c_d_cl_o>;
419defm IMAGE_SAMPLE_C_L_O : MIMG_Sampler <0x0000003c, AMDGPUSample_c_l_o>;
420defm IMAGE_SAMPLE_C_B_CL_O : MIMG_Sampler_WQM <0x0000003e, AMDGPUSample_c_b_cl_o>;
421defm IMAGE_SAMPLE_C_B_O : MIMG_Sampler_WQM <0x0000003d, AMDGPUSample_c_b_o>;
422defm IMAGE_SAMPLE_C_LZ_O : MIMG_Sampler <0x0000003f, AMDGPUSample_c_lz_o>;
423defm IMAGE_GATHER4 : MIMG_Gather_WQM <0x00000040, AMDGPUSample>;
424defm IMAGE_GATHER4_CL : MIMG_Gather_WQM <0x00000041, AMDGPUSample_cl>;
425defm IMAGE_GATHER4_L : MIMG_Gather <0x00000044, AMDGPUSample_l>;
426defm IMAGE_GATHER4_B : MIMG_Gather_WQM <0x00000045, AMDGPUSample_b>;
427defm IMAGE_GATHER4_B_CL : MIMG_Gather_WQM <0x00000046, AMDGPUSample_b_cl>;
428defm IMAGE_GATHER4_LZ : MIMG_Gather <0x00000047, AMDGPUSample_lz>;
429defm IMAGE_GATHER4_C : MIMG_Gather_WQM <0x00000048, AMDGPUSample_c>;
430defm IMAGE_GATHER4_C_CL : MIMG_Gather_WQM <0x00000049, AMDGPUSample_c_cl>;
431defm IMAGE_GATHER4_C_L : MIMG_Gather <0x0000004c, AMDGPUSample_c_l>;
432defm IMAGE_GATHER4_C_B : MIMG_Gather_WQM <0x0000004d, AMDGPUSample_c_b>;
433defm IMAGE_GATHER4_C_B_CL : MIMG_Gather_WQM <0x0000004e, AMDGPUSample_c_b_cl>;
434defm IMAGE_GATHER4_C_LZ : MIMG_Gather <0x0000004f, AMDGPUSample_c_lz>;
435defm IMAGE_GATHER4_O : MIMG_Gather_WQM <0x00000050, AMDGPUSample_o>;
436defm IMAGE_GATHER4_CL_O : MIMG_Gather_WQM <0x00000051, AMDGPUSample_cl_o>;
437defm IMAGE_GATHER4_L_O : MIMG_Gather <0x00000054, AMDGPUSample_l_o>;
438defm IMAGE_GATHER4_B_O : MIMG_Gather_WQM <0x00000055, AMDGPUSample_b_o>;
439defm IMAGE_GATHER4_B_CL_O : MIMG_Gather <0x00000056, AMDGPUSample_b_cl_o>;
440defm IMAGE_GATHER4_LZ_O : MIMG_Gather <0x00000057, AMDGPUSample_lz_o>;
441defm IMAGE_GATHER4_C_O : MIMG_Gather_WQM <0x00000058, AMDGPUSample_c_o>;
442defm IMAGE_GATHER4_C_CL_O : MIMG_Gather_WQM <0x00000059, AMDGPUSample_c_cl_o>;
443defm IMAGE_GATHER4_C_L_O : MIMG_Gather <0x0000005c, AMDGPUSample_c_l_o>;
444defm IMAGE_GATHER4_C_B_O : MIMG_Gather_WQM <0x0000005d, AMDGPUSample_c_b_o>;
445defm IMAGE_GATHER4_C_B_CL_O : MIMG_Gather_WQM <0x0000005e, AMDGPUSample_c_b_cl_o>;
446defm IMAGE_GATHER4_C_LZ_O : MIMG_Gather <0x0000005f, AMDGPUSample_c_lz_o>;
Matt Arsenault856777d2017-12-08 20:00:57 +0000447
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000448defm IMAGE_GET_LOD : MIMG_Sampler <0x00000060, AMDGPUSample, 1, 1, "image_get_lod">;
Matt Arsenault856777d2017-12-08 20:00:57 +0000449
Nicolai Haehnle2367f032018-06-21 13:36:13 +0000450defm IMAGE_SAMPLE_CD : MIMG_Sampler <0x00000068, AMDGPUSample_cd>;
451defm IMAGE_SAMPLE_CD_CL : MIMG_Sampler <0x00000069, AMDGPUSample_cd_cl>;
452defm IMAGE_SAMPLE_C_CD : MIMG_Sampler <0x0000006a, AMDGPUSample_c_cd>;
453defm IMAGE_SAMPLE_C_CD_CL : MIMG_Sampler <0x0000006b, AMDGPUSample_c_cd_cl>;
454defm IMAGE_SAMPLE_CD_O : MIMG_Sampler <0x0000006c, AMDGPUSample_cd_o>;
455defm IMAGE_SAMPLE_CD_CL_O : MIMG_Sampler <0x0000006d, AMDGPUSample_cd_cl_o>;
456defm IMAGE_SAMPLE_C_CD_O : MIMG_Sampler <0x0000006e, AMDGPUSample_c_cd_o>;
457defm IMAGE_SAMPLE_C_CD_CL_O : MIMG_Sampler <0x0000006f, AMDGPUSample_c_cd_cl_o>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000458//def IMAGE_RSRC256 : MIMG_NoPattern_RSRC256 <"image_rsrc256", 0x0000007e>;
459//def IMAGE_SAMPLER : MIMG_NoPattern_ <"image_sampler", 0x0000007f>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000460
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000461/********** ============================== **********/
462/********** Dimension-aware image patterns **********/
463/********** ============================== **********/
464
465class getDwordsType<int dwords> {
466 int NumDwords = dwords;
467 string suffix = !if(!lt(dwords, 1), ?,
468 !if(!eq(dwords, 1), "_V1",
469 !if(!eq(dwords, 2), "_V2",
470 !if(!le(dwords, 4), "_V4",
471 !if(!le(dwords, 8), "_V8",
472 !if(!le(dwords, 16), "_V16", ?))))));
473 ValueType VT = !if(!lt(dwords, 1), ?,
474 !if(!eq(dwords, 1), f32,
475 !if(!eq(dwords, 2), v2f32,
476 !if(!le(dwords, 4), v4f32,
477 !if(!le(dwords, 8), v8f32,
478 !if(!le(dwords, 16), v16f32, ?))))));
479 RegisterClass VReg = !if(!lt(dwords, 1), ?,
480 !if(!eq(dwords, 1), VGPR_32,
481 !if(!eq(dwords, 2), VReg_64,
482 !if(!le(dwords, 4), VReg_128,
483 !if(!le(dwords, 8), VReg_256,
484 !if(!le(dwords, 16), VReg_512, ?))))));
485}
486
487class makeRegSequence_Fold<int i, dag d> {
488 int idx = i;
489 dag lhs = d;
490}
491
492// Generate a dag node which returns a vector register of class RC into which
493// the source operands given by names have been inserted (assuming that each
494// name corresponds to an operand whose size is equal to a subregister).
495class makeRegSequence<ValueType vt, RegisterClass RC, list<string> names> {
496 dag ret =
497 !if(!eq(!size(names), 1),
498 !dag(COPY_TO_REGCLASS, [?, RC], [names[0], ?]),
499 !foldl(makeRegSequence_Fold<0, (vt (IMPLICIT_DEF))>, names, f, name,
500 makeRegSequence_Fold<
501 !add(f.idx, 1),
502 !con((INSERT_SUBREG f.lhs),
503 !dag(INSERT_SUBREG, [?, !cast<SubRegIndex>("sub"#f.idx)],
504 [name, ?]))>).lhs);
505}
506
507class ImageDimPattern<AMDGPUImageDimIntrinsic I,
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000508 string dop, ValueType dty, bit d16,
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000509 string suffix = ""> : GCNPat<(undef), (undef)> {
510 list<AMDGPUArg> AddrArgs = I.P.AddrDefaultArgs;
511 getDwordsType AddrDwords = getDwordsType<!size(AddrArgs)>;
512
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000513 MIMG MI =
514 !cast<MIMG>(!strconcat("IMAGE_", I.P.OpMod, dop, AddrDwords.suffix, suffix));
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000515
516 // DAG fragment to match data arguments (vdata for store/atomic, dmask
517 // for non-atomic).
518 dag MatchDataDag =
519 !con(!dag(I, !foreach(arg, I.P.DataArgs, dty),
520 !foreach(arg, I.P.DataArgs, arg.Name)),
521 !if(I.P.IsAtomic, (I), (I i32:$dmask)));
522
523 // DAG fragment to match vaddr arguments.
524 dag MatchAddrDag = !dag(I, !foreach(arg, AddrArgs, arg.Type.VT),
525 !foreach(arg, AddrArgs, arg.Name));
526
527 // DAG fragment to match sampler resource and unorm arguments.
528 dag MatchSamplerDag = !if(I.P.IsSample, (I v4i32:$sampler, i1:$unorm), (I));
529
530 // DAG node that generates the MI vdata for store/atomic
531 getDwordsType DataDwords = getDwordsType<!size(I.P.DataArgs)>;
532 dag GenDataDag =
533 !if(I.P.IsAtomic, (MI makeRegSequence<DataDwords.VT, DataDwords.VReg,
534 !foreach(arg, I.P.DataArgs, arg.Name)>.ret),
535 !if(!size(I.P.DataArgs), (MI $vdata), (MI)));
536
537 // DAG node that generates the MI vaddr
538 dag GenAddrDag = makeRegSequence<AddrDwords.VT, AddrDwords.VReg,
539 !foreach(arg, AddrArgs, arg.Name)>.ret;
540 // DAG fragments that generate various inline flags
541 dag GenDmask =
542 !if(I.P.IsAtomic, (MI !add(!shl(1, DataDwords.NumDwords), -1)),
543 (MI (as_i32imm $dmask)));
544 dag GenGLC =
545 !if(I.P.IsAtomic, (MI 1),
546 (MI (bitextract_imm<0> $cachepolicy)));
547
548 dag MatchIntrinsic = !con(MatchDataDag,
549 MatchAddrDag,
550 (I v8i32:$rsrc),
551 MatchSamplerDag,
552 (I 0/*texfailctrl*/,
553 i32:$cachepolicy));
554 let PatternToMatch =
555 !if(!size(I.RetTypes), (dty MatchIntrinsic), MatchIntrinsic);
556
557 bit IsCmpSwap = !and(I.P.IsAtomic, !eq(!size(I.P.DataArgs), 2));
558 dag ImageInstruction =
559 !con(GenDataDag,
560 (MI GenAddrDag),
561 (MI $rsrc),
562 !if(I.P.IsSample, (MI $sampler), (MI)),
563 GenDmask,
564 !if(I.P.IsSample, (MI (as_i1imm $unorm)), (MI 1)),
565 GenGLC,
566 (MI (bitextract_imm<1> $cachepolicy),
567 0, /* r128 */
568 0, /* tfe */
569 0 /*(as_i1imm $lwe)*/,
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000570 { I.P.Dim.DA }),
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000571 !if(MI.BaseOpcode.HasD16, (MI d16), (MI)));
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000572 let ResultInstrs = [
573 !if(IsCmpSwap, (EXTRACT_SUBREG ImageInstruction, sub0), ImageInstruction)
574 ];
575}
576
577foreach intr = !listconcat(AMDGPUImageDimIntrinsics,
578 AMDGPUImageDimGetResInfoIntrinsics) in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000579 def intr#_pat_v1 : ImageDimPattern<intr, "_V1", f32, 0>;
580 def intr#_pat_v2 : ImageDimPattern<intr, "_V2", v2f32, 0>;
581 def intr#_pat_v4 : ImageDimPattern<intr, "_V4", v4f32, 0>;
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000582}
583
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000584multiclass ImageDimD16Helper<AMDGPUImageDimIntrinsic I,
585 AMDGPUImageDimIntrinsic d16helper> {
586 let SubtargetPredicate = HasUnpackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000587 def _unpacked_v1 : ImageDimPattern<I, "_V1", f16, 1>;
588 def _unpacked_v2 : ImageDimPattern<d16helper, "_V2", v2i32, 1>;
589 def _unpacked_v4 : ImageDimPattern<d16helper, "_V4", v4i32, 1>;
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000590 } // End HasUnpackedD16VMem.
591
592 let SubtargetPredicate = HasPackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000593 def _packed_v1 : ImageDimPattern<I, "_V1", f16, 1>;
594 def _packed_v2 : ImageDimPattern<I, "_V1", v2f16, 1>;
595 def _packed_v4 : ImageDimPattern<I, "_V2", v4f16, 1>;
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000596 } // End HasPackedD16VMem.
597}
598
599foreach intr = AMDGPUImageDimIntrinsics in {
600 def intr#_d16helper_profile : AMDGPUDimProfileCopy<intr.P> {
601 let RetTypes = !foreach(ty, intr.P.RetTypes, llvm_any_ty);
602 let DataArgs = !foreach(arg, intr.P.DataArgs, AMDGPUArg<llvm_any_ty, arg.Name>);
603 }
604
605 let TargetPrefix = "SI", isTarget = 1 in
606 def int_SI_image_d16helper_ # intr.P.OpMod # intr.P.Dim.Name :
607 AMDGPUImageDimIntrinsic<!cast<AMDGPUDimProfile>(intr#"_d16helper_profile"),
608 intr.IntrProperties, intr.Properties>;
609
610 defm intr#_d16 :
611 ImageDimD16Helper<
612 intr, !cast<AMDGPUImageDimIntrinsic>(
613 "int_SI_image_d16helper_" # intr.P.OpMod # intr.P.Dim.Name)>;
614}
615
616foreach intr = AMDGPUImageDimGatherIntrinsics in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000617 def intr#_pat3 : ImageDimPattern<intr, "_V4", v4f32, 0>;
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000618
619 def intr#_d16helper_profile : AMDGPUDimProfileCopy<intr.P> {
620 let RetTypes = !foreach(ty, intr.P.RetTypes, llvm_any_ty);
621 let DataArgs = !foreach(arg, intr.P.DataArgs, AMDGPUArg<llvm_any_ty, arg.Name>);
622 }
623
624 let TargetPrefix = "SI", isTarget = 1 in
625 def int_SI_image_d16helper_ # intr.P.OpMod # intr.P.Dim.Name :
626 AMDGPUImageDimIntrinsic<!cast<AMDGPUDimProfile>(intr#"_d16helper_profile"),
627 intr.IntrProperties, intr.Properties>;
628
629 let SubtargetPredicate = HasUnpackedD16VMem in {
630 def intr#_unpacked_v4 :
631 ImageDimPattern<!cast<AMDGPUImageDimIntrinsic>(
632 "int_SI_image_d16helper_" # intr.P.OpMod # intr.P.Dim.Name),
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000633 "_V4", v4i32, 1>;
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000634 } // End HasUnpackedD16VMem.
635
636 let SubtargetPredicate = HasPackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000637 def intr#_packed_v4 : ImageDimPattern<intr, "_V2", v4f16, 1>;
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000638 } // End HasPackedD16VMem.
639}
640
641foreach intr = AMDGPUImageDimAtomicIntrinsics in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000642 def intr#_pat1 : ImageDimPattern<intr, "_V1", i32, 0>;
Nicolai Haehnle2f5a7382018-04-04 10:58:54 +0000643}
644
Changpeng Fangb28fe032016-09-01 17:54:54 +0000645/********** ======================= **********/
646/********** Image sampling patterns **********/
647/********** ======================= **********/
648
Changpeng Fang4737e892018-01-18 22:08:53 +0000649// ImageSample for amdgcn
Changpeng Fangb28fe032016-09-01 17:54:54 +0000650// TODO:
Changpeng Fang4737e892018-01-18 22:08:53 +0000651// 1. Handle v4i32 rsrc type (Register Class for the instruction to be SReg_128).
652// 2. Add A16 support when we pass address of half type.
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000653multiclass ImageSamplePattern<SDPatternOperator name, MIMG opcode,
654 ValueType dt, ValueType vt, bit d16> {
Matt Arsenault90c75932017-10-03 00:06:41 +0000655 def : GCNPat<
Changpeng Fang8236fe12016-11-14 18:33:18 +0000656 (dt (name vt:$addr, v8i32:$rsrc, v4i32:$sampler, i32:$dmask, i1:$unorm, i1:$glc,
Changpeng Fangb28fe032016-09-01 17:54:54 +0000657 i1:$slc, i1:$lwe, i1:$da)),
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000658 !con((opcode $addr, $rsrc, $sampler, (as_i32imm $dmask), (as_i1imm $unorm),
659 (as_i1imm $glc), (as_i1imm $slc), 0, 0, (as_i1imm $lwe),
660 (as_i1imm $da)),
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000661 !if(opcode.BaseOpcode.HasD16, (opcode d16), (opcode)))
Changpeng Fangb28fe032016-09-01 17:54:54 +0000662 >;
663}
664
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000665multiclass ImageSampleDataPatterns<SDPatternOperator name, string opcode,
666 ValueType dt, bit d16> {
667 defm : ImageSamplePattern<name, !cast<MIMG>(opcode # _V1), dt, f32, d16>;
668 defm : ImageSamplePattern<name, !cast<MIMG>(opcode # _V2), dt, v2f32, d16>;
669 defm : ImageSamplePattern<name, !cast<MIMG>(opcode # _V4), dt, v4f32, d16>;
670 defm : ImageSamplePattern<name, !cast<MIMG>(opcode # _V8), dt, v8f32, d16>;
671 defm : ImageSamplePattern<name, !cast<MIMG>(opcode # _V16), dt, v16f32, d16>;
Changpeng Fang8236fe12016-11-14 18:33:18 +0000672}
673
Changpeng Fang4737e892018-01-18 22:08:53 +0000674// ImageSample patterns.
675multiclass ImageSamplePatterns<SDPatternOperator name, string opcode> {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000676 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V1), f32, 0>;
677 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V2), v2f32, 0>;
678 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V4), v4f32, 0>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000679
680 let SubtargetPredicate = HasUnpackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000681 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V1), f16, 1>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000682 } // End HasUnpackedD16VMem.
683
684 let SubtargetPredicate = HasPackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000685 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V1), f16, 1>;
686 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V1), v2f16, 1>;
687 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V2), v4f16, 1>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000688 } // End HasPackedD16VMem.
Changpeng Fangb28fe032016-09-01 17:54:54 +0000689}
690
Changpeng Fang4737e892018-01-18 22:08:53 +0000691// ImageSample alternative patterns for illegal vector half Types.
692multiclass ImageSampleAltPatterns<SDPatternOperator name, string opcode> {
693 let SubtargetPredicate = HasUnpackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000694 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V2), v2i32, 1>;
695 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V4), v4i32, 1>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000696 } // End HasUnpackedD16VMem.
Changpeng Fangb28fe032016-09-01 17:54:54 +0000697}
698
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +0000699// ImageGather4 patterns.
700multiclass ImageGather4Patterns<SDPatternOperator name, string opcode> {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000701 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V4), v4f32, 0>;
Matt Arsenault02dc7e12018-06-15 15:15:46 +0000702
703 let SubtargetPredicate = HasPackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000704 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V2), v4f16, 1>;
Matt Arsenault02dc7e12018-06-15 15:15:46 +0000705 } // End HasPackedD16VMem.
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +0000706}
707
708// ImageGather4 alternative patterns for illegal vector half Types.
709multiclass ImageGather4AltPatterns<SDPatternOperator name, string opcode> {
710 let SubtargetPredicate = HasUnpackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000711 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V4), v4i32, 1>;
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +0000712 } // End HasUnpackedD16VMem.
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +0000713}
714
Changpeng Fang4737e892018-01-18 22:08:53 +0000715// ImageLoad for amdgcn.
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000716multiclass ImageLoadPattern<SDPatternOperator name, MIMG opcode,
717 ValueType dt, ValueType vt, bit d16> {
Matt Arsenault90c75932017-10-03 00:06:41 +0000718 def : GCNPat <
Changpeng Fang8236fe12016-11-14 18:33:18 +0000719 (dt (name vt:$addr, v8i32:$rsrc, i32:$dmask, i1:$glc, i1:$slc, i1:$lwe,
Tom Stellardfac248c2016-10-12 16:35:29 +0000720 i1:$da)),
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000721 !con((opcode $addr, $rsrc, (as_i32imm $dmask), 1, (as_i1imm $glc),
722 (as_i1imm $slc), 0, 0, (as_i1imm $lwe), (as_i1imm $da)),
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000723 !if(opcode.BaseOpcode.HasD16, (opcode d16), (opcode)))
Tom Stellardfac248c2016-10-12 16:35:29 +0000724 >;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000725}
726
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000727multiclass ImageLoadDataPatterns<SDPatternOperator name, string opcode,
728 ValueType dt, bit d16> {
729 defm : ImageLoadPattern<name, !cast<MIMG>(opcode # _V1), dt, i32, d16>;
730 defm : ImageLoadPattern<name, !cast<MIMG>(opcode # _V2), dt, v2i32, d16>;
731 defm : ImageLoadPattern<name, !cast<MIMG>(opcode # _V4), dt, v4i32, d16>;
Tom Stellardfac248c2016-10-12 16:35:29 +0000732}
733
Changpeng Fang4737e892018-01-18 22:08:53 +0000734// ImageLoad patterns.
Changpeng Fang8236fe12016-11-14 18:33:18 +0000735// TODO: support v3f32.
736multiclass ImageLoadPatterns<SDPatternOperator name, string opcode> {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000737 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V1), f32, 0>;
738 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V2), v2f32, 0>;
739 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V4), v4f32, 0>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000740
741 let SubtargetPredicate = HasUnpackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000742 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V1), f16, 1>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000743 } // End HasUnpackedD16VMem.
744
745 let SubtargetPredicate = HasPackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000746 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V1), f16, 1>;
747 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V1), v2f16, 1>;
748 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V2), v4f16, 1>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000749 } // End HasPackedD16VMem.
Changpeng Fang8236fe12016-11-14 18:33:18 +0000750}
751
Changpeng Fang4737e892018-01-18 22:08:53 +0000752// ImageLoad alternative patterns for illegal vector half Types.
753multiclass ImageLoadAltPatterns<SDPatternOperator name, string opcode> {
754 let SubtargetPredicate = HasUnpackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000755 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V2), v2i32, 1>;
756 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V4), v4i32, 1>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000757 } // End HasUnPackedD16VMem.
Changpeng Fang4737e892018-01-18 22:08:53 +0000758}
759
760// ImageStore for amdgcn.
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000761multiclass ImageStorePattern<SDPatternOperator name, MIMG opcode,
762 ValueType dt, ValueType vt, bit d16> {
Matt Arsenault90c75932017-10-03 00:06:41 +0000763 def : GCNPat <
Changpeng Fang8236fe12016-11-14 18:33:18 +0000764 (name dt:$data, vt:$addr, v8i32:$rsrc, i32:$dmask, i1:$glc, i1:$slc,
Tom Stellardfac248c2016-10-12 16:35:29 +0000765 i1:$lwe, i1:$da),
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000766 !con((opcode $data, $addr, $rsrc, (as_i32imm $dmask), 1, (as_i1imm $glc),
767 (as_i1imm $slc), 0, 0, (as_i1imm $lwe), (as_i1imm $da)),
Nicolai Haehnle0ab200b2018-06-21 13:36:44 +0000768 !if(opcode.BaseOpcode.HasD16, (opcode d16), (opcode)))
Tom Stellardfac248c2016-10-12 16:35:29 +0000769 >;
770}
Changpeng Fangb28fe032016-09-01 17:54:54 +0000771
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000772multiclass ImageStoreDataPatterns<SDPatternOperator name, string opcode,
773 ValueType dt, bit d16> {
774 defm : ImageStorePattern<name, !cast<MIMG>(opcode # _V1), dt, i32, d16>;
775 defm : ImageStorePattern<name, !cast<MIMG>(opcode # _V2), dt, v2i32, d16>;
776 defm : ImageStorePattern<name, !cast<MIMG>(opcode # _V4), dt, v4i32, d16>;
Changpeng Fang8236fe12016-11-14 18:33:18 +0000777}
778
Changpeng Fang4737e892018-01-18 22:08:53 +0000779// ImageStore patterns.
Changpeng Fang8236fe12016-11-14 18:33:18 +0000780// TODO: support v3f32.
Changpeng Fangb28fe032016-09-01 17:54:54 +0000781multiclass ImageStorePatterns<SDPatternOperator name, string opcode> {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000782 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V1), f32, 0>;
783 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V2), v2f32, 0>;
784 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V4), v4f32, 0>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000785
786 let SubtargetPredicate = HasUnpackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000787 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V1), f16, 1>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000788 } // End HasUnpackedD16VMem.
789
790 let SubtargetPredicate = HasPackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000791 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V1), f16, 1>;
792 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V1), v2f16, 1>;
793 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V2), v4f16, 1>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000794 } // End HasPackedD16VMem.
Changpeng Fangb28fe032016-09-01 17:54:54 +0000795}
796
Changpeng Fang4737e892018-01-18 22:08:53 +0000797// ImageStore alternative patterns.
798multiclass ImageStoreAltPatterns<SDPatternOperator name, string opcode> {
799 let SubtargetPredicate = HasUnpackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000800 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V2), v2i32, 1>;
801 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V4), v4i32, 1>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000802 } // End HasUnpackedD16VMem.
803
804 let SubtargetPredicate = HasPackedD16VMem in {
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000805 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V1), i32, 1>;
806 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V2), v2i32, 1>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000807 } // End HasPackedD16VMem.
808}
809
810// ImageAtomic for amdgcn.
Matt Arsenault90c75932017-10-03 00:06:41 +0000811class ImageAtomicPattern<SDPatternOperator name, MIMG opcode, ValueType vt> : GCNPat <
Changpeng Fangb28fe032016-09-01 17:54:54 +0000812 (name i32:$vdata, vt:$addr, v8i32:$rsrc, imm:$r128, imm:$da, imm:$slc),
813 (opcode $vdata, $addr, $rsrc, 1, 1, 1, (as_i1imm $slc), (as_i1imm $r128), 0, 0, (as_i1imm $da))
814>;
815
Changpeng Fang4737e892018-01-18 22:08:53 +0000816// ImageAtomic patterns.
Changpeng Fangb28fe032016-09-01 17:54:54 +0000817multiclass ImageAtomicPatterns<SDPatternOperator name, string opcode> {
Dmitry Preobrazhensky0b4eb1e2018-01-26 15:43:29 +0000818 def : ImageAtomicPattern<name, !cast<MIMG>(opcode # _V1_V1), i32>;
819 def : ImageAtomicPattern<name, !cast<MIMG>(opcode # _V1_V2), v2i32>;
820 def : ImageAtomicPattern<name, !cast<MIMG>(opcode # _V1_V4), v4i32>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000821}
822
Changpeng Fang4737e892018-01-18 22:08:53 +0000823// ImageAtomicCmpSwap for amdgcn.
Matt Arsenault90c75932017-10-03 00:06:41 +0000824class ImageAtomicCmpSwapPattern<MIMG opcode, ValueType vt> : GCNPat <
Changpeng Fangb28fe032016-09-01 17:54:54 +0000825 (int_amdgcn_image_atomic_cmpswap i32:$vsrc, i32:$vcmp, vt:$addr, v8i32:$rsrc,
826 imm:$r128, imm:$da, imm:$slc),
827 (EXTRACT_SUBREG
828 (opcode (REG_SEQUENCE VReg_64, $vsrc, sub0, $vcmp, sub1),
829 $addr, $rsrc, 3, 1, 1, (as_i1imm $slc), (as_i1imm $r128), 0, 0, (as_i1imm $da)),
830 sub0)
831>;
832
Changpeng Fangb28fe032016-09-01 17:54:54 +0000833// ======= amdgcn Image Intrinsics ==============
834
Changpeng Fang4737e892018-01-18 22:08:53 +0000835// Image load.
Changpeng Fangb28fe032016-09-01 17:54:54 +0000836defm : ImageLoadPatterns<int_amdgcn_image_load, "IMAGE_LOAD">;
837defm : ImageLoadPatterns<int_amdgcn_image_load_mip, "IMAGE_LOAD_MIP">;
Changpeng Fang8236fe12016-11-14 18:33:18 +0000838defm : ImageLoadPatterns<int_amdgcn_image_getresinfo, "IMAGE_GET_RESINFO">;
Changpeng Fang4737e892018-01-18 22:08:53 +0000839defm : ImageLoadAltPatterns<SIImage_load, "IMAGE_LOAD">;
840defm : ImageLoadAltPatterns<SIImage_load_mip, "IMAGE_LOAD_MIP">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000841
Changpeng Fang4737e892018-01-18 22:08:53 +0000842// Image store.
Matt Arsenault1349a042018-05-22 06:32:10 +0000843defm : ImageStorePatterns<int_amdgcn_image_store, "IMAGE_STORE">;
844defm : ImageStorePatterns<int_amdgcn_image_store_mip, "IMAGE_STORE_MIP">;
Changpeng Fang4737e892018-01-18 22:08:53 +0000845defm : ImageStoreAltPatterns<SIImage_store, "IMAGE_STORE">;
846defm : ImageStoreAltPatterns<SIImage_store_mip, "IMAGE_STORE_MIP">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000847
Changpeng Fang4737e892018-01-18 22:08:53 +0000848// Basic sample.
849defm : ImageSamplePatterns<int_amdgcn_image_sample, "IMAGE_SAMPLE">;
850defm : ImageSamplePatterns<int_amdgcn_image_sample_cl, "IMAGE_SAMPLE_CL">;
851defm : ImageSamplePatterns<int_amdgcn_image_sample_d, "IMAGE_SAMPLE_D">;
852defm : ImageSamplePatterns<int_amdgcn_image_sample_d_cl, "IMAGE_SAMPLE_D_CL">;
853defm : ImageSamplePatterns<int_amdgcn_image_sample_l, "IMAGE_SAMPLE_L">;
854defm : ImageSamplePatterns<int_amdgcn_image_sample_b, "IMAGE_SAMPLE_B">;
855defm : ImageSamplePatterns<int_amdgcn_image_sample_b_cl, "IMAGE_SAMPLE_B_CL">;
856defm : ImageSamplePatterns<int_amdgcn_image_sample_lz, "IMAGE_SAMPLE_LZ">;
857defm : ImageSamplePatterns<int_amdgcn_image_sample_cd, "IMAGE_SAMPLE_CD">;
858defm : ImageSamplePatterns<int_amdgcn_image_sample_cd_cl, "IMAGE_SAMPLE_CD_CL">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000859
Changpeng Fang4737e892018-01-18 22:08:53 +0000860// Sample with comparison.
861defm : ImageSamplePatterns<int_amdgcn_image_sample_c, "IMAGE_SAMPLE_C">;
862defm : ImageSamplePatterns<int_amdgcn_image_sample_c_cl, "IMAGE_SAMPLE_C_CL">;
863defm : ImageSamplePatterns<int_amdgcn_image_sample_c_d, "IMAGE_SAMPLE_C_D">;
864defm : ImageSamplePatterns<int_amdgcn_image_sample_c_d_cl, "IMAGE_SAMPLE_C_D_CL">;
865defm : ImageSamplePatterns<int_amdgcn_image_sample_c_l, "IMAGE_SAMPLE_C_L">;
866defm : ImageSamplePatterns<int_amdgcn_image_sample_c_b, "IMAGE_SAMPLE_C_B">;
867defm : ImageSamplePatterns<int_amdgcn_image_sample_c_b_cl, "IMAGE_SAMPLE_C_B_CL">;
868defm : ImageSamplePatterns<int_amdgcn_image_sample_c_lz, "IMAGE_SAMPLE_C_LZ">;
869defm : ImageSamplePatterns<int_amdgcn_image_sample_c_cd, "IMAGE_SAMPLE_C_CD">;
870defm : ImageSamplePatterns<int_amdgcn_image_sample_c_cd_cl, "IMAGE_SAMPLE_C_CD_CL">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000871
Changpeng Fang4737e892018-01-18 22:08:53 +0000872// Sample with offsets.
873defm : ImageSamplePatterns<int_amdgcn_image_sample_o, "IMAGE_SAMPLE_O">;
874defm : ImageSamplePatterns<int_amdgcn_image_sample_cl_o, "IMAGE_SAMPLE_CL_O">;
875defm : ImageSamplePatterns<int_amdgcn_image_sample_d_o, "IMAGE_SAMPLE_D_O">;
876defm : ImageSamplePatterns<int_amdgcn_image_sample_d_cl_o, "IMAGE_SAMPLE_D_CL_O">;
877defm : ImageSamplePatterns<int_amdgcn_image_sample_l_o, "IMAGE_SAMPLE_L_O">;
878defm : ImageSamplePatterns<int_amdgcn_image_sample_b_o, "IMAGE_SAMPLE_B_O">;
879defm : ImageSamplePatterns<int_amdgcn_image_sample_b_cl_o, "IMAGE_SAMPLE_B_CL_O">;
880defm : ImageSamplePatterns<int_amdgcn_image_sample_lz_o, "IMAGE_SAMPLE_LZ_O">;
881defm : ImageSamplePatterns<int_amdgcn_image_sample_cd_o, "IMAGE_SAMPLE_CD_O">;
882defm : ImageSamplePatterns<int_amdgcn_image_sample_cd_cl_o, "IMAGE_SAMPLE_CD_CL_O">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000883
Changpeng Fang4737e892018-01-18 22:08:53 +0000884// Sample with comparison and offsets.
885defm : ImageSamplePatterns<int_amdgcn_image_sample_c_o, "IMAGE_SAMPLE_C_O">;
886defm : ImageSamplePatterns<int_amdgcn_image_sample_c_cl_o, "IMAGE_SAMPLE_C_CL_O">;
887defm : ImageSamplePatterns<int_amdgcn_image_sample_c_d_o, "IMAGE_SAMPLE_C_D_O">;
888defm : ImageSamplePatterns<int_amdgcn_image_sample_c_d_cl_o, "IMAGE_SAMPLE_C_D_CL_O">;
889defm : ImageSamplePatterns<int_amdgcn_image_sample_c_l_o, "IMAGE_SAMPLE_C_L_O">;
890defm : ImageSamplePatterns<int_amdgcn_image_sample_c_b_o, "IMAGE_SAMPLE_C_B_O">;
891defm : ImageSamplePatterns<int_amdgcn_image_sample_c_b_cl_o, "IMAGE_SAMPLE_C_B_CL_O">;
892defm : ImageSamplePatterns<int_amdgcn_image_sample_c_lz_o, "IMAGE_SAMPLE_C_LZ_O">;
893defm : ImageSamplePatterns<int_amdgcn_image_sample_c_cd_o, "IMAGE_SAMPLE_C_CD_O">;
894defm : ImageSamplePatterns<int_amdgcn_image_sample_c_cd_cl_o, "IMAGE_SAMPLE_C_CD_CL_O">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000895
Changpeng Fang4737e892018-01-18 22:08:53 +0000896// Basic gather4.
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +0000897defm : ImageGather4Patterns<int_amdgcn_image_gather4, "IMAGE_GATHER4">;
898defm : ImageGather4Patterns<int_amdgcn_image_gather4_cl, "IMAGE_GATHER4_CL">;
899defm : ImageGather4Patterns<int_amdgcn_image_gather4_l, "IMAGE_GATHER4_L">;
900defm : ImageGather4Patterns<int_amdgcn_image_gather4_b, "IMAGE_GATHER4_B">;
901defm : ImageGather4Patterns<int_amdgcn_image_gather4_b_cl, "IMAGE_GATHER4_B_CL">;
902defm : ImageGather4Patterns<int_amdgcn_image_gather4_lz, "IMAGE_GATHER4_LZ">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000903
Changpeng Fang4737e892018-01-18 22:08:53 +0000904// Gather4 with comparison.
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +0000905defm : ImageGather4Patterns<int_amdgcn_image_gather4_c, "IMAGE_GATHER4_C">;
906defm : ImageGather4Patterns<int_amdgcn_image_gather4_c_cl, "IMAGE_GATHER4_C_CL">;
907defm : ImageGather4Patterns<int_amdgcn_image_gather4_c_l, "IMAGE_GATHER4_C_L">;
908defm : ImageGather4Patterns<int_amdgcn_image_gather4_c_b, "IMAGE_GATHER4_C_B">;
909defm : ImageGather4Patterns<int_amdgcn_image_gather4_c_b_cl, "IMAGE_GATHER4_C_B_CL">;
910defm : ImageGather4Patterns<int_amdgcn_image_gather4_c_lz, "IMAGE_GATHER4_C_LZ">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000911
Changpeng Fang4737e892018-01-18 22:08:53 +0000912// Gather4 with offsets.
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +0000913defm : ImageGather4Patterns<int_amdgcn_image_gather4_o, "IMAGE_GATHER4_O">;
914defm : ImageGather4Patterns<int_amdgcn_image_gather4_cl_o, "IMAGE_GATHER4_CL_O">;
915defm : ImageGather4Patterns<int_amdgcn_image_gather4_l_o, "IMAGE_GATHER4_L_O">;
916defm : ImageGather4Patterns<int_amdgcn_image_gather4_b_o, "IMAGE_GATHER4_B_O">;
917defm : ImageGather4Patterns<int_amdgcn_image_gather4_b_cl_o, "IMAGE_GATHER4_B_CL_O">;
918defm : ImageGather4Patterns<int_amdgcn_image_gather4_lz_o, "IMAGE_GATHER4_LZ_O">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000919
Changpeng Fang4737e892018-01-18 22:08:53 +0000920// Gather4 with comparison and offsets.
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +0000921defm : ImageGather4Patterns<int_amdgcn_image_gather4_c_o, "IMAGE_GATHER4_C_O">;
922defm : ImageGather4Patterns<int_amdgcn_image_gather4_c_cl_o, "IMAGE_GATHER4_C_CL_O">;
923defm : ImageGather4Patterns<int_amdgcn_image_gather4_c_l_o, "IMAGE_GATHER4_C_L_O">;
924defm : ImageGather4Patterns<int_amdgcn_image_gather4_c_b_o, "IMAGE_GATHER4_C_B_O">;
925defm : ImageGather4Patterns<int_amdgcn_image_gather4_c_b_cl_o, "IMAGE_GATHER4_C_B_CL_O">;
926defm : ImageGather4Patterns<int_amdgcn_image_gather4_c_lz_o, "IMAGE_GATHER4_C_LZ_O">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000927
Changpeng Fang4737e892018-01-18 22:08:53 +0000928// Basic sample alternative.
929defm : ImageSampleAltPatterns<SIImage_sample, "IMAGE_SAMPLE">;
930defm : ImageSampleAltPatterns<SIImage_sample_cl, "IMAGE_SAMPLE_CL">;
931defm : ImageSampleAltPatterns<SIImage_sample_d, "IMAGE_SAMPLE_D">;
932defm : ImageSampleAltPatterns<SIImage_sample_d_cl, "IMAGE_SAMPLE_D_CL">;
933defm : ImageSampleAltPatterns<SIImage_sample_l, "IMAGE_SAMPLE_L">;
934defm : ImageSampleAltPatterns<SIImage_sample_b, "IMAGE_SAMPLE_B">;
935defm : ImageSampleAltPatterns<SIImage_sample_b_cl, "IMAGE_SAMPLE_B_CL">;
936defm : ImageSampleAltPatterns<SIImage_sample_lz, "IMAGE_SAMPLE_LZ">;
937defm : ImageSampleAltPatterns<SIImage_sample_cd, "IMAGE_SAMPLE_CD">;
938defm : ImageSampleAltPatterns<SIImage_sample_cd_cl, "IMAGE_SAMPLE_CD_CL">;
939
940// Sample with comparison alternative.
941defm : ImageSampleAltPatterns<SIImage_sample_c, "IMAGE_SAMPLE_C">;
942defm : ImageSampleAltPatterns<SIImage_sample_c_cl, "IMAGE_SAMPLE_C_CL">;
943defm : ImageSampleAltPatterns<SIImage_sample_c_d, "IMAGE_SAMPLE_C_D">;
944defm : ImageSampleAltPatterns<SIImage_sample_c_d_cl, "IMAGE_SAMPLE_C_D_CL">;
945defm : ImageSampleAltPatterns<SIImage_sample_c_l, "IMAGE_SAMPLE_C_L">;
946defm : ImageSampleAltPatterns<SIImage_sample_c_b, "IMAGE_SAMPLE_C_B">;
947defm : ImageSampleAltPatterns<SIImage_sample_c_b_cl, "IMAGE_SAMPLE_C_B_CL">;
948defm : ImageSampleAltPatterns<SIImage_sample_c_lz, "IMAGE_SAMPLE_C_LZ">;
949defm : ImageSampleAltPatterns<SIImage_sample_c_cd, "IMAGE_SAMPLE_C_CD">;
950defm : ImageSampleAltPatterns<SIImage_sample_c_cd_cl, "IMAGE_SAMPLE_C_CD_CL">;
951
952// Sample with offsets alternative.
953defm : ImageSampleAltPatterns<SIImage_sample_o, "IMAGE_SAMPLE_O">;
954defm : ImageSampleAltPatterns<SIImage_sample_cl_o, "IMAGE_SAMPLE_CL_O">;
955defm : ImageSampleAltPatterns<SIImage_sample_d_o, "IMAGE_SAMPLE_D_O">;
956defm : ImageSampleAltPatterns<SIImage_sample_d_cl_o, "IMAGE_SAMPLE_D_CL_O">;
957defm : ImageSampleAltPatterns<SIImage_sample_l_o, "IMAGE_SAMPLE_L_O">;
958defm : ImageSampleAltPatterns<SIImage_sample_b_o, "IMAGE_SAMPLE_B_O">;
959defm : ImageSampleAltPatterns<SIImage_sample_b_cl_o, "IMAGE_SAMPLE_B_CL_O">;
960defm : ImageSampleAltPatterns<SIImage_sample_lz_o, "IMAGE_SAMPLE_LZ_O">;
961defm : ImageSampleAltPatterns<SIImage_sample_cd_o, "IMAGE_SAMPLE_CD_O">;
962defm : ImageSampleAltPatterns<SIImage_sample_cd_cl_o, "IMAGE_SAMPLE_CD_CL_O">;
963
964// Sample with comparison and offsets alternative.
965defm : ImageSampleAltPatterns<SIImage_sample_c_o, "IMAGE_SAMPLE_C_O">;
966defm : ImageSampleAltPatterns<SIImage_sample_c_cl_o, "IMAGE_SAMPLE_C_CL_O">;
967defm : ImageSampleAltPatterns<SIImage_sample_c_d_o, "IMAGE_SAMPLE_C_D_O">;
968defm : ImageSampleAltPatterns<SIImage_sample_c_d_cl_o, "IMAGE_SAMPLE_C_D_CL_O">;
969defm : ImageSampleAltPatterns<SIImage_sample_c_l_o, "IMAGE_SAMPLE_C_L_O">;
970defm : ImageSampleAltPatterns<SIImage_sample_c_b_o, "IMAGE_SAMPLE_C_B_O">;
971defm : ImageSampleAltPatterns<SIImage_sample_c_b_cl_o, "IMAGE_SAMPLE_C_B_CL_O">;
972defm : ImageSampleAltPatterns<SIImage_sample_c_lz_o, "IMAGE_SAMPLE_C_LZ_O">;
973defm : ImageSampleAltPatterns<SIImage_sample_c_cd_o, "IMAGE_SAMPLE_C_CD_O">;
974defm : ImageSampleAltPatterns<SIImage_sample_c_cd_cl_o, "IMAGE_SAMPLE_C_CD_CL_O">;
975
976// Basic gather4 alternative.
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +0000977defm : ImageGather4AltPatterns<SIImage_gather4, "IMAGE_GATHER4">;
978defm : ImageGather4AltPatterns<SIImage_gather4_cl, "IMAGE_GATHER4_CL">;
979defm : ImageGather4AltPatterns<SIImage_gather4_l, "IMAGE_GATHER4_L">;
980defm : ImageGather4AltPatterns<SIImage_gather4_b, "IMAGE_GATHER4_B">;
981defm : ImageGather4AltPatterns<SIImage_gather4_b_cl, "IMAGE_GATHER4_B_CL">;
982defm : ImageGather4AltPatterns<SIImage_gather4_lz, "IMAGE_GATHER4_LZ">;
Changpeng Fang4737e892018-01-18 22:08:53 +0000983
984// Gather4 with comparison alternative.
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +0000985defm : ImageGather4AltPatterns<SIImage_gather4_c, "IMAGE_GATHER4_C">;
986defm : ImageGather4AltPatterns<SIImage_gather4_c_cl, "IMAGE_GATHER4_C_CL">;
987defm : ImageGather4AltPatterns<SIImage_gather4_c_l, "IMAGE_GATHER4_C_L">;
988defm : ImageGather4AltPatterns<SIImage_gather4_c_b, "IMAGE_GATHER4_C_B">;
989defm : ImageGather4AltPatterns<SIImage_gather4_c_b_cl, "IMAGE_GATHER4_C_B_CL">;
990defm : ImageGather4AltPatterns<SIImage_gather4_c_lz, "IMAGE_GATHER4_C_LZ">;
Changpeng Fang4737e892018-01-18 22:08:53 +0000991
992// Gather4 with offsets alternative.
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +0000993defm : ImageGather4AltPatterns<SIImage_gather4_o, "IMAGE_GATHER4_O">;
994defm : ImageGather4AltPatterns<SIImage_gather4_cl_o, "IMAGE_GATHER4_CL_O">;
995defm : ImageGather4AltPatterns<SIImage_gather4_l_o, "IMAGE_GATHER4_L_O">;
996defm : ImageGather4AltPatterns<SIImage_gather4_b_o, "IMAGE_GATHER4_B_O">;
997defm : ImageGather4AltPatterns<SIImage_gather4_b_cl_o, "IMAGE_GATHER4_B_CL_O">;
998defm : ImageGather4AltPatterns<SIImage_gather4_lz_o, "IMAGE_GATHER4_LZ_O">;
Changpeng Fang4737e892018-01-18 22:08:53 +0000999
1000// Gather4 with comparison and offsets alternative.
Dmitry Preobrazhenskyda4a7c02018-03-12 15:03:34 +00001001defm : ImageGather4AltPatterns<SIImage_gather4_c_o, "IMAGE_GATHER4_C_O">;
1002defm : ImageGather4AltPatterns<SIImage_gather4_c_cl_o, "IMAGE_GATHER4_C_CL_O">;
1003defm : ImageGather4AltPatterns<SIImage_gather4_c_l_o, "IMAGE_GATHER4_C_L_O">;
1004defm : ImageGather4AltPatterns<SIImage_gather4_c_b_o, "IMAGE_GATHER4_C_B_O">;
1005defm : ImageGather4AltPatterns<SIImage_gather4_c_b_cl_o, "IMAGE_GATHER4_C_B_CL_O">;
1006defm : ImageGather4AltPatterns<SIImage_gather4_c_lz_o, "IMAGE_GATHER4_C_LZ_O">;
Changpeng Fang4737e892018-01-18 22:08:53 +00001007
1008defm : ImageSamplePatterns<int_amdgcn_image_getlod, "IMAGE_GET_LOD">;
Changpeng Fangb28fe032016-09-01 17:54:54 +00001009
1010// Image atomics
1011defm : ImageAtomicPatterns<int_amdgcn_image_atomic_swap, "IMAGE_ATOMIC_SWAP">;
Dmitry Preobrazhensky0b4eb1e2018-01-26 15:43:29 +00001012def : ImageAtomicCmpSwapPattern<IMAGE_ATOMIC_CMPSWAP_V1_V1, i32>;
1013def : ImageAtomicCmpSwapPattern<IMAGE_ATOMIC_CMPSWAP_V1_V2, v2i32>;
1014def : ImageAtomicCmpSwapPattern<IMAGE_ATOMIC_CMPSWAP_V1_V4, v4i32>;
Changpeng Fangb28fe032016-09-01 17:54:54 +00001015defm : ImageAtomicPatterns<int_amdgcn_image_atomic_add, "IMAGE_ATOMIC_ADD">;
1016defm : ImageAtomicPatterns<int_amdgcn_image_atomic_sub, "IMAGE_ATOMIC_SUB">;
1017defm : ImageAtomicPatterns<int_amdgcn_image_atomic_smin, "IMAGE_ATOMIC_SMIN">;
1018defm : ImageAtomicPatterns<int_amdgcn_image_atomic_umin, "IMAGE_ATOMIC_UMIN">;
1019defm : ImageAtomicPatterns<int_amdgcn_image_atomic_smax, "IMAGE_ATOMIC_SMAX">;
1020defm : ImageAtomicPatterns<int_amdgcn_image_atomic_umax, "IMAGE_ATOMIC_UMAX">;
1021defm : ImageAtomicPatterns<int_amdgcn_image_atomic_and, "IMAGE_ATOMIC_AND">;
1022defm : ImageAtomicPatterns<int_amdgcn_image_atomic_or, "IMAGE_ATOMIC_OR">;
1023defm : ImageAtomicPatterns<int_amdgcn_image_atomic_xor, "IMAGE_ATOMIC_XOR">;
1024defm : ImageAtomicPatterns<int_amdgcn_image_atomic_inc, "IMAGE_ATOMIC_INC">;
1025defm : ImageAtomicPatterns<int_amdgcn_image_atomic_dec, "IMAGE_ATOMIC_DEC">;