[Pixman] [PATCH] Use "=a" and "=d" constraints for rdtsc inline assembly

Matt Turner mattst88 at gmail.com
Wed Mar 14 14:57:31 PDT 2012


On Wed, Mar 14, 2012 at 5:29 PM, Søren Sandmann <sandmann at cs.au.dk> wrote:
> From: Søren Sandmann Pedersen <ssp at redhat.com>
>
> 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 files 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
> --
> 1.6.0.6

Interesting. What were the symptoms of this bug?


More information about the Pixman mailing list