1//===-- VOP2Instructions.td - Vector Instruction Defintions ---------------===// 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 9//===----------------------------------------------------------------------===// 10// VOP2 Classes 11//===----------------------------------------------------------------------===// 12 13class VOP2e <bits<6> op, VOPProfile P> : Enc32 { 14 bits<8> vdst; 15 bits<9> src0; 16 bits<8> src1; 17 18 let Inst{8-0} = !if(P.HasSrc0, src0, 0); 19 let Inst{16-9} = !if(P.HasSrc1, src1, 0); 20 let Inst{24-17} = !if(P.EmitDst, vdst, 0); 21 let Inst{30-25} = op; 22 let Inst{31} = 0x0; //encoding 23} 24 25class VOP2_MADKe <bits<6> op, VOPProfile P> : Enc64 { 26 bits<8> vdst; 27 bits<9> src0; 28 bits<8> src1; 29 bits<32> imm; 30 31 let Inst{8-0} = !if(P.HasSrc0, src0, 0); 32 let Inst{16-9} = !if(P.HasSrc1, src1, 0); 33 let Inst{24-17} = !if(P.EmitDst, vdst, 0); 34 let Inst{30-25} = op; 35 let Inst{31} = 0x0; // encoding 36 let Inst{63-32} = imm; 37} 38 39class VOP2_SDWAe <bits<6> op, VOPProfile P> : VOP_SDWAe <P> { 40 bits<8> vdst; 41 bits<8> src1; 42 43 let Inst{8-0} = 0xf9; // sdwa 44 let Inst{16-9} = !if(P.HasSrc1, src1{7-0}, 0); 45 let Inst{24-17} = !if(P.EmitDst, vdst{7-0}, 0); 46 let Inst{30-25} = op; 47 let Inst{31} = 0x0; // encoding 48} 49 50class VOP2_SDWA9Ae <bits<6> op, VOPProfile P> : VOP_SDWA9Ae <P> { 51 bits<8> vdst; 52 bits<9> src1; 53 54 let Inst{8-0} = 0xf9; // sdwa 55 let Inst{16-9} = !if(P.HasSrc1, src1{7-0}, 0); 56 let Inst{24-17} = !if(P.EmitDst, vdst{7-0}, 0); 57 let Inst{30-25} = op; 58 let Inst{31} = 0x0; // encoding 59 let Inst{63} = !if(P.HasSrc1, src1{8}, 0); // src1_sgpr 60} 61 62class VOP2_Pseudo <string opName, VOPProfile P, list<dag> pattern=[], string suffix = "_e32"> : 63 VOP_Pseudo <opName, suffix, P, P.Outs32, P.Ins32, "", pattern> { 64 65 let AsmOperands = P.Asm32; 66 67 let Size = 4; 68 let mayLoad = 0; 69 let mayStore = 0; 70 let hasSideEffects = 0; 71 72 let VOP2 = 1; 73 let VALU = 1; 74 let Uses = [EXEC]; 75 76 let AsmVariantName = AMDGPUAsmVariants.Default; 77} 78 79class VOP2_Real <VOP2_Pseudo ps, int EncodingFamily> : 80 InstSI <ps.OutOperandList, ps.InOperandList, ps.Mnemonic # ps.AsmOperands, []>, 81 SIMCInstr <ps.PseudoInstr, EncodingFamily> { 82 83 let isPseudo = 0; 84 let isCodeGenOnly = 0; 85 86 let Constraints = ps.Constraints; 87 let DisableEncoding = ps.DisableEncoding; 88 89 // copy relevant pseudo op flags 90 let SubtargetPredicate = ps.SubtargetPredicate; 91 let AsmMatchConverter = ps.AsmMatchConverter; 92 let AsmVariantName = ps.AsmVariantName; 93 let Constraints = ps.Constraints; 94 let DisableEncoding = ps.DisableEncoding; 95 let TSFlags = ps.TSFlags; 96 let UseNamedOperandTable = ps.UseNamedOperandTable; 97 let Uses = ps.Uses; 98 let Defs = ps.Defs; 99} 100 101class VOP2_SDWA_Pseudo <string OpName, VOPProfile P, list<dag> pattern=[]> : 102 VOP_SDWA_Pseudo <OpName, P, pattern> { 103 let AsmMatchConverter = "cvtSdwaVOP2"; 104} 105 106class VOP2_DPP_Pseudo <string OpName, VOPProfile P, list<dag> pattern=[]> : 107 VOP_DPP_Pseudo <OpName, P, pattern> { 108} 109 110 111class getVOP2Pat64 <SDPatternOperator node, VOPProfile P> : LetDummies { 112 list<dag> ret = !if(P.HasModifiers, 113 [(set P.DstVT:$vdst, 114 (node (P.Src0VT 115 !if(P.HasOMod, 116 (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers, i1:$clamp, i32:$omod), 117 (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers, i1:$clamp))), 118 (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers))))], 119 [(set P.DstVT:$vdst, (node P.Src0VT:$src0, P.Src1VT:$src1))]); 120} 121 122multiclass VOP2Inst_e32<string opName, 123 VOPProfile P, 124 SDPatternOperator node = null_frag, 125 string revOp = opName, 126 bit GFX9Renamed = 0> { 127 let renamedInGFX9 = GFX9Renamed in { 128 def _e32 : VOP2_Pseudo <opName, P, VOPPatOrNull<node,P>.ret>, 129 Commutable_REV<revOp#"_e32", !eq(revOp, opName)>; 130 } // End renamedInGFX9 = GFX9Renamed 131} 132 133multiclass VOP2Inst_e64<string opName, 134 VOPProfile P, 135 SDPatternOperator node = null_frag, 136 string revOp = opName, 137 bit GFX9Renamed = 0> { 138 let renamedInGFX9 = GFX9Renamed in { 139 def _e64 : VOP3_Pseudo <opName, P, getVOP2Pat64<node, P>.ret>, 140 Commutable_REV<revOp#"_e64", !eq(revOp, opName)>; 141 } // End renamedInGFX9 = GFX9Renamed 142} 143 144multiclass VOP2Inst_sdwa<string opName, 145 VOPProfile P, 146 SDPatternOperator node = null_frag, 147 string revOp = opName, 148 bit GFX9Renamed = 0> { 149 let renamedInGFX9 = GFX9Renamed in { 150 foreach _ = BoolToList<P.HasExtSDWA>.ret in 151 def _sdwa : VOP2_SDWA_Pseudo <opName, P>; 152 } // End renamedInGFX9 = GFX9Renamed 153} 154 155multiclass VOP2Inst<string opName, 156 VOPProfile P, 157 SDPatternOperator node = null_frag, 158 string revOp = opName, 159 bit GFX9Renamed = 0> : 160 VOP2Inst_e32<opName, P, node, revOp, GFX9Renamed>, 161 VOP2Inst_e64<opName, P, node, revOp, GFX9Renamed>, 162 VOP2Inst_sdwa<opName, P, node, revOp, GFX9Renamed> { 163 let renamedInGFX9 = GFX9Renamed in { 164 foreach _ = BoolToList<P.HasExtDPP>.ret in 165 def _dpp : VOP2_DPP_Pseudo <opName, P>; 166 } 167} 168 169multiclass VOP2bInst <string opName, 170 VOPProfile P, 171 SDPatternOperator node = null_frag, 172 string revOp = opName, 173 bit GFX9Renamed = 0, 174 bit useSGPRInput = !eq(P.NumSrcArgs, 3)> { 175 let renamedInGFX9 = GFX9Renamed in { 176 let SchedRW = [Write32Bit, WriteSALU] in { 177 let Uses = !if(useSGPRInput, [VCC, EXEC], [EXEC]), Defs = [VCC] in { 178 def _e32 : VOP2_Pseudo <opName, P, VOPPatOrNull<node,P>.ret>, 179 Commutable_REV<revOp#"_e32", !eq(revOp, opName)> { 180 let usesCustomInserter = !eq(P.NumSrcArgs, 2); 181 } 182 183 foreach _ = BoolToList<P.HasExtSDWA>.ret in 184 def _sdwa : VOP2_SDWA_Pseudo <opName, P> { 185 let AsmMatchConverter = "cvtSdwaVOP2b"; 186 } 187 foreach _ = BoolToList<P.HasExtDPP>.ret in 188 def _dpp : VOP2_DPP_Pseudo <opName, P>; 189 } 190 191 def _e64 : VOP3_Pseudo <opName, P, getVOP2Pat64<node, P>.ret>, 192 Commutable_REV<revOp#"_e64", !eq(revOp, opName)>; 193 } 194 } 195} 196 197class VOP2bInstAlias <VOP2_Pseudo ps, Instruction inst, 198 string OpName, string opnd> : 199 InstAlias <OpName#" "#!subst("vcc", opnd, ps.Pfl.Asm32), 200 (inst ps.Pfl.DstRC:$vdst, ps.Pfl.Src0RC32:$src0, 201 ps.Pfl.Src1RC32:$src1)>, 202 PredicateControl { 203} 204 205multiclass VOP2bInstAliases<VOP2_Pseudo ps, VOP2_Real inst, string OpName> { 206 let WaveSizePredicate = isWave32 in { 207 def : VOP2bInstAlias<ps, inst, OpName, "vcc_lo">; 208 } 209 let WaveSizePredicate = isWave64 in { 210 def : VOP2bInstAlias<ps, inst, OpName, "vcc">; 211 } 212} 213 214multiclass VOP2eInst <string opName, 215 VOPProfile P, 216 SDPatternOperator node = null_frag, 217 string revOp = opName, 218 bit useSGPRInput = !eq(P.NumSrcArgs, 3)> { 219 220 let SchedRW = [Write32Bit] in { 221 let Uses = !if(useSGPRInput, [VCC, EXEC], [EXEC]) in { 222 def _e32 : VOP2_Pseudo <opName, P>, 223 Commutable_REV<revOp#"_e32", !eq(revOp, opName)>; 224 225 foreach _ = BoolToList<P.HasExtSDWA>.ret in 226 def _sdwa : VOP2_SDWA_Pseudo <opName, P> { 227 let AsmMatchConverter = "cvtSdwaVOP2e"; 228 } 229 230 foreach _ = BoolToList<P.HasExtDPP>.ret in 231 def _dpp : VOP2_DPP_Pseudo <opName, P>; 232 } 233 234 def _e64 : VOP3_Pseudo <opName, P, getVOP2Pat64<node, P>.ret>, 235 Commutable_REV<revOp#"_e64", !eq(revOp, opName)>; 236 } 237} 238 239class VOP2eInstAlias <VOP2_Pseudo ps, Instruction inst, string opnd> : 240 InstAlias <ps.OpName#" "#ps.Pfl.Asm32#", "#opnd, 241 (inst ps.Pfl.DstRC:$vdst, ps.Pfl.Src0RC32:$src0, 242 ps.Pfl.Src1RC32:$src1)>, 243 PredicateControl { 244} 245 246multiclass VOP2eInstAliases<VOP2_Pseudo ps, VOP2_Real inst> { 247 let WaveSizePredicate = isWave32 in { 248 def : VOP2eInstAlias<ps, inst, "vcc_lo">; 249 } 250 let WaveSizePredicate = isWave64 in { 251 def : VOP2eInstAlias<ps, inst, "vcc">; 252 } 253} 254 255class VOP_MADAK <ValueType vt> : VOPProfile <[vt, vt, vt, vt]> { 256 field Operand ImmOpType = !if(!eq(vt.Size, 32), f32kimm, f16kimm); 257 field dag Ins32 = !if(!eq(vt.Size, 32), 258 (ins VCSrc_f32:$src0, VGPR_32:$src1, ImmOpType:$imm), 259 (ins VCSrc_f16:$src0, VGPR_32:$src1, ImmOpType:$imm)); 260 field bit HasExt = 0; 261 262 // Hack to stop printing _e64 263 let DstRC = RegisterOperand<VGPR_32>; 264 field string Asm32 = " $vdst, $src0, $src1, $imm"; 265} 266 267def VOP_MADAK_F16 : VOP_MADAK <f16>; 268def VOP_MADAK_F32 : VOP_MADAK <f32>; 269 270class VOP_MADMK <ValueType vt> : VOPProfile <[vt, vt, vt, vt]> { 271 field Operand ImmOpType = !if(!eq(vt.Size, 32), f32kimm, f16kimm); 272 field dag Ins32 = (ins VCSrc_f32:$src0, ImmOpType:$imm, VGPR_32:$src1); 273 field bit HasExt = 0; 274 275 // Hack to stop printing _e64 276 let DstRC = RegisterOperand<VGPR_32>; 277 field string Asm32 = " $vdst, $src0, $imm, $src1"; 278} 279 280def VOP_MADMK_F16 : VOP_MADMK <f16>; 281def VOP_MADMK_F32 : VOP_MADMK <f32>; 282 283// FIXME: Remove src2_modifiers. It isn't used, so is wasting memory 284// and processing time but it makes it easier to convert to mad. 285class VOP_MAC <ValueType vt0, ValueType vt1=vt0> : VOPProfile <[vt0, vt1, vt1, vt0]> { 286 let Ins32 = (ins Src0RC32:$src0, Src1RC32:$src1, VGPR_32:$src2); 287 let Ins64 = getIns64<Src0RC64, Src1RC64, RegisterOperand<VGPR_32>, 3, 288 0, HasModifiers, HasModifiers, HasOMod, 289 Src0Mod, Src1Mod, Src2Mod>.ret; 290 let InsDPP = (ins Src0ModDPP:$src0_modifiers, Src0DPP:$src0, 291 Src1ModDPP:$src1_modifiers, Src1DPP:$src1, 292 VGPR_32:$src2, // stub argument 293 dpp_ctrl:$dpp_ctrl, row_mask:$row_mask, 294 bank_mask:$bank_mask, bound_ctrl:$bound_ctrl); 295 let InsDPP16 = !con(InsDPP, (ins FI:$fi)); 296 297 let InsDPP8 = (ins Src0ModDPP:$src0_modifiers, Src0DPP:$src0, 298 Src1ModDPP:$src1_modifiers, Src1DPP:$src1, 299 VGPR_32:$src2, // stub argument 300 dpp8:$dpp8, FI:$fi); 301 302 let InsSDWA = (ins Src0ModSDWA:$src0_modifiers, Src0SDWA:$src0, 303 Src1ModSDWA:$src1_modifiers, Src1SDWA:$src1, 304 VGPR_32:$src2, // stub argument 305 clampmod:$clamp, omod:$omod, 306 dst_sel:$dst_sel, dst_unused:$dst_unused, 307 src0_sel:$src0_sel, src1_sel:$src1_sel); 308 let Asm32 = getAsm32<1, 2, vt0>.ret; 309 let Asm64 = getAsm64<1, 2, 0, HasModifiers, HasOMod, vt0>.ret; 310 let AsmDPP = getAsmDPP<1, 2, HasModifiers, vt0>.ret; 311 let AsmDPP16 = getAsmDPP16<1, 2, HasModifiers, vt0>.ret; 312 let AsmDPP8 = getAsmDPP8<1, 2, 0, vt0>.ret; 313 let AsmSDWA = getAsmSDWA<1, 2, vt0>.ret; 314 let AsmSDWA9 = getAsmSDWA9<1, 1, 2, vt0>.ret; 315 let HasSrc2 = 0; 316 let HasSrc2Mods = 0; 317 318 let HasExt = 1; 319 let HasExtDPP = 1; 320 let HasExtSDWA = 1; 321 let HasExtSDWA9 = 0; 322 let TieRegDPP = "$src2"; 323} 324 325def VOP_MAC_F16 : VOP_MAC <f16>; 326def VOP_MAC_F32 : VOP_MAC <f32>; 327 328class VOP_DOT_ACC<ValueType vt0, ValueType vt1> : VOP_MAC<vt0, vt1> { 329 let HasClamp = 0; 330 let HasExtSDWA = 0; 331 let HasModifiers = 1; 332 let HasOpSel = 0; 333 let IsPacked = 0; 334} 335 336def VOP_DOT_ACC_F32_V2F16 : VOP_DOT_ACC<f32, v2f16> { 337 let Src0ModDPP = FPVRegInputMods; 338 let Src1ModDPP = FPVRegInputMods; 339} 340def VOP_DOT_ACC_I32_I32 : VOP_DOT_ACC<i32, i32>; 341 342// Write out to vcc or arbitrary SGPR. 343def VOP2b_I32_I1_I32_I32 : VOPProfile<[i32, i32, i32, untyped], 0, /*EnableClamp=*/1> { 344 let Asm32 = "$vdst, vcc, $src0, $src1"; 345 let Asm64 = "$vdst, $sdst, $src0, $src1$clamp"; 346 let AsmSDWA = "$vdst, vcc, $src0_modifiers, $src1_modifiers$clamp $dst_sel $dst_unused $src0_sel $src1_sel"; 347 let AsmSDWA9 = "$vdst, vcc, $src0_modifiers, $src1_modifiers$clamp $dst_sel $dst_unused $src0_sel $src1_sel"; 348 let AsmDPP = "$vdst, vcc, $src0, $src1 $dpp_ctrl$row_mask$bank_mask$bound_ctrl"; 349 let AsmDPP8 = "$vdst, vcc, $src0, $src1 $dpp8$fi"; 350 let AsmDPP16 = AsmDPP#"$fi"; 351 let Outs32 = (outs DstRC:$vdst); 352 let Outs64 = (outs DstRC:$vdst, VOPDstS64orS32:$sdst); 353} 354 355// Write out to vcc or arbitrary SGPR and read in from vcc or 356// arbitrary SGPR. 357def VOP2b_I32_I1_I32_I32_I1 : VOPProfile<[i32, i32, i32, i1], 0, /*EnableClamp=*/1> { 358 let Asm32 = "$vdst, vcc, $src0, $src1, vcc"; 359 let Asm64 = "$vdst, $sdst, $src0, $src1, $src2$clamp"; 360 let AsmSDWA = "$vdst, vcc, $src0_modifiers, $src1_modifiers, vcc $clamp $dst_sel $dst_unused $src0_sel $src1_sel"; 361 let AsmSDWA9 = "$vdst, vcc, $src0_modifiers, $src1_modifiers, vcc $clamp $dst_sel $dst_unused $src0_sel $src1_sel"; 362 let AsmDPP = "$vdst, vcc, $src0, $src1, vcc $dpp_ctrl$row_mask$bank_mask$bound_ctrl"; 363 let AsmDPP8 = "$vdst, vcc, $src0, $src1, vcc $dpp8$fi"; 364 let AsmDPP16 = AsmDPP#"$fi"; 365 let Outs32 = (outs DstRC:$vdst); 366 let Outs64 = (outs DstRC:$vdst, VOPDstS64orS32:$sdst); 367 368 // Suppress src2 implied by type since the 32-bit encoding uses an 369 // implicit VCC use. 370 let Ins32 = (ins Src0RC32:$src0, Src1RC32:$src1); 371 372 let InsSDWA = (ins Src0ModSDWA:$src0_modifiers, Src0SDWA:$src0, 373 Src1ModSDWA:$src1_modifiers, Src1SDWA:$src1, 374 clampmod:$clamp, 375 dst_sel:$dst_sel, dst_unused:$dst_unused, 376 src0_sel:$src0_sel, src1_sel:$src1_sel); 377 378 let InsDPP = (ins DstRCDPP:$old, 379 Src0DPP:$src0, 380 Src1DPP:$src1, 381 dpp_ctrl:$dpp_ctrl, row_mask:$row_mask, 382 bank_mask:$bank_mask, bound_ctrl:$bound_ctrl); 383 let InsDPP16 = !con(InsDPP, (ins FI:$fi)); 384 385 let HasExt = 1; 386 let HasExtDPP = 1; 387 let HasExtSDWA = 1; 388 let HasExtSDWA9 = 1; 389} 390 391// Read in from vcc or arbitrary SGPR. 392def VOP2e_I32_I32_I32_I1 : VOPProfile<[i32, i32, i32, i1], /*EnableF32SrcMods=*/1> { 393 let Asm32 = "$vdst, $src0, $src1"; 394 let Asm64 = "$vdst, $src0_modifiers, $src1_modifiers, $src2"; 395 let AsmSDWA = "$vdst, $src0_modifiers, $src1_modifiers, vcc $clamp $dst_sel $dst_unused $src0_sel $src1_sel"; 396 let AsmSDWA9 = "$vdst, $src0_modifiers, $src1_modifiers, vcc $clamp $dst_sel $dst_unused $src0_sel $src1_sel"; 397 let AsmDPP = "$vdst, $src0, $src1, vcc $dpp_ctrl$row_mask$bank_mask$bound_ctrl"; 398 let AsmDPP8 = "$vdst, $src0, $src1, vcc $dpp8$fi"; 399 let AsmDPP16 = AsmDPP#"$fi"; 400 401 let Outs32 = (outs DstRC:$vdst); 402 let Outs64 = (outs DstRC:$vdst); 403 404 // Suppress src2 implied by type since the 32-bit encoding uses an 405 // implicit VCC use. 406 let Ins32 = (ins Src0RC32:$src0, Src1RC32:$src1); 407 408 let InsSDWA = (ins Src0ModSDWA:$src0_modifiers, Src0SDWA:$src0, 409 Src1ModSDWA:$src1_modifiers, Src1SDWA:$src1, 410 clampmod:$clamp, 411 dst_sel:$dst_sel, dst_unused:$dst_unused, 412 src0_sel:$src0_sel, src1_sel:$src1_sel); 413 414 let InsDPP = (ins DstRCDPP:$old, 415 Src0ModDPP:$src0_modifiers, Src0DPP:$src0, 416 Src1ModDPP:$src1_modifiers, Src1DPP:$src1, 417 dpp_ctrl:$dpp_ctrl, row_mask:$row_mask, 418 bank_mask:$bank_mask, bound_ctrl:$bound_ctrl); 419 let InsDPP16 = !con(InsDPP, (ins FI:$fi)); 420 421 let HasExt = 1; 422 let HasExtDPP = 1; 423 let HasExtSDWA = 1; 424 let HasExtSDWA9 = 1; 425} 426 427def VOP_READLANE : VOPProfile<[i32, i32, i32]> { 428 let Outs32 = (outs SReg_32:$vdst); 429 let Outs64 = Outs32; 430 let Ins32 = (ins VRegOrLds_32:$src0, SCSrc_b32:$src1); 431 let Ins64 = Ins32; 432 let Asm32 = " $vdst, $src0, $src1"; 433 let Asm64 = Asm32; 434 435 let HasExt = 0; 436 let HasExtDPP = 0; 437 let HasExtSDWA = 0; 438 let HasExtSDWA9 = 0; 439} 440 441def VOP_WRITELANE : VOPProfile<[i32, i32, i32, i32]> { 442 let Outs32 = (outs VGPR_32:$vdst); 443 let Outs64 = Outs32; 444 let Ins32 = (ins SCSrc_b32:$src0, SCSrc_b32:$src1, VGPR_32:$vdst_in); 445 let Ins64 = Ins32; 446 let Asm32 = " $vdst, $src0, $src1"; 447 let Asm64 = Asm32; 448 let HasSrc2 = 0; 449 let HasSrc2Mods = 0; 450 451 let HasExt = 0; 452 let HasExtDPP = 0; 453 let HasExtSDWA = 0; 454 let HasExtSDWA9 = 0; 455} 456 457//===----------------------------------------------------------------------===// 458// VOP2 Instructions 459//===----------------------------------------------------------------------===// 460 461defm V_CNDMASK_B32 : VOP2eInst <"v_cndmask_b32", VOP2e_I32_I32_I32_I1>; 462def V_MADMK_F32 : VOP2_Pseudo <"v_madmk_f32", VOP_MADMK_F32, []>; 463 464let isCommutable = 1 in { 465defm V_ADD_F32 : VOP2Inst <"v_add_f32", VOP_F32_F32_F32, fadd>; 466defm V_SUB_F32 : VOP2Inst <"v_sub_f32", VOP_F32_F32_F32, fsub>; 467defm V_SUBREV_F32 : VOP2Inst <"v_subrev_f32", VOP_F32_F32_F32, null_frag, "v_sub_f32">; 468defm V_MUL_LEGACY_F32 : VOP2Inst <"v_mul_legacy_f32", VOP_F32_F32_F32, AMDGPUfmul_legacy>; 469defm V_MUL_F32 : VOP2Inst <"v_mul_f32", VOP_F32_F32_F32, fmul>; 470defm V_MUL_I32_I24 : VOP2Inst <"v_mul_i32_i24", VOP_PAT_GEN<VOP_I32_I32_I32, 2>, AMDGPUmul_i24>; 471defm V_MUL_HI_I32_I24 : VOP2Inst <"v_mul_hi_i32_i24", VOP_PAT_GEN<VOP_I32_I32_I32, 2>, AMDGPUmulhi_i24>; 472defm V_MUL_U32_U24 : VOP2Inst <"v_mul_u32_u24", VOP_PAT_GEN<VOP_I32_I32_I32, 2>, AMDGPUmul_u24>; 473defm V_MUL_HI_U32_U24 : VOP2Inst <"v_mul_hi_u32_u24", VOP_PAT_GEN<VOP_I32_I32_I32, 2>, AMDGPUmulhi_u24>; 474defm V_MIN_F32 : VOP2Inst <"v_min_f32", VOP_F32_F32_F32, fminnum_like>; 475defm V_MAX_F32 : VOP2Inst <"v_max_f32", VOP_F32_F32_F32, fmaxnum_like>; 476defm V_MIN_I32 : VOP2Inst <"v_min_i32", VOP_PAT_GEN<VOP_I32_I32_I32>, smin>; 477defm V_MAX_I32 : VOP2Inst <"v_max_i32", VOP_PAT_GEN<VOP_I32_I32_I32>, smax>; 478defm V_MIN_U32 : VOP2Inst <"v_min_u32", VOP_PAT_GEN<VOP_I32_I32_I32>, umin>; 479defm V_MAX_U32 : VOP2Inst <"v_max_u32", VOP_PAT_GEN<VOP_I32_I32_I32>, umax>; 480defm V_LSHRREV_B32 : VOP2Inst <"v_lshrrev_b32", VOP_I32_I32_I32, lshr_rev, "v_lshr_b32">; 481defm V_ASHRREV_I32 : VOP2Inst <"v_ashrrev_i32", VOP_I32_I32_I32, ashr_rev, "v_ashr_i32">; 482defm V_LSHLREV_B32 : VOP2Inst <"v_lshlrev_b32", VOP_I32_I32_I32, lshl_rev, "v_lshl_b32">; 483defm V_AND_B32 : VOP2Inst <"v_and_b32", VOP_PAT_GEN<VOP_I32_I32_I32>, and>; 484defm V_OR_B32 : VOP2Inst <"v_or_b32", VOP_PAT_GEN<VOP_I32_I32_I32>, or>; 485defm V_XOR_B32 : VOP2Inst <"v_xor_b32", VOP_PAT_GEN<VOP_I32_I32_I32>, xor>; 486 487let Constraints = "$vdst = $src2", DisableEncoding="$src2", 488 isConvertibleToThreeAddress = 1 in { 489defm V_MAC_F32 : VOP2Inst <"v_mac_f32", VOP_MAC_F32>; 490} 491 492def V_MADAK_F32 : VOP2_Pseudo <"v_madak_f32", VOP_MADAK_F32, []>; 493 494// No patterns so that the scalar instructions are always selected. 495// The scalar versions will be replaced with vector when needed later. 496 497// V_ADD_I32, V_SUB_I32, and V_SUBREV_I32 where renamed to *_U32 in VI, 498// but the VI instructions behave the same as the SI versions. 499defm V_ADD_I32 : VOP2bInst <"v_add_i32", VOP2b_I32_I1_I32_I32, null_frag, "v_add_i32", 1>; 500defm V_SUB_I32 : VOP2bInst <"v_sub_i32", VOP2b_I32_I1_I32_I32, null_frag, "v_sub_i32", 1>; 501defm V_SUBREV_I32 : VOP2bInst <"v_subrev_i32", VOP2b_I32_I1_I32_I32, null_frag, "v_sub_i32", 1>; 502defm V_ADDC_U32 : VOP2bInst <"v_addc_u32", VOP2b_I32_I1_I32_I32_I1, null_frag, "v_addc_u32", 1>; 503defm V_SUBB_U32 : VOP2bInst <"v_subb_u32", VOP2b_I32_I1_I32_I32_I1, null_frag, "v_subb_u32", 1>; 504defm V_SUBBREV_U32 : VOP2bInst <"v_subbrev_u32", VOP2b_I32_I1_I32_I32_I1, null_frag, "v_subb_u32", 1>; 505 506 507let SubtargetPredicate = HasAddNoCarryInsts in { 508defm V_ADD_U32 : VOP2Inst <"v_add_u32", VOP_I32_I32_I32_ARITH, null_frag, "v_add_u32", 1>; 509defm V_SUB_U32 : VOP2Inst <"v_sub_u32", VOP_I32_I32_I32_ARITH, null_frag, "v_sub_u32", 1>; 510defm V_SUBREV_U32 : VOP2Inst <"v_subrev_u32", VOP_I32_I32_I32_ARITH, null_frag, "v_sub_u32", 1>; 511} 512 513} // End isCommutable = 1 514 515// These are special and do not read the exec mask. 516let isConvergent = 1, Uses = []<Register> in { 517def V_READLANE_B32 : VOP2_Pseudo<"v_readlane_b32", VOP_READLANE, 518 [(set i32:$vdst, (int_amdgcn_readlane i32:$src0, i32:$src1))]>; 519 520let Constraints = "$vdst = $vdst_in", DisableEncoding="$vdst_in" in { 521def V_WRITELANE_B32 : VOP2_Pseudo<"v_writelane_b32", VOP_WRITELANE, 522 [(set i32:$vdst, (int_amdgcn_writelane i32:$src0, i32:$src1, i32:$vdst_in))]>; 523} // End $vdst = $vdst_in, DisableEncoding $vdst_in 524} // End isConvergent = 1 525 526defm V_BFM_B32 : VOP2Inst <"v_bfm_b32", VOP_NO_EXT<VOP_I32_I32_I32>>; 527defm V_BCNT_U32_B32 : VOP2Inst <"v_bcnt_u32_b32", VOP_NO_EXT<VOP_I32_I32_I32>, add_ctpop>; 528defm V_MBCNT_LO_U32_B32 : VOP2Inst <"v_mbcnt_lo_u32_b32", VOP_NO_EXT<VOP_I32_I32_I32>, int_amdgcn_mbcnt_lo>; 529defm V_MBCNT_HI_U32_B32 : VOP2Inst <"v_mbcnt_hi_u32_b32", VOP_NO_EXT<VOP_I32_I32_I32>, int_amdgcn_mbcnt_hi>; 530defm V_LDEXP_F32 : VOP2Inst <"v_ldexp_f32", VOP_NO_EXT<VOP_F32_F32_I32>, AMDGPUldexp>; 531defm V_CVT_PKACCUM_U8_F32 : VOP2Inst <"v_cvt_pkaccum_u8_f32", VOP_NO_EXT<VOP_I32_F32_I32>>; // TODO: set "Uses = dst" 532defm V_CVT_PKNORM_I16_F32 : VOP2Inst <"v_cvt_pknorm_i16_f32", VOP_NO_EXT<VOP_V2I16_F32_F32>, AMDGPUpknorm_i16_f32>; 533defm V_CVT_PKNORM_U16_F32 : VOP2Inst <"v_cvt_pknorm_u16_f32", VOP_NO_EXT<VOP_V2I16_F32_F32>, AMDGPUpknorm_u16_f32>; 534defm V_CVT_PKRTZ_F16_F32 : VOP2Inst <"v_cvt_pkrtz_f16_f32", VOP_NO_EXT<VOP_V2F16_F32_F32>, AMDGPUpkrtz_f16_f32>; 535defm V_CVT_PK_U16_U32 : VOP2Inst <"v_cvt_pk_u16_u32", VOP_NO_EXT<VOP_V2I16_I32_I32>, AMDGPUpk_u16_u32>; 536defm V_CVT_PK_I16_I32 : VOP2Inst <"v_cvt_pk_i16_i32", VOP_NO_EXT<VOP_V2I16_I32_I32>, AMDGPUpk_i16_i32>; 537 538 539let SubtargetPredicate = isGFX6GFX7 in { 540defm V_MIN_LEGACY_F32 : VOP2Inst <"v_min_legacy_f32", VOP_F32_F32_F32, AMDGPUfmin_legacy>; 541defm V_MAX_LEGACY_F32 : VOP2Inst <"v_max_legacy_f32", VOP_F32_F32_F32, AMDGPUfmax_legacy>; 542} // End SubtargetPredicate = isGFX6GFX7 543 544let SubtargetPredicate = isGFX6GFX7GFX10 in { 545let isCommutable = 1 in { 546defm V_MAC_LEGACY_F32 : VOP2Inst <"v_mac_legacy_f32", VOP_F32_F32_F32>; 547defm V_LSHR_B32 : VOP2Inst <"v_lshr_b32", VOP_I32_I32_I32, srl>; 548defm V_ASHR_I32 : VOP2Inst <"v_ashr_i32", VOP_I32_I32_I32, sra>; 549defm V_LSHL_B32 : VOP2Inst <"v_lshl_b32", VOP_I32_I32_I32, shl>; 550} // End isCommutable = 1 551} // End SubtargetPredicate = isGFX6GFX7GFX10 552 553class DivergentBinOp<SDPatternOperator Op, VOP_Pseudo Inst> : 554 GCNPat< 555 (getDivergentFrag<Op>.ret Inst.Pfl.Src0VT:$src0, Inst.Pfl.Src1VT:$src1), 556 !if(!cast<Commutable_REV>(Inst).IsOrig, 557 (Inst $src0, $src1), 558 (Inst $src1, $src0) 559 ) 560 >; 561 562class DivergentClampingBinOp<SDPatternOperator Op, VOP_Pseudo Inst> : 563 GCNPat< 564 (getDivergentFrag<Op>.ret Inst.Pfl.Src0VT:$src0, Inst.Pfl.Src1VT:$src1), 565 !if(!cast<Commutable_REV>(Inst).IsOrig, 566 (Inst $src0, $src1, 0), 567 (Inst $src1, $src0, 0) 568 ) 569 >; 570 571def : DivergentBinOp<srl, V_LSHRREV_B32_e64>; 572def : DivergentBinOp<sra, V_ASHRREV_I32_e64>; 573def : DivergentBinOp<shl, V_LSHLREV_B32_e64>; 574 575let SubtargetPredicate = HasAddNoCarryInsts in { 576 def : DivergentClampingBinOp<add, V_ADD_U32_e64>; 577 def : DivergentClampingBinOp<sub, V_SUB_U32_e64>; 578} 579 580let SubtargetPredicate = isGFX6GFX7GFX8GFX9, Predicates = [isGFX6GFX7GFX8GFX9] in { 581def : DivergentClampingBinOp<add, V_ADD_I32_e64>; 582def : DivergentClampingBinOp<sub, V_SUB_I32_e64>; 583} 584 585def : DivergentBinOp<adde, V_ADDC_U32_e32>; 586def : DivergentBinOp<sube, V_SUBB_U32_e32>; 587 588class divergent_i64_BinOp <SDPatternOperator Op, Instruction Inst> : 589 GCNPat< 590 (getDivergentFrag<Op>.ret i64:$src0, i64:$src1), 591 (REG_SEQUENCE VReg_64, 592 (Inst 593 (i32 (EXTRACT_SUBREG $src0, sub0)), 594 (i32 (EXTRACT_SUBREG $src1, sub0)) 595 ), sub0, 596 (Inst 597 (i32 (EXTRACT_SUBREG $src0, sub1)), 598 (i32 (EXTRACT_SUBREG $src1, sub1)) 599 ), sub1 600 ) 601 >; 602 603def : divergent_i64_BinOp <and, V_AND_B32_e32>; 604def : divergent_i64_BinOp <or, V_OR_B32_e32>; 605def : divergent_i64_BinOp <xor, V_XOR_B32_e32>; 606 607let SubtargetPredicate = Has16BitInsts in { 608 609let FPDPRounding = 1 in { 610def V_MADMK_F16 : VOP2_Pseudo <"v_madmk_f16", VOP_MADMK_F16, [], "">; 611defm V_LDEXP_F16 : VOP2Inst <"v_ldexp_f16", VOP_F16_F16_I32, AMDGPUldexp>; 612} // End FPDPRounding = 1 613 614defm V_LSHLREV_B16 : VOP2Inst <"v_lshlrev_b16", VOP_I16_I16_I16, lshl_rev>; 615defm V_LSHRREV_B16 : VOP2Inst <"v_lshrrev_b16", VOP_I16_I16_I16, lshr_rev>; 616defm V_ASHRREV_I16 : VOP2Inst <"v_ashrrev_i16", VOP_I16_I16_I16, ashr_rev>; 617 618let isCommutable = 1 in { 619let FPDPRounding = 1 in { 620defm V_ADD_F16 : VOP2Inst <"v_add_f16", VOP_F16_F16_F16, fadd>; 621defm V_SUB_F16 : VOP2Inst <"v_sub_f16", VOP_F16_F16_F16, fsub>; 622defm V_SUBREV_F16 : VOP2Inst <"v_subrev_f16", VOP_F16_F16_F16, null_frag, "v_sub_f16">; 623defm V_MUL_F16 : VOP2Inst <"v_mul_f16", VOP_F16_F16_F16, fmul>; 624def V_MADAK_F16 : VOP2_Pseudo <"v_madak_f16", VOP_MADAK_F16, [], "">; 625} // End FPDPRounding = 1 626defm V_ADD_U16 : VOP2Inst <"v_add_u16", VOP_I16_I16_I16, add>; 627defm V_SUB_U16 : VOP2Inst <"v_sub_u16" , VOP_I16_I16_I16, sub>; 628defm V_SUBREV_U16 : VOP2Inst <"v_subrev_u16", VOP_I16_I16_I16, null_frag, "v_sub_u16">; 629defm V_MUL_LO_U16 : VOP2Inst <"v_mul_lo_u16", VOP_I16_I16_I16, mul>; 630defm V_MAX_F16 : VOP2Inst <"v_max_f16", VOP_F16_F16_F16, fmaxnum_like>; 631defm V_MIN_F16 : VOP2Inst <"v_min_f16", VOP_F16_F16_F16, fminnum_like>; 632defm V_MAX_U16 : VOP2Inst <"v_max_u16", VOP_I16_I16_I16, umax>; 633defm V_MAX_I16 : VOP2Inst <"v_max_i16", VOP_I16_I16_I16, smax>; 634defm V_MIN_U16 : VOP2Inst <"v_min_u16", VOP_I16_I16_I16, umin>; 635defm V_MIN_I16 : VOP2Inst <"v_min_i16", VOP_I16_I16_I16, smin>; 636 637let Constraints = "$vdst = $src2", DisableEncoding="$src2", 638 isConvertibleToThreeAddress = 1 in { 639defm V_MAC_F16 : VOP2Inst <"v_mac_f16", VOP_MAC_F16>; 640} 641} // End isCommutable = 1 642 643} // End SubtargetPredicate = Has16BitInsts 644 645let SubtargetPredicate = HasDLInsts in { 646 647defm V_XNOR_B32 : VOP2Inst <"v_xnor_b32", VOP_I32_I32_I32>; 648 649let Constraints = "$vdst = $src2", 650 DisableEncoding="$src2", 651 isConvertibleToThreeAddress = 1, 652 isCommutable = 1 in { 653defm V_FMAC_F32 : VOP2Inst <"v_fmac_f32", VOP_MAC_F32>; 654} 655 656} // End SubtargetPredicate = HasDLInsts 657 658let Constraints = "$vdst = $src2", 659 DisableEncoding="$src2", 660 isConvertibleToThreeAddress = 1, 661 isCommutable = 1, 662 IsDOT = 1 in { 663 let SubtargetPredicate = HasDot5Insts in 664 defm V_DOT2C_F32_F16 : VOP2Inst<"v_dot2c_f32_f16", VOP_DOT_ACC_F32_V2F16>; 665 let SubtargetPredicate = HasDot6Insts in 666 defm V_DOT4C_I32_I8 : VOP2Inst<"v_dot4c_i32_i8", VOP_DOT_ACC_I32_I32>; 667 668 let SubtargetPredicate = HasDot4Insts in 669 defm V_DOT2C_I32_I16 : VOP2Inst<"v_dot2c_i32_i16", VOP_DOT_ACC_I32_I32>; 670 let SubtargetPredicate = HasDot3Insts in 671 defm V_DOT8C_I32_I4 : VOP2Inst<"v_dot8c_i32_i4", VOP_DOT_ACC_I32_I32>; 672} 673 674let AddedComplexity = 30 in { 675 def : GCNPat< 676 (f32 (AMDGPUfdot2 v2f16:$src0, v2f16:$src1, f32:$src2, (i1 DSTCLAMP.NONE))), 677 (f32 (V_DOT2C_F32_F16_e32 $src0, $src1, $src2)) 678 > { 679 let SubtargetPredicate = HasDot5Insts; 680 } 681 def : GCNPat< 682 (i32 (int_amdgcn_sdot4 i32:$src0, i32:$src1, i32:$src2, (i1 DSTCLAMP.NONE))), 683 (i32 (V_DOT4C_I32_I8_e32 $src0, $src1, $src2)) 684 > { 685 let SubtargetPredicate = HasDot6Insts; 686 } 687 def : GCNPat< 688 (i32 (int_amdgcn_sdot2 v2i16:$src0, v2i16:$src1, i32:$src2, (i1 DSTCLAMP.NONE))), 689 (i32 (V_DOT2C_I32_I16_e32 $src0, $src1, $src2)) 690 > { 691 let SubtargetPredicate = HasDot4Insts; 692 } 693 def : GCNPat< 694 (i32 (int_amdgcn_sdot8 i32:$src0, i32:$src1, i32:$src2, (i1 DSTCLAMP.NONE))), 695 (i32 (V_DOT8C_I32_I4_e32 $src0, $src1, $src2)) 696 > { 697 let SubtargetPredicate = HasDot3Insts; 698 } 699} // End AddedComplexity = 30 700 701let SubtargetPredicate = isGFX10Plus in { 702 703def V_FMAMK_F32 : VOP2_Pseudo<"v_fmamk_f32", VOP_MADMK_F32, [], "">; 704let FPDPRounding = 1 in 705def V_FMAMK_F16 : VOP2_Pseudo <"v_fmamk_f16", VOP_MADMK_F16, [], "">; 706 707let isCommutable = 1 in { 708def V_FMAAK_F32 : VOP2_Pseudo<"v_fmaak_f32", VOP_MADAK_F32, [], "">; 709let FPDPRounding = 1 in 710def V_FMAAK_F16 : VOP2_Pseudo <"v_fmaak_f16", VOP_MADAK_F16, [], "">; 711} // End isCommutable = 1 712 713let Constraints = "$vdst = $src2", 714 DisableEncoding="$src2", 715 isConvertibleToThreeAddress = 1, 716 isCommutable = 1 in { 717defm V_FMAC_F16 : VOP2Inst <"v_fmac_f16", VOP_MAC_F16>; 718} 719 720} // End SubtargetPredicate = isGFX10Plus 721 722let SubtargetPredicate = HasPkFmacF16Inst in { 723defm V_PK_FMAC_F16 : VOP2Inst<"v_pk_fmac_f16", VOP_V2F16_V2F16_V2F16>; 724} // End SubtargetPredicate = HasPkFmacF16Inst 725 726// Note: 16-bit instructions produce a 0 result in the high 16-bits 727// on GFX8 and GFX9 and preserve high 16 bits on GFX10+ 728multiclass Arithmetic_i16_0Hi_Pats <SDPatternOperator op, Instruction inst> { 729 730def : GCNPat< 731 (i32 (zext (op i16:$src0, i16:$src1))), 732 (inst $src0, $src1) 733>; 734 735def : GCNPat< 736 (i64 (zext (op i16:$src0, i16:$src1))), 737 (REG_SEQUENCE VReg_64, 738 (inst $src0, $src1), sub0, 739 (V_MOV_B32_e32 (i32 0)), sub1) 740>; 741} 742 743class ZExt_i16_i1_Pat <SDNode ext> : GCNPat < 744 (i16 (ext i1:$src)), 745 (V_CNDMASK_B32_e64 (i32 0/*src0mod*/), (i32 0/*src0*/), 746 (i32 0/*src1mod*/), (i32 1/*src1*/), 747 $src) 748>; 749 750foreach vt = [i16, v2i16] in { 751def : GCNPat < 752 (and vt:$src0, vt:$src1), 753 (V_AND_B32_e64 VSrc_b32:$src0, VSrc_b32:$src1) 754>; 755 756def : GCNPat < 757 (or vt:$src0, vt:$src1), 758 (V_OR_B32_e64 VSrc_b32:$src0, VSrc_b32:$src1) 759>; 760 761def : GCNPat < 762 (xor vt:$src0, vt:$src1), 763 (V_XOR_B32_e64 VSrc_b32:$src0, VSrc_b32:$src1) 764>; 765} 766 767let Predicates = [Has16BitInsts] in { 768 769let Predicates = [Has16BitInsts, isGFX7GFX8GFX9] in { 770defm : Arithmetic_i16_0Hi_Pats<add, V_ADD_U16_e64>; 771defm : Arithmetic_i16_0Hi_Pats<mul, V_MUL_LO_U16_e64>; 772defm : Arithmetic_i16_0Hi_Pats<sub, V_SUB_U16_e64>; 773defm : Arithmetic_i16_0Hi_Pats<smin, V_MIN_I16_e64>; 774defm : Arithmetic_i16_0Hi_Pats<smax, V_MAX_I16_e64>; 775defm : Arithmetic_i16_0Hi_Pats<umin, V_MIN_U16_e64>; 776defm : Arithmetic_i16_0Hi_Pats<umax, V_MAX_U16_e64>; 777defm : Arithmetic_i16_0Hi_Pats<lshl_rev, V_LSHLREV_B16_e64>; 778defm : Arithmetic_i16_0Hi_Pats<lshr_rev, V_LSHRREV_B16_e64>; 779defm : Arithmetic_i16_0Hi_Pats<ashr_rev, V_ASHRREV_I16_e64>; 780} 781 782def : ZExt_i16_i1_Pat<zext>; 783def : ZExt_i16_i1_Pat<anyext>; 784 785def : GCNPat < 786 (i16 (sext i1:$src)), 787 (V_CNDMASK_B32_e64 /*src0mod*/(i32 0), /*src0*/(i32 0), 788 /*src1mod*/(i32 0), /*src1*/(i32 -1), $src) 789>; 790 791// Undo sub x, c -> add x, -c canonicalization since c is more likely 792// an inline immediate than -c. 793// TODO: Also do for 64-bit. 794def : GCNPat< 795 (add i16:$src0, (i16 NegSubInlineConst16:$src1)), 796 (V_SUB_U16_e64 $src0, NegSubInlineConst16:$src1) 797>; 798 799} // End Predicates = [Has16BitInsts, isGFX7GFX8GFX9] 800 801 802//===----------------------------------------------------------------------===// 803// Target-specific instruction encodings. 804//===----------------------------------------------------------------------===// 805 806class VOP2_DPP<bits<6> op, VOP2_DPP_Pseudo ps, 807 string opName = ps.OpName, VOPProfile p = ps.Pfl, 808 bit IsDPP16 = 0> : 809 VOP_DPP<opName, p, IsDPP16> { 810 let hasSideEffects = ps.hasSideEffects; 811 let Defs = ps.Defs; 812 let SchedRW = ps.SchedRW; 813 let Uses = ps.Uses; 814 815 bits<8> vdst; 816 bits<8> src1; 817 let Inst{8-0} = 0xfa; 818 let Inst{16-9} = !if(p.HasSrc1, src1{7-0}, 0); 819 let Inst{24-17} = !if(p.EmitDst, vdst{7-0}, 0); 820 let Inst{30-25} = op; 821 let Inst{31} = 0x0; 822} 823 824class Base_VOP2_DPP16<bits<6> op, VOP2_DPP_Pseudo ps, 825 string opName = ps.OpName, VOPProfile p = ps.Pfl> : 826 VOP2_DPP<op, ps, opName, p, 1> { 827 let AssemblerPredicate = !if(p.HasExt, HasDPP16, DisableInst); 828 let SubtargetPredicate = HasDPP16; 829} 830 831class VOP2_DPP16<bits<6> op, VOP2_DPP_Pseudo ps, 832 string opName = ps.OpName, VOPProfile p = ps.Pfl> : 833 Base_VOP2_DPP16<op, ps, opName, p>, 834 SIMCInstr <ps.PseudoInstr, SIEncodingFamily.GFX10>; 835 836class VOP2_DPP8<bits<6> op, VOP2_Pseudo ps, 837 string opName = ps.OpName, VOPProfile p = ps.Pfl> : 838 VOP_DPP8<ps.OpName, p> { 839 let hasSideEffects = ps.hasSideEffects; 840 let Defs = ps.Defs; 841 let SchedRW = ps.SchedRW; 842 let Uses = ps.Uses; 843 844 bits<8> vdst; 845 bits<8> src1; 846 847 let Inst{8-0} = fi; 848 let Inst{16-9} = !if(p.HasSrc1, src1{7-0}, 0); 849 let Inst{24-17} = !if(p.EmitDst, vdst{7-0}, 0); 850 let Inst{30-25} = op; 851 let Inst{31} = 0x0; 852 853 let AssemblerPredicate = !if(p.HasExt, HasDPP8, DisableInst); 854 let SubtargetPredicate = HasDPP8; 855} 856 857//===----------------------------------------------------------------------===// 858// GFX10. 859//===----------------------------------------------------------------------===// 860 861let AssemblerPredicate = isGFX10Plus, DecoderNamespace = "GFX10" in { 862 //===------------------------------- VOP2 -------------------------------===// 863 multiclass VOP2Only_Real_MADK_gfx10<bits<6> op> { 864 def _gfx10 : 865 VOP2_Real<!cast<VOP2_Pseudo>(NAME), SIEncodingFamily.GFX10>, 866 VOP2_MADKe<op{5-0}, !cast<VOP2_Pseudo>(NAME).Pfl>; 867 } 868 multiclass VOP2Only_Real_MADK_gfx10_with_name<bits<6> op, string opName, 869 string asmName> { 870 def _gfx10 : 871 VOP2_Real<!cast<VOP2_Pseudo>(opName), SIEncodingFamily.GFX10>, 872 VOP2_MADKe<op{5-0}, !cast<VOP2_Pseudo>(opName).Pfl> { 873 VOP2_Pseudo ps = !cast<VOP2_Pseudo>(opName); 874 let AsmString = asmName # ps.AsmOperands; 875 } 876 } 877 multiclass VOP2_Real_e32_gfx10<bits<6> op> { 878 def _e32_gfx10 : 879 VOP2_Real<!cast<VOP2_Pseudo>(NAME#"_e32"), SIEncodingFamily.GFX10>, 880 VOP2e<op{5-0}, !cast<VOP2_Pseudo>(NAME#"_e32").Pfl>; 881 } 882 multiclass VOP2_Real_e64_gfx10<bits<6> op> { 883 def _e64_gfx10 : 884 VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.GFX10>, 885 VOP3e_gfx10<{0, 1, 0, 0, op{5-0}}, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl>; 886 } 887 multiclass VOP2_Real_sdwa_gfx10<bits<6> op> { 888 foreach _ = BoolToList<!cast<VOP2_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA9>.ret in 889 def _sdwa_gfx10 : 890 VOP_SDWA10_Real<!cast<VOP2_SDWA_Pseudo>(NAME#"_sdwa")>, 891 VOP2_SDWA9Ae<op{5-0}, !cast<VOP2_SDWA_Pseudo>(NAME#"_sdwa").Pfl> { 892 let DecoderNamespace = "SDWA10"; 893 } 894 } 895 multiclass VOP2_Real_dpp_gfx10<bits<6> op> { 896 foreach _ = BoolToList<!cast<VOP2_Pseudo>(NAME#"_e32").Pfl.HasExtDPP>.ret in 897 def _dpp_gfx10 : VOP2_DPP16<op, !cast<VOP2_DPP_Pseudo>(NAME#"_dpp")> { 898 let DecoderNamespace = "SDWA10"; 899 } 900 } 901 multiclass VOP2_Real_dpp8_gfx10<bits<6> op> { 902 foreach _ = BoolToList<!cast<VOP2_Pseudo>(NAME#"_e32").Pfl.HasExtDPP>.ret in 903 def _dpp8_gfx10 : VOP2_DPP8<op, !cast<VOP2_Pseudo>(NAME#"_e32")> { 904 let DecoderNamespace = "DPP8"; 905 } 906 } 907 908 //===------------------------- VOP2 (with name) -------------------------===// 909 multiclass VOP2_Real_e32_gfx10_with_name<bits<6> op, string opName, 910 string asmName> { 911 def _e32_gfx10 : 912 VOP2_Real<!cast<VOP2_Pseudo>(opName#"_e32"), SIEncodingFamily.GFX10>, 913 VOP2e<op{5-0}, !cast<VOP2_Pseudo>(opName#"_e32").Pfl> { 914 VOP2_Pseudo ps = !cast<VOP2_Pseudo>(opName#"_e32"); 915 let AsmString = asmName # ps.AsmOperands; 916 } 917 } 918 multiclass VOP2_Real_e64_gfx10_with_name<bits<6> op, string opName, 919 string asmName> { 920 def _e64_gfx10 : 921 VOP3_Real<!cast<VOP3_Pseudo>(opName#"_e64"), SIEncodingFamily.GFX10>, 922 VOP3e_gfx10<{0, 1, 0, 0, op{5-0}}, 923 !cast<VOP3_Pseudo>(opName#"_e64").Pfl> { 924 VOP3_Pseudo ps = !cast<VOP3_Pseudo>(opName#"_e64"); 925 let AsmString = asmName # ps.AsmOperands; 926 } 927 } 928 let DecoderNamespace = "SDWA10" in { 929 multiclass VOP2_Real_sdwa_gfx10_with_name<bits<6> op, string opName, 930 string asmName> { 931 foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtSDWA9>.ret in 932 def _sdwa_gfx10 : 933 VOP_SDWA10_Real<!cast<VOP2_SDWA_Pseudo>(opName#"_sdwa")>, 934 VOP2_SDWA9Ae<op{5-0}, !cast<VOP2_SDWA_Pseudo>(opName#"_sdwa").Pfl> { 935 VOP2_SDWA_Pseudo ps = !cast<VOP2_SDWA_Pseudo>(opName#"_sdwa"); 936 let AsmString = asmName # ps.AsmOperands; 937 } 938 } 939 multiclass VOP2_Real_dpp_gfx10_with_name<bits<6> op, string opName, 940 string asmName> { 941 foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtDPP>.ret in 942 def _dpp_gfx10 : VOP2_DPP16<op, !cast<VOP2_DPP_Pseudo>(opName#"_dpp")> { 943 VOP2_Pseudo ps = !cast<VOP2_Pseudo>(opName#"_e32"); 944 let AsmString = asmName # ps.Pfl.AsmDPP16; 945 } 946 } 947 multiclass VOP2_Real_dpp8_gfx10_with_name<bits<6> op, string opName, 948 string asmName> { 949 foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtDPP>.ret in 950 def _dpp8_gfx10 : VOP2_DPP8<op, !cast<VOP2_Pseudo>(opName#"_e32")> { 951 VOP2_Pseudo ps = !cast<VOP2_Pseudo>(opName#"_e32"); 952 let AsmString = asmName # ps.Pfl.AsmDPP8; 953 let DecoderNamespace = "DPP8"; 954 } 955 } 956 } // End DecoderNamespace = "SDWA10" 957 958 //===------------------------------ VOP2be ------------------------------===// 959 multiclass VOP2be_Real_e32_gfx10<bits<6> op, string opName, string asmName> { 960 def _e32_gfx10 : 961 VOP2_Real<!cast<VOP2_Pseudo>(opName#"_e32"), SIEncodingFamily.GFX10>, 962 VOP2e<op{5-0}, !cast<VOP2_Pseudo>(opName#"_e32").Pfl> { 963 VOP2_Pseudo Ps = !cast<VOP2_Pseudo>(opName#"_e32"); 964 let AsmString = asmName # !subst(", vcc", "", Ps.AsmOperands); 965 } 966 } 967 multiclass VOP2be_Real_e64_gfx10<bits<6> op, string opName, string asmName> { 968 def _e64_gfx10 : 969 VOP3_Real<!cast<VOP3_Pseudo>(opName#"_e64"), SIEncodingFamily.GFX10>, 970 VOP3be_gfx10<{0, 1, 0, 0, op{5-0}}, 971 !cast<VOP3_Pseudo>(opName#"_e64").Pfl> { 972 VOP3_Pseudo Ps = !cast<VOP3_Pseudo>(opName#"_e64"); 973 let AsmString = asmName # Ps.AsmOperands; 974 } 975 } 976 multiclass VOP2be_Real_sdwa_gfx10<bits<6> op, string opName, string asmName> { 977 foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtSDWA9>.ret in 978 def _sdwa_gfx10 : 979 VOP_SDWA10_Real<!cast<VOP2_SDWA_Pseudo>(opName#"_sdwa")>, 980 VOP2_SDWA9Ae<op{5-0}, !cast<VOP2_SDWA_Pseudo>(opName#"_sdwa").Pfl> { 981 VOP2_SDWA_Pseudo Ps = !cast<VOP2_SDWA_Pseudo>(opName#"_sdwa"); 982 let AsmString = asmName # !subst(", vcc", "", Ps.AsmOperands); 983 let DecoderNamespace = "SDWA10"; 984 } 985 foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtSDWA9>.ret in 986 def _sdwa_w32_gfx10 : 987 Base_VOP_SDWA10_Real<!cast<VOP2_SDWA_Pseudo>(opName#"_sdwa")>, 988 VOP2_SDWA9Ae<op{5-0}, !cast<VOP2_SDWA_Pseudo>(opName#"_sdwa").Pfl> { 989 VOP2_SDWA_Pseudo Ps = !cast<VOP2_SDWA_Pseudo>(opName#"_sdwa"); 990 let AsmString = asmName # !subst("vcc", "vcc_lo", Ps.AsmOperands); 991 let isAsmParserOnly = 1; 992 let DecoderNamespace = "SDWA10"; 993 let WaveSizePredicate = isWave32; 994 } 995 foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtSDWA9>.ret in 996 def _sdwa_w64_gfx10 : 997 Base_VOP_SDWA10_Real<!cast<VOP2_SDWA_Pseudo>(opName#"_sdwa")>, 998 VOP2_SDWA9Ae<op{5-0}, !cast<VOP2_SDWA_Pseudo>(opName#"_sdwa").Pfl> { 999 VOP2_SDWA_Pseudo Ps = !cast<VOP2_SDWA_Pseudo>(opName#"_sdwa"); 1000 let AsmString = asmName # Ps.AsmOperands; 1001 let isAsmParserOnly = 1; 1002 let DecoderNamespace = "SDWA10"; 1003 let WaveSizePredicate = isWave64; 1004 } 1005 } 1006 multiclass VOP2be_Real_dpp_gfx10<bits<6> op, string opName, string asmName> { 1007 foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtDPP>.ret in 1008 def _dpp_gfx10 : 1009 VOP2_DPP16<op, !cast<VOP2_DPP_Pseudo>(opName#"_dpp"), asmName> { 1010 string AsmDPP = !cast<VOP2_Pseudo>(opName#"_e32").Pfl.AsmDPP16; 1011 let AsmString = asmName # !subst(", vcc", "", AsmDPP); 1012 let DecoderNamespace = "SDWA10"; 1013 } 1014 foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtDPP>.ret in 1015 def _dpp_w32_gfx10 : 1016 Base_VOP2_DPP16<op, !cast<VOP2_DPP_Pseudo>(opName#"_dpp"), asmName> { 1017 string AsmDPP = !cast<VOP2_Pseudo>(opName#"_e32").Pfl.AsmDPP16; 1018 let AsmString = asmName # !subst("vcc", "vcc_lo", AsmDPP); 1019 let isAsmParserOnly = 1; 1020 let WaveSizePredicate = isWave32; 1021 } 1022 foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtDPP>.ret in 1023 def _dpp_w64_gfx10 : 1024 Base_VOP2_DPP16<op, !cast<VOP2_DPP_Pseudo>(opName#"_dpp"), asmName> { 1025 string AsmDPP = !cast<VOP2_Pseudo>(opName#"_e32").Pfl.AsmDPP16; 1026 let AsmString = asmName # AsmDPP; 1027 let isAsmParserOnly = 1; 1028 let WaveSizePredicate = isWave64; 1029 } 1030 } 1031 multiclass VOP2be_Real_dpp8_gfx10<bits<6> op, string opName, string asmName> { 1032 foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtDPP>.ret in 1033 def _dpp8_gfx10 : 1034 VOP2_DPP8<op, !cast<VOP2_Pseudo>(opName#"_e32"), asmName> { 1035 string AsmDPP8 = !cast<VOP2_Pseudo>(opName#"_e32").Pfl.AsmDPP8; 1036 let AsmString = asmName # !subst(", vcc", "", AsmDPP8); 1037 let DecoderNamespace = "DPP8"; 1038 } 1039 foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtDPP>.ret in 1040 def _dpp8_w32_gfx10 : 1041 VOP2_DPP8<op, !cast<VOP2_Pseudo>(opName#"_e32"), asmName> { 1042 string AsmDPP8 = !cast<VOP2_Pseudo>(opName#"_e32").Pfl.AsmDPP8; 1043 let AsmString = asmName # !subst("vcc", "vcc_lo", AsmDPP8); 1044 let isAsmParserOnly = 1; 1045 let WaveSizePredicate = isWave32; 1046 } 1047 foreach _ = BoolToList<!cast<VOP2_Pseudo>(opName#"_e32").Pfl.HasExtDPP>.ret in 1048 def _dpp8_w64_gfx10 : 1049 VOP2_DPP8<op, !cast<VOP2_Pseudo>(opName#"_e32"), asmName> { 1050 string AsmDPP8 = !cast<VOP2_Pseudo>(opName#"_e32").Pfl.AsmDPP8; 1051 let AsmString = asmName # AsmDPP8; 1052 let isAsmParserOnly = 1; 1053 let WaveSizePredicate = isWave64; 1054 } 1055 } 1056 1057 //===----------------------------- VOP3Only -----------------------------===// 1058 multiclass VOP3Only_Real_gfx10<bits<10> op> { 1059 def _e64_gfx10 : 1060 VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.GFX10>, 1061 VOP3e_gfx10<op, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl>; 1062 } 1063 1064 //===---------------------------- VOP3beOnly ----------------------------===// 1065 multiclass VOP3beOnly_Real_gfx10<bits<10> op, string opName, string asmName> { 1066 def _e64_gfx10 : 1067 VOP3_Real<!cast<VOP3_Pseudo>(opName#"_e64"), SIEncodingFamily.GFX10>, 1068 VOP3be_gfx10<op, !cast<VOP3_Pseudo>(opName#"_e64").Pfl> { 1069 VOP3_Pseudo Ps = !cast<VOP3_Pseudo>(opName#"_e64"); 1070 let AsmString = asmName # Ps.AsmOperands; 1071 } 1072 } 1073} // End AssemblerPredicate = isGFX10Plus, DecoderNamespace = "GFX10" 1074 1075multiclass VOP2be_Real_gfx10<bits<6> op, string opName, string asmName> : 1076 VOP2be_Real_e32_gfx10<op, opName, asmName>, 1077 VOP2be_Real_e64_gfx10<op, opName, asmName>, 1078 VOP2be_Real_sdwa_gfx10<op, opName, asmName>, 1079 VOP2be_Real_dpp_gfx10<op, opName, asmName>, 1080 VOP2be_Real_dpp8_gfx10<op, opName, asmName>; 1081 1082multiclass VOP2e_Real_gfx10<bits<6> op, string opName, string asmName> : 1083 VOP2_Real_e32_gfx10<op>, 1084 VOP2_Real_e64_gfx10<op>, 1085 VOP2be_Real_sdwa_gfx10<op, opName, asmName>, 1086 VOP2be_Real_dpp_gfx10<op, opName, asmName>, 1087 VOP2be_Real_dpp8_gfx10<op, opName, asmName>; 1088 1089multiclass VOP2_Real_gfx10<bits<6> op> : 1090 VOP2_Real_e32_gfx10<op>, VOP2_Real_e64_gfx10<op>, 1091 VOP2_Real_sdwa_gfx10<op>, VOP2_Real_dpp_gfx10<op>, VOP2_Real_dpp8_gfx10<op>; 1092 1093multiclass VOP2_Real_gfx10_with_name<bits<6> op, string opName, 1094 string asmName> : 1095 VOP2_Real_e32_gfx10_with_name<op, opName, asmName>, 1096 VOP2_Real_e64_gfx10_with_name<op, opName, asmName>, 1097 VOP2_Real_sdwa_gfx10_with_name<op, opName, asmName>, 1098 VOP2_Real_dpp_gfx10_with_name<op, opName, asmName>, 1099 VOP2_Real_dpp8_gfx10_with_name<op, opName, asmName>; 1100 1101defm V_XNOR_B32 : VOP2_Real_gfx10<0x01e>; 1102defm V_FMAC_F32 : VOP2_Real_gfx10<0x02b>; 1103defm V_FMAMK_F32 : VOP2Only_Real_MADK_gfx10<0x02c>; 1104defm V_FMAAK_F32 : VOP2Only_Real_MADK_gfx10<0x02d>; 1105defm V_ADD_F16 : VOP2_Real_gfx10<0x032>; 1106defm V_SUB_F16 : VOP2_Real_gfx10<0x033>; 1107defm V_SUBREV_F16 : VOP2_Real_gfx10<0x034>; 1108defm V_MUL_F16 : VOP2_Real_gfx10<0x035>; 1109defm V_FMAC_F16 : VOP2_Real_gfx10<0x036>; 1110defm V_FMAMK_F16 : VOP2Only_Real_MADK_gfx10<0x037>; 1111defm V_FMAAK_F16 : VOP2Only_Real_MADK_gfx10<0x038>; 1112defm V_MAX_F16 : VOP2_Real_gfx10<0x039>; 1113defm V_MIN_F16 : VOP2_Real_gfx10<0x03a>; 1114defm V_LDEXP_F16 : VOP2_Real_gfx10<0x03b>; 1115defm V_PK_FMAC_F16 : VOP2_Real_e32_gfx10<0x03c>; 1116 1117// VOP2 no carry-in, carry-out. 1118defm V_ADD_NC_U32 : 1119 VOP2_Real_gfx10_with_name<0x025, "V_ADD_U32", "v_add_nc_u32">; 1120defm V_SUB_NC_U32 : 1121 VOP2_Real_gfx10_with_name<0x026, "V_SUB_U32", "v_sub_nc_u32">; 1122defm V_SUBREV_NC_U32 : 1123 VOP2_Real_gfx10_with_name<0x027, "V_SUBREV_U32", "v_subrev_nc_u32">; 1124 1125// VOP2 carry-in, carry-out. 1126defm V_ADD_CO_CI_U32 : 1127 VOP2be_Real_gfx10<0x028, "V_ADDC_U32", "v_add_co_ci_u32">; 1128defm V_SUB_CO_CI_U32 : 1129 VOP2be_Real_gfx10<0x029, "V_SUBB_U32", "v_sub_co_ci_u32">; 1130defm V_SUBREV_CO_CI_U32 : 1131 VOP2be_Real_gfx10<0x02a, "V_SUBBREV_U32", "v_subrev_co_ci_u32">; 1132 1133defm V_CNDMASK_B32 : 1134 VOP2e_Real_gfx10<0x001, "V_CNDMASK_B32", "v_cndmask_b32">; 1135 1136// VOP3 only. 1137defm V_BFM_B32 : VOP3Only_Real_gfx10<0x363>; 1138defm V_BCNT_U32_B32 : VOP3Only_Real_gfx10<0x364>; 1139defm V_MBCNT_LO_U32_B32 : VOP3Only_Real_gfx10<0x365>; 1140defm V_MBCNT_HI_U32_B32 : VOP3Only_Real_gfx10<0x366>; 1141defm V_LDEXP_F32 : VOP3Only_Real_gfx10<0x362>; 1142defm V_CVT_PKNORM_I16_F32 : VOP3Only_Real_gfx10<0x368>; 1143defm V_CVT_PKNORM_U16_F32 : VOP3Only_Real_gfx10<0x369>; 1144defm V_CVT_PK_U16_U32 : VOP3Only_Real_gfx10<0x36a>; 1145defm V_CVT_PK_I16_I32 : VOP3Only_Real_gfx10<0x36b>; 1146 1147// VOP3 carry-in, carry-out. 1148defm V_ADD_CO_U32 : 1149 VOP3beOnly_Real_gfx10<0x30f, "V_ADD_I32", "v_add_co_u32">; 1150defm V_SUB_CO_U32 : 1151 VOP3beOnly_Real_gfx10<0x310, "V_SUB_I32", "v_sub_co_u32">; 1152defm V_SUBREV_CO_U32 : 1153 VOP3beOnly_Real_gfx10<0x319, "V_SUBREV_I32", "v_subrev_co_u32">; 1154 1155let SubtargetPredicate = isGFX10Plus in { 1156 defm : VOP2eInstAliases<V_CNDMASK_B32_e32, V_CNDMASK_B32_e32_gfx10>; 1157 1158 defm : VOP2bInstAliases< 1159 V_ADDC_U32_e32, V_ADD_CO_CI_U32_e32_gfx10, "v_add_co_ci_u32">; 1160 defm : VOP2bInstAliases< 1161 V_SUBB_U32_e32, V_SUB_CO_CI_U32_e32_gfx10, "v_sub_co_ci_u32">; 1162 defm : VOP2bInstAliases< 1163 V_SUBBREV_U32_e32, V_SUBREV_CO_CI_U32_e32_gfx10, "v_subrev_co_ci_u32">; 1164} // End SubtargetPredicate = isGFX10Plus 1165 1166//===----------------------------------------------------------------------===// 1167// GFX6, GFX7, GFX10. 1168//===----------------------------------------------------------------------===// 1169 1170class VOP2_DPPe <bits<6> op, VOP2_DPP_Pseudo ps, VOPProfile P = ps.Pfl> : 1171 VOP_DPPe <P> { 1172 bits<8> vdst; 1173 bits<8> src1; 1174 let Inst{8-0} = 0xfa; //dpp 1175 let Inst{16-9} = !if(P.HasSrc1, src1{7-0}, 0); 1176 let Inst{24-17} = !if(P.EmitDst, vdst{7-0}, 0); 1177 let Inst{30-25} = op; 1178 let Inst{31} = 0x0; //encoding 1179} 1180 1181let AssemblerPredicate = isGFX6GFX7, DecoderNamespace = "GFX6GFX7" in { 1182 multiclass VOP2Only_Real_gfx6_gfx7<bits<6> op> { 1183 def _gfx6_gfx7 : 1184 VOP2_Real<!cast<VOP2_Pseudo>(NAME), SIEncodingFamily.SI>, 1185 VOP2e<op{5-0}, !cast<VOP2_Pseudo>(NAME).Pfl>; 1186 } 1187 multiclass VOP2Only_Real_MADK_gfx6_gfx7<bits<6> op> { 1188 def _gfx6_gfx7 : 1189 VOP2_Real<!cast<VOP2_Pseudo>(NAME), SIEncodingFamily.SI>, 1190 VOP2_MADKe<op{5-0}, !cast<VOP2_Pseudo>(NAME).Pfl>; 1191 } 1192 multiclass VOP2_Real_e32_gfx6_gfx7<bits<6> op> { 1193 def _e32_gfx6_gfx7 : 1194 VOP2_Real<!cast<VOP2_Pseudo>(NAME#"_e32"), SIEncodingFamily.SI>, 1195 VOP2e<op{5-0}, !cast<VOP2_Pseudo>(NAME#"_e32").Pfl>; 1196 } 1197 multiclass VOP2_Real_e64_gfx6_gfx7<bits<6> op> { 1198 def _e64_gfx6_gfx7 : 1199 VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.SI>, 1200 VOP3e_gfx6_gfx7<{1, 0, 0, op{5-0}}, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl>; 1201 } 1202 multiclass VOP2be_Real_e64_gfx6_gfx7<bits<6> op> { 1203 def _e64_gfx6_gfx7 : 1204 VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.SI>, 1205 VOP3be_gfx6_gfx7<{1, 0, 0, op{5-0}}, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl>; 1206 } 1207} // End AssemblerPredicate = isGFX6GFX7, DecoderNamespace = "GFX6GFX7" 1208 1209multiclass VOP2Only_Real_MADK_gfx6_gfx7_gfx10<bits<6> op> : 1210 VOP2Only_Real_MADK_gfx6_gfx7<op>, VOP2Only_Real_MADK_gfx10<op>; 1211 1212multiclass VOP2_Real_gfx6_gfx7<bits<6> op> : 1213 VOP2_Real_e32_gfx6_gfx7<op>, VOP2_Real_e64_gfx6_gfx7<op>; 1214 1215multiclass VOP2_Real_gfx6_gfx7_gfx10<bits<6> op> : 1216 VOP2_Real_gfx6_gfx7<op>, VOP2_Real_gfx10<op>; 1217 1218multiclass VOP2be_Real_gfx6_gfx7<bits<6> op> : 1219 VOP2_Real_e32_gfx6_gfx7<op>, VOP2be_Real_e64_gfx6_gfx7<op>; 1220 1221defm V_CNDMASK_B32 : VOP2_Real_gfx6_gfx7<0x000>; 1222defm V_MIN_LEGACY_F32 : VOP2_Real_gfx6_gfx7<0x00d>; 1223defm V_MAX_LEGACY_F32 : VOP2_Real_gfx6_gfx7<0x00e>; 1224defm V_LSHR_B32 : VOP2_Real_gfx6_gfx7<0x015>; 1225defm V_ASHR_I32 : VOP2_Real_gfx6_gfx7<0x017>; 1226defm V_LSHL_B32 : VOP2_Real_gfx6_gfx7<0x019>; 1227defm V_BFM_B32 : VOP2_Real_gfx6_gfx7<0x01e>; 1228defm V_BCNT_U32_B32 : VOP2_Real_gfx6_gfx7<0x022>; 1229defm V_MBCNT_LO_U32_B32 : VOP2_Real_gfx6_gfx7<0x023>; 1230defm V_MBCNT_HI_U32_B32 : VOP2_Real_gfx6_gfx7<0x024>; 1231defm V_LDEXP_F32 : VOP2_Real_gfx6_gfx7<0x02b>; 1232defm V_CVT_PKACCUM_U8_F32 : VOP2_Real_gfx6_gfx7<0x02c>; 1233defm V_CVT_PKNORM_I16_F32 : VOP2_Real_gfx6_gfx7<0x02d>; 1234defm V_CVT_PKNORM_U16_F32 : VOP2_Real_gfx6_gfx7<0x02e>; 1235defm V_CVT_PK_U16_U32 : VOP2_Real_gfx6_gfx7<0x030>; 1236defm V_CVT_PK_I16_I32 : VOP2_Real_gfx6_gfx7<0x031>; 1237defm V_ADD_I32 : VOP2be_Real_gfx6_gfx7<0x025>; 1238defm V_SUB_I32 : VOP2be_Real_gfx6_gfx7<0x026>; 1239defm V_SUBREV_I32 : VOP2be_Real_gfx6_gfx7<0x027>; 1240defm V_ADDC_U32 : VOP2be_Real_gfx6_gfx7<0x028>; 1241defm V_SUBB_U32 : VOP2be_Real_gfx6_gfx7<0x029>; 1242defm V_SUBBREV_U32 : VOP2be_Real_gfx6_gfx7<0x02a>; 1243 1244defm V_READLANE_B32 : VOP2Only_Real_gfx6_gfx7<0x001>; 1245 1246let InOperandList = (ins SSrcOrLds_b32:$src0, SCSrc_b32:$src1, VSrc_b32:$vdst_in) in { 1247 defm V_WRITELANE_B32 : VOP2Only_Real_gfx6_gfx7<0x002>; 1248} // End InOperandList = (ins SSrcOrLds_b32:$src0, SCSrc_b32:$src1, VSrc_b32:$vdst_in) 1249 1250let SubtargetPredicate = isGFX6GFX7 in { 1251 defm : VOP2eInstAliases<V_CNDMASK_B32_e32, V_CNDMASK_B32_e32_gfx6_gfx7>; 1252} // End SubtargetPredicate = isGFX6GFX7 1253 1254defm V_ADD_F32 : VOP2_Real_gfx6_gfx7_gfx10<0x003>; 1255defm V_SUB_F32 : VOP2_Real_gfx6_gfx7_gfx10<0x004>; 1256defm V_SUBREV_F32 : VOP2_Real_gfx6_gfx7_gfx10<0x005>; 1257defm V_MAC_LEGACY_F32 : VOP2_Real_gfx6_gfx7_gfx10<0x006>; 1258defm V_MUL_LEGACY_F32 : VOP2_Real_gfx6_gfx7_gfx10<0x007>; 1259defm V_MUL_F32 : VOP2_Real_gfx6_gfx7_gfx10<0x008>; 1260defm V_MUL_I32_I24 : VOP2_Real_gfx6_gfx7_gfx10<0x009>; 1261defm V_MUL_HI_I32_I24 : VOP2_Real_gfx6_gfx7_gfx10<0x00a>; 1262defm V_MUL_U32_U24 : VOP2_Real_gfx6_gfx7_gfx10<0x00b>; 1263defm V_MUL_HI_U32_U24 : VOP2_Real_gfx6_gfx7_gfx10<0x00c>; 1264defm V_MIN_F32 : VOP2_Real_gfx6_gfx7_gfx10<0x00f>; 1265defm V_MAX_F32 : VOP2_Real_gfx6_gfx7_gfx10<0x010>; 1266defm V_MIN_I32 : VOP2_Real_gfx6_gfx7_gfx10<0x011>; 1267defm V_MAX_I32 : VOP2_Real_gfx6_gfx7_gfx10<0x012>; 1268defm V_MIN_U32 : VOP2_Real_gfx6_gfx7_gfx10<0x013>; 1269defm V_MAX_U32 : VOP2_Real_gfx6_gfx7_gfx10<0x014>; 1270defm V_LSHRREV_B32 : VOP2_Real_gfx6_gfx7_gfx10<0x016>; 1271defm V_ASHRREV_I32 : VOP2_Real_gfx6_gfx7_gfx10<0x018>; 1272defm V_LSHLREV_B32 : VOP2_Real_gfx6_gfx7_gfx10<0x01a>; 1273defm V_AND_B32 : VOP2_Real_gfx6_gfx7_gfx10<0x01b>; 1274defm V_OR_B32 : VOP2_Real_gfx6_gfx7_gfx10<0x01c>; 1275defm V_XOR_B32 : VOP2_Real_gfx6_gfx7_gfx10<0x01d>; 1276defm V_MAC_F32 : VOP2_Real_gfx6_gfx7_gfx10<0x01f>; 1277defm V_CVT_PKRTZ_F16_F32 : VOP2_Real_gfx6_gfx7_gfx10<0x02f>; 1278defm V_MADMK_F32 : VOP2Only_Real_MADK_gfx6_gfx7_gfx10<0x020>; 1279defm V_MADAK_F32 : VOP2Only_Real_MADK_gfx6_gfx7_gfx10<0x021>; 1280 1281//===----------------------------------------------------------------------===// 1282// GFX8, GFX9 (VI). 1283//===----------------------------------------------------------------------===// 1284 1285let AssemblerPredicate = isGFX8GFX9, DecoderNamespace = "GFX8" in { 1286 1287multiclass VOP2_Real_MADK_vi <bits<6> op> { 1288 def _vi : VOP2_Real<!cast<VOP2_Pseudo>(NAME), SIEncodingFamily.VI>, 1289 VOP2_MADKe<op{5-0}, !cast<VOP2_Pseudo>(NAME).Pfl>; 1290} 1291 1292multiclass VOP2_Real_e32_vi <bits<6> op> { 1293 def _e32_vi : 1294 VOP2_Real<!cast<VOP2_Pseudo>(NAME#"_e32"), SIEncodingFamily.VI>, 1295 VOP2e<op{5-0}, !cast<VOP2_Pseudo>(NAME#"_e32").Pfl>; 1296} 1297 1298multiclass VOP2_Real_e64_vi <bits<10> op> { 1299 def _e64_vi : 1300 VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.VI>, 1301 VOP3e_vi <op, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl>; 1302} 1303 1304multiclass VOP2_Real_e64only_vi <bits<10> op> { 1305 def _e64_vi : 1306 VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.VI>, 1307 VOP3e_vi <op, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl> { 1308 // Hack to stop printing _e64 1309 VOP3_Pseudo ps = !cast<VOP3_Pseudo>(NAME#"_e64"); 1310 let OutOperandList = (outs VGPR_32:$vdst); 1311 let AsmString = ps.Mnemonic # " " # ps.AsmOperands; 1312 } 1313} 1314 1315multiclass Base_VOP2_Real_e32e64_vi <bits<6> op> : 1316 VOP2_Real_e32_vi<op>, 1317 VOP2_Real_e64_vi<{0, 1, 0, 0, op{5-0}}>; 1318 1319} // End AssemblerPredicate = isGFX8GFX9, DecoderNamespace = "GFX8" 1320 1321multiclass VOP2_SDWA_Real <bits<6> op> { 1322 foreach _ = BoolToList<!cast<VOP2_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA>.ret in 1323 def _sdwa_vi : 1324 VOP_SDWA_Real <!cast<VOP2_SDWA_Pseudo>(NAME#"_sdwa")>, 1325 VOP2_SDWAe <op{5-0}, !cast<VOP2_SDWA_Pseudo>(NAME#"_sdwa").Pfl>; 1326} 1327 1328multiclass VOP2_SDWA9_Real <bits<6> op> { 1329 foreach _ = BoolToList<!cast<VOP2_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA9>.ret in 1330 def _sdwa_gfx9 : 1331 VOP_SDWA9_Real <!cast<VOP2_SDWA_Pseudo>(NAME#"_sdwa")>, 1332 VOP2_SDWA9Ae <op{5-0}, !cast<VOP2_SDWA_Pseudo>(NAME#"_sdwa").Pfl>; 1333} 1334 1335let AssemblerPredicate = isGFX8Only in { 1336 1337multiclass VOP2be_Real_e32e64_vi_only <bits<6> op, string OpName, string AsmName> { 1338 def _e32_vi : 1339 VOP2_Real<!cast<VOP2_Pseudo>(OpName#"_e32"), SIEncodingFamily.VI>, 1340 VOP2e<op{5-0}, !cast<VOP2_Pseudo>(OpName#"_e32").Pfl> { 1341 VOP2_Pseudo ps = !cast<VOP2_Pseudo>(OpName#"_e32"); 1342 let AsmString = AsmName # ps.AsmOperands; 1343 let DecoderNamespace = "GFX8"; 1344 } 1345 def _e64_vi : 1346 VOP3_Real<!cast<VOP3_Pseudo>(OpName#"_e64"), SIEncodingFamily.VI>, 1347 VOP3be_vi <{0, 1, 0, 0, op{5-0}}, !cast<VOP3_Pseudo>(OpName#"_e64").Pfl> { 1348 VOP3_Pseudo ps = !cast<VOP3_Pseudo>(OpName#"_e64"); 1349 let AsmString = AsmName # ps.AsmOperands; 1350 let DecoderNamespace = "GFX8"; 1351 } 1352 foreach _ = BoolToList<!cast<VOP2_Pseudo>(OpName#"_e32").Pfl.HasExtSDWA>.ret in 1353 def _sdwa_vi : 1354 VOP_SDWA_Real <!cast<VOP2_SDWA_Pseudo>(OpName#"_sdwa")>, 1355 VOP2_SDWAe <op{5-0}, !cast<VOP2_SDWA_Pseudo>(OpName#"_sdwa").Pfl> { 1356 VOP2_SDWA_Pseudo ps = !cast<VOP2_SDWA_Pseudo>(OpName#"_sdwa"); 1357 let AsmString = AsmName # ps.AsmOperands; 1358 } 1359 foreach _ = BoolToList<!cast<VOP2_Pseudo>(OpName#"_e32").Pfl.HasExtDPP>.ret in 1360 def _dpp_vi : 1361 VOP_DPP_Real<!cast<VOP2_DPP_Pseudo>(OpName#"_dpp"), SIEncodingFamily.VI>, 1362 VOP2_DPPe<op, !cast<VOP2_DPP_Pseudo>(OpName#"_dpp")> { 1363 VOP2_DPP_Pseudo ps = !cast<VOP2_DPP_Pseudo>(OpName#"_dpp"); 1364 let AsmString = AsmName # ps.AsmOperands; 1365 } 1366} 1367} 1368 1369let AssemblerPredicate = isGFX9Only in { 1370 1371multiclass VOP2be_Real_e32e64_gfx9 <bits<6> op, string OpName, string AsmName> { 1372 def _e32_gfx9 : 1373 VOP2_Real<!cast<VOP2_Pseudo>(OpName#"_e32"), SIEncodingFamily.GFX9>, 1374 VOP2e<op{5-0}, !cast<VOP2_Pseudo>(OpName#"_e32").Pfl> { 1375 VOP2_Pseudo ps = !cast<VOP2_Pseudo>(OpName#"_e32"); 1376 let AsmString = AsmName # ps.AsmOperands; 1377 let DecoderNamespace = "GFX9"; 1378 } 1379 def _e64_gfx9 : 1380 VOP3_Real<!cast<VOP3_Pseudo>(OpName#"_e64"), SIEncodingFamily.GFX9>, 1381 VOP3be_vi <{0, 1, 0, 0, op{5-0}}, !cast<VOP3_Pseudo>(OpName#"_e64").Pfl> { 1382 VOP3_Pseudo ps = !cast<VOP3_Pseudo>(OpName#"_e64"); 1383 let AsmString = AsmName # ps.AsmOperands; 1384 let DecoderNamespace = "GFX9"; 1385 } 1386 foreach _ = BoolToList<!cast<VOP2_Pseudo>(OpName#"_e32").Pfl.HasExtSDWA9>.ret in 1387 def _sdwa_gfx9 : 1388 VOP_SDWA9_Real <!cast<VOP2_SDWA_Pseudo>(OpName#"_sdwa")>, 1389 VOP2_SDWA9Ae <op{5-0}, !cast<VOP2_SDWA_Pseudo>(OpName#"_sdwa").Pfl> { 1390 VOP2_SDWA_Pseudo ps = !cast<VOP2_SDWA_Pseudo>(OpName#"_sdwa"); 1391 let AsmString = AsmName # ps.AsmOperands; 1392 } 1393 foreach _ = BoolToList<!cast<VOP2_Pseudo>(OpName#"_e32").Pfl.HasExtDPP>.ret in 1394 def _dpp_gfx9 : 1395 VOP_DPP_Real<!cast<VOP2_DPP_Pseudo>(OpName#"_dpp"), SIEncodingFamily.GFX9>, 1396 VOP2_DPPe<op, !cast<VOP2_DPP_Pseudo>(OpName#"_dpp")> { 1397 VOP2_DPP_Pseudo ps = !cast<VOP2_DPP_Pseudo>(OpName#"_dpp"); 1398 let AsmString = AsmName # ps.AsmOperands; 1399 let DecoderNamespace = "SDWA9"; 1400 } 1401} 1402 1403multiclass VOP2_Real_e32e64_gfx9 <bits<6> op> { 1404 def _e32_gfx9 : 1405 VOP2_Real<!cast<VOP2_Pseudo>(NAME#"_e32"), SIEncodingFamily.GFX9>, 1406 VOP2e<op{5-0}, !cast<VOP2_Pseudo>(NAME#"_e32").Pfl>{ 1407 let DecoderNamespace = "GFX9"; 1408 } 1409 def _e64_gfx9 : 1410 VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.GFX9>, 1411 VOP3e_vi <{0, 1, 0, 0, op{5-0}}, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl> { 1412 let DecoderNamespace = "GFX9"; 1413 } 1414 foreach _ = BoolToList<!cast<VOP2_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA9>.ret in 1415 def _sdwa_gfx9 : 1416 VOP_SDWA9_Real <!cast<VOP2_SDWA_Pseudo>(NAME#"_sdwa")>, 1417 VOP2_SDWA9Ae <op{5-0}, !cast<VOP2_SDWA_Pseudo>(NAME#"_sdwa").Pfl> { 1418 } 1419 foreach _ = BoolToList<!cast<VOP2_Pseudo>(NAME#"_e32").Pfl.HasExtDPP>.ret in 1420 def _dpp_gfx9 : 1421 VOP_DPP_Real<!cast<VOP2_DPP_Pseudo>(NAME#"_dpp"), SIEncodingFamily.GFX9>, 1422 VOP2_DPPe<op, !cast<VOP2_DPP_Pseudo>(NAME#"_dpp")> { 1423 let DecoderNamespace = "SDWA9"; 1424 } 1425} 1426 1427} // AssemblerPredicate = isGFX9Only 1428 1429multiclass VOP2_Real_e32e64_vi <bits<6> op> : 1430 Base_VOP2_Real_e32e64_vi<op>, VOP2_SDWA_Real<op>, VOP2_SDWA9_Real<op> { 1431 1432 foreach _ = BoolToList<!cast<VOP2_Pseudo>(NAME#"_e32").Pfl.HasExtDPP>.ret in 1433 def _dpp_vi : 1434 VOP_DPP_Real<!cast<VOP2_DPP_Pseudo>(NAME#"_dpp"), SIEncodingFamily.VI>, 1435 VOP2_DPPe<op, !cast<VOP2_DPP_Pseudo>(NAME#"_dpp")>; 1436} 1437 1438defm V_CNDMASK_B32 : VOP2_Real_e32e64_vi <0x0>; 1439defm V_ADD_F32 : VOP2_Real_e32e64_vi <0x1>; 1440defm V_SUB_F32 : VOP2_Real_e32e64_vi <0x2>; 1441defm V_SUBREV_F32 : VOP2_Real_e32e64_vi <0x3>; 1442defm V_MUL_LEGACY_F32 : VOP2_Real_e32e64_vi <0x4>; 1443defm V_MUL_F32 : VOP2_Real_e32e64_vi <0x5>; 1444defm V_MUL_I32_I24 : VOP2_Real_e32e64_vi <0x6>; 1445defm V_MUL_HI_I32_I24 : VOP2_Real_e32e64_vi <0x7>; 1446defm V_MUL_U32_U24 : VOP2_Real_e32e64_vi <0x8>; 1447defm V_MUL_HI_U32_U24 : VOP2_Real_e32e64_vi <0x9>; 1448defm V_MIN_F32 : VOP2_Real_e32e64_vi <0xa>; 1449defm V_MAX_F32 : VOP2_Real_e32e64_vi <0xb>; 1450defm V_MIN_I32 : VOP2_Real_e32e64_vi <0xc>; 1451defm V_MAX_I32 : VOP2_Real_e32e64_vi <0xd>; 1452defm V_MIN_U32 : VOP2_Real_e32e64_vi <0xe>; 1453defm V_MAX_U32 : VOP2_Real_e32e64_vi <0xf>; 1454defm V_LSHRREV_B32 : VOP2_Real_e32e64_vi <0x10>; 1455defm V_ASHRREV_I32 : VOP2_Real_e32e64_vi <0x11>; 1456defm V_LSHLREV_B32 : VOP2_Real_e32e64_vi <0x12>; 1457defm V_AND_B32 : VOP2_Real_e32e64_vi <0x13>; 1458defm V_OR_B32 : VOP2_Real_e32e64_vi <0x14>; 1459defm V_XOR_B32 : VOP2_Real_e32e64_vi <0x15>; 1460defm V_MAC_F32 : VOP2_Real_e32e64_vi <0x16>; 1461defm V_MADMK_F32 : VOP2_Real_MADK_vi <0x17>; 1462defm V_MADAK_F32 : VOP2_Real_MADK_vi <0x18>; 1463 1464defm V_ADD_U32 : VOP2be_Real_e32e64_vi_only <0x19, "V_ADD_I32", "v_add_u32">; 1465defm V_SUB_U32 : VOP2be_Real_e32e64_vi_only <0x1a, "V_SUB_I32", "v_sub_u32">; 1466defm V_SUBREV_U32 : VOP2be_Real_e32e64_vi_only <0x1b, "V_SUBREV_I32", "v_subrev_u32">; 1467defm V_ADDC_U32 : VOP2be_Real_e32e64_vi_only <0x1c, "V_ADDC_U32", "v_addc_u32">; 1468defm V_SUBB_U32 : VOP2be_Real_e32e64_vi_only <0x1d, "V_SUBB_U32", "v_subb_u32">; 1469defm V_SUBBREV_U32 : VOP2be_Real_e32e64_vi_only <0x1e, "V_SUBBREV_U32", "v_subbrev_u32">; 1470 1471defm V_ADD_CO_U32 : VOP2be_Real_e32e64_gfx9 <0x19, "V_ADD_I32", "v_add_co_u32">; 1472defm V_SUB_CO_U32 : VOP2be_Real_e32e64_gfx9 <0x1a, "V_SUB_I32", "v_sub_co_u32">; 1473defm V_SUBREV_CO_U32 : VOP2be_Real_e32e64_gfx9 <0x1b, "V_SUBREV_I32", "v_subrev_co_u32">; 1474defm V_ADDC_CO_U32 : VOP2be_Real_e32e64_gfx9 <0x1c, "V_ADDC_U32", "v_addc_co_u32">; 1475defm V_SUBB_CO_U32 : VOP2be_Real_e32e64_gfx9 <0x1d, "V_SUBB_U32", "v_subb_co_u32">; 1476defm V_SUBBREV_CO_U32 : VOP2be_Real_e32e64_gfx9 <0x1e, "V_SUBBREV_U32", "v_subbrev_co_u32">; 1477 1478defm V_ADD_U32 : VOP2_Real_e32e64_gfx9 <0x34>; 1479defm V_SUB_U32 : VOP2_Real_e32e64_gfx9 <0x35>; 1480defm V_SUBREV_U32 : VOP2_Real_e32e64_gfx9 <0x36>; 1481 1482defm V_BFM_B32 : VOP2_Real_e64only_vi <0x293>; 1483defm V_BCNT_U32_B32 : VOP2_Real_e64only_vi <0x28b>; 1484defm V_MBCNT_LO_U32_B32 : VOP2_Real_e64only_vi <0x28c>; 1485defm V_MBCNT_HI_U32_B32 : VOP2_Real_e64only_vi <0x28d>; 1486defm V_LDEXP_F32 : VOP2_Real_e64only_vi <0x288>; 1487defm V_CVT_PKACCUM_U8_F32 : VOP2_Real_e64only_vi <0x1f0>; 1488defm V_CVT_PKNORM_I16_F32 : VOP2_Real_e64only_vi <0x294>; 1489defm V_CVT_PKNORM_U16_F32 : VOP2_Real_e64only_vi <0x295>; 1490defm V_CVT_PKRTZ_F16_F32 : VOP2_Real_e64only_vi <0x296>; 1491defm V_CVT_PK_U16_U32 : VOP2_Real_e64only_vi <0x297>; 1492defm V_CVT_PK_I16_I32 : VOP2_Real_e64only_vi <0x298>; 1493 1494defm V_ADD_F16 : VOP2_Real_e32e64_vi <0x1f>; 1495defm V_SUB_F16 : VOP2_Real_e32e64_vi <0x20>; 1496defm V_SUBREV_F16 : VOP2_Real_e32e64_vi <0x21>; 1497defm V_MUL_F16 : VOP2_Real_e32e64_vi <0x22>; 1498defm V_MAC_F16 : VOP2_Real_e32e64_vi <0x23>; 1499defm V_MADMK_F16 : VOP2_Real_MADK_vi <0x24>; 1500defm V_MADAK_F16 : VOP2_Real_MADK_vi <0x25>; 1501defm V_ADD_U16 : VOP2_Real_e32e64_vi <0x26>; 1502defm V_SUB_U16 : VOP2_Real_e32e64_vi <0x27>; 1503defm V_SUBREV_U16 : VOP2_Real_e32e64_vi <0x28>; 1504defm V_MUL_LO_U16 : VOP2_Real_e32e64_vi <0x29>; 1505defm V_LSHLREV_B16 : VOP2_Real_e32e64_vi <0x2a>; 1506defm V_LSHRREV_B16 : VOP2_Real_e32e64_vi <0x2b>; 1507defm V_ASHRREV_I16 : VOP2_Real_e32e64_vi <0x2c>; 1508defm V_MAX_F16 : VOP2_Real_e32e64_vi <0x2d>; 1509defm V_MIN_F16 : VOP2_Real_e32e64_vi <0x2e>; 1510defm V_MAX_U16 : VOP2_Real_e32e64_vi <0x2f>; 1511defm V_MAX_I16 : VOP2_Real_e32e64_vi <0x30>; 1512defm V_MIN_U16 : VOP2_Real_e32e64_vi <0x31>; 1513defm V_MIN_I16 : VOP2_Real_e32e64_vi <0x32>; 1514defm V_LDEXP_F16 : VOP2_Real_e32e64_vi <0x33>; 1515 1516let SubtargetPredicate = isGFX8GFX9 in { 1517 1518// Aliases to simplify matching of floating-point instructions that 1519// are VOP2 on SI and VOP3 on VI. 1520class SI2_VI3Alias <string name, VOP3_Real inst> : InstAlias < 1521 name#" $dst, $src0, $src1", 1522 !if(inst.Pfl.HasOMod, 1523 (inst VGPR_32:$dst, 0, VCSrc_f32:$src0, 0, VCSrc_f32:$src1, 0, 0), 1524 (inst VGPR_32:$dst, 0, VCSrc_f32:$src0, 0, VCSrc_f32:$src1, 0)) 1525>, PredicateControl { 1526 let UseInstAsmMatchConverter = 0; 1527 let AsmVariantName = AMDGPUAsmVariants.VOP3; 1528} 1529 1530def : SI2_VI3Alias <"v_ldexp_f32", V_LDEXP_F32_e64_vi>; 1531def : SI2_VI3Alias <"v_cvt_pkaccum_u8_f32", V_CVT_PKACCUM_U8_F32_e64_vi>; 1532def : SI2_VI3Alias <"v_cvt_pknorm_i16_f32", V_CVT_PKNORM_I16_F32_e64_vi>; 1533def : SI2_VI3Alias <"v_cvt_pknorm_u16_f32", V_CVT_PKNORM_U16_F32_e64_vi>; 1534def : SI2_VI3Alias <"v_cvt_pkrtz_f16_f32", V_CVT_PKRTZ_F16_F32_e64_vi>; 1535 1536defm : VOP2eInstAliases<V_CNDMASK_B32_e32, V_CNDMASK_B32_e32_vi>; 1537 1538} // End SubtargetPredicate = isGFX8GFX9 1539 1540let SubtargetPredicate = isGFX9Only in { 1541 1542defm : VOP2bInstAliases<V_ADD_I32_e32, V_ADD_CO_U32_e32_gfx9, "v_add_co_u32">; 1543defm : VOP2bInstAliases<V_ADDC_U32_e32, V_ADDC_CO_U32_e32_gfx9, "v_addc_co_u32">; 1544defm : VOP2bInstAliases<V_SUB_I32_e32, V_SUB_CO_U32_e32_gfx9, "v_sub_co_u32">; 1545defm : VOP2bInstAliases<V_SUBB_U32_e32, V_SUBB_CO_U32_e32_gfx9, "v_subb_co_u32">; 1546defm : VOP2bInstAliases<V_SUBREV_I32_e32, V_SUBREV_CO_U32_e32_gfx9, "v_subrev_co_u32">; 1547defm : VOP2bInstAliases<V_SUBBREV_U32_e32, V_SUBBREV_CO_U32_e32_gfx9, "v_subbrev_co_u32">; 1548 1549} // End SubtargetPredicate = isGFX9Only 1550 1551let SubtargetPredicate = HasDLInsts in { 1552 1553defm V_FMAC_F32 : VOP2_Real_e32e64_vi <0x3b>; 1554defm V_XNOR_B32 : VOP2_Real_e32e64_vi <0x3d>; 1555 1556} // End SubtargetPredicate = HasDLInsts 1557 1558multiclass VOP2_Real_DOT_ACC_gfx9<bits<6> op> : VOP2_Real_e32_vi<op> { 1559 def _dpp_vi : VOP2_DPP<op, !cast<VOP2_DPP_Pseudo>(NAME#"_dpp")>; 1560} 1561 1562multiclass VOP2_Real_DOT_ACC_gfx10<bits<6> op> : 1563 VOP2_Real_e32_gfx10<op>, 1564 VOP2_Real_dpp_gfx10<op>, 1565 VOP2_Real_dpp8_gfx10<op>; 1566 1567let SubtargetPredicate = HasDot5Insts in { 1568 defm V_DOT2C_F32_F16 : VOP2_Real_DOT_ACC_gfx9<0x37>; 1569 // NB: Opcode conflicts with V_DOT8C_I32_I4 1570 // This opcode exists in gfx 10.1* only 1571 defm V_DOT2C_F32_F16 : VOP2_Real_DOT_ACC_gfx10<0x02>; 1572} 1573 1574let SubtargetPredicate = HasDot6Insts in { 1575 defm V_DOT4C_I32_I8 : VOP2_Real_DOT_ACC_gfx9<0x39>; 1576 defm V_DOT4C_I32_I8 : VOP2_Real_DOT_ACC_gfx10<0x0d>; 1577} 1578 1579let SubtargetPredicate = HasDot4Insts in { 1580 defm V_DOT2C_I32_I16 : VOP2_Real_DOT_ACC_gfx9<0x38>; 1581} 1582let SubtargetPredicate = HasDot3Insts in { 1583 defm V_DOT8C_I32_I4 : VOP2_Real_DOT_ACC_gfx9<0x3a>; 1584} 1585 1586let SubtargetPredicate = HasPkFmacF16Inst in { 1587defm V_PK_FMAC_F16 : VOP2_Real_e32_vi<0x3c>; 1588} // End SubtargetPredicate = HasPkFmacF16Inst 1589