@@ -3580,12 +3580,14 @@ multiclass VPseudoConversion<VReg RetClass,
35803580 VReg Op1Class,
35813581 LMULInfo MInfo,
35823582 string Constraint = "",
3583+ int sew = 0,
35833584 int TargetConstraintType = 1> {
3585+ defvar suffix = !if(sew, "_" # MInfo.MX # "_E" # sew, "_" # MInfo.MX);
35843586 let VLMul = MInfo.value in {
3585- def "_" # MInfo.MX : VPseudoUnaryNoMask<RetClass, Op1Class, Constraint, TargetConstraintType>;
3586- def "_" # MInfo.MX # "_MASK" : VPseudoUnaryMask<RetClass, Op1Class,
3587- Constraint, TargetConstraintType>,
3588- RISCVMaskedPseudo<MaskIdx=2>;
3587+ def suffix : VPseudoUnaryNoMask<RetClass, Op1Class, Constraint, TargetConstraintType>;
3588+ def suffix # "_MASK" : VPseudoUnaryMask<RetClass, Op1Class,
3589+ Constraint, TargetConstraintType>,
3590+ RISCVMaskedPseudo<MaskIdx=2>;
35893591 }
35903592}
35913593
@@ -3711,18 +3713,22 @@ multiclass VPseudoVWCVTI_RM_V {
37113713multiclass VPseudoVWCVTF_V {
37123714 defvar constraint = "@earlyclobber $rd";
37133715 foreach m = MxListW in {
3714- defm _V : VPseudoConversion<m.wvrclass, m.vrclass, m, constraint, TargetConstraintType=3>,
3715- SchedUnary<"WriteVFWCvtIToFV", "ReadVFWCvtIToFV", m.MX,
3716- forceMergeOpRead=true>;
3716+ foreach e = SchedSEWSet<m.MX, isF=0, isWidening=1>.val in
3717+ defm _V : VPseudoConversion<m.wvrclass, m.vrclass, m, constraint, sew=e,
3718+ TargetConstraintType=3>,
3719+ SchedUnary<"WriteVFWCvtIToFV", "ReadVFWCvtIToFV", m.MX, e,
3720+ forceMergeOpRead=true>;
37173721 }
37183722}
37193723
37203724multiclass VPseudoVWCVTD_V {
37213725 defvar constraint = "@earlyclobber $rd";
37223726 foreach m = MxListFW in {
3723- defm _V : VPseudoConversion<m.wvrclass, m.vrclass, m, constraint, TargetConstraintType=3>,
3724- SchedUnary<"WriteVFWCvtFToFV", "ReadVFWCvtFToFV", m.MX,
3725- forceMergeOpRead=true>;
3727+ foreach e = SchedSEWSet<m.MX, isF=1, isWidening=1>.val in
3728+ defm _V : VPseudoConversion<m.wvrclass, m.vrclass, m, constraint, sew=e,
3729+ TargetConstraintType=3>,
3730+ SchedUnary<"WriteVFWCvtFToFV", "ReadVFWCvtFToFV", m.MX, e,
3731+ forceMergeOpRead=true>;
37263732 }
37273733}
37283734
@@ -4896,14 +4902,17 @@ multiclass VPatConversionTA<string intrinsic,
48964902 ValueType result_type,
48974903 ValueType op1_type,
48984904 ValueType mask_type,
4899- int sew ,
4905+ int log2sew ,
49004906 LMULInfo vlmul,
49014907 VReg result_reg_class,
4902- VReg op1_reg_class> {
4908+ VReg op1_reg_class,
4909+ bit isSEWAware = 0> {
49034910 def : VPatUnaryNoMask<intrinsic, inst, kind, result_type, op1_type,
4904- sew, vlmul, result_reg_class, op1_reg_class>;
4911+ log2sew, vlmul, result_reg_class, op1_reg_class,
4912+ isSEWAware>;
49054913 def : VPatUnaryMask<intrinsic, inst, kind, result_type, op1_type,
4906- mask_type, sew, vlmul, result_reg_class, op1_reg_class>;
4914+ mask_type, log2sew, vlmul, result_reg_class, op1_reg_class,
4915+ isSEWAware>;
49074916}
49084917
49094918multiclass VPatConversionTARoundingMode<string intrinsic,
@@ -5952,19 +5961,21 @@ multiclass VPatConversionWI_VF_RM<string intrinsic, string instruction> {
59525961 }
59535962}
59545963
5955- multiclass VPatConversionWF_VI<string intrinsic, string instruction> {
5964+ multiclass VPatConversionWF_VI<string intrinsic, string instruction,
5965+ bit isSEWAware = 0> {
59565966 foreach vtiToWti = AllWidenableIntToFloatVectors in {
59575967 defvar vti = vtiToWti.Vti;
59585968 defvar fwti = vtiToWti.Wti;
59595969 let Predicates = !listconcat(GetVTypePredicates<vti>.Predicates,
59605970 GetVTypePredicates<fwti>.Predicates) in
59615971 defm : VPatConversionTA<intrinsic, instruction, "V",
59625972 fwti.Vector, vti.Vector, fwti.Mask, vti.Log2SEW,
5963- vti.LMul, fwti.RegClass, vti.RegClass>;
5973+ vti.LMul, fwti.RegClass, vti.RegClass, isSEWAware >;
59645974 }
59655975}
59665976
5967- multiclass VPatConversionWF_VF<string intrinsic, string instruction> {
5977+ multiclass VPatConversionWF_VF<string intrinsic, string instruction,
5978+ bit isSEWAware = 0> {
59685979 foreach fvtiToFWti = AllWidenableFloatVectors in {
59695980 defvar fvti = fvtiToFWti.Vti;
59705981 defvar fwti = fvtiToFWti.Wti;
@@ -5974,11 +5985,12 @@ multiclass VPatConversionWF_VF<string intrinsic, string instruction> {
59745985 GetVTypePredicates<fwti>.Predicates)) in
59755986 defm : VPatConversionTA<intrinsic, instruction, "V",
59765987 fwti.Vector, fvti.Vector, fwti.Mask, fvti.Log2SEW,
5977- fvti.LMul, fwti.RegClass, fvti.RegClass>;
5988+ fvti.LMul, fwti.RegClass, fvti.RegClass, isSEWAware >;
59785989 }
59795990}
59805991
5981- multiclass VPatConversionWF_VF_BF <string intrinsic, string instruction> {
5992+ multiclass VPatConversionWF_VF_BF <string intrinsic, string instruction,
5993+ bit isSEWAware = 0> {
59825994 foreach fvtiToFWti = AllWidenableBFloatToFloatVectors in
59835995 {
59845996 defvar fvti = fvtiToFWti.Vti;
@@ -5987,7 +5999,7 @@ multiclass VPatConversionWF_VF_BF <string intrinsic, string instruction> {
59875999 GetVTypePredicates<fwti>.Predicates) in
59886000 defm : VPatConversionTA<intrinsic, instruction, "V",
59896001 fwti.Vector, fvti.Vector, fwti.Mask, fvti.Log2SEW,
5990- fvti.LMul, fwti.RegClass, fvti.RegClass>;
6002+ fvti.LMul, fwti.RegClass, fvti.RegClass, isSEWAware >;
59916003 }
59926004}
59936005
@@ -7292,11 +7304,14 @@ defm : VPatConversionWI_VF_RM<"int_riscv_vfwcvt_xu_f_v", "PseudoVFWCVT_XU_F">;
72927304defm : VPatConversionWI_VF_RM<"int_riscv_vfwcvt_x_f_v", "PseudoVFWCVT_X_F">;
72937305defm : VPatConversionWI_VF<"int_riscv_vfwcvt_rtz_xu_f_v", "PseudoVFWCVT_RTZ_XU_F">;
72947306defm : VPatConversionWI_VF<"int_riscv_vfwcvt_rtz_x_f_v", "PseudoVFWCVT_RTZ_X_F">;
7295- defm : VPatConversionWF_VI<"int_riscv_vfwcvt_f_xu_v", "PseudoVFWCVT_F_XU">;
7296- defm : VPatConversionWF_VI<"int_riscv_vfwcvt_f_x_v", "PseudoVFWCVT_F_X">;
7297- defm : VPatConversionWF_VF<"int_riscv_vfwcvt_f_f_v", "PseudoVFWCVT_F_F">;
7307+ defm : VPatConversionWF_VI<"int_riscv_vfwcvt_f_xu_v", "PseudoVFWCVT_F_XU",
7308+ isSEWAware=1>;
7309+ defm : VPatConversionWF_VI<"int_riscv_vfwcvt_f_x_v", "PseudoVFWCVT_F_X",
7310+ isSEWAware=1>;
7311+ defm : VPatConversionWF_VF<"int_riscv_vfwcvt_f_f_v", "PseudoVFWCVT_F_F",
7312+ isSEWAware=1>;
72987313defm : VPatConversionWF_VF_BF<"int_riscv_vfwcvtbf16_f_f_v",
7299- "PseudoVFWCVTBF16_F_F">;
7314+ "PseudoVFWCVTBF16_F_F", isSEWAware=1 >;
73007315
73017316//===----------------------------------------------------------------------===//
73027317// 13.19. Narrowing Floating-Point/Integer Type-Convert Instructions
0 commit comments