diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/Basic/BuiltinsPPC.def | 2 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 5 | ||||
| -rw-r--r-- | clang/test/CodeGen/builtins-ppc.c | 7 |
3 files changed, 14 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/BuiltinsPPC.def b/clang/include/clang/Basic/BuiltinsPPC.def index fdf1cb0b5a4..3e2861d43e8 100644 --- a/clang/include/clang/Basic/BuiltinsPPC.def +++ b/clang/include/clang/Basic/BuiltinsPPC.def @@ -17,6 +17,8 @@ // The format of this database matches clang/Basic/Builtins.def. +BUILTIN(__builtin_ppc_get_timebase, "ULLi", "n") + // This is just a placeholder, the types and attributes are wrong. BUILTIN(__builtin_altivec_vaddcuw, "V4UiV4UiV4Ui", "") diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 6966b03ef3b..a04a1c12560 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -6414,6 +6414,11 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID, switch (BuiltinID) { default: return nullptr; + // __builtin_ppc_get_timebase is GCC 4.8+'s PowerPC-specific name for what we + // call __builtin_readcyclecounter. + case PPC::BI__builtin_ppc_get_timebase: + return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::readcyclecounter)); + // vec_ld, vec_lvsl, vec_lvsr case PPC::BI__builtin_altivec_lvx: case PPC::BI__builtin_altivec_lvxl: diff --git a/clang/test/CodeGen/builtins-ppc.c b/clang/test/CodeGen/builtins-ppc.c index 9ef5e3708f5..1f17787ad9c 100644 --- a/clang/test/CodeGen/builtins-ppc.c +++ b/clang/test/CodeGen/builtins-ppc.c @@ -7,3 +7,10 @@ void test_eh_return_data_regno() res = __builtin_eh_return_data_regno(0); // CHECK: store volatile i32 3 res = __builtin_eh_return_data_regno(1); // CHECK: store volatile i32 4 } + +// CHECK-LABEL: define i64 @test_builtin_ppc_get_timebase +long long test_builtin_ppc_get_timebase() { + // CHECK: call i64 @llvm.readcyclecounter() + return __builtin_ppc_get_timebase(); +} + |

