diff options
-rw-r--r-- | clang/include/clang/Basic/BuiltinsAArch64.def | 4 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 15 | ||||
-rw-r--r-- | clang/test/CodeGen/builtins-arm64.c | 10 |
3 files changed, 29 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/BuiltinsAArch64.def b/clang/include/clang/Basic/BuiltinsAArch64.def index 36dcb9fd436..c2161785b37 100644 --- a/clang/include/clang/Basic/BuiltinsAArch64.def +++ b/clang/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/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index f4e11509a9d..c9a10a52d19 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -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(); diff --git a/clang/test/CodeGen/builtins-arm64.c b/clang/test/CodeGen/builtins-arm64.c index fcda92e4fc6..6e246ed7ce2 100644 --- a/clang/test/CodeGen/builtins-arm64.c +++ b/clang/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); +} |