about summary refs log tree commit diff
path: root/sysdeps/x86/hp-timing.h
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2018-10-24 02:19:15 -0700
committerH.J. Lu <hjl.tools@gmail.com>2018-10-24 02:19:34 -0700
commit7cc65773f04e0f4252428c40dcbb784a39b58cd1 (patch)
tree8ab811df64ea1c81daac9b4e8b645ea3998acf08 /sysdeps/x86/hp-timing.h
parent18ad0de6513bf8a8e4ba757c069e6806d07920f8 (diff)
downloadglibc-7cc65773f04e0f4252428c40dcbb784a39b58cd1.tar.gz
glibc-7cc65773f04e0f4252428c40dcbb784a39b58cd1.tar.xz
glibc-7cc65773f04e0f4252428c40dcbb784a39b58cd1.zip
x86: Support RDTSCP for benchtests
RDTSCP waits until all previous instructions have executed and all
previous loads are globally visible before reading the counter.  RDTSC
doesn't wait until all previous instructions have been executed before
reading the counter.  All x86 processors since 2010 support RDTSCP
instruction.  This patch adds RDTSCP support to benchtests.

	* benchtests/Makefile (CPPFLAGS-nonlib): Add -DUSE_RDTSCP if
	USE_RDTSCP is defined.
	* sysdeps/x86/hp-timing.h (HP_TIMING_NOW): Use RDTSCP if
	USE_RDTSCP is defined.
Diffstat (limited to 'sysdeps/x86/hp-timing.h')
-rw-r--r--sysdeps/x86/hp-timing.h14
1 files changed, 13 insertions, 1 deletions
diff --git a/sysdeps/x86/hp-timing.h b/sysdeps/x86/hp-timing.h
index 77a1360748..0aa6f5e3f8 100644
--- a/sysdeps/x86/hp-timing.h
+++ b/sysdeps/x86/hp-timing.h
@@ -40,7 +40,19 @@ typedef unsigned long long int hp_timing_t;
 
    NB: Use __builtin_ia32_rdtsc directly since including <x86intrin.h>
    makes building glibc very slow.  */
-# define HP_TIMING_NOW(Var)	((Var) = __builtin_ia32_rdtsc ())
+# ifdef USE_RDTSCP
+/* RDTSCP waits until all previous instructions have executed and all
+   previous loads are globally visible before reading the counter.
+   RDTSC doesn't wait until all previous instructions have been executed
+   before reading the counter.  */
+#  define HP_TIMING_NOW(Var) \
+  (__extension__ ({				\
+    unsigned int __aux;				\
+    (Var) = __builtin_ia32_rdtscp (&__aux);	\
+  }))
+# else
+#  define HP_TIMING_NOW(Var) ((Var) = __builtin_ia32_rdtsc ())
+# endif
 
 # include <hp-timing-common.h>
 #else