From 09a39309c30bbd1850d1983687b45c1431b18a59 Mon Sep 17 00:00:00 2001 From: Andrea Di Biagio Date: Thu, 24 Apr 2014 18:26:35 +0000 Subject: [PATCH] [X86] Add Clang support for intrinsics __rdtsc and __rdtscp. This patch: 1. Adds a definition for two new GCCBuiltins in BuiltinsX86.def: __builtin_ia32_rdtsc; __builtin_ia32_rdtscp; 2. Replaces the already existing definition of intrinsic __rdtsc in ia32intrin.h with a simple call to the new GCC builtin __builtin_ia32_rdtsc. 3. Adds a definition for the new intrinsic __rdtscp in ia32intrin.h git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@207132 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/BuiltinsX86.def | 2 ++ lib/Headers/ia32intrin.h | 10 +++++++--- test/CodeGen/builtins-x86.c | 3 +++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/include/clang/Basic/BuiltinsX86.def b/include/clang/Basic/BuiltinsX86.def index 4a67fc1f5f..8faaea381a 100644 --- a/include/clang/Basic/BuiltinsX86.def +++ b/include/clang/Basic/BuiltinsX86.def @@ -760,5 +760,7 @@ BUILTIN(__builtin_ia32_xbegin, "i", "") BUILTIN(__builtin_ia32_xend, "v", "") BUILTIN(__builtin_ia32_xabort, "vIc", "") BUILTIN(__builtin_ia32_xtest, "i", "") +BUILTIN(__builtin_ia32_rdtsc, "ULLi", "") +BUILTIN(__builtin_ia32_rdtscp, "ULLiUi*", "") #undef BUILTIN diff --git a/lib/Headers/ia32intrin.h b/lib/Headers/ia32intrin.h index a5985f660b..55c22473ba 100644 --- a/lib/Headers/ia32intrin.h +++ b/lib/Headers/ia32intrin.h @@ -82,9 +82,13 @@ __writeeflags(unsigned int __f) /* __rdtsc */ static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__)) __rdtsc(void) { - unsigned int __eax, __edx; - __asm__ ("rdtsc" : "=a" (__eax), "=d" (__edx)); - return ((unsigned long long)__edx << 32) | __eax; + return __builtin_ia32_rdtsc(); +} + +/* __rdtscp */ +static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__)) +__rdtscp(unsigned int *__A) { + return __builtin_ia32_rdtscp(__A); } #define _rdtsc() __rdtsc() diff --git a/test/CodeGen/builtins-x86.c b/test/CodeGen/builtins-x86.c index 261bf2f5d8..6df005d860 100644 --- a/test/CodeGen/builtins-x86.c +++ b/test/CodeGen/builtins-x86.c @@ -263,6 +263,9 @@ void f0() { tmp_V4f = __builtin_ia32_cvtpi2ps(tmp_V4f, tmp_V2i); tmp_V2i = __builtin_ia32_cvtps2pi(tmp_V4f); tmp_i = __builtin_ia32_cvtss2si(tmp_V4f); + + tmp_i = __builtin_ia32_rdtsc(); + tmp_i = __builtin_ia32_rdtscp(&tmp_Ui); #ifdef USE_64 tmp_LLi = __builtin_ia32_cvtss2si64(tmp_V4f); #endif -- 2.40.0