@@ -192,6 +192,8 @@ class VOPC_Real <VOPC_Pseudo ps, int EncodingFamily, string asm_name = ps.Pseudo
192192
193193 // copy relevant pseudo op flags
194194 let SubtargetPredicate = ps.SubtargetPredicate;
195+ let True16Predicate = ps.True16Predicate;
196+ let OtherPredicates = ps.OtherPredicates;
195197 let AsmMatchConverter = ps.AsmMatchConverter;
196198 let Constraints = ps.Constraints;
197199 let DisableEncoding = ps.DisableEncoding;
@@ -314,7 +316,7 @@ multiclass VOPC_Pseudos <string opName,
314316 let isCommutable = 1;
315317 }
316318
317- def _e64 : VOP3_Pseudo<opName, P, getVOPCPat64<cond, P>.ret>,
319+ def _e64 : VOP3_Pseudo<opName, P, getVOPCPat64<cond, P>.ret, /*IsVOP3P*/false, P.HasOpSel >,
318320 Commutable_REV<revOp#"_e64", !eq(revOp, opName)>,
319321 VCMPXNoSDstTable<1, opName#"_e64">,
320322 VCMPVCMPXTable<opName#"_e64"> {
@@ -373,7 +375,7 @@ multiclass VOPCX_Pseudos <string opName,
373375 let IsVCMPX = 1;
374376 }
375377
376- def _nosdst_e64 : VOP3_Pseudo<opName#"_nosdst", P_NoSDst>,
378+ def _nosdst_e64 : VOP3_Pseudo<opName#"_nosdst", P_NoSDst, [], /*IsVOP3P*/false, P_NoSDst.HasOpSel >,
377379 Commutable_REV<revOp#"_nosdst_e64", !eq(revOp, opName)>,
378380 VCMPXNoSDstTable<0, opName#"_e64">,
379381 VCMPVCMPXTable<!subst("v_cmpx", "v_cmp", opName#"_e64")> {
@@ -801,24 +803,11 @@ defm V_CMPX_T_U64 : VOPCX_I64 <"v_cmpx_t_u64">;
801803
802804class VOPC_Class_Profile<list<SchedReadWrite> sched, ValueType src0VT, ValueType src1VT = i32> :
803805 VOPC_Profile<sched, src0VT, src1VT> {
804- let AsmDPP = "$src0_modifiers, $src1 $dpp_ctrl$row_mask$bank_mask$bound_ctrl";
805- let AsmDPP16 = AsmDPP#"$fi";
806- let InsDPP = (ins Src0ModDPP:$src0_modifiers, Src0DPP:$src0, Src1DPP:$src1, dpp_ctrl:$dpp_ctrl, DppRowMask:$row_mask, DppBankMask:$bank_mask, DppBoundCtrl:$bound_ctrl);
807- let InsDPP16 = !con(InsDPP, (ins Dpp16FI:$fi));
808- // DPP8 forbids modifiers and can inherit from VOPC_Profile
809-
810- let Ins64 = (ins Src0Mod:$src0_modifiers, Src0RC64:$src0, Src1RC64:$src1);
811- dag InsPartVOP3DPP = (ins FPVRegInputMods:$src0_modifiers, VGPRSrc_32:$src0, VCSrc_b32:$src1);
812- let InsVOP3Base = !con(InsPartVOP3DPP, !if(HasOpSel, (ins op_sel0:$op_sel),
813- (ins)));
814- let AsmVOP3Base = "$sdst, $src0_modifiers, $src1";
815-
816806 let InsSDWA = (ins Src0ModSDWA:$src0_modifiers, Src0SDWA:$src0,
817807 Src1ModSDWA:$src1_modifiers, Src1SDWA:$src1,
818808 Clamp:$clamp, src0_sel:$src0_sel, src1_sel:$src1_sel);
819809
820810 let AsmSDWA = " vcc, $src0_modifiers, $src1_modifiers$clamp $src0_sel $src1_sel";
821- let HasSrc1Mods = 0;
822811 let HasClamp = 0;
823812 let HasOMod = 0;
824813}
@@ -837,16 +826,26 @@ multiclass VOPC_Class_Profile_t16<list<SchedReadWrite> sched> {
837826 let Src1ModDPP = getSrcModDPP_t16<Src1VT>.ret;
838827 let Src2ModDPP = getSrcModDPP_t16<Src2VT>.ret;
839828 }
840- def _fake16 : VOPC_Class_Profile<sched, f16, i16 > {
829+ def _fake16 : VOPC_Class_Profile<sched, f16, f16 > {
841830 let IsTrue16 = 1;
831+ let DstRC = getVALUDstForVT_fake16<DstVT>.ret;
832+ let DstRC64 = getVALUDstForVT<DstVT>.ret;
833+ let Src0RC32 = getVOPSrc0ForVT<Src0VT, 1/*IsTrue16*/, 1/*IsFake16*/>.ret;
842834 let Src1RC32 = getVregSrcForVT<Src1VT, 1/*IsTrue16*/, 1/*IsFake16*/>.ret;
843835 let Src1RC64 = VSrc_b32;
844836 let Src0DPP = getVregSrcForVT<Src0VT, 1/*IsTrue16*/, 1/*IsFake16*/>.ret;
845837 let Src1DPP = getVregSrcForVT<Src1VT, 1/*IsTrue16*/, 1/*IsFake16*/>.ret;
846838 let Src2DPP = getVregSrcForVT<Src2VT, 1/*IsTrue16*/, 1/*IsFake16*/>.ret;
847- let Src0ModDPP = getSrcModDPP_t16<Src0VT>.ret;
848- let Src1ModDPP = getSrcModDPP_t16<Src1VT>.ret;
849- let Src2ModDPP = getSrcModDPP_t16<Src2VT>.ret;
839+ let Src0ModDPP = getSrcModDPP_t16<Src0VT, 1/*IsFake16*/>.ret;
840+ let Src1ModDPP = getSrcModDPP_t16<Src1VT, 1/*IsFake16*/>.ret;
841+ let Src2ModDPP = getSrcModDPP_t16<Src2VT, 1/*IsFake16*/>.ret;
842+ let Src0VOP3DPP = VGPRSrc_32;
843+ let Src1VOP3DPP = getVOP3DPPSrcForVT<Src1VT, 1/*IsFake16*/>.ret;
844+ let Src2VOP3DPP = getVOP3DPPSrcForVT<Src2VT, 1/*IsFake16*/>.ret;
845+ let Src0ModVOP3DPP = getSrc0ModVOP3DPP<Src0VT, DstVT, 1/*IsFake16*/>.ret;
846+ let Src1ModVOP3DPP = getSrcModVOP3DPP<Src1VT, 1/*IsFake16*/>.ret;
847+ let Src2ModVOP3DPP = getSrcModVOP3DPP<Src2VT, 1/*IsFake16*/>.ret;
848+
850849 }
851850}
852851
@@ -889,17 +888,35 @@ multiclass VOPC_Class_NoSdst_Profile_t16<list<SchedReadWrite> sched> {
889888 }
890889}
891890
892- class getVOPCClassPat64 <VOPProfile P> {
893- list<dag> ret =
894- [(set i1:$sdst,
891+ multiclass VOPCClassPat64<string inst_name> {
892+ defvar inst = !cast<VOP_Pseudo>(inst_name#"_e64");
893+ defvar P = inst.Pfl;
894+ def : GCNPat <
895+ (i1:$sdst
895896 (AMDGPUfp_class
896897 (P.Src0VT (VOP3ModsNonCanonicalizing P.Src0VT:$src0, i32:$src0_modifiers)),
897- i32:$src1))];
898+ P.Src1VT:$src1)),
899+ (inst i32:$src0_modifiers, P.Src0VT:$src0,
900+ 0 /*src1_modifiers*/, P.Src1VT:$src1)
901+ >;
898902}
899903
904+ multiclass VOPCClassPat64_fake16<string inst_name> {
905+ defvar inst = !cast<VOP_Pseudo>(inst_name#"_fake16_e64");
906+ defvar P = inst.Pfl;
907+ def : GCNPat <
908+ (i1:$sdst
909+ (AMDGPUfp_class
910+ (P.Src0VT (VOP3ModsNonCanonicalizing P.Src0VT:$src0, i32:$src0_modifiers)),
911+ i32:$src1)),
912+ (inst i32:$src0_modifiers, P.Src0VT:$src0,
913+ 0 /*src1_modifiers*/, VGPR_32:$src1)
914+ >;
915+ }
900916
901- // Special case for class instructions which only have modifiers on
902- // the 1st source operand.
917+ // cmp_class ignores the FP mode and faithfully reports the unmodified
918+ // source value.
919+ let ReadsModeReg = 0, mayRaiseFPException = 0 in {
903920multiclass VOPC_Class_Pseudos <string opName, VOPC_Profile p, bit DefExec,
904921 bit DefVcc = 1> {
905922 def _e32 : VOPC_Pseudo <opName, p>,
@@ -910,7 +927,7 @@ multiclass VOPC_Class_Pseudos <string opName, VOPC_Profile p, bit DefExec,
910927 let isConvergent = DefExec;
911928 }
912929
913- def _e64 : VOP3_Pseudo<opName, p, getVOPCClassPat64<p>.ret >,
930+ def _e64 : VOP3_Pseudo<opName, p, [], 0/*IsVOP3P*/, p.HasOpSel >,
914931 VCMPXNoSDstTable<1, opName#"_e64"> {
915932 let Defs = !if(DefExec, [EXEC], []);
916933 let SchedRW = p.Schedule;
@@ -957,7 +974,7 @@ multiclass VOPCX_Class_Pseudos <string opName,
957974 let SubtargetPredicate = HasNoSdstCMPX;
958975 }
959976
960- def _nosdst_e64 : VOP3_Pseudo<opName#"_nosdst", P_NoSDst>,
977+ def _nosdst_e64 : VOP3_Pseudo<opName#"_nosdst", P_NoSDst, [], 0/*IsVOP3P*/, P_NoSDst.HasOpSel >,
961978 VCMPXNoSDstTable<0, opName#"_e64"> {
962979 let Defs = [EXEC];
963980 let SchedRW = P_NoSDst.Schedule;
@@ -990,6 +1007,7 @@ multiclass VOPCX_Class_Pseudos <string opName,
9901007 } // end SubtargetPredicate = isGFX11Plus
9911008}
9921009} // End SubtargetPredicate = HasSdstCMPX
1010+ } // End ReadsModeReg = 0, mayRaiseFPException = 0
9931011
9941012defm VOPC_I1_F16_I16 : VOPC_Class_Profile_t16<[Write32Bit]>;
9951013def VOPC_I1_F32_I32 : VOPC_Class_Profile<[Write32Bit], f32>;
@@ -1002,12 +1020,14 @@ def VOPC_F64_I32 : VOPC_Class_NoSdst_Profile<[Write64Bit], f64>;
10021020multiclass VOPC_CLASS_F16 <string opName> {
10031021 let OtherPredicates = [Has16BitInsts], True16Predicate = NotHasTrue16BitInsts in {
10041022 defm NAME : VOPC_Class_Pseudos <opName, VOPC_I1_F16_I16, 0>;
1023+ defm : VOPCClassPat64<NAME>;
10051024 }
1006- let OtherPredicates = [ UseRealTrue16Insts] in {
1025+ let True16Predicate = UseRealTrue16Insts in {
10071026 defm _t16 : VOPC_Class_Pseudos <opName#"_t16", VOPC_I1_F16_I16_t16, 0>;
10081027 }
1009- let OtherPredicates = [ UseFakeTrue16Insts] in {
1028+ let True16Predicate = UseFakeTrue16Insts in {
10101029 defm _fake16 : VOPC_Class_Pseudos <opName#"_fake16", VOPC_I1_F16_I16_fake16, 0>;
1030+ defm : VOPCClassPat64_fake16<NAME>;
10111031 }
10121032}
10131033
@@ -1023,29 +1043,29 @@ multiclass VOPCX_CLASS_F16 <string opName> {
10231043 }
10241044}
10251045
1026- multiclass VOPC_CLASS_F32 <string opName> :
1027- VOPC_Class_Pseudos <opName, VOPC_I1_F32_I32, 0>;
1046+ multiclass VOPC_CLASS_F32 <string opName> {
1047+ defm NAME : VOPC_Class_Pseudos <opName, VOPC_I1_F32_I32, 0>;
1048+ defm : VOPCClassPat64<NAME>;
1049+ }
10281050
10291051multiclass VOPCX_CLASS_F32 <string opName> :
10301052 VOPCX_Class_Pseudos <opName, VOPC_I1_F32_I32, VOPC_F32_I32>;
10311053
1032- multiclass VOPC_CLASS_F64 <string opName> :
1033- VOPC_Class_Pseudos <opName, VOPC_I1_F64_I32, 0>;
1054+ multiclass VOPC_CLASS_F64 <string opName> {
1055+ defm NAME : VOPC_Class_Pseudos <opName, VOPC_I1_F64_I32, 0>;
1056+ defm : VOPCClassPat64<NAME>;
1057+ }
10341058
10351059multiclass VOPCX_CLASS_F64 <string opName> :
10361060 VOPCX_Class_Pseudos <opName, VOPC_I1_F64_I32, VOPC_F64_I32>;
10371061
1038- // cmp_class ignores the FP mode and faithfully reports the unmodified
1039- // source value.
1040- let ReadsModeReg = 0, mayRaiseFPException = 0 in {
10411062defm V_CMP_CLASS_F32 : VOPC_CLASS_F32 <"v_cmp_class_f32">;
10421063defm V_CMPX_CLASS_F32 : VOPCX_CLASS_F32 <"v_cmpx_class_f32">;
10431064defm V_CMP_CLASS_F64 : VOPC_CLASS_F64 <"v_cmp_class_f64">;
10441065defm V_CMPX_CLASS_F64 : VOPCX_CLASS_F64 <"v_cmpx_class_f64">;
10451066
10461067defm V_CMP_CLASS_F16 : VOPC_CLASS_F16 <"v_cmp_class_f16">;
10471068defm V_CMPX_CLASS_F16 : VOPCX_CLASS_F16 <"v_cmpx_class_f16">;
1048- } // End ReadsModeReg = 0, mayRaiseFPException = 0
10491069
10501070//===----------------------------------------------------------------------===//
10511071// V_ICMPIntrinsic Pattern.
@@ -1283,11 +1303,13 @@ class VOPC_DPP16<bits<8> op, VOP_DPP_Pseudo ps, string opName = ps.OpName>
12831303 : VOPC_DPP_Base<op, opName, ps.Pfl> {
12841304 let AssemblerPredicate = HasDPP16;
12851305 let SubtargetPredicate = HasDPP16;
1306+ let True16Predicate = ps.True16Predicate;
12861307 let hasSideEffects = ps.hasSideEffects;
12871308 let Defs = ps.Defs;
12881309 let SchedRW = ps.SchedRW;
12891310 let Uses = ps.Uses;
12901311 let OtherPredicates = ps.OtherPredicates;
1312+ let True16Predicate = ps.True16Predicate;
12911313 let Constraints = ps.Constraints;
12921314}
12931315
@@ -1303,6 +1325,7 @@ class VOPC_DPP8<bits<8> op, VOPC_Pseudo ps, string opName = ps.OpName>
13031325 let SchedRW = ps.SchedRW;
13041326 let Uses = ps.Uses;
13051327 let OtherPredicates = ps.OtherPredicates;
1328+ let True16Predicate = ps.True16Predicate;
13061329 let Constraints = "";
13071330}
13081331
@@ -1333,6 +1356,7 @@ class VOPC64_DPP16<bits<10> op, VOP_DPP_Pseudo ps, string opName = ps.OpName>
13331356 : VOPC64_DPP_Base<op, opName, ps.Pfl> {
13341357 let AssemblerPredicate = HasDPP16;
13351358 let SubtargetPredicate = HasDPP16;
1359+ let True16Predicate = ps.True16Predicate;
13361360 let hasSideEffects = ps.hasSideEffects;
13371361 let Defs = ps.Defs;
13381362 let SchedRW = ps.SchedRW;
@@ -1375,6 +1399,7 @@ class VOPC64_DPP8<bits<10> op, VOP_Pseudo ps, string opName = ps.OpName>
13751399 let SchedRW = ps.SchedRW;
13761400 let Uses = ps.Uses;
13771401 let OtherPredicates = ps.OtherPredicates;
1402+ let True16Predicate = ps.True16Predicate;
13781403}
13791404
13801405class VOPC64_DPP8_Dst<bits<10> op, VOP_Pseudo ps, string opName = ps.OpName>
0 commit comments