[Pixman] [PATCH] [mmx] Mark some of the output variables as earlyclobber.

Matt Turner mattst88 at gmail.com
Sat Oct 30 15:35:06 PDT 2010


On Sat, Oct 30, 2010 at 6:05 PM, Søren Sandmann <sandmann at daimi.au.dk> wrote:
> From: Søren Sandmann Pedersen <ssp at redhat.com>
>
> GCC assumes that input variables in inline assembly are fully consumed
> before any output variable is written. This means it may allocate the
> variables in the same register unless the output variables are marked
> as early-clobber.
>
> From Jeremy Huddleston:
>
>    I noticed a problem building pixman with clang and reported it to
>    the clang developers.  They responded back with a comment about
>    the inline asm in pixman-mmx.c and suggested a fix:
>
>    """
>    Incidentally, Jeremy, in the asm that reads
>    __asm__ (
>    "movq %7, %0\n"
>    "movq %7, %1\n"
>    "movq %7, %2\n"
>    "movq %7, %3\n"
>    "movq %7, %4\n"
>    "movq %7, %5\n"
>    "movq %7, %6\n"
>    : "=y" (v1), "=y" (v2), "=y" (v3),
>      "=y" (v4), "=y" (v5), "=y" (v6), "=y" (v7)
>    : "y" (vfill));
>
>    all the output operands except the last one should be marked as
>    earlyclobber ("=&y"). This is working by accident with gcc.
>    """
>
> Cc: jeremyhu at apple.com
> ---
>  pixman/pixman-mmx.c |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/pixman/pixman-mmx.c b/pixman/pixman-mmx.c
> index e936c4c..34637a4 100644
> --- a/pixman/pixman-mmx.c
> +++ b/pixman/pixman-mmx.c
> @@ -1921,8 +1921,8 @@ pixman_fill_mmx (uint32_t *bits,
>         "movq          %7,     %4\n"
>         "movq          %7,     %5\n"
>         "movq          %7,     %6\n"
> -       : "=y" (v1), "=y" (v2), "=y" (v3),
> -         "=y" (v4), "=y" (v5), "=y" (v6), "=y" (v7)
> +       : "=&y" (v1), "=&y" (v2), "=&y" (v3),
> +         "=&y" (v4), "=&y" (v5), "=&y" (v6), "=y" (v7)
>        : "y" (vfill));
>  #endif
>
> --
> 1.7.3.1

Yep, that's the right thing to do.

Reviewed-by: Matt Turner <mattst88 at gmail.com>


More information about the Pixman mailing list