@@ -284,6 +284,20 @@ def SDTRVVVecReduce : SDTypeProfile<1, 5, [
284
284
SDTCVecEltisVT<4, i1>, SDTCisSameNumEltsAs<2, 4>, SDTCisVT<5, XLenVT>
285
285
]>;
286
286
287
+ def riscv_add_vl_oneuse : PatFrag<(ops node:$A, node:$B, node:$C, node:$D,
288
+ node:$E),
289
+ (riscv_add_vl node:$A, node:$B, node:$C,
290
+ node:$D, node:$E), [{
291
+ return N->hasOneUse();
292
+ }]>;
293
+
294
+ def riscv_sub_vl_oneuse : PatFrag<(ops node:$A, node:$B, node:$C, node:$D,
295
+ node:$E),
296
+ (riscv_sub_vl node:$A, node:$B, node:$C,
297
+ node:$D, node:$E), [{
298
+ return N->hasOneUse();
299
+ }]>;
300
+
287
301
def riscv_mul_vl_oneuse : PatFrag<(ops node:$A, node:$B, node:$C, node:$D,
288
302
node:$E),
289
303
(riscv_mul_vl node:$A, node:$B, node:$C,
@@ -1010,6 +1024,66 @@ multiclass VPatMultiplyAddVL_VV_VX<SDNode op, string instruction_name> {
1010
1024
}
1011
1025
}
1012
1026
1027
+ multiclass VPatMultiplyAccVL_VV_VX<PatFrag op, string instruction_name> {
1028
+ foreach vti = AllIntegerVectors in {
1029
+ defvar suffix = vti.LMul.MX;
1030
+ def : Pat<(riscv_vp_merge_vl (vti.Mask true_mask),
1031
+ (vti.Vector (op vti.RegClass:$rd,
1032
+ (riscv_mul_vl_oneuse vti.RegClass:$rs1, vti.RegClass:$rs2,
1033
+ srcvalue, (vti.Mask true_mask), VLOpFrag),
1034
+ srcvalue, (vti.Mask true_mask), VLOpFrag)),
1035
+ vti.RegClass:$rd, VLOpFrag),
1036
+ (!cast<Instruction>(instruction_name#"_VV_"# suffix)
1037
+ vti.RegClass:$rd, vti.RegClass:$rs1, vti.RegClass:$rs2,
1038
+ GPR:$vl, vti.Log2SEW, TAIL_UNDISTURBED_MASK_UNDISTURBED)>;
1039
+ def : Pat<(riscv_vp_merge_vl (vti.Mask V0),
1040
+ (vti.Vector (op vti.RegClass:$rd,
1041
+ (riscv_mul_vl_oneuse vti.RegClass:$rs1, vti.RegClass:$rs2,
1042
+ srcvalue, (vti.Mask true_mask), VLOpFrag),
1043
+ srcvalue, (vti.Mask true_mask), VLOpFrag)),
1044
+ vti.RegClass:$rd, VLOpFrag),
1045
+ (!cast<Instruction>(instruction_name#"_VV_"# suffix #"_MASK")
1046
+ vti.RegClass:$rd, vti.RegClass:$rs1, vti.RegClass:$rs2,
1047
+ (vti.Mask V0), GPR:$vl, vti.Log2SEW, TAIL_UNDISTURBED_MASK_UNDISTURBED)>;
1048
+ def : Pat<(riscv_vp_merge_vl (vti.Mask true_mask),
1049
+ (vti.Vector (op vti.RegClass:$rd,
1050
+ (riscv_mul_vl_oneuse (SplatPat XLenVT:$rs1), vti.RegClass:$rs2,
1051
+ srcvalue, (vti.Mask true_mask), VLOpFrag),
1052
+ srcvalue, (vti.Mask true_mask), VLOpFrag)),
1053
+ vti.RegClass:$rd, VLOpFrag),
1054
+ (!cast<Instruction>(instruction_name#"_VX_"# suffix)
1055
+ vti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2,
1056
+ GPR:$vl, vti.Log2SEW, TAIL_UNDISTURBED_MASK_UNDISTURBED)>;
1057
+ def : Pat<(riscv_vp_merge_vl (vti.Mask V0),
1058
+ (vti.Vector (op vti.RegClass:$rd,
1059
+ (riscv_mul_vl_oneuse (SplatPat XLenVT:$rs1), vti.RegClass:$rs2,
1060
+ srcvalue, (vti.Mask true_mask), VLOpFrag),
1061
+ srcvalue, (vti.Mask true_mask), VLOpFrag)),
1062
+ vti.RegClass:$rd, VLOpFrag),
1063
+ (!cast<Instruction>(instruction_name#"_VX_"# suffix #"_MASK")
1064
+ vti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2,
1065
+ (vti.Mask V0), GPR:$vl, vti.Log2SEW, TAIL_UNDISTURBED_MASK_UNDISTURBED)>;
1066
+ def : Pat<(riscv_vselect_vl (vti.Mask V0),
1067
+ (vti.Vector (op vti.RegClass:$rd,
1068
+ (riscv_mul_vl_oneuse vti.RegClass:$rs1, vti.RegClass:$rs2,
1069
+ srcvalue, (vti.Mask true_mask), VLOpFrag),
1070
+ srcvalue, (vti.Mask true_mask), VLOpFrag)),
1071
+ vti.RegClass:$rd, VLOpFrag),
1072
+ (!cast<Instruction>(instruction_name#"_VV_"# suffix #"_MASK")
1073
+ vti.RegClass:$rd, vti.RegClass:$rs1, vti.RegClass:$rs2,
1074
+ (vti.Mask V0), GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>;
1075
+ def : Pat<(riscv_vselect_vl (vti.Mask V0),
1076
+ (vti.Vector (op vti.RegClass:$rd,
1077
+ (riscv_mul_vl_oneuse (SplatPat XLenVT:$rs1), vti.RegClass:$rs2,
1078
+ srcvalue, (vti.Mask true_mask), VLOpFrag),
1079
+ srcvalue, (vti.Mask true_mask), VLOpFrag)),
1080
+ vti.RegClass:$rd, VLOpFrag),
1081
+ (!cast<Instruction>(instruction_name#"_VX_"# suffix #"_MASK")
1082
+ vti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2,
1083
+ (vti.Mask V0), GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>;
1084
+ }
1085
+ }
1086
+
1013
1087
multiclass VPatWidenMultiplyAddVL_VV_VX<PatFrag op1, string instruction_name> {
1014
1088
foreach vtiTowti = AllWidenableIntVectors in {
1015
1089
defvar vti = vtiTowti.Vti;
@@ -1315,6 +1389,8 @@ defm : VPatBinaryWVL_VV_VX<riscv_vwmulsu_vl, "PseudoVWMULSU">;
1315
1389
// 12.13 Vector Single-Width Integer Multiply-Add Instructions
1316
1390
defm : VPatMultiplyAddVL_VV_VX<riscv_add_vl, "PseudoVMADD">;
1317
1391
defm : VPatMultiplyAddVL_VV_VX<riscv_sub_vl, "PseudoVNMSUB">;
1392
+ defm : VPatMultiplyAccVL_VV_VX<riscv_add_vl_oneuse, "PseudoVMACC">;
1393
+ defm : VPatMultiplyAccVL_VV_VX<riscv_sub_vl_oneuse, "PseudoVNMSAC">;
1318
1394
1319
1395
// 12.14. Vector Widening Integer Multiply-Add Instructions
1320
1396
defm : VPatWidenMultiplyAddVL_VV_VX<riscv_vwmul_vl_oneuse, "PseudoVWMACC">;
0 commit comments