https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121148

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |schwab at gcc dot gnu.org

--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> ---
The m68k code in config/cpu/m68k/atomicity.h looks OK too, ADD.L will wrap and
not produce UB:


    _Atomic_word __result;
    short __level, __tmpsr;
    __asm__ __volatile__ ("move%.w %%sr,%0\n\tor%.l %0,%1\n\tmove%.w %1,%%sr"
                          : "=d"(__level), "=d"(__tmpsr) : "1"(0x700));

    __result = *__mem;
    *__mem = __result + __val;
    __asm__ __volatile__ ("move%.w %0,%%sr" : : "d"(__level));

    return __result;


but the rtems code needs to use unsigned types for the plain C++ addition:


  {
    _Atomic_word __result;
    short __level, __tmpsr;
    __asm__ __volatile__ ("move%.w %%sr,%0\n\tor%.l %0,%1\n\tmove%.w %1,%%sr"
                          : "=d"(__level), "=d"(__tmpsr) : "1"(0x700));

    __result = *__mem;
    *__mem = __result + __val;
    __asm__ __volatile__ ("move%.w %0,%%sr" : : "d"(__level));


and similarly for the fallback version at the end of
config/cpu/m68k/atomicity.h

    __result = *__mem;
    *__mem = __result + __val;

Reply via email to