summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChad Rosier <mcrosier@codeaurora.org>2013-11-14 22:02:24 +0000
committerChad Rosier <mcrosier@codeaurora.org>2013-11-14 22:02:24 +0000
commit7aaee48bf03a3c13a552a4140a6ac29b4c16e461 (patch)
treec55faf06552ca4abc1126b0b8f91cff4a0520aab
parentaf12ff28a147b192c17588afa0c03dc60bf99d79 (diff)
downloadbcm5719-llvm-7aaee48bf03a3c13a552a4140a6ac29b4c16e461.tar.gz
bcm5719-llvm-7aaee48bf03a3c13a552a4140a6ac29b4c16e461.zip
[AArch64] Add support for legacy AArch32 NEON scalar shift right by immediate
and accumulate instructions. llvm-svn: 194732
-rw-r--r--clang/lib/CodeGen/CGBuiltin.cpp11
-rw-r--r--clang/test/CodeGen/aarch64-neon-intrinsics.c24
2 files changed, 35 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index a2669fe8fe4..363caedf314 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -2913,10 +2913,21 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
: Intrinsic::aarch64_neon_vsrshr;
return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrshr_n");
case AArch64::BI__builtin_neon_vsra_n_v:
+ if (VTy->getElementType()->isIntegerTy(64)) {
+ Int = usgn ? Intrinsic::aarch64_neon_vsradu_n
+ : Intrinsic::aarch64_neon_vsrads_n;
+ return EmitNeonCall(CGM.getIntrinsic(Int), Ops, "vsra_n");
+ }
return EmitARMBuiltinExpr(ARM::BI__builtin_neon_vsra_n_v, E);
case AArch64::BI__builtin_neon_vsraq_n_v:
return EmitARMBuiltinExpr(ARM::BI__builtin_neon_vsraq_n_v, E);
case AArch64::BI__builtin_neon_vrsra_n_v:
+ if (VTy->getElementType()->isIntegerTy(64)) {
+ Int = usgn ? Intrinsic::aarch64_neon_vrsradu_n
+ : Intrinsic::aarch64_neon_vrsrads_n;
+ return EmitNeonCall(CGM.getIntrinsic(Int), Ops, "vrsra_n");
+ }
+ // fall through
case AArch64::BI__builtin_neon_vrsraq_n_v: {
Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
diff --git a/clang/test/CodeGen/aarch64-neon-intrinsics.c b/clang/test/CodeGen/aarch64-neon-intrinsics.c
index c73e87d6ac6..4c2f3cc1016 100644
--- a/clang/test/CodeGen/aarch64-neon-intrinsics.c
+++ b/clang/test/CodeGen/aarch64-neon-intrinsics.c
@@ -7538,24 +7538,48 @@ int64_t test_vsrad_n_s64(int64_t a, int64_t b) {
return (int64_t)vsrad_n_s64(a, b, 63);
}
+int64x1_t test_vsra_n_s64(int64x1_t a, int64x1_t b) {
+// CHECK: test_vsra_n_s64
+// CHECK: ssra d{{[0-9]+}}, d{{[0-9]+}}, #1
+ return vsra_n_s64(a, b, 1);
+}
+
uint64_t test_vsrad_n_u64(uint64_t a, uint64_t b) {
// CHECK-LABEL: test_vsrad_n_u64
// CHECK: usra {{d[0-9]+}}, {{d[0-9]+}}, #63
return (uint64_t)vsrad_n_u64(a, b, 63);
}
+uint64x1_t test_vsra_n_u64(uint64x1_t a, uint64x1_t b) {
+// CHECK: test_vsra_n_u64
+// CHECK: usra d{{[0-9]+}}, d{{[0-9]+}}, #1
+ return vsra_n_u64(a, b, 1);
+}
+
int64_t test_vrsrad_n_s64(int64_t a, int64_t b) {
// CHECK-LABEL: test_vrsrad_n_s64
// CHECK: srsra {{d[0-9]+}}, {{d[0-9]+}}, #63
return (int64_t)vrsrad_n_s64(a, b, 63);
}
+int64x1_t test_vrsra_n_s64(int64x1_t a, int64x1_t b) {
+// CHECK: test_vrsra_n_s64
+// CHECK: srsra d{{[0-9]+}}, d{{[0-9]+}}, #1
+ return vrsra_n_s64(a, b, 1);
+}
+
uint64_t test_vrsrad_n_u64(uint64_t a, uint64_t b) {
// CHECK-LABEL: test_vrsrad_n_u64
// CHECK: ursra {{d[0-9]+}}, {{d[0-9]+}}, #63
return (uint64_t)vrsrad_n_u64(a, b, 63);
}
+uint64x1_t test_vrsra_n_u64(uint64x1_t a, uint64x1_t b) {
+// CHECK: test_vrsra_n_u64
+// CHECK: ursra d{{[0-9]+}}, d{{[0-9]+}}, #1
+ return vrsra_n_u64(a, b, 1);
+}
+
int64_t test_vshld_n_s64(int64_t a) {
// CHECK-LABEL: test_vshld_n_s64
// CHECK: shl {{d[0-9]+}}, {{d[0-9]+}}, #0
OpenPOWER on IntegriCloud