diff --git a/llvm/lib/Target/AMDGPU/AMDGPU.td b/llvm/lib/Target/AMDGPU/AMDGPU.td index 38ef130a822d..64b0fc07799c 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPU.td +++ b/llvm/lib/Target/AMDGPU/AMDGPU.td @@ -898,6 +898,11 @@ defm FP8F16ConversionInsts : AMDGPUSubtargetFeature<"fp8-f16-conversion-insts", "Has fp8 and bf8 conversion to f16 instructions" >; +// The opposite direction of FP8F16ConversionInsts above. +defm F16FP8ConversionInsts : AMDGPUSubtargetFeature<"f16-fp8-conversion-insts", + "Has f16 conversion to fp8 and bf8 instructions" +>; + defm FP8E5M3Insts : AMDGPUSubtargetFeature<"fp8e5m3-insts", "Has fp8 e5m3 format support" >; @@ -909,17 +914,17 @@ defm CvtFP8VOP1Bug : AMDGPUSubtargetFeature<"cvt-fp8-vop1-bug", [FeatureFP8ConversionInsts] >; -// The fp8/bf8 to f32 conversions select which byte of the source to convert in -// one of two ways. +// The fp8/bf8 conversions take the byte index in one of two ways, and a +// subtarget uses the same one in both directions. defm CvtFP8SDWASrcSel : AMDGPUSubtargetFeature<"cvt-fp8-sdwa-src-sel", - "FP8/BF8 conversions to F32 take the source byte from the SDWA src0_sel field", + "FP8/BF8 conversions take the byte index from the SDWA src0_sel or op_sel field", /*GenPredicate=*/1, /*GenAssemblerPredicate=*/1, [FeatureFP8ConversionInsts] >; defm CvtFP8ByteSel : AMDGPUSubtargetFeature<"cvt-fp8-byte-sel", - "FP8/BF8 conversions to F32 take the source byte from a byte_sel operand", + "FP8/BF8 conversions take the byte index from a byte_sel operand", /*GenPredicate=*/1, /*GenAssemblerPredicate=*/1, [FeatureFP8ConversionInsts] @@ -2297,6 +2302,7 @@ def FeatureISAVersion12_50_Common : FeatureSet< FeatureCvtFP8ByteSel, FeatureOCPFP8ConversionInsts, FeatureFP8F16ConversionInsts, + FeatureF16FP8ConversionInsts, FeatureFP8E5M3Insts, FeaturePackedTID, FeatureVcmpxPermlaneHazard, @@ -2455,6 +2461,7 @@ def FeatureISAVersion13 : FeatureSet< FeatureCvtFP8ByteSel, FeatureOCPFP8ConversionInsts, FeatureFP8F16ConversionInsts, + FeatureF16FP8ConversionInsts, FeaturePackedTID, FeatureVcmpxPermlaneHazard, FeatureSALUFloatInsts, diff --git a/llvm/lib/Target/AMDGPU/VOP1Instructions.td b/llvm/lib/Target/AMDGPU/VOP1Instructions.td index 8cb3dc072361..af02b9a5e5f0 100644 --- a/llvm/lib/Target/AMDGPU/VOP1Instructions.td +++ b/llvm/lib/Target/AMDGPU/VOP1Instructions.td @@ -1228,7 +1228,7 @@ class VOP1_CVT_PK_F8_F16_Fake16_Profile : VOPProfile_Fake16< } } -let SubtargetPredicate = isGFX1250Plus in { +let SubtargetPredicate = HasF16FP8ConversionInsts in { let ReadsModeReg = 0 in { defm V_CVT_PK_FP8_F16 : VOP1Inst_t16_with_profiles<"v_cvt_pk_fp8_f16", VOP1_CVT_PK_F8_F16_Profile, diff --git a/llvm/lib/Target/AMDGPU/VOP3Instructions.td b/llvm/lib/Target/AMDGPU/VOP3Instructions.td index a3715f1b7fe2..219bd4805903 100644 --- a/llvm/lib/Target/AMDGPU/VOP3Instructions.td +++ b/llvm/lib/Target/AMDGPU/VOP3Instructions.td @@ -813,19 +813,19 @@ let OtherPredicates = [HasFP8ConversionInsts], mayRaiseFPException = 0, VOP3_CVT_PK_F8_F32_Profile_t16<>, VOP3_CVT_PK_F8_F32_Profile_fake16<>>; - let SubtargetPredicate = isGFX11Plus in { + let SubtargetPredicate = HasCvtFP8ByteSel in { let OtherPredicates = [HasFP8ConversionInsts, NotHasFP8E5M3Insts] in defm V_CVT_SR_FP8_F32_gfx12 : VOP3Inst<"v_cvt_sr_fp8_f32_gfx12", VOP3_CVT_SR_F8_ByteSel_Profile>; let OtherPredicates = [HasFP8ConversionInsts, HasFP8E5M3Insts] in defm V_CVT_SR_FP8_F32_gfx1250 : VOP3Inst<"v_cvt_sr_fp8_f32_gfx1250", VOP3_CVT_SR_F8_ByteSel_Profile>; defm V_CVT_SR_BF8_F32_gfx12 : VOP3Inst<"v_cvt_sr_bf8_f32_gfx12", VOP3_CVT_SR_F8_ByteSel_Profile>; - } // End SubtargetPredicate = isGFX11Plus + } // End SubtargetPredicate = HasCvtFP8ByteSel } // These instructions have non-standard use of op_sel. In particular they are // using op_sel bits 2 and 3 while only having two sources. Therefore dummy // src2 is used to hold the op_sel value. - let Constraints = "$vdst = $src2", SubtargetPredicate = isGFX940Plus in { + let Constraints = "$vdst = $src2", SubtargetPredicate = HasCvtFP8SDWASrcSel in { defm V_CVT_SR_FP8_F32 : VOP3Inst<"v_cvt_sr_fp8_f32", VOP3_CVT_SR_F8_F32_Profile>; defm V_CVT_SR_BF8_F32 : VOP3Inst<"v_cvt_sr_bf8_f32", VOP3_CVT_SR_F8_F32_Profile>; } @@ -920,14 +920,14 @@ defm : Cvt_PK_F8_F32_t16_Pat; def : Cvt_SR_F8_F32_Pat; } } -let SubtargetPredicate = isGFX11Plus in { +let SubtargetPredicate = HasCvtFP8ByteSel in { let OtherPredicates = [HasFP8ConversionInsts, NotHasFP8E5M3Insts] in def : Cvt_SR_F8_ByteSel_Pat; let OtherPredicates = [HasFP8ConversionInsts, HasFP8E5M3Insts] in { @@ -935,7 +935,7 @@ let SubtargetPredicate = isGFX11Plus in { def : Cvt_SR_F8_ByteSel_E5M3_Pat; } def : Cvt_SR_F8_ByteSel_Pat; -} // End SubtargetPredicate = isGFX11Plus +} // End SubtargetPredicate = HasCvtFP8ByteSel } class ThreeOp_i32_Pats : GCNPat < @@ -1850,7 +1850,7 @@ let SubtargetPredicate = isGFX1250Plus in { // These instructions have non-standard use of op_sel. They are using bits 2 and 3 of opsel // to select a byte in the vdst. Bits 0 and 1 are unused. - let Constraints = "$vdst = $vdst_in" in { + let Constraints = "$vdst = $vdst_in", SubtargetPredicate = HasF16FP8ConversionInsts in { defm V_CVT_SR_FP8_F16 : VOP3Inst_t16_with_profiles<"v_cvt_sr_fp8_f16", VOP3_CVT_SR_F8_F16_Profile, VOP3_CVT_SR_F8_F16_True16_Profile, VOP3_CVT_SR_F8_F16_Fake16_Profile>; defm V_CVT_SR_BF8_F16 : VOP3Inst_t16_with_profiles<"v_cvt_sr_bf8_f16", VOP3_CVT_SR_F8_F16_Profile, @@ -1919,13 +1919,15 @@ let SubtargetPredicate = isGFX1250Plus in { defm V_CVT_SCALEF32_SR_PK16_FP6_F32 : VOP3Inst<"v_cvt_scalef32_sr_pk16_fp6_f32", VOP3_CVT_SCALEF32_PK_F864_Profile, int_amdgcn_cvt_scalef32_sr_pk16_fp6_f32>; } // End Constraints = "@earlyclobber $vdst" - let True16Predicate = UseRealTrue16Insts in { - def : Cvt_SR_F8_ByteSel_Pat; - def : Cvt_SR_F8_ByteSel_Pat; - } - let True16Predicate = UseFakeTrue16Insts in { - def : Cvt_SR_F8_ByteSel_Pat; - def : Cvt_SR_F8_ByteSel_Pat; + let SubtargetPredicate = HasF16FP8ConversionInsts in { + let True16Predicate = UseRealTrue16Insts in { + def : Cvt_SR_F8_ByteSel_Pat; + def : Cvt_SR_F8_ByteSel_Pat; + } + let True16Predicate = UseFakeTrue16Insts in { + def : Cvt_SR_F8_ByteSel_Pat; + def : Cvt_SR_F8_ByteSel_Pat; + } } } // End SubtargetPredicate = isGFX1250Plus