summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChad Rosier <mcrosier@codeaurora.org>2015-12-04 21:38:44 +0000
committerChad Rosier <mcrosier@codeaurora.org>2015-12-04 21:38:44 +0000
commitf3491496dcbaa236943c6a167399e85335acdc4d (patch)
treefcc6694884877bbe646a6e1ee9eadd7cb4465565
parentefadacfb145bc775bb71a30fcbcc166a33cd0536 (diff)
downloadbcm5719-llvm-f3491496dcbaa236943c6a167399e85335acdc4d.tar.gz
bcm5719-llvm-f3491496dcbaa236943c6a167399e85335acdc4d.zip
[AArch64] Expand vector SDIVREM/UDIVREM operations.
http://reviews.llvm.org/D15214 Patch by Ana Pazos <apazos@codeaurora.org>! llvm-svn: 254773
-rw-r--r--llvm/lib/Target/AArch64/AArch64ISelLowering.cpp4
-rw-r--r--llvm/test/CodeGen/AArch64/divrem.ll22
2 files changed, 26 insertions, 0 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index f0fb03451b2..9340e7f0a55 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -237,6 +237,10 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
setOperationAction(ISD::SDIVREM, MVT::i32, Expand);
setOperationAction(ISD::SDIVREM, MVT::i64, Expand);
+ for (MVT VT : MVT::vector_valuetypes()) {
+ setOperationAction(ISD::SDIVREM, VT, Expand);
+ setOperationAction(ISD::UDIVREM, VT, Expand);
+ }
setOperationAction(ISD::SREM, MVT::i32, Expand);
setOperationAction(ISD::SREM, MVT::i64, Expand);
setOperationAction(ISD::UDIVREM, MVT::i32, Expand);
diff --git a/llvm/test/CodeGen/AArch64/divrem.ll b/llvm/test/CodeGen/AArch64/divrem.ll
new file mode 100644
index 00000000000..9f648eb63ea
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/divrem.ll
@@ -0,0 +1,22 @@
+; RUN: llc -mtriple=aarch64-none-linux-gnu < %s -mattr=+neon | FileCheck %s
+
+; SDIVREM/UDIVREM DAG nodes are generated but expanded when lowering and
+; should not generate select error.
+define <2 x i32> @test_udivrem(<2 x i32> %x, < 2 x i32> %y, < 2 x i32>* %z) {
+; CHECK-LABEL: test_udivrem
+; CHECK-DAG: udivrem
+; CHECK-NOT: LLVM ERROR: Cannot select
+ %div = udiv <2 x i32> %x, %y
+ store <2 x i32> %div, <2 x i32>* %z
+ %1 = urem <2 x i32> %x, %y
+ ret <2 x i32> %1
+}
+
+define <4 x i32> @test_sdivrem(<4 x i32> %x, <4 x i32>* %y) {
+; CHECK-LABEL: test_sdivrem
+; CHECK-DAG: sdivrem
+ %div = sdiv <4 x i32> %x, < i32 20, i32 20, i32 20, i32 20 >
+ store <4 x i32> %div, <4 x i32>* %y
+ %1 = srem <4 x i32> %x, < i32 20, i32 20, i32 20, i32 20 >
+ ret <4 x i32> %1
+}
OpenPOWER on IntegriCloud