[x86] Add Clang support for intrinsic __rdpmc.
authorAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Mon, 30 Jun 2014 18:23:58 +0000 (18:23 +0000)
committerAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Mon, 30 Jun 2014 18:23:58 +0000 (18:23 +0000)
This patch adds intrinsic __rdpmc to header file 'ia32intrin.h'.
Intrinsic __rdmpc can be used to read performance monitoring counters. It is
implemented as a direct call to __builtin_ia32_rdpmc.

It takes as input a value representing the index of the performance counter to
read. The value of the performance counter is then returned as a unsigned
64-bit quantity.

llvm-svn: 212053

clang/include/clang/Basic/BuiltinsX86.def
clang/lib/Headers/ia32intrin.h
clang/test/CodeGen/builtins-x86.c

index 6cd7a79..1f377a8 100644 (file)
@@ -757,6 +757,7 @@ BUILTIN(__builtin_ia32_xbegin, "i", "")
 BUILTIN(__builtin_ia32_xend, "v", "")
 BUILTIN(__builtin_ia32_xabort, "vIc", "")
 BUILTIN(__builtin_ia32_xtest, "i", "")
+BUILTIN(__builtin_ia32_rdpmc, "ULLii", "")
 BUILTIN(__builtin_ia32_rdtsc, "ULLi", "")
 BUILTIN(__builtin_ia32_rdtscp, "ULLiUi*", "")
 
index 55c2247..5adf3f1 100644 (file)
@@ -79,6 +79,11 @@ __writeeflags(unsigned int __f)
 }
 #endif /* !__x86_64__ */
 
+static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__))
+__rdpmc(int __A) {
+  return __builtin_ia32_rdpmc(__A);
+}
+
 /* __rdtsc */
 static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__))
 __rdtsc(void) {
index 8443574..0f038b8 100644 (file)
@@ -266,6 +266,7 @@ void f0() {
 
   tmp_i = __builtin_ia32_rdtsc();
   tmp_i = __builtin_ia32_rdtscp(&tmp_Ui);
+  tmp_LLi = __builtin_ia32_rdpmc(tmp_i);
 #ifdef USE_64
   tmp_LLi = __builtin_ia32_cvtss2si64(tmp_V4f);
 #endif