summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJim Grosbach <grosbach@apple.com>2014-06-16 21:55:58 +0000
committerJim Grosbach <grosbach@apple.com>2014-06-16 21:55:58 +0000
commit171ec3454422decfcb0f04bf8ce8ee5fbc9f61ae (patch)
tree9e996cb3492b68bfc859bbae718942c4f6f4710b
parentcc71514d3a88b01726960a22297fd1f8ea508781 (diff)
downloadbcm5719-llvm-171ec3454422decfcb0f04bf8ce8ee5fbc9f61ae.tar.gz
bcm5719-llvm-171ec3454422decfcb0f04bf8ce8ee5fbc9f61ae.zip
ARM: Support for __builtin_arm_rbit() intrinsic.
Reverse the bits in a word. Maps to the RBIT instruction. rdar://9283021 llvm-svn: 211059
-rw-r--r--clang/include/clang/Basic/BuiltinsARM.def3
-rw-r--r--clang/lib/CodeGen/CGBuiltin.cpp6
-rw-r--r--clang/test/CodeGen/builtins-arm.c6
3 files changed, 15 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/BuiltinsARM.def b/clang/include/clang/Basic/BuiltinsARM.def
index 9f650cc4154..00cd2c1de41 100644
--- a/clang/include/clang/Basic/BuiltinsARM.def
+++ b/clang/include/clang/Basic/BuiltinsARM.def
@@ -24,6 +24,9 @@ BUILTIN(__builtin_arm_qsub, "iii", "nc")
BUILTIN(__builtin_arm_ssat, "iiUi", "nc")
BUILTIN(__builtin_arm_usat, "UiUiUi", "nc")
+// Bit manipulation
+BUILTIN(__builtin_arm_rbit, "UiUi", "nc")
+
// Store and load exclusive
BUILTIN(__builtin_arm_ldrexd, "LLUiv*", "")
BUILTIN(__builtin_arm_strexd, "iLLUiv*", "")
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 47245cf2d83..f4e11509a9d 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -3054,6 +3054,12 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
return Builder.CreateCall(F, llvm::ConstantInt::get(Int32Ty, HintID));
}
+ if (BuiltinID == ARM::BI__builtin_arm_rbit) {
+ return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_rbit),
+ EmitScalarExpr(E->getArg(0)),
+ "rbit");
+ }
+
if (BuiltinID == ARM::BI__clear_cache) {
assert(E->getNumArgs() == 2 && "__clear_cache takes 2 arguments");
const FunctionDecl *FD = E->getDirectCallee();
diff --git a/clang/test/CodeGen/builtins-arm.c b/clang/test/CodeGen/builtins-arm.c
index c5e487aafd6..13ffc607849 100644
--- a/clang/test/CodeGen/builtins-arm.c
+++ b/clang/test/CodeGen/builtins-arm.c
@@ -52,3 +52,9 @@ void test_barrier() {
__builtin_arm_dmb(1); //CHECK: call {{.*}} @llvm.arm.dmb(i32 1)
__builtin_arm_dsb(2); //CHECK: call {{.*}} @llvm.arm.dsb(i32 2)
}
+
+// CHECK: call {{.*}} @llvm.arm.rbit(i32 %a)
+
+unsigned rbit(unsigned a) {
+ return __builtin_arm_rbit(a);
+}
OpenPOWER on IntegriCloud