@@ -3762,36 +3762,45 @@ multiclass VPseudoVNCVTI_RM_W {
37623762multiclass VPseudoVNCVTF_W_RM {
37633763 defvar constraint = "@earlyclobber $rd";
37643764 foreach m = MxListFW in {
3765- defm _W : VPseudoConversionRoundingMode<m.vrclass, m.wvrclass, m, constraint, TargetConstraintType=2>,
3766- SchedUnary<"WriteVFNCvtIToFV", "ReadVFNCvtIToFV", m.MX,
3767- forceMergeOpRead=true>;
3765+ foreach e = SchedSEWSet<m.MX, isF=1, isWidening=1>.val in
3766+ defm _W : VPseudoConversionRoundingMode<m.vrclass, m.wvrclass, m,
3767+ constraint, sew=e,
3768+ TargetConstraintType=2>,
3769+ SchedUnary<"WriteVFNCvtIToFV", "ReadVFNCvtIToFV", m.MX, e,
3770+ forceMergeOpRead=true>;
37683771 }
37693772}
37703773
37713774multiclass VPseudoVNCVTF_RM_W {
37723775 defvar constraint = "@earlyclobber $rd";
37733776 foreach m = MxListFW in {
3774- defm _W : VPseudoConversionRM<m.vrclass, m.wvrclass, m, constraint>,
3775- SchedUnary<"WriteVFNCvtIToFV", "ReadVFNCvtIToFV", m.MX,
3776- forceMergeOpRead=true>;
3777+ foreach e = SchedSEWSet<m.MX, isF=1, isWidening=1>.val in
3778+ defm _W : VPseudoConversionRM<m.vrclass, m.wvrclass, m, constraint, sew=e>,
3779+ SchedUnary<"WriteVFNCvtIToFV", "ReadVFNCvtIToFV", m.MX, e,
3780+ forceMergeOpRead=true>;
37773781 }
37783782}
37793783
37803784multiclass VPseudoVNCVTD_W {
37813785 defvar constraint = "@earlyclobber $rd";
37823786 foreach m = MxListFW in {
3783- defm _W : VPseudoConversion<m.vrclass, m.wvrclass, m, constraint, TargetConstraintType=2>,
3784- SchedUnary<"WriteVFNCvtFToFV", "ReadVFNCvtFToFV", m.MX,
3785- forceMergeOpRead=true>;
3787+ foreach e = SchedSEWSet<m.MX, isF=1, isWidening=1>.val in
3788+ defm _W : VPseudoConversion<m.vrclass, m.wvrclass, m, constraint, sew=e,
3789+ TargetConstraintType=2>,
3790+ SchedUnary<"WriteVFNCvtFToFV", "ReadVFNCvtFToFV", m.MX, e,
3791+ forceMergeOpRead=true>;
37863792 }
37873793}
37883794
37893795multiclass VPseudoVNCVTD_W_RM {
37903796 defvar constraint = "@earlyclobber $rd";
37913797 foreach m = MxListFW in {
3792- defm _W : VPseudoConversionRoundingMode<m.vrclass, m.wvrclass, m, constraint, TargetConstraintType=2>,
3793- SchedUnary<"WriteVFNCvtFToFV", "ReadVFNCvtFToFV", m.MX,
3794- forceMergeOpRead=true>;
3798+ foreach e = SchedSEWSet<m.MX, isF=1, isWidening=1>.val in
3799+ defm _W : VPseudoConversionRoundingMode<m.vrclass, m.wvrclass, m,
3800+ constraint, sew=e,
3801+ TargetConstraintType=2>,
3802+ SchedUnary<"WriteVFNCvtFToFV", "ReadVFNCvtFToFV", m.MX, e,
3803+ forceMergeOpRead=true>;
37953804 }
37963805}
37973806
@@ -6027,52 +6036,59 @@ multiclass VPatConversionVI_WF_RM <string intrinsic, string instruction> {
60276036 }
60286037}
60296038
6030- multiclass VPatConversionVF_WI_RM <string intrinsic, string instruction> {
6039+ multiclass VPatConversionVF_WI_RM <string intrinsic, string instruction,
6040+ bit isSEWAware = 0> {
60316041 foreach fvtiToFWti = AllWidenableFloatVectors in {
60326042 defvar fvti = fvtiToFWti.Vti;
60336043 defvar iwti = GetIntVTypeInfo<fvtiToFWti.Wti>.Vti;
60346044 let Predicates = !listconcat(GetVTypePredicates<fvti>.Predicates,
60356045 GetVTypePredicates<iwti>.Predicates) in
60366046 defm : VPatConversionTARoundingMode<intrinsic, instruction, "W",
60376047 fvti.Vector, iwti.Vector, fvti.Mask, fvti.Log2SEW,
6038- fvti.LMul, fvti.RegClass, iwti.RegClass>;
6048+ fvti.LMul, fvti.RegClass, iwti.RegClass,
6049+ isSEWAware>;
60396050 }
60406051}
60416052
6042- multiclass VPatConversionVF_WF <string intrinsic, string instruction> {
6053+ multiclass VPatConversionVF_WF<string intrinsic, string instruction,
6054+ bit isSEWAware = 0> {
60436055 foreach fvtiToFWti = AllWidenableFloatVectors in {
60446056 defvar fvti = fvtiToFWti.Vti;
60456057 defvar fwti = fvtiToFWti.Wti;
60466058 let Predicates = !listconcat(GetVTypePredicates<fvti>.Predicates,
60476059 GetVTypePredicates<fwti>.Predicates) in
60486060 defm : VPatConversionTA<intrinsic, instruction, "W",
60496061 fvti.Vector, fwti.Vector, fvti.Mask, fvti.Log2SEW,
6050- fvti.LMul, fvti.RegClass, fwti.RegClass>;
6062+ fvti.LMul, fvti.RegClass, fwti.RegClass, isSEWAware >;
60516063 }
60526064}
60536065
6054- multiclass VPatConversionVF_WF_RM <string intrinsic, string instruction,
6055- list<VTypeInfoToWide> wlist = AllWidenableFloatVectors> {
6066+ multiclass VPatConversionVF_WF_RM<string intrinsic, string instruction,
6067+ list<VTypeInfoToWide> wlist = AllWidenableFloatVectors,
6068+ bit isSEWAware = 0> {
60566069 foreach fvtiToFWti = wlist in {
60576070 defvar fvti = fvtiToFWti.Vti;
60586071 defvar fwti = fvtiToFWti.Wti;
60596072 let Predicates = !listconcat(GetVTypePredicates<fvti>.Predicates,
60606073 GetVTypePredicates<fwti>.Predicates) in
60616074 defm : VPatConversionTARoundingMode<intrinsic, instruction, "W",
60626075 fvti.Vector, fwti.Vector, fvti.Mask, fvti.Log2SEW,
6063- fvti.LMul, fvti.RegClass, fwti.RegClass>;
6076+ fvti.LMul, fvti.RegClass, fwti.RegClass,
6077+ isSEWAware>;
60646078 }
60656079}
60666080
6067- multiclass VPatConversionVF_WF_BF_RM <string intrinsic, string instruction> {
6081+ multiclass VPatConversionVF_WF_BF_RM <string intrinsic, string instruction,
6082+ bit isSEWAware = 0> {
60686083 foreach fvtiToFWti = AllWidenableBFloatToFloatVectors in {
60696084 defvar fvti = fvtiToFWti.Vti;
60706085 defvar fwti = fvtiToFWti.Wti;
60716086 let Predicates = !listconcat(GetVTypePredicates<fvti>.Predicates,
60726087 GetVTypePredicates<fwti>.Predicates) in
60736088 defm : VPatConversionTARoundingMode<intrinsic, instruction, "W",
60746089 fvti.Vector, fwti.Vector, fvti.Mask, fvti.Log2SEW,
6075- fvti.LMul, fvti.RegClass, fwti.RegClass>;
6090+ fvti.LMul, fvti.RegClass, fwti.RegClass,
6091+ isSEWAware>;
60766092 }
60776093}
60786094
@@ -7320,21 +7336,24 @@ defm : VPatConversionVI_WF_RM<"int_riscv_vfncvt_xu_f_w", "PseudoVFNCVT_XU_F">;
73207336defm : VPatConversionVI_WF_RM<"int_riscv_vfncvt_x_f_w", "PseudoVFNCVT_X_F">;
73217337defm : VPatConversionVI_WF<"int_riscv_vfncvt_rtz_xu_f_w", "PseudoVFNCVT_RTZ_XU_F">;
73227338defm : VPatConversionVI_WF<"int_riscv_vfncvt_rtz_x_f_w", "PseudoVFNCVT_RTZ_X_F">;
7323- defm : VPatConversionVF_WI_RM <"int_riscv_vfncvt_f_xu_w", "PseudoVFNCVT_F_XU">;
7324- defm : VPatConversionVF_WI_RM <"int_riscv_vfncvt_f_x_w", "PseudoVFNCVT_F_X">;
7339+ defm : VPatConversionVF_WI_RM<"int_riscv_vfncvt_f_xu_w", "PseudoVFNCVT_F_XU",
7340+ isSEWAware=1>;
7341+ defm : VPatConversionVF_WI_RM<"int_riscv_vfncvt_f_x_w", "PseudoVFNCVT_F_X",
7342+ isSEWAware=1>;
73257343defvar WidenableFloatVectorsExceptF16 = !filter(fvtiToFWti, AllWidenableFloatVectors,
73267344 !ne(fvtiToFWti.Vti.Scalar, f16));
73277345defm : VPatConversionVF_WF_RM<"int_riscv_vfncvt_f_f_w", "PseudoVFNCVT_F_F",
7328- WidenableFloatVectorsExceptF16>;
7346+ WidenableFloatVectorsExceptF16, isSEWAware=1 >;
73297347// Define vfncvt.f.f.w for f16 when Zvfhmin is enable.
73307348defvar F16WidenableFloatVectors = !filter(fvtiToFWti, AllWidenableFloatVectors,
73317349 !eq(fvtiToFWti.Vti.Scalar, f16));
73327350let Predicates = [HasVInstructionsF16Minimal] in
73337351defm : VPatConversionVF_WF_RM<"int_riscv_vfncvt_f_f_w", "PseudoVFNCVT_F_F",
7334- F16WidenableFloatVectors>;
7352+ F16WidenableFloatVectors, isSEWAware=1 >;
73357353defm : VPatConversionVF_WF_BF_RM<"int_riscv_vfncvtbf16_f_f_w",
7336- "PseudoVFNCVTBF16_F_F">;
7337- defm : VPatConversionVF_WF<"int_riscv_vfncvt_rod_f_f_w", "PseudoVFNCVT_ROD_F_F">;
7354+ "PseudoVFNCVTBF16_F_F", isSEWAware=1>;
7355+ defm : VPatConversionVF_WF<"int_riscv_vfncvt_rod_f_f_w", "PseudoVFNCVT_ROD_F_F",
7356+ isSEWAware=1>;
73387357
73397358//===----------------------------------------------------------------------===//
73407359// 14. Vector Reduction Operations
0 commit comments