summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
diff options
context:
space:
mode:
authorDanilo Carvalho Grael <danilo.carvalho.grael@huawei.com>2019-12-17 10:42:52 -0500
committerDanilo Carvalho Grael <danilo.carvalho.grael@huawei.com>2020-01-13 11:39:42 -0500
commit2d7e757a836abb54590daa25fce626283adafadf (patch)
tree1fed90e969da934db88cb0a5bd4c123295dd70fc /llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
parent2af97be8027a0823b88d4b6a07fc5eedb440bc1f (diff)
downloadbcm5719-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.cpp29
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();
OpenPOWER on IntegriCloud