1 //===-- DSInstructions.td - DS Instruction Defintions ---------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 class DS_Pseudo <string opName, dag outs, dag ins, string asmOps, list<dag> pattern=[]> : 11 InstSI <outs, ins, "", pattern>, 12 SIMCInstr <opName, SIEncodingFamily.NONE> { 13 14 let SubtargetPredicate = isGCN; 15 16 let LGKM_CNT = 1; 17 let DS = 1; 18 let Size = 8; 19 let UseNamedOperandTable = 1; 20 21 // Most instruction load and store data, so set this as the default. 22 let mayLoad = 1; 23 let mayStore = 1; 24 25 let hasSideEffects = 0; 26 let SchedRW = [WriteLDS]; 27 28 let isPseudo = 1; 29 let isCodeGenOnly = 1; 30 31 let AsmMatchConverter = "cvtDS"; 32 33 string Mnemonic = opName; 34 string AsmOperands = asmOps; 35 36 // Well these bits a kind of hack because it would be more natural 37 // to test "outs" and "ins" dags for the presence of particular operands 38 bits<1> has_vdst = 1; 39 bits<1> has_addr = 1; 40 bits<1> has_data0 = 1; 41 bits<1> has_data1 = 1; 42 43 bits<1> has_offset = 1; // has "offset" that should be split to offset0,1 44 bits<1> has_offset0 = 1; 45 bits<1> has_offset1 = 1; 46 47 bits<1> has_gds = 1; 48 bits<1> gdsValue = 0; // if has_gds == 0 set gds to this value 49 50 bits<1> has_m0_read = 1; 51 52 let Uses = !if(has_m0_read, [M0, EXEC], [EXEC]); 53 } 54 55 class DS_Real <DS_Pseudo ds> : 56 InstSI <ds.OutOperandList, ds.InOperandList, ds.Mnemonic # " " # ds.AsmOperands, []>, 57 Enc64 { 58 59 let isPseudo = 0; 60 let isCodeGenOnly = 0; 61 62 // copy relevant pseudo op flags 63 let SubtargetPredicate = ds.SubtargetPredicate; 64 let AsmMatchConverter = ds.AsmMatchConverter; 65 66 // encoding fields 67 bits<8> vdst; 68 bits<1> gds; 69 bits<8> addr; 70 bits<8> data0; 71 bits<8> data1; 72 bits<8> offset0; 73 bits<8> offset1; 74 75 bits<16> offset; 76 let offset0 = !if(ds.has_offset, offset{7-0}, ?); 77 let offset1 = !if(ds.has_offset, offset{15-8}, ?); 78 } 79 80 81 // DS Pseudo instructions 82 83 class DS_1A1D_NORET<string opName, RegisterClass rc = VGPR_32> 84 : DS_Pseudo<opName, 85 (outs), 86 (ins VGPR_32:$addr, rc:$data0, offset:$offset, gds:$gds), 87 "$addr, $data0$offset$gds"> { 88 89 let has_data1 = 0; 90 let has_vdst = 0; 91 } 92 93 multiclass DS_1A1D_NORET_mc<string opName, RegisterClass rc = VGPR_32> { 94 def "" : DS_1A1D_NORET<opName, rc>, 95 AtomicNoRet<opName, 0>; 96 97 let has_m0_read = 0 in { 98 def _gfx9 : DS_1A1D_NORET<opName, rc>, 99 AtomicNoRet<opName#"_gfx9", 0>; 100 } 101 } 102 103 class DS_1A2D_NORET<string opName, RegisterClass rc = VGPR_32> 104 : DS_Pseudo<opName, 105 (outs), 106 (ins VGPR_32:$addr, rc:$data0, rc:$data1, offset:$offset, gds:$gds), 107 "$addr, $data0, $data1"#"$offset"#"$gds"> { 108 109 let has_vdst = 0; 110 } 111 112 multiclass DS_1A2D_NORET_mc<string opName, RegisterClass rc = VGPR_32> { 113 def "" : DS_1A2D_NORET<opName, rc>, 114 AtomicNoRet<opName, 0>; 115 116 let has_m0_read = 0 in { 117 def _gfx9 : DS_1A2D_NORET<opName, rc>, 118 AtomicNoRet<opName#"_gfx9", 0>; 119 } 120 } 121 122 class DS_1A2D_Off8_NORET <string opName, RegisterClass rc = VGPR_32> 123 : DS_Pseudo<opName, 124 (outs), 125 (ins VGPR_32:$addr, rc:$data0, rc:$data1, 126 offset0:$offset0, offset1:$offset1, gds:$gds), 127 "$addr, $data0, $data1$offset0$offset1$gds"> { 128 129 let has_vdst = 0; 130 let has_offset = 0; 131 let AsmMatchConverter = "cvtDSOffset01"; 132 } 133 134 multiclass DS_1A2D_Off8_NORET_mc <string opName, RegisterClass rc = VGPR_32> { 135 def "" : DS_1A2D_Off8_NORET<opName, rc>; 136 137 let has_m0_read = 0 in { 138 def _gfx9 : DS_1A2D_Off8_NORET<opName, rc>; 139 } 140 } 141 142 class DS_1A1D_RET <string opName, RegisterClass rc = VGPR_32> 143 : DS_Pseudo<opName, 144 (outs rc:$vdst), 145 (ins VGPR_32:$addr, rc:$data0, offset:$offset, gds:$gds), 146 "$vdst, $addr, $data0$offset$gds"> { 147 148 let hasPostISelHook = 1; 149 let has_data1 = 0; 150 } 151 152 multiclass DS_1A1D_RET_mc <string opName, RegisterClass rc = VGPR_32, 153 string NoRetOp = ""> { 154 def "" : DS_1A1D_RET<opName, rc>, 155 AtomicNoRet<NoRetOp, !if(!eq(NoRetOp, ""), 0, 1)>; 156 157 let has_m0_read = 0 in { 158 def _gfx9 : DS_1A1D_RET<opName, rc>, 159 AtomicNoRet<!if(!eq(NoRetOp, ""), "", NoRetOp#"_gfx9"), 160 !if(!eq(NoRetOp, ""), 0, 1)>; 161 } 162 } 163 164 class DS_1A2D_RET<string opName, 165 RegisterClass rc = VGPR_32, 166 RegisterClass src = rc> 167 : DS_Pseudo<opName, 168 (outs rc:$vdst), 169 (ins VGPR_32:$addr, src:$data0, src:$data1, offset:$offset, gds:$gds), 170 "$vdst, $addr, $data0, $data1$offset$gds"> { 171 172 let hasPostISelHook = 1; 173 } 174 175 multiclass DS_1A2D_RET_mc<string opName, 176 RegisterClass rc = VGPR_32, 177 string NoRetOp = "", 178 RegisterClass src = rc> { 179 def "" : DS_1A2D_RET<opName, rc, src>, 180 AtomicNoRet<NoRetOp, !if(!eq(NoRetOp, ""), 0, 1)>; 181 182 let has_m0_read = 0 in { 183 def _gfx9 : DS_1A2D_RET<opName, rc, src>, 184 AtomicNoRet<NoRetOp#"_gfx9", !if(!eq(NoRetOp, ""), 0, 1)>; 185 } 186 } 187 188 class DS_1A2D_Off8_RET<string opName, 189 RegisterClass rc = VGPR_32, 190 RegisterClass src = rc> 191 : DS_Pseudo<opName, 192 (outs rc:$vdst), 193 (ins VGPR_32:$addr, src:$data0, src:$data1, offset0:$offset0, offset1:$offset1, gds:$gds), 194 "$vdst, $addr, $data0, $data1$offset0$offset1$gds"> { 195 196 let has_offset = 0; 197 let AsmMatchConverter = "cvtDSOffset01"; 198 199 let hasPostISelHook = 1; 200 } 201 202 multiclass DS_1A2D_Off8_RET_mc<string opName, 203 RegisterClass rc = VGPR_32, 204 RegisterClass src = rc> { 205 def "" : DS_1A2D_Off8_RET<opName, rc, src>; 206 207 let has_m0_read = 0 in { 208 def _gfx9 : DS_1A2D_Off8_RET<opName, rc, src>; 209 } 210 } 211 212 213 class DS_1A_RET<string opName, RegisterClass rc = VGPR_32, bit HasTiedOutput = 0, Operand ofs = offset> 214 : DS_Pseudo<opName, 215 (outs rc:$vdst), 216 !if(HasTiedOutput, 217 (ins VGPR_32:$addr, ofs:$offset, gds:$gds, rc:$vdst_in), 218 (ins VGPR_32:$addr, ofs:$offset, gds:$gds)), 219 "$vdst, $addr$offset$gds"> { 220 let Constraints = !if(HasTiedOutput, "$vdst = $vdst_in", ""); 221 let DisableEncoding = !if(HasTiedOutput, "$vdst_in", ""); 222 let has_data0 = 0; 223 let has_data1 = 0; 224 } 225 226 multiclass DS_1A_RET_mc<string opName, RegisterClass rc = VGPR_32, bit HasTiedOutput = 0, Operand ofs = offset> { 227 def "" : DS_1A_RET<opName, rc, HasTiedOutput, ofs>; 228 229 let has_m0_read = 0 in { 230 def _gfx9 : DS_1A_RET<opName, rc, HasTiedOutput, ofs>; 231 } 232 } 233 234 class DS_1A_RET_Tied<string opName, RegisterClass rc = VGPR_32> : 235 DS_1A_RET<opName, rc, 1>; 236 237 class DS_1A_Off8_RET <string opName, RegisterClass rc = VGPR_32> 238 : DS_Pseudo<opName, 239 (outs rc:$vdst), 240 (ins VGPR_32:$addr, offset0:$offset0, offset1:$offset1, gds:$gds), 241 "$vdst, $addr$offset0$offset1$gds"> { 242 243 let has_offset = 0; 244 let has_data0 = 0; 245 let has_data1 = 0; 246 let AsmMatchConverter = "cvtDSOffset01"; 247 } 248 249 multiclass DS_1A_Off8_RET_mc <string opName, RegisterClass rc = VGPR_32> { 250 def "" : DS_1A_Off8_RET<opName, rc>; 251 252 let has_m0_read = 0 in { 253 def _gfx9 : DS_1A_Off8_RET<opName, rc>; 254 } 255 } 256 257 class DS_1A_RET_GDS <string opName> : DS_Pseudo<opName, 258 (outs VGPR_32:$vdst), 259 (ins VGPR_32:$addr, offset:$offset), 260 "$vdst, $addr$offset gds"> { 261 262 let has_data0 = 0; 263 let has_data1 = 0; 264 let has_gds = 0; 265 let gdsValue = 1; 266 let AsmMatchConverter = "cvtDSGds"; 267 } 268 269 class DS_0A_RET <string opName> : DS_Pseudo<opName, 270 (outs VGPR_32:$vdst), 271 (ins offset:$offset, gds:$gds), 272 "$vdst$offset$gds"> { 273 274 let mayLoad = 1; 275 let mayStore = 1; 276 277 let has_addr = 0; 278 let has_data0 = 0; 279 let has_data1 = 0; 280 } 281 282 class DS_1A <string opName> : DS_Pseudo<opName, 283 (outs), 284 (ins VGPR_32:$addr, offset:$offset, gds:$gds), 285 "$addr$offset$gds"> { 286 287 let mayLoad = 1; 288 let mayStore = 1; 289 290 let has_vdst = 0; 291 let has_data0 = 0; 292 let has_data1 = 0; 293 } 294 295 multiclass DS_1A_mc <string opName> { 296 def "" : DS_1A<opName>; 297 298 let has_m0_read = 0 in { 299 def _gfx9 : DS_1A<opName>; 300 } 301 } 302 303 304 class DS_GWS <string opName, dag ins, string asmOps> 305 : DS_Pseudo<opName, (outs), ins, asmOps> { 306 307 let has_vdst = 0; 308 let has_addr = 0; 309 let has_data0 = 0; 310 let has_data1 = 0; 311 312 let has_gds = 0; 313 let gdsValue = 1; 314 let AsmMatchConverter = "cvtDSGds"; 315 } 316 317 class DS_GWS_0D <string opName> 318 : DS_GWS<opName, 319 (ins offset:$offset, gds:$gds), "$offset gds">; 320 321 class DS_GWS_1D <string opName> 322 : DS_GWS<opName, 323 (ins VGPR_32:$data0, offset:$offset, gds:$gds), "$data0$offset gds"> { 324 325 let has_data0 = 1; 326 } 327 328 class DS_VOID <string opName> : DS_Pseudo<opName, 329 (outs), (ins), ""> { 330 let mayLoad = 0; 331 let mayStore = 0; 332 let hasSideEffects = 1; 333 let UseNamedOperandTable = 0; 334 let AsmMatchConverter = ""; 335 336 let has_vdst = 0; 337 let has_addr = 0; 338 let has_data0 = 0; 339 let has_data1 = 0; 340 let has_offset = 0; 341 let has_offset0 = 0; 342 let has_offset1 = 0; 343 let has_gds = 0; 344 } 345 346 class DS_1A1D_PERMUTE <string opName, SDPatternOperator node = null_frag> 347 : DS_Pseudo<opName, 348 (outs VGPR_32:$vdst), 349 (ins VGPR_32:$addr, VGPR_32:$data0, offset:$offset), 350 "$vdst, $addr, $data0$offset", 351 [(set i32:$vdst, 352 (node (DS1Addr1Offset i32:$addr, i16:$offset), i32:$data0))] > { 353 354 let mayLoad = 0; 355 let mayStore = 0; 356 let isConvergent = 1; 357 358 let has_data1 = 0; 359 let has_gds = 0; 360 } 361 362 defm DS_ADD_U32 : DS_1A1D_NORET_mc<"ds_add_u32">; 363 defm DS_SUB_U32 : DS_1A1D_NORET_mc<"ds_sub_u32">; 364 defm DS_RSUB_U32 : DS_1A1D_NORET_mc<"ds_rsub_u32">; 365 defm DS_INC_U32 : DS_1A1D_NORET_mc<"ds_inc_u32">; 366 defm DS_DEC_U32 : DS_1A1D_NORET_mc<"ds_dec_u32">; 367 defm DS_MIN_I32 : DS_1A1D_NORET_mc<"ds_min_i32">; 368 defm DS_MAX_I32 : DS_1A1D_NORET_mc<"ds_max_i32">; 369 defm DS_MIN_U32 : DS_1A1D_NORET_mc<"ds_min_u32">; 370 defm DS_MAX_U32 : DS_1A1D_NORET_mc<"ds_max_u32">; 371 defm DS_AND_B32 : DS_1A1D_NORET_mc<"ds_and_b32">; 372 defm DS_OR_B32 : DS_1A1D_NORET_mc<"ds_or_b32">; 373 defm DS_XOR_B32 : DS_1A1D_NORET_mc<"ds_xor_b32">; 374 defm DS_ADD_F32 : DS_1A1D_NORET_mc<"ds_add_f32">; 375 defm DS_MIN_F32 : DS_1A1D_NORET_mc<"ds_min_f32">; 376 defm DS_MAX_F32 : DS_1A1D_NORET_mc<"ds_max_f32">; 377 378 let mayLoad = 0 in { 379 defm DS_WRITE_B8 : DS_1A1D_NORET_mc<"ds_write_b8">; 380 defm DS_WRITE_B16 : DS_1A1D_NORET_mc<"ds_write_b16">; 381 defm DS_WRITE_B32 : DS_1A1D_NORET_mc<"ds_write_b32">; 382 defm DS_WRITE2_B32 : DS_1A2D_Off8_NORET_mc<"ds_write2_b32">; 383 defm DS_WRITE2ST64_B32: DS_1A2D_Off8_NORET_mc<"ds_write2st64_b32">; 384 385 386 let has_m0_read = 0 in { 387 388 let SubtargetPredicate = HasD16LoadStore in { 389 def DS_WRITE_B8_D16_HI : DS_1A1D_NORET<"ds_write_b8_d16_hi">; 390 def DS_WRITE_B16_D16_HI : DS_1A1D_NORET<"ds_write_b16_d16_hi">; 391 } 392 393 let SubtargetPredicate = HasDSAddTid in { 394 def DS_WRITE_ADDTID_B32 : DS_1A1D_NORET<"ds_write_addtid_b32">; 395 } 396 397 } // End has_m0_read = 0 398 } // End mayLoad = 0 399 400 defm DS_MSKOR_B32 : DS_1A2D_NORET_mc<"ds_mskor_b32">; 401 defm DS_CMPST_B32 : DS_1A2D_NORET_mc<"ds_cmpst_b32">; 402 defm DS_CMPST_F32 : DS_1A2D_NORET_mc<"ds_cmpst_f32">; 403 404 defm DS_ADD_U64 : DS_1A1D_NORET_mc<"ds_add_u64", VReg_64>; 405 defm DS_SUB_U64 : DS_1A1D_NORET_mc<"ds_sub_u64", VReg_64>; 406 defm DS_RSUB_U64 : DS_1A1D_NORET_mc<"ds_rsub_u64", VReg_64>; 407 defm DS_INC_U64 : DS_1A1D_NORET_mc<"ds_inc_u64", VReg_64>; 408 defm DS_DEC_U64 : DS_1A1D_NORET_mc<"ds_dec_u64", VReg_64>; 409 defm DS_MIN_I64 : DS_1A1D_NORET_mc<"ds_min_i64", VReg_64>; 410 defm DS_MAX_I64 : DS_1A1D_NORET_mc<"ds_max_i64", VReg_64>; 411 defm DS_MIN_U64 : DS_1A1D_NORET_mc<"ds_min_u64", VReg_64>; 412 defm DS_MAX_U64 : DS_1A1D_NORET_mc<"ds_max_u64", VReg_64>; 413 defm DS_AND_B64 : DS_1A1D_NORET_mc<"ds_and_b64", VReg_64>; 414 defm DS_OR_B64 : DS_1A1D_NORET_mc<"ds_or_b64", VReg_64>; 415 defm DS_XOR_B64 : DS_1A1D_NORET_mc<"ds_xor_b64", VReg_64>; 416 defm DS_MSKOR_B64 : DS_1A2D_NORET_mc<"ds_mskor_b64", VReg_64>; 417 let mayLoad = 0 in { 418 defm DS_WRITE_B64 : DS_1A1D_NORET_mc<"ds_write_b64", VReg_64>; 419 defm DS_WRITE2_B64 : DS_1A2D_Off8_NORET_mc<"ds_write2_b64", VReg_64>; 420 defm DS_WRITE2ST64_B64: DS_1A2D_Off8_NORET_mc<"ds_write2st64_b64", VReg_64>; 421 } 422 defm DS_CMPST_B64 : DS_1A2D_NORET_mc<"ds_cmpst_b64", VReg_64>; 423 defm DS_CMPST_F64 : DS_1A2D_NORET_mc<"ds_cmpst_f64", VReg_64>; 424 defm DS_MIN_F64 : DS_1A1D_NORET_mc<"ds_min_f64", VReg_64>; 425 defm DS_MAX_F64 : DS_1A1D_NORET_mc<"ds_max_f64", VReg_64>; 426 427 defm DS_ADD_RTN_U32 : DS_1A1D_RET_mc<"ds_add_rtn_u32", VGPR_32, "ds_add_u32">; 428 defm DS_ADD_RTN_F32 : DS_1A1D_RET_mc<"ds_add_rtn_f32", VGPR_32, "ds_add_f32">; 429 defm DS_SUB_RTN_U32 : DS_1A1D_RET_mc<"ds_sub_rtn_u32", VGPR_32, "ds_sub_u32">; 430 defm DS_RSUB_RTN_U32 : DS_1A1D_RET_mc<"ds_rsub_rtn_u32", VGPR_32, "ds_rsub_u32">; 431 defm DS_INC_RTN_U32 : DS_1A1D_RET_mc<"ds_inc_rtn_u32", VGPR_32, "ds_inc_u32">; 432 defm DS_DEC_RTN_U32 : DS_1A1D_RET_mc<"ds_dec_rtn_u32", VGPR_32, "ds_dec_u32">; 433 defm DS_MIN_RTN_I32 : DS_1A1D_RET_mc<"ds_min_rtn_i32", VGPR_32, "ds_min_i32">; 434 defm DS_MAX_RTN_I32 : DS_1A1D_RET_mc<"ds_max_rtn_i32", VGPR_32, "ds_max_i32">; 435 defm DS_MIN_RTN_U32 : DS_1A1D_RET_mc<"ds_min_rtn_u32", VGPR_32, "ds_min_u32">; 436 defm DS_MAX_RTN_U32 : DS_1A1D_RET_mc<"ds_max_rtn_u32", VGPR_32, "ds_max_u32">; 437 defm DS_AND_RTN_B32 : DS_1A1D_RET_mc<"ds_and_rtn_b32", VGPR_32, "ds_and_b32">; 438 defm DS_OR_RTN_B32 : DS_1A1D_RET_mc<"ds_or_rtn_b32", VGPR_32, "ds_or_b32">; 439 defm DS_XOR_RTN_B32 : DS_1A1D_RET_mc<"ds_xor_rtn_b32", VGPR_32, "ds_xor_b32">; 440 defm DS_MSKOR_RTN_B32 : DS_1A2D_RET_mc<"ds_mskor_rtn_b32", VGPR_32, "ds_mskor_b32">; 441 defm DS_CMPST_RTN_B32 : DS_1A2D_RET_mc<"ds_cmpst_rtn_b32", VGPR_32, "ds_cmpst_b32">; 442 defm DS_CMPST_RTN_F32 : DS_1A2D_RET_mc<"ds_cmpst_rtn_f32", VGPR_32, "ds_cmpst_f32">; 443 defm DS_MIN_RTN_F32 : DS_1A1D_RET_mc<"ds_min_rtn_f32", VGPR_32, "ds_min_f32">; 444 defm DS_MAX_RTN_F32 : DS_1A1D_RET_mc<"ds_max_rtn_f32", VGPR_32, "ds_max_f32">; 445 446 defm DS_WRXCHG_RTN_B32 : DS_1A1D_RET_mc<"ds_wrxchg_rtn_b32">; 447 defm DS_WRXCHG2_RTN_B32 : DS_1A2D_Off8_RET_mc<"ds_wrxchg2_rtn_b32", VReg_64, VGPR_32>; 448 defm DS_WRXCHG2ST64_RTN_B32 : DS_1A2D_Off8_RET_mc<"ds_wrxchg2st64_rtn_b32", VReg_64, VGPR_32>; 449 450 defm DS_ADD_RTN_U64 : DS_1A1D_RET_mc<"ds_add_rtn_u64", VReg_64, "ds_add_u64">; 451 defm DS_SUB_RTN_U64 : DS_1A1D_RET_mc<"ds_sub_rtn_u64", VReg_64, "ds_sub_u64">; 452 defm DS_RSUB_RTN_U64 : DS_1A1D_RET_mc<"ds_rsub_rtn_u64", VReg_64, "ds_rsub_u64">; 453 defm DS_INC_RTN_U64 : DS_1A1D_RET_mc<"ds_inc_rtn_u64", VReg_64, "ds_inc_u64">; 454 defm DS_DEC_RTN_U64 : DS_1A1D_RET_mc<"ds_dec_rtn_u64", VReg_64, "ds_dec_u64">; 455 defm DS_MIN_RTN_I64 : DS_1A1D_RET_mc<"ds_min_rtn_i64", VReg_64, "ds_min_i64">; 456 defm DS_MAX_RTN_I64 : DS_1A1D_RET_mc<"ds_max_rtn_i64", VReg_64, "ds_max_i64">; 457 defm DS_MIN_RTN_U64 : DS_1A1D_RET_mc<"ds_min_rtn_u64", VReg_64, "ds_min_u64">; 458 defm DS_MAX_RTN_U64 : DS_1A1D_RET_mc<"ds_max_rtn_u64", VReg_64, "ds_max_u64">; 459 defm DS_AND_RTN_B64 : DS_1A1D_RET_mc<"ds_and_rtn_b64", VReg_64, "ds_and_b64">; 460 defm DS_OR_RTN_B64 : DS_1A1D_RET_mc<"ds_or_rtn_b64", VReg_64, "ds_or_b64">; 461 defm DS_XOR_RTN_B64 : DS_1A1D_RET_mc<"ds_xor_rtn_b64", VReg_64, "ds_xor_b64">; 462 defm DS_MSKOR_RTN_B64 : DS_1A2D_RET_mc<"ds_mskor_rtn_b64", VReg_64, "ds_mskor_b64">; 463 defm DS_CMPST_RTN_B64 : DS_1A2D_RET_mc<"ds_cmpst_rtn_b64", VReg_64, "ds_cmpst_b64">; 464 defm DS_CMPST_RTN_F64 : DS_1A2D_RET_mc<"ds_cmpst_rtn_f64", VReg_64, "ds_cmpst_f64">; 465 defm DS_MIN_RTN_F64 : DS_1A1D_RET_mc<"ds_min_rtn_f64", VReg_64, "ds_min_f64">; 466 defm DS_MAX_RTN_F64 : DS_1A1D_RET_mc<"ds_max_rtn_f64", VReg_64, "ds_max_f64">; 467 468 defm DS_WRXCHG_RTN_B64 : DS_1A1D_RET_mc<"ds_wrxchg_rtn_b64", VReg_64>; 469 defm DS_WRXCHG2_RTN_B64 : DS_1A2D_Off8_RET_mc<"ds_wrxchg2_rtn_b64", VReg_128, VReg_64>; 470 defm DS_WRXCHG2ST64_RTN_B64 : DS_1A2D_Off8_RET_mc<"ds_wrxchg2st64_rtn_b64", VReg_128, VReg_64>; 471 472 def DS_GWS_INIT : DS_GWS_1D<"ds_gws_init">; 473 def DS_GWS_SEMA_V : DS_GWS_0D<"ds_gws_sema_v">; 474 def DS_GWS_SEMA_BR : DS_GWS_1D<"ds_gws_sema_br">; 475 def DS_GWS_SEMA_P : DS_GWS_0D<"ds_gws_sema_p">; 476 def DS_GWS_BARRIER : DS_GWS_1D<"ds_gws_barrier">; 477 478 def DS_ADD_SRC2_U32 : DS_1A<"ds_add_src2_u32">; 479 def DS_SUB_SRC2_U32 : DS_1A<"ds_sub_src2_u32">; 480 def DS_RSUB_SRC2_U32 : DS_1A<"ds_rsub_src2_u32">; 481 def DS_INC_SRC2_U32 : DS_1A<"ds_inc_src2_u32">; 482 def DS_DEC_SRC2_U32 : DS_1A<"ds_dec_src2_u32">; 483 def DS_MIN_SRC2_I32 : DS_1A<"ds_min_src2_i32">; 484 def DS_MAX_SRC2_I32 : DS_1A<"ds_max_src2_i32">; 485 def DS_MIN_SRC2_U32 : DS_1A<"ds_min_src2_u32">; 486 def DS_MAX_SRC2_U32 : DS_1A<"ds_max_src2_u32">; 487 def DS_AND_SRC2_B32 : DS_1A<"ds_and_src2_b32">; 488 def DS_OR_SRC2_B32 : DS_1A<"ds_or_src2_b32">; 489 def DS_XOR_SRC2_B32 : DS_1A<"ds_xor_src2_b32">; 490 def DS_MIN_SRC2_F32 : DS_1A<"ds_min_src2_f32">; 491 def DS_MAX_SRC2_F32 : DS_1A<"ds_max_src2_f32">; 492 493 def DS_ADD_SRC2_U64 : DS_1A<"ds_add_src2_u64">; 494 def DS_SUB_SRC2_U64 : DS_1A<"ds_sub_src2_u64">; 495 def DS_RSUB_SRC2_U64 : DS_1A<"ds_rsub_src2_u64">; 496 def DS_INC_SRC2_U64 : DS_1A<"ds_inc_src2_u64">; 497 def DS_DEC_SRC2_U64 : DS_1A<"ds_dec_src2_u64">; 498 def DS_MIN_SRC2_I64 : DS_1A<"ds_min_src2_i64">; 499 def DS_MAX_SRC2_I64 : DS_1A<"ds_max_src2_i64">; 500 def DS_MIN_SRC2_U64 : DS_1A<"ds_min_src2_u64">; 501 def DS_MAX_SRC2_U64 : DS_1A<"ds_max_src2_u64">; 502 def DS_AND_SRC2_B64 : DS_1A<"ds_and_src2_b64">; 503 def DS_OR_SRC2_B64 : DS_1A<"ds_or_src2_b64">; 504 def DS_XOR_SRC2_B64 : DS_1A<"ds_xor_src2_b64">; 505 def DS_MIN_SRC2_F64 : DS_1A<"ds_min_src2_f64">; 506 def DS_MAX_SRC2_F64 : DS_1A<"ds_max_src2_f64">; 507 508 def DS_WRITE_SRC2_B32 : DS_1A<"ds_write_src2_b32">; 509 def DS_WRITE_SRC2_B64 : DS_1A<"ds_write_src2_b64">; 510 511 let Uses = [EXEC], mayLoad = 0, mayStore = 0, isConvergent = 1 in { 512 def DS_SWIZZLE_B32 : DS_1A_RET <"ds_swizzle_b32", VGPR_32, 0, SwizzleImm>; 513 } 514 515 let mayStore = 0 in { 516 defm DS_READ_I8 : DS_1A_RET_mc<"ds_read_i8">; 517 defm DS_READ_U8 : DS_1A_RET_mc<"ds_read_u8">; 518 defm DS_READ_I16 : DS_1A_RET_mc<"ds_read_i16">; 519 defm DS_READ_U16 : DS_1A_RET_mc<"ds_read_u16">; 520 defm DS_READ_B32 : DS_1A_RET_mc<"ds_read_b32">; 521 defm DS_READ_B64 : DS_1A_RET_mc<"ds_read_b64", VReg_64>; 522 523 defm DS_READ2_B32 : DS_1A_Off8_RET_mc<"ds_read2_b32", VReg_64>; 524 defm DS_READ2ST64_B32: DS_1A_Off8_RET_mc<"ds_read2st64_b32", VReg_64>; 525 526 defm DS_READ2_B64 : DS_1A_Off8_RET_mc<"ds_read2_b64", VReg_128>; 527 defm DS_READ2ST64_B64: DS_1A_Off8_RET_mc<"ds_read2st64_b64", VReg_128>; 528 529 let has_m0_read = 0 in { 530 let SubtargetPredicate = HasD16LoadStore in { 531 def DS_READ_U8_D16 : DS_1A_RET_Tied<"ds_read_u8_d16">; 532 def DS_READ_U8_D16_HI : DS_1A_RET_Tied<"ds_read_u8_d16_hi">; 533 def DS_READ_I8_D16 : DS_1A_RET_Tied<"ds_read_i8_d16">; 534 def DS_READ_I8_D16_HI : DS_1A_RET_Tied<"ds_read_i8_d16_hi">; 535 def DS_READ_U16_D16 : DS_1A_RET_Tied<"ds_read_u16_d16">; 536 def DS_READ_U16_D16_HI : DS_1A_RET_Tied<"ds_read_u16_d16_hi">; 537 } 538 539 let SubtargetPredicate = HasDSAddTid in { 540 def DS_READ_ADDTID_B32 : DS_1A_RET<"ds_read_addtid_b32">; 541 } 542 } // End has_m0_read = 0 543 } 544 545 def DS_CONSUME : DS_0A_RET<"ds_consume">; 546 def DS_APPEND : DS_0A_RET<"ds_append">; 547 def DS_ORDERED_COUNT : DS_1A_RET_GDS<"ds_ordered_count">; 548 549 //===----------------------------------------------------------------------===// 550 // Instruction definitions for CI and newer. 551 //===----------------------------------------------------------------------===// 552 553 let SubtargetPredicate = isCIVI in { 554 555 defm DS_WRAP_RTN_B32 : DS_1A2D_RET_mc<"ds_wrap_rtn_b32", VGPR_32>; 556 defm DS_CONDXCHG32_RTN_B64 : DS_1A1D_RET_mc<"ds_condxchg32_rtn_b64", VReg_64>; 557 558 def DS_GWS_SEMA_RELEASE_ALL : DS_GWS_0D<"ds_gws_sema_release_all">; 559 560 let mayStore = 0 in { 561 defm DS_READ_B96 : DS_1A_RET_mc<"ds_read_b96", VReg_96>; 562 defm DS_READ_B128: DS_1A_RET_mc<"ds_read_b128", VReg_128>; 563 } // End mayStore = 0 564 565 let mayLoad = 0 in { 566 defm DS_WRITE_B96 : DS_1A1D_NORET_mc<"ds_write_b96", VReg_96>; 567 defm DS_WRITE_B128 : DS_1A1D_NORET_mc<"ds_write_b128", VReg_128>; 568 } // End mayLoad = 0 569 570 def DS_NOP : DS_VOID<"ds_nop">; 571 572 } // let SubtargetPredicate = isCIVI 573 574 //===----------------------------------------------------------------------===// 575 // Instruction definitions for VI and newer. 576 //===----------------------------------------------------------------------===// 577 578 let SubtargetPredicate = isVI in { 579 580 let Uses = [EXEC] in { 581 def DS_PERMUTE_B32 : DS_1A1D_PERMUTE <"ds_permute_b32", 582 int_amdgcn_ds_permute>; 583 def DS_BPERMUTE_B32 : DS_1A1D_PERMUTE <"ds_bpermute_b32", 584 int_amdgcn_ds_bpermute>; 585 } 586 587 def DS_ADD_SRC2_F32 : DS_1A<"ds_add_src2_f32">; 588 589 } // let SubtargetPredicate = isVI 590 591 //===----------------------------------------------------------------------===// 592 // DS Patterns 593 //===----------------------------------------------------------------------===// 594 595 def : GCNPat < 596 (int_amdgcn_ds_swizzle i32:$src, imm:$offset16), 597 (DS_SWIZZLE_B32 $src, (as_i16imm $offset16), (i1 0)) 598 >; 599 600 class DSReadPat <DS_Pseudo inst, ValueType vt, PatFrag frag> : GCNPat < 601 (vt (frag (DS1Addr1Offset i32:$ptr, i32:$offset))), 602 (inst $ptr, (as_i16imm $offset), (i1 0)) 603 >; 604 605 multiclass DSReadPat_mc<DS_Pseudo inst, ValueType vt, string frag> { 606 607 let OtherPredicates = [LDSRequiresM0Init] in { 608 def : DSReadPat<inst, vt, !cast<PatFrag>(frag#"_m0")>; 609 } 610 611 let OtherPredicates = [NotLDSRequiresM0Init] in { 612 def : DSReadPat<!cast<DS_Pseudo>(!cast<string>(inst)#"_gfx9"), vt, !cast<PatFrag>(frag)>; 613 } 614 } 615 616 617 multiclass DSReadPat_Hi16 <DS_Pseudo inst, PatFrag frag, ValueType vt = i16> { 618 def : GCNPat < 619 (build_vector vt:$lo, (vt (frag (DS1Addr1Offset i32:$ptr, i32:$offset)))), 620 (v2i16 (inst $ptr, (as_i16imm $offset), (i1 0), $lo)) 621 >; 622 623 def : GCNPat < 624 (build_vector f16:$lo, (f16 (bitconvert (vt (frag (DS1Addr1Offset i32:$ptr, i32:$offset)))))), 625 (v2f16 (inst $ptr, (as_i16imm $offset), (i1 0), $lo)) 626 >; 627 } 628 629 multiclass DSReadPat_Lo16 <DS_Pseudo inst, PatFrag frag, ValueType vt = i16> { 630 def : GCNPat < 631 (build_vector (vt (frag (DS1Addr1Offset i32:$ptr, i32:$offset))), (vt (Hi16Elt vt:$hi))), 632 (v2i16 (inst $ptr, (as_i16imm $offset), 0, $hi)) 633 >; 634 635 def : GCNPat < 636 (build_vector (f16 (bitconvert (vt (frag (DS1Addr1Offset i32:$ptr, i32:$offset))))), (f16 (Hi16Elt f16:$hi))), 637 (v2f16 (inst $ptr, (as_i16imm $offset), 0, $hi)) 638 >; 639 } 640 641 defm : DSReadPat_mc <DS_READ_I8, i32, "sextloadi8_local">; 642 defm : DSReadPat_mc <DS_READ_U8, i32, "az_extloadi8_local">; 643 defm : DSReadPat_mc <DS_READ_I8, i16, "sextloadi8_local">; 644 defm : DSReadPat_mc <DS_READ_U8, i16, "az_extloadi8_local">; 645 defm : DSReadPat_mc <DS_READ_I16, i32, "sextloadi16_local">; 646 defm : DSReadPat_mc <DS_READ_I16, i32, "sextloadi16_local">; 647 defm : DSReadPat_mc <DS_READ_U16, i32, "az_extloadi16_local">; 648 defm : DSReadPat_mc <DS_READ_U16, i16, "load_local">; 649 defm : DSReadPat_mc <DS_READ_B32, i32, "load_local">; 650 defm : DSReadPat_mc <DS_READ_B32, i32, "atomic_load_32_local">; 651 defm : DSReadPat_mc <DS_READ_B64, i64, "atomic_load_64_local">; 652 653 let AddedComplexity = 100 in { 654 655 defm : DSReadPat_mc <DS_READ_B64, v2i32, "load_align8_local">; 656 defm : DSReadPat_mc <DS_READ_B128, v4i32, "load_align16_local">; 657 658 } // End AddedComplexity = 100 659 660 let OtherPredicates = [D16PreservesUnusedBits] in { 661 let AddedComplexity = 100 in { 662 defm : DSReadPat_Hi16<DS_READ_U16_D16_HI, load_local>; 663 defm : DSReadPat_Hi16<DS_READ_U8_D16_HI, az_extloadi8_local>; 664 defm : DSReadPat_Hi16<DS_READ_I8_D16_HI, sextloadi8_local>; 665 666 defm : DSReadPat_Lo16<DS_READ_U16_D16, load_local>; 667 defm : DSReadPat_Lo16<DS_READ_U8_D16, az_extloadi8_local>; 668 defm : DSReadPat_Lo16<DS_READ_I8_D16, sextloadi8_local>; 669 670 } 671 } 672 673 class DSWritePat <DS_Pseudo inst, ValueType vt, PatFrag frag> : GCNPat < 674 (frag vt:$value, (DS1Addr1Offset i32:$ptr, i32:$offset)), 675 (inst $ptr, $value, (as_i16imm $offset), (i1 0)) 676 >; 677 678 multiclass DSWritePat_mc <DS_Pseudo inst, ValueType vt, string frag> { 679 let OtherPredicates = [LDSRequiresM0Init] in { 680 def : DSWritePat<inst, vt, !cast<PatFrag>(frag#"_m0")>; 681 } 682 683 let OtherPredicates = [NotLDSRequiresM0Init] in { 684 def : DSWritePat<!cast<DS_Pseudo>(!cast<string>(inst)#"_gfx9"), vt, !cast<PatFrag>(frag)>; 685 } 686 } 687 688 // Irritatingly, atomic_store reverses the order of operands from a 689 // normal store. 690 class DSAtomicWritePat <DS_Pseudo inst, ValueType vt, PatFrag frag> : GCNPat < 691 (frag (DS1Addr1Offset i32:$ptr, i32:$offset), vt:$value), 692 (inst $ptr, $value, (as_i16imm $offset), (i1 0)) 693 >; 694 695 multiclass DSAtomicWritePat_mc <DS_Pseudo inst, ValueType vt, string frag> { 696 let OtherPredicates = [LDSRequiresM0Init] in { 697 def : DSAtomicWritePat<inst, vt, !cast<PatFrag>(frag#"_m0")>; 698 } 699 700 let OtherPredicates = [NotLDSRequiresM0Init] in { 701 def : DSAtomicWritePat<!cast<DS_Pseudo>(!cast<string>(inst)#"_gfx9"), vt, !cast<PatFrag>(frag)>; 702 } 703 } 704 705 defm : DSWritePat_mc <DS_WRITE_B8, i32, "truncstorei8_local">; 706 defm : DSWritePat_mc <DS_WRITE_B16, i32, "truncstorei16_local">; 707 defm : DSWritePat_mc <DS_WRITE_B8, i16, "truncstorei8_local">; 708 defm : DSWritePat_mc <DS_WRITE_B16, i16, "store_local">; 709 defm : DSWritePat_mc <DS_WRITE_B32, i32, "store_local">; 710 defm : DSAtomicWritePat_mc <DS_WRITE_B32, i32, "atomic_store_local">; 711 defm : DSAtomicWritePat_mc <DS_WRITE_B64, i64, "atomic_store_local">; 712 713 let OtherPredicates = [D16PreservesUnusedBits] in { 714 def : DSWritePat <DS_WRITE_B16_D16_HI, i32, store_local_hi16>; 715 def : DSWritePat <DS_WRITE_B8_D16_HI, i32, truncstorei8_local_hi16>; 716 } 717 718 719 class DS64Bit4ByteAlignedReadPat<DS_Pseudo inst, PatFrag frag> : GCNPat < 720 (v2i32 (frag (DS64Bit4ByteAligned i32:$ptr, i8:$offset0, i8:$offset1))), 721 (inst $ptr, $offset0, $offset1, (i1 0)) 722 >; 723 724 class DS64Bit4ByteAlignedWritePat<DS_Pseudo inst, PatFrag frag> : GCNPat< 725 (frag v2i32:$value, (DS64Bit4ByteAligned i32:$ptr, i8:$offset0, i8:$offset1)), 726 (inst $ptr, (i32 (EXTRACT_SUBREG $value, sub0)), 727 (i32 (EXTRACT_SUBREG $value, sub1)), $offset0, $offset1, 728 (i1 0)) 729 >; 730 731 let OtherPredicates = [LDSRequiresM0Init] in { 732 def : DS64Bit4ByteAlignedReadPat<DS_READ2_B32, load_local_m0>; 733 def : DS64Bit4ByteAlignedWritePat<DS_WRITE2_B32, store_local_m0>; 734 } 735 736 let OtherPredicates = [NotLDSRequiresM0Init] in { 737 def : DS64Bit4ByteAlignedReadPat<DS_READ2_B32_gfx9, load_local>; 738 def : DS64Bit4ByteAlignedWritePat<DS_WRITE2_B32_gfx9, store_local>; 739 } 740 741 742 let AddedComplexity = 100 in { 743 744 defm : DSWritePat_mc <DS_WRITE_B64, v2i32, "store_align8_local">; 745 defm : DSWritePat_mc <DS_WRITE_B128, v4i32, "store_align16_local">; 746 747 } // End AddedComplexity = 100 748 class DSAtomicRetPat<DS_Pseudo inst, ValueType vt, PatFrag frag> : GCNPat < 749 (frag (DS1Addr1Offset i32:$ptr, i32:$offset), vt:$value), 750 (inst $ptr, $value, (as_i16imm $offset), (i1 0)) 751 >; 752 753 multiclass DSAtomicRetPat_mc<DS_Pseudo inst, ValueType vt, string frag> { 754 let OtherPredicates = [LDSRequiresM0Init] in { 755 def : DSAtomicRetPat<inst, vt, !cast<PatFrag>(frag#"_m0")>; 756 } 757 758 let OtherPredicates = [NotLDSRequiresM0Init] in { 759 def : DSAtomicRetPat<!cast<DS_Pseudo>(!cast<string>(inst)#"_gfx9"), vt, 760 !cast<PatFrag>(frag)>; 761 } 762 } 763 764 765 766 class DSAtomicCmpXChg<DS_Pseudo inst, ValueType vt, PatFrag frag> : GCNPat < 767 (frag (DS1Addr1Offset i32:$ptr, i32:$offset), vt:$cmp, vt:$swap), 768 (inst $ptr, $cmp, $swap, (as_i16imm $offset), (i1 0)) 769 >; 770 771 multiclass DSAtomicCmpXChg_mc<DS_Pseudo inst, ValueType vt, string frag> { 772 let OtherPredicates = [LDSRequiresM0Init] in { 773 def : DSAtomicCmpXChg<inst, vt, !cast<PatFrag>(frag#"_m0")>; 774 } 775 776 let OtherPredicates = [NotLDSRequiresM0Init] in { 777 def : DSAtomicCmpXChg<!cast<DS_Pseudo>(!cast<string>(inst)#"_gfx9"), vt, 778 !cast<PatFrag>(frag)>; 779 } 780 } 781 782 783 784 // 32-bit atomics. 785 defm : DSAtomicRetPat_mc<DS_WRXCHG_RTN_B32, i32, "atomic_swap_local">; 786 defm : DSAtomicRetPat_mc<DS_ADD_RTN_U32, i32, "atomic_load_add_local">; 787 defm : DSAtomicRetPat_mc<DS_SUB_RTN_U32, i32, "atomic_load_sub_local">; 788 defm : DSAtomicRetPat_mc<DS_INC_RTN_U32, i32, "atomic_inc_local">; 789 defm : DSAtomicRetPat_mc<DS_DEC_RTN_U32, i32, "atomic_dec_local">; 790 defm : DSAtomicRetPat_mc<DS_AND_RTN_B32, i32, "atomic_load_and_local">; 791 defm : DSAtomicRetPat_mc<DS_OR_RTN_B32, i32, "atomic_load_or_local">; 792 defm : DSAtomicRetPat_mc<DS_XOR_RTN_B32, i32, "atomic_load_xor_local">; 793 defm : DSAtomicRetPat_mc<DS_MIN_RTN_I32, i32, "atomic_load_min_local">; 794 defm : DSAtomicRetPat_mc<DS_MAX_RTN_I32, i32, "atomic_load_max_local">; 795 defm : DSAtomicRetPat_mc<DS_MIN_RTN_U32, i32, "atomic_load_umin_local">; 796 defm : DSAtomicRetPat_mc<DS_MAX_RTN_U32, i32, "atomic_load_umax_local">; 797 defm : DSAtomicCmpXChg_mc<DS_CMPST_RTN_B32, i32, "atomic_cmp_swap_local">; 798 defm : DSAtomicRetPat_mc<DS_MIN_RTN_F32, f32, "atomic_load_fmin_local">; 799 defm : DSAtomicRetPat_mc<DS_MAX_RTN_F32, f32, "atomic_load_fmax_local">; 800 defm : DSAtomicRetPat_mc<DS_ADD_RTN_F32, f32, "atomic_load_fadd_local">; 801 802 // 64-bit atomics. 803 defm : DSAtomicRetPat_mc<DS_WRXCHG_RTN_B64, i64, "atomic_swap_local">; 804 defm : DSAtomicRetPat_mc<DS_ADD_RTN_U64, i64, "atomic_load_add_local">; 805 defm : DSAtomicRetPat_mc<DS_SUB_RTN_U64, i64, "atomic_load_sub_local">; 806 defm : DSAtomicRetPat_mc<DS_INC_RTN_U64, i64, "atomic_inc_local">; 807 defm : DSAtomicRetPat_mc<DS_DEC_RTN_U64, i64, "atomic_dec_local">; 808 defm : DSAtomicRetPat_mc<DS_AND_RTN_B64, i64, "atomic_load_and_local">; 809 defm : DSAtomicRetPat_mc<DS_OR_RTN_B64, i64, "atomic_load_or_local">; 810 defm : DSAtomicRetPat_mc<DS_XOR_RTN_B64, i64, "atomic_load_xor_local">; 811 defm : DSAtomicRetPat_mc<DS_MIN_RTN_I64, i64, "atomic_load_min_local">; 812 defm : DSAtomicRetPat_mc<DS_MAX_RTN_I64, i64, "atomic_load_max_local">; 813 defm : DSAtomicRetPat_mc<DS_MIN_RTN_U64, i64, "atomic_load_umin_local">; 814 defm : DSAtomicRetPat_mc<DS_MAX_RTN_U64, i64, "atomic_load_umax_local">; 815 816 defm : DSAtomicCmpXChg_mc<DS_CMPST_RTN_B64, i64, "atomic_cmp_swap_local">; 817 818 //===----------------------------------------------------------------------===// 819 // Real instructions 820 //===----------------------------------------------------------------------===// 821 822 //===----------------------------------------------------------------------===// 823 // SIInstructions.td 824 //===----------------------------------------------------------------------===// 825 826 class DS_Real_si <bits<8> op, DS_Pseudo ds> : 827 DS_Real <ds>, 828 SIMCInstr <ds.Mnemonic, SIEncodingFamily.SI> { 829 let AssemblerPredicates=[isSICI]; 830 let DecoderNamespace="SICI"; 831 832 // encoding 833 let Inst{7-0} = !if(ds.has_offset0, offset0, 0); 834 let Inst{15-8} = !if(ds.has_offset1, offset1, 0); 835 let Inst{17} = !if(ds.has_gds, gds, ds.gdsValue); 836 let Inst{25-18} = op; 837 let Inst{31-26} = 0x36; // ds prefix 838 let Inst{39-32} = !if(ds.has_addr, addr, 0); 839 let Inst{47-40} = !if(ds.has_data0, data0, 0); 840 let Inst{55-48} = !if(ds.has_data1, data1, 0); 841 let Inst{63-56} = !if(ds.has_vdst, vdst, 0); 842 } 843 844 def DS_ADD_U32_si : DS_Real_si<0x0, DS_ADD_U32>; 845 def DS_SUB_U32_si : DS_Real_si<0x1, DS_SUB_U32>; 846 def DS_RSUB_U32_si : DS_Real_si<0x2, DS_RSUB_U32>; 847 def DS_INC_U32_si : DS_Real_si<0x3, DS_INC_U32>; 848 def DS_DEC_U32_si : DS_Real_si<0x4, DS_DEC_U32>; 849 def DS_MIN_I32_si : DS_Real_si<0x5, DS_MIN_I32>; 850 def DS_MAX_I32_si : DS_Real_si<0x6, DS_MAX_I32>; 851 def DS_MIN_U32_si : DS_Real_si<0x7, DS_MIN_U32>; 852 def DS_MAX_U32_si : DS_Real_si<0x8, DS_MAX_U32>; 853 def DS_AND_B32_si : DS_Real_si<0x9, DS_AND_B32>; 854 def DS_OR_B32_si : DS_Real_si<0xa, DS_OR_B32>; 855 def DS_XOR_B32_si : DS_Real_si<0xb, DS_XOR_B32>; 856 def DS_MSKOR_B32_si : DS_Real_si<0xc, DS_MSKOR_B32>; 857 def DS_WRITE_B32_si : DS_Real_si<0xd, DS_WRITE_B32>; 858 def DS_WRITE2_B32_si : DS_Real_si<0xe, DS_WRITE2_B32>; 859 def DS_WRITE2ST64_B32_si : DS_Real_si<0xf, DS_WRITE2ST64_B32>; 860 def DS_CMPST_B32_si : DS_Real_si<0x10, DS_CMPST_B32>; 861 def DS_CMPST_F32_si : DS_Real_si<0x11, DS_CMPST_F32>; 862 def DS_MIN_F32_si : DS_Real_si<0x12, DS_MIN_F32>; 863 def DS_MAX_F32_si : DS_Real_si<0x13, DS_MAX_F32>; 864 def DS_NOP_si : DS_Real_si<0x14, DS_NOP>; 865 def DS_GWS_INIT_si : DS_Real_si<0x19, DS_GWS_INIT>; 866 def DS_GWS_SEMA_V_si : DS_Real_si<0x1a, DS_GWS_SEMA_V>; 867 def DS_GWS_SEMA_BR_si : DS_Real_si<0x1b, DS_GWS_SEMA_BR>; 868 def DS_GWS_SEMA_P_si : DS_Real_si<0x1c, DS_GWS_SEMA_P>; 869 def DS_GWS_BARRIER_si : DS_Real_si<0x1d, DS_GWS_BARRIER>; 870 def DS_WRITE_B8_si : DS_Real_si<0x1e, DS_WRITE_B8>; 871 def DS_WRITE_B16_si : DS_Real_si<0x1f, DS_WRITE_B16>; 872 def DS_ADD_RTN_U32_si : DS_Real_si<0x20, DS_ADD_RTN_U32>; 873 def DS_SUB_RTN_U32_si : DS_Real_si<0x21, DS_SUB_RTN_U32>; 874 def DS_RSUB_RTN_U32_si : DS_Real_si<0x22, DS_RSUB_RTN_U32>; 875 def DS_INC_RTN_U32_si : DS_Real_si<0x23, DS_INC_RTN_U32>; 876 def DS_DEC_RTN_U32_si : DS_Real_si<0x24, DS_DEC_RTN_U32>; 877 def DS_MIN_RTN_I32_si : DS_Real_si<0x25, DS_MIN_RTN_I32>; 878 def DS_MAX_RTN_I32_si : DS_Real_si<0x26, DS_MAX_RTN_I32>; 879 def DS_MIN_RTN_U32_si : DS_Real_si<0x27, DS_MIN_RTN_U32>; 880 def DS_MAX_RTN_U32_si : DS_Real_si<0x28, DS_MAX_RTN_U32>; 881 def DS_AND_RTN_B32_si : DS_Real_si<0x29, DS_AND_RTN_B32>; 882 def DS_OR_RTN_B32_si : DS_Real_si<0x2a, DS_OR_RTN_B32>; 883 def DS_XOR_RTN_B32_si : DS_Real_si<0x2b, DS_XOR_RTN_B32>; 884 def DS_MSKOR_RTN_B32_si : DS_Real_si<0x2c, DS_MSKOR_RTN_B32>; 885 def DS_WRXCHG_RTN_B32_si : DS_Real_si<0x2d, DS_WRXCHG_RTN_B32>; 886 def DS_WRXCHG2_RTN_B32_si : DS_Real_si<0x2e, DS_WRXCHG2_RTN_B32>; 887 def DS_WRXCHG2ST64_RTN_B32_si : DS_Real_si<0x2f, DS_WRXCHG2ST64_RTN_B32>; 888 def DS_CMPST_RTN_B32_si : DS_Real_si<0x30, DS_CMPST_RTN_B32>; 889 def DS_CMPST_RTN_F32_si : DS_Real_si<0x31, DS_CMPST_RTN_F32>; 890 def DS_MIN_RTN_F32_si : DS_Real_si<0x32, DS_MIN_RTN_F32>; 891 def DS_MAX_RTN_F32_si : DS_Real_si<0x33, DS_MAX_RTN_F32>; 892 893 // These instruction are CI/VI only 894 def DS_WRAP_RTN_B32_si : DS_Real_si<0x34, DS_WRAP_RTN_B32>; 895 def DS_CONDXCHG32_RTN_B64_si : DS_Real_si<0x7e, DS_CONDXCHG32_RTN_B64>; 896 def DS_GWS_SEMA_RELEASE_ALL_si : DS_Real_si<0x18, DS_GWS_SEMA_RELEASE_ALL>; 897 898 def DS_SWIZZLE_B32_si : DS_Real_si<0x35, DS_SWIZZLE_B32>; 899 def DS_READ_B32_si : DS_Real_si<0x36, DS_READ_B32>; 900 def DS_READ2_B32_si : DS_Real_si<0x37, DS_READ2_B32>; 901 def DS_READ2ST64_B32_si : DS_Real_si<0x38, DS_READ2ST64_B32>; 902 def DS_READ_I8_si : DS_Real_si<0x39, DS_READ_I8>; 903 def DS_READ_U8_si : DS_Real_si<0x3a, DS_READ_U8>; 904 def DS_READ_I16_si : DS_Real_si<0x3b, DS_READ_I16>; 905 def DS_READ_U16_si : DS_Real_si<0x3c, DS_READ_U16>; 906 def DS_CONSUME_si : DS_Real_si<0x3d, DS_CONSUME>; 907 def DS_APPEND_si : DS_Real_si<0x3e, DS_APPEND>; 908 def DS_ORDERED_COUNT_si : DS_Real_si<0x3f, DS_ORDERED_COUNT>; 909 def DS_ADD_U64_si : DS_Real_si<0x40, DS_ADD_U64>; 910 def DS_SUB_U64_si : DS_Real_si<0x41, DS_SUB_U64>; 911 def DS_RSUB_U64_si : DS_Real_si<0x42, DS_RSUB_U64>; 912 def DS_INC_U64_si : DS_Real_si<0x43, DS_INC_U64>; 913 def DS_DEC_U64_si : DS_Real_si<0x44, DS_DEC_U64>; 914 def DS_MIN_I64_si : DS_Real_si<0x45, DS_MIN_I64>; 915 def DS_MAX_I64_si : DS_Real_si<0x46, DS_MAX_I64>; 916 def DS_MIN_U64_si : DS_Real_si<0x47, DS_MIN_U64>; 917 def DS_MAX_U64_si : DS_Real_si<0x48, DS_MAX_U64>; 918 def DS_AND_B64_si : DS_Real_si<0x49, DS_AND_B64>; 919 def DS_OR_B64_si : DS_Real_si<0x4a, DS_OR_B64>; 920 def DS_XOR_B64_si : DS_Real_si<0x4b, DS_XOR_B64>; 921 def DS_MSKOR_B64_si : DS_Real_si<0x4c, DS_MSKOR_B64>; 922 def DS_WRITE_B64_si : DS_Real_si<0x4d, DS_WRITE_B64>; 923 def DS_WRITE2_B64_si : DS_Real_si<0x4E, DS_WRITE2_B64>; 924 def DS_WRITE2ST64_B64_si : DS_Real_si<0x4f, DS_WRITE2ST64_B64>; 925 def DS_CMPST_B64_si : DS_Real_si<0x50, DS_CMPST_B64>; 926 def DS_CMPST_F64_si : DS_Real_si<0x51, DS_CMPST_F64>; 927 def DS_MIN_F64_si : DS_Real_si<0x52, DS_MIN_F64>; 928 def DS_MAX_F64_si : DS_Real_si<0x53, DS_MAX_F64>; 929 930 def DS_ADD_RTN_U64_si : DS_Real_si<0x60, DS_ADD_RTN_U64>; 931 def DS_SUB_RTN_U64_si : DS_Real_si<0x61, DS_SUB_RTN_U64>; 932 def DS_RSUB_RTN_U64_si : DS_Real_si<0x62, DS_RSUB_RTN_U64>; 933 def DS_INC_RTN_U64_si : DS_Real_si<0x63, DS_INC_RTN_U64>; 934 def DS_DEC_RTN_U64_si : DS_Real_si<0x64, DS_DEC_RTN_U64>; 935 def DS_MIN_RTN_I64_si : DS_Real_si<0x65, DS_MIN_RTN_I64>; 936 def DS_MAX_RTN_I64_si : DS_Real_si<0x66, DS_MAX_RTN_I64>; 937 def DS_MIN_RTN_U64_si : DS_Real_si<0x67, DS_MIN_RTN_U64>; 938 def DS_MAX_RTN_U64_si : DS_Real_si<0x68, DS_MAX_RTN_U64>; 939 def DS_AND_RTN_B64_si : DS_Real_si<0x69, DS_AND_RTN_B64>; 940 def DS_OR_RTN_B64_si : DS_Real_si<0x6a, DS_OR_RTN_B64>; 941 def DS_XOR_RTN_B64_si : DS_Real_si<0x6b, DS_XOR_RTN_B64>; 942 def DS_MSKOR_RTN_B64_si : DS_Real_si<0x6c, DS_MSKOR_RTN_B64>; 943 def DS_WRXCHG_RTN_B64_si : DS_Real_si<0x6d, DS_WRXCHG_RTN_B64>; 944 def DS_WRXCHG2_RTN_B64_si : DS_Real_si<0x6e, DS_WRXCHG2_RTN_B64>; 945 def DS_WRXCHG2ST64_RTN_B64_si : DS_Real_si<0x6f, DS_WRXCHG2ST64_RTN_B64>; 946 def DS_CMPST_RTN_B64_si : DS_Real_si<0x70, DS_CMPST_RTN_B64>; 947 def DS_CMPST_RTN_F64_si : DS_Real_si<0x71, DS_CMPST_RTN_F64>; 948 def DS_MIN_RTN_F64_si : DS_Real_si<0x72, DS_MIN_RTN_F64>; 949 def DS_MAX_RTN_F64_si : DS_Real_si<0x73, DS_MAX_RTN_F64>; 950 951 def DS_READ_B64_si : DS_Real_si<0x76, DS_READ_B64>; 952 def DS_READ2_B64_si : DS_Real_si<0x77, DS_READ2_B64>; 953 def DS_READ2ST64_B64_si : DS_Real_si<0x78, DS_READ2ST64_B64>; 954 955 def DS_ADD_SRC2_U32_si : DS_Real_si<0x80, DS_ADD_SRC2_U32>; 956 def DS_SUB_SRC2_U32_si : DS_Real_si<0x81, DS_SUB_SRC2_U32>; 957 def DS_RSUB_SRC2_U32_si : DS_Real_si<0x82, DS_RSUB_SRC2_U32>; 958 def DS_INC_SRC2_U32_si : DS_Real_si<0x83, DS_INC_SRC2_U32>; 959 def DS_DEC_SRC2_U32_si : DS_Real_si<0x84, DS_DEC_SRC2_U32>; 960 def DS_MIN_SRC2_I32_si : DS_Real_si<0x85, DS_MIN_SRC2_I32>; 961 def DS_MAX_SRC2_I32_si : DS_Real_si<0x86, DS_MAX_SRC2_I32>; 962 def DS_MIN_SRC2_U32_si : DS_Real_si<0x87, DS_MIN_SRC2_U32>; 963 def DS_MAX_SRC2_U32_si : DS_Real_si<0x88, DS_MAX_SRC2_U32>; 964 def DS_AND_SRC2_B32_si : DS_Real_si<0x89, DS_AND_SRC2_B32>; 965 def DS_OR_SRC2_B32_si : DS_Real_si<0x8a, DS_OR_SRC2_B32>; 966 def DS_XOR_SRC2_B32_si : DS_Real_si<0x8b, DS_XOR_SRC2_B32>; 967 def DS_WRITE_SRC2_B32_si : DS_Real_si<0x8d, DS_WRITE_SRC2_B32>; 968 969 def DS_MIN_SRC2_F32_si : DS_Real_si<0x92, DS_MIN_SRC2_F32>; 970 def DS_MAX_SRC2_F32_si : DS_Real_si<0x93, DS_MAX_SRC2_F32>; 971 972 def DS_ADD_SRC2_U64_si : DS_Real_si<0xc0, DS_ADD_SRC2_U64>; 973 def DS_SUB_SRC2_U64_si : DS_Real_si<0xc1, DS_SUB_SRC2_U64>; 974 def DS_RSUB_SRC2_U64_si : DS_Real_si<0xc2, DS_RSUB_SRC2_U64>; 975 def DS_INC_SRC2_U64_si : DS_Real_si<0xc3, DS_INC_SRC2_U64>; 976 def DS_DEC_SRC2_U64_si : DS_Real_si<0xc4, DS_DEC_SRC2_U64>; 977 def DS_MIN_SRC2_I64_si : DS_Real_si<0xc5, DS_MIN_SRC2_I64>; 978 def DS_MAX_SRC2_I64_si : DS_Real_si<0xc6, DS_MAX_SRC2_I64>; 979 def DS_MIN_SRC2_U64_si : DS_Real_si<0xc7, DS_MIN_SRC2_U64>; 980 def DS_MAX_SRC2_U64_si : DS_Real_si<0xc8, DS_MAX_SRC2_U64>; 981 def DS_AND_SRC2_B64_si : DS_Real_si<0xc9, DS_AND_SRC2_B64>; 982 def DS_OR_SRC2_B64_si : DS_Real_si<0xca, DS_OR_SRC2_B64>; 983 def DS_XOR_SRC2_B64_si : DS_Real_si<0xcb, DS_XOR_SRC2_B64>; 984 def DS_WRITE_SRC2_B64_si : DS_Real_si<0xcd, DS_WRITE_SRC2_B64>; 985 986 def DS_MIN_SRC2_F64_si : DS_Real_si<0xd2, DS_MIN_SRC2_F64>; 987 def DS_MAX_SRC2_F64_si : DS_Real_si<0xd3, DS_MAX_SRC2_F64>; 988 def DS_WRITE_B96_si : DS_Real_si<0xde, DS_WRITE_B96>; 989 def DS_WRITE_B128_si : DS_Real_si<0xdf, DS_WRITE_B128>; 990 def DS_READ_B96_si : DS_Real_si<0xfe, DS_READ_B96>; 991 def DS_READ_B128_si : DS_Real_si<0xff, DS_READ_B128>; 992 993 //===----------------------------------------------------------------------===// 994 // VIInstructions.td 995 //===----------------------------------------------------------------------===// 996 997 class DS_Real_vi <bits<8> op, DS_Pseudo ds> : 998 DS_Real <ds>, 999 SIMCInstr <ds.Mnemonic, SIEncodingFamily.VI> { 1000 let AssemblerPredicates = [isVI]; 1001 let DecoderNamespace="VI"; 1002 1003 // encoding 1004 let Inst{7-0} = !if(ds.has_offset0, offset0, 0); 1005 let Inst{15-8} = !if(ds.has_offset1, offset1, 0); 1006 let Inst{16} = !if(ds.has_gds, gds, ds.gdsValue); 1007 let Inst{24-17} = op; 1008 let Inst{31-26} = 0x36; // ds prefix 1009 let Inst{39-32} = !if(ds.has_addr, addr, 0); 1010 let Inst{47-40} = !if(ds.has_data0, data0, 0); 1011 let Inst{55-48} = !if(ds.has_data1, data1, 0); 1012 let Inst{63-56} = !if(ds.has_vdst, vdst, 0); 1013 } 1014 1015 def DS_ADD_U32_vi : DS_Real_vi<0x0, DS_ADD_U32>; 1016 def DS_SUB_U32_vi : DS_Real_vi<0x1, DS_SUB_U32>; 1017 def DS_RSUB_U32_vi : DS_Real_vi<0x2, DS_RSUB_U32>; 1018 def DS_INC_U32_vi : DS_Real_vi<0x3, DS_INC_U32>; 1019 def DS_DEC_U32_vi : DS_Real_vi<0x4, DS_DEC_U32>; 1020 def DS_MIN_I32_vi : DS_Real_vi<0x5, DS_MIN_I32>; 1021 def DS_MAX_I32_vi : DS_Real_vi<0x6, DS_MAX_I32>; 1022 def DS_MIN_U32_vi : DS_Real_vi<0x7, DS_MIN_U32>; 1023 def DS_MAX_U32_vi : DS_Real_vi<0x8, DS_MAX_U32>; 1024 def DS_AND_B32_vi : DS_Real_vi<0x9, DS_AND_B32>; 1025 def DS_OR_B32_vi : DS_Real_vi<0xa, DS_OR_B32>; 1026 def DS_XOR_B32_vi : DS_Real_vi<0xb, DS_XOR_B32>; 1027 def DS_MSKOR_B32_vi : DS_Real_vi<0xc, DS_MSKOR_B32>; 1028 def DS_WRITE_B32_vi : DS_Real_vi<0xd, DS_WRITE_B32>; 1029 def DS_WRITE2_B32_vi : DS_Real_vi<0xe, DS_WRITE2_B32>; 1030 def DS_WRITE2ST64_B32_vi : DS_Real_vi<0xf, DS_WRITE2ST64_B32>; 1031 def DS_CMPST_B32_vi : DS_Real_vi<0x10, DS_CMPST_B32>; 1032 def DS_CMPST_F32_vi : DS_Real_vi<0x11, DS_CMPST_F32>; 1033 def DS_MIN_F32_vi : DS_Real_vi<0x12, DS_MIN_F32>; 1034 def DS_MAX_F32_vi : DS_Real_vi<0x13, DS_MAX_F32>; 1035 def DS_NOP_vi : DS_Real_vi<0x14, DS_NOP>; 1036 def DS_ADD_F32_vi : DS_Real_vi<0x15, DS_ADD_F32>; 1037 def DS_GWS_INIT_vi : DS_Real_vi<0x99, DS_GWS_INIT>; 1038 def DS_GWS_SEMA_V_vi : DS_Real_vi<0x9a, DS_GWS_SEMA_V>; 1039 def DS_GWS_SEMA_BR_vi : DS_Real_vi<0x9b, DS_GWS_SEMA_BR>; 1040 def DS_GWS_SEMA_P_vi : DS_Real_vi<0x9c, DS_GWS_SEMA_P>; 1041 def DS_GWS_BARRIER_vi : DS_Real_vi<0x9d, DS_GWS_BARRIER>; 1042 def DS_WRITE_ADDTID_B32_vi : DS_Real_vi<0x1d, DS_WRITE_ADDTID_B32>; 1043 def DS_WRITE_B8_vi : DS_Real_vi<0x1e, DS_WRITE_B8>; 1044 def DS_WRITE_B16_vi : DS_Real_vi<0x1f, DS_WRITE_B16>; 1045 def DS_ADD_RTN_U32_vi : DS_Real_vi<0x20, DS_ADD_RTN_U32>; 1046 def DS_SUB_RTN_U32_vi : DS_Real_vi<0x21, DS_SUB_RTN_U32>; 1047 def DS_RSUB_RTN_U32_vi : DS_Real_vi<0x22, DS_RSUB_RTN_U32>; 1048 def DS_INC_RTN_U32_vi : DS_Real_vi<0x23, DS_INC_RTN_U32>; 1049 def DS_DEC_RTN_U32_vi : DS_Real_vi<0x24, DS_DEC_RTN_U32>; 1050 def DS_MIN_RTN_I32_vi : DS_Real_vi<0x25, DS_MIN_RTN_I32>; 1051 def DS_MAX_RTN_I32_vi : DS_Real_vi<0x26, DS_MAX_RTN_I32>; 1052 def DS_MIN_RTN_U32_vi : DS_Real_vi<0x27, DS_MIN_RTN_U32>; 1053 def DS_MAX_RTN_U32_vi : DS_Real_vi<0x28, DS_MAX_RTN_U32>; 1054 def DS_AND_RTN_B32_vi : DS_Real_vi<0x29, DS_AND_RTN_B32>; 1055 def DS_OR_RTN_B32_vi : DS_Real_vi<0x2a, DS_OR_RTN_B32>; 1056 def DS_XOR_RTN_B32_vi : DS_Real_vi<0x2b, DS_XOR_RTN_B32>; 1057 def DS_MSKOR_RTN_B32_vi : DS_Real_vi<0x2c, DS_MSKOR_RTN_B32>; 1058 def DS_WRXCHG_RTN_B32_vi : DS_Real_vi<0x2d, DS_WRXCHG_RTN_B32>; 1059 def DS_WRXCHG2_RTN_B32_vi : DS_Real_vi<0x2e, DS_WRXCHG2_RTN_B32>; 1060 def DS_WRXCHG2ST64_RTN_B32_vi : DS_Real_vi<0x2f, DS_WRXCHG2ST64_RTN_B32>; 1061 def DS_CMPST_RTN_B32_vi : DS_Real_vi<0x30, DS_CMPST_RTN_B32>; 1062 def DS_CMPST_RTN_F32_vi : DS_Real_vi<0x31, DS_CMPST_RTN_F32>; 1063 def DS_MIN_RTN_F32_vi : DS_Real_vi<0x32, DS_MIN_RTN_F32>; 1064 def DS_MAX_RTN_F32_vi : DS_Real_vi<0x33, DS_MAX_RTN_F32>; 1065 def DS_WRAP_RTN_B32_vi : DS_Real_vi<0x34, DS_WRAP_RTN_B32>; 1066 def DS_ADD_RTN_F32_vi : DS_Real_vi<0x35, DS_ADD_RTN_F32>; 1067 def DS_READ_B32_vi : DS_Real_vi<0x36, DS_READ_B32>; 1068 def DS_READ2_B32_vi : DS_Real_vi<0x37, DS_READ2_B32>; 1069 def DS_READ2ST64_B32_vi : DS_Real_vi<0x38, DS_READ2ST64_B32>; 1070 def DS_READ_I8_vi : DS_Real_vi<0x39, DS_READ_I8>; 1071 def DS_READ_U8_vi : DS_Real_vi<0x3a, DS_READ_U8>; 1072 def DS_READ_I16_vi : DS_Real_vi<0x3b, DS_READ_I16>; 1073 def DS_READ_U16_vi : DS_Real_vi<0x3c, DS_READ_U16>; 1074 def DS_READ_ADDTID_B32_vi : DS_Real_vi<0xb6, DS_READ_ADDTID_B32>; 1075 def DS_CONSUME_vi : DS_Real_vi<0xbd, DS_CONSUME>; 1076 def DS_APPEND_vi : DS_Real_vi<0xbe, DS_APPEND>; 1077 def DS_ORDERED_COUNT_vi : DS_Real_vi<0xbf, DS_ORDERED_COUNT>; 1078 def DS_SWIZZLE_B32_vi : DS_Real_vi<0x3d, DS_SWIZZLE_B32>; 1079 def DS_PERMUTE_B32_vi : DS_Real_vi<0x3e, DS_PERMUTE_B32>; 1080 def DS_BPERMUTE_B32_vi : DS_Real_vi<0x3f, DS_BPERMUTE_B32>; 1081 1082 def DS_ADD_U64_vi : DS_Real_vi<0x40, DS_ADD_U64>; 1083 def DS_SUB_U64_vi : DS_Real_vi<0x41, DS_SUB_U64>; 1084 def DS_RSUB_U64_vi : DS_Real_vi<0x42, DS_RSUB_U64>; 1085 def DS_INC_U64_vi : DS_Real_vi<0x43, DS_INC_U64>; 1086 def DS_DEC_U64_vi : DS_Real_vi<0x44, DS_DEC_U64>; 1087 def DS_MIN_I64_vi : DS_Real_vi<0x45, DS_MIN_I64>; 1088 def DS_MAX_I64_vi : DS_Real_vi<0x46, DS_MAX_I64>; 1089 def DS_MIN_U64_vi : DS_Real_vi<0x47, DS_MIN_U64>; 1090 def DS_MAX_U64_vi : DS_Real_vi<0x48, DS_MAX_U64>; 1091 def DS_AND_B64_vi : DS_Real_vi<0x49, DS_AND_B64>; 1092 def DS_OR_B64_vi : DS_Real_vi<0x4a, DS_OR_B64>; 1093 def DS_XOR_B64_vi : DS_Real_vi<0x4b, DS_XOR_B64>; 1094 def DS_MSKOR_B64_vi : DS_Real_vi<0x4c, DS_MSKOR_B64>; 1095 def DS_WRITE_B64_vi : DS_Real_vi<0x4d, DS_WRITE_B64>; 1096 def DS_WRITE2_B64_vi : DS_Real_vi<0x4E, DS_WRITE2_B64>; 1097 def DS_WRITE2ST64_B64_vi : DS_Real_vi<0x4f, DS_WRITE2ST64_B64>; 1098 def DS_CMPST_B64_vi : DS_Real_vi<0x50, DS_CMPST_B64>; 1099 def DS_CMPST_F64_vi : DS_Real_vi<0x51, DS_CMPST_F64>; 1100 def DS_MIN_F64_vi : DS_Real_vi<0x52, DS_MIN_F64>; 1101 def DS_MAX_F64_vi : DS_Real_vi<0x53, DS_MAX_F64>; 1102 1103 def DS_WRITE_B8_D16_HI_vi : DS_Real_vi<0x54, DS_WRITE_B8_D16_HI>; 1104 def DS_WRITE_B16_D16_HI_vi : DS_Real_vi<0x55, DS_WRITE_B16_D16_HI>; 1105 1106 def DS_READ_U8_D16_vi : DS_Real_vi<0x56, DS_READ_U8_D16>; 1107 def DS_READ_U8_D16_HI_vi : DS_Real_vi<0x57, DS_READ_U8_D16_HI>; 1108 def DS_READ_I8_D16_vi : DS_Real_vi<0x58, DS_READ_I8_D16>; 1109 def DS_READ_I8_D16_HI_vi : DS_Real_vi<0x59, DS_READ_I8_D16_HI>; 1110 def DS_READ_U16_D16_vi : DS_Real_vi<0x5a, DS_READ_U16_D16>; 1111 def DS_READ_U16_D16_HI_vi : DS_Real_vi<0x5b, DS_READ_U16_D16_HI>; 1112 1113 def DS_ADD_RTN_U64_vi : DS_Real_vi<0x60, DS_ADD_RTN_U64>; 1114 def DS_SUB_RTN_U64_vi : DS_Real_vi<0x61, DS_SUB_RTN_U64>; 1115 def DS_RSUB_RTN_U64_vi : DS_Real_vi<0x62, DS_RSUB_RTN_U64>; 1116 def DS_INC_RTN_U64_vi : DS_Real_vi<0x63, DS_INC_RTN_U64>; 1117 def DS_DEC_RTN_U64_vi : DS_Real_vi<0x64, DS_DEC_RTN_U64>; 1118 def DS_MIN_RTN_I64_vi : DS_Real_vi<0x65, DS_MIN_RTN_I64>; 1119 def DS_MAX_RTN_I64_vi : DS_Real_vi<0x66, DS_MAX_RTN_I64>; 1120 def DS_MIN_RTN_U64_vi : DS_Real_vi<0x67, DS_MIN_RTN_U64>; 1121 def DS_MAX_RTN_U64_vi : DS_Real_vi<0x68, DS_MAX_RTN_U64>; 1122 def DS_AND_RTN_B64_vi : DS_Real_vi<0x69, DS_AND_RTN_B64>; 1123 def DS_OR_RTN_B64_vi : DS_Real_vi<0x6a, DS_OR_RTN_B64>; 1124 def DS_XOR_RTN_B64_vi : DS_Real_vi<0x6b, DS_XOR_RTN_B64>; 1125 def DS_MSKOR_RTN_B64_vi : DS_Real_vi<0x6c, DS_MSKOR_RTN_B64>; 1126 def DS_WRXCHG_RTN_B64_vi : DS_Real_vi<0x6d, DS_WRXCHG_RTN_B64>; 1127 def DS_WRXCHG2_RTN_B64_vi : DS_Real_vi<0x6e, DS_WRXCHG2_RTN_B64>; 1128 def DS_WRXCHG2ST64_RTN_B64_vi : DS_Real_vi<0x6f, DS_WRXCHG2ST64_RTN_B64>; 1129 def DS_CONDXCHG32_RTN_B64_vi : DS_Real_vi<0x7e, DS_CONDXCHG32_RTN_B64>; 1130 def DS_GWS_SEMA_RELEASE_ALL_vi : DS_Real_vi<0x98, DS_GWS_SEMA_RELEASE_ALL>; 1131 def DS_CMPST_RTN_B64_vi : DS_Real_vi<0x70, DS_CMPST_RTN_B64>; 1132 def DS_CMPST_RTN_F64_vi : DS_Real_vi<0x71, DS_CMPST_RTN_F64>; 1133 def DS_MIN_RTN_F64_vi : DS_Real_vi<0x72, DS_MIN_RTN_F64>; 1134 def DS_MAX_RTN_F64_vi : DS_Real_vi<0x73, DS_MAX_RTN_F64>; 1135 1136 def DS_READ_B64_vi : DS_Real_vi<0x76, DS_READ_B64>; 1137 def DS_READ2_B64_vi : DS_Real_vi<0x77, DS_READ2_B64>; 1138 def DS_READ2ST64_B64_vi : DS_Real_vi<0x78, DS_READ2ST64_B64>; 1139 1140 def DS_ADD_SRC2_U32_vi : DS_Real_vi<0x80, DS_ADD_SRC2_U32>; 1141 def DS_SUB_SRC2_U32_vi : DS_Real_vi<0x81, DS_SUB_SRC2_U32>; 1142 def DS_RSUB_SRC2_U32_vi : DS_Real_vi<0x82, DS_RSUB_SRC2_U32>; 1143 def DS_INC_SRC2_U32_vi : DS_Real_vi<0x83, DS_INC_SRC2_U32>; 1144 def DS_DEC_SRC2_U32_vi : DS_Real_vi<0x84, DS_DEC_SRC2_U32>; 1145 def DS_MIN_SRC2_I32_vi : DS_Real_vi<0x85, DS_MIN_SRC2_I32>; 1146 def DS_MAX_SRC2_I32_vi : DS_Real_vi<0x86, DS_MAX_SRC2_I32>; 1147 def DS_MIN_SRC2_U32_vi : DS_Real_vi<0x87, DS_MIN_SRC2_U32>; 1148 def DS_MAX_SRC2_U32_vi : DS_Real_vi<0x88, DS_MAX_SRC2_U32>; 1149 def DS_AND_SRC2_B32_vi : DS_Real_vi<0x89, DS_AND_SRC2_B32>; 1150 def DS_OR_SRC2_B32_vi : DS_Real_vi<0x8a, DS_OR_SRC2_B32>; 1151 def DS_XOR_SRC2_B32_vi : DS_Real_vi<0x8b, DS_XOR_SRC2_B32>; 1152 def DS_WRITE_SRC2_B32_vi : DS_Real_vi<0x8d, DS_WRITE_SRC2_B32>; 1153 def DS_MIN_SRC2_F32_vi : DS_Real_vi<0x92, DS_MIN_SRC2_F32>; 1154 def DS_MAX_SRC2_F32_vi : DS_Real_vi<0x93, DS_MAX_SRC2_F32>; 1155 def DS_ADD_SRC2_F32_vi : DS_Real_vi<0x95, DS_ADD_SRC2_F32>; 1156 def DS_ADD_SRC2_U64_vi : DS_Real_vi<0xc0, DS_ADD_SRC2_U64>; 1157 def DS_SUB_SRC2_U64_vi : DS_Real_vi<0xc1, DS_SUB_SRC2_U64>; 1158 def DS_RSUB_SRC2_U64_vi : DS_Real_vi<0xc2, DS_RSUB_SRC2_U64>; 1159 def DS_INC_SRC2_U64_vi : DS_Real_vi<0xc3, DS_INC_SRC2_U64>; 1160 def DS_DEC_SRC2_U64_vi : DS_Real_vi<0xc4, DS_DEC_SRC2_U64>; 1161 def DS_MIN_SRC2_I64_vi : DS_Real_vi<0xc5, DS_MIN_SRC2_I64>; 1162 def DS_MAX_SRC2_I64_vi : DS_Real_vi<0xc6, DS_MAX_SRC2_I64>; 1163 def DS_MIN_SRC2_U64_vi : DS_Real_vi<0xc7, DS_MIN_SRC2_U64>; 1164 def DS_MAX_SRC2_U64_vi : DS_Real_vi<0xc8, DS_MAX_SRC2_U64>; 1165 def DS_AND_SRC2_B64_vi : DS_Real_vi<0xc9, DS_AND_SRC2_B64>; 1166 def DS_OR_SRC2_B64_vi : DS_Real_vi<0xca, DS_OR_SRC2_B64>; 1167 def DS_XOR_SRC2_B64_vi : DS_Real_vi<0xcb, DS_XOR_SRC2_B64>; 1168 def DS_WRITE_SRC2_B64_vi : DS_Real_vi<0xcd, DS_WRITE_SRC2_B64>; 1169 def DS_MIN_SRC2_F64_vi : DS_Real_vi<0xd2, DS_MIN_SRC2_F64>; 1170 def DS_MAX_SRC2_F64_vi : DS_Real_vi<0xd3, DS_MAX_SRC2_F64>; 1171 def DS_WRITE_B96_vi : DS_Real_vi<0xde, DS_WRITE_B96>; 1172 def DS_WRITE_B128_vi : DS_Real_vi<0xdf, DS_WRITE_B128>; 1173 def DS_READ_B96_vi : DS_Real_vi<0xfe, DS_READ_B96>; 1174 def DS_READ_B128_vi : DS_Real_vi<0xff, DS_READ_B128>; 1175