Skip to content

Commit b15ba2c

Browse files
committed
[RISCV] Add intrinsics for vmacc/vnmsac/vmadd/vnmsub instructions
This defines vmadd, vmacc, vnmsub, and vnmsac intrinsics and lower to V instructions. Authored-by: Roger Ferrer Ibanez <[email protected]> Co-Authored-by: ShihPo Hung <[email protected]> Differential Revision: https://reviews.llvm.org/D93632
1 parent 6e2af4d commit b15ba2c

File tree

10 files changed

+11174
-0
lines changed

10 files changed

+11174
-0
lines changed

llvm/include/llvm/IR/IntrinsicsRISCV.td

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,20 @@ let TargetPrefix = "riscv" in {
304304
[LLVMMatchType<0>, LLVMMatchType<0>, llvm_anyint_ty,
305305
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>, LLVMMatchType<1>],
306306
[IntrNoMem]>, RISCVVIntrinsic;
307+
class RISCVTernaryAAXANoMask
308+
: Intrinsic<[llvm_anyvector_ty],
309+
[LLVMMatchType<0>, llvm_any_ty, LLVMMatchType<0>,
310+
llvm_anyint_ty],
311+
[IntrNoMem]>, RISCVVIntrinsic {
312+
let ExtendOperand = 2;
313+
}
314+
class RISCVTernaryAAXAMask
315+
: Intrinsic<[llvm_anyvector_ty],
316+
[LLVMMatchType<0>, llvm_any_ty, LLVMMatchType<0>,
317+
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>, llvm_anyint_ty],
318+
[IntrNoMem]>, RISCVVIntrinsic {
319+
let ExtendOperand = 2;
320+
}
307321

308322
multiclass RISCVUSLoad {
309323
def "int_riscv_" # NAME : RISCVUSLoad;
@@ -358,6 +372,10 @@ let TargetPrefix = "riscv" in {
358372
def "int_riscv_" # NAME : RISCVTernaryAAAXNoMask;
359373
def "int_riscv_" # NAME # "_mask" : RISCVTernaryAAAXMask;
360374
}
375+
multiclass RISCVTernaryAAXA {
376+
def "int_riscv_" # NAME : RISCVTernaryAAXANoMask;
377+
def "int_riscv_" # NAME # "_mask" : RISCVTernaryAAXAMask;
378+
}
361379

362380
defm vle : RISCVUSLoad;
363381
defm vse : RISCVUSStore;
@@ -418,6 +436,11 @@ let TargetPrefix = "riscv" in {
418436
defm vwmulu : RISCVBinaryABX;
419437
defm vwmulsu : RISCVBinaryABX;
420438

439+
defm vmacc : RISCVTernaryAAXA;
440+
defm vnmsac : RISCVTernaryAAXA;
441+
defm vmadd : RISCVTernaryAAXA;
442+
defm vnmsub : RISCVTernaryAAXA;
443+
421444
defm vfadd : RISCVBinaryAAX;
422445
defm vfsub : RISCVBinaryAAX;
423446
defm vfrsub : RISCVBinaryAAX;

llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -854,16 +854,31 @@ multiclass VPseudoTernary<VReg RetClass,
854854
}
855855
}
856856

857+
multiclass VPseudoTernaryV_VV<string Constraint = ""> {
858+
foreach m = MxList.m in
859+
defm _VV : VPseudoTernary<m.vrclass, m.vrclass, m.vrclass, m, Constraint>;
860+
}
861+
857862
multiclass VPseudoTernaryV_VX<string Constraint = ""> {
858863
foreach m = MxList.m in
859864
defm _VX : VPseudoTernary<m.vrclass, m.vrclass, GPR, m, Constraint>;
860865
}
861866

867+
multiclass VPseudoTernaryV_VX_AAXA<string Constraint = ""> {
868+
foreach m = MxList.m in
869+
defm _VX : VPseudoTernary<m.vrclass, GPR, m.vrclass, m, Constraint>;
870+
}
871+
862872
multiclass VPseudoTernaryV_VI<Operand ImmType = simm5, string Constraint = ""> {
863873
foreach m = MxList.m in
864874
defm _VI : VPseudoTernary<m.vrclass, m.vrclass, ImmType, m, Constraint>;
865875
}
866876

877+
multiclass VPseudoTernaryV_VV_VX_AAXA<string Constraint = ""> {
878+
defm "" : VPseudoTernaryV_VV<Constraint>;
879+
defm "" : VPseudoTernaryV_VX_AAXA<Constraint>;
880+
}
881+
867882
multiclass VPseudoTernaryV_VX_VI<Operand ImmType = simm5, string Constraint = ""> {
868883
defm "" : VPseudoTernaryV_VX<Constraint>;
869884
defm "" : VPseudoTernaryV_VI<ImmType, Constraint>;
@@ -1475,6 +1490,15 @@ multiclass VPatTernary<string intrinsic,
14751490
op2_kind>;
14761491
}
14771492

1493+
multiclass VPatTernaryV_VV<string intrinsic, string instruction,
1494+
list<VTypeInfo> vtilist> {
1495+
foreach vti = vtilist in
1496+
defm : VPatTernary<intrinsic, instruction, "VV",
1497+
vti.Vector, vti.Vector, vti.Vector, vti.Mask,
1498+
vti.SEW, vti.LMul, vti.RegClass,
1499+
vti.RegClass, vti.RegClass>;
1500+
}
1501+
14781502
multiclass VPatTernaryV_VX<string intrinsic, string instruction,
14791503
list<VTypeInfo> vtilist> {
14801504
foreach vti = vtilist in
@@ -1484,6 +1508,15 @@ multiclass VPatTernaryV_VX<string intrinsic, string instruction,
14841508
vti.RegClass, GPR>;
14851509
}
14861510

1511+
multiclass VPatTernaryV_VX_AAXA<string intrinsic, string instruction,
1512+
list<VTypeInfo> vtilist> {
1513+
foreach vti = vtilist in
1514+
defm : VPatTernary<intrinsic, instruction, "VX",
1515+
vti.Vector, vti.Scalar, vti.Vector, vti.Mask,
1516+
vti.SEW, vti.LMul, vti.RegClass,
1517+
vti.ScalarRegClass, vti.RegClass>;
1518+
}
1519+
14871520
multiclass VPatTernaryV_VI<string intrinsic, string instruction,
14881521
list<VTypeInfo> vtilist, Operand Imm_type> {
14891522
foreach vti = vtilist in
@@ -1493,6 +1526,12 @@ multiclass VPatTernaryV_VI<string intrinsic, string instruction,
14931526
vti.RegClass, Imm_type>;
14941527
}
14951528

1529+
multiclass VPatTernaryV_VV_VX_AAXA<string intrinsic, string instruction,
1530+
list<VTypeInfo> vtilist> {
1531+
defm "" : VPatTernaryV_VV<intrinsic, instruction, vtilist>;
1532+
defm "" : VPatTernaryV_VX_AAXA<intrinsic, instruction, vtilist>;
1533+
}
1534+
14961535
multiclass VPatTernaryV_VX_VI<string intrinsic, string instruction,
14971536
list<VTypeInfo> vtilist, Operand Imm_type = simm5> {
14981537
defm "" : VPatTernaryV_VX<intrinsic, instruction, vtilist>;
@@ -1649,6 +1688,14 @@ defm PseudoVWMUL : VPseudoBinaryW_VV_VX;
16491688
defm PseudoVWMULU : VPseudoBinaryW_VV_VX;
16501689
defm PseudoVWMULSU : VPseudoBinaryW_VV_VX;
16511690

1691+
//===----------------------------------------------------------------------===//
1692+
// 12.13. Vector Single-Width Integer Multiply-Add Instructions
1693+
//===----------------------------------------------------------------------===//
1694+
defm PseudoVMACC : VPseudoTernaryV_VV_VX_AAXA;
1695+
defm PseudoVNMSAC : VPseudoTernaryV_VV_VX_AAXA;
1696+
defm PseudoVMADD : VPseudoTernaryV_VV_VX_AAXA;
1697+
defm PseudoVNMSUB : VPseudoTernaryV_VV_VX_AAXA;
1698+
16521699
//===----------------------------------------------------------------------===//
16531700
// 12.17. Vector Integer Move Instructions
16541701
//===----------------------------------------------------------------------===//
@@ -1975,6 +2022,14 @@ defm "" : VPatBinaryW_VV_VX<"int_riscv_vwmul", "PseudoVWMUL", AllWidenableIntVec
19752022
defm "" : VPatBinaryW_VV_VX<"int_riscv_vwmulu", "PseudoVWMULU", AllWidenableIntVectors>;
19762023
defm "" : VPatBinaryW_VV_VX<"int_riscv_vwmulsu", "PseudoVWMULSU", AllWidenableIntVectors>;
19772024

2025+
//===----------------------------------------------------------------------===//
2026+
// 12.13. Vector Single-Width Integer Multiply-Add Instructions
2027+
//===----------------------------------------------------------------------===//
2028+
defm "" : VPatTernaryV_VV_VX_AAXA<"int_riscv_vmadd", "PseudoVMADD", AllIntegerVectors>;
2029+
defm "" : VPatTernaryV_VV_VX_AAXA<"int_riscv_vnmsub", "PseudoVNMSUB", AllIntegerVectors>;
2030+
defm "" : VPatTernaryV_VV_VX_AAXA<"int_riscv_vmacc", "PseudoVMACC", AllIntegerVectors>;
2031+
defm "" : VPatTernaryV_VV_VX_AAXA<"int_riscv_vnmsac", "PseudoVNMSAC", AllIntegerVectors>;
2032+
19782033
//===----------------------------------------------------------------------===//
19792034
// 12.17. Vector Integer Move Instructions
19802035
//===----------------------------------------------------------------------===//

0 commit comments

Comments
 (0)