1//===-- VOP1Instructions.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// 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 VOP1 = 1; 52 let VALU = 1; 53 let Uses = [EXEC]; 54 55 let AsmVariantName = AMDGPUAsmVariants.Default; 56} 57 58class VOP1_Real <VOP1_Pseudo ps, int EncodingFamily> : 59 InstSI <ps.OutOperandList, ps.InOperandList, ps.Mnemonic # ps.AsmOperands, []>, 60 SIMCInstr <ps.PseudoInstr, EncodingFamily> { 61 62 let isPseudo = 0; 63 let isCodeGenOnly = 0; 64 65 let Constraints = ps.Constraints; 66 let DisableEncoding = ps.DisableEncoding; 67 68 // copy relevant pseudo op flags 69 let SubtargetPredicate = ps.SubtargetPredicate; 70 let AsmMatchConverter = ps.AsmMatchConverter; 71 let AsmVariantName = ps.AsmVariantName; 72 let Constraints = ps.Constraints; 73 let DisableEncoding = ps.DisableEncoding; 74 let TSFlags = ps.TSFlags; 75 let UseNamedOperandTable = ps.UseNamedOperandTable; 76 let Uses = ps.Uses; 77 let Defs = ps.Defs; 78} 79 80class VOP1_SDWA_Pseudo <string OpName, VOPProfile P, list<dag> pattern=[]> : 81 VOP_SDWA_Pseudo <OpName, P, pattern> { 82 let AsmMatchConverter = "cvtSdwaVOP1"; 83} 84 85class VOP1_DPP_Pseudo <string OpName, VOPProfile P, list<dag> pattern=[]> : 86 VOP_DPP_Pseudo <OpName, P, pattern> { 87} 88 89class getVOP1Pat64 <SDPatternOperator node, VOPProfile P> : LetDummies { 90 list<dag> ret = 91 !if(P.HasModifiers, 92 [(set P.DstVT:$vdst, (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, 93 i32:$src0_modifiers, 94 i1:$clamp, i32:$omod))))], 95 !if(P.HasOMod, 96 [(set P.DstVT:$vdst, (node (P.Src0VT (VOP3OMods P.Src0VT:$src0, 97 i1:$clamp, i32:$omod))))], 98 [(set P.DstVT:$vdst, (node P.Src0VT:$src0))] 99 ) 100 ); 101} 102 103multiclass VOP1Inst <string opName, VOPProfile P, 104 SDPatternOperator node = null_frag> { 105 def _e32 : VOP1_Pseudo <opName, P>; 106 def _e64 : VOP3_Pseudo <opName, P, getVOP1Pat64<node, P>.ret>; 107 108 foreach _ = BoolToList<P.HasExtSDWA>.ret in 109 def _sdwa : VOP1_SDWA_Pseudo <opName, P>; 110 111 foreach _ = BoolToList<P.HasExtDPP>.ret in 112 def _dpp : VOP1_DPP_Pseudo <opName, P>; 113 114 def : MnemonicAlias<opName#"_e32", opName>, LetDummies; 115 def : MnemonicAlias<opName#"_e64", opName>, LetDummies; 116 117 foreach _ = BoolToList<P.HasExtSDWA>.ret in 118 def : MnemonicAlias<opName#"_sdwa", opName>, LetDummies; 119 120 foreach _ = BoolToList<P.HasExtDPP>.ret in 121 def : MnemonicAlias<opName#"_dpp", opName>, LetDummies; 122} 123 124// Special profile for instructions which have clamp 125// and output modifiers (but have no input modifiers) 126class VOPProfileI2F<ValueType dstVt, ValueType srcVt> : 127 VOPProfile<[dstVt, srcVt, untyped, untyped]> { 128 129 let Ins64 = (ins Src0RC64:$src0, clampmod:$clamp, omod:$omod); 130 let Asm64 = "$vdst, $src0$clamp$omod"; 131 132 let HasModifiers = 0; 133 let HasClamp = 1; 134 let HasOMod = 1; 135} 136 137def VOP1_F64_I32 : VOPProfileI2F <f64, i32>; 138def VOP1_F32_I32 : VOPProfileI2F <f32, i32>; 139def VOP1_F16_I16 : VOPProfileI2F <f16, i16>; 140 141//===----------------------------------------------------------------------===// 142// VOP1 Instructions 143//===----------------------------------------------------------------------===// 144 145let VOPAsmPrefer32Bit = 1 in { 146defm V_NOP : VOP1Inst <"v_nop", VOP_NONE>; 147} 148 149let isMoveImm = 1, isReMaterializable = 1, isAsCheapAsAMove = 1 in { 150defm V_MOV_B32 : VOP1Inst <"v_mov_b32", VOP_I32_I32>; 151} // End isMoveImm = 1 152 153// FIXME: Specify SchedRW for READFIRSTLANE_B32 154// TODO: Make profile for this, there is VOP3 encoding also 155def V_READFIRSTLANE_B32 : 156 InstSI <(outs SReg_32:$vdst), 157 (ins VRegOrLds_32:$src0), 158 "v_readfirstlane_b32 $vdst, $src0", 159 [(set i32:$vdst, (int_amdgcn_readfirstlane i32:$src0))]>, 160 Enc32 { 161 162 let isCodeGenOnly = 0; 163 let UseNamedOperandTable = 1; 164 165 let Size = 4; 166 let mayLoad = 0; 167 let mayStore = 0; 168 let hasSideEffects = 0; 169 170 let VOP1 = 1; 171 let VALU = 1; 172 let Uses = [EXEC]; 173 let isConvergent = 1; 174 175 bits<8> vdst; 176 bits<9> src0; 177 178 let Inst{8-0} = src0; 179 let Inst{16-9} = 0x2; 180 let Inst{24-17} = vdst; 181 let Inst{31-25} = 0x3f; //encoding 182} 183 184let SchedRW = [WriteDoubleCvt] in { 185defm V_CVT_I32_F64 : VOP1Inst <"v_cvt_i32_f64", VOP_I32_F64, fp_to_sint>; 186defm V_CVT_F64_I32 : VOP1Inst <"v_cvt_f64_i32", VOP1_F64_I32, sint_to_fp>; 187defm V_CVT_F32_F64 : VOP1Inst <"v_cvt_f32_f64", VOP_F32_F64, fpround>; 188defm V_CVT_F64_F32 : VOP1Inst <"v_cvt_f64_f32", VOP_F64_F32, fpextend>; 189defm V_CVT_U32_F64 : VOP1Inst <"v_cvt_u32_f64", VOP_I32_F64, fp_to_uint>; 190defm V_CVT_F64_U32 : VOP1Inst <"v_cvt_f64_u32", VOP1_F64_I32, uint_to_fp>; 191} // End SchedRW = [WriteDoubleCvt] 192 193let SchedRW = [WriteQuarterRate32] in { 194defm V_CVT_F32_I32 : VOP1Inst <"v_cvt_f32_i32", VOP1_F32_I32, sint_to_fp>; 195defm V_CVT_F32_U32 : VOP1Inst <"v_cvt_f32_u32", VOP1_F32_I32, uint_to_fp>; 196defm V_CVT_U32_F32 : VOP1Inst <"v_cvt_u32_f32", VOP_I32_F32, fp_to_uint>; 197defm V_CVT_I32_F32 : VOP1Inst <"v_cvt_i32_f32", VOP_I32_F32, fp_to_sint>; 198let FPDPRounding = 1 in { 199defm V_CVT_F16_F32 : VOP1Inst <"v_cvt_f16_f32", VOP_F16_F32, fpround>; 200} // End FPDPRounding = 1 201defm V_CVT_F32_F16 : VOP1Inst <"v_cvt_f32_f16", VOP_F32_F16, fpextend>; 202defm V_CVT_RPI_I32_F32 : VOP1Inst <"v_cvt_rpi_i32_f32", VOP_I32_F32, cvt_rpi_i32_f32>; 203defm V_CVT_FLR_I32_F32 : VOP1Inst <"v_cvt_flr_i32_f32", VOP_I32_F32, cvt_flr_i32_f32>; 204defm V_CVT_OFF_F32_I4 : VOP1Inst <"v_cvt_off_f32_i4", VOP1_F32_I32>; 205} // End SchedRW = [WriteQuarterRate32] 206 207defm V_CVT_F32_UBYTE0 : VOP1Inst <"v_cvt_f32_ubyte0", VOP1_F32_I32, AMDGPUcvt_f32_ubyte0>; 208defm V_CVT_F32_UBYTE1 : VOP1Inst <"v_cvt_f32_ubyte1", VOP1_F32_I32, AMDGPUcvt_f32_ubyte1>; 209defm V_CVT_F32_UBYTE2 : VOP1Inst <"v_cvt_f32_ubyte2", VOP1_F32_I32, AMDGPUcvt_f32_ubyte2>; 210defm V_CVT_F32_UBYTE3 : VOP1Inst <"v_cvt_f32_ubyte3", VOP1_F32_I32, AMDGPUcvt_f32_ubyte3>; 211 212defm V_FRACT_F32 : VOP1Inst <"v_fract_f32", VOP_F32_F32, AMDGPUfract>; 213defm V_TRUNC_F32 : VOP1Inst <"v_trunc_f32", VOP_F32_F32, ftrunc>; 214defm V_CEIL_F32 : VOP1Inst <"v_ceil_f32", VOP_F32_F32, fceil>; 215defm V_RNDNE_F32 : VOP1Inst <"v_rndne_f32", VOP_F32_F32, frint>; 216defm V_FLOOR_F32 : VOP1Inst <"v_floor_f32", VOP_F32_F32, ffloor>; 217 218let SchedRW = [WriteQuarterRate32] in { 219defm V_EXP_F32 : VOP1Inst <"v_exp_f32", VOP_F32_F32, fexp2>; 220defm V_LOG_F32 : VOP1Inst <"v_log_f32", VOP_F32_F32, flog2>; 221defm V_RCP_F32 : VOP1Inst <"v_rcp_f32", VOP_F32_F32, AMDGPUrcp>; 222defm V_RCP_IFLAG_F32 : VOP1Inst <"v_rcp_iflag_f32", VOP_F32_F32, AMDGPUrcp_iflag>; 223defm V_RSQ_F32 : VOP1Inst <"v_rsq_f32", VOP_F32_F32, AMDGPUrsq>; 224defm V_SQRT_F32 : VOP1Inst <"v_sqrt_f32", VOP_F32_F32, fsqrt>; 225} // End SchedRW = [WriteQuarterRate32] 226 227let SchedRW = [WriteDouble] in { 228defm V_RCP_F64 : VOP1Inst <"v_rcp_f64", VOP_F64_F64, AMDGPUrcp>; 229defm V_RSQ_F64 : VOP1Inst <"v_rsq_f64", VOP_F64_F64, AMDGPUrsq>; 230} // End SchedRW = [WriteDouble]; 231 232let SchedRW = [WriteDouble] in { 233defm V_SQRT_F64 : VOP1Inst <"v_sqrt_f64", VOP_F64_F64, fsqrt>; 234} // End SchedRW = [WriteDouble] 235 236let SchedRW = [WriteQuarterRate32] in { 237defm V_SIN_F32 : VOP1Inst <"v_sin_f32", VOP_F32_F32, AMDGPUsin>; 238defm V_COS_F32 : VOP1Inst <"v_cos_f32", VOP_F32_F32, AMDGPUcos>; 239} // End SchedRW = [WriteQuarterRate32] 240 241defm V_NOT_B32 : VOP1Inst <"v_not_b32", VOP_I32_I32>; 242defm V_BFREV_B32 : VOP1Inst <"v_bfrev_b32", VOP_I32_I32, bitreverse>; 243defm V_FFBH_U32 : VOP1Inst <"v_ffbh_u32", VOP_I32_I32, AMDGPUffbh_u32>; 244defm V_FFBL_B32 : VOP1Inst <"v_ffbl_b32", VOP_I32_I32>; 245defm V_FFBH_I32 : VOP1Inst <"v_ffbh_i32", VOP_I32_I32, AMDGPUffbh_i32>; 246 247let SchedRW = [WriteDoubleAdd] in { 248defm V_FREXP_EXP_I32_F64 : VOP1Inst <"v_frexp_exp_i32_f64", VOP_I32_F64, int_amdgcn_frexp_exp>; 249defm V_FREXP_MANT_F64 : VOP1Inst <"v_frexp_mant_f64", VOP_F64_F64, int_amdgcn_frexp_mant>; 250let FPDPRounding = 1 in { 251defm V_FRACT_F64 : VOP1Inst <"v_fract_f64", VOP_F64_F64, AMDGPUfract>; 252} // End FPDPRounding = 1 253} // End SchedRW = [WriteDoubleAdd] 254 255defm V_FREXP_EXP_I32_F32 : VOP1Inst <"v_frexp_exp_i32_f32", VOP_I32_F32, int_amdgcn_frexp_exp>; 256defm V_FREXP_MANT_F32 : VOP1Inst <"v_frexp_mant_f32", VOP_F32_F32, int_amdgcn_frexp_mant>; 257 258let VOPAsmPrefer32Bit = 1 in { 259defm V_CLREXCP : VOP1Inst <"v_clrexcp", VOP_NO_EXT<VOP_NONE>>; 260} 261 262// Restrict src0 to be VGPR 263def VOP_I32_VI32_NO_EXT : VOPProfile<[i32, i32, untyped, untyped]> { 264 let Src0RC32 = VRegSrc_32; 265 let Src0RC64 = VRegSrc_32; 266 267 let HasExt = 0; 268 let HasExtDPP = 0; 269 let HasExtSDWA = 0; 270 let HasExtSDWA9 = 0; 271} 272 273// Special case because there are no true output operands. Hack vdst 274// to be a src operand. The custom inserter must add a tied implicit 275// def and use of the super register since there seems to be no way to 276// add an implicit def of a virtual register in tablegen. 277def VOP_MOVRELD : VOPProfile<[untyped, i32, untyped, untyped]> { 278 let Src0RC32 = VOPDstOperand<VGPR_32>; 279 let Src0RC64 = VOPDstOperand<VGPR_32>; 280 281 let Outs = (outs); 282 let Ins32 = (ins Src0RC32:$vdst, VSrc_b32:$src0); 283 let Ins64 = (ins Src0RC64:$vdst, VSrc_b32:$src0); 284 let InsDPP = (ins DstRC:$vdst, DstRC:$old, Src0RC32:$src0, 285 dpp_ctrl:$dpp_ctrl, row_mask:$row_mask, 286 bank_mask:$bank_mask, bound_ctrl:$bound_ctrl); 287 let InsDPP16 = !con(InsDPP, (ins FI:$fi)); 288 289 let InsSDWA = (ins Src0RC32:$vdst, Src0ModSDWA:$src0_modifiers, Src0SDWA:$src0, 290 clampmod:$clamp, omod:$omod, dst_sel:$dst_sel, dst_unused:$dst_unused, 291 src0_sel:$src0_sel); 292 293 let Asm32 = getAsm32<1, 1>.ret; 294 let Asm64 = getAsm64<1, 1, 0, 0, 1>.ret; 295 let AsmDPP = getAsmDPP<1, 1, 0>.ret; 296 let AsmDPP16 = getAsmDPP16<1, 1, 0>.ret; 297 let AsmSDWA = getAsmSDWA<1, 1>.ret; 298 let AsmSDWA9 = getAsmSDWA9<1, 0, 1>.ret; 299 300 let HasExt = 0; 301 let HasExtDPP = 0; 302 let HasExtSDWA = 0; 303 let HasExtSDWA9 = 0; 304 305 let HasDst = 0; 306 let EmitDst = 1; // force vdst emission 307} 308 309let SubtargetPredicate = HasMovrel, Uses = [M0, EXEC] in { 310// v_movreld_b32 is a special case because the destination output 311 // register is really a source. It isn't actually read (but may be 312 // written), and is only to provide the base register to start 313 // indexing from. Tablegen seems to not let you define an implicit 314 // virtual register output for the super register being written into, 315 // so this must have an implicit def of the register added to it. 316defm V_MOVRELD_B32 : VOP1Inst <"v_movreld_b32", VOP_MOVRELD>; 317defm V_MOVRELS_B32 : VOP1Inst <"v_movrels_b32", VOP_I32_VI32_NO_EXT>; 318defm V_MOVRELSD_B32 : VOP1Inst <"v_movrelsd_b32", VOP_NO_EXT<VOP_I32_I32>>; 319} // End Uses = [M0, EXEC] 320 321defm V_MOV_FED_B32 : VOP1Inst <"v_mov_fed_b32", VOP_I32_I32>; 322 323let SubtargetPredicate = isGFX6GFX7 in { 324 let SchedRW = [WriteQuarterRate32] in { 325 defm V_LOG_CLAMP_F32 : 326 VOP1Inst<"v_log_clamp_f32", VOP_F32_F32, int_amdgcn_log_clamp>; 327 defm V_RCP_CLAMP_F32 : 328 VOP1Inst<"v_rcp_clamp_f32", VOP_F32_F32>; 329 defm V_RCP_LEGACY_F32 : 330 VOP1Inst<"v_rcp_legacy_f32", VOP_F32_F32, AMDGPUrcp_legacy>; 331 defm V_RSQ_CLAMP_F32 : 332 VOP1Inst<"v_rsq_clamp_f32", VOP_F32_F32, AMDGPUrsq_clamp>; 333 defm V_RSQ_LEGACY_F32 : 334 VOP1Inst<"v_rsq_legacy_f32", VOP_F32_F32, AMDGPUrsq_legacy>; 335 } // End SchedRW = [WriteQuarterRate32] 336 337 let SchedRW = [WriteDouble] in { 338 defm V_RCP_CLAMP_F64 : 339 VOP1Inst<"v_rcp_clamp_f64", VOP_F64_F64>; 340 defm V_RSQ_CLAMP_F64 : 341 VOP1Inst<"v_rsq_clamp_f64", VOP_F64_F64, AMDGPUrsq_clamp>; 342 } // End SchedRW = [WriteDouble] 343} // End SubtargetPredicate = isGFX6GFX7 344 345let SubtargetPredicate = isGFX7GFX8GFX9 in { 346 let SchedRW = [WriteQuarterRate32] in { 347 defm V_LOG_LEGACY_F32 : VOP1Inst<"v_log_legacy_f32", VOP_F32_F32>; 348 defm V_EXP_LEGACY_F32 : VOP1Inst<"v_exp_legacy_f32", VOP_F32_F32>; 349 } // End SchedRW = [WriteQuarterRate32] 350} // End SubtargetPredicate = isGFX7GFX8GFX9 351 352let SubtargetPredicate = isGFX7Plus in { 353 let SchedRW = [WriteDoubleAdd] in { 354 defm V_TRUNC_F64 : VOP1Inst<"v_trunc_f64", VOP_F64_F64, ftrunc>; 355 defm V_CEIL_F64 : VOP1Inst<"v_ceil_f64", VOP_F64_F64, fceil>; 356 defm V_RNDNE_F64 : VOP1Inst<"v_rndne_f64", VOP_F64_F64, frint>; 357 defm V_FLOOR_F64 : VOP1Inst<"v_floor_f64", VOP_F64_F64, ffloor>; 358 } // End SchedRW = [WriteDoubleAdd] 359} // End SubtargetPredicate = isGFX7Plus 360 361let SubtargetPredicate = Has16BitInsts in { 362 363let FPDPRounding = 1 in { 364defm V_CVT_F16_U16 : VOP1Inst <"v_cvt_f16_u16", VOP1_F16_I16, uint_to_fp>; 365defm V_CVT_F16_I16 : VOP1Inst <"v_cvt_f16_i16", VOP1_F16_I16, sint_to_fp>; 366} // End FPDPRounding = 1 367defm V_CVT_U16_F16 : VOP1Inst <"v_cvt_u16_f16", VOP_I16_F16, fp_to_uint>; 368defm V_CVT_I16_F16 : VOP1Inst <"v_cvt_i16_f16", VOP_I16_F16, fp_to_sint>; 369let SchedRW = [WriteQuarterRate32] in { 370defm V_RCP_F16 : VOP1Inst <"v_rcp_f16", VOP_F16_F16, AMDGPUrcp>; 371defm V_SQRT_F16 : VOP1Inst <"v_sqrt_f16", VOP_F16_F16, fsqrt>; 372defm V_RSQ_F16 : VOP1Inst <"v_rsq_f16", VOP_F16_F16, AMDGPUrsq>; 373defm V_LOG_F16 : VOP1Inst <"v_log_f16", VOP_F16_F16, flog2>; 374defm V_EXP_F16 : VOP1Inst <"v_exp_f16", VOP_F16_F16, fexp2>; 375defm V_SIN_F16 : VOP1Inst <"v_sin_f16", VOP_F16_F16, AMDGPUsin>; 376defm V_COS_F16 : VOP1Inst <"v_cos_f16", VOP_F16_F16, AMDGPUcos>; 377} // End SchedRW = [WriteQuarterRate32] 378defm V_FREXP_MANT_F16 : VOP1Inst <"v_frexp_mant_f16", VOP_F16_F16, int_amdgcn_frexp_mant>; 379defm V_FREXP_EXP_I16_F16 : VOP1Inst <"v_frexp_exp_i16_f16", VOP_I16_F16, int_amdgcn_frexp_exp>; 380defm V_FLOOR_F16 : VOP1Inst <"v_floor_f16", VOP_F16_F16, ffloor>; 381defm V_CEIL_F16 : VOP1Inst <"v_ceil_f16", VOP_F16_F16, fceil>; 382defm V_TRUNC_F16 : VOP1Inst <"v_trunc_f16", VOP_F16_F16, ftrunc>; 383defm V_RNDNE_F16 : VOP1Inst <"v_rndne_f16", VOP_F16_F16, frint>; 384let FPDPRounding = 1 in { 385defm V_FRACT_F16 : VOP1Inst <"v_fract_f16", VOP_F16_F16, AMDGPUfract>; 386} // End FPDPRounding = 1 387 388} 389 390let OtherPredicates = [Has16BitInsts] in { 391 392def : GCNPat< 393 (f32 (f16_to_fp i16:$src)), 394 (V_CVT_F32_F16_e32 $src) 395>; 396 397def : GCNPat< 398 (i16 (AMDGPUfp_to_f16 f32:$src)), 399 (V_CVT_F16_F32_e32 $src) 400>; 401 402} 403 404def VOP_SWAP_I32 : VOPProfile<[i32, i32, i32, untyped]> { 405 let Outs32 = (outs VGPR_32:$vdst, VGPR_32:$vdst1); 406 let Ins32 = (ins VGPR_32:$src0, VGPR_32:$src1); 407 let Outs64 = Outs32; 408 let Asm32 = " $vdst, $src0"; 409 let Asm64 = ""; 410 let Ins64 = (ins); 411} 412 413let SubtargetPredicate = isGFX9Plus in { 414 def V_SWAP_B32 : VOP1_Pseudo<"v_swap_b32", VOP_SWAP_I32, [], 1> { 415 let Constraints = "$vdst = $src1, $vdst1 = $src0"; 416 let DisableEncoding = "$vdst1,$src1"; 417 let SchedRW = [Write64Bit, Write64Bit]; 418 } 419 420 defm V_SAT_PK_U8_I16 : VOP1Inst<"v_sat_pk_u8_i16", VOP_I32_I32>; 421 defm V_CVT_NORM_I16_F16 : VOP1Inst<"v_cvt_norm_i16_f16", VOP_I16_F16>; 422 defm V_CVT_NORM_U16_F16 : VOP1Inst<"v_cvt_norm_u16_f16", VOP_I16_F16>; 423} // End SubtargetPredicate = isGFX9Plus 424 425let SubtargetPredicate = isGFX9Only in { 426 defm V_SCREEN_PARTITION_4SE_B32 : VOP1Inst <"v_screen_partition_4se_b32", VOP_I32_I32>; 427} // End SubtargetPredicate = isGFX9Only 428 429let SubtargetPredicate = isGFX10Plus in { 430 defm V_PIPEFLUSH : VOP1Inst<"v_pipeflush", VOP_NONE>; 431 432 let Uses = [M0] in { 433 // FIXME-GFX10: Should V_MOVRELSD_2_B32 be VOP_NO_EXT? 434 defm V_MOVRELSD_2_B32 : 435 VOP1Inst<"v_movrelsd_2_b32", VOP_NO_EXT<VOP_I32_I32>>; 436 437 def V_SWAPREL_B32 : VOP1_Pseudo<"v_swaprel_b32", VOP_SWAP_I32, [], 1> { 438 let Constraints = "$vdst = $src1, $vdst1 = $src0"; 439 let DisableEncoding = "$vdst1,$src1"; 440 let SchedRW = [Write64Bit, Write64Bit]; 441 } 442 } // End Uses = [M0] 443} // End SubtargetPredicate = isGFX10Plus 444 445//===----------------------------------------------------------------------===// 446// Target-specific instruction encodings. 447//===----------------------------------------------------------------------===// 448 449class VOP1_DPP<bits<8> op, VOP1_DPP_Pseudo ps, VOPProfile p = ps.Pfl, bit isDPP16 = 0> : 450 VOP_DPP<ps.OpName, p, isDPP16> { 451 let hasSideEffects = ps.hasSideEffects; 452 let Defs = ps.Defs; 453 let SchedRW = ps.SchedRW; 454 let Uses = ps.Uses; 455 456 bits<8> vdst; 457 let Inst{8-0} = 0xfa; 458 let Inst{16-9} = op; 459 let Inst{24-17} = !if(p.EmitDst, vdst{7-0}, 0); 460 let Inst{31-25} = 0x3f; 461} 462 463class VOP1_DPP16<bits<8> op, VOP1_DPP_Pseudo ps, VOPProfile p = ps.Pfl> : 464 VOP1_DPP<op, ps, p, 1>, 465 SIMCInstr <ps.PseudoInstr, SIEncodingFamily.GFX10> { 466 let AssemblerPredicate = !if(p.HasExt, HasDPP16, DisableInst); 467 let SubtargetPredicate = HasDPP16; 468} 469 470class VOP1_DPP8<bits<8> op, VOP1_Pseudo ps, VOPProfile p = ps.Pfl> : 471 VOP_DPP8<ps.OpName, p> { 472 let hasSideEffects = ps.hasSideEffects; 473 let Defs = ps.Defs; 474 let SchedRW = ps.SchedRW; 475 let Uses = ps.Uses; 476 477 bits<8> vdst; 478 let Inst{8-0} = fi; 479 let Inst{16-9} = op; 480 let Inst{24-17} = !if(p.EmitDst, vdst{7-0}, 0); 481 let Inst{31-25} = 0x3f; 482 483 let AssemblerPredicate = !if(p.HasExt, HasDPP8, DisableInst); 484 let SubtargetPredicate = HasDPP8; 485} 486 487//===----------------------------------------------------------------------===// 488// GFX10. 489//===----------------------------------------------------------------------===// 490 491let AssemblerPredicate = isGFX10Plus, DecoderNamespace = "GFX10" in { 492 multiclass VOP1Only_Real_gfx10<bits<9> op> { 493 def _gfx10 : 494 VOP1_Real<!cast<VOP1_Pseudo>(NAME), SIEncodingFamily.GFX10>, 495 VOP1e<op{7-0}, !cast<VOP1_Pseudo>(NAME).Pfl>; 496 } 497 multiclass VOP1_Real_e32_gfx10<bits<9> op> { 498 def _e32_gfx10 : 499 VOP1_Real<!cast<VOP1_Pseudo>(NAME#"_e32"), SIEncodingFamily.GFX10>, 500 VOP1e<op{7-0}, !cast<VOP1_Pseudo>(NAME#"_e32").Pfl>; 501 } 502 multiclass VOP1_Real_e64_gfx10<bits<9> op> { 503 def _e64_gfx10 : 504 VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.GFX10>, 505 VOP3e_gfx10<{0, 1, 1, op{6-0}}, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl>; 506 } 507 multiclass VOP1_Real_sdwa_gfx10<bits<9> op> { 508 foreach _ = BoolToList<!cast<VOP1_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA9>.ret in 509 def _sdwa_gfx10 : 510 VOP_SDWA10_Real<!cast<VOP1_SDWA_Pseudo>(NAME#"_sdwa")>, 511 VOP1_SDWA9Ae<op{7-0}, !cast<VOP1_SDWA_Pseudo>(NAME#"_sdwa").Pfl> { 512 let DecoderNamespace = "SDWA10"; 513 } 514 } 515 multiclass VOP1_Real_dpp_gfx10<bits<9> op> { 516 foreach _ = BoolToList<!cast<VOP1_Pseudo>(NAME#"_e32").Pfl.HasExtDPP>.ret in 517 def _dpp_gfx10 : VOP1_DPP16<op{7-0}, !cast<VOP1_DPP_Pseudo>(NAME#"_dpp")> { 518 let DecoderNamespace = "SDWA10"; 519 } 520 } 521 multiclass VOP1_Real_dpp8_gfx10<bits<9> op> { 522 foreach _ = BoolToList<!cast<VOP1_Pseudo>(NAME#"_e32").Pfl.HasExtDPP>.ret in 523 def _dpp8_gfx10 : VOP1_DPP8<op{7-0}, !cast<VOP1_Pseudo>(NAME#"_e32")> { 524 let DecoderNamespace = "DPP8"; 525 } 526 } 527} // End AssemblerPredicate = isGFX10Plus, DecoderNamespace = "GFX10" 528 529multiclass VOP1_Real_gfx10_no_dpp<bits<9> op> : 530 VOP1_Real_e32_gfx10<op>, VOP1_Real_e64_gfx10<op>, 531 VOP1_Real_sdwa_gfx10<op>; 532 533multiclass VOP1_Real_gfx10_no_dpp8<bits<9> op> : 534 VOP1_Real_e32_gfx10<op>, VOP1_Real_e64_gfx10<op>, 535 VOP1_Real_sdwa_gfx10<op>, VOP1_Real_dpp_gfx10<op>; 536 537multiclass VOP1_Real_gfx10<bits<9> op> : 538 VOP1_Real_gfx10_no_dpp8<op>, VOP1_Real_dpp8_gfx10<op>; 539 540defm V_PIPEFLUSH : VOP1_Real_gfx10<0x01b>; 541defm V_MOVRELSD_2_B32 : VOP1_Real_gfx10<0x048>; 542defm V_CVT_F16_U16 : VOP1_Real_gfx10<0x050>; 543defm V_CVT_F16_I16 : VOP1_Real_gfx10<0x051>; 544defm V_CVT_U16_F16 : VOP1_Real_gfx10<0x052>; 545defm V_CVT_I16_F16 : VOP1_Real_gfx10<0x053>; 546defm V_RCP_F16 : VOP1_Real_gfx10<0x054>; 547defm V_SQRT_F16 : VOP1_Real_gfx10<0x055>; 548defm V_RSQ_F16 : VOP1_Real_gfx10<0x056>; 549defm V_LOG_F16 : VOP1_Real_gfx10<0x057>; 550defm V_EXP_F16 : VOP1_Real_gfx10<0x058>; 551defm V_FREXP_MANT_F16 : VOP1_Real_gfx10<0x059>; 552defm V_FREXP_EXP_I16_F16 : VOP1_Real_gfx10<0x05a>; 553defm V_FLOOR_F16 : VOP1_Real_gfx10<0x05b>; 554defm V_CEIL_F16 : VOP1_Real_gfx10<0x05c>; 555defm V_TRUNC_F16 : VOP1_Real_gfx10<0x05d>; 556defm V_RNDNE_F16 : VOP1_Real_gfx10<0x05e>; 557defm V_FRACT_F16 : VOP1_Real_gfx10<0x05f>; 558defm V_SIN_F16 : VOP1_Real_gfx10<0x060>; 559defm V_COS_F16 : VOP1_Real_gfx10<0x061>; 560defm V_SAT_PK_U8_I16 : VOP1_Real_gfx10<0x062>; 561defm V_CVT_NORM_I16_F16 : VOP1_Real_gfx10<0x063>; 562defm V_CVT_NORM_U16_F16 : VOP1_Real_gfx10<0x064>; 563 564defm V_SWAP_B32 : VOP1Only_Real_gfx10<0x065>; 565defm V_SWAPREL_B32 : VOP1Only_Real_gfx10<0x068>; 566 567//===----------------------------------------------------------------------===// 568// GFX7, GFX10. 569//===----------------------------------------------------------------------===// 570 571let AssemblerPredicate = isGFX7Only, DecoderNamespace = "GFX7" in { 572 multiclass VOP1_Real_e32_gfx7<bits<9> op> { 573 def _e32_gfx7 : 574 VOP1_Real<!cast<VOP1_Pseudo>(NAME#"_e32"), SIEncodingFamily.SI>, 575 VOP1e<op{7-0}, !cast<VOP1_Pseudo>(NAME#"_e32").Pfl>; 576 } 577 multiclass VOP1_Real_e64_gfx7<bits<9> op> { 578 def _e64_gfx7 : 579 VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.SI>, 580 VOP3e_gfx6_gfx7<{1, 1, op{6-0}}, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl>; 581 } 582} // End AssemblerPredicate = isGFX7Only, DecoderNamespace = "GFX7" 583 584multiclass VOP1_Real_gfx7<bits<9> op> : 585 VOP1_Real_e32_gfx7<op>, VOP1_Real_e64_gfx7<op>; 586 587multiclass VOP1_Real_gfx7_gfx10<bits<9> op> : 588 VOP1_Real_gfx7<op>, VOP1_Real_gfx10<op>; 589 590defm V_LOG_LEGACY_F32 : VOP1_Real_gfx7<0x045>; 591defm V_EXP_LEGACY_F32 : VOP1_Real_gfx7<0x046>; 592 593defm V_TRUNC_F64 : VOP1_Real_gfx7_gfx10<0x017>; 594defm V_CEIL_F64 : VOP1_Real_gfx7_gfx10<0x018>; 595defm V_RNDNE_F64 : VOP1_Real_gfx7_gfx10<0x019>; 596defm V_FLOOR_F64 : VOP1_Real_gfx7_gfx10<0x01a>; 597 598//===----------------------------------------------------------------------===// 599// GFX6, GFX7, GFX10. 600//===----------------------------------------------------------------------===// 601 602let AssemblerPredicate = isGFX6GFX7, DecoderNamespace = "GFX6GFX7" in { 603 multiclass VOP1_Real_e32_gfx6_gfx7<bits<9> op> { 604 def _e32_gfx6_gfx7 : 605 VOP1_Real<!cast<VOP1_Pseudo>(NAME#"_e32"), SIEncodingFamily.SI>, 606 VOP1e<op{7-0}, !cast<VOP1_Pseudo>(NAME#"_e32").Pfl>; 607 } 608 multiclass VOP1_Real_e64_gfx6_gfx7<bits<9> op> { 609 def _e64_gfx6_gfx7 : 610 VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.SI>, 611 VOP3e_gfx6_gfx7<{1, 1, op{6-0}}, !cast<VOP3_Pseudo>(NAME#"_e64").Pfl>; 612 } 613} // End AssemblerPredicate = isGFX6GFX7, DecoderNamespace = "GFX6GFX7" 614 615multiclass VOP1_Real_gfx6_gfx7<bits<9> op> : 616 VOP1_Real_e32_gfx6_gfx7<op>, VOP1_Real_e64_gfx6_gfx7<op>; 617 618multiclass VOP1_Real_gfx6_gfx7_gfx10<bits<9> op> : 619 VOP1_Real_gfx6_gfx7<op>, VOP1_Real_gfx10<op>; 620 621multiclass VOP1_Real_gfx6_gfx7_gfx10_no_dpp8<bits<9> op> : 622 VOP1_Real_gfx6_gfx7<op>, VOP1_Real_gfx10_no_dpp8<op>; 623 624multiclass VOP1_Real_gfx6_gfx7_gfx10_no_dpp<bits<9> op> : 625 VOP1_Real_gfx6_gfx7<op>, VOP1_Real_gfx10_no_dpp<op>; 626 627defm V_LOG_CLAMP_F32 : VOP1_Real_gfx6_gfx7<0x026>; 628defm V_RCP_CLAMP_F32 : VOP1_Real_gfx6_gfx7<0x028>; 629defm V_RCP_LEGACY_F32 : VOP1_Real_gfx6_gfx7<0x029>; 630defm V_RSQ_CLAMP_F32 : VOP1_Real_gfx6_gfx7<0x02c>; 631defm V_RSQ_LEGACY_F32 : VOP1_Real_gfx6_gfx7<0x02d>; 632defm V_RCP_CLAMP_F64 : VOP1_Real_gfx6_gfx7<0x030>; 633defm V_RSQ_CLAMP_F64 : VOP1_Real_gfx6_gfx7<0x032>; 634 635defm V_NOP : VOP1_Real_gfx6_gfx7_gfx10<0x000>; 636defm V_MOV_B32 : VOP1_Real_gfx6_gfx7_gfx10<0x001>; 637defm V_CVT_I32_F64 : VOP1_Real_gfx6_gfx7_gfx10<0x003>; 638defm V_CVT_F64_I32 : VOP1_Real_gfx6_gfx7_gfx10<0x004>; 639defm V_CVT_F32_I32 : VOP1_Real_gfx6_gfx7_gfx10<0x005>; 640defm V_CVT_F32_U32 : VOP1_Real_gfx6_gfx7_gfx10<0x006>; 641defm V_CVT_U32_F32 : VOP1_Real_gfx6_gfx7_gfx10<0x007>; 642defm V_CVT_I32_F32 : VOP1_Real_gfx6_gfx7_gfx10<0x008>; 643defm V_MOV_FED_B32 : VOP1_Real_gfx6_gfx7_gfx10<0x009>; 644defm V_CVT_F16_F32 : VOP1_Real_gfx6_gfx7_gfx10<0x00a>; 645defm V_CVT_F32_F16 : VOP1_Real_gfx6_gfx7_gfx10<0x00b>; 646defm V_CVT_RPI_I32_F32 : VOP1_Real_gfx6_gfx7_gfx10<0x00c>; 647defm V_CVT_FLR_I32_F32 : VOP1_Real_gfx6_gfx7_gfx10<0x00d>; 648defm V_CVT_OFF_F32_I4 : VOP1_Real_gfx6_gfx7_gfx10<0x00e>; 649defm V_CVT_F32_F64 : VOP1_Real_gfx6_gfx7_gfx10<0x00f>; 650defm V_CVT_F64_F32 : VOP1_Real_gfx6_gfx7_gfx10<0x010>; 651defm V_CVT_F32_UBYTE0 : VOP1_Real_gfx6_gfx7_gfx10<0x011>; 652defm V_CVT_F32_UBYTE1 : VOP1_Real_gfx6_gfx7_gfx10<0x012>; 653defm V_CVT_F32_UBYTE2 : VOP1_Real_gfx6_gfx7_gfx10<0x013>; 654defm V_CVT_F32_UBYTE3 : VOP1_Real_gfx6_gfx7_gfx10<0x014>; 655defm V_CVT_U32_F64 : VOP1_Real_gfx6_gfx7_gfx10<0x015>; 656defm V_CVT_F64_U32 : VOP1_Real_gfx6_gfx7_gfx10<0x016>; 657defm V_FRACT_F32 : VOP1_Real_gfx6_gfx7_gfx10<0x020>; 658defm V_TRUNC_F32 : VOP1_Real_gfx6_gfx7_gfx10<0x021>; 659defm V_CEIL_F32 : VOP1_Real_gfx6_gfx7_gfx10<0x022>; 660defm V_RNDNE_F32 : VOP1_Real_gfx6_gfx7_gfx10<0x023>; 661defm V_FLOOR_F32 : VOP1_Real_gfx6_gfx7_gfx10<0x024>; 662defm V_EXP_F32 : VOP1_Real_gfx6_gfx7_gfx10<0x025>; 663defm V_LOG_F32 : VOP1_Real_gfx6_gfx7_gfx10<0x027>; 664defm V_RCP_F32 : VOP1_Real_gfx6_gfx7_gfx10<0x02a>; 665defm V_RCP_IFLAG_F32 : VOP1_Real_gfx6_gfx7_gfx10<0x02b>; 666defm V_RSQ_F32 : VOP1_Real_gfx6_gfx7_gfx10<0x02e>; 667defm V_RCP_F64 : VOP1_Real_gfx6_gfx7_gfx10<0x02f>; 668defm V_RSQ_F64 : VOP1_Real_gfx6_gfx7_gfx10<0x031>; 669defm V_SQRT_F32 : VOP1_Real_gfx6_gfx7_gfx10<0x033>; 670defm V_SQRT_F64 : VOP1_Real_gfx6_gfx7_gfx10<0x034>; 671defm V_SIN_F32 : VOP1_Real_gfx6_gfx7_gfx10<0x035>; 672defm V_COS_F32 : VOP1_Real_gfx6_gfx7_gfx10<0x036>; 673defm V_NOT_B32 : VOP1_Real_gfx6_gfx7_gfx10<0x037>; 674defm V_BFREV_B32 : VOP1_Real_gfx6_gfx7_gfx10<0x038>; 675defm V_FFBH_U32 : VOP1_Real_gfx6_gfx7_gfx10<0x039>; 676defm V_FFBL_B32 : VOP1_Real_gfx6_gfx7_gfx10<0x03a>; 677defm V_FFBH_I32 : VOP1_Real_gfx6_gfx7_gfx10<0x03b>; 678defm V_FREXP_EXP_I32_F64 : VOP1_Real_gfx6_gfx7_gfx10<0x03c>; 679defm V_FREXP_MANT_F64 : VOP1_Real_gfx6_gfx7_gfx10<0x03d>; 680defm V_FRACT_F64 : VOP1_Real_gfx6_gfx7_gfx10<0x03e>; 681defm V_FREXP_EXP_I32_F32 : VOP1_Real_gfx6_gfx7_gfx10<0x03f>; 682defm V_FREXP_MANT_F32 : VOP1_Real_gfx6_gfx7_gfx10<0x040>; 683defm V_CLREXCP : VOP1_Real_gfx6_gfx7_gfx10<0x041>; 684defm V_MOVRELD_B32 : VOP1_Real_gfx6_gfx7_gfx10_no_dpp<0x042>; 685defm V_MOVRELS_B32 : VOP1_Real_gfx6_gfx7_gfx10_no_dpp8<0x043>; 686defm V_MOVRELSD_B32 : VOP1_Real_gfx6_gfx7_gfx10_no_dpp8<0x044>; 687 688//===----------------------------------------------------------------------===// 689// GFX8, GFX9 (VI). 690//===----------------------------------------------------------------------===// 691 692class VOP1_DPPe <bits<8> op, VOP1_DPP_Pseudo ps, VOPProfile P = ps.Pfl> : 693 VOP_DPPe <P> { 694 bits<8> vdst; 695 let Inst{8-0} = 0xfa; // dpp 696 let Inst{16-9} = op; 697 let Inst{24-17} = !if(P.EmitDst, vdst{7-0}, 0); 698 let Inst{31-25} = 0x3f; //encoding 699} 700 701multiclass VOP1Only_Real_vi <bits<10> op> { 702 let AssemblerPredicate = isGFX8GFX9, DecoderNamespace = "GFX8" in { 703 def _vi : 704 VOP1_Real<!cast<VOP1_Pseudo>(NAME), SIEncodingFamily.VI>, 705 VOP1e<op{7-0}, !cast<VOP1_Pseudo>(NAME).Pfl>; 706 } 707} 708 709multiclass VOP1_Real_e32e64_vi <bits<10> op> { 710 let AssemblerPredicate = isGFX8GFX9, DecoderNamespace = "GFX8" in { 711 def _e32_vi : 712 VOP1_Real<!cast<VOP1_Pseudo>(NAME#"_e32"), SIEncodingFamily.VI>, 713 VOP1e<op{7-0}, !cast<VOP1_Pseudo>(NAME#"_e32").Pfl>; 714 def _e64_vi : 715 VOP3_Real<!cast<VOP3_Pseudo>(NAME#"_e64"), SIEncodingFamily.VI>, 716 VOP3e_vi <!add(0x140, op), !cast<VOP3_Pseudo>(NAME#"_e64").Pfl>; 717 } 718} 719 720multiclass VOP1_Real_vi <bits<10> op> { 721 defm NAME : VOP1_Real_e32e64_vi <op>; 722 723 foreach _ = BoolToList<!cast<VOP1_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA>.ret in 724 def _sdwa_vi : 725 VOP_SDWA_Real <!cast<VOP1_SDWA_Pseudo>(NAME#"_sdwa")>, 726 VOP1_SDWAe <op{7-0}, !cast<VOP1_SDWA_Pseudo>(NAME#"_sdwa").Pfl>; 727 728 foreach _ = BoolToList<!cast<VOP1_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA9>.ret in 729 def _sdwa_gfx9 : 730 VOP_SDWA9_Real <!cast<VOP1_SDWA_Pseudo>(NAME#"_sdwa")>, 731 VOP1_SDWA9Ae <op{7-0}, !cast<VOP1_SDWA_Pseudo>(NAME#"_sdwa").Pfl>; 732 733 foreach _ = BoolToList<!cast<VOP1_Pseudo>(NAME#"_e32").Pfl.HasExtDPP>.ret in 734 def _dpp_vi : 735 VOP_DPP_Real<!cast<VOP1_DPP_Pseudo>(NAME#"_dpp"), SIEncodingFamily.VI>, 736 VOP1_DPPe<op{7-0}, !cast<VOP1_DPP_Pseudo>(NAME#"_dpp")>; 737} 738 739defm V_NOP : VOP1_Real_vi <0x0>; 740defm V_MOV_B32 : VOP1_Real_vi <0x1>; 741defm V_CVT_I32_F64 : VOP1_Real_vi <0x3>; 742defm V_CVT_F64_I32 : VOP1_Real_vi <0x4>; 743defm V_CVT_F32_I32 : VOP1_Real_vi <0x5>; 744defm V_CVT_F32_U32 : VOP1_Real_vi <0x6>; 745defm V_CVT_U32_F32 : VOP1_Real_vi <0x7>; 746defm V_CVT_I32_F32 : VOP1_Real_vi <0x8>; 747defm V_MOV_FED_B32 : VOP1_Real_vi <0x9>; 748defm V_CVT_F16_F32 : VOP1_Real_vi <0xa>; 749defm V_CVT_F32_F16 : VOP1_Real_vi <0xb>; 750defm V_CVT_RPI_I32_F32 : VOP1_Real_vi <0xc>; 751defm V_CVT_FLR_I32_F32 : VOP1_Real_vi <0xd>; 752defm V_CVT_OFF_F32_I4 : VOP1_Real_vi <0xe>; 753defm V_CVT_F32_F64 : VOP1_Real_vi <0xf>; 754defm V_CVT_F64_F32 : VOP1_Real_vi <0x10>; 755defm V_CVT_F32_UBYTE0 : VOP1_Real_vi <0x11>; 756defm V_CVT_F32_UBYTE1 : VOP1_Real_vi <0x12>; 757defm V_CVT_F32_UBYTE2 : VOP1_Real_vi <0x13>; 758defm V_CVT_F32_UBYTE3 : VOP1_Real_vi <0x14>; 759defm V_CVT_U32_F64 : VOP1_Real_vi <0x15>; 760defm V_CVT_F64_U32 : VOP1_Real_vi <0x16>; 761defm V_FRACT_F32 : VOP1_Real_vi <0x1b>; 762defm V_TRUNC_F32 : VOP1_Real_vi <0x1c>; 763defm V_CEIL_F32 : VOP1_Real_vi <0x1d>; 764defm V_RNDNE_F32 : VOP1_Real_vi <0x1e>; 765defm V_FLOOR_F32 : VOP1_Real_vi <0x1f>; 766defm V_EXP_F32 : VOP1_Real_vi <0x20>; 767defm V_LOG_F32 : VOP1_Real_vi <0x21>; 768defm V_RCP_F32 : VOP1_Real_vi <0x22>; 769defm V_RCP_IFLAG_F32 : VOP1_Real_vi <0x23>; 770defm V_RSQ_F32 : VOP1_Real_vi <0x24>; 771defm V_RCP_F64 : VOP1_Real_vi <0x25>; 772defm V_RSQ_F64 : VOP1_Real_vi <0x26>; 773defm V_SQRT_F32 : VOP1_Real_vi <0x27>; 774defm V_SQRT_F64 : VOP1_Real_vi <0x28>; 775defm V_SIN_F32 : VOP1_Real_vi <0x29>; 776defm V_COS_F32 : VOP1_Real_vi <0x2a>; 777defm V_NOT_B32 : VOP1_Real_vi <0x2b>; 778defm V_BFREV_B32 : VOP1_Real_vi <0x2c>; 779defm V_FFBH_U32 : VOP1_Real_vi <0x2d>; 780defm V_FFBL_B32 : VOP1_Real_vi <0x2e>; 781defm V_FFBH_I32 : VOP1_Real_vi <0x2f>; 782defm V_FREXP_EXP_I32_F64 : VOP1_Real_vi <0x30>; 783defm V_FREXP_MANT_F64 : VOP1_Real_vi <0x31>; 784defm V_FRACT_F64 : VOP1_Real_vi <0x32>; 785defm V_FREXP_EXP_I32_F32 : VOP1_Real_vi <0x33>; 786defm V_FREXP_MANT_F32 : VOP1_Real_vi <0x34>; 787defm V_CLREXCP : VOP1_Real_vi <0x35>; 788defm V_MOVRELD_B32 : VOP1_Real_e32e64_vi <0x36>; 789defm V_MOVRELS_B32 : VOP1_Real_e32e64_vi <0x37>; 790defm V_MOVRELSD_B32 : VOP1_Real_e32e64_vi <0x38>; 791defm V_TRUNC_F64 : VOP1_Real_vi <0x17>; 792defm V_CEIL_F64 : VOP1_Real_vi <0x18>; 793defm V_FLOOR_F64 : VOP1_Real_vi <0x1A>; 794defm V_RNDNE_F64 : VOP1_Real_vi <0x19>; 795defm V_LOG_LEGACY_F32 : VOP1_Real_vi <0x4c>; 796defm V_EXP_LEGACY_F32 : VOP1_Real_vi <0x4b>; 797defm V_CVT_F16_U16 : VOP1_Real_vi <0x39>; 798defm V_CVT_F16_I16 : VOP1_Real_vi <0x3a>; 799defm V_CVT_U16_F16 : VOP1_Real_vi <0x3b>; 800defm V_CVT_I16_F16 : VOP1_Real_vi <0x3c>; 801defm V_RCP_F16 : VOP1_Real_vi <0x3d>; 802defm V_SQRT_F16 : VOP1_Real_vi <0x3e>; 803defm V_RSQ_F16 : VOP1_Real_vi <0x3f>; 804defm V_LOG_F16 : VOP1_Real_vi <0x40>; 805defm V_EXP_F16 : VOP1_Real_vi <0x41>; 806defm V_FREXP_MANT_F16 : VOP1_Real_vi <0x42>; 807defm V_FREXP_EXP_I16_F16 : VOP1_Real_vi <0x43>; 808defm V_FLOOR_F16 : VOP1_Real_vi <0x44>; 809defm V_CEIL_F16 : VOP1_Real_vi <0x45>; 810defm V_TRUNC_F16 : VOP1_Real_vi <0x46>; 811defm V_RNDNE_F16 : VOP1_Real_vi <0x47>; 812defm V_FRACT_F16 : VOP1_Real_vi <0x48>; 813defm V_SIN_F16 : VOP1_Real_vi <0x49>; 814defm V_COS_F16 : VOP1_Real_vi <0x4a>; 815defm V_SWAP_B32 : VOP1Only_Real_vi <0x51>; 816 817defm V_SAT_PK_U8_I16 : VOP1_Real_vi<0x4f>; 818defm V_CVT_NORM_I16_F16 : VOP1_Real_vi<0x4d>; 819defm V_CVT_NORM_U16_F16 : VOP1_Real_vi<0x4e>; 820 821// Copy of v_mov_b32 with $vdst as a use operand for use with VGPR 822// indexing mode. vdst can't be treated as a def for codegen purposes, 823// and an implicit use and def of the super register should be added. 824def V_MOV_B32_indirect : VPseudoInstSI<(outs), 825 (ins getVALUDstForVT<i32>.ret:$vdst, getVOPSrc0ForVT<i32>.ret:$src0)>, 826 PseudoInstExpansion<(V_MOV_B32_e32_vi getVALUDstForVT<i32>.ret:$vdst, 827 getVOPSrc0ForVT<i32>.ret:$src0)> { 828 let VOP1 = 1; 829 let SubtargetPredicate = isGFX8GFX9; 830} 831 832// This is a pseudo variant of the v_movreld_b32 instruction in which the 833// vector operand appears only twice, once as def and once as use. Using this 834// pseudo avoids problems with the Two Address instructions pass. 835class V_MOVRELD_B32_pseudo<RegisterClass rc> : VPseudoInstSI < 836 (outs rc:$vdst), 837 (ins rc:$vsrc, VSrc_b32:$val, i32imm:$offset)> { 838 let VOP1 = 1; 839 840 let Constraints = "$vsrc = $vdst"; 841 let Uses = [M0, EXEC]; 842 843 let SubtargetPredicate = HasMovrel; 844} 845 846def V_MOVRELD_B32_V1 : V_MOVRELD_B32_pseudo<VGPR_32>; 847def V_MOVRELD_B32_V2 : V_MOVRELD_B32_pseudo<VReg_64>; 848def V_MOVRELD_B32_V4 : V_MOVRELD_B32_pseudo<VReg_128>; 849def V_MOVRELD_B32_V8 : V_MOVRELD_B32_pseudo<VReg_256>; 850def V_MOVRELD_B32_V16 : V_MOVRELD_B32_pseudo<VReg_512>; 851 852let OtherPredicates = [isGFX8Plus] in { 853 854def : GCNPat < 855 (i32 (int_amdgcn_mov_dpp i32:$src, timm:$dpp_ctrl, timm:$row_mask, timm:$bank_mask, 856 timm:$bound_ctrl)), 857 (V_MOV_B32_dpp $src, $src, (as_i32imm $dpp_ctrl), 858 (as_i32imm $row_mask), (as_i32imm $bank_mask), 859 (as_i1imm $bound_ctrl)) 860>; 861 862def : GCNPat < 863 (i32 (int_amdgcn_update_dpp i32:$old, i32:$src, timm:$dpp_ctrl, timm:$row_mask, 864 timm:$bank_mask, timm:$bound_ctrl)), 865 (V_MOV_B32_dpp $old, $src, (as_i32imm $dpp_ctrl), 866 (as_i32imm $row_mask), (as_i32imm $bank_mask), 867 (as_i1imm $bound_ctrl)) 868>; 869 870} // End OtherPredicates = [isGFX8Plus] 871 872let OtherPredicates = [isGFX8Plus] in { 873def : GCNPat< 874 (i32 (anyext i16:$src)), 875 (COPY $src) 876>; 877 878def : GCNPat< 879 (i64 (anyext i16:$src)), 880 (REG_SEQUENCE VReg_64, 881 (i32 (COPY $src)), sub0, 882 (V_MOV_B32_e32 (i32 0)), sub1) 883>; 884 885def : GCNPat< 886 (i16 (trunc i32:$src)), 887 (COPY $src) 888>; 889 890def : GCNPat < 891 (i16 (trunc i64:$src)), 892 (EXTRACT_SUBREG $src, sub0) 893>; 894 895} // End OtherPredicates = [isGFX8Plus] 896 897//===----------------------------------------------------------------------===// 898// GFX9 899//===----------------------------------------------------------------------===// 900 901multiclass VOP1_Real_gfx9 <bits<10> op> { 902 let AssemblerPredicate = isGFX9Only, DecoderNamespace = "GFX9" in { 903 defm NAME : VOP1_Real_e32e64_vi <op>; 904 } 905 906 foreach _ = BoolToList<!cast<VOP1_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA9>.ret in 907 def _sdwa_gfx9 : 908 VOP_SDWA9_Real <!cast<VOP1_SDWA_Pseudo>(NAME#"_sdwa")>, 909 VOP1_SDWA9Ae <op{7-0}, !cast<VOP1_SDWA_Pseudo>(NAME#"_sdwa").Pfl>; 910 911 foreach _ = BoolToList<!cast<VOP1_Pseudo>(NAME#"_e32").Pfl.HasExtDPP>.ret in 912 def _dpp_gfx9 : 913 VOP_DPP_Real<!cast<VOP1_DPP_Pseudo>(NAME#"_dpp"), SIEncodingFamily.GFX9>, 914 VOP1_DPPe<op{7-0}, !cast<VOP1_DPP_Pseudo>(NAME#"_dpp")>; 915 916} 917 918defm V_SCREEN_PARTITION_4SE_B32 : VOP1_Real_gfx9 <0x37>; 919 920//===----------------------------------------------------------------------===// 921// GFX10 922//===----------------------------------------------------------------------===// 923 924let OtherPredicates = [isGFX10Plus] in { 925def : GCNPat < 926 (i32 (int_amdgcn_mov_dpp8 i32:$src, timm:$dpp8)), 927 (V_MOV_B32_dpp8_gfx10 $src, $src, (as_i32imm $dpp8), (i32 DPP8Mode.FI_0)) 928>; 929} // End OtherPredicates = [isGFX10Plus] 930