Skip to content

Commit 2749b94

Browse files
author
Yeting Kuo
committed
[RISCV] Add isel patterns for vmacc, vnmsac.
The patch selects VSELECT/VP_MERGE_VL which uses fmadd/fnmsub as true operand and the adden of the fmadd/fnmsub as false operand. Reviewed By: craig.topper Differential Revision: https://reviews.llvm.org/D135330
1 parent 23f989a commit 2749b94

File tree

5 files changed

+8830
-0
lines changed

5 files changed

+8830
-0
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfoVVLPatterns.td

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,20 @@ def SDTRVVVecReduce : SDTypeProfile<1, 5, [
284284
SDTCVecEltisVT<4, i1>, SDTCisSameNumEltsAs<2, 4>, SDTCisVT<5, XLenVT>
285285
]>;
286286

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+
287301
def riscv_mul_vl_oneuse : PatFrag<(ops node:$A, node:$B, node:$C, node:$D,
288302
node:$E),
289303
(riscv_mul_vl node:$A, node:$B, node:$C,
@@ -1010,6 +1024,66 @@ multiclass VPatMultiplyAddVL_VV_VX<SDNode op, string instruction_name> {
10101024
}
10111025
}
10121026

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+
10131087
multiclass VPatWidenMultiplyAddVL_VV_VX<PatFrag op1, string instruction_name> {
10141088
foreach vtiTowti = AllWidenableIntVectors in {
10151089
defvar vti = vtiTowti.Vti;
@@ -1315,6 +1389,8 @@ defm : VPatBinaryWVL_VV_VX<riscv_vwmulsu_vl, "PseudoVWMULSU">;
13151389
// 12.13 Vector Single-Width Integer Multiply-Add Instructions
13161390
defm : VPatMultiplyAddVL_VV_VX<riscv_add_vl, "PseudoVMADD">;
13171391
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">;
13181394

13191395
// 12.14. Vector Widening Integer Multiply-Add Instructions
13201396
defm : VPatWidenMultiplyAddVL_VV_VX<riscv_vwmul_vl_oneuse, "PseudoVWMACC">;

0 commit comments

Comments
 (0)