https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121148
Jonathan Wakely <redi at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |uros at gcc dot gnu.org
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Similarly, the i386 code in config/cpu/i386/atomicity.h uses assembly for a
spinlock, but does a plain signed addition, so needs a fix:
register _Atomic_word __result, __tmp = 1;
// Obtain the atomic exchange/add spin lock.
do
{
__asm__ __volatile__ ("xchg{l} {%0,%1|%1,%0}"
: "=m" (_Atomicity_lock<0>::_S_atomicity_lock),
"+r" (__tmp)
: "m" (_Atomicity_lock<0>::_S_atomicity_lock));
}
while (__tmp);
__result = *__mem;
*__mem += __val;
// Release spin lock.
_Atomicity_lock<0>::_S_atomicity_lock = 0;
The i486 code in config/cpu/i486/atomicity.h looks OK already, XADD should wrap
with no UB:
register _Atomic_word __result;
__asm__ __volatile__ ("lock; xadd{l} {%0,%1|%1,%0}"
: "=r" (__result), "=m" (*__mem)
: "0" (__val), "m" (*__mem));