From: Ivan Maidanski Date: Sat, 17 Aug 2013 07:48:59 +0000 (+0400) Subject: Fix ARMv7 LDREXD/STREXD double-wide operand specification (GCC/Clang) X-Git-Tag: libatomic_ops-7_2e~6 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a5c19ac61c311fb0bbe731a236a46c994339011c;p=libatomic_ops Fix ARMv7 LDREXD/STREXD double-wide operand specification (GCC/Clang) (Apply commit db2eef2 from 'master' branch.) * src/atomic_ops/sysdeps/gcc/arm.h (AO_double_compare_and_swap): Specify that LDREXD and STREXD use 2 adjacent registers (thus preventing Clang3.3 from register allocation failures leading to "registers may not be the same" or "even register required" GAS errors). Conflicts: src/atomic_ops/sysdeps/gcc/arm.h --- diff --git a/src/atomic_ops/sysdeps/gcc/arm.h b/src/atomic_ops/sysdeps/gcc/arm.h index e157b61..1c5af93 100644 --- a/src/atomic_ops/sysdeps/gcc/arm.h +++ b/src/atomic_ops/sysdeps/gcc/arm.h @@ -288,14 +288,14 @@ AO_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) do { __asm__ __volatile__("@AO_compare_double_and_swap_double\n" - " ldrexd %0, [%1]\n" /* get original to r1 & r2 */ + " ldrexd %0, %H0, [%1]\n" /* get original to r1 & r2 */ : "=&r"(tmp) : "r"(addr) : "cc"); if (tmp != old_val) break; __asm__ __volatile__( - " strexd %0, %2, [%3]\n" /* store new one if matched */ + " strexd %0, %2, %H2, [%3]\n" /* store new one if matched */ : "=&r"(result), "+m"(*addr) : "r"(new_val), "r"(addr) : "cc");