1//===-- SOPInstructions.td - SOP Instruction Definitions ------------------===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8 9def GPRIdxModeMatchClass : AsmOperandClass { 10 let Name = "GPRIdxMode"; 11 let PredicateMethod = "isGPRIdxMode"; 12 let ParserMethod = "parseGPRIdxMode"; 13 let RenderMethod = "addImmOperands"; 14} 15 16def GPRIdxMode : Operand<i32> { 17 let PrintMethod = "printVGPRIndexMode"; 18 let ParserMatchClass = GPRIdxModeMatchClass; 19 let OperandType = "OPERAND_IMMEDIATE"; 20} 21 22class SOP_Pseudo<string opName, dag outs, dag ins, string asmOps, 23 list<dag> pattern=[]> : 24 InstSI<outs, ins, "", pattern>, 25 SIMCInstr<opName, SIEncodingFamily.NONE> { 26 27 let isPseudo = 1; 28 let isCodeGenOnly = 1; 29 30 string Mnemonic = opName; 31 string AsmOperands = asmOps; 32 33 bits<1> has_sdst = 0; 34} 35 36//===----------------------------------------------------------------------===// 37// SOP1 Instructions 38//===----------------------------------------------------------------------===// 39 40class SOP1_Pseudo <string opName, dag outs, dag ins, 41 string asmOps, list<dag> pattern=[]> : 42 SOP_Pseudo<opName, outs, ins, asmOps, pattern> { 43 44 let mayLoad = 0; 45 let mayStore = 0; 46 let hasSideEffects = 0; 47 let SALU = 1; 48 let SOP1 = 1; 49 let SchedRW = [WriteSALU]; 50 let Size = 4; 51 let UseNamedOperandTable = 1; 52 53 bits<1> has_src0 = 1; 54 bits<1> has_sdst = 1; 55} 56 57class SOP1_Real<bits<8> op, SOP1_Pseudo ps> : 58 InstSI <ps.OutOperandList, ps.InOperandList, 59 ps.Mnemonic # " " # ps.AsmOperands, []>, 60 Enc32 { 61 62 let isPseudo = 0; 63 let isCodeGenOnly = 0; 64 let Size = 4; 65 66 // copy relevant pseudo op flags 67 let SubtargetPredicate = ps.SubtargetPredicate; 68 let AsmMatchConverter = ps.AsmMatchConverter; 69 70 // encoding 71 bits<7> sdst; 72 bits<8> src0; 73 74 let Inst{7-0} = !if(ps.has_src0, src0, ?); 75 let Inst{15-8} = op; 76 let Inst{22-16} = !if(ps.has_sdst, sdst, ?); 77 let Inst{31-23} = 0x17d; //encoding; 78} 79 80class SOP1_32 <string opName, list<dag> pattern=[], bit tied_in = 0> : SOP1_Pseudo < 81 opName, (outs SReg_32:$sdst), 82 !if(tied_in, (ins SSrc_b32:$src0, SReg_32:$sdst_in), 83 (ins SSrc_b32:$src0)), 84 "$sdst, $src0", pattern> { 85 let Constraints = !if(tied_in, "$sdst = $sdst_in", ""); 86} 87 88// Only register input allowed. 89class SOP1_32R <string opName, list<dag> pattern=[]> : SOP1_Pseudo < 90 opName, (outs SReg_32:$sdst), (ins SReg_32:$src0), 91 "$sdst, $src0", pattern>; 92 93// 32-bit input, no output. 94class SOP1_0_32 <string opName, list<dag> pattern = []> : SOP1_Pseudo < 95 opName, (outs), (ins SSrc_b32:$src0), 96 "$src0", pattern> { 97 let has_sdst = 0; 98} 99 100// Special case for movreld where sdst is treated as a use operand. 101class SOP1_32_movreld <string opName, list<dag> pattern=[]> : SOP1_Pseudo < 102 opName, (outs), (ins SReg_32:$sdst, SSrc_b32:$src0), 103 "$sdst, $src0", pattern>; 104 105// Special case for movreld where sdst is treated as a use operand. 106class SOP1_64_movreld <string opName, list<dag> pattern=[]> : SOP1_Pseudo < 107 opName, (outs), (ins SReg_64:$sdst, SSrc_b64:$src0), 108 "$sdst, $src0", pattern 109>; 110 111class SOP1_0_32R <string opName, list<dag> pattern = []> : SOP1_Pseudo < 112 opName, (outs), (ins SReg_32:$src0), 113 "$src0", pattern> { 114 let has_sdst = 0; 115} 116 117class SOP1_64 <string opName, list<dag> pattern=[]> : SOP1_Pseudo < 118 opName, (outs SReg_64:$sdst), (ins SSrc_b64:$src0), 119 "$sdst, $src0", pattern 120>; 121 122// Only register input allowed. 123class SOP1_64R <string opName, list<dag> pattern=[]> : SOP1_Pseudo < 124 opName, (outs SReg_64:$sdst), (ins SReg_64:$src0), 125 "$sdst, $src0", pattern 126>; 127 128// 64-bit input, 32-bit output. 129class SOP1_32_64 <string opName, list<dag> pattern=[]> : SOP1_Pseudo < 130 opName, (outs SReg_32:$sdst), (ins SSrc_b64:$src0), 131 "$sdst, $src0", pattern 132>; 133 134// 32-bit input, 64-bit output. 135class SOP1_64_32 <string opName, list<dag> pattern=[], bit tied_in = 0> : SOP1_Pseudo < 136 opName, (outs SReg_64:$sdst), 137 !if(tied_in, (ins SSrc_b32:$src0, SReg_64:$sdst_in), 138 (ins SSrc_b32:$src0)), 139 "$sdst, $src0", pattern> { 140 let Constraints = !if(tied_in, "$sdst = $sdst_in", ""); 141} 142 143// no input, 64-bit output. 144class SOP1_64_0 <string opName, list<dag> pattern=[]> : SOP1_Pseudo < 145 opName, (outs SReg_64:$sdst), (ins), "$sdst", pattern> { 146 let has_src0 = 0; 147} 148 149// 64-bit input, no output 150class SOP1_1 <string opName, RegisterClass rc = SReg_64, list<dag> pattern=[]> : SOP1_Pseudo < 151 opName, (outs), (ins rc:$src0), "$src0", pattern> { 152 let has_sdst = 0; 153} 154 155 156let isMoveImm = 1 in { 157 let isReMaterializable = 1, isAsCheapAsAMove = 1 in { 158 def S_MOV_B32 : SOP1_32 <"s_mov_b32">; 159 def S_MOV_B64 : SOP1_64 <"s_mov_b64">; 160 } // End isRematerializeable = 1 161 162 let Uses = [SCC] in { 163 def S_CMOV_B32 : SOP1_32 <"s_cmov_b32">; 164 def S_CMOV_B64 : SOP1_64 <"s_cmov_b64">; 165 } // End Uses = [SCC] 166} // End isMoveImm = 1 167 168let Defs = [SCC] in { 169 def S_NOT_B32 : SOP1_32 <"s_not_b32", 170 [(set i32:$sdst, (not i32:$src0))] 171 >; 172 173 def S_NOT_B64 : SOP1_64 <"s_not_b64", 174 [(set i64:$sdst, (not i64:$src0))] 175 >; 176 def S_WQM_B32 : SOP1_32 <"s_wqm_b32">; 177 def S_WQM_B64 : SOP1_64 <"s_wqm_b64">; 178} // End Defs = [SCC] 179 180 181let WaveSizePredicate = isWave32 in { 182def : GCNPat < 183 (int_amdgcn_wqm_vote i1:$src0), 184 (S_WQM_B32 SSrc_b32:$src0) 185>; 186} 187 188let WaveSizePredicate = isWave64 in { 189def : GCNPat < 190 (int_amdgcn_wqm_vote i1:$src0), 191 (S_WQM_B64 SSrc_b64:$src0) 192>; 193} 194 195def S_BREV_B32 : SOP1_32 <"s_brev_b32", 196 [(set i32:$sdst, (bitreverse i32:$src0))] 197>; 198def S_BREV_B64 : SOP1_64 <"s_brev_b64">; 199 200let Defs = [SCC] in { 201def S_BCNT0_I32_B32 : SOP1_32 <"s_bcnt0_i32_b32">; 202def S_BCNT0_I32_B64 : SOP1_32_64 <"s_bcnt0_i32_b64">; 203def S_BCNT1_I32_B32 : SOP1_32 <"s_bcnt1_i32_b32", 204 [(set i32:$sdst, (ctpop i32:$src0))] 205>; 206def S_BCNT1_I32_B64 : SOP1_32_64 <"s_bcnt1_i32_b64", 207 [(set i32:$sdst, (ctpop i64:$src0))] 208>; 209} // End Defs = [SCC] 210 211def S_FF0_I32_B32 : SOP1_32 <"s_ff0_i32_b32">; 212def S_FF0_I32_B64 : SOP1_32_64 <"s_ff0_i32_b64">; 213def S_FF1_I32_B64 : SOP1_32_64 <"s_ff1_i32_b64", 214 [(set i32:$sdst, (AMDGPUffbl_b32 i64:$src0))] 215>; 216 217def S_FF1_I32_B32 : SOP1_32 <"s_ff1_i32_b32", 218 [(set i32:$sdst, (AMDGPUffbl_b32 i32:$src0))] 219>; 220 221def S_FLBIT_I32_B32 : SOP1_32 <"s_flbit_i32_b32", 222 [(set i32:$sdst, (AMDGPUffbh_u32 i32:$src0))] 223>; 224 225def S_FLBIT_I32_B64 : SOP1_32_64 <"s_flbit_i32_b64", 226 [(set i32:$sdst, (AMDGPUffbh_u32 i64:$src0))] 227>; 228def S_FLBIT_I32 : SOP1_32 <"s_flbit_i32", 229 [(set i32:$sdst, (AMDGPUffbh_i32 i32:$src0))] 230>; 231def S_FLBIT_I32_I64 : SOP1_32_64 <"s_flbit_i32_i64">; 232def S_SEXT_I32_I8 : SOP1_32 <"s_sext_i32_i8", 233 [(set i32:$sdst, (sext_inreg i32:$src0, i8))] 234>; 235def S_SEXT_I32_I16 : SOP1_32 <"s_sext_i32_i16", 236 [(set i32:$sdst, (sext_inreg i32:$src0, i16))] 237>; 238 239def S_BITSET0_B32 : SOP1_32 <"s_bitset0_b32", [], 1>; 240def S_BITSET0_B64 : SOP1_64_32 <"s_bitset0_b64", [], 1>; 241def S_BITSET1_B32 : SOP1_32 <"s_bitset1_b32", [], 1>; 242def S_BITSET1_B64 : SOP1_64_32 <"s_bitset1_b64", [], 1>; 243def S_GETPC_B64 : SOP1_64_0 <"s_getpc_b64", 244 [(set i64:$sdst, (int_amdgcn_s_getpc))] 245>; 246 247let isTerminator = 1, isBarrier = 1, SchedRW = [WriteBranch] in { 248 249let isBranch = 1, isIndirectBranch = 1 in { 250def S_SETPC_B64 : SOP1_1 <"s_setpc_b64">; 251} // End isBranch = 1, isIndirectBranch = 1 252 253let isReturn = 1 in { 254// Define variant marked as return rather than branch. 255def S_SETPC_B64_return : SOP1_1<"", CCR_SGPR_64, [(AMDGPUret_flag i64:$src0)]>; 256} 257} // End isTerminator = 1, isBarrier = 1 258 259let isCall = 1 in { 260def S_SWAPPC_B64 : SOP1_64 <"s_swappc_b64" 261>; 262} 263 264def S_RFE_B64 : SOP1_1 <"s_rfe_b64">; 265 266let hasSideEffects = 1, Uses = [EXEC], Defs = [EXEC, SCC] in { 267 268def S_AND_SAVEEXEC_B64 : SOP1_64 <"s_and_saveexec_b64">; 269def S_OR_SAVEEXEC_B64 : SOP1_64 <"s_or_saveexec_b64">; 270def S_XOR_SAVEEXEC_B64 : SOP1_64 <"s_xor_saveexec_b64">; 271def S_ANDN2_SAVEEXEC_B64 : SOP1_64 <"s_andn2_saveexec_b64">; 272def S_ORN2_SAVEEXEC_B64 : SOP1_64 <"s_orn2_saveexec_b64">; 273def S_NAND_SAVEEXEC_B64 : SOP1_64 <"s_nand_saveexec_b64">; 274def S_NOR_SAVEEXEC_B64 : SOP1_64 <"s_nor_saveexec_b64">; 275def S_XNOR_SAVEEXEC_B64 : SOP1_64 <"s_xnor_saveexec_b64">; 276 277} // End hasSideEffects = 1, Uses = [EXEC], Defs = [EXEC, SCC] 278 279def S_QUADMASK_B32 : SOP1_32 <"s_quadmask_b32">; 280def S_QUADMASK_B64 : SOP1_64 <"s_quadmask_b64">; 281 282let Uses = [M0] in { 283def S_MOVRELS_B32 : SOP1_32R <"s_movrels_b32">; 284def S_MOVRELS_B64 : SOP1_64R <"s_movrels_b64">; 285def S_MOVRELD_B32 : SOP1_32_movreld <"s_movreld_b32">; 286def S_MOVRELD_B64 : SOP1_64_movreld <"s_movreld_b64">; 287} // End Uses = [M0] 288 289let SubtargetPredicate = isGFX6GFX7GFX8GFX9 in { 290def S_CBRANCH_JOIN : SOP1_0_32R <"s_cbranch_join">; 291} // End SubtargetPredicate = isGFX6GFX7GFX8GFX9 292 293let Defs = [SCC] in { 294def S_ABS_I32 : SOP1_32 <"s_abs_i32">; 295} // End Defs = [SCC] 296 297let SubtargetPredicate = HasVGPRIndexMode in { 298def S_SET_GPR_IDX_IDX : SOP1_0_32<"s_set_gpr_idx_idx"> { 299 let Uses = [M0, MODE]; 300 let Defs = [M0, MODE]; 301} 302} 303 304let SubtargetPredicate = isGFX9Plus in { 305 let hasSideEffects = 1, Defs = [EXEC, SCC], Uses = [EXEC] in { 306 def S_ANDN1_SAVEEXEC_B64 : SOP1_64<"s_andn1_saveexec_b64">; 307 def S_ORN1_SAVEEXEC_B64 : SOP1_64<"s_orn1_saveexec_b64">; 308 def S_ANDN1_WREXEC_B64 : SOP1_64<"s_andn1_wrexec_b64">; 309 def S_ANDN2_WREXEC_B64 : SOP1_64<"s_andn2_wrexec_b64">; 310 } // End hasSideEffects = 1, Defs = [EXEC, SCC], Uses = [EXEC] 311 312 def S_BITREPLICATE_B64_B32 : SOP1_64_32<"s_bitreplicate_b64_b32">; 313} // End SubtargetPredicate = isGFX9Plus 314 315let SubtargetPredicate = isGFX10Plus in { 316 let hasSideEffects = 1, Defs = [EXEC, SCC], Uses = [EXEC] in { 317 def S_AND_SAVEEXEC_B32 : SOP1_32<"s_and_saveexec_b32">; 318 def S_OR_SAVEEXEC_B32 : SOP1_32<"s_or_saveexec_b32">; 319 def S_XOR_SAVEEXEC_B32 : SOP1_32<"s_xor_saveexec_b32">; 320 def S_ANDN2_SAVEEXEC_B32 : SOP1_32<"s_andn2_saveexec_b32">; 321 def S_ORN2_SAVEEXEC_B32 : SOP1_32<"s_orn2_saveexec_b32">; 322 def S_NAND_SAVEEXEC_B32 : SOP1_32<"s_nand_saveexec_b32">; 323 def S_NOR_SAVEEXEC_B32 : SOP1_32<"s_nor_saveexec_b32">; 324 def S_XNOR_SAVEEXEC_B32 : SOP1_32<"s_xnor_saveexec_b32">; 325 def S_ANDN1_SAVEEXEC_B32 : SOP1_32<"s_andn1_saveexec_b32">; 326 def S_ORN1_SAVEEXEC_B32 : SOP1_32<"s_orn1_saveexec_b32">; 327 def S_ANDN1_WREXEC_B32 : SOP1_32<"s_andn1_wrexec_b32">; 328 def S_ANDN2_WREXEC_B32 : SOP1_32<"s_andn2_wrexec_b32">; 329 } // End hasSideEffects = 1, Defs = [EXEC, SCC], Uses = [EXEC] 330 331 let Uses = [M0] in { 332 def S_MOVRELSD_2_B32 : SOP1_32<"s_movrelsd_2_b32">; 333 } // End Uses = [M0] 334} // End SubtargetPredicate = isGFX10Plus 335 336//===----------------------------------------------------------------------===// 337// SOP2 Instructions 338//===----------------------------------------------------------------------===// 339 340class SOP2_Pseudo<string opName, dag outs, dag ins, 341 string asmOps, list<dag> pattern=[]> : 342 SOP_Pseudo<opName, outs, ins, asmOps, pattern> { 343 344 let mayLoad = 0; 345 let mayStore = 0; 346 let hasSideEffects = 0; 347 let SALU = 1; 348 let SOP2 = 1; 349 let SchedRW = [WriteSALU]; 350 let UseNamedOperandTable = 1; 351 352 let has_sdst = 1; 353 354 // Pseudo instructions have no encodings, but adding this field here allows 355 // us to do: 356 // let sdst = xxx in { 357 // for multiclasses that include both real and pseudo instructions. 358 // field bits<7> sdst = 0; 359 // let Size = 4; // Do we need size here? 360} 361 362class SOP2_Real<bits<7> op, SOP_Pseudo ps> : 363 InstSI <ps.OutOperandList, ps.InOperandList, 364 ps.Mnemonic # " " # ps.AsmOperands, []>, 365 Enc32 { 366 let isPseudo = 0; 367 let isCodeGenOnly = 0; 368 369 // copy relevant pseudo op flags 370 let SubtargetPredicate = ps.SubtargetPredicate; 371 let AsmMatchConverter = ps.AsmMatchConverter; 372 let UseNamedOperandTable = ps.UseNamedOperandTable; 373 let TSFlags = ps.TSFlags; 374 375 // encoding 376 bits<7> sdst; 377 bits<8> src0; 378 bits<8> src1; 379 380 let Inst{7-0} = src0; 381 let Inst{15-8} = src1; 382 let Inst{22-16} = !if(ps.has_sdst, sdst, ?); 383 let Inst{29-23} = op; 384 let Inst{31-30} = 0x2; // encoding 385} 386 387 388class SOP2_32 <string opName, list<dag> pattern=[]> : SOP2_Pseudo < 389 opName, (outs SReg_32:$sdst), (ins SSrc_b32:$src0, SSrc_b32:$src1), 390 "$sdst, $src0, $src1", pattern 391>; 392 393class SOP2_64 <string opName, list<dag> pattern=[]> : SOP2_Pseudo < 394 opName, (outs SReg_64:$sdst), (ins SSrc_b64:$src0, SSrc_b64:$src1), 395 "$sdst, $src0, $src1", pattern 396>; 397 398class SOP2_64_32 <string opName, list<dag> pattern=[]> : SOP2_Pseudo < 399 opName, (outs SReg_64:$sdst), (ins SSrc_b64:$src0, SSrc_b32:$src1), 400 "$sdst, $src0, $src1", pattern 401>; 402 403class SOP2_64_32_32 <string opName, list<dag> pattern=[]> : SOP2_Pseudo < 404 opName, (outs SReg_64:$sdst), (ins SSrc_b32:$src0, SSrc_b32:$src1), 405 "$sdst, $src0, $src1", pattern 406>; 407 408class UniformUnaryFrag<SDPatternOperator Op> : PatFrag < 409 (ops node:$src0), 410 (Op $src0), 411 [{ return !N->isDivergent(); }]> { 412 // This check is unnecessary as it's captured by the result register 413 // bank constraint. 414 // 415 // FIXME: Should add a way for the emitter to recognize this is a 416 // trivially true predicate to eliminate the check. 417 let GISelPredicateCode = [{return true;}]; 418} 419 420class UniformBinFrag<SDPatternOperator Op> : PatFrag < 421 (ops node:$src0, node:$src1), 422 (Op $src0, $src1), 423 [{ return !N->isDivergent(); }]> { 424 // This check is unnecessary as it's captured by the result register 425 // bank constraint. 426 // 427 // FIXME: Should add a way for the emitter to recognize this is a 428 // trivially true predicate to eliminate the check. 429 let GISelPredicateCode = [{return true;}]; 430} 431 432let Defs = [SCC] in { // Carry out goes to SCC 433let isCommutable = 1 in { 434def S_ADD_U32 : SOP2_32 <"s_add_u32">; 435def S_ADD_I32 : SOP2_32 <"s_add_i32", 436 [(set i32:$sdst, (UniformBinFrag<add> SSrc_b32:$src0, SSrc_b32:$src1))] 437>; 438} // End isCommutable = 1 439 440def S_SUB_U32 : SOP2_32 <"s_sub_u32">; 441def S_SUB_I32 : SOP2_32 <"s_sub_i32", 442 [(set i32:$sdst, (UniformBinFrag<sub> SSrc_b32:$src0, SSrc_b32:$src1))] 443>; 444 445let Uses = [SCC] in { // Carry in comes from SCC 446let isCommutable = 1 in { 447def S_ADDC_U32 : SOP2_32 <"s_addc_u32", 448 [(set i32:$sdst, (UniformBinFrag<adde> (i32 SSrc_b32:$src0), (i32 SSrc_b32:$src1)))]>; 449} // End isCommutable = 1 450 451def S_SUBB_U32 : SOP2_32 <"s_subb_u32", 452 [(set i32:$sdst, (UniformBinFrag<sube> (i32 SSrc_b32:$src0), (i32 SSrc_b32:$src1)))]>; 453} // End Uses = [SCC] 454 455 456let isCommutable = 1 in { 457def S_MIN_I32 : SOP2_32 <"s_min_i32", 458 [(set i32:$sdst, (smin i32:$src0, i32:$src1))] 459>; 460def S_MIN_U32 : SOP2_32 <"s_min_u32", 461 [(set i32:$sdst, (umin i32:$src0, i32:$src1))] 462>; 463def S_MAX_I32 : SOP2_32 <"s_max_i32", 464 [(set i32:$sdst, (smax i32:$src0, i32:$src1))] 465>; 466def S_MAX_U32 : SOP2_32 <"s_max_u32", 467 [(set i32:$sdst, (umax i32:$src0, i32:$src1))] 468>; 469} // End isCommutable = 1 470} // End Defs = [SCC] 471 472// This pattern is restricted to certain subtargets (practically GFX8Plus) 473// because isel sometimes produces an sreg_64 copy to SCC as a by-product 474// of this pattern, and only for subtargets with hasScalarCompareEq64 475// is it possible to map such copy to a single instruction (S_CMP_LG_U64). 476class SelectPat<SDPatternOperator select> : PatFrag < 477 (ops node:$src1, node:$src2), 478 (select SCC, $src1, $src2), 479 [{ return Subtarget->hasScalarCompareEq64() && 480 N->getOperand(0)->hasOneUse() && !N->isDivergent(); }] 481>; 482 483let Uses = [SCC] in { 484 let AddedComplexity = 20 in { 485 def S_CSELECT_B32 : SOP2_32 <"s_cselect_b32", 486 [(set i32:$sdst, (SelectPat<select> i32:$src0, i32:$src1))] 487 >; 488 } 489 490 def S_CSELECT_B64 : SOP2_64 <"s_cselect_b64">; 491} // End Uses = [SCC] 492 493let Defs = [SCC] in { 494let isCommutable = 1 in { 495def S_AND_B32 : SOP2_32 <"s_and_b32", 496 [(set i32:$sdst, (UniformBinFrag<and> i32:$src0, i32:$src1))] 497>; 498 499def S_AND_B64 : SOP2_64 <"s_and_b64", 500 [(set i64:$sdst, (UniformBinFrag<and> i64:$src0, i64:$src1))] 501>; 502 503def S_OR_B32 : SOP2_32 <"s_or_b32", 504 [(set i32:$sdst, (UniformBinFrag<or> i32:$src0, i32:$src1))] 505>; 506 507def S_OR_B64 : SOP2_64 <"s_or_b64", 508 [(set i64:$sdst, (UniformBinFrag<or> i64:$src0, i64:$src1))] 509>; 510 511def S_XOR_B32 : SOP2_32 <"s_xor_b32", 512 [(set i32:$sdst, (UniformBinFrag<xor> i32:$src0, i32:$src1))] 513>; 514 515def S_XOR_B64 : SOP2_64 <"s_xor_b64", 516 [(set i64:$sdst, (UniformBinFrag<xor> i64:$src0, i64:$src1))] 517>; 518 519def S_XNOR_B32 : SOP2_32 <"s_xnor_b32", 520 [(set i32:$sdst, (not (xor_oneuse i32:$src0, i32:$src1)))] 521>; 522 523def S_XNOR_B64 : SOP2_64 <"s_xnor_b64", 524 [(set i64:$sdst, (not (xor_oneuse i64:$src0, i64:$src1)))] 525>; 526 527def S_NAND_B32 : SOP2_32 <"s_nand_b32", 528 [(set i32:$sdst, (not (and_oneuse i32:$src0, i32:$src1)))] 529>; 530 531def S_NAND_B64 : SOP2_64 <"s_nand_b64", 532 [(set i64:$sdst, (not (and_oneuse i64:$src0, i64:$src1)))] 533>; 534 535def S_NOR_B32 : SOP2_32 <"s_nor_b32", 536 [(set i32:$sdst, (not (or_oneuse i32:$src0, i32:$src1)))] 537>; 538 539def S_NOR_B64 : SOP2_64 <"s_nor_b64", 540 [(set i64:$sdst, (not (or_oneuse i64:$src0, i64:$src1)))] 541>; 542} // End isCommutable = 1 543 544// There are also separate patterns for types other than i32 545def S_ANDN2_B32 : SOP2_32 <"s_andn2_b32", 546 [(set i32:$sdst, (UniformBinFrag<and> i32:$src0, (UniformUnaryFrag<not> i32:$src1)))] 547>; 548 549def S_ANDN2_B64 : SOP2_64 <"s_andn2_b64", 550 [(set i64:$sdst, (UniformBinFrag<and> i64:$src0, (UniformUnaryFrag<not> i64:$src1)))] 551>; 552 553def S_ORN2_B32 : SOP2_32 <"s_orn2_b32", 554 [(set i32:$sdst, (UniformBinFrag<or> i32:$src0, (UniformUnaryFrag<not> i32:$src1)))] 555>; 556 557def S_ORN2_B64 : SOP2_64 <"s_orn2_b64", 558 [(set i64:$sdst, (UniformBinFrag<or> i64:$src0, (UniformUnaryFrag<not> i64:$src1)))] 559>; 560} // End Defs = [SCC] 561 562// Use added complexity so these patterns are preferred to the VALU patterns. 563let AddedComplexity = 1 in { 564 565let Defs = [SCC] in { 566// TODO: b64 versions require VOP3 change since v_lshlrev_b64 is VOP3 567def S_LSHL_B32 : SOP2_32 <"s_lshl_b32", 568 [(set SReg_32:$sdst, (UniformBinFrag<shl> (i32 SSrc_b32:$src0), (i32 SSrc_b32:$src1)))] 569>; 570def S_LSHL_B64 : SOP2_64_32 <"s_lshl_b64", 571 [(set SReg_64:$sdst, (UniformBinFrag<shl> (i64 SSrc_b64:$src0), (i32 SSrc_b32:$src1)))] 572>; 573def S_LSHR_B32 : SOP2_32 <"s_lshr_b32", 574 [(set SReg_32:$sdst, (UniformBinFrag<srl> (i32 SSrc_b32:$src0), (i32 SSrc_b32:$src1)))] 575>; 576def S_LSHR_B64 : SOP2_64_32 <"s_lshr_b64", 577 [(set SReg_64:$sdst, (UniformBinFrag<srl> (i64 SSrc_b64:$src0), (i32 SSrc_b32:$src1)))] 578>; 579def S_ASHR_I32 : SOP2_32 <"s_ashr_i32", 580 [(set SReg_32:$sdst, (UniformBinFrag<sra> (i32 SSrc_b32:$src0), (i32 SSrc_b32:$src1)))] 581>; 582def S_ASHR_I64 : SOP2_64_32 <"s_ashr_i64", 583 [(set SReg_64:$sdst, (UniformBinFrag<sra> (i64 SSrc_b64:$src0), (i32 SSrc_b32:$src1)))] 584>; 585} // End Defs = [SCC] 586 587def S_BFM_B32 : SOP2_32 <"s_bfm_b32", 588 [(set i32:$sdst, (UniformBinFrag<AMDGPUbfm> i32:$src0, i32:$src1))]>; 589def S_BFM_B64 : SOP2_64_32_32 <"s_bfm_b64">; 590 591// TODO: S_MUL_I32 require V_MUL_LO_I32 from VOP3 change 592def S_MUL_I32 : SOP2_32 <"s_mul_i32", 593 [(set i32:$sdst, (mul i32:$src0, i32:$src1))]> { 594 let isCommutable = 1; 595} 596 597} // End AddedComplexity = 1 598 599let Defs = [SCC] in { 600def S_BFE_U32 : SOP2_32 <"s_bfe_u32">; 601def S_BFE_I32 : SOP2_32 <"s_bfe_i32">; 602def S_BFE_U64 : SOP2_64_32 <"s_bfe_u64">; 603def S_BFE_I64 : SOP2_64_32 <"s_bfe_i64">; 604} // End Defs = [SCC] 605 606def S_CBRANCH_G_FORK : SOP2_Pseudo < 607 "s_cbranch_g_fork", (outs), 608 (ins SCSrc_b64:$src0, SCSrc_b64:$src1), 609 "$src0, $src1" 610> { 611 let has_sdst = 0; 612 let SubtargetPredicate = isGFX6GFX7GFX8GFX9; 613} 614 615let Defs = [SCC] in { 616def S_ABSDIFF_I32 : SOP2_32 <"s_absdiff_i32">; 617} // End Defs = [SCC] 618 619let SubtargetPredicate = isGFX8GFX9 in { 620 def S_RFE_RESTORE_B64 : SOP2_Pseudo < 621 "s_rfe_restore_b64", (outs), 622 (ins SSrc_b64:$src0, SSrc_b32:$src1), 623 "$src0, $src1" 624 > { 625 let hasSideEffects = 1; 626 let has_sdst = 0; 627 } 628} 629 630let SubtargetPredicate = isGFX9Plus in { 631 def S_PACK_LL_B32_B16 : SOP2_32<"s_pack_ll_b32_b16">; 632 def S_PACK_LH_B32_B16 : SOP2_32<"s_pack_lh_b32_b16">; 633 def S_PACK_HH_B32_B16 : SOP2_32<"s_pack_hh_b32_b16">; 634 635 let Defs = [SCC] in { 636 def S_LSHL1_ADD_U32 : SOP2_32<"s_lshl1_add_u32", 637 [(set i32:$sdst, (shl1_add SSrc_b32:$src0, SSrc_b32:$src1))] 638 >; 639 def S_LSHL2_ADD_U32 : SOP2_32<"s_lshl2_add_u32", 640 [(set i32:$sdst, (shl2_add SSrc_b32:$src0, SSrc_b32:$src1))] 641 >; 642 def S_LSHL3_ADD_U32 : SOP2_32<"s_lshl3_add_u32", 643 [(set i32:$sdst, (shl3_add SSrc_b32:$src0, SSrc_b32:$src1))] 644 >; 645 def S_LSHL4_ADD_U32 : SOP2_32<"s_lshl4_add_u32", 646 [(set i32:$sdst, (shl4_add SSrc_b32:$src0, SSrc_b32:$src1))] 647 >; 648 } // End Defs = [SCC] 649 650 let isCommutable = 1 in { 651 def S_MUL_HI_U32 : SOP2_32<"s_mul_hi_u32", 652 [(set i32:$sdst, (UniformBinFrag<mulhu> SSrc_b32:$src0, SSrc_b32:$src1))]>; 653 def S_MUL_HI_I32 : SOP2_32<"s_mul_hi_i32", 654 [(set i32:$sdst, (UniformBinFrag<mulhs> SSrc_b32:$src0, SSrc_b32:$src1))]>; 655 } 656} // End SubtargetPredicate = isGFX9Plus 657 658//===----------------------------------------------------------------------===// 659// SOPK Instructions 660//===----------------------------------------------------------------------===// 661 662class SOPK_Pseudo <string opName, dag outs, dag ins, 663 string asmOps, list<dag> pattern=[]> : 664 InstSI <outs, ins, "", pattern>, 665 SIMCInstr<opName, SIEncodingFamily.NONE> { 666 let isPseudo = 1; 667 let isCodeGenOnly = 1; 668 let mayLoad = 0; 669 let mayStore = 0; 670 let hasSideEffects = 0; 671 let SALU = 1; 672 let SOPK = 1; 673 let SchedRW = [WriteSALU]; 674 let UseNamedOperandTable = 1; 675 string Mnemonic = opName; 676 string AsmOperands = asmOps; 677 678 bits<1> has_sdst = 1; 679} 680 681class SOPK_Real<bits<5> op, SOPK_Pseudo ps> : 682 InstSI <ps.OutOperandList, ps.InOperandList, 683 ps.Mnemonic # " " # ps.AsmOperands, []> { 684 let isPseudo = 0; 685 let isCodeGenOnly = 0; 686 687 // copy relevant pseudo op flags 688 let SubtargetPredicate = ps.SubtargetPredicate; 689 let AsmMatchConverter = ps.AsmMatchConverter; 690 let DisableEncoding = ps.DisableEncoding; 691 let Constraints = ps.Constraints; 692 693 // encoding 694 bits<7> sdst; 695 bits<16> simm16; 696 bits<32> imm; 697} 698 699class SOPK_Real32<bits<5> op, SOPK_Pseudo ps> : 700 SOPK_Real <op, ps>, 701 Enc32 { 702 let Inst{15-0} = simm16; 703 let Inst{22-16} = !if(ps.has_sdst, sdst, ?); 704 let Inst{27-23} = op; 705 let Inst{31-28} = 0xb; //encoding 706} 707 708class SOPK_Real64<bits<5> op, SOPK_Pseudo ps> : 709 SOPK_Real<op, ps>, 710 Enc64 { 711 let Inst{15-0} = simm16; 712 let Inst{22-16} = !if(ps.has_sdst, sdst, ?); 713 let Inst{27-23} = op; 714 let Inst{31-28} = 0xb; //encoding 715 let Inst{63-32} = imm; 716} 717 718class SOPKInstTable <bit is_sopk, string cmpOp = ""> { 719 bit IsSOPK = is_sopk; 720 string BaseCmpOp = cmpOp; 721} 722 723class SOPK_32 <string opName, list<dag> pattern=[]> : SOPK_Pseudo < 724 opName, 725 (outs SReg_32:$sdst), 726 (ins s16imm:$simm16), 727 "$sdst, $simm16", 728 pattern>; 729 730class SOPK_32_BR <string opName, list<dag> pattern=[]> : SOPK_Pseudo < 731 opName, 732 (outs), 733 (ins sopp_brtarget:$simm16, SReg_32:$sdst), 734 "$sdst, $simm16", 735 pattern> { 736 let Defs = [EXEC]; 737 let Uses = [EXEC]; 738 let isBranch = 1; 739 let isTerminator = 1; 740 let SchedRW = [WriteBranch]; 741} 742 743class SOPK_SCC <string opName, string base_op, bit isSignExt> : SOPK_Pseudo < 744 opName, 745 (outs), 746 !if(isSignExt, 747 (ins SReg_32:$sdst, s16imm:$simm16), 748 (ins SReg_32:$sdst, u16imm:$simm16)), 749 "$sdst, $simm16", []>, 750 SOPKInstTable<1, base_op>{ 751 let Defs = [SCC]; 752} 753 754class SOPK_32TIE <string opName, list<dag> pattern=[]> : SOPK_Pseudo < 755 opName, 756 (outs SReg_32:$sdst), 757 (ins SReg_32:$src0, s16imm:$simm16), 758 "$sdst, $simm16", 759 pattern 760>; 761 762let isReMaterializable = 1, isMoveImm = 1 in { 763def S_MOVK_I32 : SOPK_32 <"s_movk_i32">; 764} // End isReMaterializable = 1 765let Uses = [SCC] in { 766def S_CMOVK_I32 : SOPK_32 <"s_cmovk_i32">; 767} 768 769let isCompare = 1 in { 770 771// This instruction is disabled for now until we can figure out how to teach 772// the instruction selector to correctly use the S_CMP* vs V_CMP* 773// instructions. 774// 775// When this instruction is enabled the code generator sometimes produces this 776// invalid sequence: 777// 778// SCC = S_CMPK_EQ_I32 SGPR0, imm 779// VCC = COPY SCC 780// VGPR0 = V_CNDMASK VCC, VGPR0, VGPR1 781// 782// def S_CMPK_EQ_I32 : SOPK_SCC <"s_cmpk_eq_i32", 783// [(set i1:$dst, (setcc i32:$src0, imm:$src1, SETEQ))] 784// >; 785 786def S_CMPK_EQ_I32 : SOPK_SCC <"s_cmpk_eq_i32", "s_cmp_eq_i32", 1>; 787def S_CMPK_LG_I32 : SOPK_SCC <"s_cmpk_lg_i32", "s_cmp_lg_i32", 1>; 788def S_CMPK_GT_I32 : SOPK_SCC <"s_cmpk_gt_i32", "s_cmp_gt_i32", 1>; 789def S_CMPK_GE_I32 : SOPK_SCC <"s_cmpk_ge_i32", "s_cmp_ge_i32", 1>; 790def S_CMPK_LT_I32 : SOPK_SCC <"s_cmpk_lt_i32", "s_cmp_lt_i32", 1>; 791def S_CMPK_LE_I32 : SOPK_SCC <"s_cmpk_le_i32", "s_cmp_le_i32", 1>; 792 793let SOPKZext = 1 in { 794def S_CMPK_EQ_U32 : SOPK_SCC <"s_cmpk_eq_u32", "s_cmp_eq_u32", 0>; 795def S_CMPK_LG_U32 : SOPK_SCC <"s_cmpk_lg_u32", "s_cmp_lg_u32", 0>; 796def S_CMPK_GT_U32 : SOPK_SCC <"s_cmpk_gt_u32", "s_cmp_gt_u32", 0>; 797def S_CMPK_GE_U32 : SOPK_SCC <"s_cmpk_ge_u32", "s_cmp_ge_u32", 0>; 798def S_CMPK_LT_U32 : SOPK_SCC <"s_cmpk_lt_u32", "s_cmp_lt_u32", 0>; 799def S_CMPK_LE_U32 : SOPK_SCC <"s_cmpk_le_u32", "s_cmp_le_u32", 0>; 800} // End SOPKZext = 1 801} // End isCompare = 1 802 803let Defs = [SCC], isCommutable = 1, DisableEncoding = "$src0", 804 Constraints = "$sdst = $src0" in { 805 def S_ADDK_I32 : SOPK_32TIE <"s_addk_i32">; 806 def S_MULK_I32 : SOPK_32TIE <"s_mulk_i32">; 807} 808 809let SubtargetPredicate = isGFX6GFX7GFX8GFX9 in 810def S_CBRANCH_I_FORK : SOPK_Pseudo < 811 "s_cbranch_i_fork", 812 (outs), (ins SReg_64:$sdst, sopp_brtarget:$simm16), 813 "$sdst, $simm16" 814>; 815 816let hasSideEffects = 1 in { 817 818let mayLoad = 1 in { 819// s_getreg_b32 should use hasSideEffects = 1 for tablegen to allow 820// its use in the readcyclecounter selection. 821// FIXME: Need to truncate immediate to 16-bits. 822def S_GETREG_B32 : SOPK_Pseudo < 823 "s_getreg_b32", 824 (outs SReg_32:$sdst), (ins hwreg:$simm16), 825 "$sdst, $simm16", 826 [(set i32:$sdst, (int_amdgcn_s_getreg (i32 timm:$simm16)))]> { 827 let SOPKZext = 1; 828} 829} 830 831let mayLoad = 0, mayStore =0 in { 832 833// FIXME: Need to truncate immediate to 16-bits. 834def S_SETREG_B32 : SOPK_Pseudo < 835 "s_setreg_b32", 836 (outs), (ins SReg_32:$sdst, hwreg:$simm16), 837 "$simm16, $sdst", 838 [(int_amdgcn_s_setreg (i32 timm:$simm16), i32:$sdst)]> { 839 840 // Use custom inserter to optimize some cases to 841 // S_DENORM_MODE/S_ROUND_MODE. 842 let usesCustomInserter = 1; 843 let Defs = [MODE]; 844 let Uses = [MODE]; 845} 846 847// FIXME: Not on SI? 848//def S_GETREG_REGRD_B32 : SOPK_32 <sopk<0x14, 0x13>, "s_getreg_regrd_b32">; 849 850def S_SETREG_IMM32_B32 : SOPK_Pseudo < 851 "s_setreg_imm32_b32", 852 (outs), (ins i32imm:$imm, hwreg:$simm16), 853 "$simm16, $imm"> { 854 let Size = 8; // Unlike every other SOPK instruction. 855 let has_sdst = 0; 856 let Defs = [MODE]; 857 let Uses = [MODE]; 858} 859 860} 861} // End hasSideEffects = 1 862 863class SOPK_WAITCNT<string opName, list<dag> pat=[]> : 864 SOPK_Pseudo< 865 opName, 866 (outs), 867 (ins SReg_32:$sdst, s16imm:$simm16), 868 "$sdst, $simm16", 869 pat> { 870 let hasSideEffects = 1; 871 let mayLoad = 1; 872 let mayStore = 1; 873 let has_sdst = 1; // First source takes place of sdst in encoding 874} 875 876let SubtargetPredicate = isGFX9Plus in { 877 def S_CALL_B64 : SOPK_Pseudo< 878 "s_call_b64", 879 (outs SReg_64:$sdst), 880 (ins sopp_brtarget:$simm16), 881 "$sdst, $simm16"> { 882 let isCall = 1; 883 } 884} // End SubtargetPredicate = isGFX9Plus 885 886let SubtargetPredicate = isGFX10Plus in { 887 def S_VERSION : SOPK_Pseudo< 888 "s_version", 889 (outs), 890 (ins s16imm:$simm16), 891 "$simm16"> { 892 let has_sdst = 0; 893 } 894 895 def S_SUBVECTOR_LOOP_BEGIN : SOPK_32_BR<"s_subvector_loop_begin">; 896 def S_SUBVECTOR_LOOP_END : SOPK_32_BR<"s_subvector_loop_end">; 897 898 def S_WAITCNT_VSCNT : SOPK_WAITCNT<"s_waitcnt_vscnt">; 899 def S_WAITCNT_VMCNT : SOPK_WAITCNT<"s_waitcnt_vmcnt">; 900 def S_WAITCNT_EXPCNT : SOPK_WAITCNT<"s_waitcnt_expcnt">; 901 def S_WAITCNT_LGKMCNT : SOPK_WAITCNT<"s_waitcnt_lgkmcnt">; 902} // End SubtargetPredicate = isGFX10Plus 903 904//===----------------------------------------------------------------------===// 905// SOPC Instructions 906//===----------------------------------------------------------------------===// 907 908class SOPCe <bits<7> op> : Enc32 { 909 bits<8> src0; 910 bits<8> src1; 911 912 let Inst{7-0} = src0; 913 let Inst{15-8} = src1; 914 let Inst{22-16} = op; 915 let Inst{31-23} = 0x17e; 916} 917 918class SOPC <bits<7> op, dag outs, dag ins, string asm, 919 list<dag> pattern = []> : 920 InstSI<outs, ins, asm, pattern>, SOPCe <op> { 921 let mayLoad = 0; 922 let mayStore = 0; 923 let hasSideEffects = 0; 924 let SALU = 1; 925 let SOPC = 1; 926 let isCodeGenOnly = 0; 927 let Defs = [SCC]; 928 let SchedRW = [WriteSALU]; 929 let UseNamedOperandTable = 1; 930} 931 932class SOPC_Base <bits<7> op, RegisterOperand rc0, RegisterOperand rc1, 933 string opName, list<dag> pattern = []> : SOPC < 934 op, (outs), (ins rc0:$src0, rc1:$src1), 935 opName#" $src0, $src1", pattern > { 936 let Defs = [SCC]; 937} 938class SOPC_Helper <bits<7> op, RegisterOperand rc, ValueType vt, 939 string opName, SDPatternOperator cond> : SOPC_Base < 940 op, rc, rc, opName, 941 [(set SCC, (si_setcc_uniform vt:$src0, vt:$src1, cond))] > { 942} 943 944class SOPC_CMP_32<bits<7> op, string opName, 945 SDPatternOperator cond = COND_NULL, string revOp = opName> 946 : SOPC_Helper<op, SSrc_b32, i32, opName, cond>, 947 Commutable_REV<revOp, !eq(revOp, opName)>, 948 SOPKInstTable<0, opName> { 949 let isCompare = 1; 950 let isCommutable = 1; 951} 952 953class SOPC_CMP_64<bits<7> op, string opName, 954 SDPatternOperator cond = COND_NULL, string revOp = opName> 955 : SOPC_Helper<op, SSrc_b64, i64, opName, cond>, 956 Commutable_REV<revOp, !eq(revOp, opName)> { 957 let isCompare = 1; 958 let isCommutable = 1; 959} 960 961class SOPC_32<bits<7> op, string opName, list<dag> pattern = []> 962 : SOPC_Base<op, SSrc_b32, SSrc_b32, opName, pattern>; 963 964class SOPC_64_32<bits<7> op, string opName, list<dag> pattern = []> 965 : SOPC_Base<op, SSrc_b64, SSrc_b32, opName, pattern>; 966 967def S_CMP_EQ_I32 : SOPC_CMP_32 <0x00, "s_cmp_eq_i32">; 968def S_CMP_LG_I32 : SOPC_CMP_32 <0x01, "s_cmp_lg_i32">; 969def S_CMP_GT_I32 : SOPC_CMP_32 <0x02, "s_cmp_gt_i32", COND_SGT>; 970def S_CMP_GE_I32 : SOPC_CMP_32 <0x03, "s_cmp_ge_i32", COND_SGE>; 971def S_CMP_LT_I32 : SOPC_CMP_32 <0x04, "s_cmp_lt_i32", COND_SLT, "s_cmp_gt_i32">; 972def S_CMP_LE_I32 : SOPC_CMP_32 <0x05, "s_cmp_le_i32", COND_SLE, "s_cmp_ge_i32">; 973def S_CMP_EQ_U32 : SOPC_CMP_32 <0x06, "s_cmp_eq_u32", COND_EQ>; 974def S_CMP_LG_U32 : SOPC_CMP_32 <0x07, "s_cmp_lg_u32", COND_NE>; 975def S_CMP_GT_U32 : SOPC_CMP_32 <0x08, "s_cmp_gt_u32", COND_UGT>; 976def S_CMP_GE_U32 : SOPC_CMP_32 <0x09, "s_cmp_ge_u32", COND_UGE>; 977def S_CMP_LT_U32 : SOPC_CMP_32 <0x0a, "s_cmp_lt_u32", COND_ULT, "s_cmp_gt_u32">; 978def S_CMP_LE_U32 : SOPC_CMP_32 <0x0b, "s_cmp_le_u32", COND_ULE, "s_cmp_ge_u32">; 979 980def S_BITCMP0_B32 : SOPC_32 <0x0c, "s_bitcmp0_b32">; 981def S_BITCMP1_B32 : SOPC_32 <0x0d, "s_bitcmp1_b32">; 982def S_BITCMP0_B64 : SOPC_64_32 <0x0e, "s_bitcmp0_b64">; 983def S_BITCMP1_B64 : SOPC_64_32 <0x0f, "s_bitcmp1_b64">; 984let SubtargetPredicate = isGFX6GFX7GFX8GFX9 in 985def S_SETVSKIP : SOPC_32 <0x10, "s_setvskip">; 986 987let SubtargetPredicate = isGFX8Plus in { 988def S_CMP_EQ_U64 : SOPC_CMP_64 <0x12, "s_cmp_eq_u64", COND_EQ>; 989def S_CMP_LG_U64 : SOPC_CMP_64 <0x13, "s_cmp_lg_u64", COND_NE>; 990} // End SubtargetPredicate = isGFX8Plus 991 992let SubtargetPredicate = HasVGPRIndexMode in { 993// Setting the GPR index mode is really writing the fields in the mode 994// register. We don't want to add mode register uses to every 995// instruction, and it's too complicated to deal with anyway. This is 996// modeled just as a side effect. 997def S_SET_GPR_IDX_ON : SOPC <0x11, 998 (outs), 999 (ins SSrc_b32:$src0, GPRIdxMode:$src1), 1000 "s_set_gpr_idx_on $src0,$src1"> { 1001 let Defs = [M0, MODE]; // No scc def 1002 let Uses = [M0, MODE]; // Other bits of mode, m0 unmodified. 1003 let hasSideEffects = 1; // Sets mode.gpr_idx_en 1004 let FixedSize = 1; 1005} 1006} 1007 1008//===----------------------------------------------------------------------===// 1009// SOPP Instructions 1010//===----------------------------------------------------------------------===// 1011 1012class Base_SOPP <string asm> { 1013 string AsmString = asm; 1014} 1015 1016class SOPPe <bits<7> op> : Enc32 { 1017 bits <16> simm16; 1018 1019 let Inst{15-0} = simm16; 1020 let Inst{22-16} = op; 1021 let Inst{31-23} = 0x17f; // encoding 1022} 1023 1024class SOPP <bits<7> op, dag ins, string asm, list<dag> pattern = []> : 1025 InstSI <(outs), ins, asm, pattern >, SOPPe <op>, Base_SOPP <asm> { 1026 1027 let mayLoad = 0; 1028 let mayStore = 0; 1029 let hasSideEffects = 0; 1030 let SALU = 1; 1031 let SOPP = 1; 1032 let Size = 4; 1033 let SchedRW = [WriteSALU]; 1034 1035 let UseNamedOperandTable = 1; 1036} 1037 1038def S_NOP : SOPP <0x00000000, (ins i16imm:$simm16), "s_nop $simm16">; 1039 1040class SOPP_w_nop_e <bits<7> op> : Enc64 { 1041 bits <16> simm16; 1042 1043 let Inst{15-0} = simm16; 1044 let Inst{22-16} = op; 1045 let Inst{31-23} = 0x17f; // encoding 1046 let Inst{47-32} = 0x0; 1047 let Inst{54-48} = S_NOP.Inst{22-16}; // opcode 1048 let Inst{63-55} = S_NOP.Inst{31-23}; // encoding 1049} 1050 1051class SOPP_w_nop <bits<7> op, dag ins, string asm, list<dag> pattern = []> : 1052 InstSI <(outs), ins, asm, pattern >, SOPP_w_nop_e <op>, Base_SOPP <asm> { 1053 1054 let mayLoad = 0; 1055 let mayStore = 0; 1056 let hasSideEffects = 0; 1057 let SALU = 1; 1058 let SOPP = 1; 1059 let Size = 8; 1060 let SchedRW = [WriteSALU]; 1061 1062 let UseNamedOperandTable = 1; 1063} 1064 1065multiclass SOPP_With_Relaxation <bits<7> op, dag ins, string asm, list<dag> pattern = []> { 1066 def "" : SOPP <op, ins, asm, pattern>; 1067 def _pad_s_nop : SOPP_w_nop <op, ins, asm, pattern>; 1068} 1069 1070let isTerminator = 1 in { 1071 1072def S_ENDPGM : SOPP <0x00000001, (ins EndpgmImm:$simm16), "s_endpgm$simm16"> { 1073 let isBarrier = 1; 1074 let isReturn = 1; 1075} 1076 1077def S_ENDPGM_SAVED : SOPP <0x0000001B, (ins), "s_endpgm_saved"> { 1078 let SubtargetPredicate = isGFX8Plus; 1079 let simm16 = 0; 1080 let isBarrier = 1; 1081 let isReturn = 1; 1082} 1083 1084let SubtargetPredicate = isGFX9Plus in { 1085 let isBarrier = 1, isReturn = 1, simm16 = 0 in { 1086 def S_ENDPGM_ORDERED_PS_DONE : 1087 SOPP<0x01e, (ins), "s_endpgm_ordered_ps_done">; 1088 } // End isBarrier = 1, isReturn = 1, simm16 = 0 1089} // End SubtargetPredicate = isGFX9Plus 1090 1091let SubtargetPredicate = isGFX10Plus in { 1092 let isBarrier = 1, isReturn = 1, simm16 = 0 in { 1093 def S_CODE_END : 1094 SOPP<0x01f, (ins), "s_code_end">; 1095 } // End isBarrier = 1, isReturn = 1, simm16 = 0 1096} // End SubtargetPredicate = isGFX10Plus 1097 1098let isBranch = 1, SchedRW = [WriteBranch] in { 1099let isBarrier = 1 in { 1100defm S_BRANCH : SOPP_With_Relaxation < 1101 0x00000002, (ins sopp_brtarget:$simm16), "s_branch $simm16", 1102 [(br bb:$simm16)]>; 1103} 1104 1105let Uses = [SCC] in { 1106defm S_CBRANCH_SCC0 : SOPP_With_Relaxation < 1107 0x00000004, (ins sopp_brtarget:$simm16), 1108 "s_cbranch_scc0 $simm16" 1109>; 1110defm S_CBRANCH_SCC1 : SOPP_With_Relaxation < 1111 0x00000005, (ins sopp_brtarget:$simm16), 1112 "s_cbranch_scc1 $simm16" 1113>; 1114} // End Uses = [SCC] 1115 1116let Uses = [VCC] in { 1117defm S_CBRANCH_VCCZ : SOPP_With_Relaxation < 1118 0x00000006, (ins sopp_brtarget:$simm16), 1119 "s_cbranch_vccz $simm16" 1120>; 1121defm S_CBRANCH_VCCNZ : SOPP_With_Relaxation < 1122 0x00000007, (ins sopp_brtarget:$simm16), 1123 "s_cbranch_vccnz $simm16" 1124>; 1125} // End Uses = [VCC] 1126 1127let Uses = [EXEC] in { 1128defm S_CBRANCH_EXECZ : SOPP_With_Relaxation < 1129 0x00000008, (ins sopp_brtarget:$simm16), 1130 "s_cbranch_execz $simm16" 1131>; 1132defm S_CBRANCH_EXECNZ : SOPP_With_Relaxation < 1133 0x00000009, (ins sopp_brtarget:$simm16), 1134 "s_cbranch_execnz $simm16" 1135>; 1136} // End Uses = [EXEC] 1137 1138defm S_CBRANCH_CDBGSYS : SOPP_With_Relaxation < 1139 0x00000017, (ins sopp_brtarget:$simm16), 1140 "s_cbranch_cdbgsys $simm16" 1141>; 1142 1143defm S_CBRANCH_CDBGSYS_AND_USER : SOPP_With_Relaxation < 1144 0x0000001A, (ins sopp_brtarget:$simm16), 1145 "s_cbranch_cdbgsys_and_user $simm16" 1146>; 1147 1148defm S_CBRANCH_CDBGSYS_OR_USER : SOPP_With_Relaxation < 1149 0x00000019, (ins sopp_brtarget:$simm16), 1150 "s_cbranch_cdbgsys_or_user $simm16" 1151>; 1152 1153defm S_CBRANCH_CDBGUSER : SOPP_With_Relaxation < 1154 0x00000018, (ins sopp_brtarget:$simm16), 1155 "s_cbranch_cdbguser $simm16" 1156>; 1157 1158} // End isBranch = 1 1159} // End isTerminator = 1 1160 1161let hasSideEffects = 1 in { 1162def S_BARRIER : SOPP <0x0000000a, (ins), "s_barrier", 1163 [(int_amdgcn_s_barrier)]> { 1164 let SchedRW = [WriteBarrier]; 1165 let simm16 = 0; 1166 let isConvergent = 1; 1167} 1168 1169def S_WAKEUP : SOPP <0x00000003, (ins), "s_wakeup"> { 1170 let SubtargetPredicate = isGFX8Plus; 1171 let simm16 = 0; 1172 let mayLoad = 1; 1173 let mayStore = 1; 1174} 1175 1176let mayLoad = 0, mayStore = 0, hasSideEffects = 1 in 1177def S_WAITCNT : SOPP <0x0000000c, (ins WAIT_FLAG:$simm16), "s_waitcnt $simm16", 1178 [(int_amdgcn_s_waitcnt timm:$simm16)]>; 1179def S_SETHALT : SOPP <0x0000000d, (ins i16imm:$simm16), "s_sethalt $simm16">; 1180def S_SETKILL : SOPP <0x0000000b, (ins i16imm:$simm16), "s_setkill $simm16">; 1181 1182// On SI the documentation says sleep for approximately 64 * low 2 1183// bits, consistent with the reported maximum of 448. On VI the 1184// maximum reported is 960 cycles, so 960 / 64 = 15 max, so is the 1185// maximum really 15 on VI? 1186def S_SLEEP : SOPP <0x0000000e, (ins i32imm:$simm16), 1187 "s_sleep $simm16", [(int_amdgcn_s_sleep timm:$simm16)]> { 1188 let hasSideEffects = 1; 1189 let mayLoad = 0; 1190 let mayStore = 0; 1191} 1192 1193def S_SETPRIO : SOPP <0x0000000f, (ins i16imm:$simm16), "s_setprio $simm16">; 1194 1195let Uses = [EXEC, M0] in { 1196// FIXME: Should this be mayLoad+mayStore? 1197def S_SENDMSG : SOPP <0x00000010, (ins SendMsgImm:$simm16), "s_sendmsg $simm16", 1198 [(int_amdgcn_s_sendmsg (i32 timm:$simm16), M0)]>; 1199 1200def S_SENDMSGHALT : SOPP <0x00000011, (ins SendMsgImm:$simm16), "s_sendmsghalt $simm16", 1201 [(int_amdgcn_s_sendmsghalt (i32 timm:$simm16), M0)]>; 1202 1203} // End Uses = [EXEC, M0] 1204 1205def S_TRAP : SOPP <0x00000012, (ins i16imm:$simm16), "s_trap $simm16"> { 1206 let isTrap = 1; 1207} 1208 1209def S_ICACHE_INV : SOPP <0x00000013, (ins), "s_icache_inv"> { 1210 let simm16 = 0; 1211} 1212def S_INCPERFLEVEL : SOPP <0x00000014, (ins i32imm:$simm16), "s_incperflevel $simm16", 1213 [(int_amdgcn_s_incperflevel timm:$simm16)]> { 1214 let hasSideEffects = 1; 1215 let mayLoad = 0; 1216 let mayStore = 0; 1217} 1218def S_DECPERFLEVEL : SOPP <0x00000015, (ins i32imm:$simm16), "s_decperflevel $simm16", 1219 [(int_amdgcn_s_decperflevel timm:$simm16)]> { 1220 let hasSideEffects = 1; 1221 let mayLoad = 0; 1222 let mayStore = 0; 1223} 1224def S_TTRACEDATA : SOPP <0x00000016, (ins), "s_ttracedata"> { 1225 let simm16 = 0; 1226} 1227 1228let SubtargetPredicate = HasVGPRIndexMode in { 1229def S_SET_GPR_IDX_OFF : SOPP<0x1c, (ins), "s_set_gpr_idx_off"> { 1230 let simm16 = 0; 1231 let Defs = [MODE]; 1232 let Uses = [MODE]; 1233} 1234} 1235} // End hasSideEffects 1236 1237let SubtargetPredicate = HasVGPRIndexMode in { 1238def S_SET_GPR_IDX_MODE : SOPP<0x1d, (ins GPRIdxMode:$simm16), 1239 "s_set_gpr_idx_mode$simm16"> { 1240 let Defs = [M0, MODE]; 1241 let Uses = [MODE]; 1242} 1243} 1244 1245let SubtargetPredicate = isGFX10Plus in { 1246 def S_INST_PREFETCH : 1247 SOPP<0x020, (ins s16imm:$simm16), "s_inst_prefetch $simm16">; 1248 def S_CLAUSE : 1249 SOPP<0x021, (ins s16imm:$simm16), "s_clause $simm16">; 1250 def S_WAITCNT_IDLE : 1251 SOPP <0x022, (ins), "s_wait_idle"> { 1252 let simm16 = 0; 1253 } 1254 def S_WAITCNT_DEPCTR : 1255 SOPP <0x023, (ins s16imm:$simm16), "s_waitcnt_depctr $simm16">; 1256 1257 let hasSideEffects = 0, Uses = [MODE], Defs = [MODE] in { 1258 def S_ROUND_MODE : 1259 SOPP<0x024, (ins s16imm:$simm16), "s_round_mode $simm16">; 1260 def S_DENORM_MODE : 1261 SOPP<0x025, (ins i32imm:$simm16), "s_denorm_mode $simm16", 1262 [(SIdenorm_mode (i32 timm:$simm16))]>; 1263 } 1264 1265 def S_TTRACEDATA_IMM : 1266 SOPP<0x028, (ins s16imm:$simm16), "s_ttracedata_imm $simm16">; 1267} // End SubtargetPredicate = isGFX10Plus 1268 1269//===----------------------------------------------------------------------===// 1270// SOP1 Patterns 1271//===----------------------------------------------------------------------===// 1272 1273def : GCNPat < 1274 (AMDGPUendpgm), 1275 (S_ENDPGM (i16 0)) 1276>; 1277 1278def : GCNPat < 1279 (i64 (ctpop i64:$src)), 1280 (i64 (REG_SEQUENCE SReg_64, 1281 (i32 (COPY_TO_REGCLASS (S_BCNT1_I32_B64 $src), SReg_32)), sub0, 1282 (S_MOV_B32 (i32 0)), sub1)) 1283>; 1284 1285def : GCNPat < 1286 (i32 (smax i32:$x, (i32 (ineg i32:$x)))), 1287 (S_ABS_I32 SReg_32:$x) 1288>; 1289 1290def : GCNPat < 1291 (i16 imm:$imm), 1292 (S_MOV_B32 imm:$imm) 1293>; 1294 1295// Same as a 32-bit inreg 1296def : GCNPat< 1297 (i32 (UniformUnaryFrag<sext> i16:$src)), 1298 (S_SEXT_I32_I16 $src) 1299>; 1300 1301 1302//===----------------------------------------------------------------------===// 1303// SOP2 Patterns 1304//===----------------------------------------------------------------------===// 1305 1306// V_ADD_I32_e32/S_ADD_U32 produces carry in VCC/SCC. For the vector 1307// case, the sgpr-copies pass will fix this to use the vector version. 1308def : GCNPat < 1309 (i32 (addc i32:$src0, i32:$src1)), 1310 (S_ADD_U32 $src0, $src1) 1311>; 1312 1313// FIXME: We need to use COPY_TO_REGCLASS to work-around the fact that 1314// REG_SEQUENCE patterns don't support instructions with multiple 1315// outputs. 1316def : GCNPat< 1317 (i64 (zext i16:$src)), 1318 (REG_SEQUENCE SReg_64, 1319 (i32 (COPY_TO_REGCLASS (S_AND_B32 $src, (S_MOV_B32 (i32 0xffff))), SGPR_32)), sub0, 1320 (S_MOV_B32 (i32 0)), sub1) 1321>; 1322 1323def : GCNPat < 1324 (i64 (UniformUnaryFrag<sext> i16:$src)), 1325 (REG_SEQUENCE SReg_64, (i32 (S_SEXT_I32_I16 $src)), sub0, 1326 (i32 (COPY_TO_REGCLASS (S_ASHR_I32 (i32 (S_SEXT_I32_I16 $src)), (S_MOV_B32 (i32 31))), SGPR_32)), sub1) 1327>; 1328 1329def : GCNPat< 1330 (i32 (zext i16:$src)), 1331 (S_AND_B32 (S_MOV_B32 (i32 0xffff)), $src) 1332>; 1333 1334// FIXME: ValueType should have isVector field 1335class ScalarNot2Pat<Instruction inst, SDPatternOperator op, ValueType vt, 1336 bit isVector = 1> : GCNPat< 1337 (UniformBinFrag<op> vt:$src0, (UniformUnaryFrag<!if(isVector, vnot, not)> vt:$src1)), 1338 (inst getSOPSrcForVT<vt>.ret:$src0, getSOPSrcForVT<vt>.ret:$src1) 1339>; 1340 1341// Match these for some more types 1342// TODO: i1 1343def : ScalarNot2Pat<S_ANDN2_B32, and, i16, 0>; 1344def : ScalarNot2Pat<S_ANDN2_B32, and, v2i16>; 1345def : ScalarNot2Pat<S_ANDN2_B64, and, v4i16>; 1346def : ScalarNot2Pat<S_ANDN2_B64, and, v2i32>; 1347 1348def : ScalarNot2Pat<S_ORN2_B32, or, i16, 0>; 1349def : ScalarNot2Pat<S_ORN2_B32, or, v2i16>; 1350def : ScalarNot2Pat<S_ORN2_B64, or, v4i16>; 1351def : ScalarNot2Pat<S_ORN2_B64, or, v2i32>; 1352 1353//===----------------------------------------------------------------------===// 1354// Target-specific instruction encodings. 1355//===----------------------------------------------------------------------===// 1356 1357//===----------------------------------------------------------------------===// 1358// SOP1 - GFX10. 1359//===----------------------------------------------------------------------===// 1360 1361class Select_gfx10<string opName> : SIMCInstr<opName, SIEncodingFamily.GFX10> { 1362 Predicate AssemblerPredicate = isGFX10Plus; 1363 string DecoderNamespace = "GFX10"; 1364} 1365 1366multiclass SOP1_Real_gfx10<bits<8> op> { 1367 def _gfx10 : SOP1_Real<op, !cast<SOP1_Pseudo>(NAME)>, 1368 Select_gfx10<!cast<SOP1_Pseudo>(NAME).Mnemonic>; 1369} 1370 1371defm S_ANDN1_SAVEEXEC_B64 : SOP1_Real_gfx10<0x037>; 1372defm S_ORN1_SAVEEXEC_B64 : SOP1_Real_gfx10<0x038>; 1373defm S_ANDN1_WREXEC_B64 : SOP1_Real_gfx10<0x039>; 1374defm S_ANDN2_WREXEC_B64 : SOP1_Real_gfx10<0x03a>; 1375defm S_BITREPLICATE_B64_B32 : SOP1_Real_gfx10<0x03b>; 1376defm S_AND_SAVEEXEC_B32 : SOP1_Real_gfx10<0x03c>; 1377defm S_OR_SAVEEXEC_B32 : SOP1_Real_gfx10<0x03d>; 1378defm S_XOR_SAVEEXEC_B32 : SOP1_Real_gfx10<0x03e>; 1379defm S_ANDN2_SAVEEXEC_B32 : SOP1_Real_gfx10<0x03f>; 1380defm S_ORN2_SAVEEXEC_B32 : SOP1_Real_gfx10<0x040>; 1381defm S_NAND_SAVEEXEC_B32 : SOP1_Real_gfx10<0x041>; 1382defm S_NOR_SAVEEXEC_B32 : SOP1_Real_gfx10<0x042>; 1383defm S_XNOR_SAVEEXEC_B32 : SOP1_Real_gfx10<0x043>; 1384defm S_ANDN1_SAVEEXEC_B32 : SOP1_Real_gfx10<0x044>; 1385defm S_ORN1_SAVEEXEC_B32 : SOP1_Real_gfx10<0x045>; 1386defm S_ANDN1_WREXEC_B32 : SOP1_Real_gfx10<0x046>; 1387defm S_ANDN2_WREXEC_B32 : SOP1_Real_gfx10<0x047>; 1388defm S_MOVRELSD_2_B32 : SOP1_Real_gfx10<0x049>; 1389 1390//===----------------------------------------------------------------------===// 1391// SOP1 - GFX6, GFX7. 1392//===----------------------------------------------------------------------===// 1393 1394class Select_gfx6_gfx7<string opName> : SIMCInstr<opName, SIEncodingFamily.SI> { 1395 Predicate AssemblerPredicate = isGFX6GFX7; 1396 string DecoderNamespace = "GFX6GFX7"; 1397} 1398 1399multiclass SOP1_Real_gfx6_gfx7<bits<8> op> { 1400 def _gfx6_gfx7 : SOP1_Real<op, !cast<SOP1_Pseudo>(NAME)>, 1401 Select_gfx6_gfx7<!cast<SOP1_Pseudo>(NAME).Mnemonic>; 1402} 1403 1404multiclass SOP1_Real_gfx6_gfx7_gfx10<bits<8> op> : 1405 SOP1_Real_gfx6_gfx7<op>, SOP1_Real_gfx10<op>; 1406 1407defm S_CBRANCH_JOIN : SOP1_Real_gfx6_gfx7<0x032>; 1408 1409defm S_MOV_B32 : SOP1_Real_gfx6_gfx7_gfx10<0x003>; 1410defm S_MOV_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x004>; 1411defm S_CMOV_B32 : SOP1_Real_gfx6_gfx7_gfx10<0x005>; 1412defm S_CMOV_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x006>; 1413defm S_NOT_B32 : SOP1_Real_gfx6_gfx7_gfx10<0x007>; 1414defm S_NOT_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x008>; 1415defm S_WQM_B32 : SOP1_Real_gfx6_gfx7_gfx10<0x009>; 1416defm S_WQM_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x00a>; 1417defm S_BREV_B32 : SOP1_Real_gfx6_gfx7_gfx10<0x00b>; 1418defm S_BREV_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x00c>; 1419defm S_BCNT0_I32_B32 : SOP1_Real_gfx6_gfx7_gfx10<0x00d>; 1420defm S_BCNT0_I32_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x00e>; 1421defm S_BCNT1_I32_B32 : SOP1_Real_gfx6_gfx7_gfx10<0x00f>; 1422defm S_BCNT1_I32_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x010>; 1423defm S_FF0_I32_B32 : SOP1_Real_gfx6_gfx7_gfx10<0x011>; 1424defm S_FF0_I32_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x012>; 1425defm S_FF1_I32_B32 : SOP1_Real_gfx6_gfx7_gfx10<0x013>; 1426defm S_FF1_I32_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x014>; 1427defm S_FLBIT_I32_B32 : SOP1_Real_gfx6_gfx7_gfx10<0x015>; 1428defm S_FLBIT_I32_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x016>; 1429defm S_FLBIT_I32 : SOP1_Real_gfx6_gfx7_gfx10<0x017>; 1430defm S_FLBIT_I32_I64 : SOP1_Real_gfx6_gfx7_gfx10<0x018>; 1431defm S_SEXT_I32_I8 : SOP1_Real_gfx6_gfx7_gfx10<0x019>; 1432defm S_SEXT_I32_I16 : SOP1_Real_gfx6_gfx7_gfx10<0x01a>; 1433defm S_BITSET0_B32 : SOP1_Real_gfx6_gfx7_gfx10<0x01b>; 1434defm S_BITSET0_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x01c>; 1435defm S_BITSET1_B32 : SOP1_Real_gfx6_gfx7_gfx10<0x01d>; 1436defm S_BITSET1_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x01e>; 1437defm S_GETPC_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x01f>; 1438defm S_SETPC_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x020>; 1439defm S_SWAPPC_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x021>; 1440defm S_RFE_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x022>; 1441defm S_AND_SAVEEXEC_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x024>; 1442defm S_OR_SAVEEXEC_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x025>; 1443defm S_XOR_SAVEEXEC_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x026>; 1444defm S_ANDN2_SAVEEXEC_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x027>; 1445defm S_ORN2_SAVEEXEC_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x028>; 1446defm S_NAND_SAVEEXEC_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x029>; 1447defm S_NOR_SAVEEXEC_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x02a>; 1448defm S_XNOR_SAVEEXEC_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x02b>; 1449defm S_QUADMASK_B32 : SOP1_Real_gfx6_gfx7_gfx10<0x02c>; 1450defm S_QUADMASK_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x02d>; 1451defm S_MOVRELS_B32 : SOP1_Real_gfx6_gfx7_gfx10<0x02e>; 1452defm S_MOVRELS_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x02f>; 1453defm S_MOVRELD_B32 : SOP1_Real_gfx6_gfx7_gfx10<0x030>; 1454defm S_MOVRELD_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x031>; 1455defm S_ABS_I32 : SOP1_Real_gfx6_gfx7_gfx10<0x034>; 1456 1457//===----------------------------------------------------------------------===// 1458// SOP2 - GFX10. 1459//===----------------------------------------------------------------------===// 1460 1461multiclass SOP2_Real_gfx10<bits<7> op> { 1462 def _gfx10 : SOP2_Real<op, !cast<SOP2_Pseudo>(NAME)>, 1463 Select_gfx10<!cast<SOP2_Pseudo>(NAME).Mnemonic>; 1464} 1465 1466defm S_LSHL1_ADD_U32 : SOP2_Real_gfx10<0x02e>; 1467defm S_LSHL2_ADD_U32 : SOP2_Real_gfx10<0x02f>; 1468defm S_LSHL3_ADD_U32 : SOP2_Real_gfx10<0x030>; 1469defm S_LSHL4_ADD_U32 : SOP2_Real_gfx10<0x031>; 1470defm S_PACK_LL_B32_B16 : SOP2_Real_gfx10<0x032>; 1471defm S_PACK_LH_B32_B16 : SOP2_Real_gfx10<0x033>; 1472defm S_PACK_HH_B32_B16 : SOP2_Real_gfx10<0x034>; 1473defm S_MUL_HI_U32 : SOP2_Real_gfx10<0x035>; 1474defm S_MUL_HI_I32 : SOP2_Real_gfx10<0x036>; 1475 1476//===----------------------------------------------------------------------===// 1477// SOP2 - GFX6, GFX7. 1478//===----------------------------------------------------------------------===// 1479 1480multiclass SOP2_Real_gfx6_gfx7<bits<7> op> { 1481 def _gfx6_gfx7 : SOP2_Real<op, !cast<SOP_Pseudo>(NAME)>, 1482 Select_gfx6_gfx7<!cast<SOP_Pseudo>(NAME).Mnemonic>; 1483} 1484 1485multiclass SOP2_Real_gfx6_gfx7_gfx10<bits<7> op> : 1486 SOP2_Real_gfx6_gfx7<op>, SOP2_Real_gfx10<op>; 1487 1488defm S_CBRANCH_G_FORK : SOP2_Real_gfx6_gfx7<0x02b>; 1489 1490defm S_ADD_U32 : SOP2_Real_gfx6_gfx7_gfx10<0x000>; 1491defm S_SUB_U32 : SOP2_Real_gfx6_gfx7_gfx10<0x001>; 1492defm S_ADD_I32 : SOP2_Real_gfx6_gfx7_gfx10<0x002>; 1493defm S_SUB_I32 : SOP2_Real_gfx6_gfx7_gfx10<0x003>; 1494defm S_ADDC_U32 : SOP2_Real_gfx6_gfx7_gfx10<0x004>; 1495defm S_SUBB_U32 : SOP2_Real_gfx6_gfx7_gfx10<0x005>; 1496defm S_MIN_I32 : SOP2_Real_gfx6_gfx7_gfx10<0x006>; 1497defm S_MIN_U32 : SOP2_Real_gfx6_gfx7_gfx10<0x007>; 1498defm S_MAX_I32 : SOP2_Real_gfx6_gfx7_gfx10<0x008>; 1499defm S_MAX_U32 : SOP2_Real_gfx6_gfx7_gfx10<0x009>; 1500defm S_CSELECT_B32 : SOP2_Real_gfx6_gfx7_gfx10<0x00a>; 1501defm S_CSELECT_B64 : SOP2_Real_gfx6_gfx7_gfx10<0x00b>; 1502defm S_AND_B32 : SOP2_Real_gfx6_gfx7_gfx10<0x00e>; 1503defm S_AND_B64 : SOP2_Real_gfx6_gfx7_gfx10<0x00f>; 1504defm S_OR_B32 : SOP2_Real_gfx6_gfx7_gfx10<0x010>; 1505defm S_OR_B64 : SOP2_Real_gfx6_gfx7_gfx10<0x011>; 1506defm S_XOR_B32 : SOP2_Real_gfx6_gfx7_gfx10<0x012>; 1507defm S_XOR_B64 : SOP2_Real_gfx6_gfx7_gfx10<0x013>; 1508defm S_ANDN2_B32 : SOP2_Real_gfx6_gfx7_gfx10<0x014>; 1509defm S_ANDN2_B64 : SOP2_Real_gfx6_gfx7_gfx10<0x015>; 1510defm S_ORN2_B32 : SOP2_Real_gfx6_gfx7_gfx10<0x016>; 1511defm S_ORN2_B64 : SOP2_Real_gfx6_gfx7_gfx10<0x017>; 1512defm S_NAND_B32 : SOP2_Real_gfx6_gfx7_gfx10<0x018>; 1513defm S_NAND_B64 : SOP2_Real_gfx6_gfx7_gfx10<0x019>; 1514defm S_NOR_B32 : SOP2_Real_gfx6_gfx7_gfx10<0x01a>; 1515defm S_NOR_B64 : SOP2_Real_gfx6_gfx7_gfx10<0x01b>; 1516defm S_XNOR_B32 : SOP2_Real_gfx6_gfx7_gfx10<0x01c>; 1517defm S_XNOR_B64 : SOP2_Real_gfx6_gfx7_gfx10<0x01d>; 1518defm S_LSHL_B32 : SOP2_Real_gfx6_gfx7_gfx10<0x01e>; 1519defm S_LSHL_B64 : SOP2_Real_gfx6_gfx7_gfx10<0x01f>; 1520defm S_LSHR_B32 : SOP2_Real_gfx6_gfx7_gfx10<0x020>; 1521defm S_LSHR_B64 : SOP2_Real_gfx6_gfx7_gfx10<0x021>; 1522defm S_ASHR_I32 : SOP2_Real_gfx6_gfx7_gfx10<0x022>; 1523defm S_ASHR_I64 : SOP2_Real_gfx6_gfx7_gfx10<0x023>; 1524defm S_BFM_B32 : SOP2_Real_gfx6_gfx7_gfx10<0x024>; 1525defm S_BFM_B64 : SOP2_Real_gfx6_gfx7_gfx10<0x025>; 1526defm S_MUL_I32 : SOP2_Real_gfx6_gfx7_gfx10<0x026>; 1527defm S_BFE_U32 : SOP2_Real_gfx6_gfx7_gfx10<0x027>; 1528defm S_BFE_I32 : SOP2_Real_gfx6_gfx7_gfx10<0x028>; 1529defm S_BFE_U64 : SOP2_Real_gfx6_gfx7_gfx10<0x029>; 1530defm S_BFE_I64 : SOP2_Real_gfx6_gfx7_gfx10<0x02a>; 1531defm S_ABSDIFF_I32 : SOP2_Real_gfx6_gfx7_gfx10<0x02c>; 1532 1533//===----------------------------------------------------------------------===// 1534// SOPK - GFX10. 1535//===----------------------------------------------------------------------===// 1536 1537multiclass SOPK_Real32_gfx10<bits<5> op> { 1538 def _gfx10 : SOPK_Real32<op, !cast<SOPK_Pseudo>(NAME)>, 1539 Select_gfx10<!cast<SOPK_Pseudo>(NAME).Mnemonic>; 1540} 1541 1542multiclass SOPK_Real64_gfx10<bits<5> op> { 1543 def _gfx10 : SOPK_Real64<op, !cast<SOPK_Pseudo>(NAME)>, 1544 Select_gfx10<!cast<SOPK_Pseudo>(NAME).Mnemonic>; 1545} 1546 1547defm S_VERSION : SOPK_Real32_gfx10<0x001>; 1548defm S_CALL_B64 : SOPK_Real32_gfx10<0x016>; 1549defm S_WAITCNT_VSCNT : SOPK_Real32_gfx10<0x017>; 1550defm S_WAITCNT_VMCNT : SOPK_Real32_gfx10<0x018>; 1551defm S_WAITCNT_EXPCNT : SOPK_Real32_gfx10<0x019>; 1552defm S_WAITCNT_LGKMCNT : SOPK_Real32_gfx10<0x01a>; 1553defm S_SUBVECTOR_LOOP_BEGIN : SOPK_Real32_gfx10<0x01b>; 1554defm S_SUBVECTOR_LOOP_END : SOPK_Real32_gfx10<0x01c>; 1555 1556//===----------------------------------------------------------------------===// 1557// SOPK - GFX6, GFX7. 1558//===----------------------------------------------------------------------===// 1559 1560multiclass SOPK_Real32_gfx6_gfx7<bits<5> op> { 1561 def _gfx6_gfx7 : SOPK_Real32<op, !cast<SOPK_Pseudo>(NAME)>, 1562 Select_gfx6_gfx7<!cast<SOPK_Pseudo>(NAME).Mnemonic>; 1563} 1564 1565multiclass SOPK_Real64_gfx6_gfx7<bits<5> op> { 1566 def _gfx6_gfx7 : SOPK_Real64<op, !cast<SOPK_Pseudo>(NAME)>, 1567 Select_gfx6_gfx7<!cast<SOPK_Pseudo>(NAME).Mnemonic>; 1568} 1569 1570multiclass SOPK_Real32_gfx6_gfx7_gfx10<bits<5> op> : 1571 SOPK_Real32_gfx6_gfx7<op>, SOPK_Real32_gfx10<op>; 1572 1573multiclass SOPK_Real64_gfx6_gfx7_gfx10<bits<5> op> : 1574 SOPK_Real64_gfx6_gfx7<op>, SOPK_Real64_gfx10<op>; 1575 1576defm S_CBRANCH_I_FORK : SOPK_Real32_gfx6_gfx7<0x011>; 1577 1578defm S_MOVK_I32 : SOPK_Real32_gfx6_gfx7_gfx10<0x000>; 1579defm S_CMOVK_I32 : SOPK_Real32_gfx6_gfx7_gfx10<0x002>; 1580defm S_CMPK_EQ_I32 : SOPK_Real32_gfx6_gfx7_gfx10<0x003>; 1581defm S_CMPK_LG_I32 : SOPK_Real32_gfx6_gfx7_gfx10<0x004>; 1582defm S_CMPK_GT_I32 : SOPK_Real32_gfx6_gfx7_gfx10<0x005>; 1583defm S_CMPK_GE_I32 : SOPK_Real32_gfx6_gfx7_gfx10<0x006>; 1584defm S_CMPK_LT_I32 : SOPK_Real32_gfx6_gfx7_gfx10<0x007>; 1585defm S_CMPK_LE_I32 : SOPK_Real32_gfx6_gfx7_gfx10<0x008>; 1586defm S_CMPK_EQ_U32 : SOPK_Real32_gfx6_gfx7_gfx10<0x009>; 1587defm S_CMPK_LG_U32 : SOPK_Real32_gfx6_gfx7_gfx10<0x00a>; 1588defm S_CMPK_GT_U32 : SOPK_Real32_gfx6_gfx7_gfx10<0x00b>; 1589defm S_CMPK_GE_U32 : SOPK_Real32_gfx6_gfx7_gfx10<0x00c>; 1590defm S_CMPK_LT_U32 : SOPK_Real32_gfx6_gfx7_gfx10<0x00d>; 1591defm S_CMPK_LE_U32 : SOPK_Real32_gfx6_gfx7_gfx10<0x00e>; 1592defm S_ADDK_I32 : SOPK_Real32_gfx6_gfx7_gfx10<0x00f>; 1593defm S_MULK_I32 : SOPK_Real32_gfx6_gfx7_gfx10<0x010>; 1594defm S_GETREG_B32 : SOPK_Real32_gfx6_gfx7_gfx10<0x012>; 1595defm S_SETREG_B32 : SOPK_Real32_gfx6_gfx7_gfx10<0x013>; 1596defm S_SETREG_IMM32_B32 : SOPK_Real64_gfx6_gfx7_gfx10<0x015>; 1597 1598//===----------------------------------------------------------------------===// 1599// GFX8, GFX9 (VI). 1600//===----------------------------------------------------------------------===// 1601 1602class Select_vi<string opName> : 1603 SIMCInstr<opName, SIEncodingFamily.VI> { 1604 Predicate AssemblerPredicate = isGFX8GFX9; 1605 string DecoderNamespace = "GFX8"; 1606} 1607 1608class SOP1_Real_vi<bits<8> op, SOP1_Pseudo ps> : 1609 SOP1_Real<op, ps>, 1610 Select_vi<ps.Mnemonic>; 1611 1612 1613class SOP2_Real_vi<bits<7> op, SOP2_Pseudo ps> : 1614 SOP2_Real<op, ps>, 1615 Select_vi<ps.Mnemonic>; 1616 1617class SOPK_Real_vi<bits<5> op, SOPK_Pseudo ps> : 1618 SOPK_Real32<op, ps>, 1619 Select_vi<ps.Mnemonic>; 1620 1621def S_MOV_B32_vi : SOP1_Real_vi <0x00, S_MOV_B32>; 1622def S_MOV_B64_vi : SOP1_Real_vi <0x01, S_MOV_B64>; 1623def S_CMOV_B32_vi : SOP1_Real_vi <0x02, S_CMOV_B32>; 1624def S_CMOV_B64_vi : SOP1_Real_vi <0x03, S_CMOV_B64>; 1625def S_NOT_B32_vi : SOP1_Real_vi <0x04, S_NOT_B32>; 1626def S_NOT_B64_vi : SOP1_Real_vi <0x05, S_NOT_B64>; 1627def S_WQM_B32_vi : SOP1_Real_vi <0x06, S_WQM_B32>; 1628def S_WQM_B64_vi : SOP1_Real_vi <0x07, S_WQM_B64>; 1629def S_BREV_B32_vi : SOP1_Real_vi <0x08, S_BREV_B32>; 1630def S_BREV_B64_vi : SOP1_Real_vi <0x09, S_BREV_B64>; 1631def S_BCNT0_I32_B32_vi : SOP1_Real_vi <0x0a, S_BCNT0_I32_B32>; 1632def S_BCNT0_I32_B64_vi : SOP1_Real_vi <0x0b, S_BCNT0_I32_B64>; 1633def S_BCNT1_I32_B32_vi : SOP1_Real_vi <0x0c, S_BCNT1_I32_B32>; 1634def S_BCNT1_I32_B64_vi : SOP1_Real_vi <0x0d, S_BCNT1_I32_B64>; 1635def S_FF0_I32_B32_vi : SOP1_Real_vi <0x0e, S_FF0_I32_B32>; 1636def S_FF0_I32_B64_vi : SOP1_Real_vi <0x0f, S_FF0_I32_B64>; 1637def S_FF1_I32_B32_vi : SOP1_Real_vi <0x10, S_FF1_I32_B32>; 1638def S_FF1_I32_B64_vi : SOP1_Real_vi <0x11, S_FF1_I32_B64>; 1639def S_FLBIT_I32_B32_vi : SOP1_Real_vi <0x12, S_FLBIT_I32_B32>; 1640def S_FLBIT_I32_B64_vi : SOP1_Real_vi <0x13, S_FLBIT_I32_B64>; 1641def S_FLBIT_I32_vi : SOP1_Real_vi <0x14, S_FLBIT_I32>; 1642def S_FLBIT_I32_I64_vi : SOP1_Real_vi <0x15, S_FLBIT_I32_I64>; 1643def S_SEXT_I32_I8_vi : SOP1_Real_vi <0x16, S_SEXT_I32_I8>; 1644def S_SEXT_I32_I16_vi : SOP1_Real_vi <0x17, S_SEXT_I32_I16>; 1645def S_BITSET0_B32_vi : SOP1_Real_vi <0x18, S_BITSET0_B32>; 1646def S_BITSET0_B64_vi : SOP1_Real_vi <0x19, S_BITSET0_B64>; 1647def S_BITSET1_B32_vi : SOP1_Real_vi <0x1a, S_BITSET1_B32>; 1648def S_BITSET1_B64_vi : SOP1_Real_vi <0x1b, S_BITSET1_B64>; 1649def S_GETPC_B64_vi : SOP1_Real_vi <0x1c, S_GETPC_B64>; 1650def S_SETPC_B64_vi : SOP1_Real_vi <0x1d, S_SETPC_B64>; 1651def S_SWAPPC_B64_vi : SOP1_Real_vi <0x1e, S_SWAPPC_B64>; 1652def S_RFE_B64_vi : SOP1_Real_vi <0x1f, S_RFE_B64>; 1653def S_AND_SAVEEXEC_B64_vi : SOP1_Real_vi <0x20, S_AND_SAVEEXEC_B64>; 1654def S_OR_SAVEEXEC_B64_vi : SOP1_Real_vi <0x21, S_OR_SAVEEXEC_B64>; 1655def S_XOR_SAVEEXEC_B64_vi : SOP1_Real_vi <0x22, S_XOR_SAVEEXEC_B64>; 1656def S_ANDN2_SAVEEXEC_B64_vi: SOP1_Real_vi <0x23, S_ANDN2_SAVEEXEC_B64>; 1657def S_ORN2_SAVEEXEC_B64_vi : SOP1_Real_vi <0x24, S_ORN2_SAVEEXEC_B64>; 1658def S_NAND_SAVEEXEC_B64_vi : SOP1_Real_vi <0x25, S_NAND_SAVEEXEC_B64>; 1659def S_NOR_SAVEEXEC_B64_vi : SOP1_Real_vi <0x26, S_NOR_SAVEEXEC_B64>; 1660def S_XNOR_SAVEEXEC_B64_vi : SOP1_Real_vi <0x27, S_XNOR_SAVEEXEC_B64>; 1661def S_QUADMASK_B32_vi : SOP1_Real_vi <0x28, S_QUADMASK_B32>; 1662def S_QUADMASK_B64_vi : SOP1_Real_vi <0x29, S_QUADMASK_B64>; 1663def S_MOVRELS_B32_vi : SOP1_Real_vi <0x2a, S_MOVRELS_B32>; 1664def S_MOVRELS_B64_vi : SOP1_Real_vi <0x2b, S_MOVRELS_B64>; 1665def S_MOVRELD_B32_vi : SOP1_Real_vi <0x2c, S_MOVRELD_B32>; 1666def S_MOVRELD_B64_vi : SOP1_Real_vi <0x2d, S_MOVRELD_B64>; 1667def S_CBRANCH_JOIN_vi : SOP1_Real_vi <0x2e, S_CBRANCH_JOIN>; 1668def S_ABS_I32_vi : SOP1_Real_vi <0x30, S_ABS_I32>; 1669def S_SET_GPR_IDX_IDX_vi : SOP1_Real_vi <0x32, S_SET_GPR_IDX_IDX>; 1670 1671def S_ADD_U32_vi : SOP2_Real_vi <0x00, S_ADD_U32>; 1672def S_ADD_I32_vi : SOP2_Real_vi <0x02, S_ADD_I32>; 1673def S_SUB_U32_vi : SOP2_Real_vi <0x01, S_SUB_U32>; 1674def S_SUB_I32_vi : SOP2_Real_vi <0x03, S_SUB_I32>; 1675def S_ADDC_U32_vi : SOP2_Real_vi <0x04, S_ADDC_U32>; 1676def S_SUBB_U32_vi : SOP2_Real_vi <0x05, S_SUBB_U32>; 1677def S_MIN_I32_vi : SOP2_Real_vi <0x06, S_MIN_I32>; 1678def S_MIN_U32_vi : SOP2_Real_vi <0x07, S_MIN_U32>; 1679def S_MAX_I32_vi : SOP2_Real_vi <0x08, S_MAX_I32>; 1680def S_MAX_U32_vi : SOP2_Real_vi <0x09, S_MAX_U32>; 1681def S_CSELECT_B32_vi : SOP2_Real_vi <0x0a, S_CSELECT_B32>; 1682def S_CSELECT_B64_vi : SOP2_Real_vi <0x0b, S_CSELECT_B64>; 1683def S_AND_B32_vi : SOP2_Real_vi <0x0c, S_AND_B32>; 1684def S_AND_B64_vi : SOP2_Real_vi <0x0d, S_AND_B64>; 1685def S_OR_B32_vi : SOP2_Real_vi <0x0e, S_OR_B32>; 1686def S_OR_B64_vi : SOP2_Real_vi <0x0f, S_OR_B64>; 1687def S_XOR_B32_vi : SOP2_Real_vi <0x10, S_XOR_B32>; 1688def S_XOR_B64_vi : SOP2_Real_vi <0x11, S_XOR_B64>; 1689def S_ANDN2_B32_vi : SOP2_Real_vi <0x12, S_ANDN2_B32>; 1690def S_ANDN2_B64_vi : SOP2_Real_vi <0x13, S_ANDN2_B64>; 1691def S_ORN2_B32_vi : SOP2_Real_vi <0x14, S_ORN2_B32>; 1692def S_ORN2_B64_vi : SOP2_Real_vi <0x15, S_ORN2_B64>; 1693def S_NAND_B32_vi : SOP2_Real_vi <0x16, S_NAND_B32>; 1694def S_NAND_B64_vi : SOP2_Real_vi <0x17, S_NAND_B64>; 1695def S_NOR_B32_vi : SOP2_Real_vi <0x18, S_NOR_B32>; 1696def S_NOR_B64_vi : SOP2_Real_vi <0x19, S_NOR_B64>; 1697def S_XNOR_B32_vi : SOP2_Real_vi <0x1a, S_XNOR_B32>; 1698def S_XNOR_B64_vi : SOP2_Real_vi <0x1b, S_XNOR_B64>; 1699def S_LSHL_B32_vi : SOP2_Real_vi <0x1c, S_LSHL_B32>; 1700def S_LSHL_B64_vi : SOP2_Real_vi <0x1d, S_LSHL_B64>; 1701def S_LSHR_B32_vi : SOP2_Real_vi <0x1e, S_LSHR_B32>; 1702def S_LSHR_B64_vi : SOP2_Real_vi <0x1f, S_LSHR_B64>; 1703def S_ASHR_I32_vi : SOP2_Real_vi <0x20, S_ASHR_I32>; 1704def S_ASHR_I64_vi : SOP2_Real_vi <0x21, S_ASHR_I64>; 1705def S_BFM_B32_vi : SOP2_Real_vi <0x22, S_BFM_B32>; 1706def S_BFM_B64_vi : SOP2_Real_vi <0x23, S_BFM_B64>; 1707def S_MUL_I32_vi : SOP2_Real_vi <0x24, S_MUL_I32>; 1708def S_BFE_U32_vi : SOP2_Real_vi <0x25, S_BFE_U32>; 1709def S_BFE_I32_vi : SOP2_Real_vi <0x26, S_BFE_I32>; 1710def S_BFE_U64_vi : SOP2_Real_vi <0x27, S_BFE_U64>; 1711def S_BFE_I64_vi : SOP2_Real_vi <0x28, S_BFE_I64>; 1712def S_CBRANCH_G_FORK_vi : SOP2_Real_vi <0x29, S_CBRANCH_G_FORK>; 1713def S_ABSDIFF_I32_vi : SOP2_Real_vi <0x2a, S_ABSDIFF_I32>; 1714def S_PACK_LL_B32_B16_vi : SOP2_Real_vi <0x32, S_PACK_LL_B32_B16>; 1715def S_PACK_LH_B32_B16_vi : SOP2_Real_vi <0x33, S_PACK_LH_B32_B16>; 1716def S_PACK_HH_B32_B16_vi : SOP2_Real_vi <0x34, S_PACK_HH_B32_B16>; 1717def S_RFE_RESTORE_B64_vi : SOP2_Real_vi <0x2b, S_RFE_RESTORE_B64>; 1718 1719def S_MOVK_I32_vi : SOPK_Real_vi <0x00, S_MOVK_I32>; 1720def S_CMOVK_I32_vi : SOPK_Real_vi <0x01, S_CMOVK_I32>; 1721def S_CMPK_EQ_I32_vi : SOPK_Real_vi <0x02, S_CMPK_EQ_I32>; 1722def S_CMPK_LG_I32_vi : SOPK_Real_vi <0x03, S_CMPK_LG_I32>; 1723def S_CMPK_GT_I32_vi : SOPK_Real_vi <0x04, S_CMPK_GT_I32>; 1724def S_CMPK_GE_I32_vi : SOPK_Real_vi <0x05, S_CMPK_GE_I32>; 1725def S_CMPK_LT_I32_vi : SOPK_Real_vi <0x06, S_CMPK_LT_I32>; 1726def S_CMPK_LE_I32_vi : SOPK_Real_vi <0x07, S_CMPK_LE_I32>; 1727def S_CMPK_EQ_U32_vi : SOPK_Real_vi <0x08, S_CMPK_EQ_U32>; 1728def S_CMPK_LG_U32_vi : SOPK_Real_vi <0x09, S_CMPK_LG_U32>; 1729def S_CMPK_GT_U32_vi : SOPK_Real_vi <0x0A, S_CMPK_GT_U32>; 1730def S_CMPK_GE_U32_vi : SOPK_Real_vi <0x0B, S_CMPK_GE_U32>; 1731def S_CMPK_LT_U32_vi : SOPK_Real_vi <0x0C, S_CMPK_LT_U32>; 1732def S_CMPK_LE_U32_vi : SOPK_Real_vi <0x0D, S_CMPK_LE_U32>; 1733def S_ADDK_I32_vi : SOPK_Real_vi <0x0E, S_ADDK_I32>; 1734def S_MULK_I32_vi : SOPK_Real_vi <0x0F, S_MULK_I32>; 1735def S_CBRANCH_I_FORK_vi : SOPK_Real_vi <0x10, S_CBRANCH_I_FORK>; 1736def S_GETREG_B32_vi : SOPK_Real_vi <0x11, S_GETREG_B32>; 1737def S_SETREG_B32_vi : SOPK_Real_vi <0x12, S_SETREG_B32>; 1738//def S_GETREG_REGRD_B32_vi : SOPK_Real_vi <0x13, S_GETREG_REGRD_B32>; // see pseudo for comments 1739def S_SETREG_IMM32_B32_vi : SOPK_Real64<0x14, S_SETREG_IMM32_B32>, 1740 Select_vi<S_SETREG_IMM32_B32.Mnemonic>; 1741 1742def S_CALL_B64_vi : SOPK_Real_vi <0x15, S_CALL_B64>; 1743 1744//===----------------------------------------------------------------------===// 1745// SOP1 - GFX9. 1746//===----------------------------------------------------------------------===// 1747 1748def S_ANDN1_SAVEEXEC_B64_vi : SOP1_Real_vi<0x33, S_ANDN1_SAVEEXEC_B64>; 1749def S_ORN1_SAVEEXEC_B64_vi : SOP1_Real_vi<0x34, S_ORN1_SAVEEXEC_B64>; 1750def S_ANDN1_WREXEC_B64_vi : SOP1_Real_vi<0x35, S_ANDN1_WREXEC_B64>; 1751def S_ANDN2_WREXEC_B64_vi : SOP1_Real_vi<0x36, S_ANDN2_WREXEC_B64>; 1752def S_BITREPLICATE_B64_B32_vi : SOP1_Real_vi<0x37, S_BITREPLICATE_B64_B32>; 1753 1754//===----------------------------------------------------------------------===// 1755// SOP2 - GFX9. 1756//===----------------------------------------------------------------------===// 1757 1758def S_LSHL1_ADD_U32_vi : SOP2_Real_vi<0x2e, S_LSHL1_ADD_U32>; 1759def S_LSHL2_ADD_U32_vi : SOP2_Real_vi<0x2f, S_LSHL2_ADD_U32>; 1760def S_LSHL3_ADD_U32_vi : SOP2_Real_vi<0x30, S_LSHL3_ADD_U32>; 1761def S_LSHL4_ADD_U32_vi : SOP2_Real_vi<0x31, S_LSHL4_ADD_U32>; 1762def S_MUL_HI_U32_vi : SOP2_Real_vi<0x2c, S_MUL_HI_U32>; 1763def S_MUL_HI_I32_vi : SOP2_Real_vi<0x2d, S_MUL_HI_I32>; 1764