Skip to content

Commit 056bb1e

Browse files
[AArch64][SVE] Add AArch64ISD nodes for wide add instructions
When lowering from a partial reduction to a pair of wide adds, previously the corresponding intrinsics were returned as nodes. Now there are AArch64ISD nodes that are returned.
1 parent 44076c9 commit 056bb1e

File tree

3 files changed

+46
-15
lines changed

3 files changed

+46
-15
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2755,6 +2755,10 @@ const char *AArch64TargetLowering::getTargetNodeName(unsigned Opcode) const {
27552755
MAKE_CASE(AArch64ISD::UADDV)
27562756
MAKE_CASE(AArch64ISD::UADDLV)
27572757
MAKE_CASE(AArch64ISD::SADDLV)
2758+
MAKE_CASE(AArch64ISD::SADDWT)
2759+
MAKE_CASE(AArch64ISD::SADDWB)
2760+
MAKE_CASE(AArch64ISD::UADDWT)
2761+
MAKE_CASE(AArch64ISD::UADDWB)
27582762
MAKE_CASE(AArch64ISD::SDOT)
27592763
MAKE_CASE(AArch64ISD::UDOT)
27602764
MAKE_CASE(AArch64ISD::USDOT)
@@ -21825,17 +21829,10 @@ SDValue tryLowerPartialReductionToWideAdd(SDNode *N,
2182521829
return SDValue();
2182621830

2182721831
bool InputIsSigned = ExtInputOpcode == ISD::SIGN_EXTEND;
21828-
auto BottomIntrinsic = InputIsSigned ? Intrinsic::aarch64_sve_saddwb
21829-
: Intrinsic::aarch64_sve_uaddwb;
21830-
auto TopIntrinsic = InputIsSigned ? Intrinsic::aarch64_sve_saddwt
21831-
: Intrinsic::aarch64_sve_uaddwt;
21832-
21833-
auto BottomID = DAG.getTargetConstant(BottomIntrinsic, DL, AccElemVT);
21834-
auto BottomNode =
21835-
DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, AccVT, BottomID, Acc, Input);
21836-
auto TopID = DAG.getTargetConstant(TopIntrinsic, DL, AccElemVT);
21837-
return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, AccVT, TopID, BottomNode,
21838-
Input);
21832+
auto BottomISD = InputIsSigned ? AArch64ISD::SADDWB : AArch64ISD::UADDWB;
21833+
auto TopISD = InputIsSigned ? AArch64ISD::SADDWT : AArch64ISD::UADDWT;
21834+
auto BottomNode = DAG.getNode(BottomISD, DL, AccVT, Acc, Input);
21835+
return DAG.getNode(TopISD, DL, AccVT, BottomNode, Input);
2183921836
}
2184021837

2184121838
static SDValue performIntrinsicCombine(SDNode *N,
@@ -22015,6 +22012,18 @@ static SDValue performIntrinsicCombine(SDNode *N,
2201522012
case Intrinsic::aarch64_sve_bic_u:
2201622013
return DAG.getNode(AArch64ISD::BIC, SDLoc(N), N->getValueType(0),
2201722014
N->getOperand(2), N->getOperand(3));
22015+
case Intrinsic::aarch64_sve_saddwb:
22016+
return DAG.getNode(AArch64ISD::SADDWB, SDLoc(N), N->getValueType(0),
22017+
N->getOperand(1), N->getOperand(2));
22018+
case Intrinsic::aarch64_sve_saddwt:
22019+
return DAG.getNode(AArch64ISD::SADDWT, SDLoc(N), N->getValueType(0),
22020+
N->getOperand(1), N->getOperand(2));
22021+
case Intrinsic::aarch64_sve_uaddwb:
22022+
return DAG.getNode(AArch64ISD::UADDWB, SDLoc(N), N->getValueType(0),
22023+
N->getOperand(1), N->getOperand(2));
22024+
case Intrinsic::aarch64_sve_uaddwt:
22025+
return DAG.getNode(AArch64ISD::UADDWT, SDLoc(N), N->getValueType(0),
22026+
N->getOperand(1), N->getOperand(2));
2201822027
case Intrinsic::aarch64_sve_eor_u:
2201922028
return DAG.getNode(ISD::XOR, SDLoc(N), N->getValueType(0), N->getOperand(2),
2202022029
N->getOperand(3));

llvm/lib/Target/AArch64/AArch64ISelLowering.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,12 @@ enum NodeType : unsigned {
273273
UADDLV,
274274
SADDLV,
275275

276+
// Wide adds
277+
SADDWT,
278+
SADDWB,
279+
UADDWT,
280+
UADDWB,
281+
276282
// Add Pairwise of two vectors
277283
ADDP,
278284
// Add Long Pairwise

llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,22 @@ def SDT_AArch64Arith_Unpred : SDTypeProfile<1, 2, [
430430

431431
def AArch64bic_node : SDNode<"AArch64ISD::BIC", SDT_AArch64Arith_Unpred>;
432432

433+
def SDT_AArch64addw : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>]>;
434+
435+
def AArch64saddwt_node : SDNode<"AArch64ISD::SADDWT", SDT_AArch64addw>;
436+
def AArch64saddwb_node : SDNode<"AArch64ISD::SADDWB", SDT_AArch64addw>;
437+
def AArch64uaddwt_node : SDNode<"AArch64ISD::UADDWT", SDT_AArch64addw>;
438+
def AArch64uaddwb_node : SDNode<"AArch64ISD::UADDWB", SDT_AArch64addw>;
439+
440+
def AArch64saddwt : PatFrag<(ops node:$op1, node:$op2),
441+
(AArch64saddwt_node node:$op1, node:$op2)>;
442+
def AArch64saddwb : PatFrag<(ops node:$op1, node:$op2),
443+
(AArch64saddwb_node node:$op1, node:$op2)>;
444+
def AArch64uaddwt : PatFrag<(ops node:$op1, node:$op2),
445+
(AArch64uaddwt_node node:$op1, node:$op2)>;
446+
def AArch64uaddwb : PatFrag<(ops node:$op1, node:$op2),
447+
(AArch64uaddwb_node node:$op1, node:$op2)>;
448+
433449
def AArch64bic : PatFrags<(ops node:$op1, node:$op2),
434450
[(and node:$op1, (xor node:$op2, (splat_vector (i32 -1)))),
435451
(and node:$op1, (xor node:$op2, (splat_vector (i64 -1)))),
@@ -3674,10 +3690,10 @@ let Predicates = [HasSVE2orSME] in {
36743690
defm UABDLT_ZZZ : sve2_wide_int_arith_long<0b01111, "uabdlt", int_aarch64_sve_uabdlt>;
36753691

36763692
// SVE2 integer add/subtract wide
3677-
defm SADDWB_ZZZ : sve2_wide_int_arith_wide<0b000, "saddwb", int_aarch64_sve_saddwb>;
3678-
defm SADDWT_ZZZ : sve2_wide_int_arith_wide<0b001, "saddwt", int_aarch64_sve_saddwt>;
3679-
defm UADDWB_ZZZ : sve2_wide_int_arith_wide<0b010, "uaddwb", int_aarch64_sve_uaddwb>;
3680-
defm UADDWT_ZZZ : sve2_wide_int_arith_wide<0b011, "uaddwt", int_aarch64_sve_uaddwt>;
3693+
defm SADDWB_ZZZ : sve2_wide_int_arith_wide<0b000, "saddwb", AArch64saddwb>;
3694+
defm SADDWT_ZZZ : sve2_wide_int_arith_wide<0b001, "saddwt", AArch64saddwt>;
3695+
defm UADDWB_ZZZ : sve2_wide_int_arith_wide<0b010, "uaddwb", AArch64uaddwb>;
3696+
defm UADDWT_ZZZ : sve2_wide_int_arith_wide<0b011, "uaddwt", AArch64uaddwt>;
36813697
defm SSUBWB_ZZZ : sve2_wide_int_arith_wide<0b100, "ssubwb", int_aarch64_sve_ssubwb>;
36823698
defm SSUBWT_ZZZ : sve2_wide_int_arith_wide<0b101, "ssubwt", int_aarch64_sve_ssubwt>;
36833699
defm USUBWB_ZZZ : sve2_wide_int_arith_wide<0b110, "usubwb", int_aarch64_sve_usubwb>;

0 commit comments

Comments
 (0)