Use "=a" and "=d" constraints for rdtsc inline assembly
authorSøren Sandmann Pedersen <ssp@redhat.com>
Wed, 14 Mar 2012 21:11:14 +0000 (17:11 -0400)
committerSøren Sandmann Pedersen <ssp@redhat.com>
Sat, 24 Mar 2012 20:26:07 +0000 (16:26 -0400)
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

index 9d96a93..0cba2e9 100644 (file)
@@ -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