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;