]> granicus.if.org Git - libatomic_ops/commitdiff
Implement AO_double_load/store based on guaranteed x86 access atomicity
authorIvan Maidanski <ivmai@mail.ru>
Sun, 6 Jan 2013 15:51:57 +0000 (19:51 +0400)
committerIvan Maidanski <ivmai@mail.ru>
Sun, 6 Jan 2013 15:51:57 +0000 (19:51 +0400)
* src/atomic_ops/sysdeps/gcc/x86.h: Define
AO_ACCESS_double_CHECK_ALIGNED and include double_atomic_load_store.h
after inclusion of standard_ao_double_t.h (only if AO_t is 32-bit).
* src/atomic_ops/sysdeps/msftc/x86.h: Likewise.
* src/atomic_ops/sysdeps/sunc/x86.h: Likewise.

src/atomic_ops/sysdeps/gcc/x86.h
src/atomic_ops/sysdeps/msftc/x86.h
src/atomic_ops/sysdeps/sunc/x86.h

index ad28d6daed8179bfff8a0008717672a8e3f00b7a..6f9953dac8628fe1657f5c89d5fdff8d413e046e 100644 (file)
@@ -182,6 +182,12 @@ AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val,
 #if !defined(__x86_64__) && !defined(AO_USE_SYNC_CAS_BUILTIN)
 # include "../standard_ao_double_t.h"
 
+  /* Reading or writing a quadword aligned on a 64-bit boundary is      */
+  /* always carried out atomically on at least a Pentium according to   */
+  /* Chapter 8.1.1 of Volume 3A Part 1 of Intel processor manuals.      */
+# define AO_ACCESS_double_CHECK_ALIGNED
+# include "../loadstore/double_atomic_load_store.h"
+
   /* Returns nonzero if the comparison succeeded.       */
   /* Really requires at least a Pentium.                */
   AO_INLINE int
@@ -249,6 +255,11 @@ AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val,
 #elif defined(__ILP32__) || !defined(__x86_64__)
 # include "../standard_ao_double_t.h"
 
+  /* Reading or writing a quadword aligned on a 64-bit boundary is      */
+  /* always carried out atomically (requires at least a Pentium).       */
+# define AO_ACCESS_double_CHECK_ALIGNED
+# include "../loadstore/double_atomic_load_store.h"
+
   /* X32 has native support for 64-bit integer operations (AO_double_t  */
   /* is a 64-bit integer and we could use 64-bit cmpxchg).              */
   /* This primitive is used by compare_double_and_swap_double_full.     */
index f6b2a1b485fd844887a19e297a8b72676156584f..3d31c322d82dd017445e9ba0f4f637ecbf481565 100644 (file)
@@ -119,6 +119,11 @@ AO_test_and_set_full(volatile AO_TS_t *addr)
 #ifdef AO_ASSUME_VISTA
 # include "../standard_ao_double_t.h"
 
+  /* Reading or writing a quadword aligned on a 64-bit boundary is      */
+  /* always carried out atomically (requires at least a Pentium).       */
+# define AO_ACCESS_double_CHECK_ALIGNED
+# include "../loadstore/double_atomic_load_store.h"
+
   /* Whenever we run on a Pentium class machine, we have that certain   */
   /* function.                                                          */
 # pragma intrinsic (_InterlockedCompareExchange64)
index 12b2e21e14bf08c40303836905df0d8a8c9922a1..a7468bb403e7ff8ef28bff15d374d4753b5309eb 100644 (file)
@@ -168,6 +168,11 @@ AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val,
 # ifndef AO_NO_CMPXCHG8B
 #   include "../standard_ao_double_t.h"
 
+    /* Reading or writing a quadword aligned on a 64-bit boundary is    */
+    /* always carried out atomically (requires at least a Pentium).     */
+#   define AO_ACCESS_double_CHECK_ALIGNED
+#   include "../loadstore/double_atomic_load_store.h"
+
     /* Returns nonzero if the comparison succeeded.     */
     /* Really requires at least a Pentium.              */
     AO_INLINE int