blob: ef1ccd2c1aa3d5e68bac7a79c51895a61a2c1736 [file] [log] [blame]
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001//===-- BUFInstructions.td - Buffer Instruction Defintions ----------------===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00006//
7//===----------------------------------------------------------------------===//
8
9def MUBUFAddr32 : ComplexPattern<i64, 9, "SelectMUBUFAddr32">;
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +000010def MUBUFAddr64 : ComplexPattern<i64, 8, "SelectMUBUFAddr64">;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000011def MUBUFAddr64Atomic : ComplexPattern<i64, 5, "SelectMUBUFAddr64">;
12
Matt Arsenaultb81495d2017-09-20 05:01:53 +000013def MUBUFScratchOffen : ComplexPattern<i64, 4, "SelectMUBUFScratchOffen", [], [SDNPWantParent]>;
14def MUBUFScratchOffset : ComplexPattern<i64, 3, "SelectMUBUFScratchOffset", [], [SDNPWantParent], 20>;
Matt Arsenault0774ea22017-04-24 19:40:59 +000015
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +000016def MUBUFOffset : ComplexPattern<i64, 7, "SelectMUBUFOffset">;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000017def MUBUFOffsetNoGLC : ComplexPattern<i64, 3, "SelectMUBUFOffset">;
18def MUBUFOffsetAtomic : ComplexPattern<i64, 4, "SelectMUBUFOffset">;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000019
20class MubufLoad <SDPatternOperator op> : PatFrag <
21 (ops node:$ptr), (op node:$ptr), [{
22 auto const AS = cast<MemSDNode>(N)->getAddressSpace();
Matt Arsenault0da63502018-08-31 05:49:54 +000023 return AS == AMDGPUAS::GLOBAL_ADDRESS ||
24 AS == AMDGPUAS::CONSTANT_ADDRESS;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000025}]>;
26
27def mubuf_load : MubufLoad <load>;
28def mubuf_az_extloadi8 : MubufLoad <az_extloadi8>;
29def mubuf_sextloadi8 : MubufLoad <sextloadi8>;
30def mubuf_az_extloadi16 : MubufLoad <az_extloadi16>;
31def mubuf_sextloadi16 : MubufLoad <sextloadi16>;
32def mubuf_load_atomic : MubufLoad <atomic_load>;
33
34def BUFAddrKind {
35 int Offset = 0;
36 int OffEn = 1;
37 int IdxEn = 2;
38 int BothEn = 3;
39 int Addr64 = 4;
40}
41
42class getAddrName<int addrKind> {
43 string ret =
44 !if(!eq(addrKind, BUFAddrKind.Offset), "offset",
45 !if(!eq(addrKind, BUFAddrKind.OffEn), "offen",
46 !if(!eq(addrKind, BUFAddrKind.IdxEn), "idxen",
47 !if(!eq(addrKind, BUFAddrKind.BothEn), "bothen",
48 !if(!eq(addrKind, BUFAddrKind.Addr64), "addr64",
49 "")))));
50}
51
Nicolai Haehnle01d261f2018-06-04 14:26:05 +000052class MUBUFAddr64Table <bit is_addr64, string Name> {
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000053 bit IsAddr64 = is_addr64;
Nicolai Haehnle01d261f2018-06-04 14:26:05 +000054 string OpName = Name;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000055}
56
Nicolai Haehnle01d261f2018-06-04 14:26:05 +000057class MUBUFLdsTable <bit is_lds, string Name> {
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +000058 bit IsLds = is_lds;
Nicolai Haehnle01d261f2018-06-04 14:26:05 +000059 string OpName = Name;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +000060}
61
Nicolai Haehnle01d261f2018-06-04 14:26:05 +000062class MTBUFAddr64Table <bit is_addr64, string Name> {
David Stuttard70e8bc12017-06-22 16:29:22 +000063 bit IsAddr64 = is_addr64;
Nicolai Haehnle01d261f2018-06-04 14:26:05 +000064 string OpName = Name;
David Stuttard70e8bc12017-06-22 16:29:22 +000065}
66
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000067//===----------------------------------------------------------------------===//
68// MTBUF classes
69//===----------------------------------------------------------------------===//
70
71class MTBUF_Pseudo <string opName, dag outs, dag ins,
72 string asmOps, list<dag> pattern=[]> :
73 InstSI<outs, ins, "", pattern>,
74 SIMCInstr<opName, SIEncodingFamily.NONE> {
75
76 let isPseudo = 1;
77 let isCodeGenOnly = 1;
Matt Arsenault10c17ca2016-10-06 10:13:23 +000078 let Size = 8;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000079 let UseNamedOperandTable = 1;
80
81 string Mnemonic = opName;
82 string AsmOperands = asmOps;
83
84 let VM_CNT = 1;
85 let EXP_CNT = 1;
86 let MTBUF = 1;
87 let Uses = [EXEC];
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000088 let hasSideEffects = 0;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +000089 let SchedRW = [WriteVMEM];
David Stuttard70e8bc12017-06-22 16:29:22 +000090
91 let AsmMatchConverter = "cvtMtbuf";
92
93 bits<1> offen = 0;
94 bits<1> idxen = 0;
95 bits<1> addr64 = 0;
96 bits<1> has_vdata = 1;
97 bits<1> has_vaddr = 1;
98 bits<1> has_glc = 1;
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +000099 bits<1> has_dlc = 1;
David Stuttard70e8bc12017-06-22 16:29:22 +0000100 bits<1> glc_value = 0; // the value for glc if no such operand
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000101 bits<1> dlc_value = 0; // the value for dlc if no such operand
David Stuttard70e8bc12017-06-22 16:29:22 +0000102 bits<1> has_srsrc = 1;
103 bits<1> has_soffset = 1;
104 bits<1> has_offset = 1;
105 bits<1> has_slc = 1;
106 bits<1> has_tfe = 1;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000107}
108
Valery Pykhtinfbf2d932016-09-23 21:21:21 +0000109class MTBUF_Real <MTBUF_Pseudo ps> :
David Stuttard70e8bc12017-06-22 16:29:22 +0000110 InstSI <ps.OutOperandList, ps.InOperandList, ps.Mnemonic # ps.AsmOperands, []> {
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000111
112 let isPseudo = 0;
113 let isCodeGenOnly = 0;
114
115 // copy relevant pseudo op flags
116 let SubtargetPredicate = ps.SubtargetPredicate;
117 let AsmMatchConverter = ps.AsmMatchConverter;
118 let Constraints = ps.Constraints;
119 let DisableEncoding = ps.DisableEncoding;
120 let TSFlags = ps.TSFlags;
121
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000122 bits<12> offset;
David Stuttard70e8bc12017-06-22 16:29:22 +0000123 bits<1> glc;
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000124 bits<1> dlc;
Tim Renouf35484c92018-08-21 11:06:05 +0000125 bits<7> format;
David Stuttard70e8bc12017-06-22 16:29:22 +0000126 bits<8> vaddr;
127 bits<8> vdata;
128 bits<7> srsrc;
129 bits<1> slc;
130 bits<1> tfe;
131 bits<8> soffset;
Tim Renouf35484c92018-08-21 11:06:05 +0000132
133 bits<4> dfmt = format{3-0};
134 bits<3> nfmt = format{6-4};
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000135}
136
David Stuttard70e8bc12017-06-22 16:29:22 +0000137class getMTBUFInsDA<list<RegisterClass> vdataList,
138 list<RegisterClass> vaddrList=[]> {
139 RegisterClass vdataClass = !if(!empty(vdataList), ?, !head(vdataList));
140 RegisterClass vaddrClass = !if(!empty(vaddrList), ?, !head(vaddrList));
141 dag InsNoData = !if(!empty(vaddrList),
142 (ins SReg_128:$srsrc, SCSrc_b32:$soffset,
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000143 offset:$offset, FORMAT:$format, GLC:$glc, SLC:$slc, TFE:$tfe, DLC:$dlc),
David Stuttard70e8bc12017-06-22 16:29:22 +0000144 (ins vaddrClass:$vaddr, SReg_128:$srsrc, SCSrc_b32:$soffset,
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000145 offset:$offset, FORMAT:$format, GLC:$glc, SLC:$slc, TFE:$tfe, DLC:$dlc)
David Stuttard70e8bc12017-06-22 16:29:22 +0000146 );
147 dag InsData = !if(!empty(vaddrList),
148 (ins vdataClass:$vdata, SReg_128:$srsrc,
Tim Renouf35484c92018-08-21 11:06:05 +0000149 SCSrc_b32:$soffset, offset:$offset, FORMAT:$format, GLC:$glc,
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000150 SLC:$slc, TFE:$tfe, DLC:$dlc),
David Stuttard70e8bc12017-06-22 16:29:22 +0000151 (ins vdataClass:$vdata, vaddrClass:$vaddr, SReg_128:$srsrc,
Tim Renouf35484c92018-08-21 11:06:05 +0000152 SCSrc_b32:$soffset, offset:$offset, FORMAT:$format, GLC:$glc,
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000153 SLC:$slc, TFE:$tfe, DLC:$dlc)
David Stuttard70e8bc12017-06-22 16:29:22 +0000154 );
155 dag ret = !if(!empty(vdataList), InsNoData, InsData);
156}
157
158class getMTBUFIns<int addrKind, list<RegisterClass> vdataList=[]> {
159 dag ret =
160 !if(!eq(addrKind, BUFAddrKind.Offset), getMTBUFInsDA<vdataList>.ret,
161 !if(!eq(addrKind, BUFAddrKind.OffEn), getMTBUFInsDA<vdataList, [VGPR_32]>.ret,
162 !if(!eq(addrKind, BUFAddrKind.IdxEn), getMTBUFInsDA<vdataList, [VGPR_32]>.ret,
163 !if(!eq(addrKind, BUFAddrKind.BothEn), getMTBUFInsDA<vdataList, [VReg_64]>.ret,
164 !if(!eq(addrKind, BUFAddrKind.Addr64), getMTBUFInsDA<vdataList, [VReg_64]>.ret,
165 (ins))))));
166}
167
168class getMTBUFAsmOps<int addrKind> {
169 string Pfx =
Tim Renouf35484c92018-08-21 11:06:05 +0000170 !if(!eq(addrKind, BUFAddrKind.Offset), "off, $srsrc, $format, $soffset",
David Stuttard70e8bc12017-06-22 16:29:22 +0000171 !if(!eq(addrKind, BUFAddrKind.OffEn),
Tim Renouf35484c92018-08-21 11:06:05 +0000172 "$vaddr, $srsrc, $format, $soffset offen",
David Stuttard70e8bc12017-06-22 16:29:22 +0000173 !if(!eq(addrKind, BUFAddrKind.IdxEn),
Tim Renouf35484c92018-08-21 11:06:05 +0000174 "$vaddr, $srsrc, $format, $soffset idxen",
David Stuttard70e8bc12017-06-22 16:29:22 +0000175 !if(!eq(addrKind, BUFAddrKind.BothEn),
Tim Renouf35484c92018-08-21 11:06:05 +0000176 "$vaddr, $srsrc, $format, $soffset idxen offen",
David Stuttard70e8bc12017-06-22 16:29:22 +0000177 !if(!eq(addrKind, BUFAddrKind.Addr64),
Tim Renouf35484c92018-08-21 11:06:05 +0000178 "$vaddr, $srsrc, $format, $soffset addr64",
David Stuttard70e8bc12017-06-22 16:29:22 +0000179 "")))));
180 string ret = Pfx # "$offset";
181}
182
183class MTBUF_SetupAddr<int addrKind> {
184 bits<1> offen = !if(!eq(addrKind, BUFAddrKind.OffEn), 1,
185 !if(!eq(addrKind, BUFAddrKind.BothEn), 1 , 0));
186
187 bits<1> idxen = !if(!eq(addrKind, BUFAddrKind.IdxEn), 1,
188 !if(!eq(addrKind, BUFAddrKind.BothEn), 1 , 0));
189
190 bits<1> addr64 = !if(!eq(addrKind, BUFAddrKind.Addr64), 1, 0);
191
192 bits<1> has_vaddr = !if(!eq(addrKind, BUFAddrKind.Offset), 0, 1);
193}
194
195class MTBUF_Load_Pseudo <string opName,
196 int addrKind,
197 RegisterClass vdataClass,
198 list<dag> pattern=[],
199 // Workaround bug bz30254
200 int addrKindCopy = addrKind>
201 : MTBUF_Pseudo<opName,
202 (outs vdataClass:$vdata),
203 getMTBUFIns<addrKindCopy>.ret,
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000204 " $vdata, " # getMTBUFAsmOps<addrKindCopy>.ret # "$glc$slc$tfe$dlc",
David Stuttard70e8bc12017-06-22 16:29:22 +0000205 pattern>,
206 MTBUF_SetupAddr<addrKindCopy> {
207 let PseudoInstr = opName # "_" # getAddrName<addrKindCopy>.ret;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000208 let mayLoad = 1;
209 let mayStore = 0;
210}
211
David Stuttard70e8bc12017-06-22 16:29:22 +0000212multiclass MTBUF_Pseudo_Loads<string opName, RegisterClass vdataClass,
213 ValueType load_vt = i32,
214 SDPatternOperator ld = null_frag> {
215
216 def _OFFSET : MTBUF_Load_Pseudo <opName, BUFAddrKind.Offset, vdataClass,
217 [(set load_vt:$vdata,
Tim Renouf35484c92018-08-21 11:06:05 +0000218 (ld (MUBUFOffset v4i32:$srsrc, i32:$soffset, i16:$offset, i8:$format,
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000219 i1:$glc, i1:$slc, i1:$tfe, i1:$dlc)))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000220 MTBUFAddr64Table<0, NAME>;
David Stuttard70e8bc12017-06-22 16:29:22 +0000221
222 def _ADDR64 : MTBUF_Load_Pseudo <opName, BUFAddrKind.Addr64, vdataClass,
223 [(set load_vt:$vdata,
224 (ld (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset, i16:$offset,
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000225 i8:$format, i1:$glc, i1:$slc, i1:$tfe, i1:$dlc)))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000226 MTBUFAddr64Table<1, NAME>;
David Stuttard70e8bc12017-06-22 16:29:22 +0000227
228 def _OFFEN : MTBUF_Load_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
229 def _IDXEN : MTBUF_Load_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
230 def _BOTHEN : MTBUF_Load_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
231
232 let DisableWQM = 1 in {
233 def _OFFSET_exact : MTBUF_Load_Pseudo <opName, BUFAddrKind.Offset, vdataClass>;
234 def _OFFEN_exact : MTBUF_Load_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
235 def _IDXEN_exact : MTBUF_Load_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
236 def _BOTHEN_exact : MTBUF_Load_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
237 }
238}
239
240class MTBUF_Store_Pseudo <string opName,
241 int addrKind,
242 RegisterClass vdataClass,
243 list<dag> pattern=[],
244 // Workaround bug bz30254
245 int addrKindCopy = addrKind,
246 RegisterClass vdataClassCopy = vdataClass>
247 : MTBUF_Pseudo<opName,
248 (outs),
249 getMTBUFIns<addrKindCopy, [vdataClassCopy]>.ret,
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000250 " $vdata, " # getMTBUFAsmOps<addrKindCopy>.ret # "$glc$slc$tfe$dlc",
David Stuttard70e8bc12017-06-22 16:29:22 +0000251 pattern>,
252 MTBUF_SetupAddr<addrKindCopy> {
253 let PseudoInstr = opName # "_" # getAddrName<addrKindCopy>.ret;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000254 let mayLoad = 0;
255 let mayStore = 1;
256}
257
David Stuttard70e8bc12017-06-22 16:29:22 +0000258multiclass MTBUF_Pseudo_Stores<string opName, RegisterClass vdataClass,
259 ValueType store_vt = i32,
260 SDPatternOperator st = null_frag> {
261
262 def _OFFSET : MTBUF_Store_Pseudo <opName, BUFAddrKind.Offset, vdataClass,
263 [(st store_vt:$vdata, (MUBUFOffset v4i32:$srsrc, i32:$soffset,
Tim Renouf35484c92018-08-21 11:06:05 +0000264 i16:$offset, i8:$format, i1:$glc,
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000265 i1:$slc, i1:$tfe, i1:$dlc))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000266 MTBUFAddr64Table<0, NAME>;
David Stuttard70e8bc12017-06-22 16:29:22 +0000267
268 def _ADDR64 : MTBUF_Store_Pseudo <opName, BUFAddrKind.Addr64, vdataClass,
269 [(st store_vt:$vdata, (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset,
Tim Renouf35484c92018-08-21 11:06:05 +0000270 i16:$offset, i8:$format, i1:$glc,
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000271 i1:$slc, i1:$tfe, i1:$dlc))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000272 MTBUFAddr64Table<1, NAME>;
David Stuttard70e8bc12017-06-22 16:29:22 +0000273
274 def _OFFEN : MTBUF_Store_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
275 def _IDXEN : MTBUF_Store_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
276 def _BOTHEN : MTBUF_Store_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
277
278 let DisableWQM = 1 in {
279 def _OFFSET_exact : MTBUF_Store_Pseudo <opName, BUFAddrKind.Offset, vdataClass>;
280 def _OFFEN_exact : MTBUF_Store_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
281 def _IDXEN_exact : MTBUF_Store_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
282 def _BOTHEN_exact : MTBUF_Store_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
283 }
284}
285
286
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000287//===----------------------------------------------------------------------===//
288// MUBUF classes
289//===----------------------------------------------------------------------===//
290
Neil Henning76504a42018-12-12 16:15:21 +0000291class MUBUFGetBaseOpcode<string Op> {
292 string ret = !subst("DWORDX2", "DWORD",
293 !subst("DWORDX3", "DWORD",
294 !subst("DWORDX4", "DWORD", Op)));
295}
296
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000297class MUBUF_Pseudo <string opName, dag outs, dag ins,
298 string asmOps, list<dag> pattern=[]> :
299 InstSI<outs, ins, "", pattern>,
300 SIMCInstr<opName, SIEncodingFamily.NONE> {
301
302 let isPseudo = 1;
303 let isCodeGenOnly = 1;
Matt Arsenault10c17ca2016-10-06 10:13:23 +0000304 let Size = 8;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000305 let UseNamedOperandTable = 1;
306
307 string Mnemonic = opName;
308 string AsmOperands = asmOps;
309
Neil Henning76504a42018-12-12 16:15:21 +0000310 Instruction Opcode = !cast<Instruction>(NAME);
311 Instruction BaseOpcode = !cast<Instruction>(MUBUFGetBaseOpcode<NAME>.ret);
312
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000313 let VM_CNT = 1;
314 let EXP_CNT = 1;
315 let MUBUF = 1;
316 let Uses = [EXEC];
317 let hasSideEffects = 0;
318 let SchedRW = [WriteVMEM];
319
320 let AsmMatchConverter = "cvtMubuf";
321
322 bits<1> offen = 0;
323 bits<1> idxen = 0;
324 bits<1> addr64 = 0;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000325 bits<1> lds = 0;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000326 bits<1> has_vdata = 1;
327 bits<1> has_vaddr = 1;
328 bits<1> has_glc = 1;
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000329 bits<1> has_dlc = 1;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000330 bits<1> glc_value = 0; // the value for glc if no such operand
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000331 bits<1> dlc_value = 0; // the value for dlc if no such operand
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000332 bits<1> has_srsrc = 1;
333 bits<1> has_soffset = 1;
334 bits<1> has_offset = 1;
335 bits<1> has_slc = 1;
336 bits<1> has_tfe = 1;
Neil Henning76504a42018-12-12 16:15:21 +0000337 bits<4> dwords = 0;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000338}
339
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000340class MUBUF_Real <MUBUF_Pseudo ps> :
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000341 InstSI <ps.OutOperandList, ps.InOperandList, ps.Mnemonic # ps.AsmOperands, []> {
342
343 let isPseudo = 0;
344 let isCodeGenOnly = 0;
345
346 // copy relevant pseudo op flags
347 let SubtargetPredicate = ps.SubtargetPredicate;
348 let AsmMatchConverter = ps.AsmMatchConverter;
349 let Constraints = ps.Constraints;
350 let DisableEncoding = ps.DisableEncoding;
351 let TSFlags = ps.TSFlags;
352
353 bits<12> offset;
354 bits<1> glc;
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000355 bits<1> dlc;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000356 bits<8> vaddr;
357 bits<8> vdata;
358 bits<7> srsrc;
359 bits<1> slc;
360 bits<1> tfe;
361 bits<8> soffset;
362}
363
364
365// For cache invalidation instructions.
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000366class MUBUF_Invalidate <string opName, SDPatternOperator node = null_frag> :
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000367 MUBUF_Pseudo<opName, (outs), (ins), "", [(node)]> {
368
369 let AsmMatchConverter = "";
370
371 let hasSideEffects = 1;
372 let mayStore = 1;
373
374 // Set everything to 0.
375 let offen = 0;
376 let idxen = 0;
377 let addr64 = 0;
378 let has_vdata = 0;
379 let has_vaddr = 0;
380 let has_glc = 0;
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000381 let has_dlc = 0;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000382 let glc_value = 0;
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000383 let dlc_value = 0;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000384 let has_srsrc = 0;
385 let has_soffset = 0;
386 let has_offset = 0;
387 let has_slc = 0;
388 let has_tfe = 0;
389}
390
391class getMUBUFInsDA<list<RegisterClass> vdataList,
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000392 list<RegisterClass> vaddrList=[],
393 bit isLds = 0> {
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000394 RegisterClass vdataClass = !if(!empty(vdataList), ?, !head(vdataList));
395 RegisterClass vaddrClass = !if(!empty(vaddrList), ?, !head(vaddrList));
396 dag InsNoData = !if(!empty(vaddrList),
397 (ins SReg_128:$srsrc, SCSrc_b32:$soffset,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000398 offset:$offset, GLC:$glc, SLC:$slc),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000399 (ins vaddrClass:$vaddr, SReg_128:$srsrc, SCSrc_b32:$soffset,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000400 offset:$offset, GLC:$glc, SLC:$slc)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000401 );
402 dag InsData = !if(!empty(vaddrList),
403 (ins vdataClass:$vdata, SReg_128:$srsrc,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000404 SCSrc_b32:$soffset, offset:$offset, GLC:$glc, SLC:$slc),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000405 (ins vdataClass:$vdata, vaddrClass:$vaddr, SReg_128:$srsrc,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000406 SCSrc_b32:$soffset, offset:$offset, GLC:$glc, SLC:$slc)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000407 );
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000408 dag ret = !con(
409 !if(!empty(vdataList), InsNoData, InsData),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000410 !if(isLds, (ins DLC:$dlc), (ins TFE:$tfe, DLC:$dlc))
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000411 );
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000412}
413
Neil Henning76504a42018-12-12 16:15:21 +0000414class getMUBUFDwords<RegisterClass regClass> {
415 string regClassAsInt = !cast<string>(regClass);
416 int ret =
417 !if(!eq(regClassAsInt, !cast<string>(VGPR_32)), 1,
418 !if(!eq(regClassAsInt, !cast<string>(VReg_64)), 2,
419 !if(!eq(regClassAsInt, !cast<string>(VReg_96)), 3,
420 !if(!eq(regClassAsInt, !cast<string>(VReg_128)), 4,
421 0))));
422}
423
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000424class getMUBUFIns<int addrKind, list<RegisterClass> vdataList=[], bit isLds = 0> {
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000425 dag ret =
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000426 !if(!eq(addrKind, BUFAddrKind.Offset), getMUBUFInsDA<vdataList, [], isLds>.ret,
427 !if(!eq(addrKind, BUFAddrKind.OffEn), getMUBUFInsDA<vdataList, [VGPR_32], isLds>.ret,
428 !if(!eq(addrKind, BUFAddrKind.IdxEn), getMUBUFInsDA<vdataList, [VGPR_32], isLds>.ret,
429 !if(!eq(addrKind, BUFAddrKind.BothEn), getMUBUFInsDA<vdataList, [VReg_64], isLds>.ret,
430 !if(!eq(addrKind, BUFAddrKind.Addr64), getMUBUFInsDA<vdataList, [VReg_64], isLds>.ret,
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000431 (ins))))));
432}
433
434class getMUBUFAsmOps<int addrKind> {
435 string Pfx =
436 !if(!eq(addrKind, BUFAddrKind.Offset), "off, $srsrc, $soffset",
437 !if(!eq(addrKind, BUFAddrKind.OffEn), "$vaddr, $srsrc, $soffset offen",
438 !if(!eq(addrKind, BUFAddrKind.IdxEn), "$vaddr, $srsrc, $soffset idxen",
439 !if(!eq(addrKind, BUFAddrKind.BothEn), "$vaddr, $srsrc, $soffset idxen offen",
440 !if(!eq(addrKind, BUFAddrKind.Addr64), "$vaddr, $srsrc, $soffset addr64",
441 "")))));
442 string ret = Pfx # "$offset";
443}
444
Matt Arsenaultf3dd8632016-11-01 00:55:14 +0000445class MUBUF_SetupAddr<int addrKind> {
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000446 bits<1> offen = !if(!eq(addrKind, BUFAddrKind.OffEn), 1,
447 !if(!eq(addrKind, BUFAddrKind.BothEn), 1 , 0));
448
449 bits<1> idxen = !if(!eq(addrKind, BUFAddrKind.IdxEn), 1,
450 !if(!eq(addrKind, BUFAddrKind.BothEn), 1 , 0));
451
452 bits<1> addr64 = !if(!eq(addrKind, BUFAddrKind.Addr64), 1, 0);
453
454 bits<1> has_vaddr = !if(!eq(addrKind, BUFAddrKind.Offset), 0, 1);
455}
456
457class MUBUF_Load_Pseudo <string opName,
458 int addrKind,
459 RegisterClass vdataClass,
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000460 bit HasTiedDest = 0,
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000461 bit isLds = 0,
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000462 list<dag> pattern=[],
463 // Workaround bug bz30254
464 int addrKindCopy = addrKind>
465 : MUBUF_Pseudo<opName,
466 (outs vdataClass:$vdata),
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000467 !con(getMUBUFIns<addrKindCopy, [], isLds>.ret,
468 !if(HasTiedDest, (ins vdataClass:$vdata_in), (ins))),
469 " $vdata, " # getMUBUFAsmOps<addrKindCopy>.ret # "$glc$slc" #
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000470 !if(isLds, " lds", "$tfe") # "$dlc",
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000471 pattern>,
472 MUBUF_SetupAddr<addrKindCopy> {
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000473 let PseudoInstr = opName # !if(isLds, "_lds", "") #
474 "_" # getAddrName<addrKindCopy>.ret;
Dmitry Preobrazhenskyd98c97b2018-03-12 17:29:24 +0000475 let AsmMatchConverter = !if(isLds, "cvtMubufLds", "cvtMubuf");
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000476
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000477 let Constraints = !if(HasTiedDest, "$vdata = $vdata_in", "");
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000478 let mayLoad = 1;
479 let mayStore = 0;
Konstantin Zhuravlyov070d88e2017-07-21 21:05:45 +0000480 let maybeAtomic = 1;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000481 let Uses = !if(isLds, [EXEC, M0], [EXEC]);
482 let has_tfe = !if(isLds, 0, 1);
483 let lds = isLds;
Neil Henning76504a42018-12-12 16:15:21 +0000484 let dwords = getMUBUFDwords<vdataClass>.ret;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000485}
486
487// FIXME: tfe can't be an operand because it requires a separate
488// opcode because it needs an N+1 register class dest register.
489multiclass MUBUF_Pseudo_Loads<string opName, RegisterClass vdataClass,
490 ValueType load_vt = i32,
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000491 SDPatternOperator ld = null_frag,
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000492 bit TiedDest = 0,
493 bit isLds = 0> {
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000494
495 def _OFFSET : MUBUF_Load_Pseudo <opName, BUFAddrKind.Offset, vdataClass,
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000496 TiedDest, isLds,
497 !if(isLds,
498 [],
499 [(set load_vt:$vdata,
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000500 (ld (MUBUFOffset v4i32:$srsrc, i32:$soffset, i16:$offset, i1:$glc, i1:$slc, i1:$tfe, i1:$dlc)))])>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000501 MUBUFAddr64Table<0, NAME # !if(isLds, "_LDS", "")>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000502
503 def _ADDR64 : MUBUF_Load_Pseudo <opName, BUFAddrKind.Addr64, vdataClass,
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000504 TiedDest, isLds,
505 !if(isLds,
506 [],
507 [(set load_vt:$vdata,
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000508 (ld (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset, i16:$offset, i1:$glc, i1:$slc, i1:$tfe, i1:$dlc)))])>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000509 MUBUFAddr64Table<1, NAME # !if(isLds, "_LDS", "")>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000510
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000511 def _OFFEN : MUBUF_Load_Pseudo <opName, BUFAddrKind.OffEn, vdataClass, TiedDest, isLds>;
512 def _IDXEN : MUBUF_Load_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass, TiedDest, isLds>;
513 def _BOTHEN : MUBUF_Load_Pseudo <opName, BUFAddrKind.BothEn, vdataClass, TiedDest, isLds>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000514
515 let DisableWQM = 1 in {
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000516 def _OFFSET_exact : MUBUF_Load_Pseudo <opName, BUFAddrKind.Offset, vdataClass, TiedDest, isLds>;
517 def _OFFEN_exact : MUBUF_Load_Pseudo <opName, BUFAddrKind.OffEn, vdataClass, TiedDest, isLds>;
518 def _IDXEN_exact : MUBUF_Load_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass, TiedDest, isLds>;
519 def _BOTHEN_exact : MUBUF_Load_Pseudo <opName, BUFAddrKind.BothEn, vdataClass, TiedDest, isLds>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000520 }
521}
522
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000523multiclass MUBUF_Pseudo_Loads_Lds<string opName, RegisterClass vdataClass,
524 ValueType load_vt = i32,
525 SDPatternOperator ld_nolds = null_frag,
526 SDPatternOperator ld_lds = null_frag> {
527 defm NAME : MUBUF_Pseudo_Loads<opName, vdataClass, load_vt, ld_nolds>;
528 defm _LDS : MUBUF_Pseudo_Loads<opName, vdataClass, load_vt, ld_lds, 0, 1>;
529}
530
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000531class MUBUF_Store_Pseudo <string opName,
532 int addrKind,
533 RegisterClass vdataClass,
534 list<dag> pattern=[],
535 // Workaround bug bz30254
536 int addrKindCopy = addrKind,
537 RegisterClass vdataClassCopy = vdataClass>
538 : MUBUF_Pseudo<opName,
539 (outs),
540 getMUBUFIns<addrKindCopy, [vdataClassCopy]>.ret,
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000541 " $vdata, " # getMUBUFAsmOps<addrKindCopy>.ret # "$glc$slc$tfe$dlc",
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000542 pattern>,
543 MUBUF_SetupAddr<addrKindCopy> {
544 let PseudoInstr = opName # "_" # getAddrName<addrKindCopy>.ret;
545 let mayLoad = 0;
546 let mayStore = 1;
Konstantin Zhuravlyov070d88e2017-07-21 21:05:45 +0000547 let maybeAtomic = 1;
Neil Henning76504a42018-12-12 16:15:21 +0000548 let dwords = getMUBUFDwords<vdataClass>.ret;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000549}
550
551multiclass MUBUF_Pseudo_Stores<string opName, RegisterClass vdataClass,
552 ValueType store_vt = i32,
553 SDPatternOperator st = null_frag> {
554
555 def _OFFSET : MUBUF_Store_Pseudo <opName, BUFAddrKind.Offset, vdataClass,
556 [(st store_vt:$vdata, (MUBUFOffset v4i32:$srsrc, i32:$soffset,
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000557 i16:$offset, i1:$glc, i1:$slc, i1:$tfe, i1:$dlc))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000558 MUBUFAddr64Table<0, NAME>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000559
560 def _ADDR64 : MUBUF_Store_Pseudo <opName, BUFAddrKind.Addr64, vdataClass,
561 [(st store_vt:$vdata, (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset,
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000562 i16:$offset, i1:$glc, i1:$slc, i1:$tfe, i1:$dlc))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000563 MUBUFAddr64Table<1, NAME>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000564
565 def _OFFEN : MUBUF_Store_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
566 def _IDXEN : MUBUF_Store_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
567 def _BOTHEN : MUBUF_Store_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
568
569 let DisableWQM = 1 in {
570 def _OFFSET_exact : MUBUF_Store_Pseudo <opName, BUFAddrKind.Offset, vdataClass>;
571 def _OFFEN_exact : MUBUF_Store_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
572 def _IDXEN_exact : MUBUF_Store_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
573 def _BOTHEN_exact : MUBUF_Store_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
574 }
575}
576
Dmitry Preobrazhenskyd98c97b2018-03-12 17:29:24 +0000577class MUBUF_Pseudo_Store_Lds<string opName>
578 : MUBUF_Pseudo<opName,
579 (outs),
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000580 (ins SReg_128:$srsrc, SCSrc_b32:$soffset, offset:$offset, GLC:$glc, SLC:$slc),
Dmitry Preobrazhenskyd98c97b2018-03-12 17:29:24 +0000581 " $srsrc, $soffset$offset lds$glc$slc"> {
582 let mayLoad = 0;
583 let mayStore = 1;
584 let maybeAtomic = 1;
585
586 let has_vdata = 0;
587 let has_vaddr = 0;
588 let has_tfe = 0;
589 let lds = 1;
590
591 let Uses = [EXEC, M0];
592 let AsmMatchConverter = "cvtMubufLds";
593}
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000594
595class getMUBUFAtomicInsDA<RegisterClass vdataClass, bit vdata_in,
596 list<RegisterClass> vaddrList=[]> {
597 RegisterClass vaddrClass = !if(!empty(vaddrList), ?, !head(vaddrList));
598 dag ret = !if(vdata_in,
599 !if(!empty(vaddrList),
600 (ins vdataClass:$vdata_in,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000601 SReg_128:$srsrc, SCSrc_b32:$soffset, offset:$offset, SLC:$slc),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000602 (ins vdataClass:$vdata_in, vaddrClass:$vaddr,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000603 SReg_128:$srsrc, SCSrc_b32:$soffset, offset:$offset, SLC:$slc)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000604 ),
605 !if(!empty(vaddrList),
606 (ins vdataClass:$vdata,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000607 SReg_128:$srsrc, SCSrc_b32:$soffset, offset:$offset, SLC:$slc),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000608 (ins vdataClass:$vdata, vaddrClass:$vaddr,
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000609 SReg_128:$srsrc, SCSrc_b32:$soffset, offset:$offset, SLC:$slc)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000610 ));
611}
612
613class getMUBUFAtomicIns<int addrKind,
614 RegisterClass vdataClass,
615 bit vdata_in,
616 // Workaround bug bz30254
617 RegisterClass vdataClassCopy=vdataClass> {
618 dag ret =
619 !if(!eq(addrKind, BUFAddrKind.Offset),
620 getMUBUFAtomicInsDA<vdataClassCopy, vdata_in>.ret,
621 !if(!eq(addrKind, BUFAddrKind.OffEn),
622 getMUBUFAtomicInsDA<vdataClassCopy, vdata_in, [VGPR_32]>.ret,
623 !if(!eq(addrKind, BUFAddrKind.IdxEn),
624 getMUBUFAtomicInsDA<vdataClassCopy, vdata_in, [VGPR_32]>.ret,
625 !if(!eq(addrKind, BUFAddrKind.BothEn),
626 getMUBUFAtomicInsDA<vdataClassCopy, vdata_in, [VReg_64]>.ret,
627 !if(!eq(addrKind, BUFAddrKind.Addr64),
628 getMUBUFAtomicInsDA<vdataClassCopy, vdata_in, [VReg_64]>.ret,
629 (ins))))));
630}
631
632class MUBUF_Atomic_Pseudo<string opName,
633 int addrKind,
634 dag outs,
635 dag ins,
636 string asmOps,
637 list<dag> pattern=[],
638 // Workaround bug bz30254
639 int addrKindCopy = addrKind>
640 : MUBUF_Pseudo<opName, outs, ins, asmOps, pattern>,
641 MUBUF_SetupAddr<addrKindCopy> {
642 let mayStore = 1;
643 let mayLoad = 1;
644 let hasPostISelHook = 1;
645 let hasSideEffects = 1;
646 let DisableWQM = 1;
647 let has_glc = 0;
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000648 let has_dlc = 0;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000649 let has_tfe = 0;
Konstantin Zhuravlyov070d88e2017-07-21 21:05:45 +0000650 let maybeAtomic = 1;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000651}
652
653class MUBUF_AtomicNoRet_Pseudo<string opName, int addrKind,
654 RegisterClass vdataClass,
655 list<dag> pattern=[],
656 // Workaround bug bz30254
657 int addrKindCopy = addrKind,
658 RegisterClass vdataClassCopy = vdataClass>
659 : MUBUF_Atomic_Pseudo<opName, addrKindCopy,
660 (outs),
661 getMUBUFAtomicIns<addrKindCopy, vdataClassCopy, 0>.ret,
662 " $vdata, " # getMUBUFAsmOps<addrKindCopy>.ret # "$slc",
663 pattern>,
664 AtomicNoRet<opName # "_" # getAddrName<addrKindCopy>.ret, 0> {
665 let PseudoInstr = opName # "_" # getAddrName<addrKindCopy>.ret;
666 let glc_value = 0;
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000667 let dlc_value = 0;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000668 let AsmMatchConverter = "cvtMubufAtomic";
669}
670
671class MUBUF_AtomicRet_Pseudo<string opName, int addrKind,
672 RegisterClass vdataClass,
673 list<dag> pattern=[],
674 // Workaround bug bz30254
675 int addrKindCopy = addrKind,
676 RegisterClass vdataClassCopy = vdataClass>
677 : MUBUF_Atomic_Pseudo<opName, addrKindCopy,
678 (outs vdataClassCopy:$vdata),
679 getMUBUFAtomicIns<addrKindCopy, vdataClassCopy, 1>.ret,
680 " $vdata, " # getMUBUFAsmOps<addrKindCopy>.ret # " glc$slc",
681 pattern>,
682 AtomicNoRet<opName # "_" # getAddrName<addrKindCopy>.ret, 1> {
683 let PseudoInstr = opName # "_rtn_" # getAddrName<addrKindCopy>.ret;
684 let glc_value = 1;
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000685 let dlc_value = 0;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000686 let Constraints = "$vdata = $vdata_in";
687 let DisableEncoding = "$vdata_in";
688 let AsmMatchConverter = "cvtMubufAtomicReturn";
689}
690
Konstantin Zhuravlyov7f1959e2018-11-07 21:21:32 +0000691multiclass MUBUF_Pseudo_Atomics_NO_RTN <string opName,
692 RegisterClass vdataClass,
693 ValueType vdataType,
694 SDPatternOperator atomic> {
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000695 def _OFFSET : MUBUF_AtomicNoRet_Pseudo <opName, BUFAddrKind.Offset, vdataClass>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000696 MUBUFAddr64Table <0, NAME>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000697 def _ADDR64 : MUBUF_AtomicNoRet_Pseudo <opName, BUFAddrKind.Addr64, vdataClass>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000698 MUBUFAddr64Table <1, NAME>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000699 def _OFFEN : MUBUF_AtomicNoRet_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
700 def _IDXEN : MUBUF_AtomicNoRet_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
701 def _BOTHEN : MUBUF_AtomicNoRet_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
Konstantin Zhuravlyov7f1959e2018-11-07 21:21:32 +0000702}
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000703
Konstantin Zhuravlyov7f1959e2018-11-07 21:21:32 +0000704multiclass MUBUF_Pseudo_Atomics_RTN <string opName,
705 RegisterClass vdataClass,
706 ValueType vdataType,
707 SDPatternOperator atomic> {
Matt Arsenaulte5456ce2017-07-20 21:06:04 +0000708 def _OFFSET_RTN : MUBUF_AtomicRet_Pseudo <opName, BUFAddrKind.Offset, vdataClass,
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000709 [(set vdataType:$vdata,
710 (atomic (MUBUFOffsetAtomic v4i32:$srsrc, i32:$soffset, i16:$offset, i1:$slc),
711 vdataType:$vdata_in))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000712 MUBUFAddr64Table <0, NAME # "_RTN">;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000713
Matt Arsenaulte5456ce2017-07-20 21:06:04 +0000714 def _ADDR64_RTN : MUBUF_AtomicRet_Pseudo <opName, BUFAddrKind.Addr64, vdataClass,
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000715 [(set vdataType:$vdata,
716 (atomic (MUBUFAddr64Atomic v4i32:$srsrc, i64:$vaddr, i32:$soffset, i16:$offset, i1:$slc),
717 vdataType:$vdata_in))]>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +0000718 MUBUFAddr64Table <1, NAME # "_RTN">;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000719
Matt Arsenaulte5456ce2017-07-20 21:06:04 +0000720 def _OFFEN_RTN : MUBUF_AtomicRet_Pseudo <opName, BUFAddrKind.OffEn, vdataClass>;
721 def _IDXEN_RTN : MUBUF_AtomicRet_Pseudo <opName, BUFAddrKind.IdxEn, vdataClass>;
722 def _BOTHEN_RTN : MUBUF_AtomicRet_Pseudo <opName, BUFAddrKind.BothEn, vdataClass>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000723}
724
Konstantin Zhuravlyov7f1959e2018-11-07 21:21:32 +0000725multiclass MUBUF_Pseudo_Atomics <string opName,
726 RegisterClass vdataClass,
727 ValueType vdataType,
728 SDPatternOperator atomic> :
729 MUBUF_Pseudo_Atomics_NO_RTN<opName, vdataClass, vdataType, atomic>,
730 MUBUF_Pseudo_Atomics_RTN<opName, vdataClass, vdataType, atomic>;
731
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000732
733//===----------------------------------------------------------------------===//
734// MUBUF Instructions
735//===----------------------------------------------------------------------===//
736
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000737defm BUFFER_LOAD_FORMAT_X : MUBUF_Pseudo_Loads_Lds <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000738 "buffer_load_format_x", VGPR_32
739>;
740defm BUFFER_LOAD_FORMAT_XY : MUBUF_Pseudo_Loads <
741 "buffer_load_format_xy", VReg_64
742>;
743defm BUFFER_LOAD_FORMAT_XYZ : MUBUF_Pseudo_Loads <
744 "buffer_load_format_xyz", VReg_96
745>;
746defm BUFFER_LOAD_FORMAT_XYZW : MUBUF_Pseudo_Loads <
747 "buffer_load_format_xyzw", VReg_128
748>;
749defm BUFFER_STORE_FORMAT_X : MUBUF_Pseudo_Stores <
750 "buffer_store_format_x", VGPR_32
751>;
752defm BUFFER_STORE_FORMAT_XY : MUBUF_Pseudo_Stores <
753 "buffer_store_format_xy", VReg_64
754>;
755defm BUFFER_STORE_FORMAT_XYZ : MUBUF_Pseudo_Stores <
756 "buffer_store_format_xyz", VReg_96
757>;
758defm BUFFER_STORE_FORMAT_XYZW : MUBUF_Pseudo_Stores <
759 "buffer_store_format_xyzw", VReg_128
760>;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +0000761
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000762let SubtargetPredicate = HasUnpackedD16VMem, D16Buf = 1 in {
Changpeng Fang44dfa1d2018-01-12 21:12:19 +0000763 defm BUFFER_LOAD_FORMAT_D16_X_gfx80 : MUBUF_Pseudo_Loads <
764 "buffer_load_format_d16_x", VGPR_32
765 >;
766 defm BUFFER_LOAD_FORMAT_D16_XY_gfx80 : MUBUF_Pseudo_Loads <
767 "buffer_load_format_d16_xy", VReg_64
768 >;
769 defm BUFFER_LOAD_FORMAT_D16_XYZ_gfx80 : MUBUF_Pseudo_Loads <
770 "buffer_load_format_d16_xyz", VReg_96
771 >;
772 defm BUFFER_LOAD_FORMAT_D16_XYZW_gfx80 : MUBUF_Pseudo_Loads <
773 "buffer_load_format_d16_xyzw", VReg_128
774 >;
775 defm BUFFER_STORE_FORMAT_D16_X_gfx80 : MUBUF_Pseudo_Stores <
776 "buffer_store_format_d16_x", VGPR_32
777 >;
778 defm BUFFER_STORE_FORMAT_D16_XY_gfx80 : MUBUF_Pseudo_Stores <
779 "buffer_store_format_d16_xy", VReg_64
780 >;
781 defm BUFFER_STORE_FORMAT_D16_XYZ_gfx80 : MUBUF_Pseudo_Stores <
782 "buffer_store_format_d16_xyz", VReg_96
783 >;
784 defm BUFFER_STORE_FORMAT_D16_XYZW_gfx80 : MUBUF_Pseudo_Stores <
785 "buffer_store_format_d16_xyzw", VReg_128
786 >;
787} // End HasUnpackedD16VMem.
788
Nicolai Haehnlef2674312018-06-21 13:36:01 +0000789let SubtargetPredicate = HasPackedD16VMem, D16Buf = 1 in {
Changpeng Fang44dfa1d2018-01-12 21:12:19 +0000790 defm BUFFER_LOAD_FORMAT_D16_X : MUBUF_Pseudo_Loads <
791 "buffer_load_format_d16_x", VGPR_32
792 >;
793 defm BUFFER_LOAD_FORMAT_D16_XY : MUBUF_Pseudo_Loads <
794 "buffer_load_format_d16_xy", VGPR_32
795 >;
796 defm BUFFER_LOAD_FORMAT_D16_XYZ : MUBUF_Pseudo_Loads <
797 "buffer_load_format_d16_xyz", VReg_64
798 >;
799 defm BUFFER_LOAD_FORMAT_D16_XYZW : MUBUF_Pseudo_Loads <
800 "buffer_load_format_d16_xyzw", VReg_64
801 >;
802 defm BUFFER_STORE_FORMAT_D16_X : MUBUF_Pseudo_Stores <
803 "buffer_store_format_d16_x", VGPR_32
804 >;
805 defm BUFFER_STORE_FORMAT_D16_XY : MUBUF_Pseudo_Stores <
806 "buffer_store_format_d16_xy", VGPR_32
807 >;
808 defm BUFFER_STORE_FORMAT_D16_XYZ : MUBUF_Pseudo_Stores <
809 "buffer_store_format_d16_xyz", VReg_64
810 >;
811 defm BUFFER_STORE_FORMAT_D16_XYZW : MUBUF_Pseudo_Stores <
812 "buffer_store_format_d16_xyzw", VReg_64
813 >;
814} // End HasPackedD16VMem.
815
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000816defm BUFFER_LOAD_UBYTE : MUBUF_Pseudo_Loads_Lds <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000817 "buffer_load_ubyte", VGPR_32, i32, mubuf_az_extloadi8
818>;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000819defm BUFFER_LOAD_SBYTE : MUBUF_Pseudo_Loads_Lds <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000820 "buffer_load_sbyte", VGPR_32, i32, mubuf_sextloadi8
821>;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000822defm BUFFER_LOAD_USHORT : MUBUF_Pseudo_Loads_Lds <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000823 "buffer_load_ushort", VGPR_32, i32, mubuf_az_extloadi16
824>;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000825defm BUFFER_LOAD_SSHORT : MUBUF_Pseudo_Loads_Lds <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000826 "buffer_load_sshort", VGPR_32, i32, mubuf_sextloadi16
827>;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +0000828defm BUFFER_LOAD_DWORD : MUBUF_Pseudo_Loads_Lds <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000829 "buffer_load_dword", VGPR_32, i32, mubuf_load
830>;
831defm BUFFER_LOAD_DWORDX2 : MUBUF_Pseudo_Loads <
832 "buffer_load_dwordx2", VReg_64, v2i32, mubuf_load
833>;
Artem Tamazov73f1ab22016-10-07 15:53:16 +0000834defm BUFFER_LOAD_DWORDX3 : MUBUF_Pseudo_Loads <
Tim Renouf361b5b22019-03-21 12:01:21 +0000835 "buffer_load_dwordx3", VReg_96, v3i32, mubuf_load
Artem Tamazov73f1ab22016-10-07 15:53:16 +0000836>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000837defm BUFFER_LOAD_DWORDX4 : MUBUF_Pseudo_Loads <
838 "buffer_load_dwordx4", VReg_128, v4i32, mubuf_load
839>;
Dmitry Preobrazhenskyffbee7a2018-06-13 15:32:46 +0000840
841// This is not described in AMD documentation,
842// but 'lds' versions of these opcodes are available
843// in at least GFX8+ chips. See Bug 37653.
Stanislav Mekhanoshin51823022019-04-06 09:20:48 +0000844let SubtargetPredicate = isGFX8GFX9 in {
Dmitry Preobrazhenskyffbee7a2018-06-13 15:32:46 +0000845defm BUFFER_LOAD_DWORDX2_LDS : MUBUF_Pseudo_Loads <
846 "buffer_load_dwordx2", VReg_64, v2i32, null_frag, 0, 1
847>;
848defm BUFFER_LOAD_DWORDX3_LDS : MUBUF_Pseudo_Loads <
849 "buffer_load_dwordx3", VReg_96, untyped, null_frag, 0, 1
850>;
851defm BUFFER_LOAD_DWORDX4_LDS : MUBUF_Pseudo_Loads <
852 "buffer_load_dwordx4", VReg_128, v4i32, null_frag, 0, 1
853>;
854}
855
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000856defm BUFFER_STORE_BYTE : MUBUF_Pseudo_Stores <
857 "buffer_store_byte", VGPR_32, i32, truncstorei8_global
858>;
859defm BUFFER_STORE_SHORT : MUBUF_Pseudo_Stores <
860 "buffer_store_short", VGPR_32, i32, truncstorei16_global
861>;
862defm BUFFER_STORE_DWORD : MUBUF_Pseudo_Stores <
Matt Arsenaultbc683832017-09-20 03:43:35 +0000863 "buffer_store_dword", VGPR_32, i32, store_global
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000864>;
865defm BUFFER_STORE_DWORDX2 : MUBUF_Pseudo_Stores <
Matt Arsenaultbc683832017-09-20 03:43:35 +0000866 "buffer_store_dwordx2", VReg_64, v2i32, store_global
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000867>;
Artem Tamazov73f1ab22016-10-07 15:53:16 +0000868defm BUFFER_STORE_DWORDX3 : MUBUF_Pseudo_Stores <
Tim Renouf361b5b22019-03-21 12:01:21 +0000869 "buffer_store_dwordx3", VReg_96, v3i32, store_global
Artem Tamazov73f1ab22016-10-07 15:53:16 +0000870>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000871defm BUFFER_STORE_DWORDX4 : MUBUF_Pseudo_Stores <
Matt Arsenaultbc683832017-09-20 03:43:35 +0000872 "buffer_store_dwordx4", VReg_128, v4i32, store_global
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000873>;
874defm BUFFER_ATOMIC_SWAP : MUBUF_Pseudo_Atomics <
875 "buffer_atomic_swap", VGPR_32, i32, atomic_swap_global
876>;
877defm BUFFER_ATOMIC_CMPSWAP : MUBUF_Pseudo_Atomics <
878 "buffer_atomic_cmpswap", VReg_64, v2i32, null_frag
879>;
880defm BUFFER_ATOMIC_ADD : MUBUF_Pseudo_Atomics <
881 "buffer_atomic_add", VGPR_32, i32, atomic_add_global
882>;
883defm BUFFER_ATOMIC_SUB : MUBUF_Pseudo_Atomics <
884 "buffer_atomic_sub", VGPR_32, i32, atomic_sub_global
885>;
886defm BUFFER_ATOMIC_SMIN : MUBUF_Pseudo_Atomics <
887 "buffer_atomic_smin", VGPR_32, i32, atomic_min_global
888>;
889defm BUFFER_ATOMIC_UMIN : MUBUF_Pseudo_Atomics <
890 "buffer_atomic_umin", VGPR_32, i32, atomic_umin_global
891>;
892defm BUFFER_ATOMIC_SMAX : MUBUF_Pseudo_Atomics <
893 "buffer_atomic_smax", VGPR_32, i32, atomic_max_global
894>;
895defm BUFFER_ATOMIC_UMAX : MUBUF_Pseudo_Atomics <
896 "buffer_atomic_umax", VGPR_32, i32, atomic_umax_global
897>;
898defm BUFFER_ATOMIC_AND : MUBUF_Pseudo_Atomics <
899 "buffer_atomic_and", VGPR_32, i32, atomic_and_global
900>;
901defm BUFFER_ATOMIC_OR : MUBUF_Pseudo_Atomics <
902 "buffer_atomic_or", VGPR_32, i32, atomic_or_global
903>;
904defm BUFFER_ATOMIC_XOR : MUBUF_Pseudo_Atomics <
905 "buffer_atomic_xor", VGPR_32, i32, atomic_xor_global
906>;
907defm BUFFER_ATOMIC_INC : MUBUF_Pseudo_Atomics <
908 "buffer_atomic_inc", VGPR_32, i32, atomic_inc_global
909>;
910defm BUFFER_ATOMIC_DEC : MUBUF_Pseudo_Atomics <
911 "buffer_atomic_dec", VGPR_32, i32, atomic_dec_global
912>;
913defm BUFFER_ATOMIC_SWAP_X2 : MUBUF_Pseudo_Atomics <
914 "buffer_atomic_swap_x2", VReg_64, i64, atomic_swap_global
915>;
916defm BUFFER_ATOMIC_CMPSWAP_X2 : MUBUF_Pseudo_Atomics <
917 "buffer_atomic_cmpswap_x2", VReg_128, v2i64, null_frag
918>;
919defm BUFFER_ATOMIC_ADD_X2 : MUBUF_Pseudo_Atomics <
920 "buffer_atomic_add_x2", VReg_64, i64, atomic_add_global
921>;
922defm BUFFER_ATOMIC_SUB_X2 : MUBUF_Pseudo_Atomics <
923 "buffer_atomic_sub_x2", VReg_64, i64, atomic_sub_global
924>;
925defm BUFFER_ATOMIC_SMIN_X2 : MUBUF_Pseudo_Atomics <
926 "buffer_atomic_smin_x2", VReg_64, i64, atomic_min_global
927>;
928defm BUFFER_ATOMIC_UMIN_X2 : MUBUF_Pseudo_Atomics <
929 "buffer_atomic_umin_x2", VReg_64, i64, atomic_umin_global
930>;
931defm BUFFER_ATOMIC_SMAX_X2 : MUBUF_Pseudo_Atomics <
932 "buffer_atomic_smax_x2", VReg_64, i64, atomic_max_global
933>;
934defm BUFFER_ATOMIC_UMAX_X2 : MUBUF_Pseudo_Atomics <
935 "buffer_atomic_umax_x2", VReg_64, i64, atomic_umax_global
936>;
937defm BUFFER_ATOMIC_AND_X2 : MUBUF_Pseudo_Atomics <
938 "buffer_atomic_and_x2", VReg_64, i64, atomic_and_global
939>;
940defm BUFFER_ATOMIC_OR_X2 : MUBUF_Pseudo_Atomics <
941 "buffer_atomic_or_x2", VReg_64, i64, atomic_or_global
942>;
943defm BUFFER_ATOMIC_XOR_X2 : MUBUF_Pseudo_Atomics <
944 "buffer_atomic_xor_x2", VReg_64, i64, atomic_xor_global
945>;
946defm BUFFER_ATOMIC_INC_X2 : MUBUF_Pseudo_Atomics <
947 "buffer_atomic_inc_x2", VReg_64, i64, atomic_inc_global
948>;
949defm BUFFER_ATOMIC_DEC_X2 : MUBUF_Pseudo_Atomics <
950 "buffer_atomic_dec_x2", VReg_64, i64, atomic_dec_global
951>;
952
Stanislav Mekhanoshin51823022019-04-06 09:20:48 +0000953let SubtargetPredicate = isGFX8GFX9 in {
Dmitry Preobrazhenskyd98c97b2018-03-12 17:29:24 +0000954def BUFFER_STORE_LDS_DWORD : MUBUF_Pseudo_Store_Lds <"buffer_store_lds_dword">;
955}
956
Stanislav Mekhanoshin7895c032019-04-05 18:24:34 +0000957let SubtargetPredicate = isGFX6 in { // isn't on CI & VI
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +0000958/*
959defm BUFFER_ATOMIC_RSUB : MUBUF_Pseudo_Atomics <"buffer_atomic_rsub">;
960defm BUFFER_ATOMIC_FCMPSWAP : MUBUF_Pseudo_Atomics <"buffer_atomic_fcmpswap">;
961defm BUFFER_ATOMIC_FMIN : MUBUF_Pseudo_Atomics <"buffer_atomic_fmin">;
962defm BUFFER_ATOMIC_FMAX : MUBUF_Pseudo_Atomics <"buffer_atomic_fmax">;
963defm BUFFER_ATOMIC_RSUB_X2 : MUBUF_Pseudo_Atomics <"buffer_atomic_rsub_x2">;
964defm BUFFER_ATOMIC_FCMPSWAP_X2 : MUBUF_Pseudo_Atomics <"buffer_atomic_fcmpswap_x2">;
965defm BUFFER_ATOMIC_FMIN_X2 : MUBUF_Pseudo_Atomics <"buffer_atomic_fmin_x2">;
966defm BUFFER_ATOMIC_FMAX_X2 : MUBUF_Pseudo_Atomics <"buffer_atomic_fmax_x2">;
967*/
968
969def BUFFER_WBINVL1_SC : MUBUF_Invalidate <"buffer_wbinvl1_sc",
970 int_amdgcn_buffer_wbinvl1_sc>;
971}
972
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000973let SubtargetPredicate = HasD16LoadStore in {
974
975defm BUFFER_LOAD_UBYTE_D16 : MUBUF_Pseudo_Loads <
Matt Arsenaulte1cd4822017-11-13 00:22:09 +0000976 "buffer_load_ubyte_d16", VGPR_32, i32, null_frag, 1
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000977>;
978
979defm BUFFER_LOAD_UBYTE_D16_HI : MUBUF_Pseudo_Loads <
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000980 "buffer_load_ubyte_d16_hi", VGPR_32, i32, null_frag, 1
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000981>;
982
983defm BUFFER_LOAD_SBYTE_D16 : MUBUF_Pseudo_Loads <
Matt Arsenaulte1cd4822017-11-13 00:22:09 +0000984 "buffer_load_sbyte_d16", VGPR_32, i32, null_frag, 1
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000985>;
986
987defm BUFFER_LOAD_SBYTE_D16_HI : MUBUF_Pseudo_Loads <
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000988 "buffer_load_sbyte_d16_hi", VGPR_32, i32, null_frag, 1
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000989>;
990
991defm BUFFER_LOAD_SHORT_D16 : MUBUF_Pseudo_Loads <
Matt Arsenaulte1cd4822017-11-13 00:22:09 +0000992 "buffer_load_short_d16", VGPR_32, i32, null_frag, 1
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000993>;
994
995defm BUFFER_LOAD_SHORT_D16_HI : MUBUF_Pseudo_Loads <
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000996 "buffer_load_short_d16_hi", VGPR_32, i32, null_frag, 1
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000997>;
998
999defm BUFFER_STORE_BYTE_D16_HI : MUBUF_Pseudo_Stores <
1000 "buffer_store_byte_d16_hi", VGPR_32, i32
1001>;
1002
1003defm BUFFER_STORE_SHORT_D16_HI : MUBUF_Pseudo_Stores <
1004 "buffer_store_short_d16_hi", VGPR_32, i32
1005>;
1006
Dmitry Preobrazhenskya917e882018-03-28 14:53:13 +00001007defm BUFFER_LOAD_FORMAT_D16_HI_X : MUBUF_Pseudo_Loads <
1008 "buffer_load_format_d16_hi_x", VGPR_32
1009>;
1010defm BUFFER_STORE_FORMAT_D16_HI_X : MUBUF_Pseudo_Stores <
1011 "buffer_store_format_d16_hi_x", VGPR_32
1012>;
1013
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001014} // End HasD16LoadStore
1015
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001016def BUFFER_WBINVL1 : MUBUF_Invalidate <"buffer_wbinvl1",
1017 int_amdgcn_buffer_wbinvl1>;
1018
1019//===----------------------------------------------------------------------===//
1020// MTBUF Instructions
1021//===----------------------------------------------------------------------===//
1022
David Stuttard70e8bc12017-06-22 16:29:22 +00001023defm TBUFFER_LOAD_FORMAT_X : MTBUF_Pseudo_Loads <"tbuffer_load_format_x", VGPR_32>;
1024defm TBUFFER_LOAD_FORMAT_XY : MTBUF_Pseudo_Loads <"tbuffer_load_format_xy", VReg_64>;
Tim Renouf677387d2019-03-22 14:58:02 +00001025defm TBUFFER_LOAD_FORMAT_XYZ : MTBUF_Pseudo_Loads <"tbuffer_load_format_xyz", VReg_96>;
David Stuttard70e8bc12017-06-22 16:29:22 +00001026defm TBUFFER_LOAD_FORMAT_XYZW : MTBUF_Pseudo_Loads <"tbuffer_load_format_xyzw", VReg_128>;
1027defm TBUFFER_STORE_FORMAT_X : MTBUF_Pseudo_Stores <"tbuffer_store_format_x", VGPR_32>;
1028defm TBUFFER_STORE_FORMAT_XY : MTBUF_Pseudo_Stores <"tbuffer_store_format_xy", VReg_64>;
Tim Renouf677387d2019-03-22 14:58:02 +00001029defm TBUFFER_STORE_FORMAT_XYZ : MTBUF_Pseudo_Stores <"tbuffer_store_format_xyz", VReg_96>;
David Stuttard70e8bc12017-06-22 16:29:22 +00001030defm TBUFFER_STORE_FORMAT_XYZW : MTBUF_Pseudo_Stores <"tbuffer_store_format_xyzw", VReg_128>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001031
Nicolai Haehnlef2674312018-06-21 13:36:01 +00001032let SubtargetPredicate = HasUnpackedD16VMem, D16Buf = 1 in {
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001033 defm TBUFFER_LOAD_FORMAT_D16_X_gfx80 : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_x", VGPR_32>;
1034 defm TBUFFER_LOAD_FORMAT_D16_XY_gfx80 : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_xy", VReg_64>;
1035 defm TBUFFER_LOAD_FORMAT_D16_XYZ_gfx80 : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_xyz", VReg_96>;
1036 defm TBUFFER_LOAD_FORMAT_D16_XYZW_gfx80 : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_xyzw", VReg_128>;
1037 defm TBUFFER_STORE_FORMAT_D16_X_gfx80 : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_x", VGPR_32>;
1038 defm TBUFFER_STORE_FORMAT_D16_XY_gfx80 : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_xy", VReg_64>;
1039 defm TBUFFER_STORE_FORMAT_D16_XYZ_gfx80 : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_xyz", VReg_96>;
1040 defm TBUFFER_STORE_FORMAT_D16_XYZW_gfx80 : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_xyzw", VReg_128>;
1041} // End HasUnpackedD16VMem.
1042
Nicolai Haehnlef2674312018-06-21 13:36:01 +00001043let SubtargetPredicate = HasPackedD16VMem, D16Buf = 1 in {
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001044 defm TBUFFER_LOAD_FORMAT_D16_X : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_x", VGPR_32>;
1045 defm TBUFFER_LOAD_FORMAT_D16_XY : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_xy", VGPR_32>;
1046 defm TBUFFER_LOAD_FORMAT_D16_XYZ : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_xyz", VReg_64>;
1047 defm TBUFFER_LOAD_FORMAT_D16_XYZW : MTBUF_Pseudo_Loads <"tbuffer_load_format_d16_xyzw", VReg_64>;
1048 defm TBUFFER_STORE_FORMAT_D16_X : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_x", VGPR_32>;
1049 defm TBUFFER_STORE_FORMAT_D16_XY : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_xy", VGPR_32>;
1050 defm TBUFFER_STORE_FORMAT_D16_XYZ : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_xyz", VReg_64>;
1051 defm TBUFFER_STORE_FORMAT_D16_XYZW : MTBUF_Pseudo_Stores <"tbuffer_store_format_d16_xyzw", VReg_64>;
1052} // End HasPackedD16VMem.
1053
Stanislav Mekhanoshin7895c032019-04-05 18:24:34 +00001054let SubtargetPredicate = isGFX7Plus in {
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001055
1056//===----------------------------------------------------------------------===//
1057// Instruction definitions for CI and newer.
1058//===----------------------------------------------------------------------===//
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001059
1060def BUFFER_WBINVL1_VOL : MUBUF_Invalidate <"buffer_wbinvl1_vol",
1061 int_amdgcn_buffer_wbinvl1_vol>;
1062
Stanislav Mekhanoshin7895c032019-04-05 18:24:34 +00001063} // End let SubtargetPredicate = isGFX7Plus
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001064
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001065let SubtargetPredicate = isGFX10Plus in {
1066 def BUFFER_GL0_INV : MUBUF_Invalidate<"buffer_gl0_inv">;
1067 def BUFFER_GL1_INV : MUBUF_Invalidate<"buffer_gl1_inv">;
1068} // End SubtargetPredicate = isGFX10Plus
1069
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001070//===----------------------------------------------------------------------===//
1071// MUBUF Patterns
1072//===----------------------------------------------------------------------===//
1073
Tim Renouf35484c92018-08-21 11:06:05 +00001074def extract_glc : SDNodeXForm<imm, [{
1075 return CurDAG->getTargetConstant(N->getZExtValue() & 1, SDLoc(N), MVT::i8);
1076}]>;
1077
1078def extract_slc : SDNodeXForm<imm, [{
1079 return CurDAG->getTargetConstant((N->getZExtValue() >> 1) & 1, SDLoc(N), MVT::i8);
1080}]>;
1081
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001082def extract_dlc : SDNodeXForm<imm, [{
1083 return CurDAG->getTargetConstant((N->getZExtValue() >> 2) & 1, SDLoc(N), MVT::i8);
1084}]>;
1085
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001086//===----------------------------------------------------------------------===//
1087// buffer_load/store_format patterns
1088//===----------------------------------------------------------------------===//
1089
1090multiclass MUBUF_LoadIntrinsicPat<SDPatternOperator name, ValueType vt,
1091 string opcode> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001092 def : GCNPat<
Tim Renouf4f703f52018-08-21 11:07:10 +00001093 (vt (name v4i32:$rsrc, 0, 0, i32:$soffset, imm:$offset,
1094 imm:$cachepolicy, 0)),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001095 (!cast<MUBUF_Pseudo>(opcode # _OFFSET) $rsrc, $soffset, (as_i16imm $offset),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001096 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0, (extract_dlc $cachepolicy))
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001097 >;
1098
Matt Arsenault90c75932017-10-03 00:06:41 +00001099 def : GCNPat<
Tim Renouf4f703f52018-08-21 11:07:10 +00001100 (vt (name v4i32:$rsrc, 0, i32:$voffset, i32:$soffset, imm:$offset,
1101 imm:$cachepolicy, 0)),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001102 (!cast<MUBUF_Pseudo>(opcode # _OFFEN) $voffset, $rsrc, $soffset, (as_i16imm $offset),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001103 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0, (extract_dlc $cachepolicy))
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001104 >;
1105
Matt Arsenault90c75932017-10-03 00:06:41 +00001106 def : GCNPat<
Tim Renouf4f703f52018-08-21 11:07:10 +00001107 (vt (name v4i32:$rsrc, i32:$vindex, 0, i32:$soffset, imm:$offset,
1108 imm:$cachepolicy, imm)),
1109 (!cast<MUBUF_Pseudo>(opcode # _IDXEN) $vindex, $rsrc, $soffset, (as_i16imm $offset),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001110 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0, (extract_dlc $cachepolicy))
Tim Renouf4f703f52018-08-21 11:07:10 +00001111 >;
1112
1113 def : GCNPat<
1114 (vt (name v4i32:$rsrc, i32:$vindex, i32:$voffset, i32:$soffset, imm:$offset,
1115 imm:$cachepolicy, imm)),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001116 (!cast<MUBUF_Pseudo>(opcode # _BOTHEN)
1117 (REG_SEQUENCE VReg_64, $vindex, sub0, $voffset, sub1),
1118 $rsrc, $soffset, (as_i16imm $offset),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001119 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0, (extract_dlc $cachepolicy))
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001120 >;
1121}
1122
Tom Stellard6f9ef142016-12-20 17:19:44 +00001123defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format, f32, "BUFFER_LOAD_FORMAT_X">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001124defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format, i32, "BUFFER_LOAD_FORMAT_X">;
Tom Stellard6f9ef142016-12-20 17:19:44 +00001125defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format, v2f32, "BUFFER_LOAD_FORMAT_XY">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001126defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format, v2i32, "BUFFER_LOAD_FORMAT_XY">;
Tim Renouf677387d2019-03-22 14:58:02 +00001127defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format, v3f32, "BUFFER_LOAD_FORMAT_XYZ">;
1128defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format, v3i32, "BUFFER_LOAD_FORMAT_XYZ">;
Tom Stellard6f9ef142016-12-20 17:19:44 +00001129defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format, v4f32, "BUFFER_LOAD_FORMAT_XYZW">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001130defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format, v4i32, "BUFFER_LOAD_FORMAT_XYZW">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001131
1132let SubtargetPredicate = HasUnpackedD16VMem in {
Matt Arsenault1349a042018-05-22 06:32:10 +00001133 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, f16, "BUFFER_LOAD_FORMAT_D16_X_gfx80">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001134 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, i16, "BUFFER_LOAD_FORMAT_D16_X_gfx80">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001135 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, v2i32, "BUFFER_LOAD_FORMAT_D16_XY_gfx80">;
1136 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, v4i32, "BUFFER_LOAD_FORMAT_D16_XYZW_gfx80">;
1137} // End HasUnpackedD16VMem.
1138
1139let SubtargetPredicate = HasPackedD16VMem in {
Matt Arsenault1349a042018-05-22 06:32:10 +00001140 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, f16, "BUFFER_LOAD_FORMAT_D16_X">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001141 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, i16, "BUFFER_LOAD_FORMAT_D16_X">;
Matt Arsenault1349a042018-05-22 06:32:10 +00001142 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, v2f16, "BUFFER_LOAD_FORMAT_D16_XY">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001143 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, v2i16, "BUFFER_LOAD_FORMAT_D16_XY">;
Matt Arsenault02dc7e12018-06-15 15:15:46 +00001144 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, v4f16, "BUFFER_LOAD_FORMAT_D16_XYZW">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001145 defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_format_d16, v4i16, "BUFFER_LOAD_FORMAT_D16_XYZW">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001146} // End HasPackedD16VMem.
1147
Tom Stellard6f9ef142016-12-20 17:19:44 +00001148defm : MUBUF_LoadIntrinsicPat<SIbuffer_load, f32, "BUFFER_LOAD_DWORD">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001149defm : MUBUF_LoadIntrinsicPat<SIbuffer_load, i32, "BUFFER_LOAD_DWORD">;
Tom Stellard6f9ef142016-12-20 17:19:44 +00001150defm : MUBUF_LoadIntrinsicPat<SIbuffer_load, v2f32, "BUFFER_LOAD_DWORDX2">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001151defm : MUBUF_LoadIntrinsicPat<SIbuffer_load, v2i32, "BUFFER_LOAD_DWORDX2">;
Tim Renouf677387d2019-03-22 14:58:02 +00001152defm : MUBUF_LoadIntrinsicPat<SIbuffer_load, v3f32, "BUFFER_LOAD_DWORDX3">;
1153defm : MUBUF_LoadIntrinsicPat<SIbuffer_load, v3i32, "BUFFER_LOAD_DWORDX3">;
Tom Stellard6f9ef142016-12-20 17:19:44 +00001154defm : MUBUF_LoadIntrinsicPat<SIbuffer_load, v4f32, "BUFFER_LOAD_DWORDX4">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001155defm : MUBUF_LoadIntrinsicPat<SIbuffer_load, v4i32, "BUFFER_LOAD_DWORDX4">;
Ryan Taylor00e063a2019-03-19 16:07:00 +00001156defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_byte, i32, "BUFFER_LOAD_SBYTE">;
1157defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_short, i32, "BUFFER_LOAD_SSHORT">;
1158defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_ubyte, i32, "BUFFER_LOAD_UBYTE">;
1159defm : MUBUF_LoadIntrinsicPat<SIbuffer_load_ushort, i32, "BUFFER_LOAD_USHORT">;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001160
1161multiclass MUBUF_StoreIntrinsicPat<SDPatternOperator name, ValueType vt,
1162 string opcode> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001163 def : GCNPat<
Tim Renouf4f703f52018-08-21 11:07:10 +00001164 (name vt:$vdata, v4i32:$rsrc, 0, 0, i32:$soffset, imm:$offset,
1165 imm:$cachepolicy, 0),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001166 (!cast<MUBUF_Pseudo>(opcode # _OFFSET_exact) $vdata, $rsrc, $soffset, (as_i16imm $offset),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001167 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0, (extract_dlc $cachepolicy))
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001168 >;
1169
Matt Arsenault90c75932017-10-03 00:06:41 +00001170 def : GCNPat<
Tim Renouf4f703f52018-08-21 11:07:10 +00001171 (name vt:$vdata, v4i32:$rsrc, 0, i32:$voffset, i32:$soffset, imm:$offset,
1172 imm:$cachepolicy, 0),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001173 (!cast<MUBUF_Pseudo>(opcode # _OFFEN_exact) $vdata, $voffset, $rsrc, $soffset,
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001174 (as_i16imm $offset), (extract_glc $cachepolicy),
1175 (extract_slc $cachepolicy), 0, (extract_dlc $cachepolicy))
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001176 >;
1177
Matt Arsenault90c75932017-10-03 00:06:41 +00001178 def : GCNPat<
Tim Renouf4f703f52018-08-21 11:07:10 +00001179 (name vt:$vdata, v4i32:$rsrc, i32:$vindex, 0, i32:$soffset, imm:$offset,
1180 imm:$cachepolicy, imm),
1181 (!cast<MUBUF_Pseudo>(opcode # _IDXEN_exact) $vdata, $vindex, $rsrc, $soffset,
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001182 (as_i16imm $offset), (extract_glc $cachepolicy),
1183 (extract_slc $cachepolicy), 0, (extract_dlc $cachepolicy))
Tim Renouf4f703f52018-08-21 11:07:10 +00001184 >;
1185
1186 def : GCNPat<
1187 (name vt:$vdata, v4i32:$rsrc, i32:$vindex, i32:$voffset, i32:$soffset, imm:$offset,
1188 imm:$cachepolicy, imm),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001189 (!cast<MUBUF_Pseudo>(opcode # _BOTHEN_exact)
1190 $vdata,
1191 (REG_SEQUENCE VReg_64, $vindex, sub0, $voffset, sub1),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001192 $rsrc, $soffset, (as_i16imm $offset), (extract_glc $cachepolicy),
1193 (extract_slc $cachepolicy), 0, (extract_dlc $cachepolicy))
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001194 >;
1195}
1196
Marek Olsak5cec6412017-11-09 01:52:48 +00001197defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format, f32, "BUFFER_STORE_FORMAT_X">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001198defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format, i32, "BUFFER_STORE_FORMAT_X">;
Marek Olsak5cec6412017-11-09 01:52:48 +00001199defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format, v2f32, "BUFFER_STORE_FORMAT_XY">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001200defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format, v2i32, "BUFFER_STORE_FORMAT_XY">;
Tim Renouf677387d2019-03-22 14:58:02 +00001201defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format, v3f32, "BUFFER_STORE_FORMAT_XYZ">;
1202defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format, v3i32, "BUFFER_STORE_FORMAT_XYZ">;
Marek Olsak5cec6412017-11-09 01:52:48 +00001203defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format, v4f32, "BUFFER_STORE_FORMAT_XYZW">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001204defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format, v4i32, "BUFFER_STORE_FORMAT_XYZW">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001205
1206let SubtargetPredicate = HasUnpackedD16VMem in {
1207 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, f16, "BUFFER_STORE_FORMAT_D16_X_gfx80">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001208 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, i16, "BUFFER_STORE_FORMAT_D16_X_gfx80">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001209 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, v2i32, "BUFFER_STORE_FORMAT_D16_XY_gfx80">;
1210 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, v4i32, "BUFFER_STORE_FORMAT_D16_XYZW_gfx80">;
1211} // End HasUnpackedD16VMem.
1212
1213let SubtargetPredicate = HasPackedD16VMem in {
1214 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, f16, "BUFFER_STORE_FORMAT_D16_X">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001215 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, i16, "BUFFER_STORE_FORMAT_D16_X">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001216 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, v2f16, "BUFFER_STORE_FORMAT_D16_XY">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001217 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, v2i16, "BUFFER_STORE_FORMAT_D16_XY">;
Matt Arsenault02dc7e12018-06-15 15:15:46 +00001218 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, v4f16, "BUFFER_STORE_FORMAT_D16_XYZW">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001219 defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_format_d16, v4i16, "BUFFER_STORE_FORMAT_D16_XYZW">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001220} // End HasPackedD16VMem.
1221
Marek Olsak5cec6412017-11-09 01:52:48 +00001222defm : MUBUF_StoreIntrinsicPat<SIbuffer_store, f32, "BUFFER_STORE_DWORD">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001223defm : MUBUF_StoreIntrinsicPat<SIbuffer_store, i32, "BUFFER_STORE_DWORD">;
Marek Olsak5cec6412017-11-09 01:52:48 +00001224defm : MUBUF_StoreIntrinsicPat<SIbuffer_store, v2f32, "BUFFER_STORE_DWORDX2">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001225defm : MUBUF_StoreIntrinsicPat<SIbuffer_store, v2i32, "BUFFER_STORE_DWORDX2">;
Tim Renouf677387d2019-03-22 14:58:02 +00001226defm : MUBUF_StoreIntrinsicPat<SIbuffer_store, v3f32, "BUFFER_STORE_DWORDX3">;
1227defm : MUBUF_StoreIntrinsicPat<SIbuffer_store, v3i32, "BUFFER_STORE_DWORDX3">;
Marek Olsak5cec6412017-11-09 01:52:48 +00001228defm : MUBUF_StoreIntrinsicPat<SIbuffer_store, v4f32, "BUFFER_STORE_DWORDX4">;
Tim Renoufbb5ee412018-08-21 11:08:12 +00001229defm : MUBUF_StoreIntrinsicPat<SIbuffer_store, v4i32, "BUFFER_STORE_DWORDX4">;
Ryan Taylor00e063a2019-03-19 16:07:00 +00001230defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_byte, i32, "BUFFER_STORE_BYTE">;
1231defm : MUBUF_StoreIntrinsicPat<SIbuffer_store_short, i32, "BUFFER_STORE_SHORT">;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001232
1233//===----------------------------------------------------------------------===//
1234// buffer_atomic patterns
1235//===----------------------------------------------------------------------===//
1236
Ryan Taylor67f36902019-03-06 17:02:06 +00001237multiclass BufferAtomicPatterns<SDPatternOperator name, ValueType vt,
1238 string opcode> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001239 def : GCNPat<
Ryan Taylor67f36902019-03-06 17:02:06 +00001240 (vt (name vt:$vdata_in, v4i32:$rsrc, 0,
Tim Renouf4f703f52018-08-21 11:07:10 +00001241 0, i32:$soffset, imm:$offset,
Ryan Taylor67f36902019-03-06 17:02:06 +00001242 imm:$cachepolicy, 0)),
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001243 (!cast<MUBUF_Pseudo>(opcode # _OFFSET_RTN) $vdata_in, $rsrc, $soffset,
Tim Renouf4f703f52018-08-21 11:07:10 +00001244 (as_i16imm $offset), (extract_slc $cachepolicy))
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001245 >;
1246
Matt Arsenault90c75932017-10-03 00:06:41 +00001247 def : GCNPat<
Ryan Taylor67f36902019-03-06 17:02:06 +00001248 (vt (name vt:$vdata_in, v4i32:$rsrc, i32:$vindex,
Tim Renouf4f703f52018-08-21 11:07:10 +00001249 0, i32:$soffset, imm:$offset,
Ryan Taylor67f36902019-03-06 17:02:06 +00001250 imm:$cachepolicy, imm)),
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001251 (!cast<MUBUF_Pseudo>(opcode # _IDXEN_RTN) $vdata_in, $vindex, $rsrc, $soffset,
Tim Renouf4f703f52018-08-21 11:07:10 +00001252 (as_i16imm $offset), (extract_slc $cachepolicy))
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001253 >;
1254
Matt Arsenault90c75932017-10-03 00:06:41 +00001255 def : GCNPat<
Ryan Taylor67f36902019-03-06 17:02:06 +00001256 (vt (name vt:$vdata_in, v4i32:$rsrc, 0,
Tim Renouf4f703f52018-08-21 11:07:10 +00001257 i32:$voffset, i32:$soffset, imm:$offset,
Ryan Taylor67f36902019-03-06 17:02:06 +00001258 imm:$cachepolicy, 0)),
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001259 (!cast<MUBUF_Pseudo>(opcode # _OFFEN_RTN) $vdata_in, $voffset, $rsrc, $soffset,
Tim Renouf4f703f52018-08-21 11:07:10 +00001260 (as_i16imm $offset), (extract_slc $cachepolicy))
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001261 >;
1262
Matt Arsenault90c75932017-10-03 00:06:41 +00001263 def : GCNPat<
Ryan Taylor67f36902019-03-06 17:02:06 +00001264 (vt (name vt:$vdata_in, v4i32:$rsrc, i32:$vindex,
Tim Renouf4f703f52018-08-21 11:07:10 +00001265 i32:$voffset, i32:$soffset, imm:$offset,
Ryan Taylor67f36902019-03-06 17:02:06 +00001266 imm:$cachepolicy, imm)),
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001267 (!cast<MUBUF_Pseudo>(opcode # _BOTHEN_RTN)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001268 $vdata_in,
1269 (REG_SEQUENCE VReg_64, $vindex, sub0, $voffset, sub1),
Tim Renouf4f703f52018-08-21 11:07:10 +00001270 $rsrc, $soffset, (as_i16imm $offset), (extract_slc $cachepolicy))
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001271 >;
1272}
1273
Ryan Taylor67f36902019-03-06 17:02:06 +00001274defm : BufferAtomicPatterns<SIbuffer_atomic_swap, i32, "BUFFER_ATOMIC_SWAP">;
1275defm : BufferAtomicPatterns<SIbuffer_atomic_add, i32, "BUFFER_ATOMIC_ADD">;
1276defm : BufferAtomicPatterns<SIbuffer_atomic_sub, i32, "BUFFER_ATOMIC_SUB">;
1277defm : BufferAtomicPatterns<SIbuffer_atomic_smin, i32, "BUFFER_ATOMIC_SMIN">;
1278defm : BufferAtomicPatterns<SIbuffer_atomic_umin, i32, "BUFFER_ATOMIC_UMIN">;
1279defm : BufferAtomicPatterns<SIbuffer_atomic_smax, i32, "BUFFER_ATOMIC_SMAX">;
1280defm : BufferAtomicPatterns<SIbuffer_atomic_umax, i32, "BUFFER_ATOMIC_UMAX">;
1281defm : BufferAtomicPatterns<SIbuffer_atomic_and, i32, "BUFFER_ATOMIC_AND">;
1282defm : BufferAtomicPatterns<SIbuffer_atomic_or, i32, "BUFFER_ATOMIC_OR">;
1283defm : BufferAtomicPatterns<SIbuffer_atomic_xor, i32, "BUFFER_ATOMIC_XOR">;
1284defm : BufferAtomicPatterns<SIbuffer_atomic_swap, i64, "BUFFER_ATOMIC_SWAP_X2">;
1285defm : BufferAtomicPatterns<SIbuffer_atomic_add, i64, "BUFFER_ATOMIC_ADD_X2">;
1286defm : BufferAtomicPatterns<SIbuffer_atomic_sub, i64, "BUFFER_ATOMIC_SUB_X2">;
1287defm : BufferAtomicPatterns<SIbuffer_atomic_smin, i64, "BUFFER_ATOMIC_SMIN_X2">;
1288defm : BufferAtomicPatterns<SIbuffer_atomic_umin, i64, "BUFFER_ATOMIC_UMIN_X2">;
1289defm : BufferAtomicPatterns<SIbuffer_atomic_smax, i64, "BUFFER_ATOMIC_SMAX_X2">;
1290defm : BufferAtomicPatterns<SIbuffer_atomic_umax, i64, "BUFFER_ATOMIC_UMAX_X2">;
1291defm : BufferAtomicPatterns<SIbuffer_atomic_and, i64, "BUFFER_ATOMIC_AND_X2">;
1292defm : BufferAtomicPatterns<SIbuffer_atomic_or, i64, "BUFFER_ATOMIC_OR_X2">;
1293defm : BufferAtomicPatterns<SIbuffer_atomic_xor, i64, "BUFFER_ATOMIC_XOR_X2">;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001294
Matt Arsenault90c75932017-10-03 00:06:41 +00001295def : GCNPat<
Marek Olsak5cec6412017-11-09 01:52:48 +00001296 (SIbuffer_atomic_cmpswap
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001297 i32:$data, i32:$cmp, v4i32:$rsrc, 0,
Tim Renouf4f703f52018-08-21 11:07:10 +00001298 0, i32:$soffset, imm:$offset,
1299 imm:$cachepolicy, 0),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001300 (EXTRACT_SUBREG
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001301 (BUFFER_ATOMIC_CMPSWAP_OFFSET_RTN
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001302 (REG_SEQUENCE VReg_64, $data, sub0, $cmp, sub1),
Tim Renouf4f703f52018-08-21 11:07:10 +00001303 $rsrc, $soffset, (as_i16imm $offset), (extract_slc $cachepolicy)),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001304 sub0)
1305>;
1306
Matt Arsenault90c75932017-10-03 00:06:41 +00001307def : GCNPat<
Marek Olsak5cec6412017-11-09 01:52:48 +00001308 (SIbuffer_atomic_cmpswap
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001309 i32:$data, i32:$cmp, v4i32:$rsrc, i32:$vindex,
Tim Renouf4f703f52018-08-21 11:07:10 +00001310 0, i32:$soffset, imm:$offset,
1311 imm:$cachepolicy, imm),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001312 (EXTRACT_SUBREG
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001313 (BUFFER_ATOMIC_CMPSWAP_IDXEN_RTN
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001314 (REG_SEQUENCE VReg_64, $data, sub0, $cmp, sub1),
Tim Renouf4f703f52018-08-21 11:07:10 +00001315 $vindex, $rsrc, $soffset, (as_i16imm $offset), (extract_slc $cachepolicy)),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001316 sub0)
1317>;
1318
Matt Arsenault90c75932017-10-03 00:06:41 +00001319def : GCNPat<
Marek Olsak5cec6412017-11-09 01:52:48 +00001320 (SIbuffer_atomic_cmpswap
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001321 i32:$data, i32:$cmp, v4i32:$rsrc, 0,
Tim Renouf4f703f52018-08-21 11:07:10 +00001322 i32:$voffset, i32:$soffset, imm:$offset,
1323 imm:$cachepolicy, 0),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001324 (EXTRACT_SUBREG
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001325 (BUFFER_ATOMIC_CMPSWAP_OFFEN_RTN
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001326 (REG_SEQUENCE VReg_64, $data, sub0, $cmp, sub1),
Tim Renouf4f703f52018-08-21 11:07:10 +00001327 $voffset, $rsrc, $soffset, (as_i16imm $offset), (extract_slc $cachepolicy)),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001328 sub0)
1329>;
1330
Matt Arsenault90c75932017-10-03 00:06:41 +00001331def : GCNPat<
Marek Olsak5cec6412017-11-09 01:52:48 +00001332 (SIbuffer_atomic_cmpswap
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001333 i32:$data, i32:$cmp, v4i32:$rsrc, i32:$vindex,
Tim Renouf4f703f52018-08-21 11:07:10 +00001334 i32:$voffset, i32:$soffset, imm:$offset,
1335 imm:$cachepolicy, imm),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001336 (EXTRACT_SUBREG
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00001337 (BUFFER_ATOMIC_CMPSWAP_BOTHEN_RTN
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001338 (REG_SEQUENCE VReg_64, $data, sub0, $cmp, sub1),
1339 (REG_SEQUENCE VReg_64, $vindex, sub0, $voffset, sub1),
Tim Renouf4f703f52018-08-21 11:07:10 +00001340 $rsrc, $soffset, (as_i16imm $offset), (extract_slc $cachepolicy)),
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001341 sub0)
1342>;
1343
Tom Stellard115a6152016-11-10 16:02:37 +00001344class MUBUFLoad_PatternADDR64 <MUBUF_Pseudo Instr_ADDR64, ValueType vt,
Matt Arsenault90c75932017-10-03 00:06:41 +00001345 PatFrag constant_ld> : GCNPat <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001346 (vt (constant_ld (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset,
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001347 i16:$offset, i1:$glc, i1:$slc, i1:$tfe, i1:$dlc))),
1348 (Instr_ADDR64 $vaddr, $srsrc, $soffset, $offset, $glc, $slc, $tfe, $dlc)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001349 >;
1350
1351multiclass MUBUFLoad_Atomic_Pattern <MUBUF_Pseudo Instr_ADDR64, MUBUF_Pseudo Instr_OFFSET,
1352 ValueType vt, PatFrag atomic_ld> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001353 def : GCNPat <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001354 (vt (atomic_ld (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset,
1355 i16:$offset, i1:$slc))),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001356 (Instr_ADDR64 $vaddr, $srsrc, $soffset, $offset, 0, $slc, 0, 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001357 >;
1358
Matt Arsenault90c75932017-10-03 00:06:41 +00001359 def : GCNPat <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001360 (vt (atomic_ld (MUBUFOffsetNoGLC v4i32:$rsrc, i32:$soffset, i16:$offset))),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001361 (Instr_OFFSET $rsrc, $soffset, (as_i16imm $offset), 0, 0, 0, 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001362 >;
1363}
1364
Stanislav Mekhanoshin7895c032019-04-05 18:24:34 +00001365let SubtargetPredicate = isGFX6GFX7 in {
Tom Stellard115a6152016-11-10 16:02:37 +00001366def : MUBUFLoad_PatternADDR64 <BUFFER_LOAD_SBYTE_ADDR64, i32, sextloadi8_constant>;
1367def : MUBUFLoad_PatternADDR64 <BUFFER_LOAD_UBYTE_ADDR64, i32, az_extloadi8_constant>;
1368def : MUBUFLoad_PatternADDR64 <BUFFER_LOAD_SSHORT_ADDR64, i32, sextloadi16_constant>;
1369def : MUBUFLoad_PatternADDR64 <BUFFER_LOAD_USHORT_ADDR64, i32, az_extloadi16_constant>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001370
1371defm : MUBUFLoad_Atomic_Pattern <BUFFER_LOAD_DWORD_ADDR64, BUFFER_LOAD_DWORD_OFFSET, i32, mubuf_load_atomic>;
1372defm : MUBUFLoad_Atomic_Pattern <BUFFER_LOAD_DWORDX2_ADDR64, BUFFER_LOAD_DWORDX2_OFFSET, i64, mubuf_load_atomic>;
Stanislav Mekhanoshin7895c032019-04-05 18:24:34 +00001373} // End SubtargetPredicate = isGFX6GFX7
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001374
Tom Stellard115a6152016-11-10 16:02:37 +00001375multiclass MUBUFLoad_Pattern <MUBUF_Pseudo Instr_OFFSET, ValueType vt,
1376 PatFrag ld> {
1377
Matt Arsenault90c75932017-10-03 00:06:41 +00001378 def : GCNPat <
Tom Stellard115a6152016-11-10 16:02:37 +00001379 (vt (ld (MUBUFOffset v4i32:$srsrc, i32:$soffset,
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001380 i16:$offset, i1:$glc, i1:$slc, i1:$tfe, i1:$dlc))),
1381 (Instr_OFFSET $srsrc, $soffset, $offset, $glc, $slc, $tfe, $dlc)
Tom Stellard115a6152016-11-10 16:02:37 +00001382 >;
1383}
1384
Matt Arsenault90c75932017-10-03 00:06:41 +00001385let OtherPredicates = [Has16BitInsts] in {
Tom Stellard115a6152016-11-10 16:02:37 +00001386
1387defm : MUBUFLoad_Pattern <BUFFER_LOAD_SBYTE_OFFSET, i16, sextloadi8_constant>;
1388defm : MUBUFLoad_Pattern <BUFFER_LOAD_UBYTE_OFFSET, i16, az_extloadi8_constant>;
1389defm : MUBUFLoad_Pattern <BUFFER_LOAD_SBYTE_OFFSET, i16, mubuf_sextloadi8>;
1390defm : MUBUFLoad_Pattern <BUFFER_LOAD_UBYTE_OFFSET, i16, mubuf_az_extloadi8>;
1391
Matt Arsenault65ca292a2017-09-07 05:37:34 +00001392defm : MUBUFLoad_Pattern <BUFFER_LOAD_USHORT_OFFSET, i16, mubuf_load>;
1393
Matt Arsenault90c75932017-10-03 00:06:41 +00001394} // End OtherPredicates = [Has16BitInsts]
Tom Stellard115a6152016-11-10 16:02:37 +00001395
Matt Arsenault0774ea22017-04-24 19:40:59 +00001396multiclass MUBUFScratchLoadPat <MUBUF_Pseudo InstrOffen,
1397 MUBUF_Pseudo InstrOffset,
1398 ValueType vt, PatFrag ld> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001399 def : GCNPat <
Matt Arsenault0774ea22017-04-24 19:40:59 +00001400 (vt (ld (MUBUFScratchOffen v4i32:$srsrc, i32:$vaddr,
1401 i32:$soffset, u16imm:$offset))),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001402 (InstrOffen $vaddr, $srsrc, $soffset, $offset, 0, 0, 0, 0)
Matt Arsenault0774ea22017-04-24 19:40:59 +00001403 >;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001404
Matt Arsenault90c75932017-10-03 00:06:41 +00001405 def : GCNPat <
Matt Arsenault0774ea22017-04-24 19:40:59 +00001406 (vt (ld (MUBUFScratchOffset v4i32:$srsrc, i32:$soffset, u16imm:$offset))),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001407 (InstrOffset $srsrc, $soffset, $offset, 0, 0, 0, 0)
Matt Arsenault0774ea22017-04-24 19:40:59 +00001408 >;
1409}
1410
Matt Arsenaultb81495d2017-09-20 05:01:53 +00001411// XXX - Is it possible to have a complex pattern in a PatFrag?
Matt Arsenaulte8c03a22019-03-08 20:58:11 +00001412multiclass MUBUFScratchLoadPat_D16 <MUBUF_Pseudo InstrOffen,
Matt Arsenaultb81495d2017-09-20 05:01:53 +00001413 MUBUF_Pseudo InstrOffset,
Matt Arsenaulte8c03a22019-03-08 20:58:11 +00001414 ValueType vt, PatFrag ld_frag> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001415 def : GCNPat <
Matt Arsenaulte8c03a22019-03-08 20:58:11 +00001416 (ld_frag (MUBUFScratchOffen v4i32:$srsrc, i32:$vaddr, i32:$soffset, u16imm:$offset), vt:$in),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001417 (InstrOffen $vaddr, $srsrc, $soffset, $offset, 0, 0, 0, 0, $in)
Matt Arsenaultb81495d2017-09-20 05:01:53 +00001418 >;
1419
Matt Arsenault90c75932017-10-03 00:06:41 +00001420 def : GCNPat <
Matt Arsenaulte8c03a22019-03-08 20:58:11 +00001421 (ld_frag (MUBUFScratchOffset v4i32:$srsrc, i32:$soffset, u16imm:$offset), vt:$in),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001422 (InstrOffset $srsrc, $soffset, $offset, 0, 0, 0, 0, $in)
Matt Arsenaulte1cd4822017-11-13 00:22:09 +00001423 >;
1424}
1425
Matt Arsenault0774ea22017-04-24 19:40:59 +00001426defm : MUBUFScratchLoadPat <BUFFER_LOAD_SBYTE_OFFEN, BUFFER_LOAD_SBYTE_OFFSET, i32, sextloadi8_private>;
Matt Arsenaultbc683832017-09-20 03:43:35 +00001427defm : MUBUFScratchLoadPat <BUFFER_LOAD_UBYTE_OFFEN, BUFFER_LOAD_UBYTE_OFFSET, i32, az_extloadi8_private>;
Matt Arsenault0774ea22017-04-24 19:40:59 +00001428defm : MUBUFScratchLoadPat <BUFFER_LOAD_SBYTE_OFFEN, BUFFER_LOAD_SBYTE_OFFSET, i16, sextloadi8_private>;
Matt Arsenaultbc683832017-09-20 03:43:35 +00001429defm : MUBUFScratchLoadPat <BUFFER_LOAD_UBYTE_OFFEN, BUFFER_LOAD_UBYTE_OFFSET, i16, az_extloadi8_private>;
Matt Arsenault0774ea22017-04-24 19:40:59 +00001430defm : MUBUFScratchLoadPat <BUFFER_LOAD_SSHORT_OFFEN, BUFFER_LOAD_SSHORT_OFFSET, i32, sextloadi16_private>;
Matt Arsenaultbc683832017-09-20 03:43:35 +00001431defm : MUBUFScratchLoadPat <BUFFER_LOAD_USHORT_OFFEN, BUFFER_LOAD_USHORT_OFFSET, i32, az_extloadi16_private>;
Matt Arsenault65ca292a2017-09-07 05:37:34 +00001432defm : MUBUFScratchLoadPat <BUFFER_LOAD_USHORT_OFFEN, BUFFER_LOAD_USHORT_OFFSET, i16, load_private>;
Matt Arsenault0774ea22017-04-24 19:40:59 +00001433defm : MUBUFScratchLoadPat <BUFFER_LOAD_DWORD_OFFEN, BUFFER_LOAD_DWORD_OFFSET, i32, load_private>;
1434defm : MUBUFScratchLoadPat <BUFFER_LOAD_DWORDX2_OFFEN, BUFFER_LOAD_DWORDX2_OFFSET, v2i32, load_private>;
Tim Renouf361b5b22019-03-21 12:01:21 +00001435defm : MUBUFScratchLoadPat <BUFFER_LOAD_DWORDX3_OFFEN, BUFFER_LOAD_DWORDX3_OFFSET, v3i32, load_private>;
Matt Arsenault0774ea22017-04-24 19:40:59 +00001436defm : MUBUFScratchLoadPat <BUFFER_LOAD_DWORDX4_OFFEN, BUFFER_LOAD_DWORDX4_OFFSET, v4i32, load_private>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001437
Konstantin Zhuravlyovc2c2eb72018-05-04 20:06:57 +00001438let OtherPredicates = [D16PreservesUnusedBits] in {
Matt Arsenaulte8c03a22019-03-08 20:58:11 +00001439defm : MUBUFScratchLoadPat_D16<BUFFER_LOAD_SHORT_D16_HI_OFFEN, BUFFER_LOAD_SHORT_D16_HI_OFFSET, v2i16, load_d16_hi_private>;
1440defm : MUBUFScratchLoadPat_D16<BUFFER_LOAD_UBYTE_D16_HI_OFFEN, BUFFER_LOAD_UBYTE_D16_HI_OFFSET, v2i16, az_extloadi8_d16_hi_private>;
1441defm : MUBUFScratchLoadPat_D16<BUFFER_LOAD_SBYTE_D16_HI_OFFEN, BUFFER_LOAD_SBYTE_D16_HI_OFFSET, v2i16, sextloadi8_d16_hi_private>;
1442defm : MUBUFScratchLoadPat_D16<BUFFER_LOAD_SHORT_D16_HI_OFFEN, BUFFER_LOAD_SHORT_D16_HI_OFFSET, v2f16, load_d16_hi_private>;
1443defm : MUBUFScratchLoadPat_D16<BUFFER_LOAD_UBYTE_D16_HI_OFFEN, BUFFER_LOAD_UBYTE_D16_HI_OFFSET, v2f16, az_extloadi8_d16_hi_private>;
1444defm : MUBUFScratchLoadPat_D16<BUFFER_LOAD_SBYTE_D16_HI_OFFEN, BUFFER_LOAD_SBYTE_D16_HI_OFFSET, v2f16, sextloadi8_d16_hi_private>;
Matt Arsenaulte1cd4822017-11-13 00:22:09 +00001445
Matt Arsenaulte8c03a22019-03-08 20:58:11 +00001446defm : MUBUFScratchLoadPat_D16<BUFFER_LOAD_SHORT_D16_OFFEN, BUFFER_LOAD_SHORT_D16_OFFSET, v2i16, load_d16_lo_private>;
1447defm : MUBUFScratchLoadPat_D16<BUFFER_LOAD_UBYTE_D16_OFFEN, BUFFER_LOAD_UBYTE_D16_OFFSET, v2i16, az_extloadi8_d16_lo_private>;
1448defm : MUBUFScratchLoadPat_D16<BUFFER_LOAD_SBYTE_D16_OFFEN, BUFFER_LOAD_SBYTE_D16_OFFSET, v2i16, sextloadi8_d16_lo_private>;
1449defm : MUBUFScratchLoadPat_D16<BUFFER_LOAD_SHORT_D16_OFFEN, BUFFER_LOAD_SHORT_D16_OFFSET, v2f16, load_d16_lo_private>;
1450defm : MUBUFScratchLoadPat_D16<BUFFER_LOAD_UBYTE_D16_OFFEN, BUFFER_LOAD_UBYTE_D16_OFFSET, v2f16, az_extloadi8_d16_lo_private>;
1451defm : MUBUFScratchLoadPat_D16<BUFFER_LOAD_SBYTE_D16_OFFEN, BUFFER_LOAD_SBYTE_D16_OFFSET, v2f16, sextloadi8_d16_lo_private>;
Matt Arsenaultb81495d2017-09-20 05:01:53 +00001452}
Stanislav Mekhanoshin7895c032019-04-05 18:24:34 +00001453
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001454multiclass MUBUFStore_Atomic_Pattern <MUBUF_Pseudo Instr_ADDR64, MUBUF_Pseudo Instr_OFFSET,
1455 ValueType vt, PatFrag atomic_st> {
1456 // Store follows atomic op convention so address is forst
Matt Arsenault90c75932017-10-03 00:06:41 +00001457 def : GCNPat <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001458 (atomic_st (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset,
1459 i16:$offset, i1:$slc), vt:$val),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001460 (Instr_ADDR64 $val, $vaddr, $srsrc, $soffset, $offset, 0, $slc, 0, 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001461 >;
1462
Matt Arsenault90c75932017-10-03 00:06:41 +00001463 def : GCNPat <
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001464 (atomic_st (MUBUFOffsetNoGLC v4i32:$rsrc, i32:$soffset, i16:$offset), vt:$val),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001465 (Instr_OFFSET $val, $rsrc, $soffset, (as_i16imm $offset), 0, 0, 0, 0)
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001466 >;
1467}
Stanislav Mekhanoshin7895c032019-04-05 18:24:34 +00001468let SubtargetPredicate = isGFX6GFX7 in {
Matt Arsenaultbc683832017-09-20 03:43:35 +00001469defm : MUBUFStore_Atomic_Pattern <BUFFER_STORE_DWORD_ADDR64, BUFFER_STORE_DWORD_OFFSET, i32, store_atomic_global>;
1470defm : MUBUFStore_Atomic_Pattern <BUFFER_STORE_DWORDX2_ADDR64, BUFFER_STORE_DWORDX2_OFFSET, i64, store_atomic_global>;
Stanislav Mekhanoshin7895c032019-04-05 18:24:34 +00001471} // End Predicates = isGFX6GFX7
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001472
Tom Stellard115a6152016-11-10 16:02:37 +00001473
1474multiclass MUBUFStore_Pattern <MUBUF_Pseudo Instr_OFFSET, ValueType vt,
1475 PatFrag st> {
1476
Matt Arsenault90c75932017-10-03 00:06:41 +00001477 def : GCNPat <
Tom Stellard115a6152016-11-10 16:02:37 +00001478 (st vt:$vdata, (MUBUFOffset v4i32:$srsrc, i32:$soffset,
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001479 i16:$offset, i1:$glc, i1:$slc, i1:$tfe, i1:$dlc)),
1480 (Instr_OFFSET $vdata, $srsrc, $soffset, $offset, $glc, $slc, $tfe, $dlc)
Tom Stellard115a6152016-11-10 16:02:37 +00001481 >;
1482}
1483
1484defm : MUBUFStore_Pattern <BUFFER_STORE_BYTE_OFFSET, i16, truncstorei8_global>;
Matt Arsenaultbc683832017-09-20 03:43:35 +00001485defm : MUBUFStore_Pattern <BUFFER_STORE_SHORT_OFFSET, i16, store_global>;
Tom Stellard115a6152016-11-10 16:02:37 +00001486
Matt Arsenault0774ea22017-04-24 19:40:59 +00001487multiclass MUBUFScratchStorePat <MUBUF_Pseudo InstrOffen,
1488 MUBUF_Pseudo InstrOffset,
1489 ValueType vt, PatFrag st> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001490 def : GCNPat <
Matt Arsenault0774ea22017-04-24 19:40:59 +00001491 (st vt:$value, (MUBUFScratchOffen v4i32:$srsrc, i32:$vaddr,
1492 i32:$soffset, u16imm:$offset)),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001493 (InstrOffen $value, $vaddr, $srsrc, $soffset, $offset, 0, 0, 0, 0)
Matt Arsenault0774ea22017-04-24 19:40:59 +00001494 >;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001495
Matt Arsenault90c75932017-10-03 00:06:41 +00001496 def : GCNPat <
Matt Arsenault0774ea22017-04-24 19:40:59 +00001497 (st vt:$value, (MUBUFScratchOffset v4i32:$srsrc, i32:$soffset,
1498 u16imm:$offset)),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001499 (InstrOffset $value, $srsrc, $soffset, $offset, 0, 0, 0, 0)
Matt Arsenault0774ea22017-04-24 19:40:59 +00001500 >;
1501}
1502
1503defm : MUBUFScratchStorePat <BUFFER_STORE_BYTE_OFFEN, BUFFER_STORE_BYTE_OFFSET, i32, truncstorei8_private>;
1504defm : MUBUFScratchStorePat <BUFFER_STORE_SHORT_OFFEN, BUFFER_STORE_SHORT_OFFSET, i32, truncstorei16_private>;
1505defm : MUBUFScratchStorePat <BUFFER_STORE_BYTE_OFFEN, BUFFER_STORE_BYTE_OFFSET, i16, truncstorei8_private>;
1506defm : MUBUFScratchStorePat <BUFFER_STORE_SHORT_OFFEN, BUFFER_STORE_SHORT_OFFSET, i16, store_private>;
1507defm : MUBUFScratchStorePat <BUFFER_STORE_DWORD_OFFEN, BUFFER_STORE_DWORD_OFFSET, i32, store_private>;
1508defm : MUBUFScratchStorePat <BUFFER_STORE_DWORDX2_OFFEN, BUFFER_STORE_DWORDX2_OFFSET, v2i32, store_private>;
Tim Renouf361b5b22019-03-21 12:01:21 +00001509defm : MUBUFScratchStorePat <BUFFER_STORE_DWORDX3_OFFEN, BUFFER_STORE_DWORDX3_OFFSET, v3i32, store_private>;
Matt Arsenault0774ea22017-04-24 19:40:59 +00001510defm : MUBUFScratchStorePat <BUFFER_STORE_DWORDX4_OFFEN, BUFFER_STORE_DWORDX4_OFFSET, v4i32, store_private>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001511
Matt Arsenaultfcc213f2017-09-20 03:20:09 +00001512
Konstantin Zhuravlyovc2c2eb72018-05-04 20:06:57 +00001513let OtherPredicates = [D16PreservesUnusedBits] in {
Matt Arsenaultfcc213f2017-09-20 03:20:09 +00001514 // Hiding the extract high pattern in the PatFrag seems to not
1515 // automatically increase the complexity.
1516let AddedComplexity = 1 in {
Matt Arsenaultbc683832017-09-20 03:43:35 +00001517defm : MUBUFScratchStorePat <BUFFER_STORE_SHORT_D16_HI_OFFEN, BUFFER_STORE_SHORT_D16_HI_OFFSET, i32, store_hi16_private>;
1518defm : MUBUFScratchStorePat <BUFFER_STORE_BYTE_D16_HI_OFFEN, BUFFER_STORE_BYTE_D16_HI_OFFSET, i32, truncstorei8_hi16_private>;
Matt Arsenaultfcc213f2017-09-20 03:20:09 +00001519}
1520}
1521
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001522//===----------------------------------------------------------------------===//
1523// MTBUF Patterns
1524//===----------------------------------------------------------------------===//
1525
David Stuttard70e8bc12017-06-22 16:29:22 +00001526//===----------------------------------------------------------------------===//
1527// tbuffer_load/store_format patterns
1528//===----------------------------------------------------------------------===//
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001529
David Stuttard70e8bc12017-06-22 16:29:22 +00001530multiclass MTBUF_LoadIntrinsicPat<SDPatternOperator name, ValueType vt,
1531 string opcode> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001532 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001533 (vt (name v4i32:$rsrc, 0, 0, i32:$soffset, imm:$offset,
Tim Renouf35484c92018-08-21 11:06:05 +00001534 imm:$format, imm:$cachepolicy, 0)),
David Stuttard70e8bc12017-06-22 16:29:22 +00001535 (!cast<MTBUF_Pseudo>(opcode # _OFFSET) $rsrc, $soffset, (as_i16imm $offset),
Tim Renouf35484c92018-08-21 11:06:05 +00001536 (as_i8imm $format),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001537 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0, (extract_dlc $cachepolicy))
David Stuttard70e8bc12017-06-22 16:29:22 +00001538 >;
1539
Matt Arsenault90c75932017-10-03 00:06:41 +00001540 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001541 (vt (name v4i32:$rsrc, i32:$vindex, 0, i32:$soffset, imm:$offset,
Tim Renouf35484c92018-08-21 11:06:05 +00001542 imm:$format, imm:$cachepolicy, imm)),
David Stuttard70e8bc12017-06-22 16:29:22 +00001543 (!cast<MTBUF_Pseudo>(opcode # _IDXEN) $vindex, $rsrc, $soffset, (as_i16imm $offset),
Tim Renouf35484c92018-08-21 11:06:05 +00001544 (as_i8imm $format),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001545 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0, (extract_dlc $cachepolicy))
David Stuttard70e8bc12017-06-22 16:29:22 +00001546 >;
1547
Matt Arsenault90c75932017-10-03 00:06:41 +00001548 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001549 (vt (name v4i32:$rsrc, 0, i32:$voffset, i32:$soffset, imm:$offset,
Tim Renouf35484c92018-08-21 11:06:05 +00001550 imm:$format, imm:$cachepolicy, 0)),
David Stuttard70e8bc12017-06-22 16:29:22 +00001551 (!cast<MTBUF_Pseudo>(opcode # _OFFEN) $voffset, $rsrc, $soffset, (as_i16imm $offset),
Tim Renouf35484c92018-08-21 11:06:05 +00001552 (as_i8imm $format),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001553 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0, (extract_dlc $cachepolicy))
David Stuttard70e8bc12017-06-22 16:29:22 +00001554 >;
1555
Matt Arsenault90c75932017-10-03 00:06:41 +00001556 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001557 (vt (name v4i32:$rsrc, i32:$vindex, i32:$voffset, i32:$soffset, imm:$offset,
Tim Renouf35484c92018-08-21 11:06:05 +00001558 imm:$format, imm:$cachepolicy, imm)),
David Stuttard70e8bc12017-06-22 16:29:22 +00001559 (!cast<MTBUF_Pseudo>(opcode # _BOTHEN)
1560 (REG_SEQUENCE VReg_64, $vindex, sub0, $voffset, sub1),
1561 $rsrc, $soffset, (as_i16imm $offset),
Tim Renouf35484c92018-08-21 11:06:05 +00001562 (as_i8imm $format),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001563 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0, (extract_dlc $cachepolicy))
David Stuttard70e8bc12017-06-22 16:29:22 +00001564 >;
1565}
1566
1567defm : MTBUF_LoadIntrinsicPat<SItbuffer_load, i32, "TBUFFER_LOAD_FORMAT_X">;
1568defm : MTBUF_LoadIntrinsicPat<SItbuffer_load, v2i32, "TBUFFER_LOAD_FORMAT_XY">;
Tim Renouf677387d2019-03-22 14:58:02 +00001569defm : MTBUF_LoadIntrinsicPat<SItbuffer_load, v3i32, "TBUFFER_LOAD_FORMAT_XYZ">;
David Stuttard70e8bc12017-06-22 16:29:22 +00001570defm : MTBUF_LoadIntrinsicPat<SItbuffer_load, v4i32, "TBUFFER_LOAD_FORMAT_XYZW">;
1571defm : MTBUF_LoadIntrinsicPat<SItbuffer_load, f32, "TBUFFER_LOAD_FORMAT_X">;
1572defm : MTBUF_LoadIntrinsicPat<SItbuffer_load, v2f32, "TBUFFER_LOAD_FORMAT_XY">;
Tim Renouf677387d2019-03-22 14:58:02 +00001573defm : MTBUF_LoadIntrinsicPat<SItbuffer_load, v3f32, "TBUFFER_LOAD_FORMAT_XYZ">;
David Stuttard70e8bc12017-06-22 16:29:22 +00001574defm : MTBUF_LoadIntrinsicPat<SItbuffer_load, v4f32, "TBUFFER_LOAD_FORMAT_XYZW">;
1575
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001576let SubtargetPredicate = HasUnpackedD16VMem in {
Matt Arsenault1349a042018-05-22 06:32:10 +00001577 defm : MTBUF_LoadIntrinsicPat<SItbuffer_load_d16, f16, "TBUFFER_LOAD_FORMAT_D16_X_gfx80">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001578 defm : MTBUF_LoadIntrinsicPat<SItbuffer_load_d16, v2i32, "TBUFFER_LOAD_FORMAT_D16_XY_gfx80">;
1579 defm : MTBUF_LoadIntrinsicPat<SItbuffer_load_d16, v4i32, "TBUFFER_LOAD_FORMAT_D16_XYZW_gfx80">;
1580} // End HasUnpackedD16VMem.
1581
1582let SubtargetPredicate = HasPackedD16VMem in {
Matt Arsenault1349a042018-05-22 06:32:10 +00001583 defm : MTBUF_LoadIntrinsicPat<SItbuffer_load_d16, f16, "TBUFFER_LOAD_FORMAT_D16_X">;
1584 defm : MTBUF_LoadIntrinsicPat<SItbuffer_load_d16, v2f16, "TBUFFER_LOAD_FORMAT_D16_XY">;
Matt Arsenault02dc7e12018-06-15 15:15:46 +00001585 defm : MTBUF_LoadIntrinsicPat<SItbuffer_load_d16, v4f16, "TBUFFER_LOAD_FORMAT_D16_XYZW">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001586} // End HasPackedD16VMem.
1587
David Stuttard70e8bc12017-06-22 16:29:22 +00001588multiclass MTBUF_StoreIntrinsicPat<SDPatternOperator name, ValueType vt,
1589 string opcode> {
Matt Arsenault90c75932017-10-03 00:06:41 +00001590 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001591 (name vt:$vdata, v4i32:$rsrc, 0, 0, i32:$soffset, imm:$offset,
Tim Renouf35484c92018-08-21 11:06:05 +00001592 imm:$format, imm:$cachepolicy, 0),
David Stuttard70e8bc12017-06-22 16:29:22 +00001593 (!cast<MTBUF_Pseudo>(opcode # _OFFSET_exact) $vdata, $rsrc, $soffset,
Tim Renouf35484c92018-08-21 11:06:05 +00001594 (as_i16imm $offset), (as_i8imm $format),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001595 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0, (extract_dlc $cachepolicy))
David Stuttard70e8bc12017-06-22 16:29:22 +00001596 >;
1597
Matt Arsenault90c75932017-10-03 00:06:41 +00001598 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001599 (name vt:$vdata, v4i32:$rsrc, i32:$vindex, 0, i32:$soffset, imm:$offset,
Tim Renouf35484c92018-08-21 11:06:05 +00001600 imm:$format, imm:$cachepolicy, imm),
David Stuttard70e8bc12017-06-22 16:29:22 +00001601 (!cast<MTBUF_Pseudo>(opcode # _IDXEN_exact) $vdata, $vindex, $rsrc, $soffset,
Tim Renouf35484c92018-08-21 11:06:05 +00001602 (as_i16imm $offset), (as_i8imm $format),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001603 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0, (extract_dlc $cachepolicy))
David Stuttard70e8bc12017-06-22 16:29:22 +00001604 >;
1605
Matt Arsenault90c75932017-10-03 00:06:41 +00001606 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001607 (name vt:$vdata, v4i32:$rsrc, 0, i32:$voffset, i32:$soffset, imm:$offset,
Tim Renouf35484c92018-08-21 11:06:05 +00001608 imm:$format, imm:$cachepolicy, 0),
David Stuttard70e8bc12017-06-22 16:29:22 +00001609 (!cast<MTBUF_Pseudo>(opcode # _OFFEN_exact) $vdata, $voffset, $rsrc, $soffset,
Tim Renouf35484c92018-08-21 11:06:05 +00001610 (as_i16imm $offset), (as_i8imm $format),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001611 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0, (extract_dlc $cachepolicy))
David Stuttard70e8bc12017-06-22 16:29:22 +00001612 >;
1613
Matt Arsenault90c75932017-10-03 00:06:41 +00001614 def : GCNPat<
David Stuttard70e8bc12017-06-22 16:29:22 +00001615 (name vt:$vdata, v4i32:$rsrc, i32:$vindex, i32:$voffset, i32:$soffset,
Tim Renouf35484c92018-08-21 11:06:05 +00001616 imm:$offset, imm:$format, imm:$cachepolicy, imm),
David Stuttard70e8bc12017-06-22 16:29:22 +00001617 (!cast<MTBUF_Pseudo>(opcode # _BOTHEN_exact)
1618 $vdata,
1619 (REG_SEQUENCE VReg_64, $vindex, sub0, $voffset, sub1),
Tim Renouf35484c92018-08-21 11:06:05 +00001620 $rsrc, $soffset, (as_i16imm $offset), (as_i8imm $format),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001621 (extract_glc $cachepolicy), (extract_slc $cachepolicy), 0, (extract_dlc $cachepolicy))
David Stuttard70e8bc12017-06-22 16:29:22 +00001622 >;
1623}
1624
1625defm : MTBUF_StoreIntrinsicPat<SItbuffer_store, i32, "TBUFFER_STORE_FORMAT_X">;
1626defm : MTBUF_StoreIntrinsicPat<SItbuffer_store, v2i32, "TBUFFER_STORE_FORMAT_XY">;
Tim Renouf677387d2019-03-22 14:58:02 +00001627defm : MTBUF_StoreIntrinsicPat<SItbuffer_store, v3i32, "TBUFFER_STORE_FORMAT_XYZ">;
David Stuttard70e8bc12017-06-22 16:29:22 +00001628defm : MTBUF_StoreIntrinsicPat<SItbuffer_store, v4i32, "TBUFFER_STORE_FORMAT_XYZW">;
1629defm : MTBUF_StoreIntrinsicPat<SItbuffer_store, f32, "TBUFFER_STORE_FORMAT_X">;
1630defm : MTBUF_StoreIntrinsicPat<SItbuffer_store, v2f32, "TBUFFER_STORE_FORMAT_XY">;
Tim Renouf677387d2019-03-22 14:58:02 +00001631defm : MTBUF_StoreIntrinsicPat<SItbuffer_store, v3f32, "TBUFFER_STORE_FORMAT_XYZ">;
David Stuttard70e8bc12017-06-22 16:29:22 +00001632defm : MTBUF_StoreIntrinsicPat<SItbuffer_store, v4f32, "TBUFFER_STORE_FORMAT_XYZW">;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001633
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001634let SubtargetPredicate = HasUnpackedD16VMem in {
1635 defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_d16, f16, "TBUFFER_STORE_FORMAT_D16_X_gfx80">;
1636 defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_d16, v2i32, "TBUFFER_STORE_FORMAT_D16_XY_gfx80">;
1637 defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_d16, v4i32, "TBUFFER_STORE_FORMAT_D16_XYZW_gfx80">;
1638} // End HasUnpackedD16VMem.
1639
1640let SubtargetPredicate = HasPackedD16VMem in {
1641 defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_d16, f16, "TBUFFER_STORE_FORMAT_D16_X">;
1642 defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_d16, v2f16, "TBUFFER_STORE_FORMAT_D16_XY">;
Matt Arsenault02dc7e12018-06-15 15:15:46 +00001643 defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_d16, v4f16, "TBUFFER_STORE_FORMAT_D16_XYZW">;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00001644} // End HasPackedD16VMem.
1645
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001646//===----------------------------------------------------------------------===//
Stanislav Mekhanoshin7895c032019-04-05 18:24:34 +00001647// Target-specific instruction encodings.
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001648//===----------------------------------------------------------------------===//
1649
1650//===----------------------------------------------------------------------===//
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001651// Base ENC_MUBUF for GFX6, GFX7, GFX10.
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001652//===----------------------------------------------------------------------===//
1653
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001654class Base_MUBUF_Real_gfx6_gfx7_gfx10<bits<7> op, MUBUF_Pseudo ps, int ef> :
1655 MUBUF_Real<ps>, Enc64, SIMCInstr<ps.PseudoInstr, ef> {
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001656 let Inst{11-0} = !if(ps.has_offset, offset, ?);
1657 let Inst{12} = ps.offen;
1658 let Inst{13} = ps.idxen;
1659 let Inst{14} = !if(ps.has_glc, glc, ps.glc_value);
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001660 let Inst{16} = !if(ps.lds, 1, 0);
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001661 let Inst{24-18} = op;
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001662 let Inst{31-26} = 0x38;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001663 let Inst{39-32} = !if(ps.has_vaddr, vaddr, ?);
1664 let Inst{47-40} = !if(ps.has_vdata, vdata, ?);
1665 let Inst{52-48} = !if(ps.has_srsrc, srsrc{6-2}, ?);
1666 let Inst{54} = !if(ps.has_slc, slc, ?);
1667 let Inst{55} = !if(ps.has_tfe, tfe, ?);
1668 let Inst{63-56} = !if(ps.has_soffset, soffset, ?);
1669}
1670
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001671class MUBUF_Real_gfx10<bits<8> op, MUBUF_Pseudo ps> :
1672 Base_MUBUF_Real_gfx6_gfx7_gfx10<op{6-0}, ps, SIEncodingFamily.GFX10> {
1673 let Inst{15} = !if(ps.has_dlc, dlc, ps.dlc_value);
1674 let Inst{25} = op{7};
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001675}
1676
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001677class MUBUF_Real_gfx6_gfx7<bits<8> op, MUBUF_Pseudo ps> :
1678 Base_MUBUF_Real_gfx6_gfx7_gfx10<op{6-0}, ps, SIEncodingFamily.SI> {
1679 let Inst{15} = ps.addr64;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00001680}
1681
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001682//===----------------------------------------------------------------------===//
1683// MUBUF - GFX10.
1684//===----------------------------------------------------------------------===//
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001685
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001686let AssemblerPredicate = isGFX10Plus, DecoderNamespace = "GFX10" in {
1687 multiclass MUBUF_Real_gfx10_with_name<bits<8> op, string opName,
1688 string asmName> {
1689 def _gfx10 : MUBUF_Real_gfx10<op, !cast<MUBUF_Pseudo>(opName)> {
1690 MUBUF_Pseudo ps = !cast<MUBUF_Pseudo>(opName);
1691 let AsmString = asmName # ps.AsmOperands;
1692 }
1693 }
1694 multiclass MUBUF_Real_AllAddr_gfx10<bits<8> op> {
1695 def _BOTHEN_gfx10 :
1696 MUBUF_Real_gfx10<op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN")>;
1697 def _IDXEN_gfx10 :
1698 MUBUF_Real_gfx10<op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN")>;
1699 def _OFFEN_gfx10 :
1700 MUBUF_Real_gfx10<op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN")>;
1701 def _OFFSET_gfx10 :
1702 MUBUF_Real_gfx10<op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET")>;
1703 }
1704 multiclass MUBUF_Real_AllAddr_Lds_gfx10<bits<8> op> {
1705 def _OFFSET_gfx10 : MUBUF_Real_gfx10<op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET")>,
1706 MUBUFLdsTable<0, NAME # "_OFFSET_gfx10">;
1707 def _OFFEN_gfx10 : MUBUF_Real_gfx10<op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN")>,
1708 MUBUFLdsTable<0, NAME # "_OFFEN_gfx10">;
1709 def _IDXEN_gfx10 : MUBUF_Real_gfx10<op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN")>,
1710 MUBUFLdsTable<0, NAME # "_IDXEN_gfx10">;
1711 def _BOTHEN_gfx10 : MUBUF_Real_gfx10<op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN")>,
1712 MUBUFLdsTable<0, NAME # "_BOTHEN_gfx10">;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001713
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001714 def _LDS_OFFSET_gfx10 : MUBUF_Real_gfx10<op, !cast<MUBUF_Pseudo>(NAME#"_LDS_OFFSET")>,
1715 MUBUFLdsTable<1, NAME # "_OFFSET_gfx10">;
1716 def _LDS_OFFEN_gfx10 : MUBUF_Real_gfx10<op, !cast<MUBUF_Pseudo>(NAME#"_LDS_OFFEN")>,
1717 MUBUFLdsTable<1, NAME # "_OFFEN_gfx10">;
1718 def _LDS_IDXEN_gfx10 : MUBUF_Real_gfx10<op, !cast<MUBUF_Pseudo>(NAME#"_LDS_IDXEN")>,
1719 MUBUFLdsTable<1, NAME # "_IDXEN_gfx10">;
1720 def _LDS_BOTHEN_gfx10 : MUBUF_Real_gfx10<op, !cast<MUBUF_Pseudo>(NAME#"_LDS_BOTHEN")>,
1721 MUBUFLdsTable<1, NAME # "_BOTHEN_gfx10">;
1722 }
1723 multiclass MUBUF_Real_Atomics_gfx10<bits<8> op> :
1724 MUBUF_Real_AllAddr_gfx10<op> {
1725 def _BOTHEN_RTN_gfx10 :
1726 MUBUF_Real_gfx10<op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN_RTN")>;
1727 def _IDXEN_RTN_gfx10 :
1728 MUBUF_Real_gfx10<op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN_RTN")>;
1729 def _OFFEN_RTN_gfx10 :
1730 MUBUF_Real_gfx10<op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN_RTN")>;
1731 def _OFFSET_RTN_gfx10 :
1732 MUBUF_Real_gfx10<op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET_RTN")>;
1733 }
1734} // End AssemblerPredicate = isGFX10Plus, DecoderNamespace = "GFX10"
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001735
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001736defm BUFFER_STORE_BYTE_D16_HI : MUBUF_Real_AllAddr_gfx10<0x019>;
1737defm BUFFER_STORE_SHORT_D16_HI : MUBUF_Real_AllAddr_gfx10<0x01b>;
1738defm BUFFER_LOAD_UBYTE_D16 : MUBUF_Real_AllAddr_gfx10<0x020>;
1739defm BUFFER_LOAD_UBYTE_D16_HI : MUBUF_Real_AllAddr_gfx10<0x021>;
1740defm BUFFER_LOAD_SBYTE_D16 : MUBUF_Real_AllAddr_gfx10<0x022>;
1741defm BUFFER_LOAD_SBYTE_D16_HI : MUBUF_Real_AllAddr_gfx10<0x023>;
1742defm BUFFER_LOAD_SHORT_D16 : MUBUF_Real_AllAddr_gfx10<0x024>;
1743defm BUFFER_LOAD_SHORT_D16_HI : MUBUF_Real_AllAddr_gfx10<0x025>;
1744// FIXME-GFX10: Add following instructions:
1745//defm BUFFER_LOAD_FORMAT_D16_HI_X : MUBUF_Real_AllAddr_gfx10<0x026>;
1746//defm BUFFER_STORE_FORMAT_D16_HI_X : MUBUF_Real_AllAddr_gfx10<0x027>;
1747defm BUFFER_LOAD_FORMAT_D16_X : MUBUF_Real_AllAddr_gfx10<0x080>;
1748defm BUFFER_LOAD_FORMAT_D16_XY : MUBUF_Real_AllAddr_gfx10<0x081>;
1749defm BUFFER_LOAD_FORMAT_D16_XYZ : MUBUF_Real_AllAddr_gfx10<0x082>;
1750defm BUFFER_LOAD_FORMAT_D16_XYZW : MUBUF_Real_AllAddr_gfx10<0x083>;
1751defm BUFFER_STORE_FORMAT_D16_X : MUBUF_Real_AllAddr_gfx10<0x084>;
1752defm BUFFER_STORE_FORMAT_D16_XY : MUBUF_Real_AllAddr_gfx10<0x085>;
1753defm BUFFER_STORE_FORMAT_D16_XYZ : MUBUF_Real_AllAddr_gfx10<0x086>;
1754defm BUFFER_STORE_FORMAT_D16_XYZW : MUBUF_Real_AllAddr_gfx10<0x087>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001755
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001756def BUFFER_GL0_INV_gfx10 :
1757 MUBUF_Real_gfx10<0x071, BUFFER_GL0_INV>;
1758def BUFFER_GL1_INV_gfx10 :
1759 MUBUF_Real_gfx10<0x072, BUFFER_GL1_INV>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001760
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001761//===----------------------------------------------------------------------===//
1762// MUBUF - GFX6, GFX7, GFX10.
1763//===----------------------------------------------------------------------===//
Valery Pykhtinfbf2d932016-09-23 21:21:21 +00001764
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001765let AssemblerPredicate = isGFX6, DecoderNamespace = "GFX6" in {
1766 multiclass MUBUF_Real_gfx6<bits<8> op> {
1767 def _gfx6 : MUBUF_Real_gfx6_gfx7<op, !cast<MUBUF_Pseudo>(NAME)>;
1768 }
1769} // End AssemblerPredicate = isGFX6, DecoderNamespace = "GFX6"
1770
1771let AssemblerPredicate = isGFX7Only, DecoderNamespace = "GFX7" in {
1772 multiclass MUBUF_Real_gfx7<bits<8> op> {
1773 def _gfx7 : MUBUF_Real_gfx6_gfx7<op, !cast<MUBUF_Pseudo>(NAME)>;
1774 }
1775} // End AssemblerPredicate = isGFX7Only, DecoderNamespace = "GFX7"
1776
1777let AssemblerPredicate = isGFX6GFX7, DecoderNamespace = "GFX6GFX7" in {
1778 multiclass MUBUF_Real_AllAddr_gfx6_gfx7<bits<8> op> {
1779 def _ADDR64_gfx6_gfx7 :
1780 MUBUF_Real_gfx6_gfx7<op, !cast<MUBUF_Pseudo>(NAME#"_ADDR64")>;
1781 def _BOTHEN_gfx6_gfx7 :
1782 MUBUF_Real_gfx6_gfx7<op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN")>;
1783 def _IDXEN_gfx6_gfx7 :
1784 MUBUF_Real_gfx6_gfx7<op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN")>;
1785 def _OFFEN_gfx6_gfx7 :
1786 MUBUF_Real_gfx6_gfx7<op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN")>;
1787 def _OFFSET_gfx6_gfx7 :
1788 MUBUF_Real_gfx6_gfx7<op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET")>;
1789 }
1790 multiclass MUBUF_Real_AllAddr_Lds_gfx6_gfx7<bits<8> op> {
1791 def _OFFSET_gfx6_gfx7 : MUBUF_Real_gfx6_gfx7<op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET")>,
1792 MUBUFLdsTable<0, NAME # "_OFFSET_gfx6_gfx7">;
1793 def _ADDR64_gfx6_gfx7 : MUBUF_Real_gfx6_gfx7<op, !cast<MUBUF_Pseudo>(NAME#"_ADDR64")>,
1794 MUBUFLdsTable<0, NAME # "_ADDR64_gfx6_gfx7">;
1795 def _OFFEN_gfx6_gfx7 : MUBUF_Real_gfx6_gfx7<op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN")>,
1796 MUBUFLdsTable<0, NAME # "_OFFEN_gfx6_gfx7">;
1797 def _IDXEN_gfx6_gfx7 : MUBUF_Real_gfx6_gfx7<op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN")>,
1798 MUBUFLdsTable<0, NAME # "_IDXEN_gfx6_gfx7">;
1799 def _BOTHEN_gfx6_gfx7 : MUBUF_Real_gfx6_gfx7<op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN")>,
1800 MUBUFLdsTable<0, NAME # "_BOTHEN_gfx6_gfx7">;
1801
1802 def _LDS_OFFSET_gfx6_gfx7 : MUBUF_Real_gfx6_gfx7<op, !cast<MUBUF_Pseudo>(NAME#"_LDS_OFFSET")>,
1803 MUBUFLdsTable<1, NAME # "_OFFSET_gfx6_gfx7">;
1804 def _LDS_ADDR64_gfx6_gfx7 : MUBUF_Real_gfx6_gfx7<op, !cast<MUBUF_Pseudo>(NAME#"_LDS_ADDR64")>,
1805 MUBUFLdsTable<1, NAME # "_ADDR64_gfx6_gfx7">;
1806 def _LDS_OFFEN_gfx6_gfx7 : MUBUF_Real_gfx6_gfx7<op, !cast<MUBUF_Pseudo>(NAME#"_LDS_OFFEN")>,
1807 MUBUFLdsTable<1, NAME # "_OFFEN_gfx6_gfx7">;
1808 def _LDS_IDXEN_gfx6_gfx7 : MUBUF_Real_gfx6_gfx7<op, !cast<MUBUF_Pseudo>(NAME#"_LDS_IDXEN")>,
1809 MUBUFLdsTable<1, NAME # "_IDXEN_gfx6_gfx7">;
1810 def _LDS_BOTHEN_gfx6_gfx7 : MUBUF_Real_gfx6_gfx7<op, !cast<MUBUF_Pseudo>(NAME#"_LDS_BOTHEN")>,
1811 MUBUFLdsTable<1, NAME # "_BOTHEN_gfx6_gfx7">;
1812 }
1813 multiclass MUBUF_Real_Atomics_gfx6_gfx7<bits<8> op> :
1814 MUBUF_Real_AllAddr_gfx6_gfx7<op> {
1815 def _ADDR64_RTN_gfx6_gfx7 :
1816 MUBUF_Real_gfx6_gfx7<op, !cast<MUBUF_Pseudo>(NAME#"_ADDR64_RTN")>;
1817 def _BOTHEN_RTN_gfx6_gfx7 :
1818 MUBUF_Real_gfx6_gfx7<op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN_RTN")>;
1819 def _IDXEN_RTN_gfx6_gfx7 :
1820 MUBUF_Real_gfx6_gfx7<op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN_RTN")>;
1821 def _OFFEN_RTN_gfx6_gfx7 :
1822 MUBUF_Real_gfx6_gfx7<op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN_RTN")>;
1823 def _OFFSET_RTN_gfx6_gfx7 :
1824 MUBUF_Real_gfx6_gfx7<op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET_RTN")>;
1825 }
1826} // End AssemblerPredicate = isGFX6GFX7, DecoderNamespace = "GFX6GFX7"
1827
1828multiclass MUBUF_Real_AllAddr_gfx6_gfx7_gfx10<bits<8> op> :
1829 MUBUF_Real_AllAddr_gfx6_gfx7<op>, MUBUF_Real_AllAddr_gfx10<op>;
1830
1831multiclass MUBUF_Real_AllAddr_Lds_gfx6_gfx7_gfx10<bits<8> op> :
1832 MUBUF_Real_AllAddr_Lds_gfx6_gfx7<op>, MUBUF_Real_AllAddr_Lds_gfx10<op>;
1833
1834multiclass MUBUF_Real_Atomics_gfx6_gfx7_gfx10<bits<8> op> :
1835 MUBUF_Real_Atomics_gfx6_gfx7<op>, MUBUF_Real_Atomics_gfx10<op>;
1836
1837// FIXME-GFX6: Following instructions are available only on GFX6.
1838//defm BUFFER_ATOMIC_RSUB : MUBUF_Real_Atomics_gfx6 <0x034>;
1839//defm BUFFER_ATOMIC_RSUB_X2 : MUBUF_Real_Atomics_gfx6 <0x054>;
1840
1841defm BUFFER_LOAD_FORMAT_X : MUBUF_Real_AllAddr_Lds_gfx6_gfx7_gfx10<0x000>;
1842defm BUFFER_LOAD_FORMAT_XY : MUBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x001>;
1843defm BUFFER_LOAD_FORMAT_XYZ : MUBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x002>;
1844defm BUFFER_LOAD_FORMAT_XYZW : MUBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x003>;
1845defm BUFFER_STORE_FORMAT_X : MUBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x004>;
1846defm BUFFER_STORE_FORMAT_XY : MUBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x005>;
1847defm BUFFER_STORE_FORMAT_XYZ : MUBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x006>;
1848defm BUFFER_STORE_FORMAT_XYZW : MUBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x007>;
1849defm BUFFER_LOAD_UBYTE : MUBUF_Real_AllAddr_Lds_gfx6_gfx7_gfx10<0x008>;
1850defm BUFFER_LOAD_SBYTE : MUBUF_Real_AllAddr_Lds_gfx6_gfx7_gfx10<0x009>;
1851defm BUFFER_LOAD_USHORT : MUBUF_Real_AllAddr_Lds_gfx6_gfx7_gfx10<0x00a>;
1852defm BUFFER_LOAD_SSHORT : MUBUF_Real_AllAddr_Lds_gfx6_gfx7_gfx10<0x00b>;
1853defm BUFFER_LOAD_DWORD : MUBUF_Real_AllAddr_Lds_gfx6_gfx7_gfx10<0x00c>;
1854defm BUFFER_LOAD_DWORDX2 : MUBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x00d>;
1855defm BUFFER_LOAD_DWORDX4 : MUBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x00e>;
1856defm BUFFER_LOAD_DWORDX3 : MUBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x00f>;
1857defm BUFFER_STORE_BYTE : MUBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x018>;
1858defm BUFFER_STORE_SHORT : MUBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x01a>;
1859defm BUFFER_STORE_DWORD : MUBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x01c>;
1860defm BUFFER_STORE_DWORDX2 : MUBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x01d>;
1861defm BUFFER_STORE_DWORDX4 : MUBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x01e>;
1862defm BUFFER_STORE_DWORDX3 : MUBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x01f>;
1863
1864defm BUFFER_ATOMIC_SWAP : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x030>;
1865defm BUFFER_ATOMIC_CMPSWAP : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x031>;
1866defm BUFFER_ATOMIC_ADD : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x032>;
1867defm BUFFER_ATOMIC_SUB : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x033>;
1868defm BUFFER_ATOMIC_SMIN : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x035>;
1869defm BUFFER_ATOMIC_UMIN : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x036>;
1870defm BUFFER_ATOMIC_SMAX : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x037>;
1871defm BUFFER_ATOMIC_UMAX : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x038>;
1872defm BUFFER_ATOMIC_AND : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x039>;
1873defm BUFFER_ATOMIC_OR : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x03a>;
1874defm BUFFER_ATOMIC_XOR : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x03b>;
1875defm BUFFER_ATOMIC_INC : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x03c>;
1876defm BUFFER_ATOMIC_DEC : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x03d>;
1877// FIXME-GFX6-GFX7-GFX10: Add following instructions:
1878//defm BUFFER_ATOMIC_FCMPSWAP : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x03e>;
1879//defm BUFFER_ATOMIC_FMIN : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x03f>;
1880//defm BUFFER_ATOMIC_FMAX : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x040>;
1881defm BUFFER_ATOMIC_SWAP_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x050>;
1882defm BUFFER_ATOMIC_CMPSWAP_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x051>;
1883defm BUFFER_ATOMIC_ADD_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x052>;
1884defm BUFFER_ATOMIC_SUB_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x053>;
1885defm BUFFER_ATOMIC_SMIN_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x055>;
1886defm BUFFER_ATOMIC_UMIN_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x056>;
1887defm BUFFER_ATOMIC_SMAX_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x057>;
1888defm BUFFER_ATOMIC_UMAX_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x058>;
1889defm BUFFER_ATOMIC_AND_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x059>;
1890defm BUFFER_ATOMIC_OR_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x05a>;
1891defm BUFFER_ATOMIC_XOR_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x05b>;
1892defm BUFFER_ATOMIC_INC_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x05c>;
1893defm BUFFER_ATOMIC_DEC_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x05d>;
1894// FIXME-GFX7: Need to handle hazard for BUFFER_ATOMIC_FCMPSWAP_X2 on GFX7.
1895// FIXME-GFX6-GFX7-GFX10: Add following instructions:
1896//defm BUFFER_ATOMIC_FCMPSWAP_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x05e>;
1897//defm BUFFER_ATOMIC_FMIN_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x05f>;
1898//defm BUFFER_ATOMIC_FMAX_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x060>;
1899
1900defm BUFFER_WBINVL1_SC : MUBUF_Real_gfx6<0x070>;
1901defm BUFFER_WBINVL1_VOL : MUBUF_Real_gfx7<0x070>;
1902def BUFFER_WBINVL1_gfx6_gfx7 : MUBUF_Real_gfx6_gfx7<0x071, BUFFER_WBINVL1>;
1903
1904//===----------------------------------------------------------------------===//
1905// Base ENC_MTBUF for GFX6, GFX7, GFX10.
1906//===----------------------------------------------------------------------===//
1907
1908class Base_MTBUF_Real_gfx6_gfx7_gfx10<bits<3> op, MTBUF_Pseudo ps, int ef> :
1909 MTBUF_Real<ps>, Enc64, SIMCInstr<ps.PseudoInstr, ef> {
David Stuttard70e8bc12017-06-22 16:29:22 +00001910 let Inst{11-0} = !if(ps.has_offset, offset, ?);
1911 let Inst{12} = ps.offen;
1912 let Inst{13} = ps.idxen;
1913 let Inst{14} = !if(ps.has_glc, glc, ps.glc_value);
Valery Pykhtinfbf2d932016-09-23 21:21:21 +00001914 let Inst{18-16} = op;
David Stuttard70e8bc12017-06-22 16:29:22 +00001915 let Inst{31-26} = 0x3a; //encoding
1916 let Inst{39-32} = !if(ps.has_vaddr, vaddr, ?);
1917 let Inst{47-40} = !if(ps.has_vdata, vdata, ?);
1918 let Inst{52-48} = !if(ps.has_srsrc, srsrc{6-2}, ?);
1919 let Inst{54} = !if(ps.has_slc, slc, ?);
1920 let Inst{55} = !if(ps.has_tfe, tfe, ?);
1921 let Inst{63-56} = !if(ps.has_soffset, soffset, ?);
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001922}
1923
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001924//===----------------------------------------------------------------------===//
1925// MTBUF - GFX10.
1926//===----------------------------------------------------------------------===//
1927
1928class MTBUF_Real_gfx10<bits<4> op, MTBUF_Pseudo ps> :
1929 Base_MTBUF_Real_gfx6_gfx7_gfx10<op{2-0}, ps, SIEncodingFamily.GFX10> {
1930 let Inst{15} = !if(ps.has_dlc, dlc, ps.dlc_value);
1931 let Inst{25-19} = format;
1932 let Inst{53} = op{3};
David Stuttard70e8bc12017-06-22 16:29:22 +00001933}
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001934
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001935let AssemblerPredicate = isGFX10Plus, DecoderNamespace = "GFX10" in {
1936 multiclass MTBUF_Real_AllAddr_gfx10<bits<4> op> {
1937 def _BOTHEN_gfx10 :
1938 MTBUF_Real_gfx10<op, !cast<MTBUF_Pseudo>(NAME#"_BOTHEN")>;
1939 def _IDXEN_gfx10 :
1940 MTBUF_Real_gfx10<op, !cast<MTBUF_Pseudo>(NAME#"_IDXEN")>;
1941 def _OFFEN_gfx10 :
1942 MTBUF_Real_gfx10<op, !cast<MTBUF_Pseudo>(NAME#"_OFFEN")>;
1943 def _OFFSET_gfx10 :
1944 MTBUF_Real_gfx10<op, !cast<MTBUF_Pseudo>(NAME#"_OFFSET")>;
1945 }
1946} // End AssemblerPredicate = isGFX10Plus, DecoderNamespace = "GFX10"
1947
1948defm TBUFFER_LOAD_FORMAT_D16_X : MTBUF_Real_AllAddr_gfx10<0x008>;
1949defm TBUFFER_LOAD_FORMAT_D16_XY : MTBUF_Real_AllAddr_gfx10<0x009>;
1950defm TBUFFER_LOAD_FORMAT_D16_XYZ : MTBUF_Real_AllAddr_gfx10<0x00a>;
1951defm TBUFFER_LOAD_FORMAT_D16_XYZW : MTBUF_Real_AllAddr_gfx10<0x00b>;
1952defm TBUFFER_STORE_FORMAT_D16_X : MTBUF_Real_AllAddr_gfx10<0x00c>;
1953defm TBUFFER_STORE_FORMAT_D16_XY : MTBUF_Real_AllAddr_gfx10<0x00d>;
1954defm TBUFFER_STORE_FORMAT_D16_XYZ : MTBUF_Real_AllAddr_gfx10<0x00e>;
1955defm TBUFFER_STORE_FORMAT_D16_XYZW : MTBUF_Real_AllAddr_gfx10<0x00f>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001956
1957//===----------------------------------------------------------------------===//
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001958// MTBUF - GFX6, GFX7, GFX10.
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001959//===----------------------------------------------------------------------===//
1960
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001961class MTBUF_Real_gfx6_gfx7<bits<4> op, MTBUF_Pseudo ps> :
1962 Base_MTBUF_Real_gfx6_gfx7_gfx10<op{2-0}, ps, SIEncodingFamily.SI> {
1963 let Inst{15} = ps.addr64;
1964 let Inst{22-19} = dfmt;
1965 let Inst{25-23} = nfmt;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001966}
1967
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001968let AssemblerPredicate = isGFX6GFX7, DecoderNamespace = "GFX6GFX7" in {
1969 multiclass MTBUF_Real_AllAddr_gfx6_gfx7<bits<4> op> {
1970 def _ADDR64_gfx6_gfx7 :
1971 MTBUF_Real_gfx6_gfx7<op, !cast<MTBUF_Pseudo>(NAME#"_ADDR64")>;
1972 def _BOTHEN_gfx6_gfx7 :
1973 MTBUF_Real_gfx6_gfx7<op, !cast<MTBUF_Pseudo>(NAME#"_BOTHEN")>;
1974 def _IDXEN_gfx6_gfx7 :
1975 MTBUF_Real_gfx6_gfx7<op, !cast<MTBUF_Pseudo>(NAME#"_IDXEN")>;
1976 def _OFFEN_gfx6_gfx7 :
1977 MTBUF_Real_gfx6_gfx7<op, !cast<MTBUF_Pseudo>(NAME#"_OFFEN")>;
1978 def _OFFSET_gfx6_gfx7 :
1979 MTBUF_Real_gfx6_gfx7<op, !cast<MTBUF_Pseudo>(NAME#"_OFFSET")>;
1980 }
1981} // End AssemblerPredicate = isGFX6GFX7, DecoderNamespace = "GFX6GFX7"
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001982
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001983multiclass MTBUF_Real_AllAddr_gfx6_gfx7_gfx10<bits<4> op> :
1984 MTBUF_Real_AllAddr_gfx6_gfx7<op>, MTBUF_Real_AllAddr_gfx10<op>;
1985
1986defm TBUFFER_LOAD_FORMAT_X : MTBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x000>;
1987defm TBUFFER_LOAD_FORMAT_XY : MTBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x001>;
1988defm TBUFFER_LOAD_FORMAT_XYZ : MTBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x002>;
1989defm TBUFFER_LOAD_FORMAT_XYZW : MTBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x003>;
1990defm TBUFFER_STORE_FORMAT_X : MTBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x004>;
1991defm TBUFFER_STORE_FORMAT_XY : MTBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x005>;
1992defm TBUFFER_STORE_FORMAT_XYZ : MTBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x006>;
1993defm TBUFFER_STORE_FORMAT_XYZW : MTBUF_Real_AllAddr_gfx6_gfx7_gfx10<0x007>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001994
1995//===----------------------------------------------------------------------===//
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001996// GFX8, GFX9 (VI).
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00001997//===----------------------------------------------------------------------===//
1998
1999class MUBUF_Real_vi <bits<7> op, MUBUF_Pseudo ps> :
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00002000 MUBUF_Real<ps>,
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00002001 Enc64,
2002 SIMCInstr<ps.PseudoInstr, SIEncodingFamily.VI> {
Stanislav Mekhanoshin51823022019-04-06 09:20:48 +00002003 let AssemblerPredicate = isGFX8GFX9;
2004 let DecoderNamespace = "GFX8";
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00002005
2006 let Inst{11-0} = !if(ps.has_offset, offset, ?);
2007 let Inst{12} = ps.offen;
2008 let Inst{13} = ps.idxen;
2009 let Inst{14} = !if(ps.has_glc, glc, ps.glc_value);
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00002010 let Inst{16} = !if(ps.lds, 1, 0);
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00002011 let Inst{17} = !if(ps.has_slc, slc, ?);
2012 let Inst{24-18} = op;
2013 let Inst{31-26} = 0x38; //encoding
2014 let Inst{39-32} = !if(ps.has_vaddr, vaddr, ?);
2015 let Inst{47-40} = !if(ps.has_vdata, vdata, ?);
2016 let Inst{52-48} = !if(ps.has_srsrc, srsrc{6-2}, ?);
2017 let Inst{55} = !if(ps.has_tfe, tfe, ?);
2018 let Inst{63-56} = !if(ps.has_soffset, soffset, ?);
2019}
2020
2021multiclass MUBUF_Real_AllAddr_vi<bits<7> op> {
2022 def _OFFSET_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET")>;
2023 def _OFFEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN")>;
2024 def _IDXEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN")>;
2025 def _BOTHEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN")>;
2026}
2027
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00002028multiclass MUBUF_Real_AllAddr_Lds_vi<bits<7> op> {
2029
2030 def _OFFSET_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00002031 MUBUFLdsTable<0, NAME # "_OFFSET_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00002032 def _OFFEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00002033 MUBUFLdsTable<0, NAME # "_OFFEN_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00002034 def _IDXEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00002035 MUBUFLdsTable<0, NAME # "_IDXEN_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00002036 def _BOTHEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00002037 MUBUFLdsTable<0, NAME # "_BOTHEN_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00002038
2039 def _LDS_OFFSET_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_LDS_OFFSET")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00002040 MUBUFLdsTable<1, NAME # "_OFFSET_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00002041 def _LDS_OFFEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_LDS_OFFEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00002042 MUBUFLdsTable<1, NAME # "_OFFEN_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00002043 def _LDS_IDXEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_LDS_IDXEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00002044 MUBUFLdsTable<1, NAME # "_IDXEN_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00002045 def _LDS_BOTHEN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_LDS_BOTHEN")>,
Nicolai Haehnle01d261f2018-06-04 14:26:05 +00002046 MUBUFLdsTable<1, NAME # "_BOTHEN_vi">;
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00002047}
2048
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00002049class MUBUF_Real_gfx80 <bits<7> op, MUBUF_Pseudo ps> :
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00002050 MUBUF_Real<ps>,
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00002051 Enc64,
2052 SIMCInstr<ps.PseudoInstr, SIEncodingFamily.GFX80> {
2053 let AssemblerPredicate=HasUnpackedD16VMem;
2054 let DecoderNamespace="GFX80_UNPACKED";
2055
2056 let Inst{11-0} = !if(ps.has_offset, offset, ?);
2057 let Inst{12} = ps.offen;
2058 let Inst{13} = ps.idxen;
2059 let Inst{14} = !if(ps.has_glc, glc, ps.glc_value);
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00002060 let Inst{16} = !if(ps.lds, 1, 0);
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00002061 let Inst{17} = !if(ps.has_slc, slc, ?);
2062 let Inst{24-18} = op;
2063 let Inst{31-26} = 0x38; //encoding
2064 let Inst{39-32} = !if(ps.has_vaddr, vaddr, ?);
2065 let Inst{47-40} = !if(ps.has_vdata, vdata, ?);
2066 let Inst{52-48} = !if(ps.has_srsrc, srsrc{6-2}, ?);
2067 let Inst{55} = !if(ps.has_tfe, tfe, ?);
2068 let Inst{63-56} = !if(ps.has_soffset, soffset, ?);
2069}
2070
2071multiclass MUBUF_Real_AllAddr_gfx80<bits<7> op> {
Changpeng Fangba6240c2018-01-18 22:57:57 +00002072 def _OFFSET_gfx80 : MUBUF_Real_gfx80 <op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET")>;
2073 def _OFFEN_gfx80 : MUBUF_Real_gfx80 <op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN")>;
2074 def _IDXEN_gfx80 : MUBUF_Real_gfx80 <op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN")>;
2075 def _BOTHEN_gfx80 : MUBUF_Real_gfx80 <op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN")>;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00002076}
2077
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00002078multiclass MUBUF_Real_Atomic_vi<bits<7> op> :
2079 MUBUF_Real_AllAddr_vi<op> {
Matt Arsenaulte5456ce2017-07-20 21:06:04 +00002080 def _OFFSET_RTN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_OFFSET_RTN")>;
2081 def _OFFEN_RTN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_OFFEN_RTN")>;
2082 def _IDXEN_RTN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_IDXEN_RTN")>;
2083 def _BOTHEN_RTN_vi : MUBUF_Real_vi <op, !cast<MUBUF_Pseudo>(NAME#"_BOTHEN_RTN")>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00002084}
2085
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00002086defm BUFFER_LOAD_FORMAT_X : MUBUF_Real_AllAddr_Lds_vi <0x00>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00002087defm BUFFER_LOAD_FORMAT_XY : MUBUF_Real_AllAddr_vi <0x01>;
2088defm BUFFER_LOAD_FORMAT_XYZ : MUBUF_Real_AllAddr_vi <0x02>;
2089defm BUFFER_LOAD_FORMAT_XYZW : MUBUF_Real_AllAddr_vi <0x03>;
2090defm BUFFER_STORE_FORMAT_X : MUBUF_Real_AllAddr_vi <0x04>;
2091defm BUFFER_STORE_FORMAT_XY : MUBUF_Real_AllAddr_vi <0x05>;
2092defm BUFFER_STORE_FORMAT_XYZ : MUBUF_Real_AllAddr_vi <0x06>;
2093defm BUFFER_STORE_FORMAT_XYZW : MUBUF_Real_AllAddr_vi <0x07>;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00002094let SubtargetPredicate = HasUnpackedD16VMem in {
2095 defm BUFFER_LOAD_FORMAT_D16_X_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x08>;
2096 defm BUFFER_LOAD_FORMAT_D16_XY_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x09>;
2097 defm BUFFER_LOAD_FORMAT_D16_XYZ_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x0a>;
2098 defm BUFFER_LOAD_FORMAT_D16_XYZW_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x0b>;
2099 defm BUFFER_STORE_FORMAT_D16_X_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x0c>;
2100 defm BUFFER_STORE_FORMAT_D16_XY_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x0d>;
2101 defm BUFFER_STORE_FORMAT_D16_XYZ_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x0e>;
2102 defm BUFFER_STORE_FORMAT_D16_XYZW_gfx80 : MUBUF_Real_AllAddr_gfx80 <0x0f>;
2103} // End HasUnpackedD16VMem.
2104let SubtargetPredicate = HasPackedD16VMem in {
2105 defm BUFFER_LOAD_FORMAT_D16_X : MUBUF_Real_AllAddr_vi <0x08>;
2106 defm BUFFER_LOAD_FORMAT_D16_XY : MUBUF_Real_AllAddr_vi <0x09>;
2107 defm BUFFER_LOAD_FORMAT_D16_XYZ : MUBUF_Real_AllAddr_vi <0x0a>;
2108 defm BUFFER_LOAD_FORMAT_D16_XYZW : MUBUF_Real_AllAddr_vi <0x0b>;
2109 defm BUFFER_STORE_FORMAT_D16_X : MUBUF_Real_AllAddr_vi <0x0c>;
2110 defm BUFFER_STORE_FORMAT_D16_XY : MUBUF_Real_AllAddr_vi <0x0d>;
2111 defm BUFFER_STORE_FORMAT_D16_XYZ : MUBUF_Real_AllAddr_vi <0x0e>;
2112 defm BUFFER_STORE_FORMAT_D16_XYZW : MUBUF_Real_AllAddr_vi <0x0f>;
2113} // End HasPackedD16VMem.
Dmitry Preobrazhenskyd6e1a942018-02-21 13:13:48 +00002114defm BUFFER_LOAD_UBYTE : MUBUF_Real_AllAddr_Lds_vi <0x10>;
2115defm BUFFER_LOAD_SBYTE : MUBUF_Real_AllAddr_Lds_vi <0x11>;
2116defm BUFFER_LOAD_USHORT : MUBUF_Real_AllAddr_Lds_vi <0x12>;
2117defm BUFFER_LOAD_SSHORT : MUBUF_Real_AllAddr_Lds_vi <0x13>;
2118defm BUFFER_LOAD_DWORD : MUBUF_Real_AllAddr_Lds_vi <0x14>;
Dmitry Preobrazhenskyffbee7a2018-06-13 15:32:46 +00002119defm BUFFER_LOAD_DWORDX2 : MUBUF_Real_AllAddr_Lds_vi <0x15>;
2120defm BUFFER_LOAD_DWORDX3 : MUBUF_Real_AllAddr_Lds_vi <0x16>;
2121defm BUFFER_LOAD_DWORDX4 : MUBUF_Real_AllAddr_Lds_vi <0x17>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00002122defm BUFFER_STORE_BYTE : MUBUF_Real_AllAddr_vi <0x18>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00002123defm BUFFER_STORE_BYTE_D16_HI : MUBUF_Real_AllAddr_vi <0x19>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00002124defm BUFFER_STORE_SHORT : MUBUF_Real_AllAddr_vi <0x1a>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00002125defm BUFFER_STORE_SHORT_D16_HI : MUBUF_Real_AllAddr_vi <0x1b>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00002126defm BUFFER_STORE_DWORD : MUBUF_Real_AllAddr_vi <0x1c>;
2127defm BUFFER_STORE_DWORDX2 : MUBUF_Real_AllAddr_vi <0x1d>;
Artem Tamazov73f1ab22016-10-07 15:53:16 +00002128defm BUFFER_STORE_DWORDX3 : MUBUF_Real_AllAddr_vi <0x1e>;
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00002129defm BUFFER_STORE_DWORDX4 : MUBUF_Real_AllAddr_vi <0x1f>;
2130
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00002131defm BUFFER_LOAD_UBYTE_D16 : MUBUF_Real_AllAddr_vi <0x20>;
2132defm BUFFER_LOAD_UBYTE_D16_HI : MUBUF_Real_AllAddr_vi <0x21>;
2133defm BUFFER_LOAD_SBYTE_D16 : MUBUF_Real_AllAddr_vi <0x22>;
2134defm BUFFER_LOAD_SBYTE_D16_HI : MUBUF_Real_AllAddr_vi <0x23>;
2135defm BUFFER_LOAD_SHORT_D16 : MUBUF_Real_AllAddr_vi <0x24>;
2136defm BUFFER_LOAD_SHORT_D16_HI : MUBUF_Real_AllAddr_vi <0x25>;
2137
Dmitry Preobrazhenskya917e882018-03-28 14:53:13 +00002138defm BUFFER_LOAD_FORMAT_D16_HI_X : MUBUF_Real_AllAddr_vi <0x26>;
2139defm BUFFER_STORE_FORMAT_D16_HI_X : MUBUF_Real_AllAddr_vi <0x27>;
2140
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00002141defm BUFFER_ATOMIC_SWAP : MUBUF_Real_Atomic_vi <0x40>;
2142defm BUFFER_ATOMIC_CMPSWAP : MUBUF_Real_Atomic_vi <0x41>;
2143defm BUFFER_ATOMIC_ADD : MUBUF_Real_Atomic_vi <0x42>;
2144defm BUFFER_ATOMIC_SUB : MUBUF_Real_Atomic_vi <0x43>;
2145defm BUFFER_ATOMIC_SMIN : MUBUF_Real_Atomic_vi <0x44>;
2146defm BUFFER_ATOMIC_UMIN : MUBUF_Real_Atomic_vi <0x45>;
2147defm BUFFER_ATOMIC_SMAX : MUBUF_Real_Atomic_vi <0x46>;
2148defm BUFFER_ATOMIC_UMAX : MUBUF_Real_Atomic_vi <0x47>;
2149defm BUFFER_ATOMIC_AND : MUBUF_Real_Atomic_vi <0x48>;
2150defm BUFFER_ATOMIC_OR : MUBUF_Real_Atomic_vi <0x49>;
2151defm BUFFER_ATOMIC_XOR : MUBUF_Real_Atomic_vi <0x4a>;
2152defm BUFFER_ATOMIC_INC : MUBUF_Real_Atomic_vi <0x4b>;
2153defm BUFFER_ATOMIC_DEC : MUBUF_Real_Atomic_vi <0x4c>;
2154
2155defm BUFFER_ATOMIC_SWAP_X2 : MUBUF_Real_Atomic_vi <0x60>;
2156defm BUFFER_ATOMIC_CMPSWAP_X2 : MUBUF_Real_Atomic_vi <0x61>;
2157defm BUFFER_ATOMIC_ADD_X2 : MUBUF_Real_Atomic_vi <0x62>;
2158defm BUFFER_ATOMIC_SUB_X2 : MUBUF_Real_Atomic_vi <0x63>;
2159defm BUFFER_ATOMIC_SMIN_X2 : MUBUF_Real_Atomic_vi <0x64>;
2160defm BUFFER_ATOMIC_UMIN_X2 : MUBUF_Real_Atomic_vi <0x65>;
2161defm BUFFER_ATOMIC_SMAX_X2 : MUBUF_Real_Atomic_vi <0x66>;
2162defm BUFFER_ATOMIC_UMAX_X2 : MUBUF_Real_Atomic_vi <0x67>;
2163defm BUFFER_ATOMIC_AND_X2 : MUBUF_Real_Atomic_vi <0x68>;
2164defm BUFFER_ATOMIC_OR_X2 : MUBUF_Real_Atomic_vi <0x69>;
2165defm BUFFER_ATOMIC_XOR_X2 : MUBUF_Real_Atomic_vi <0x6a>;
2166defm BUFFER_ATOMIC_INC_X2 : MUBUF_Real_Atomic_vi <0x6b>;
2167defm BUFFER_ATOMIC_DEC_X2 : MUBUF_Real_Atomic_vi <0x6c>;
2168
Dmitry Preobrazhenskyd98c97b2018-03-12 17:29:24 +00002169def BUFFER_STORE_LDS_DWORD_vi : MUBUF_Real_vi <0x3d, BUFFER_STORE_LDS_DWORD>;
2170
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00002171def BUFFER_WBINVL1_vi : MUBUF_Real_vi <0x3e, BUFFER_WBINVL1>;
2172def BUFFER_WBINVL1_VOL_vi : MUBUF_Real_vi <0x3f, BUFFER_WBINVL1_VOL>;
2173
Valery Pykhtinfbf2d932016-09-23 21:21:21 +00002174class MTBUF_Real_vi <bits<4> op, MTBUF_Pseudo ps> :
2175 MTBUF_Real<ps>,
David Stuttard70e8bc12017-06-22 16:29:22 +00002176 Enc64,
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00002177 SIMCInstr<ps.PseudoInstr, SIEncodingFamily.VI> {
Stanislav Mekhanoshin51823022019-04-06 09:20:48 +00002178 let AssemblerPredicate = isGFX8GFX9;
2179 let DecoderNamespace = "GFX8";
Valery Pykhtinfbf2d932016-09-23 21:21:21 +00002180
David Stuttard70e8bc12017-06-22 16:29:22 +00002181 let Inst{11-0} = !if(ps.has_offset, offset, ?);
2182 let Inst{12} = ps.offen;
2183 let Inst{13} = ps.idxen;
2184 let Inst{14} = !if(ps.has_glc, glc, ps.glc_value);
Valery Pykhtinfbf2d932016-09-23 21:21:21 +00002185 let Inst{18-15} = op;
Tim Renouf35484c92018-08-21 11:06:05 +00002186 let Inst{22-19} = dfmt;
2187 let Inst{25-23} = nfmt;
David Stuttard70e8bc12017-06-22 16:29:22 +00002188 let Inst{31-26} = 0x3a; //encoding
2189 let Inst{39-32} = !if(ps.has_vaddr, vaddr, ?);
2190 let Inst{47-40} = !if(ps.has_vdata, vdata, ?);
2191 let Inst{52-48} = !if(ps.has_srsrc, srsrc{6-2}, ?);
2192 let Inst{54} = !if(ps.has_slc, slc, ?);
2193 let Inst{55} = !if(ps.has_tfe, tfe, ?);
2194 let Inst{63-56} = !if(ps.has_soffset, soffset, ?);
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00002195}
2196
David Stuttard70e8bc12017-06-22 16:29:22 +00002197multiclass MTBUF_Real_AllAddr_vi<bits<4> op> {
2198 def _OFFSET_vi : MTBUF_Real_vi <op, !cast<MTBUF_Pseudo>(NAME#"_OFFSET")>;
2199 def _OFFEN_vi : MTBUF_Real_vi <op, !cast<MTBUF_Pseudo>(NAME#"_OFFEN")>;
2200 def _IDXEN_vi : MTBUF_Real_vi <op, !cast<MTBUF_Pseudo>(NAME#"_IDXEN")>;
2201 def _BOTHEN_vi : MTBUF_Real_vi <op, !cast<MTBUF_Pseudo>(NAME#"_BOTHEN")>;
2202}
Valery Pykhtinb66e5eb2016-09-10 13:09:16 +00002203
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00002204class MTBUF_Real_gfx80 <bits<4> op, MTBUF_Pseudo ps> :
2205 MTBUF_Real<ps>,
2206 Enc64,
2207 SIMCInstr<ps.PseudoInstr, SIEncodingFamily.GFX80> {
2208 let AssemblerPredicate=HasUnpackedD16VMem;
2209 let DecoderNamespace="GFX80_UNPACKED";
2210
2211 let Inst{11-0} = !if(ps.has_offset, offset, ?);
2212 let Inst{12} = ps.offen;
2213 let Inst{13} = ps.idxen;
2214 let Inst{14} = !if(ps.has_glc, glc, ps.glc_value);
2215 let Inst{18-15} = op;
Tim Renouf35484c92018-08-21 11:06:05 +00002216 let Inst{22-19} = dfmt;
2217 let Inst{25-23} = nfmt;
Changpeng Fang44dfa1d2018-01-12 21:12:19 +00002218 let Inst{31-26} = 0x3a; //encoding
2219 let Inst{39-32} = !if(ps.has_vaddr, vaddr, ?);
2220 let Inst{47-40} = !if(ps.has_vdata, vdata, ?);
2221 let Inst{52-48} = !if(ps.has_srsrc, srsrc{6-2}, ?);
2222 let Inst{54} = !if(ps.has_slc, slc, ?);
2223 let Inst{55} = !if(ps.has_tfe, tfe, ?);
2224 let Inst{63-56} = !if(ps.has_soffset, soffset, ?);
2225}
2226
2227multiclass MTBUF_Real_AllAddr_gfx80<bits<4> op> {
2228 def _OFFSET_gfx80 : MTBUF_Real_gfx80 <op, !cast<MTBUF_Pseudo>(NAME#"_OFFSET")>;
2229 def _OFFEN_gfx80 : MTBUF_Real_gfx80 <op, !cast<MTBUF_Pseudo>(NAME#"_OFFEN")>;
2230 def _IDXEN_gfx80 : MTBUF_Real_gfx80 <op, !cast<MTBUF_Pseudo>(NAME#"_IDXEN")>;
2231 def _BOTHEN_gfx80 : MTBUF_Real_gfx80 <op, !cast<MTBUF_Pseudo>(NAME#"_BOTHEN")>;
2232}
2233
2234defm TBUFFER_LOAD_FORMAT_X : MTBUF_Real_AllAddr_vi <0x00>;
2235defm TBUFFER_LOAD_FORMAT_XY : MTBUF_Real_AllAddr_vi <0x01>;
2236defm TBUFFER_LOAD_FORMAT_XYZ : MTBUF_Real_AllAddr_vi <0x02>;
2237defm TBUFFER_LOAD_FORMAT_XYZW : MTBUF_Real_AllAddr_vi <0x03>;
2238defm TBUFFER_STORE_FORMAT_X : MTBUF_Real_AllAddr_vi <0x04>;
2239defm TBUFFER_STORE_FORMAT_XY : MTBUF_Real_AllAddr_vi <0x05>;
2240defm TBUFFER_STORE_FORMAT_XYZ : MTBUF_Real_AllAddr_vi <0x06>;
2241defm TBUFFER_STORE_FORMAT_XYZW : MTBUF_Real_AllAddr_vi <0x07>;
2242let SubtargetPredicate = HasUnpackedD16VMem in {
2243 defm TBUFFER_LOAD_FORMAT_D16_X_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x08>;
2244 defm TBUFFER_LOAD_FORMAT_D16_XY_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x09>;
2245 defm TBUFFER_LOAD_FORMAT_D16_XYZ_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x0a>;
2246 defm TBUFFER_LOAD_FORMAT_D16_XYZW_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x0b>;
2247 defm TBUFFER_STORE_FORMAT_D16_X_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x0c>;
2248 defm TBUFFER_STORE_FORMAT_D16_XY_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x0d>;
2249 defm TBUFFER_STORE_FORMAT_D16_XYZ_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x0e>;
2250 defm TBUFFER_STORE_FORMAT_D16_XYZW_gfx80 : MTBUF_Real_AllAddr_gfx80 <0x0f>;
2251} // End HasUnpackedD16VMem.
2252let SubtargetPredicate = HasPackedD16VMem in {
2253 defm TBUFFER_LOAD_FORMAT_D16_X : MTBUF_Real_AllAddr_vi <0x08>;
2254 defm TBUFFER_LOAD_FORMAT_D16_XY : MTBUF_Real_AllAddr_vi <0x09>;
2255 defm TBUFFER_LOAD_FORMAT_D16_XYZ : MTBUF_Real_AllAddr_vi <0x0a>;
2256 defm TBUFFER_LOAD_FORMAT_D16_XYZW : MTBUF_Real_AllAddr_vi <0x0b>;
2257 defm TBUFFER_STORE_FORMAT_D16_X : MTBUF_Real_AllAddr_vi <0x0c>;
2258 defm TBUFFER_STORE_FORMAT_D16_XY : MTBUF_Real_AllAddr_vi <0x0d>;
2259 defm TBUFFER_STORE_FORMAT_D16_XYZ : MTBUF_Real_AllAddr_vi <0x0e>;
2260 defm TBUFFER_STORE_FORMAT_D16_XYZW : MTBUF_Real_AllAddr_vi <0x0f>;
2261} // End HasUnpackedD16VMem.
Neil Henning76504a42018-12-12 16:15:21 +00002262
2263def MUBUFInfoTable : GenericTable {
2264 let FilterClass = "MUBUF_Pseudo";
2265 let CppTypeName = "MUBUFInfo";
2266 let Fields = ["Opcode", "BaseOpcode", "dwords", "has_vaddr", "has_srsrc", "has_soffset"];
2267
2268 let PrimaryKey = ["Opcode"];
2269 let PrimaryKeyName = "getMUBUFOpcodeHelper";
2270}
2271
2272def getMUBUFInfoFromOpcode : SearchIndex {
2273 let Table = MUBUFInfoTable;
2274 let Key = ["Opcode"];
2275}
2276
2277def getMUBUFInfoFromBaseOpcodeAndDwords : SearchIndex {
2278 let Table = MUBUFInfoTable;
2279 let Key = ["BaseOpcode", "dwords"];
2280}