From: Søren Sandmann Pedersen Date: Wed, 14 Mar 2012 21:11:14 +0000 (-0400) Subject: Use "=a" and "=d" constraints for rdtsc inline assembly X-Git-Tag: pixman-0.25.6~40 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=cf0d0d63645bcb6425a1e2d7b5d9f1e26e205247;p=platform%2Fupstream%2Fpixman.git 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 --- 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