Relax shareability domain for dmb st in AO_nop_write (ARM/AArch64)
authorSteve Capper <steve.capper@linaro.org>
Wed, 29 Oct 2014 22:16:14 +0000 (01:16 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Wed, 29 Oct 2014 22:16:14 +0000 (01:16 +0300)
* src/atomic_ops/sysdeps/gcc/aarch64.h (AO_nop_write): Replace "dmb st"
to "dmb ishst" (this way the barriers will occupy the inner shareable
domain).
* src/atomic_ops/sysdeps/gcc/arm.h (AO_nop_write): Likewise.

src/atomic_ops/sysdeps/gcc/aarch64.h
src/atomic_ops/sysdeps/gcc/arm.h

index 54e6d7f..f969f13 100644 (file)
@@ -23,7 +23,8 @@
   AO_INLINE void
   AO_nop_write(void)
   {
-    __asm__ __volatile__("dmb st" : : : "memory");
+    /* TODO: Use C++11 primitive. */
+    __asm__ __volatile__("dmb ishst" : : : "memory");
   }
 # define AO_HAVE_nop_write
 #endif
index c19f6da..3d841e9 100644 (file)
   AO_nop_write(void)
   {
     /* AO_THUMB_GO_ARM is empty. */
-    __asm__ __volatile__("dmb st" : : : "memory");
+    /* This will target the system domain and thus be overly            */
+    /* conservative as the CPUs will occupy the inner shareable domain. */
+    /* The plain variant (dmb st) is theoretically slower, and should   */
+    /* not be needed.  That said, with limited experimentation, a CPU   */
+    /* implementation for which it actually matters has not been found  */
+    /* yet, though they should already exist.                           */
+    /* Anyway, note that the "st" and "ishst" barriers are actually     */
+    /* quite weak and, as the libatomic_ops documentation states,       */
+    /* usually not what you really want.                                */
+    __asm__ __volatile__("dmb ishst" : : : "memory");
   }
 # define AO_HAVE_nop_write