Re: Should it be reported as a bug? (-O2 and cmpxchg instruction)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Andrew,

Thanks for prompt response. However, I am not sure how to use the earlyclobber modifier - this is actually the first gcc inline asembly code I've ever written.

Do you mean that I should add '&' sign to every operand in input operand list, or should I add the sign when using the operands or what?

The problem, AFAICS, is that cmpxchg modifies eax although eax is not an explicit operand of the instruction. Therefore optimiser has no idea that it is modified and acts as if it was unchanged :(

Martin

Andrew Haley wrote:
Martin Sustrik wrote:
Hi all,

I've encountered a problem with gcc inline assembly.

Following code, when optimised with -O2 gives following machine code:

           __asm__ volatile (
               "lock; cmpxchgl %1, %3\n\t"
               "jz 1f\n\t"
               "mov %2, %%eax\n\t"
               "lock; xchgl %%eax, %3\n\t"
               "1:\n\t"
               : "=a" (oldval)
               : "r" (thenval_), "r" (elseval_), "m" (value), "0" (0)
               : "memory", "cc");

4031a0:   31 c0                   xor    %eax,%eax
 4031a2:   f0 0f b1 55 40          lock cmpxchg %edx,0x40(%rbp)
 4031a7:   74 06                   je     4031af
 4031a9:   89 c0                   mov    %eax,%eax
 4031ab:   f0 87 45 40             lock xchg %eax,0x40(%rbp)

Note that %2 maps to %%eax (mov %2, %%eax --> mov %eax,%eax). This shouldn't happen given that cmpxchg modifies the value of %%eax.

Any idea whether this should be considered a bug and reported as such?

Look for "earlyclobber" in the section Constraint Modifier Characters

Andrew.


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux