From: Jim Grosbach Date: Mon, 16 Jun 2014 21:56:02 +0000 (+0000) Subject: AArch64: Support for __builtin_arm_rbit() and __builtin_arm_rbit64(). X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2400f60651fd62e57834d0ff1ebafe535fd41fe0;p=clang AArch64: Support for __builtin_arm_rbit() and __builtin_arm_rbit64(). __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 --- diff --git a/include/clang/Basic/BuiltinsAArch64.def b/include/clang/Basic/BuiltinsAArch64.def index 36dcb9fd43..c2161785b3 100644 --- a/include/clang/Basic/BuiltinsAArch64.def +++ b/include/clang/Basic/BuiltinsAArch64.def @@ -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") diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp index f4e11509a9..c9a10a52d1 100644 --- a/lib/CodeGen/CGBuiltin.cpp +++ b/lib/CodeGen/CGBuiltin.cpp @@ -3763,6 +3763,21 @@ emitVectorWrappedScalar16Intrinsic(unsigned Int, SmallVectorImpl &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(); diff --git a/test/CodeGen/builtins-arm64.c b/test/CodeGen/builtins-arm64.c index fcda92e4fc..6e246ed7ce 100644 --- a/test/CodeGen/builtins-arm64.c +++ b/test/CodeGen/builtins-arm64.c @@ -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); +}