12#if AO_CLANG_PREREQ(3, 9) && !defined(AO_DISABLE_GCC_ATOMICS)
16# define AO_GCC_FORCE_HAVE_CAS
18# define AO_GCC_HAVE_double_SYNC_CAS
19# include "../standard_ao_double_t.h"
25#include "../all_aligned_atomic_load_store.h"
27#include "../test_and_set_t_is_ao_t.h"
36 __asm__ __volatile__(
"syncht" : : :
"memory");
38#define AO_HAVE_nop_full
43#ifndef AO_PREFER_GENERALIZED
51 " %0 = memw_locked(%3);\n"
52 " %1 = add (%0,%4);\n"
53 " memw_locked(%3,p1) = %1;\n"
54 " if (!p1) jump 1b;\n"
55 :
"=&r"(oldval),
"=&r"(newval),
"+m"(*addr)
56 :
"r"(addr),
"r"(incr)
60#define AO_HAVE_fetch_and_add
70 " %0 = memw_locked(%2);\n"
72 " p2 = cmp.eq(%0,#0);\n"
73 " if (!p2.new) jump:nt 2f;\n"
75 " memw_locked(%2,p1) = %3;\n"
76 " if (!p1) jump 1b;\n"
78 :
"=&r"(oldval),
"+m"(*addr)
79 :
"r"(addr),
"r"(locked_value)
80 :
"memory",
"p1",
"p2");
83#define AO_HAVE_test_and_set
86#ifndef AO_GENERALIZE_ASM_BOOL_CAS
94 " %0 = memw_locked(%3);\n"
96 " p2 = cmp.eq(%0,%4);\n"
97 " if (!p2.new) jump:nt 2f;\n"
99 " memw_locked(%3,p1) = %5;\n"
100 " if (!p1) jump 1b;\n"
103 :
"=&r" (__oldval),
"+r" (
result),
"+m"(*addr)
104 :
"r" (addr),
"r" (old),
"r" (new_val)
105 :
"p1",
"p2",
"memory"
109# define AO_HAVE_compare_and_swap
117 __asm__ __volatile__(
119 " %0 = memw_locked(%2);\n"
121 " p2 = cmp.eq(%0,%3);\n"
122 " if (!p2.new) jump:nt 2f;\n"
124 " memw_locked(%2,p1) = %4;\n"
125 " if (!p1) jump 1b;\n"
127 :
"=&r" (__oldval),
"+m"(*addr)
128 :
"r" (addr),
"r" (old_val),
"r" (new_val)
129 :
"p1",
"p2",
"memory"
133#define AO_HAVE_fetch_compare_and_swap
139#undef AO_GCC_FORCE_HAVE_CAS
140#undef AO_GCC_HAVE_double_SYNC_CAS
AO_INLINE AO_t AO_fetch_and_add(volatile AO_t *addr, AO_t incr)
AO_INLINE int AO_compare_and_swap(volatile AO_t *addr, AO_t old, AO_t new_val)
AO_INLINE AO_t AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val)
AO_INLINE AO_TS_VAL_t AO_test_and_set(volatile AO_TS_t *addr)
AO_INLINE void AO_nop_full(void)