From cf0d0d63645bcb6425a1e2d7b5d9f1e26e205247 Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=B8ren=20Sandmann=20Pedersen?= Date: Wed, 14 Mar 2012 17:11:14 -0400 Subject: [PATCH 1/1] Use "=a" and "=d" constraints for rdtsc inline assembly In 32 bit mode the "=A" constraint refers to the register pair edx:eax, but according to GCC developers this is not the case in 64 bit mode, where it refers to "rax". Hence, using "=A" for rdtsc is incorrect in 64 bit mode. See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21249 --- pixman/pixman-private.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h index 9d96a93..0cba2e9 100644 --- a/pixman/pixman-private.h +++ b/pixman/pixman-private.h @@ -936,10 +936,11 @@ _pixman_log_error (const char *function, const char *message); static inline uint64_t oil_profile_stamp_rdtsc (void) { - uint64_t ts; + uint32_t hi, lo; - __asm__ __volatile__ ("rdtsc\n" : "=A" (ts)); - return ts; + __asm__ __volatile__ ("rdtsc\n" : "=a" (lo), "=d" (hi)); + + return lo | (((uint64_t)hi) << 32); } #define OIL_STAMP oil_profile_stamp_rdtsc -- 2.7.4