Validity of __asm__ transformation with "m" reference

Martin Thuresson martin@mtme.org
Fri Jul 1 18:45:00 GMT 2011


In recent versions of GCC I have seen a transformation of inline
assembly that I'd like to confirm is valid.

The code in question can be found in mplayer/mp3lib/dct64_sse.c

          "movaps    %0, %%xmm0\n\t"
          "shufps    $27, %%xmm0, %%xmm0\n\t"
          "movaps    %1, %%xmm5\n\t"
          "movaps    %%xmm5, %%xmm6\n\t"
          :
          :"m"(*costab), "m"(*nnnn)

where nnnn is
 static const int nnnn[4] __attribute__((aligned(16))) = { 1 << 31, 1
<< 31, 1 << 31, 1 << 31 };

GCC turns this into:
     "movaps    %0, %%xmm0
      shufps    $27, %%xmm0, %%xmm0
      movaps    %1, %%xmm5
      movaps    %%xmm5, %%xmm6
      " :  : "m" costab_mmx[24], *"m" -2147483648*);

The new constant might end up in an unaligned address causing the
program to segfault on Intel platforms.

Marking nnnn volatile or changing the code to the following avoids the
transformation:

 __asm__(
            "movaps    %a0, %%xmm0\n\t"
            "shufps    $27, %%xmm0, %%xmm0\n\t"
            "movaps    %a1, %%xmm5\n\t"
            "movaps    %%xmm5, %%xmm6\n\t"
            :
            :"p"(costab), "p"(nnnn)
           );

Thanks!
Martin



More information about the Gcc mailing list