summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libstdc++-v3/ChangeLog6
-rw-r--r--libstdc++-v3/config/cpu/m68k/atomicity.h17
2 files changed, 16 insertions, 7 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 7b0f83f0304..043e3cd5c1d 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,9 @@
+2003-10-16 Bernardo Innocenti <bernie@develer.com>
+
+ * 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 <pcarlini@suse.de>
* 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 d33bbef6dd9..c4ce17dac67 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");
OpenPOWER on IntegriCloud