xref: /freebsd/contrib/llvm-project/llvm/lib/Target/AMDGPU/DSInstructions.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
15ffd83dbSDimitry Andric//===-- DSInstructions.td - DS Instruction Definitions --------------------===//
20b57cec5SDimitry Andric//
30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric//
70b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric
90b57cec5SDimitry Andricclass DS_Pseudo <string opName, dag outs, dag ins, string asmOps, list<dag> pattern=[]> :
100b57cec5SDimitry Andric  InstSI <outs, ins, "", pattern>,
110b57cec5SDimitry Andric  SIMCInstr <opName, SIEncodingFamily.NONE> {
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric  let LGKM_CNT = 1;
140b57cec5SDimitry Andric  let DS = 1;
155f757f3fSDimitry Andric  let GWS = 0;
160b57cec5SDimitry Andric  let Size = 8;
170b57cec5SDimitry Andric  let UseNamedOperandTable = 1;
180b57cec5SDimitry Andric
190b57cec5SDimitry Andric  // Most instruction load and store data, so set this as the default.
200b57cec5SDimitry Andric  let mayLoad = 1;
210b57cec5SDimitry Andric  let mayStore = 1;
220b57cec5SDimitry Andric
230b57cec5SDimitry Andric  let hasSideEffects = 0;
240b57cec5SDimitry Andric  let SchedRW = [WriteLDS];
250b57cec5SDimitry Andric
260b57cec5SDimitry Andric  let isPseudo = 1;
270b57cec5SDimitry Andric  let isCodeGenOnly = 1;
280b57cec5SDimitry Andric
290b57cec5SDimitry Andric  string Mnemonic = opName;
300b57cec5SDimitry Andric  string AsmOperands = asmOps;
310b57cec5SDimitry Andric
320b57cec5SDimitry Andric  // Well these bits a kind of hack because it would be more natural
330b57cec5SDimitry Andric  // to test "outs" and "ins" dags for the presence of particular operands
340b57cec5SDimitry Andric  bits<1> has_vdst = 1;
350b57cec5SDimitry Andric  bits<1> has_addr = 1;
360b57cec5SDimitry Andric  bits<1> has_data0 = 1;
370b57cec5SDimitry Andric  bits<1> has_data1 = 1;
380b57cec5SDimitry Andric
390b57cec5SDimitry Andric  bits<1> has_gws_data0 = 0; // data0 is encoded as addr
400b57cec5SDimitry Andric
410b57cec5SDimitry Andric  bits<1> has_offset  = 1; // has "offset" that should be split to offset0,1
420b57cec5SDimitry Andric  bits<1> has_offset0 = 1;
430b57cec5SDimitry Andric  bits<1> has_offset1 = 1;
440b57cec5SDimitry Andric
450b57cec5SDimitry Andric  bits<1> has_gds = 1;
460b57cec5SDimitry Andric  bits<1> gdsValue = 0; // if has_gds == 0 set gds to this value
470b57cec5SDimitry Andric
480b57cec5SDimitry Andric  bits<1> has_m0_read = 1;
490b57cec5SDimitry Andric
500b57cec5SDimitry Andric  let Uses = !if(has_m0_read, [M0, EXEC], [EXEC]);
510b57cec5SDimitry Andric}
520b57cec5SDimitry Andric
5381ad6265SDimitry Andricclass DS_Real <DS_Pseudo ps, string opName = ps.Mnemonic> :
5481ad6265SDimitry Andric  InstSI <ps.OutOperandList, ps.InOperandList, opName # ps.AsmOperands>,
550b57cec5SDimitry Andric  Enc64 {
560b57cec5SDimitry Andric
570b57cec5SDimitry Andric  let isPseudo = 0;
580b57cec5SDimitry Andric  let isCodeGenOnly = 0;
59fe6060f1SDimitry Andric  let LGKM_CNT = 1;
60480093f4SDimitry Andric  let DS = 1;
61480093f4SDimitry Andric  let UseNamedOperandTable = 1;
620b57cec5SDimitry Andric
630b57cec5SDimitry Andric  // copy relevant pseudo op flags
645f757f3fSDimitry Andric  let GWS                = ps.GWS;
65fe6060f1SDimitry Andric  let SubtargetPredicate = ps.SubtargetPredicate;
66*0fca6ea1SDimitry Andric  let WaveSizePredicate  = ps.WaveSizePredicate;
67fe6060f1SDimitry Andric  let OtherPredicates    = ps.OtherPredicates;
68*0fca6ea1SDimitry Andric  let TSFlags            = ps.TSFlags;
69fe6060f1SDimitry Andric  let SchedRW            = ps.SchedRW;
70fe6060f1SDimitry Andric  let mayLoad            = ps.mayLoad;
71fe6060f1SDimitry Andric  let mayStore           = ps.mayStore;
72fe6060f1SDimitry Andric  let IsAtomicRet        = ps.IsAtomicRet;
73fe6060f1SDimitry Andric  let IsAtomicNoRet      = ps.IsAtomicNoRet;
74*0fca6ea1SDimitry Andric  let Uses               = ps.Uses;
75*0fca6ea1SDimitry Andric  let Defs               = ps.Defs;
760b57cec5SDimitry Andric
7781ad6265SDimitry Andric  let Constraints = ps.Constraints;
7881ad6265SDimitry Andric  let DisableEncoding = ps.DisableEncoding;
7981ad6265SDimitry Andric
800b57cec5SDimitry Andric  // encoding fields
81fe6060f1SDimitry Andric  bits<10> vdst;
820b57cec5SDimitry Andric  bits<1> gds;
830b57cec5SDimitry Andric  bits<8> addr;
84fe6060f1SDimitry Andric  bits<10> data0;
85fe6060f1SDimitry Andric  bits<10> data1;
860b57cec5SDimitry Andric  bits<8> offset0;
870b57cec5SDimitry Andric  bits<8> offset1;
880b57cec5SDimitry Andric
890b57cec5SDimitry Andric  bits<16> offset;
90fe6060f1SDimitry Andric  let offset0 = !if(ps.has_offset, offset{7-0}, ?);
91fe6060f1SDimitry Andric  let offset1 = !if(ps.has_offset, offset{15-8}, ?);
92fe6060f1SDimitry Andric
93fe6060f1SDimitry Andric  bits<1> acc = !if(ps.has_vdst, vdst{9},
94fe6060f1SDimitry Andric                    !if(!or(ps.has_data0, ps.has_gws_data0), data0{9}, 0));
950b57cec5SDimitry Andric}
960b57cec5SDimitry Andric
970b57cec5SDimitry Andric// DS Pseudo instructions
980b57cec5SDimitry Andric
998bcb0991SDimitry Andricclass DS_0A1D_NORET<string opName, RegisterClass rc = VGPR_32>
1008bcb0991SDimitry Andric: DS_Pseudo<opName,
1018bcb0991SDimitry Andric  (outs),
102*0fca6ea1SDimitry Andric  (ins getLdStRegisterOperand<rc>.ret:$data0, Offset:$offset, gds:$gds),
1038bcb0991SDimitry Andric  " $data0$offset$gds"> {
1048bcb0991SDimitry Andric
1058bcb0991SDimitry Andric  let has_addr = 0;
1068bcb0991SDimitry Andric  let has_data1 = 0;
1078bcb0991SDimitry Andric  let has_vdst = 0;
1088bcb0991SDimitry Andric}
1098bcb0991SDimitry Andric
1100b57cec5SDimitry Andricclass DS_1A1D_NORET<string opName, RegisterClass rc = VGPR_32>
1110b57cec5SDimitry Andric: DS_Pseudo<opName,
1120b57cec5SDimitry Andric  (outs),
113*0fca6ea1SDimitry Andric  (ins VGPR_32:$addr, getLdStRegisterOperand<rc>.ret:$data0, Offset:$offset, gds:$gds),
1140b57cec5SDimitry Andric  " $addr, $data0$offset$gds"> {
1150b57cec5SDimitry Andric
1160b57cec5SDimitry Andric  let has_data1 = 0;
1170b57cec5SDimitry Andric  let has_vdst = 0;
118fe6060f1SDimitry Andric  let IsAtomicNoRet = 1;
1190b57cec5SDimitry Andric}
1200b57cec5SDimitry Andric
1210b57cec5SDimitry Andricmulticlass DS_1A1D_NORET_mc<string opName, RegisterClass rc = VGPR_32> {
122*0fca6ea1SDimitry Andric  def "" : DS_1A1D_NORET<opName, rc>;
1230b57cec5SDimitry Andric
1240b57cec5SDimitry Andric  let has_m0_read = 0 in {
125*0fca6ea1SDimitry Andric    def _gfx9 : DS_1A1D_NORET<opName, rc>;
1260b57cec5SDimitry Andric  }
1270b57cec5SDimitry Andric}
1280b57cec5SDimitry Andric
129fe6060f1SDimitry Andricmulticlass DS_1A1D_NORET_mc_gfx9<string opName, RegisterClass rc = VGPR_32> {
130fe6060f1SDimitry Andric  let has_m0_read = 0 in {
131*0fca6ea1SDimitry Andric    def "" : DS_1A1D_NORET<opName, rc>;
132fe6060f1SDimitry Andric  }
133fe6060f1SDimitry Andric}
134fe6060f1SDimitry Andric
135fe6060f1SDimitry Andricclass DS_1A2D_NORET<string opName, RegisterClass rc = VGPR_32,
136fe6060f1SDimitry Andric                    RegisterOperand data_op = getLdStRegisterOperand<rc>.ret>
1370b57cec5SDimitry Andric: DS_Pseudo<opName,
1380b57cec5SDimitry Andric  (outs),
139*0fca6ea1SDimitry Andric  (ins VGPR_32:$addr, data_op:$data0, data_op:$data1, Offset:$offset, gds:$gds),
140e8d8bef9SDimitry Andric  " $addr, $data0, $data1$offset$gds"> {
1410b57cec5SDimitry Andric
1420b57cec5SDimitry Andric  let has_vdst = 0;
143fe6060f1SDimitry Andric  let IsAtomicNoRet = 1;
1440b57cec5SDimitry Andric}
1450b57cec5SDimitry Andric
1460b57cec5SDimitry Andricmulticlass DS_1A2D_NORET_mc<string opName, RegisterClass rc = VGPR_32> {
147*0fca6ea1SDimitry Andric  def "" : DS_1A2D_NORET<opName, rc>;
1480b57cec5SDimitry Andric
1490b57cec5SDimitry Andric  let has_m0_read = 0 in {
150*0fca6ea1SDimitry Andric    def _gfx9 : DS_1A2D_NORET<opName, rc>;
1510b57cec5SDimitry Andric  }
1520b57cec5SDimitry Andric}
1530b57cec5SDimitry Andric
154fe6060f1SDimitry Andricclass DS_1A2D_Off8_NORET <string opName, RegisterClass rc = VGPR_32,
155fe6060f1SDimitry Andric                          RegisterOperand data_op = getLdStRegisterOperand<rc>.ret>
1560b57cec5SDimitry Andric: DS_Pseudo<opName,
1570b57cec5SDimitry Andric  (outs),
158fe6060f1SDimitry Andric  (ins VGPR_32:$addr, data_op:$data0, data_op:$data1,
159*0fca6ea1SDimitry Andric       Offset0:$offset0, Offset1:$offset1, gds:$gds),
1600b57cec5SDimitry Andric  " $addr, $data0, $data1$offset0$offset1$gds"> {
1610b57cec5SDimitry Andric
1620b57cec5SDimitry Andric  let has_vdst = 0;
1630b57cec5SDimitry Andric  let has_offset = 0;
1640b57cec5SDimitry Andric}
1650b57cec5SDimitry Andric
1660b57cec5SDimitry Andricmulticlass DS_1A2D_Off8_NORET_mc <string opName, RegisterClass rc = VGPR_32> {
1670b57cec5SDimitry Andric  def "" : DS_1A2D_Off8_NORET<opName, rc>;
1680b57cec5SDimitry Andric
1690b57cec5SDimitry Andric  let has_m0_read = 0 in {
1700b57cec5SDimitry Andric    def _gfx9 : DS_1A2D_Off8_NORET<opName, rc>;
1710b57cec5SDimitry Andric  }
1720b57cec5SDimitry Andric}
1730b57cec5SDimitry Andric
17481ad6265SDimitry Andricclass DS_0A1D_RET_GDS<string opName, RegisterClass rc = VGPR_32, RegisterClass src = rc,
17581ad6265SDimitry Andric                  RegisterOperand dst_op = getLdStRegisterOperand<rc>.ret,
17681ad6265SDimitry Andric                  RegisterOperand src_op = getLdStRegisterOperand<src>.ret>
17781ad6265SDimitry Andric: DS_Pseudo<opName,
17881ad6265SDimitry Andric  (outs dst_op:$vdst),
179*0fca6ea1SDimitry Andric  (ins src_op:$data0, Offset:$offset),
18081ad6265SDimitry Andric  " $vdst, $data0$offset gds"> {
18181ad6265SDimitry Andric
18281ad6265SDimitry Andric  let has_addr = 0;
18381ad6265SDimitry Andric  let has_data1 = 0;
18481ad6265SDimitry Andric  let has_gds = 0;
18581ad6265SDimitry Andric  let gdsValue = 1;
18681ad6265SDimitry Andric  let hasSideEffects = 1;
18781ad6265SDimitry Andric}
18881ad6265SDimitry Andric
189fe6060f1SDimitry Andricclass DS_1A1D_RET <string opName, RegisterClass rc = VGPR_32,
190fe6060f1SDimitry Andric                  RegisterOperand data_op = getLdStRegisterOperand<rc>.ret>
1910b57cec5SDimitry Andric: DS_Pseudo<opName,
192fe6060f1SDimitry Andric  (outs data_op:$vdst),
193*0fca6ea1SDimitry Andric  (ins VGPR_32:$addr, data_op:$data0, Offset:$offset, gds:$gds),
1940b57cec5SDimitry Andric  " $vdst, $addr, $data0$offset$gds"> {
1950b57cec5SDimitry Andric
1960b57cec5SDimitry Andric  let hasPostISelHook = 1;
1970b57cec5SDimitry Andric  let has_data1 = 0;
198fe6060f1SDimitry Andric  let IsAtomicRet = 1;
1990b57cec5SDimitry Andric}
2000b57cec5SDimitry Andric
201*0fca6ea1SDimitry Andricmulticlass DS_1A1D_RET_mc <string opName, RegisterClass rc = VGPR_32> {
202*0fca6ea1SDimitry Andric  def "" : DS_1A1D_RET<opName, rc>;
2030b57cec5SDimitry Andric
2040b57cec5SDimitry Andric  let has_m0_read = 0 in {
205*0fca6ea1SDimitry Andric    def _gfx9 : DS_1A1D_RET<opName, rc>;
2060b57cec5SDimitry Andric  }
2070b57cec5SDimitry Andric}
2080b57cec5SDimitry Andric
209*0fca6ea1SDimitry Andricmulticlass DS_1A1D_RET_mc_gfx9 <string opName, RegisterClass rc = VGPR_32> {
210fe6060f1SDimitry Andric  let has_m0_read = 0 in {
211*0fca6ea1SDimitry Andric    def "" : DS_1A1D_RET<opName, rc>;
212fe6060f1SDimitry Andric  }
213fe6060f1SDimitry Andric}
214fe6060f1SDimitry Andric
2150b57cec5SDimitry Andricclass DS_1A2D_RET<string opName,
2160b57cec5SDimitry Andric                  RegisterClass rc = VGPR_32,
217fe6060f1SDimitry Andric                  RegisterClass src = rc,
218fe6060f1SDimitry Andric                  RegisterOperand dst_op = getLdStRegisterOperand<rc>.ret,
219fe6060f1SDimitry Andric                  RegisterOperand src_op = getLdStRegisterOperand<src>.ret>
2200b57cec5SDimitry Andric: DS_Pseudo<opName,
221fe6060f1SDimitry Andric  (outs dst_op:$vdst),
222*0fca6ea1SDimitry Andric  (ins VGPR_32:$addr, src_op:$data0, src_op:$data1, Offset:$offset, gds:$gds),
2230b57cec5SDimitry Andric  " $vdst, $addr, $data0, $data1$offset$gds"> {
2240b57cec5SDimitry Andric
2250b57cec5SDimitry Andric  let hasPostISelHook = 1;
226fe6060f1SDimitry Andric  let IsAtomicRet = 1;
2270b57cec5SDimitry Andric}
2280b57cec5SDimitry Andric
2290b57cec5SDimitry Andricmulticlass DS_1A2D_RET_mc<string opName,
2300b57cec5SDimitry Andric                          RegisterClass rc = VGPR_32,
2310b57cec5SDimitry Andric                          RegisterClass src = rc> {
232*0fca6ea1SDimitry Andric  def "" : DS_1A2D_RET<opName, rc, src>;
2330b57cec5SDimitry Andric
2340b57cec5SDimitry Andric  let has_m0_read = 0 in {
235*0fca6ea1SDimitry Andric    def _gfx9 : DS_1A2D_RET<opName, rc, src>;
2360b57cec5SDimitry Andric  }
2370b57cec5SDimitry Andric}
2380b57cec5SDimitry Andric
2390b57cec5SDimitry Andricclass DS_1A2D_Off8_RET<string opName,
2400b57cec5SDimitry Andric                       RegisterClass rc = VGPR_32,
241fe6060f1SDimitry Andric                       RegisterClass src = rc,
242fe6060f1SDimitry Andric                       RegisterOperand dst_op = getLdStRegisterOperand<rc>.ret,
243fe6060f1SDimitry Andric                       RegisterOperand src_op = getLdStRegisterOperand<src>.ret>
2440b57cec5SDimitry Andric: DS_Pseudo<opName,
245fe6060f1SDimitry Andric  (outs dst_op:$vdst),
246*0fca6ea1SDimitry Andric  (ins VGPR_32:$addr, src_op:$data0, src_op:$data1, Offset0:$offset0, Offset1:$offset1, gds:$gds),
2470b57cec5SDimitry Andric  " $vdst, $addr, $data0, $data1$offset0$offset1$gds"> {
2480b57cec5SDimitry Andric
2490b57cec5SDimitry Andric  let has_offset = 0;
2500b57cec5SDimitry Andric  let hasPostISelHook = 1;
2510b57cec5SDimitry Andric}
2520b57cec5SDimitry Andric
2530b57cec5SDimitry Andricmulticlass DS_1A2D_Off8_RET_mc<string opName,
2540b57cec5SDimitry Andric                               RegisterClass rc = VGPR_32,
2550b57cec5SDimitry Andric                               RegisterClass src = rc> {
2560b57cec5SDimitry Andric  def "" : DS_1A2D_Off8_RET<opName, rc, src>;
2570b57cec5SDimitry Andric
2580b57cec5SDimitry Andric  let has_m0_read = 0 in {
2590b57cec5SDimitry Andric    def _gfx9 : DS_1A2D_Off8_RET<opName, rc, src>;
2600b57cec5SDimitry Andric  }
2610b57cec5SDimitry Andric}
2620b57cec5SDimitry Andric
263bdd1243dSDimitry Andricclass DS_BVH_STACK<string opName>
264bdd1243dSDimitry Andric: DS_Pseudo<opName,
265bdd1243dSDimitry Andric  (outs getLdStRegisterOperand<VGPR_32>.ret:$vdst, VGPR_32:$addr),
266*0fca6ea1SDimitry Andric  (ins VGPR_32:$addr_in, getLdStRegisterOperand<VGPR_32>.ret:$data0, VReg_128:$data1, Offset:$offset),
267bdd1243dSDimitry Andric  " $vdst, $addr, $data0, $data1$offset"> {
268bdd1243dSDimitry Andric  let Constraints = "$addr = $addr_in";
269bdd1243dSDimitry Andric  let DisableEncoding = "$addr_in";
270bdd1243dSDimitry Andric  let has_gds = 0;
271bdd1243dSDimitry Andric  let gdsValue = 0;
272bdd1243dSDimitry Andric  // TODO: Use MMOs in the LDS address space instead of hasSideEffects = 1.
273bdd1243dSDimitry Andric  let hasSideEffects = 1;
274bdd1243dSDimitry Andric  let SchedRW = [WriteLDS, WriteLDS];
275bdd1243dSDimitry Andric}
2760b57cec5SDimitry Andric
277*0fca6ea1SDimitry Andricclass DS_1A_RET<string opName, RegisterClass rc = VGPR_32, bit HasTiedOutput = 0, Operand ofs = Offset,
278fe6060f1SDimitry Andric                RegisterOperand data_op = getLdStRegisterOperand<rc>.ret>
2790b57cec5SDimitry Andric: DS_Pseudo<opName,
280fe6060f1SDimitry Andric  (outs data_op:$vdst),
2810b57cec5SDimitry Andric  !if(HasTiedOutput,
282fe6060f1SDimitry Andric    (ins VGPR_32:$addr, ofs:$offset, gds:$gds, data_op:$vdst_in),
2830b57cec5SDimitry Andric    (ins VGPR_32:$addr, ofs:$offset, gds:$gds)),
2840b57cec5SDimitry Andric  " $vdst, $addr$offset$gds"> {
2850b57cec5SDimitry Andric  let Constraints = !if(HasTiedOutput, "$vdst = $vdst_in", "");
2860b57cec5SDimitry Andric  let DisableEncoding = !if(HasTiedOutput, "$vdst_in", "");
2870b57cec5SDimitry Andric  let has_data0 = 0;
2880b57cec5SDimitry Andric  let has_data1 = 0;
2890b57cec5SDimitry Andric}
2900b57cec5SDimitry Andric
291*0fca6ea1SDimitry Andricmulticlass DS_1A_RET_mc<string opName, RegisterClass rc = VGPR_32, bit HasTiedOutput = 0, Operand ofs = Offset> {
2920b57cec5SDimitry Andric  def "" : DS_1A_RET<opName, rc, HasTiedOutput, ofs>;
2930b57cec5SDimitry Andric
2940b57cec5SDimitry Andric  let has_m0_read = 0 in {
2950b57cec5SDimitry Andric    def _gfx9 : DS_1A_RET<opName, rc, HasTiedOutput, ofs>;
2960b57cec5SDimitry Andric  }
2970b57cec5SDimitry Andric}
2980b57cec5SDimitry Andric
2990b57cec5SDimitry Andricclass DS_1A_RET_Tied<string opName, RegisterClass rc = VGPR_32> :
3000b57cec5SDimitry Andric  DS_1A_RET<opName, rc, 1>;
3010b57cec5SDimitry Andric
3020b57cec5SDimitry Andricclass DS_1A_Off8_RET <string opName, RegisterClass rc = VGPR_32>
3030b57cec5SDimitry Andric: DS_Pseudo<opName,
304fe6060f1SDimitry Andric  (outs getLdStRegisterOperand<rc>.ret:$vdst),
305*0fca6ea1SDimitry Andric  (ins VGPR_32:$addr, Offset0:$offset0, Offset1:$offset1, gds:$gds),
3060b57cec5SDimitry Andric  " $vdst, $addr$offset0$offset1$gds"> {
3070b57cec5SDimitry Andric
3080b57cec5SDimitry Andric  let has_offset = 0;
3090b57cec5SDimitry Andric  let has_data0 = 0;
3100b57cec5SDimitry Andric  let has_data1 = 0;
3110b57cec5SDimitry Andric}
3120b57cec5SDimitry Andric
3130b57cec5SDimitry Andricmulticlass DS_1A_Off8_RET_mc <string opName, RegisterClass rc = VGPR_32> {
3140b57cec5SDimitry Andric  def "" : DS_1A_Off8_RET<opName, rc>;
3150b57cec5SDimitry Andric
3160b57cec5SDimitry Andric  let has_m0_read = 0 in {
3170b57cec5SDimitry Andric    def _gfx9 : DS_1A_Off8_RET<opName, rc>;
3180b57cec5SDimitry Andric  }
3190b57cec5SDimitry Andric}
3200b57cec5SDimitry Andric
3210b57cec5SDimitry Andricclass DS_1A_RET_GDS <string opName> : DS_Pseudo<opName,
322fe6060f1SDimitry Andric  (outs getLdStRegisterOperand<VGPR_32>.ret:$vdst),
323*0fca6ea1SDimitry Andric  (ins VGPR_32:$addr, Offset:$offset),
3240b57cec5SDimitry Andric  " $vdst, $addr$offset gds"> {
3250b57cec5SDimitry Andric
3260b57cec5SDimitry Andric  let has_data0 = 0;
3270b57cec5SDimitry Andric  let has_data1 = 0;
3280b57cec5SDimitry Andric  let has_gds = 0;
3290b57cec5SDimitry Andric  let gdsValue = 1;
3300b57cec5SDimitry Andric}
3310b57cec5SDimitry Andric
3320b57cec5SDimitry Andricclass DS_0A_RET <string opName> : DS_Pseudo<opName,
333fe6060f1SDimitry Andric  (outs getLdStRegisterOperand<VGPR_32>.ret:$vdst),
334*0fca6ea1SDimitry Andric  (ins Offset:$offset, gds:$gds),
3350b57cec5SDimitry Andric  " $vdst$offset$gds"> {
3360b57cec5SDimitry Andric
3370b57cec5SDimitry Andric  let mayLoad = 1;
3380b57cec5SDimitry Andric  let mayStore = 1;
3390b57cec5SDimitry Andric
3400b57cec5SDimitry Andric  let has_addr = 0;
3410b57cec5SDimitry Andric  let has_data0 = 0;
3420b57cec5SDimitry Andric  let has_data1 = 0;
3430b57cec5SDimitry Andric}
3440b57cec5SDimitry Andric
3450b57cec5SDimitry Andricclass DS_1A <string opName> : DS_Pseudo<opName,
3460b57cec5SDimitry Andric  (outs),
347*0fca6ea1SDimitry Andric  (ins VGPR_32:$addr, Offset:$offset, gds:$gds),
3480b57cec5SDimitry Andric  " $addr$offset$gds"> {
3490b57cec5SDimitry Andric
3500b57cec5SDimitry Andric  let mayLoad = 1;
3510b57cec5SDimitry Andric  let mayStore = 1;
3520b57cec5SDimitry Andric
3530b57cec5SDimitry Andric  let has_vdst = 0;
3540b57cec5SDimitry Andric  let has_data0 = 0;
3550b57cec5SDimitry Andric  let has_data1 = 0;
3560b57cec5SDimitry Andric}
3570b57cec5SDimitry Andric
3580b57cec5SDimitry Andricmulticlass DS_1A_mc <string opName> {
3590b57cec5SDimitry Andric  def "" : DS_1A<opName>;
3600b57cec5SDimitry Andric
3610b57cec5SDimitry Andric  let has_m0_read = 0 in {
3620b57cec5SDimitry Andric    def _gfx9 : DS_1A<opName>;
3630b57cec5SDimitry Andric  }
3640b57cec5SDimitry Andric}
3650b57cec5SDimitry Andric
3660b57cec5SDimitry Andric
3670b57cec5SDimitry Andricclass DS_GWS <string opName, dag ins, string asmOps>
3680b57cec5SDimitry Andric: DS_Pseudo<opName, (outs), ins, asmOps> {
3695f757f3fSDimitry Andric  let GWS = 1;
3700b57cec5SDimitry Andric
3710b57cec5SDimitry Andric  let has_vdst  = 0;
3720b57cec5SDimitry Andric  let has_addr  = 0;
3730b57cec5SDimitry Andric  let has_data0 = 0;
3740b57cec5SDimitry Andric  let has_data1 = 0;
3750b57cec5SDimitry Andric
3760b57cec5SDimitry Andric  let has_gds   = 0;
3770b57cec5SDimitry Andric  let gdsValue  = 1;
3780b57cec5SDimitry Andric}
3790b57cec5SDimitry Andric
3800b57cec5SDimitry Andricclass DS_GWS_0D <string opName>
3810b57cec5SDimitry Andric: DS_GWS<opName,
382*0fca6ea1SDimitry Andric  (ins Offset:$offset), "$offset gds"> {
3838bcb0991SDimitry Andric  let hasSideEffects = 1;
3848bcb0991SDimitry Andric}
3850b57cec5SDimitry Andric
3860b57cec5SDimitry Andricclass DS_GWS_1D <string opName>
3870b57cec5SDimitry Andric: DS_GWS<opName,
388*0fca6ea1SDimitry Andric  (ins getLdStRegisterOperand<VGPR_32>.ret:$data0, Offset:$offset),
389fe6060f1SDimitry Andric  " $data0$offset gds"> {
3900b57cec5SDimitry Andric
3910b57cec5SDimitry Andric  let has_gws_data0 = 1;
3928bcb0991SDimitry Andric  let hasSideEffects = 1;
3930b57cec5SDimitry Andric}
3940b57cec5SDimitry Andric
3950b57cec5SDimitry Andricclass DS_VOID <string opName> : DS_Pseudo<opName,
3960b57cec5SDimitry Andric  (outs), (ins), ""> {
3970b57cec5SDimitry Andric  let mayLoad = 0;
3980b57cec5SDimitry Andric  let mayStore = 0;
3990b57cec5SDimitry Andric  let hasSideEffects = 1;
4000b57cec5SDimitry Andric  let UseNamedOperandTable = 0;
4010b57cec5SDimitry Andric
4020b57cec5SDimitry Andric  let has_vdst = 0;
4030b57cec5SDimitry Andric  let has_addr = 0;
4040b57cec5SDimitry Andric  let has_data0 = 0;
4050b57cec5SDimitry Andric  let has_data1 = 0;
4060b57cec5SDimitry Andric  let has_offset = 0;
4070b57cec5SDimitry Andric  let has_offset0 = 0;
4080b57cec5SDimitry Andric  let has_offset1 = 0;
4090b57cec5SDimitry Andric  let has_gds = 0;
4100b57cec5SDimitry Andric}
4110b57cec5SDimitry Andric
412fe6060f1SDimitry Andricclass DS_1A1D_PERMUTE <string opName, SDPatternOperator node = null_frag,
413fe6060f1SDimitry Andric                       RegisterOperand data_op = getLdStRegisterOperand<VGPR_32>.ret>
4140b57cec5SDimitry Andric: DS_Pseudo<opName,
415fe6060f1SDimitry Andric  (outs data_op:$vdst),
416*0fca6ea1SDimitry Andric  (ins VGPR_32:$addr, data_op:$data0, Offset:$offset),
4170b57cec5SDimitry Andric  " $vdst, $addr, $data0$offset",
4180b57cec5SDimitry Andric  [(set i32:$vdst,
41906c3fb27SDimitry Andric   (node (DS1Addr1Offset i32:$addr, i32:$offset), i32:$data0))] > {
4200b57cec5SDimitry Andric
4210b57cec5SDimitry Andric  let mayLoad = 0;
4220b57cec5SDimitry Andric  let mayStore = 0;
4230b57cec5SDimitry Andric  let isConvergent = 1;
4240b57cec5SDimitry Andric
4250b57cec5SDimitry Andric  let has_data1 = 0;
4260b57cec5SDimitry Andric  let has_gds = 0;
4270b57cec5SDimitry Andric}
4280b57cec5SDimitry Andric
4297a6dacacSDimitry Andricclass DSAtomicRetPat<DS_Pseudo inst, ValueType vt, PatFrag frag, int complexity = 0,
4307a6dacacSDimitry Andric  bit gds=0> : GCNPat <(frag (DS1Addr1Offset i32:$ptr, i32:$offset), vt:$value),
431*0fca6ea1SDimitry Andric  (inst $ptr, getVregSrcForVT<vt>.ret:$value, Offset:$offset, (i1 gds))> {
4327a6dacacSDimitry Andric  let AddedComplexity = complexity;
4337a6dacacSDimitry Andric}
4347a6dacacSDimitry Andric
4350b57cec5SDimitry Andricdefm DS_ADD_U32       : DS_1A1D_NORET_mc<"ds_add_u32">;
4360b57cec5SDimitry Andricdefm DS_SUB_U32       : DS_1A1D_NORET_mc<"ds_sub_u32">;
4370b57cec5SDimitry Andricdefm DS_RSUB_U32      : DS_1A1D_NORET_mc<"ds_rsub_u32">;
4380b57cec5SDimitry Andricdefm DS_INC_U32       : DS_1A1D_NORET_mc<"ds_inc_u32">;
4390b57cec5SDimitry Andricdefm DS_DEC_U32       : DS_1A1D_NORET_mc<"ds_dec_u32">;
4400b57cec5SDimitry Andricdefm DS_MIN_I32       : DS_1A1D_NORET_mc<"ds_min_i32">;
4410b57cec5SDimitry Andricdefm DS_MAX_I32       : DS_1A1D_NORET_mc<"ds_max_i32">;
4420b57cec5SDimitry Andricdefm DS_MIN_U32       : DS_1A1D_NORET_mc<"ds_min_u32">;
4430b57cec5SDimitry Andricdefm DS_MAX_U32       : DS_1A1D_NORET_mc<"ds_max_u32">;
4440b57cec5SDimitry Andricdefm DS_AND_B32       : DS_1A1D_NORET_mc<"ds_and_b32">;
4450b57cec5SDimitry Andricdefm DS_OR_B32        : DS_1A1D_NORET_mc<"ds_or_b32">;
4460b57cec5SDimitry Andricdefm DS_XOR_B32       : DS_1A1D_NORET_mc<"ds_xor_b32">;
4475ffd83dbSDimitry Andric
448*0fca6ea1SDimitry Andriclet SubtargetPredicate = HasLDSFPAtomicAddF32 in {
4490b57cec5SDimitry Andricdefm DS_ADD_F32       : DS_1A1D_NORET_mc<"ds_add_f32">;
4505ffd83dbSDimitry Andric}
4515ffd83dbSDimitry Andric
4520b57cec5SDimitry Andricdefm DS_MIN_F32       : DS_1A1D_NORET_mc<"ds_min_f32">;
4530b57cec5SDimitry Andricdefm DS_MAX_F32       : DS_1A1D_NORET_mc<"ds_max_f32">;
4540b57cec5SDimitry Andric
4550b57cec5SDimitry Andriclet mayLoad = 0 in {
4560b57cec5SDimitry Andricdefm DS_WRITE_B8      : DS_1A1D_NORET_mc<"ds_write_b8">;
4570b57cec5SDimitry Andricdefm DS_WRITE_B16     : DS_1A1D_NORET_mc<"ds_write_b16">;
4580b57cec5SDimitry Andricdefm DS_WRITE_B32     : DS_1A1D_NORET_mc<"ds_write_b32">;
4590b57cec5SDimitry Andricdefm DS_WRITE2_B32    : DS_1A2D_Off8_NORET_mc<"ds_write2_b32">;
4600b57cec5SDimitry Andricdefm DS_WRITE2ST64_B32: DS_1A2D_Off8_NORET_mc<"ds_write2st64_b32">;
4610b57cec5SDimitry Andric
4620b57cec5SDimitry Andric
4630b57cec5SDimitry Andriclet has_m0_read = 0 in {
4640b57cec5SDimitry Andric
4650b57cec5SDimitry Andriclet SubtargetPredicate = HasD16LoadStore in {
4660b57cec5SDimitry Andricdef DS_WRITE_B8_D16_HI  : DS_1A1D_NORET<"ds_write_b8_d16_hi">;
4670b57cec5SDimitry Andricdef DS_WRITE_B16_D16_HI : DS_1A1D_NORET<"ds_write_b16_d16_hi">;
4680b57cec5SDimitry Andric}
4690b57cec5SDimitry Andric
4708bcb0991SDimitry Andric} // End has_m0_read = 0
4718bcb0991SDimitry Andric
4720b57cec5SDimitry Andriclet SubtargetPredicate = HasDSAddTid in {
4738bcb0991SDimitry Andricdef DS_WRITE_ADDTID_B32 : DS_0A1D_NORET<"ds_write_addtid_b32">;
4740b57cec5SDimitry Andric}
4750b57cec5SDimitry Andric
4760b57cec5SDimitry Andric} // End mayLoad = 0
4770b57cec5SDimitry Andric
478*0fca6ea1SDimitry Andriclet SubtargetPredicate = HasLdsAtomicAddF64 in {
479fe6060f1SDimitry Andric  defm DS_ADD_F64     : DS_1A1D_NORET_mc_gfx9<"ds_add_f64", VReg_64>;
480*0fca6ea1SDimitry Andric  defm DS_ADD_RTN_F64 : DS_1A1D_RET_mc_gfx9<"ds_add_rtn_f64", VReg_64>;
481*0fca6ea1SDimitry Andric} // End SubtargetPredicate = HasLdsAtomicAddF64
482fe6060f1SDimitry Andric
48306c3fb27SDimitry Andriclet SubtargetPredicate = HasAtomicDsPkAdd16Insts in {
4847a6dacacSDimitry Andric  defm DS_PK_ADD_F16      : DS_1A1D_NORET_mc<"ds_pk_add_f16">;
485*0fca6ea1SDimitry Andric  defm DS_PK_ADD_RTN_F16  : DS_1A1D_RET_mc<"ds_pk_add_rtn_f16", VGPR_32>;
4867a6dacacSDimitry Andric  defm DS_PK_ADD_BF16     : DS_1A1D_NORET_mc<"ds_pk_add_bf16">;
487*0fca6ea1SDimitry Andric  defm DS_PK_ADD_RTN_BF16 : DS_1A1D_RET_mc<"ds_pk_add_rtn_bf16", VGPR_32>;
48806c3fb27SDimitry Andric} // End SubtargetPredicate = HasAtomicDsPkAdd16Insts
48981ad6265SDimitry Andric
49081ad6265SDimitry Andricdefm DS_CMPSTORE_B32     : DS_1A2D_NORET_mc<"ds_cmpstore_b32">;
49181ad6265SDimitry Andricdefm DS_CMPSTORE_F32     : DS_1A2D_NORET_mc<"ds_cmpstore_f32">;
49281ad6265SDimitry Andricdefm DS_CMPSTORE_B64     : DS_1A2D_NORET_mc<"ds_cmpstore_b64", VReg_64>;
49381ad6265SDimitry Andricdefm DS_CMPSTORE_F64     : DS_1A2D_NORET_mc<"ds_cmpstore_f64", VReg_64>;
494*0fca6ea1SDimitry Andricdefm DS_CMPSTORE_RTN_B32 : DS_1A2D_RET_mc<"ds_cmpstore_rtn_b32", VGPR_32>;
495*0fca6ea1SDimitry Andricdefm DS_CMPSTORE_RTN_F32 : DS_1A2D_RET_mc<"ds_cmpstore_rtn_f32", VGPR_32>;
496*0fca6ea1SDimitry Andricdefm DS_CMPSTORE_RTN_B64  : DS_1A2D_RET_mc<"ds_cmpstore_rtn_b64", VReg_64>;
497*0fca6ea1SDimitry Andricdefm DS_CMPSTORE_RTN_F64  : DS_1A2D_RET_mc<"ds_cmpstore_rtn_f64", VReg_64>;
49881ad6265SDimitry Andric
4990b57cec5SDimitry Andricdefm DS_MSKOR_B32     : DS_1A2D_NORET_mc<"ds_mskor_b32">;
5000b57cec5SDimitry Andricdefm DS_CMPST_B32     : DS_1A2D_NORET_mc<"ds_cmpst_b32">;
5010b57cec5SDimitry Andricdefm DS_CMPST_F32     : DS_1A2D_NORET_mc<"ds_cmpst_f32">;
5020b57cec5SDimitry Andric
5030b57cec5SDimitry Andricdefm DS_ADD_U64       : DS_1A1D_NORET_mc<"ds_add_u64", VReg_64>;
5040b57cec5SDimitry Andricdefm DS_SUB_U64       : DS_1A1D_NORET_mc<"ds_sub_u64", VReg_64>;
5050b57cec5SDimitry Andricdefm DS_RSUB_U64      : DS_1A1D_NORET_mc<"ds_rsub_u64", VReg_64>;
5060b57cec5SDimitry Andricdefm DS_INC_U64       : DS_1A1D_NORET_mc<"ds_inc_u64", VReg_64>;
5070b57cec5SDimitry Andricdefm DS_DEC_U64       : DS_1A1D_NORET_mc<"ds_dec_u64", VReg_64>;
5080b57cec5SDimitry Andricdefm DS_MIN_I64       : DS_1A1D_NORET_mc<"ds_min_i64", VReg_64>;
5090b57cec5SDimitry Andricdefm DS_MAX_I64       : DS_1A1D_NORET_mc<"ds_max_i64", VReg_64>;
5100b57cec5SDimitry Andricdefm DS_MIN_U64       : DS_1A1D_NORET_mc<"ds_min_u64", VReg_64>;
5110b57cec5SDimitry Andricdefm DS_MAX_U64       : DS_1A1D_NORET_mc<"ds_max_u64", VReg_64>;
5120b57cec5SDimitry Andricdefm DS_AND_B64       : DS_1A1D_NORET_mc<"ds_and_b64", VReg_64>;
5130b57cec5SDimitry Andricdefm DS_OR_B64        : DS_1A1D_NORET_mc<"ds_or_b64", VReg_64>;
5140b57cec5SDimitry Andricdefm DS_XOR_B64       : DS_1A1D_NORET_mc<"ds_xor_b64", VReg_64>;
5150b57cec5SDimitry Andricdefm DS_MSKOR_B64     : DS_1A2D_NORET_mc<"ds_mskor_b64", VReg_64>;
5160b57cec5SDimitry Andriclet mayLoad = 0 in {
5170b57cec5SDimitry Andricdefm DS_WRITE_B64     : DS_1A1D_NORET_mc<"ds_write_b64", VReg_64>;
5180b57cec5SDimitry Andricdefm DS_WRITE2_B64    : DS_1A2D_Off8_NORET_mc<"ds_write2_b64", VReg_64>;
5190b57cec5SDimitry Andricdefm DS_WRITE2ST64_B64: DS_1A2D_Off8_NORET_mc<"ds_write2st64_b64", VReg_64>;
5200b57cec5SDimitry Andric}
5210b57cec5SDimitry Andricdefm DS_CMPST_B64     : DS_1A2D_NORET_mc<"ds_cmpst_b64", VReg_64>;
5220b57cec5SDimitry Andricdefm DS_CMPST_F64     : DS_1A2D_NORET_mc<"ds_cmpst_f64", VReg_64>;
5230b57cec5SDimitry Andricdefm DS_MIN_F64       : DS_1A1D_NORET_mc<"ds_min_f64", VReg_64>;
5240b57cec5SDimitry Andricdefm DS_MAX_F64       : DS_1A1D_NORET_mc<"ds_max_f64", VReg_64>;
5250b57cec5SDimitry Andric
526*0fca6ea1SDimitry Andricdefm DS_ADD_RTN_U32   : DS_1A1D_RET_mc<"ds_add_rtn_u32", VGPR_32>;
5275ffd83dbSDimitry Andric
528*0fca6ea1SDimitry Andriclet SubtargetPredicate = HasLDSFPAtomicAddF32 in {
529*0fca6ea1SDimitry Andricdefm DS_ADD_RTN_F32   : DS_1A1D_RET_mc<"ds_add_rtn_f32", VGPR_32>;
5305ffd83dbSDimitry Andric}
531*0fca6ea1SDimitry Andricdefm DS_SUB_RTN_U32   : DS_1A1D_RET_mc<"ds_sub_rtn_u32", VGPR_32>;
532*0fca6ea1SDimitry Andricdefm DS_RSUB_RTN_U32  : DS_1A1D_RET_mc<"ds_rsub_rtn_u32", VGPR_32>;
533*0fca6ea1SDimitry Andricdefm DS_INC_RTN_U32   : DS_1A1D_RET_mc<"ds_inc_rtn_u32", VGPR_32>;
534*0fca6ea1SDimitry Andricdefm DS_DEC_RTN_U32   : DS_1A1D_RET_mc<"ds_dec_rtn_u32", VGPR_32>;
535*0fca6ea1SDimitry Andricdefm DS_MIN_RTN_I32   : DS_1A1D_RET_mc<"ds_min_rtn_i32", VGPR_32>;
536*0fca6ea1SDimitry Andricdefm DS_MAX_RTN_I32   : DS_1A1D_RET_mc<"ds_max_rtn_i32", VGPR_32>;
537*0fca6ea1SDimitry Andricdefm DS_MIN_RTN_U32   : DS_1A1D_RET_mc<"ds_min_rtn_u32", VGPR_32>;
538*0fca6ea1SDimitry Andricdefm DS_MAX_RTN_U32   : DS_1A1D_RET_mc<"ds_max_rtn_u32", VGPR_32>;
539*0fca6ea1SDimitry Andricdefm DS_AND_RTN_B32   : DS_1A1D_RET_mc<"ds_and_rtn_b32", VGPR_32>;
540*0fca6ea1SDimitry Andricdefm DS_OR_RTN_B32    : DS_1A1D_RET_mc<"ds_or_rtn_b32", VGPR_32>;
541*0fca6ea1SDimitry Andricdefm DS_XOR_RTN_B32   : DS_1A1D_RET_mc<"ds_xor_rtn_b32", VGPR_32>;
542*0fca6ea1SDimitry Andricdefm DS_MSKOR_RTN_B32 : DS_1A2D_RET_mc<"ds_mskor_rtn_b32", VGPR_32>;
543*0fca6ea1SDimitry Andricdefm DS_CMPST_RTN_B32 : DS_1A2D_RET_mc<"ds_cmpst_rtn_b32", VGPR_32>;
544*0fca6ea1SDimitry Andricdefm DS_CMPST_RTN_F32 : DS_1A2D_RET_mc<"ds_cmpst_rtn_f32", VGPR_32>;
545*0fca6ea1SDimitry Andricdefm DS_MIN_RTN_F32   : DS_1A1D_RET_mc<"ds_min_rtn_f32", VGPR_32>;
546*0fca6ea1SDimitry Andricdefm DS_MAX_RTN_F32   : DS_1A1D_RET_mc<"ds_max_rtn_f32", VGPR_32>;
5470b57cec5SDimitry Andric
5480b57cec5SDimitry Andricdefm DS_WRXCHG_RTN_B32 : DS_1A1D_RET_mc<"ds_wrxchg_rtn_b32">;
5490b57cec5SDimitry Andricdefm DS_WRXCHG2_RTN_B32 : DS_1A2D_Off8_RET_mc<"ds_wrxchg2_rtn_b32", VReg_64, VGPR_32>;
5500b57cec5SDimitry Andricdefm DS_WRXCHG2ST64_RTN_B32 : DS_1A2D_Off8_RET_mc<"ds_wrxchg2st64_rtn_b32", VReg_64, VGPR_32>;
5510b57cec5SDimitry Andric
552*0fca6ea1SDimitry Andricdefm DS_ADD_RTN_U64  : DS_1A1D_RET_mc<"ds_add_rtn_u64", VReg_64>;
553*0fca6ea1SDimitry Andricdefm DS_SUB_RTN_U64  : DS_1A1D_RET_mc<"ds_sub_rtn_u64", VReg_64>;
554*0fca6ea1SDimitry Andricdefm DS_RSUB_RTN_U64  : DS_1A1D_RET_mc<"ds_rsub_rtn_u64", VReg_64>;
555*0fca6ea1SDimitry Andricdefm DS_INC_RTN_U64   : DS_1A1D_RET_mc<"ds_inc_rtn_u64", VReg_64>;
556*0fca6ea1SDimitry Andricdefm DS_DEC_RTN_U64   : DS_1A1D_RET_mc<"ds_dec_rtn_u64", VReg_64>;
557*0fca6ea1SDimitry Andricdefm DS_MIN_RTN_I64    : DS_1A1D_RET_mc<"ds_min_rtn_i64", VReg_64>;
558*0fca6ea1SDimitry Andricdefm DS_MAX_RTN_I64    : DS_1A1D_RET_mc<"ds_max_rtn_i64", VReg_64>;
559*0fca6ea1SDimitry Andricdefm DS_MIN_RTN_U64   : DS_1A1D_RET_mc<"ds_min_rtn_u64", VReg_64>;
560*0fca6ea1SDimitry Andricdefm DS_MAX_RTN_U64   : DS_1A1D_RET_mc<"ds_max_rtn_u64", VReg_64>;
561*0fca6ea1SDimitry Andricdefm DS_AND_RTN_B64    : DS_1A1D_RET_mc<"ds_and_rtn_b64", VReg_64>;
562*0fca6ea1SDimitry Andricdefm DS_OR_RTN_B64     : DS_1A1D_RET_mc<"ds_or_rtn_b64", VReg_64>;
563*0fca6ea1SDimitry Andricdefm DS_XOR_RTN_B64    : DS_1A1D_RET_mc<"ds_xor_rtn_b64", VReg_64>;
564*0fca6ea1SDimitry Andricdefm DS_MSKOR_RTN_B64  : DS_1A2D_RET_mc<"ds_mskor_rtn_b64", VReg_64>;
565*0fca6ea1SDimitry Andricdefm DS_CMPST_RTN_B64  : DS_1A2D_RET_mc<"ds_cmpst_rtn_b64", VReg_64>;
566*0fca6ea1SDimitry Andricdefm DS_CMPST_RTN_F64  : DS_1A2D_RET_mc<"ds_cmpst_rtn_f64", VReg_64>;
567*0fca6ea1SDimitry Andricdefm DS_MIN_RTN_F64    : DS_1A1D_RET_mc<"ds_min_rtn_f64", VReg_64>;
568*0fca6ea1SDimitry Andricdefm DS_MAX_RTN_F64    : DS_1A1D_RET_mc<"ds_max_rtn_f64", VReg_64>;
5690b57cec5SDimitry Andric
5700b57cec5SDimitry Andricdefm DS_WRXCHG_RTN_B64 : DS_1A1D_RET_mc<"ds_wrxchg_rtn_b64", VReg_64>;
5710b57cec5SDimitry Andricdefm DS_WRXCHG2_RTN_B64 : DS_1A2D_Off8_RET_mc<"ds_wrxchg2_rtn_b64", VReg_128, VReg_64>;
5720b57cec5SDimitry Andricdefm DS_WRXCHG2ST64_RTN_B64 : DS_1A2D_Off8_RET_mc<"ds_wrxchg2st64_rtn_b64", VReg_128, VReg_64>;
5730b57cec5SDimitry Andric
5740b57cec5SDimitry Andriclet isConvergent = 1, usesCustomInserter = 1 in {
5750b57cec5SDimitry Andricdef DS_GWS_INIT       : DS_GWS_1D<"ds_gws_init"> {
5760b57cec5SDimitry Andric  let mayLoad = 0;
5770b57cec5SDimitry Andric}
5780b57cec5SDimitry Andricdef DS_GWS_SEMA_V     : DS_GWS_0D<"ds_gws_sema_v">;
5790b57cec5SDimitry Andricdef DS_GWS_SEMA_BR    : DS_GWS_1D<"ds_gws_sema_br">;
5800b57cec5SDimitry Andricdef DS_GWS_SEMA_P     : DS_GWS_0D<"ds_gws_sema_p">;
5810b57cec5SDimitry Andricdef DS_GWS_BARRIER    : DS_GWS_1D<"ds_gws_barrier">;
5820b57cec5SDimitry Andric}
5830b57cec5SDimitry Andric
5845ffd83dbSDimitry Andriclet SubtargetPredicate = HasDsSrc2Insts in {
5850b57cec5SDimitry Andricdef DS_ADD_SRC2_U32   : DS_1A<"ds_add_src2_u32">;
5860b57cec5SDimitry Andricdef DS_SUB_SRC2_U32   : DS_1A<"ds_sub_src2_u32">;
5870b57cec5SDimitry Andricdef DS_RSUB_SRC2_U32  : DS_1A<"ds_rsub_src2_u32">;
5880b57cec5SDimitry Andricdef DS_INC_SRC2_U32   : DS_1A<"ds_inc_src2_u32">;
5890b57cec5SDimitry Andricdef DS_DEC_SRC2_U32   : DS_1A<"ds_dec_src2_u32">;
5900b57cec5SDimitry Andricdef DS_MIN_SRC2_I32   : DS_1A<"ds_min_src2_i32">;
5910b57cec5SDimitry Andricdef DS_MAX_SRC2_I32   : DS_1A<"ds_max_src2_i32">;
5920b57cec5SDimitry Andricdef DS_MIN_SRC2_U32   : DS_1A<"ds_min_src2_u32">;
5930b57cec5SDimitry Andricdef DS_MAX_SRC2_U32   : DS_1A<"ds_max_src2_u32">;
5940b57cec5SDimitry Andricdef DS_AND_SRC2_B32   : DS_1A<"ds_and_src2_b32">;
5950b57cec5SDimitry Andricdef DS_OR_SRC2_B32    : DS_1A<"ds_or_src2_b32">;
5960b57cec5SDimitry Andricdef DS_XOR_SRC2_B32   : DS_1A<"ds_xor_src2_b32">;
5970b57cec5SDimitry Andricdef DS_MIN_SRC2_F32   : DS_1A<"ds_min_src2_f32">;
5980b57cec5SDimitry Andricdef DS_MAX_SRC2_F32   : DS_1A<"ds_max_src2_f32">;
5990b57cec5SDimitry Andric
6000b57cec5SDimitry Andricdef DS_ADD_SRC2_U64   : DS_1A<"ds_add_src2_u64">;
6010b57cec5SDimitry Andricdef DS_SUB_SRC2_U64   : DS_1A<"ds_sub_src2_u64">;
6020b57cec5SDimitry Andricdef DS_RSUB_SRC2_U64  : DS_1A<"ds_rsub_src2_u64">;
6030b57cec5SDimitry Andricdef DS_INC_SRC2_U64   : DS_1A<"ds_inc_src2_u64">;
6040b57cec5SDimitry Andricdef DS_DEC_SRC2_U64   : DS_1A<"ds_dec_src2_u64">;
6050b57cec5SDimitry Andricdef DS_MIN_SRC2_I64   : DS_1A<"ds_min_src2_i64">;
6060b57cec5SDimitry Andricdef DS_MAX_SRC2_I64   : DS_1A<"ds_max_src2_i64">;
6070b57cec5SDimitry Andricdef DS_MIN_SRC2_U64   : DS_1A<"ds_min_src2_u64">;
6080b57cec5SDimitry Andricdef DS_MAX_SRC2_U64   : DS_1A<"ds_max_src2_u64">;
6090b57cec5SDimitry Andricdef DS_AND_SRC2_B64   : DS_1A<"ds_and_src2_b64">;
6100b57cec5SDimitry Andricdef DS_OR_SRC2_B64    : DS_1A<"ds_or_src2_b64">;
6110b57cec5SDimitry Andricdef DS_XOR_SRC2_B64   : DS_1A<"ds_xor_src2_b64">;
6120b57cec5SDimitry Andricdef DS_MIN_SRC2_F64   : DS_1A<"ds_min_src2_f64">;
6130b57cec5SDimitry Andricdef DS_MAX_SRC2_F64   : DS_1A<"ds_max_src2_f64">;
6140b57cec5SDimitry Andric
6150b57cec5SDimitry Andricdef DS_WRITE_SRC2_B32 : DS_1A<"ds_write_src2_b32">;
6160b57cec5SDimitry Andricdef DS_WRITE_SRC2_B64 : DS_1A<"ds_write_src2_b64">;
6175ffd83dbSDimitry Andric} // End SubtargetPredicate = HasDsSrc2Insts
6180b57cec5SDimitry Andric
6190b57cec5SDimitry Andriclet Uses = [EXEC], mayLoad = 0, mayStore = 0, isConvergent = 1 in {
62006c3fb27SDimitry Andricdef DS_SWIZZLE_B32 : DS_1A_RET <"ds_swizzle_b32", VGPR_32, 0, Swizzle>;
6210b57cec5SDimitry Andric}
6220b57cec5SDimitry Andric
6230b57cec5SDimitry Andriclet mayStore = 0 in {
6240b57cec5SDimitry Andricdefm DS_READ_I8      : DS_1A_RET_mc<"ds_read_i8">;
6250b57cec5SDimitry Andricdefm DS_READ_U8      : DS_1A_RET_mc<"ds_read_u8">;
6260b57cec5SDimitry Andricdefm DS_READ_I16     : DS_1A_RET_mc<"ds_read_i16">;
6270b57cec5SDimitry Andricdefm DS_READ_U16     : DS_1A_RET_mc<"ds_read_u16">;
6280b57cec5SDimitry Andricdefm DS_READ_B32     : DS_1A_RET_mc<"ds_read_b32">;
6290b57cec5SDimitry Andricdefm DS_READ_B64     : DS_1A_RET_mc<"ds_read_b64", VReg_64>;
6300b57cec5SDimitry Andric
6310b57cec5SDimitry Andricdefm DS_READ2_B32    : DS_1A_Off8_RET_mc<"ds_read2_b32", VReg_64>;
6320b57cec5SDimitry Andricdefm DS_READ2ST64_B32: DS_1A_Off8_RET_mc<"ds_read2st64_b32", VReg_64>;
6330b57cec5SDimitry Andric
6340b57cec5SDimitry Andricdefm DS_READ2_B64    : DS_1A_Off8_RET_mc<"ds_read2_b64", VReg_128>;
6350b57cec5SDimitry Andricdefm DS_READ2ST64_B64: DS_1A_Off8_RET_mc<"ds_read2st64_b64", VReg_128>;
6360b57cec5SDimitry Andric
6370b57cec5SDimitry Andriclet has_m0_read = 0 in {
638bdd1243dSDimitry Andriclet SubtargetPredicate = HasD16LoadStore, TiedSourceNotRead = 1 in {
6390b57cec5SDimitry Andricdef DS_READ_U8_D16     : DS_1A_RET_Tied<"ds_read_u8_d16">;
6400b57cec5SDimitry Andricdef DS_READ_U8_D16_HI  : DS_1A_RET_Tied<"ds_read_u8_d16_hi">;
6410b57cec5SDimitry Andricdef DS_READ_I8_D16     : DS_1A_RET_Tied<"ds_read_i8_d16">;
6420b57cec5SDimitry Andricdef DS_READ_I8_D16_HI  : DS_1A_RET_Tied<"ds_read_i8_d16_hi">;
6430b57cec5SDimitry Andricdef DS_READ_U16_D16    : DS_1A_RET_Tied<"ds_read_u16_d16">;
6440b57cec5SDimitry Andricdef DS_READ_U16_D16_HI : DS_1A_RET_Tied<"ds_read_u16_d16_hi">;
6450b57cec5SDimitry Andric}
6468bcb0991SDimitry Andric} // End has_m0_read = 0
6470b57cec5SDimitry Andric
6480b57cec5SDimitry Andriclet SubtargetPredicate = HasDSAddTid in {
6498bcb0991SDimitry Andricdef DS_READ_ADDTID_B32 : DS_0A_RET<"ds_read_addtid_b32">;
6500b57cec5SDimitry Andric}
6518bcb0991SDimitry Andric
6528bcb0991SDimitry Andric} // End mayStore = 0
6530b57cec5SDimitry Andric
6540b57cec5SDimitry Andricdef DS_CONSUME       : DS_0A_RET<"ds_consume">;
6550b57cec5SDimitry Andricdef DS_APPEND        : DS_0A_RET<"ds_append">;
65681ad6265SDimitry Andric
65781ad6265SDimitry Andriclet SubtargetPredicate = isNotGFX90APlus in
6580b57cec5SDimitry Andricdef DS_ORDERED_COUNT : DS_1A_RET_GDS<"ds_ordered_count">;
6590b57cec5SDimitry Andric
6600b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
6610b57cec5SDimitry Andric// Instruction definitions for CI and newer.
6620b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
6630b57cec5SDimitry Andric
6640b57cec5SDimitry Andriclet SubtargetPredicate = isGFX7Plus in {
6650b57cec5SDimitry Andric
6660b57cec5SDimitry Andricdefm DS_WRAP_RTN_B32 : DS_1A2D_RET_mc<"ds_wrap_rtn_b32", VGPR_32>;
6670b57cec5SDimitry Andricdefm DS_CONDXCHG32_RTN_B64 : DS_1A1D_RET_mc<"ds_condxchg32_rtn_b64", VReg_64>;
6680b57cec5SDimitry Andric
6690b57cec5SDimitry Andriclet isConvergent = 1, usesCustomInserter = 1 in {
6700b57cec5SDimitry Andricdef DS_GWS_SEMA_RELEASE_ALL : DS_GWS_0D<"ds_gws_sema_release_all">;
6710b57cec5SDimitry Andric}
6720b57cec5SDimitry Andric
6730b57cec5SDimitry Andriclet mayStore = 0 in {
6740b57cec5SDimitry Andricdefm DS_READ_B96 : DS_1A_RET_mc<"ds_read_b96", VReg_96>;
6750b57cec5SDimitry Andricdefm DS_READ_B128: DS_1A_RET_mc<"ds_read_b128", VReg_128>;
6760b57cec5SDimitry Andric} // End mayStore = 0
6770b57cec5SDimitry Andric
6780b57cec5SDimitry Andriclet mayLoad = 0 in {
6790b57cec5SDimitry Andricdefm DS_WRITE_B96 : DS_1A1D_NORET_mc<"ds_write_b96", VReg_96>;
6800b57cec5SDimitry Andricdefm DS_WRITE_B128 : DS_1A1D_NORET_mc<"ds_write_b128", VReg_128>;
6810b57cec5SDimitry Andric} // End mayLoad = 0
6820b57cec5SDimitry Andric
6830b57cec5SDimitry Andricdef DS_NOP : DS_VOID<"ds_nop">;
6840b57cec5SDimitry Andric
6850b57cec5SDimitry Andric} // let SubtargetPredicate = isGFX7Plus
6860b57cec5SDimitry Andric
6870b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
6880b57cec5SDimitry Andric// Instruction definitions for VI and newer.
6890b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
6900b57cec5SDimitry Andric
6910b57cec5SDimitry Andriclet SubtargetPredicate = isGFX8Plus in {
6920b57cec5SDimitry Andric
6930b57cec5SDimitry Andriclet Uses = [EXEC] in {
6940b57cec5SDimitry Andricdef DS_PERMUTE_B32  : DS_1A1D_PERMUTE <"ds_permute_b32",
6950b57cec5SDimitry Andric                                       int_amdgcn_ds_permute>;
6960b57cec5SDimitry Andricdef DS_BPERMUTE_B32 : DS_1A1D_PERMUTE <"ds_bpermute_b32",
6970b57cec5SDimitry Andric                                       int_amdgcn_ds_bpermute>;
6980b57cec5SDimitry Andric}
6990b57cec5SDimitry Andric
7000b57cec5SDimitry Andric} // let SubtargetPredicate = isGFX8Plus
7010b57cec5SDimitry Andric
702*0fca6ea1SDimitry Andriclet SubtargetPredicate = HasLDSFPAtomicAddF32, OtherPredicates = [HasDsSrc2Insts] in {
7035ffd83dbSDimitry Andricdef DS_ADD_SRC2_F32 : DS_1A<"ds_add_src2_f32">;
7045ffd83dbSDimitry Andric}
7055ffd83dbSDimitry Andric
70681ad6265SDimitry Andric
70781ad6265SDimitry Andric//===----------------------------------------------------------------------===//
7085f757f3fSDimitry Andric// Instruction definitions for GFX11.
70981ad6265SDimitry Andric//===----------------------------------------------------------------------===//
71081ad6265SDimitry Andric
7115f757f3fSDimitry Andriclet SubtargetPredicate = isGFX11Only in {
71281ad6265SDimitry Andric
71381ad6265SDimitry Andricdef DS_ADD_GS_REG_RTN : DS_0A1D_RET_GDS<"ds_add_gs_reg_rtn", VReg_64, VGPR_32>;
71481ad6265SDimitry Andricdef DS_SUB_GS_REG_RTN : DS_0A1D_RET_GDS<"ds_sub_gs_reg_rtn", VReg_64, VGPR_32>;
7155f757f3fSDimitry Andric
7165f757f3fSDimitry Andric} // let SubtargetPredicate = isGFX11Only
7175f757f3fSDimitry Andric
7185f757f3fSDimitry Andriclet SubtargetPredicate = isGFX11Plus in {
7195f757f3fSDimitry Andric
720*0fca6ea1SDimitry Andriclet OtherPredicates = [HasImageInsts] in
721bdd1243dSDimitry Andricdef DS_BVH_STACK_RTN_B32 : DS_BVH_STACK<"ds_bvh_stack_rtn_b32">;
72281ad6265SDimitry Andric
72381ad6265SDimitry Andric} // let SubtargetPredicate = isGFX11Plus
72481ad6265SDimitry Andric
7250b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
7265f757f3fSDimitry Andric// Instruction definitions for GFX12 and newer.
7275f757f3fSDimitry Andric//===----------------------------------------------------------------------===//
7285f757f3fSDimitry Andric
7295f757f3fSDimitry Andriclet SubtargetPredicate = isGFX12Plus in {
7305f757f3fSDimitry Andric
7317a6dacacSDimitry Andricdefm DS_COND_SUB_U32      : DS_1A1D_NORET_mc<"ds_cond_sub_u32">;
732*0fca6ea1SDimitry Andricdefm DS_COND_SUB_RTN_U32  : DS_1A1D_RET_mc<"ds_cond_sub_rtn_u32", VGPR_32>;
7335f757f3fSDimitry Andricdefm DS_SUB_CLAMP_U32     : DS_1A1D_NORET_mc<"ds_sub_clamp_u32">;
734*0fca6ea1SDimitry Andricdefm DS_SUB_CLAMP_RTN_U32 : DS_1A1D_RET_mc<"ds_sub_clamp_rtn_u32", VGPR_32>;
7355f757f3fSDimitry Andric
7367a6dacacSDimitry Andricmulticlass DSAtomicRetNoRetPatIntrinsic_mc<DS_Pseudo inst, DS_Pseudo noRetInst,
7377a6dacacSDimitry Andric                                  ValueType vt, string frag> {
7387a6dacacSDimitry Andric  def : DSAtomicRetPat<inst, vt,
7397a6dacacSDimitry Andric                        !cast<PatFrag>(frag#"_local_addrspace")>;
7407a6dacacSDimitry Andric
7417a6dacacSDimitry Andric  let OtherPredicates = [HasAtomicCSubNoRtnInsts] in
7427a6dacacSDimitry Andric    def : DSAtomicRetPat<noRetInst, vt,
7437a6dacacSDimitry Andric                          !cast<PatFrag>(frag#"_noret_local_addrspace"), /* complexity */ 1>;
7447a6dacacSDimitry Andric}
7457a6dacacSDimitry Andric
7467a6dacacSDimitry Andricdefm : DSAtomicRetNoRetPatIntrinsic_mc<DS_COND_SUB_RTN_U32, DS_COND_SUB_U32, i32, "int_amdgcn_atomic_cond_sub_u32">;
7475f757f3fSDimitry Andric} // let SubtargetPredicate = isGFX12Plus
7485f757f3fSDimitry Andric
7495f757f3fSDimitry Andric//===----------------------------------------------------------------------===//
7500b57cec5SDimitry Andric// DS Patterns
7510b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
7520b57cec5SDimitry Andric
7530b57cec5SDimitry Andricdef : GCNPat <
7548bcb0991SDimitry Andric  (int_amdgcn_ds_swizzle i32:$src, timm:$offset16),
755480093f4SDimitry Andric  (DS_SWIZZLE_B32 VGPR_32:$src, (as_i16timm $offset16), (i1 0))
7560b57cec5SDimitry Andric>;
7570b57cec5SDimitry Andric
7580b57cec5SDimitry Andricclass DSReadPat <DS_Pseudo inst, ValueType vt, PatFrag frag, int gds=0> : GCNPat <
75906c3fb27SDimitry Andric  (vt (frag (DS1Addr1Offset i32:$ptr, i32:$offset))),
760*0fca6ea1SDimitry Andric  (inst $ptr, Offset:$offset, (i1 gds))
7610b57cec5SDimitry Andric>;
7620b57cec5SDimitry Andric
7630b57cec5SDimitry Andricmulticlass DSReadPat_mc<DS_Pseudo inst, ValueType vt, string frag> {
7640b57cec5SDimitry Andric
7650b57cec5SDimitry Andric  let OtherPredicates = [LDSRequiresM0Init] in {
7660b57cec5SDimitry Andric    def : DSReadPat<inst, vt, !cast<PatFrag>(frag#"_m0")>;
7670b57cec5SDimitry Andric  }
7680b57cec5SDimitry Andric
7690b57cec5SDimitry Andric  let OtherPredicates = [NotLDSRequiresM0Init] in {
7700b57cec5SDimitry Andric    def : DSReadPat<!cast<DS_Pseudo>(!cast<string>(inst)#"_gfx9"), vt, !cast<PatFrag>(frag)>;
7710b57cec5SDimitry Andric  }
7720b57cec5SDimitry Andric}
7730b57cec5SDimitry Andric
7740b57cec5SDimitry Andricclass DSReadPat_D16 <DS_Pseudo inst, PatFrag frag, ValueType vt> : GCNPat <
77506c3fb27SDimitry Andric  (frag (DS1Addr1Offset i32:$ptr, i32:$offset), vt:$in),
776*0fca6ea1SDimitry Andric  (inst $ptr, Offset:$offset, (i1 0), $in)
7770b57cec5SDimitry Andric>;
7780b57cec5SDimitry Andric
7790b57cec5SDimitry Andricdefm : DSReadPat_mc <DS_READ_I8, i32, "sextloadi8_local">;
7800b57cec5SDimitry Andricdefm : DSReadPat_mc <DS_READ_I8,  i16, "sextloadi8_local">;
7810b57cec5SDimitry Andricdefm : DSReadPat_mc <DS_READ_U8,  i32, "extloadi8_local">;
7820b57cec5SDimitry Andricdefm : DSReadPat_mc <DS_READ_U8,  i32, "zextloadi8_local">;
7830b57cec5SDimitry Andricdefm : DSReadPat_mc <DS_READ_U8,  i16, "extloadi8_local">;
7840b57cec5SDimitry Andricdefm : DSReadPat_mc <DS_READ_U8,  i16, "zextloadi8_local">;
7850b57cec5SDimitry Andricdefm : DSReadPat_mc <DS_READ_I16, i32, "sextloadi16_local">;
7860b57cec5SDimitry Andricdefm : DSReadPat_mc <DS_READ_I16, i32, "sextloadi16_local">;
7870b57cec5SDimitry Andricdefm : DSReadPat_mc <DS_READ_U16, i32, "extloadi16_local">;
7880b57cec5SDimitry Andricdefm : DSReadPat_mc <DS_READ_U16, i32, "zextloadi16_local">;
7890b57cec5SDimitry Andricdefm : DSReadPat_mc <DS_READ_U16, i16, "load_local">;
7908bcb0991SDimitry Andric
7918bcb0991SDimitry Andricforeach vt = Reg32Types.types in {
7928bcb0991SDimitry Andricdefm : DSReadPat_mc <DS_READ_B32, vt, "load_local">;
7938bcb0991SDimitry Andric}
7948bcb0991SDimitry Andric
795349cc55cSDimitry Andricdefm : DSReadPat_mc <DS_READ_U8, i16, "atomic_load_8_local">;
796349cc55cSDimitry Andricdefm : DSReadPat_mc <DS_READ_U8, i32, "atomic_load_8_local">;
797349cc55cSDimitry Andricdefm : DSReadPat_mc <DS_READ_U16, i16, "atomic_load_16_local">;
798349cc55cSDimitry Andricdefm : DSReadPat_mc <DS_READ_U16, i32, "atomic_load_16_local">;
7990b57cec5SDimitry Andricdefm : DSReadPat_mc <DS_READ_B32, i32, "atomic_load_32_local">;
8000b57cec5SDimitry Andricdefm : DSReadPat_mc <DS_READ_B64, i64, "atomic_load_64_local">;
8010b57cec5SDimitry Andric
8020b57cec5SDimitry Andriclet OtherPredicates = [D16PreservesUnusedBits] in {
8030b57cec5SDimitry Andricdef : DSReadPat_D16<DS_READ_U16_D16_HI, load_d16_hi_local, v2i16>;
8040b57cec5SDimitry Andricdef : DSReadPat_D16<DS_READ_U16_D16_HI, load_d16_hi_local, v2f16>;
8050b57cec5SDimitry Andricdef : DSReadPat_D16<DS_READ_U8_D16_HI, az_extloadi8_d16_hi_local, v2i16>;
8060b57cec5SDimitry Andricdef : DSReadPat_D16<DS_READ_U8_D16_HI, az_extloadi8_d16_hi_local, v2f16>;
8070b57cec5SDimitry Andricdef : DSReadPat_D16<DS_READ_I8_D16_HI, sextloadi8_d16_hi_local, v2i16>;
8080b57cec5SDimitry Andricdef : DSReadPat_D16<DS_READ_I8_D16_HI, sextloadi8_d16_hi_local, v2f16>;
8090b57cec5SDimitry Andric
8100b57cec5SDimitry Andricdef : DSReadPat_D16<DS_READ_U16_D16, load_d16_lo_local, v2i16>;
8110b57cec5SDimitry Andricdef : DSReadPat_D16<DS_READ_U16_D16, load_d16_lo_local, v2f16>;
8120b57cec5SDimitry Andricdef : DSReadPat_D16<DS_READ_U8_D16, az_extloadi8_d16_lo_local, v2i16>;
8130b57cec5SDimitry Andricdef : DSReadPat_D16<DS_READ_U8_D16, az_extloadi8_d16_lo_local, v2f16>;
8140b57cec5SDimitry Andricdef : DSReadPat_D16<DS_READ_I8_D16, sextloadi8_d16_lo_local, v2i16>;
8150b57cec5SDimitry Andricdef : DSReadPat_D16<DS_READ_I8_D16, sextloadi8_d16_lo_local, v2f16>;
8160b57cec5SDimitry Andric}
8170b57cec5SDimitry Andric
8180b57cec5SDimitry Andricclass DSWritePat <DS_Pseudo inst, ValueType vt, PatFrag frag, int gds=0> : GCNPat <
81906c3fb27SDimitry Andric  (frag vt:$value, (DS1Addr1Offset i32:$ptr, i32:$offset)),
820*0fca6ea1SDimitry Andric  (inst $ptr, getVregSrcForVT<vt>.ret:$value, Offset:$offset, (i1 gds))
8210b57cec5SDimitry Andric>;
8220b57cec5SDimitry Andric
8230b57cec5SDimitry Andricmulticlass DSWritePat_mc <DS_Pseudo inst, ValueType vt, string frag> {
8240b57cec5SDimitry Andric  let OtherPredicates = [LDSRequiresM0Init] in {
8250b57cec5SDimitry Andric    def : DSWritePat<inst, vt, !cast<PatFrag>(frag#"_m0")>;
8260b57cec5SDimitry Andric  }
8270b57cec5SDimitry Andric
8280b57cec5SDimitry Andric  let OtherPredicates = [NotLDSRequiresM0Init] in {
8290b57cec5SDimitry Andric    def : DSWritePat<!cast<DS_Pseudo>(!cast<string>(inst)#"_gfx9"), vt, !cast<PatFrag>(frag)>;
8300b57cec5SDimitry Andric  }
8310b57cec5SDimitry Andric}
8320b57cec5SDimitry Andric
8330b57cec5SDimitry Andricdefm : DSWritePat_mc <DS_WRITE_B8, i32, "truncstorei8_local">;
8340b57cec5SDimitry Andricdefm : DSWritePat_mc <DS_WRITE_B16, i32, "truncstorei16_local">;
8350b57cec5SDimitry Andricdefm : DSWritePat_mc <DS_WRITE_B8, i16, "truncstorei8_local">;
8360b57cec5SDimitry Andricdefm : DSWritePat_mc <DS_WRITE_B16, i16, "store_local">;
8378bcb0991SDimitry Andric
8385ffd83dbSDimitry Andricforeach vt = Reg32Types.types in {
8398bcb0991SDimitry Andricdefm : DSWritePat_mc <DS_WRITE_B32, vt, "store_local">;
8408bcb0991SDimitry Andric}
8418bcb0991SDimitry Andric
8425f757f3fSDimitry Andricdefm : DSWritePat_mc <DS_WRITE_B8, i16, "atomic_store_8_local">;
8435f757f3fSDimitry Andricdefm : DSWritePat_mc <DS_WRITE_B8, i32, "atomic_store_8_local">;
8445f757f3fSDimitry Andricdefm : DSWritePat_mc <DS_WRITE_B16, i16, "atomic_store_16_local">;
8455f757f3fSDimitry Andricdefm : DSWritePat_mc <DS_WRITE_B16, i32, "atomic_store_16_local">;
8465f757f3fSDimitry Andricdefm : DSWritePat_mc <DS_WRITE_B32, i32, "atomic_store_32_local">;
8475f757f3fSDimitry Andricdefm : DSWritePat_mc <DS_WRITE_B64, i64, "atomic_store_64_local">;
8480b57cec5SDimitry Andric
84981ad6265SDimitry Andriclet OtherPredicates = [HasD16LoadStore] in {
850480093f4SDimitry Andricdef : DSWritePat <DS_WRITE_B16_D16_HI, i32, store_hi16_local>;
851480093f4SDimitry Andricdef : DSWritePat <DS_WRITE_B8_D16_HI, i32, truncstorei8_hi16_local>;
8520b57cec5SDimitry Andric}
8530b57cec5SDimitry Andric
8545ffd83dbSDimitry Andricclass DS64Bit4ByteAlignedReadPat<DS_Pseudo inst, ValueType vt, PatFrag frag> : GCNPat <
8555ffd83dbSDimitry Andric  (vt:$value (frag (DS64Bit4ByteAligned i32:$ptr, i8:$offset0, i8:$offset1))),
8560b57cec5SDimitry Andric  (inst $ptr, $offset0, $offset1, (i1 0))
8570b57cec5SDimitry Andric>;
8580b57cec5SDimitry Andric
8595ffd83dbSDimitry Andricclass DS64Bit4ByteAlignedWritePat<DS_Pseudo inst, ValueType vt, PatFrag frag> : GCNPat<
8605ffd83dbSDimitry Andric  (frag vt:$value, (DS64Bit4ByteAligned i32:$ptr, i8:$offset0, i8:$offset1)),
8615ffd83dbSDimitry Andric  (inst $ptr, (i32 (EXTRACT_SUBREG VReg_64:$value, sub0)),
8625ffd83dbSDimitry Andric              (i32 (EXTRACT_SUBREG VReg_64:$value, sub1)), $offset0, $offset1,
8630b57cec5SDimitry Andric              (i1 0))
8640b57cec5SDimitry Andric>;
8650b57cec5SDimitry Andric
866e8d8bef9SDimitry Andricclass DS128Bit8ByteAlignedReadPat<DS_Pseudo inst, ValueType vt, PatFrag frag> : GCNPat <
867e8d8bef9SDimitry Andric  (vt:$value (frag (DS128Bit8ByteAligned i32:$ptr, i8:$offset0, i8:$offset1))),
868e8d8bef9SDimitry Andric  (inst $ptr, $offset0, $offset1, (i1 0))
869e8d8bef9SDimitry Andric>;
870e8d8bef9SDimitry Andric
871e8d8bef9SDimitry Andricclass DS128Bit8ByteAlignedWritePat<DS_Pseudo inst, ValueType vt, PatFrag frag> : GCNPat<
872e8d8bef9SDimitry Andric  (frag vt:$value, (DS128Bit8ByteAligned i32:$ptr, i8:$offset0, i8:$offset1)),
873e8d8bef9SDimitry Andric  (inst $ptr, (i64 (EXTRACT_SUBREG VReg_128:$value, sub0_sub1)),
874e8d8bef9SDimitry Andric              (i64 (EXTRACT_SUBREG VReg_128:$value, sub2_sub3)), $offset0, $offset1,
875e8d8bef9SDimitry Andric              (i1 0))
876e8d8bef9SDimitry Andric>;
877e8d8bef9SDimitry Andric
8785ffd83dbSDimitry Andricmulticlass DS64Bit4ByteAlignedPat_mc<ValueType vt> {
8790b57cec5SDimitry Andric  let OtherPredicates = [LDSRequiresM0Init, isGFX7Plus] in {
8805ffd83dbSDimitry Andric    def : DS64Bit4ByteAlignedReadPat<DS_READ2_B32, vt, load_local_m0>;
8815ffd83dbSDimitry Andric    def : DS64Bit4ByteAlignedWritePat<DS_WRITE2_B32, vt, store_local_m0>;
8820b57cec5SDimitry Andric  }
8830b57cec5SDimitry Andric
8840b57cec5SDimitry Andric  let OtherPredicates = [NotLDSRequiresM0Init] in {
8855ffd83dbSDimitry Andric    def : DS64Bit4ByteAlignedReadPat<DS_READ2_B32_gfx9, vt, load_local>;
8865ffd83dbSDimitry Andric    def : DS64Bit4ByteAlignedWritePat<DS_WRITE2_B32_gfx9, vt, store_local>;
8875ffd83dbSDimitry Andric  }
8880b57cec5SDimitry Andric}
8890b57cec5SDimitry Andric
890e8d8bef9SDimitry Andricmulticlass DS128Bit8ByteAlignedPat_mc<ValueType vt> {
891e8d8bef9SDimitry Andric  let OtherPredicates = [LDSRequiresM0Init, isGFX7Plus] in {
892e8d8bef9SDimitry Andric    def : DS128Bit8ByteAlignedReadPat<DS_READ2_B64, vt, load_local_m0>;
893e8d8bef9SDimitry Andric    def : DS128Bit8ByteAlignedWritePat<DS_WRITE2_B64, vt, store_local_m0>;
894e8d8bef9SDimitry Andric  }
895e8d8bef9SDimitry Andric
896e8d8bef9SDimitry Andric  let OtherPredicates = [NotLDSRequiresM0Init] in {
897e8d8bef9SDimitry Andric    def : DS128Bit8ByteAlignedReadPat<DS_READ2_B64_gfx9, vt, load_local>;
898e8d8bef9SDimitry Andric    def : DS128Bit8ByteAlignedWritePat<DS_WRITE2_B64_gfx9, vt, store_local>;
899e8d8bef9SDimitry Andric  }
900e8d8bef9SDimitry Andric}
901e8d8bef9SDimitry Andric
9025ffd83dbSDimitry Andric// v2i32 loads are split into i32 loads on SI during lowering, due to a bug
9035ffd83dbSDimitry Andric// related to bounds checking.
9045ffd83dbSDimitry Andricforeach vt = VReg_64.RegTypes in {
9055ffd83dbSDimitry Andricdefm : DS64Bit4ByteAlignedPat_mc<vt>;
9065ffd83dbSDimitry Andric}
9070b57cec5SDimitry Andric
908e8d8bef9SDimitry Andricforeach vt = VReg_128.RegTypes in {
909e8d8bef9SDimitry Andricdefm : DS128Bit8ByteAlignedPat_mc<vt>;
910e8d8bef9SDimitry Andric}
911e8d8bef9SDimitry Andric
912fe6060f1SDimitry Andric// Prefer ds_read over ds_read2 and ds_write over ds_write2, all other things
913fe6060f1SDimitry Andric// being equal, because it has a larger immediate offset range.
9140b57cec5SDimitry Andriclet AddedComplexity = 100 in {
9150b57cec5SDimitry Andric
9168bcb0991SDimitry Andricforeach vt = VReg_64.RegTypes in {
917fe6060f1SDimitry Andricdefm : DSReadPat_mc <DS_READ_B64, vt, "load_align8_local">;
9188bcb0991SDimitry Andricdefm : DSWritePat_mc <DS_WRITE_B64, vt, "store_align8_local">;
9198bcb0991SDimitry Andric}
9208bcb0991SDimitry Andric
921e8d8bef9SDimitry Andriclet SubtargetPredicate = isGFX7Plus in {
922e8d8bef9SDimitry Andric
923e8d8bef9SDimitry Andricforeach vt = VReg_96.RegTypes in {
924fe6060f1SDimitry Andricdefm : DSReadPat_mc <DS_READ_B96, vt, "load_align16_local">;
925e8d8bef9SDimitry Andricdefm : DSWritePat_mc <DS_WRITE_B96, vt, "store_align16_local">;
926e8d8bef9SDimitry Andric}
927e8d8bef9SDimitry Andric
928e8d8bef9SDimitry Andricforeach vt = VReg_128.RegTypes in {
929fe6060f1SDimitry Andricdefm : DSReadPat_mc <DS_READ_B128, vt, "load_align16_local">;
930e8d8bef9SDimitry Andricdefm : DSWritePat_mc <DS_WRITE_B128, vt, "store_align16_local">;
931e8d8bef9SDimitry Andric}
932e8d8bef9SDimitry Andric
933e8d8bef9SDimitry Andriclet SubtargetPredicate = HasUnalignedAccessMode in {
934e8d8bef9SDimitry Andric
93581ad6265SDimitry Andric// Select 64 bit loads and stores aligned less than 4 as a single ds_read_b64/
93681ad6265SDimitry Andric// ds_write_b64 instruction as this is faster than ds_read2_b32/ds_write2_b32
93781ad6265SDimitry Andric// which would be used otherwise. In this case a b32 access would still be
93881ad6265SDimitry Andric// misaligned, but we will have 2 of them.
93981ad6265SDimitry Andricforeach vt = VReg_64.RegTypes in {
94081ad6265SDimitry Andricdefm : DSReadPat_mc <DS_READ_B64, vt, "load_align_less_than_4_local">;
94181ad6265SDimitry Andricdefm : DSWritePat_mc <DS_WRITE_B64, vt, "store_align_less_than_4_local">;
94281ad6265SDimitry Andric}
94381ad6265SDimitry Andric
94481ad6265SDimitry Andric// Selection will split most of the unaligned 3 dword accesses due to performance
94581ad6265SDimitry Andric// reasons when beneficial. Keep these two patterns for the rest of the cases.
946e8d8bef9SDimitry Andricforeach vt = VReg_96.RegTypes in {
947fe6060f1SDimitry Andricdefm : DSReadPat_mc <DS_READ_B96, vt, "load_local">;
948e8d8bef9SDimitry Andricdefm : DSWritePat_mc <DS_WRITE_B96, vt, "store_local">;
949e8d8bef9SDimitry Andric}
950e8d8bef9SDimitry Andric
95181ad6265SDimitry Andric// Select 128 bit loads and stores aligned less than 4 as a single ds_read_b128/
95281ad6265SDimitry Andric// ds_write_b128 instruction as this is faster than ds_read2_b64/ds_write2_b64
95381ad6265SDimitry Andric// which would be used otherwise. In this case a b64 access would still be
95481ad6265SDimitry Andric// misaligned, but we will have 2 of them.
95581ad6265SDimitry Andricforeach vt = VReg_128.RegTypes in {
95681ad6265SDimitry Andricdefm : DSReadPat_mc <DS_READ_B128, vt, "load_align_less_than_4_local">;
95781ad6265SDimitry Andricdefm : DSWritePat_mc <DS_WRITE_B128, vt, "store_align_less_than_4_local">;
95881ad6265SDimitry Andric}
959e8d8bef9SDimitry Andric
960e8d8bef9SDimitry Andric} // End SubtargetPredicate = HasUnalignedAccessMode
961e8d8bef9SDimitry Andric
962e8d8bef9SDimitry Andric} // End SubtargetPredicate = isGFX7Plus
9630b57cec5SDimitry Andric
9640b57cec5SDimitry Andric} // End AddedComplexity = 100
965e8d8bef9SDimitry Andric
9660b57cec5SDimitry Andricmulticlass DSAtomicRetPat_mc<DS_Pseudo inst, ValueType vt, string frag> {
9670b57cec5SDimitry Andric  let OtherPredicates = [LDSRequiresM0Init] in {
968*0fca6ea1SDimitry Andric    def : DSAtomicRetPat<inst, vt, !cast<PatFrag>(frag#"_local_m0_"#vt)>;
9690b57cec5SDimitry Andric  }
9700b57cec5SDimitry Andric
9710b57cec5SDimitry Andric  let OtherPredicates = [NotLDSRequiresM0Init] in {
9720b57cec5SDimitry Andric    def : DSAtomicRetPat<!cast<DS_Pseudo>(!cast<string>(inst)#"_gfx9"), vt,
973*0fca6ea1SDimitry Andric                         !cast<PatFrag>(frag#"_local_"#vt)>;
9740b57cec5SDimitry Andric  }
9750b57cec5SDimitry Andric
9765f757f3fSDimitry Andric  let OtherPredicates = [HasGDS] in {
977*0fca6ea1SDimitry Andric    def : DSAtomicRetPat<inst, vt, !cast<PatFrag>(frag#"_region_m0_"#vt),
978753f127fSDimitry Andric                         /* complexity */ 0, /* gds */ 1>;
9790b57cec5SDimitry Andric  }
9805f757f3fSDimitry Andric}
9810b57cec5SDimitry Andric
98281ad6265SDimitry Andricmulticlass DSAtomicRetNoRetPat_mc<DS_Pseudo inst, DS_Pseudo noRetInst,
98381ad6265SDimitry Andric                                  ValueType vt, string frag> {
98481ad6265SDimitry Andric  let OtherPredicates = [LDSRequiresM0Init] in {
98581ad6265SDimitry Andric    def : DSAtomicRetPat<inst, vt,
986*0fca6ea1SDimitry Andric                         !cast<PatFrag>(frag#"_local_m0_"#vt)>;
98781ad6265SDimitry Andric    def : DSAtomicRetPat<noRetInst, vt,
988*0fca6ea1SDimitry Andric                         !cast<PatFrag>(frag#"_local_m0_noret_"#vt), /* complexity */ 1>;
98981ad6265SDimitry Andric  }
99081ad6265SDimitry Andric
99181ad6265SDimitry Andric  let OtherPredicates = [NotLDSRequiresM0Init] in {
99281ad6265SDimitry Andric    def : DSAtomicRetPat<!cast<DS_Pseudo>(!cast<string>(inst)#"_gfx9"), vt,
993*0fca6ea1SDimitry Andric                         !cast<PatFrag>(frag#"_local_"#vt)>;
99481ad6265SDimitry Andric    def : DSAtomicRetPat<!cast<DS_Pseudo>(!cast<string>(noRetInst)#"_gfx9"), vt,
995*0fca6ea1SDimitry Andric                         !cast<PatFrag>(frag#"_local_noret_"#vt), /* complexity */ 1>;
99681ad6265SDimitry Andric  }
99781ad6265SDimitry Andric
9985f757f3fSDimitry Andric  let OtherPredicates = [HasGDS] in {
99981ad6265SDimitry Andric    def : DSAtomicRetPat<inst, vt,
1000*0fca6ea1SDimitry Andric                         !cast<PatFrag>(frag#"_region_m0_"#vt),
1001753f127fSDimitry Andric                         /* complexity */ 0, /* gds */ 1>;
100281ad6265SDimitry Andric    def : DSAtomicRetPat<noRetInst, vt,
1003*0fca6ea1SDimitry Andric                         !cast<PatFrag>(frag#"_region_m0_noret_"#vt),
1004753f127fSDimitry Andric                         /* complexity */ 1, /* gds */ 1>;
100581ad6265SDimitry Andric  }
10065f757f3fSDimitry Andric}
10070b57cec5SDimitry Andric
10080b57cec5SDimitry Andric
100981ad6265SDimitry Andric
101081ad6265SDimitry Andriclet SubtargetPredicate = isGFX6GFX7GFX8GFX9GFX10 in {
101181ad6265SDimitry Andric// Caution, the order of src and cmp is the *opposite* of the BUFFER_ATOMIC_CMPSWAP opcode.
1012753f127fSDimitry Andricclass DSAtomicCmpXChgSwapped<DS_Pseudo inst, ValueType vt, PatFrag frag,
1013753f127fSDimitry Andric  int complexity = 0, bit gds=0> : GCNPat<
101406c3fb27SDimitry Andric  (frag (DS1Addr1Offset i32:$ptr, i32:$offset), vt:$cmp, vt:$swap),
1015*0fca6ea1SDimitry Andric  (inst $ptr, getVregSrcForVT<vt>.ret:$cmp, getVregSrcForVT<vt>.ret:$swap, Offset:$offset, (i1 gds))> {
1016753f127fSDimitry Andric  let AddedComplexity = complexity;
1017753f127fSDimitry Andric}
10180b57cec5SDimitry Andric
101981ad6265SDimitry Andricmulticlass DSAtomicCmpXChgSwapped_mc<DS_Pseudo inst, DS_Pseudo noRetInst, ValueType vt,
102081ad6265SDimitry Andric                                     string frag> {
10210b57cec5SDimitry Andric  let OtherPredicates = [LDSRequiresM0Init] in {
1022*0fca6ea1SDimitry Andric    def : DSAtomicCmpXChgSwapped<inst, vt, !cast<PatFrag>(frag#"_local_m0_"#vt)>;
1023*0fca6ea1SDimitry Andric    def : DSAtomicCmpXChgSwapped<noRetInst, vt, !cast<PatFrag>(frag#"_local_m0_noret_"#vt),
1024753f127fSDimitry Andric                                 /* complexity */ 1>;
10250b57cec5SDimitry Andric  }
10260b57cec5SDimitry Andric
10270b57cec5SDimitry Andric  let OtherPredicates = [NotLDSRequiresM0Init] in {
102881ad6265SDimitry Andric    def : DSAtomicCmpXChgSwapped<!cast<DS_Pseudo>(!cast<string>(inst)#"_gfx9"), vt,
1029*0fca6ea1SDimitry Andric                                 !cast<PatFrag>(frag#"_local_"#vt)>;
103081ad6265SDimitry Andric    def : DSAtomicCmpXChgSwapped<!cast<DS_Pseudo>(!cast<string>(noRetInst)#"_gfx9"), vt,
1031*0fca6ea1SDimitry Andric                                 !cast<PatFrag>(frag#"_local_noret_"#vt),
1032753f127fSDimitry Andric                                 /* complexity */ 1>;
103381ad6265SDimitry Andric  }
103481ad6265SDimitry Andric
10355f757f3fSDimitry Andric  let OtherPredicates = [HasGDS] in {
1036*0fca6ea1SDimitry Andric    def : DSAtomicCmpXChgSwapped<inst, vt, !cast<PatFrag>(frag#"_region_m0_"#vt),
1037753f127fSDimitry Andric                                 /* complexity */ 0, /* gds */ 1>;
1038*0fca6ea1SDimitry Andric    def : DSAtomicCmpXChgSwapped<noRetInst, vt, !cast<PatFrag>(frag#"_region_m0_noret_"#vt),
1039753f127fSDimitry Andric                                 /* complexity */ 1, /* gds */ 1>;
104081ad6265SDimitry Andric  }
10415f757f3fSDimitry Andric}
104281ad6265SDimitry Andric} // End SubtargetPredicate = isGFX6GFX7GFX8GFX9GFX10
104381ad6265SDimitry Andric
104481ad6265SDimitry Andriclet SubtargetPredicate = isGFX11Plus in {
104581ad6265SDimitry Andric// The order of src and cmp agrees with the BUFFER_ATOMIC_CMPSWAP opcode.
1046753f127fSDimitry Andricclass DSAtomicCmpXChg<DS_Pseudo inst, ValueType vt, PatFrag frag,
1047753f127fSDimitry Andric  int complexity = 0, bit gds=0> : GCNPat<
104806c3fb27SDimitry Andric  (frag (DS1Addr1Offset i32:$ptr, i32:$offset), vt:$cmp, vt:$swap),
1049*0fca6ea1SDimitry Andric  (inst $ptr, getVregSrcForVT<vt>.ret:$swap, getVregSrcForVT<vt>.ret:$cmp, Offset:$offset, (i1 gds))> {
1050753f127fSDimitry Andric  let AddedComplexity = complexity;
1051753f127fSDimitry Andric}
105281ad6265SDimitry Andric
105381ad6265SDimitry Andricmulticlass DSAtomicCmpXChg_mc<DS_Pseudo inst, DS_Pseudo noRetInst, ValueType vt, string frag> {
105481ad6265SDimitry Andric
10550b57cec5SDimitry Andric  def : DSAtomicCmpXChg<!cast<DS_Pseudo>(!cast<string>(inst)#"_gfx9"), vt,
1056*0fca6ea1SDimitry Andric                        !cast<PatFrag>(frag#"_local_"#vt)>;
105781ad6265SDimitry Andric  def : DSAtomicCmpXChg<!cast<DS_Pseudo>(!cast<string>(noRetInst)#"_gfx9"), vt,
1058*0fca6ea1SDimitry Andric                        !cast<PatFrag>(frag#"_local_noret_"#vt), /* complexity */ 1>;
105981ad6265SDimitry Andric
10605f757f3fSDimitry Andric  let OtherPredicates = [HasGDS] in {
1061*0fca6ea1SDimitry Andric    def : DSAtomicCmpXChg<inst, vt, !cast<PatFrag>(frag#"_region_m0_"#vt),
1062753f127fSDimitry Andric                          /* complexity */ 0, /* gds */ 1>;
1063*0fca6ea1SDimitry Andric    def : DSAtomicCmpXChg<noRetInst, vt, !cast<PatFrag>(frag#"_region_m0_noret_"#vt),
1064753f127fSDimitry Andric                          /* complexity */ 1, /* gds */ 1>;
10650b57cec5SDimitry Andric  }
10665f757f3fSDimitry Andric}
106781ad6265SDimitry Andric} // End SubtargetPredicate = isGFX11Plus
10680b57cec5SDimitry Andric
10690b57cec5SDimitry Andric// 32-bit atomics.
10700b57cec5SDimitry Andricdefm : DSAtomicRetPat_mc<DS_WRXCHG_RTN_B32, i32, "atomic_swap">;
107181ad6265SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_ADD_RTN_U32, DS_ADD_U32, i32, "atomic_load_add">;
107281ad6265SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_SUB_RTN_U32, DS_SUB_U32, i32, "atomic_load_sub">;
107306c3fb27SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_INC_RTN_U32, DS_INC_U32, i32, "atomic_load_uinc_wrap">;
107406c3fb27SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_DEC_RTN_U32, DS_DEC_U32, i32, "atomic_load_udec_wrap">;
107581ad6265SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_AND_RTN_B32, DS_AND_B32, i32, "atomic_load_and">;
107681ad6265SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_OR_RTN_B32, DS_OR_B32, i32, "atomic_load_or">;
107781ad6265SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_XOR_RTN_B32, DS_XOR_B32, i32, "atomic_load_xor">;
107881ad6265SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_MIN_RTN_I32, DS_MIN_I32, i32, "atomic_load_min">;
107981ad6265SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_MAX_RTN_I32, DS_MAX_I32, i32, "atomic_load_max">;
108081ad6265SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_MIN_RTN_U32, DS_MIN_U32, i32, "atomic_load_umin">;
108181ad6265SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_MAX_RTN_U32, DS_MAX_U32, i32, "atomic_load_umax">;
108281ad6265SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_MIN_RTN_F32, DS_MIN_F32, f32, "atomic_load_fmin">;
108381ad6265SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_MAX_RTN_F32, DS_MAX_F32, f32, "atomic_load_fmax">;
108481ad6265SDimitry Andric
1085*0fca6ea1SDimitry Andric
1086*0fca6ea1SDimitry Andriclet SubtargetPredicate = HasAtomicDsPkAdd16Insts in {
1087*0fca6ea1SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_PK_ADD_RTN_F16, DS_PK_ADD_F16, v2f16, "atomic_load_fadd">;
1088*0fca6ea1SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_PK_ADD_RTN_BF16, DS_PK_ADD_BF16, v2bf16, "atomic_load_fadd">;
1089*0fca6ea1SDimitry Andric}
1090*0fca6ea1SDimitry Andric
109181ad6265SDimitry Andriclet SubtargetPredicate = isGFX6GFX7GFX8GFX9GFX10 in {
109281ad6265SDimitry Andricdefm : DSAtomicCmpXChgSwapped_mc<DS_CMPST_RTN_B32, DS_CMPST_B32, i32, "atomic_cmp_swap">;
109381ad6265SDimitry Andric}
109481ad6265SDimitry Andric
109581ad6265SDimitry Andriclet SubtargetPredicate = isGFX11Plus in {
109681ad6265SDimitry Andricdefm : DSAtomicCmpXChg_mc<DS_CMPSTORE_RTN_B32, DS_CMPSTORE_B32, i32, "atomic_cmp_swap">;
109781ad6265SDimitry Andric}
1098349cc55cSDimitry Andric
1099*0fca6ea1SDimitry Andriclet SubtargetPredicate = HasLDSFPAtomicAddF32 in {
110081ad6265SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_ADD_RTN_F32, DS_ADD_F32, f32, "atomic_load_fadd">;
11015ffd83dbSDimitry Andric}
11020b57cec5SDimitry Andric
11030b57cec5SDimitry Andric// 64-bit atomics.
11040b57cec5SDimitry Andricdefm : DSAtomicRetPat_mc<DS_WRXCHG_RTN_B64, i64, "atomic_swap">;
110581ad6265SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_ADD_RTN_U64, DS_ADD_U64, i64, "atomic_load_add">;
110681ad6265SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_SUB_RTN_U64, DS_SUB_U64, i64, "atomic_load_sub">;
110706c3fb27SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_INC_RTN_U64, DS_INC_U64, i64, "atomic_load_uinc_wrap">;
110806c3fb27SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_DEC_RTN_U64, DS_DEC_U64, i64, "atomic_load_udec_wrap">;
110981ad6265SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_AND_RTN_B64, DS_AND_B64, i64, "atomic_load_and">;
111081ad6265SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_OR_RTN_B64, DS_OR_B64, i64, "atomic_load_or">;
111181ad6265SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_XOR_RTN_B64, DS_XOR_B64, i64, "atomic_load_xor">;
111281ad6265SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_MIN_RTN_I64, DS_MIN_I64, i64, "atomic_load_min">;
111381ad6265SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_MAX_RTN_I64, DS_MAX_I64, i64, "atomic_load_max">;
111481ad6265SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_MIN_RTN_U64, DS_MIN_U64, i64, "atomic_load_umin">;
111581ad6265SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_MAX_RTN_U64, DS_MAX_U64, i64, "atomic_load_umax">;
111681ad6265SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_MIN_RTN_F64, DS_MIN_F64, f64, "atomic_load_fmin">;
111781ad6265SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_MAX_RTN_F64, DS_MAX_F64, f64, "atomic_load_fmax">;
11180b57cec5SDimitry Andric
111981ad6265SDimitry Andriclet SubtargetPredicate = isGFX6GFX7GFX8GFX9GFX10 in {
112081ad6265SDimitry Andricdefm : DSAtomicCmpXChgSwapped_mc<DS_CMPST_RTN_B64, DS_CMPST_B64, i64, "atomic_cmp_swap">;
112181ad6265SDimitry Andric} // End SubtargetPredicate = isGFX6GFX7GFX8GFX9GFX10
112281ad6265SDimitry Andric
112381ad6265SDimitry Andriclet SubtargetPredicate = isGFX11Plus in {
112481ad6265SDimitry Andricdefm : DSAtomicCmpXChg_mc<DS_CMPSTORE_RTN_B64, DS_CMPSTORE_B64, i64, "atomic_cmp_swap">;
112581ad6265SDimitry Andric} // End SubtargetPredicate = isGFX11Plus
11260b57cec5SDimitry Andric
1127*0fca6ea1SDimitry Andriclet SubtargetPredicate = HasLdsAtomicAddF64 in {
1128*0fca6ea1SDimitry Andricdef : DSAtomicRetPat<DS_ADD_RTN_F64, f64, atomic_load_fadd_local_f64>;
1129753f127fSDimitry Andriclet AddedComplexity = 1 in
1130*0fca6ea1SDimitry Andricdef : DSAtomicRetPat<DS_ADD_F64, f64, atomic_load_fadd_local_noret_f64>;
1131bdd1243dSDimitry Andric
1132bdd1243dSDimitry Andricclass DSAtomicRetPatIntrinsic<DS_Pseudo inst, ValueType vt, PatFrag frag,
1133bdd1243dSDimitry Andric  bit gds=0> : GCNPat <
113406c3fb27SDimitry Andric  (vt (frag (DS1Addr1Offset i32:$ptr, i32:$offset), vt:$value)),
1135*0fca6ea1SDimitry Andric  (inst $ptr, getVregSrcForVT<vt>.ret:$value, Offset:$offset, (i1 gds))> {
1136bdd1243dSDimitry Andric}
1137bdd1243dSDimitry Andric
1138bdd1243dSDimitry Andricdef : DSAtomicRetPatIntrinsic<DS_ADD_RTN_F64, f64, int_amdgcn_flat_atomic_fadd_local_addrspace>;
1139bdd1243dSDimitry Andriclet AddedComplexity = 1 in
1140bdd1243dSDimitry Andricdef : DSAtomicRetPatIntrinsic<DS_ADD_F64, f64, int_amdgcn_flat_atomic_fadd_noret_local_addrspace>;
114181ad6265SDimitry Andric}
114281ad6265SDimitry Andric
114306c3fb27SDimitry Andriclet SubtargetPredicate = HasAtomicDsPkAdd16Insts in {
1144*0fca6ea1SDimitry Andricdefm : DSAtomicRetNoRetPat_mc<DS_PK_ADD_RTN_F16, DS_PK_ADD_F16, v2f16, "atomic_load_fadd">;
114506c3fb27SDimitry Andric} // End SubtargetPredicate = HasAtomicDsPkAdd16Insts
1146fe6060f1SDimitry Andric
1147cb14a3feSDimitry Andriclet OtherPredicates = [HasGDS] in
1148cb14a3feSDimitry Andricdef : GCNPat <
11490b57cec5SDimitry Andric  (SIds_ordered_count i32:$value, i16:$offset),
11500b57cec5SDimitry Andric  (DS_ORDERED_COUNT $value, (as_i16imm $offset))
11510b57cec5SDimitry Andric>;
11520b57cec5SDimitry Andric
115381ad6265SDimitry Andricdef : GCNPat <
115481ad6265SDimitry Andric  (i64 (int_amdgcn_ds_add_gs_reg_rtn i32:$src, timm:$offset32)),
115581ad6265SDimitry Andric  (DS_ADD_GS_REG_RTN VGPR_32:$src, (as_i32timm $offset32))
115681ad6265SDimitry Andric>;
115781ad6265SDimitry Andric
115881ad6265SDimitry Andricdef : GCNPat <
115981ad6265SDimitry Andric  (i32 (int_amdgcn_ds_add_gs_reg_rtn i32:$src, timm:$offset32)),
116081ad6265SDimitry Andric  (EXTRACT_SUBREG
116181ad6265SDimitry Andric    (i64 (COPY_TO_REGCLASS
116281ad6265SDimitry Andric      (DS_ADD_GS_REG_RTN VGPR_32:$src, (as_i32timm $offset32)),
116381ad6265SDimitry Andric      VReg_64)),
116481ad6265SDimitry Andric    sub0)
116581ad6265SDimitry Andric>;
116681ad6265SDimitry Andric
116781ad6265SDimitry Andricdef : GCNPat <
116881ad6265SDimitry Andric  (i64 (int_amdgcn_ds_sub_gs_reg_rtn i32:$src, timm:$offset32)),
116981ad6265SDimitry Andric  (DS_SUB_GS_REG_RTN VGPR_32:$src, (as_i32timm $offset32))
117081ad6265SDimitry Andric>;
117181ad6265SDimitry Andric
117281ad6265SDimitry Andricdef : GCNPat <
117381ad6265SDimitry Andric  (i32 (int_amdgcn_ds_sub_gs_reg_rtn i32:$src, timm:$offset32)),
117481ad6265SDimitry Andric  (EXTRACT_SUBREG
117581ad6265SDimitry Andric    (i64 (COPY_TO_REGCLASS
117681ad6265SDimitry Andric      (DS_SUB_GS_REG_RTN VGPR_32:$src, (as_i32timm $offset32)),
117781ad6265SDimitry Andric      VReg_64)),
117881ad6265SDimitry Andric    sub0)
117981ad6265SDimitry Andric>;
118081ad6265SDimitry Andric
11810b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
11820b57cec5SDimitry Andric// Target-specific instruction encodings.
11830b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
11840b57cec5SDimitry Andric
11850b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
11865f757f3fSDimitry Andric// Base ENC_DS for GFX6, GFX7, GFX10, GFX11, GFX12.
11870b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
11880b57cec5SDimitry Andric
11895f757f3fSDimitry Andricclass Base_DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<bits<8> op, DS_Pseudo ps, int ef,
1190cb14a3feSDimitry Andric                                               string opName = ps.Mnemonic,
1191*0fca6ea1SDimitry Andric                                               bit hasGDS = true>
1192*0fca6ea1SDimitry Andric    : DS_Real<ps, opName>, SIMCInstr <ps.PseudoInstr, ef> {
11930b57cec5SDimitry Andric
11940b57cec5SDimitry Andric  let Inst{7-0}   = !if(ps.has_offset0, offset0, 0);
11950b57cec5SDimitry Andric  let Inst{15-8}  = !if(ps.has_offset1, offset1, 0);
11960b57cec5SDimitry Andric  let Inst{17}    = !if(ps.has_gds, gds, ps.gdsValue);
11970b57cec5SDimitry Andric  let Inst{25-18} = op;
11980b57cec5SDimitry Andric  let Inst{31-26} = 0x36;
1199fe6060f1SDimitry Andric  let Inst{39-32} = !if(ps.has_addr, addr, !if(ps.has_gws_data0, data0{7-0}, 0));
1200fe6060f1SDimitry Andric  let Inst{47-40} = !if(ps.has_data0, data0{7-0}, 0);
1201fe6060f1SDimitry Andric  let Inst{55-48} = !if(ps.has_data1, data1{7-0}, 0);
1202fe6060f1SDimitry Andric  let Inst{63-56} = !if(ps.has_vdst, vdst{7-0}, 0);
1203cb14a3feSDimitry Andric
1204*0fca6ea1SDimitry Andric  let gds = !if(hasGDS, ?, 0);
12050b57cec5SDimitry Andric}
12060b57cec5SDimitry Andric
12070b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
12085f757f3fSDimitry Andric// GFX12.
12095f757f3fSDimitry Andric//===----------------------------------------------------------------------===//
12105f757f3fSDimitry Andric
1211*0fca6ea1SDimitry Andricmulticlass DS_Real_gfx12<bits<8> op, string name = !tolower(NAME), bit needAlias = true> {
12125f757f3fSDimitry Andric  defvar ps = !cast<DS_Pseudo>(NAME);
1213*0fca6ea1SDimitry Andric  let AssemblerPredicate = isGFX12Plus in {
1214*0fca6ea1SDimitry Andric    let DecoderNamespace = "GFX12" in
12155f757f3fSDimitry Andric      def _gfx12 :
12165f757f3fSDimitry Andric        Base_DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<op, ps, SIEncodingFamily.GFX12,
1217*0fca6ea1SDimitry Andric                                               name, /*hasGDS=*/false>;
1218*0fca6ea1SDimitry Andric    if !and(needAlias, !ne(ps.Mnemonic, name)) then
1219*0fca6ea1SDimitry Andric      def : AMDGPUMnemonicAlias<ps.Mnemonic, name>;
1220*0fca6ea1SDimitry Andric  } // End AssemblerPredicate
12215f757f3fSDimitry Andric}
12225f757f3fSDimitry Andric
1223*0fca6ea1SDimitry Andricdefm DS_MIN_F32           : DS_Real_gfx12<0x012, "ds_min_num_f32">;
1224*0fca6ea1SDimitry Andricdefm DS_MAX_F32           : DS_Real_gfx12<0x013, "ds_max_num_f32">;
1225*0fca6ea1SDimitry Andricdefm DS_MIN_RTN_F32       : DS_Real_gfx12<0x032, "ds_min_num_rtn_f32">;
1226*0fca6ea1SDimitry Andricdefm DS_MAX_RTN_F32       : DS_Real_gfx12<0x033, "ds_max_num_rtn_f32">;
1227*0fca6ea1SDimitry Andricdefm DS_MIN_F64           : DS_Real_gfx12<0x052, "ds_min_num_f64">;
1228*0fca6ea1SDimitry Andricdefm DS_MAX_F64           : DS_Real_gfx12<0x053, "ds_max_num_f64">;
1229*0fca6ea1SDimitry Andricdefm DS_MIN_RTN_F64       : DS_Real_gfx12<0x072, "ds_min_num_rtn_f64">;
1230*0fca6ea1SDimitry Andricdefm DS_MAX_RTN_F64       : DS_Real_gfx12<0x073, "ds_max_num_rtn_f64">;
12317a6dacacSDimitry Andricdefm DS_COND_SUB_U32      : DS_Real_gfx12<0x098>;
12325f757f3fSDimitry Andricdefm DS_SUB_CLAMP_U32     : DS_Real_gfx12<0x099>;
12337a6dacacSDimitry Andricdefm DS_COND_SUB_RTN_U32  : DS_Real_gfx12<0x0a8>;
12345f757f3fSDimitry Andricdefm DS_SUB_CLAMP_RTN_U32 : DS_Real_gfx12<0x0a9>;
12357a6dacacSDimitry Andricdefm DS_PK_ADD_F16        : DS_Real_gfx12<0x09a>;
12367a6dacacSDimitry Andricdefm DS_PK_ADD_RTN_F16    : DS_Real_gfx12<0x0aa>;
12377a6dacacSDimitry Andricdefm DS_PK_ADD_BF16       : DS_Real_gfx12<0x09b>;
12387a6dacacSDimitry Andricdefm DS_PK_ADD_RTN_BF16   : DS_Real_gfx12<0x0ab>;
12395f757f3fSDimitry Andric
1240*0fca6ea1SDimitry Andric// New aliases added in GFX12 without renaming the instructions.
1241*0fca6ea1SDimitry Andriclet AssemblerPredicate = isGFX12Plus in {
1242*0fca6ea1SDimitry Andric  def : AMDGPUMnemonicAlias<"ds_subrev_u32", "ds_rsub_u32">;
1243*0fca6ea1SDimitry Andric  def : AMDGPUMnemonicAlias<"ds_subrev_rtn_u32", "ds_rsub_rtn_u32">;
1244*0fca6ea1SDimitry Andric  def : AMDGPUMnemonicAlias<"ds_subrev_u64", "ds_rsub_u64">;
1245*0fca6ea1SDimitry Andric  def : AMDGPUMnemonicAlias<"ds_subrev_rtn_u64", "ds_rsub_rtn_u64">;
1246*0fca6ea1SDimitry Andric}
1247*0fca6ea1SDimitry Andric
12485f757f3fSDimitry Andric//===----------------------------------------------------------------------===//
124981ad6265SDimitry Andric// GFX11.
125081ad6265SDimitry Andric//===----------------------------------------------------------------------===//
125181ad6265SDimitry Andric
1252*0fca6ea1SDimitry Andricmulticlass DS_Real_gfx11<bits<8> op, string name = !tolower(NAME)> {
1253*0fca6ea1SDimitry Andric  defvar ps = !cast<DS_Pseudo>(NAME);
1254*0fca6ea1SDimitry Andric  let AssemblerPredicate = isGFX11Only in {
1255*0fca6ea1SDimitry Andric    let DecoderNamespace = "GFX11" in
12565f757f3fSDimitry Andric      def _gfx11 :
1257*0fca6ea1SDimitry Andric        Base_DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<op, ps, SIEncodingFamily.GFX11,
1258*0fca6ea1SDimitry Andric                                               name>;
1259*0fca6ea1SDimitry Andric    if !ne(ps.Mnemonic, name) then
1260*0fca6ea1SDimitry Andric      def : AMDGPUMnemonicAlias<ps.Mnemonic, name>;
1261*0fca6ea1SDimitry Andric  } // End AssemblerPredicate
126281ad6265SDimitry Andric}
126381ad6265SDimitry Andric
1264*0fca6ea1SDimitry Andricmulticlass DS_Real_gfx11_gfx12<bits<8> op, string name = !tolower(NAME)>
1265*0fca6ea1SDimitry Andric  : DS_Real_gfx11<op, name>, DS_Real_gfx12<op, name>;
126681ad6265SDimitry Andric
1267*0fca6ea1SDimitry Andricdefm DS_WRITE_B32           : DS_Real_gfx11_gfx12<0x00d, "ds_store_b32">;
1268*0fca6ea1SDimitry Andricdefm DS_WRITE2_B32          : DS_Real_gfx11_gfx12<0x00e, "ds_store_2addr_b32">;
1269*0fca6ea1SDimitry Andricdefm DS_WRITE2ST64_B32      : DS_Real_gfx11_gfx12<0x00f, "ds_store_2addr_stride64_b32">;
1270*0fca6ea1SDimitry Andricdefm DS_WRITE_B8            : DS_Real_gfx11_gfx12<0x01e, "ds_store_b8">;
1271*0fca6ea1SDimitry Andricdefm DS_WRITE_B16           : DS_Real_gfx11_gfx12<0x01f, "ds_store_b16">;
1272*0fca6ea1SDimitry Andricdefm DS_WRXCHG_RTN_B32      : DS_Real_gfx11_gfx12<0x02d, "ds_storexchg_rtn_b32">;
1273*0fca6ea1SDimitry Andricdefm DS_WRXCHG2_RTN_B32     : DS_Real_gfx11_gfx12<0x02e, "ds_storexchg_2addr_rtn_b32">;
1274*0fca6ea1SDimitry Andricdefm DS_WRXCHG2ST64_RTN_B32 : DS_Real_gfx11_gfx12<0x02f, "ds_storexchg_2addr_stride64_rtn_b32">;
1275*0fca6ea1SDimitry Andricdefm DS_READ_B32            : DS_Real_gfx11_gfx12<0x036, "ds_load_b32">;
1276*0fca6ea1SDimitry Andricdefm DS_READ2_B32           : DS_Real_gfx11_gfx12<0x037, "ds_load_2addr_b32">;
1277*0fca6ea1SDimitry Andricdefm DS_READ2ST64_B32       : DS_Real_gfx11_gfx12<0x038, "ds_load_2addr_stride64_b32">;
1278*0fca6ea1SDimitry Andricdefm DS_READ_I8             : DS_Real_gfx11_gfx12<0x039, "ds_load_i8">;
1279*0fca6ea1SDimitry Andricdefm DS_READ_U8             : DS_Real_gfx11_gfx12<0x03a, "ds_load_u8">;
1280*0fca6ea1SDimitry Andricdefm DS_READ_I16            : DS_Real_gfx11_gfx12<0x03b, "ds_load_i16">;
1281*0fca6ea1SDimitry Andricdefm DS_READ_U16            : DS_Real_gfx11_gfx12<0x03c, "ds_load_u16">;
1282*0fca6ea1SDimitry Andricdefm DS_WRITE_B64           : DS_Real_gfx11_gfx12<0x04d, "ds_store_b64">;
1283*0fca6ea1SDimitry Andricdefm DS_WRITE2_B64          : DS_Real_gfx11_gfx12<0x04e, "ds_store_2addr_b64">;
1284*0fca6ea1SDimitry Andricdefm DS_WRITE2ST64_B64      : DS_Real_gfx11_gfx12<0x04f, "ds_store_2addr_stride64_b64">;
1285*0fca6ea1SDimitry Andricdefm DS_WRXCHG_RTN_B64      : DS_Real_gfx11_gfx12<0x06d, "ds_storexchg_rtn_b64">;
1286*0fca6ea1SDimitry Andricdefm DS_WRXCHG2_RTN_B64     : DS_Real_gfx11_gfx12<0x06e, "ds_storexchg_2addr_rtn_b64">;
1287*0fca6ea1SDimitry Andricdefm DS_WRXCHG2ST64_RTN_B64 : DS_Real_gfx11_gfx12<0x06f, "ds_storexchg_2addr_stride64_rtn_b64">;
1288*0fca6ea1SDimitry Andricdefm DS_READ_B64            : DS_Real_gfx11_gfx12<0x076, "ds_load_b64">;
1289*0fca6ea1SDimitry Andricdefm DS_READ2_B64           : DS_Real_gfx11_gfx12<0x077, "ds_load_2addr_b64">;
1290*0fca6ea1SDimitry Andricdefm DS_READ2ST64_B64       : DS_Real_gfx11_gfx12<0x078, "ds_load_2addr_stride64_b64">;
1291*0fca6ea1SDimitry Andricdefm DS_WRITE_B8_D16_HI     : DS_Real_gfx11_gfx12<0x0a0, "ds_store_b8_d16_hi">;
1292*0fca6ea1SDimitry Andricdefm DS_WRITE_B16_D16_HI    : DS_Real_gfx11_gfx12<0x0a1, "ds_store_b16_d16_hi">;
1293*0fca6ea1SDimitry Andricdefm DS_READ_U8_D16         : DS_Real_gfx11_gfx12<0x0a2, "ds_load_u8_d16">;
1294*0fca6ea1SDimitry Andricdefm DS_READ_U8_D16_HI      : DS_Real_gfx11_gfx12<0x0a3, "ds_load_u8_d16_hi">;
1295*0fca6ea1SDimitry Andricdefm DS_READ_I8_D16         : DS_Real_gfx11_gfx12<0x0a4, "ds_load_i8_d16">;
1296*0fca6ea1SDimitry Andricdefm DS_READ_I8_D16_HI      : DS_Real_gfx11_gfx12<0x0a5, "ds_load_i8_d16_hi">;
1297*0fca6ea1SDimitry Andricdefm DS_READ_U16_D16        : DS_Real_gfx11_gfx12<0x0a6, "ds_load_u16_d16">;
1298*0fca6ea1SDimitry Andricdefm DS_READ_U16_D16_HI     : DS_Real_gfx11_gfx12<0x0a7, "ds_load_u16_d16_hi">;
1299*0fca6ea1SDimitry Andricdefm DS_WRITE_ADDTID_B32    : DS_Real_gfx11_gfx12<0x0b0, "ds_store_addtid_b32">;
1300*0fca6ea1SDimitry Andricdefm DS_READ_ADDTID_B32     : DS_Real_gfx11_gfx12<0x0b1, "ds_load_addtid_b32">;
1301*0fca6ea1SDimitry Andricdefm DS_WRITE_B96           : DS_Real_gfx11_gfx12<0x0de, "ds_store_b96">;
1302*0fca6ea1SDimitry Andricdefm DS_WRITE_B128          : DS_Real_gfx11_gfx12<0x0df, "ds_store_b128">;
1303*0fca6ea1SDimitry Andricdefm DS_READ_B96            : DS_Real_gfx11_gfx12<0x0fe, "ds_load_b96">;
1304*0fca6ea1SDimitry Andricdefm DS_READ_B128           : DS_Real_gfx11_gfx12<0x0ff, "ds_load_b128">;
130581ad6265SDimitry Andric
130681ad6265SDimitry Andric// DS_CMPST_* are renamed to DS_CMPSTORE_* in GFX11, but also the data operands (src and cmp) are swapped
130781ad6265SDimitry Andric// comparing to pre-GFX11.
130881ad6265SDimitry Andric// Note: the mnemonic alias is not generated to avoid a potential ambiguity due to the semantics change.
130981ad6265SDimitry Andric
13105f757f3fSDimitry Andricdefm DS_CMPSTORE_B32                     : DS_Real_gfx11_gfx12<0x010>;
131181ad6265SDimitry Andricdefm DS_CMPSTORE_F32                     : DS_Real_gfx11<0x011>;
13125f757f3fSDimitry Andricdefm DS_CMPSTORE_RTN_B32                 : DS_Real_gfx11_gfx12<0x030>;
131381ad6265SDimitry Andricdefm DS_CMPSTORE_RTN_F32                 : DS_Real_gfx11<0x031>;
13145f757f3fSDimitry Andricdefm DS_CMPSTORE_B64                     : DS_Real_gfx11_gfx12<0x050>;
131581ad6265SDimitry Andricdefm DS_CMPSTORE_F64                     : DS_Real_gfx11<0x051>;
13165f757f3fSDimitry Andricdefm DS_CMPSTORE_RTN_B64                 : DS_Real_gfx11_gfx12<0x070>;
131781ad6265SDimitry Andricdefm DS_CMPSTORE_RTN_F64                 : DS_Real_gfx11<0x071>;
131881ad6265SDimitry Andric
13195f757f3fSDimitry Andricdefm DS_ADD_RTN_F32                      : DS_Real_gfx11_gfx12<0x079>;
132081ad6265SDimitry Andricdefm DS_ADD_GS_REG_RTN                   : DS_Real_gfx11<0x07a>;
132181ad6265SDimitry Andricdefm DS_SUB_GS_REG_RTN                   : DS_Real_gfx11<0x07b>;
1322bdd1243dSDimitry Andricdefm DS_BVH_STACK_RTN_B32                : DS_Real_gfx11<0x0ad>;
132381ad6265SDimitry Andric
132481ad6265SDimitry Andric//===----------------------------------------------------------------------===//
13250b57cec5SDimitry Andric// GFX10.
13260b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
13270b57cec5SDimitry Andric
132881ad6265SDimitry Andriclet AssemblerPredicate = isGFX10Only, DecoderNamespace = "GFX10" in {
13290b57cec5SDimitry Andric  multiclass DS_Real_gfx10<bits<8> op>  {
13305f757f3fSDimitry Andric    def _gfx10 : Base_DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<op,
13315f757f3fSDimitry Andric      !cast<DS_Pseudo>(NAME), SIEncodingFamily.GFX10>;
13320b57cec5SDimitry Andric  }
133381ad6265SDimitry Andric} // End AssemblerPredicate = isGFX10Only, DecoderNamespace = "GFX10"
13340b57cec5SDimitry Andric
13350b57cec5SDimitry Andricdefm DS_ADD_RTN_F32      : DS_Real_gfx10<0x055>;
13360b57cec5SDimitry Andricdefm DS_WRITE_B8_D16_HI  : DS_Real_gfx10<0x0a0>;
13370b57cec5SDimitry Andricdefm DS_WRITE_B16_D16_HI : DS_Real_gfx10<0x0a1>;
13380b57cec5SDimitry Andricdefm DS_READ_U8_D16      : DS_Real_gfx10<0x0a2>;
13390b57cec5SDimitry Andricdefm DS_READ_U8_D16_HI   : DS_Real_gfx10<0x0a3>;
13400b57cec5SDimitry Andricdefm DS_READ_I8_D16      : DS_Real_gfx10<0x0a4>;
13410b57cec5SDimitry Andricdefm DS_READ_I8_D16_HI   : DS_Real_gfx10<0x0a5>;
13420b57cec5SDimitry Andricdefm DS_READ_U16_D16     : DS_Real_gfx10<0x0a6>;
13430b57cec5SDimitry Andricdefm DS_READ_U16_D16_HI  : DS_Real_gfx10<0x0a7>;
13440b57cec5SDimitry Andricdefm DS_WRITE_ADDTID_B32 : DS_Real_gfx10<0x0b0>;
13450b57cec5SDimitry Andricdefm DS_READ_ADDTID_B32  : DS_Real_gfx10<0x0b1>;
13460b57cec5SDimitry Andric
13470b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
13485f757f3fSDimitry Andric// GFX10, GFX11, GFX12.
134981ad6265SDimitry Andric//===----------------------------------------------------------------------===//
135081ad6265SDimitry Andric
13515f757f3fSDimitry Andricmulticlass DS_Real_gfx10_gfx11_gfx12<bits<8> op> :
13525f757f3fSDimitry Andric  DS_Real_gfx10<op>, DS_Real_gfx11<op>, DS_Real_gfx12<op>;
13535f757f3fSDimitry Andric
135481ad6265SDimitry Andricmulticlass DS_Real_gfx10_gfx11<bits<8> op> :
135581ad6265SDimitry Andric  DS_Real_gfx10<op>, DS_Real_gfx11<op>;
135681ad6265SDimitry Andric
13575f757f3fSDimitry Andricdefm DS_ADD_F32          : DS_Real_gfx10_gfx11_gfx12<0x015>;
135881ad6265SDimitry Andricdefm DS_ADD_SRC2_F32     : DS_Real_gfx10<0x095>;
13595f757f3fSDimitry Andricdefm DS_PERMUTE_B32      : DS_Real_gfx10_gfx11_gfx12<0x0b2>;
13605f757f3fSDimitry Andricdefm DS_BPERMUTE_B32     : DS_Real_gfx10_gfx11_gfx12<0x0b3>;
136181ad6265SDimitry Andric
136281ad6265SDimitry Andric//===----------------------------------------------------------------------===//
13635f757f3fSDimitry Andric// GFX7, GFX10, GFX11, GFX12.
13640b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
13650b57cec5SDimitry Andric
13660b57cec5SDimitry Andriclet AssemblerPredicate = isGFX7Only, DecoderNamespace = "GFX7" in {
13670b57cec5SDimitry Andric  multiclass DS_Real_gfx7<bits<8> op> {
13685f757f3fSDimitry Andric    def _gfx7 : Base_DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<op,
13695f757f3fSDimitry Andric      !cast<DS_Pseudo>(NAME), SIEncodingFamily.SI>;
13700b57cec5SDimitry Andric  }
13710b57cec5SDimitry Andric} // End AssemblerPredicate = isGFX7Only, DecoderNamespace = "GFX7"
13720b57cec5SDimitry Andric
13735f757f3fSDimitry Andricmulticlass DS_Real_gfx7_gfx10_gfx11_gfx12<bits<8> op> :
13745f757f3fSDimitry Andric  DS_Real_gfx7<op>, DS_Real_gfx10_gfx11_gfx12<op>;
13755f757f3fSDimitry Andric
137681ad6265SDimitry Andricmulticlass DS_Real_gfx7_gfx10_gfx11<bits<8> op> :
137781ad6265SDimitry Andric  DS_Real_gfx7<op>, DS_Real_gfx10_gfx11<op>;
137881ad6265SDimitry Andric
13790b57cec5SDimitry Andricmulticlass DS_Real_gfx7_gfx10<bits<8> op> :
13800b57cec5SDimitry Andric  DS_Real_gfx7<op>, DS_Real_gfx10<op>;
13810b57cec5SDimitry Andric
13820b57cec5SDimitry Andric// FIXME-GFX7: Add tests when upstreaming this part.
138381ad6265SDimitry Andricdefm DS_GWS_SEMA_RELEASE_ALL : DS_Real_gfx7_gfx10_gfx11<0x018>;
138481ad6265SDimitry Andricdefm DS_WRAP_RTN_B32         : DS_Real_gfx7_gfx10_gfx11<0x034>;
13855f757f3fSDimitry Andricdefm DS_CONDXCHG32_RTN_B64   : DS_Real_gfx7_gfx10_gfx11_gfx12<0x07e>;
13860b57cec5SDimitry Andricdefm DS_WRITE_B96            : DS_Real_gfx7_gfx10<0x0de>;
13870b57cec5SDimitry Andricdefm DS_WRITE_B128           : DS_Real_gfx7_gfx10<0x0df>;
13880b57cec5SDimitry Andricdefm DS_READ_B96             : DS_Real_gfx7_gfx10<0x0fe>;
13890b57cec5SDimitry Andricdefm DS_READ_B128            : DS_Real_gfx7_gfx10<0x0ff>;
13900b57cec5SDimitry Andric
13910b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
139281ad6265SDimitry Andric// GFX6, GFX7, GFX10, GFX11.
13930b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
13940b57cec5SDimitry Andric
13950b57cec5SDimitry Andriclet AssemblerPredicate = isGFX6GFX7, DecoderNamespace = "GFX6GFX7" in {
13960b57cec5SDimitry Andric  multiclass DS_Real_gfx6_gfx7<bits<8> op> {
13975f757f3fSDimitry Andric    def _gfx6_gfx7 : Base_DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<op,
13985f757f3fSDimitry Andric      !cast<DS_Pseudo>(NAME), SIEncodingFamily.SI>;
13990b57cec5SDimitry Andric  }
14000b57cec5SDimitry Andric} // End AssemblerPredicate = isGFX6GFX7, DecoderNamespace = "GFX6GFX7"
14010b57cec5SDimitry Andric
14025f757f3fSDimitry Andricmulticlass DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<bits<8> op> :
14035f757f3fSDimitry Andric  DS_Real_gfx6_gfx7<op>, DS_Real_gfx10_gfx11_gfx12<op>;
14045f757f3fSDimitry Andric
140581ad6265SDimitry Andricmulticlass DS_Real_gfx6_gfx7_gfx10_gfx11<bits<8> op> :
140681ad6265SDimitry Andric  DS_Real_gfx6_gfx7<op>, DS_Real_gfx10_gfx11<op>;
140781ad6265SDimitry Andric
14080b57cec5SDimitry Andricmulticlass DS_Real_gfx6_gfx7_gfx10<bits<8> op> :
14090b57cec5SDimitry Andric  DS_Real_gfx6_gfx7<op>, DS_Real_gfx10<op>;
14100b57cec5SDimitry Andric
14115f757f3fSDimitry Andricdefm DS_ADD_U32             : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x000>;
14125f757f3fSDimitry Andricdefm DS_SUB_U32             : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x001>;
14135f757f3fSDimitry Andricdefm DS_RSUB_U32            : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x002>;
14145f757f3fSDimitry Andricdefm DS_INC_U32             : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x003>;
14155f757f3fSDimitry Andricdefm DS_DEC_U32             : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x004>;
14165f757f3fSDimitry Andricdefm DS_MIN_I32             : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x005>;
14175f757f3fSDimitry Andricdefm DS_MAX_I32             : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x006>;
14185f757f3fSDimitry Andricdefm DS_MIN_U32             : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x007>;
14195f757f3fSDimitry Andricdefm DS_MAX_U32             : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x008>;
14205f757f3fSDimitry Andricdefm DS_AND_B32             : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x009>;
14215f757f3fSDimitry Andricdefm DS_OR_B32              : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x00a>;
14225f757f3fSDimitry Andricdefm DS_XOR_B32             : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x00b>;
14235f757f3fSDimitry Andricdefm DS_MSKOR_B32           : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x00c>;
142481ad6265SDimitry Andric
14250b57cec5SDimitry Andricdefm DS_WRITE_B32           : DS_Real_gfx6_gfx7_gfx10<0x00d>;
14260b57cec5SDimitry Andricdefm DS_WRITE2_B32          : DS_Real_gfx6_gfx7_gfx10<0x00e>;
14270b57cec5SDimitry Andricdefm DS_WRITE2ST64_B32      : DS_Real_gfx6_gfx7_gfx10<0x00f>;
14280b57cec5SDimitry Andricdefm DS_CMPST_B32           : DS_Real_gfx6_gfx7_gfx10<0x010>;
14290b57cec5SDimitry Andricdefm DS_CMPST_F32           : DS_Real_gfx6_gfx7_gfx10<0x011>;
143081ad6265SDimitry Andric
143181ad6265SDimitry Andricdefm DS_MIN_F32             : DS_Real_gfx6_gfx7_gfx10_gfx11<0x012>;
143281ad6265SDimitry Andricdefm DS_MAX_F32             : DS_Real_gfx6_gfx7_gfx10_gfx11<0x013>;
14335f757f3fSDimitry Andricdefm DS_NOP                 : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x014>;
143481ad6265SDimitry Andricdefm DS_GWS_INIT            : DS_Real_gfx6_gfx7_gfx10_gfx11<0x019>;
143581ad6265SDimitry Andricdefm DS_GWS_SEMA_V          : DS_Real_gfx6_gfx7_gfx10_gfx11<0x01a>;
143681ad6265SDimitry Andricdefm DS_GWS_SEMA_BR         : DS_Real_gfx6_gfx7_gfx10_gfx11<0x01b>;
143781ad6265SDimitry Andricdefm DS_GWS_SEMA_P          : DS_Real_gfx6_gfx7_gfx10_gfx11<0x01c>;
143881ad6265SDimitry Andricdefm DS_GWS_BARRIER         : DS_Real_gfx6_gfx7_gfx10_gfx11<0x01d>;
143981ad6265SDimitry Andric
14400b57cec5SDimitry Andricdefm DS_WRITE_B8            : DS_Real_gfx6_gfx7_gfx10<0x01e>;
14410b57cec5SDimitry Andricdefm DS_WRITE_B16           : DS_Real_gfx6_gfx7_gfx10<0x01f>;
144281ad6265SDimitry Andric
14435f757f3fSDimitry Andricdefm DS_ADD_RTN_U32         : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x020>;
14445f757f3fSDimitry Andricdefm DS_SUB_RTN_U32         : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x021>;
14455f757f3fSDimitry Andricdefm DS_RSUB_RTN_U32        : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x022>;
14465f757f3fSDimitry Andricdefm DS_INC_RTN_U32         : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x023>;
14475f757f3fSDimitry Andricdefm DS_DEC_RTN_U32         : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x024>;
14485f757f3fSDimitry Andricdefm DS_MIN_RTN_I32         : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x025>;
14495f757f3fSDimitry Andricdefm DS_MAX_RTN_I32         : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x026>;
14505f757f3fSDimitry Andricdefm DS_MIN_RTN_U32         : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x027>;
14515f757f3fSDimitry Andricdefm DS_MAX_RTN_U32         : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x028>;
14525f757f3fSDimitry Andricdefm DS_AND_RTN_B32         : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x029>;
14535f757f3fSDimitry Andricdefm DS_OR_RTN_B32          : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x02a>;
14545f757f3fSDimitry Andricdefm DS_XOR_RTN_B32         : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x02b>;
14555f757f3fSDimitry Andricdefm DS_MSKOR_RTN_B32       : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x02c>;
145681ad6265SDimitry Andric
14570b57cec5SDimitry Andricdefm DS_WRXCHG_RTN_B32      : DS_Real_gfx6_gfx7_gfx10<0x02d>;
14580b57cec5SDimitry Andricdefm DS_WRXCHG2_RTN_B32     : DS_Real_gfx6_gfx7_gfx10<0x02e>;
14590b57cec5SDimitry Andricdefm DS_WRXCHG2ST64_RTN_B32 : DS_Real_gfx6_gfx7_gfx10<0x02f>;
14600b57cec5SDimitry Andricdefm DS_CMPST_RTN_B32       : DS_Real_gfx6_gfx7_gfx10<0x030>;
14610b57cec5SDimitry Andricdefm DS_CMPST_RTN_F32       : DS_Real_gfx6_gfx7_gfx10<0x031>;
146281ad6265SDimitry Andric
146381ad6265SDimitry Andricdefm DS_MIN_RTN_F32         : DS_Real_gfx6_gfx7_gfx10_gfx11<0x032>;
146481ad6265SDimitry Andricdefm DS_MAX_RTN_F32         : DS_Real_gfx6_gfx7_gfx10_gfx11<0x033>;
14655f757f3fSDimitry Andricdefm DS_SWIZZLE_B32         : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x035>;
146681ad6265SDimitry Andric
14670b57cec5SDimitry Andricdefm DS_READ_B32            : DS_Real_gfx6_gfx7_gfx10<0x036>;
14680b57cec5SDimitry Andricdefm DS_READ2_B32           : DS_Real_gfx6_gfx7_gfx10<0x037>;
14690b57cec5SDimitry Andricdefm DS_READ2ST64_B32       : DS_Real_gfx6_gfx7_gfx10<0x038>;
14700b57cec5SDimitry Andricdefm DS_READ_I8             : DS_Real_gfx6_gfx7_gfx10<0x039>;
14710b57cec5SDimitry Andricdefm DS_READ_U8             : DS_Real_gfx6_gfx7_gfx10<0x03a>;
14720b57cec5SDimitry Andricdefm DS_READ_I16            : DS_Real_gfx6_gfx7_gfx10<0x03b>;
14730b57cec5SDimitry Andricdefm DS_READ_U16            : DS_Real_gfx6_gfx7_gfx10<0x03c>;
147481ad6265SDimitry Andric
14755f757f3fSDimitry Andricdefm DS_CONSUME             : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x03d>;
14765f757f3fSDimitry Andricdefm DS_APPEND              : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x03e>;
147781ad6265SDimitry Andricdefm DS_ORDERED_COUNT       : DS_Real_gfx6_gfx7_gfx10_gfx11<0x03f>;
14785f757f3fSDimitry Andricdefm DS_ADD_U64             : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x040>;
14795f757f3fSDimitry Andricdefm DS_SUB_U64             : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x041>;
14805f757f3fSDimitry Andricdefm DS_RSUB_U64            : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x042>;
14815f757f3fSDimitry Andricdefm DS_INC_U64             : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x043>;
14825f757f3fSDimitry Andricdefm DS_DEC_U64             : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x044>;
14835f757f3fSDimitry Andricdefm DS_MIN_I64             : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x045>;
14845f757f3fSDimitry Andricdefm DS_MAX_I64             : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x046>;
14855f757f3fSDimitry Andricdefm DS_MIN_U64             : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x047>;
14865f757f3fSDimitry Andricdefm DS_MAX_U64             : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x048>;
14875f757f3fSDimitry Andricdefm DS_AND_B64             : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x049>;
14885f757f3fSDimitry Andricdefm DS_OR_B64              : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x04a>;
14895f757f3fSDimitry Andricdefm DS_XOR_B64             : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x04b>;
14905f757f3fSDimitry Andricdefm DS_MSKOR_B64           : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x04c>;
149181ad6265SDimitry Andric
14920b57cec5SDimitry Andricdefm DS_WRITE_B64           : DS_Real_gfx6_gfx7_gfx10<0x04d>;
14930b57cec5SDimitry Andricdefm DS_WRITE2_B64          : DS_Real_gfx6_gfx7_gfx10<0x04e>;
14940b57cec5SDimitry Andricdefm DS_WRITE2ST64_B64      : DS_Real_gfx6_gfx7_gfx10<0x04f>;
14950b57cec5SDimitry Andricdefm DS_CMPST_B64           : DS_Real_gfx6_gfx7_gfx10<0x050>;
14960b57cec5SDimitry Andricdefm DS_CMPST_F64           : DS_Real_gfx6_gfx7_gfx10<0x051>;
149781ad6265SDimitry Andric
149881ad6265SDimitry Andricdefm DS_MIN_F64             : DS_Real_gfx6_gfx7_gfx10_gfx11<0x052>;
149981ad6265SDimitry Andricdefm DS_MAX_F64             : DS_Real_gfx6_gfx7_gfx10_gfx11<0x053>;
15005f757f3fSDimitry Andricdefm DS_ADD_RTN_U64         : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x060>;
15015f757f3fSDimitry Andricdefm DS_SUB_RTN_U64         : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x061>;
15025f757f3fSDimitry Andricdefm DS_RSUB_RTN_U64        : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x062>;
15035f757f3fSDimitry Andricdefm DS_INC_RTN_U64         : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x063>;
15045f757f3fSDimitry Andricdefm DS_DEC_RTN_U64         : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x064>;
15055f757f3fSDimitry Andricdefm DS_MIN_RTN_I64         : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x065>;
15065f757f3fSDimitry Andricdefm DS_MAX_RTN_I64         : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x066>;
15075f757f3fSDimitry Andricdefm DS_MIN_RTN_U64         : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x067>;
15085f757f3fSDimitry Andricdefm DS_MAX_RTN_U64         : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x068>;
15095f757f3fSDimitry Andricdefm DS_AND_RTN_B64         : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x069>;
15105f757f3fSDimitry Andricdefm DS_OR_RTN_B64          : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x06a>;
15115f757f3fSDimitry Andricdefm DS_XOR_RTN_B64         : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x06b>;
15125f757f3fSDimitry Andricdefm DS_MSKOR_RTN_B64       : DS_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x06c>;
151381ad6265SDimitry Andric
15140b57cec5SDimitry Andricdefm DS_WRXCHG_RTN_B64      : DS_Real_gfx6_gfx7_gfx10<0x06d>;
15150b57cec5SDimitry Andricdefm DS_WRXCHG2_RTN_B64     : DS_Real_gfx6_gfx7_gfx10<0x06e>;
15160b57cec5SDimitry Andricdefm DS_WRXCHG2ST64_RTN_B64 : DS_Real_gfx6_gfx7_gfx10<0x06f>;
15170b57cec5SDimitry Andricdefm DS_CMPST_RTN_B64       : DS_Real_gfx6_gfx7_gfx10<0x070>;
15180b57cec5SDimitry Andricdefm DS_CMPST_RTN_F64       : DS_Real_gfx6_gfx7_gfx10<0x071>;
151981ad6265SDimitry Andric
152081ad6265SDimitry Andricdefm DS_MIN_RTN_F64         : DS_Real_gfx6_gfx7_gfx10_gfx11<0x072>;
152181ad6265SDimitry Andricdefm DS_MAX_RTN_F64         : DS_Real_gfx6_gfx7_gfx10_gfx11<0x073>;
152281ad6265SDimitry Andric
15230b57cec5SDimitry Andricdefm DS_READ_B64            : DS_Real_gfx6_gfx7_gfx10<0x076>;
15240b57cec5SDimitry Andricdefm DS_READ2_B64           : DS_Real_gfx6_gfx7_gfx10<0x077>;
15250b57cec5SDimitry Andricdefm DS_READ2ST64_B64       : DS_Real_gfx6_gfx7_gfx10<0x078>;
15260b57cec5SDimitry Andricdefm DS_ADD_SRC2_U32        : DS_Real_gfx6_gfx7_gfx10<0x080>;
15270b57cec5SDimitry Andricdefm DS_SUB_SRC2_U32        : DS_Real_gfx6_gfx7_gfx10<0x081>;
15280b57cec5SDimitry Andricdefm DS_RSUB_SRC2_U32       : DS_Real_gfx6_gfx7_gfx10<0x082>;
15290b57cec5SDimitry Andricdefm DS_INC_SRC2_U32        : DS_Real_gfx6_gfx7_gfx10<0x083>;
15300b57cec5SDimitry Andricdefm DS_DEC_SRC2_U32        : DS_Real_gfx6_gfx7_gfx10<0x084>;
15310b57cec5SDimitry Andricdefm DS_MIN_SRC2_I32        : DS_Real_gfx6_gfx7_gfx10<0x085>;
15320b57cec5SDimitry Andricdefm DS_MAX_SRC2_I32        : DS_Real_gfx6_gfx7_gfx10<0x086>;
15330b57cec5SDimitry Andricdefm DS_MIN_SRC2_U32        : DS_Real_gfx6_gfx7_gfx10<0x087>;
15340b57cec5SDimitry Andricdefm DS_MAX_SRC2_U32        : DS_Real_gfx6_gfx7_gfx10<0x088>;
15350b57cec5SDimitry Andricdefm DS_AND_SRC2_B32        : DS_Real_gfx6_gfx7_gfx10<0x089>;
15360b57cec5SDimitry Andricdefm DS_OR_SRC2_B32         : DS_Real_gfx6_gfx7_gfx10<0x08a>;
15370b57cec5SDimitry Andricdefm DS_XOR_SRC2_B32        : DS_Real_gfx6_gfx7_gfx10<0x08b>;
15380b57cec5SDimitry Andricdefm DS_WRITE_SRC2_B32      : DS_Real_gfx6_gfx7_gfx10<0x08d>;
15390b57cec5SDimitry Andricdefm DS_MIN_SRC2_F32        : DS_Real_gfx6_gfx7_gfx10<0x092>;
15400b57cec5SDimitry Andricdefm DS_MAX_SRC2_F32        : DS_Real_gfx6_gfx7_gfx10<0x093>;
15410b57cec5SDimitry Andricdefm DS_ADD_SRC2_U64        : DS_Real_gfx6_gfx7_gfx10<0x0c0>;
15420b57cec5SDimitry Andricdefm DS_SUB_SRC2_U64        : DS_Real_gfx6_gfx7_gfx10<0x0c1>;
15430b57cec5SDimitry Andricdefm DS_RSUB_SRC2_U64       : DS_Real_gfx6_gfx7_gfx10<0x0c2>;
15440b57cec5SDimitry Andricdefm DS_INC_SRC2_U64        : DS_Real_gfx6_gfx7_gfx10<0x0c3>;
15450b57cec5SDimitry Andricdefm DS_DEC_SRC2_U64        : DS_Real_gfx6_gfx7_gfx10<0x0c4>;
15460b57cec5SDimitry Andricdefm DS_MIN_SRC2_I64        : DS_Real_gfx6_gfx7_gfx10<0x0c5>;
15470b57cec5SDimitry Andricdefm DS_MAX_SRC2_I64        : DS_Real_gfx6_gfx7_gfx10<0x0c6>;
15480b57cec5SDimitry Andricdefm DS_MIN_SRC2_U64        : DS_Real_gfx6_gfx7_gfx10<0x0c7>;
15490b57cec5SDimitry Andricdefm DS_MAX_SRC2_U64        : DS_Real_gfx6_gfx7_gfx10<0x0c8>;
15500b57cec5SDimitry Andricdefm DS_AND_SRC2_B64        : DS_Real_gfx6_gfx7_gfx10<0x0c9>;
15510b57cec5SDimitry Andricdefm DS_OR_SRC2_B64         : DS_Real_gfx6_gfx7_gfx10<0x0ca>;
15520b57cec5SDimitry Andricdefm DS_XOR_SRC2_B64        : DS_Real_gfx6_gfx7_gfx10<0x0cb>;
15530b57cec5SDimitry Andricdefm DS_WRITE_SRC2_B64      : DS_Real_gfx6_gfx7_gfx10<0x0cd>;
15540b57cec5SDimitry Andricdefm DS_MIN_SRC2_F64        : DS_Real_gfx6_gfx7_gfx10<0x0d2>;
15550b57cec5SDimitry Andricdefm DS_MAX_SRC2_F64        : DS_Real_gfx6_gfx7_gfx10<0x0d3>;
15560b57cec5SDimitry Andric
15570b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
15580b57cec5SDimitry Andric// GFX8, GFX9 (VI).
15590b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
15600b57cec5SDimitry Andric
1561fe6060f1SDimitry Andricclass DS_Real_vi <bits<8> op, DS_Pseudo ps> :
1562fe6060f1SDimitry Andric  DS_Real <ps>,
1563*0fca6ea1SDimitry Andric  SIMCInstr <ps.PseudoInstr, SIEncodingFamily.VI> {
1564480093f4SDimitry Andric  let AssemblerPredicate = isGFX8GFX9;
15650b57cec5SDimitry Andric  let DecoderNamespace = "GFX8";
15660b57cec5SDimitry Andric
15670b57cec5SDimitry Andric  // encoding
1568fe6060f1SDimitry Andric  let Inst{7-0}   = !if(ps.has_offset0, offset0, 0);
1569fe6060f1SDimitry Andric  let Inst{15-8}  = !if(ps.has_offset1, offset1, 0);
1570fe6060f1SDimitry Andric  let Inst{16}    = !if(ps.has_gds, gds, ps.gdsValue);
15710b57cec5SDimitry Andric  let Inst{24-17} = op;
1572fe6060f1SDimitry Andric  let Inst{25}    = acc;
15730b57cec5SDimitry Andric  let Inst{31-26} = 0x36; // ds prefix
1574fe6060f1SDimitry Andric  let Inst{39-32} = !if(ps.has_addr, addr, !if(ps.has_gws_data0, data0{7-0}, 0));
1575fe6060f1SDimitry Andric  let Inst{47-40} = !if(ps.has_data0, data0{7-0}, 0);
1576fe6060f1SDimitry Andric  let Inst{55-48} = !if(ps.has_data1, data1{7-0}, 0);
1577fe6060f1SDimitry Andric  let Inst{63-56} = !if(ps.has_vdst, vdst{7-0}, 0);
15780b57cec5SDimitry Andric}
15790b57cec5SDimitry Andric
15800b57cec5SDimitry Andricdef DS_ADD_U32_vi         : DS_Real_vi<0x0,  DS_ADD_U32>;
15810b57cec5SDimitry Andricdef DS_SUB_U32_vi         : DS_Real_vi<0x1,  DS_SUB_U32>;
15820b57cec5SDimitry Andricdef DS_RSUB_U32_vi        : DS_Real_vi<0x2,  DS_RSUB_U32>;
15830b57cec5SDimitry Andricdef DS_INC_U32_vi         : DS_Real_vi<0x3,  DS_INC_U32>;
15840b57cec5SDimitry Andricdef DS_DEC_U32_vi         : DS_Real_vi<0x4,  DS_DEC_U32>;
15850b57cec5SDimitry Andricdef DS_MIN_I32_vi         : DS_Real_vi<0x5,  DS_MIN_I32>;
15860b57cec5SDimitry Andricdef DS_MAX_I32_vi         : DS_Real_vi<0x6,  DS_MAX_I32>;
15870b57cec5SDimitry Andricdef DS_MIN_U32_vi         : DS_Real_vi<0x7,  DS_MIN_U32>;
15880b57cec5SDimitry Andricdef DS_MAX_U32_vi         : DS_Real_vi<0x8,  DS_MAX_U32>;
15890b57cec5SDimitry Andricdef DS_AND_B32_vi         : DS_Real_vi<0x9,  DS_AND_B32>;
15900b57cec5SDimitry Andricdef DS_OR_B32_vi          : DS_Real_vi<0xa,  DS_OR_B32>;
15910b57cec5SDimitry Andricdef DS_XOR_B32_vi         : DS_Real_vi<0xb,  DS_XOR_B32>;
15920b57cec5SDimitry Andricdef DS_MSKOR_B32_vi       : DS_Real_vi<0xc,  DS_MSKOR_B32>;
15930b57cec5SDimitry Andricdef DS_WRITE_B32_vi       : DS_Real_vi<0xd,  DS_WRITE_B32>;
15940b57cec5SDimitry Andricdef DS_WRITE2_B32_vi      : DS_Real_vi<0xe,  DS_WRITE2_B32>;
15950b57cec5SDimitry Andricdef DS_WRITE2ST64_B32_vi  : DS_Real_vi<0xf,  DS_WRITE2ST64_B32>;
15960b57cec5SDimitry Andricdef DS_CMPST_B32_vi       : DS_Real_vi<0x10, DS_CMPST_B32>;
15970b57cec5SDimitry Andricdef DS_CMPST_F32_vi       : DS_Real_vi<0x11, DS_CMPST_F32>;
15980b57cec5SDimitry Andricdef DS_MIN_F32_vi         : DS_Real_vi<0x12, DS_MIN_F32>;
15990b57cec5SDimitry Andricdef DS_MAX_F32_vi         : DS_Real_vi<0x13, DS_MAX_F32>;
16000b57cec5SDimitry Andricdef DS_NOP_vi             : DS_Real_vi<0x14, DS_NOP>;
16010b57cec5SDimitry Andricdef DS_ADD_F32_vi         : DS_Real_vi<0x15, DS_ADD_F32>;
16020b57cec5SDimitry Andricdef DS_GWS_INIT_vi        : DS_Real_vi<0x99, DS_GWS_INIT>;
16030b57cec5SDimitry Andricdef DS_GWS_SEMA_V_vi      : DS_Real_vi<0x9a, DS_GWS_SEMA_V>;
16040b57cec5SDimitry Andricdef DS_GWS_SEMA_BR_vi     : DS_Real_vi<0x9b, DS_GWS_SEMA_BR>;
16050b57cec5SDimitry Andricdef DS_GWS_SEMA_P_vi      : DS_Real_vi<0x9c, DS_GWS_SEMA_P>;
16060b57cec5SDimitry Andricdef DS_GWS_BARRIER_vi     : DS_Real_vi<0x9d, DS_GWS_BARRIER>;
16070b57cec5SDimitry Andricdef DS_WRITE_ADDTID_B32_vi : DS_Real_vi<0x1d, DS_WRITE_ADDTID_B32>;
16080b57cec5SDimitry Andricdef DS_WRITE_B8_vi        : DS_Real_vi<0x1e, DS_WRITE_B8>;
16090b57cec5SDimitry Andricdef DS_WRITE_B16_vi       : DS_Real_vi<0x1f, DS_WRITE_B16>;
16100b57cec5SDimitry Andricdef DS_ADD_RTN_U32_vi     : DS_Real_vi<0x20, DS_ADD_RTN_U32>;
16110b57cec5SDimitry Andricdef DS_SUB_RTN_U32_vi     : DS_Real_vi<0x21, DS_SUB_RTN_U32>;
16120b57cec5SDimitry Andricdef DS_RSUB_RTN_U32_vi    : DS_Real_vi<0x22, DS_RSUB_RTN_U32>;
16130b57cec5SDimitry Andricdef DS_INC_RTN_U32_vi     : DS_Real_vi<0x23, DS_INC_RTN_U32>;
16140b57cec5SDimitry Andricdef DS_DEC_RTN_U32_vi     : DS_Real_vi<0x24, DS_DEC_RTN_U32>;
16150b57cec5SDimitry Andricdef DS_MIN_RTN_I32_vi     : DS_Real_vi<0x25, DS_MIN_RTN_I32>;
16160b57cec5SDimitry Andricdef DS_MAX_RTN_I32_vi     : DS_Real_vi<0x26, DS_MAX_RTN_I32>;
16170b57cec5SDimitry Andricdef DS_MIN_RTN_U32_vi     : DS_Real_vi<0x27, DS_MIN_RTN_U32>;
16180b57cec5SDimitry Andricdef DS_MAX_RTN_U32_vi     : DS_Real_vi<0x28, DS_MAX_RTN_U32>;
16190b57cec5SDimitry Andricdef DS_AND_RTN_B32_vi     : DS_Real_vi<0x29, DS_AND_RTN_B32>;
16200b57cec5SDimitry Andricdef DS_OR_RTN_B32_vi      : DS_Real_vi<0x2a, DS_OR_RTN_B32>;
16210b57cec5SDimitry Andricdef DS_XOR_RTN_B32_vi     : DS_Real_vi<0x2b, DS_XOR_RTN_B32>;
16220b57cec5SDimitry Andricdef DS_MSKOR_RTN_B32_vi   : DS_Real_vi<0x2c, DS_MSKOR_RTN_B32>;
16230b57cec5SDimitry Andricdef DS_WRXCHG_RTN_B32_vi  : DS_Real_vi<0x2d, DS_WRXCHG_RTN_B32>;
16240b57cec5SDimitry Andricdef DS_WRXCHG2_RTN_B32_vi : DS_Real_vi<0x2e, DS_WRXCHG2_RTN_B32>;
16250b57cec5SDimitry Andricdef DS_WRXCHG2ST64_RTN_B32_vi : DS_Real_vi<0x2f, DS_WRXCHG2ST64_RTN_B32>;
16260b57cec5SDimitry Andricdef DS_CMPST_RTN_B32_vi   : DS_Real_vi<0x30, DS_CMPST_RTN_B32>;
16270b57cec5SDimitry Andricdef DS_CMPST_RTN_F32_vi   : DS_Real_vi<0x31, DS_CMPST_RTN_F32>;
16280b57cec5SDimitry Andricdef DS_MIN_RTN_F32_vi     : DS_Real_vi<0x32, DS_MIN_RTN_F32>;
16290b57cec5SDimitry Andricdef DS_MAX_RTN_F32_vi     : DS_Real_vi<0x33, DS_MAX_RTN_F32>;
16300b57cec5SDimitry Andricdef DS_WRAP_RTN_B32_vi    : DS_Real_vi<0x34, DS_WRAP_RTN_B32>;
16310b57cec5SDimitry Andricdef DS_ADD_RTN_F32_vi     : DS_Real_vi<0x35, DS_ADD_RTN_F32>;
16320b57cec5SDimitry Andricdef DS_READ_B32_vi        : DS_Real_vi<0x36, DS_READ_B32>;
16330b57cec5SDimitry Andricdef DS_READ2_B32_vi       : DS_Real_vi<0x37, DS_READ2_B32>;
16340b57cec5SDimitry Andricdef DS_READ2ST64_B32_vi   : DS_Real_vi<0x38, DS_READ2ST64_B32>;
16350b57cec5SDimitry Andricdef DS_READ_I8_vi         : DS_Real_vi<0x39, DS_READ_I8>;
16360b57cec5SDimitry Andricdef DS_READ_U8_vi         : DS_Real_vi<0x3a, DS_READ_U8>;
16370b57cec5SDimitry Andricdef DS_READ_I16_vi        : DS_Real_vi<0x3b, DS_READ_I16>;
16380b57cec5SDimitry Andricdef DS_READ_U16_vi        : DS_Real_vi<0x3c, DS_READ_U16>;
16390b57cec5SDimitry Andricdef DS_READ_ADDTID_B32_vi : DS_Real_vi<0xb6, DS_READ_ADDTID_B32>;
16400b57cec5SDimitry Andricdef DS_CONSUME_vi         : DS_Real_vi<0xbd, DS_CONSUME>;
16410b57cec5SDimitry Andricdef DS_APPEND_vi          : DS_Real_vi<0xbe, DS_APPEND>;
16420b57cec5SDimitry Andricdef DS_ORDERED_COUNT_vi   : DS_Real_vi<0xbf, DS_ORDERED_COUNT>;
16430b57cec5SDimitry Andricdef DS_SWIZZLE_B32_vi     : DS_Real_vi<0x3d, DS_SWIZZLE_B32>;
16440b57cec5SDimitry Andricdef DS_PERMUTE_B32_vi     : DS_Real_vi<0x3e, DS_PERMUTE_B32>;
16450b57cec5SDimitry Andricdef DS_BPERMUTE_B32_vi    : DS_Real_vi<0x3f, DS_BPERMUTE_B32>;
16460b57cec5SDimitry Andric
16470b57cec5SDimitry Andricdef DS_ADD_U64_vi         : DS_Real_vi<0x40, DS_ADD_U64>;
16480b57cec5SDimitry Andricdef DS_SUB_U64_vi         : DS_Real_vi<0x41, DS_SUB_U64>;
16490b57cec5SDimitry Andricdef DS_RSUB_U64_vi        : DS_Real_vi<0x42, DS_RSUB_U64>;
16500b57cec5SDimitry Andricdef DS_INC_U64_vi         : DS_Real_vi<0x43, DS_INC_U64>;
16510b57cec5SDimitry Andricdef DS_DEC_U64_vi         : DS_Real_vi<0x44, DS_DEC_U64>;
16520b57cec5SDimitry Andricdef DS_MIN_I64_vi         : DS_Real_vi<0x45, DS_MIN_I64>;
16530b57cec5SDimitry Andricdef DS_MAX_I64_vi         : DS_Real_vi<0x46, DS_MAX_I64>;
16540b57cec5SDimitry Andricdef DS_MIN_U64_vi         : DS_Real_vi<0x47, DS_MIN_U64>;
16550b57cec5SDimitry Andricdef DS_MAX_U64_vi         : DS_Real_vi<0x48, DS_MAX_U64>;
16560b57cec5SDimitry Andricdef DS_AND_B64_vi         : DS_Real_vi<0x49, DS_AND_B64>;
16570b57cec5SDimitry Andricdef DS_OR_B64_vi          : DS_Real_vi<0x4a, DS_OR_B64>;
16580b57cec5SDimitry Andricdef DS_XOR_B64_vi         : DS_Real_vi<0x4b, DS_XOR_B64>;
16590b57cec5SDimitry Andricdef DS_MSKOR_B64_vi       : DS_Real_vi<0x4c, DS_MSKOR_B64>;
16600b57cec5SDimitry Andricdef DS_WRITE_B64_vi       : DS_Real_vi<0x4d, DS_WRITE_B64>;
16610b57cec5SDimitry Andricdef DS_WRITE2_B64_vi      : DS_Real_vi<0x4E, DS_WRITE2_B64>;
16620b57cec5SDimitry Andricdef DS_WRITE2ST64_B64_vi  : DS_Real_vi<0x4f, DS_WRITE2ST64_B64>;
16630b57cec5SDimitry Andricdef DS_CMPST_B64_vi       : DS_Real_vi<0x50, DS_CMPST_B64>;
16640b57cec5SDimitry Andricdef DS_CMPST_F64_vi       : DS_Real_vi<0x51, DS_CMPST_F64>;
16650b57cec5SDimitry Andricdef DS_MIN_F64_vi         : DS_Real_vi<0x52, DS_MIN_F64>;
16660b57cec5SDimitry Andricdef DS_MAX_F64_vi         : DS_Real_vi<0x53, DS_MAX_F64>;
16670b57cec5SDimitry Andric
16680b57cec5SDimitry Andricdef DS_WRITE_B8_D16_HI_vi  : DS_Real_vi<0x54, DS_WRITE_B8_D16_HI>;
16690b57cec5SDimitry Andricdef DS_WRITE_B16_D16_HI_vi : DS_Real_vi<0x55, DS_WRITE_B16_D16_HI>;
16700b57cec5SDimitry Andric
16710b57cec5SDimitry Andricdef DS_READ_U8_D16_vi     : DS_Real_vi<0x56, DS_READ_U8_D16>;
16720b57cec5SDimitry Andricdef DS_READ_U8_D16_HI_vi  : DS_Real_vi<0x57, DS_READ_U8_D16_HI>;
16730b57cec5SDimitry Andricdef DS_READ_I8_D16_vi     : DS_Real_vi<0x58, DS_READ_I8_D16>;
16740b57cec5SDimitry Andricdef DS_READ_I8_D16_HI_vi  : DS_Real_vi<0x59, DS_READ_I8_D16_HI>;
16750b57cec5SDimitry Andricdef DS_READ_U16_D16_vi    : DS_Real_vi<0x5a, DS_READ_U16_D16>;
16760b57cec5SDimitry Andricdef DS_READ_U16_D16_HI_vi : DS_Real_vi<0x5b, DS_READ_U16_D16_HI>;
16770b57cec5SDimitry Andric
16780b57cec5SDimitry Andricdef DS_ADD_RTN_U64_vi     : DS_Real_vi<0x60, DS_ADD_RTN_U64>;
16790b57cec5SDimitry Andricdef DS_SUB_RTN_U64_vi     : DS_Real_vi<0x61, DS_SUB_RTN_U64>;
16800b57cec5SDimitry Andricdef DS_RSUB_RTN_U64_vi    : DS_Real_vi<0x62, DS_RSUB_RTN_U64>;
16810b57cec5SDimitry Andricdef DS_INC_RTN_U64_vi     : DS_Real_vi<0x63, DS_INC_RTN_U64>;
16820b57cec5SDimitry Andricdef DS_DEC_RTN_U64_vi     : DS_Real_vi<0x64, DS_DEC_RTN_U64>;
16830b57cec5SDimitry Andricdef DS_MIN_RTN_I64_vi     : DS_Real_vi<0x65, DS_MIN_RTN_I64>;
16840b57cec5SDimitry Andricdef DS_MAX_RTN_I64_vi     : DS_Real_vi<0x66, DS_MAX_RTN_I64>;
16850b57cec5SDimitry Andricdef DS_MIN_RTN_U64_vi     : DS_Real_vi<0x67, DS_MIN_RTN_U64>;
16860b57cec5SDimitry Andricdef DS_MAX_RTN_U64_vi     : DS_Real_vi<0x68, DS_MAX_RTN_U64>;
16870b57cec5SDimitry Andricdef DS_AND_RTN_B64_vi     : DS_Real_vi<0x69, DS_AND_RTN_B64>;
16880b57cec5SDimitry Andricdef DS_OR_RTN_B64_vi      : DS_Real_vi<0x6a, DS_OR_RTN_B64>;
16890b57cec5SDimitry Andricdef DS_XOR_RTN_B64_vi     : DS_Real_vi<0x6b, DS_XOR_RTN_B64>;
16900b57cec5SDimitry Andricdef DS_MSKOR_RTN_B64_vi   : DS_Real_vi<0x6c, DS_MSKOR_RTN_B64>;
16910b57cec5SDimitry Andricdef DS_WRXCHG_RTN_B64_vi  : DS_Real_vi<0x6d, DS_WRXCHG_RTN_B64>;
16920b57cec5SDimitry Andricdef DS_WRXCHG2_RTN_B64_vi : DS_Real_vi<0x6e, DS_WRXCHG2_RTN_B64>;
16930b57cec5SDimitry Andricdef DS_WRXCHG2ST64_RTN_B64_vi : DS_Real_vi<0x6f, DS_WRXCHG2ST64_RTN_B64>;
16940b57cec5SDimitry Andricdef DS_CONDXCHG32_RTN_B64_vi   : DS_Real_vi<0x7e, DS_CONDXCHG32_RTN_B64>;
16950b57cec5SDimitry Andricdef DS_GWS_SEMA_RELEASE_ALL_vi : DS_Real_vi<0x98, DS_GWS_SEMA_RELEASE_ALL>;
16960b57cec5SDimitry Andricdef DS_CMPST_RTN_B64_vi   : DS_Real_vi<0x70, DS_CMPST_RTN_B64>;
16970b57cec5SDimitry Andricdef DS_CMPST_RTN_F64_vi   : DS_Real_vi<0x71, DS_CMPST_RTN_F64>;
16980b57cec5SDimitry Andricdef DS_MIN_RTN_F64_vi     : DS_Real_vi<0x72, DS_MIN_RTN_F64>;
16990b57cec5SDimitry Andricdef DS_MAX_RTN_F64_vi     : DS_Real_vi<0x73, DS_MAX_RTN_F64>;
17000b57cec5SDimitry Andric
17010b57cec5SDimitry Andricdef DS_READ_B64_vi        : DS_Real_vi<0x76, DS_READ_B64>;
17020b57cec5SDimitry Andricdef DS_READ2_B64_vi       : DS_Real_vi<0x77, DS_READ2_B64>;
17030b57cec5SDimitry Andricdef DS_READ2ST64_B64_vi   : DS_Real_vi<0x78, DS_READ2ST64_B64>;
17040b57cec5SDimitry Andric
17050b57cec5SDimitry Andricdef DS_ADD_SRC2_U32_vi    : DS_Real_vi<0x80, DS_ADD_SRC2_U32>;
17060b57cec5SDimitry Andricdef DS_SUB_SRC2_U32_vi    : DS_Real_vi<0x81, DS_SUB_SRC2_U32>;
17070b57cec5SDimitry Andricdef DS_RSUB_SRC2_U32_vi   : DS_Real_vi<0x82, DS_RSUB_SRC2_U32>;
17080b57cec5SDimitry Andricdef DS_INC_SRC2_U32_vi    : DS_Real_vi<0x83, DS_INC_SRC2_U32>;
17090b57cec5SDimitry Andricdef DS_DEC_SRC2_U32_vi    : DS_Real_vi<0x84, DS_DEC_SRC2_U32>;
17100b57cec5SDimitry Andricdef DS_MIN_SRC2_I32_vi    : DS_Real_vi<0x85, DS_MIN_SRC2_I32>;
17110b57cec5SDimitry Andricdef DS_MAX_SRC2_I32_vi    : DS_Real_vi<0x86, DS_MAX_SRC2_I32>;
17120b57cec5SDimitry Andricdef DS_MIN_SRC2_U32_vi    : DS_Real_vi<0x87, DS_MIN_SRC2_U32>;
17130b57cec5SDimitry Andricdef DS_MAX_SRC2_U32_vi    : DS_Real_vi<0x88, DS_MAX_SRC2_U32>;
17140b57cec5SDimitry Andricdef DS_AND_SRC2_B32_vi    : DS_Real_vi<0x89, DS_AND_SRC2_B32>;
17150b57cec5SDimitry Andricdef DS_OR_SRC2_B32_vi     : DS_Real_vi<0x8a, DS_OR_SRC2_B32>;
17160b57cec5SDimitry Andricdef DS_XOR_SRC2_B32_vi    : DS_Real_vi<0x8b, DS_XOR_SRC2_B32>;
17170b57cec5SDimitry Andricdef DS_WRITE_SRC2_B32_vi  : DS_Real_vi<0x8d, DS_WRITE_SRC2_B32>;
17180b57cec5SDimitry Andricdef DS_MIN_SRC2_F32_vi    : DS_Real_vi<0x92, DS_MIN_SRC2_F32>;
17190b57cec5SDimitry Andricdef DS_MAX_SRC2_F32_vi    : DS_Real_vi<0x93, DS_MAX_SRC2_F32>;
17200b57cec5SDimitry Andricdef DS_ADD_SRC2_F32_vi    : DS_Real_vi<0x95, DS_ADD_SRC2_F32>;
17210b57cec5SDimitry Andricdef DS_ADD_SRC2_U64_vi    : DS_Real_vi<0xc0, DS_ADD_SRC2_U64>;
17220b57cec5SDimitry Andricdef DS_SUB_SRC2_U64_vi    : DS_Real_vi<0xc1, DS_SUB_SRC2_U64>;
17230b57cec5SDimitry Andricdef DS_RSUB_SRC2_U64_vi   : DS_Real_vi<0xc2, DS_RSUB_SRC2_U64>;
17240b57cec5SDimitry Andricdef DS_INC_SRC2_U64_vi    : DS_Real_vi<0xc3, DS_INC_SRC2_U64>;
17250b57cec5SDimitry Andricdef DS_DEC_SRC2_U64_vi    : DS_Real_vi<0xc4, DS_DEC_SRC2_U64>;
17260b57cec5SDimitry Andricdef DS_MIN_SRC2_I64_vi    : DS_Real_vi<0xc5, DS_MIN_SRC2_I64>;
17270b57cec5SDimitry Andricdef DS_MAX_SRC2_I64_vi    : DS_Real_vi<0xc6, DS_MAX_SRC2_I64>;
17280b57cec5SDimitry Andricdef DS_MIN_SRC2_U64_vi    : DS_Real_vi<0xc7, DS_MIN_SRC2_U64>;
17290b57cec5SDimitry Andricdef DS_MAX_SRC2_U64_vi    : DS_Real_vi<0xc8, DS_MAX_SRC2_U64>;
17300b57cec5SDimitry Andricdef DS_AND_SRC2_B64_vi    : DS_Real_vi<0xc9, DS_AND_SRC2_B64>;
17310b57cec5SDimitry Andricdef DS_OR_SRC2_B64_vi     : DS_Real_vi<0xca, DS_OR_SRC2_B64>;
17320b57cec5SDimitry Andricdef DS_XOR_SRC2_B64_vi    : DS_Real_vi<0xcb, DS_XOR_SRC2_B64>;
17330b57cec5SDimitry Andricdef DS_WRITE_SRC2_B64_vi  : DS_Real_vi<0xcd, DS_WRITE_SRC2_B64>;
17340b57cec5SDimitry Andricdef DS_MIN_SRC2_F64_vi    : DS_Real_vi<0xd2, DS_MIN_SRC2_F64>;
17350b57cec5SDimitry Andricdef DS_MAX_SRC2_F64_vi    : DS_Real_vi<0xd3, DS_MAX_SRC2_F64>;
17360b57cec5SDimitry Andricdef DS_WRITE_B96_vi       : DS_Real_vi<0xde, DS_WRITE_B96>;
17370b57cec5SDimitry Andricdef DS_WRITE_B128_vi      : DS_Real_vi<0xdf, DS_WRITE_B128>;
17380b57cec5SDimitry Andricdef DS_READ_B96_vi        : DS_Real_vi<0xfe, DS_READ_B96>;
17390b57cec5SDimitry Andricdef DS_READ_B128_vi       : DS_Real_vi<0xff, DS_READ_B128>;
1740fe6060f1SDimitry Andric
1741*0fca6ea1SDimitry Andric// GFX90A+.
1742fe6060f1SDimitry Andricdef DS_ADD_F64_vi     : DS_Real_vi<0x5c, DS_ADD_F64>;
1743fe6060f1SDimitry Andricdef DS_ADD_RTN_F64_vi : DS_Real_vi<0x7c, DS_ADD_RTN_F64>;
174481ad6265SDimitry Andric
1745*0fca6ea1SDimitry Andric// GFX940+.
174681ad6265SDimitry Andricdef DS_PK_ADD_F16_vi     : DS_Real_vi<0x17, DS_PK_ADD_F16>;
174781ad6265SDimitry Andricdef DS_PK_ADD_RTN_F16_vi : DS_Real_vi<0xb7, DS_PK_ADD_RTN_F16>;
174881ad6265SDimitry Andricdef DS_PK_ADD_BF16_vi     : DS_Real_vi<0x18, DS_PK_ADD_BF16>;
174981ad6265SDimitry Andricdef DS_PK_ADD_RTN_BF16_vi : DS_Real_vi<0xb8, DS_PK_ADD_RTN_BF16>;
1750