blob: 246be340c3269aede245d4af7118f5354f3b6982 [file] [log] [blame]
Valery Pykhtin902db312016-08-01 14:21:30 +00001//===-- DSInstructions.td - DS 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 Pykhtin902db312016-08-01 14:21:30 +00006//
7//===----------------------------------------------------------------------===//
8
9class DS_Pseudo <string opName, dag outs, dag ins, string asmOps, list<dag> pattern=[]> :
10 InstSI <outs, ins, "", pattern>,
11 SIMCInstr <opName, SIEncodingFamily.NONE> {
12
Valery Pykhtin902db312016-08-01 14:21:30 +000013 let LGKM_CNT = 1;
14 let DS = 1;
Matt Arsenault10c17ca2016-10-06 10:13:23 +000015 let Size = 8;
Valery Pykhtin902db312016-08-01 14:21:30 +000016 let UseNamedOperandTable = 1;
Valery Pykhtin902db312016-08-01 14:21:30 +000017
18 // Most instruction load and store data, so set this as the default.
19 let mayLoad = 1;
20 let mayStore = 1;
Stanislav Mekhanoshinbb988412019-03-01 07:59:17 +000021 let maybeAtomic = 1;
Valery Pykhtin902db312016-08-01 14:21:30 +000022
23 let hasSideEffects = 0;
24 let SchedRW = [WriteLDS];
25
26 let isPseudo = 1;
27 let isCodeGenOnly = 1;
28
29 let AsmMatchConverter = "cvtDS";
30
31 string Mnemonic = opName;
32 string AsmOperands = asmOps;
33
34 // Well these bits a kind of hack because it would be more natural
35 // to test "outs" and "ins" dags for the presence of particular operands
36 bits<1> has_vdst = 1;
37 bits<1> has_addr = 1;
38 bits<1> has_data0 = 1;
39 bits<1> has_data1 = 1;
40
41 bits<1> has_offset = 1; // has "offset" that should be split to offset0,1
42 bits<1> has_offset0 = 1;
43 bits<1> has_offset1 = 1;
44
45 bits<1> has_gds = 1;
46 bits<1> gdsValue = 0; // if has_gds == 0 set gds to this value
Matt Arsenault10c472d2017-11-15 01:34:06 +000047
48 bits<1> has_m0_read = 1;
49
50 let Uses = !if(has_m0_read, [M0, EXEC], [EXEC]);
Valery Pykhtin902db312016-08-01 14:21:30 +000051}
52
53class DS_Real <DS_Pseudo ds> :
54 InstSI <ds.OutOperandList, ds.InOperandList, ds.Mnemonic # " " # ds.AsmOperands, []>,
55 Enc64 {
56
57 let isPseudo = 0;
58 let isCodeGenOnly = 0;
59
60 // copy relevant pseudo op flags
61 let SubtargetPredicate = ds.SubtargetPredicate;
62 let AsmMatchConverter = ds.AsmMatchConverter;
63
64 // encoding fields
65 bits<8> vdst;
66 bits<1> gds;
67 bits<8> addr;
68 bits<8> data0;
69 bits<8> data1;
70 bits<8> offset0;
71 bits<8> offset1;
72
73 bits<16> offset;
74 let offset0 = !if(ds.has_offset, offset{7-0}, ?);
75 let offset1 = !if(ds.has_offset, offset{15-8}, ?);
76}
77
78
79// DS Pseudo instructions
80
81class DS_1A1D_NORET<string opName, RegisterClass rc = VGPR_32>
82: DS_Pseudo<opName,
83 (outs),
84 (ins VGPR_32:$addr, rc:$data0, offset:$offset, gds:$gds),
Matt Arsenault10c472d2017-11-15 01:34:06 +000085 "$addr, $data0$offset$gds"> {
Valery Pykhtin902db312016-08-01 14:21:30 +000086
87 let has_data1 = 0;
88 let has_vdst = 0;
89}
90
Matt Arsenault10c472d2017-11-15 01:34:06 +000091multiclass DS_1A1D_NORET_mc<string opName, RegisterClass rc = VGPR_32> {
92 def "" : DS_1A1D_NORET<opName, rc>,
93 AtomicNoRet<opName, 0>;
94
95 let has_m0_read = 0 in {
96 def _gfx9 : DS_1A1D_NORET<opName, rc>,
97 AtomicNoRet<opName#"_gfx9", 0>;
98 }
99}
100
Matt Arsenaultf3dd8632016-11-01 00:55:14 +0000101class DS_1A2D_NORET<string opName, RegisterClass rc = VGPR_32>
Valery Pykhtin902db312016-08-01 14:21:30 +0000102: DS_Pseudo<opName,
103 (outs),
104 (ins VGPR_32:$addr, rc:$data0, rc:$data1, offset:$offset, gds:$gds),
Matt Arsenault10c472d2017-11-15 01:34:06 +0000105 "$addr, $data0, $data1"#"$offset"#"$gds"> {
Valery Pykhtin902db312016-08-01 14:21:30 +0000106
107 let has_vdst = 0;
108}
109
Matt Arsenault10c472d2017-11-15 01:34:06 +0000110multiclass DS_1A2D_NORET_mc<string opName, RegisterClass rc = VGPR_32> {
111 def "" : DS_1A2D_NORET<opName, rc>,
112 AtomicNoRet<opName, 0>;
113
114 let has_m0_read = 0 in {
115 def _gfx9 : DS_1A2D_NORET<opName, rc>,
116 AtomicNoRet<opName#"_gfx9", 0>;
117 }
118}
119
Valery Pykhtin902db312016-08-01 14:21:30 +0000120class DS_1A2D_Off8_NORET <string opName, RegisterClass rc = VGPR_32>
121: DS_Pseudo<opName,
122 (outs),
123 (ins VGPR_32:$addr, rc:$data0, rc:$data1,
124 offset0:$offset0, offset1:$offset1, gds:$gds),
125 "$addr, $data0, $data1$offset0$offset1$gds"> {
126
127 let has_vdst = 0;
128 let has_offset = 0;
129 let AsmMatchConverter = "cvtDSOffset01";
130}
131
Matt Arsenault10c472d2017-11-15 01:34:06 +0000132multiclass DS_1A2D_Off8_NORET_mc <string opName, RegisterClass rc = VGPR_32> {
133 def "" : DS_1A2D_Off8_NORET<opName, rc>;
134
135 let has_m0_read = 0 in {
136 def _gfx9 : DS_1A2D_Off8_NORET<opName, rc>;
137 }
138}
139
Valery Pykhtin902db312016-08-01 14:21:30 +0000140class DS_1A1D_RET <string opName, RegisterClass rc = VGPR_32>
141: DS_Pseudo<opName,
142 (outs rc:$vdst),
143 (ins VGPR_32:$addr, rc:$data0, offset:$offset, gds:$gds),
144 "$vdst, $addr, $data0$offset$gds"> {
145
146 let hasPostISelHook = 1;
147 let has_data1 = 0;
148}
149
Matt Arsenault10c472d2017-11-15 01:34:06 +0000150multiclass DS_1A1D_RET_mc <string opName, RegisterClass rc = VGPR_32,
151 string NoRetOp = ""> {
152 def "" : DS_1A1D_RET<opName, rc>,
153 AtomicNoRet<NoRetOp, !if(!eq(NoRetOp, ""), 0, 1)>;
154
155 let has_m0_read = 0 in {
156 def _gfx9 : DS_1A1D_RET<opName, rc>,
157 AtomicNoRet<!if(!eq(NoRetOp, ""), "", NoRetOp#"_gfx9"),
158 !if(!eq(NoRetOp, ""), 0, 1)>;
159 }
160}
161
Valery Pykhtin902db312016-08-01 14:21:30 +0000162class DS_1A2D_RET<string opName,
Matt Arsenaultf3dd8632016-11-01 00:55:14 +0000163 RegisterClass rc = VGPR_32,
Valery Pykhtin902db312016-08-01 14:21:30 +0000164 RegisterClass src = rc>
165: DS_Pseudo<opName,
166 (outs rc:$vdst),
167 (ins VGPR_32:$addr, src:$data0, src:$data1, offset:$offset, gds:$gds),
168 "$vdst, $addr, $data0, $data1$offset$gds"> {
169
170 let hasPostISelHook = 1;
171}
172
Matt Arsenault10c472d2017-11-15 01:34:06 +0000173multiclass DS_1A2D_RET_mc<string opName,
174 RegisterClass rc = VGPR_32,
175 string NoRetOp = "",
176 RegisterClass src = rc> {
177 def "" : DS_1A2D_RET<opName, rc, src>,
178 AtomicNoRet<NoRetOp, !if(!eq(NoRetOp, ""), 0, 1)>;
179
180 let has_m0_read = 0 in {
181 def _gfx9 : DS_1A2D_RET<opName, rc, src>,
182 AtomicNoRet<NoRetOp#"_gfx9", !if(!eq(NoRetOp, ""), 0, 1)>;
183 }
184}
185
Dmitry Preobrazhensky7184c442017-04-12 14:29:45 +0000186class DS_1A2D_Off8_RET<string opName,
187 RegisterClass rc = VGPR_32,
188 RegisterClass src = rc>
189: DS_Pseudo<opName,
190 (outs rc:$vdst),
191 (ins VGPR_32:$addr, src:$data0, src:$data1, offset0:$offset0, offset1:$offset1, gds:$gds),
192 "$vdst, $addr, $data0, $data1$offset0$offset1$gds"> {
193
194 let has_offset = 0;
195 let AsmMatchConverter = "cvtDSOffset01";
196
197 let hasPostISelHook = 1;
198}
199
Matt Arsenault10c472d2017-11-15 01:34:06 +0000200multiclass DS_1A2D_Off8_RET_mc<string opName,
201 RegisterClass rc = VGPR_32,
202 RegisterClass src = rc> {
203 def "" : DS_1A2D_Off8_RET<opName, rc, src>;
204
205 let has_m0_read = 0 in {
206 def _gfx9 : DS_1A2D_Off8_RET<opName, rc, src>;
207 }
208}
209
210
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000211class DS_1A_RET<string opName, RegisterClass rc = VGPR_32, bit HasTiedOutput = 0, Operand ofs = offset>
Valery Pykhtin902db312016-08-01 14:21:30 +0000212: DS_Pseudo<opName,
213 (outs rc:$vdst),
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000214 !if(HasTiedOutput,
215 (ins VGPR_32:$addr, ofs:$offset, gds:$gds, rc:$vdst_in),
216 (ins VGPR_32:$addr, ofs:$offset, gds:$gds)),
Valery Pykhtin902db312016-08-01 14:21:30 +0000217 "$vdst, $addr$offset$gds"> {
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000218 let Constraints = !if(HasTiedOutput, "$vdst = $vdst_in", "");
219 let DisableEncoding = !if(HasTiedOutput, "$vdst_in", "");
Valery Pykhtin902db312016-08-01 14:21:30 +0000220 let has_data0 = 0;
221 let has_data1 = 0;
222}
223
Matt Arsenault10c472d2017-11-15 01:34:06 +0000224multiclass DS_1A_RET_mc<string opName, RegisterClass rc = VGPR_32, bit HasTiedOutput = 0, Operand ofs = offset> {
225 def "" : DS_1A_RET<opName, rc, HasTiedOutput, ofs>;
226
227 let has_m0_read = 0 in {
228 def _gfx9 : DS_1A_RET<opName, rc, HasTiedOutput, ofs>;
229 }
230}
231
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000232class DS_1A_RET_Tied<string opName, RegisterClass rc = VGPR_32> :
233 DS_1A_RET<opName, rc, 1>;
234
Valery Pykhtin902db312016-08-01 14:21:30 +0000235class DS_1A_Off8_RET <string opName, RegisterClass rc = VGPR_32>
236: DS_Pseudo<opName,
237 (outs rc:$vdst),
238 (ins VGPR_32:$addr, offset0:$offset0, offset1:$offset1, gds:$gds),
239 "$vdst, $addr$offset0$offset1$gds"> {
240
241 let has_offset = 0;
242 let has_data0 = 0;
243 let has_data1 = 0;
244 let AsmMatchConverter = "cvtDSOffset01";
245}
246
Matt Arsenault10c472d2017-11-15 01:34:06 +0000247multiclass DS_1A_Off8_RET_mc <string opName, RegisterClass rc = VGPR_32> {
248 def "" : DS_1A_Off8_RET<opName, rc>;
249
250 let has_m0_read = 0 in {
251 def _gfx9 : DS_1A_Off8_RET<opName, rc>;
252 }
253}
254
Valery Pykhtin902db312016-08-01 14:21:30 +0000255class DS_1A_RET_GDS <string opName> : DS_Pseudo<opName,
256 (outs VGPR_32:$vdst),
257 (ins VGPR_32:$addr, offset:$offset),
258 "$vdst, $addr$offset gds"> {
259
260 let has_data0 = 0;
261 let has_data1 = 0;
262 let has_gds = 0;
263 let gdsValue = 1;
Artem Tamazov43b61562017-02-03 12:47:30 +0000264 let AsmMatchConverter = "cvtDSGds";
Valery Pykhtin902db312016-08-01 14:21:30 +0000265}
266
267class DS_0A_RET <string opName> : DS_Pseudo<opName,
268 (outs VGPR_32:$vdst),
269 (ins offset:$offset, gds:$gds),
270 "$vdst$offset$gds"> {
271
272 let mayLoad = 1;
273 let mayStore = 1;
274
275 let has_addr = 0;
276 let has_data0 = 0;
277 let has_data1 = 0;
278}
279
280class DS_1A <string opName> : DS_Pseudo<opName,
281 (outs),
282 (ins VGPR_32:$addr, offset:$offset, gds:$gds),
283 "$addr$offset$gds"> {
284
285 let mayLoad = 1;
286 let mayStore = 1;
287
288 let has_vdst = 0;
289 let has_data0 = 0;
290 let has_data1 = 0;
291}
292
Matt Arsenault10c472d2017-11-15 01:34:06 +0000293multiclass DS_1A_mc <string opName> {
294 def "" : DS_1A<opName>;
295
296 let has_m0_read = 0 in {
297 def _gfx9 : DS_1A<opName>;
298 }
299}
300
301
Dmitry Preobrazhenskye5147242017-04-07 13:07:13 +0000302class DS_GWS <string opName, dag ins, string asmOps>
303: DS_Pseudo<opName, (outs), ins, asmOps> {
Valery Pykhtin902db312016-08-01 14:21:30 +0000304
Dmitry Preobrazhenskye5147242017-04-07 13:07:13 +0000305 let has_vdst = 0;
306 let has_addr = 0;
307 let has_data0 = 0;
308 let has_data1 = 0;
Valery Pykhtin902db312016-08-01 14:21:30 +0000309
Dmitry Preobrazhenskye5147242017-04-07 13:07:13 +0000310 let has_gds = 0;
311 let gdsValue = 1;
312 let AsmMatchConverter = "cvtDSGds";
313}
314
315class DS_GWS_0D <string opName>
316: DS_GWS<opName,
317 (ins offset:$offset, gds:$gds), "$offset gds">;
318
319class DS_GWS_1D <string opName>
320: DS_GWS<opName,
321 (ins VGPR_32:$data0, offset:$offset, gds:$gds), "$data0$offset gds"> {
322
323 let has_data0 = 1;
Valery Pykhtin902db312016-08-01 14:21:30 +0000324}
325
Matt Arsenault78124982017-02-28 20:15:46 +0000326class DS_VOID <string opName> : DS_Pseudo<opName,
327 (outs), (ins), ""> {
328 let mayLoad = 0;
329 let mayStore = 0;
330 let hasSideEffects = 1;
331 let UseNamedOperandTable = 0;
332 let AsmMatchConverter = "";
333
334 let has_vdst = 0;
335 let has_addr = 0;
336 let has_data0 = 0;
337 let has_data1 = 0;
338 let has_offset = 0;
339 let has_offset0 = 0;
340 let has_offset1 = 0;
341 let has_gds = 0;
342}
343
Valery Pykhtin902db312016-08-01 14:21:30 +0000344class DS_1A1D_PERMUTE <string opName, SDPatternOperator node = null_frag>
345: DS_Pseudo<opName,
346 (outs VGPR_32:$vdst),
347 (ins VGPR_32:$addr, VGPR_32:$data0, offset:$offset),
348 "$vdst, $addr, $data0$offset",
349 [(set i32:$vdst,
350 (node (DS1Addr1Offset i32:$addr, i16:$offset), i32:$data0))] > {
351
352 let mayLoad = 0;
353 let mayStore = 0;
354 let isConvergent = 1;
355
356 let has_data1 = 0;
357 let has_gds = 0;
358}
359
Matt Arsenault10c472d2017-11-15 01:34:06 +0000360defm DS_ADD_U32 : DS_1A1D_NORET_mc<"ds_add_u32">;
361defm DS_SUB_U32 : DS_1A1D_NORET_mc<"ds_sub_u32">;
362defm DS_RSUB_U32 : DS_1A1D_NORET_mc<"ds_rsub_u32">;
363defm DS_INC_U32 : DS_1A1D_NORET_mc<"ds_inc_u32">;
364defm DS_DEC_U32 : DS_1A1D_NORET_mc<"ds_dec_u32">;
365defm DS_MIN_I32 : DS_1A1D_NORET_mc<"ds_min_i32">;
366defm DS_MAX_I32 : DS_1A1D_NORET_mc<"ds_max_i32">;
367defm DS_MIN_U32 : DS_1A1D_NORET_mc<"ds_min_u32">;
368defm DS_MAX_U32 : DS_1A1D_NORET_mc<"ds_max_u32">;
369defm DS_AND_B32 : DS_1A1D_NORET_mc<"ds_and_b32">;
370defm DS_OR_B32 : DS_1A1D_NORET_mc<"ds_or_b32">;
371defm DS_XOR_B32 : DS_1A1D_NORET_mc<"ds_xor_b32">;
372defm DS_ADD_F32 : DS_1A1D_NORET_mc<"ds_add_f32">;
373defm DS_MIN_F32 : DS_1A1D_NORET_mc<"ds_min_f32">;
374defm DS_MAX_F32 : DS_1A1D_NORET_mc<"ds_max_f32">;
Valery Pykhtin902db312016-08-01 14:21:30 +0000375
376let mayLoad = 0 in {
Matt Arsenault10c472d2017-11-15 01:34:06 +0000377defm DS_WRITE_B8 : DS_1A1D_NORET_mc<"ds_write_b8">;
378defm DS_WRITE_B16 : DS_1A1D_NORET_mc<"ds_write_b16">;
379defm DS_WRITE_B32 : DS_1A1D_NORET_mc<"ds_write_b32">;
380defm DS_WRITE2_B32 : DS_1A2D_Off8_NORET_mc<"ds_write2_b32">;
381defm DS_WRITE2ST64_B32: DS_1A2D_Off8_NORET_mc<"ds_write2st64_b32">;
382
383
384let has_m0_read = 0 in {
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000385
386let SubtargetPredicate = HasD16LoadStore in {
387def DS_WRITE_B8_D16_HI : DS_1A1D_NORET<"ds_write_b8_d16_hi">;
388def DS_WRITE_B16_D16_HI : DS_1A1D_NORET<"ds_write_b16_d16_hi">;
389}
390
Matt Arsenaultefa1d652017-09-01 18:38:02 +0000391let SubtargetPredicate = HasDSAddTid in {
392def DS_WRITE_ADDTID_B32 : DS_1A1D_NORET<"ds_write_addtid_b32">;
393}
394
Matt Arsenault10c472d2017-11-15 01:34:06 +0000395} // End has_m0_read = 0
396} // End mayLoad = 0
Valery Pykhtin902db312016-08-01 14:21:30 +0000397
Matt Arsenault10c472d2017-11-15 01:34:06 +0000398defm DS_MSKOR_B32 : DS_1A2D_NORET_mc<"ds_mskor_b32">;
399defm DS_CMPST_B32 : DS_1A2D_NORET_mc<"ds_cmpst_b32">;
400defm DS_CMPST_F32 : DS_1A2D_NORET_mc<"ds_cmpst_f32">;
Valery Pykhtin902db312016-08-01 14:21:30 +0000401
Matt Arsenault10c472d2017-11-15 01:34:06 +0000402defm DS_ADD_U64 : DS_1A1D_NORET_mc<"ds_add_u64", VReg_64>;
403defm DS_SUB_U64 : DS_1A1D_NORET_mc<"ds_sub_u64", VReg_64>;
404defm DS_RSUB_U64 : DS_1A1D_NORET_mc<"ds_rsub_u64", VReg_64>;
405defm DS_INC_U64 : DS_1A1D_NORET_mc<"ds_inc_u64", VReg_64>;
406defm DS_DEC_U64 : DS_1A1D_NORET_mc<"ds_dec_u64", VReg_64>;
407defm DS_MIN_I64 : DS_1A1D_NORET_mc<"ds_min_i64", VReg_64>;
408defm DS_MAX_I64 : DS_1A1D_NORET_mc<"ds_max_i64", VReg_64>;
409defm DS_MIN_U64 : DS_1A1D_NORET_mc<"ds_min_u64", VReg_64>;
410defm DS_MAX_U64 : DS_1A1D_NORET_mc<"ds_max_u64", VReg_64>;
411defm DS_AND_B64 : DS_1A1D_NORET_mc<"ds_and_b64", VReg_64>;
412defm DS_OR_B64 : DS_1A1D_NORET_mc<"ds_or_b64", VReg_64>;
413defm DS_XOR_B64 : DS_1A1D_NORET_mc<"ds_xor_b64", VReg_64>;
414defm DS_MSKOR_B64 : DS_1A2D_NORET_mc<"ds_mskor_b64", VReg_64>;
Valery Pykhtin902db312016-08-01 14:21:30 +0000415let mayLoad = 0 in {
Matt Arsenault10c472d2017-11-15 01:34:06 +0000416defm DS_WRITE_B64 : DS_1A1D_NORET_mc<"ds_write_b64", VReg_64>;
417defm DS_WRITE2_B64 : DS_1A2D_Off8_NORET_mc<"ds_write2_b64", VReg_64>;
418defm DS_WRITE2ST64_B64: DS_1A2D_Off8_NORET_mc<"ds_write2st64_b64", VReg_64>;
Valery Pykhtin902db312016-08-01 14:21:30 +0000419}
Matt Arsenault10c472d2017-11-15 01:34:06 +0000420defm DS_CMPST_B64 : DS_1A2D_NORET_mc<"ds_cmpst_b64", VReg_64>;
421defm DS_CMPST_F64 : DS_1A2D_NORET_mc<"ds_cmpst_f64", VReg_64>;
422defm DS_MIN_F64 : DS_1A1D_NORET_mc<"ds_min_f64", VReg_64>;
423defm DS_MAX_F64 : DS_1A1D_NORET_mc<"ds_max_f64", VReg_64>;
Valery Pykhtin902db312016-08-01 14:21:30 +0000424
Matt Arsenault10c472d2017-11-15 01:34:06 +0000425defm DS_ADD_RTN_U32 : DS_1A1D_RET_mc<"ds_add_rtn_u32", VGPR_32, "ds_add_u32">;
426defm DS_ADD_RTN_F32 : DS_1A1D_RET_mc<"ds_add_rtn_f32", VGPR_32, "ds_add_f32">;
427defm DS_SUB_RTN_U32 : DS_1A1D_RET_mc<"ds_sub_rtn_u32", VGPR_32, "ds_sub_u32">;
428defm DS_RSUB_RTN_U32 : DS_1A1D_RET_mc<"ds_rsub_rtn_u32", VGPR_32, "ds_rsub_u32">;
429defm DS_INC_RTN_U32 : DS_1A1D_RET_mc<"ds_inc_rtn_u32", VGPR_32, "ds_inc_u32">;
430defm DS_DEC_RTN_U32 : DS_1A1D_RET_mc<"ds_dec_rtn_u32", VGPR_32, "ds_dec_u32">;
431defm DS_MIN_RTN_I32 : DS_1A1D_RET_mc<"ds_min_rtn_i32", VGPR_32, "ds_min_i32">;
432defm DS_MAX_RTN_I32 : DS_1A1D_RET_mc<"ds_max_rtn_i32", VGPR_32, "ds_max_i32">;
433defm DS_MIN_RTN_U32 : DS_1A1D_RET_mc<"ds_min_rtn_u32", VGPR_32, "ds_min_u32">;
434defm DS_MAX_RTN_U32 : DS_1A1D_RET_mc<"ds_max_rtn_u32", VGPR_32, "ds_max_u32">;
435defm DS_AND_RTN_B32 : DS_1A1D_RET_mc<"ds_and_rtn_b32", VGPR_32, "ds_and_b32">;
436defm DS_OR_RTN_B32 : DS_1A1D_RET_mc<"ds_or_rtn_b32", VGPR_32, "ds_or_b32">;
437defm DS_XOR_RTN_B32 : DS_1A1D_RET_mc<"ds_xor_rtn_b32", VGPR_32, "ds_xor_b32">;
438defm DS_MSKOR_RTN_B32 : DS_1A2D_RET_mc<"ds_mskor_rtn_b32", VGPR_32, "ds_mskor_b32">;
439defm DS_CMPST_RTN_B32 : DS_1A2D_RET_mc<"ds_cmpst_rtn_b32", VGPR_32, "ds_cmpst_b32">;
440defm DS_CMPST_RTN_F32 : DS_1A2D_RET_mc<"ds_cmpst_rtn_f32", VGPR_32, "ds_cmpst_f32">;
Daniil Fukalovd5fca552018-01-17 14:05:05 +0000441defm DS_MIN_RTN_F32 : DS_1A1D_RET_mc<"ds_min_rtn_f32", VGPR_32, "ds_min_f32">;
Matt Arsenault10c472d2017-11-15 01:34:06 +0000442defm DS_MAX_RTN_F32 : DS_1A1D_RET_mc<"ds_max_rtn_f32", VGPR_32, "ds_max_f32">;
Valery Pykhtin902db312016-08-01 14:21:30 +0000443
Matt Arsenault10c472d2017-11-15 01:34:06 +0000444defm DS_WRXCHG_RTN_B32 : DS_1A1D_RET_mc<"ds_wrxchg_rtn_b32">;
445defm DS_WRXCHG2_RTN_B32 : DS_1A2D_Off8_RET_mc<"ds_wrxchg2_rtn_b32", VReg_64, VGPR_32>;
446defm DS_WRXCHG2ST64_RTN_B32 : DS_1A2D_Off8_RET_mc<"ds_wrxchg2st64_rtn_b32", VReg_64, VGPR_32>;
Valery Pykhtin902db312016-08-01 14:21:30 +0000447
Matt Arsenault10c472d2017-11-15 01:34:06 +0000448defm DS_ADD_RTN_U64 : DS_1A1D_RET_mc<"ds_add_rtn_u64", VReg_64, "ds_add_u64">;
449defm DS_SUB_RTN_U64 : DS_1A1D_RET_mc<"ds_sub_rtn_u64", VReg_64, "ds_sub_u64">;
450defm DS_RSUB_RTN_U64 : DS_1A1D_RET_mc<"ds_rsub_rtn_u64", VReg_64, "ds_rsub_u64">;
451defm DS_INC_RTN_U64 : DS_1A1D_RET_mc<"ds_inc_rtn_u64", VReg_64, "ds_inc_u64">;
452defm DS_DEC_RTN_U64 : DS_1A1D_RET_mc<"ds_dec_rtn_u64", VReg_64, "ds_dec_u64">;
453defm DS_MIN_RTN_I64 : DS_1A1D_RET_mc<"ds_min_rtn_i64", VReg_64, "ds_min_i64">;
454defm DS_MAX_RTN_I64 : DS_1A1D_RET_mc<"ds_max_rtn_i64", VReg_64, "ds_max_i64">;
455defm DS_MIN_RTN_U64 : DS_1A1D_RET_mc<"ds_min_rtn_u64", VReg_64, "ds_min_u64">;
456defm DS_MAX_RTN_U64 : DS_1A1D_RET_mc<"ds_max_rtn_u64", VReg_64, "ds_max_u64">;
457defm DS_AND_RTN_B64 : DS_1A1D_RET_mc<"ds_and_rtn_b64", VReg_64, "ds_and_b64">;
458defm DS_OR_RTN_B64 : DS_1A1D_RET_mc<"ds_or_rtn_b64", VReg_64, "ds_or_b64">;
459defm DS_XOR_RTN_B64 : DS_1A1D_RET_mc<"ds_xor_rtn_b64", VReg_64, "ds_xor_b64">;
460defm DS_MSKOR_RTN_B64 : DS_1A2D_RET_mc<"ds_mskor_rtn_b64", VReg_64, "ds_mskor_b64">;
461defm DS_CMPST_RTN_B64 : DS_1A2D_RET_mc<"ds_cmpst_rtn_b64", VReg_64, "ds_cmpst_b64">;
462defm DS_CMPST_RTN_F64 : DS_1A2D_RET_mc<"ds_cmpst_rtn_f64", VReg_64, "ds_cmpst_f64">;
463defm DS_MIN_RTN_F64 : DS_1A1D_RET_mc<"ds_min_rtn_f64", VReg_64, "ds_min_f64">;
464defm DS_MAX_RTN_F64 : DS_1A1D_RET_mc<"ds_max_rtn_f64", VReg_64, "ds_max_f64">;
Valery Pykhtin902db312016-08-01 14:21:30 +0000465
Matt Arsenault10c472d2017-11-15 01:34:06 +0000466defm DS_WRXCHG_RTN_B64 : DS_1A1D_RET_mc<"ds_wrxchg_rtn_b64", VReg_64>;
467defm DS_WRXCHG2_RTN_B64 : DS_1A2D_Off8_RET_mc<"ds_wrxchg2_rtn_b64", VReg_128, VReg_64>;
468defm DS_WRXCHG2ST64_RTN_B64 : DS_1A2D_Off8_RET_mc<"ds_wrxchg2st64_rtn_b64", VReg_128, VReg_64>;
Valery Pykhtin902db312016-08-01 14:21:30 +0000469
Dmitry Preobrazhenskye5147242017-04-07 13:07:13 +0000470def DS_GWS_INIT : DS_GWS_1D<"ds_gws_init">;
471def DS_GWS_SEMA_V : DS_GWS_0D<"ds_gws_sema_v">;
472def DS_GWS_SEMA_BR : DS_GWS_1D<"ds_gws_sema_br">;
473def DS_GWS_SEMA_P : DS_GWS_0D<"ds_gws_sema_p">;
474def DS_GWS_BARRIER : DS_GWS_1D<"ds_gws_barrier">;
Valery Pykhtin902db312016-08-01 14:21:30 +0000475
476def DS_ADD_SRC2_U32 : DS_1A<"ds_add_src2_u32">;
477def DS_SUB_SRC2_U32 : DS_1A<"ds_sub_src2_u32">;
478def DS_RSUB_SRC2_U32 : DS_1A<"ds_rsub_src2_u32">;
479def DS_INC_SRC2_U32 : DS_1A<"ds_inc_src2_u32">;
480def DS_DEC_SRC2_U32 : DS_1A<"ds_dec_src2_u32">;
481def DS_MIN_SRC2_I32 : DS_1A<"ds_min_src2_i32">;
482def DS_MAX_SRC2_I32 : DS_1A<"ds_max_src2_i32">;
483def DS_MIN_SRC2_U32 : DS_1A<"ds_min_src2_u32">;
484def DS_MAX_SRC2_U32 : DS_1A<"ds_max_src2_u32">;
Dmitry Preobrazhenskye5147242017-04-07 13:07:13 +0000485def DS_AND_SRC2_B32 : DS_1A<"ds_and_src2_b32">;
Valery Pykhtin902db312016-08-01 14:21:30 +0000486def DS_OR_SRC2_B32 : DS_1A<"ds_or_src2_b32">;
487def DS_XOR_SRC2_B32 : DS_1A<"ds_xor_src2_b32">;
488def DS_MIN_SRC2_F32 : DS_1A<"ds_min_src2_f32">;
489def DS_MAX_SRC2_F32 : DS_1A<"ds_max_src2_f32">;
490
491def DS_ADD_SRC2_U64 : DS_1A<"ds_add_src2_u64">;
492def DS_SUB_SRC2_U64 : DS_1A<"ds_sub_src2_u64">;
493def DS_RSUB_SRC2_U64 : DS_1A<"ds_rsub_src2_u64">;
494def DS_INC_SRC2_U64 : DS_1A<"ds_inc_src2_u64">;
495def DS_DEC_SRC2_U64 : DS_1A<"ds_dec_src2_u64">;
496def DS_MIN_SRC2_I64 : DS_1A<"ds_min_src2_i64">;
497def DS_MAX_SRC2_I64 : DS_1A<"ds_max_src2_i64">;
498def DS_MIN_SRC2_U64 : DS_1A<"ds_min_src2_u64">;
499def DS_MAX_SRC2_U64 : DS_1A<"ds_max_src2_u64">;
500def DS_AND_SRC2_B64 : DS_1A<"ds_and_src2_b64">;
501def DS_OR_SRC2_B64 : DS_1A<"ds_or_src2_b64">;
502def DS_XOR_SRC2_B64 : DS_1A<"ds_xor_src2_b64">;
503def DS_MIN_SRC2_F64 : DS_1A<"ds_min_src2_f64">;
504def DS_MAX_SRC2_F64 : DS_1A<"ds_max_src2_f64">;
505
Dmitry Preobrazhenskye6ef0992017-04-14 12:28:07 +0000506def DS_WRITE_SRC2_B32 : DS_1A<"ds_write_src2_b32">;
507def DS_WRITE_SRC2_B64 : DS_1A<"ds_write_src2_b64">;
Valery Pykhtin902db312016-08-01 14:21:30 +0000508
509let Uses = [EXEC], mayLoad = 0, mayStore = 0, isConvergent = 1 in {
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000510def DS_SWIZZLE_B32 : DS_1A_RET <"ds_swizzle_b32", VGPR_32, 0, SwizzleImm>;
Valery Pykhtin902db312016-08-01 14:21:30 +0000511}
512
513let mayStore = 0 in {
Matt Arsenault10c472d2017-11-15 01:34:06 +0000514defm DS_READ_I8 : DS_1A_RET_mc<"ds_read_i8">;
515defm DS_READ_U8 : DS_1A_RET_mc<"ds_read_u8">;
516defm DS_READ_I16 : DS_1A_RET_mc<"ds_read_i16">;
517defm DS_READ_U16 : DS_1A_RET_mc<"ds_read_u16">;
518defm DS_READ_B32 : DS_1A_RET_mc<"ds_read_b32">;
519defm DS_READ_B64 : DS_1A_RET_mc<"ds_read_b64", VReg_64>;
Valery Pykhtin902db312016-08-01 14:21:30 +0000520
Matt Arsenault10c472d2017-11-15 01:34:06 +0000521defm DS_READ2_B32 : DS_1A_Off8_RET_mc<"ds_read2_b32", VReg_64>;
522defm DS_READ2ST64_B32: DS_1A_Off8_RET_mc<"ds_read2st64_b32", VReg_64>;
Valery Pykhtin902db312016-08-01 14:21:30 +0000523
Matt Arsenault10c472d2017-11-15 01:34:06 +0000524defm DS_READ2_B64 : DS_1A_Off8_RET_mc<"ds_read2_b64", VReg_128>;
525defm DS_READ2ST64_B64: DS_1A_Off8_RET_mc<"ds_read2st64_b64", VReg_128>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000526
Matt Arsenault10c472d2017-11-15 01:34:06 +0000527let has_m0_read = 0 in {
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000528let SubtargetPredicate = HasD16LoadStore in {
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000529def DS_READ_U8_D16 : DS_1A_RET_Tied<"ds_read_u8_d16">;
530def DS_READ_U8_D16_HI : DS_1A_RET_Tied<"ds_read_u8_d16_hi">;
531def DS_READ_I8_D16 : DS_1A_RET_Tied<"ds_read_i8_d16">;
532def DS_READ_I8_D16_HI : DS_1A_RET_Tied<"ds_read_i8_d16_hi">;
533def DS_READ_U16_D16 : DS_1A_RET_Tied<"ds_read_u16_d16">;
534def DS_READ_U16_D16_HI : DS_1A_RET_Tied<"ds_read_u16_d16_hi">;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000535}
Matt Arsenaultefa1d652017-09-01 18:38:02 +0000536
537let SubtargetPredicate = HasDSAddTid in {
538def DS_READ_ADDTID_B32 : DS_1A_RET<"ds_read_addtid_b32">;
539}
Matt Arsenault10c472d2017-11-15 01:34:06 +0000540} // End has_m0_read = 0
Valery Pykhtin902db312016-08-01 14:21:30 +0000541}
542
Valery Pykhtin902db312016-08-01 14:21:30 +0000543def DS_CONSUME : DS_0A_RET<"ds_consume">;
544def DS_APPEND : DS_0A_RET<"ds_append">;
545def DS_ORDERED_COUNT : DS_1A_RET_GDS<"ds_ordered_count">;
Valery Pykhtin902db312016-08-01 14:21:30 +0000546
547//===----------------------------------------------------------------------===//
548// Instruction definitions for CI and newer.
549//===----------------------------------------------------------------------===//
Valery Pykhtin902db312016-08-01 14:21:30 +0000550
Konstantin Zhuravlyov9a278bf2019-02-22 23:21:06 +0000551let SubtargetPredicate = isCIVI in {
Valery Pykhtin902db312016-08-01 14:21:30 +0000552
Matt Arsenault10c472d2017-11-15 01:34:06 +0000553defm DS_WRAP_RTN_B32 : DS_1A2D_RET_mc<"ds_wrap_rtn_b32", VGPR_32>;
554defm DS_CONDXCHG32_RTN_B64 : DS_1A1D_RET_mc<"ds_condxchg32_rtn_b64", VReg_64>;
Dmitry Preobrazhenskye5147242017-04-07 13:07:13 +0000555
556def DS_GWS_SEMA_RELEASE_ALL : DS_GWS_0D<"ds_gws_sema_release_all">;
Valery Pykhtin902db312016-08-01 14:21:30 +0000557
Matt Arsenaultdedc5442017-02-28 20:15:43 +0000558let mayStore = 0 in {
Matt Arsenault10c472d2017-11-15 01:34:06 +0000559defm DS_READ_B96 : DS_1A_RET_mc<"ds_read_b96", VReg_96>;
560defm DS_READ_B128: DS_1A_RET_mc<"ds_read_b128", VReg_128>;
Matt Arsenaultdedc5442017-02-28 20:15:43 +0000561} // End mayStore = 0
562
563let mayLoad = 0 in {
Matt Arsenault10c472d2017-11-15 01:34:06 +0000564defm DS_WRITE_B96 : DS_1A1D_NORET_mc<"ds_write_b96", VReg_96>;
565defm DS_WRITE_B128 : DS_1A1D_NORET_mc<"ds_write_b128", VReg_128>;
Matt Arsenaultdedc5442017-02-28 20:15:43 +0000566} // End mayLoad = 0
567
Matt Arsenault78124982017-02-28 20:15:46 +0000568def DS_NOP : DS_VOID<"ds_nop">;
Matt Arsenaultdedc5442017-02-28 20:15:43 +0000569
Konstantin Zhuravlyov9a278bf2019-02-22 23:21:06 +0000570} // let SubtargetPredicate = isCIVI
Valery Pykhtin902db312016-08-01 14:21:30 +0000571
572//===----------------------------------------------------------------------===//
573// Instruction definitions for VI and newer.
574//===----------------------------------------------------------------------===//
575
Konstantin Zhuravlyov9a278bf2019-02-22 23:21:06 +0000576let SubtargetPredicate = isVI in {
Valery Pykhtin902db312016-08-01 14:21:30 +0000577
578let Uses = [EXEC] in {
579def DS_PERMUTE_B32 : DS_1A1D_PERMUTE <"ds_permute_b32",
580 int_amdgcn_ds_permute>;
581def DS_BPERMUTE_B32 : DS_1A1D_PERMUTE <"ds_bpermute_b32",
582 int_amdgcn_ds_bpermute>;
583}
584
Dmitry Preobrazhensky622bde82018-03-28 16:21:56 +0000585def DS_ADD_SRC2_F32 : DS_1A<"ds_add_src2_f32">;
586
Konstantin Zhuravlyov9a278bf2019-02-22 23:21:06 +0000587} // let SubtargetPredicate = isVI
Valery Pykhtin902db312016-08-01 14:21:30 +0000588
589//===----------------------------------------------------------------------===//
590// DS Patterns
591//===----------------------------------------------------------------------===//
592
Matt Arsenault90c75932017-10-03 00:06:41 +0000593def : GCNPat <
Valery Pykhtin902db312016-08-01 14:21:30 +0000594 (int_amdgcn_ds_swizzle i32:$src, imm:$offset16),
595 (DS_SWIZZLE_B32 $src, (as_i16imm $offset16), (i1 0))
596>;
597
Matt Arsenault90c75932017-10-03 00:06:41 +0000598class DSReadPat <DS_Pseudo inst, ValueType vt, PatFrag frag> : GCNPat <
Valery Pykhtin902db312016-08-01 14:21:30 +0000599 (vt (frag (DS1Addr1Offset i32:$ptr, i32:$offset))),
600 (inst $ptr, (as_i16imm $offset), (i1 0))
601>;
602
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000603multiclass DSReadPat_mc<DS_Pseudo inst, ValueType vt, string frag> {
604
605 let OtherPredicates = [LDSRequiresM0Init] in {
606 def : DSReadPat<inst, vt, !cast<PatFrag>(frag#"_m0")>;
607 }
608
609 let OtherPredicates = [NotLDSRequiresM0Init] in {
Nicolai Haehnle40b140f2018-02-22 15:25:11 +0000610 def : DSReadPat<!cast<DS_Pseudo>(!cast<string>(inst)#"_gfx9"), vt, !cast<PatFrag>(frag)>;
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000611 }
612}
613
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000614class DSReadPat_D16 <DS_Pseudo inst, PatFrag frag, ValueType vt> : GCNPat <
615 (frag (DS1Addr1Offset i32:$ptr, i32:$offset), vt:$in),
616 (inst $ptr, (as_i16imm $offset), (i1 0), $in)
617>;
Matt Arsenaulte1cd4822017-11-13 00:22:09 +0000618
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000619defm : DSReadPat_mc <DS_READ_I8, i32, "sextloadi8_local">;
620defm : DSReadPat_mc <DS_READ_U8, i32, "az_extloadi8_local">;
621defm : DSReadPat_mc <DS_READ_I8, i16, "sextloadi8_local">;
622defm : DSReadPat_mc <DS_READ_U8, i16, "az_extloadi8_local">;
623defm : DSReadPat_mc <DS_READ_I16, i32, "sextloadi16_local">;
624defm : DSReadPat_mc <DS_READ_I16, i32, "sextloadi16_local">;
625defm : DSReadPat_mc <DS_READ_U16, i32, "az_extloadi16_local">;
626defm : DSReadPat_mc <DS_READ_U16, i16, "load_local">;
627defm : DSReadPat_mc <DS_READ_B32, i32, "load_local">;
Matt Arsenault3f8e7a32018-06-22 08:39:52 +0000628defm : DSReadPat_mc <DS_READ_B32, i32, "atomic_load_32_local">;
629defm : DSReadPat_mc <DS_READ_B64, i64, "atomic_load_64_local">;
Valery Pykhtin902db312016-08-01 14:21:30 +0000630
631let AddedComplexity = 100 in {
632
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000633defm : DSReadPat_mc <DS_READ_B64, v2i32, "load_align8_local">;
Farhana Aleena7cb3112018-03-09 17:41:39 +0000634defm : DSReadPat_mc <DS_READ_B128, v4i32, "load_align16_local">;
Valery Pykhtin902db312016-08-01 14:21:30 +0000635
636} // End AddedComplexity = 100
637
Konstantin Zhuravlyovc2c2eb72018-05-04 20:06:57 +0000638let OtherPredicates = [D16PreservesUnusedBits] in {
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000639def : DSReadPat_D16<DS_READ_U16_D16_HI, load_d16_hi_local, v2i16>;
640def : DSReadPat_D16<DS_READ_U16_D16_HI, load_d16_hi_local, v2f16>;
641def : DSReadPat_D16<DS_READ_U8_D16_HI, az_extloadi8_d16_hi_local, v2i16>;
642def : DSReadPat_D16<DS_READ_U8_D16_HI, az_extloadi8_d16_hi_local, v2f16>;
643def : DSReadPat_D16<DS_READ_I8_D16_HI, sextloadi8_d16_hi_local, v2i16>;
644def : DSReadPat_D16<DS_READ_I8_D16_HI, sextloadi8_d16_hi_local, v2f16>;
Matt Arsenaulte1cd4822017-11-13 00:22:09 +0000645
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000646def : DSReadPat_D16<DS_READ_U16_D16, load_d16_lo_local, v2i16>;
647def : DSReadPat_D16<DS_READ_U16_D16, load_d16_lo_local, v2f16>;
648def : DSReadPat_D16<DS_READ_U8_D16, az_extloadi8_d16_lo_local, v2i16>;
649def : DSReadPat_D16<DS_READ_U8_D16, az_extloadi8_d16_lo_local, v2f16>;
650def : DSReadPat_D16<DS_READ_I8_D16, sextloadi8_d16_lo_local, v2i16>;
651def : DSReadPat_D16<DS_READ_I8_D16, sextloadi8_d16_lo_local, v2f16>;
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000652}
653
Matt Arsenault90c75932017-10-03 00:06:41 +0000654class DSWritePat <DS_Pseudo inst, ValueType vt, PatFrag frag> : GCNPat <
Valery Pykhtin902db312016-08-01 14:21:30 +0000655 (frag vt:$value, (DS1Addr1Offset i32:$ptr, i32:$offset)),
656 (inst $ptr, $value, (as_i16imm $offset), (i1 0))
657>;
658
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000659multiclass DSWritePat_mc <DS_Pseudo inst, ValueType vt, string frag> {
660 let OtherPredicates = [LDSRequiresM0Init] in {
661 def : DSWritePat<inst, vt, !cast<PatFrag>(frag#"_m0")>;
662 }
663
664 let OtherPredicates = [NotLDSRequiresM0Init] in {
Nicolai Haehnle40b140f2018-02-22 15:25:11 +0000665 def : DSWritePat<!cast<DS_Pseudo>(!cast<string>(inst)#"_gfx9"), vt, !cast<PatFrag>(frag)>;
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000666 }
667}
668
Matt Arsenault3f8e7a32018-06-22 08:39:52 +0000669// Irritatingly, atomic_store reverses the order of operands from a
670// normal store.
671class DSAtomicWritePat <DS_Pseudo inst, ValueType vt, PatFrag frag> : GCNPat <
672 (frag (DS1Addr1Offset i32:$ptr, i32:$offset), vt:$value),
673 (inst $ptr, $value, (as_i16imm $offset), (i1 0))
674>;
675
676multiclass DSAtomicWritePat_mc <DS_Pseudo inst, ValueType vt, string frag> {
677 let OtherPredicates = [LDSRequiresM0Init] in {
678 def : DSAtomicWritePat<inst, vt, !cast<PatFrag>(frag#"_m0")>;
679 }
680
681 let OtherPredicates = [NotLDSRequiresM0Init] in {
682 def : DSAtomicWritePat<!cast<DS_Pseudo>(!cast<string>(inst)#"_gfx9"), vt, !cast<PatFrag>(frag)>;
683 }
684}
685
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000686defm : DSWritePat_mc <DS_WRITE_B8, i32, "truncstorei8_local">;
687defm : DSWritePat_mc <DS_WRITE_B16, i32, "truncstorei16_local">;
688defm : DSWritePat_mc <DS_WRITE_B8, i16, "truncstorei8_local">;
689defm : DSWritePat_mc <DS_WRITE_B16, i16, "store_local">;
690defm : DSWritePat_mc <DS_WRITE_B32, i32, "store_local">;
Matt Arsenault3f8e7a32018-06-22 08:39:52 +0000691defm : DSAtomicWritePat_mc <DS_WRITE_B32, i32, "atomic_store_local">;
692defm : DSAtomicWritePat_mc <DS_WRITE_B64, i64, "atomic_store_local">;
Valery Pykhtin902db312016-08-01 14:21:30 +0000693
Konstantin Zhuravlyovc2c2eb72018-05-04 20:06:57 +0000694let OtherPredicates = [D16PreservesUnusedBits] in {
Matt Arsenaultfcc213f2017-09-20 03:20:09 +0000695def : DSWritePat <DS_WRITE_B16_D16_HI, i32, store_local_hi16>;
696def : DSWritePat <DS_WRITE_B8_D16_HI, i32, truncstorei8_local_hi16>;
697}
698
Valery Pykhtin902db312016-08-01 14:21:30 +0000699
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000700class DS64Bit4ByteAlignedReadPat<DS_Pseudo inst, PatFrag frag> : GCNPat <
701 (v2i32 (frag (DS64Bit4ByteAligned i32:$ptr, i8:$offset0, i8:$offset1))),
702 (inst $ptr, $offset0, $offset1, (i1 0))
Valery Pykhtin902db312016-08-01 14:21:30 +0000703>;
704
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000705class DS64Bit4ByteAlignedWritePat<DS_Pseudo inst, PatFrag frag> : GCNPat<
706 (frag v2i32:$value, (DS64Bit4ByteAligned i32:$ptr, i8:$offset0, i8:$offset1)),
707 (inst $ptr, (i32 (EXTRACT_SUBREG $value, sub0)),
708 (i32 (EXTRACT_SUBREG $value, sub1)), $offset0, $offset1,
709 (i1 0))
710>;
711
Nicolai Haehnle48219372018-10-17 15:37:48 +0000712// v2i32 loads are split into i32 loads on SI during lowering, due to a bug
713// related to bounds checking.
Konstantin Zhuravlyov9a278bf2019-02-22 23:21:06 +0000714let OtherPredicates = [LDSRequiresM0Init, isCIVI] in {
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000715def : DS64Bit4ByteAlignedReadPat<DS_READ2_B32, load_local_m0>;
716def : DS64Bit4ByteAlignedWritePat<DS_WRITE2_B32, store_local_m0>;
717}
718
719let OtherPredicates = [NotLDSRequiresM0Init] in {
720def : DS64Bit4ByteAlignedReadPat<DS_READ2_B32_gfx9, load_local>;
721def : DS64Bit4ByteAlignedWritePat<DS_WRITE2_B32_gfx9, store_local>;
722}
723
724
725let AddedComplexity = 100 in {
726
727defm : DSWritePat_mc <DS_WRITE_B64, v2i32, "store_align8_local">;
Farhana Aleenc6c9dc82018-03-16 18:12:00 +0000728defm : DSWritePat_mc <DS_WRITE_B128, v4i32, "store_align16_local">;
729
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000730} // End AddedComplexity = 100
Matt Arsenault90c75932017-10-03 00:06:41 +0000731class DSAtomicRetPat<DS_Pseudo inst, ValueType vt, PatFrag frag> : GCNPat <
Valery Pykhtin902db312016-08-01 14:21:30 +0000732 (frag (DS1Addr1Offset i32:$ptr, i32:$offset), vt:$value),
733 (inst $ptr, $value, (as_i16imm $offset), (i1 0))
734>;
735
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000736multiclass DSAtomicRetPat_mc<DS_Pseudo inst, ValueType vt, string frag> {
737 let OtherPredicates = [LDSRequiresM0Init] in {
738 def : DSAtomicRetPat<inst, vt, !cast<PatFrag>(frag#"_m0")>;
739 }
740
741 let OtherPredicates = [NotLDSRequiresM0Init] in {
Nicolai Haehnle40b140f2018-02-22 15:25:11 +0000742 def : DSAtomicRetPat<!cast<DS_Pseudo>(!cast<string>(inst)#"_gfx9"), vt,
743 !cast<PatFrag>(frag)>;
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000744 }
745}
746
747
748
Matt Arsenault90c75932017-10-03 00:06:41 +0000749class DSAtomicCmpXChg<DS_Pseudo inst, ValueType vt, PatFrag frag> : GCNPat <
Valery Pykhtin902db312016-08-01 14:21:30 +0000750 (frag (DS1Addr1Offset i32:$ptr, i32:$offset), vt:$cmp, vt:$swap),
751 (inst $ptr, $cmp, $swap, (as_i16imm $offset), (i1 0))
752>;
753
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000754multiclass DSAtomicCmpXChg_mc<DS_Pseudo inst, ValueType vt, string frag> {
755 let OtherPredicates = [LDSRequiresM0Init] in {
756 def : DSAtomicCmpXChg<inst, vt, !cast<PatFrag>(frag#"_m0")>;
757 }
758
759 let OtherPredicates = [NotLDSRequiresM0Init] in {
Nicolai Haehnle40b140f2018-02-22 15:25:11 +0000760 def : DSAtomicCmpXChg<!cast<DS_Pseudo>(!cast<string>(inst)#"_gfx9"), vt,
761 !cast<PatFrag>(frag)>;
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000762 }
763}
764
765
Valery Pykhtin902db312016-08-01 14:21:30 +0000766
767// 32-bit atomics.
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000768defm : DSAtomicRetPat_mc<DS_WRXCHG_RTN_B32, i32, "atomic_swap_local">;
769defm : DSAtomicRetPat_mc<DS_ADD_RTN_U32, i32, "atomic_load_add_local">;
770defm : DSAtomicRetPat_mc<DS_SUB_RTN_U32, i32, "atomic_load_sub_local">;
771defm : DSAtomicRetPat_mc<DS_INC_RTN_U32, i32, "atomic_inc_local">;
772defm : DSAtomicRetPat_mc<DS_DEC_RTN_U32, i32, "atomic_dec_local">;
773defm : DSAtomicRetPat_mc<DS_AND_RTN_B32, i32, "atomic_load_and_local">;
774defm : DSAtomicRetPat_mc<DS_OR_RTN_B32, i32, "atomic_load_or_local">;
775defm : DSAtomicRetPat_mc<DS_XOR_RTN_B32, i32, "atomic_load_xor_local">;
776defm : DSAtomicRetPat_mc<DS_MIN_RTN_I32, i32, "atomic_load_min_local">;
777defm : DSAtomicRetPat_mc<DS_MAX_RTN_I32, i32, "atomic_load_max_local">;
778defm : DSAtomicRetPat_mc<DS_MIN_RTN_U32, i32, "atomic_load_umin_local">;
779defm : DSAtomicRetPat_mc<DS_MAX_RTN_U32, i32, "atomic_load_umax_local">;
780defm : DSAtomicCmpXChg_mc<DS_CMPST_RTN_B32, i32, "atomic_cmp_swap_local">;
Daniil Fukalovd5fca552018-01-17 14:05:05 +0000781defm : DSAtomicRetPat_mc<DS_MIN_RTN_F32, f32, "atomic_load_fmin_local">;
782defm : DSAtomicRetPat_mc<DS_MAX_RTN_F32, f32, "atomic_load_fmax_local">;
783defm : DSAtomicRetPat_mc<DS_ADD_RTN_F32, f32, "atomic_load_fadd_local">;
Valery Pykhtin902db312016-08-01 14:21:30 +0000784
785// 64-bit atomics.
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000786defm : DSAtomicRetPat_mc<DS_WRXCHG_RTN_B64, i64, "atomic_swap_local">;
787defm : DSAtomicRetPat_mc<DS_ADD_RTN_U64, i64, "atomic_load_add_local">;
788defm : DSAtomicRetPat_mc<DS_SUB_RTN_U64, i64, "atomic_load_sub_local">;
789defm : DSAtomicRetPat_mc<DS_INC_RTN_U64, i64, "atomic_inc_local">;
790defm : DSAtomicRetPat_mc<DS_DEC_RTN_U64, i64, "atomic_dec_local">;
791defm : DSAtomicRetPat_mc<DS_AND_RTN_B64, i64, "atomic_load_and_local">;
792defm : DSAtomicRetPat_mc<DS_OR_RTN_B64, i64, "atomic_load_or_local">;
793defm : DSAtomicRetPat_mc<DS_XOR_RTN_B64, i64, "atomic_load_xor_local">;
794defm : DSAtomicRetPat_mc<DS_MIN_RTN_I64, i64, "atomic_load_min_local">;
795defm : DSAtomicRetPat_mc<DS_MAX_RTN_I64, i64, "atomic_load_max_local">;
796defm : DSAtomicRetPat_mc<DS_MIN_RTN_U64, i64, "atomic_load_umin_local">;
797defm : DSAtomicRetPat_mc<DS_MAX_RTN_U64, i64, "atomic_load_umax_local">;
Valery Pykhtin902db312016-08-01 14:21:30 +0000798
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000799defm : DSAtomicCmpXChg_mc<DS_CMPST_RTN_B64, i64, "atomic_cmp_swap_local">;
Valery Pykhtin902db312016-08-01 14:21:30 +0000800
Marek Olsakc5cec5e2019-01-16 15:43:53 +0000801def : Pat <
802 (SIds_ordered_count i32:$value, i16:$offset),
803 (DS_ORDERED_COUNT $value, (as_i16imm $offset))
804>;
805
Valery Pykhtin902db312016-08-01 14:21:30 +0000806//===----------------------------------------------------------------------===//
807// Real instructions
808//===----------------------------------------------------------------------===//
809
810//===----------------------------------------------------------------------===//
811// SIInstructions.td
812//===----------------------------------------------------------------------===//
813
814class DS_Real_si <bits<8> op, DS_Pseudo ds> :
815 DS_Real <ds>,
816 SIMCInstr <ds.Mnemonic, SIEncodingFamily.SI> {
Konstantin Zhuravlyov9a278bf2019-02-22 23:21:06 +0000817 let AssemblerPredicates=[isSICI];
Valery Pykhtin902db312016-08-01 14:21:30 +0000818 let DecoderNamespace="SICI";
819
820 // encoding
821 let Inst{7-0} = !if(ds.has_offset0, offset0, 0);
822 let Inst{15-8} = !if(ds.has_offset1, offset1, 0);
823 let Inst{17} = !if(ds.has_gds, gds, ds.gdsValue);
824 let Inst{25-18} = op;
825 let Inst{31-26} = 0x36; // ds prefix
826 let Inst{39-32} = !if(ds.has_addr, addr, 0);
827 let Inst{47-40} = !if(ds.has_data0, data0, 0);
828 let Inst{55-48} = !if(ds.has_data1, data1, 0);
829 let Inst{63-56} = !if(ds.has_vdst, vdst, 0);
830}
831
832def DS_ADD_U32_si : DS_Real_si<0x0, DS_ADD_U32>;
833def DS_SUB_U32_si : DS_Real_si<0x1, DS_SUB_U32>;
834def DS_RSUB_U32_si : DS_Real_si<0x2, DS_RSUB_U32>;
835def DS_INC_U32_si : DS_Real_si<0x3, DS_INC_U32>;
836def DS_DEC_U32_si : DS_Real_si<0x4, DS_DEC_U32>;
837def DS_MIN_I32_si : DS_Real_si<0x5, DS_MIN_I32>;
838def DS_MAX_I32_si : DS_Real_si<0x6, DS_MAX_I32>;
839def DS_MIN_U32_si : DS_Real_si<0x7, DS_MIN_U32>;
840def DS_MAX_U32_si : DS_Real_si<0x8, DS_MAX_U32>;
841def DS_AND_B32_si : DS_Real_si<0x9, DS_AND_B32>;
842def DS_OR_B32_si : DS_Real_si<0xa, DS_OR_B32>;
843def DS_XOR_B32_si : DS_Real_si<0xb, DS_XOR_B32>;
844def DS_MSKOR_B32_si : DS_Real_si<0xc, DS_MSKOR_B32>;
845def DS_WRITE_B32_si : DS_Real_si<0xd, DS_WRITE_B32>;
846def DS_WRITE2_B32_si : DS_Real_si<0xe, DS_WRITE2_B32>;
847def DS_WRITE2ST64_B32_si : DS_Real_si<0xf, DS_WRITE2ST64_B32>;
848def DS_CMPST_B32_si : DS_Real_si<0x10, DS_CMPST_B32>;
849def DS_CMPST_F32_si : DS_Real_si<0x11, DS_CMPST_F32>;
850def DS_MIN_F32_si : DS_Real_si<0x12, DS_MIN_F32>;
851def DS_MAX_F32_si : DS_Real_si<0x13, DS_MAX_F32>;
Matt Arsenault78124982017-02-28 20:15:46 +0000852def DS_NOP_si : DS_Real_si<0x14, DS_NOP>;
Valery Pykhtin902db312016-08-01 14:21:30 +0000853def DS_GWS_INIT_si : DS_Real_si<0x19, DS_GWS_INIT>;
854def DS_GWS_SEMA_V_si : DS_Real_si<0x1a, DS_GWS_SEMA_V>;
855def DS_GWS_SEMA_BR_si : DS_Real_si<0x1b, DS_GWS_SEMA_BR>;
856def DS_GWS_SEMA_P_si : DS_Real_si<0x1c, DS_GWS_SEMA_P>;
857def DS_GWS_BARRIER_si : DS_Real_si<0x1d, DS_GWS_BARRIER>;
858def DS_WRITE_B8_si : DS_Real_si<0x1e, DS_WRITE_B8>;
859def DS_WRITE_B16_si : DS_Real_si<0x1f, DS_WRITE_B16>;
860def DS_ADD_RTN_U32_si : DS_Real_si<0x20, DS_ADD_RTN_U32>;
861def DS_SUB_RTN_U32_si : DS_Real_si<0x21, DS_SUB_RTN_U32>;
862def DS_RSUB_RTN_U32_si : DS_Real_si<0x22, DS_RSUB_RTN_U32>;
863def DS_INC_RTN_U32_si : DS_Real_si<0x23, DS_INC_RTN_U32>;
864def DS_DEC_RTN_U32_si : DS_Real_si<0x24, DS_DEC_RTN_U32>;
865def DS_MIN_RTN_I32_si : DS_Real_si<0x25, DS_MIN_RTN_I32>;
866def DS_MAX_RTN_I32_si : DS_Real_si<0x26, DS_MAX_RTN_I32>;
867def DS_MIN_RTN_U32_si : DS_Real_si<0x27, DS_MIN_RTN_U32>;
868def DS_MAX_RTN_U32_si : DS_Real_si<0x28, DS_MAX_RTN_U32>;
869def DS_AND_RTN_B32_si : DS_Real_si<0x29, DS_AND_RTN_B32>;
870def DS_OR_RTN_B32_si : DS_Real_si<0x2a, DS_OR_RTN_B32>;
871def DS_XOR_RTN_B32_si : DS_Real_si<0x2b, DS_XOR_RTN_B32>;
872def DS_MSKOR_RTN_B32_si : DS_Real_si<0x2c, DS_MSKOR_RTN_B32>;
873def DS_WRXCHG_RTN_B32_si : DS_Real_si<0x2d, DS_WRXCHG_RTN_B32>;
874def DS_WRXCHG2_RTN_B32_si : DS_Real_si<0x2e, DS_WRXCHG2_RTN_B32>;
875def DS_WRXCHG2ST64_RTN_B32_si : DS_Real_si<0x2f, DS_WRXCHG2ST64_RTN_B32>;
876def DS_CMPST_RTN_B32_si : DS_Real_si<0x30, DS_CMPST_RTN_B32>;
877def DS_CMPST_RTN_F32_si : DS_Real_si<0x31, DS_CMPST_RTN_F32>;
878def DS_MIN_RTN_F32_si : DS_Real_si<0x32, DS_MIN_RTN_F32>;
879def DS_MAX_RTN_F32_si : DS_Real_si<0x33, DS_MAX_RTN_F32>;
880
Dmitry Preobrazhenskye5147242017-04-07 13:07:13 +0000881// These instruction are CI/VI only
882def DS_WRAP_RTN_B32_si : DS_Real_si<0x34, DS_WRAP_RTN_B32>;
883def DS_CONDXCHG32_RTN_B64_si : DS_Real_si<0x7e, DS_CONDXCHG32_RTN_B64>;
884def DS_GWS_SEMA_RELEASE_ALL_si : DS_Real_si<0x18, DS_GWS_SEMA_RELEASE_ALL>;
Valery Pykhtin902db312016-08-01 14:21:30 +0000885
886def DS_SWIZZLE_B32_si : DS_Real_si<0x35, DS_SWIZZLE_B32>;
887def DS_READ_B32_si : DS_Real_si<0x36, DS_READ_B32>;
888def DS_READ2_B32_si : DS_Real_si<0x37, DS_READ2_B32>;
889def DS_READ2ST64_B32_si : DS_Real_si<0x38, DS_READ2ST64_B32>;
890def DS_READ_I8_si : DS_Real_si<0x39, DS_READ_I8>;
891def DS_READ_U8_si : DS_Real_si<0x3a, DS_READ_U8>;
892def DS_READ_I16_si : DS_Real_si<0x3b, DS_READ_I16>;
893def DS_READ_U16_si : DS_Real_si<0x3c, DS_READ_U16>;
894def DS_CONSUME_si : DS_Real_si<0x3d, DS_CONSUME>;
895def DS_APPEND_si : DS_Real_si<0x3e, DS_APPEND>;
896def DS_ORDERED_COUNT_si : DS_Real_si<0x3f, DS_ORDERED_COUNT>;
897def DS_ADD_U64_si : DS_Real_si<0x40, DS_ADD_U64>;
898def DS_SUB_U64_si : DS_Real_si<0x41, DS_SUB_U64>;
899def DS_RSUB_U64_si : DS_Real_si<0x42, DS_RSUB_U64>;
900def DS_INC_U64_si : DS_Real_si<0x43, DS_INC_U64>;
901def DS_DEC_U64_si : DS_Real_si<0x44, DS_DEC_U64>;
902def DS_MIN_I64_si : DS_Real_si<0x45, DS_MIN_I64>;
903def DS_MAX_I64_si : DS_Real_si<0x46, DS_MAX_I64>;
904def DS_MIN_U64_si : DS_Real_si<0x47, DS_MIN_U64>;
905def DS_MAX_U64_si : DS_Real_si<0x48, DS_MAX_U64>;
906def DS_AND_B64_si : DS_Real_si<0x49, DS_AND_B64>;
907def DS_OR_B64_si : DS_Real_si<0x4a, DS_OR_B64>;
908def DS_XOR_B64_si : DS_Real_si<0x4b, DS_XOR_B64>;
909def DS_MSKOR_B64_si : DS_Real_si<0x4c, DS_MSKOR_B64>;
910def DS_WRITE_B64_si : DS_Real_si<0x4d, DS_WRITE_B64>;
911def DS_WRITE2_B64_si : DS_Real_si<0x4E, DS_WRITE2_B64>;
912def DS_WRITE2ST64_B64_si : DS_Real_si<0x4f, DS_WRITE2ST64_B64>;
913def DS_CMPST_B64_si : DS_Real_si<0x50, DS_CMPST_B64>;
914def DS_CMPST_F64_si : DS_Real_si<0x51, DS_CMPST_F64>;
915def DS_MIN_F64_si : DS_Real_si<0x52, DS_MIN_F64>;
916def DS_MAX_F64_si : DS_Real_si<0x53, DS_MAX_F64>;
917
918def DS_ADD_RTN_U64_si : DS_Real_si<0x60, DS_ADD_RTN_U64>;
919def DS_SUB_RTN_U64_si : DS_Real_si<0x61, DS_SUB_RTN_U64>;
920def DS_RSUB_RTN_U64_si : DS_Real_si<0x62, DS_RSUB_RTN_U64>;
921def DS_INC_RTN_U64_si : DS_Real_si<0x63, DS_INC_RTN_U64>;
922def DS_DEC_RTN_U64_si : DS_Real_si<0x64, DS_DEC_RTN_U64>;
923def DS_MIN_RTN_I64_si : DS_Real_si<0x65, DS_MIN_RTN_I64>;
924def DS_MAX_RTN_I64_si : DS_Real_si<0x66, DS_MAX_RTN_I64>;
925def DS_MIN_RTN_U64_si : DS_Real_si<0x67, DS_MIN_RTN_U64>;
926def DS_MAX_RTN_U64_si : DS_Real_si<0x68, DS_MAX_RTN_U64>;
927def DS_AND_RTN_B64_si : DS_Real_si<0x69, DS_AND_RTN_B64>;
928def DS_OR_RTN_B64_si : DS_Real_si<0x6a, DS_OR_RTN_B64>;
929def DS_XOR_RTN_B64_si : DS_Real_si<0x6b, DS_XOR_RTN_B64>;
930def DS_MSKOR_RTN_B64_si : DS_Real_si<0x6c, DS_MSKOR_RTN_B64>;
931def DS_WRXCHG_RTN_B64_si : DS_Real_si<0x6d, DS_WRXCHG_RTN_B64>;
932def DS_WRXCHG2_RTN_B64_si : DS_Real_si<0x6e, DS_WRXCHG2_RTN_B64>;
933def DS_WRXCHG2ST64_RTN_B64_si : DS_Real_si<0x6f, DS_WRXCHG2ST64_RTN_B64>;
934def DS_CMPST_RTN_B64_si : DS_Real_si<0x70, DS_CMPST_RTN_B64>;
935def DS_CMPST_RTN_F64_si : DS_Real_si<0x71, DS_CMPST_RTN_F64>;
936def DS_MIN_RTN_F64_si : DS_Real_si<0x72, DS_MIN_RTN_F64>;
937def DS_MAX_RTN_F64_si : DS_Real_si<0x73, DS_MAX_RTN_F64>;
938
939def DS_READ_B64_si : DS_Real_si<0x76, DS_READ_B64>;
940def DS_READ2_B64_si : DS_Real_si<0x77, DS_READ2_B64>;
941def DS_READ2ST64_B64_si : DS_Real_si<0x78, DS_READ2ST64_B64>;
942
943def DS_ADD_SRC2_U32_si : DS_Real_si<0x80, DS_ADD_SRC2_U32>;
944def DS_SUB_SRC2_U32_si : DS_Real_si<0x81, DS_SUB_SRC2_U32>;
945def DS_RSUB_SRC2_U32_si : DS_Real_si<0x82, DS_RSUB_SRC2_U32>;
946def DS_INC_SRC2_U32_si : DS_Real_si<0x83, DS_INC_SRC2_U32>;
947def DS_DEC_SRC2_U32_si : DS_Real_si<0x84, DS_DEC_SRC2_U32>;
948def DS_MIN_SRC2_I32_si : DS_Real_si<0x85, DS_MIN_SRC2_I32>;
949def DS_MAX_SRC2_I32_si : DS_Real_si<0x86, DS_MAX_SRC2_I32>;
950def DS_MIN_SRC2_U32_si : DS_Real_si<0x87, DS_MIN_SRC2_U32>;
951def DS_MAX_SRC2_U32_si : DS_Real_si<0x88, DS_MAX_SRC2_U32>;
952def DS_AND_SRC2_B32_si : DS_Real_si<0x89, DS_AND_SRC2_B32>;
953def DS_OR_SRC2_B32_si : DS_Real_si<0x8a, DS_OR_SRC2_B32>;
954def DS_XOR_SRC2_B32_si : DS_Real_si<0x8b, DS_XOR_SRC2_B32>;
955def DS_WRITE_SRC2_B32_si : DS_Real_si<0x8d, DS_WRITE_SRC2_B32>;
956
957def DS_MIN_SRC2_F32_si : DS_Real_si<0x92, DS_MIN_SRC2_F32>;
958def DS_MAX_SRC2_F32_si : DS_Real_si<0x93, DS_MAX_SRC2_F32>;
959
960def DS_ADD_SRC2_U64_si : DS_Real_si<0xc0, DS_ADD_SRC2_U64>;
961def DS_SUB_SRC2_U64_si : DS_Real_si<0xc1, DS_SUB_SRC2_U64>;
962def DS_RSUB_SRC2_U64_si : DS_Real_si<0xc2, DS_RSUB_SRC2_U64>;
963def DS_INC_SRC2_U64_si : DS_Real_si<0xc3, DS_INC_SRC2_U64>;
964def DS_DEC_SRC2_U64_si : DS_Real_si<0xc4, DS_DEC_SRC2_U64>;
965def DS_MIN_SRC2_I64_si : DS_Real_si<0xc5, DS_MIN_SRC2_I64>;
966def DS_MAX_SRC2_I64_si : DS_Real_si<0xc6, DS_MAX_SRC2_I64>;
967def DS_MIN_SRC2_U64_si : DS_Real_si<0xc7, DS_MIN_SRC2_U64>;
968def DS_MAX_SRC2_U64_si : DS_Real_si<0xc8, DS_MAX_SRC2_U64>;
969def DS_AND_SRC2_B64_si : DS_Real_si<0xc9, DS_AND_SRC2_B64>;
970def DS_OR_SRC2_B64_si : DS_Real_si<0xca, DS_OR_SRC2_B64>;
971def DS_XOR_SRC2_B64_si : DS_Real_si<0xcb, DS_XOR_SRC2_B64>;
972def DS_WRITE_SRC2_B64_si : DS_Real_si<0xcd, DS_WRITE_SRC2_B64>;
973
974def DS_MIN_SRC2_F64_si : DS_Real_si<0xd2, DS_MIN_SRC2_F64>;
975def DS_MAX_SRC2_F64_si : DS_Real_si<0xd3, DS_MAX_SRC2_F64>;
Matt Arsenaultdedc5442017-02-28 20:15:43 +0000976def DS_WRITE_B96_si : DS_Real_si<0xde, DS_WRITE_B96>;
977def DS_WRITE_B128_si : DS_Real_si<0xdf, DS_WRITE_B128>;
978def DS_READ_B96_si : DS_Real_si<0xfe, DS_READ_B96>;
979def DS_READ_B128_si : DS_Real_si<0xff, DS_READ_B128>;
Valery Pykhtin902db312016-08-01 14:21:30 +0000980
981//===----------------------------------------------------------------------===//
982// VIInstructions.td
983//===----------------------------------------------------------------------===//
984
985class DS_Real_vi <bits<8> op, DS_Pseudo ds> :
986 DS_Real <ds>,
987 SIMCInstr <ds.Mnemonic, SIEncodingFamily.VI> {
Konstantin Zhuravlyov9a278bf2019-02-22 23:21:06 +0000988 let AssemblerPredicates = [isVI];
Valery Pykhtin902db312016-08-01 14:21:30 +0000989 let DecoderNamespace="VI";
990
Matt Arsenaultf3dd8632016-11-01 00:55:14 +0000991 // encoding
Valery Pykhtin902db312016-08-01 14:21:30 +0000992 let Inst{7-0} = !if(ds.has_offset0, offset0, 0);
993 let Inst{15-8} = !if(ds.has_offset1, offset1, 0);
994 let Inst{16} = !if(ds.has_gds, gds, ds.gdsValue);
995 let Inst{24-17} = op;
996 let Inst{31-26} = 0x36; // ds prefix
997 let Inst{39-32} = !if(ds.has_addr, addr, 0);
998 let Inst{47-40} = !if(ds.has_data0, data0, 0);
999 let Inst{55-48} = !if(ds.has_data1, data1, 0);
1000 let Inst{63-56} = !if(ds.has_vdst, vdst, 0);
1001}
1002
1003def DS_ADD_U32_vi : DS_Real_vi<0x0, DS_ADD_U32>;
1004def DS_SUB_U32_vi : DS_Real_vi<0x1, DS_SUB_U32>;
1005def DS_RSUB_U32_vi : DS_Real_vi<0x2, DS_RSUB_U32>;
1006def DS_INC_U32_vi : DS_Real_vi<0x3, DS_INC_U32>;
1007def DS_DEC_U32_vi : DS_Real_vi<0x4, DS_DEC_U32>;
1008def DS_MIN_I32_vi : DS_Real_vi<0x5, DS_MIN_I32>;
1009def DS_MAX_I32_vi : DS_Real_vi<0x6, DS_MAX_I32>;
1010def DS_MIN_U32_vi : DS_Real_vi<0x7, DS_MIN_U32>;
1011def DS_MAX_U32_vi : DS_Real_vi<0x8, DS_MAX_U32>;
1012def DS_AND_B32_vi : DS_Real_vi<0x9, DS_AND_B32>;
1013def DS_OR_B32_vi : DS_Real_vi<0xa, DS_OR_B32>;
1014def DS_XOR_B32_vi : DS_Real_vi<0xb, DS_XOR_B32>;
1015def DS_MSKOR_B32_vi : DS_Real_vi<0xc, DS_MSKOR_B32>;
1016def DS_WRITE_B32_vi : DS_Real_vi<0xd, DS_WRITE_B32>;
1017def DS_WRITE2_B32_vi : DS_Real_vi<0xe, DS_WRITE2_B32>;
1018def DS_WRITE2ST64_B32_vi : DS_Real_vi<0xf, DS_WRITE2ST64_B32>;
1019def DS_CMPST_B32_vi : DS_Real_vi<0x10, DS_CMPST_B32>;
1020def DS_CMPST_F32_vi : DS_Real_vi<0x11, DS_CMPST_F32>;
1021def DS_MIN_F32_vi : DS_Real_vi<0x12, DS_MIN_F32>;
1022def DS_MAX_F32_vi : DS_Real_vi<0x13, DS_MAX_F32>;
Matt Arsenault78124982017-02-28 20:15:46 +00001023def DS_NOP_vi : DS_Real_vi<0x14, DS_NOP>;
Artem Tamazov2e217b82016-09-21 16:35:44 +00001024def DS_ADD_F32_vi : DS_Real_vi<0x15, DS_ADD_F32>;
Dmitry Preobrazhenskye5147242017-04-07 13:07:13 +00001025def DS_GWS_INIT_vi : DS_Real_vi<0x99, DS_GWS_INIT>;
1026def DS_GWS_SEMA_V_vi : DS_Real_vi<0x9a, DS_GWS_SEMA_V>;
1027def DS_GWS_SEMA_BR_vi : DS_Real_vi<0x9b, DS_GWS_SEMA_BR>;
1028def DS_GWS_SEMA_P_vi : DS_Real_vi<0x9c, DS_GWS_SEMA_P>;
1029def DS_GWS_BARRIER_vi : DS_Real_vi<0x9d, DS_GWS_BARRIER>;
Matt Arsenaultefa1d652017-09-01 18:38:02 +00001030def DS_WRITE_ADDTID_B32_vi : DS_Real_vi<0x1d, DS_WRITE_ADDTID_B32>;
Valery Pykhtin902db312016-08-01 14:21:30 +00001031def DS_WRITE_B8_vi : DS_Real_vi<0x1e, DS_WRITE_B8>;
1032def DS_WRITE_B16_vi : DS_Real_vi<0x1f, DS_WRITE_B16>;
1033def DS_ADD_RTN_U32_vi : DS_Real_vi<0x20, DS_ADD_RTN_U32>;
1034def DS_SUB_RTN_U32_vi : DS_Real_vi<0x21, DS_SUB_RTN_U32>;
1035def DS_RSUB_RTN_U32_vi : DS_Real_vi<0x22, DS_RSUB_RTN_U32>;
1036def DS_INC_RTN_U32_vi : DS_Real_vi<0x23, DS_INC_RTN_U32>;
1037def DS_DEC_RTN_U32_vi : DS_Real_vi<0x24, DS_DEC_RTN_U32>;
1038def DS_MIN_RTN_I32_vi : DS_Real_vi<0x25, DS_MIN_RTN_I32>;
1039def DS_MAX_RTN_I32_vi : DS_Real_vi<0x26, DS_MAX_RTN_I32>;
1040def DS_MIN_RTN_U32_vi : DS_Real_vi<0x27, DS_MIN_RTN_U32>;
1041def DS_MAX_RTN_U32_vi : DS_Real_vi<0x28, DS_MAX_RTN_U32>;
1042def DS_AND_RTN_B32_vi : DS_Real_vi<0x29, DS_AND_RTN_B32>;
1043def DS_OR_RTN_B32_vi : DS_Real_vi<0x2a, DS_OR_RTN_B32>;
1044def DS_XOR_RTN_B32_vi : DS_Real_vi<0x2b, DS_XOR_RTN_B32>;
1045def DS_MSKOR_RTN_B32_vi : DS_Real_vi<0x2c, DS_MSKOR_RTN_B32>;
1046def DS_WRXCHG_RTN_B32_vi : DS_Real_vi<0x2d, DS_WRXCHG_RTN_B32>;
1047def DS_WRXCHG2_RTN_B32_vi : DS_Real_vi<0x2e, DS_WRXCHG2_RTN_B32>;
1048def DS_WRXCHG2ST64_RTN_B32_vi : DS_Real_vi<0x2f, DS_WRXCHG2ST64_RTN_B32>;
1049def DS_CMPST_RTN_B32_vi : DS_Real_vi<0x30, DS_CMPST_RTN_B32>;
1050def DS_CMPST_RTN_F32_vi : DS_Real_vi<0x31, DS_CMPST_RTN_F32>;
1051def DS_MIN_RTN_F32_vi : DS_Real_vi<0x32, DS_MIN_RTN_F32>;
1052def DS_MAX_RTN_F32_vi : DS_Real_vi<0x33, DS_MAX_RTN_F32>;
Dmitry Preobrazhenskye5147242017-04-07 13:07:13 +00001053def DS_WRAP_RTN_B32_vi : DS_Real_vi<0x34, DS_WRAP_RTN_B32>;
Artem Tamazov2e217b82016-09-21 16:35:44 +00001054def DS_ADD_RTN_F32_vi : DS_Real_vi<0x35, DS_ADD_RTN_F32>;
Valery Pykhtin902db312016-08-01 14:21:30 +00001055def DS_READ_B32_vi : DS_Real_vi<0x36, DS_READ_B32>;
1056def DS_READ2_B32_vi : DS_Real_vi<0x37, DS_READ2_B32>;
1057def DS_READ2ST64_B32_vi : DS_Real_vi<0x38, DS_READ2ST64_B32>;
1058def DS_READ_I8_vi : DS_Real_vi<0x39, DS_READ_I8>;
1059def DS_READ_U8_vi : DS_Real_vi<0x3a, DS_READ_U8>;
1060def DS_READ_I16_vi : DS_Real_vi<0x3b, DS_READ_I16>;
1061def DS_READ_U16_vi : DS_Real_vi<0x3c, DS_READ_U16>;
Matt Arsenaultefa1d652017-09-01 18:38:02 +00001062def DS_READ_ADDTID_B32_vi : DS_Real_vi<0xb6, DS_READ_ADDTID_B32>;
Dmitry Preobrazhenskye5147242017-04-07 13:07:13 +00001063def DS_CONSUME_vi : DS_Real_vi<0xbd, DS_CONSUME>;
1064def DS_APPEND_vi : DS_Real_vi<0xbe, DS_APPEND>;
1065def DS_ORDERED_COUNT_vi : DS_Real_vi<0xbf, DS_ORDERED_COUNT>;
Valery Pykhtin902db312016-08-01 14:21:30 +00001066def DS_SWIZZLE_B32_vi : DS_Real_vi<0x3d, DS_SWIZZLE_B32>;
1067def DS_PERMUTE_B32_vi : DS_Real_vi<0x3e, DS_PERMUTE_B32>;
1068def DS_BPERMUTE_B32_vi : DS_Real_vi<0x3f, DS_BPERMUTE_B32>;
1069
1070def DS_ADD_U64_vi : DS_Real_vi<0x40, DS_ADD_U64>;
1071def DS_SUB_U64_vi : DS_Real_vi<0x41, DS_SUB_U64>;
1072def DS_RSUB_U64_vi : DS_Real_vi<0x42, DS_RSUB_U64>;
1073def DS_INC_U64_vi : DS_Real_vi<0x43, DS_INC_U64>;
1074def DS_DEC_U64_vi : DS_Real_vi<0x44, DS_DEC_U64>;
1075def DS_MIN_I64_vi : DS_Real_vi<0x45, DS_MIN_I64>;
1076def DS_MAX_I64_vi : DS_Real_vi<0x46, DS_MAX_I64>;
1077def DS_MIN_U64_vi : DS_Real_vi<0x47, DS_MIN_U64>;
1078def DS_MAX_U64_vi : DS_Real_vi<0x48, DS_MAX_U64>;
1079def DS_AND_B64_vi : DS_Real_vi<0x49, DS_AND_B64>;
1080def DS_OR_B64_vi : DS_Real_vi<0x4a, DS_OR_B64>;
1081def DS_XOR_B64_vi : DS_Real_vi<0x4b, DS_XOR_B64>;
1082def DS_MSKOR_B64_vi : DS_Real_vi<0x4c, DS_MSKOR_B64>;
1083def DS_WRITE_B64_vi : DS_Real_vi<0x4d, DS_WRITE_B64>;
1084def DS_WRITE2_B64_vi : DS_Real_vi<0x4E, DS_WRITE2_B64>;
1085def DS_WRITE2ST64_B64_vi : DS_Real_vi<0x4f, DS_WRITE2ST64_B64>;
1086def DS_CMPST_B64_vi : DS_Real_vi<0x50, DS_CMPST_B64>;
1087def DS_CMPST_F64_vi : DS_Real_vi<0x51, DS_CMPST_F64>;
1088def DS_MIN_F64_vi : DS_Real_vi<0x52, DS_MIN_F64>;
1089def DS_MAX_F64_vi : DS_Real_vi<0x53, DS_MAX_F64>;
1090
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001091def DS_WRITE_B8_D16_HI_vi : DS_Real_vi<0x54, DS_WRITE_B8_D16_HI>;
1092def DS_WRITE_B16_D16_HI_vi : DS_Real_vi<0x55, DS_WRITE_B16_D16_HI>;
1093
1094def DS_READ_U8_D16_vi : DS_Real_vi<0x56, DS_READ_U8_D16>;
1095def DS_READ_U8_D16_HI_vi : DS_Real_vi<0x57, DS_READ_U8_D16_HI>;
1096def DS_READ_I8_D16_vi : DS_Real_vi<0x58, DS_READ_I8_D16>;
1097def DS_READ_I8_D16_HI_vi : DS_Real_vi<0x59, DS_READ_I8_D16_HI>;
1098def DS_READ_U16_D16_vi : DS_Real_vi<0x5a, DS_READ_U16_D16>;
1099def DS_READ_U16_D16_HI_vi : DS_Real_vi<0x5b, DS_READ_U16_D16_HI>;
1100
Valery Pykhtin902db312016-08-01 14:21:30 +00001101def DS_ADD_RTN_U64_vi : DS_Real_vi<0x60, DS_ADD_RTN_U64>;
1102def DS_SUB_RTN_U64_vi : DS_Real_vi<0x61, DS_SUB_RTN_U64>;
1103def DS_RSUB_RTN_U64_vi : DS_Real_vi<0x62, DS_RSUB_RTN_U64>;
1104def DS_INC_RTN_U64_vi : DS_Real_vi<0x63, DS_INC_RTN_U64>;
1105def DS_DEC_RTN_U64_vi : DS_Real_vi<0x64, DS_DEC_RTN_U64>;
1106def DS_MIN_RTN_I64_vi : DS_Real_vi<0x65, DS_MIN_RTN_I64>;
1107def DS_MAX_RTN_I64_vi : DS_Real_vi<0x66, DS_MAX_RTN_I64>;
1108def DS_MIN_RTN_U64_vi : DS_Real_vi<0x67, DS_MIN_RTN_U64>;
1109def DS_MAX_RTN_U64_vi : DS_Real_vi<0x68, DS_MAX_RTN_U64>;
1110def DS_AND_RTN_B64_vi : DS_Real_vi<0x69, DS_AND_RTN_B64>;
1111def DS_OR_RTN_B64_vi : DS_Real_vi<0x6a, DS_OR_RTN_B64>;
1112def DS_XOR_RTN_B64_vi : DS_Real_vi<0x6b, DS_XOR_RTN_B64>;
1113def DS_MSKOR_RTN_B64_vi : DS_Real_vi<0x6c, DS_MSKOR_RTN_B64>;
1114def DS_WRXCHG_RTN_B64_vi : DS_Real_vi<0x6d, DS_WRXCHG_RTN_B64>;
1115def DS_WRXCHG2_RTN_B64_vi : DS_Real_vi<0x6e, DS_WRXCHG2_RTN_B64>;
1116def DS_WRXCHG2ST64_RTN_B64_vi : DS_Real_vi<0x6f, DS_WRXCHG2ST64_RTN_B64>;
Dmitry Preobrazhenskye5147242017-04-07 13:07:13 +00001117def DS_CONDXCHG32_RTN_B64_vi : DS_Real_vi<0x7e, DS_CONDXCHG32_RTN_B64>;
1118def DS_GWS_SEMA_RELEASE_ALL_vi : DS_Real_vi<0x98, DS_GWS_SEMA_RELEASE_ALL>;
Valery Pykhtin902db312016-08-01 14:21:30 +00001119def DS_CMPST_RTN_B64_vi : DS_Real_vi<0x70, DS_CMPST_RTN_B64>;
1120def DS_CMPST_RTN_F64_vi : DS_Real_vi<0x71, DS_CMPST_RTN_F64>;
1121def DS_MIN_RTN_F64_vi : DS_Real_vi<0x72, DS_MIN_RTN_F64>;
1122def DS_MAX_RTN_F64_vi : DS_Real_vi<0x73, DS_MAX_RTN_F64>;
1123
1124def DS_READ_B64_vi : DS_Real_vi<0x76, DS_READ_B64>;
1125def DS_READ2_B64_vi : DS_Real_vi<0x77, DS_READ2_B64>;
1126def DS_READ2ST64_B64_vi : DS_Real_vi<0x78, DS_READ2ST64_B64>;
1127
1128def DS_ADD_SRC2_U32_vi : DS_Real_vi<0x80, DS_ADD_SRC2_U32>;
1129def DS_SUB_SRC2_U32_vi : DS_Real_vi<0x81, DS_SUB_SRC2_U32>;
1130def DS_RSUB_SRC2_U32_vi : DS_Real_vi<0x82, DS_RSUB_SRC2_U32>;
1131def DS_INC_SRC2_U32_vi : DS_Real_vi<0x83, DS_INC_SRC2_U32>;
1132def DS_DEC_SRC2_U32_vi : DS_Real_vi<0x84, DS_DEC_SRC2_U32>;
1133def DS_MIN_SRC2_I32_vi : DS_Real_vi<0x85, DS_MIN_SRC2_I32>;
1134def DS_MAX_SRC2_I32_vi : DS_Real_vi<0x86, DS_MAX_SRC2_I32>;
1135def DS_MIN_SRC2_U32_vi : DS_Real_vi<0x87, DS_MIN_SRC2_U32>;
1136def DS_MAX_SRC2_U32_vi : DS_Real_vi<0x88, DS_MAX_SRC2_U32>;
1137def DS_AND_SRC2_B32_vi : DS_Real_vi<0x89, DS_AND_SRC2_B32>;
1138def DS_OR_SRC2_B32_vi : DS_Real_vi<0x8a, DS_OR_SRC2_B32>;
1139def DS_XOR_SRC2_B32_vi : DS_Real_vi<0x8b, DS_XOR_SRC2_B32>;
1140def DS_WRITE_SRC2_B32_vi : DS_Real_vi<0x8d, DS_WRITE_SRC2_B32>;
1141def DS_MIN_SRC2_F32_vi : DS_Real_vi<0x92, DS_MIN_SRC2_F32>;
1142def DS_MAX_SRC2_F32_vi : DS_Real_vi<0x93, DS_MAX_SRC2_F32>;
Dmitry Preobrazhensky622bde82018-03-28 16:21:56 +00001143def DS_ADD_SRC2_F32_vi : DS_Real_vi<0x95, DS_ADD_SRC2_F32>;
Valery Pykhtin902db312016-08-01 14:21:30 +00001144def DS_ADD_SRC2_U64_vi : DS_Real_vi<0xc0, DS_ADD_SRC2_U64>;
1145def DS_SUB_SRC2_U64_vi : DS_Real_vi<0xc1, DS_SUB_SRC2_U64>;
1146def DS_RSUB_SRC2_U64_vi : DS_Real_vi<0xc2, DS_RSUB_SRC2_U64>;
1147def DS_INC_SRC2_U64_vi : DS_Real_vi<0xc3, DS_INC_SRC2_U64>;
1148def DS_DEC_SRC2_U64_vi : DS_Real_vi<0xc4, DS_DEC_SRC2_U64>;
1149def DS_MIN_SRC2_I64_vi : DS_Real_vi<0xc5, DS_MIN_SRC2_I64>;
1150def DS_MAX_SRC2_I64_vi : DS_Real_vi<0xc6, DS_MAX_SRC2_I64>;
1151def DS_MIN_SRC2_U64_vi : DS_Real_vi<0xc7, DS_MIN_SRC2_U64>;
1152def DS_MAX_SRC2_U64_vi : DS_Real_vi<0xc8, DS_MAX_SRC2_U64>;
1153def DS_AND_SRC2_B64_vi : DS_Real_vi<0xc9, DS_AND_SRC2_B64>;
1154def DS_OR_SRC2_B64_vi : DS_Real_vi<0xca, DS_OR_SRC2_B64>;
1155def DS_XOR_SRC2_B64_vi : DS_Real_vi<0xcb, DS_XOR_SRC2_B64>;
1156def DS_WRITE_SRC2_B64_vi : DS_Real_vi<0xcd, DS_WRITE_SRC2_B64>;
1157def DS_MIN_SRC2_F64_vi : DS_Real_vi<0xd2, DS_MIN_SRC2_F64>;
1158def DS_MAX_SRC2_F64_vi : DS_Real_vi<0xd3, DS_MAX_SRC2_F64>;
Matt Arsenaultdedc5442017-02-28 20:15:43 +00001159def DS_WRITE_B96_vi : DS_Real_vi<0xde, DS_WRITE_B96>;
1160def DS_WRITE_B128_vi : DS_Real_vi<0xdf, DS_WRITE_B128>;
1161def DS_READ_B96_vi : DS_Real_vi<0xfe, DS_READ_B96>;
1162def DS_READ_B128_vi : DS_Real_vi<0xff, DS_READ_B128>;