blob: 1f425ac1361b5a9373da7c43dfb049a671f1c4fa [file] [log] [blame]
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001//===-- BUFInstructions.td - Buffer 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
10def MUBUFAddr32 : ComplexPattern<i64, 9, "SelectMUBUFAddr32">;
11def MUBUFAddr64 : ComplexPattern<i64, 7, "SelectMUBUFAddr64">;
12def MUBUFAddr64Atomic : ComplexPattern<i64, 5, "SelectMUBUFAddr64">;
13
Matt Arsenaultb81495d2017-09-20 05:01:53 +000014def MUBUFScratchOffen : ComplexPattern<i64, 4, "SelectMUBUFScratchOffen", [], [SDNPWantParent]>;
15def MUBUFScratchOffset : ComplexPattern<i64, 3, "SelectMUBUFScratchOffset", [], [SDNPWantParent], 20>;
Matt Arsenault0774ea22017-04-24 19:40:59 +000016
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000017def MUBUFOffset : ComplexPattern<i64, 6, "SelectMUBUFOffset">;
18def MUBUFOffsetNoGLC : ComplexPattern<i64, 3, "SelectMUBUFOffset">;
19def MUBUFOffsetAtomic : ComplexPattern<i64, 4, "SelectMUBUFOffset">;
20def MUBUFIntrinsicOffset : ComplexPattern<i32, 2, "SelectMUBUFIntrinsicOffset">;
21def MUBUFIntrinsicVOffset : ComplexPattern<i32, 3, "SelectMUBUFIntrinsicVOffset">;
22
23class MubufLoad <SDPatternOperator op> : PatFrag <
24 (ops node:$ptr), (op node:$ptr), [{
25 auto const AS = cast<MemSDNode>(N)->getAddressSpace();
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000026 return AS == AMDGPUASI.GLOBAL_ADDRESS ||
27 AS == AMDGPUASI.CONSTANT_ADDRESS;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000028}]>;
29
30def mubuf_load : MubufLoad <load>;
31def mubuf_az_extloadi8 : MubufLoad <az_extloadi8>;
32def mubuf_sextloadi8 : MubufLoad <sextloadi8>;
33def mubuf_az_extloadi16 : MubufLoad <az_extloadi16>;
34def mubuf_sextloadi16 : MubufLoad <sextloadi16>;
35def mubuf_load_atomic : MubufLoad <atomic_load>;
36
37def BUFAddrKind {
38 int Offset = 0;
39 int OffEn = 1;
40 int IdxEn = 2;
41 int BothEn = 3;
42 int Addr64 = 4;
43}
44
45class getAddrName<int addrKind> {
46 string ret =
47 !if(!eq(addrKind, BUFAddrKind.Offset), "offset",
48 !if(!eq(addrKind, BUFAddrKind.OffEn), "offen",
49 !if(!eq(addrKind, BUFAddrKind.IdxEn), "idxen",
50 !if(!eq(addrKind, BUFAddrKind.BothEn), "bothen",
51 !if(!eq(addrKind, BUFAddrKind.Addr64), "addr64",
52 "")))));
53}
54
Nicolai Haehnle01d261f2018-06-04 14:26:05 +000055class MUBUFAddr64Table <bit is_addr64, string Name> {
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000056 bit IsAddr64 = is_addr64;
Nicolai Haehnle01d261f2018-06-04 14:26:05 +000057 string OpName = Name;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000058}
59
Nicolai Haehnle01d261f2018-06-04 14:26:05 +000060class MUBUFLdsTable <bit is_lds, string Name> {
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +000061 bit IsLds = is_lds;
Nicolai Haehnle01d261f2018-06-04 14:26:05 +000062 string OpName = Name;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +000063}
64
Nicolai Haehnle01d261f2018-06-04 14:26:05 +000065class MTBUFAddr64Table <bit is_addr64, string Name> {
David Stuttard70e8bc12017-06-22 16:29:22 +000066 bit IsAddr64 = is_addr64;
Nicolai Haehnle01d261f2018-06-04 14:26:05 +000067 string OpName = Name;
David Stuttard70e8bc12017-06-22 16:29:22 +000068}
69
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000070//===----------------------------------------------------------------------===//
71// MTBUF classes
72//===----------------------------------------------------------------------===//
73
74class MTBUF_Pseudo <string opName, dag outs, dag ins,
75 string asmOps, list<dag> pattern=[]> :
76 InstSI<outs, ins, "", pattern>,
77 SIMCInstr<opName, SIEncodingFamily.NONE> {
78
79 let isPseudo = 1;
80 let isCodeGenOnly = 1;
Matt Arsenault10c17ca2016-10-06 10:13:23 +000081 let Size = 8;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000082 let UseNamedOperandTable = 1;
83
84 string Mnemonic = opName;
85 string AsmOperands = asmOps;
86
87 let VM_CNT = 1;
88 let EXP_CNT = 1;
89 let MTBUF = 1;
90 let Uses = [EXEC];
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000091 let hasSideEffects = 0;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000092 let SchedRW = [WriteVMEM];
David Stuttard70e8bc12017-06-22 16:29:22 +000093
94 let AsmMatchConverter = "cvtMtbuf";
95
96 bits<1> offen = 0;
97 bits<1> idxen = 0;
98 bits<1> addr64 = 0;
99 bits<1> has_vdata = 1;
100 bits<1> has_vaddr = 1;
101 bits<1> has_glc = 1;
102 bits<1> glc_value = 0; // the value for glc if no such operand
David Stuttard70e8bc12017-06-22 16:29:22 +0000103 bits<1> has_srsrc = 1;
104 bits<1> has_soffset = 1;
105 bits<1> has_offset = 1;
106 bits<1> has_slc = 1;
107 bits<1> has_tfe = 1;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000108}
109
Valery Pykhtinfbf2d932016-09-23 21:21:21 +0000110class MTBUF_Real <MTBUF_Pseudo ps> :
David Stuttard70e8bc12017-06-22 16:29:22 +0000111 InstSI <ps.OutOperandList, ps.InOperandList, ps.Mnemonic # ps.AsmOperands, []> {
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000112
113 let isPseudo = 0;
114 let isCodeGenOnly = 0;
115
116 // copy relevant pseudo op flags
117 let SubtargetPredicate = ps.SubtargetPredicate;
118 let AsmMatchConverter = ps.AsmMatchConverter;
119 let Constraints = ps.Constraints;
120 let DisableEncoding = ps.DisableEncoding;
121 let TSFlags = ps.TSFlags;
122
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000123 bits<12> offset;
David Stuttard70e8bc12017-06-22 16:29:22 +0000124 bits<1> glc;
Tim Renouf35484c92018-08-21 11:06:05 +0000125 bits<7> format;
David Stuttard70e8bc12017-06-22 16:29:22 +0000126 bits<8> vaddr;
127 bits<8> vdata;
128 bits<7> srsrc;
129 bits<1> slc;
130 bits<1> tfe;
131 bits<8> soffset;
Tim Renouf35484c92018-08-21 11:06:05 +0000132
133 bits<4> dfmt = format{3-0};
134 bits<3> nfmt = format{6-4};
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000135}
136
David Stuttard70e8bc12017-06-22 16:29:22 +0000137class getMTBUFInsDA<list<RegisterClass> vdataList,
138 list<RegisterClass> vaddrList=[]> {
139 RegisterClass vdataClass = !if(!empty(vdataList), ?, !head(vdataList));
140 RegisterClass vaddrClass = !if(!empty(vaddrList), ?, !head(vaddrList));
141 dag InsNoData = !if(!empty(vaddrList),
142 (ins SReg_128:$srsrc, SCSrc_b32:$soffset,
Tim Renouf35484c92018-08-21 11:06:05 +0000143 offset:$offset, FORMAT:$format, GLC:$glc, SLC:$slc, TFE:$tfe),
David Stuttard70e8bc12017-06-22 16:29:22 +0000144 (ins vaddrClass:$vaddr, SReg_128:$srsrc, SCSrc_b32:$soffset,
Tim Renouf35484c92018-08-21 11:06:05 +0000145 offset:$offset, FORMAT:$format, GLC:$glc, SLC:$slc, TFE:$tfe)
David Stuttard70e8bc12017-06-22 16:29:22 +0000146 );
147 dag InsData = !if(!empty(vaddrList),
148 (ins vdataClass:$vdata, SReg_128:$srsrc,
Tim Renouf35484c92018-08-21 11:06:05 +0000149 SCSrc_b32:$soffset, offset:$offset, FORMAT:$format, GLC:$glc,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000150 SLC:$slc, TFE:$tfe),
David Stuttard70e8bc12017-06-22 16:29:22 +0000151 (ins vdataClass:$vdata, vaddrClass:$vaddr, SReg_128:$srsrc,
Tim Renouf35484c92018-08-21 11:06:05 +0000152 SCSrc_b32:$soffset, offset:$offset, FORMAT:$format, GLC:$glc,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000153 SLC:$slc, TFE:$tfe)
David Stuttard70e8bc12017-06-22 16:29:22 +0000154 );
155 dag ret = !if(!empty(vdataList), InsNoData, InsData);
156}
157
158class getMTBUFIns<int addrKind, list<RegisterClass> vdataList=[]> {
159 dag ret =
160 !if(!eq(addrKind, BUFAddrKind.Offset), getMTBUFInsDA<vdataList>.ret,
161 !if(!eq(addrKind, BUFAddrKind.OffEn), getMTBUFInsDA<vdataList, [VGPR_32]>.ret,
162 !if(!eq(addrKind, BUFAddrKind.IdxEn), getMTBUFInsDA<vdataList, [VGPR_32]>.ret,
163 !if(!eq(addrKind, BUFAddrKind.BothEn), getMTBUFInsDA<vdataList, [VReg_64]>.ret,
164 !if(!eq(addrKind, BUFAddrKind.Addr64), getMTBUFInsDA<vdataList, [VReg_64]>.ret,
165 (ins))))));
166}
167
168class getMTBUFAsmOps<int addrKind> {
169 string Pfx =
Tim Renouf35484c92018-08-21 11:06:05 +0000170 !if(!eq(addrKind, BUFAddrKind.Offset), "off, $srsrc, $format, $soffset",
David Stuttard70e8bc12017-06-22 16:29:22 +0000171 !if(!eq(addrKind, BUFAddrKind.OffEn),
Tim Renouf35484c92018-08-21 11:06:05 +0000172 "$vaddr, $srsrc, $format, $soffset offen",
David Stuttard70e8bc12017-06-22 16:29:22 +0000173 !if(!eq(addrKind, BUFAddrKind.IdxEn),
Tim Renouf35484c92018-08-21 11:06:05 +0000174 "$vaddr, $srsrc, $format, $soffset idxen",
David Stuttard70e8bc12017-06-22 16:29:22 +0000175 !if(!eq(addrKind, BUFAddrKind.BothEn),
Tim Renouf35484c92018-08-21 11:06:05 +0000176 "$vaddr, $srsrc, $format, $soffset idxen offen",
David Stuttard70e8bc12017-06-22 16:29:22 +0000177 !if(!eq(addrKind, BUFAddrKind.Addr64),
Tim Renouf35484c92018-08-21 11:06:05 +0000178 "$vaddr, $srsrc, $format, $soffset addr64",
David Stuttard70e8bc12017-06-22 16:29:22 +0000179 "")))));
180 string ret = Pfx # "$offset";
181}
182
183class MTBUF_SetupAddr<int addrKind> {
184 bits<1> offen = !if(!eq(addrKind, BUFAddrKind.OffEn), 1,
185 !if(!eq(addrKind, BUFAddrKind.BothEn), 1 , 0));
186
187 bits<1> idxen = !if(!eq(addrKind, BUFAddrKind.IdxEn), 1,
188 !if(!eq(addrKind, BUFAddrKind.BothEn), 1 , 0));
189
190 bits<1> addr64 = !if(!eq(addrKind, BUFAddrKind.Addr64), 1, 0);
191
192 bits<1> has_vaddr = !if(!eq(addrKind, BUFAddrKind.Offset), 0, 1);
193}
194
195class MTBUF_Load_Pseudo <string opName,
196 int addrKind,
197 RegisterClass vdataClass,
198 list<dag> pattern=[],
199 // Workaround bug bz30254
200 int addrKindCopy = addrKind>
201 : MTBUF_Pseudo<opName,
202 (outs vdataClass:$vdata),
203 getMTBUFIns<addrKindCopy>.ret,
204 " $vdata, " # getMTBUFAsmOps<addrKindCopy>.ret # "$glc$slc$tfe",
205 pattern>,
206 MTBUF_SetupAddr<addrKindCopy> {
207 let PseudoInstr = opName # "_" # getAddrName<addrKindCopy>.ret;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000208 let mayLoad = 1;
209 let mayStore = 0;
210}
211
David Stuttard70e8bc12017-06-22 16:29:22 +0000212multiclass MTBUF_Pseudo_Loads<string opName, RegisterClass vdataClass,
213 ValueType load_vt = i32,
214 SDPatternOperator ld = null_frag> {
215
216 def _OFFSET : MTBUF_Load_Pseudo <opName, BUFAddrKind.Offset, vdataClass,
217 [(set load_vt:$vdata,
Tim Renouf35484c92018-08-21 11:06:05 +0000218 (ld (MUBUFOffset v4i32:$srsrc, i32:$soffset, i16:$offset, i8:$format,
219 i1:$glc, i1:$slc, i1:$tfe)))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000220 MTBUFAddr64Table<0, NAME>;
David Stuttard70e8bc12017-06-22 16:29:22 +0000221
222 def _ADDR64 : MTBUF_Load_Pseudo <opName, BUFAddrKind.Addr64, vdataClass,
223 [(set load_vt:$vdata,
224 (ld (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset, i16:$offset,
Tim Renouf35484c92018-08-21 11:06:05 +0000225 i8:$format, i1:$glc, i1:$slc, i1:$tfe)))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000226 MTBUFAddr64Table<1, NAME>;
David Stuttard70e8bc12017-06-22 16:29:22 +0000227
228 def _OFFEN : MTBUF_Load_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
229 def _IDXEN : MTBUF_Load_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
230 def _BOTHEN : MTBUF_Load_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
231
232 let DisableWQM = 1 in {
233 def _OFFSET_exact : MTBUF_Load_Pseudo <opName, BUFAddrKind.Offset, vdataClass>;
234 def _OFFEN_exact : MTBUF_Load_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
235 def _IDXEN_exact : MTBUF_Load_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
236 def _BOTHEN_exact : MTBUF_Load_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
237 }
238}
239
240class MTBUF_Store_Pseudo <string opName,
241 int addrKind,
242 RegisterClass vdataClass,
243 list<dag> pattern=[],
244 // Workaround bug bz30254
245 int addrKindCopy = addrKind,
246 RegisterClass vdataClassCopy = vdataClass>
247 : MTBUF_Pseudo<opName,
248 (outs),
249 getMTBUFIns<addrKindCopy, [vdataClassCopy]>.ret,
250 " $vdata, " # getMTBUFAsmOps<addrKindCopy>.ret # "$glc$slc$tfe",
251 pattern>,
252 MTBUF_SetupAddr<addrKindCopy> {
253 let PseudoInstr = opName # "_" # getAddrName<addrKindCopy>.ret;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000254 let mayLoad = 0;
255 let mayStore = 1;
256}
257
David Stuttard70e8bc12017-06-22 16:29:22 +0000258multiclass MTBUF_Pseudo_Stores<string opName, RegisterClass vdataClass,
259 ValueType store_vt = i32,
260 SDPatternOperator st = null_frag> {
261
262 def _OFFSET : MTBUF_Store_Pseudo <opName, BUFAddrKind.Offset, vdataClass,
263 [(st store_vt:$vdata, (MUBUFOffset v4i32:$srsrc, i32:$soffset,
Tim Renouf35484c92018-08-21 11:06:05 +0000264 i16:$offset, i8:$format, i1:$glc,
David Stuttard70e8bc12017-06-22 16:29:22 +0000265 i1:$slc, i1:$tfe))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000266 MTBUFAddr64Table<0, NAME>;
David Stuttard70e8bc12017-06-22 16:29:22 +0000267
268 def _ADDR64 : MTBUF_Store_Pseudo <opName, BUFAddrKind.Addr64, vdataClass,
269 [(st store_vt:$vdata, (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset,
Tim Renouf35484c92018-08-21 11:06:05 +0000270 i16:$offset, i8:$format, i1:$glc,
David Stuttard70e8bc12017-06-22 16:29:22 +0000271 i1:$slc, i1:$tfe))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000272 MTBUFAddr64Table<1, NAME>;
David Stuttard70e8bc12017-06-22 16:29:22 +0000273
274 def _OFFEN : MTBUF_Store_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
275 def _IDXEN : MTBUF_Store_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
276 def _BOTHEN : MTBUF_Store_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
277
278 let DisableWQM = 1 in {
279 def _OFFSET_exact : MTBUF_Store_Pseudo <opName, BUFAddrKind.Offset, vdataClass>;
280 def _OFFEN_exact : MTBUF_Store_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
281 def _IDXEN_exact : MTBUF_Store_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
282 def _BOTHEN_exact : MTBUF_Store_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
283 }
284}
285
286
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000287//===----------------------------------------------------------------------===//
288// MUBUF classes
289//===----------------------------------------------------------------------===//
290
291class MUBUF_Pseudo <string opName, dag outs, dag ins,
292 string asmOps, list<dag> pattern=[]> :
293 InstSI<outs, ins, "", pattern>,
294 SIMCInstr<opName, SIEncodingFamily.NONE> {
295
296 let isPseudo = 1;
297 let isCodeGenOnly = 1;
Matt Arsenault10c17ca2016-10-06 10:13:23 +0000298 let Size = 8;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000299 let UseNamedOperandTable = 1;
300
301 string Mnemonic = opName;
302 string AsmOperands = asmOps;
303
304 let VM_CNT = 1;
305 let EXP_CNT = 1;
306 let MUBUF = 1;
307 let Uses = [EXEC];
308 let hasSideEffects = 0;
309 let SchedRW = [WriteVMEM];
310
311 let AsmMatchConverter = "cvtMubuf";
312
313 bits<1> offen = 0;
314 bits<1> idxen = 0;
315 bits<1> addr64 = 0;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000316 bits<1> lds = 0;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000317 bits<1> has_vdata = 1;
318 bits<1> has_vaddr = 1;
319 bits<1> has_glc = 1;
320 bits<1> glc_value = 0; // the value for glc if no such operand
321 bits<1> has_srsrc = 1;
322 bits<1> has_soffset = 1;
323 bits<1> has_offset = 1;
324 bits<1> has_slc = 1;
325 bits<1> has_tfe = 1;
326}
327
328class MUBUF_Real <bits<7> op, MUBUF_Pseudo ps> :
329 InstSI <ps.OutOperandList, ps.InOperandList, ps.Mnemonic # ps.AsmOperands, []> {
330
331 let isPseudo = 0;
332 let isCodeGenOnly = 0;
333
334 // copy relevant pseudo op flags
335 let SubtargetPredicate = ps.SubtargetPredicate;
336 let AsmMatchConverter = ps.AsmMatchConverter;
337 let Constraints = ps.Constraints;
338 let DisableEncoding = ps.DisableEncoding;
339 let TSFlags = ps.TSFlags;
340
341 bits<12> offset;
342 bits<1> glc;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000343 bits<8> vaddr;
344 bits<8> vdata;
345 bits<7> srsrc;
346 bits<1> slc;
347 bits<1> tfe;
348 bits<8> soffset;
349}
350
351
352// For cache invalidation instructions.
353class MUBUF_Invalidate <string opName, SDPatternOperator node> :
354 MUBUF_Pseudo<opName, (outs), (ins), "", [(node)]> {
355
356 let AsmMatchConverter = "";
357
358 let hasSideEffects = 1;
359 let mayStore = 1;
360
361 // Set everything to 0.
362 let offen = 0;
363 let idxen = 0;
364 let addr64 = 0;
365 let has_vdata = 0;
366 let has_vaddr = 0;
367 let has_glc = 0;
368 let glc_value = 0;
369 let has_srsrc = 0;
370 let has_soffset = 0;
371 let has_offset = 0;
372 let has_slc = 0;
373 let has_tfe = 0;
374}
375
376class getMUBUFInsDA<list<RegisterClass> vdataList,
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000377 list<RegisterClass> vaddrList=[],
378 bit isLds = 0> {
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000379 RegisterClass vdataClass = !if(!empty(vdataList), ?, !head(vdataList));
380 RegisterClass vaddrClass = !if(!empty(vaddrList), ?, !head(vaddrList));
381 dag InsNoData = !if(!empty(vaddrList),
382 (ins SReg_128:$srsrc, SCSrc_b32:$soffset,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000383 offset:$offset, GLC:$glc, SLC:$slc),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000384 (ins vaddrClass:$vaddr, SReg_128:$srsrc, SCSrc_b32:$soffset,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000385 offset:$offset, GLC:$glc, SLC:$slc)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000386 );
387 dag InsData = !if(!empty(vaddrList),
388 (ins vdataClass:$vdata, SReg_128:$srsrc,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000389 SCSrc_b32:$soffset, offset:$offset, GLC:$glc, SLC:$slc),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000390 (ins vdataClass:$vdata, vaddrClass:$vaddr, SReg_128:$srsrc,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000391 SCSrc_b32:$soffset, offset:$offset, GLC:$glc, SLC:$slc)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000392 );
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000393 dag ret = !con(
394 !if(!empty(vdataList), InsNoData, InsData),
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000395 !if(isLds, (ins), (ins TFE:$tfe))
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000396 );
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000397}
398
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000399class getMUBUFIns<int addrKind, list<RegisterClass> vdataList=[], bit isLds = 0> {
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000400 dag ret =
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000401 !if(!eq(addrKind, BUFAddrKind.Offset), getMUBUFInsDA<vdataList, [], isLds>.ret,
402 !if(!eq(addrKind, BUFAddrKind.OffEn), getMUBUFInsDA<vdataList, [VGPR_32], isLds>.ret,
403 !if(!eq(addrKind, BUFAddrKind.IdxEn), getMUBUFInsDA<vdataList, [VGPR_32], isLds>.ret,
404 !if(!eq(addrKind, BUFAddrKind.BothEn), getMUBUFInsDA<vdataList, [VReg_64], isLds>.ret,
405 !if(!eq(addrKind, BUFAddrKind.Addr64), getMUBUFInsDA<vdataList, [VReg_64], isLds>.ret,
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000406 (ins))))));
407}
408
409class getMUBUFAsmOps<int addrKind> {
410 string Pfx =
411 !if(!eq(addrKind, BUFAddrKind.Offset), "off, $srsrc, $soffset",
412 !if(!eq(addrKind, BUFAddrKind.OffEn), "$vaddr, $srsrc, $soffset offen",
413 !if(!eq(addrKind, BUFAddrKind.IdxEn), "$vaddr, $srsrc, $soffset idxen",
414 !if(!eq(addrKind, BUFAddrKind.BothEn), "$vaddr, $srsrc, $soffset idxen offen",
415 !if(!eq(addrKind, BUFAddrKind.Addr64), "$vaddr, $srsrc, $soffset addr64",
416 "")))));
417 string ret = Pfx # "$offset";
418}
419
Matt Arsenaultf3dd8632016-11-01 00:55:14 +0000420class MUBUF_SetupAddr<int addrKind> {
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000421 bits<1> offen = !if(!eq(addrKind, BUFAddrKind.OffEn), 1,
422 !if(!eq(addrKind, BUFAddrKind.BothEn), 1 , 0));
423
424 bits<1> idxen = !if(!eq(addrKind, BUFAddrKind.IdxEn), 1,
425 !if(!eq(addrKind, BUFAddrKind.BothEn), 1 , 0));
426
427 bits<1> addr64 = !if(!eq(addrKind, BUFAddrKind.Addr64), 1, 0);
428
429 bits<1> has_vaddr = !if(!eq(addrKind, BUFAddrKind.Offset), 0, 1);
430}
431
432class MUBUF_Load_Pseudo <string opName,
433 int addrKind,
434 RegisterClass vdataClass,
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000435 bit HasTiedDest = 0,
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000436 bit isLds = 0,
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000437 list<dag> pattern=[],
438 // Workaround bug bz30254
439 int addrKindCopy = addrKind>
440 : MUBUF_Pseudo<opName,
441 (outs vdataClass:$vdata),
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000442 !con(getMUBUFIns<addrKindCopy, [], isLds>.ret,
443 !if(HasTiedDest, (ins vdataClass:$vdata_in), (ins))),
444 " $vdata, " # getMUBUFAsmOps<addrKindCopy>.ret # "$glc$slc" #
445 !if(isLds, " lds", "$tfe"),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000446 pattern>,
447 MUBUF_SetupAddr<addrKindCopy> {
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000448 let PseudoInstr = opName # !if(isLds, "_lds", "") #
449 "_" # getAddrName<addrKindCopy>.ret;
Dmitry Preobrazhenskyd98c97b2018-03-12 17:29:24 +0000450 let AsmMatchConverter = !if(isLds, "cvtMubufLds", "cvtMubuf");
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000451
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000452 let Constraints = !if(HasTiedDest, "$vdata = $vdata_in", "");
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000453 let mayLoad = 1;
454 let mayStore = 0;
Konstantin Zhuravlyov070d88e2017-07-21 21:05:45 +0000455 let maybeAtomic = 1;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000456 let Uses = !if(isLds, [EXEC, M0], [EXEC]);
457 let has_tfe = !if(isLds, 0, 1);
458 let lds = isLds;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000459}
460
461// FIXME: tfe can't be an operand because it requires a separate
462// opcode because it needs an N+1 register class dest register.
463multiclass MUBUF_Pseudo_Loads<string opName, RegisterClass vdataClass,
464 ValueType load_vt = i32,
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000465 SDPatternOperator ld = null_frag,
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000466 bit TiedDest = 0,
467 bit isLds = 0> {
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000468
469 def _OFFSET : MUBUF_Load_Pseudo <opName, BUFAddrKind.Offset, vdataClass,
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000470 TiedDest, isLds,
471 !if(isLds,
472 [],
473 [(set load_vt:$vdata,
474 (ld (MUBUFOffset v4i32:$srsrc, i32:$soffset, i16:$offset, i1:$glc, i1:$slc, i1:$tfe)))])>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000475 MUBUFAddr64Table<0, NAME # !if(isLds, "_LDS", "")>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000476
477 def _ADDR64 : MUBUF_Load_Pseudo <opName, BUFAddrKind.Addr64, vdataClass,
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000478 TiedDest, isLds,
479 !if(isLds,
480 [],
481 [(set load_vt:$vdata,
482 (ld (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset, i16:$offset, i1:$glc, i1:$slc, i1:$tfe)))])>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000483 MUBUFAddr64Table<1, NAME # !if(isLds, "_LDS", "")>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000484
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000485 def _OFFEN : MUBUF_Load_Pseudo <opName, BUFAddrKind.OffEn, vdataClass, TiedDest, isLds>;
486 def _IDXEN : MUBUF_Load_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass, TiedDest, isLds>;
487 def _BOTHEN : MUBUF_Load_Pseudo <opName, BUFAddrKind.BothEn, vdataClass, TiedDest, isLds>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000488
489 let DisableWQM = 1 in {
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000490 def _OFFSET_exact : MUBUF_Load_Pseudo <opName, BUFAddrKind.Offset, vdataClass, TiedDest, isLds>;
491 def _OFFEN_exact : MUBUF_Load_Pseudo <opName, BUFAddrKind.OffEn, vdataClass, TiedDest, isLds>;
492 def _IDXEN_exact : MUBUF_Load_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass, TiedDest, isLds>;
493 def _BOTHEN_exact : MUBUF_Load_Pseudo <opName, BUFAddrKind.BothEn, vdataClass, TiedDest, isLds>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000494 }
495}
496
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000497multiclass MUBUF_Pseudo_Loads_Lds<string opName, RegisterClass vdataClass,
498 ValueType load_vt = i32,
499 SDPatternOperator ld_nolds = null_frag,
500 SDPatternOperator ld_lds = null_frag> {
501 defm NAME : MUBUF_Pseudo_Loads<opName, vdataClass, load_vt, ld_nolds>;
502 defm _LDS : MUBUF_Pseudo_Loads<opName, vdataClass, load_vt, ld_lds, 0, 1>;
503}
504
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000505class MUBUF_Store_Pseudo <string opName,
506 int addrKind,
507 RegisterClass vdataClass,
508 list<dag> pattern=[],
509 // Workaround bug bz30254
510 int addrKindCopy = addrKind,
511 RegisterClass vdataClassCopy = vdataClass>
512 : MUBUF_Pseudo<opName,
513 (outs),
514 getMUBUFIns<addrKindCopy, [vdataClassCopy]>.ret,
515 " $vdata, " # getMUBUFAsmOps<addrKindCopy>.ret # "$glc$slc$tfe",
516 pattern>,
517 MUBUF_SetupAddr<addrKindCopy> {
518 let PseudoInstr = opName # "_" # getAddrName<addrKindCopy>.ret;
519 let mayLoad = 0;
520 let mayStore = 1;
Konstantin Zhuravlyov070d88e2017-07-21 21:05:45 +0000521 let maybeAtomic = 1;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000522}
523
524multiclass MUBUF_Pseudo_Stores<string opName, RegisterClass vdataClass,
525 ValueType store_vt = i32,
526 SDPatternOperator st = null_frag> {
527
528 def _OFFSET : MUBUF_Store_Pseudo <opName, BUFAddrKind.Offset, vdataClass,
529 [(st store_vt:$vdata, (MUBUFOffset v4i32:$srsrc, i32:$soffset,
530 i16:$offset, i1:$glc, i1:$slc, i1:$tfe))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000531 MUBUFAddr64Table<0, NAME>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000532
533 def _ADDR64 : MUBUF_Store_Pseudo <opName, BUFAddrKind.Addr64, vdataClass,
534 [(st store_vt:$vdata, (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset,
535 i16:$offset, i1:$glc, i1:$slc, i1:$tfe))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000536 MUBUFAddr64Table<1, NAME>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000537
538 def _OFFEN : MUBUF_Store_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
539 def _IDXEN : MUBUF_Store_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
540 def _BOTHEN : MUBUF_Store_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
541
542 let DisableWQM = 1 in {
543 def _OFFSET_exact : MUBUF_Store_Pseudo <opName, BUFAddrKind.Offset, vdataClass>;
544 def _OFFEN_exact : MUBUF_Store_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
545 def _IDXEN_exact : MUBUF_Store_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
546 def _BOTHEN_exact : MUBUF_Store_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
547 }
548}
549
Dmitry Preobrazhenskyd98c97b2018-03-12 17:29:24 +0000550class MUBUF_Pseudo_Store_Lds<string opName>
551 : MUBUF_Pseudo<opName,
552 (outs),
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000553 (ins SReg_128:$srsrc, SCSrc_b32:$soffset, offset:$offset, GLC:$glc, SLC:$slc),
Dmitry Preobrazhenskyd98c97b2018-03-12 17:29:24 +0000554 " $srsrc, $soffset$offset lds$glc$slc"> {
555 let mayLoad = 0;
556 let mayStore = 1;
557 let maybeAtomic = 1;
558
559 let has_vdata = 0;
560 let has_vaddr = 0;
561 let has_tfe = 0;
562 let lds = 1;
563
564 let Uses = [EXEC, M0];
565 let AsmMatchConverter = "cvtMubufLds";
566}
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000567
568class getMUBUFAtomicInsDA<RegisterClass vdataClass, bit vdata_in,
569 list<RegisterClass> vaddrList=[]> {
570 RegisterClass vaddrClass = !if(!empty(vaddrList), ?, !head(vaddrList));
571 dag ret = !if(vdata_in,
572 !if(!empty(vaddrList),
573 (ins vdataClass:$vdata_in,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000574 SReg_128:$srsrc, SCSrc_b32:$soffset, offset:$offset, SLC:$slc),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000575 (ins vdataClass:$vdata_in, vaddrClass:$vaddr,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000576 SReg_128:$srsrc, SCSrc_b32:$soffset, offset:$offset, SLC:$slc)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000577 ),
578 !if(!empty(vaddrList),
579 (ins vdataClass:$vdata,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000580 SReg_128:$srsrc, SCSrc_b32:$soffset, offset:$offset, SLC:$slc),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000581 (ins vdataClass:$vdata, vaddrClass:$vaddr,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000582 SReg_128:$srsrc, SCSrc_b32:$soffset, offset:$offset, SLC:$slc)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000583 ));
584}
585
586class getMUBUFAtomicIns<int addrKind,
587 RegisterClass vdataClass,
588 bit vdata_in,
589 // Workaround bug bz30254
590 RegisterClass vdataClassCopy=vdataClass> {
591 dag ret =
592 !if(!eq(addrKind, BUFAddrKind.Offset),
593 getMUBUFAtomicInsDA<vdataClassCopy, vdata_in>.ret,
594 !if(!eq(addrKind, BUFAddrKind.OffEn),
595 getMUBUFAtomicInsDA<vdataClassCopy, vdata_in, [VGPR_32]>.ret,
596 !if(!eq(addrKind, BUFAddrKind.IdxEn),
597 getMUBUFAtomicInsDA<vdataClassCopy, vdata_in, [VGPR_32]>.ret,
598 !if(!eq(addrKind, BUFAddrKind.BothEn),
599 getMUBUFAtomicInsDA<vdataClassCopy, vdata_in, [VReg_64]>.ret,
600 !if(!eq(addrKind, BUFAddrKind.Addr64),
601 getMUBUFAtomicInsDA<vdataClassCopy, vdata_in, [VReg_64]>.ret,
602 (ins))))));
603}
604
605class MUBUF_Atomic_Pseudo<string opName,
606 int addrKind,
607 dag outs,
608 dag ins,
609 string asmOps,
610 list<dag> pattern=[],
611 // Workaround bug bz30254
612 int addrKindCopy = addrKind>
613 : MUBUF_Pseudo<opName, outs, ins, asmOps, pattern>,
614 MUBUF_SetupAddr<addrKindCopy> {
615 let mayStore = 1;
616 let mayLoad = 1;
617 let hasPostISelHook = 1;
618 let hasSideEffects = 1;
619 let DisableWQM = 1;
620 let has_glc = 0;
621 let has_tfe = 0;
Konstantin Zhuravlyov070d88e2017-07-21 21:05:45 +0000622 let maybeAtomic = 1;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000623}
624
625class MUBUF_AtomicNoRet_Pseudo<string opName, int addrKind,
626 RegisterClass vdataClass,
627 list<dag> pattern=[],
628 // Workaround bug bz30254
629 int addrKindCopy = addrKind,
630 RegisterClass vdataClassCopy = vdataClass>
631 : MUBUF_Atomic_Pseudo<opName, addrKindCopy,
632 (outs),
633 getMUBUFAtomicIns<addrKindCopy, vdataClassCopy, 0>.ret,
634 " $vdata, " # getMUBUFAsmOps<addrKindCopy>.ret # "$slc",
635 pattern>,
636 AtomicNoRet<opName # "_" # getAddrName<addrKindCopy>.ret, 0> {
637 let PseudoInstr = opName # "_" # getAddrName<addrKindCopy>.ret;
638 let glc_value = 0;
639 let AsmMatchConverter = "cvtMubufAtomic";
640}
641
642class MUBUF_AtomicRet_Pseudo<string opName, int addrKind,
643 RegisterClass vdataClass,
644 list<dag> pattern=[],
645 // Workaround bug bz30254
646 int addrKindCopy = addrKind,
647 RegisterClass vdataClassCopy = vdataClass>
648 : MUBUF_Atomic_Pseudo<opName, addrKindCopy,
649 (outs vdataClassCopy:$vdata),
650 getMUBUFAtomicIns<addrKindCopy, vdataClassCopy, 1>.ret,
651 " $vdata, " # getMUBUFAsmOps<addrKindCopy>.ret # " glc$slc",
652 pattern>,
653 AtomicNoRet<opName # "_" # getAddrName<addrKindCopy>.ret, 1> {
654 let PseudoInstr = opName # "_rtn_" # getAddrName<addrKindCopy>.ret;
655 let glc_value = 1;
656 let Constraints = "$vdata = $vdata_in";
657 let DisableEncoding = "$vdata_in";
658 let AsmMatchConverter = "cvtMubufAtomicReturn";
659}
660
661multiclass MUBUF_Pseudo_Atomics <string opName,
662 RegisterClass vdataClass,
663 ValueType vdataType,
664 SDPatternOperator atomic> {
665
666 def _OFFSET : MUBUF_AtomicNoRet_Pseudo <opName, BUFAddrKind.Offset, vdataClass>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000667 MUBUFAddr64Table <0, NAME>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000668 def _ADDR64 : MUBUF_AtomicNoRet_Pseudo <opName, BUFAddrKind.Addr64, vdataClass>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000669 MUBUFAddr64Table <1, NAME>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000670 def _OFFEN : MUBUF_AtomicNoRet_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
671 def _IDXEN : MUBUF_AtomicNoRet_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
672 def _BOTHEN : MUBUF_AtomicNoRet_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
673
Matt Arsenaulte5456ce2017-07-20 21:06:04 +0000674 def _OFFSET_RTN : MUBUF_AtomicRet_Pseudo <opName, BUFAddrKind.Offset, vdataClass,
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000675 [(set vdataType:$vdata,
676 (atomic (MUBUFOffsetAtomic v4i32:$srsrc, i32:$soffset, i16:$offset, i1:$slc),
677 vdataType:$vdata_in))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000678 MUBUFAddr64Table <0, NAME # "_RTN">;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000679
Matt Arsenaulte5456ce2017-07-20 21:06:04 +0000680 def _ADDR64_RTN : MUBUF_AtomicRet_Pseudo <opName, BUFAddrKind.Addr64, vdataClass,
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000681 [(set vdataType:$vdata,
682 (atomic (MUBUFAddr64Atomic v4i32:$srsrc, i64:$vaddr, i32:$soffset, i16:$offset, i1:$slc),
683 vdataType:$vdata_in))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000684 MUBUFAddr64Table <1, NAME # "_RTN">;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000685
Matt Arsenaulte5456ce2017-07-20 21:06:04 +0000686 def _OFFEN_RTN : MUBUF_AtomicRet_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
687 def _IDXEN_RTN : MUBUF_AtomicRet_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
688 def _BOTHEN_RTN : MUBUF_AtomicRet_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000689}
690
691
692//===----------------------------------------------------------------------===//
693// MUBUF Instructions
694//===----------------------------------------------------------------------===//
695
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000696defm BUFFER_LOAD_FORMAT_X : MUBUF_Pseudo_Loads_Lds <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000697 "buffer_load_format_x", VGPR_32
698>;
699defm BUFFER_LOAD_FORMAT_XY : MUBUF_Pseudo_Loads <
700 "buffer_load_format_xy", VReg_64
701>;
702defm BUFFER_LOAD_FORMAT_XYZ : MUBUF_Pseudo_Loads <
703 "buffer_load_format_xyz", VReg_96
704>;
705defm BUFFER_LOAD_FORMAT_XYZW : MUBUF_Pseudo_Loads <
706 "buffer_load_format_xyzw", VReg_128
707>;
708defm BUFFER_STORE_FORMAT_X : MUBUF_Pseudo_Stores <
709 "buffer_store_format_x", VGPR_32
710>;
711defm BUFFER_STORE_FORMAT_XY : MUBUF_Pseudo_Stores <
712 "buffer_store_format_xy", VReg_64
713>;
714defm BUFFER_STORE_FORMAT_XYZ : MUBUF_Pseudo_Stores <
715 "buffer_store_format_xyz", VReg_96
716>;
717defm BUFFER_STORE_FORMAT_XYZW : MUBUF_Pseudo_Stores <
718 "buffer_store_format_xyzw", VReg_128
719>;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +0000720
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000721let SubtargetPredicate = HasUnpackedD16VMem, D16Buf = 1 in {
Changpeng Fang44dfa1d2018-01-12 21:12:19 +0000722 defm BUFFER_LOAD_FORMAT_D16_X_gfx80 : MUBUF_Pseudo_Loads <
723 "buffer_load_format_d16_x", VGPR_32
724 >;
725 defm BUFFER_LOAD_FORMAT_D16_XY_gfx80 : MUBUF_Pseudo_Loads <
726 "buffer_load_format_d16_xy", VReg_64
727 >;
728 defm BUFFER_LOAD_FORMAT_D16_XYZ_gfx80 : MUBUF_Pseudo_Loads <
729 "buffer_load_format_d16_xyz", VReg_96
730 >;
731 defm BUFFER_LOAD_FORMAT_D16_XYZW_gfx80 : MUBUF_Pseudo_Loads <
732 "buffer_load_format_d16_xyzw", VReg_128
733 >;
734 defm BUFFER_STORE_FORMAT_D16_X_gfx80 : MUBUF_Pseudo_Stores <
735 "buffer_store_format_d16_x", VGPR_32
736 >;
737 defm BUFFER_STORE_FORMAT_D16_XY_gfx80 : MUBUF_Pseudo_Stores <
738 "buffer_store_format_d16_xy", VReg_64
739 >;
740 defm BUFFER_STORE_FORMAT_D16_XYZ_gfx80 : MUBUF_Pseudo_Stores <
741 "buffer_store_format_d16_xyz", VReg_96
742 >;
743 defm BUFFER_STORE_FORMAT_D16_XYZW_gfx80 : MUBUF_Pseudo_Stores <
744 "buffer_store_format_d16_xyzw", VReg_128
745 >;
746} // End HasUnpackedD16VMem.
747
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000748let SubtargetPredicate = HasPackedD16VMem, D16Buf = 1 in {
Changpeng Fang44dfa1d2018-01-12 21:12:19 +0000749 defm BUFFER_LOAD_FORMAT_D16_X : MUBUF_Pseudo_Loads <
750 "buffer_load_format_d16_x", VGPR_32
751 >;
752 defm BUFFER_LOAD_FORMAT_D16_XY : MUBUF_Pseudo_Loads <
753 "buffer_load_format_d16_xy", VGPR_32
754 >;
755 defm BUFFER_LOAD_FORMAT_D16_XYZ : MUBUF_Pseudo_Loads <
756 "buffer_load_format_d16_xyz", VReg_64
757 >;
758 defm BUFFER_LOAD_FORMAT_D16_XYZW : MUBUF_Pseudo_Loads <
759 "buffer_load_format_d16_xyzw", VReg_64
760 >;
761 defm BUFFER_STORE_FORMAT_D16_X : MUBUF_Pseudo_Stores <
762 "buffer_store_format_d16_x", VGPR_32
763 >;
764 defm BUFFER_STORE_FORMAT_D16_XY : MUBUF_Pseudo_Stores <
765 "buffer_store_format_d16_xy", VGPR_32
766 >;
767 defm BUFFER_STORE_FORMAT_D16_XYZ : MUBUF_Pseudo_Stores <
768 "buffer_store_format_d16_xyz", VReg_64
769 >;
770 defm BUFFER_STORE_FORMAT_D16_XYZW : MUBUF_Pseudo_Stores <
771 "buffer_store_format_d16_xyzw", VReg_64
772 >;
773} // End HasPackedD16VMem.
774
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000775defm BUFFER_LOAD_UBYTE : MUBUF_Pseudo_Loads_Lds <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000776 "buffer_load_ubyte", VGPR_32, i32, mubuf_az_extloadi8
777>;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000778defm BUFFER_LOAD_SBYTE : MUBUF_Pseudo_Loads_Lds <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000779 "buffer_load_sbyte", VGPR_32, i32, mubuf_sextloadi8
780>;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000781defm BUFFER_LOAD_USHORT : MUBUF_Pseudo_Loads_Lds <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000782 "buffer_load_ushort", VGPR_32, i32, mubuf_az_extloadi16
783>;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000784defm BUFFER_LOAD_SSHORT : MUBUF_Pseudo_Loads_Lds <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000785 "buffer_load_sshort", VGPR_32, i32, mubuf_sextloadi16
786>;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000787defm BUFFER_LOAD_DWORD : MUBUF_Pseudo_Loads_Lds <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000788 "buffer_load_dword", VGPR_32, i32, mubuf_load
789>;
790defm BUFFER_LOAD_DWORDX2 : MUBUF_Pseudo_Loads <
791 "buffer_load_dwordx2", VReg_64, v2i32, mubuf_load
792>;
Artem Tamazov73f1ab22016-10-07 15:53:16 +0000793defm BUFFER_LOAD_DWORDX3 : MUBUF_Pseudo_Loads <
794 "buffer_load_dwordx3", VReg_96, untyped, mubuf_load
795>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000796defm BUFFER_LOAD_DWORDX4 : MUBUF_Pseudo_Loads <
797 "buffer_load_dwordx4", VReg_128, v4i32, mubuf_load
798>;
Dmitry Preobrazhenskyffbee7a2018-06-13 15:32:46 +0000799
800// This is not described in AMD documentation,
801// but 'lds' versions of these opcodes are available
802// in at least GFX8+ chips. See Bug 37653.
803let SubtargetPredicate = isVI in {
804defm BUFFER_LOAD_DWORDX2_LDS : MUBUF_Pseudo_Loads <
805 "buffer_load_dwordx2", VReg_64, v2i32, null_frag, 0, 1
806>;
807defm BUFFER_LOAD_DWORDX3_LDS : MUBUF_Pseudo_Loads <
808 "buffer_load_dwordx3", VReg_96, untyped, null_frag, 0, 1
809>;
810defm BUFFER_LOAD_DWORDX4_LDS : MUBUF_Pseudo_Loads <
811 "buffer_load_dwordx4", VReg_128, v4i32, null_frag, 0, 1
812>;
813}
814
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000815defm BUFFER_STORE_BYTE : MUBUF_Pseudo_Stores <
816 "buffer_store_byte", VGPR_32, i32, truncstorei8_global
817>;
818defm BUFFER_STORE_SHORT : MUBUF_Pseudo_Stores <
819 "buffer_store_short", VGPR_32, i32, truncstorei16_global
820>;
821defm BUFFER_STORE_DWORD : MUBUF_Pseudo_Stores <
Matt Arsenaultbc683832017-09-20 03:43:35 +0000822 "buffer_store_dword", VGPR_32, i32, store_global
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000823>;
824defm BUFFER_STORE_DWORDX2 : MUBUF_Pseudo_Stores <
Matt Arsenaultbc683832017-09-20 03:43:35 +0000825 "buffer_store_dwordx2", VReg_64, v2i32, store_global
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000826>;
Artem Tamazov73f1ab22016-10-07 15:53:16 +0000827defm BUFFER_STORE_DWORDX3 : MUBUF_Pseudo_Stores <
Matt Arsenaultbc683832017-09-20 03:43:35 +0000828 "buffer_store_dwordx3", VReg_96, untyped, store_global
Artem Tamazov73f1ab22016-10-07 15:53:16 +0000829>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000830defm BUFFER_STORE_DWORDX4 : MUBUF_Pseudo_Stores <
Matt Arsenaultbc683832017-09-20 03:43:35 +0000831 "buffer_store_dwordx4", VReg_128, v4i32, store_global
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000832>;
833defm BUFFER_ATOMIC_SWAP : MUBUF_Pseudo_Atomics <
834 "buffer_atomic_swap", VGPR_32, i32, atomic_swap_global
835>;
836defm BUFFER_ATOMIC_CMPSWAP : MUBUF_Pseudo_Atomics <
837 "buffer_atomic_cmpswap", VReg_64, v2i32, null_frag
838>;
839defm BUFFER_ATOMIC_ADD : MUBUF_Pseudo_Atomics <
840 "buffer_atomic_add", VGPR_32, i32, atomic_add_global
841>;
842defm BUFFER_ATOMIC_SUB : MUBUF_Pseudo_Atomics <
843 "buffer_atomic_sub", VGPR_32, i32, atomic_sub_global
844>;
845defm BUFFER_ATOMIC_SMIN : MUBUF_Pseudo_Atomics <
846 "buffer_atomic_smin", VGPR_32, i32, atomic_min_global
847>;
848defm BUFFER_ATOMIC_UMIN : MUBUF_Pseudo_Atomics <
849 "buffer_atomic_umin", VGPR_32, i32, atomic_umin_global
850>;
851defm BUFFER_ATOMIC_SMAX : MUBUF_Pseudo_Atomics <
852 "buffer_atomic_smax", VGPR_32, i32, atomic_max_global
853>;
854defm BUFFER_ATOMIC_UMAX : MUBUF_Pseudo_Atomics <
855 "buffer_atomic_umax", VGPR_32, i32, atomic_umax_global
856>;
857defm BUFFER_ATOMIC_AND : MUBUF_Pseudo_Atomics <
858 "buffer_atomic_and", VGPR_32, i32, atomic_and_global
859>;
860defm BUFFER_ATOMIC_OR : MUBUF_Pseudo_Atomics <
861 "buffer_atomic_or", VGPR_32, i32, atomic_or_global
862>;
863defm BUFFER_ATOMIC_XOR : MUBUF_Pseudo_Atomics <
864 "buffer_atomic_xor", VGPR_32, i32, atomic_xor_global
865>;
866defm BUFFER_ATOMIC_INC : MUBUF_Pseudo_Atomics <
867 "buffer_atomic_inc", VGPR_32, i32, atomic_inc_global
868>;
869defm BUFFER_ATOMIC_DEC : MUBUF_Pseudo_Atomics <
870 "buffer_atomic_dec", VGPR_32, i32, atomic_dec_global
871>;
872defm BUFFER_ATOMIC_SWAP_X2 : MUBUF_Pseudo_Atomics <
873 "buffer_atomic_swap_x2", VReg_64, i64, atomic_swap_global
874>;
875defm BUFFER_ATOMIC_CMPSWAP_X2 : MUBUF_Pseudo_Atomics <
876 "buffer_atomic_cmpswap_x2", VReg_128, v2i64, null_frag
877>;
878defm BUFFER_ATOMIC_ADD_X2 : MUBUF_Pseudo_Atomics <
879 "buffer_atomic_add_x2", VReg_64, i64, atomic_add_global
880>;
881defm BUFFER_ATOMIC_SUB_X2 : MUBUF_Pseudo_Atomics <
882 "buffer_atomic_sub_x2", VReg_64, i64, atomic_sub_global
883>;
884defm BUFFER_ATOMIC_SMIN_X2 : MUBUF_Pseudo_Atomics <
885 "buffer_atomic_smin_x2", VReg_64, i64, atomic_min_global
886>;
887defm BUFFER_ATOMIC_UMIN_X2 : MUBUF_Pseudo_Atomics <
888 "buffer_atomic_umin_x2", VReg_64, i64, atomic_umin_global
889>;
890defm BUFFER_ATOMIC_SMAX_X2 : MUBUF_Pseudo_Atomics <
891 "buffer_atomic_smax_x2", VReg_64, i64, atomic_max_global
892>;
893defm BUFFER_ATOMIC_UMAX_X2 : MUBUF_Pseudo_Atomics <
894 "buffer_atomic_umax_x2", VReg_64, i64, atomic_umax_global
895>;
896defm BUFFER_ATOMIC_AND_X2 : MUBUF_Pseudo_Atomics <
897 "buffer_atomic_and_x2", VReg_64, i64, atomic_and_global
898>;
899defm BUFFER_ATOMIC_OR_X2 : MUBUF_Pseudo_Atomics <
900 "buffer_atomic_or_x2", VReg_64, i64, atomic_or_global
901>;
902defm BUFFER_ATOMIC_XOR_X2 : MUBUF_Pseudo_Atomics <
903 "buffer_atomic_xor_x2", VReg_64, i64, atomic_xor_global
904>;
905defm BUFFER_ATOMIC_INC_X2 : MUBUF_Pseudo_Atomics <
906 "buffer_atomic_inc_x2", VReg_64, i64, atomic_inc_global
907>;
908defm BUFFER_ATOMIC_DEC_X2 : MUBUF_Pseudo_Atomics <
909 "buffer_atomic_dec_x2", VReg_64, i64, atomic_dec_global
910>;
911
Dmitry Preobrazhenskyd98c97b2018-03-12 17:29:24 +0000912let SubtargetPredicate = isVI in {
913def BUFFER_STORE_LDS_DWORD : MUBUF_Pseudo_Store_Lds <"buffer_store_lds_dword">;
914}
915
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000916let SubtargetPredicate = isSI in { // isn't on CI & VI
917/*
918defm BUFFER_ATOMIC_RSUB : MUBUF_Pseudo_Atomics <"buffer_atomic_rsub">;
919defm BUFFER_ATOMIC_FCMPSWAP : MUBUF_Pseudo_Atomics <"buffer_atomic_fcmpswap">;
920defm BUFFER_ATOMIC_FMIN : MUBUF_Pseudo_Atomics <"buffer_atomic_fmin">;
921defm BUFFER_ATOMIC_FMAX : MUBUF_Pseudo_Atomics <"buffer_atomic_fmax">;
922defm BUFFER_ATOMIC_RSUB_X2 : MUBUF_Pseudo_Atomics <"buffer_atomic_rsub_x2">;
923defm BUFFER_ATOMIC_FCMPSWAP_X2 : MUBUF_Pseudo_Atomics <"buffer_atomic_fcmpswap_x2">;
924defm BUFFER_ATOMIC_FMIN_X2 : MUBUF_Pseudo_Atomics <"buffer_atomic_fmin_x2">;
925defm BUFFER_ATOMIC_FMAX_X2 : MUBUF_Pseudo_Atomics <"buffer_atomic_fmax_x2">;
926*/
927
928def BUFFER_WBINVL1_SC : MUBUF_Invalidate <"buffer_wbinvl1_sc",
929 int_amdgcn_buffer_wbinvl1_sc>;
930}
931
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000932let SubtargetPredicate = HasD16LoadStore in {
933
934defm BUFFER_LOAD_UBYTE_D16 : MUBUF_Pseudo_Loads <
Matt Arsenaulte1cd4822017-11-13 00:22:09 +0000935 "buffer_load_ubyte_d16", VGPR_32, i32, null_frag, 1
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000936>;
937
938defm BUFFER_LOAD_UBYTE_D16_HI : MUBUF_Pseudo_Loads <
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000939 "buffer_load_ubyte_d16_hi", VGPR_32, i32, null_frag, 1
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000940>;
941
942defm BUFFER_LOAD_SBYTE_D16 : MUBUF_Pseudo_Loads <
Matt Arsenaulte1cd4822017-11-13 00:22:09 +0000943 "buffer_load_sbyte_d16", VGPR_32, i32, null_frag, 1
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000944>;
945
946defm BUFFER_LOAD_SBYTE_D16_HI : MUBUF_Pseudo_Loads <
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000947 "buffer_load_sbyte_d16_hi", VGPR_32, i32, null_frag, 1
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000948>;
949
950defm BUFFER_LOAD_SHORT_D16 : MUBUF_Pseudo_Loads <
Matt Arsenaulte1cd4822017-11-13 00:22:09 +0000951 "buffer_load_short_d16", VGPR_32, i32, null_frag, 1
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000952>;
953
954defm BUFFER_LOAD_SHORT_D16_HI : MUBUF_Pseudo_Loads <
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000955 "buffer_load_short_d16_hi", VGPR_32, i32, null_frag, 1
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000956>;
957
958defm BUFFER_STORE_BYTE_D16_HI : MUBUF_Pseudo_Stores <
959 "buffer_store_byte_d16_hi", VGPR_32, i32
960>;
961
962defm BUFFER_STORE_SHORT_D16_HI : MUBUF_Pseudo_Stores <
963 "buffer_store_short_d16_hi", VGPR_32, i32
964>;
965
Dmitry Preobrazhenskya917e882018-03-28 14:53:13 +0000966defm BUFFER_LOAD_FORMAT_D16_HI_X : MUBUF_Pseudo_Loads <
967 "buffer_load_format_d16_hi_x", VGPR_32
968>;
969defm BUFFER_STORE_FORMAT_D16_HI_X : MUBUF_Pseudo_Stores <
970 "buffer_store_format_d16_hi_x", VGPR_32
971>;
972
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000973} // End HasD16LoadStore
974
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000975def BUFFER_WBINVL1 : MUBUF_Invalidate <"buffer_wbinvl1",
976 int_amdgcn_buffer_wbinvl1>;
977
978//===----------------------------------------------------------------------===//
979// MTBUF Instructions
980//===----------------------------------------------------------------------===//
981
David Stuttard70e8bc12017-06-22 16:29:22 +0000982defm TBUFFER_LOAD_FORMAT_X : MTBUF_Pseudo_Loads <"tbuffer_load_format_x", VGPR_32>;
983defm TBUFFER_LOAD_FORMAT_XY : MTBUF_Pseudo_Loads <"tbuffer_load_format_xy", VReg_64>;
984defm TBUFFER_LOAD_FORMAT_XYZ : MTBUF_Pseudo_Loads <"tbuffer_load_format_xyz", VReg_128>;
985defm TBUFFER_LOAD_FORMAT_XYZW : MTBUF_Pseudo_Loads <"tbuffer_load_format_xyzw", VReg_128>;
986defm TBUFFER_STORE_FORMAT_X : MTBUF_Pseudo_Stores <"tbuffer_store_format_x", VGPR_32>;
987defm TBUFFER_STORE_FORMAT_XY : MTBUF_Pseudo_Stores <"tbuffer_store_format_xy", VReg_64>;
988defm TBUFFER_STORE_FORMAT_XYZ : MTBUF_Pseudo_Stores <"tbuffer_store_format_xyz", VReg_128>;
989defm TBUFFER_STORE_FORMAT_XYZW : MTBUF_Pseudo_Stores <"tbuffer_store_format_xyzw", VReg_128>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000990
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000991let SubtargetPredicate = HasUnpackedD16VMem, D16Buf = 1 in {
Changpeng Fang44dfa1d2018-01-12 21:12:19 +0000992 defm TBUFFER_LOAD_FORMAT_D16_X_gfx80 : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_x", VGPR_32>;
993 defm TBUFFER_LOAD_FORMAT_D16_XY_gfx80 : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_xy", VReg_64>;
994 defm TBUFFER_LOAD_FORMAT_D16_XYZ_gfx80 : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_xyz", VReg_96>;
995 defm TBUFFER_LOAD_FORMAT_D16_XYZW_gfx80 : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_xyzw", VReg_128>;
996 defm TBUFFER_STORE_FORMAT_D16_X_gfx80 : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_x", VGPR_32>;
997 defm TBUFFER_STORE_FORMAT_D16_XY_gfx80 : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_xy", VReg_64>;
998 defm TBUFFER_STORE_FORMAT_D16_XYZ_gfx80 : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_xyz", VReg_96>;
999 defm TBUFFER_STORE_FORMAT_D16_XYZW_gfx80 : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_xyzw", VReg_128>;
1000} // End HasUnpackedD16VMem.
1001
Nicolai Haehnlef2674312018-06-21 13:36:01 +00001002let SubtargetPredicate = HasPackedD16VMem, D16Buf = 1 in {
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001003 defm TBUFFER_LOAD_FORMAT_D16_X : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_x", VGPR_32>;
1004 defm TBUFFER_LOAD_FORMAT_D16_XY : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_xy", VGPR_32>;
1005 defm TBUFFER_LOAD_FORMAT_D16_XYZ : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_xyz", VReg_64>;
1006 defm TBUFFER_LOAD_FORMAT_D16_XYZW : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_xyzw", VReg_64>;
1007 defm TBUFFER_STORE_FORMAT_D16_X : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_x", VGPR_32>;
1008 defm TBUFFER_STORE_FORMAT_D16_XY : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_xy", VGPR_32>;
1009 defm TBUFFER_STORE_FORMAT_D16_XYZ : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_xyz", VReg_64>;
1010 defm TBUFFER_STORE_FORMAT_D16_XYZW : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_xyzw", VReg_64>;
1011} // End HasPackedD16VMem.
1012
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001013let SubtargetPredicate = isCIVI in {
1014
1015//===----------------------------------------------------------------------===//
1016// Instruction definitions for CI and newer.
1017//===----------------------------------------------------------------------===//
1018// Remaining instructions:
1019// BUFFER_LOAD_DWORDX3
1020// BUFFER_STORE_DWORDX3
1021
1022def BUFFER_WBINVL1_VOL : MUBUF_Invalidate <"buffer_wbinvl1_vol",
1023 int_amdgcn_buffer_wbinvl1_vol>;
1024
1025} // End let SubtargetPredicate = isCIVI
1026
1027//===----------------------------------------------------------------------===//
1028// MUBUF Patterns
1029//===----------------------------------------------------------------------===//
1030
Tim Renouf35484c92018-08-21 11:06:05 +00001031def extract_glc : SDNodeXForm<imm, [{
1032 return CurDAG->getTargetConstant(N->getZExtValue() & 1, SDLoc(N), MVT::i8);
1033}]>;
1034
1035def extract_slc : SDNodeXForm<imm, [{
1036 return CurDAG->getTargetConstant((N->getZExtValue() >> 1) & 1, SDLoc(N), MVT::i8);
1037}]>;
1038
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001039//===----------------------------------------------------------------------===//
1040// buffer_load/store_format patterns
1041//===----------------------------------------------------------------------===//
1042
1043multiclass MUBUF_LoadIntrinsicPat<SDPatternOperator name, ValueType vt,
1044 string opcode> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001045 def : GCNPat<
Tim Renouf4f703f52018-08-21 11:07:10 +00001046 (vt (name v4i32:$rsrc, 0, 0, i32:$soffset, imm:$offset,
1047 imm:$cachepolicy, 0)),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001048 (!cast<MUBUF_Pseudo>(opcode # _OFFSET) $rsrc, $soffset, (as_i16imm $offset),
Tim Renouf4f703f52018-08-21 11:07:10 +00001049 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001050 >;
1051
Matt Arsenault90c75932017-10-03 00:06:41 +00001052 def : GCNPat<
Tim Renouf4f703f52018-08-21 11:07:10 +00001053 (vt (name v4i32:$rsrc, 0, i32:$voffset, i32:$soffset, imm:$offset,
1054 imm:$cachepolicy, 0)),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001055 (!cast<MUBUF_Pseudo>(opcode # _OFFEN) $voffset, $rsrc, $soffset, (as_i16imm $offset),
Tim Renouf4f703f52018-08-21 11:07:10 +00001056 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001057 >;
1058
Matt Arsenault90c75932017-10-03 00:06:41 +00001059 def : GCNPat<
Tim Renouf4f703f52018-08-21 11:07:10 +00001060 (vt (name v4i32:$rsrc, i32:$vindex, 0, i32:$soffset, imm:$offset,
1061 imm:$cachepolicy, imm)),
1062 (!cast<MUBUF_Pseudo>(opcode # _IDXEN) $vindex, $rsrc, $soffset, (as_i16imm $offset),
1063 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
1064 >;
1065
1066 def : GCNPat<
1067 (vt (name v4i32:$rsrc, i32:$vindex, i32:$voffset, i32:$soffset, imm:$offset,
1068 imm:$cachepolicy, imm)),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001069 (!cast<MUBUF_Pseudo>(opcode # _BOTHEN)
1070 (REG_SEQUENCE VReg_64, $vindex, sub0, $voffset, sub1),
1071 $rsrc, $soffset, (as_i16imm $offset),
Tim Renouf4f703f52018-08-21 11:07:10 +00001072 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001073 >;
1074}
1075
Tom Stellard6f9ef142016-12-20 17:19:44 +00001076defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format, f32, "BUFFER_LOAD_FORMAT_X">;
1077defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format, v2f32, "BUFFER_LOAD_FORMAT_XY">;
1078defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format, v4f32, "BUFFER_LOAD_FORMAT_XYZW">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001079
1080let SubtargetPredicate = HasUnpackedD16VMem in {
Matt Arsenault1349a042018-05-22 06:32:10 +00001081 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, f16, "BUFFER_LOAD_FORMAT_D16_X_gfx80">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001082 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, v2i32, "BUFFER_LOAD_FORMAT_D16_XY_gfx80">;
1083 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, v4i32, "BUFFER_LOAD_FORMAT_D16_XYZW_gfx80">;
1084} // End HasUnpackedD16VMem.
1085
1086let SubtargetPredicate = HasPackedD16VMem in {
Matt Arsenault1349a042018-05-22 06:32:10 +00001087 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, f16, "BUFFER_LOAD_FORMAT_D16_X">;
1088 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, v2f16, "BUFFER_LOAD_FORMAT_D16_XY">;
Matt Arsenault02dc7e12018-06-15 15:15:46 +00001089 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, v4f16, "BUFFER_LOAD_FORMAT_D16_XYZW">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001090} // End HasPackedD16VMem.
1091
Tom Stellard6f9ef142016-12-20 17:19:44 +00001092defm : MUBUF_LoadIntrinsicPat<SIbuffer_load, f32, "BUFFER_LOAD_DWORD">;
1093defm : MUBUF_LoadIntrinsicPat<SIbuffer_load, v2f32, "BUFFER_LOAD_DWORDX2">;
1094defm : MUBUF_LoadIntrinsicPat<SIbuffer_load, v4f32, "BUFFER_LOAD_DWORDX4">;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001095
1096multiclass MUBUF_StoreIntrinsicPat<SDPatternOperator name, ValueType vt,
1097 string opcode> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001098 def : GCNPat<
Tim Renouf4f703f52018-08-21 11:07:10 +00001099 (name vt:$vdata, v4i32:$rsrc, 0, 0, i32:$soffset, imm:$offset,
1100 imm:$cachepolicy, 0),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001101 (!cast<MUBUF_Pseudo>(opcode # _OFFSET_exact) $vdata, $rsrc, $soffset, (as_i16imm $offset),
Tim Renouf4f703f52018-08-21 11:07:10 +00001102 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001103 >;
1104
Matt Arsenault90c75932017-10-03 00:06:41 +00001105 def : GCNPat<
Tim Renouf4f703f52018-08-21 11:07:10 +00001106 (name vt:$vdata, v4i32:$rsrc, 0, i32:$voffset, i32:$soffset, imm:$offset,
1107 imm:$cachepolicy, 0),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001108 (!cast<MUBUF_Pseudo>(opcode # _OFFEN_exact) $vdata, $voffset, $rsrc, $soffset,
Tim Renouf4f703f52018-08-21 11:07:10 +00001109 (as_i16imm $offset), (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001110 >;
1111
Matt Arsenault90c75932017-10-03 00:06:41 +00001112 def : GCNPat<
Tim Renouf4f703f52018-08-21 11:07:10 +00001113 (name vt:$vdata, v4i32:$rsrc, i32:$vindex, 0, i32:$soffset, imm:$offset,
1114 imm:$cachepolicy, imm),
1115 (!cast<MUBUF_Pseudo>(opcode # _IDXEN_exact) $vdata, $vindex, $rsrc, $soffset,
1116 (as_i16imm $offset), (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
1117 >;
1118
1119 def : GCNPat<
1120 (name vt:$vdata, v4i32:$rsrc, i32:$vindex, i32:$voffset, i32:$soffset, imm:$offset,
1121 imm:$cachepolicy, imm),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001122 (!cast<MUBUF_Pseudo>(opcode # _BOTHEN_exact)
1123 $vdata,
1124 (REG_SEQUENCE VReg_64, $vindex, sub0, $voffset, sub1),
1125 $rsrc, $soffset, (as_i16imm $offset),
Tim Renouf4f703f52018-08-21 11:07:10 +00001126 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001127 >;
1128}
1129
Marek Olsak5cec6412017-11-09 01:52:48 +00001130defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format, f32, "BUFFER_STORE_FORMAT_X">;
1131defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format, v2f32, "BUFFER_STORE_FORMAT_XY">;
1132defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format, v4f32, "BUFFER_STORE_FORMAT_XYZW">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001133
1134let SubtargetPredicate = HasUnpackedD16VMem in {
1135 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, f16, "BUFFER_STORE_FORMAT_D16_X_gfx80">;
1136 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, v2i32, "BUFFER_STORE_FORMAT_D16_XY_gfx80">;
1137 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, v4i32, "BUFFER_STORE_FORMAT_D16_XYZW_gfx80">;
1138} // End HasUnpackedD16VMem.
1139
1140let SubtargetPredicate = HasPackedD16VMem in {
1141 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, f16, "BUFFER_STORE_FORMAT_D16_X">;
1142 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, v2f16, "BUFFER_STORE_FORMAT_D16_XY">;
Matt Arsenault02dc7e12018-06-15 15:15:46 +00001143 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, v4f16, "BUFFER_STORE_FORMAT_D16_XYZW">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001144} // End HasPackedD16VMem.
1145
Marek Olsak5cec6412017-11-09 01:52:48 +00001146defm : MUBUF_StoreIntrinsicPat<SIbuffer_store, f32, "BUFFER_STORE_DWORD">;
1147defm : MUBUF_StoreIntrinsicPat<SIbuffer_store, v2f32, "BUFFER_STORE_DWORDX2">;
1148defm : MUBUF_StoreIntrinsicPat<SIbuffer_store, v4f32, "BUFFER_STORE_DWORDX4">;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001149
1150//===----------------------------------------------------------------------===//
1151// buffer_atomic patterns
1152//===----------------------------------------------------------------------===//
1153
1154multiclass BufferAtomicPatterns<SDPatternOperator name, string opcode> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001155 def : GCNPat<
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001156 (name i32:$vdata_in, v4i32:$rsrc, 0,
Tim Renouf4f703f52018-08-21 11:07:10 +00001157 0, i32:$soffset, imm:$offset,
1158 imm:$cachepolicy, 0),
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001159 (!cast<MUBUF_Pseudo>(opcode # _OFFSET_RTN) $vdata_in, $rsrc, $soffset,
Tim Renouf4f703f52018-08-21 11:07:10 +00001160 (as_i16imm $offset), (extract_slc $cachepolicy))
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001161 >;
1162
Matt Arsenault90c75932017-10-03 00:06:41 +00001163 def : GCNPat<
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001164 (name i32:$vdata_in, v4i32:$rsrc, i32:$vindex,
Tim Renouf4f703f52018-08-21 11:07:10 +00001165 0, i32:$soffset, imm:$offset,
1166 imm:$cachepolicy, imm),
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001167 (!cast<MUBUF_Pseudo>(opcode # _IDXEN_RTN) $vdata_in, $vindex, $rsrc, $soffset,
Tim Renouf4f703f52018-08-21 11:07:10 +00001168 (as_i16imm $offset), (extract_slc $cachepolicy))
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001169 >;
1170
Matt Arsenault90c75932017-10-03 00:06:41 +00001171 def : GCNPat<
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001172 (name i32:$vdata_in, v4i32:$rsrc, 0,
Tim Renouf4f703f52018-08-21 11:07:10 +00001173 i32:$voffset, i32:$soffset, imm:$offset,
1174 imm:$cachepolicy, 0),
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001175 (!cast<MUBUF_Pseudo>(opcode # _OFFEN_RTN) $vdata_in, $voffset, $rsrc, $soffset,
Tim Renouf4f703f52018-08-21 11:07:10 +00001176 (as_i16imm $offset), (extract_slc $cachepolicy))
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001177 >;
1178
Matt Arsenault90c75932017-10-03 00:06:41 +00001179 def : GCNPat<
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001180 (name i32:$vdata_in, v4i32:$rsrc, i32:$vindex,
Tim Renouf4f703f52018-08-21 11:07:10 +00001181 i32:$voffset, i32:$soffset, imm:$offset,
1182 imm:$cachepolicy, imm),
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001183 (!cast<MUBUF_Pseudo>(opcode # _BOTHEN_RTN)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001184 $vdata_in,
1185 (REG_SEQUENCE VReg_64, $vindex, sub0, $voffset, sub1),
Tim Renouf4f703f52018-08-21 11:07:10 +00001186 $rsrc, $soffset, (as_i16imm $offset), (extract_slc $cachepolicy))
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001187 >;
1188}
1189
Marek Olsak5cec6412017-11-09 01:52:48 +00001190defm : BufferAtomicPatterns<SIbuffer_atomic_swap, "BUFFER_ATOMIC_SWAP">;
1191defm : BufferAtomicPatterns<SIbuffer_atomic_add, "BUFFER_ATOMIC_ADD">;
1192defm : BufferAtomicPatterns<SIbuffer_atomic_sub, "BUFFER_ATOMIC_SUB">;
1193defm : BufferAtomicPatterns<SIbuffer_atomic_smin, "BUFFER_ATOMIC_SMIN">;
1194defm : BufferAtomicPatterns<SIbuffer_atomic_umin, "BUFFER_ATOMIC_UMIN">;
1195defm : BufferAtomicPatterns<SIbuffer_atomic_smax, "BUFFER_ATOMIC_SMAX">;
1196defm : BufferAtomicPatterns<SIbuffer_atomic_umax, "BUFFER_ATOMIC_UMAX">;
1197defm : BufferAtomicPatterns<SIbuffer_atomic_and, "BUFFER_ATOMIC_AND">;
1198defm : BufferAtomicPatterns<SIbuffer_atomic_or, "BUFFER_ATOMIC_OR">;
1199defm : BufferAtomicPatterns<SIbuffer_atomic_xor, "BUFFER_ATOMIC_XOR">;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001200
Matt Arsenault90c75932017-10-03 00:06:41 +00001201def : GCNPat<
Marek Olsak5cec6412017-11-09 01:52:48 +00001202 (SIbuffer_atomic_cmpswap
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001203 i32:$data, i32:$cmp, v4i32:$rsrc, 0,
Tim Renouf4f703f52018-08-21 11:07:10 +00001204 0, i32:$soffset, imm:$offset,
1205 imm:$cachepolicy, 0),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001206 (EXTRACT_SUBREG
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001207 (BUFFER_ATOMIC_CMPSWAP_OFFSET_RTN
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001208 (REG_SEQUENCE VReg_64, $data, sub0, $cmp, sub1),
Tim Renouf4f703f52018-08-21 11:07:10 +00001209 $rsrc, $soffset, (as_i16imm $offset), (extract_slc $cachepolicy)),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001210 sub0)
1211>;
1212
Matt Arsenault90c75932017-10-03 00:06:41 +00001213def : GCNPat<
Marek Olsak5cec6412017-11-09 01:52:48 +00001214 (SIbuffer_atomic_cmpswap
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001215 i32:$data, i32:$cmp, v4i32:$rsrc, i32:$vindex,
Tim Renouf4f703f52018-08-21 11:07:10 +00001216 0, i32:$soffset, imm:$offset,
1217 imm:$cachepolicy, imm),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001218 (EXTRACT_SUBREG
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001219 (BUFFER_ATOMIC_CMPSWAP_IDXEN_RTN
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001220 (REG_SEQUENCE VReg_64, $data, sub0, $cmp, sub1),
Tim Renouf4f703f52018-08-21 11:07:10 +00001221 $vindex, $rsrc, $soffset, (as_i16imm $offset), (extract_slc $cachepolicy)),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001222 sub0)
1223>;
1224
Matt Arsenault90c75932017-10-03 00:06:41 +00001225def : GCNPat<
Marek Olsak5cec6412017-11-09 01:52:48 +00001226 (SIbuffer_atomic_cmpswap
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001227 i32:$data, i32:$cmp, v4i32:$rsrc, 0,
Tim Renouf4f703f52018-08-21 11:07:10 +00001228 i32:$voffset, i32:$soffset, imm:$offset,
1229 imm:$cachepolicy, 0),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001230 (EXTRACT_SUBREG
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001231 (BUFFER_ATOMIC_CMPSWAP_OFFEN_RTN
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001232 (REG_SEQUENCE VReg_64, $data, sub0, $cmp, sub1),
Tim Renouf4f703f52018-08-21 11:07:10 +00001233 $voffset, $rsrc, $soffset, (as_i16imm $offset), (extract_slc $cachepolicy)),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001234 sub0)
1235>;
1236
Matt Arsenault90c75932017-10-03 00:06:41 +00001237def : GCNPat<
Marek Olsak5cec6412017-11-09 01:52:48 +00001238 (SIbuffer_atomic_cmpswap
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001239 i32:$data, i32:$cmp, v4i32:$rsrc, i32:$vindex,
Tim Renouf4f703f52018-08-21 11:07:10 +00001240 i32:$voffset, i32:$soffset, imm:$offset,
1241 imm:$cachepolicy, imm),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001242 (EXTRACT_SUBREG
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001243 (BUFFER_ATOMIC_CMPSWAP_BOTHEN_RTN
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001244 (REG_SEQUENCE VReg_64, $data, sub0, $cmp, sub1),
1245 (REG_SEQUENCE VReg_64, $vindex, sub0, $voffset, sub1),
Tim Renouf4f703f52018-08-21 11:07:10 +00001246 $rsrc, $soffset, (as_i16imm $offset), (extract_slc $cachepolicy)),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001247 sub0)
1248>;
1249
1250
Tom Stellard115a6152016-11-10 16:02:37 +00001251class MUBUFLoad_PatternADDR64 <MUBUF_Pseudo Instr_ADDR64, ValueType vt,
Matt Arsenault90c75932017-10-03 00:06:41 +00001252 PatFrag constant_ld> : GCNPat <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001253 (vt (constant_ld (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset,
1254 i16:$offset, i1:$glc, i1:$slc, i1:$tfe))),
1255 (Instr_ADDR64 $vaddr, $srsrc, $soffset, $offset, $glc, $slc, $tfe)
1256 >;
1257
1258multiclass MUBUFLoad_Atomic_Pattern <MUBUF_Pseudo Instr_ADDR64, MUBUF_Pseudo Instr_OFFSET,
1259 ValueType vt, PatFrag atomic_ld> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001260 def : GCNPat <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001261 (vt (atomic_ld (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset,
1262 i16:$offset, i1:$slc))),
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +00001263 (Instr_ADDR64 $vaddr, $srsrc, $soffset, $offset, 0, $slc, 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001264 >;
1265
Matt Arsenault90c75932017-10-03 00:06:41 +00001266 def : GCNPat <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001267 (vt (atomic_ld (MUBUFOffsetNoGLC v4i32:$rsrc, i32:$soffset, i16:$offset))),
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +00001268 (Instr_OFFSET $rsrc, $soffset, (as_i16imm $offset), 0, 0, 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001269 >;
1270}
1271
Matt Arsenault90c75932017-10-03 00:06:41 +00001272let SubtargetPredicate = isSICI in {
Tom Stellard115a6152016-11-10 16:02:37 +00001273def : MUBUFLoad_PatternADDR64 <BUFFER_LOAD_SBYTE_ADDR64, i32, sextloadi8_constant>;
1274def : MUBUFLoad_PatternADDR64 <BUFFER_LOAD_UBYTE_ADDR64, i32, az_extloadi8_constant>;
1275def : MUBUFLoad_PatternADDR64 <BUFFER_LOAD_SSHORT_ADDR64, i32, sextloadi16_constant>;
1276def : MUBUFLoad_PatternADDR64 <BUFFER_LOAD_USHORT_ADDR64, i32, az_extloadi16_constant>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001277
1278defm : MUBUFLoad_Atomic_Pattern <BUFFER_LOAD_DWORD_ADDR64, BUFFER_LOAD_DWORD_OFFSET, i32, mubuf_load_atomic>;
1279defm : MUBUFLoad_Atomic_Pattern <BUFFER_LOAD_DWORDX2_ADDR64, BUFFER_LOAD_DWORDX2_OFFSET, i64, mubuf_load_atomic>;
Matt Arsenault90c75932017-10-03 00:06:41 +00001280} // End SubtargetPredicate = isSICI
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001281
Tom Stellard115a6152016-11-10 16:02:37 +00001282multiclass MUBUFLoad_Pattern <MUBUF_Pseudo Instr_OFFSET, ValueType vt,
1283 PatFrag ld> {
1284
Matt Arsenault90c75932017-10-03 00:06:41 +00001285 def : GCNPat <
Tom Stellard115a6152016-11-10 16:02:37 +00001286 (vt (ld (MUBUFOffset v4i32:$srsrc, i32:$soffset,
1287 i16:$offset, i1:$glc, i1:$slc, i1:$tfe))),
1288 (Instr_OFFSET $srsrc, $soffset, $offset, $glc, $slc, $tfe)
1289 >;
1290}
1291
Matt Arsenault90c75932017-10-03 00:06:41 +00001292let OtherPredicates = [Has16BitInsts] in {
Tom Stellard115a6152016-11-10 16:02:37 +00001293
1294defm : MUBUFLoad_Pattern <BUFFER_LOAD_SBYTE_OFFSET, i16, sextloadi8_constant>;
1295defm : MUBUFLoad_Pattern <BUFFER_LOAD_UBYTE_OFFSET, i16, az_extloadi8_constant>;
1296defm : MUBUFLoad_Pattern <BUFFER_LOAD_SBYTE_OFFSET, i16, mubuf_sextloadi8>;
1297defm : MUBUFLoad_Pattern <BUFFER_LOAD_UBYTE_OFFSET, i16, mubuf_az_extloadi8>;
1298
Matt Arsenault65ca292a2017-09-07 05:37:34 +00001299defm : MUBUFLoad_Pattern <BUFFER_LOAD_USHORT_OFFSET, i16, mubuf_load>;
1300
Matt Arsenault90c75932017-10-03 00:06:41 +00001301} // End OtherPredicates = [Has16BitInsts]
Tom Stellard115a6152016-11-10 16:02:37 +00001302
Matt Arsenault0774ea22017-04-24 19:40:59 +00001303multiclass MUBUFScratchLoadPat <MUBUF_Pseudo InstrOffen,
1304 MUBUF_Pseudo InstrOffset,
1305 ValueType vt, PatFrag ld> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001306 def : GCNPat <
Matt Arsenault0774ea22017-04-24 19:40:59 +00001307 (vt (ld (MUBUFScratchOffen v4i32:$srsrc, i32:$vaddr,
1308 i32:$soffset, u16imm:$offset))),
1309 (InstrOffen $vaddr, $srsrc, $soffset, $offset, 0, 0, 0)
1310 >;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001311
Matt Arsenault90c75932017-10-03 00:06:41 +00001312 def : GCNPat <
Matt Arsenault0774ea22017-04-24 19:40:59 +00001313 (vt (ld (MUBUFScratchOffset v4i32:$srsrc, i32:$soffset, u16imm:$offset))),
1314 (InstrOffset $srsrc, $soffset, $offset, 0, 0, 0)
1315 >;
1316}
1317
Matt Arsenaultb81495d2017-09-20 05:01:53 +00001318// XXX - Is it possible to have a complex pattern in a PatFrag?
1319multiclass MUBUFScratchLoadPat_Hi16 <MUBUF_Pseudo InstrOffen,
1320 MUBUF_Pseudo InstrOffset,
1321 ValueType vt, PatFrag ld> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001322 def : GCNPat <
Matt Arsenaultb81495d2017-09-20 05:01:53 +00001323 (build_vector vt:$lo, (vt (ld (MUBUFScratchOffen v4i32:$srsrc, i32:$vaddr,
1324 i32:$soffset, u16imm:$offset)))),
1325 (v2i16 (InstrOffen $vaddr, $srsrc, $soffset, $offset, 0, 0, 0, $lo))
1326 >;
1327
Matt Arsenault90c75932017-10-03 00:06:41 +00001328 def : GCNPat <
Matt Arsenaultb81495d2017-09-20 05:01:53 +00001329 (build_vector f16:$lo, (f16 (bitconvert (vt (ld (MUBUFScratchOffen v4i32:$srsrc, i32:$vaddr,
1330 i32:$soffset, u16imm:$offset)))))),
1331 (v2f16 (InstrOffen $vaddr, $srsrc, $soffset, $offset, 0, 0, 0, $lo))
1332 >;
1333
1334
Matt Arsenault90c75932017-10-03 00:06:41 +00001335 def : GCNPat <
Matt Arsenaultb81495d2017-09-20 05:01:53 +00001336 (build_vector vt:$lo, (vt (ld (MUBUFScratchOffset v4i32:$srsrc, i32:$soffset, u16imm:$offset)))),
1337 (v2i16 (InstrOffset $srsrc, $soffset, $offset, 0, 0, 0, $lo))
1338 >;
1339
Matt Arsenault90c75932017-10-03 00:06:41 +00001340 def : GCNPat <
Matt Arsenaultb81495d2017-09-20 05:01:53 +00001341 (build_vector f16:$lo, (f16 (bitconvert (vt (ld (MUBUFScratchOffset v4i32:$srsrc, i32:$soffset, u16imm:$offset)))))),
1342 (v2f16 (InstrOffset $srsrc, $soffset, $offset, 0, 0, 0, $lo))
1343 >;
1344}
1345
Matt Arsenaulte1cd4822017-11-13 00:22:09 +00001346multiclass MUBUFScratchLoadPat_Lo16 <MUBUF_Pseudo InstrOffen,
1347 MUBUF_Pseudo InstrOffset,
1348 ValueType vt, PatFrag ld> {
1349 def : GCNPat <
1350 (build_vector (vt (ld (MUBUFScratchOffen v4i32:$srsrc, i32:$vaddr,
1351 i32:$soffset, u16imm:$offset))),
1352 (vt (Hi16Elt vt:$hi))),
1353 (v2i16 (InstrOffen $vaddr, $srsrc, $soffset, $offset, 0, 0, 0, $hi))
1354 >;
1355
1356 def : GCNPat <
1357 (build_vector (f16 (bitconvert (vt (ld (MUBUFScratchOffen v4i32:$srsrc, i32:$vaddr,
1358 i32:$soffset, u16imm:$offset))))),
1359 (f16 (Hi16Elt f16:$hi))),
1360 (v2f16 (InstrOffen $vaddr, $srsrc, $soffset, $offset, 0, 0, 0, $hi))
1361 >;
1362
1363 def : GCNPat <
1364 (build_vector (vt (ld (MUBUFScratchOffset v4i32:$srsrc, i32:$soffset, u16imm:$offset))),
1365 (vt (Hi16Elt vt:$hi))),
1366 (v2i16 (InstrOffset $srsrc, $soffset, $offset, 0, 0, 0, $hi))
1367 >;
1368
1369 def : GCNPat <
1370 (build_vector (f16 (bitconvert (vt (ld (MUBUFScratchOffset v4i32:$srsrc, i32:$soffset, u16imm:$offset))))),
1371 (f16 (Hi16Elt f16:$hi))),
1372 (v2f16 (InstrOffset $srsrc, $soffset, $offset, 0, 0, 0, $hi))
1373 >;
1374}
1375
Matt Arsenault0774ea22017-04-24 19:40:59 +00001376defm : MUBUFScratchLoadPat <BUFFER_LOAD_SBYTE_OFFEN, BUFFER_LOAD_SBYTE_OFFSET, i32, sextloadi8_private>;
Matt Arsenaultbc683832017-09-20 03:43:35 +00001377defm : MUBUFScratchLoadPat <BUFFER_LOAD_UBYTE_OFFEN, BUFFER_LOAD_UBYTE_OFFSET, i32, az_extloadi8_private>;
Matt Arsenault0774ea22017-04-24 19:40:59 +00001378defm : MUBUFScratchLoadPat <BUFFER_LOAD_SBYTE_OFFEN, BUFFER_LOAD_SBYTE_OFFSET, i16, sextloadi8_private>;
Matt Arsenaultbc683832017-09-20 03:43:35 +00001379defm : MUBUFScratchLoadPat <BUFFER_LOAD_UBYTE_OFFEN, BUFFER_LOAD_UBYTE_OFFSET, i16, az_extloadi8_private>;
Matt Arsenault0774ea22017-04-24 19:40:59 +00001380defm : MUBUFScratchLoadPat <BUFFER_LOAD_SSHORT_OFFEN, BUFFER_LOAD_SSHORT_OFFSET, i32, sextloadi16_private>;
Matt Arsenaultbc683832017-09-20 03:43:35 +00001381defm : MUBUFScratchLoadPat <BUFFER_LOAD_USHORT_OFFEN, BUFFER_LOAD_USHORT_OFFSET, i32, az_extloadi16_private>;
Matt Arsenault65ca292a2017-09-07 05:37:34 +00001382defm : MUBUFScratchLoadPat <BUFFER_LOAD_USHORT_OFFEN, BUFFER_LOAD_USHORT_OFFSET, i16, load_private>;
Matt Arsenault0774ea22017-04-24 19:40:59 +00001383defm : MUBUFScratchLoadPat <BUFFER_LOAD_DWORD_OFFEN, BUFFER_LOAD_DWORD_OFFSET, i32, load_private>;
1384defm : MUBUFScratchLoadPat <BUFFER_LOAD_DWORDX2_OFFEN, BUFFER_LOAD_DWORDX2_OFFSET, v2i32, load_private>;
1385defm : MUBUFScratchLoadPat <BUFFER_LOAD_DWORDX4_OFFEN, BUFFER_LOAD_DWORDX4_OFFSET, v4i32, load_private>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001386
Konstantin Zhuravlyovc2c2eb72018-05-04 20:06:57 +00001387let OtherPredicates = [D16PreservesUnusedBits] in {
Matt Arsenaultb81495d2017-09-20 05:01:53 +00001388defm : MUBUFScratchLoadPat_Hi16<BUFFER_LOAD_SHORT_D16_HI_OFFEN, BUFFER_LOAD_SHORT_D16_HI_OFFSET, i16, load_private>;
1389defm : MUBUFScratchLoadPat_Hi16<BUFFER_LOAD_UBYTE_D16_HI_OFFEN, BUFFER_LOAD_UBYTE_D16_HI_OFFSET, i16, az_extloadi8_private>;
1390defm : MUBUFScratchLoadPat_Hi16<BUFFER_LOAD_SBYTE_D16_HI_OFFEN, BUFFER_LOAD_SBYTE_D16_HI_OFFSET, i16, sextloadi8_private>;
Matt Arsenaulte1cd4822017-11-13 00:22:09 +00001391
1392defm : MUBUFScratchLoadPat_Lo16<BUFFER_LOAD_SHORT_D16_OFFEN, BUFFER_LOAD_SHORT_D16_OFFSET, i16, load_private>;
1393defm : MUBUFScratchLoadPat_Lo16<BUFFER_LOAD_UBYTE_D16_OFFEN, BUFFER_LOAD_UBYTE_D16_OFFSET, i16, az_extloadi8_private>;
1394defm : MUBUFScratchLoadPat_Lo16<BUFFER_LOAD_SBYTE_D16_OFFEN, BUFFER_LOAD_SBYTE_D16_OFFSET, i16, sextloadi8_private>;
Matt Arsenaultb81495d2017-09-20 05:01:53 +00001395}
1396
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001397// BUFFER_LOAD_DWORD*, addr64=0
1398multiclass MUBUF_Load_Dword <ValueType vt,
1399 MUBUF_Pseudo offset,
1400 MUBUF_Pseudo offen,
1401 MUBUF_Pseudo idxen,
1402 MUBUF_Pseudo bothen> {
1403
Matt Arsenault90c75932017-10-03 00:06:41 +00001404 def : GCNPat <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001405 (vt (int_SI_buffer_load_dword v4i32:$rsrc, (i32 imm), i32:$soffset,
1406 imm:$offset, 0, 0, imm:$glc, imm:$slc,
1407 imm:$tfe)),
1408 (offset $rsrc, $soffset, (as_i16imm $offset), (as_i1imm $glc),
1409 (as_i1imm $slc), (as_i1imm $tfe))
1410 >;
1411
Matt Arsenault90c75932017-10-03 00:06:41 +00001412 def : GCNPat <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001413 (vt (int_SI_buffer_load_dword v4i32:$rsrc, i32:$vaddr, i32:$soffset,
1414 imm:$offset, 1, 0, imm:$glc, imm:$slc,
1415 imm:$tfe)),
1416 (offen $vaddr, $rsrc, $soffset, (as_i16imm $offset), (as_i1imm $glc), (as_i1imm $slc),
1417 (as_i1imm $tfe))
1418 >;
1419
Matt Arsenault90c75932017-10-03 00:06:41 +00001420 def : GCNPat <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001421 (vt (int_SI_buffer_load_dword v4i32:$rsrc, i32:$vaddr, i32:$soffset,
1422 imm:$offset, 0, 1, imm:$glc, imm:$slc,
1423 imm:$tfe)),
1424 (idxen $vaddr, $rsrc, $soffset, (as_i16imm $offset), (as_i1imm $glc),
1425 (as_i1imm $slc), (as_i1imm $tfe))
1426 >;
1427
Matt Arsenault90c75932017-10-03 00:06:41 +00001428 def : GCNPat <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001429 (vt (int_SI_buffer_load_dword v4i32:$rsrc, v2i32:$vaddr, i32:$soffset,
1430 imm:$offset, 1, 1, imm:$glc, imm:$slc,
1431 imm:$tfe)),
1432 (bothen $vaddr, $rsrc, $soffset, (as_i16imm $offset), (as_i1imm $glc), (as_i1imm $slc),
1433 (as_i1imm $tfe))
1434 >;
1435}
1436
1437defm : MUBUF_Load_Dword <i32, BUFFER_LOAD_DWORD_OFFSET, BUFFER_LOAD_DWORD_OFFEN,
1438 BUFFER_LOAD_DWORD_IDXEN, BUFFER_LOAD_DWORD_BOTHEN>;
1439defm : MUBUF_Load_Dword <v2i32, BUFFER_LOAD_DWORDX2_OFFSET, BUFFER_LOAD_DWORDX2_OFFEN,
1440 BUFFER_LOAD_DWORDX2_IDXEN, BUFFER_LOAD_DWORDX2_BOTHEN>;
1441defm : MUBUF_Load_Dword <v4i32, BUFFER_LOAD_DWORDX4_OFFSET, BUFFER_LOAD_DWORDX4_OFFEN,
1442 BUFFER_LOAD_DWORDX4_IDXEN, BUFFER_LOAD_DWORDX4_BOTHEN>;
1443
1444multiclass MUBUFStore_Atomic_Pattern <MUBUF_Pseudo Instr_ADDR64, MUBUF_Pseudo Instr_OFFSET,
1445 ValueType vt, PatFrag atomic_st> {
1446 // Store follows atomic op convention so address is forst
Matt Arsenault90c75932017-10-03 00:06:41 +00001447 def : GCNPat <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001448 (atomic_st (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset,
1449 i16:$offset, i1:$slc), vt:$val),
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +00001450 (Instr_ADDR64 $val, $vaddr, $srsrc, $soffset, $offset, 0, $slc, 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001451 >;
1452
Matt Arsenault90c75932017-10-03 00:06:41 +00001453 def : GCNPat <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001454 (atomic_st (MUBUFOffsetNoGLC v4i32:$rsrc, i32:$soffset, i16:$offset), vt:$val),
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +00001455 (Instr_OFFSET $val, $rsrc, $soffset, (as_i16imm $offset), 0, 0, 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001456 >;
1457}
Matt Arsenault90c75932017-10-03 00:06:41 +00001458let SubtargetPredicate = isSICI in {
Matt Arsenaultbc683832017-09-20 03:43:35 +00001459defm : MUBUFStore_Atomic_Pattern <BUFFER_STORE_DWORD_ADDR64, BUFFER_STORE_DWORD_OFFSET, i32, store_atomic_global>;
1460defm : MUBUFStore_Atomic_Pattern <BUFFER_STORE_DWORDX2_ADDR64, BUFFER_STORE_DWORDX2_OFFSET, i64, store_atomic_global>;
Matt Arsenault90c75932017-10-03 00:06:41 +00001461} // End Predicates = isSICI
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001462
Tom Stellard115a6152016-11-10 16:02:37 +00001463
1464multiclass MUBUFStore_Pattern <MUBUF_Pseudo Instr_OFFSET, ValueType vt,
1465 PatFrag st> {
1466
Matt Arsenault90c75932017-10-03 00:06:41 +00001467 def : GCNPat <
Tom Stellard115a6152016-11-10 16:02:37 +00001468 (st vt:$vdata, (MUBUFOffset v4i32:$srsrc, i32:$soffset,
1469 i16:$offset, i1:$glc, i1:$slc, i1:$tfe)),
1470 (Instr_OFFSET $vdata, $srsrc, $soffset, $offset, $glc, $slc, $tfe)
1471 >;
1472}
1473
1474defm : MUBUFStore_Pattern <BUFFER_STORE_BYTE_OFFSET, i16, truncstorei8_global>;
Matt Arsenaultbc683832017-09-20 03:43:35 +00001475defm : MUBUFStore_Pattern <BUFFER_STORE_SHORT_OFFSET, i16, store_global>;
Tom Stellard115a6152016-11-10 16:02:37 +00001476
Matt Arsenault0774ea22017-04-24 19:40:59 +00001477multiclass MUBUFScratchStorePat <MUBUF_Pseudo InstrOffen,
1478 MUBUF_Pseudo InstrOffset,
1479 ValueType vt, PatFrag st> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001480 def : GCNPat <
Matt Arsenault0774ea22017-04-24 19:40:59 +00001481 (st vt:$value, (MUBUFScratchOffen v4i32:$srsrc, i32:$vaddr,
1482 i32:$soffset, u16imm:$offset)),
1483 (InstrOffen $value, $vaddr, $srsrc, $soffset, $offset, 0, 0, 0)
1484 >;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001485
Matt Arsenault90c75932017-10-03 00:06:41 +00001486 def : GCNPat <
Matt Arsenault0774ea22017-04-24 19:40:59 +00001487 (st vt:$value, (MUBUFScratchOffset v4i32:$srsrc, i32:$soffset,
1488 u16imm:$offset)),
1489 (InstrOffset $value, $srsrc, $soffset, $offset, 0, 0, 0)
1490 >;
1491}
1492
1493defm : MUBUFScratchStorePat <BUFFER_STORE_BYTE_OFFEN, BUFFER_STORE_BYTE_OFFSET, i32, truncstorei8_private>;
1494defm : MUBUFScratchStorePat <BUFFER_STORE_SHORT_OFFEN, BUFFER_STORE_SHORT_OFFSET, i32, truncstorei16_private>;
1495defm : MUBUFScratchStorePat <BUFFER_STORE_BYTE_OFFEN, BUFFER_STORE_BYTE_OFFSET, i16, truncstorei8_private>;
1496defm : MUBUFScratchStorePat <BUFFER_STORE_SHORT_OFFEN, BUFFER_STORE_SHORT_OFFSET, i16, store_private>;
1497defm : MUBUFScratchStorePat <BUFFER_STORE_DWORD_OFFEN, BUFFER_STORE_DWORD_OFFSET, i32, store_private>;
1498defm : MUBUFScratchStorePat <BUFFER_STORE_DWORDX2_OFFEN, BUFFER_STORE_DWORDX2_OFFSET, v2i32, store_private>;
1499defm : MUBUFScratchStorePat <BUFFER_STORE_DWORDX4_OFFEN, BUFFER_STORE_DWORDX4_OFFSET, v4i32, store_private>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001500
Matt Arsenaultfcc213f2017-09-20 03:20:09 +00001501
Konstantin Zhuravlyovc2c2eb72018-05-04 20:06:57 +00001502let OtherPredicates = [D16PreservesUnusedBits] in {
Matt Arsenaultfcc213f2017-09-20 03:20:09 +00001503 // Hiding the extract high pattern in the PatFrag seems to not
1504 // automatically increase the complexity.
1505let AddedComplexity = 1 in {
Matt Arsenaultbc683832017-09-20 03:43:35 +00001506defm : MUBUFScratchStorePat <BUFFER_STORE_SHORT_D16_HI_OFFEN, BUFFER_STORE_SHORT_D16_HI_OFFSET, i32, store_hi16_private>;
1507defm : MUBUFScratchStorePat <BUFFER_STORE_BYTE_D16_HI_OFFEN, BUFFER_STORE_BYTE_D16_HI_OFFSET, i32, truncstorei8_hi16_private>;
Matt Arsenaultfcc213f2017-09-20 03:20:09 +00001508}
1509}
1510
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001511//===----------------------------------------------------------------------===//
1512// MTBUF Patterns
1513//===----------------------------------------------------------------------===//
1514
David Stuttard70e8bc12017-06-22 16:29:22 +00001515//===----------------------------------------------------------------------===//
1516// tbuffer_load/store_format patterns
1517//===----------------------------------------------------------------------===//
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001518
David Stuttard70e8bc12017-06-22 16:29:22 +00001519multiclass MTBUF_LoadIntrinsicPat<SDPatternOperator name, ValueType vt,
1520 string opcode> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001521 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001522 (vt (name v4i32:$rsrc, 0, 0, i32:$soffset, imm:$offset,
Tim Renouf35484c92018-08-21 11:06:05 +00001523 imm:$format, imm:$cachepolicy, 0)),
David Stuttard70e8bc12017-06-22 16:29:22 +00001524 (!cast<MTBUF_Pseudo>(opcode # _OFFSET) $rsrc, $soffset, (as_i16imm $offset),
Tim Renouf35484c92018-08-21 11:06:05 +00001525 (as_i8imm $format),
1526 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
David Stuttard70e8bc12017-06-22 16:29:22 +00001527 >;
1528
Matt Arsenault90c75932017-10-03 00:06:41 +00001529 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001530 (vt (name v4i32:$rsrc, i32:$vindex, 0, i32:$soffset, imm:$offset,
Tim Renouf35484c92018-08-21 11:06:05 +00001531 imm:$format, imm:$cachepolicy, imm)),
David Stuttard70e8bc12017-06-22 16:29:22 +00001532 (!cast<MTBUF_Pseudo>(opcode # _IDXEN) $vindex, $rsrc, $soffset, (as_i16imm $offset),
Tim Renouf35484c92018-08-21 11:06:05 +00001533 (as_i8imm $format),
1534 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
David Stuttard70e8bc12017-06-22 16:29:22 +00001535 >;
1536
Matt Arsenault90c75932017-10-03 00:06:41 +00001537 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001538 (vt (name v4i32:$rsrc, 0, i32:$voffset, i32:$soffset, imm:$offset,
Tim Renouf35484c92018-08-21 11:06:05 +00001539 imm:$format, imm:$cachepolicy, 0)),
David Stuttard70e8bc12017-06-22 16:29:22 +00001540 (!cast<MTBUF_Pseudo>(opcode # _OFFEN) $voffset, $rsrc, $soffset, (as_i16imm $offset),
Tim Renouf35484c92018-08-21 11:06:05 +00001541 (as_i8imm $format),
1542 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
David Stuttard70e8bc12017-06-22 16:29:22 +00001543 >;
1544
Matt Arsenault90c75932017-10-03 00:06:41 +00001545 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001546 (vt (name v4i32:$rsrc, i32:$vindex, i32:$voffset, i32:$soffset, imm:$offset,
Tim Renouf35484c92018-08-21 11:06:05 +00001547 imm:$format, imm:$cachepolicy, imm)),
David Stuttard70e8bc12017-06-22 16:29:22 +00001548 (!cast<MTBUF_Pseudo>(opcode # _BOTHEN)
1549 (REG_SEQUENCE VReg_64, $vindex, sub0, $voffset, sub1),
1550 $rsrc, $soffset, (as_i16imm $offset),
Tim Renouf35484c92018-08-21 11:06:05 +00001551 (as_i8imm $format),
1552 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
David Stuttard70e8bc12017-06-22 16:29:22 +00001553 >;
1554}
1555
1556defm : MTBUF_LoadIntrinsicPat<SItbuffer_load, i32, "TBUFFER_LOAD_FORMAT_X">;
1557defm : MTBUF_LoadIntrinsicPat<SItbuffer_load, v2i32, "TBUFFER_LOAD_FORMAT_XY">;
1558defm : MTBUF_LoadIntrinsicPat<SItbuffer_load, v4i32, "TBUFFER_LOAD_FORMAT_XYZW">;
1559defm : MTBUF_LoadIntrinsicPat<SItbuffer_load, f32, "TBUFFER_LOAD_FORMAT_X">;
1560defm : MTBUF_LoadIntrinsicPat<SItbuffer_load, v2f32, "TBUFFER_LOAD_FORMAT_XY">;
1561defm : MTBUF_LoadIntrinsicPat<SItbuffer_load, v4f32, "TBUFFER_LOAD_FORMAT_XYZW">;
1562
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001563let SubtargetPredicate = HasUnpackedD16VMem in {
Matt Arsenault1349a042018-05-22 06:32:10 +00001564 defm : MTBUF_LoadIntrinsicPat<SItbuffer_load_d16, f16, "TBUFFER_LOAD_FORMAT_D16_X_gfx80">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001565 defm : MTBUF_LoadIntrinsicPat<SItbuffer_load_d16, v2i32, "TBUFFER_LOAD_FORMAT_D16_XY_gfx80">;
1566 defm : MTBUF_LoadIntrinsicPat<SItbuffer_load_d16, v4i32, "TBUFFER_LOAD_FORMAT_D16_XYZW_gfx80">;
1567} // End HasUnpackedD16VMem.
1568
1569let SubtargetPredicate = HasPackedD16VMem in {
Matt Arsenault1349a042018-05-22 06:32:10 +00001570 defm : MTBUF_LoadIntrinsicPat<SItbuffer_load_d16, f16, "TBUFFER_LOAD_FORMAT_D16_X">;
1571 defm : MTBUF_LoadIntrinsicPat<SItbuffer_load_d16, v2f16, "TBUFFER_LOAD_FORMAT_D16_XY">;
Matt Arsenault02dc7e12018-06-15 15:15:46 +00001572 defm : MTBUF_LoadIntrinsicPat<SItbuffer_load_d16, v4f16, "TBUFFER_LOAD_FORMAT_D16_XYZW">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001573} // End HasPackedD16VMem.
1574
David Stuttard70e8bc12017-06-22 16:29:22 +00001575multiclass MTBUF_StoreIntrinsicPat<SDPatternOperator name, ValueType vt,
1576 string opcode> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001577 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001578 (name vt:$vdata, v4i32:$rsrc, 0, 0, i32:$soffset, imm:$offset,
Tim Renouf35484c92018-08-21 11:06:05 +00001579 imm:$format, imm:$cachepolicy, 0),
David Stuttard70e8bc12017-06-22 16:29:22 +00001580 (!cast<MTBUF_Pseudo>(opcode # _OFFSET_exact) $vdata, $rsrc, $soffset,
Tim Renouf35484c92018-08-21 11:06:05 +00001581 (as_i16imm $offset), (as_i8imm $format),
1582 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
David Stuttard70e8bc12017-06-22 16:29:22 +00001583 >;
1584
Matt Arsenault90c75932017-10-03 00:06:41 +00001585 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001586 (name vt:$vdata, v4i32:$rsrc, i32:$vindex, 0, i32:$soffset, imm:$offset,
Tim Renouf35484c92018-08-21 11:06:05 +00001587 imm:$format, imm:$cachepolicy, imm),
David Stuttard70e8bc12017-06-22 16:29:22 +00001588 (!cast<MTBUF_Pseudo>(opcode # _IDXEN_exact) $vdata, $vindex, $rsrc, $soffset,
Tim Renouf35484c92018-08-21 11:06:05 +00001589 (as_i16imm $offset), (as_i8imm $format),
1590 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
David Stuttard70e8bc12017-06-22 16:29:22 +00001591 >;
1592
Matt Arsenault90c75932017-10-03 00:06:41 +00001593 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001594 (name vt:$vdata, v4i32:$rsrc, 0, i32:$voffset, i32:$soffset, imm:$offset,
Tim Renouf35484c92018-08-21 11:06:05 +00001595 imm:$format, imm:$cachepolicy, 0),
David Stuttard70e8bc12017-06-22 16:29:22 +00001596 (!cast<MTBUF_Pseudo>(opcode # _OFFEN_exact) $vdata, $voffset, $rsrc, $soffset,
Tim Renouf35484c92018-08-21 11:06:05 +00001597 (as_i16imm $offset), (as_i8imm $format),
1598 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
David Stuttard70e8bc12017-06-22 16:29:22 +00001599 >;
1600
Matt Arsenault90c75932017-10-03 00:06:41 +00001601 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001602 (name vt:$vdata, v4i32:$rsrc, i32:$vindex, i32:$voffset, i32:$soffset,
Tim Renouf35484c92018-08-21 11:06:05 +00001603 imm:$offset, imm:$format, imm:$cachepolicy, imm),
David Stuttard70e8bc12017-06-22 16:29:22 +00001604 (!cast<MTBUF_Pseudo>(opcode # _BOTHEN_exact)
1605 $vdata,
1606 (REG_SEQUENCE VReg_64, $vindex, sub0, $voffset, sub1),
Tim Renouf35484c92018-08-21 11:06:05 +00001607 $rsrc, $soffset, (as_i16imm $offset), (as_i8imm $format),
1608 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
David Stuttard70e8bc12017-06-22 16:29:22 +00001609 >;
1610}
1611
1612defm : MTBUF_StoreIntrinsicPat<SItbuffer_store, i32, "TBUFFER_STORE_FORMAT_X">;
1613defm : MTBUF_StoreIntrinsicPat<SItbuffer_store, v2i32, "TBUFFER_STORE_FORMAT_XY">;
1614defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_x3, v4i32, "TBUFFER_STORE_FORMAT_XYZ">;
1615defm : MTBUF_StoreIntrinsicPat<SItbuffer_store, v4i32, "TBUFFER_STORE_FORMAT_XYZW">;
1616defm : MTBUF_StoreIntrinsicPat<SItbuffer_store, f32, "TBUFFER_STORE_FORMAT_X">;
1617defm : MTBUF_StoreIntrinsicPat<SItbuffer_store, v2f32, "TBUFFER_STORE_FORMAT_XY">;
1618defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_x3, v4f32, "TBUFFER_STORE_FORMAT_XYZ">;
1619defm : MTBUF_StoreIntrinsicPat<SItbuffer_store, v4f32, "TBUFFER_STORE_FORMAT_XYZW">;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001620
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001621let SubtargetPredicate = HasUnpackedD16VMem in {
1622 defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_d16, f16, "TBUFFER_STORE_FORMAT_D16_X_gfx80">;
1623 defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_d16, v2i32, "TBUFFER_STORE_FORMAT_D16_XY_gfx80">;
1624 defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_d16, v4i32, "TBUFFER_STORE_FORMAT_D16_XYZW_gfx80">;
1625} // End HasUnpackedD16VMem.
1626
1627let SubtargetPredicate = HasPackedD16VMem in {
1628 defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_d16, f16, "TBUFFER_STORE_FORMAT_D16_X">;
1629 defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_d16, v2f16, "TBUFFER_STORE_FORMAT_D16_XY">;
Matt Arsenault02dc7e12018-06-15 15:15:46 +00001630 defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_d16, v4f16, "TBUFFER_STORE_FORMAT_D16_XYZW">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001631} // End HasPackedD16VMem.
1632
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001633//===----------------------------------------------------------------------===//
1634// Target instructions, move to the appropriate target TD file
1635//===----------------------------------------------------------------------===//
1636
1637//===----------------------------------------------------------------------===//
1638// SI
1639//===----------------------------------------------------------------------===//
1640
1641class MUBUF_Real_si <bits<7> op, MUBUF_Pseudo ps> :
1642 MUBUF_Real<op, ps>,
1643 Enc64,
1644 SIMCInstr<ps.PseudoInstr, SIEncodingFamily.SI> {
1645 let AssemblerPredicate=isSICI;
1646 let DecoderNamespace="SICI";
1647
1648 let Inst{11-0} = !if(ps.has_offset, offset, ?);
1649 let Inst{12} = ps.offen;
1650 let Inst{13} = ps.idxen;
1651 let Inst{14} = !if(ps.has_glc, glc, ps.glc_value);
1652 let Inst{15} = ps.addr64;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001653 let Inst{16} = !if(ps.lds, 1, 0);
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001654 let Inst{24-18} = op;
1655 let Inst{31-26} = 0x38; //encoding
1656 let Inst{39-32} = !if(ps.has_vaddr, vaddr, ?);
1657 let Inst{47-40} = !if(ps.has_vdata, vdata, ?);
1658 let Inst{52-48} = !if(ps.has_srsrc, srsrc{6-2}, ?);
1659 let Inst{54} = !if(ps.has_slc, slc, ?);
1660 let Inst{55} = !if(ps.has_tfe, tfe, ?);
1661 let Inst{63-56} = !if(ps.has_soffset, soffset, ?);
1662}
1663
1664multiclass MUBUF_Real_AllAddr_si<bits<7> op> {
1665 def _OFFSET_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET")>;
1666 def _ADDR64_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_ADDR64")>;
1667 def _OFFEN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN")>;
1668 def _IDXEN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN")>;
1669 def _BOTHEN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN")>;
1670}
1671
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001672multiclass MUBUF_Real_AllAddr_Lds_si<bits<7> op> {
1673
1674 def _OFFSET_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001675 MUBUFLdsTable<0, NAME # "_OFFSET_si">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001676 def _ADDR64_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_ADDR64")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001677 MUBUFLdsTable<0, NAME # "_ADDR64_si">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001678 def _OFFEN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001679 MUBUFLdsTable<0, NAME # "_OFFEN_si">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001680 def _IDXEN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001681 MUBUFLdsTable<0, NAME # "_IDXEN_si">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001682 def _BOTHEN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001683 MUBUFLdsTable<0, NAME # "_BOTHEN_si">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001684
1685 def _LDS_OFFSET_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_LDS_OFFSET")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001686 MUBUFLdsTable<1, NAME # "_OFFSET_si">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001687 def _LDS_ADDR64_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_LDS_ADDR64")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001688 MUBUFLdsTable<1, NAME # "_ADDR64_si">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001689 def _LDS_OFFEN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_LDS_OFFEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001690 MUBUFLdsTable<1, NAME # "_OFFEN_si">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001691 def _LDS_IDXEN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_LDS_IDXEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001692 MUBUFLdsTable<1, NAME # "_IDXEN_si">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001693 def _LDS_BOTHEN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_LDS_BOTHEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001694 MUBUFLdsTable<1, NAME # "_BOTHEN_si">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001695}
1696
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001697multiclass MUBUF_Real_Atomic_si<bits<7> op> : MUBUF_Real_AllAddr_si<op> {
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001698 def _OFFSET_RTN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET_RTN")>;
1699 def _ADDR64_RTN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_ADDR64_RTN")>;
1700 def _OFFEN_RTN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN_RTN")>;
1701 def _IDXEN_RTN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN_RTN")>;
1702 def _BOTHEN_RTN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN_RTN")>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001703}
1704
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001705defm BUFFER_LOAD_FORMAT_X : MUBUF_Real_AllAddr_Lds_si <0x00>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001706defm BUFFER_LOAD_FORMAT_XY : MUBUF_Real_AllAddr_si <0x01>;
1707defm BUFFER_LOAD_FORMAT_XYZ : MUBUF_Real_AllAddr_si <0x02>;
1708defm BUFFER_LOAD_FORMAT_XYZW : MUBUF_Real_AllAddr_si <0x03>;
1709defm BUFFER_STORE_FORMAT_X : MUBUF_Real_AllAddr_si <0x04>;
1710defm BUFFER_STORE_FORMAT_XY : MUBUF_Real_AllAddr_si <0x05>;
1711defm BUFFER_STORE_FORMAT_XYZ : MUBUF_Real_AllAddr_si <0x06>;
1712defm BUFFER_STORE_FORMAT_XYZW : MUBUF_Real_AllAddr_si <0x07>;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001713defm BUFFER_LOAD_UBYTE : MUBUF_Real_AllAddr_Lds_si <0x08>;
1714defm BUFFER_LOAD_SBYTE : MUBUF_Real_AllAddr_Lds_si <0x09>;
1715defm BUFFER_LOAD_USHORT : MUBUF_Real_AllAddr_Lds_si <0x0a>;
1716defm BUFFER_LOAD_SSHORT : MUBUF_Real_AllAddr_Lds_si <0x0b>;
1717defm BUFFER_LOAD_DWORD : MUBUF_Real_AllAddr_Lds_si <0x0c>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001718defm BUFFER_LOAD_DWORDX2 : MUBUF_Real_AllAddr_si <0x0d>;
1719defm BUFFER_LOAD_DWORDX4 : MUBUF_Real_AllAddr_si <0x0e>;
Artem Tamazov73f1ab22016-10-07 15:53:16 +00001720defm BUFFER_LOAD_DWORDX3 : MUBUF_Real_AllAddr_si <0x0f>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001721defm BUFFER_STORE_BYTE : MUBUF_Real_AllAddr_si <0x18>;
1722defm BUFFER_STORE_SHORT : MUBUF_Real_AllAddr_si <0x1a>;
1723defm BUFFER_STORE_DWORD : MUBUF_Real_AllAddr_si <0x1c>;
1724defm BUFFER_STORE_DWORDX2 : MUBUF_Real_AllAddr_si <0x1d>;
1725defm BUFFER_STORE_DWORDX4 : MUBUF_Real_AllAddr_si <0x1e>;
Artem Tamazov73f1ab22016-10-07 15:53:16 +00001726defm BUFFER_STORE_DWORDX3 : MUBUF_Real_AllAddr_si <0x1f>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001727
1728defm BUFFER_ATOMIC_SWAP : MUBUF_Real_Atomic_si <0x30>;
1729defm BUFFER_ATOMIC_CMPSWAP : MUBUF_Real_Atomic_si <0x31>;
1730defm BUFFER_ATOMIC_ADD : MUBUF_Real_Atomic_si <0x32>;
1731defm BUFFER_ATOMIC_SUB : MUBUF_Real_Atomic_si <0x33>;
1732//defm BUFFER_ATOMIC_RSUB : MUBUF_Real_Atomic_si <0x34>; // isn't on CI & VI
1733defm BUFFER_ATOMIC_SMIN : MUBUF_Real_Atomic_si <0x35>;
1734defm BUFFER_ATOMIC_UMIN : MUBUF_Real_Atomic_si <0x36>;
1735defm BUFFER_ATOMIC_SMAX : MUBUF_Real_Atomic_si <0x37>;
1736defm BUFFER_ATOMIC_UMAX : MUBUF_Real_Atomic_si <0x38>;
1737defm BUFFER_ATOMIC_AND : MUBUF_Real_Atomic_si <0x39>;
1738defm BUFFER_ATOMIC_OR : MUBUF_Real_Atomic_si <0x3a>;
1739defm BUFFER_ATOMIC_XOR : MUBUF_Real_Atomic_si <0x3b>;
1740defm BUFFER_ATOMIC_INC : MUBUF_Real_Atomic_si <0x3c>;
1741defm BUFFER_ATOMIC_DEC : MUBUF_Real_Atomic_si <0x3d>;
1742
1743//defm BUFFER_ATOMIC_FCMPSWAP : MUBUF_Real_Atomic_si <0x3e>; // isn't on VI
1744//defm BUFFER_ATOMIC_FMIN : MUBUF_Real_Atomic_si <0x3f>; // isn't on VI
1745//defm BUFFER_ATOMIC_FMAX : MUBUF_Real_Atomic_si <0x40>; // isn't on VI
1746defm BUFFER_ATOMIC_SWAP_X2 : MUBUF_Real_Atomic_si <0x50>;
1747defm BUFFER_ATOMIC_CMPSWAP_X2 : MUBUF_Real_Atomic_si <0x51>;
1748defm BUFFER_ATOMIC_ADD_X2 : MUBUF_Real_Atomic_si <0x52>;
1749defm BUFFER_ATOMIC_SUB_X2 : MUBUF_Real_Atomic_si <0x53>;
1750//defm BUFFER_ATOMIC_RSUB_X2 : MUBUF_Real_Atomic_si <0x54>; // isn't on CI & VI
1751defm BUFFER_ATOMIC_SMIN_X2 : MUBUF_Real_Atomic_si <0x55>;
1752defm BUFFER_ATOMIC_UMIN_X2 : MUBUF_Real_Atomic_si <0x56>;
1753defm BUFFER_ATOMIC_SMAX_X2 : MUBUF_Real_Atomic_si <0x57>;
1754defm BUFFER_ATOMIC_UMAX_X2 : MUBUF_Real_Atomic_si <0x58>;
1755defm BUFFER_ATOMIC_AND_X2 : MUBUF_Real_Atomic_si <0x59>;
1756defm BUFFER_ATOMIC_OR_X2 : MUBUF_Real_Atomic_si <0x5a>;
1757defm BUFFER_ATOMIC_XOR_X2 : MUBUF_Real_Atomic_si <0x5b>;
1758defm BUFFER_ATOMIC_INC_X2 : MUBUF_Real_Atomic_si <0x5c>;
1759defm BUFFER_ATOMIC_DEC_X2 : MUBUF_Real_Atomic_si <0x5d>;
Tom Stellardb133fbb2016-10-27 23:05:31 +00001760// FIXME: Need to handle hazard for BUFFER_ATOMIC_FCMPSWAP_X2 on CI.
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001761//defm BUFFER_ATOMIC_FCMPSWAP_X2 : MUBUF_Real_Atomic_si <0x5e">; // isn't on VI
1762//defm BUFFER_ATOMIC_FMIN_X2 : MUBUF_Real_Atomic_si <0x5f>; // isn't on VI
1763//defm BUFFER_ATOMIC_FMAX_X2 : MUBUF_Real_Atomic_si <0x60>; // isn't on VI
1764
1765def BUFFER_WBINVL1_SC_si : MUBUF_Real_si <0x70, BUFFER_WBINVL1_SC>;
1766def BUFFER_WBINVL1_si : MUBUF_Real_si <0x71, BUFFER_WBINVL1>;
1767
1768class MTBUF_Real_si <bits<3> op, MTBUF_Pseudo ps> :
Valery Pykhtinfbf2d932016-09-23 21:21:21 +00001769 MTBUF_Real<ps>,
David Stuttard70e8bc12017-06-22 16:29:22 +00001770 Enc64,
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001771 SIMCInstr<ps.PseudoInstr, SIEncodingFamily.SI> {
1772 let AssemblerPredicate=isSICI;
1773 let DecoderNamespace="SICI";
Valery Pykhtinfbf2d932016-09-23 21:21:21 +00001774
David Stuttard70e8bc12017-06-22 16:29:22 +00001775 let Inst{11-0} = !if(ps.has_offset, offset, ?);
1776 let Inst{12} = ps.offen;
1777 let Inst{13} = ps.idxen;
1778 let Inst{14} = !if(ps.has_glc, glc, ps.glc_value);
1779 let Inst{15} = ps.addr64;
Valery Pykhtinfbf2d932016-09-23 21:21:21 +00001780 let Inst{18-16} = op;
Tim Renouf35484c92018-08-21 11:06:05 +00001781 let Inst{22-19} = dfmt;
1782 let Inst{25-23} = nfmt;
David Stuttard70e8bc12017-06-22 16:29:22 +00001783 let Inst{31-26} = 0x3a; //encoding
1784 let Inst{39-32} = !if(ps.has_vaddr, vaddr, ?);
1785 let Inst{47-40} = !if(ps.has_vdata, vdata, ?);
1786 let Inst{52-48} = !if(ps.has_srsrc, srsrc{6-2}, ?);
1787 let Inst{54} = !if(ps.has_slc, slc, ?);
1788 let Inst{55} = !if(ps.has_tfe, tfe, ?);
1789 let Inst{63-56} = !if(ps.has_soffset, soffset, ?);
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001790}
1791
David Stuttard70e8bc12017-06-22 16:29:22 +00001792multiclass MTBUF_Real_AllAddr_si<bits<3> op> {
1793 def _OFFSET_si : MTBUF_Real_si <op, !cast<MTBUF_Pseudo>(NAME#"_OFFSET")>;
1794 def _ADDR64_si : MTBUF_Real_si <op, !cast<MTBUF_Pseudo>(NAME#"_ADDR64")>;
1795 def _OFFEN_si : MTBUF_Real_si <op, !cast<MTBUF_Pseudo>(NAME#"_OFFEN")>;
1796 def _IDXEN_si : MTBUF_Real_si <op, !cast<MTBUF_Pseudo>(NAME#"_IDXEN")>;
1797 def _BOTHEN_si : MTBUF_Real_si <op, !cast<MTBUF_Pseudo>(NAME#"_BOTHEN")>;
1798}
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001799
David Stuttard70e8bc12017-06-22 16:29:22 +00001800defm TBUFFER_LOAD_FORMAT_X : MTBUF_Real_AllAddr_si <0>;
1801defm TBUFFER_LOAD_FORMAT_XY : MTBUF_Real_AllAddr_si <1>;
Dmitry Preobrazhensky523872e2018-04-04 13:54:55 +00001802defm TBUFFER_LOAD_FORMAT_XYZ : MTBUF_Real_AllAddr_si <2>;
David Stuttard70e8bc12017-06-22 16:29:22 +00001803defm TBUFFER_LOAD_FORMAT_XYZW : MTBUF_Real_AllAddr_si <3>;
1804defm TBUFFER_STORE_FORMAT_X : MTBUF_Real_AllAddr_si <4>;
1805defm TBUFFER_STORE_FORMAT_XY : MTBUF_Real_AllAddr_si <5>;
1806defm TBUFFER_STORE_FORMAT_XYZ : MTBUF_Real_AllAddr_si <6>;
1807defm TBUFFER_STORE_FORMAT_XYZW : MTBUF_Real_AllAddr_si <7>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001808
1809//===----------------------------------------------------------------------===//
1810// CI
Tim Renouf35484c92018-08-21 11:06:05 +00001811// MTBUF - GFX6, GFX7.
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001812//===----------------------------------------------------------------------===//
1813
1814class MUBUF_Real_ci <bits<7> op, MUBUF_Pseudo ps> :
1815 MUBUF_Real_si<op, ps> {
1816 let AssemblerPredicate=isCIOnly;
1817 let DecoderNamespace="CI";
1818}
1819
1820def BUFFER_WBINVL1_VOL_ci : MUBUF_Real_ci <0x70, BUFFER_WBINVL1_VOL>;
1821
1822
1823//===----------------------------------------------------------------------===//
1824// VI
1825//===----------------------------------------------------------------------===//
1826
1827class MUBUF_Real_vi <bits<7> op, MUBUF_Pseudo ps> :
1828 MUBUF_Real<op, ps>,
1829 Enc64,
1830 SIMCInstr<ps.PseudoInstr, SIEncodingFamily.VI> {
1831 let AssemblerPredicate=isVI;
1832 let DecoderNamespace="VI";
1833
1834 let Inst{11-0} = !if(ps.has_offset, offset, ?);
1835 let Inst{12} = ps.offen;
1836 let Inst{13} = ps.idxen;
1837 let Inst{14} = !if(ps.has_glc, glc, ps.glc_value);
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001838 let Inst{16} = !if(ps.lds, 1, 0);
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001839 let Inst{17} = !if(ps.has_slc, slc, ?);
1840 let Inst{24-18} = op;
1841 let Inst{31-26} = 0x38; //encoding
1842 let Inst{39-32} = !if(ps.has_vaddr, vaddr, ?);
1843 let Inst{47-40} = !if(ps.has_vdata, vdata, ?);
1844 let Inst{52-48} = !if(ps.has_srsrc, srsrc{6-2}, ?);
1845 let Inst{55} = !if(ps.has_tfe, tfe, ?);
1846 let Inst{63-56} = !if(ps.has_soffset, soffset, ?);
1847}
1848
1849multiclass MUBUF_Real_AllAddr_vi<bits<7> op> {
1850 def _OFFSET_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET")>;
1851 def _OFFEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN")>;
1852 def _IDXEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN")>;
1853 def _BOTHEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN")>;
1854}
1855
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001856multiclass MUBUF_Real_AllAddr_Lds_vi<bits<7> op> {
1857
1858 def _OFFSET_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001859 MUBUFLdsTable<0, NAME # "_OFFSET_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001860 def _OFFEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001861 MUBUFLdsTable<0, NAME # "_OFFEN_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001862 def _IDXEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001863 MUBUFLdsTable<0, NAME # "_IDXEN_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001864 def _BOTHEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001865 MUBUFLdsTable<0, NAME # "_BOTHEN_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001866
1867 def _LDS_OFFSET_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_LDS_OFFSET")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001868 MUBUFLdsTable<1, NAME # "_OFFSET_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001869 def _LDS_OFFEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_LDS_OFFEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001870 MUBUFLdsTable<1, NAME # "_OFFEN_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001871 def _LDS_IDXEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_LDS_IDXEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001872 MUBUFLdsTable<1, NAME # "_IDXEN_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001873 def _LDS_BOTHEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_LDS_BOTHEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001874 MUBUFLdsTable<1, NAME # "_BOTHEN_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001875}
1876
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001877class MUBUF_Real_gfx80 <bits<7> op, MUBUF_Pseudo ps> :
1878 MUBUF_Real<op, ps>,
1879 Enc64,
1880 SIMCInstr<ps.PseudoInstr, SIEncodingFamily.GFX80> {
1881 let AssemblerPredicate=HasUnpackedD16VMem;
1882 let DecoderNamespace="GFX80_UNPACKED";
1883
1884 let Inst{11-0} = !if(ps.has_offset, offset, ?);
1885 let Inst{12} = ps.offen;
1886 let Inst{13} = ps.idxen;
1887 let Inst{14} = !if(ps.has_glc, glc, ps.glc_value);
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001888 let Inst{16} = !if(ps.lds, 1, 0);
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001889 let Inst{17} = !if(ps.has_slc, slc, ?);
1890 let Inst{24-18} = op;
1891 let Inst{31-26} = 0x38; //encoding
1892 let Inst{39-32} = !if(ps.has_vaddr, vaddr, ?);
1893 let Inst{47-40} = !if(ps.has_vdata, vdata, ?);
1894 let Inst{52-48} = !if(ps.has_srsrc, srsrc{6-2}, ?);
1895 let Inst{55} = !if(ps.has_tfe, tfe, ?);
1896 let Inst{63-56} = !if(ps.has_soffset, soffset, ?);
1897}
1898
1899multiclass MUBUF_Real_AllAddr_gfx80<bits<7> op> {
Changpeng Fangba6240c2018-01-18 22:57:57 +00001900 def _OFFSET_gfx80 : MUBUF_Real_gfx80 <op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET")>;
1901 def _OFFEN_gfx80 : MUBUF_Real_gfx80 <op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN")>;
1902 def _IDXEN_gfx80 : MUBUF_Real_gfx80 <op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN")>;
1903 def _BOTHEN_gfx80 : MUBUF_Real_gfx80 <op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN")>;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001904}
1905
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001906multiclass MUBUF_Real_Atomic_vi<bits<7> op> :
1907 MUBUF_Real_AllAddr_vi<op> {
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001908 def _OFFSET_RTN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET_RTN")>;
1909 def _OFFEN_RTN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN_RTN")>;
1910 def _IDXEN_RTN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN_RTN")>;
1911 def _BOTHEN_RTN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN_RTN")>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001912}
1913
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001914defm BUFFER_LOAD_FORMAT_X : MUBUF_Real_AllAddr_Lds_vi <0x00>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001915defm BUFFER_LOAD_FORMAT_XY : MUBUF_Real_AllAddr_vi <0x01>;
1916defm BUFFER_LOAD_FORMAT_XYZ : MUBUF_Real_AllAddr_vi <0x02>;
1917defm BUFFER_LOAD_FORMAT_XYZW : MUBUF_Real_AllAddr_vi <0x03>;
1918defm BUFFER_STORE_FORMAT_X : MUBUF_Real_AllAddr_vi <0x04>;
1919defm BUFFER_STORE_FORMAT_XY : MUBUF_Real_AllAddr_vi <0x05>;
1920defm BUFFER_STORE_FORMAT_XYZ : MUBUF_Real_AllAddr_vi <0x06>;
1921defm BUFFER_STORE_FORMAT_XYZW : MUBUF_Real_AllAddr_vi <0x07>;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001922let SubtargetPredicate = HasUnpackedD16VMem in {
1923 defm BUFFER_LOAD_FORMAT_D16_X_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x08>;
1924 defm BUFFER_LOAD_FORMAT_D16_XY_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x09>;
1925 defm BUFFER_LOAD_FORMAT_D16_XYZ_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x0a>;
1926 defm BUFFER_LOAD_FORMAT_D16_XYZW_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x0b>;
1927 defm BUFFER_STORE_FORMAT_D16_X_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x0c>;
1928 defm BUFFER_STORE_FORMAT_D16_XY_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x0d>;
1929 defm BUFFER_STORE_FORMAT_D16_XYZ_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x0e>;
1930 defm BUFFER_STORE_FORMAT_D16_XYZW_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x0f>;
1931} // End HasUnpackedD16VMem.
1932let SubtargetPredicate = HasPackedD16VMem in {
1933 defm BUFFER_LOAD_FORMAT_D16_X : MUBUF_Real_AllAddr_vi <0x08>;
1934 defm BUFFER_LOAD_FORMAT_D16_XY : MUBUF_Real_AllAddr_vi <0x09>;
1935 defm BUFFER_LOAD_FORMAT_D16_XYZ : MUBUF_Real_AllAddr_vi <0x0a>;
1936 defm BUFFER_LOAD_FORMAT_D16_XYZW : MUBUF_Real_AllAddr_vi <0x0b>;
1937 defm BUFFER_STORE_FORMAT_D16_X : MUBUF_Real_AllAddr_vi <0x0c>;
1938 defm BUFFER_STORE_FORMAT_D16_XY : MUBUF_Real_AllAddr_vi <0x0d>;
1939 defm BUFFER_STORE_FORMAT_D16_XYZ : MUBUF_Real_AllAddr_vi <0x0e>;
1940 defm BUFFER_STORE_FORMAT_D16_XYZW : MUBUF_Real_AllAddr_vi <0x0f>;
1941} // End HasPackedD16VMem.
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001942defm BUFFER_LOAD_UBYTE : MUBUF_Real_AllAddr_Lds_vi <0x10>;
1943defm BUFFER_LOAD_SBYTE : MUBUF_Real_AllAddr_Lds_vi <0x11>;
1944defm BUFFER_LOAD_USHORT : MUBUF_Real_AllAddr_Lds_vi <0x12>;
1945defm BUFFER_LOAD_SSHORT : MUBUF_Real_AllAddr_Lds_vi <0x13>;
1946defm BUFFER_LOAD_DWORD : MUBUF_Real_AllAddr_Lds_vi <0x14>;
Dmitry Preobrazhenskyffbee7a2018-06-13 15:32:46 +00001947defm BUFFER_LOAD_DWORDX2 : MUBUF_Real_AllAddr_Lds_vi <0x15>;
1948defm BUFFER_LOAD_DWORDX3 : MUBUF_Real_AllAddr_Lds_vi <0x16>;
1949defm BUFFER_LOAD_DWORDX4 : MUBUF_Real_AllAddr_Lds_vi <0x17>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001950defm BUFFER_STORE_BYTE : MUBUF_Real_AllAddr_vi <0x18>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001951defm BUFFER_STORE_BYTE_D16_HI : MUBUF_Real_AllAddr_vi <0x19>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001952defm BUFFER_STORE_SHORT : MUBUF_Real_AllAddr_vi <0x1a>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001953defm BUFFER_STORE_SHORT_D16_HI : MUBUF_Real_AllAddr_vi <0x1b>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001954defm BUFFER_STORE_DWORD : MUBUF_Real_AllAddr_vi <0x1c>;
1955defm BUFFER_STORE_DWORDX2 : MUBUF_Real_AllAddr_vi <0x1d>;
Artem Tamazov73f1ab22016-10-07 15:53:16 +00001956defm BUFFER_STORE_DWORDX3 : MUBUF_Real_AllAddr_vi <0x1e>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001957defm BUFFER_STORE_DWORDX4 : MUBUF_Real_AllAddr_vi <0x1f>;
1958
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001959defm BUFFER_LOAD_UBYTE_D16 : MUBUF_Real_AllAddr_vi <0x20>;
1960defm BUFFER_LOAD_UBYTE_D16_HI : MUBUF_Real_AllAddr_vi <0x21>;
1961defm BUFFER_LOAD_SBYTE_D16 : MUBUF_Real_AllAddr_vi <0x22>;
1962defm BUFFER_LOAD_SBYTE_D16_HI : MUBUF_Real_AllAddr_vi <0x23>;
1963defm BUFFER_LOAD_SHORT_D16 : MUBUF_Real_AllAddr_vi <0x24>;
1964defm BUFFER_LOAD_SHORT_D16_HI : MUBUF_Real_AllAddr_vi <0x25>;
1965
Dmitry Preobrazhenskya917e882018-03-28 14:53:13 +00001966defm BUFFER_LOAD_FORMAT_D16_HI_X : MUBUF_Real_AllAddr_vi <0x26>;
1967defm BUFFER_STORE_FORMAT_D16_HI_X : MUBUF_Real_AllAddr_vi <0x27>;
1968
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001969defm BUFFER_ATOMIC_SWAP : MUBUF_Real_Atomic_vi <0x40>;
1970defm BUFFER_ATOMIC_CMPSWAP : MUBUF_Real_Atomic_vi <0x41>;
1971defm BUFFER_ATOMIC_ADD : MUBUF_Real_Atomic_vi <0x42>;
1972defm BUFFER_ATOMIC_SUB : MUBUF_Real_Atomic_vi <0x43>;
1973defm BUFFER_ATOMIC_SMIN : MUBUF_Real_Atomic_vi <0x44>;
1974defm BUFFER_ATOMIC_UMIN : MUBUF_Real_Atomic_vi <0x45>;
1975defm BUFFER_ATOMIC_SMAX : MUBUF_Real_Atomic_vi <0x46>;
1976defm BUFFER_ATOMIC_UMAX : MUBUF_Real_Atomic_vi <0x47>;
1977defm BUFFER_ATOMIC_AND : MUBUF_Real_Atomic_vi <0x48>;
1978defm BUFFER_ATOMIC_OR : MUBUF_Real_Atomic_vi <0x49>;
1979defm BUFFER_ATOMIC_XOR : MUBUF_Real_Atomic_vi <0x4a>;
1980defm BUFFER_ATOMIC_INC : MUBUF_Real_Atomic_vi <0x4b>;
1981defm BUFFER_ATOMIC_DEC : MUBUF_Real_Atomic_vi <0x4c>;
1982
1983defm BUFFER_ATOMIC_SWAP_X2 : MUBUF_Real_Atomic_vi <0x60>;
1984defm BUFFER_ATOMIC_CMPSWAP_X2 : MUBUF_Real_Atomic_vi <0x61>;
1985defm BUFFER_ATOMIC_ADD_X2 : MUBUF_Real_Atomic_vi <0x62>;
1986defm BUFFER_ATOMIC_SUB_X2 : MUBUF_Real_Atomic_vi <0x63>;
1987defm BUFFER_ATOMIC_SMIN_X2 : MUBUF_Real_Atomic_vi <0x64>;
1988defm BUFFER_ATOMIC_UMIN_X2 : MUBUF_Real_Atomic_vi <0x65>;
1989defm BUFFER_ATOMIC_SMAX_X2 : MUBUF_Real_Atomic_vi <0x66>;
1990defm BUFFER_ATOMIC_UMAX_X2 : MUBUF_Real_Atomic_vi <0x67>;
1991defm BUFFER_ATOMIC_AND_X2 : MUBUF_Real_Atomic_vi <0x68>;
1992defm BUFFER_ATOMIC_OR_X2 : MUBUF_Real_Atomic_vi <0x69>;
1993defm BUFFER_ATOMIC_XOR_X2 : MUBUF_Real_Atomic_vi <0x6a>;
1994defm BUFFER_ATOMIC_INC_X2 : MUBUF_Real_Atomic_vi <0x6b>;
1995defm BUFFER_ATOMIC_DEC_X2 : MUBUF_Real_Atomic_vi <0x6c>;
1996
Dmitry Preobrazhenskyd98c97b2018-03-12 17:29:24 +00001997def BUFFER_STORE_LDS_DWORD_vi : MUBUF_Real_vi <0x3d, BUFFER_STORE_LDS_DWORD>;
1998
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001999def BUFFER_WBINVL1_vi : MUBUF_Real_vi <0x3e, BUFFER_WBINVL1>;
2000def BUFFER_WBINVL1_VOL_vi : MUBUF_Real_vi <0x3f, BUFFER_WBINVL1_VOL>;
2001
Valery Pykhtinfbf2d932016-09-23 21:21:21 +00002002class MTBUF_Real_vi <bits<4> op, MTBUF_Pseudo ps> :
2003 MTBUF_Real<ps>,
David Stuttard70e8bc12017-06-22 16:29:22 +00002004 Enc64,
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00002005 SIMCInstr<ps.PseudoInstr, SIEncodingFamily.VI> {
2006 let AssemblerPredicate=isVI;
2007 let DecoderNamespace="VI";
Valery Pykhtinfbf2d932016-09-23 21:21:21 +00002008
David Stuttard70e8bc12017-06-22 16:29:22 +00002009 let Inst{11-0} = !if(ps.has_offset, offset, ?);
2010 let Inst{12} = ps.offen;
2011 let Inst{13} = ps.idxen;
2012 let Inst{14} = !if(ps.has_glc, glc, ps.glc_value);
Valery Pykhtinfbf2d932016-09-23 21:21:21 +00002013 let Inst{18-15} = op;
Tim Renouf35484c92018-08-21 11:06:05 +00002014 let Inst{22-19} = dfmt;
2015 let Inst{25-23} = nfmt;
David Stuttard70e8bc12017-06-22 16:29:22 +00002016 let Inst{31-26} = 0x3a; //encoding
2017 let Inst{39-32} = !if(ps.has_vaddr, vaddr, ?);
2018 let Inst{47-40} = !if(ps.has_vdata, vdata, ?);
2019 let Inst{52-48} = !if(ps.has_srsrc, srsrc{6-2}, ?);
2020 let Inst{54} = !if(ps.has_slc, slc, ?);
2021 let Inst{55} = !if(ps.has_tfe, tfe, ?);
2022 let Inst{63-56} = !if(ps.has_soffset, soffset, ?);
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00002023}
2024
David Stuttard70e8bc12017-06-22 16:29:22 +00002025multiclass MTBUF_Real_AllAddr_vi<bits<4> op> {
2026 def _OFFSET_vi : MTBUF_Real_vi <op, !cast<MTBUF_Pseudo>(NAME#"_OFFSET")>;
2027 def _OFFEN_vi : MTBUF_Real_vi <op, !cast<MTBUF_Pseudo>(NAME#"_OFFEN")>;
2028 def _IDXEN_vi : MTBUF_Real_vi <op, !cast<MTBUF_Pseudo>(NAME#"_IDXEN")>;
2029 def _BOTHEN_vi : MTBUF_Real_vi <op, !cast<MTBUF_Pseudo>(NAME#"_BOTHEN")>;
2030}
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00002031
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00002032class MTBUF_Real_gfx80 <bits<4> op, MTBUF_Pseudo ps> :
2033 MTBUF_Real<ps>,
2034 Enc64,
2035 SIMCInstr<ps.PseudoInstr, SIEncodingFamily.GFX80> {
2036 let AssemblerPredicate=HasUnpackedD16VMem;
2037 let DecoderNamespace="GFX80_UNPACKED";
2038
2039 let Inst{11-0} = !if(ps.has_offset, offset, ?);
2040 let Inst{12} = ps.offen;
2041 let Inst{13} = ps.idxen;
2042 let Inst{14} = !if(ps.has_glc, glc, ps.glc_value);
2043 let Inst{18-15} = op;
Tim Renouf35484c92018-08-21 11:06:05 +00002044 let Inst{22-19} = dfmt;
2045 let Inst{25-23} = nfmt;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00002046 let Inst{31-26} = 0x3a; //encoding
2047 let Inst{39-32} = !if(ps.has_vaddr, vaddr, ?);
2048 let Inst{47-40} = !if(ps.has_vdata, vdata, ?);
2049 let Inst{52-48} = !if(ps.has_srsrc, srsrc{6-2}, ?);
2050 let Inst{54} = !if(ps.has_slc, slc, ?);
2051 let Inst{55} = !if(ps.has_tfe, tfe, ?);
2052 let Inst{63-56} = !if(ps.has_soffset, soffset, ?);
2053}
2054
2055multiclass MTBUF_Real_AllAddr_gfx80<bits<4> op> {
2056 def _OFFSET_gfx80 : MTBUF_Real_gfx80 <op, !cast<MTBUF_Pseudo>(NAME#"_OFFSET")>;
2057 def _OFFEN_gfx80 : MTBUF_Real_gfx80 <op, !cast<MTBUF_Pseudo>(NAME#"_OFFEN")>;
2058 def _IDXEN_gfx80 : MTBUF_Real_gfx80 <op, !cast<MTBUF_Pseudo>(NAME#"_IDXEN")>;
2059 def _BOTHEN_gfx80 : MTBUF_Real_gfx80 <op, !cast<MTBUF_Pseudo>(NAME#"_BOTHEN")>;
2060}
2061
2062defm TBUFFER_LOAD_FORMAT_X : MTBUF_Real_AllAddr_vi <0x00>;
2063defm TBUFFER_LOAD_FORMAT_XY : MTBUF_Real_AllAddr_vi <0x01>;
2064defm TBUFFER_LOAD_FORMAT_XYZ : MTBUF_Real_AllAddr_vi <0x02>;
2065defm TBUFFER_LOAD_FORMAT_XYZW : MTBUF_Real_AllAddr_vi <0x03>;
2066defm TBUFFER_STORE_FORMAT_X : MTBUF_Real_AllAddr_vi <0x04>;
2067defm TBUFFER_STORE_FORMAT_XY : MTBUF_Real_AllAddr_vi <0x05>;
2068defm TBUFFER_STORE_FORMAT_XYZ : MTBUF_Real_AllAddr_vi <0x06>;
2069defm TBUFFER_STORE_FORMAT_XYZW : MTBUF_Real_AllAddr_vi <0x07>;
2070let SubtargetPredicate = HasUnpackedD16VMem in {
2071 defm TBUFFER_LOAD_FORMAT_D16_X_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x08>;
2072 defm TBUFFER_LOAD_FORMAT_D16_XY_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x09>;
2073 defm TBUFFER_LOAD_FORMAT_D16_XYZ_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x0a>;
2074 defm TBUFFER_LOAD_FORMAT_D16_XYZW_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x0b>;
2075 defm TBUFFER_STORE_FORMAT_D16_X_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x0c>;
2076 defm TBUFFER_STORE_FORMAT_D16_XY_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x0d>;
2077 defm TBUFFER_STORE_FORMAT_D16_XYZ_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x0e>;
2078 defm TBUFFER_STORE_FORMAT_D16_XYZW_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x0f>;
2079} // End HasUnpackedD16VMem.
2080let SubtargetPredicate = HasPackedD16VMem in {
2081 defm TBUFFER_LOAD_FORMAT_D16_X : MTBUF_Real_AllAddr_vi <0x08>;
2082 defm TBUFFER_LOAD_FORMAT_D16_XY : MTBUF_Real_AllAddr_vi <0x09>;
2083 defm TBUFFER_LOAD_FORMAT_D16_XYZ : MTBUF_Real_AllAddr_vi <0x0a>;
2084 defm TBUFFER_LOAD_FORMAT_D16_XYZW : MTBUF_Real_AllAddr_vi <0x0b>;
2085 defm TBUFFER_STORE_FORMAT_D16_X : MTBUF_Real_AllAddr_vi <0x0c>;
2086 defm TBUFFER_STORE_FORMAT_D16_XY : MTBUF_Real_AllAddr_vi <0x0d>;
2087 defm TBUFFER_STORE_FORMAT_D16_XYZ : MTBUF_Real_AllAddr_vi <0x0e>;
2088 defm TBUFFER_STORE_FORMAT_D16_XYZW : MTBUF_Real_AllAddr_vi <0x0f>;
2089} // End HasUnpackedD16VMem.