From 068c84e3b5320330426785102f3d784f078d1144 Mon Sep 17 00:00:00 2001 From: Bernardo Innocenti Date: Thu, 16 Oct 2003 21:47:45 +0200 Subject: [PATCH] atomicity.h (__exchange_and_add): Use TAS on __mcf5400__. * config/cpu/m68k/atomicity.h (__exchange_and_add): Use TAS on __mcf5400__. Don't rely on __mc68000__ to detect a bare 68000. Document SMP safeness of asm macros. From-SVN: r72570 --- libstdc++-v3/ChangeLog | 6 ++++++ libstdc++-v3/config/cpu/m68k/atomicity.h | 17 ++++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 7b0f83f0304a..043e3cd5c1d7 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,9 @@ +2003-10-16 Bernardo Innocenti + + * config/cpu/m68k/atomicity.h (__exchange_and_add): Use TAS on + __mcf5400__. Don't rely on __mc68000__ to detect a bare 68000. + Document SMP safeness of asm macros. + 2003-10-16 Paolo Carlini * src/locale.cc (locale::locale(const char*)): Tweak diff --git a/libstdc++-v3/config/cpu/m68k/atomicity.h b/libstdc++-v3/config/cpu/m68k/atomicity.h index d33bbef6dd97..c4ce17dac67e 100644 --- a/libstdc++-v3/config/cpu/m68k/atomicity.h +++ b/libstdc++-v3/config/cpu/m68k/atomicity.h @@ -94,22 +94,25 @@ __exchange_and_add (volatile _Atomic_word *__mem, int __val) { _Atomic_word __result; -// bset with no immediate addressing -#if defined(__mcf5200__) || defined(__mcf5300__) || defined(__mcf5400__) +// bset with no immediate addressing (not SMP-safe) +#if defined(__mcf5200__) || defined(__mcf5300__) __asm__ __volatile__("1: bset.b #7,%0@\n\tjbne 1b" : /* no outputs */ : "a"(&__Atomicity_lock<0>::_S_atomicity_lock) : "cc", "memory"); -// bset with immediate addressing -#elif defined(__mc68000__) - __asm__ __volatile__("1: bset.b #7,%0\n\tjbne 1b" +// CPU32 and MCF5400 support test-and-set (SMP-safe). +#elif defined(__mcpu32__) || defined(__mcf5400__) + __asm__ __volatile__("1: tas %0\n\tjbne 1b" : "+m"(__Atomicity_lock<0>::_S_atomicity_lock) : /* none */ : "cc"); -#else // 680x0, cpu32, 5400 support test-and-set. - __asm__ __volatile__("1: tas %0\n\tjbne 1b" +// Use bset with immediate addressing for 68000/68010 (not SMP-safe) +// NOTE: TAS is available on the 68000, but unsupported by some Amiga +// memory controllers. +#else + __asm__ __volatile__("1: bset.b #7,%0\n\tjbne 1b" : "+m"(__Atomicity_lock<0>::_S_atomicity_lock) : /* none */ : "cc"); -- 2.47.3