@@ -1584,6 +1584,23 @@ class XVPseudoTiedBinaryMask<VReg RetClass,
1584
1584
let IsTiedPseudo = 1;
1585
1585
}
1586
1586
1587
+ class XVPseudoBinaryMaskNoPolicy<VReg RetClass,
1588
+ RegisterClass Op1Class,
1589
+ DAGOperand Op2Class,
1590
+ string Constraint> :
1591
+ Pseudo<(outs GetVRegNoV0<RetClass>.R:$rd),
1592
+ (ins GetVRegNoV0<RetClass>.R:$merge,
1593
+ Op1Class:$rs2, Op2Class:$rs1,
1594
+ VMaskOp:$vm, AVL:$vl, ixlenimm:$sew), []>,
1595
+ RISCVVPseudo {
1596
+ let mayLoad = 0;
1597
+ let mayStore = 0;
1598
+ let hasSideEffects = 0;
1599
+ let Constraints = !interleave([Constraint, "$rd = $merge"], ",");
1600
+ let HasVLOp = 1;
1601
+ let HasSEWOp = 1;
1602
+ }
1603
+
1587
1604
multiclass XVPseudoBinary<VReg RetClass,
1588
1605
VReg Op1Class,
1589
1606
DAGOperand Op2Class,
@@ -1612,6 +1629,20 @@ multiclass XVPseudoTiedBinary<VReg RetClass,
1612
1629
}
1613
1630
}
1614
1631
1632
+ multiclass XVPseudoTernaryNoPolicy<VReg RetClass,
1633
+ RegisterClass Op1Class,
1634
+ DAGOperand Op2Class,
1635
+ LMULInfo MInfo,
1636
+ string Constraint = "",
1637
+ bit Commutable = 0> {
1638
+ let VLMul = MInfo.value in {
1639
+ let isCommutable = Commutable in
1640
+ def "_" # MInfo.MX : VPseudoTernaryNoMask<RetClass, Op1Class, Op2Class, Constraint>;
1641
+ def "_" # MInfo.MX # "_MASK" : XVPseudoBinaryMaskNoPolicy<RetClass, Op1Class, Op2Class, Constraint>,
1642
+ RISCVMaskedPseudo<MaskIdx=3>;
1643
+ }
1644
+ }
1645
+
1615
1646
multiclass XVPseudoBinaryV_VV<LMULInfo m, string Constraint = "", int sew = 0> {
1616
1647
defm _VV : XVPseudoBinary<m.vrclass, m.vrclass, m.vrclass, m, Constraint, sew>;
1617
1648
}
@@ -1667,6 +1698,16 @@ multiclass XVPseudoBinaryVNSHT_VI<LMULInfo m> {
1667
1698
!if(!ge(m.octuple, 8), "@earlyclobber $rd", "")>;
1668
1699
}
1669
1700
1701
+ multiclass XVPseudoTernaryV_VV_AAXA<LMULInfo m, string Constraint = ""> {
1702
+ defm _VV : XVPseudoTernaryNoPolicy<m.vrclass, m.vrclass, m.vrclass, m,
1703
+ Constraint, Commutable=1>;
1704
+ }
1705
+
1706
+ multiclass XVPseudoTernaryV_VX_AAXA<LMULInfo m, string Constraint = ""> {
1707
+ defm _VX : XVPseudoTernaryNoPolicy<m.vrclass, GPR, m.vrclass, m,
1708
+ Constraint, Commutable=1>;
1709
+ }
1710
+
1670
1711
multiclass XVPseudoVALU_VV_VX_VI<Operand ImmType = simm5, string Constraint = ""> {
1671
1712
foreach m = MxListXTHeadV in {
1672
1713
defvar mx = m.MX;
@@ -1961,6 +2002,23 @@ multiclass XVPseudoVWMUL_VV_VX {
1961
2002
}
1962
2003
}
1963
2004
2005
+ multiclass XVPseudoVMAC_VV_VX_AAXA<string Constraint = ""> {
2006
+ foreach m = MxListXTHeadV in {
2007
+ defvar mx = m.MX;
2008
+ defvar WriteVIMulAddV_MX = !cast<SchedWrite>("WriteVIMulAddV_" # mx);
2009
+ defvar WriteVIMulAddX_MX = !cast<SchedWrite>("WriteVIMulAddX_" # mx);
2010
+ defvar ReadVIMulAddV_MX = !cast<SchedRead>("ReadVIMulAddV_" # mx);
2011
+ defvar ReadVIMulAddX_MX = !cast<SchedRead>("ReadVIMulAddX_" # mx);
2012
+
2013
+ defm "" : XVPseudoTernaryV_VV_AAXA<m, Constraint>,
2014
+ Sched<[WriteVIMulAddV_MX, ReadVIMulAddV_MX, ReadVIMulAddV_MX,
2015
+ ReadVIMulAddV_MX, ReadVMask]>;
2016
+ defm "" : XVPseudoTernaryV_VX_AAXA<m, Constraint>,
2017
+ Sched<[WriteVIMulAddX_MX, ReadVIMulAddV_MX, ReadVIMulAddV_MX,
2018
+ ReadVIMulAddX_MX, ReadVMask]>;
2019
+ }
2020
+ }
2021
+
1964
2022
//===----------------------------------------------------------------------===//
1965
2023
// Helpers to define the intrinsic patterns for the XTHeadVector extension.
1966
2024
//===----------------------------------------------------------------------===//
@@ -2331,6 +2389,27 @@ multiclass XVPseudoVMINMAX_VV_VX {
2331
2389
}
2332
2390
}
2333
2391
2392
+ multiclass XVPatTernaryV_VV_AAXA<string intrinsic, string instruction,
2393
+ list<VTypeInfo> vtilist> {
2394
+ foreach vti = vtilist in
2395
+ let Predicates = GetXVTypePredicates<vti>.Predicates in
2396
+ defm : VPatTernary<intrinsic, instruction, "VV",
2397
+ vti.Vector, vti.Vector, vti.Vector, vti.Mask,
2398
+ vti.Log2SEW, vti.LMul, vti.RegClass,
2399
+ vti.RegClass, vti.RegClass>;
2400
+ }
2401
+
2402
+ multiclass XVPatTernaryV_VX_AAXA<string intrinsic, string instruction,
2403
+ list<VTypeInfo> vtilist> {
2404
+ foreach vti = vtilist in
2405
+ let Predicates = GetXVTypePredicates<vti>.Predicates in
2406
+ defm : VPatTernary<intrinsic, instruction,
2407
+ "V"#vti.ScalarSuffix,
2408
+ vti.Vector, vti.Scalar, vti.Vector, vti.Mask,
2409
+ vti.Log2SEW, vti.LMul, vti.RegClass,
2410
+ vti.ScalarRegClass, vti.RegClass>;
2411
+ }
2412
+
2334
2413
multiclass XVPatBinaryV_VV_VX_VI<string intrinsic, string instruction,
2335
2414
list<VTypeInfo> vtilist, Operand ImmType = simm5>
2336
2415
: XVPatBinaryV_VV<intrinsic, instruction, vtilist>,
@@ -2397,6 +2476,11 @@ multiclass XVPatBinaryM_VX_VI<string intrinsic, string instruction,
2397
2476
: XVPatBinaryM_VX<intrinsic, instruction, vtilist>,
2398
2477
XVPatBinaryM_VI<intrinsic, instruction, vtilist>;
2399
2478
2479
+ multiclass XVPatTernaryV_VV_VX_AAXA<string intrinsic, string instruction,
2480
+ list<VTypeInfo> vtilist>
2481
+ : XVPatTernaryV_VV_AAXA<intrinsic, instruction, vtilist>,
2482
+ XVPatTernaryV_VX_AAXA<intrinsic, instruction, vtilist>;
2483
+
2400
2484
//===----------------------------------------------------------------------===//
2401
2485
// 12.1. Vector Single-Width Saturating Add and Subtract
2402
2486
//===----------------------------------------------------------------------===//
@@ -2674,6 +2758,23 @@ let Predicates = [HasVendorXTHeadV] in {
2674
2758
defm : XVPatBinaryW_VV_VX<"int_riscv_th_vwmulsu", "PseudoTH_VWMULSU", AllWidenableIntXVectors>;
2675
2759
} // Predicates = [HasVendorXTHeadV]
2676
2760
2761
+ //===----------------------------------------------------------------------===//
2762
+ // 12.12. Vector Single-Width Integer Multiply-Add Instructions
2763
+ //===----------------------------------------------------------------------===//
2764
+ let Predicates = [HasVendorXTHeadV] in {
2765
+ defm PseudoTH_VMACC : XVPseudoVMAC_VV_VX_AAXA;
2766
+ defm PseudoTH_VNMSAC : XVPseudoVMAC_VV_VX_AAXA;
2767
+ defm PseudoTH_VMADD : XVPseudoVMAC_VV_VX_AAXA;
2768
+ defm PseudoTH_VNMSUB : XVPseudoVMAC_VV_VX_AAXA;
2769
+ } // Predicates = [HasVendorXTHeadV]
2770
+
2771
+ let Predicates = [HasVendorXTHeadV] in {
2772
+ defm : XVPatTernaryV_VV_VX_AAXA<"int_riscv_th_vmadd", "PseudoTH_VMADD", AllIntegerXVectors>;
2773
+ defm : XVPatTernaryV_VV_VX_AAXA<"int_riscv_th_vnmsub", "PseudoTH_VNMSUB", AllIntegerXVectors>;
2774
+ defm : XVPatTernaryV_VV_VX_AAXA<"int_riscv_th_vmacc", "PseudoTH_VMACC", AllIntegerXVectors>;
2775
+ defm : XVPatTernaryV_VV_VX_AAXA<"int_riscv_th_vnmsac", "PseudoTH_VNMSAC", AllIntegerXVectors>;
2776
+ } // Predicates = [HasVendorXTHeadV]
2777
+
2677
2778
//===----------------------------------------------------------------------===//
2678
2779
// 12.14. Vector Integer Merge and Move Instructions
2679
2780
//===----------------------------------------------------------------------===//
0 commit comments