]> granicus.if.org Git - clang/commitdiff
AArch64: Support for __builtin_arm_rbit() and __builtin_arm_rbit64().
authorJim Grosbach <grosbach@apple.com>
Mon, 16 Jun 2014 21:56:02 +0000 (21:56 +0000)
committerJim Grosbach <grosbach@apple.com>
Mon, 16 Jun 2014 21:56:02 +0000 (21:56 +0000)
__builtin_arm_rbit() and __builtin_arm_rbit64().

rdar://9283021

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@211060 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/BuiltinsAArch64.def
lib/CodeGen/CGBuiltin.cpp
test/CodeGen/builtins-arm64.c

index 36dcb9fd4360f6e283d5f674711b539b3eed42fe..c2161785b37dd8b8b48a0b0b07e74af62be75c0f 100644 (file)
@@ -21,6 +21,10 @@ BUILTIN(__builtin_arm_ldrex, "v.", "t")
 BUILTIN(__builtin_arm_strex, "i.", "t")
 BUILTIN(__builtin_arm_clrex, "v", "")
 
+// Bit manipulation
+BUILTIN(__builtin_arm_rbit, "UiUi", "nc")
+BUILTIN(__builtin_arm_rbit64, "LUiLUi", "nc")
+
 // CRC32
 BUILTIN(__builtin_arm_crc32b, "UiUiUc", "nc")
 BUILTIN(__builtin_arm_crc32cb, "UiUiUc", "nc")
index f4e11509a9d61d7c90ea78086a81eb48b37d2d7a..c9a10a52d19f8c9fe51af048a9719fc57c5d17a4 100644 (file)
@@ -3763,6 +3763,21 @@ emitVectorWrappedScalar16Intrinsic(unsigned Int, SmallVectorImpl<Value*> &Ops,
 
 Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
                                                const CallExpr *E) {
+  if (BuiltinID == AArch64::BI__builtin_arm_rbit) {
+    assert((getContext().getTypeSize(E->getType()) == 32) &&
+           "rbit of unusual size!");
+    llvm::Value *Arg = EmitScalarExpr(E->getArg(0));
+    return Builder.CreateCall(
+        CGM.getIntrinsic(Intrinsic::aarch64_rbit, Arg->getType()), Arg, "rbit");
+  }
+  if (BuiltinID == AArch64::BI__builtin_arm_rbit64) {
+    assert((getContext().getTypeSize(E->getType()) == 64) &&
+           "rbit of unusual size!");
+    llvm::Value *Arg = EmitScalarExpr(E->getArg(0));
+    return Builder.CreateCall(
+        CGM.getIntrinsic(Intrinsic::aarch64_rbit, Arg->getType()), Arg, "rbit");
+  }
+
   if (BuiltinID == AArch64::BI__clear_cache) {
     assert(E->getNumArgs() == 2 && "__clear_cache takes 2 arguments");
     const FunctionDecl *FD = E->getDirectCallee();
index fcda92e4fc6b656259536f9d46dc14bfbec6958c..6e246ed7ce2aee2391fb31983f89e89e577e4f81 100644 (file)
@@ -4,3 +4,13 @@ void f0(void *a, void *b) {
        __clear_cache(a,b);
 // CHECK: call {{.*}} @__clear_cache
 }
+
+// CHECK: call {{.*}} @llvm.aarch64.rbit.i32(i32 %a)
+void rbit(unsigned a) {
+  __builtin_arm_rbit(a);
+}
+
+// CHECK: call {{.*}} @llvm.aarch64.rbit.i64(i64 %a)
+void rbit64(unsigned long long a) {
+  __builtin_arm_rbit64(a);
+}