21#if !defined(AO_PREFER_BUILTIN_ATOMICS) && !defined(AO_THREAD_SANITIZER) \
22 && !defined(AO_UNIPROCESSOR)
26 __asm__ __volatile__(
"dmb ishst" : : :
"memory");
28# define AO_HAVE_nop_write
34#if !defined(__clang__) || AO_CLANG_PREREQ(3, 9)
36# include "../standard_ao_double_t.h"
42#if (!defined(__ILP32__) && !defined(__clang__)) \
43 || defined(AO_AARCH64_ASM_LOAD_STORE_CAS)
45# ifndef AO_PREFER_GENERALIZED
55 __asm__ __volatile__(
"//AO_double_load\n"
57 " ldxp %w0, %w1, %3\n"
58 " stxp %w2, %w0, %w1, %3"
61 " stxp %w2, %0, %1, %3"
63 :
"=&r" (
result.AO_val1),
"=&r" (
result.AO_val2),
"=&r" (status)
68# define AO_HAVE_double_load
77 __asm__ __volatile__(
"//AO_double_load_acquire\n"
79 " ldaxp %w0, %w1, %3\n"
80 " stxp %w2, %w0, %w1, %3"
83 " stxp %w2, %0, %1, %3"
85 :
"=&r" (
result.AO_val1),
"=&r" (
result.AO_val2),
"=&r" (status)
90# define AO_HAVE_double_load_acquire
99 __asm__ __volatile__(
"//AO_double_store\n"
101 " ldxp %w0, %w1, %3\n"
102 " stxp %w2, %w4, %w5, %3"
105 " stxp %w2, %4, %5, %3"
107 :
"=&r" (old_val.
AO_val1),
"=&r" (old_val.
AO_val2),
"=&r" (status),
115# define AO_HAVE_double_store
124 __asm__ __volatile__(
"//AO_double_store_release\n"
126 " ldxp %w0, %w1, %3\n"
127 " stlxp %w2, %w4, %w5, %3"
130 " stlxp %w2, %4, %5, %3"
132 :
"=&r" (old_val.
AO_val1),
"=&r" (old_val.
AO_val2),
"=&r" (status),
137# define AO_HAVE_double_store_release
148 __asm__ __volatile__(
"//AO_double_compare_and_swap\n"
150 " ldxp %w0, %w1, %2\n"
154 :
"=&r" (
tmp.AO_val1),
"=&r" (
tmp.AO_val2)
158 __asm__ __volatile__(
160 " stxp %w0, %w2, %w3, %1\n"
162 " stxp %w0, %2, %3, %1\n"
164 :
"=&r" (
result),
"=Q" (*addr)
169# define AO_HAVE_double_compare_and_swap
179 __asm__ __volatile__(
"//AO_double_compare_and_swap_acquire\n"
181 " ldaxp %w0, %w1, %2\n"
183 " ldaxp %0, %1, %2\n"
185 :
"=&r" (
tmp.AO_val1),
"=&r" (
tmp.AO_val2)
189 __asm__ __volatile__(
191 " stxp %w0, %w2, %w3, %1\n"
193 " stxp %w0, %2, %3, %1\n"
195 :
"=&r" (
result),
"=Q" (*addr)
200# define AO_HAVE_double_compare_and_swap_acquire
210 __asm__ __volatile__(
"//AO_double_compare_and_swap_release\n"
212 " ldxp %w0, %w1, %2\n"
216 :
"=&r" (
tmp.AO_val1),
"=&r" (
tmp.AO_val2)
220 __asm__ __volatile__(
222 " stlxp %w0, %w2, %w3, %1\n"
224 " stlxp %w0, %2, %3, %1\n"
226 :
"=&r" (
result),
"=Q" (*addr)
231# define AO_HAVE_double_compare_and_swap_release
241 __asm__ __volatile__(
"//AO_double_compare_and_swap_full\n"
243 " ldaxp %w0, %w1, %2\n"
245 " ldaxp %0, %1, %2\n"
247 :
"=&r" (
tmp.AO_val1),
"=&r" (
tmp.AO_val2)
251 __asm__ __volatile__(
253 " stlxp %w0, %w2, %w3, %1\n"
255 " stlxp %w0, %2, %3, %1\n"
257 :
"=&r" (
result),
"=Q" (*addr)
262# define AO_HAVE_double_compare_and_swap_full
269# define AO_GCC_HAVE_double_SYNC_CAS
274#if (defined(__clang__) && !AO_CLANG_PREREQ(3, 8)) || defined(__APPLE_CC__)
276# define AO_GCC_FORCE_HAVE_CAS
281#undef AO_GCC_FORCE_HAVE_CAS
282#undef AO_GCC_HAVE_double_SYNC_CAS
AO_INLINE void AO_nop_write(void)
AO_INLINE int AO_double_compare_and_swap(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val)
AO_INLINE int AO_double_compare_and_swap_release(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val)
AO_INLINE void AO_double_store_release(volatile AO_double_t *addr, AO_double_t value)
AO_INLINE int AO_double_compare_and_swap_acquire(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val)
AO_INLINE AO_double_t AO_double_load_acquire(const volatile AO_double_t *addr)
AO_INLINE int AO_double_compare_and_swap_full(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val)
AO_INLINE AO_double_t AO_double_load(const volatile AO_double_t *addr)
AO_INLINE void AO_double_store(volatile AO_double_t *addr, AO_double_t value)
#define AO_EXPECT_FALSE(expr)