diff options
-rw-r--r-- | clang/include/clang/Basic/BuiltinsARM.def | 3 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 5 | ||||
-rw-r--r-- | clang/test/CodeGen/builtins-arm-microsoft.c | 10 |
3 files changed, 18 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/BuiltinsARM.def b/clang/include/clang/Basic/BuiltinsARM.def index aab9255a6d3..99dbb9affa8 100644 --- a/clang/include/clang/Basic/BuiltinsARM.def +++ b/clang/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/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index d267ecee73e..56fa69aec53 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/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/clang/test/CodeGen/builtins-arm-microsoft.c b/clang/test/CodeGen/builtins-arm-microsoft.c new file mode 100644 index 00000000000..682ec916a8a --- /dev/null +++ b/clang/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) + |