@@ -3593,12 +3593,15 @@ multiclass VPseudoConversionRoundingMode<VReg RetClass,
35933593 VReg Op1Class,
35943594 LMULInfo MInfo,
35953595 string Constraint = "",
3596+ int sew = 0,
35963597 int TargetConstraintType = 1> {
35973598 let VLMul = MInfo.value in {
3598- def "_" # MInfo.MX : VPseudoUnaryNoMaskRoundingMode<RetClass, Op1Class, Constraint, TargetConstraintType>;
3599- def "_" # MInfo.MX # "_MASK" : VPseudoUnaryMaskRoundingMode<RetClass, Op1Class,
3600- Constraint, TargetConstraintType>,
3601- RISCVMaskedPseudo<MaskIdx=2>;
3599+ defvar suffix = !if(sew, "_" # MInfo.MX # "_E" # sew, "_" # MInfo.MX);
3600+ def suffix : VPseudoUnaryNoMaskRoundingMode<RetClass, Op1Class, Constraint, TargetConstraintType>;
3601+ def suffix # "_MASK" : VPseudoUnaryMaskRoundingMode<RetClass, Op1Class,
3602+ Constraint,
3603+ TargetConstraintType>,
3604+ RISCVMaskedPseudo<MaskIdx=2>;
36023605 }
36033606}
36043607
@@ -3607,13 +3610,15 @@ multiclass VPseudoConversionRM<VReg RetClass,
36073610 VReg Op1Class,
36083611 LMULInfo MInfo,
36093612 string Constraint = "",
3613+ int sew = 0,
36103614 int TargetConstraintType = 1> {
36113615 let VLMul = MInfo.value in {
3612- def "_" # MInfo.MX : VPseudoUnaryNoMask_FRM<RetClass, Op1Class,
3613- Constraint, TargetConstraintType>;
3614- def "_" # MInfo.MX # "_MASK" : VPseudoUnaryMask_FRM<RetClass, Op1Class,
3615- Constraint, TargetConstraintType>,
3616- RISCVMaskedPseudo<MaskIdx=2>;
3616+ defvar suffix = !if(sew, "_" # MInfo.MX # "_E" # sew, "_" # MInfo.MX);
3617+ def suffix : VPseudoUnaryNoMask_FRM<RetClass, Op1Class,
3618+ Constraint, TargetConstraintType>;
3619+ def suffix # "_MASK" : VPseudoUnaryMask_FRM<RetClass, Op1Class,
3620+ Constraint, TargetConstraintType>,
3621+ RISCVMaskedPseudo<MaskIdx=2>;
36173622 }
36183623}
36193624
@@ -3660,17 +3665,19 @@ multiclass VPseudoVFROUND_NOEXCEPT_V {
36603665
36613666multiclass VPseudoVCVTF_V_RM {
36623667 foreach m = MxListF in {
3663- defm _V : VPseudoConversionRoundingMode<m.vrclass, m.vrclass, m>,
3664- SchedUnary<"WriteVFCvtIToFV", "ReadVFCvtIToFV", m.MX,
3665- forceMergeOpRead=true>;
3668+ foreach e = SchedSEWSet<m.MX, isF=1>.val in
3669+ defm _V : VPseudoConversionRoundingMode<m.vrclass, m.vrclass, m, sew=e>,
3670+ SchedUnary<"WriteVFCvtIToFV", "ReadVFCvtIToFV", m.MX, e,
3671+ forceMergeOpRead=true>;
36663672 }
36673673}
36683674
36693675multiclass VPseudoVCVTF_RM_V {
36703676 foreach m = MxListF in {
3671- defm _V : VPseudoConversionRM<m.vrclass, m.vrclass, m>,
3672- SchedUnary<"WriteVFCvtIToFV", "ReadVFCvtIToFV", m.MX,
3673- forceMergeOpRead=true>;
3677+ foreach e = SchedSEWSet<m.MX, isF=1>.val in
3678+ defm _V : VPseudoConversionRM<m.vrclass, m.vrclass, m, sew=e>,
3679+ SchedUnary<"WriteVFCvtIToFV", "ReadVFCvtIToFV", m.MX, e,
3680+ forceMergeOpRead=true>;
36743681 }
36753682}
36763683
@@ -4905,14 +4912,17 @@ multiclass VPatConversionTARoundingMode<string intrinsic,
49054912 ValueType result_type,
49064913 ValueType op1_type,
49074914 ValueType mask_type,
4908- int sew ,
4915+ int log2sew ,
49094916 LMULInfo vlmul,
49104917 VReg result_reg_class,
4911- VReg op1_reg_class> {
4918+ VReg op1_reg_class,
4919+ bit isSEWAware = 0> {
49124920 def : VPatUnaryNoMaskRoundingMode<intrinsic, inst, kind, result_type, op1_type,
4913- sew, vlmul, result_reg_class, op1_reg_class>;
4921+ log2sew, vlmul, result_reg_class,
4922+ op1_reg_class, isSEWAware>;
49144923 def : VPatUnaryMaskRoundingMode<intrinsic, inst, kind, result_type, op1_type,
4915- mask_type, sew, vlmul, result_reg_class, op1_reg_class>;
4924+ mask_type, log2sew, vlmul, result_reg_class,
4925+ op1_reg_class, isSEWAware>;
49164926}
49174927
49184928multiclass VPatBinaryV_VV<string intrinsic, string instruction,
@@ -5905,15 +5915,16 @@ multiclass VPatConversionVI_VF_RM<string intrinsic,
59055915 }
59065916}
59075917
5908- multiclass VPatConversionVF_VI_RM<string intrinsic,
5909- string instruction > {
5918+ multiclass VPatConversionVF_VI_RM<string intrinsic, string instruction,
5919+ bit isSEWAware = 0 > {
59105920 foreach fvti = AllFloatVectors in {
59115921 defvar ivti = GetIntVTypeInfo<fvti>.Vti;
59125922 let Predicates = !listconcat(GetVTypePredicates<fvti>.Predicates,
59135923 GetVTypePredicates<ivti>.Predicates) in
59145924 defm : VPatConversionTARoundingMode<intrinsic, instruction, "V",
59155925 fvti.Vector, ivti.Vector, fvti.Mask, ivti.Log2SEW,
5916- ivti.LMul, fvti.RegClass, ivti.RegClass>;
5926+ ivti.LMul, fvti.RegClass, ivti.RegClass,
5927+ isSEWAware>;
59175928 }
59185929}
59195930
@@ -7269,8 +7280,10 @@ defm : VPatConversionVI_VF_RM<"int_riscv_vfcvt_x_f_v", "PseudoVFCVT_X_F">;
72697280defm : VPatConversionVI_VF_RM<"int_riscv_vfcvt_xu_f_v", "PseudoVFCVT_XU_F">;
72707281defm : VPatConversionVI_VF<"int_riscv_vfcvt_rtz_xu_f_v", "PseudoVFCVT_RTZ_XU_F">;
72717282defm : VPatConversionVI_VF<"int_riscv_vfcvt_rtz_x_f_v", "PseudoVFCVT_RTZ_X_F">;
7272- defm : VPatConversionVF_VI_RM<"int_riscv_vfcvt_f_x_v", "PseudoVFCVT_F_X">;
7273- defm : VPatConversionVF_VI_RM<"int_riscv_vfcvt_f_xu_v", "PseudoVFCVT_F_XU">;
7283+ defm : VPatConversionVF_VI_RM<"int_riscv_vfcvt_f_x_v", "PseudoVFCVT_F_X",
7284+ isSEWAware=1>;
7285+ defm : VPatConversionVF_VI_RM<"int_riscv_vfcvt_f_xu_v", "PseudoVFCVT_F_XU",
7286+ isSEWAware=1>;
72747287
72757288//===----------------------------------------------------------------------===//
72767289// 13.18. Widening Floating-Point/Integer Type-Convert Instructions
0 commit comments