Add explicit acquire/release semantics to MIPS' atomic_exchange_and_add.
authorMaxim Kuvyrkov <maxim@codesourcery.com>
Tue, 14 Aug 2012 02:55:34 +0000 (19:55 -0700)
committerMaxim Kuvyrkov <maxim@codesourcery.com>
Tue, 14 Aug 2012 02:55:34 +0000 (19:55 -0700)
ports/ChangeLog.mips
ports/sysdeps/mips/bits/atomic.h

index 0c503bcafb7c34a9da3135bee28525fbf9bf5d09..f8a9af198cf841c2268919fe744e1df4e6652668 100644 (file)
@@ -1,3 +1,14 @@
+2012-08-13  Maxim Kuvyrkov  <maxim@codesourcery.com>
+
+        [__GNUC_PREREQ (4, 8)]
+        (atomic_exchange_and_add): Split into ...
+        (atomic_exchange_and_add_acq, atomic_exchange_and_add_rel): ... these.
+        New atomic macros.
+        [!__GNUC_PREREQ (4, 8)]
+        (atomic_exchange_and_add): Split into ...
+        (atomic_exchange_and_add_acq, atomic_exchange_and_add_rel): ... these.
+        New atomic macros.
+
 2012-08-09  Joseph Myers  <joseph@codesourcery.com>
 
        * sysdeps/unix/sysv/linux/mips/kernel-features.h
index b0942737dd38ba5708b7581bd4186b0e4eac1078..749e166908bbf3571de5b93488db051a39031f7a 100644 (file)
@@ -193,11 +193,13 @@ typedef uintmax_t uatomic_max_t;
   __atomic_fetch_add (mem, value, model)
 # endif
 
-/* ??? Barrier semantics for atomic_exchange_and_add appear to be
-   undefined.  Use full barrier for now, as that's safe.  */
-# define atomic_exchange_and_add(mem, value)                           \
+# define atomic_exchange_and_add_acq(mem, value)                       \
   __atomic_val_bysize (__arch_exchange_and_add, int, mem, value,       \
-                      __ATOMIC_ACQ_REL)
+                      __ATOMIC_ACQUIRE)
+
+# define atomic_exchange_and_add_rel(mem, value)                       \
+  __atomic_val_bysize (__arch_exchange_and_add, int, mem, value,       \
+                      __ATOMIC_RELEASE)
 #else /* !__GNUC_PREREQ (4, 8) */
 /* This implementation using inline assembly will be removed once glibc
    requires GCC 4.8 or later to build.  */
@@ -434,11 +436,13 @@ typedef uintmax_t uatomic_max_t;
   __prev; })
 # endif
 
-/* ??? Barrier semantics for atomic_exchange_and_add appear to be 
-   undefined.  Use full barrier for now, as that's safe.  */
-# define atomic_exchange_and_add(mem, value) \
-  __atomic_val_bysize (__arch_exchange_and_add, int, mem, value,             \
-                      MIPS_SYNC_STR, MIPS_SYNC_STR)
+# define atomic_exchange_and_add_acq(mem, value)                       \
+  __atomic_val_bysize (__arch_exchange_and_add, int, mem, value,       \
+                      "", MIPS_SYNC_STR)
+
+# define atomic_exchange_and_add_rel(mem, value)                       \
+  __atomic_val_bysize (__arch_exchange_and_add, int, mem, value,       \
+                      MIPS_SYNC_STR, "")
 #endif /* __GNUC_PREREQ (4, 8) */
 
 /* TODO: More atomic operations could be implemented efficiently; only the