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));

Reply via email to