blob: 18a59729faa745bbdea3a1300e96526764f92c93 [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">;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000020
21class MubufLoad <SDPatternOperator op> : PatFrag <
22 (ops node:$ptr), (op node:$ptr), [{
23 auto const AS = cast<MemSDNode>(N)->getAddressSpace();
Matt Arsenault0da63502018-08-31 05:49:54 +000024 return AS == AMDGPUAS::GLOBAL_ADDRESS ||
25 AS == AMDGPUAS::CONSTANT_ADDRESS;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000026}]>;
27
28def mubuf_load : MubufLoad <load>;
29def mubuf_az_extloadi8 : MubufLoad <az_extloadi8>;
30def mubuf_sextloadi8 : MubufLoad <sextloadi8>;
31def mubuf_az_extloadi16 : MubufLoad <az_extloadi16>;
32def mubuf_sextloadi16 : MubufLoad <sextloadi16>;
33def mubuf_load_atomic : MubufLoad <atomic_load>;
34
35def BUFAddrKind {
36 int Offset = 0;
37 int OffEn = 1;
38 int IdxEn = 2;
39 int BothEn = 3;
40 int Addr64 = 4;
41}
42
43class getAddrName<int addrKind> {
44 string ret =
45 !if(!eq(addrKind, BUFAddrKind.Offset), "offset",
46 !if(!eq(addrKind, BUFAddrKind.OffEn), "offen",
47 !if(!eq(addrKind, BUFAddrKind.IdxEn), "idxen",
48 !if(!eq(addrKind, BUFAddrKind.BothEn), "bothen",
49 !if(!eq(addrKind, BUFAddrKind.Addr64), "addr64",
50 "")))));
51}
52
Nicolai Haehnle01d261f2018-06-04 14:26:05 +000053class MUBUFAddr64Table <bit is_addr64, string Name> {
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000054 bit IsAddr64 = is_addr64;
Nicolai Haehnle01d261f2018-06-04 14:26:05 +000055 string OpName = Name;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000056}
57
Nicolai Haehnle01d261f2018-06-04 14:26:05 +000058class MUBUFLdsTable <bit is_lds, string Name> {
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +000059 bit IsLds = is_lds;
Nicolai Haehnle01d261f2018-06-04 14:26:05 +000060 string OpName = Name;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +000061}
62
Nicolai Haehnle01d261f2018-06-04 14:26:05 +000063class MTBUFAddr64Table <bit is_addr64, string Name> {
David Stuttard70e8bc12017-06-22 16:29:22 +000064 bit IsAddr64 = is_addr64;
Nicolai Haehnle01d261f2018-06-04 14:26:05 +000065 string OpName = Name;
David Stuttard70e8bc12017-06-22 16:29:22 +000066}
67
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000068//===----------------------------------------------------------------------===//
69// MTBUF classes
70//===----------------------------------------------------------------------===//
71
72class MTBUF_Pseudo <string opName, dag outs, dag ins,
73 string asmOps, list<dag> pattern=[]> :
74 InstSI<outs, ins, "", pattern>,
75 SIMCInstr<opName, SIEncodingFamily.NONE> {
76
77 let isPseudo = 1;
78 let isCodeGenOnly = 1;
Matt Arsenault10c17ca2016-10-06 10:13:23 +000079 let Size = 8;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000080 let UseNamedOperandTable = 1;
81
82 string Mnemonic = opName;
83 string AsmOperands = asmOps;
84
85 let VM_CNT = 1;
86 let EXP_CNT = 1;
87 let MTBUF = 1;
88 let Uses = [EXEC];
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000089 let hasSideEffects = 0;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000090 let SchedRW = [WriteVMEM];
David Stuttard70e8bc12017-06-22 16:29:22 +000091
92 let AsmMatchConverter = "cvtMtbuf";
93
94 bits<1> offen = 0;
95 bits<1> idxen = 0;
96 bits<1> addr64 = 0;
97 bits<1> has_vdata = 1;
98 bits<1> has_vaddr = 1;
99 bits<1> has_glc = 1;
100 bits<1> glc_value = 0; // the value for glc if no such operand
David Stuttard70e8bc12017-06-22 16:29:22 +0000101 bits<1> has_srsrc = 1;
102 bits<1> has_soffset = 1;
103 bits<1> has_offset = 1;
104 bits<1> has_slc = 1;
105 bits<1> has_tfe = 1;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000106}
107
Valery Pykhtinfbf2d932016-09-23 21:21:21 +0000108class MTBUF_Real <MTBUF_Pseudo ps> :
David Stuttard70e8bc12017-06-22 16:29:22 +0000109 InstSI <ps.OutOperandList, ps.InOperandList, ps.Mnemonic # ps.AsmOperands, []> {
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000110
111 let isPseudo = 0;
112 let isCodeGenOnly = 0;
113
114 // copy relevant pseudo op flags
115 let SubtargetPredicate = ps.SubtargetPredicate;
116 let AsmMatchConverter = ps.AsmMatchConverter;
117 let Constraints = ps.Constraints;
118 let DisableEncoding = ps.DisableEncoding;
119 let TSFlags = ps.TSFlags;
120
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000121 bits<12> offset;
David Stuttard70e8bc12017-06-22 16:29:22 +0000122 bits<1> glc;
Tim Renouf35484c92018-08-21 11:06:05 +0000123 bits<7> format;
David Stuttard70e8bc12017-06-22 16:29:22 +0000124 bits<8> vaddr;
125 bits<8> vdata;
126 bits<7> srsrc;
127 bits<1> slc;
128 bits<1> tfe;
129 bits<8> soffset;
Tim Renouf35484c92018-08-21 11:06:05 +0000130
131 bits<4> dfmt = format{3-0};
132 bits<3> nfmt = format{6-4};
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000133}
134
David Stuttard70e8bc12017-06-22 16:29:22 +0000135class getMTBUFInsDA<list<RegisterClass> vdataList,
136 list<RegisterClass> vaddrList=[]> {
137 RegisterClass vdataClass = !if(!empty(vdataList), ?, !head(vdataList));
138 RegisterClass vaddrClass = !if(!empty(vaddrList), ?, !head(vaddrList));
139 dag InsNoData = !if(!empty(vaddrList),
140 (ins SReg_128:$srsrc, SCSrc_b32:$soffset,
Tim Renouf35484c92018-08-21 11:06:05 +0000141 offset:$offset, FORMAT:$format, GLC:$glc, SLC:$slc, TFE:$tfe),
David Stuttard70e8bc12017-06-22 16:29:22 +0000142 (ins vaddrClass:$vaddr, 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 );
145 dag InsData = !if(!empty(vaddrList),
146 (ins vdataClass:$vdata, SReg_128:$srsrc,
Tim Renouf35484c92018-08-21 11:06:05 +0000147 SCSrc_b32:$soffset, offset:$offset, FORMAT:$format, GLC:$glc,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000148 SLC:$slc, TFE:$tfe),
David Stuttard70e8bc12017-06-22 16:29:22 +0000149 (ins vdataClass:$vdata, vaddrClass:$vaddr, SReg_128:$srsrc,
Tim Renouf35484c92018-08-21 11:06:05 +0000150 SCSrc_b32:$soffset, offset:$offset, FORMAT:$format, GLC:$glc,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000151 SLC:$slc, TFE:$tfe)
David Stuttard70e8bc12017-06-22 16:29:22 +0000152 );
153 dag ret = !if(!empty(vdataList), InsNoData, InsData);
154}
155
156class getMTBUFIns<int addrKind, list<RegisterClass> vdataList=[]> {
157 dag ret =
158 !if(!eq(addrKind, BUFAddrKind.Offset), getMTBUFInsDA<vdataList>.ret,
159 !if(!eq(addrKind, BUFAddrKind.OffEn), getMTBUFInsDA<vdataList, [VGPR_32]>.ret,
160 !if(!eq(addrKind, BUFAddrKind.IdxEn), getMTBUFInsDA<vdataList, [VGPR_32]>.ret,
161 !if(!eq(addrKind, BUFAddrKind.BothEn), getMTBUFInsDA<vdataList, [VReg_64]>.ret,
162 !if(!eq(addrKind, BUFAddrKind.Addr64), getMTBUFInsDA<vdataList, [VReg_64]>.ret,
163 (ins))))));
164}
165
166class getMTBUFAsmOps<int addrKind> {
167 string Pfx =
Tim Renouf35484c92018-08-21 11:06:05 +0000168 !if(!eq(addrKind, BUFAddrKind.Offset), "off, $srsrc, $format, $soffset",
David Stuttard70e8bc12017-06-22 16:29:22 +0000169 !if(!eq(addrKind, BUFAddrKind.OffEn),
Tim Renouf35484c92018-08-21 11:06:05 +0000170 "$vaddr, $srsrc, $format, $soffset offen",
David Stuttard70e8bc12017-06-22 16:29:22 +0000171 !if(!eq(addrKind, BUFAddrKind.IdxEn),
Tim Renouf35484c92018-08-21 11:06:05 +0000172 "$vaddr, $srsrc, $format, $soffset idxen",
David Stuttard70e8bc12017-06-22 16:29:22 +0000173 !if(!eq(addrKind, BUFAddrKind.BothEn),
Tim Renouf35484c92018-08-21 11:06:05 +0000174 "$vaddr, $srsrc, $format, $soffset idxen offen",
David Stuttard70e8bc12017-06-22 16:29:22 +0000175 !if(!eq(addrKind, BUFAddrKind.Addr64),
Tim Renouf35484c92018-08-21 11:06:05 +0000176 "$vaddr, $srsrc, $format, $soffset addr64",
David Stuttard70e8bc12017-06-22 16:29:22 +0000177 "")))));
178 string ret = Pfx # "$offset";
179}
180
181class MTBUF_SetupAddr<int addrKind> {
182 bits<1> offen = !if(!eq(addrKind, BUFAddrKind.OffEn), 1,
183 !if(!eq(addrKind, BUFAddrKind.BothEn), 1 , 0));
184
185 bits<1> idxen = !if(!eq(addrKind, BUFAddrKind.IdxEn), 1,
186 !if(!eq(addrKind, BUFAddrKind.BothEn), 1 , 0));
187
188 bits<1> addr64 = !if(!eq(addrKind, BUFAddrKind.Addr64), 1, 0);
189
190 bits<1> has_vaddr = !if(!eq(addrKind, BUFAddrKind.Offset), 0, 1);
191}
192
193class MTBUF_Load_Pseudo <string opName,
194 int addrKind,
195 RegisterClass vdataClass,
196 list<dag> pattern=[],
197 // Workaround bug bz30254
198 int addrKindCopy = addrKind>
199 : MTBUF_Pseudo<opName,
200 (outs vdataClass:$vdata),
201 getMTBUFIns<addrKindCopy>.ret,
202 " $vdata, " # getMTBUFAsmOps<addrKindCopy>.ret # "$glc$slc$tfe",
203 pattern>,
204 MTBUF_SetupAddr<addrKindCopy> {
205 let PseudoInstr = opName # "_" # getAddrName<addrKindCopy>.ret;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000206 let mayLoad = 1;
207 let mayStore = 0;
208}
209
David Stuttard70e8bc12017-06-22 16:29:22 +0000210multiclass MTBUF_Pseudo_Loads<string opName, RegisterClass vdataClass,
211 ValueType load_vt = i32,
212 SDPatternOperator ld = null_frag> {
213
214 def _OFFSET : MTBUF_Load_Pseudo <opName, BUFAddrKind.Offset, vdataClass,
215 [(set load_vt:$vdata,
Tim Renouf35484c92018-08-21 11:06:05 +0000216 (ld (MUBUFOffset v4i32:$srsrc, i32:$soffset, i16:$offset, i8:$format,
217 i1:$glc, i1:$slc, i1:$tfe)))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000218 MTBUFAddr64Table<0, NAME>;
David Stuttard70e8bc12017-06-22 16:29:22 +0000219
220 def _ADDR64 : MTBUF_Load_Pseudo <opName, BUFAddrKind.Addr64, vdataClass,
221 [(set load_vt:$vdata,
222 (ld (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset, i16:$offset,
Tim Renouf35484c92018-08-21 11:06:05 +0000223 i8:$format, i1:$glc, i1:$slc, i1:$tfe)))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000224 MTBUFAddr64Table<1, NAME>;
David Stuttard70e8bc12017-06-22 16:29:22 +0000225
226 def _OFFEN : MTBUF_Load_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
227 def _IDXEN : MTBUF_Load_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
228 def _BOTHEN : MTBUF_Load_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
229
230 let DisableWQM = 1 in {
231 def _OFFSET_exact : MTBUF_Load_Pseudo <opName, BUFAddrKind.Offset, vdataClass>;
232 def _OFFEN_exact : MTBUF_Load_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
233 def _IDXEN_exact : MTBUF_Load_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
234 def _BOTHEN_exact : MTBUF_Load_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
235 }
236}
237
238class MTBUF_Store_Pseudo <string opName,
239 int addrKind,
240 RegisterClass vdataClass,
241 list<dag> pattern=[],
242 // Workaround bug bz30254
243 int addrKindCopy = addrKind,
244 RegisterClass vdataClassCopy = vdataClass>
245 : MTBUF_Pseudo<opName,
246 (outs),
247 getMTBUFIns<addrKindCopy, [vdataClassCopy]>.ret,
248 " $vdata, " # getMTBUFAsmOps<addrKindCopy>.ret # "$glc$slc$tfe",
249 pattern>,
250 MTBUF_SetupAddr<addrKindCopy> {
251 let PseudoInstr = opName # "_" # getAddrName<addrKindCopy>.ret;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000252 let mayLoad = 0;
253 let mayStore = 1;
254}
255
David Stuttard70e8bc12017-06-22 16:29:22 +0000256multiclass MTBUF_Pseudo_Stores<string opName, RegisterClass vdataClass,
257 ValueType store_vt = i32,
258 SDPatternOperator st = null_frag> {
259
260 def _OFFSET : MTBUF_Store_Pseudo <opName, BUFAddrKind.Offset, vdataClass,
261 [(st store_vt:$vdata, (MUBUFOffset v4i32:$srsrc, i32:$soffset,
Tim Renouf35484c92018-08-21 11:06:05 +0000262 i16:$offset, i8:$format, i1:$glc,
David Stuttard70e8bc12017-06-22 16:29:22 +0000263 i1:$slc, i1:$tfe))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000264 MTBUFAddr64Table<0, NAME>;
David Stuttard70e8bc12017-06-22 16:29:22 +0000265
266 def _ADDR64 : MTBUF_Store_Pseudo <opName, BUFAddrKind.Addr64, vdataClass,
267 [(st store_vt:$vdata, (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset,
Tim Renouf35484c92018-08-21 11:06:05 +0000268 i16:$offset, i8:$format, i1:$glc,
David Stuttard70e8bc12017-06-22 16:29:22 +0000269 i1:$slc, i1:$tfe))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000270 MTBUFAddr64Table<1, NAME>;
David Stuttard70e8bc12017-06-22 16:29:22 +0000271
272 def _OFFEN : MTBUF_Store_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
273 def _IDXEN : MTBUF_Store_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
274 def _BOTHEN : MTBUF_Store_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
275
276 let DisableWQM = 1 in {
277 def _OFFSET_exact : MTBUF_Store_Pseudo <opName, BUFAddrKind.Offset, vdataClass>;
278 def _OFFEN_exact : MTBUF_Store_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
279 def _IDXEN_exact : MTBUF_Store_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
280 def _BOTHEN_exact : MTBUF_Store_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
281 }
282}
283
284
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000285//===----------------------------------------------------------------------===//
286// MUBUF classes
287//===----------------------------------------------------------------------===//
288
289class MUBUF_Pseudo <string opName, dag outs, dag ins,
290 string asmOps, list<dag> pattern=[]> :
291 InstSI<outs, ins, "", pattern>,
292 SIMCInstr<opName, SIEncodingFamily.NONE> {
293
294 let isPseudo = 1;
295 let isCodeGenOnly = 1;
Matt Arsenault10c17ca2016-10-06 10:13:23 +0000296 let Size = 8;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000297 let UseNamedOperandTable = 1;
298
299 string Mnemonic = opName;
300 string AsmOperands = asmOps;
301
302 let VM_CNT = 1;
303 let EXP_CNT = 1;
304 let MUBUF = 1;
305 let Uses = [EXEC];
306 let hasSideEffects = 0;
307 let SchedRW = [WriteVMEM];
308
309 let AsmMatchConverter = "cvtMubuf";
310
311 bits<1> offen = 0;
312 bits<1> idxen = 0;
313 bits<1> addr64 = 0;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000314 bits<1> lds = 0;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000315 bits<1> has_vdata = 1;
316 bits<1> has_vaddr = 1;
317 bits<1> has_glc = 1;
318 bits<1> glc_value = 0; // the value for glc if no such operand
319 bits<1> has_srsrc = 1;
320 bits<1> has_soffset = 1;
321 bits<1> has_offset = 1;
322 bits<1> has_slc = 1;
323 bits<1> has_tfe = 1;
324}
325
326class MUBUF_Real <bits<7> op, MUBUF_Pseudo ps> :
327 InstSI <ps.OutOperandList, ps.InOperandList, ps.Mnemonic # ps.AsmOperands, []> {
328
329 let isPseudo = 0;
330 let isCodeGenOnly = 0;
331
332 // copy relevant pseudo op flags
333 let SubtargetPredicate = ps.SubtargetPredicate;
334 let AsmMatchConverter = ps.AsmMatchConverter;
335 let Constraints = ps.Constraints;
336 let DisableEncoding = ps.DisableEncoding;
337 let TSFlags = ps.TSFlags;
338
339 bits<12> offset;
340 bits<1> glc;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000341 bits<8> vaddr;
342 bits<8> vdata;
343 bits<7> srsrc;
344 bits<1> slc;
345 bits<1> tfe;
346 bits<8> soffset;
347}
348
349
350// For cache invalidation instructions.
351class MUBUF_Invalidate <string opName, SDPatternOperator node> :
352 MUBUF_Pseudo<opName, (outs), (ins), "", [(node)]> {
353
354 let AsmMatchConverter = "";
355
356 let hasSideEffects = 1;
357 let mayStore = 1;
358
359 // Set everything to 0.
360 let offen = 0;
361 let idxen = 0;
362 let addr64 = 0;
363 let has_vdata = 0;
364 let has_vaddr = 0;
365 let has_glc = 0;
366 let glc_value = 0;
367 let has_srsrc = 0;
368 let has_soffset = 0;
369 let has_offset = 0;
370 let has_slc = 0;
371 let has_tfe = 0;
372}
373
374class getMUBUFInsDA<list<RegisterClass> vdataList,
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000375 list<RegisterClass> vaddrList=[],
376 bit isLds = 0> {
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000377 RegisterClass vdataClass = !if(!empty(vdataList), ?, !head(vdataList));
378 RegisterClass vaddrClass = !if(!empty(vaddrList), ?, !head(vaddrList));
379 dag InsNoData = !if(!empty(vaddrList),
380 (ins SReg_128:$srsrc, SCSrc_b32:$soffset,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000381 offset:$offset, GLC:$glc, SLC:$slc),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000382 (ins vaddrClass:$vaddr, 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 );
385 dag InsData = !if(!empty(vaddrList),
386 (ins vdataClass:$vdata, SReg_128:$srsrc,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000387 SCSrc_b32:$soffset, offset:$offset, GLC:$glc, SLC:$slc),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000388 (ins vdataClass:$vdata, vaddrClass:$vaddr, 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 );
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000391 dag ret = !con(
392 !if(!empty(vdataList), InsNoData, InsData),
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000393 !if(isLds, (ins), (ins TFE:$tfe))
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000394 );
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000395}
396
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000397class getMUBUFIns<int addrKind, list<RegisterClass> vdataList=[], bit isLds = 0> {
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000398 dag ret =
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000399 !if(!eq(addrKind, BUFAddrKind.Offset), getMUBUFInsDA<vdataList, [], isLds>.ret,
400 !if(!eq(addrKind, BUFAddrKind.OffEn), getMUBUFInsDA<vdataList, [VGPR_32], isLds>.ret,
401 !if(!eq(addrKind, BUFAddrKind.IdxEn), getMUBUFInsDA<vdataList, [VGPR_32], isLds>.ret,
402 !if(!eq(addrKind, BUFAddrKind.BothEn), getMUBUFInsDA<vdataList, [VReg_64], isLds>.ret,
403 !if(!eq(addrKind, BUFAddrKind.Addr64), getMUBUFInsDA<vdataList, [VReg_64], isLds>.ret,
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000404 (ins))))));
405}
406
407class getMUBUFAsmOps<int addrKind> {
408 string Pfx =
409 !if(!eq(addrKind, BUFAddrKind.Offset), "off, $srsrc, $soffset",
410 !if(!eq(addrKind, BUFAddrKind.OffEn), "$vaddr, $srsrc, $soffset offen",
411 !if(!eq(addrKind, BUFAddrKind.IdxEn), "$vaddr, $srsrc, $soffset idxen",
412 !if(!eq(addrKind, BUFAddrKind.BothEn), "$vaddr, $srsrc, $soffset idxen offen",
413 !if(!eq(addrKind, BUFAddrKind.Addr64), "$vaddr, $srsrc, $soffset addr64",
414 "")))));
415 string ret = Pfx # "$offset";
416}
417
Matt Arsenaultf3dd8632016-11-01 00:55:14 +0000418class MUBUF_SetupAddr<int addrKind> {
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000419 bits<1> offen = !if(!eq(addrKind, BUFAddrKind.OffEn), 1,
420 !if(!eq(addrKind, BUFAddrKind.BothEn), 1 , 0));
421
422 bits<1> idxen = !if(!eq(addrKind, BUFAddrKind.IdxEn), 1,
423 !if(!eq(addrKind, BUFAddrKind.BothEn), 1 , 0));
424
425 bits<1> addr64 = !if(!eq(addrKind, BUFAddrKind.Addr64), 1, 0);
426
427 bits<1> has_vaddr = !if(!eq(addrKind, BUFAddrKind.Offset), 0, 1);
428}
429
430class MUBUF_Load_Pseudo <string opName,
431 int addrKind,
432 RegisterClass vdataClass,
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000433 bit HasTiedDest = 0,
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000434 bit isLds = 0,
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000435 list<dag> pattern=[],
436 // Workaround bug bz30254
437 int addrKindCopy = addrKind>
438 : MUBUF_Pseudo<opName,
439 (outs vdataClass:$vdata),
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000440 !con(getMUBUFIns<addrKindCopy, [], isLds>.ret,
441 !if(HasTiedDest, (ins vdataClass:$vdata_in), (ins))),
442 " $vdata, " # getMUBUFAsmOps<addrKindCopy>.ret # "$glc$slc" #
443 !if(isLds, " lds", "$tfe"),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000444 pattern>,
445 MUBUF_SetupAddr<addrKindCopy> {
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000446 let PseudoInstr = opName # !if(isLds, "_lds", "") #
447 "_" # getAddrName<addrKindCopy>.ret;
Dmitry Preobrazhenskyd98c97b2018-03-12 17:29:24 +0000448 let AsmMatchConverter = !if(isLds, "cvtMubufLds", "cvtMubuf");
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000449
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000450 let Constraints = !if(HasTiedDest, "$vdata = $vdata_in", "");
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000451 let mayLoad = 1;
452 let mayStore = 0;
Konstantin Zhuravlyov070d88e2017-07-21 21:05:45 +0000453 let maybeAtomic = 1;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000454 let Uses = !if(isLds, [EXEC, M0], [EXEC]);
455 let has_tfe = !if(isLds, 0, 1);
456 let lds = isLds;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000457}
458
459// FIXME: tfe can't be an operand because it requires a separate
460// opcode because it needs an N+1 register class dest register.
461multiclass MUBUF_Pseudo_Loads<string opName, RegisterClass vdataClass,
462 ValueType load_vt = i32,
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000463 SDPatternOperator ld = null_frag,
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000464 bit TiedDest = 0,
465 bit isLds = 0> {
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000466
467 def _OFFSET : MUBUF_Load_Pseudo <opName, BUFAddrKind.Offset, vdataClass,
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000468 TiedDest, isLds,
469 !if(isLds,
470 [],
471 [(set load_vt:$vdata,
472 (ld (MUBUFOffset v4i32:$srsrc, i32:$soffset, i16:$offset, i1:$glc, i1:$slc, i1:$tfe)))])>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000473 MUBUFAddr64Table<0, NAME # !if(isLds, "_LDS", "")>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000474
475 def _ADDR64 : MUBUF_Load_Pseudo <opName, BUFAddrKind.Addr64, vdataClass,
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000476 TiedDest, isLds,
477 !if(isLds,
478 [],
479 [(set load_vt:$vdata,
480 (ld (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset, i16:$offset, i1:$glc, i1:$slc, i1:$tfe)))])>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000481 MUBUFAddr64Table<1, NAME # !if(isLds, "_LDS", "")>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000482
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000483 def _OFFEN : MUBUF_Load_Pseudo <opName, BUFAddrKind.OffEn, vdataClass, TiedDest, isLds>;
484 def _IDXEN : MUBUF_Load_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass, TiedDest, isLds>;
485 def _BOTHEN : MUBUF_Load_Pseudo <opName, BUFAddrKind.BothEn, vdataClass, TiedDest, isLds>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000486
487 let DisableWQM = 1 in {
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000488 def _OFFSET_exact : MUBUF_Load_Pseudo <opName, BUFAddrKind.Offset, vdataClass, TiedDest, isLds>;
489 def _OFFEN_exact : MUBUF_Load_Pseudo <opName, BUFAddrKind.OffEn, vdataClass, TiedDest, isLds>;
490 def _IDXEN_exact : MUBUF_Load_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass, TiedDest, isLds>;
491 def _BOTHEN_exact : MUBUF_Load_Pseudo <opName, BUFAddrKind.BothEn, vdataClass, TiedDest, isLds>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000492 }
493}
494
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000495multiclass MUBUF_Pseudo_Loads_Lds<string opName, RegisterClass vdataClass,
496 ValueType load_vt = i32,
497 SDPatternOperator ld_nolds = null_frag,
498 SDPatternOperator ld_lds = null_frag> {
499 defm NAME : MUBUF_Pseudo_Loads<opName, vdataClass, load_vt, ld_nolds>;
500 defm _LDS : MUBUF_Pseudo_Loads<opName, vdataClass, load_vt, ld_lds, 0, 1>;
501}
502
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000503class MUBUF_Store_Pseudo <string opName,
504 int addrKind,
505 RegisterClass vdataClass,
506 list<dag> pattern=[],
507 // Workaround bug bz30254
508 int addrKindCopy = addrKind,
509 RegisterClass vdataClassCopy = vdataClass>
510 : MUBUF_Pseudo<opName,
511 (outs),
512 getMUBUFIns<addrKindCopy, [vdataClassCopy]>.ret,
513 " $vdata, " # getMUBUFAsmOps<addrKindCopy>.ret # "$glc$slc$tfe",
514 pattern>,
515 MUBUF_SetupAddr<addrKindCopy> {
516 let PseudoInstr = opName # "_" # getAddrName<addrKindCopy>.ret;
517 let mayLoad = 0;
518 let mayStore = 1;
Konstantin Zhuravlyov070d88e2017-07-21 21:05:45 +0000519 let maybeAtomic = 1;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000520}
521
522multiclass MUBUF_Pseudo_Stores<string opName, RegisterClass vdataClass,
523 ValueType store_vt = i32,
524 SDPatternOperator st = null_frag> {
525
526 def _OFFSET : MUBUF_Store_Pseudo <opName, BUFAddrKind.Offset, vdataClass,
527 [(st store_vt:$vdata, (MUBUFOffset v4i32:$srsrc, i32:$soffset,
528 i16:$offset, i1:$glc, i1:$slc, i1:$tfe))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000529 MUBUFAddr64Table<0, NAME>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000530
531 def _ADDR64 : MUBUF_Store_Pseudo <opName, BUFAddrKind.Addr64, vdataClass,
532 [(st store_vt:$vdata, (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset,
533 i16:$offset, i1:$glc, i1:$slc, i1:$tfe))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000534 MUBUFAddr64Table<1, NAME>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000535
536 def _OFFEN : MUBUF_Store_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
537 def _IDXEN : MUBUF_Store_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
538 def _BOTHEN : MUBUF_Store_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
539
540 let DisableWQM = 1 in {
541 def _OFFSET_exact : MUBUF_Store_Pseudo <opName, BUFAddrKind.Offset, vdataClass>;
542 def _OFFEN_exact : MUBUF_Store_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
543 def _IDXEN_exact : MUBUF_Store_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
544 def _BOTHEN_exact : MUBUF_Store_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
545 }
546}
547
Dmitry Preobrazhenskyd98c97b2018-03-12 17:29:24 +0000548class MUBUF_Pseudo_Store_Lds<string opName>
549 : MUBUF_Pseudo<opName,
550 (outs),
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000551 (ins SReg_128:$srsrc, SCSrc_b32:$soffset, offset:$offset, GLC:$glc, SLC:$slc),
Dmitry Preobrazhenskyd98c97b2018-03-12 17:29:24 +0000552 " $srsrc, $soffset$offset lds$glc$slc"> {
553 let mayLoad = 0;
554 let mayStore = 1;
555 let maybeAtomic = 1;
556
557 let has_vdata = 0;
558 let has_vaddr = 0;
559 let has_tfe = 0;
560 let lds = 1;
561
562 let Uses = [EXEC, M0];
563 let AsmMatchConverter = "cvtMubufLds";
564}
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000565
566class getMUBUFAtomicInsDA<RegisterClass vdataClass, bit vdata_in,
567 list<RegisterClass> vaddrList=[]> {
568 RegisterClass vaddrClass = !if(!empty(vaddrList), ?, !head(vaddrList));
569 dag ret = !if(vdata_in,
570 !if(!empty(vaddrList),
571 (ins vdataClass:$vdata_in,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000572 SReg_128:$srsrc, SCSrc_b32:$soffset, offset:$offset, SLC:$slc),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000573 (ins vdataClass:$vdata_in, vaddrClass:$vaddr,
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 ),
576 !if(!empty(vaddrList),
577 (ins vdataClass:$vdata,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000578 SReg_128:$srsrc, SCSrc_b32:$soffset, offset:$offset, SLC:$slc),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000579 (ins vdataClass:$vdata, vaddrClass:$vaddr,
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 ));
582}
583
584class getMUBUFAtomicIns<int addrKind,
585 RegisterClass vdataClass,
586 bit vdata_in,
587 // Workaround bug bz30254
588 RegisterClass vdataClassCopy=vdataClass> {
589 dag ret =
590 !if(!eq(addrKind, BUFAddrKind.Offset),
591 getMUBUFAtomicInsDA<vdataClassCopy, vdata_in>.ret,
592 !if(!eq(addrKind, BUFAddrKind.OffEn),
593 getMUBUFAtomicInsDA<vdataClassCopy, vdata_in, [VGPR_32]>.ret,
594 !if(!eq(addrKind, BUFAddrKind.IdxEn),
595 getMUBUFAtomicInsDA<vdataClassCopy, vdata_in, [VGPR_32]>.ret,
596 !if(!eq(addrKind, BUFAddrKind.BothEn),
597 getMUBUFAtomicInsDA<vdataClassCopy, vdata_in, [VReg_64]>.ret,
598 !if(!eq(addrKind, BUFAddrKind.Addr64),
599 getMUBUFAtomicInsDA<vdataClassCopy, vdata_in, [VReg_64]>.ret,
600 (ins))))));
601}
602
603class MUBUF_Atomic_Pseudo<string opName,
604 int addrKind,
605 dag outs,
606 dag ins,
607 string asmOps,
608 list<dag> pattern=[],
609 // Workaround bug bz30254
610 int addrKindCopy = addrKind>
611 : MUBUF_Pseudo<opName, outs, ins, asmOps, pattern>,
612 MUBUF_SetupAddr<addrKindCopy> {
613 let mayStore = 1;
614 let mayLoad = 1;
615 let hasPostISelHook = 1;
616 let hasSideEffects = 1;
617 let DisableWQM = 1;
618 let has_glc = 0;
619 let has_tfe = 0;
Konstantin Zhuravlyov070d88e2017-07-21 21:05:45 +0000620 let maybeAtomic = 1;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000621}
622
623class MUBUF_AtomicNoRet_Pseudo<string opName, int addrKind,
624 RegisterClass vdataClass,
625 list<dag> pattern=[],
626 // Workaround bug bz30254
627 int addrKindCopy = addrKind,
628 RegisterClass vdataClassCopy = vdataClass>
629 : MUBUF_Atomic_Pseudo<opName, addrKindCopy,
630 (outs),
631 getMUBUFAtomicIns<addrKindCopy, vdataClassCopy, 0>.ret,
632 " $vdata, " # getMUBUFAsmOps<addrKindCopy>.ret # "$slc",
633 pattern>,
634 AtomicNoRet<opName # "_" # getAddrName<addrKindCopy>.ret, 0> {
635 let PseudoInstr = opName # "_" # getAddrName<addrKindCopy>.ret;
636 let glc_value = 0;
637 let AsmMatchConverter = "cvtMubufAtomic";
638}
639
640class MUBUF_AtomicRet_Pseudo<string opName, int addrKind,
641 RegisterClass vdataClass,
642 list<dag> pattern=[],
643 // Workaround bug bz30254
644 int addrKindCopy = addrKind,
645 RegisterClass vdataClassCopy = vdataClass>
646 : MUBUF_Atomic_Pseudo<opName, addrKindCopy,
647 (outs vdataClassCopy:$vdata),
648 getMUBUFAtomicIns<addrKindCopy, vdataClassCopy, 1>.ret,
649 " $vdata, " # getMUBUFAsmOps<addrKindCopy>.ret # " glc$slc",
650 pattern>,
651 AtomicNoRet<opName # "_" # getAddrName<addrKindCopy>.ret, 1> {
652 let PseudoInstr = opName # "_rtn_" # getAddrName<addrKindCopy>.ret;
653 let glc_value = 1;
654 let Constraints = "$vdata = $vdata_in";
655 let DisableEncoding = "$vdata_in";
656 let AsmMatchConverter = "cvtMubufAtomicReturn";
657}
658
659multiclass MUBUF_Pseudo_Atomics <string opName,
660 RegisterClass vdataClass,
661 ValueType vdataType,
662 SDPatternOperator atomic> {
663
664 def _OFFSET : MUBUF_AtomicNoRet_Pseudo <opName, BUFAddrKind.Offset, vdataClass>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000665 MUBUFAddr64Table <0, NAME>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000666 def _ADDR64 : MUBUF_AtomicNoRet_Pseudo <opName, BUFAddrKind.Addr64, vdataClass>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000667 MUBUFAddr64Table <1, NAME>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000668 def _OFFEN : MUBUF_AtomicNoRet_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
669 def _IDXEN : MUBUF_AtomicNoRet_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
670 def _BOTHEN : MUBUF_AtomicNoRet_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
671
Matt Arsenaulte5456ce2017-07-20 21:06:04 +0000672 def _OFFSET_RTN : MUBUF_AtomicRet_Pseudo <opName, BUFAddrKind.Offset, vdataClass,
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000673 [(set vdataType:$vdata,
674 (atomic (MUBUFOffsetAtomic v4i32:$srsrc, i32:$soffset, i16:$offset, i1:$slc),
675 vdataType:$vdata_in))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000676 MUBUFAddr64Table <0, NAME # "_RTN">;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000677
Matt Arsenaulte5456ce2017-07-20 21:06:04 +0000678 def _ADDR64_RTN : MUBUF_AtomicRet_Pseudo <opName, BUFAddrKind.Addr64, vdataClass,
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000679 [(set vdataType:$vdata,
680 (atomic (MUBUFAddr64Atomic v4i32:$srsrc, i64:$vaddr, i32:$soffset, i16:$offset, i1:$slc),
681 vdataType:$vdata_in))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000682 MUBUFAddr64Table <1, NAME # "_RTN">;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000683
Matt Arsenaulte5456ce2017-07-20 21:06:04 +0000684 def _OFFEN_RTN : MUBUF_AtomicRet_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
685 def _IDXEN_RTN : MUBUF_AtomicRet_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
686 def _BOTHEN_RTN : MUBUF_AtomicRet_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000687}
688
689
690//===----------------------------------------------------------------------===//
691// MUBUF Instructions
692//===----------------------------------------------------------------------===//
693
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000694defm BUFFER_LOAD_FORMAT_X : MUBUF_Pseudo_Loads_Lds <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000695 "buffer_load_format_x", VGPR_32
696>;
697defm BUFFER_LOAD_FORMAT_XY : MUBUF_Pseudo_Loads <
698 "buffer_load_format_xy", VReg_64
699>;
700defm BUFFER_LOAD_FORMAT_XYZ : MUBUF_Pseudo_Loads <
701 "buffer_load_format_xyz", VReg_96
702>;
703defm BUFFER_LOAD_FORMAT_XYZW : MUBUF_Pseudo_Loads <
704 "buffer_load_format_xyzw", VReg_128
705>;
706defm BUFFER_STORE_FORMAT_X : MUBUF_Pseudo_Stores <
707 "buffer_store_format_x", VGPR_32
708>;
709defm BUFFER_STORE_FORMAT_XY : MUBUF_Pseudo_Stores <
710 "buffer_store_format_xy", VReg_64
711>;
712defm BUFFER_STORE_FORMAT_XYZ : MUBUF_Pseudo_Stores <
713 "buffer_store_format_xyz", VReg_96
714>;
715defm BUFFER_STORE_FORMAT_XYZW : MUBUF_Pseudo_Stores <
716 "buffer_store_format_xyzw", VReg_128
717>;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +0000718
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000719let SubtargetPredicate = HasUnpackedD16VMem, D16Buf = 1 in {
Changpeng Fang44dfa1d2018-01-12 21:12:19 +0000720 defm BUFFER_LOAD_FORMAT_D16_X_gfx80 : MUBUF_Pseudo_Loads <
721 "buffer_load_format_d16_x", VGPR_32
722 >;
723 defm BUFFER_LOAD_FORMAT_D16_XY_gfx80 : MUBUF_Pseudo_Loads <
724 "buffer_load_format_d16_xy", VReg_64
725 >;
726 defm BUFFER_LOAD_FORMAT_D16_XYZ_gfx80 : MUBUF_Pseudo_Loads <
727 "buffer_load_format_d16_xyz", VReg_96
728 >;
729 defm BUFFER_LOAD_FORMAT_D16_XYZW_gfx80 : MUBUF_Pseudo_Loads <
730 "buffer_load_format_d16_xyzw", VReg_128
731 >;
732 defm BUFFER_STORE_FORMAT_D16_X_gfx80 : MUBUF_Pseudo_Stores <
733 "buffer_store_format_d16_x", VGPR_32
734 >;
735 defm BUFFER_STORE_FORMAT_D16_XY_gfx80 : MUBUF_Pseudo_Stores <
736 "buffer_store_format_d16_xy", VReg_64
737 >;
738 defm BUFFER_STORE_FORMAT_D16_XYZ_gfx80 : MUBUF_Pseudo_Stores <
739 "buffer_store_format_d16_xyz", VReg_96
740 >;
741 defm BUFFER_STORE_FORMAT_D16_XYZW_gfx80 : MUBUF_Pseudo_Stores <
742 "buffer_store_format_d16_xyzw", VReg_128
743 >;
744} // End HasUnpackedD16VMem.
745
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000746let SubtargetPredicate = HasPackedD16VMem, D16Buf = 1 in {
Changpeng Fang44dfa1d2018-01-12 21:12:19 +0000747 defm BUFFER_LOAD_FORMAT_D16_X : MUBUF_Pseudo_Loads <
748 "buffer_load_format_d16_x", VGPR_32
749 >;
750 defm BUFFER_LOAD_FORMAT_D16_XY : MUBUF_Pseudo_Loads <
751 "buffer_load_format_d16_xy", VGPR_32
752 >;
753 defm BUFFER_LOAD_FORMAT_D16_XYZ : MUBUF_Pseudo_Loads <
754 "buffer_load_format_d16_xyz", VReg_64
755 >;
756 defm BUFFER_LOAD_FORMAT_D16_XYZW : MUBUF_Pseudo_Loads <
757 "buffer_load_format_d16_xyzw", VReg_64
758 >;
759 defm BUFFER_STORE_FORMAT_D16_X : MUBUF_Pseudo_Stores <
760 "buffer_store_format_d16_x", VGPR_32
761 >;
762 defm BUFFER_STORE_FORMAT_D16_XY : MUBUF_Pseudo_Stores <
763 "buffer_store_format_d16_xy", VGPR_32
764 >;
765 defm BUFFER_STORE_FORMAT_D16_XYZ : MUBUF_Pseudo_Stores <
766 "buffer_store_format_d16_xyz", VReg_64
767 >;
768 defm BUFFER_STORE_FORMAT_D16_XYZW : MUBUF_Pseudo_Stores <
769 "buffer_store_format_d16_xyzw", VReg_64
770 >;
771} // End HasPackedD16VMem.
772
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000773defm BUFFER_LOAD_UBYTE : MUBUF_Pseudo_Loads_Lds <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000774 "buffer_load_ubyte", VGPR_32, i32, mubuf_az_extloadi8
775>;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000776defm BUFFER_LOAD_SBYTE : MUBUF_Pseudo_Loads_Lds <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000777 "buffer_load_sbyte", VGPR_32, i32, mubuf_sextloadi8
778>;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000779defm BUFFER_LOAD_USHORT : MUBUF_Pseudo_Loads_Lds <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000780 "buffer_load_ushort", VGPR_32, i32, mubuf_az_extloadi16
781>;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000782defm BUFFER_LOAD_SSHORT : MUBUF_Pseudo_Loads_Lds <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000783 "buffer_load_sshort", VGPR_32, i32, mubuf_sextloadi16
784>;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000785defm BUFFER_LOAD_DWORD : MUBUF_Pseudo_Loads_Lds <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000786 "buffer_load_dword", VGPR_32, i32, mubuf_load
787>;
788defm BUFFER_LOAD_DWORDX2 : MUBUF_Pseudo_Loads <
789 "buffer_load_dwordx2", VReg_64, v2i32, mubuf_load
790>;
Artem Tamazov73f1ab22016-10-07 15:53:16 +0000791defm BUFFER_LOAD_DWORDX3 : MUBUF_Pseudo_Loads <
792 "buffer_load_dwordx3", VReg_96, untyped, mubuf_load
793>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000794defm BUFFER_LOAD_DWORDX4 : MUBUF_Pseudo_Loads <
795 "buffer_load_dwordx4", VReg_128, v4i32, mubuf_load
796>;
Dmitry Preobrazhenskyffbee7a2018-06-13 15:32:46 +0000797
798// This is not described in AMD documentation,
799// but 'lds' versions of these opcodes are available
800// in at least GFX8+ chips. See Bug 37653.
801let SubtargetPredicate = isVI in {
802defm BUFFER_LOAD_DWORDX2_LDS : MUBUF_Pseudo_Loads <
803 "buffer_load_dwordx2", VReg_64, v2i32, null_frag, 0, 1
804>;
805defm BUFFER_LOAD_DWORDX3_LDS : MUBUF_Pseudo_Loads <
806 "buffer_load_dwordx3", VReg_96, untyped, null_frag, 0, 1
807>;
808defm BUFFER_LOAD_DWORDX4_LDS : MUBUF_Pseudo_Loads <
809 "buffer_load_dwordx4", VReg_128, v4i32, null_frag, 0, 1
810>;
811}
812
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000813defm BUFFER_STORE_BYTE : MUBUF_Pseudo_Stores <
814 "buffer_store_byte", VGPR_32, i32, truncstorei8_global
815>;
816defm BUFFER_STORE_SHORT : MUBUF_Pseudo_Stores <
817 "buffer_store_short", VGPR_32, i32, truncstorei16_global
818>;
819defm BUFFER_STORE_DWORD : MUBUF_Pseudo_Stores <
Matt Arsenaultbc683832017-09-20 03:43:35 +0000820 "buffer_store_dword", VGPR_32, i32, store_global
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000821>;
822defm BUFFER_STORE_DWORDX2 : MUBUF_Pseudo_Stores <
Matt Arsenaultbc683832017-09-20 03:43:35 +0000823 "buffer_store_dwordx2", VReg_64, v2i32, store_global
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000824>;
Artem Tamazov73f1ab22016-10-07 15:53:16 +0000825defm BUFFER_STORE_DWORDX3 : MUBUF_Pseudo_Stores <
Matt Arsenaultbc683832017-09-20 03:43:35 +0000826 "buffer_store_dwordx3", VReg_96, untyped, store_global
Artem Tamazov73f1ab22016-10-07 15:53:16 +0000827>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000828defm BUFFER_STORE_DWORDX4 : MUBUF_Pseudo_Stores <
Matt Arsenaultbc683832017-09-20 03:43:35 +0000829 "buffer_store_dwordx4", VReg_128, v4i32, store_global
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000830>;
831defm BUFFER_ATOMIC_SWAP : MUBUF_Pseudo_Atomics <
832 "buffer_atomic_swap", VGPR_32, i32, atomic_swap_global
833>;
834defm BUFFER_ATOMIC_CMPSWAP : MUBUF_Pseudo_Atomics <
835 "buffer_atomic_cmpswap", VReg_64, v2i32, null_frag
836>;
837defm BUFFER_ATOMIC_ADD : MUBUF_Pseudo_Atomics <
838 "buffer_atomic_add", VGPR_32, i32, atomic_add_global
839>;
840defm BUFFER_ATOMIC_SUB : MUBUF_Pseudo_Atomics <
841 "buffer_atomic_sub", VGPR_32, i32, atomic_sub_global
842>;
843defm BUFFER_ATOMIC_SMIN : MUBUF_Pseudo_Atomics <
844 "buffer_atomic_smin", VGPR_32, i32, atomic_min_global
845>;
846defm BUFFER_ATOMIC_UMIN : MUBUF_Pseudo_Atomics <
847 "buffer_atomic_umin", VGPR_32, i32, atomic_umin_global
848>;
849defm BUFFER_ATOMIC_SMAX : MUBUF_Pseudo_Atomics <
850 "buffer_atomic_smax", VGPR_32, i32, atomic_max_global
851>;
852defm BUFFER_ATOMIC_UMAX : MUBUF_Pseudo_Atomics <
853 "buffer_atomic_umax", VGPR_32, i32, atomic_umax_global
854>;
855defm BUFFER_ATOMIC_AND : MUBUF_Pseudo_Atomics <
856 "buffer_atomic_and", VGPR_32, i32, atomic_and_global
857>;
858defm BUFFER_ATOMIC_OR : MUBUF_Pseudo_Atomics <
859 "buffer_atomic_or", VGPR_32, i32, atomic_or_global
860>;
861defm BUFFER_ATOMIC_XOR : MUBUF_Pseudo_Atomics <
862 "buffer_atomic_xor", VGPR_32, i32, atomic_xor_global
863>;
864defm BUFFER_ATOMIC_INC : MUBUF_Pseudo_Atomics <
865 "buffer_atomic_inc", VGPR_32, i32, atomic_inc_global
866>;
867defm BUFFER_ATOMIC_DEC : MUBUF_Pseudo_Atomics <
868 "buffer_atomic_dec", VGPR_32, i32, atomic_dec_global
869>;
870defm BUFFER_ATOMIC_SWAP_X2 : MUBUF_Pseudo_Atomics <
871 "buffer_atomic_swap_x2", VReg_64, i64, atomic_swap_global
872>;
873defm BUFFER_ATOMIC_CMPSWAP_X2 : MUBUF_Pseudo_Atomics <
874 "buffer_atomic_cmpswap_x2", VReg_128, v2i64, null_frag
875>;
876defm BUFFER_ATOMIC_ADD_X2 : MUBUF_Pseudo_Atomics <
877 "buffer_atomic_add_x2", VReg_64, i64, atomic_add_global
878>;
879defm BUFFER_ATOMIC_SUB_X2 : MUBUF_Pseudo_Atomics <
880 "buffer_atomic_sub_x2", VReg_64, i64, atomic_sub_global
881>;
882defm BUFFER_ATOMIC_SMIN_X2 : MUBUF_Pseudo_Atomics <
883 "buffer_atomic_smin_x2", VReg_64, i64, atomic_min_global
884>;
885defm BUFFER_ATOMIC_UMIN_X2 : MUBUF_Pseudo_Atomics <
886 "buffer_atomic_umin_x2", VReg_64, i64, atomic_umin_global
887>;
888defm BUFFER_ATOMIC_SMAX_X2 : MUBUF_Pseudo_Atomics <
889 "buffer_atomic_smax_x2", VReg_64, i64, atomic_max_global
890>;
891defm BUFFER_ATOMIC_UMAX_X2 : MUBUF_Pseudo_Atomics <
892 "buffer_atomic_umax_x2", VReg_64, i64, atomic_umax_global
893>;
894defm BUFFER_ATOMIC_AND_X2 : MUBUF_Pseudo_Atomics <
895 "buffer_atomic_and_x2", VReg_64, i64, atomic_and_global
896>;
897defm BUFFER_ATOMIC_OR_X2 : MUBUF_Pseudo_Atomics <
898 "buffer_atomic_or_x2", VReg_64, i64, atomic_or_global
899>;
900defm BUFFER_ATOMIC_XOR_X2 : MUBUF_Pseudo_Atomics <
901 "buffer_atomic_xor_x2", VReg_64, i64, atomic_xor_global
902>;
903defm BUFFER_ATOMIC_INC_X2 : MUBUF_Pseudo_Atomics <
904 "buffer_atomic_inc_x2", VReg_64, i64, atomic_inc_global
905>;
906defm BUFFER_ATOMIC_DEC_X2 : MUBUF_Pseudo_Atomics <
907 "buffer_atomic_dec_x2", VReg_64, i64, atomic_dec_global
908>;
909
Dmitry Preobrazhenskyd98c97b2018-03-12 17:29:24 +0000910let SubtargetPredicate = isVI in {
911def BUFFER_STORE_LDS_DWORD : MUBUF_Pseudo_Store_Lds <"buffer_store_lds_dword">;
912}
913
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000914let SubtargetPredicate = isSI in { // isn't on CI & VI
915/*
916defm BUFFER_ATOMIC_RSUB : MUBUF_Pseudo_Atomics <"buffer_atomic_rsub">;
917defm BUFFER_ATOMIC_FCMPSWAP : MUBUF_Pseudo_Atomics <"buffer_atomic_fcmpswap">;
918defm BUFFER_ATOMIC_FMIN : MUBUF_Pseudo_Atomics <"buffer_atomic_fmin">;
919defm BUFFER_ATOMIC_FMAX : MUBUF_Pseudo_Atomics <"buffer_atomic_fmax">;
920defm BUFFER_ATOMIC_RSUB_X2 : MUBUF_Pseudo_Atomics <"buffer_atomic_rsub_x2">;
921defm BUFFER_ATOMIC_FCMPSWAP_X2 : MUBUF_Pseudo_Atomics <"buffer_atomic_fcmpswap_x2">;
922defm BUFFER_ATOMIC_FMIN_X2 : MUBUF_Pseudo_Atomics <"buffer_atomic_fmin_x2">;
923defm BUFFER_ATOMIC_FMAX_X2 : MUBUF_Pseudo_Atomics <"buffer_atomic_fmax_x2">;
924*/
925
926def BUFFER_WBINVL1_SC : MUBUF_Invalidate <"buffer_wbinvl1_sc",
927 int_amdgcn_buffer_wbinvl1_sc>;
928}
929
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000930let SubtargetPredicate = HasD16LoadStore in {
931
932defm BUFFER_LOAD_UBYTE_D16 : MUBUF_Pseudo_Loads <
Matt Arsenaulte1cd4822017-11-13 00:22:09 +0000933 "buffer_load_ubyte_d16", VGPR_32, i32, null_frag, 1
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000934>;
935
936defm BUFFER_LOAD_UBYTE_D16_HI : MUBUF_Pseudo_Loads <
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000937 "buffer_load_ubyte_d16_hi", VGPR_32, i32, null_frag, 1
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000938>;
939
940defm BUFFER_LOAD_SBYTE_D16 : MUBUF_Pseudo_Loads <
Matt Arsenaulte1cd4822017-11-13 00:22:09 +0000941 "buffer_load_sbyte_d16", VGPR_32, i32, null_frag, 1
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000942>;
943
944defm BUFFER_LOAD_SBYTE_D16_HI : MUBUF_Pseudo_Loads <
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000945 "buffer_load_sbyte_d16_hi", VGPR_32, i32, null_frag, 1
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000946>;
947
948defm BUFFER_LOAD_SHORT_D16 : MUBUF_Pseudo_Loads <
Matt Arsenaulte1cd4822017-11-13 00:22:09 +0000949 "buffer_load_short_d16", VGPR_32, i32, null_frag, 1
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000950>;
951
952defm BUFFER_LOAD_SHORT_D16_HI : MUBUF_Pseudo_Loads <
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000953 "buffer_load_short_d16_hi", VGPR_32, i32, null_frag, 1
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000954>;
955
956defm BUFFER_STORE_BYTE_D16_HI : MUBUF_Pseudo_Stores <
957 "buffer_store_byte_d16_hi", VGPR_32, i32
958>;
959
960defm BUFFER_STORE_SHORT_D16_HI : MUBUF_Pseudo_Stores <
961 "buffer_store_short_d16_hi", VGPR_32, i32
962>;
963
Dmitry Preobrazhenskya917e882018-03-28 14:53:13 +0000964defm BUFFER_LOAD_FORMAT_D16_HI_X : MUBUF_Pseudo_Loads <
965 "buffer_load_format_d16_hi_x", VGPR_32
966>;
967defm BUFFER_STORE_FORMAT_D16_HI_X : MUBUF_Pseudo_Stores <
968 "buffer_store_format_d16_hi_x", VGPR_32
969>;
970
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000971} // End HasD16LoadStore
972
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000973def BUFFER_WBINVL1 : MUBUF_Invalidate <"buffer_wbinvl1",
974 int_amdgcn_buffer_wbinvl1>;
975
976//===----------------------------------------------------------------------===//
977// MTBUF Instructions
978//===----------------------------------------------------------------------===//
979
David Stuttard70e8bc12017-06-22 16:29:22 +0000980defm TBUFFER_LOAD_FORMAT_X : MTBUF_Pseudo_Loads <"tbuffer_load_format_x", VGPR_32>;
981defm TBUFFER_LOAD_FORMAT_XY : MTBUF_Pseudo_Loads <"tbuffer_load_format_xy", VReg_64>;
982defm TBUFFER_LOAD_FORMAT_XYZ : MTBUF_Pseudo_Loads <"tbuffer_load_format_xyz", VReg_128>;
983defm TBUFFER_LOAD_FORMAT_XYZW : MTBUF_Pseudo_Loads <"tbuffer_load_format_xyzw", VReg_128>;
984defm TBUFFER_STORE_FORMAT_X : MTBUF_Pseudo_Stores <"tbuffer_store_format_x", VGPR_32>;
985defm TBUFFER_STORE_FORMAT_XY : MTBUF_Pseudo_Stores <"tbuffer_store_format_xy", VReg_64>;
986defm TBUFFER_STORE_FORMAT_XYZ : MTBUF_Pseudo_Stores <"tbuffer_store_format_xyz", VReg_128>;
987defm TBUFFER_STORE_FORMAT_XYZW : MTBUF_Pseudo_Stores <"tbuffer_store_format_xyzw", VReg_128>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000988
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000989let SubtargetPredicate = HasUnpackedD16VMem, D16Buf = 1 in {
Changpeng Fang44dfa1d2018-01-12 21:12:19 +0000990 defm TBUFFER_LOAD_FORMAT_D16_X_gfx80 : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_x", VGPR_32>;
991 defm TBUFFER_LOAD_FORMAT_D16_XY_gfx80 : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_xy", VReg_64>;
992 defm TBUFFER_LOAD_FORMAT_D16_XYZ_gfx80 : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_xyz", VReg_96>;
993 defm TBUFFER_LOAD_FORMAT_D16_XYZW_gfx80 : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_xyzw", VReg_128>;
994 defm TBUFFER_STORE_FORMAT_D16_X_gfx80 : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_x", VGPR_32>;
995 defm TBUFFER_STORE_FORMAT_D16_XY_gfx80 : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_xy", VReg_64>;
996 defm TBUFFER_STORE_FORMAT_D16_XYZ_gfx80 : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_xyz", VReg_96>;
997 defm TBUFFER_STORE_FORMAT_D16_XYZW_gfx80 : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_xyzw", VReg_128>;
998} // End HasUnpackedD16VMem.
999
Nicolai Haehnlef2674312018-06-21 13:36:01 +00001000let SubtargetPredicate = HasPackedD16VMem, D16Buf = 1 in {
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001001 defm TBUFFER_LOAD_FORMAT_D16_X : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_x", VGPR_32>;
1002 defm TBUFFER_LOAD_FORMAT_D16_XY : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_xy", VGPR_32>;
1003 defm TBUFFER_LOAD_FORMAT_D16_XYZ : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_xyz", VReg_64>;
1004 defm TBUFFER_LOAD_FORMAT_D16_XYZW : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_xyzw", VReg_64>;
1005 defm TBUFFER_STORE_FORMAT_D16_X : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_x", VGPR_32>;
1006 defm TBUFFER_STORE_FORMAT_D16_XY : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_xy", VGPR_32>;
1007 defm TBUFFER_STORE_FORMAT_D16_XYZ : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_xyz", VReg_64>;
1008 defm TBUFFER_STORE_FORMAT_D16_XYZW : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_xyzw", VReg_64>;
1009} // End HasPackedD16VMem.
1010
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001011let SubtargetPredicate = isCIVI in {
1012
1013//===----------------------------------------------------------------------===//
1014// Instruction definitions for CI and newer.
1015//===----------------------------------------------------------------------===//
1016// Remaining instructions:
1017// BUFFER_LOAD_DWORDX3
1018// BUFFER_STORE_DWORDX3
1019
1020def BUFFER_WBINVL1_VOL : MUBUF_Invalidate <"buffer_wbinvl1_vol",
1021 int_amdgcn_buffer_wbinvl1_vol>;
1022
1023} // End let SubtargetPredicate = isCIVI
1024
1025//===----------------------------------------------------------------------===//
1026// MUBUF Patterns
1027//===----------------------------------------------------------------------===//
1028
Tim Renouf35484c92018-08-21 11:06:05 +00001029def extract_glc : SDNodeXForm<imm, [{
1030 return CurDAG->getTargetConstant(N->getZExtValue() & 1, SDLoc(N), MVT::i8);
1031}]>;
1032
1033def extract_slc : SDNodeXForm<imm, [{
1034 return CurDAG->getTargetConstant((N->getZExtValue() >> 1) & 1, SDLoc(N), MVT::i8);
1035}]>;
1036
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001037//===----------------------------------------------------------------------===//
1038// buffer_load/store_format patterns
1039//===----------------------------------------------------------------------===//
1040
1041multiclass MUBUF_LoadIntrinsicPat<SDPatternOperator name, ValueType vt,
1042 string opcode> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001043 def : GCNPat<
Tim Renouf4f703f52018-08-21 11:07:10 +00001044 (vt (name v4i32:$rsrc, 0, 0, i32:$soffset, imm:$offset,
1045 imm:$cachepolicy, 0)),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001046 (!cast<MUBUF_Pseudo>(opcode # _OFFSET) $rsrc, $soffset, (as_i16imm $offset),
Tim Renouf4f703f52018-08-21 11:07:10 +00001047 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001048 >;
1049
Matt Arsenault90c75932017-10-03 00:06:41 +00001050 def : GCNPat<
Tim Renouf4f703f52018-08-21 11:07:10 +00001051 (vt (name v4i32:$rsrc, 0, i32:$voffset, i32:$soffset, imm:$offset,
1052 imm:$cachepolicy, 0)),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001053 (!cast<MUBUF_Pseudo>(opcode # _OFFEN) $voffset, $rsrc, $soffset, (as_i16imm $offset),
Tim Renouf4f703f52018-08-21 11:07:10 +00001054 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001055 >;
1056
Matt Arsenault90c75932017-10-03 00:06:41 +00001057 def : GCNPat<
Tim Renouf4f703f52018-08-21 11:07:10 +00001058 (vt (name v4i32:$rsrc, i32:$vindex, 0, i32:$soffset, imm:$offset,
1059 imm:$cachepolicy, imm)),
1060 (!cast<MUBUF_Pseudo>(opcode # _IDXEN) $vindex, $rsrc, $soffset, (as_i16imm $offset),
1061 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
1062 >;
1063
1064 def : GCNPat<
1065 (vt (name v4i32:$rsrc, i32:$vindex, i32:$voffset, i32:$soffset, imm:$offset,
1066 imm:$cachepolicy, imm)),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001067 (!cast<MUBUF_Pseudo>(opcode # _BOTHEN)
1068 (REG_SEQUENCE VReg_64, $vindex, sub0, $voffset, sub1),
1069 $rsrc, $soffset, (as_i16imm $offset),
Tim Renouf4f703f52018-08-21 11:07:10 +00001070 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001071 >;
1072}
1073
Tom Stellard6f9ef142016-12-20 17:19:44 +00001074defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format, f32, "BUFFER_LOAD_FORMAT_X">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001075defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format, i32, "BUFFER_LOAD_FORMAT_X">;
Tom Stellard6f9ef142016-12-20 17:19:44 +00001076defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format, v2f32, "BUFFER_LOAD_FORMAT_XY">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001077defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format, v2i32, "BUFFER_LOAD_FORMAT_XY">;
Tom Stellard6f9ef142016-12-20 17:19:44 +00001078defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format, v4f32, "BUFFER_LOAD_FORMAT_XYZW">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001079defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format, v4i32, "BUFFER_LOAD_FORMAT_XYZW">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001080
1081let SubtargetPredicate = HasUnpackedD16VMem in {
Matt Arsenault1349a042018-05-22 06:32:10 +00001082 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, f16, "BUFFER_LOAD_FORMAT_D16_X_gfx80">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001083 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, i16, "BUFFER_LOAD_FORMAT_D16_X_gfx80">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001084 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, v2i32, "BUFFER_LOAD_FORMAT_D16_XY_gfx80">;
1085 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, v4i32, "BUFFER_LOAD_FORMAT_D16_XYZW_gfx80">;
1086} // End HasUnpackedD16VMem.
1087
1088let SubtargetPredicate = HasPackedD16VMem in {
Matt Arsenault1349a042018-05-22 06:32:10 +00001089 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, f16, "BUFFER_LOAD_FORMAT_D16_X">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001090 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, i16, "BUFFER_LOAD_FORMAT_D16_X">;
Matt Arsenault1349a042018-05-22 06:32:10 +00001091 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, v2f16, "BUFFER_LOAD_FORMAT_D16_XY">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001092 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, v2i16, "BUFFER_LOAD_FORMAT_D16_XY">;
Matt Arsenault02dc7e12018-06-15 15:15:46 +00001093 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, v4f16, "BUFFER_LOAD_FORMAT_D16_XYZW">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001094 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, v4i16, "BUFFER_LOAD_FORMAT_D16_XYZW">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001095} // End HasPackedD16VMem.
1096
Tom Stellard6f9ef142016-12-20 17:19:44 +00001097defm : MUBUF_LoadIntrinsicPat<SIbuffer_load, f32, "BUFFER_LOAD_DWORD">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001098defm : MUBUF_LoadIntrinsicPat<SIbuffer_load, i32, "BUFFER_LOAD_DWORD">;
Tom Stellard6f9ef142016-12-20 17:19:44 +00001099defm : MUBUF_LoadIntrinsicPat<SIbuffer_load, v2f32, "BUFFER_LOAD_DWORDX2">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001100defm : MUBUF_LoadIntrinsicPat<SIbuffer_load, v2i32, "BUFFER_LOAD_DWORDX2">;
Tom Stellard6f9ef142016-12-20 17:19:44 +00001101defm : MUBUF_LoadIntrinsicPat<SIbuffer_load, v4f32, "BUFFER_LOAD_DWORDX4">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001102defm : MUBUF_LoadIntrinsicPat<SIbuffer_load, v4i32, "BUFFER_LOAD_DWORDX4">;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001103
1104multiclass MUBUF_StoreIntrinsicPat<SDPatternOperator name, ValueType vt,
1105 string opcode> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001106 def : GCNPat<
Tim Renouf4f703f52018-08-21 11:07:10 +00001107 (name vt:$vdata, v4i32:$rsrc, 0, 0, i32:$soffset, imm:$offset,
1108 imm:$cachepolicy, 0),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001109 (!cast<MUBUF_Pseudo>(opcode # _OFFSET_exact) $vdata, $rsrc, $soffset, (as_i16imm $offset),
Tim Renouf4f703f52018-08-21 11:07:10 +00001110 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001111 >;
1112
Matt Arsenault90c75932017-10-03 00:06:41 +00001113 def : GCNPat<
Tim Renouf4f703f52018-08-21 11:07:10 +00001114 (name vt:$vdata, v4i32:$rsrc, 0, i32:$voffset, i32:$soffset, imm:$offset,
1115 imm:$cachepolicy, 0),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001116 (!cast<MUBUF_Pseudo>(opcode # _OFFEN_exact) $vdata, $voffset, $rsrc, $soffset,
Tim Renouf4f703f52018-08-21 11:07:10 +00001117 (as_i16imm $offset), (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001118 >;
1119
Matt Arsenault90c75932017-10-03 00:06:41 +00001120 def : GCNPat<
Tim Renouf4f703f52018-08-21 11:07:10 +00001121 (name vt:$vdata, v4i32:$rsrc, i32:$vindex, 0, i32:$soffset, imm:$offset,
1122 imm:$cachepolicy, imm),
1123 (!cast<MUBUF_Pseudo>(opcode # _IDXEN_exact) $vdata, $vindex, $rsrc, $soffset,
1124 (as_i16imm $offset), (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
1125 >;
1126
1127 def : GCNPat<
1128 (name vt:$vdata, v4i32:$rsrc, i32:$vindex, i32:$voffset, i32:$soffset, imm:$offset,
1129 imm:$cachepolicy, imm),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001130 (!cast<MUBUF_Pseudo>(opcode # _BOTHEN_exact)
1131 $vdata,
1132 (REG_SEQUENCE VReg_64, $vindex, sub0, $voffset, sub1),
1133 $rsrc, $soffset, (as_i16imm $offset),
Tim Renouf4f703f52018-08-21 11:07:10 +00001134 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001135 >;
1136}
1137
Marek Olsak5cec6412017-11-09 01:52:48 +00001138defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format, f32, "BUFFER_STORE_FORMAT_X">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001139defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format, i32, "BUFFER_STORE_FORMAT_X">;
Marek Olsak5cec6412017-11-09 01:52:48 +00001140defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format, v2f32, "BUFFER_STORE_FORMAT_XY">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001141defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format, v2i32, "BUFFER_STORE_FORMAT_XY">;
Marek Olsak5cec6412017-11-09 01:52:48 +00001142defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format, v4f32, "BUFFER_STORE_FORMAT_XYZW">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001143defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format, v4i32, "BUFFER_STORE_FORMAT_XYZW">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001144
1145let SubtargetPredicate = HasUnpackedD16VMem in {
1146 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, f16, "BUFFER_STORE_FORMAT_D16_X_gfx80">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001147 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, i16, "BUFFER_STORE_FORMAT_D16_X_gfx80">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001148 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, v2i32, "BUFFER_STORE_FORMAT_D16_XY_gfx80">;
1149 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, v4i32, "BUFFER_STORE_FORMAT_D16_XYZW_gfx80">;
1150} // End HasUnpackedD16VMem.
1151
1152let SubtargetPredicate = HasPackedD16VMem in {
1153 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, f16, "BUFFER_STORE_FORMAT_D16_X">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001154 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, i16, "BUFFER_STORE_FORMAT_D16_X">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001155 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, v2f16, "BUFFER_STORE_FORMAT_D16_XY">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001156 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, v2i16, "BUFFER_STORE_FORMAT_D16_XY">;
Matt Arsenault02dc7e12018-06-15 15:15:46 +00001157 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, v4f16, "BUFFER_STORE_FORMAT_D16_XYZW">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001158 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, v4i16, "BUFFER_STORE_FORMAT_D16_XYZW">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001159} // End HasPackedD16VMem.
1160
Marek Olsak5cec6412017-11-09 01:52:48 +00001161defm : MUBUF_StoreIntrinsicPat<SIbuffer_store, f32, "BUFFER_STORE_DWORD">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001162defm : MUBUF_StoreIntrinsicPat<SIbuffer_store, i32, "BUFFER_STORE_DWORD">;
Marek Olsak5cec6412017-11-09 01:52:48 +00001163defm : MUBUF_StoreIntrinsicPat<SIbuffer_store, v2f32, "BUFFER_STORE_DWORDX2">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001164defm : MUBUF_StoreIntrinsicPat<SIbuffer_store, v2i32, "BUFFER_STORE_DWORDX2">;
Marek Olsak5cec6412017-11-09 01:52:48 +00001165defm : MUBUF_StoreIntrinsicPat<SIbuffer_store, v4f32, "BUFFER_STORE_DWORDX4">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001166defm : MUBUF_StoreIntrinsicPat<SIbuffer_store, v4i32, "BUFFER_STORE_DWORDX4">;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001167
1168//===----------------------------------------------------------------------===//
1169// buffer_atomic patterns
1170//===----------------------------------------------------------------------===//
1171
1172multiclass BufferAtomicPatterns<SDPatternOperator name, string opcode> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001173 def : GCNPat<
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001174 (name i32:$vdata_in, v4i32:$rsrc, 0,
Tim Renouf4f703f52018-08-21 11:07:10 +00001175 0, i32:$soffset, imm:$offset,
1176 imm:$cachepolicy, 0),
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001177 (!cast<MUBUF_Pseudo>(opcode # _OFFSET_RTN) $vdata_in, $rsrc, $soffset,
Tim Renouf4f703f52018-08-21 11:07:10 +00001178 (as_i16imm $offset), (extract_slc $cachepolicy))
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001179 >;
1180
Matt Arsenault90c75932017-10-03 00:06:41 +00001181 def : GCNPat<
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001182 (name i32:$vdata_in, v4i32:$rsrc, i32:$vindex,
Tim Renouf4f703f52018-08-21 11:07:10 +00001183 0, i32:$soffset, imm:$offset,
1184 imm:$cachepolicy, imm),
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001185 (!cast<MUBUF_Pseudo>(opcode # _IDXEN_RTN) $vdata_in, $vindex, $rsrc, $soffset,
Tim Renouf4f703f52018-08-21 11:07:10 +00001186 (as_i16imm $offset), (extract_slc $cachepolicy))
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001187 >;
1188
Matt Arsenault90c75932017-10-03 00:06:41 +00001189 def : GCNPat<
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001190 (name i32:$vdata_in, v4i32:$rsrc, 0,
Tim Renouf4f703f52018-08-21 11:07:10 +00001191 i32:$voffset, i32:$soffset, imm:$offset,
1192 imm:$cachepolicy, 0),
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001193 (!cast<MUBUF_Pseudo>(opcode # _OFFEN_RTN) $vdata_in, $voffset, $rsrc, $soffset,
Tim Renouf4f703f52018-08-21 11:07:10 +00001194 (as_i16imm $offset), (extract_slc $cachepolicy))
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001195 >;
1196
Matt Arsenault90c75932017-10-03 00:06:41 +00001197 def : GCNPat<
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001198 (name i32:$vdata_in, v4i32:$rsrc, i32:$vindex,
Tim Renouf4f703f52018-08-21 11:07:10 +00001199 i32:$voffset, i32:$soffset, imm:$offset,
1200 imm:$cachepolicy, imm),
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001201 (!cast<MUBUF_Pseudo>(opcode # _BOTHEN_RTN)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001202 $vdata_in,
1203 (REG_SEQUENCE VReg_64, $vindex, sub0, $voffset, sub1),
Tim Renouf4f703f52018-08-21 11:07:10 +00001204 $rsrc, $soffset, (as_i16imm $offset), (extract_slc $cachepolicy))
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001205 >;
1206}
1207
Marek Olsak5cec6412017-11-09 01:52:48 +00001208defm : BufferAtomicPatterns<SIbuffer_atomic_swap, "BUFFER_ATOMIC_SWAP">;
1209defm : BufferAtomicPatterns<SIbuffer_atomic_add, "BUFFER_ATOMIC_ADD">;
1210defm : BufferAtomicPatterns<SIbuffer_atomic_sub, "BUFFER_ATOMIC_SUB">;
1211defm : BufferAtomicPatterns<SIbuffer_atomic_smin, "BUFFER_ATOMIC_SMIN">;
1212defm : BufferAtomicPatterns<SIbuffer_atomic_umin, "BUFFER_ATOMIC_UMIN">;
1213defm : BufferAtomicPatterns<SIbuffer_atomic_smax, "BUFFER_ATOMIC_SMAX">;
1214defm : BufferAtomicPatterns<SIbuffer_atomic_umax, "BUFFER_ATOMIC_UMAX">;
1215defm : BufferAtomicPatterns<SIbuffer_atomic_and, "BUFFER_ATOMIC_AND">;
1216defm : BufferAtomicPatterns<SIbuffer_atomic_or, "BUFFER_ATOMIC_OR">;
1217defm : BufferAtomicPatterns<SIbuffer_atomic_xor, "BUFFER_ATOMIC_XOR">;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001218
Matt Arsenault90c75932017-10-03 00:06:41 +00001219def : GCNPat<
Marek Olsak5cec6412017-11-09 01:52:48 +00001220 (SIbuffer_atomic_cmpswap
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001221 i32:$data, i32:$cmp, v4i32:$rsrc, 0,
Tim Renouf4f703f52018-08-21 11:07:10 +00001222 0, i32:$soffset, imm:$offset,
1223 imm:$cachepolicy, 0),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001224 (EXTRACT_SUBREG
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001225 (BUFFER_ATOMIC_CMPSWAP_OFFSET_RTN
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001226 (REG_SEQUENCE VReg_64, $data, sub0, $cmp, sub1),
Tim Renouf4f703f52018-08-21 11:07:10 +00001227 $rsrc, $soffset, (as_i16imm $offset), (extract_slc $cachepolicy)),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001228 sub0)
1229>;
1230
Matt Arsenault90c75932017-10-03 00:06:41 +00001231def : GCNPat<
Marek Olsak5cec6412017-11-09 01:52:48 +00001232 (SIbuffer_atomic_cmpswap
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001233 i32:$data, i32:$cmp, v4i32:$rsrc, i32:$vindex,
Tim Renouf4f703f52018-08-21 11:07:10 +00001234 0, i32:$soffset, imm:$offset,
1235 imm:$cachepolicy, imm),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001236 (EXTRACT_SUBREG
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001237 (BUFFER_ATOMIC_CMPSWAP_IDXEN_RTN
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001238 (REG_SEQUENCE VReg_64, $data, sub0, $cmp, sub1),
Tim Renouf4f703f52018-08-21 11:07:10 +00001239 $vindex, $rsrc, $soffset, (as_i16imm $offset), (extract_slc $cachepolicy)),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001240 sub0)
1241>;
1242
Matt Arsenault90c75932017-10-03 00:06:41 +00001243def : GCNPat<
Marek Olsak5cec6412017-11-09 01:52:48 +00001244 (SIbuffer_atomic_cmpswap
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001245 i32:$data, i32:$cmp, v4i32:$rsrc, 0,
Tim Renouf4f703f52018-08-21 11:07:10 +00001246 i32:$voffset, i32:$soffset, imm:$offset,
1247 imm:$cachepolicy, 0),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001248 (EXTRACT_SUBREG
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001249 (BUFFER_ATOMIC_CMPSWAP_OFFEN_RTN
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001250 (REG_SEQUENCE VReg_64, $data, sub0, $cmp, sub1),
Tim Renouf4f703f52018-08-21 11:07:10 +00001251 $voffset, $rsrc, $soffset, (as_i16imm $offset), (extract_slc $cachepolicy)),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001252 sub0)
1253>;
1254
Matt Arsenault90c75932017-10-03 00:06:41 +00001255def : GCNPat<
Marek Olsak5cec6412017-11-09 01:52:48 +00001256 (SIbuffer_atomic_cmpswap
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001257 i32:$data, i32:$cmp, v4i32:$rsrc, i32:$vindex,
Tim Renouf4f703f52018-08-21 11:07:10 +00001258 i32:$voffset, i32:$soffset, imm:$offset,
1259 imm:$cachepolicy, imm),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001260 (EXTRACT_SUBREG
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001261 (BUFFER_ATOMIC_CMPSWAP_BOTHEN_RTN
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001262 (REG_SEQUENCE VReg_64, $data, sub0, $cmp, sub1),
1263 (REG_SEQUENCE VReg_64, $vindex, sub0, $voffset, sub1),
Tim Renouf4f703f52018-08-21 11:07:10 +00001264 $rsrc, $soffset, (as_i16imm $offset), (extract_slc $cachepolicy)),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001265 sub0)
1266>;
1267
1268
Tom Stellard115a6152016-11-10 16:02:37 +00001269class MUBUFLoad_PatternADDR64 <MUBUF_Pseudo Instr_ADDR64, ValueType vt,
Matt Arsenault90c75932017-10-03 00:06:41 +00001270 PatFrag constant_ld> : GCNPat <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001271 (vt (constant_ld (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset,
1272 i16:$offset, i1:$glc, i1:$slc, i1:$tfe))),
1273 (Instr_ADDR64 $vaddr, $srsrc, $soffset, $offset, $glc, $slc, $tfe)
1274 >;
1275
1276multiclass MUBUFLoad_Atomic_Pattern <MUBUF_Pseudo Instr_ADDR64, MUBUF_Pseudo Instr_OFFSET,
1277 ValueType vt, PatFrag atomic_ld> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001278 def : GCNPat <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001279 (vt (atomic_ld (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset,
1280 i16:$offset, i1:$slc))),
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +00001281 (Instr_ADDR64 $vaddr, $srsrc, $soffset, $offset, 0, $slc, 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001282 >;
1283
Matt Arsenault90c75932017-10-03 00:06:41 +00001284 def : GCNPat <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001285 (vt (atomic_ld (MUBUFOffsetNoGLC v4i32:$rsrc, i32:$soffset, i16:$offset))),
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +00001286 (Instr_OFFSET $rsrc, $soffset, (as_i16imm $offset), 0, 0, 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001287 >;
1288}
1289
Matt Arsenault90c75932017-10-03 00:06:41 +00001290let SubtargetPredicate = isSICI in {
Tom Stellard115a6152016-11-10 16:02:37 +00001291def : MUBUFLoad_PatternADDR64 <BUFFER_LOAD_SBYTE_ADDR64, i32, sextloadi8_constant>;
1292def : MUBUFLoad_PatternADDR64 <BUFFER_LOAD_UBYTE_ADDR64, i32, az_extloadi8_constant>;
1293def : MUBUFLoad_PatternADDR64 <BUFFER_LOAD_SSHORT_ADDR64, i32, sextloadi16_constant>;
1294def : MUBUFLoad_PatternADDR64 <BUFFER_LOAD_USHORT_ADDR64, i32, az_extloadi16_constant>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001295
1296defm : MUBUFLoad_Atomic_Pattern <BUFFER_LOAD_DWORD_ADDR64, BUFFER_LOAD_DWORD_OFFSET, i32, mubuf_load_atomic>;
1297defm : MUBUFLoad_Atomic_Pattern <BUFFER_LOAD_DWORDX2_ADDR64, BUFFER_LOAD_DWORDX2_OFFSET, i64, mubuf_load_atomic>;
Matt Arsenault90c75932017-10-03 00:06:41 +00001298} // End SubtargetPredicate = isSICI
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001299
Tom Stellard115a6152016-11-10 16:02:37 +00001300multiclass MUBUFLoad_Pattern <MUBUF_Pseudo Instr_OFFSET, ValueType vt,
1301 PatFrag ld> {
1302
Matt Arsenault90c75932017-10-03 00:06:41 +00001303 def : GCNPat <
Tom Stellard115a6152016-11-10 16:02:37 +00001304 (vt (ld (MUBUFOffset v4i32:$srsrc, i32:$soffset,
1305 i16:$offset, i1:$glc, i1:$slc, i1:$tfe))),
1306 (Instr_OFFSET $srsrc, $soffset, $offset, $glc, $slc, $tfe)
1307 >;
1308}
1309
Matt Arsenault90c75932017-10-03 00:06:41 +00001310let OtherPredicates = [Has16BitInsts] in {
Tom Stellard115a6152016-11-10 16:02:37 +00001311
1312defm : MUBUFLoad_Pattern <BUFFER_LOAD_SBYTE_OFFSET, i16, sextloadi8_constant>;
1313defm : MUBUFLoad_Pattern <BUFFER_LOAD_UBYTE_OFFSET, i16, az_extloadi8_constant>;
1314defm : MUBUFLoad_Pattern <BUFFER_LOAD_SBYTE_OFFSET, i16, mubuf_sextloadi8>;
1315defm : MUBUFLoad_Pattern <BUFFER_LOAD_UBYTE_OFFSET, i16, mubuf_az_extloadi8>;
1316
Matt Arsenault65ca292a2017-09-07 05:37:34 +00001317defm : MUBUFLoad_Pattern <BUFFER_LOAD_USHORT_OFFSET, i16, mubuf_load>;
1318
Matt Arsenault90c75932017-10-03 00:06:41 +00001319} // End OtherPredicates = [Has16BitInsts]
Tom Stellard115a6152016-11-10 16:02:37 +00001320
Matt Arsenault0774ea22017-04-24 19:40:59 +00001321multiclass MUBUFScratchLoadPat <MUBUF_Pseudo InstrOffen,
1322 MUBUF_Pseudo InstrOffset,
1323 ValueType vt, PatFrag ld> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001324 def : GCNPat <
Matt Arsenault0774ea22017-04-24 19:40:59 +00001325 (vt (ld (MUBUFScratchOffen v4i32:$srsrc, i32:$vaddr,
1326 i32:$soffset, u16imm:$offset))),
1327 (InstrOffen $vaddr, $srsrc, $soffset, $offset, 0, 0, 0)
1328 >;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001329
Matt Arsenault90c75932017-10-03 00:06:41 +00001330 def : GCNPat <
Matt Arsenault0774ea22017-04-24 19:40:59 +00001331 (vt (ld (MUBUFScratchOffset v4i32:$srsrc, i32:$soffset, u16imm:$offset))),
1332 (InstrOffset $srsrc, $soffset, $offset, 0, 0, 0)
1333 >;
1334}
1335
Matt Arsenaultb81495d2017-09-20 05:01:53 +00001336// XXX - Is it possible to have a complex pattern in a PatFrag?
1337multiclass MUBUFScratchLoadPat_Hi16 <MUBUF_Pseudo InstrOffen,
1338 MUBUF_Pseudo InstrOffset,
1339 ValueType vt, PatFrag ld> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001340 def : GCNPat <
Matt Arsenaultb81495d2017-09-20 05:01:53 +00001341 (build_vector vt:$lo, (vt (ld (MUBUFScratchOffen v4i32:$srsrc, i32:$vaddr,
1342 i32:$soffset, u16imm:$offset)))),
1343 (v2i16 (InstrOffen $vaddr, $srsrc, $soffset, $offset, 0, 0, 0, $lo))
1344 >;
1345
Matt Arsenault90c75932017-10-03 00:06:41 +00001346 def : GCNPat <
Matt Arsenaultb81495d2017-09-20 05:01:53 +00001347 (build_vector f16:$lo, (f16 (bitconvert (vt (ld (MUBUFScratchOffen v4i32:$srsrc, i32:$vaddr,
1348 i32:$soffset, u16imm:$offset)))))),
1349 (v2f16 (InstrOffen $vaddr, $srsrc, $soffset, $offset, 0, 0, 0, $lo))
1350 >;
1351
1352
Matt Arsenault90c75932017-10-03 00:06:41 +00001353 def : GCNPat <
Matt Arsenaultb81495d2017-09-20 05:01:53 +00001354 (build_vector vt:$lo, (vt (ld (MUBUFScratchOffset v4i32:$srsrc, i32:$soffset, u16imm:$offset)))),
1355 (v2i16 (InstrOffset $srsrc, $soffset, $offset, 0, 0, 0, $lo))
1356 >;
1357
Matt Arsenault90c75932017-10-03 00:06:41 +00001358 def : GCNPat <
Matt Arsenaultb81495d2017-09-20 05:01:53 +00001359 (build_vector f16:$lo, (f16 (bitconvert (vt (ld (MUBUFScratchOffset v4i32:$srsrc, i32:$soffset, u16imm:$offset)))))),
1360 (v2f16 (InstrOffset $srsrc, $soffset, $offset, 0, 0, 0, $lo))
1361 >;
1362}
1363
Matt Arsenaulte1cd4822017-11-13 00:22:09 +00001364multiclass MUBUFScratchLoadPat_Lo16 <MUBUF_Pseudo InstrOffen,
1365 MUBUF_Pseudo InstrOffset,
1366 ValueType vt, PatFrag ld> {
1367 def : GCNPat <
1368 (build_vector (vt (ld (MUBUFScratchOffen v4i32:$srsrc, i32:$vaddr,
1369 i32:$soffset, u16imm:$offset))),
1370 (vt (Hi16Elt vt:$hi))),
1371 (v2i16 (InstrOffen $vaddr, $srsrc, $soffset, $offset, 0, 0, 0, $hi))
1372 >;
1373
1374 def : GCNPat <
1375 (build_vector (f16 (bitconvert (vt (ld (MUBUFScratchOffen v4i32:$srsrc, i32:$vaddr,
1376 i32:$soffset, u16imm:$offset))))),
1377 (f16 (Hi16Elt f16:$hi))),
1378 (v2f16 (InstrOffen $vaddr, $srsrc, $soffset, $offset, 0, 0, 0, $hi))
1379 >;
1380
1381 def : GCNPat <
1382 (build_vector (vt (ld (MUBUFScratchOffset v4i32:$srsrc, i32:$soffset, u16imm:$offset))),
1383 (vt (Hi16Elt vt:$hi))),
1384 (v2i16 (InstrOffset $srsrc, $soffset, $offset, 0, 0, 0, $hi))
1385 >;
1386
1387 def : GCNPat <
1388 (build_vector (f16 (bitconvert (vt (ld (MUBUFScratchOffset v4i32:$srsrc, i32:$soffset, u16imm:$offset))))),
1389 (f16 (Hi16Elt f16:$hi))),
1390 (v2f16 (InstrOffset $srsrc, $soffset, $offset, 0, 0, 0, $hi))
1391 >;
1392}
1393
Matt Arsenault0774ea22017-04-24 19:40:59 +00001394defm : MUBUFScratchLoadPat <BUFFER_LOAD_SBYTE_OFFEN, BUFFER_LOAD_SBYTE_OFFSET, i32, sextloadi8_private>;
Matt Arsenaultbc683832017-09-20 03:43:35 +00001395defm : MUBUFScratchLoadPat <BUFFER_LOAD_UBYTE_OFFEN, BUFFER_LOAD_UBYTE_OFFSET, i32, az_extloadi8_private>;
Matt Arsenault0774ea22017-04-24 19:40:59 +00001396defm : MUBUFScratchLoadPat <BUFFER_LOAD_SBYTE_OFFEN, BUFFER_LOAD_SBYTE_OFFSET, i16, sextloadi8_private>;
Matt Arsenaultbc683832017-09-20 03:43:35 +00001397defm : MUBUFScratchLoadPat <BUFFER_LOAD_UBYTE_OFFEN, BUFFER_LOAD_UBYTE_OFFSET, i16, az_extloadi8_private>;
Matt Arsenault0774ea22017-04-24 19:40:59 +00001398defm : MUBUFScratchLoadPat <BUFFER_LOAD_SSHORT_OFFEN, BUFFER_LOAD_SSHORT_OFFSET, i32, sextloadi16_private>;
Matt Arsenaultbc683832017-09-20 03:43:35 +00001399defm : MUBUFScratchLoadPat <BUFFER_LOAD_USHORT_OFFEN, BUFFER_LOAD_USHORT_OFFSET, i32, az_extloadi16_private>;
Matt Arsenault65ca292a2017-09-07 05:37:34 +00001400defm : MUBUFScratchLoadPat <BUFFER_LOAD_USHORT_OFFEN, BUFFER_LOAD_USHORT_OFFSET, i16, load_private>;
Matt Arsenault0774ea22017-04-24 19:40:59 +00001401defm : MUBUFScratchLoadPat <BUFFER_LOAD_DWORD_OFFEN, BUFFER_LOAD_DWORD_OFFSET, i32, load_private>;
1402defm : MUBUFScratchLoadPat <BUFFER_LOAD_DWORDX2_OFFEN, BUFFER_LOAD_DWORDX2_OFFSET, v2i32, load_private>;
1403defm : MUBUFScratchLoadPat <BUFFER_LOAD_DWORDX4_OFFEN, BUFFER_LOAD_DWORDX4_OFFSET, v4i32, load_private>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001404
Konstantin Zhuravlyovc2c2eb72018-05-04 20:06:57 +00001405let OtherPredicates = [D16PreservesUnusedBits] in {
Matt Arsenaultb81495d2017-09-20 05:01:53 +00001406defm : MUBUFScratchLoadPat_Hi16<BUFFER_LOAD_SHORT_D16_HI_OFFEN, BUFFER_LOAD_SHORT_D16_HI_OFFSET, i16, load_private>;
1407defm : MUBUFScratchLoadPat_Hi16<BUFFER_LOAD_UBYTE_D16_HI_OFFEN, BUFFER_LOAD_UBYTE_D16_HI_OFFSET, i16, az_extloadi8_private>;
1408defm : MUBUFScratchLoadPat_Hi16<BUFFER_LOAD_SBYTE_D16_HI_OFFEN, BUFFER_LOAD_SBYTE_D16_HI_OFFSET, i16, sextloadi8_private>;
Matt Arsenaulte1cd4822017-11-13 00:22:09 +00001409
1410defm : MUBUFScratchLoadPat_Lo16<BUFFER_LOAD_SHORT_D16_OFFEN, BUFFER_LOAD_SHORT_D16_OFFSET, i16, load_private>;
1411defm : MUBUFScratchLoadPat_Lo16<BUFFER_LOAD_UBYTE_D16_OFFEN, BUFFER_LOAD_UBYTE_D16_OFFSET, i16, az_extloadi8_private>;
1412defm : MUBUFScratchLoadPat_Lo16<BUFFER_LOAD_SBYTE_D16_OFFEN, BUFFER_LOAD_SBYTE_D16_OFFSET, i16, sextloadi8_private>;
Matt Arsenaultb81495d2017-09-20 05:01:53 +00001413}
1414
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001415// BUFFER_LOAD_DWORD*, addr64=0
1416multiclass MUBUF_Load_Dword <ValueType vt,
1417 MUBUF_Pseudo offset,
1418 MUBUF_Pseudo offen,
1419 MUBUF_Pseudo idxen,
1420 MUBUF_Pseudo bothen> {
1421
Matt Arsenault90c75932017-10-03 00:06:41 +00001422 def : GCNPat <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001423 (vt (int_SI_buffer_load_dword v4i32:$rsrc, (i32 imm), i32:$soffset,
1424 imm:$offset, 0, 0, imm:$glc, imm:$slc,
1425 imm:$tfe)),
1426 (offset $rsrc, $soffset, (as_i16imm $offset), (as_i1imm $glc),
1427 (as_i1imm $slc), (as_i1imm $tfe))
1428 >;
1429
Matt Arsenault90c75932017-10-03 00:06:41 +00001430 def : GCNPat <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001431 (vt (int_SI_buffer_load_dword v4i32:$rsrc, i32:$vaddr, i32:$soffset,
1432 imm:$offset, 1, 0, imm:$glc, imm:$slc,
1433 imm:$tfe)),
1434 (offen $vaddr, $rsrc, $soffset, (as_i16imm $offset), (as_i1imm $glc), (as_i1imm $slc),
1435 (as_i1imm $tfe))
1436 >;
1437
Matt Arsenault90c75932017-10-03 00:06:41 +00001438 def : GCNPat <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001439 (vt (int_SI_buffer_load_dword v4i32:$rsrc, i32:$vaddr, i32:$soffset,
1440 imm:$offset, 0, 1, imm:$glc, imm:$slc,
1441 imm:$tfe)),
1442 (idxen $vaddr, $rsrc, $soffset, (as_i16imm $offset), (as_i1imm $glc),
1443 (as_i1imm $slc), (as_i1imm $tfe))
1444 >;
1445
Matt Arsenault90c75932017-10-03 00:06:41 +00001446 def : GCNPat <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001447 (vt (int_SI_buffer_load_dword v4i32:$rsrc, v2i32:$vaddr, i32:$soffset,
1448 imm:$offset, 1, 1, imm:$glc, imm:$slc,
1449 imm:$tfe)),
1450 (bothen $vaddr, $rsrc, $soffset, (as_i16imm $offset), (as_i1imm $glc), (as_i1imm $slc),
1451 (as_i1imm $tfe))
1452 >;
1453}
1454
1455defm : MUBUF_Load_Dword <i32, BUFFER_LOAD_DWORD_OFFSET, BUFFER_LOAD_DWORD_OFFEN,
1456 BUFFER_LOAD_DWORD_IDXEN, BUFFER_LOAD_DWORD_BOTHEN>;
1457defm : MUBUF_Load_Dword <v2i32, BUFFER_LOAD_DWORDX2_OFFSET, BUFFER_LOAD_DWORDX2_OFFEN,
1458 BUFFER_LOAD_DWORDX2_IDXEN, BUFFER_LOAD_DWORDX2_BOTHEN>;
1459defm : MUBUF_Load_Dword <v4i32, BUFFER_LOAD_DWORDX4_OFFSET, BUFFER_LOAD_DWORDX4_OFFEN,
1460 BUFFER_LOAD_DWORDX4_IDXEN, BUFFER_LOAD_DWORDX4_BOTHEN>;
1461
1462multiclass MUBUFStore_Atomic_Pattern <MUBUF_Pseudo Instr_ADDR64, MUBUF_Pseudo Instr_OFFSET,
1463 ValueType vt, PatFrag atomic_st> {
1464 // Store follows atomic op convention so address is forst
Matt Arsenault90c75932017-10-03 00:06:41 +00001465 def : GCNPat <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001466 (atomic_st (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset,
1467 i16:$offset, i1:$slc), vt:$val),
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +00001468 (Instr_ADDR64 $val, $vaddr, $srsrc, $soffset, $offset, 0, $slc, 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001469 >;
1470
Matt Arsenault90c75932017-10-03 00:06:41 +00001471 def : GCNPat <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001472 (atomic_st (MUBUFOffsetNoGLC v4i32:$rsrc, i32:$soffset, i16:$offset), vt:$val),
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +00001473 (Instr_OFFSET $val, $rsrc, $soffset, (as_i16imm $offset), 0, 0, 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001474 >;
1475}
Matt Arsenault90c75932017-10-03 00:06:41 +00001476let SubtargetPredicate = isSICI in {
Matt Arsenaultbc683832017-09-20 03:43:35 +00001477defm : MUBUFStore_Atomic_Pattern <BUFFER_STORE_DWORD_ADDR64, BUFFER_STORE_DWORD_OFFSET, i32, store_atomic_global>;
1478defm : MUBUFStore_Atomic_Pattern <BUFFER_STORE_DWORDX2_ADDR64, BUFFER_STORE_DWORDX2_OFFSET, i64, store_atomic_global>;
Matt Arsenault90c75932017-10-03 00:06:41 +00001479} // End Predicates = isSICI
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001480
Tom Stellard115a6152016-11-10 16:02:37 +00001481
1482multiclass MUBUFStore_Pattern <MUBUF_Pseudo Instr_OFFSET, ValueType vt,
1483 PatFrag st> {
1484
Matt Arsenault90c75932017-10-03 00:06:41 +00001485 def : GCNPat <
Tom Stellard115a6152016-11-10 16:02:37 +00001486 (st vt:$vdata, (MUBUFOffset v4i32:$srsrc, i32:$soffset,
1487 i16:$offset, i1:$glc, i1:$slc, i1:$tfe)),
1488 (Instr_OFFSET $vdata, $srsrc, $soffset, $offset, $glc, $slc, $tfe)
1489 >;
1490}
1491
1492defm : MUBUFStore_Pattern <BUFFER_STORE_BYTE_OFFSET, i16, truncstorei8_global>;
Matt Arsenaultbc683832017-09-20 03:43:35 +00001493defm : MUBUFStore_Pattern <BUFFER_STORE_SHORT_OFFSET, i16, store_global>;
Tom Stellard115a6152016-11-10 16:02:37 +00001494
Matt Arsenault0774ea22017-04-24 19:40:59 +00001495multiclass MUBUFScratchStorePat <MUBUF_Pseudo InstrOffen,
1496 MUBUF_Pseudo InstrOffset,
1497 ValueType vt, PatFrag st> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001498 def : GCNPat <
Matt Arsenault0774ea22017-04-24 19:40:59 +00001499 (st vt:$value, (MUBUFScratchOffen v4i32:$srsrc, i32:$vaddr,
1500 i32:$soffset, u16imm:$offset)),
1501 (InstrOffen $value, $vaddr, $srsrc, $soffset, $offset, 0, 0, 0)
1502 >;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001503
Matt Arsenault90c75932017-10-03 00:06:41 +00001504 def : GCNPat <
Matt Arsenault0774ea22017-04-24 19:40:59 +00001505 (st vt:$value, (MUBUFScratchOffset v4i32:$srsrc, i32:$soffset,
1506 u16imm:$offset)),
1507 (InstrOffset $value, $srsrc, $soffset, $offset, 0, 0, 0)
1508 >;
1509}
1510
1511defm : MUBUFScratchStorePat <BUFFER_STORE_BYTE_OFFEN, BUFFER_STORE_BYTE_OFFSET, i32, truncstorei8_private>;
1512defm : MUBUFScratchStorePat <BUFFER_STORE_SHORT_OFFEN, BUFFER_STORE_SHORT_OFFSET, i32, truncstorei16_private>;
1513defm : MUBUFScratchStorePat <BUFFER_STORE_BYTE_OFFEN, BUFFER_STORE_BYTE_OFFSET, i16, truncstorei8_private>;
1514defm : MUBUFScratchStorePat <BUFFER_STORE_SHORT_OFFEN, BUFFER_STORE_SHORT_OFFSET, i16, store_private>;
1515defm : MUBUFScratchStorePat <BUFFER_STORE_DWORD_OFFEN, BUFFER_STORE_DWORD_OFFSET, i32, store_private>;
1516defm : MUBUFScratchStorePat <BUFFER_STORE_DWORDX2_OFFEN, BUFFER_STORE_DWORDX2_OFFSET, v2i32, store_private>;
1517defm : MUBUFScratchStorePat <BUFFER_STORE_DWORDX4_OFFEN, BUFFER_STORE_DWORDX4_OFFSET, v4i32, store_private>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001518
Matt Arsenaultfcc213f2017-09-20 03:20:09 +00001519
Konstantin Zhuravlyovc2c2eb72018-05-04 20:06:57 +00001520let OtherPredicates = [D16PreservesUnusedBits] in {
Matt Arsenaultfcc213f2017-09-20 03:20:09 +00001521 // Hiding the extract high pattern in the PatFrag seems to not
1522 // automatically increase the complexity.
1523let AddedComplexity = 1 in {
Matt Arsenaultbc683832017-09-20 03:43:35 +00001524defm : MUBUFScratchStorePat <BUFFER_STORE_SHORT_D16_HI_OFFEN, BUFFER_STORE_SHORT_D16_HI_OFFSET, i32, store_hi16_private>;
1525defm : MUBUFScratchStorePat <BUFFER_STORE_BYTE_D16_HI_OFFEN, BUFFER_STORE_BYTE_D16_HI_OFFSET, i32, truncstorei8_hi16_private>;
Matt Arsenaultfcc213f2017-09-20 03:20:09 +00001526}
1527}
1528
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001529//===----------------------------------------------------------------------===//
1530// MTBUF Patterns
1531//===----------------------------------------------------------------------===//
1532
David Stuttard70e8bc12017-06-22 16:29:22 +00001533//===----------------------------------------------------------------------===//
1534// tbuffer_load/store_format patterns
1535//===----------------------------------------------------------------------===//
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001536
David Stuttard70e8bc12017-06-22 16:29:22 +00001537multiclass MTBUF_LoadIntrinsicPat<SDPatternOperator name, ValueType vt,
1538 string opcode> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001539 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001540 (vt (name v4i32:$rsrc, 0, 0, i32:$soffset, imm:$offset,
Tim Renouf35484c92018-08-21 11:06:05 +00001541 imm:$format, imm:$cachepolicy, 0)),
David Stuttard70e8bc12017-06-22 16:29:22 +00001542 (!cast<MTBUF_Pseudo>(opcode # _OFFSET) $rsrc, $soffset, (as_i16imm $offset),
Tim Renouf35484c92018-08-21 11:06:05 +00001543 (as_i8imm $format),
1544 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
David Stuttard70e8bc12017-06-22 16:29:22 +00001545 >;
1546
Matt Arsenault90c75932017-10-03 00:06:41 +00001547 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001548 (vt (name v4i32:$rsrc, i32:$vindex, 0, i32:$soffset, imm:$offset,
Tim Renouf35484c92018-08-21 11:06:05 +00001549 imm:$format, imm:$cachepolicy, imm)),
David Stuttard70e8bc12017-06-22 16:29:22 +00001550 (!cast<MTBUF_Pseudo>(opcode # _IDXEN) $vindex, $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
Matt Arsenault90c75932017-10-03 00:06:41 +00001555 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001556 (vt (name v4i32:$rsrc, 0, i32:$voffset, i32:$soffset, imm:$offset,
Tim Renouf35484c92018-08-21 11:06:05 +00001557 imm:$format, imm:$cachepolicy, 0)),
David Stuttard70e8bc12017-06-22 16:29:22 +00001558 (!cast<MTBUF_Pseudo>(opcode # _OFFEN) $voffset, $rsrc, $soffset, (as_i16imm $offset),
Tim Renouf35484c92018-08-21 11:06:05 +00001559 (as_i8imm $format),
1560 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
David Stuttard70e8bc12017-06-22 16:29:22 +00001561 >;
1562
Matt Arsenault90c75932017-10-03 00:06:41 +00001563 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001564 (vt (name v4i32:$rsrc, i32:$vindex, i32:$voffset, i32:$soffset, imm:$offset,
Tim Renouf35484c92018-08-21 11:06:05 +00001565 imm:$format, imm:$cachepolicy, imm)),
David Stuttard70e8bc12017-06-22 16:29:22 +00001566 (!cast<MTBUF_Pseudo>(opcode # _BOTHEN)
1567 (REG_SEQUENCE VReg_64, $vindex, sub0, $voffset, sub1),
1568 $rsrc, $soffset, (as_i16imm $offset),
Tim Renouf35484c92018-08-21 11:06:05 +00001569 (as_i8imm $format),
1570 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
David Stuttard70e8bc12017-06-22 16:29:22 +00001571 >;
1572}
1573
1574defm : MTBUF_LoadIntrinsicPat<SItbuffer_load, i32, "TBUFFER_LOAD_FORMAT_X">;
1575defm : MTBUF_LoadIntrinsicPat<SItbuffer_load, v2i32, "TBUFFER_LOAD_FORMAT_XY">;
1576defm : MTBUF_LoadIntrinsicPat<SItbuffer_load, v4i32, "TBUFFER_LOAD_FORMAT_XYZW">;
1577defm : MTBUF_LoadIntrinsicPat<SItbuffer_load, f32, "TBUFFER_LOAD_FORMAT_X">;
1578defm : MTBUF_LoadIntrinsicPat<SItbuffer_load, v2f32, "TBUFFER_LOAD_FORMAT_XY">;
1579defm : MTBUF_LoadIntrinsicPat<SItbuffer_load, v4f32, "TBUFFER_LOAD_FORMAT_XYZW">;
1580
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001581let SubtargetPredicate = HasUnpackedD16VMem in {
Matt Arsenault1349a042018-05-22 06:32:10 +00001582 defm : MTBUF_LoadIntrinsicPat<SItbuffer_load_d16, f16, "TBUFFER_LOAD_FORMAT_D16_X_gfx80">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001583 defm : MTBUF_LoadIntrinsicPat<SItbuffer_load_d16, v2i32, "TBUFFER_LOAD_FORMAT_D16_XY_gfx80">;
1584 defm : MTBUF_LoadIntrinsicPat<SItbuffer_load_d16, v4i32, "TBUFFER_LOAD_FORMAT_D16_XYZW_gfx80">;
1585} // End HasUnpackedD16VMem.
1586
1587let SubtargetPredicate = HasPackedD16VMem in {
Matt Arsenault1349a042018-05-22 06:32:10 +00001588 defm : MTBUF_LoadIntrinsicPat<SItbuffer_load_d16, f16, "TBUFFER_LOAD_FORMAT_D16_X">;
1589 defm : MTBUF_LoadIntrinsicPat<SItbuffer_load_d16, v2f16, "TBUFFER_LOAD_FORMAT_D16_XY">;
Matt Arsenault02dc7e12018-06-15 15:15:46 +00001590 defm : MTBUF_LoadIntrinsicPat<SItbuffer_load_d16, v4f16, "TBUFFER_LOAD_FORMAT_D16_XYZW">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001591} // End HasPackedD16VMem.
1592
David Stuttard70e8bc12017-06-22 16:29:22 +00001593multiclass MTBUF_StoreIntrinsicPat<SDPatternOperator name, ValueType vt,
1594 string opcode> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001595 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001596 (name vt:$vdata, v4i32:$rsrc, 0, 0, i32:$soffset, imm:$offset,
Tim Renouf35484c92018-08-21 11:06:05 +00001597 imm:$format, imm:$cachepolicy, 0),
David Stuttard70e8bc12017-06-22 16:29:22 +00001598 (!cast<MTBUF_Pseudo>(opcode # _OFFSET_exact) $vdata, $rsrc, $soffset,
Tim Renouf35484c92018-08-21 11:06:05 +00001599 (as_i16imm $offset), (as_i8imm $format),
1600 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
David Stuttard70e8bc12017-06-22 16:29:22 +00001601 >;
1602
Matt Arsenault90c75932017-10-03 00:06:41 +00001603 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001604 (name vt:$vdata, v4i32:$rsrc, i32:$vindex, 0, i32:$soffset, imm:$offset,
Tim Renouf35484c92018-08-21 11:06:05 +00001605 imm:$format, imm:$cachepolicy, imm),
David Stuttard70e8bc12017-06-22 16:29:22 +00001606 (!cast<MTBUF_Pseudo>(opcode # _IDXEN_exact) $vdata, $vindex, $rsrc, $soffset,
Tim Renouf35484c92018-08-21 11:06:05 +00001607 (as_i16imm $offset), (as_i8imm $format),
1608 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
David Stuttard70e8bc12017-06-22 16:29:22 +00001609 >;
1610
Matt Arsenault90c75932017-10-03 00:06:41 +00001611 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001612 (name vt:$vdata, v4i32:$rsrc, 0, i32:$voffset, i32:$soffset, imm:$offset,
Tim Renouf35484c92018-08-21 11:06:05 +00001613 imm:$format, imm:$cachepolicy, 0),
David Stuttard70e8bc12017-06-22 16:29:22 +00001614 (!cast<MTBUF_Pseudo>(opcode # _OFFEN_exact) $vdata, $voffset, $rsrc, $soffset,
Tim Renouf35484c92018-08-21 11:06:05 +00001615 (as_i16imm $offset), (as_i8imm $format),
1616 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
David Stuttard70e8bc12017-06-22 16:29:22 +00001617 >;
1618
Matt Arsenault90c75932017-10-03 00:06:41 +00001619 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001620 (name vt:$vdata, v4i32:$rsrc, i32:$vindex, i32:$voffset, i32:$soffset,
Tim Renouf35484c92018-08-21 11:06:05 +00001621 imm:$offset, imm:$format, imm:$cachepolicy, imm),
David Stuttard70e8bc12017-06-22 16:29:22 +00001622 (!cast<MTBUF_Pseudo>(opcode # _BOTHEN_exact)
1623 $vdata,
1624 (REG_SEQUENCE VReg_64, $vindex, sub0, $voffset, sub1),
Tim Renouf35484c92018-08-21 11:06:05 +00001625 $rsrc, $soffset, (as_i16imm $offset), (as_i8imm $format),
1626 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0)
David Stuttard70e8bc12017-06-22 16:29:22 +00001627 >;
1628}
1629
1630defm : MTBUF_StoreIntrinsicPat<SItbuffer_store, i32, "TBUFFER_STORE_FORMAT_X">;
1631defm : MTBUF_StoreIntrinsicPat<SItbuffer_store, v2i32, "TBUFFER_STORE_FORMAT_XY">;
1632defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_x3, v4i32, "TBUFFER_STORE_FORMAT_XYZ">;
1633defm : MTBUF_StoreIntrinsicPat<SItbuffer_store, v4i32, "TBUFFER_STORE_FORMAT_XYZW">;
1634defm : MTBUF_StoreIntrinsicPat<SItbuffer_store, f32, "TBUFFER_STORE_FORMAT_X">;
1635defm : MTBUF_StoreIntrinsicPat<SItbuffer_store, v2f32, "TBUFFER_STORE_FORMAT_XY">;
1636defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_x3, v4f32, "TBUFFER_STORE_FORMAT_XYZ">;
1637defm : MTBUF_StoreIntrinsicPat<SItbuffer_store, v4f32, "TBUFFER_STORE_FORMAT_XYZW">;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001638
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001639let SubtargetPredicate = HasUnpackedD16VMem in {
1640 defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_d16, f16, "TBUFFER_STORE_FORMAT_D16_X_gfx80">;
1641 defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_d16, v2i32, "TBUFFER_STORE_FORMAT_D16_XY_gfx80">;
1642 defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_d16, v4i32, "TBUFFER_STORE_FORMAT_D16_XYZW_gfx80">;
1643} // End HasUnpackedD16VMem.
1644
1645let SubtargetPredicate = HasPackedD16VMem in {
1646 defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_d16, f16, "TBUFFER_STORE_FORMAT_D16_X">;
1647 defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_d16, v2f16, "TBUFFER_STORE_FORMAT_D16_XY">;
Matt Arsenault02dc7e12018-06-15 15:15:46 +00001648 defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_d16, v4f16, "TBUFFER_STORE_FORMAT_D16_XYZW">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001649} // End HasPackedD16VMem.
1650
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001651//===----------------------------------------------------------------------===//
1652// Target instructions, move to the appropriate target TD file
1653//===----------------------------------------------------------------------===//
1654
1655//===----------------------------------------------------------------------===//
1656// SI
1657//===----------------------------------------------------------------------===//
1658
1659class MUBUF_Real_si <bits<7> op, MUBUF_Pseudo ps> :
1660 MUBUF_Real<op, ps>,
1661 Enc64,
1662 SIMCInstr<ps.PseudoInstr, SIEncodingFamily.SI> {
1663 let AssemblerPredicate=isSICI;
1664 let DecoderNamespace="SICI";
1665
1666 let Inst{11-0} = !if(ps.has_offset, offset, ?);
1667 let Inst{12} = ps.offen;
1668 let Inst{13} = ps.idxen;
1669 let Inst{14} = !if(ps.has_glc, glc, ps.glc_value);
1670 let Inst{15} = ps.addr64;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001671 let Inst{16} = !if(ps.lds, 1, 0);
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001672 let Inst{24-18} = op;
1673 let Inst{31-26} = 0x38; //encoding
1674 let Inst{39-32} = !if(ps.has_vaddr, vaddr, ?);
1675 let Inst{47-40} = !if(ps.has_vdata, vdata, ?);
1676 let Inst{52-48} = !if(ps.has_srsrc, srsrc{6-2}, ?);
1677 let Inst{54} = !if(ps.has_slc, slc, ?);
1678 let Inst{55} = !if(ps.has_tfe, tfe, ?);
1679 let Inst{63-56} = !if(ps.has_soffset, soffset, ?);
1680}
1681
1682multiclass MUBUF_Real_AllAddr_si<bits<7> op> {
1683 def _OFFSET_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET")>;
1684 def _ADDR64_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_ADDR64")>;
1685 def _OFFEN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN")>;
1686 def _IDXEN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN")>;
1687 def _BOTHEN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN")>;
1688}
1689
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001690multiclass MUBUF_Real_AllAddr_Lds_si<bits<7> op> {
1691
1692 def _OFFSET_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001693 MUBUFLdsTable<0, NAME # "_OFFSET_si">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001694 def _ADDR64_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_ADDR64")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001695 MUBUFLdsTable<0, NAME # "_ADDR64_si">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001696 def _OFFEN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001697 MUBUFLdsTable<0, NAME # "_OFFEN_si">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001698 def _IDXEN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001699 MUBUFLdsTable<0, NAME # "_IDXEN_si">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001700 def _BOTHEN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001701 MUBUFLdsTable<0, NAME # "_BOTHEN_si">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001702
1703 def _LDS_OFFSET_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_LDS_OFFSET")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001704 MUBUFLdsTable<1, NAME # "_OFFSET_si">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001705 def _LDS_ADDR64_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_LDS_ADDR64")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001706 MUBUFLdsTable<1, NAME # "_ADDR64_si">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001707 def _LDS_OFFEN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_LDS_OFFEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001708 MUBUFLdsTable<1, NAME # "_OFFEN_si">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001709 def _LDS_IDXEN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_LDS_IDXEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001710 MUBUFLdsTable<1, NAME # "_IDXEN_si">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001711 def _LDS_BOTHEN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_LDS_BOTHEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001712 MUBUFLdsTable<1, NAME # "_BOTHEN_si">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001713}
1714
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001715multiclass MUBUF_Real_Atomic_si<bits<7> op> : MUBUF_Real_AllAddr_si<op> {
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001716 def _OFFSET_RTN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET_RTN")>;
1717 def _ADDR64_RTN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_ADDR64_RTN")>;
1718 def _OFFEN_RTN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN_RTN")>;
1719 def _IDXEN_RTN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN_RTN")>;
1720 def _BOTHEN_RTN_si : MUBUF_Real_si <op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN_RTN")>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001721}
1722
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001723defm BUFFER_LOAD_FORMAT_X : MUBUF_Real_AllAddr_Lds_si <0x00>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001724defm BUFFER_LOAD_FORMAT_XY : MUBUF_Real_AllAddr_si <0x01>;
1725defm BUFFER_LOAD_FORMAT_XYZ : MUBUF_Real_AllAddr_si <0x02>;
1726defm BUFFER_LOAD_FORMAT_XYZW : MUBUF_Real_AllAddr_si <0x03>;
1727defm BUFFER_STORE_FORMAT_X : MUBUF_Real_AllAddr_si <0x04>;
1728defm BUFFER_STORE_FORMAT_XY : MUBUF_Real_AllAddr_si <0x05>;
1729defm BUFFER_STORE_FORMAT_XYZ : MUBUF_Real_AllAddr_si <0x06>;
1730defm BUFFER_STORE_FORMAT_XYZW : MUBUF_Real_AllAddr_si <0x07>;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001731defm BUFFER_LOAD_UBYTE : MUBUF_Real_AllAddr_Lds_si <0x08>;
1732defm BUFFER_LOAD_SBYTE : MUBUF_Real_AllAddr_Lds_si <0x09>;
1733defm BUFFER_LOAD_USHORT : MUBUF_Real_AllAddr_Lds_si <0x0a>;
1734defm BUFFER_LOAD_SSHORT : MUBUF_Real_AllAddr_Lds_si <0x0b>;
1735defm BUFFER_LOAD_DWORD : MUBUF_Real_AllAddr_Lds_si <0x0c>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001736defm BUFFER_LOAD_DWORDX2 : MUBUF_Real_AllAddr_si <0x0d>;
1737defm BUFFER_LOAD_DWORDX4 : MUBUF_Real_AllAddr_si <0x0e>;
Artem Tamazov73f1ab22016-10-07 15:53:16 +00001738defm BUFFER_LOAD_DWORDX3 : MUBUF_Real_AllAddr_si <0x0f>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001739defm BUFFER_STORE_BYTE : MUBUF_Real_AllAddr_si <0x18>;
1740defm BUFFER_STORE_SHORT : MUBUF_Real_AllAddr_si <0x1a>;
1741defm BUFFER_STORE_DWORD : MUBUF_Real_AllAddr_si <0x1c>;
1742defm BUFFER_STORE_DWORDX2 : MUBUF_Real_AllAddr_si <0x1d>;
1743defm BUFFER_STORE_DWORDX4 : MUBUF_Real_AllAddr_si <0x1e>;
Artem Tamazov73f1ab22016-10-07 15:53:16 +00001744defm BUFFER_STORE_DWORDX3 : MUBUF_Real_AllAddr_si <0x1f>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001745
1746defm BUFFER_ATOMIC_SWAP : MUBUF_Real_Atomic_si <0x30>;
1747defm BUFFER_ATOMIC_CMPSWAP : MUBUF_Real_Atomic_si <0x31>;
1748defm BUFFER_ATOMIC_ADD : MUBUF_Real_Atomic_si <0x32>;
1749defm BUFFER_ATOMIC_SUB : MUBUF_Real_Atomic_si <0x33>;
1750//defm BUFFER_ATOMIC_RSUB : MUBUF_Real_Atomic_si <0x34>; // isn't on CI & VI
1751defm BUFFER_ATOMIC_SMIN : MUBUF_Real_Atomic_si <0x35>;
1752defm BUFFER_ATOMIC_UMIN : MUBUF_Real_Atomic_si <0x36>;
1753defm BUFFER_ATOMIC_SMAX : MUBUF_Real_Atomic_si <0x37>;
1754defm BUFFER_ATOMIC_UMAX : MUBUF_Real_Atomic_si <0x38>;
1755defm BUFFER_ATOMIC_AND : MUBUF_Real_Atomic_si <0x39>;
1756defm BUFFER_ATOMIC_OR : MUBUF_Real_Atomic_si <0x3a>;
1757defm BUFFER_ATOMIC_XOR : MUBUF_Real_Atomic_si <0x3b>;
1758defm BUFFER_ATOMIC_INC : MUBUF_Real_Atomic_si <0x3c>;
1759defm BUFFER_ATOMIC_DEC : MUBUF_Real_Atomic_si <0x3d>;
1760
1761//defm BUFFER_ATOMIC_FCMPSWAP : MUBUF_Real_Atomic_si <0x3e>; // isn't on VI
1762//defm BUFFER_ATOMIC_FMIN : MUBUF_Real_Atomic_si <0x3f>; // isn't on VI
1763//defm BUFFER_ATOMIC_FMAX : MUBUF_Real_Atomic_si <0x40>; // isn't on VI
1764defm BUFFER_ATOMIC_SWAP_X2 : MUBUF_Real_Atomic_si <0x50>;
1765defm BUFFER_ATOMIC_CMPSWAP_X2 : MUBUF_Real_Atomic_si <0x51>;
1766defm BUFFER_ATOMIC_ADD_X2 : MUBUF_Real_Atomic_si <0x52>;
1767defm BUFFER_ATOMIC_SUB_X2 : MUBUF_Real_Atomic_si <0x53>;
1768//defm BUFFER_ATOMIC_RSUB_X2 : MUBUF_Real_Atomic_si <0x54>; // isn't on CI & VI
1769defm BUFFER_ATOMIC_SMIN_X2 : MUBUF_Real_Atomic_si <0x55>;
1770defm BUFFER_ATOMIC_UMIN_X2 : MUBUF_Real_Atomic_si <0x56>;
1771defm BUFFER_ATOMIC_SMAX_X2 : MUBUF_Real_Atomic_si <0x57>;
1772defm BUFFER_ATOMIC_UMAX_X2 : MUBUF_Real_Atomic_si <0x58>;
1773defm BUFFER_ATOMIC_AND_X2 : MUBUF_Real_Atomic_si <0x59>;
1774defm BUFFER_ATOMIC_OR_X2 : MUBUF_Real_Atomic_si <0x5a>;
1775defm BUFFER_ATOMIC_XOR_X2 : MUBUF_Real_Atomic_si <0x5b>;
1776defm BUFFER_ATOMIC_INC_X2 : MUBUF_Real_Atomic_si <0x5c>;
1777defm BUFFER_ATOMIC_DEC_X2 : MUBUF_Real_Atomic_si <0x5d>;
Tom Stellardb133fbb2016-10-27 23:05:31 +00001778// FIXME: Need to handle hazard for BUFFER_ATOMIC_FCMPSWAP_X2 on CI.
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001779//defm BUFFER_ATOMIC_FCMPSWAP_X2 : MUBUF_Real_Atomic_si <0x5e">; // isn't on VI
1780//defm BUFFER_ATOMIC_FMIN_X2 : MUBUF_Real_Atomic_si <0x5f>; // isn't on VI
1781//defm BUFFER_ATOMIC_FMAX_X2 : MUBUF_Real_Atomic_si <0x60>; // isn't on VI
1782
1783def BUFFER_WBINVL1_SC_si : MUBUF_Real_si <0x70, BUFFER_WBINVL1_SC>;
1784def BUFFER_WBINVL1_si : MUBUF_Real_si <0x71, BUFFER_WBINVL1>;
1785
1786class MTBUF_Real_si <bits<3> op, MTBUF_Pseudo ps> :
Valery Pykhtinfbf2d932016-09-23 21:21:21 +00001787 MTBUF_Real<ps>,
David Stuttard70e8bc12017-06-22 16:29:22 +00001788 Enc64,
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001789 SIMCInstr<ps.PseudoInstr, SIEncodingFamily.SI> {
1790 let AssemblerPredicate=isSICI;
1791 let DecoderNamespace="SICI";
Valery Pykhtinfbf2d932016-09-23 21:21:21 +00001792
David Stuttard70e8bc12017-06-22 16:29:22 +00001793 let Inst{11-0} = !if(ps.has_offset, offset, ?);
1794 let Inst{12} = ps.offen;
1795 let Inst{13} = ps.idxen;
1796 let Inst{14} = !if(ps.has_glc, glc, ps.glc_value);
1797 let Inst{15} = ps.addr64;
Valery Pykhtinfbf2d932016-09-23 21:21:21 +00001798 let Inst{18-16} = op;
Tim Renouf35484c92018-08-21 11:06:05 +00001799 let Inst{22-19} = dfmt;
1800 let Inst{25-23} = nfmt;
David Stuttard70e8bc12017-06-22 16:29:22 +00001801 let Inst{31-26} = 0x3a; //encoding
1802 let Inst{39-32} = !if(ps.has_vaddr, vaddr, ?);
1803 let Inst{47-40} = !if(ps.has_vdata, vdata, ?);
1804 let Inst{52-48} = !if(ps.has_srsrc, srsrc{6-2}, ?);
1805 let Inst{54} = !if(ps.has_slc, slc, ?);
1806 let Inst{55} = !if(ps.has_tfe, tfe, ?);
1807 let Inst{63-56} = !if(ps.has_soffset, soffset, ?);
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001808}
1809
David Stuttard70e8bc12017-06-22 16:29:22 +00001810multiclass MTBUF_Real_AllAddr_si<bits<3> op> {
1811 def _OFFSET_si : MTBUF_Real_si <op, !cast<MTBUF_Pseudo>(NAME#"_OFFSET")>;
1812 def _ADDR64_si : MTBUF_Real_si <op, !cast<MTBUF_Pseudo>(NAME#"_ADDR64")>;
1813 def _OFFEN_si : MTBUF_Real_si <op, !cast<MTBUF_Pseudo>(NAME#"_OFFEN")>;
1814 def _IDXEN_si : MTBUF_Real_si <op, !cast<MTBUF_Pseudo>(NAME#"_IDXEN")>;
1815 def _BOTHEN_si : MTBUF_Real_si <op, !cast<MTBUF_Pseudo>(NAME#"_BOTHEN")>;
1816}
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001817
David Stuttard70e8bc12017-06-22 16:29:22 +00001818defm TBUFFER_LOAD_FORMAT_X : MTBUF_Real_AllAddr_si <0>;
1819defm TBUFFER_LOAD_FORMAT_XY : MTBUF_Real_AllAddr_si <1>;
Dmitry Preobrazhensky523872e2018-04-04 13:54:55 +00001820defm TBUFFER_LOAD_FORMAT_XYZ : MTBUF_Real_AllAddr_si <2>;
David Stuttard70e8bc12017-06-22 16:29:22 +00001821defm TBUFFER_LOAD_FORMAT_XYZW : MTBUF_Real_AllAddr_si <3>;
1822defm TBUFFER_STORE_FORMAT_X : MTBUF_Real_AllAddr_si <4>;
1823defm TBUFFER_STORE_FORMAT_XY : MTBUF_Real_AllAddr_si <5>;
1824defm TBUFFER_STORE_FORMAT_XYZ : MTBUF_Real_AllAddr_si <6>;
1825defm TBUFFER_STORE_FORMAT_XYZW : MTBUF_Real_AllAddr_si <7>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001826
1827//===----------------------------------------------------------------------===//
1828// CI
Tim Renouf35484c92018-08-21 11:06:05 +00001829// MTBUF - GFX6, GFX7.
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001830//===----------------------------------------------------------------------===//
1831
1832class MUBUF_Real_ci <bits<7> op, MUBUF_Pseudo ps> :
1833 MUBUF_Real_si<op, ps> {
1834 let AssemblerPredicate=isCIOnly;
1835 let DecoderNamespace="CI";
1836}
1837
1838def BUFFER_WBINVL1_VOL_ci : MUBUF_Real_ci <0x70, BUFFER_WBINVL1_VOL>;
1839
1840
1841//===----------------------------------------------------------------------===//
1842// VI
1843//===----------------------------------------------------------------------===//
1844
1845class MUBUF_Real_vi <bits<7> op, MUBUF_Pseudo ps> :
1846 MUBUF_Real<op, ps>,
1847 Enc64,
1848 SIMCInstr<ps.PseudoInstr, SIEncodingFamily.VI> {
1849 let AssemblerPredicate=isVI;
1850 let DecoderNamespace="VI";
1851
1852 let Inst{11-0} = !if(ps.has_offset, offset, ?);
1853 let Inst{12} = ps.offen;
1854 let Inst{13} = ps.idxen;
1855 let Inst{14} = !if(ps.has_glc, glc, ps.glc_value);
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001856 let Inst{16} = !if(ps.lds, 1, 0);
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001857 let Inst{17} = !if(ps.has_slc, slc, ?);
1858 let Inst{24-18} = op;
1859 let Inst{31-26} = 0x38; //encoding
1860 let Inst{39-32} = !if(ps.has_vaddr, vaddr, ?);
1861 let Inst{47-40} = !if(ps.has_vdata, vdata, ?);
1862 let Inst{52-48} = !if(ps.has_srsrc, srsrc{6-2}, ?);
1863 let Inst{55} = !if(ps.has_tfe, tfe, ?);
1864 let Inst{63-56} = !if(ps.has_soffset, soffset, ?);
1865}
1866
1867multiclass MUBUF_Real_AllAddr_vi<bits<7> op> {
1868 def _OFFSET_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET")>;
1869 def _OFFEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN")>;
1870 def _IDXEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN")>;
1871 def _BOTHEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN")>;
1872}
1873
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001874multiclass MUBUF_Real_AllAddr_Lds_vi<bits<7> op> {
1875
1876 def _OFFSET_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001877 MUBUFLdsTable<0, NAME # "_OFFSET_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001878 def _OFFEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001879 MUBUFLdsTable<0, NAME # "_OFFEN_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001880 def _IDXEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001881 MUBUFLdsTable<0, NAME # "_IDXEN_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001882 def _BOTHEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001883 MUBUFLdsTable<0, NAME # "_BOTHEN_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001884
1885 def _LDS_OFFSET_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_LDS_OFFSET")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001886 MUBUFLdsTable<1, NAME # "_OFFSET_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001887 def _LDS_OFFEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_LDS_OFFEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001888 MUBUFLdsTable<1, NAME # "_OFFEN_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001889 def _LDS_IDXEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_LDS_IDXEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001890 MUBUFLdsTable<1, NAME # "_IDXEN_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001891 def _LDS_BOTHEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_LDS_BOTHEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00001892 MUBUFLdsTable<1, NAME # "_BOTHEN_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001893}
1894
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001895class MUBUF_Real_gfx80 <bits<7> op, MUBUF_Pseudo ps> :
1896 MUBUF_Real<op, ps>,
1897 Enc64,
1898 SIMCInstr<ps.PseudoInstr, SIEncodingFamily.GFX80> {
1899 let AssemblerPredicate=HasUnpackedD16VMem;
1900 let DecoderNamespace="GFX80_UNPACKED";
1901
1902 let Inst{11-0} = !if(ps.has_offset, offset, ?);
1903 let Inst{12} = ps.offen;
1904 let Inst{13} = ps.idxen;
1905 let Inst{14} = !if(ps.has_glc, glc, ps.glc_value);
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001906 let Inst{16} = !if(ps.lds, 1, 0);
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001907 let Inst{17} = !if(ps.has_slc, slc, ?);
1908 let Inst{24-18} = op;
1909 let Inst{31-26} = 0x38; //encoding
1910 let Inst{39-32} = !if(ps.has_vaddr, vaddr, ?);
1911 let Inst{47-40} = !if(ps.has_vdata, vdata, ?);
1912 let Inst{52-48} = !if(ps.has_srsrc, srsrc{6-2}, ?);
1913 let Inst{55} = !if(ps.has_tfe, tfe, ?);
1914 let Inst{63-56} = !if(ps.has_soffset, soffset, ?);
1915}
1916
1917multiclass MUBUF_Real_AllAddr_gfx80<bits<7> op> {
Changpeng Fangba6240c2018-01-18 22:57:57 +00001918 def _OFFSET_gfx80 : MUBUF_Real_gfx80 <op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET")>;
1919 def _OFFEN_gfx80 : MUBUF_Real_gfx80 <op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN")>;
1920 def _IDXEN_gfx80 : MUBUF_Real_gfx80 <op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN")>;
1921 def _BOTHEN_gfx80 : MUBUF_Real_gfx80 <op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN")>;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001922}
1923
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001924multiclass MUBUF_Real_Atomic_vi<bits<7> op> :
1925 MUBUF_Real_AllAddr_vi<op> {
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001926 def _OFFSET_RTN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET_RTN")>;
1927 def _OFFEN_RTN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN_RTN")>;
1928 def _IDXEN_RTN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN_RTN")>;
1929 def _BOTHEN_RTN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN_RTN")>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001930}
1931
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001932defm BUFFER_LOAD_FORMAT_X : MUBUF_Real_AllAddr_Lds_vi <0x00>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001933defm BUFFER_LOAD_FORMAT_XY : MUBUF_Real_AllAddr_vi <0x01>;
1934defm BUFFER_LOAD_FORMAT_XYZ : MUBUF_Real_AllAddr_vi <0x02>;
1935defm BUFFER_LOAD_FORMAT_XYZW : MUBUF_Real_AllAddr_vi <0x03>;
1936defm BUFFER_STORE_FORMAT_X : MUBUF_Real_AllAddr_vi <0x04>;
1937defm BUFFER_STORE_FORMAT_XY : MUBUF_Real_AllAddr_vi <0x05>;
1938defm BUFFER_STORE_FORMAT_XYZ : MUBUF_Real_AllAddr_vi <0x06>;
1939defm BUFFER_STORE_FORMAT_XYZW : MUBUF_Real_AllAddr_vi <0x07>;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001940let SubtargetPredicate = HasUnpackedD16VMem in {
1941 defm BUFFER_LOAD_FORMAT_D16_X_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x08>;
1942 defm BUFFER_LOAD_FORMAT_D16_XY_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x09>;
1943 defm BUFFER_LOAD_FORMAT_D16_XYZ_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x0a>;
1944 defm BUFFER_LOAD_FORMAT_D16_XYZW_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x0b>;
1945 defm BUFFER_STORE_FORMAT_D16_X_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x0c>;
1946 defm BUFFER_STORE_FORMAT_D16_XY_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x0d>;
1947 defm BUFFER_STORE_FORMAT_D16_XYZ_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x0e>;
1948 defm BUFFER_STORE_FORMAT_D16_XYZW_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x0f>;
1949} // End HasUnpackedD16VMem.
1950let SubtargetPredicate = HasPackedD16VMem in {
1951 defm BUFFER_LOAD_FORMAT_D16_X : MUBUF_Real_AllAddr_vi <0x08>;
1952 defm BUFFER_LOAD_FORMAT_D16_XY : MUBUF_Real_AllAddr_vi <0x09>;
1953 defm BUFFER_LOAD_FORMAT_D16_XYZ : MUBUF_Real_AllAddr_vi <0x0a>;
1954 defm BUFFER_LOAD_FORMAT_D16_XYZW : MUBUF_Real_AllAddr_vi <0x0b>;
1955 defm BUFFER_STORE_FORMAT_D16_X : MUBUF_Real_AllAddr_vi <0x0c>;
1956 defm BUFFER_STORE_FORMAT_D16_XY : MUBUF_Real_AllAddr_vi <0x0d>;
1957 defm BUFFER_STORE_FORMAT_D16_XYZ : MUBUF_Real_AllAddr_vi <0x0e>;
1958 defm BUFFER_STORE_FORMAT_D16_XYZW : MUBUF_Real_AllAddr_vi <0x0f>;
1959} // End HasPackedD16VMem.
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001960defm BUFFER_LOAD_UBYTE : MUBUF_Real_AllAddr_Lds_vi <0x10>;
1961defm BUFFER_LOAD_SBYTE : MUBUF_Real_AllAddr_Lds_vi <0x11>;
1962defm BUFFER_LOAD_USHORT : MUBUF_Real_AllAddr_Lds_vi <0x12>;
1963defm BUFFER_LOAD_SSHORT : MUBUF_Real_AllAddr_Lds_vi <0x13>;
1964defm BUFFER_LOAD_DWORD : MUBUF_Real_AllAddr_Lds_vi <0x14>;
Dmitry Preobrazhenskyffbee7a2018-06-13 15:32:46 +00001965defm BUFFER_LOAD_DWORDX2 : MUBUF_Real_AllAddr_Lds_vi <0x15>;
1966defm BUFFER_LOAD_DWORDX3 : MUBUF_Real_AllAddr_Lds_vi <0x16>;
1967defm BUFFER_LOAD_DWORDX4 : MUBUF_Real_AllAddr_Lds_vi <0x17>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001968defm BUFFER_STORE_BYTE : MUBUF_Real_AllAddr_vi <0x18>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001969defm BUFFER_STORE_BYTE_D16_HI : MUBUF_Real_AllAddr_vi <0x19>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001970defm BUFFER_STORE_SHORT : MUBUF_Real_AllAddr_vi <0x1a>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001971defm BUFFER_STORE_SHORT_D16_HI : MUBUF_Real_AllAddr_vi <0x1b>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001972defm BUFFER_STORE_DWORD : MUBUF_Real_AllAddr_vi <0x1c>;
1973defm BUFFER_STORE_DWORDX2 : MUBUF_Real_AllAddr_vi <0x1d>;
Artem Tamazov73f1ab22016-10-07 15:53:16 +00001974defm BUFFER_STORE_DWORDX3 : MUBUF_Real_AllAddr_vi <0x1e>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001975defm BUFFER_STORE_DWORDX4 : MUBUF_Real_AllAddr_vi <0x1f>;
1976
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001977defm BUFFER_LOAD_UBYTE_D16 : MUBUF_Real_AllAddr_vi <0x20>;
1978defm BUFFER_LOAD_UBYTE_D16_HI : MUBUF_Real_AllAddr_vi <0x21>;
1979defm BUFFER_LOAD_SBYTE_D16 : MUBUF_Real_AllAddr_vi <0x22>;
1980defm BUFFER_LOAD_SBYTE_D16_HI : MUBUF_Real_AllAddr_vi <0x23>;
1981defm BUFFER_LOAD_SHORT_D16 : MUBUF_Real_AllAddr_vi <0x24>;
1982defm BUFFER_LOAD_SHORT_D16_HI : MUBUF_Real_AllAddr_vi <0x25>;
1983
Dmitry Preobrazhenskya917e882018-03-28 14:53:13 +00001984defm BUFFER_LOAD_FORMAT_D16_HI_X : MUBUF_Real_AllAddr_vi <0x26>;
1985defm BUFFER_STORE_FORMAT_D16_HI_X : MUBUF_Real_AllAddr_vi <0x27>;
1986
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001987defm BUFFER_ATOMIC_SWAP : MUBUF_Real_Atomic_vi <0x40>;
1988defm BUFFER_ATOMIC_CMPSWAP : MUBUF_Real_Atomic_vi <0x41>;
1989defm BUFFER_ATOMIC_ADD : MUBUF_Real_Atomic_vi <0x42>;
1990defm BUFFER_ATOMIC_SUB : MUBUF_Real_Atomic_vi <0x43>;
1991defm BUFFER_ATOMIC_SMIN : MUBUF_Real_Atomic_vi <0x44>;
1992defm BUFFER_ATOMIC_UMIN : MUBUF_Real_Atomic_vi <0x45>;
1993defm BUFFER_ATOMIC_SMAX : MUBUF_Real_Atomic_vi <0x46>;
1994defm BUFFER_ATOMIC_UMAX : MUBUF_Real_Atomic_vi <0x47>;
1995defm BUFFER_ATOMIC_AND : MUBUF_Real_Atomic_vi <0x48>;
1996defm BUFFER_ATOMIC_OR : MUBUF_Real_Atomic_vi <0x49>;
1997defm BUFFER_ATOMIC_XOR : MUBUF_Real_Atomic_vi <0x4a>;
1998defm BUFFER_ATOMIC_INC : MUBUF_Real_Atomic_vi <0x4b>;
1999defm BUFFER_ATOMIC_DEC : MUBUF_Real_Atomic_vi <0x4c>;
2000
2001defm BUFFER_ATOMIC_SWAP_X2 : MUBUF_Real_Atomic_vi <0x60>;
2002defm BUFFER_ATOMIC_CMPSWAP_X2 : MUBUF_Real_Atomic_vi <0x61>;
2003defm BUFFER_ATOMIC_ADD_X2 : MUBUF_Real_Atomic_vi <0x62>;
2004defm BUFFER_ATOMIC_SUB_X2 : MUBUF_Real_Atomic_vi <0x63>;
2005defm BUFFER_ATOMIC_SMIN_X2 : MUBUF_Real_Atomic_vi <0x64>;
2006defm BUFFER_ATOMIC_UMIN_X2 : MUBUF_Real_Atomic_vi <0x65>;
2007defm BUFFER_ATOMIC_SMAX_X2 : MUBUF_Real_Atomic_vi <0x66>;
2008defm BUFFER_ATOMIC_UMAX_X2 : MUBUF_Real_Atomic_vi <0x67>;
2009defm BUFFER_ATOMIC_AND_X2 : MUBUF_Real_Atomic_vi <0x68>;
2010defm BUFFER_ATOMIC_OR_X2 : MUBUF_Real_Atomic_vi <0x69>;
2011defm BUFFER_ATOMIC_XOR_X2 : MUBUF_Real_Atomic_vi <0x6a>;
2012defm BUFFER_ATOMIC_INC_X2 : MUBUF_Real_Atomic_vi <0x6b>;
2013defm BUFFER_ATOMIC_DEC_X2 : MUBUF_Real_Atomic_vi <0x6c>;
2014
Dmitry Preobrazhenskyd98c97b2018-03-12 17:29:24 +00002015def BUFFER_STORE_LDS_DWORD_vi : MUBUF_Real_vi <0x3d, BUFFER_STORE_LDS_DWORD>;
2016
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00002017def BUFFER_WBINVL1_vi : MUBUF_Real_vi <0x3e, BUFFER_WBINVL1>;
2018def BUFFER_WBINVL1_VOL_vi : MUBUF_Real_vi <0x3f, BUFFER_WBINVL1_VOL>;
2019
Valery Pykhtinfbf2d932016-09-23 21:21:21 +00002020class MTBUF_Real_vi <bits<4> op, MTBUF_Pseudo ps> :
2021 MTBUF_Real<ps>,
David Stuttard70e8bc12017-06-22 16:29:22 +00002022 Enc64,
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00002023 SIMCInstr<ps.PseudoInstr, SIEncodingFamily.VI> {
2024 let AssemblerPredicate=isVI;
2025 let DecoderNamespace="VI";
Valery Pykhtinfbf2d932016-09-23 21:21:21 +00002026
David Stuttard70e8bc12017-06-22 16:29:22 +00002027 let Inst{11-0} = !if(ps.has_offset, offset, ?);
2028 let Inst{12} = ps.offen;
2029 let Inst{13} = ps.idxen;
2030 let Inst{14} = !if(ps.has_glc, glc, ps.glc_value);
Valery Pykhtinfbf2d932016-09-23 21:21:21 +00002031 let Inst{18-15} = op;
Tim Renouf35484c92018-08-21 11:06:05 +00002032 let Inst{22-19} = dfmt;
2033 let Inst{25-23} = nfmt;
David Stuttard70e8bc12017-06-22 16:29:22 +00002034 let Inst{31-26} = 0x3a; //encoding
2035 let Inst{39-32} = !if(ps.has_vaddr, vaddr, ?);
2036 let Inst{47-40} = !if(ps.has_vdata, vdata, ?);
2037 let Inst{52-48} = !if(ps.has_srsrc, srsrc{6-2}, ?);
2038 let Inst{54} = !if(ps.has_slc, slc, ?);
2039 let Inst{55} = !if(ps.has_tfe, tfe, ?);
2040 let Inst{63-56} = !if(ps.has_soffset, soffset, ?);
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00002041}
2042
David Stuttard70e8bc12017-06-22 16:29:22 +00002043multiclass MTBUF_Real_AllAddr_vi<bits<4> op> {
2044 def _OFFSET_vi : MTBUF_Real_vi <op, !cast<MTBUF_Pseudo>(NAME#"_OFFSET")>;
2045 def _OFFEN_vi : MTBUF_Real_vi <op, !cast<MTBUF_Pseudo>(NAME#"_OFFEN")>;
2046 def _IDXEN_vi : MTBUF_Real_vi <op, !cast<MTBUF_Pseudo>(NAME#"_IDXEN")>;
2047 def _BOTHEN_vi : MTBUF_Real_vi <op, !cast<MTBUF_Pseudo>(NAME#"_BOTHEN")>;
2048}
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00002049
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00002050class MTBUF_Real_gfx80 <bits<4> op, MTBUF_Pseudo ps> :
2051 MTBUF_Real<ps>,
2052 Enc64,
2053 SIMCInstr<ps.PseudoInstr, SIEncodingFamily.GFX80> {
2054 let AssemblerPredicate=HasUnpackedD16VMem;
2055 let DecoderNamespace="GFX80_UNPACKED";
2056
2057 let Inst{11-0} = !if(ps.has_offset, offset, ?);
2058 let Inst{12} = ps.offen;
2059 let Inst{13} = ps.idxen;
2060 let Inst{14} = !if(ps.has_glc, glc, ps.glc_value);
2061 let Inst{18-15} = op;
Tim Renouf35484c92018-08-21 11:06:05 +00002062 let Inst{22-19} = dfmt;
2063 let Inst{25-23} = nfmt;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00002064 let Inst{31-26} = 0x3a; //encoding
2065 let Inst{39-32} = !if(ps.has_vaddr, vaddr, ?);
2066 let Inst{47-40} = !if(ps.has_vdata, vdata, ?);
2067 let Inst{52-48} = !if(ps.has_srsrc, srsrc{6-2}, ?);
2068 let Inst{54} = !if(ps.has_slc, slc, ?);
2069 let Inst{55} = !if(ps.has_tfe, tfe, ?);
2070 let Inst{63-56} = !if(ps.has_soffset, soffset, ?);
2071}
2072
2073multiclass MTBUF_Real_AllAddr_gfx80<bits<4> op> {
2074 def _OFFSET_gfx80 : MTBUF_Real_gfx80 <op, !cast<MTBUF_Pseudo>(NAME#"_OFFSET")>;
2075 def _OFFEN_gfx80 : MTBUF_Real_gfx80 <op, !cast<MTBUF_Pseudo>(NAME#"_OFFEN")>;
2076 def _IDXEN_gfx80 : MTBUF_Real_gfx80 <op, !cast<MTBUF_Pseudo>(NAME#"_IDXEN")>;
2077 def _BOTHEN_gfx80 : MTBUF_Real_gfx80 <op, !cast<MTBUF_Pseudo>(NAME#"_BOTHEN")>;
2078}
2079
2080defm TBUFFER_LOAD_FORMAT_X : MTBUF_Real_AllAddr_vi <0x00>;
2081defm TBUFFER_LOAD_FORMAT_XY : MTBUF_Real_AllAddr_vi <0x01>;
2082defm TBUFFER_LOAD_FORMAT_XYZ : MTBUF_Real_AllAddr_vi <0x02>;
2083defm TBUFFER_LOAD_FORMAT_XYZW : MTBUF_Real_AllAddr_vi <0x03>;
2084defm TBUFFER_STORE_FORMAT_X : MTBUF_Real_AllAddr_vi <0x04>;
2085defm TBUFFER_STORE_FORMAT_XY : MTBUF_Real_AllAddr_vi <0x05>;
2086defm TBUFFER_STORE_FORMAT_XYZ : MTBUF_Real_AllAddr_vi <0x06>;
2087defm TBUFFER_STORE_FORMAT_XYZW : MTBUF_Real_AllAddr_vi <0x07>;
2088let SubtargetPredicate = HasUnpackedD16VMem in {
2089 defm TBUFFER_LOAD_FORMAT_D16_X_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x08>;
2090 defm TBUFFER_LOAD_FORMAT_D16_XY_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x09>;
2091 defm TBUFFER_LOAD_FORMAT_D16_XYZ_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x0a>;
2092 defm TBUFFER_LOAD_FORMAT_D16_XYZW_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x0b>;
2093 defm TBUFFER_STORE_FORMAT_D16_X_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x0c>;
2094 defm TBUFFER_STORE_FORMAT_D16_XY_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x0d>;
2095 defm TBUFFER_STORE_FORMAT_D16_XYZ_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x0e>;
2096 defm TBUFFER_STORE_FORMAT_D16_XYZW_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x0f>;
2097} // End HasUnpackedD16VMem.
2098let SubtargetPredicate = HasPackedD16VMem in {
2099 defm TBUFFER_LOAD_FORMAT_D16_X : MTBUF_Real_AllAddr_vi <0x08>;
2100 defm TBUFFER_LOAD_FORMAT_D16_XY : MTBUF_Real_AllAddr_vi <0x09>;
2101 defm TBUFFER_LOAD_FORMAT_D16_XYZ : MTBUF_Real_AllAddr_vi <0x0a>;
2102 defm TBUFFER_LOAD_FORMAT_D16_XYZW : MTBUF_Real_AllAddr_vi <0x0b>;
2103 defm TBUFFER_STORE_FORMAT_D16_X : MTBUF_Real_AllAddr_vi <0x0c>;
2104 defm TBUFFER_STORE_FORMAT_D16_XY : MTBUF_Real_AllAddr_vi <0x0d>;
2105 defm TBUFFER_STORE_FORMAT_D16_XYZ : MTBUF_Real_AllAddr_vi <0x0e>;
2106 defm TBUFFER_STORE_FORMAT_D16_XYZW : MTBUF_Real_AllAddr_vi <0x0f>;
2107} // End HasUnpackedD16VMem.