[cairo] Reading rdtsc on x86_64
M Joonas Pihlaja
jpihlaja at cc.helsinki.fi
Thu Sep 11 11:10:15 PDT 2008
Hi,
The oil_profile_stamp_rdtsc() function uses the =A mode to read
the 64 bit result of rdtsc on both x86 and x86_64. This doesn't
work on x86_64 reliably as we want to be reading eax:edx, but
with =A we're reading a single 64 bit register instead.
I've been using the attached patch at home. Someone look it
over?
Cheers,
Joonas
-------------- next part --------------
diff --git a/perf/cairo-perf-posix.c b/perf/cairo-perf-posix.c
index b1b1a2a..f7b8658 100644
--- a/perf/cairo-perf-posix.c
+++ b/perf/cairo-perf-posix.c
@@ -64,7 +64,7 @@
/* timers */
-#if defined(__i386__) || defined(__amd64__)
+#if defined(__i386__)
static inline cairo_perf_ticks_t
oil_profile_stamp_rdtsc (void)
{
@@ -75,6 +75,17 @@ oil_profile_stamp_rdtsc (void)
#define OIL_STAMP oil_profile_stamp_rdtsc
#endif
+#if defined(__amd64__)
+static inline cairo_perf_ticks_t
+oil_profile_stamp_rdtsc (void)
+{
+ unsigned a, d;
+ __asm__ __volatile__("rdtsc" : "=a" (a), "=d" (d));
+ return ((uint64_t)a) | (((uint64_t)d) << 32);
+}
+#define OIL_STAMP oil_profile_stamp_rdtsc
+#endif
+
#if defined(__powerpc__) || defined(__PPC__) || defined(__ppc__)
static inline cairo_perf_ticks_t
oil_profile_stamp_tb(void)
More information about the cairo
mailing list