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