From: Saleem Abdulrasool Date: Fri, 25 Apr 2014 21:13:29 +0000 (+0000) Subject: CodeGen: add __yield intrinsic for ARM X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a7b80b7a8fecae3d9d0d2691e83617400abf5919;p=clang CodeGen: add __yield intrinsic for ARM The __yield intrinsic generates a hint instruction to indicate that the thread is not performing any useful operations at the moment. This is for compatibility with MSVC, although, the intrinsic is also part of the ACLE, and is enabled globally as a result. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@207275 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/BuiltinsARM.def b/include/clang/Basic/BuiltinsARM.def index aab9255a6d..99dbb9affa 100644 --- a/include/clang/Basic/BuiltinsARM.def +++ b/include/clang/Basic/BuiltinsARM.def @@ -65,4 +65,7 @@ BUILTIN(__builtin_arm_sevl, "v", "") BUILTIN(__builtin_arm_dmb, "vUi", "nc") BUILTIN(__builtin_arm_dsb, "vUi", "nc") +// MSVC +BUILTIN(__yield, "v", "") + #undef BUILTIN diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp index d267ecee73..56fa69aec5 100644 --- a/lib/CodeGen/CGBuiltin.cpp +++ b/lib/CodeGen/CGBuiltin.cpp @@ -4326,6 +4326,11 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, const CallExpr *E) { + if (BuiltinID == ARM::BI__yield) { + Function *F = CGM.getIntrinsic(Intrinsic::arm_hint); + return Builder.CreateCall(F, llvm::ConstantInt::get(Int32Ty, 1)); + } + if (BuiltinID == ARM::BI__clear_cache) { assert(E->getNumArgs() == 2 && "__clear_cache takes 2 arguments"); const FunctionDecl *FD = E->getDirectCallee(); diff --git a/test/CodeGen/builtins-arm-microsoft.c b/test/CodeGen/builtins-arm-microsoft.c new file mode 100644 index 0000000000..682ec916a8 --- /dev/null +++ b/test/CodeGen/builtins-arm-microsoft.c @@ -0,0 +1,10 @@ +// RUN: %clang_cc1 -triple thumbv7-windows -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple armv7-eabi -emit-llvm -o - %s | FileCheck %s +// REQUIRES: arm-registered-target + +void test_yield_intrinsic() { + __yield(); +} + +// CHECK: call void @llvm.arm.hint(i32 1) +