From 2bbbef494874d1f652cd6cc9104ad506d24006d6 Mon Sep 17 00:00:00 2001 From: George Koehler Date: Tue, 4 Aug 2020 18:06:58 +0000 Subject: Implement fetch-CAS for sparc (gcc) * src/atomic_ops/sysdeps/gcc/sparc.h [!AO_NO_SPARC_V9] (AO_fetch_compare_and_swap_full): Implement; remove TODO. --- src/atomic_ops/sysdeps/gcc/sparc.h | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/atomic_ops/sysdeps/gcc/sparc.h b/src/atomic_ops/sysdeps/gcc/sparc.h index 79eb763..9bd48d4 100644 --- a/src/atomic_ops/sysdeps/gcc/sparc.h +++ b/src/atomic_ops/sysdeps/gcc/sparc.h @@ -61,7 +61,21 @@ AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) { } #define AO_HAVE_compare_and_swap_full -/* TODO: implement AO_fetch_compare_and_swap. */ +AO_INLINE AO_t +AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) { + __asm__ __volatile__ ("membar #StoreLoad | #LoadLoad\n\t" +# if defined(__arch64__) + "casx [%1],%2,%0\n\t" +# else + "cas [%1],%2,%0\n\t" /* 32-bit version */ +# endif + "membar #StoreLoad | #StoreStore\n\t" + : "+r" (new_val) + : "r" (addr), "r" (old) + : "memory"); + return new_val; +} +#define AO_HAVE_fetch_compare_and_swap_full #endif /* !AO_NO_SPARC_V9 */ /* TODO: Extend this for SPARC v8 and v9 (V8 also has swap, V9 has CAS, */ -- cgit v1.2.1