GCC built-in atomic operations and memory barriers
Russell King - ARM Linux
linux at arm.linux.org.uk
Wed Nov 4 16:03:00 EST 2009
On Wed, Nov 04, 2009 at 09:12:10PM +0100, Toby Douglass wrote:
> 382 do {
> 383 asm volatile("@ __cmpxchg4\n"
> 384 " ldrex %1, [%2]\n"
> 385 " mov %0, #0\n"
> 386 " teq %1, %3\n"
> 387 " strexeq %0, %4, [%2]\n"
> 388 : "=&r" (res), "=&r" (oldval)
> 389 : "r" (ptr), "Ir" (old), "r" (new)
> 390 : "memory", "cc");
> 391 } while (res);
>
> The "mov %0, #0" - why is this inbetween the ldrex and strexeq? it
> seems to me it could just as well happen before the ldrex, and doing so
> would reduce the time between the ldrex and strexeq and so reduce the
> chance of someone else modifying our target.
Because it probably doesn't. Loads normally have a 'result delay' which
cause a pipeline stall when the result is used in the next instruction.
It makes sense to fill those stall cycles with useful work, rather than
stalling the execution pipeline.
More information about the linux-arm-kernel
mailing list