@@ -194,9 +194,12 @@ multiclass VOP2Inst_t16<string opName,
194194 let SubtargetPredicate = NotHasTrue16BitInsts, OtherPredicates = [Has16BitInsts] in {
195195 defm NAME : VOP2Inst<opName, P, node, revOp, GFX9Renamed>;
196196 }
197- let SubtargetPredicate = HasTrue16BitInsts in {
197+ let SubtargetPredicate = UseRealTrue16Insts in {
198198 defm _t16 : VOP2Inst<opName#"_t16", VOPProfile_True16<P>, node, revOp#"_t16", GFX9Renamed>;
199199 }
200+ let SubtargetPredicate = UseFakeTrue16Insts in {
201+ defm _fake16 : VOP2Inst<opName#"_fake16", VOPProfile_Fake16<P>, node, revOp#"_fake16", GFX9Renamed>;
202+ }
200203}
201204
202205// Creating a _t16_e32 pseudo when there is no corresponding real instruction on
@@ -212,7 +215,7 @@ multiclass VOP2Inst_e64_t16<string opName,
212215 defm NAME : VOP2Inst<opName, P, node, revOp, GFX9Renamed>;
213216 }
214217 let SubtargetPredicate = HasTrue16BitInsts in {
215- defm _t16 : VOP2Inst_e64<opName#"_t16", VOPProfile_True16 <P>, node, revOp#"_t16", GFX9Renamed>;
218+ defm _t16 : VOP2Inst_e64<opName#"_t16", VOPProfile_Fake16 <P>, node, revOp#"_t16", GFX9Renamed>;
216219 }
217220}
218221
@@ -874,7 +877,7 @@ def LDEXP_F16_VOPProfile : VOPProfile <[f16, f16, f16, untyped]> {
874877 let HasSrc1FloatMods = 0;
875878 let Src1ModSDWA = Int16SDWAInputMods;
876879}
877- def LDEXP_F16_VOPProfile_True16 : VOPProfile_True16 <VOP_F16_F16_F16> {
880+ def LDEXP_F16_VOPProfile_True16 : VOPProfile_Fake16 <VOP_F16_F16_F16> {
878881 let Src1RC32 = RegisterOperand<VGPR_32_Lo128>;
879882 let Src1DPP = VGPR_32_Lo128;
880883 let Src1ModDPP = IntT16VRegInputMods;
@@ -925,9 +928,9 @@ def : LDEXP_F16_Pat<any_fldexp, V_LDEXP_F16_t16_e64>;
925928
926929let SubtargetPredicate = isGFX11Plus in {
927930 let isCommutable = 1 in {
928- defm V_AND_B16_t16 : VOP2Inst_e64 <"v_and_b16_t16", VOPProfile_True16 <VOP_I16_I16_I16>, and>;
929- defm V_OR_B16_t16 : VOP2Inst_e64 <"v_or_b16_t16", VOPProfile_True16 <VOP_I16_I16_I16>, or>;
930- defm V_XOR_B16_t16 : VOP2Inst_e64 <"v_xor_b16_t16", VOPProfile_True16 <VOP_I16_I16_I16>, xor>;
931+ defm V_AND_B16_t16 : VOP2Inst_e64 <"v_and_b16_t16", VOPProfile_Fake16 <VOP_I16_I16_I16>, and>;
932+ defm V_OR_B16_t16 : VOP2Inst_e64 <"v_or_b16_t16", VOPProfile_Fake16 <VOP_I16_I16_I16>, or>;
933+ defm V_XOR_B16_t16 : VOP2Inst_e64 <"v_xor_b16_t16", VOPProfile_Fake16 <VOP_I16_I16_I16>, xor>;
931934 } // End isCommutable = 1
932935} // End SubtargetPredicate = isGFX11Plus
933936
@@ -1307,6 +1310,8 @@ let AssemblerPredicate = isGFX11Only, DecoderNamespace = "GFX11" in {
13071310 multiclass VOP2_Real_e32_with_name_gfx11<bits<6> op, string opName,
13081311 string asmName, bit single = 0> {
13091312 defvar ps = !cast<VOP2_Pseudo>(opName#"_e32");
1313+ let DecoderNamespace = !if(ps.Pfl.IsRealTrue16, "GFX11", "GFX11_FAKE16"),
1314+ AssemblerPredicate = !if(ps.Pfl.IsRealTrue16, UseRealTrue16Insts, isGFX11Only) in
13101315 def _e32_gfx11 :
13111316 VOP2_Real<ps, SIEncodingFamily.GFX11, asmName>,
13121317 VOP2e<op{5-0}, ps.Pfl> {
@@ -1331,7 +1336,8 @@ let AssemblerPredicate = isGFX11Only, DecoderNamespace = "GFX11" in {
13311336 def _dpp_gfx11 : VOP2_DPP16<op, !cast<VOP2_DPP_Pseudo>(opName#"_dpp"),
13321337 SIEncodingFamily.GFX11> {
13331338 let AsmString = asmName # ps.Pfl.AsmDPP16;
1334- let DecoderNamespace = "DPPGFX11";
1339+ let DecoderNamespace = !if(ps.Pfl.IsRealTrue16, "DPPGFX11", "DPPGFX11_FAKE16");
1340+ let AssemblerPredicate = !if(ps.Pfl.IsRealTrue16, UseRealTrue16Insts, isGFX11Only);
13351341 }
13361342 }
13371343 multiclass VOP2_Real_dpp8_with_name_gfx11<bits<6> op, string opName,
@@ -1340,7 +1346,8 @@ let AssemblerPredicate = isGFX11Only, DecoderNamespace = "GFX11" in {
13401346 if ps.Pfl.HasExtDPP then
13411347 def _dpp8_gfx11 : VOP2_DPP8<op, ps> {
13421348 let AsmString = asmName # ps.Pfl.AsmDPP8;
1343- let DecoderNamespace = "DPP8GFX11";
1349+ let DecoderNamespace = !if(ps.Pfl.IsRealTrue16, "DPP8GFX11", "DPP8GFX11_FAKE16");
1350+ let AssemblerPredicate = !if(ps.Pfl.IsRealTrue16, UseRealTrue16Insts, isGFX11Only);
13441351 }
13451352 }
13461353
@@ -1491,13 +1498,19 @@ defm V_CVT_PK_RTZ_F16_F32 : VOP2_Real_FULL_with_name_gfx11<0x02f,
14911498defm V_PK_FMAC_F16 : VOP2Only_Real_gfx11<0x03c>;
14921499
14931500defm V_ADD_F16_t16 : VOP2_Real_FULL_t16_gfx11<0x032, "v_add_f16">;
1501+ defm V_ADD_F16_fake16 : VOP2_Real_FULL_t16_gfx11<0x032, "v_add_f16">;
14941502defm V_SUB_F16_t16 : VOP2_Real_FULL_t16_gfx11<0x033, "v_sub_f16">;
1503+ defm V_SUB_F16_fake16 : VOP2_Real_FULL_t16_gfx11<0x033, "v_sub_f16">;
14951504defm V_SUBREV_F16_t16 : VOP2_Real_FULL_t16_gfx11<0x034, "v_subrev_f16">;
1505+ defm V_SUBREV_F16_fake16 : VOP2_Real_FULL_t16_gfx11<0x034, "v_subrev_f16">;
14961506defm V_MUL_F16_t16 : VOP2_Real_FULL_t16_gfx11<0x035, "v_mul_f16">;
1507+ defm V_MUL_F16_fake16 : VOP2_Real_FULL_t16_gfx11<0x035, "v_mul_f16">;
14971508defm V_FMAC_F16_t16 : VOP2_Real_FULL_t16_gfx11<0x036, "v_fmac_f16">;
14981509defm V_LDEXP_F16_t16 : VOP2_Real_FULL_t16_gfx11<0x03b, "v_ldexp_f16">;
14991510defm V_MAX_F16_t16 : VOP2_Real_FULL_t16_gfx11<0x039, "v_max_f16">;
1511+ defm V_MAX_F16_fake16 : VOP2_Real_FULL_t16_gfx11<0x039, "v_max_f16">;
15001512defm V_MIN_F16_t16 : VOP2_Real_FULL_t16_gfx11<0x03a, "v_min_f16">;
1513+ defm V_MIN_F16_fake16 : VOP2_Real_FULL_t16_gfx11<0x03a, "v_min_f16">;
15011514defm V_FMAMK_F16_t16 : VOP2Only_Real_MADK_gfx11_with_name<0x037, "v_fmamk_f16">;
15021515defm V_FMAAK_F16_t16 : VOP2Only_Real_MADK_gfx11_with_name<0x038, "v_fmaak_f16">;
15031516
0 commit comments