blob: c49691c43427b99f46fbbcb79303aa11cd01e22a [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
10class MIMG_Mask <string op, int channels> {
11 string Op = op;
12 int Channels = channels;
13}
14
15class mimg <bits<7> si, bits<7> vi = si> {
16 field bits<7> SI = si;
17 field bits<7> VI = vi;
18}
19
20class MIMG_Helper <dag outs, dag ins, string asm,
21 string dns=""> : MIMG<outs, ins, asm,[]> {
22 let mayLoad = 1;
23 let mayStore = 0;
24 let hasPostISelHook = 1;
25 let DecoderNamespace = dns;
26 let isAsmParserOnly = !if(!eq(dns,""), 1, 0);
27 let AsmMatchConverter = "cvtMIMG";
Tom Stellard244891d2016-12-20 15:52:17 +000028 let usesCustomInserter = 1;
Marek Olsakb83f5c92017-07-04 14:43:38 +000029 let SchedRW = [WriteVMEM];
Changpeng Fangb28fe032016-09-01 17:54:54 +000030}
31
32class MIMG_NoSampler_Helper <bits<7> op, string asm,
33 RegisterClass dst_rc,
34 RegisterClass addr_rc,
Changpeng Fang4737e892018-01-18 22:08:53 +000035 bit d16_bit=0,
Changpeng Fangb28fe032016-09-01 17:54:54 +000036 string dns=""> : MIMG_Helper <
37 (outs dst_rc:$vdata),
38 (ins addr_rc:$vaddr, SReg_256:$srsrc,
Matt Arsenault4b6a6cc2016-10-28 21:55:08 +000039 dmask:$dmask, unorm:$unorm, GLC:$glc, slc:$slc,
Changpeng Fangb28fe032016-09-01 17:54:54 +000040 r128:$r128, tfe:$tfe, lwe:$lwe, da:$da),
Changpeng Fang4737e892018-01-18 22:08:53 +000041 asm#" $vdata, $vaddr, $srsrc$dmask$unorm$glc$slc$r128$tfe$lwe$da"#!if(d16_bit, " d16", ""),
Changpeng Fangb28fe032016-09-01 17:54:54 +000042 dns>, MIMGe<op> {
43 let ssamp = 0;
Changpeng Fang4737e892018-01-18 22:08:53 +000044 let D16 = d16;
45}
46
47multiclass MIMG_NoSampler_Src_Helper_Helper <bits<7> op, string asm,
48 RegisterClass dst_rc,
49 int channels, bit d16_bit,
50 string suffix> {
51 def _V1 # suffix : MIMG_NoSampler_Helper <op, asm, dst_rc, VGPR_32, d16_bit,
52 !if(!eq(channels, 1), "AMDGPU", "")>,
53 MIMG_Mask<asm#"_V1"#suffix, channels>;
54 def _V2 # suffix : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_64, d16_bit>,
55 MIMG_Mask<asm#"_V2"#suffix, channels>;
56 def _V4 # suffix : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_128, d16_bit>,
57 MIMG_Mask<asm#"_V4"#suffix, channels>;
Changpeng Fangb28fe032016-09-01 17:54:54 +000058}
59
60multiclass MIMG_NoSampler_Src_Helper <bits<7> op, string asm,
61 RegisterClass dst_rc,
62 int channels> {
Changpeng Fang4737e892018-01-18 22:08:53 +000063 defm : MIMG_NoSampler_Src_Helper_Helper <op, asm, dst_rc, channels, 0, "">;
64
65 let d16 = 1 in {
66 let SubtargetPredicate = HasPackedD16VMem in {
67 defm : MIMG_NoSampler_Src_Helper_Helper <op, asm, dst_rc, channels, 1, "_D16">;
68 } // End HasPackedD16VMem.
69
70 let SubtargetPredicate = HasUnpackedD16VMem, DecoderNamespace = "GFX80_UNPACKED" in {
71 defm : MIMG_NoSampler_Src_Helper_Helper <op, asm, dst_rc, channels, 1, "_D16_gfx80">;
72 } // End HasUnpackedD16VMem.
73 } // End d16 = 1.
Changpeng Fangb28fe032016-09-01 17:54:54 +000074}
75
76multiclass MIMG_NoSampler <bits<7> op, string asm> {
77 defm _V1 : MIMG_NoSampler_Src_Helper <op, asm, VGPR_32, 1>;
78 defm _V2 : MIMG_NoSampler_Src_Helper <op, asm, VReg_64, 2>;
79 defm _V3 : MIMG_NoSampler_Src_Helper <op, asm, VReg_96, 3>;
80 defm _V4 : MIMG_NoSampler_Src_Helper <op, asm, VReg_128, 4>;
81}
82
83class MIMG_Store_Helper <bits<7> op, string asm,
84 RegisterClass data_rc,
Matt Arsenaultcad7fa82017-12-13 21:07:51 +000085 RegisterClass addr_rc,
Changpeng Fang4737e892018-01-18 22:08:53 +000086 bit d16_bit=0,
Matt Arsenaultcad7fa82017-12-13 21:07:51 +000087 string dns = ""> : MIMG_Helper <
Changpeng Fangb28fe032016-09-01 17:54:54 +000088 (outs),
89 (ins data_rc:$vdata, addr_rc:$vaddr, SReg_256:$srsrc,
Matt Arsenault4b6a6cc2016-10-28 21:55:08 +000090 dmask:$dmask, unorm:$unorm, GLC:$glc, slc:$slc,
Changpeng Fangb28fe032016-09-01 17:54:54 +000091 r128:$r128, tfe:$tfe, lwe:$lwe, da:$da),
Changpeng Fang4737e892018-01-18 22:08:53 +000092 asm#" $vdata, $vaddr, $srsrc$dmask$unorm$glc$slc$r128$tfe$lwe$da"#!if(d16_bit, " d16", ""), dns>, MIMGe<op> {
Changpeng Fangb28fe032016-09-01 17:54:54 +000093 let ssamp = 0;
Matt Arsenaultd94b63d2017-12-29 17:18:18 +000094 let mayLoad = 0;
Changpeng Fangb28fe032016-09-01 17:54:54 +000095 let mayStore = 1;
Matt Arsenaultd94b63d2017-12-29 17:18:18 +000096 let hasSideEffects = 0;
Changpeng Fangb28fe032016-09-01 17:54:54 +000097 let hasPostISelHook = 0;
98 let DisableWQM = 1;
Changpeng Fang4737e892018-01-18 22:08:53 +000099 let D16 = d16;
100}
101
102multiclass MIMG_Store_Addr_Helper_Helper <bits<7> op, string asm,
103 RegisterClass data_rc,
104 int channels, bit d16_bit,
105 string suffix> {
106 def _V1 # suffix : MIMG_Store_Helper <op, asm, data_rc, VGPR_32, d16_bit,
107 !if(!eq(channels, 1), "AMDGPU", "")>,
108 MIMG_Mask<asm#"_V1"#suffix, channels>;
109 def _V2 # suffix : MIMG_Store_Helper <op, asm, data_rc, VReg_64, d16_bit>,
110 MIMG_Mask<asm#"_V2"#suffix, channels>;
111 def _V4 # suffix : MIMG_Store_Helper <op, asm, data_rc, VReg_128, d16_bit>,
112 MIMG_Mask<asm#"_V4"#suffix, channels>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000113}
114
115multiclass MIMG_Store_Addr_Helper <bits<7> op, string asm,
116 RegisterClass data_rc,
117 int channels> {
Changpeng Fang4737e892018-01-18 22:08:53 +0000118 defm : MIMG_Store_Addr_Helper_Helper <op, asm, data_rc, channels, 0, "">;
119
120 let d16 = 1 in {
121 let SubtargetPredicate = HasPackedD16VMem in {
122 defm : MIMG_Store_Addr_Helper_Helper <op, asm, data_rc, channels, 1, "_D16">;
123 } // End HasPackedD16VMem.
124
125 let SubtargetPredicate = HasUnpackedD16VMem, DecoderNamespace = "GFX80_UNPACKED" in {
126 defm : MIMG_Store_Addr_Helper_Helper <op, asm, data_rc, channels, 1, "_D16_gfx80">;
127 } // End HasUnpackedD16VMem.
128 } // End d16 = 1.
Changpeng Fangb28fe032016-09-01 17:54:54 +0000129}
130
131multiclass MIMG_Store <bits<7> op, string asm> {
132 defm _V1 : MIMG_Store_Addr_Helper <op, asm, VGPR_32, 1>;
133 defm _V2 : MIMG_Store_Addr_Helper <op, asm, VReg_64, 2>;
134 defm _V3 : MIMG_Store_Addr_Helper <op, asm, VReg_96, 3>;
135 defm _V4 : MIMG_Store_Addr_Helper <op, asm, VReg_128, 4>;
136}
137
138class MIMG_Atomic_Helper <string asm, RegisterClass data_rc,
Dmitry Preobrazhensky6cb42e72018-01-26 14:07:38 +0000139 RegisterClass addr_rc, string dns="",
140 bit enableDasm = 0> : MIMG_Helper <
Changpeng Fangb28fe032016-09-01 17:54:54 +0000141 (outs data_rc:$vdst),
142 (ins data_rc:$vdata, addr_rc:$vaddr, SReg_256:$srsrc,
Matt Arsenault4b6a6cc2016-10-28 21:55:08 +0000143 dmask:$dmask, unorm:$unorm, GLC:$glc, slc:$slc,
Changpeng Fangb28fe032016-09-01 17:54:54 +0000144 r128:$r128, tfe:$tfe, lwe:$lwe, da:$da),
Dmitry Preobrazhensky6cb42e72018-01-26 14:07:38 +0000145 asm#" $vdst, $vaddr, $srsrc$dmask$unorm$glc$slc$r128$tfe$lwe$da",
146 !if(enableDasm, dns, "")> {
Matt Arsenaultd94b63d2017-12-29 17:18:18 +0000147 let mayLoad = 1;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000148 let mayStore = 1;
Matt Arsenaultd94b63d2017-12-29 17:18:18 +0000149 let hasSideEffects = 1; // FIXME: Remove this
Changpeng Fangb28fe032016-09-01 17:54:54 +0000150 let hasPostISelHook = 0;
151 let DisableWQM = 1;
152 let Constraints = "$vdst = $vdata";
153 let AsmMatchConverter = "cvtMIMGAtomic";
154}
155
156class MIMG_Atomic_Real_si<mimg op, string name, string asm,
Dmitry Preobrazhensky6cb42e72018-01-26 14:07:38 +0000157 RegisterClass data_rc, RegisterClass addr_rc, bit enableDasm> :
158 MIMG_Atomic_Helper<asm, data_rc, addr_rc, "SICI", enableDasm>,
Changpeng Fangb28fe032016-09-01 17:54:54 +0000159 SIMCInstr<name, SIEncodingFamily.SI>,
160 MIMGe<op.SI> {
161 let isCodeGenOnly = 0;
162 let AssemblerPredicates = [isSICI];
Changpeng Fangb28fe032016-09-01 17:54:54 +0000163 let DisableDecoder = DisableSIDecoder;
164}
165
166class MIMG_Atomic_Real_vi<mimg op, string name, string asm,
Dmitry Preobrazhensky6cb42e72018-01-26 14:07:38 +0000167 RegisterClass data_rc, RegisterClass addr_rc, bit enableDasm> :
168 MIMG_Atomic_Helper<asm, data_rc, addr_rc, "VI", enableDasm>,
Changpeng Fangb28fe032016-09-01 17:54:54 +0000169 SIMCInstr<name, SIEncodingFamily.VI>,
170 MIMGe<op.VI> {
171 let isCodeGenOnly = 0;
172 let AssemblerPredicates = [isVI];
Changpeng Fangb28fe032016-09-01 17:54:54 +0000173 let DisableDecoder = DisableVIDecoder;
174}
175
176multiclass MIMG_Atomic_Helper_m <mimg op, string name, string asm,
Dmitry Preobrazhensky6cb42e72018-01-26 14:07:38 +0000177 RegisterClass data_rc,
178 RegisterClass addr_rc,
179 bit enableDasm = 0> {
Changpeng Fangb28fe032016-09-01 17:54:54 +0000180 let isPseudo = 1, isCodeGenOnly = 1 in {
181 def "" : MIMG_Atomic_Helper<asm, data_rc, addr_rc>,
182 SIMCInstr<name, SIEncodingFamily.NONE>;
183 }
184
185 let ssamp = 0 in {
Dmitry Preobrazhensky6cb42e72018-01-26 14:07:38 +0000186 def _si : MIMG_Atomic_Real_si<op, name, asm, data_rc, addr_rc, enableDasm>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000187
Dmitry Preobrazhensky6cb42e72018-01-26 14:07:38 +0000188 def _vi : MIMG_Atomic_Real_vi<op, name, asm, data_rc, addr_rc, enableDasm>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000189 }
190}
191
192multiclass MIMG_Atomic <mimg op, string asm, RegisterClass data_rc = VGPR_32> {
Dmitry Preobrazhensky6cb42e72018-01-26 14:07:38 +0000193 // _V* variants have different address size, but the size is not encoded.
194 // So only one variant can be disassembled. V1 looks the safest to decode.
195 defm _V1 : MIMG_Atomic_Helper_m <op, asm # "_V1", asm, data_rc, VGPR_32, 1>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000196 defm _V2 : MIMG_Atomic_Helper_m <op, asm # "_V2", asm, data_rc, VReg_64>;
197 defm _V4 : MIMG_Atomic_Helper_m <op, asm # "_V3", asm, data_rc, VReg_128>;
198}
199
200class MIMG_Sampler_Helper <bits<7> op, string asm,
201 RegisterClass dst_rc,
202 RegisterClass src_rc,
Sam Koltonc01faa32016-11-15 13:39:07 +0000203 bit wqm,
Changpeng Fang4737e892018-01-18 22:08:53 +0000204 bit d16_bit=0,
Changpeng Fangb28fe032016-09-01 17:54:54 +0000205 string dns=""> : MIMG_Helper <
206 (outs dst_rc:$vdata),
207 (ins src_rc:$vaddr, SReg_256:$srsrc, SReg_128:$ssamp,
Matt Arsenault4b6a6cc2016-10-28 21:55:08 +0000208 dmask:$dmask, unorm:$unorm, GLC:$glc, slc:$slc,
Changpeng Fangb28fe032016-09-01 17:54:54 +0000209 r128:$r128, tfe:$tfe, lwe:$lwe, da:$da),
Changpeng Fang4737e892018-01-18 22:08:53 +0000210 asm#" $vdata, $vaddr, $srsrc, $ssamp$dmask$unorm$glc$slc$r128$tfe$lwe$da"#!if(d16_bit, " d16", ""),
Changpeng Fangb28fe032016-09-01 17:54:54 +0000211 dns>, MIMGe<op> {
212 let WQM = wqm;
Changpeng Fang4737e892018-01-18 22:08:53 +0000213 let D16 = d16;
214}
215
216multiclass MIMG_Sampler_Src_Helper_Helper <bits<7> op, string asm,
217 RegisterClass dst_rc,
218 int channels, bit wqm,
219 bit d16_bit, string suffix> {
220 def _V1 # suffix : MIMG_Sampler_Helper <op, asm, dst_rc, VGPR_32, wqm, d16_bit,
221 !if(!eq(channels, 1), "AMDGPU", "")>,
222 MIMG_Mask<asm#"_V1"#suffix, channels>;
223 def _V2 # suffix : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_64, wqm, d16_bit>,
224 MIMG_Mask<asm#"_V2"#suffix, channels>;
225 def _V4 # suffix : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_128, wqm, d16_bit>,
226 MIMG_Mask<asm#"_V4"#suffix, channels>;
227 def _V8 # suffix : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_256, wqm, d16_bit>,
228 MIMG_Mask<asm#"_V8"#suffix, channels>;
229 def _V16 # suffix : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_512, wqm, d16_bit>,
230 MIMG_Mask<asm#"_V16"#suffix, channels>;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000231}
232
233multiclass MIMG_Sampler_Src_Helper <bits<7> op, string asm,
234 RegisterClass dst_rc,
Sam Koltonc01faa32016-11-15 13:39:07 +0000235 int channels, bit wqm> {
Changpeng Fang4737e892018-01-18 22:08:53 +0000236 defm : MIMG_Sampler_Src_Helper_Helper <op, asm, dst_rc, channels, wqm, 0, "">;
237
238 let d16 = 1 in {
239 let SubtargetPredicate = HasPackedD16VMem in {
240 defm : MIMG_Sampler_Src_Helper_Helper <op, asm, dst_rc, channels, wqm, 1, "_D16">;
241 } // End HasPackedD16VMem.
242
243 let SubtargetPredicate = HasUnpackedD16VMem, DecoderNamespace = "GFX80_UNPACKED" in {
244 defm : MIMG_Sampler_Src_Helper_Helper <op, asm, dst_rc, channels, wqm, 1, "_D16_gfx80">;
245 } // End HasUnpackedD16VMem.
246 } // End d16 = 1.
Changpeng Fangb28fe032016-09-01 17:54:54 +0000247}
248
Sam Koltonc01faa32016-11-15 13:39:07 +0000249multiclass MIMG_Sampler <bits<7> op, string asm, bit wqm=0> {
Changpeng Fangb28fe032016-09-01 17:54:54 +0000250 defm _V1 : MIMG_Sampler_Src_Helper<op, asm, VGPR_32, 1, wqm>;
251 defm _V2 : MIMG_Sampler_Src_Helper<op, asm, VReg_64, 2, wqm>;
252 defm _V3 : MIMG_Sampler_Src_Helper<op, asm, VReg_96, 3, wqm>;
253 defm _V4 : MIMG_Sampler_Src_Helper<op, asm, VReg_128, 4, wqm>;
254}
255
256multiclass MIMG_Sampler_WQM <bits<7> op, string asm> : MIMG_Sampler<op, asm, 1>;
257
258class MIMG_Gather_Helper <bits<7> op, string asm,
259 RegisterClass dst_rc,
Changpeng Fang4737e892018-01-18 22:08:53 +0000260 RegisterClass src_rc, bit wqm, bit d16_bit=0> : MIMG <
Changpeng Fangb28fe032016-09-01 17:54:54 +0000261 (outs dst_rc:$vdata),
262 (ins src_rc:$vaddr, SReg_256:$srsrc, SReg_128:$ssamp,
Matt Arsenault4b6a6cc2016-10-28 21:55:08 +0000263 dmask:$dmask, unorm:$unorm, GLC:$glc, slc:$slc,
Changpeng Fangb28fe032016-09-01 17:54:54 +0000264 r128:$r128, tfe:$tfe, lwe:$lwe, da:$da),
Changpeng Fang4737e892018-01-18 22:08:53 +0000265 asm#" $vdata, $vaddr, $srsrc, $ssamp$dmask$unorm$glc$slc$r128$tfe$lwe$da"#!if(d16_bit, " d16", ""),
Changpeng Fangb28fe032016-09-01 17:54:54 +0000266 []>, MIMGe<op> {
267 let mayLoad = 1;
268 let mayStore = 0;
269
270 // DMASK was repurposed for GATHER4. 4 components are always
271 // returned and DMASK works like a swizzle - it selects
272 // the component to fetch. The only useful DMASK values are
273 // 1=red, 2=green, 4=blue, 8=alpha. (e.g. 1 returns
274 // (red,red,red,red) etc.) The ISA document doesn't mention
275 // this.
276 // Therefore, disable all code which updates DMASK by setting this:
277 let Gather4 = 1;
278 let hasPostISelHook = 0;
279 let WQM = wqm;
Changpeng Fang4737e892018-01-18 22:08:53 +0000280 let D16 = d16;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000281
282 let isAsmParserOnly = 1; // TBD: fix it later
283}
284
Changpeng Fang4737e892018-01-18 22:08:53 +0000285
286multiclass MIMG_Gather_Src_Helper_Helper <bits<7> op, string asm,
287 RegisterClass dst_rc,
288 int channels, bit wqm,
289 bit d16_bit, string suffix> {
290 def _V1 # suffix : MIMG_Gather_Helper <op, asm, dst_rc, VGPR_32, wqm, d16_bit>,
291 MIMG_Mask<asm#"_V1"#suffix, channels>;
292 def _V2 # suffix : MIMG_Gather_Helper <op, asm, dst_rc, VReg_64, wqm, d16_bit>,
293 MIMG_Mask<asm#"_V2"#suffix, channels>;
294 def _V4 # suffix : MIMG_Gather_Helper <op, asm, dst_rc, VReg_128, wqm, d16_bit>,
295 MIMG_Mask<asm#"_V4"#suffix, channels>;
296 def _V8 # suffix : MIMG_Gather_Helper <op, asm, dst_rc, VReg_256, wqm, d16_bit>,
297 MIMG_Mask<asm#"_V8"#suffix, channels>;
298 def _V16 # suffix : MIMG_Gather_Helper <op, asm, dst_rc, VReg_512, wqm, d16_bit>,
299 MIMG_Mask<asm#"_V16"#suffix, channels>;
300}
301
Changpeng Fangb28fe032016-09-01 17:54:54 +0000302multiclass MIMG_Gather_Src_Helper <bits<7> op, string asm,
303 RegisterClass dst_rc,
Sam Koltonc01faa32016-11-15 13:39:07 +0000304 int channels, bit wqm> {
Changpeng Fang4737e892018-01-18 22:08:53 +0000305 defm : MIMG_Gather_Src_Helper_Helper<op, asm, dst_rc, channels, wqm, 0, "">;
306
307 let d16 = 1 in {
308 let SubtargetPredicate = HasPackedD16VMem in {
309 defm : MIMG_Gather_Src_Helper_Helper<op, asm, dst_rc, channels, wqm, 1, "_D16">;
310 } // End HasPackedD16VMem.
311
312 let SubtargetPredicate = HasUnpackedD16VMem, DecoderNamespace = "GFX80_UNPACKED" in {
313 defm : MIMG_Gather_Src_Helper_Helper<op, asm, dst_rc, channels, wqm, 1, "_D16_gfx80">;
314 } // End HasUnpackedD16VMem.
315 } // End d16 = 1.
Changpeng Fangb28fe032016-09-01 17:54:54 +0000316}
317
Sam Koltonc01faa32016-11-15 13:39:07 +0000318multiclass MIMG_Gather <bits<7> op, string asm, bit wqm=0> {
Changpeng Fangb28fe032016-09-01 17:54:54 +0000319 defm _V1 : MIMG_Gather_Src_Helper<op, asm, VGPR_32, 1, wqm>;
320 defm _V2 : MIMG_Gather_Src_Helper<op, asm, VReg_64, 2, wqm>;
321 defm _V3 : MIMG_Gather_Src_Helper<op, asm, VReg_96, 3, wqm>;
322 defm _V4 : MIMG_Gather_Src_Helper<op, asm, VReg_128, 4, wqm>;
323}
324
325multiclass MIMG_Gather_WQM <bits<7> op, string asm> : MIMG_Gather<op, asm, 1>;
326
327//===----------------------------------------------------------------------===//
328// MIMG Instructions
329//===----------------------------------------------------------------------===//
330let SubtargetPredicate = isGCN in {
331defm IMAGE_LOAD : MIMG_NoSampler <0x00000000, "image_load">;
332defm IMAGE_LOAD_MIP : MIMG_NoSampler <0x00000001, "image_load_mip">;
333//def IMAGE_LOAD_PCK : MIMG_NoPattern_ <"image_load_pck", 0x00000002>;
334//def IMAGE_LOAD_PCK_SGN : MIMG_NoPattern_ <"image_load_pck_sgn", 0x00000003>;
335//def IMAGE_LOAD_MIP_PCK : MIMG_NoPattern_ <"image_load_mip_pck", 0x00000004>;
336//def IMAGE_LOAD_MIP_PCK_SGN : MIMG_NoPattern_ <"image_load_mip_pck_sgn", 0x00000005>;
337defm IMAGE_STORE : MIMG_Store <0x00000008, "image_store">;
338defm IMAGE_STORE_MIP : MIMG_Store <0x00000009, "image_store_mip">;
339//def IMAGE_STORE_PCK : MIMG_NoPattern_ <"image_store_pck", 0x0000000a>;
340//def IMAGE_STORE_MIP_PCK : MIMG_NoPattern_ <"image_store_mip_pck", 0x0000000b>;
Matt Arsenault856777d2017-12-08 20:00:57 +0000341
342let mayLoad = 0, mayStore = 0 in {
Changpeng Fangb28fe032016-09-01 17:54:54 +0000343defm IMAGE_GET_RESINFO : MIMG_NoSampler <0x0000000e, "image_get_resinfo">;
Matt Arsenault856777d2017-12-08 20:00:57 +0000344}
345
Changpeng Fangb28fe032016-09-01 17:54:54 +0000346defm IMAGE_ATOMIC_SWAP : MIMG_Atomic <mimg<0x0f, 0x10>, "image_atomic_swap">;
347defm IMAGE_ATOMIC_CMPSWAP : MIMG_Atomic <mimg<0x10, 0x11>, "image_atomic_cmpswap", VReg_64>;
348defm IMAGE_ATOMIC_ADD : MIMG_Atomic <mimg<0x11, 0x12>, "image_atomic_add">;
349defm IMAGE_ATOMIC_SUB : MIMG_Atomic <mimg<0x12, 0x13>, "image_atomic_sub">;
350//def IMAGE_ATOMIC_RSUB : MIMG_NoPattern_ <"image_atomic_rsub", 0x00000013>; -- not on VI
351defm IMAGE_ATOMIC_SMIN : MIMG_Atomic <mimg<0x14>, "image_atomic_smin">;
352defm IMAGE_ATOMIC_UMIN : MIMG_Atomic <mimg<0x15>, "image_atomic_umin">;
353defm IMAGE_ATOMIC_SMAX : MIMG_Atomic <mimg<0x16>, "image_atomic_smax">;
354defm IMAGE_ATOMIC_UMAX : MIMG_Atomic <mimg<0x17>, "image_atomic_umax">;
355defm IMAGE_ATOMIC_AND : MIMG_Atomic <mimg<0x18>, "image_atomic_and">;
356defm IMAGE_ATOMIC_OR : MIMG_Atomic <mimg<0x19>, "image_atomic_or">;
357defm IMAGE_ATOMIC_XOR : MIMG_Atomic <mimg<0x1a>, "image_atomic_xor">;
358defm IMAGE_ATOMIC_INC : MIMG_Atomic <mimg<0x1b>, "image_atomic_inc">;
359defm IMAGE_ATOMIC_DEC : MIMG_Atomic <mimg<0x1c>, "image_atomic_dec">;
360//def IMAGE_ATOMIC_FCMPSWAP : MIMG_NoPattern_ <"image_atomic_fcmpswap", 0x0000001d>; -- not on VI
361//def IMAGE_ATOMIC_FMIN : MIMG_NoPattern_ <"image_atomic_fmin", 0x0000001e>; -- not on VI
362//def IMAGE_ATOMIC_FMAX : MIMG_NoPattern_ <"image_atomic_fmax", 0x0000001f>; -- not on VI
363defm IMAGE_SAMPLE : MIMG_Sampler_WQM <0x00000020, "image_sample">;
364defm IMAGE_SAMPLE_CL : MIMG_Sampler_WQM <0x00000021, "image_sample_cl">;
365defm IMAGE_SAMPLE_D : MIMG_Sampler <0x00000022, "image_sample_d">;
366defm IMAGE_SAMPLE_D_CL : MIMG_Sampler <0x00000023, "image_sample_d_cl">;
367defm IMAGE_SAMPLE_L : MIMG_Sampler <0x00000024, "image_sample_l">;
368defm IMAGE_SAMPLE_B : MIMG_Sampler_WQM <0x00000025, "image_sample_b">;
369defm IMAGE_SAMPLE_B_CL : MIMG_Sampler_WQM <0x00000026, "image_sample_b_cl">;
370defm IMAGE_SAMPLE_LZ : MIMG_Sampler <0x00000027, "image_sample_lz">;
371defm IMAGE_SAMPLE_C : MIMG_Sampler_WQM <0x00000028, "image_sample_c">;
372defm IMAGE_SAMPLE_C_CL : MIMG_Sampler_WQM <0x00000029, "image_sample_c_cl">;
373defm IMAGE_SAMPLE_C_D : MIMG_Sampler <0x0000002a, "image_sample_c_d">;
374defm IMAGE_SAMPLE_C_D_CL : MIMG_Sampler <0x0000002b, "image_sample_c_d_cl">;
375defm IMAGE_SAMPLE_C_L : MIMG_Sampler <0x0000002c, "image_sample_c_l">;
376defm IMAGE_SAMPLE_C_B : MIMG_Sampler_WQM <0x0000002d, "image_sample_c_b">;
377defm IMAGE_SAMPLE_C_B_CL : MIMG_Sampler_WQM <0x0000002e, "image_sample_c_b_cl">;
378defm IMAGE_SAMPLE_C_LZ : MIMG_Sampler <0x0000002f, "image_sample_c_lz">;
379defm IMAGE_SAMPLE_O : MIMG_Sampler_WQM <0x00000030, "image_sample_o">;
380defm IMAGE_SAMPLE_CL_O : MIMG_Sampler_WQM <0x00000031, "image_sample_cl_o">;
381defm IMAGE_SAMPLE_D_O : MIMG_Sampler <0x00000032, "image_sample_d_o">;
382defm IMAGE_SAMPLE_D_CL_O : MIMG_Sampler <0x00000033, "image_sample_d_cl_o">;
383defm IMAGE_SAMPLE_L_O : MIMG_Sampler <0x00000034, "image_sample_l_o">;
384defm IMAGE_SAMPLE_B_O : MIMG_Sampler_WQM <0x00000035, "image_sample_b_o">;
385defm IMAGE_SAMPLE_B_CL_O : MIMG_Sampler_WQM <0x00000036, "image_sample_b_cl_o">;
386defm IMAGE_SAMPLE_LZ_O : MIMG_Sampler <0x00000037, "image_sample_lz_o">;
387defm IMAGE_SAMPLE_C_O : MIMG_Sampler_WQM <0x00000038, "image_sample_c_o">;
388defm IMAGE_SAMPLE_C_CL_O : MIMG_Sampler_WQM <0x00000039, "image_sample_c_cl_o">;
389defm IMAGE_SAMPLE_C_D_O : MIMG_Sampler <0x0000003a, "image_sample_c_d_o">;
390defm IMAGE_SAMPLE_C_D_CL_O : MIMG_Sampler <0x0000003b, "image_sample_c_d_cl_o">;
391defm IMAGE_SAMPLE_C_L_O : MIMG_Sampler <0x0000003c, "image_sample_c_l_o">;
392defm IMAGE_SAMPLE_C_B_O : MIMG_Sampler_WQM <0x0000003d, "image_sample_c_b_o">;
393defm IMAGE_SAMPLE_C_B_CL_O : MIMG_Sampler_WQM <0x0000003e, "image_sample_c_b_cl_o">;
394defm IMAGE_SAMPLE_C_LZ_O : MIMG_Sampler <0x0000003f, "image_sample_c_lz_o">;
395defm IMAGE_GATHER4 : MIMG_Gather_WQM <0x00000040, "image_gather4">;
396defm IMAGE_GATHER4_CL : MIMG_Gather_WQM <0x00000041, "image_gather4_cl">;
397defm IMAGE_GATHER4_L : MIMG_Gather <0x00000044, "image_gather4_l">;
398defm IMAGE_GATHER4_B : MIMG_Gather_WQM <0x00000045, "image_gather4_b">;
399defm IMAGE_GATHER4_B_CL : MIMG_Gather_WQM <0x00000046, "image_gather4_b_cl">;
400defm IMAGE_GATHER4_LZ : MIMG_Gather <0x00000047, "image_gather4_lz">;
401defm IMAGE_GATHER4_C : MIMG_Gather_WQM <0x00000048, "image_gather4_c">;
402defm IMAGE_GATHER4_C_CL : MIMG_Gather_WQM <0x00000049, "image_gather4_c_cl">;
403defm IMAGE_GATHER4_C_L : MIMG_Gather <0x0000004c, "image_gather4_c_l">;
404defm IMAGE_GATHER4_C_B : MIMG_Gather_WQM <0x0000004d, "image_gather4_c_b">;
405defm IMAGE_GATHER4_C_B_CL : MIMG_Gather_WQM <0x0000004e, "image_gather4_c_b_cl">;
406defm IMAGE_GATHER4_C_LZ : MIMG_Gather <0x0000004f, "image_gather4_c_lz">;
407defm IMAGE_GATHER4_O : MIMG_Gather_WQM <0x00000050, "image_gather4_o">;
408defm IMAGE_GATHER4_CL_O : MIMG_Gather_WQM <0x00000051, "image_gather4_cl_o">;
409defm IMAGE_GATHER4_L_O : MIMG_Gather <0x00000054, "image_gather4_l_o">;
410defm IMAGE_GATHER4_B_O : MIMG_Gather_WQM <0x00000055, "image_gather4_b_o">;
411defm IMAGE_GATHER4_B_CL_O : MIMG_Gather <0x00000056, "image_gather4_b_cl_o">;
412defm IMAGE_GATHER4_LZ_O : MIMG_Gather <0x00000057, "image_gather4_lz_o">;
413defm IMAGE_GATHER4_C_O : MIMG_Gather_WQM <0x00000058, "image_gather4_c_o">;
414defm IMAGE_GATHER4_C_CL_O : MIMG_Gather_WQM <0x00000059, "image_gather4_c_cl_o">;
415defm IMAGE_GATHER4_C_L_O : MIMG_Gather <0x0000005c, "image_gather4_c_l_o">;
416defm IMAGE_GATHER4_C_B_O : MIMG_Gather_WQM <0x0000005d, "image_gather4_c_b_o">;
417defm IMAGE_GATHER4_C_B_CL_O : MIMG_Gather_WQM <0x0000005e, "image_gather4_c_b_cl_o">;
418defm IMAGE_GATHER4_C_LZ_O : MIMG_Gather <0x0000005f, "image_gather4_c_lz_o">;
Matt Arsenault856777d2017-12-08 20:00:57 +0000419
420let mayLoad = 0, mayStore = 0 in {
Changpeng Fangb28fe032016-09-01 17:54:54 +0000421defm IMAGE_GET_LOD : MIMG_Sampler_WQM <0x00000060, "image_get_lod">;
Matt Arsenault856777d2017-12-08 20:00:57 +0000422}
423
Changpeng Fangb28fe032016-09-01 17:54:54 +0000424defm IMAGE_SAMPLE_CD : MIMG_Sampler <0x00000068, "image_sample_cd">;
425defm IMAGE_SAMPLE_CD_CL : MIMG_Sampler <0x00000069, "image_sample_cd_cl">;
426defm IMAGE_SAMPLE_C_CD : MIMG_Sampler <0x0000006a, "image_sample_c_cd">;
427defm IMAGE_SAMPLE_C_CD_CL : MIMG_Sampler <0x0000006b, "image_sample_c_cd_cl">;
428defm IMAGE_SAMPLE_CD_O : MIMG_Sampler <0x0000006c, "image_sample_cd_o">;
429defm IMAGE_SAMPLE_CD_CL_O : MIMG_Sampler <0x0000006d, "image_sample_cd_cl_o">;
430defm IMAGE_SAMPLE_C_CD_O : MIMG_Sampler <0x0000006e, "image_sample_c_cd_o">;
431defm IMAGE_SAMPLE_C_CD_CL_O : MIMG_Sampler <0x0000006f, "image_sample_c_cd_cl_o">;
432//def IMAGE_RSRC256 : MIMG_NoPattern_RSRC256 <"image_rsrc256", 0x0000007e>;
433//def IMAGE_SAMPLER : MIMG_NoPattern_ <"image_sampler", 0x0000007f>;
434}
435
436/********** ======================= **********/
437/********** Image sampling patterns **********/
438/********** ======================= **********/
439
Changpeng Fang4737e892018-01-18 22:08:53 +0000440// ImageSample for amdgcn
Changpeng Fangb28fe032016-09-01 17:54:54 +0000441// TODO:
Changpeng Fang4737e892018-01-18 22:08:53 +0000442// 1. Handle v4i32 rsrc type (Register Class for the instruction to be SReg_128).
443// 2. Add A16 support when we pass address of half type.
444multiclass ImageSamplePattern<SDPatternOperator name, MIMG opcode, ValueType dt, ValueType vt> {
Matt Arsenault90c75932017-10-03 00:06:41 +0000445 def : GCNPat<
Changpeng Fang8236fe12016-11-14 18:33:18 +0000446 (dt (name vt:$addr, v8i32:$rsrc, v4i32:$sampler, i32:$dmask, i1:$unorm, i1:$glc,
Changpeng Fangb28fe032016-09-01 17:54:54 +0000447 i1:$slc, i1:$lwe, i1:$da)),
448 (opcode $addr, $rsrc, $sampler,
449 (as_i32imm $dmask), (as_i1imm $unorm), (as_i1imm $glc), (as_i1imm $slc),
450 0, 0, (as_i1imm $lwe), (as_i1imm $da))
451 >;
452}
453
Changpeng Fang4737e892018-01-18 22:08:53 +0000454multiclass ImageSampleDataPatterns<SDPatternOperator name, string opcode, ValueType dt, string suffix = ""> {
455 defm : ImageSamplePattern<name, !cast<MIMG>(opcode # _V1 # suffix), dt, f32>;
456 defm : ImageSamplePattern<name, !cast<MIMG>(opcode # _V2 # suffix), dt, v2f32>;
457 defm : ImageSamplePattern<name, !cast<MIMG>(opcode # _V4 # suffix), dt, v4f32>;
458 defm : ImageSamplePattern<name, !cast<MIMG>(opcode # _V8 # suffix), dt, v8f32>;
459 defm : ImageSamplePattern<name, !cast<MIMG>(opcode # _V16 # suffix), dt, v16f32>;
Changpeng Fang8236fe12016-11-14 18:33:18 +0000460}
461
Changpeng Fang4737e892018-01-18 22:08:53 +0000462// ImageSample patterns.
463multiclass ImageSamplePatterns<SDPatternOperator name, string opcode> {
464 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V1), f32>;
465 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V2), v2f32>;
466 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V4), v4f32>;
467
468 let SubtargetPredicate = HasUnpackedD16VMem in {
469 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V1), f16, "_D16_gfx80">;
470 } // End HasUnpackedD16VMem.
471
472 let SubtargetPredicate = HasPackedD16VMem in {
473 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V1), f16, "_D16">;
474 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V1), v2f16, "_D16">;
475 } // End HasPackedD16VMem.
Changpeng Fangb28fe032016-09-01 17:54:54 +0000476}
477
Changpeng Fang4737e892018-01-18 22:08:53 +0000478// ImageSample alternative patterns for illegal vector half Types.
479multiclass ImageSampleAltPatterns<SDPatternOperator name, string opcode> {
480 let SubtargetPredicate = HasUnpackedD16VMem in {
481 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V2), v2i32, "_D16_gfx80">;
482 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V4), v4i32, "_D16_gfx80">;
483 } // End HasUnpackedD16VMem.
Changpeng Fangb28fe032016-09-01 17:54:54 +0000484
Changpeng Fang4737e892018-01-18 22:08:53 +0000485 let SubtargetPredicate = HasPackedD16VMem in {
486 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V1), i32, "_D16">;
487 defm : ImageSampleDataPatterns<name, !cast<string>(opcode # _V2), v2i32, "_D16">;
488 } // End HasPackedD16VMem.
Changpeng Fangb28fe032016-09-01 17:54:54 +0000489}
490
Changpeng Fang4737e892018-01-18 22:08:53 +0000491// ImageLoad for amdgcn.
Changpeng Fang8236fe12016-11-14 18:33:18 +0000492multiclass ImageLoadPattern<SDPatternOperator name, MIMG opcode, ValueType dt, ValueType vt> {
Matt Arsenault90c75932017-10-03 00:06:41 +0000493 def : GCNPat <
Changpeng Fang8236fe12016-11-14 18:33:18 +0000494 (dt (name vt:$addr, v8i32:$rsrc, i32:$dmask, i1:$glc, i1:$slc, i1:$lwe,
Tom Stellardfac248c2016-10-12 16:35:29 +0000495 i1:$da)),
496 (opcode $addr, $rsrc,
Changpeng Fangb28fe032016-09-01 17:54:54 +0000497 (as_i32imm $dmask), 1, (as_i1imm $glc), (as_i1imm $slc),
Tom Stellardfac248c2016-10-12 16:35:29 +0000498 0, 0, (as_i1imm $lwe), (as_i1imm $da))
499 >;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000500}
501
Changpeng Fang4737e892018-01-18 22:08:53 +0000502multiclass ImageLoadDataPatterns<SDPatternOperator name, string opcode, ValueType dt, string suffix = ""> {
503 defm : ImageLoadPattern<name, !cast<MIMG>(opcode # _V1 # suffix), dt, i32>;
504 defm : ImageLoadPattern<name, !cast<MIMG>(opcode # _V2 # suffix), dt, v2i32>;
505 defm : ImageLoadPattern<name, !cast<MIMG>(opcode # _V4 # suffix), dt, v4i32>;
Tom Stellardfac248c2016-10-12 16:35:29 +0000506}
507
Changpeng Fang4737e892018-01-18 22:08:53 +0000508// ImageLoad patterns.
Changpeng Fang8236fe12016-11-14 18:33:18 +0000509// TODO: support v3f32.
510multiclass ImageLoadPatterns<SDPatternOperator name, string opcode> {
511 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V1), f32>;
512 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V2), v2f32>;
513 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V4), v4f32>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000514
515 let SubtargetPredicate = HasUnpackedD16VMem in {
516 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V1), f16, "_D16_gfx80">;
517 } // End HasUnpackedD16VMem.
518
519 let SubtargetPredicate = HasPackedD16VMem in {
520 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V1), f16, "_D16">;
521 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V1), v2f16, "_D16">;
522 } // End HasPackedD16VMem.
Changpeng Fang8236fe12016-11-14 18:33:18 +0000523}
524
Changpeng Fang4737e892018-01-18 22:08:53 +0000525// ImageLoad alternative patterns for illegal vector half Types.
526multiclass ImageLoadAltPatterns<SDPatternOperator name, string opcode> {
527 let SubtargetPredicate = HasUnpackedD16VMem in {
528 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V2), v2i32, "_D16_gfx80">;
529 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V4), v4i32, "_D16_gfx80">;
530 } // End HasUnPackedD16VMem.
531
532 let SubtargetPredicate = HasPackedD16VMem in {
533 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V1), i32, "_D16">;
534 defm : ImageLoadDataPatterns<name, !cast<string>(opcode # _V2), v2i32, "_D16">;
535 } // End HasPackedD16VMem.
536}
537
538// ImageStore for amdgcn.
Changpeng Fang8236fe12016-11-14 18:33:18 +0000539multiclass ImageStorePattern<SDPatternOperator name, MIMG opcode, ValueType dt, ValueType vt> {
Matt Arsenault90c75932017-10-03 00:06:41 +0000540 def : GCNPat <
Changpeng Fang8236fe12016-11-14 18:33:18 +0000541 (name dt:$data, vt:$addr, v8i32:$rsrc, i32:$dmask, i1:$glc, i1:$slc,
Tom Stellardfac248c2016-10-12 16:35:29 +0000542 i1:$lwe, i1:$da),
543 (opcode $data, $addr, $rsrc,
Changpeng Fangb28fe032016-09-01 17:54:54 +0000544 (as_i32imm $dmask), 1, (as_i1imm $glc), (as_i1imm $slc),
Tom Stellardfac248c2016-10-12 16:35:29 +0000545 0, 0, (as_i1imm $lwe), (as_i1imm $da))
546 >;
547}
Changpeng Fangb28fe032016-09-01 17:54:54 +0000548
Changpeng Fang4737e892018-01-18 22:08:53 +0000549multiclass ImageStoreDataPatterns<SDPatternOperator name, string opcode, ValueType dt, string suffix = ""> {
550 defm : ImageStorePattern<name, !cast<MIMG>(opcode # _V1 # suffix), dt, i32>;
551 defm : ImageStorePattern<name, !cast<MIMG>(opcode # _V2 # suffix), dt, v2i32>;
552 defm : ImageStorePattern<name, !cast<MIMG>(opcode # _V4 # suffix), dt, v4i32>;
Changpeng Fang8236fe12016-11-14 18:33:18 +0000553}
554
Changpeng Fang4737e892018-01-18 22:08:53 +0000555// ImageStore patterns.
Changpeng Fang8236fe12016-11-14 18:33:18 +0000556// TODO: support v3f32.
Changpeng Fangb28fe032016-09-01 17:54:54 +0000557multiclass ImageStorePatterns<SDPatternOperator name, string opcode> {
Changpeng Fang8236fe12016-11-14 18:33:18 +0000558 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V1), f32>;
559 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V2), v2f32>;
560 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V4), v4f32>;
Changpeng Fang4737e892018-01-18 22:08:53 +0000561
562 let SubtargetPredicate = HasUnpackedD16VMem in {
563 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V1), f16, "_D16_gfx80">;
564 } // End HasUnpackedD16VMem.
565
566 let SubtargetPredicate = HasPackedD16VMem in {
567 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V1), f16, "_D16">;
568 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V1), v2f16, "_D16">;
569 } // End HasPackedD16VMem.
Changpeng Fangb28fe032016-09-01 17:54:54 +0000570}
571
Changpeng Fang4737e892018-01-18 22:08:53 +0000572// ImageStore alternative patterns.
573multiclass ImageStoreAltPatterns<SDPatternOperator name, string opcode> {
574 let SubtargetPredicate = HasUnpackedD16VMem in {
575 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V2), v2i32, "_D16_gfx80">;
576 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V4), v4i32, "_D16_gfx80">;
577 } // End HasUnpackedD16VMem.
578
579 let SubtargetPredicate = HasPackedD16VMem in {
580 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V1), i32, "_D16">;
581 defm : ImageStoreDataPatterns<name, !cast<string>(opcode # _V2), v2i32, "_D16">;
582 } // End HasPackedD16VMem.
583}
584
585// ImageAtomic for amdgcn.
Matt Arsenault90c75932017-10-03 00:06:41 +0000586class ImageAtomicPattern<SDPatternOperator name, MIMG opcode, ValueType vt> : GCNPat <
Changpeng Fangb28fe032016-09-01 17:54:54 +0000587 (name i32:$vdata, vt:$addr, v8i32:$rsrc, imm:$r128, imm:$da, imm:$slc),
588 (opcode $vdata, $addr, $rsrc, 1, 1, 1, (as_i1imm $slc), (as_i1imm $r128), 0, 0, (as_i1imm $da))
589>;
590
Changpeng Fang4737e892018-01-18 22:08:53 +0000591// ImageAtomic patterns.
Changpeng Fangb28fe032016-09-01 17:54:54 +0000592multiclass ImageAtomicPatterns<SDPatternOperator name, string opcode> {
593 def : ImageAtomicPattern<name, !cast<MIMG>(opcode # _V1), i32>;
594 def : ImageAtomicPattern<name, !cast<MIMG>(opcode # _V2), v2i32>;
595 def : ImageAtomicPattern<name, !cast<MIMG>(opcode # _V4), v4i32>;
596}
597
Changpeng Fang4737e892018-01-18 22:08:53 +0000598// ImageAtomicCmpSwap for amdgcn.
Matt Arsenault90c75932017-10-03 00:06:41 +0000599class ImageAtomicCmpSwapPattern<MIMG opcode, ValueType vt> : GCNPat <
Changpeng Fangb28fe032016-09-01 17:54:54 +0000600 (int_amdgcn_image_atomic_cmpswap i32:$vsrc, i32:$vcmp, vt:$addr, v8i32:$rsrc,
601 imm:$r128, imm:$da, imm:$slc),
602 (EXTRACT_SUBREG
603 (opcode (REG_SEQUENCE VReg_64, $vsrc, sub0, $vcmp, sub1),
604 $addr, $rsrc, 3, 1, 1, (as_i1imm $slc), (as_i1imm $r128), 0, 0, (as_i1imm $da)),
605 sub0)
606>;
607
Changpeng Fangb28fe032016-09-01 17:54:54 +0000608// ======= amdgcn Image Intrinsics ==============
609
Changpeng Fang4737e892018-01-18 22:08:53 +0000610// Image load.
Changpeng Fangb28fe032016-09-01 17:54:54 +0000611defm : ImageLoadPatterns<int_amdgcn_image_load, "IMAGE_LOAD">;
612defm : ImageLoadPatterns<int_amdgcn_image_load_mip, "IMAGE_LOAD_MIP">;
Changpeng Fang8236fe12016-11-14 18:33:18 +0000613defm : ImageLoadPatterns<int_amdgcn_image_getresinfo, "IMAGE_GET_RESINFO">;
Changpeng Fang4737e892018-01-18 22:08:53 +0000614defm : ImageLoadAltPatterns<SIImage_load, "IMAGE_LOAD">;
615defm : ImageLoadAltPatterns<SIImage_load_mip, "IMAGE_LOAD_MIP">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000616
Changpeng Fang4737e892018-01-18 22:08:53 +0000617// Image store.
618defm : ImageStorePatterns<SIImage_store, "IMAGE_STORE">;
619defm : ImageStorePatterns<SIImage_store_mip, "IMAGE_STORE_MIP">;
620defm : ImageStoreAltPatterns<SIImage_store, "IMAGE_STORE">;
621defm : ImageStoreAltPatterns<SIImage_store_mip, "IMAGE_STORE_MIP">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000622
Changpeng Fang4737e892018-01-18 22:08:53 +0000623// Basic sample.
624defm : ImageSamplePatterns<int_amdgcn_image_sample, "IMAGE_SAMPLE">;
625defm : ImageSamplePatterns<int_amdgcn_image_sample_cl, "IMAGE_SAMPLE_CL">;
626defm : ImageSamplePatterns<int_amdgcn_image_sample_d, "IMAGE_SAMPLE_D">;
627defm : ImageSamplePatterns<int_amdgcn_image_sample_d_cl, "IMAGE_SAMPLE_D_CL">;
628defm : ImageSamplePatterns<int_amdgcn_image_sample_l, "IMAGE_SAMPLE_L">;
629defm : ImageSamplePatterns<int_amdgcn_image_sample_b, "IMAGE_SAMPLE_B">;
630defm : ImageSamplePatterns<int_amdgcn_image_sample_b_cl, "IMAGE_SAMPLE_B_CL">;
631defm : ImageSamplePatterns<int_amdgcn_image_sample_lz, "IMAGE_SAMPLE_LZ">;
632defm : ImageSamplePatterns<int_amdgcn_image_sample_cd, "IMAGE_SAMPLE_CD">;
633defm : ImageSamplePatterns<int_amdgcn_image_sample_cd_cl, "IMAGE_SAMPLE_CD_CL">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000634
Changpeng Fang4737e892018-01-18 22:08:53 +0000635// Sample with comparison.
636defm : ImageSamplePatterns<int_amdgcn_image_sample_c, "IMAGE_SAMPLE_C">;
637defm : ImageSamplePatterns<int_amdgcn_image_sample_c_cl, "IMAGE_SAMPLE_C_CL">;
638defm : ImageSamplePatterns<int_amdgcn_image_sample_c_d, "IMAGE_SAMPLE_C_D">;
639defm : ImageSamplePatterns<int_amdgcn_image_sample_c_d_cl, "IMAGE_SAMPLE_C_D_CL">;
640defm : ImageSamplePatterns<int_amdgcn_image_sample_c_l, "IMAGE_SAMPLE_C_L">;
641defm : ImageSamplePatterns<int_amdgcn_image_sample_c_b, "IMAGE_SAMPLE_C_B">;
642defm : ImageSamplePatterns<int_amdgcn_image_sample_c_b_cl, "IMAGE_SAMPLE_C_B_CL">;
643defm : ImageSamplePatterns<int_amdgcn_image_sample_c_lz, "IMAGE_SAMPLE_C_LZ">;
644defm : ImageSamplePatterns<int_amdgcn_image_sample_c_cd, "IMAGE_SAMPLE_C_CD">;
645defm : ImageSamplePatterns<int_amdgcn_image_sample_c_cd_cl, "IMAGE_SAMPLE_C_CD_CL">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000646
Changpeng Fang4737e892018-01-18 22:08:53 +0000647// Sample with offsets.
648defm : ImageSamplePatterns<int_amdgcn_image_sample_o, "IMAGE_SAMPLE_O">;
649defm : ImageSamplePatterns<int_amdgcn_image_sample_cl_o, "IMAGE_SAMPLE_CL_O">;
650defm : ImageSamplePatterns<int_amdgcn_image_sample_d_o, "IMAGE_SAMPLE_D_O">;
651defm : ImageSamplePatterns<int_amdgcn_image_sample_d_cl_o, "IMAGE_SAMPLE_D_CL_O">;
652defm : ImageSamplePatterns<int_amdgcn_image_sample_l_o, "IMAGE_SAMPLE_L_O">;
653defm : ImageSamplePatterns<int_amdgcn_image_sample_b_o, "IMAGE_SAMPLE_B_O">;
654defm : ImageSamplePatterns<int_amdgcn_image_sample_b_cl_o, "IMAGE_SAMPLE_B_CL_O">;
655defm : ImageSamplePatterns<int_amdgcn_image_sample_lz_o, "IMAGE_SAMPLE_LZ_O">;
656defm : ImageSamplePatterns<int_amdgcn_image_sample_cd_o, "IMAGE_SAMPLE_CD_O">;
657defm : ImageSamplePatterns<int_amdgcn_image_sample_cd_cl_o, "IMAGE_SAMPLE_CD_CL_O">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000658
Changpeng Fang4737e892018-01-18 22:08:53 +0000659// Sample with comparison and offsets.
660defm : ImageSamplePatterns<int_amdgcn_image_sample_c_o, "IMAGE_SAMPLE_C_O">;
661defm : ImageSamplePatterns<int_amdgcn_image_sample_c_cl_o, "IMAGE_SAMPLE_C_CL_O">;
662defm : ImageSamplePatterns<int_amdgcn_image_sample_c_d_o, "IMAGE_SAMPLE_C_D_O">;
663defm : ImageSamplePatterns<int_amdgcn_image_sample_c_d_cl_o, "IMAGE_SAMPLE_C_D_CL_O">;
664defm : ImageSamplePatterns<int_amdgcn_image_sample_c_l_o, "IMAGE_SAMPLE_C_L_O">;
665defm : ImageSamplePatterns<int_amdgcn_image_sample_c_b_o, "IMAGE_SAMPLE_C_B_O">;
666defm : ImageSamplePatterns<int_amdgcn_image_sample_c_b_cl_o, "IMAGE_SAMPLE_C_B_CL_O">;
667defm : ImageSamplePatterns<int_amdgcn_image_sample_c_lz_o, "IMAGE_SAMPLE_C_LZ_O">;
668defm : ImageSamplePatterns<int_amdgcn_image_sample_c_cd_o, "IMAGE_SAMPLE_C_CD_O">;
669defm : ImageSamplePatterns<int_amdgcn_image_sample_c_cd_cl_o, "IMAGE_SAMPLE_C_CD_CL_O">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000670
Changpeng Fang4737e892018-01-18 22:08:53 +0000671// Basic gather4.
672defm : ImageSamplePatterns<int_amdgcn_image_gather4, "IMAGE_GATHER4">;
673defm : ImageSamplePatterns<int_amdgcn_image_gather4_cl, "IMAGE_GATHER4_CL">;
674defm : ImageSamplePatterns<int_amdgcn_image_gather4_l, "IMAGE_GATHER4_L">;
675defm : ImageSamplePatterns<int_amdgcn_image_gather4_b, "IMAGE_GATHER4_B">;
676defm : ImageSamplePatterns<int_amdgcn_image_gather4_b_cl, "IMAGE_GATHER4_B_CL">;
677defm : ImageSamplePatterns<int_amdgcn_image_gather4_lz, "IMAGE_GATHER4_LZ">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000678
Changpeng Fang4737e892018-01-18 22:08:53 +0000679// Gather4 with comparison.
680defm : ImageSamplePatterns<int_amdgcn_image_gather4_c, "IMAGE_GATHER4_C">;
681defm : ImageSamplePatterns<int_amdgcn_image_gather4_c_cl, "IMAGE_GATHER4_C_CL">;
682defm : ImageSamplePatterns<int_amdgcn_image_gather4_c_l, "IMAGE_GATHER4_C_L">;
683defm : ImageSamplePatterns<int_amdgcn_image_gather4_c_b, "IMAGE_GATHER4_C_B">;
684defm : ImageSamplePatterns<int_amdgcn_image_gather4_c_b_cl, "IMAGE_GATHER4_C_B_CL">;
685defm : ImageSamplePatterns<int_amdgcn_image_gather4_c_lz, "IMAGE_GATHER4_C_LZ">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000686
Changpeng Fang4737e892018-01-18 22:08:53 +0000687// Gather4 with offsets.
688defm : ImageSamplePatterns<int_amdgcn_image_gather4_o, "IMAGE_GATHER4_O">;
689defm : ImageSamplePatterns<int_amdgcn_image_gather4_cl_o, "IMAGE_GATHER4_CL_O">;
690defm : ImageSamplePatterns<int_amdgcn_image_gather4_l_o, "IMAGE_GATHER4_L_O">;
691defm : ImageSamplePatterns<int_amdgcn_image_gather4_b_o, "IMAGE_GATHER4_B_O">;
692defm : ImageSamplePatterns<int_amdgcn_image_gather4_b_cl_o, "IMAGE_GATHER4_B_CL_O">;
693defm : ImageSamplePatterns<int_amdgcn_image_gather4_lz_o, "IMAGE_GATHER4_LZ_O">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000694
Changpeng Fang4737e892018-01-18 22:08:53 +0000695// Gather4 with comparison and offsets.
696defm : ImageSamplePatterns<int_amdgcn_image_gather4_c_o, "IMAGE_GATHER4_C_O">;
697defm : ImageSamplePatterns<int_amdgcn_image_gather4_c_cl_o, "IMAGE_GATHER4_C_CL_O">;
698defm : ImageSamplePatterns<int_amdgcn_image_gather4_c_l_o, "IMAGE_GATHER4_C_L_O">;
699defm : ImageSamplePatterns<int_amdgcn_image_gather4_c_b_o, "IMAGE_GATHER4_C_B_O">;
700defm : ImageSamplePatterns<int_amdgcn_image_gather4_c_b_cl_o, "IMAGE_GATHER4_C_B_CL_O">;
701defm : ImageSamplePatterns<int_amdgcn_image_gather4_c_lz_o, "IMAGE_GATHER4_C_LZ_O">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000702
Changpeng Fang4737e892018-01-18 22:08:53 +0000703// Basic sample alternative.
704defm : ImageSampleAltPatterns<SIImage_sample, "IMAGE_SAMPLE">;
705defm : ImageSampleAltPatterns<SIImage_sample_cl, "IMAGE_SAMPLE_CL">;
706defm : ImageSampleAltPatterns<SIImage_sample_d, "IMAGE_SAMPLE_D">;
707defm : ImageSampleAltPatterns<SIImage_sample_d_cl, "IMAGE_SAMPLE_D_CL">;
708defm : ImageSampleAltPatterns<SIImage_sample_l, "IMAGE_SAMPLE_L">;
709defm : ImageSampleAltPatterns<SIImage_sample_b, "IMAGE_SAMPLE_B">;
710defm : ImageSampleAltPatterns<SIImage_sample_b_cl, "IMAGE_SAMPLE_B_CL">;
711defm : ImageSampleAltPatterns<SIImage_sample_lz, "IMAGE_SAMPLE_LZ">;
712defm : ImageSampleAltPatterns<SIImage_sample_cd, "IMAGE_SAMPLE_CD">;
713defm : ImageSampleAltPatterns<SIImage_sample_cd_cl, "IMAGE_SAMPLE_CD_CL">;
714
715// Sample with comparison alternative.
716defm : ImageSampleAltPatterns<SIImage_sample_c, "IMAGE_SAMPLE_C">;
717defm : ImageSampleAltPatterns<SIImage_sample_c_cl, "IMAGE_SAMPLE_C_CL">;
718defm : ImageSampleAltPatterns<SIImage_sample_c_d, "IMAGE_SAMPLE_C_D">;
719defm : ImageSampleAltPatterns<SIImage_sample_c_d_cl, "IMAGE_SAMPLE_C_D_CL">;
720defm : ImageSampleAltPatterns<SIImage_sample_c_l, "IMAGE_SAMPLE_C_L">;
721defm : ImageSampleAltPatterns<SIImage_sample_c_b, "IMAGE_SAMPLE_C_B">;
722defm : ImageSampleAltPatterns<SIImage_sample_c_b_cl, "IMAGE_SAMPLE_C_B_CL">;
723defm : ImageSampleAltPatterns<SIImage_sample_c_lz, "IMAGE_SAMPLE_C_LZ">;
724defm : ImageSampleAltPatterns<SIImage_sample_c_cd, "IMAGE_SAMPLE_C_CD">;
725defm : ImageSampleAltPatterns<SIImage_sample_c_cd_cl, "IMAGE_SAMPLE_C_CD_CL">;
726
727// Sample with offsets alternative.
728defm : ImageSampleAltPatterns<SIImage_sample_o, "IMAGE_SAMPLE_O">;
729defm : ImageSampleAltPatterns<SIImage_sample_cl_o, "IMAGE_SAMPLE_CL_O">;
730defm : ImageSampleAltPatterns<SIImage_sample_d_o, "IMAGE_SAMPLE_D_O">;
731defm : ImageSampleAltPatterns<SIImage_sample_d_cl_o, "IMAGE_SAMPLE_D_CL_O">;
732defm : ImageSampleAltPatterns<SIImage_sample_l_o, "IMAGE_SAMPLE_L_O">;
733defm : ImageSampleAltPatterns<SIImage_sample_b_o, "IMAGE_SAMPLE_B_O">;
734defm : ImageSampleAltPatterns<SIImage_sample_b_cl_o, "IMAGE_SAMPLE_B_CL_O">;
735defm : ImageSampleAltPatterns<SIImage_sample_lz_o, "IMAGE_SAMPLE_LZ_O">;
736defm : ImageSampleAltPatterns<SIImage_sample_cd_o, "IMAGE_SAMPLE_CD_O">;
737defm : ImageSampleAltPatterns<SIImage_sample_cd_cl_o, "IMAGE_SAMPLE_CD_CL_O">;
738
739// Sample with comparison and offsets alternative.
740defm : ImageSampleAltPatterns<SIImage_sample_c_o, "IMAGE_SAMPLE_C_O">;
741defm : ImageSampleAltPatterns<SIImage_sample_c_cl_o, "IMAGE_SAMPLE_C_CL_O">;
742defm : ImageSampleAltPatterns<SIImage_sample_c_d_o, "IMAGE_SAMPLE_C_D_O">;
743defm : ImageSampleAltPatterns<SIImage_sample_c_d_cl_o, "IMAGE_SAMPLE_C_D_CL_O">;
744defm : ImageSampleAltPatterns<SIImage_sample_c_l_o, "IMAGE_SAMPLE_C_L_O">;
745defm : ImageSampleAltPatterns<SIImage_sample_c_b_o, "IMAGE_SAMPLE_C_B_O">;
746defm : ImageSampleAltPatterns<SIImage_sample_c_b_cl_o, "IMAGE_SAMPLE_C_B_CL_O">;
747defm : ImageSampleAltPatterns<SIImage_sample_c_lz_o, "IMAGE_SAMPLE_C_LZ_O">;
748defm : ImageSampleAltPatterns<SIImage_sample_c_cd_o, "IMAGE_SAMPLE_C_CD_O">;
749defm : ImageSampleAltPatterns<SIImage_sample_c_cd_cl_o, "IMAGE_SAMPLE_C_CD_CL_O">;
750
751// Basic gather4 alternative.
752defm : ImageSampleAltPatterns<SIImage_gather4, "IMAGE_GATHER4">;
753defm : ImageSampleAltPatterns<SIImage_gather4_cl, "IMAGE_GATHER4_CL">;
754defm : ImageSampleAltPatterns<SIImage_gather4_l, "IMAGE_GATHER4_L">;
755defm : ImageSampleAltPatterns<SIImage_gather4_b, "IMAGE_GATHER4_B">;
756defm : ImageSampleAltPatterns<SIImage_gather4_b_cl, "IMAGE_GATHER4_B_CL">;
757defm : ImageSampleAltPatterns<SIImage_gather4_lz, "IMAGE_GATHER4_LZ">;
758
759// Gather4 with comparison alternative.
760defm : ImageSampleAltPatterns<SIImage_gather4_c, "IMAGE_GATHER4_C">;
761defm : ImageSampleAltPatterns<SIImage_gather4_c_cl, "IMAGE_GATHER4_C_CL">;
762defm : ImageSampleAltPatterns<SIImage_gather4_c_l, "IMAGE_GATHER4_C_L">;
763defm : ImageSampleAltPatterns<SIImage_gather4_c_b, "IMAGE_GATHER4_C_B">;
764defm : ImageSampleAltPatterns<SIImage_gather4_c_b_cl, "IMAGE_GATHER4_C_B_CL">;
765defm : ImageSampleAltPatterns<SIImage_gather4_c_lz, "IMAGE_GATHER4_C_LZ">;
766
767// Gather4 with offsets alternative.
768defm : ImageSampleAltPatterns<SIImage_gather4_o, "IMAGE_GATHER4_O">;
769defm : ImageSampleAltPatterns<SIImage_gather4_cl_o, "IMAGE_GATHER4_CL_O">;
770defm : ImageSampleAltPatterns<SIImage_gather4_l_o, "IMAGE_GATHER4_L_O">;
771defm : ImageSampleAltPatterns<SIImage_gather4_b_o, "IMAGE_GATHER4_B_O">;
772defm : ImageSampleAltPatterns<SIImage_gather4_b_cl_o, "IMAGE_GATHER4_B_CL_O">;
773defm : ImageSampleAltPatterns<SIImage_gather4_lz_o, "IMAGE_GATHER4_LZ_O">;
774
775// Gather4 with comparison and offsets alternative.
776defm : ImageSampleAltPatterns<SIImage_gather4_c_o, "IMAGE_GATHER4_C_O">;
777defm : ImageSampleAltPatterns<SIImage_gather4_c_cl_o, "IMAGE_GATHER4_C_CL_O">;
778defm : ImageSampleAltPatterns<SIImage_gather4_c_l_o, "IMAGE_GATHER4_C_L_O">;
779defm : ImageSampleAltPatterns<SIImage_gather4_c_b_o, "IMAGE_GATHER4_C_B_O">;
780defm : ImageSampleAltPatterns<SIImage_gather4_c_b_cl_o, "IMAGE_GATHER4_C_B_CL_O">;
781defm : ImageSampleAltPatterns<SIImage_gather4_c_lz_o, "IMAGE_GATHER4_C_LZ_O">;
782
783defm : ImageSamplePatterns<int_amdgcn_image_getlod, "IMAGE_GET_LOD">;
Changpeng Fangb28fe032016-09-01 17:54:54 +0000784
785// Image atomics
786defm : ImageAtomicPatterns<int_amdgcn_image_atomic_swap, "IMAGE_ATOMIC_SWAP">;
787def : ImageAtomicCmpSwapPattern<IMAGE_ATOMIC_CMPSWAP_V1, i32>;
788def : ImageAtomicCmpSwapPattern<IMAGE_ATOMIC_CMPSWAP_V2, v2i32>;
789def : ImageAtomicCmpSwapPattern<IMAGE_ATOMIC_CMPSWAP_V4, v4i32>;
790defm : ImageAtomicPatterns<int_amdgcn_image_atomic_add, "IMAGE_ATOMIC_ADD">;
791defm : ImageAtomicPatterns<int_amdgcn_image_atomic_sub, "IMAGE_ATOMIC_SUB">;
792defm : ImageAtomicPatterns<int_amdgcn_image_atomic_smin, "IMAGE_ATOMIC_SMIN">;
793defm : ImageAtomicPatterns<int_amdgcn_image_atomic_umin, "IMAGE_ATOMIC_UMIN">;
794defm : ImageAtomicPatterns<int_amdgcn_image_atomic_smax, "IMAGE_ATOMIC_SMAX">;
795defm : ImageAtomicPatterns<int_amdgcn_image_atomic_umax, "IMAGE_ATOMIC_UMAX">;
796defm : ImageAtomicPatterns<int_amdgcn_image_atomic_and, "IMAGE_ATOMIC_AND">;
797defm : ImageAtomicPatterns<int_amdgcn_image_atomic_or, "IMAGE_ATOMIC_OR">;
798defm : ImageAtomicPatterns<int_amdgcn_image_atomic_xor, "IMAGE_ATOMIC_XOR">;
799defm : ImageAtomicPatterns<int_amdgcn_image_atomic_inc, "IMAGE_ATOMIC_INC">;
800defm : ImageAtomicPatterns<int_amdgcn_image_atomic_dec, "IMAGE_ATOMIC_DEC">;
801
802/* SIsample for simple 1D texture lookup */
Matt Arsenault90c75932017-10-03 00:06:41 +0000803def : GCNPat <
Changpeng Fangb28fe032016-09-01 17:54:54 +0000804 (SIsample i32:$addr, v8i32:$rsrc, v4i32:$sampler, imm),
805 (IMAGE_SAMPLE_V4_V1 $addr, $rsrc, $sampler, 0xf, 0, 0, 0, 0, 0, 0, 0)
806>;
807
Matt Arsenault90c75932017-10-03 00:06:41 +0000808class SamplePattern<SDNode name, MIMG opcode, ValueType vt> : GCNPat <
Changpeng Fangb28fe032016-09-01 17:54:54 +0000809 (name vt:$addr, v8i32:$rsrc, v4i32:$sampler, imm),
810 (opcode $addr, $rsrc, $sampler, 0xf, 0, 0, 0, 0, 0, 0, 0)
811>;
812
Matt Arsenault90c75932017-10-03 00:06:41 +0000813class SampleRectPattern<SDNode name, MIMG opcode, ValueType vt> : GCNPat <
Changpeng Fangb28fe032016-09-01 17:54:54 +0000814 (name vt:$addr, v8i32:$rsrc, v4i32:$sampler, TEX_RECT),
815 (opcode $addr, $rsrc, $sampler, 0xf, 1, 0, 0, 0, 0, 0, 0)
816>;
817
Matt Arsenault90c75932017-10-03 00:06:41 +0000818class SampleArrayPattern<SDNode name, MIMG opcode, ValueType vt> : GCNPat <
Changpeng Fangb28fe032016-09-01 17:54:54 +0000819 (name vt:$addr, v8i32:$rsrc, v4i32:$sampler, TEX_ARRAY),
820 (opcode $addr, $rsrc, $sampler, 0xf, 0, 0, 0, 0, 0, 0, 1)
821>;
822
823class SampleShadowPattern<SDNode name, MIMG opcode,
Matt Arsenault90c75932017-10-03 00:06:41 +0000824 ValueType vt> : GCNPat <
Changpeng Fangb28fe032016-09-01 17:54:54 +0000825 (name vt:$addr, v8i32:$rsrc, v4i32:$sampler, TEX_SHADOW),
826 (opcode $addr, $rsrc, $sampler, 0xf, 0, 0, 0, 0, 0, 0, 0)
827>;
828
829class SampleShadowArrayPattern<SDNode name, MIMG opcode,
Matt Arsenault90c75932017-10-03 00:06:41 +0000830 ValueType vt> : GCNPat <
Changpeng Fangb28fe032016-09-01 17:54:54 +0000831 (name vt:$addr, v8i32:$rsrc, v4i32:$sampler, TEX_SHADOW_ARRAY),
832 (opcode $addr, $rsrc, $sampler, 0xf, 0, 0, 0, 0, 0, 0, 1)
833>;
834
835/* SIsample* for texture lookups consuming more address parameters */
836multiclass SamplePatterns<MIMG sample, MIMG sample_c, MIMG sample_l,
837 MIMG sample_c_l, MIMG sample_b, MIMG sample_c_b,
838MIMG sample_d, MIMG sample_c_d, ValueType addr_type> {
839 def : SamplePattern <SIsample, sample, addr_type>;
840 def : SampleRectPattern <SIsample, sample, addr_type>;
841 def : SampleArrayPattern <SIsample, sample, addr_type>;
842 def : SampleShadowPattern <SIsample, sample_c, addr_type>;
843 def : SampleShadowArrayPattern <SIsample, sample_c, addr_type>;
844
845 def : SamplePattern <SIsamplel, sample_l, addr_type>;
846 def : SampleArrayPattern <SIsamplel, sample_l, addr_type>;
847 def : SampleShadowPattern <SIsamplel, sample_c_l, addr_type>;
848 def : SampleShadowArrayPattern <SIsamplel, sample_c_l, addr_type>;
849
850 def : SamplePattern <SIsampleb, sample_b, addr_type>;
851 def : SampleArrayPattern <SIsampleb, sample_b, addr_type>;
852 def : SampleShadowPattern <SIsampleb, sample_c_b, addr_type>;
853 def : SampleShadowArrayPattern <SIsampleb, sample_c_b, addr_type>;
854
855 def : SamplePattern <SIsampled, sample_d, addr_type>;
856 def : SampleArrayPattern <SIsampled, sample_d, addr_type>;
857 def : SampleShadowPattern <SIsampled, sample_c_d, addr_type>;
858 def : SampleShadowArrayPattern <SIsampled, sample_c_d, addr_type>;
859}
860
861defm : SamplePatterns<IMAGE_SAMPLE_V4_V2, IMAGE_SAMPLE_C_V4_V2,
862 IMAGE_SAMPLE_L_V4_V2, IMAGE_SAMPLE_C_L_V4_V2,
863 IMAGE_SAMPLE_B_V4_V2, IMAGE_SAMPLE_C_B_V4_V2,
864 IMAGE_SAMPLE_D_V4_V2, IMAGE_SAMPLE_C_D_V4_V2,
865 v2i32>;
866defm : SamplePatterns<IMAGE_SAMPLE_V4_V4, IMAGE_SAMPLE_C_V4_V4,
867 IMAGE_SAMPLE_L_V4_V4, IMAGE_SAMPLE_C_L_V4_V4,
868 IMAGE_SAMPLE_B_V4_V4, IMAGE_SAMPLE_C_B_V4_V4,
869 IMAGE_SAMPLE_D_V4_V4, IMAGE_SAMPLE_C_D_V4_V4,
870 v4i32>;
871defm : SamplePatterns<IMAGE_SAMPLE_V4_V8, IMAGE_SAMPLE_C_V4_V8,
872 IMAGE_SAMPLE_L_V4_V8, IMAGE_SAMPLE_C_L_V4_V8,
873 IMAGE_SAMPLE_B_V4_V8, IMAGE_SAMPLE_C_B_V4_V8,
874 IMAGE_SAMPLE_D_V4_V8, IMAGE_SAMPLE_C_D_V4_V8,
875 v8i32>;
876defm : SamplePatterns<IMAGE_SAMPLE_V4_V16, IMAGE_SAMPLE_C_V4_V16,
877 IMAGE_SAMPLE_L_V4_V16, IMAGE_SAMPLE_C_L_V4_V16,
878 IMAGE_SAMPLE_B_V4_V16, IMAGE_SAMPLE_C_B_V4_V16,
879 IMAGE_SAMPLE_D_V4_V16, IMAGE_SAMPLE_C_D_V4_V16,
880 v16i32>;