diff options
author | Danilo Carvalho Grael <danilo.carvalho.grael@huawei.com> | 2019-12-17 10:42:52 -0500 |
---|---|---|
committer | Danilo Carvalho Grael <danilo.carvalho.grael@huawei.com> | 2020-01-13 11:39:42 -0500 |
commit | 2d7e757a836abb54590daa25fce626283adafadf (patch) | |
tree | 1fed90e969da934db88cb0a5bd4c123295dd70fc /llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp | |
parent | 2af97be8027a0823b88d4b6a07fc5eedb440bc1f (diff) | |
download | bcm5719-llvm-2d7e757a836abb54590daa25fce626283adafadf.tar.gz bcm5719-llvm-2d7e757a836abb54590daa25fce626283adafadf.zip |
[AArch64][SVE] Add patterns for some arith SVE instructions.
Summary: Add patterns for the following instructions:
- smax, smin, umax, umin
Reviewers: sdesmalen, huntergr, rengolin, efriedma, c-rhodes, mgudim, kmclaughlin
Subscribers: amehsan
Differential Revision: https://reviews.llvm.org/D71779
Diffstat (limited to 'llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp')
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp b/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp index 5362c0e0647..a51aa85a931 100644 --- a/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp @@ -271,6 +271,10 @@ private: bool SelectSVEAddSubImm(SDValue N, MVT VT, SDValue &Imm, SDValue &Shift); bool SelectSVELogicalImm(SDValue N, MVT VT, SDValue &Imm); + + bool SelectSVESignedArithImm(SDValue N, SDValue &Imm); + + bool SelectSVEArithImm(SDValue N, SDValue &Imm); }; } // end anonymous namespace @@ -2909,6 +2913,31 @@ bool AArch64DAGToDAGISel::SelectSVEAddSubImm(SDValue N, MVT VT, SDValue &Imm, SD return false; } +bool AArch64DAGToDAGISel::SelectSVESignedArithImm(SDValue N, SDValue &Imm) { + if (auto CNode = dyn_cast<ConstantSDNode>(N)) { + int64_t ImmVal = CNode->getSExtValue(); + SDLoc DL(N); + if (ImmVal >= -127 && ImmVal < 127) { + Imm = CurDAG->getTargetConstant(ImmVal, DL, MVT::i32); + return true; + } + } + return false; +} + +bool AArch64DAGToDAGISel::SelectSVEArithImm(SDValue N, SDValue &Imm) { + if (auto CNode = dyn_cast<ConstantSDNode>(N)) { + uint64_t ImmVal = CNode->getSExtValue(); + SDLoc DL(N); + ImmVal = ImmVal & 0xFF; + if (ImmVal < 256) { + Imm = CurDAG->getTargetConstant(ImmVal, DL, MVT::i32); + return true; + } + } + return false; +} + bool AArch64DAGToDAGISel::SelectSVELogicalImm(SDValue N, MVT VT, SDValue &Imm) { if (auto CNode = dyn_cast<ConstantSDNode>(N)) { uint64_t ImmVal = CNode->getZExtValue(); |