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