]> granicus.if.org Git - libatomic_ops/commitdiff
Fix: Do not use LDREXD/STREXD for Clang3.2/arm (and earlier)
authorIvan Maidanski <ivmai@mail.ru>
Sat, 17 Aug 2013 11:05:36 +0000 (15:05 +0400)
committerIvan Maidanski <ivmai@mail.ru>
Sun, 18 Aug 2013 08:53:13 +0000 (12:53 +0400)
(Apply commit 2daf685 from 'master' branch.)

* src/atomic_ops/sysdeps/gcc/arm.h
(AO_compare_double_and_swap_double): Do not define for
pre-Clang3.3 (since the latter does not allocate register pairs for
LDREXD/STREXD instructions properly); add comment.

Conflicts:

    src/atomic_ops/sysdeps/gcc/arm.h

src/atomic_ops/sysdeps/gcc/arm.h

index 0aa5e7c97a7bedba5c98fb37293aa5ace798cbda..6d3418809c90e982d08724f68101fda6e53de3ea 100644 (file)
@@ -269,11 +269,15 @@ AO_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val)
 #if !defined(__ARM_ARCH_6__) && !defined(__ARM_ARCH_6J__) \
     && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6Z__) \
     && !defined(__ARM_ARCH_6ZT2__) && (!defined(__thumb__) \
-              || (defined(__thumb2__) && !defined(__ARM_ARCH_7__) \
-                  && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__)))
+        || (defined(__thumb2__) && !defined(__ARM_ARCH_7__) \
+            && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__))) \
+    && (!defined(__clang__) || (__clang_major__ > 3) \
+         || (__clang_major__ == 3 && __clang_minor__ >= 3))
   /* LDREXD/STREXD present in ARMv6K/M+ (see gas/config/tc-arm.c)       */
   /* In the Thumb mode, this works only starting from ARMv7 (except for */
-  /* the base and 'M' models).                                          */
+  /* the base and 'M' models).  Clang3.2 (and earlier) does not         */
+  /* allocate register pairs for LDREXD/STREXD properly (besides,       */
+  /* Clang3.1 does not support "%H<r>" operand specification).          */
   AO_INLINE int
   AO_compare_double_and_swap_double(volatile AO_double_t *addr,
                                     AO_t old_val1, AO_t old_val2,