1//===-- VOP1Instructions.td - Vector 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 9//===----------------------------------------------------------------------===// 10// VOP1 Classes 11//===----------------------------------------------------------------------===// 12 13class VOP1e <bits<8> op, VOPProfile P> : Enc32 { 14 bits<8> vdst; 15 bits<9> src0; 16 17 let Inst{8-0} = !if(P.HasSrc0, src0{8-0}, ?); 18 let Inst{16-9} = op; 19 let Inst{24-17} = !if(P.EmitDst, vdst{7-0}, 0); 20 let Inst{31-25} = 0x3f; //encoding 21} 22 23class VOP1_SDWAe <bits<8> op, VOPProfile P> : VOP_SDWAe <P> { 24 bits<8> vdst; 25 26 let Inst{8-0} = 0xf9; // sdwa 27 let Inst{16-9} = op; 28 let Inst{24-17} = !if(P.EmitDst, vdst{7-0}, 0); 29 let Inst{31-25} = 0x3f; // encoding 30} 31 32class VOP1_SDWA9Ae <bits<8> op, VOPProfile P> : VOP_SDWA9Ae <P> { 33 bits<8> vdst; 34 35 let Inst{8-0} = 0xf9; // sdwa 36 let Inst{16-9} = op; 37 let Inst{24-17} = !if(P.EmitDst, vdst{7-0}, 0); 38 let Inst{31-25} = 0x3f; // encoding 39} 40 41class VOP1_Pseudo <string opName, VOPProfile P, list<dag> pattern=[], bit VOP1Only = 0> : 42 VOP_Pseudo <opName, !if(VOP1Only, "", "_e32"), P, P.Outs32, P.Ins32, "", pattern> { 43 44 let AsmOperands = P.Asm32; 45 46 let Size = 4; 47 let mayLoad = 0; 48 let mayStore = 0; 49 let hasSideEffects = 0; 50 51 let ReadsModeReg = !or(isFloatType<P.DstVT>.ret, isFloatType<P.Src0VT>.ret); 52 53 let mayRaiseFPException = ReadsModeReg; 54 55 let VOP1 = 1; 56 let VALU = 1; 57 let Uses = !if(ReadsModeReg, [MODE, EXEC], [EXEC]); 58 59 let AsmVariantName = AMDGPUAsmVariants.Default; 60} 61 62class VOP1_Real <VOP1_Pseudo ps, int EncodingFamily, string real_name = ps.Mnemonic > : 63 VOP_Real <ps>, 64 InstSI <ps.OutOperandList, ps.InOperandList, real_name # ps.AsmOperands, []>, 65 SIMCInstr <ps.PseudoInstr, EncodingFamily> { 66 67 let VALU = 1; 68 let VOP1 = 1; 69 let isPseudo = 0; 70 let isCodeGenOnly = 0; 71 72 let Constraints = ps.Constraints; 73 let DisableEncoding = ps.DisableEncoding; 74 75 // copy relevant pseudo op flags 76 let SubtargetPredicate = ps.SubtargetPredicate; 77 let AsmMatchConverter = ps.AsmMatchConverter; 78 let AsmVariantName = ps.AsmVariantName; 79 let Constraints = ps.Constraints; 80 let DisableEncoding = ps.DisableEncoding; 81 let TSFlags = ps.TSFlags; 82 let UseNamedOperandTable = ps.UseNamedOperandTable; 83 let Uses = ps.Uses; 84 let Defs = ps.Defs; 85 let SchedRW = ps.SchedRW; 86 let mayLoad = ps.mayLoad; 87 let mayStore = ps.mayStore; 88 let TRANS = ps.TRANS; 89} 90 91class VOP1_SDWA_Pseudo <string OpName, VOPProfile P, list<dag> pattern=[]> : 92 VOP_SDWA_Pseudo <OpName, P, pattern> { 93 let AsmMatchConverter = "cvtSdwaVOP1"; 94} 95 96class VOP1_DPP_Pseudo <string OpName, VOPProfile P, list<dag> pattern=[]> : 97 VOP_DPP_Pseudo <OpName, P, pattern> { 98} 99 100class getVOP1Pat64 <SDPatternOperator node, VOPProfile P> : LetDummies { 101 list<dag> ret = 102 !if(P.HasModifiers, 103 [(set P.DstVT:$vdst, (node (P.Src0VT (VOP3Mods P.Src0VT:$src0, i32:$src0_modifiers))))], 104 !if(P.HasOMod, 105 [(set P.DstVT:$vdst, (node (P.Src0VT (VOP3OMods P.Src0VT:$src0, 106 i1:$clamp, i32:$omod))))], 107 [(set P.DstVT:$vdst, (node P.Src0VT:$src0))] 108 ) 109 ); 110} 111 112multiclass VOP1Inst <string opName, VOPProfile P, 113 SDPatternOperator node = null_frag> { 114 // We only want to set this on the basic, non-SDWA or DPP forms. 115 defvar should_mov_imm = !or(!eq(opName, "v_mov_b32"), 116 !eq(opName, "v_mov_b64")); 117 118 let isMoveImm = should_mov_imm in { 119 def _e32 : VOP1_Pseudo <opName, P>; 120 def _e64 : VOP3InstBase <opName, P, node>; 121 } 122 123 foreach _ = BoolToList<P.HasExtSDWA>.ret in 124 def _sdwa : VOP1_SDWA_Pseudo <opName, P>; 125 126 foreach _ = BoolToList<P.HasExtDPP>.ret in 127 def _dpp : VOP1_DPP_Pseudo <opName, P>; 128 129 let SubtargetPredicate = isGFX11Plus in { 130 foreach _ = BoolToList<P.HasExtVOP3DPP>.ret in 131 def _e64_dpp : VOP3_DPP_Pseudo <opName, P>; 132 } // End SubtargetPredicate = isGFX11Plus 133 134 def : MnemonicAlias<opName#"_e32", opName>, LetDummies; 135 def : MnemonicAlias<opName#"_e64", opName>, LetDummies; 136 137 foreach _ = BoolToList<P.HasExtSDWA>.ret in 138 def : MnemonicAlias<opName#"_sdwa", opName>, LetDummies; 139 140 foreach _ = BoolToList<P.HasExtDPP>.ret in 141 def : MnemonicAlias<opName#"_dpp", opName>, LetDummies; 142} 143 144// Special profile for instructions which have clamp 145// and output modifiers (but have no input modifiers) 146class VOPProfileI2F<ValueType dstVt, ValueType srcVt> : 147 VOPProfile<[dstVt, srcVt, untyped, untyped]> { 148 149 let Ins64 = (ins Src0RC64:$src0, clampmod:$clamp, omod:$omod); 150 let InsVOP3Base = (ins Src0DPP:$src0, clampmod:$clamp, omod:$omod); 151 let Asm64 = "$vdst, $src0$clamp$omod"; 152 let AsmVOP3DPPBase = Asm64; 153 154 let HasModifiers = 0; 155 let HasClamp = 1; 156} 157 158def VOP1_F64_I32 : VOPProfileI2F <f64, i32>; 159def VOP1_F32_I32 : VOPProfileI2F <f32, i32>; 160def VOP1_F16_I16 : VOPProfileI2F <f16, i16>; 161 162def VOP_NOP_PROFILE : VOPProfile <[untyped, untyped, untyped, untyped]>{ 163 let HasExtVOP3DPP = 0; 164} 165 166// OMod clears exceptions when set. OMod was always an operand, but its 167// now explicitly set. 168class VOP_SPECIAL_OMOD_PROF<ValueType dstVt, ValueType srcVt> : 169 VOPProfile<[dstVt, srcVt, untyped, untyped]> { 170 171 let HasOMod = 1; 172} 173def VOP_I32_F32_SPECIAL_OMOD : VOP_SPECIAL_OMOD_PROF<i32, f32>; 174def VOP_I32_F64_SPECIAL_OMOD : VOP_SPECIAL_OMOD_PROF<i32, f64>; 175def VOP_I16_F16_SPECIAL_OMOD : VOP_SPECIAL_OMOD_PROF<i16, f16>; 176 177//===----------------------------------------------------------------------===// 178// VOP1 Instructions 179//===----------------------------------------------------------------------===// 180 181let VOPAsmPrefer32Bit = 1 in { 182defm V_NOP : VOP1Inst <"v_nop", VOP_NOP_PROFILE>; 183} 184 185let isReMaterializable = 1, isAsCheapAsAMove = 1 in { 186defm V_MOV_B32 : VOP1Inst <"v_mov_b32", VOP_I32_I32>; 187 188let SubtargetPredicate = isGFX940Plus in 189defm V_MOV_B64 : VOP1Inst <"v_mov_b64", VOP_I64_I64>; 190} // End isMoveImm = 1 191 192// FIXME: Specify SchedRW for READFIRSTLANE_B32 193// TODO: Make profile for this, there is VOP3 encoding also 194def V_READFIRSTLANE_B32 : 195 InstSI <(outs SReg_32:$vdst), 196 (ins VRegOrLds_32:$src0), 197 "v_readfirstlane_b32 $vdst, $src0", 198 [(set i32:$vdst, (int_amdgcn_readfirstlane (i32 VRegOrLds_32:$src0)))]>, 199 Enc32 { 200 201 let isCodeGenOnly = 0; 202 let UseNamedOperandTable = 1; 203 204 let Size = 4; 205 let mayLoad = 0; 206 let mayStore = 0; 207 let hasSideEffects = 0; 208 209 let VOP1 = 1; 210 let VALU = 1; 211 let Uses = [EXEC]; 212 let isConvergent = 1; 213 214 bits<8> vdst; 215 bits<9> src0; 216 217 let Inst{8-0} = src0; 218 let Inst{16-9} = 0x2; 219 let Inst{24-17} = vdst; 220 let Inst{31-25} = 0x3f; //encoding 221} 222 223let isReMaterializable = 1 in { 224let SchedRW = [WriteDoubleCvt] in { 225// OMod clears exceptions when set in this instruction 226defm V_CVT_I32_F64 : VOP1Inst <"v_cvt_i32_f64", VOP_I32_F64_SPECIAL_OMOD, fp_to_sint>; 227 228let mayRaiseFPException = 0 in { 229defm V_CVT_F64_I32 : VOP1Inst <"v_cvt_f64_i32", VOP1_F64_I32, sint_to_fp>; 230} 231 232defm V_CVT_F32_F64 : VOP1Inst <"v_cvt_f32_f64", VOP_F32_F64, fpround>; 233defm V_CVT_F64_F32 : VOP1Inst <"v_cvt_f64_f32", VOP_F64_F32, fpextend>; 234// OMod clears exceptions when set in this instruction 235defm V_CVT_U32_F64 : VOP1Inst <"v_cvt_u32_f64", VOP_I32_F64_SPECIAL_OMOD, fp_to_uint>; 236 237let mayRaiseFPException = 0 in { 238defm V_CVT_F64_U32 : VOP1Inst <"v_cvt_f64_u32", VOP1_F64_I32, uint_to_fp>; 239} 240 241} // End SchedRW = [WriteDoubleCvt] 242 243let SchedRW = [WriteFloatCvt] in { 244 245// XXX: Does this really not raise exceptions? The manual claims the 246// 16-bit ones can. 247let mayRaiseFPException = 0 in { 248defm V_CVT_F32_I32 : VOP1Inst <"v_cvt_f32_i32", VOP1_F32_I32, sint_to_fp>; 249defm V_CVT_F32_U32 : VOP1Inst <"v_cvt_f32_u32", VOP1_F32_I32, uint_to_fp>; 250} 251 252// OMod clears exceptions when set in these 2 instructions 253defm V_CVT_U32_F32 : VOP1Inst <"v_cvt_u32_f32", VOP_I32_F32_SPECIAL_OMOD, fp_to_uint>; 254defm V_CVT_I32_F32 : VOP1Inst <"v_cvt_i32_f32", VOP_I32_F32_SPECIAL_OMOD, fp_to_sint>; 255let FPDPRounding = 1, isReMaterializable = 0 in { 256defm V_CVT_F16_F32 : VOP1Inst <"v_cvt_f16_f32", VOP_F16_F32, fpround>; 257} // End FPDPRounding = 1, isReMaterializable = 0 258 259defm V_CVT_F32_F16 : VOP1Inst <"v_cvt_f32_f16", VOP_F32_F16, fpextend>; 260 261let ReadsModeReg = 0, mayRaiseFPException = 0 in { 262defm V_CVT_RPI_I32_F32 : VOP1Inst <"v_cvt_rpi_i32_f32", VOP_I32_F32, cvt_rpi_i32_f32>; 263defm V_CVT_FLR_I32_F32 : VOP1Inst <"v_cvt_flr_i32_f32", VOP_I32_F32, cvt_flr_i32_f32>; 264defm V_CVT_OFF_F32_I4 : VOP1Inst <"v_cvt_off_f32_i4", VOP1_F32_I32>; 265} // End ReadsModeReg = 0, mayRaiseFPException = 0 266} // End SchedRW = [WriteFloatCvt] 267 268let ReadsModeReg = 0, mayRaiseFPException = 0 in { 269defm V_CVT_F32_UBYTE0 : VOP1Inst <"v_cvt_f32_ubyte0", VOP1_F32_I32, AMDGPUcvt_f32_ubyte0>; 270defm V_CVT_F32_UBYTE1 : VOP1Inst <"v_cvt_f32_ubyte1", VOP1_F32_I32, AMDGPUcvt_f32_ubyte1>; 271defm V_CVT_F32_UBYTE2 : VOP1Inst <"v_cvt_f32_ubyte2", VOP1_F32_I32, AMDGPUcvt_f32_ubyte2>; 272defm V_CVT_F32_UBYTE3 : VOP1Inst <"v_cvt_f32_ubyte3", VOP1_F32_I32, AMDGPUcvt_f32_ubyte3>; 273} // ReadsModeReg = 0, mayRaiseFPException = 0 274 275defm V_FRACT_F32 : VOP1Inst <"v_fract_f32", VOP_F32_F32, AMDGPUfract>; 276defm V_TRUNC_F32 : VOP1Inst <"v_trunc_f32", VOP_F32_F32, ftrunc>; 277defm V_CEIL_F32 : VOP1Inst <"v_ceil_f32", VOP_F32_F32, fceil>; 278defm V_RNDNE_F32 : VOP1Inst <"v_rndne_f32", VOP_F32_F32, frint>; 279defm V_FLOOR_F32 : VOP1Inst <"v_floor_f32", VOP_F32_F32, ffloor>; 280 281let TRANS = 1, SchedRW = [WriteTrans32] in { 282defm V_EXP_F32 : VOP1Inst <"v_exp_f32", VOP_F32_F32, fexp2>; 283defm V_LOG_F32 : VOP1Inst <"v_log_f32", VOP_F32_F32, flog2>; 284defm V_RCP_F32 : VOP1Inst <"v_rcp_f32", VOP_F32_F32, AMDGPUrcp>; 285defm V_RCP_IFLAG_F32 : VOP1Inst <"v_rcp_iflag_f32", VOP_F32_F32, AMDGPUrcp_iflag>; 286defm V_RSQ_F32 : VOP1Inst <"v_rsq_f32", VOP_F32_F32, AMDGPUrsq>; 287defm V_SQRT_F32 : VOP1Inst <"v_sqrt_f32", VOP_F32_F32, any_amdgcn_sqrt>; 288} // End TRANS = 1, SchedRW = [WriteTrans32] 289 290let TRANS = 1, SchedRW = [WriteTrans64] in { 291defm V_RCP_F64 : VOP1Inst <"v_rcp_f64", VOP_F64_F64, AMDGPUrcp>; 292defm V_RSQ_F64 : VOP1Inst <"v_rsq_f64", VOP_F64_F64, AMDGPUrsq>; 293defm V_SQRT_F64 : VOP1Inst <"v_sqrt_f64", VOP_F64_F64, any_amdgcn_sqrt>; 294} // End TRANS = 1, SchedRW = [WriteTrans64] 295 296let TRANS = 1, SchedRW = [WriteTrans32] in { 297defm V_SIN_F32 : VOP1Inst <"v_sin_f32", VOP_F32_F32, AMDGPUsin>; 298defm V_COS_F32 : VOP1Inst <"v_cos_f32", VOP_F32_F32, AMDGPUcos>; 299} // End TRANS = 1, SchedRW = [WriteTrans32] 300 301defm V_NOT_B32 : VOP1Inst <"v_not_b32", VOP_I32_I32>; 302defm V_BFREV_B32 : VOP1Inst <"v_bfrev_b32", VOP_I32_I32, DivergentUnaryFrag<bitreverse>>; 303defm V_FFBH_U32 : VOP1Inst <"v_ffbh_u32", VOP_I32_I32, AMDGPUffbh_u32>; 304defm V_FFBL_B32 : VOP1Inst <"v_ffbl_b32", VOP_I32_I32, AMDGPUffbl_b32>; 305defm V_FFBH_I32 : VOP1Inst <"v_ffbh_i32", VOP_I32_I32, AMDGPUffbh_i32>; 306 307let SchedRW = [WriteDoubleAdd] in { 308defm V_FREXP_EXP_I32_F64 : VOP1Inst <"v_frexp_exp_i32_f64", VOP_I32_F64_SPECIAL_OMOD, int_amdgcn_frexp_exp>; 309defm V_FREXP_MANT_F64 : VOP1Inst <"v_frexp_mant_f64", VOP_F64_F64, int_amdgcn_frexp_mant>; 310let FPDPRounding = 1 in { 311defm V_FRACT_F64 : VOP1Inst <"v_fract_f64", VOP_F64_F64, AMDGPUfract>; 312} // End FPDPRounding = 1 313} // End SchedRW = [WriteDoubleAdd] 314 315defm V_FREXP_EXP_I32_F32 : VOP1Inst <"v_frexp_exp_i32_f32", VOP_I32_F32, int_amdgcn_frexp_exp>; 316defm V_FREXP_MANT_F32 : VOP1Inst <"v_frexp_mant_f32", VOP_F32_F32, int_amdgcn_frexp_mant>; 317} // End isReMaterializable = 1 318 319let VOPAsmPrefer32Bit = 1 in { 320defm V_CLREXCP : VOP1Inst <"v_clrexcp", VOP_NO_EXT<VOP_NONE>>; 321} 322 323// Restrict src0 to be VGPR 324def VOP_MOVRELS : VOPProfile<[i32, i32, untyped, untyped]> { 325 let Src0RC32 = VRegSrc_32; 326 let Src0RC64 = VRegSrc_32; 327} 328 329// Special case because there are no true output operands. Hack vdst 330// to be a src operand. The custom inserter must add a tied implicit 331// def and use of the super register since there seems to be no way to 332// add an implicit def of a virtual register in tablegen. 333class VOP_MOVREL<RegisterOperand Src1RC> : VOPProfile<[untyped, i32, untyped, untyped]> { 334 let Src0RC32 = VOPDstOperand<VGPR_32>; 335 let Src0RC64 = VOPDstOperand<VGPR_32>; 336 337 let Outs = (outs); 338 let Ins32 = (ins Src0RC32:$vdst, Src1RC:$src0); 339 let Ins64 = (ins Src0RC64:$vdst, Src1RC:$src0); 340 let Asm32 = getAsm32<1, 1>.ret; 341 let Asm64 = getAsm64<1, 1, 0, 0, 1>.ret; 342 343 let OutsSDWA = (outs Src0RC32:$vdst); 344 let InsSDWA = (ins Src0ModSDWA:$src0_modifiers, Src0SDWA:$src0, 345 clampmod:$clamp, dst_sel:$dst_sel, dst_unused:$dst_unused, 346 src0_sel:$src0_sel); 347 let AsmSDWA9 = getAsmSDWA9<1, 0, 1>.ret; 348 349 let OutsDPP = (outs Src0RC32:$vdst); 350 let InsDPP16 = (ins Src0RC32:$old, Src0RC32:$src0, 351 dpp_ctrl:$dpp_ctrl, row_mask:$row_mask, 352 bank_mask:$bank_mask, bound_ctrl:$bound_ctrl, FI:$fi); 353 let AsmDPP16 = getAsmDPP16<1, 1, 0>.ret; 354 355 let OutsDPP8 = (outs Src0RC32:$vdst); 356 let InsDPP8 = (ins Src0RC32:$old, Src0RC32:$src0, dpp8:$dpp8, FI:$fi); 357 let AsmDPP8 = getAsmDPP8<1, 1, 0>.ret; 358 359 let HasDst = 0; 360 let EmitDst = 1; // force vdst emission 361} 362 363def VOP_MOVRELD : VOP_MOVREL<VSrc_b32>; 364def VOP_MOVRELSD : VOP_MOVREL<VRegSrc_32>; 365 366let SubtargetPredicate = HasMovrel, Uses = [M0, EXEC] in { 367 // v_movreld_b32 is a special case because the destination output 368 // register is really a source. It isn't actually read (but may be 369 // written), and is only to provide the base register to start 370 // indexing from. Tablegen seems to not let you define an implicit 371 // virtual register output for the super register being written into, 372 // so this must have an implicit def of the register added to it. 373defm V_MOVRELD_B32 : VOP1Inst <"v_movreld_b32", VOP_MOVRELD>; 374defm V_MOVRELS_B32 : VOP1Inst <"v_movrels_b32", VOP_MOVRELS>; 375defm V_MOVRELSD_B32 : VOP1Inst <"v_movrelsd_b32", VOP_MOVRELSD>; 376} // End Uses = [M0, EXEC] 377 378let isReMaterializable = 1 in { 379let SubtargetPredicate = isGFX6GFX7 in { 380 let TRANS = 1, SchedRW = [WriteTrans32] in { 381 defm V_LOG_CLAMP_F32 : 382 VOP1Inst<"v_log_clamp_f32", VOP_F32_F32, int_amdgcn_log_clamp>; 383 defm V_RCP_CLAMP_F32 : 384 VOP1Inst<"v_rcp_clamp_f32", VOP_F32_F32>; 385 defm V_RCP_LEGACY_F32 : 386 VOP1Inst<"v_rcp_legacy_f32", VOP_F32_F32, AMDGPUrcp_legacy>; 387 defm V_RSQ_CLAMP_F32 : 388 VOP1Inst<"v_rsq_clamp_f32", VOP_F32_F32, AMDGPUrsq_clamp>; 389 defm V_RSQ_LEGACY_F32 : 390 VOP1Inst<"v_rsq_legacy_f32", VOP_F32_F32, int_amdgcn_rsq_legacy>; 391 } // End TRANS = 1, SchedRW = [WriteTrans32] 392 393 let SchedRW = [WriteTrans64] in { 394 defm V_RCP_CLAMP_F64 : 395 VOP1Inst<"v_rcp_clamp_f64", VOP_F64_F64>; 396 defm V_RSQ_CLAMP_F64 : 397 VOP1Inst<"v_rsq_clamp_f64", VOP_F64_F64, AMDGPUrsq_clamp>; 398 } // End SchedRW = [WriteTrans64] 399} // End SubtargetPredicate = isGFX6GFX7 400 401let SubtargetPredicate = isGFX7GFX8GFX9 in { 402 let TRANS = 1, SchedRW = [WriteTrans32] in { 403 defm V_LOG_LEGACY_F32 : VOP1Inst<"v_log_legacy_f32", VOP_F32_F32>; 404 defm V_EXP_LEGACY_F32 : VOP1Inst<"v_exp_legacy_f32", VOP_F32_F32>; 405 } // End TRANS = 1, SchedRW = [WriteTrans32] 406} // End SubtargetPredicate = isGFX7GFX8GFX9 407 408let SubtargetPredicate = isGFX7Plus in { 409 let SchedRW = [WriteDoubleAdd] in { 410 defm V_TRUNC_F64 : VOP1Inst<"v_trunc_f64", VOP_F64_F64, ftrunc>; 411 defm V_CEIL_F64 : VOP1Inst<"v_ceil_f64", VOP_F64_F64, fceil>; 412 defm V_RNDNE_F64 : VOP1Inst<"v_rndne_f64", VOP_F64_F64, frint>; 413 defm V_FLOOR_F64 : VOP1Inst<"v_floor_f64", VOP_F64_F64, ffloor>; 414 } // End SchedRW = [WriteDoubleAdd] 415} // End SubtargetPredicate = isGFX7Plus 416} // End isReMaterializable = 1 417 418let SubtargetPredicate = Has16BitInsts in { 419 420let FPDPRounding = 1 in { 421defm V_CVT_F16_U16 : VOP1Inst <"v_cvt_f16_u16", VOP1_F16_I16, uint_to_fp>; 422defm V_CVT_F16_I16 : VOP1Inst <"v_cvt_f16_i16", VOP1_F16_I16, sint_to_fp>; 423} // End FPDPRounding = 1 424// OMod clears exceptions when set in these two instructions 425defm V_CVT_U16_F16 : VOP1Inst <"v_cvt_u16_f16", VOP_I16_F16_SPECIAL_OMOD, fp_to_uint>; 426defm V_CVT_I16_F16 : VOP1Inst <"v_cvt_i16_f16", VOP_I16_F16_SPECIAL_OMOD, fp_to_sint>; 427let TRANS = 1, SchedRW = [WriteTrans32] in { 428defm V_RCP_F16 : VOP1Inst <"v_rcp_f16", VOP_F16_F16, AMDGPUrcp>; 429defm V_SQRT_F16 : VOP1Inst <"v_sqrt_f16", VOP_F16_F16, any_amdgcn_sqrt>; 430defm V_RSQ_F16 : VOP1Inst <"v_rsq_f16", VOP_F16_F16, AMDGPUrsq>; 431defm V_LOG_F16 : VOP1Inst <"v_log_f16", VOP_F16_F16, flog2>; 432defm V_EXP_F16 : VOP1Inst <"v_exp_f16", VOP_F16_F16, fexp2>; 433defm V_SIN_F16 : VOP1Inst <"v_sin_f16", VOP_F16_F16, AMDGPUsin>; 434defm V_COS_F16 : VOP1Inst <"v_cos_f16", VOP_F16_F16, AMDGPUcos>; 435} // End TRANS = 1, SchedRW = [WriteTrans32] 436defm V_FREXP_MANT_F16 : VOP1Inst <"v_frexp_mant_f16", VOP_F16_F16, int_amdgcn_frexp_mant>; 437defm V_FREXP_EXP_I16_F16 : VOP1Inst <"v_frexp_exp_i16_f16", VOP_I16_F16_SPECIAL_OMOD, int_amdgcn_frexp_exp>; 438defm V_FLOOR_F16 : VOP1Inst <"v_floor_f16", VOP_F16_F16, ffloor>; 439defm V_CEIL_F16 : VOP1Inst <"v_ceil_f16", VOP_F16_F16, fceil>; 440defm V_TRUNC_F16 : VOP1Inst <"v_trunc_f16", VOP_F16_F16, ftrunc>; 441defm V_RNDNE_F16 : VOP1Inst <"v_rndne_f16", VOP_F16_F16, frint>; 442let FPDPRounding = 1 in { 443defm V_FRACT_F16 : VOP1Inst <"v_fract_f16", VOP_F16_F16, AMDGPUfract>; 444} // End FPDPRounding = 1 445 446} 447 448let OtherPredicates = [Has16BitInsts] in { 449 450def : GCNPat< 451 (f32 (f16_to_fp i16:$src)), 452 (V_CVT_F32_F16_e32 $src) 453>; 454 455def : GCNPat< 456 (i16 (AMDGPUfp_to_f16 f32:$src)), 457 (V_CVT_F16_F32_e32 $src) 458>; 459 460} 461 462def VOP_SWAP_I32 : VOPProfile<[i32, i32, i32, untyped]> { 463 let Outs32 = (outs VGPR_32:$vdst, VGPR_32:$vdst1); 464 let Ins32 = (ins VGPR_32:$src0, VGPR_32:$src1); 465 let Outs64 = Outs32; 466 let Asm32 = " $vdst, $src0"; 467 let Asm64 = ""; 468 let Ins64 = (ins); 469} 470 471let SubtargetPredicate = isGFX9Plus in { 472 def V_SWAP_B32 : VOP1_Pseudo<"v_swap_b32", VOP_SWAP_I32, [], 1> { 473 let Constraints = "$vdst = $src1, $vdst1 = $src0"; 474 let DisableEncoding = "$vdst1,$src1"; 475 let SchedRW = [Write64Bit, Write64Bit]; 476 } 477 478 let isReMaterializable = 1 in 479 defm V_SAT_PK_U8_I16 : VOP1Inst<"v_sat_pk_u8_i16", VOP_I32_I32>; 480 481 let mayRaiseFPException = 0 in { 482 defm V_CVT_NORM_I16_F16 : VOP1Inst<"v_cvt_norm_i16_f16", VOP_I16_F16_SPECIAL_OMOD>; 483 defm V_CVT_NORM_U16_F16 : VOP1Inst<"v_cvt_norm_u16_f16", VOP_I16_F16_SPECIAL_OMOD>; 484 } // End mayRaiseFPException = 0 485} // End SubtargetPredicate = isGFX9Plus 486 487let SubtargetPredicate = isGFX9Only in { 488 defm V_SCREEN_PARTITION_4SE_B32 : VOP1Inst <"v_screen_partition_4se_b32", VOP_I32_I32>; 489} // End SubtargetPredicate = isGFX9Only 490 491let SubtargetPredicate = isGFX10Plus in { 492 defm V_PIPEFLUSH : VOP1Inst<"v_pipeflush", VOP_NO_EXT<VOP_NONE>>; 493 494 let Uses = [M0] in { 495 defm V_MOVRELSD_2_B32 : 496 VOP1Inst<"v_movrelsd_2_b32", VOP_MOVRELSD>; 497 498 def V_SWAPREL_B32 : VOP1_Pseudo<"v_swaprel_b32", VOP_SWAP_I32, [], 1> { 499 let Constraints = "$vdst = $src1, $vdst1 = $src0"; 500 let DisableEncoding = "$vdst1,$src1"; 501 let SchedRW = [Write64Bit, Write64Bit]; 502 } 503 } // End Uses = [M0] 504} // End SubtargetPredicate = isGFX10Plus 505 506def VOPProfileAccMov : VOP_NO_EXT<VOP_I32_I32> { 507 let DstRC = RegisterOperand<AGPR_32>; 508 let Src0RC32 = RegisterOperand<AGPR_32>; 509 let Asm32 = " $vdst, $src0"; 510} 511 512def V_ACCVGPR_MOV_B32 : VOP1_Pseudo<"v_accvgpr_mov_b32", VOPProfileAccMov, [], 1> { 513 let SubtargetPredicate = isGFX90APlus; 514 let isReMaterializable = 1; 515 let isAsCheapAsAMove = 1; 516} 517 518let SubtargetPredicate = isGFX11Plus in { 519 // Restrict src0 to be VGPR 520 def V_PERMLANE64_B32 : VOP1_Pseudo<"v_permlane64_b32", VOP_MOVRELS, 521 getVOP1Pat64<int_amdgcn_permlane64, 522 VOP_MOVRELS>.ret, 523 /*VOP1Only=*/ 1>; 524 defm V_NOT_B16 : VOP1Inst<"v_not_b16", VOP_I16_I16>; 525 defm V_CVT_I32_I16 : VOP1Inst<"v_cvt_i32_i16", VOP_I32_I16>; 526 defm V_CVT_U32_U16 : VOP1Inst<"v_cvt_u32_u16", VOP_I16_I16>; 527} // End SubtargetPredicate = isGFX11Plus 528 529//===----------------------------------------------------------------------===// 530// Target-specific instruction encodings. 531//===----------------------------------------------------------------------===// 532 533class VOP1_DPP<bits<8> op, VOP1_DPP_Pseudo ps, VOPProfile p = ps.Pfl, bit isDPP16 = 0> : 534 VOP_DPP<ps.OpName, p, isDPP16> { 535 let hasSideEffects = ps.hasSideEffects; 536 let Defs = ps.Defs; 537 let SchedRW = ps.SchedRW; 538 let Uses = ps.Uses; 539 let TRANS = ps.TRANS; 540 541 bits<8> vdst; 542 let Inst{8-0} = 0xfa; 543 let Inst{16-9} = op; 544 let Inst{24-17} = !if(p.EmitDst, vdst{7-0}, 0); 545 let Inst{31-25} = 0x3f; 546} 547 548class VOP1_DPP16<bits<8> op, VOP1_DPP_Pseudo ps, int subtarget, VOPProfile p = ps.Pfl> : 549 VOP1_DPP<op, ps, p, 1>, 550 SIMCInstr <ps.PseudoInstr, subtarget> { 551 let AssemblerPredicate = HasDPP16; 552 let SubtargetPredicate = HasDPP16; 553} 554 555class VOP1_DPP8<bits<8> op, VOP1_Pseudo ps, VOPProfile p = ps.Pfl> : 556 VOP_DPP8<ps.OpName, p> { 557 let hasSideEffects = ps.hasSideEffects; 558 let Defs = ps.Defs; 559 let SchedRW = ps.SchedRW; 560 let Uses = ps.Uses; 561 562 bits<8> vdst; 563 let Inst{8-0} = fi; 564 let Inst{16-9} = op; 565 let Inst{24-17} = !if(p.EmitDst, vdst{7-0}, 0); 566 let Inst{31-25} = 0x3f; 567} 568 569//===----------------------------------------------------------------------===// 570// GFX11. 571//===----------------------------------------------------------------------===// 572 573let AssemblerPredicate = isGFX11Only, DecoderNamespace = "GFX11" in { 574 multiclass VOP1Only_Real_gfx11<bits<9> op> { 575 let IsSingle = 1 in 576 def _gfx11 : 577 VOP1_Real<!cast<VOP1_Pseudo>(NAME), SIEncodingFamily.GFX11>, 578 VOP1e<op{7-0}, !cast<VOP1_Pseudo>(NAME).Pfl>; 579 } 580 multiclass VOP1_Real_e32_gfx11<bits<9> op, string opName = NAME> { 581 defvar ps = !cast<VOP1_Pseudo>(opName#"_e32"); 582 def _e32_gfx11 : 583 VOP1_Real<ps, SIEncodingFamily.GFX11>, 584 VOP1e<op{7-0}, ps.Pfl>; 585 } 586 multiclass VOP1_Real_e32_with_name_gfx11<bits<9> op, string opName, 587 string asmName> { 588 defvar ps = !cast<VOP1_Pseudo>(opName#"_e32"); 589 let AsmString = asmName # ps.AsmOperands in { 590 defm NAME : VOP1_Real_e32_gfx11<op, opName>, 591 MnemonicAlias<ps.Mnemonic, asmName>, Requires<[isGFX11Plus]>; 592 } 593 } 594 multiclass VOP1_Real_e64_gfx11<bits<9> op> { 595 def _e64_gfx11 : 596 VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.GFX11>, 597 VOP3e_gfx11<{0, 1, 1, op{6-0}}, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl>; 598 } 599 multiclass VOP1_Real_dpp_gfx11<bits<9> op, string opName = NAME> { 600 defvar ps = !cast<VOP1_Pseudo>(opName#"_e32"); 601 def _dpp_gfx11 : VOP1_DPP16<op{7-0}, !cast<VOP1_DPP_Pseudo>(opName#"_dpp"), SIEncodingFamily.GFX11> { 602 let DecoderNamespace = "DPPGFX11"; 603 } 604 } 605 multiclass VOP1_Real_dpp_with_name_gfx11<bits<9> op, string opName, 606 string asmName> { 607 defvar ps = !cast<VOP1_Pseudo>(opName#"_e32"); 608 let AsmString = asmName # ps.Pfl.AsmDPP16, DecoderNamespace = "DPPGFX11" in { 609 defm NAME : VOP1_Real_dpp_gfx11<op, opName>, 610 MnemonicAlias<ps.Mnemonic, asmName>, Requires<[isGFX11Plus]>; 611 } 612 } 613 multiclass VOP1_Real_dpp8_gfx11<bits<9> op, string opName = NAME> { 614 defvar ps = !cast<VOP1_Pseudo>(opName#"_e32"); 615 def _dpp8_gfx11 : VOP1_DPP8<op{7-0}, ps> { 616 let DecoderNamespace = "DPP8GFX11"; 617 } 618 } 619 multiclass VOP1_Real_dpp8_with_name_gfx11<bits<9> op, string opName, 620 string asmName> { 621 defvar ps = !cast<VOP1_Pseudo>(opName#"_e32"); 622 let AsmString = asmName # ps.Pfl.AsmDPP8, DecoderNamespace = "DPP8GFX11" in { 623 defm NAME : VOP1_Real_dpp8_gfx11<op, opName>, 624 MnemonicAlias<ps.Mnemonic, asmName>, Requires<[isGFX11Plus]>; 625 } 626 } 627} // End AssemblerPredicate = isGFX11Only, DecoderNamespace = "GFX11" 628 629multiclass VOP1_Realtriple_e64_gfx11<bits<9> op> { 630 defm NAME : VOP3_Realtriple_gfx11<{0, 1, 1, op{6-0}}, /*isSingle=*/ 0, NAME>; 631} 632multiclass VOP1_Realtriple_e64_with_name_gfx11<bits<9> op, string opName, 633 string asmName> { 634 defm NAME : VOP3_Realtriple_with_name_gfx11<{0, 1, 1, op{6-0}}, opName, 635 asmName>; 636} 637 638multiclass VOP1_Real_FULL_gfx11<bits<9> op> : 639 VOP1_Real_e32_gfx11<op>, VOP1_Realtriple_e64_gfx11<op>, 640 VOP1_Real_dpp_gfx11<op>, VOP1_Real_dpp8_gfx11<op>; 641 642multiclass VOP1_Real_NO_VOP3_with_name_gfx11<bits<9> op, string opName, 643 string asmName> : 644 VOP1_Real_e32_with_name_gfx11<op, opName, asmName>, 645 VOP1_Real_dpp_with_name_gfx11<op, opName, asmName>, 646 VOP1_Real_dpp8_with_name_gfx11<op, opName, asmName>; 647 648multiclass VOP1_Real_FULL_with_name_gfx11<bits<9> op, string opName, 649 string asmName> : 650 VOP1_Real_NO_VOP3_with_name_gfx11<op, opName, asmName>, 651 VOP1_Realtriple_e64_with_name_gfx11<op, opName, asmName>; 652 653multiclass VOP1_Real_NO_DPP_gfx11<bits<9> op> : 654 VOP1_Real_e32_gfx11<op>, VOP1_Real_e64_gfx11<op>; 655 656defm V_CVT_NEAREST_I32_F32 : VOP1_Real_FULL_with_name_gfx11<0x00c, 657 "V_CVT_RPI_I32_F32", "v_cvt_nearest_i32_f32">; 658defm V_CVT_FLOOR_I32_F32 : VOP1_Real_FULL_with_name_gfx11<0x00d, 659 "V_CVT_FLR_I32_F32", "v_cvt_floor_i32_f32">; 660defm V_CLZ_I32_U32 : VOP1_Real_FULL_with_name_gfx11<0x039, 661 "V_FFBH_U32", "v_clz_i32_u32">; 662defm V_CTZ_I32_B32 : VOP1_Real_FULL_with_name_gfx11<0x03a, 663 "V_FFBL_B32", "v_ctz_i32_b32">; 664defm V_CLS_I32 : VOP1_Real_FULL_with_name_gfx11<0x03b, 665 "V_FFBH_I32", "v_cls_i32">; 666defm V_PERMLANE64_B32 : VOP1Only_Real_gfx11<0x067>; 667defm V_NOT_B16 : VOP1_Real_FULL_gfx11<0x069>; 668defm V_CVT_I32_I16 : VOP1_Real_FULL_gfx11<0x06a>; 669defm V_CVT_U32_U16 : VOP1_Real_FULL_gfx11<0x06b>; 670 671//===----------------------------------------------------------------------===// 672// GFX10. 673//===----------------------------------------------------------------------===// 674 675let AssemblerPredicate = isGFX10Only, DecoderNamespace = "GFX10" in { 676 multiclass VOP1Only_Real_gfx10<bits<9> op> { 677 def _gfx10 : 678 VOP1_Real<!cast<VOP1_Pseudo>(NAME), SIEncodingFamily.GFX10>, 679 VOP1e<op{7-0}, !cast<VOP1_Pseudo>(NAME).Pfl>; 680 } 681 multiclass VOP1_Real_e32_gfx10<bits<9> op> { 682 def _e32_gfx10 : 683 VOP1_Real<!cast<VOP1_Pseudo>(NAME#"_e32"), SIEncodingFamily.GFX10>, 684 VOP1e<op{7-0}, !cast<VOP1_Pseudo>(NAME#"_e32").Pfl>; 685 } 686 multiclass VOP1_Real_e64_gfx10<bits<9> op> { 687 def _e64_gfx10 : 688 VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.GFX10>, 689 VOP3e_gfx10<{0, 1, 1, op{6-0}}, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl>; 690 } 691 multiclass VOP1_Real_sdwa_gfx10<bits<9> op> { 692 foreach _ = BoolToList<!cast<VOP1_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA9>.ret in 693 def _sdwa_gfx10 : 694 VOP_SDWA10_Real<!cast<VOP1_SDWA_Pseudo>(NAME#"_sdwa")>, 695 VOP1_SDWA9Ae<op{7-0}, !cast<VOP1_SDWA_Pseudo>(NAME#"_sdwa").Pfl> { 696 let DecoderNamespace = "SDWA10"; 697 } 698 } 699 multiclass VOP1_Real_dpp_gfx10<bits<9> op> { 700 foreach _ = BoolToList<!cast<VOP1_Pseudo>(NAME#"_e32").Pfl.HasExt32BitDPP>.ret in 701 def _dpp_gfx10 : VOP1_DPP16<op{7-0}, !cast<VOP1_DPP_Pseudo>(NAME#"_dpp"), SIEncodingFamily.GFX10> { 702 let DecoderNamespace = "SDWA10"; 703 } 704 } 705 multiclass VOP1_Real_dpp8_gfx10<bits<9> op> { 706 foreach _ = BoolToList<!cast<VOP1_Pseudo>(NAME#"_e32").Pfl.HasExt32BitDPP>.ret in 707 def _dpp8_gfx10 : VOP1_DPP8<op{7-0}, !cast<VOP1_Pseudo>(NAME#"_e32")> { 708 let DecoderNamespace = "DPP8"; 709 } 710 } 711} // End AssemblerPredicate = isGFX10Only, DecoderNamespace = "GFX10" 712 713multiclass VOP1_Real_gfx10<bits<9> op> : 714 VOP1_Real_e32_gfx10<op>, VOP1_Real_e64_gfx10<op>, 715 VOP1_Real_sdwa_gfx10<op>, VOP1_Real_dpp_gfx10<op>, 716 VOP1_Real_dpp8_gfx10<op>; 717 718multiclass VOP1_Real_gfx10_FULL_gfx11<bits<9> op> : 719 VOP1_Real_gfx10<op>, VOP1_Real_FULL_gfx11<op>; 720 721multiclass VOP1_Real_gfx10_NO_DPP_gfx11<bits<9> op> : 722 VOP1_Real_gfx10<op>, VOP1_Real_NO_DPP_gfx11<op>; 723 724multiclass VOP1Only_Real_gfx10_gfx11<bits<9> op> : 725 VOP1Only_Real_gfx10<op>, VOP1Only_Real_gfx11<op>; 726 727defm V_PIPEFLUSH : VOP1_Real_gfx10_NO_DPP_gfx11<0x01b>; 728defm V_MOVRELSD_2_B32 : VOP1_Real_gfx10_FULL_gfx11<0x048>; 729defm V_CVT_F16_U16 : VOP1_Real_gfx10_FULL_gfx11<0x050>; 730defm V_CVT_F16_I16 : VOP1_Real_gfx10_FULL_gfx11<0x051>; 731defm V_CVT_U16_F16 : VOP1_Real_gfx10_FULL_gfx11<0x052>; 732defm V_CVT_I16_F16 : VOP1_Real_gfx10_FULL_gfx11<0x053>; 733defm V_RCP_F16 : VOP1_Real_gfx10_FULL_gfx11<0x054>; 734defm V_SQRT_F16 : VOP1_Real_gfx10_FULL_gfx11<0x055>; 735defm V_RSQ_F16 : VOP1_Real_gfx10_FULL_gfx11<0x056>; 736defm V_LOG_F16 : VOP1_Real_gfx10_FULL_gfx11<0x057>; 737defm V_EXP_F16 : VOP1_Real_gfx10_FULL_gfx11<0x058>; 738defm V_FREXP_MANT_F16 : VOP1_Real_gfx10_FULL_gfx11<0x059>; 739defm V_FREXP_EXP_I16_F16 : VOP1_Real_gfx10_FULL_gfx11<0x05a>; 740defm V_FLOOR_F16 : VOP1_Real_gfx10_FULL_gfx11<0x05b>; 741defm V_CEIL_F16 : VOP1_Real_gfx10_FULL_gfx11<0x05c>; 742defm V_TRUNC_F16 : VOP1_Real_gfx10_FULL_gfx11<0x05d>; 743defm V_RNDNE_F16 : VOP1_Real_gfx10_FULL_gfx11<0x05e>; 744defm V_FRACT_F16 : VOP1_Real_gfx10_FULL_gfx11<0x05f>; 745defm V_SIN_F16 : VOP1_Real_gfx10_FULL_gfx11<0x060>; 746defm V_COS_F16 : VOP1_Real_gfx10_FULL_gfx11<0x061>; 747defm V_SAT_PK_U8_I16 : VOP1_Real_gfx10_FULL_gfx11<0x062>; 748defm V_CVT_NORM_I16_F16 : VOP1_Real_gfx10_FULL_gfx11<0x063>; 749defm V_CVT_NORM_U16_F16 : VOP1_Real_gfx10_FULL_gfx11<0x064>; 750 751defm V_SWAP_B32 : VOP1Only_Real_gfx10_gfx11<0x065>; 752defm V_SWAPREL_B32 : VOP1Only_Real_gfx10_gfx11<0x068>; 753 754//===----------------------------------------------------------------------===// 755// GFX7, GFX10. 756//===----------------------------------------------------------------------===// 757 758let AssemblerPredicate = isGFX7Only, DecoderNamespace = "GFX7" in { 759 multiclass VOP1_Real_e32_gfx7<bits<9> op> { 760 def _e32_gfx7 : 761 VOP1_Real<!cast<VOP1_Pseudo>(NAME#"_e32"), SIEncodingFamily.SI>, 762 VOP1e<op{7-0}, !cast<VOP1_Pseudo>(NAME#"_e32").Pfl>; 763 } 764 multiclass VOP1_Real_e64_gfx7<bits<9> op> { 765 def _e64_gfx7 : 766 VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.SI>, 767 VOP3e_gfx6_gfx7<{1, 1, op{6-0}}, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl>; 768 } 769} // End AssemblerPredicate = isGFX7Only, DecoderNamespace = "GFX7" 770 771multiclass VOP1_Real_gfx7<bits<9> op> : 772 VOP1_Real_e32_gfx7<op>, VOP1_Real_e64_gfx7<op>; 773 774multiclass VOP1_Real_gfx7_gfx10<bits<9> op> : 775 VOP1_Real_gfx7<op>, VOP1_Real_gfx10<op>; 776 777multiclass VOP1_Real_gfx7_gfx10_NO_DPP_gfx11<bits<9> op> : 778 VOP1_Real_gfx7_gfx10<op>, VOP1_Real_NO_DPP_gfx11<op>; 779 780defm V_LOG_LEGACY_F32 : VOP1_Real_gfx7<0x045>; 781defm V_EXP_LEGACY_F32 : VOP1_Real_gfx7<0x046>; 782 783defm V_TRUNC_F64 : VOP1_Real_gfx7_gfx10_NO_DPP_gfx11<0x017>; 784defm V_CEIL_F64 : VOP1_Real_gfx7_gfx10_NO_DPP_gfx11<0x018>; 785defm V_RNDNE_F64 : VOP1_Real_gfx7_gfx10_NO_DPP_gfx11<0x019>; 786defm V_FLOOR_F64 : VOP1_Real_gfx7_gfx10_NO_DPP_gfx11<0x01a>; 787 788//===----------------------------------------------------------------------===// 789// GFX6, GFX7, GFX10, GFX11. 790//===----------------------------------------------------------------------===// 791 792let AssemblerPredicate = isGFX6GFX7, DecoderNamespace = "GFX6GFX7" in { 793 multiclass VOP1_Real_e32_gfx6_gfx7<bits<9> op> { 794 def _e32_gfx6_gfx7 : 795 VOP1_Real<!cast<VOP1_Pseudo>(NAME#"_e32"), SIEncodingFamily.SI>, 796 VOP1e<op{7-0}, !cast<VOP1_Pseudo>(NAME#"_e32").Pfl>; 797 } 798 multiclass VOP1_Real_e64_gfx6_gfx7<bits<9> op> { 799 def _e64_gfx6_gfx7 : 800 VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.SI>, 801 VOP3e_gfx6_gfx7<{1, 1, op{6-0}}, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl>; 802 } 803} // End AssemblerPredicate = isGFX6GFX7, DecoderNamespace = "GFX6GFX7" 804 805multiclass VOP1_Real_gfx6_gfx7<bits<9> op> : 806 VOP1_Real_e32_gfx6_gfx7<op>, VOP1_Real_e64_gfx6_gfx7<op>; 807 808multiclass VOP1_Real_gfx6_gfx7_gfx10<bits<9> op> : 809 VOP1_Real_gfx6_gfx7<op>, VOP1_Real_gfx10<op>; 810 811multiclass VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<bits<9> op> : 812 VOP1_Real_gfx6_gfx7_gfx10<op>, VOP1_Real_FULL_gfx11<op>; 813 814multiclass VOP1_Real_gfx6_gfx7_gfx10_NO_DPP_gfx11<bits<9> op> : 815 VOP1_Real_gfx6_gfx7_gfx10<op>, VOP1_Real_NO_DPP_gfx11<op>; 816 817defm V_LOG_CLAMP_F32 : VOP1_Real_gfx6_gfx7<0x026>; 818defm V_RCP_CLAMP_F32 : VOP1_Real_gfx6_gfx7<0x028>; 819defm V_RCP_LEGACY_F32 : VOP1_Real_gfx6_gfx7<0x029>; 820defm V_RSQ_CLAMP_F32 : VOP1_Real_gfx6_gfx7<0x02c>; 821defm V_RSQ_LEGACY_F32 : VOP1_Real_gfx6_gfx7<0x02d>; 822defm V_RCP_CLAMP_F64 : VOP1_Real_gfx6_gfx7<0x030>; 823defm V_RSQ_CLAMP_F64 : VOP1_Real_gfx6_gfx7<0x032>; 824 825defm V_NOP : VOP1_Real_gfx6_gfx7_gfx10_NO_DPP_gfx11<0x000>; 826defm V_MOV_B32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x001>; 827defm V_CVT_I32_F64 : VOP1_Real_gfx6_gfx7_gfx10_NO_DPP_gfx11<0x003>; 828defm V_CVT_F64_I32 : VOP1_Real_gfx6_gfx7_gfx10_NO_DPP_gfx11<0x004>; 829defm V_CVT_F32_I32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x005>; 830defm V_CVT_F32_U32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x006>; 831defm V_CVT_U32_F32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x007>; 832defm V_CVT_I32_F32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x008>; 833defm V_CVT_F16_F32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x00a>; 834defm V_CVT_F32_F16 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x00b>; 835defm V_CVT_RPI_I32_F32 : VOP1_Real_gfx6_gfx7_gfx10<0x00c>; 836defm V_CVT_FLR_I32_F32 : VOP1_Real_gfx6_gfx7_gfx10<0x00d>; 837defm V_CVT_OFF_F32_I4 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x00e>; 838defm V_CVT_F32_F64 : VOP1_Real_gfx6_gfx7_gfx10_NO_DPP_gfx11<0x00f>; 839defm V_CVT_F64_F32 : VOP1_Real_gfx6_gfx7_gfx10_NO_DPP_gfx11<0x010>; 840defm V_CVT_F32_UBYTE0 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x011>; 841defm V_CVT_F32_UBYTE1 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x012>; 842defm V_CVT_F32_UBYTE2 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x013>; 843defm V_CVT_F32_UBYTE3 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x014>; 844defm V_CVT_U32_F64 : VOP1_Real_gfx6_gfx7_gfx10_NO_DPP_gfx11<0x015>; 845defm V_CVT_F64_U32 : VOP1_Real_gfx6_gfx7_gfx10_NO_DPP_gfx11<0x016>; 846defm V_FRACT_F32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x020>; 847defm V_TRUNC_F32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x021>; 848defm V_CEIL_F32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x022>; 849defm V_RNDNE_F32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x023>; 850defm V_FLOOR_F32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x024>; 851defm V_EXP_F32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x025>; 852defm V_LOG_F32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x027>; 853defm V_RCP_F32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x02a>; 854defm V_RCP_IFLAG_F32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x02b>; 855defm V_RSQ_F32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x02e>; 856defm V_RCP_F64 : VOP1_Real_gfx6_gfx7_gfx10_NO_DPP_gfx11<0x02f>; 857defm V_RSQ_F64 : VOP1_Real_gfx6_gfx7_gfx10_NO_DPP_gfx11<0x031>; 858defm V_SQRT_F32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x033>; 859defm V_SQRT_F64 : VOP1_Real_gfx6_gfx7_gfx10_NO_DPP_gfx11<0x034>; 860defm V_SIN_F32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x035>; 861defm V_COS_F32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x036>; 862defm V_NOT_B32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x037>; 863defm V_BFREV_B32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x038>; 864defm V_FFBH_U32 : VOP1_Real_gfx6_gfx7_gfx10<0x039>; 865defm V_FFBL_B32 : VOP1_Real_gfx6_gfx7_gfx10<0x03a>; 866defm V_FFBH_I32 : VOP1_Real_gfx6_gfx7_gfx10<0x03b>; 867defm V_FREXP_EXP_I32_F64 : VOP1_Real_gfx6_gfx7_gfx10_NO_DPP_gfx11<0x03c>; 868defm V_FREXP_MANT_F64 : VOP1_Real_gfx6_gfx7_gfx10_NO_DPP_gfx11<0x03d>; 869defm V_FRACT_F64 : VOP1_Real_gfx6_gfx7_gfx10_NO_DPP_gfx11<0x03e>; 870defm V_FREXP_EXP_I32_F32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x03f>; 871defm V_FREXP_MANT_F32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x040>; 872defm V_CLREXCP : VOP1_Real_gfx6_gfx7_gfx10<0x041>; 873defm V_MOVRELD_B32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x042>; 874defm V_MOVRELS_B32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x043>; 875defm V_MOVRELSD_B32 : VOP1_Real_gfx6_gfx7_gfx10_FULL_gfx11<0x044>; 876 877//===----------------------------------------------------------------------===// 878// GFX8, GFX9 (VI). 879//===----------------------------------------------------------------------===// 880 881class VOP1_DPPe <bits<8> op, VOP1_DPP_Pseudo ps, VOPProfile P = ps.Pfl> : 882 VOP_DPPe <P> { 883 bits<8> vdst; 884 let Inst{8-0} = 0xfa; // dpp 885 let Inst{16-9} = op; 886 let Inst{24-17} = !if(P.EmitDst, vdst{7-0}, 0); 887 let Inst{31-25} = 0x3f; //encoding 888} 889 890multiclass VOP1Only_Real_vi <bits<10> op> { 891 let AssemblerPredicate = isGFX8GFX9, DecoderNamespace = "GFX8" in { 892 def _vi : 893 VOP1_Real<!cast<VOP1_Pseudo>(NAME), SIEncodingFamily.VI>, 894 VOP1e<op{7-0}, !cast<VOP1_Pseudo>(NAME).Pfl>; 895 } 896} 897 898multiclass VOP1_Real_e32e64_vi <bits<10> op> { 899 let AssemblerPredicate = isGFX8GFX9, DecoderNamespace = "GFX8" in { 900 def _e32_vi : 901 VOP1_Real<!cast<VOP1_Pseudo>(NAME#"_e32"), SIEncodingFamily.VI>, 902 VOP1e<op{7-0}, !cast<VOP1_Pseudo>(NAME#"_e32").Pfl>; 903 def _e64_vi : 904 VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.VI>, 905 VOP3e_vi <!add(0x140, op), !cast<VOP3_Pseudo>(NAME#"_e64").Pfl>; 906 } 907} 908 909multiclass VOP1_Real_vi <bits<10> op> { 910 defm NAME : VOP1_Real_e32e64_vi <op>; 911 912 foreach _ = BoolToList<!cast<VOP1_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA>.ret in 913 def _sdwa_vi : 914 VOP_SDWA_Real <!cast<VOP1_SDWA_Pseudo>(NAME#"_sdwa")>, 915 VOP1_SDWAe <op{7-0}, !cast<VOP1_SDWA_Pseudo>(NAME#"_sdwa").Pfl>; 916 917 foreach _ = BoolToList<!cast<VOP1_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA9>.ret in 918 def _sdwa_gfx9 : 919 VOP_SDWA9_Real <!cast<VOP1_SDWA_Pseudo>(NAME#"_sdwa")>, 920 VOP1_SDWA9Ae <op{7-0}, !cast<VOP1_SDWA_Pseudo>(NAME#"_sdwa").Pfl>; 921 922 foreach _ = BoolToList<!cast<VOP1_Pseudo>(NAME#"_e32").Pfl.HasExtDPP>.ret in 923 def _dpp_vi : 924 VOP_DPP_Real<!cast<VOP1_DPP_Pseudo>(NAME#"_dpp"), SIEncodingFamily.VI>, 925 VOP1_DPPe<op{7-0}, !cast<VOP1_DPP_Pseudo>(NAME#"_dpp")>; 926} 927 928defm V_NOP : VOP1_Real_vi <0x0>; 929defm V_MOV_B32 : VOP1_Real_vi <0x1>; 930defm V_CVT_I32_F64 : VOP1_Real_vi <0x3>; 931defm V_CVT_F64_I32 : VOP1_Real_vi <0x4>; 932defm V_CVT_F32_I32 : VOP1_Real_vi <0x5>; 933defm V_CVT_F32_U32 : VOP1_Real_vi <0x6>; 934defm V_CVT_U32_F32 : VOP1_Real_vi <0x7>; 935defm V_CVT_I32_F32 : VOP1_Real_vi <0x8>; 936defm V_CVT_F16_F32 : VOP1_Real_vi <0xa>; 937defm V_CVT_F32_F16 : VOP1_Real_vi <0xb>; 938defm V_CVT_RPI_I32_F32 : VOP1_Real_vi <0xc>; 939defm V_CVT_FLR_I32_F32 : VOP1_Real_vi <0xd>; 940defm V_CVT_OFF_F32_I4 : VOP1_Real_vi <0xe>; 941defm V_CVT_F32_F64 : VOP1_Real_vi <0xf>; 942defm V_CVT_F64_F32 : VOP1_Real_vi <0x10>; 943defm V_CVT_F32_UBYTE0 : VOP1_Real_vi <0x11>; 944defm V_CVT_F32_UBYTE1 : VOP1_Real_vi <0x12>; 945defm V_CVT_F32_UBYTE2 : VOP1_Real_vi <0x13>; 946defm V_CVT_F32_UBYTE3 : VOP1_Real_vi <0x14>; 947defm V_CVT_U32_F64 : VOP1_Real_vi <0x15>; 948defm V_CVT_F64_U32 : VOP1_Real_vi <0x16>; 949defm V_FRACT_F32 : VOP1_Real_vi <0x1b>; 950defm V_TRUNC_F32 : VOP1_Real_vi <0x1c>; 951defm V_CEIL_F32 : VOP1_Real_vi <0x1d>; 952defm V_RNDNE_F32 : VOP1_Real_vi <0x1e>; 953defm V_FLOOR_F32 : VOP1_Real_vi <0x1f>; 954defm V_EXP_F32 : VOP1_Real_vi <0x20>; 955defm V_LOG_F32 : VOP1_Real_vi <0x21>; 956defm V_RCP_F32 : VOP1_Real_vi <0x22>; 957defm V_RCP_IFLAG_F32 : VOP1_Real_vi <0x23>; 958defm V_RSQ_F32 : VOP1_Real_vi <0x24>; 959defm V_RCP_F64 : VOP1_Real_vi <0x25>; 960defm V_RSQ_F64 : VOP1_Real_vi <0x26>; 961defm V_SQRT_F32 : VOP1_Real_vi <0x27>; 962defm V_SQRT_F64 : VOP1_Real_vi <0x28>; 963defm V_SIN_F32 : VOP1_Real_vi <0x29>; 964defm V_COS_F32 : VOP1_Real_vi <0x2a>; 965defm V_NOT_B32 : VOP1_Real_vi <0x2b>; 966defm V_BFREV_B32 : VOP1_Real_vi <0x2c>; 967defm V_FFBH_U32 : VOP1_Real_vi <0x2d>; 968defm V_FFBL_B32 : VOP1_Real_vi <0x2e>; 969defm V_FFBH_I32 : VOP1_Real_vi <0x2f>; 970defm V_FREXP_EXP_I32_F64 : VOP1_Real_vi <0x30>; 971defm V_FREXP_MANT_F64 : VOP1_Real_vi <0x31>; 972defm V_FRACT_F64 : VOP1_Real_vi <0x32>; 973defm V_FREXP_EXP_I32_F32 : VOP1_Real_vi <0x33>; 974defm V_FREXP_MANT_F32 : VOP1_Real_vi <0x34>; 975defm V_CLREXCP : VOP1_Real_vi <0x35>; 976defm V_MOVRELD_B32 : VOP1_Real_e32e64_vi <0x36>; 977defm V_MOVRELS_B32 : VOP1_Real_e32e64_vi <0x37>; 978defm V_MOVRELSD_B32 : VOP1_Real_e32e64_vi <0x38>; 979defm V_TRUNC_F64 : VOP1_Real_vi <0x17>; 980defm V_CEIL_F64 : VOP1_Real_vi <0x18>; 981defm V_FLOOR_F64 : VOP1_Real_vi <0x1A>; 982defm V_RNDNE_F64 : VOP1_Real_vi <0x19>; 983defm V_LOG_LEGACY_F32 : VOP1_Real_vi <0x4c>; 984defm V_EXP_LEGACY_F32 : VOP1_Real_vi <0x4b>; 985defm V_CVT_F16_U16 : VOP1_Real_vi <0x39>; 986defm V_CVT_F16_I16 : VOP1_Real_vi <0x3a>; 987defm V_CVT_U16_F16 : VOP1_Real_vi <0x3b>; 988defm V_CVT_I16_F16 : VOP1_Real_vi <0x3c>; 989defm V_RCP_F16 : VOP1_Real_vi <0x3d>; 990defm V_SQRT_F16 : VOP1_Real_vi <0x3e>; 991defm V_RSQ_F16 : VOP1_Real_vi <0x3f>; 992defm V_LOG_F16 : VOP1_Real_vi <0x40>; 993defm V_EXP_F16 : VOP1_Real_vi <0x41>; 994defm V_FREXP_MANT_F16 : VOP1_Real_vi <0x42>; 995defm V_FREXP_EXP_I16_F16 : VOP1_Real_vi <0x43>; 996defm V_FLOOR_F16 : VOP1_Real_vi <0x44>; 997defm V_CEIL_F16 : VOP1_Real_vi <0x45>; 998defm V_TRUNC_F16 : VOP1_Real_vi <0x46>; 999defm V_RNDNE_F16 : VOP1_Real_vi <0x47>; 1000defm V_FRACT_F16 : VOP1_Real_vi <0x48>; 1001defm V_SIN_F16 : VOP1_Real_vi <0x49>; 1002defm V_COS_F16 : VOP1_Real_vi <0x4a>; 1003defm V_SWAP_B32 : VOP1Only_Real_vi <0x51>; 1004 1005defm V_SAT_PK_U8_I16 : VOP1_Real_vi<0x4f>; 1006defm V_CVT_NORM_I16_F16 : VOP1_Real_vi<0x4d>; 1007defm V_CVT_NORM_U16_F16 : VOP1_Real_vi<0x4e>; 1008 1009defm V_ACCVGPR_MOV_B32 : VOP1Only_Real_vi<0x52>; 1010 1011let VOP1 = 1, SubtargetPredicate = isGFX8GFX9, Uses = [EXEC, M0] in { 1012 1013// Copy of v_mov_b32 with $vdst as a use operand for use with VGPR 1014// indexing mode. vdst can't be treated as a def for codegen purposes, 1015// and an implicit use and def of the super register should be added. 1016def V_MOV_B32_indirect_write : VPseudoInstSI<(outs), 1017 (ins getVALUDstForVT<i32>.ret:$vdst, getVOPSrc0ForVT<i32>.ret:$src0)>, 1018 PseudoInstExpansion<(V_MOV_B32_e32_vi getVALUDstForVT<i32>.ret:$vdst, 1019 getVOPSrc0ForVT<i32>.ret:$src0)>; 1020 1021// Copy of v_mov_b32 for use with VGPR indexing mode. An implicit use of the 1022// super register should be added. 1023def V_MOV_B32_indirect_read : VPseudoInstSI< 1024 (outs getVALUDstForVT<i32>.ret:$vdst), 1025 (ins getVOPSrc0ForVT<i32>.ret:$src0)>, 1026 PseudoInstExpansion<(V_MOV_B32_e32_vi getVALUDstForVT<i32>.ret:$vdst, 1027 getVOPSrc0ForVT<i32>.ret:$src0)>; 1028 1029} // End VOP1 = 1, SubtargetPredicate = isGFX8GFX9, Uses = [M0] 1030 1031let OtherPredicates = [isGFX8Plus] in { 1032 1033def : GCNPat < 1034 (i32 (int_amdgcn_mov_dpp i32:$src, timm:$dpp_ctrl, timm:$row_mask, 1035 timm:$bank_mask, timm:$bound_ctrl)), 1036 (V_MOV_B32_dpp VGPR_32:$src, VGPR_32:$src, (as_i32timm $dpp_ctrl), 1037 (as_i32timm $row_mask), (as_i32timm $bank_mask), 1038 (as_i1timm $bound_ctrl)) 1039>; 1040 1041def : GCNPat < 1042 (i32 (int_amdgcn_update_dpp i32:$old, i32:$src, timm:$dpp_ctrl, 1043 timm:$row_mask, timm:$bank_mask, 1044 timm:$bound_ctrl)), 1045 (V_MOV_B32_dpp VGPR_32:$old, VGPR_32:$src, (as_i32timm $dpp_ctrl), 1046 (as_i32timm $row_mask), (as_i32timm $bank_mask), 1047 (as_i1timm $bound_ctrl)) 1048>; 1049 1050} // End OtherPredicates = [isGFX8Plus] 1051 1052let OtherPredicates = [isGFX8Plus] in { 1053def : GCNPat< 1054 (i32 (anyext i16:$src)), 1055 (COPY $src) 1056>; 1057 1058def : GCNPat< 1059 (i64 (anyext i16:$src)), 1060 (REG_SEQUENCE VReg_64, 1061 (i32 (COPY $src)), sub0, 1062 (V_MOV_B32_e32 (i32 0)), sub1) 1063>; 1064 1065def : GCNPat< 1066 (i16 (trunc i32:$src)), 1067 (COPY $src) 1068>; 1069 1070def : GCNPat < 1071 (i16 (trunc i64:$src)), 1072 (EXTRACT_SUBREG $src, sub0) 1073>; 1074 1075} // End OtherPredicates = [isGFX8Plus] 1076 1077//===----------------------------------------------------------------------===// 1078// GFX9 1079//===----------------------------------------------------------------------===// 1080 1081multiclass VOP1_Real_gfx9 <bits<10> op> { 1082 let AssemblerPredicate = isGFX9Only, DecoderNamespace = "GFX9" in { 1083 defm NAME : VOP1_Real_e32e64_vi <op>; 1084 } 1085 1086 foreach _ = BoolToList<!cast<VOP1_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA9>.ret in 1087 def _sdwa_gfx9 : 1088 VOP_SDWA9_Real <!cast<VOP1_SDWA_Pseudo>(NAME#"_sdwa")>, 1089 VOP1_SDWA9Ae <op{7-0}, !cast<VOP1_SDWA_Pseudo>(NAME#"_sdwa").Pfl>; 1090 1091 foreach _ = BoolToList<!cast<VOP1_Pseudo>(NAME#"_e32").Pfl.HasExtDPP>.ret in 1092 def _dpp_gfx9 : 1093 VOP_DPP_Real<!cast<VOP1_DPP_Pseudo>(NAME#"_dpp"), SIEncodingFamily.GFX9>, 1094 VOP1_DPPe<op{7-0}, !cast<VOP1_DPP_Pseudo>(NAME#"_dpp")>; 1095 1096} 1097 1098defm V_SCREEN_PARTITION_4SE_B32 : VOP1_Real_gfx9 <0x37>; 1099 1100let AssemblerPredicate = isGFX940Plus, DecoderNamespace = "GFX9" in 1101defm V_MOV_B64 : VOP1_Real_gfx9 <0x38>; 1102 1103//===----------------------------------------------------------------------===// 1104// GFX10 1105//===----------------------------------------------------------------------===// 1106 1107let OtherPredicates = [isGFX10Only] in { 1108def : GCNPat < 1109 (i32 (int_amdgcn_mov_dpp8 i32:$src, timm:$dpp8)), 1110 (V_MOV_B32_dpp8_gfx10 VGPR_32:$src, VGPR_32:$src, 1111 (as_i32timm $dpp8), (i32 DPP8Mode.FI_0)) 1112>; 1113} // End OtherPredicates = [isGFX10Only] 1114