From 34e00a9a6017e9c162d332f4fb2dc95937cdede9 Mon Sep 17 00:00:00 2001 From: Ivan Maidanski Date: Thu, 3 Jan 2013 00:30:33 +0400 Subject: [PATCH] Add generalized CAS primitives of char/short/int size * src/atomic_ops/generalize-small.template (AO_XSIZE_fetch_compare_and_swap_acquire, AO_XSIZE_fetch_compare_and_swap_release, AO_XSIZE_fetch_compare_and_swap_write, AO_XSIZE_fetch_compare_and_swap_read, AO_XSIZE_fetch_compare_and_swap, AO_XSIZE_fetch_compare_and_swap_full, AO_XSIZE_fetch_compare_and_swap_release_write, AO_XSIZE_fetch_compare_and_swap_acquire_read, AO_XSIZE_fetch_compare_and_swap_dd_acquire_read, AO_XSIZE_compare_and_swap_acquire, AO_XSIZE_compare_and_swap_release, AO_XSIZE_compare_and_swap_write, AO_XSIZE_compare_and_swap_read, AO_XSIZE_compare_and_swap, AO_XSIZE_compare_and_swap_full, AO_XSIZE_compare_and_swap_release_write, AO_XSIZE_compare_and_swap_acquire_read, AO_XSIZE_compare_and_swap_dd_acquire_read): New template primitive (code copied from generalize.h for AO_t); define the corresponding AO_HAVE_XSIZE_x. * src/atomic_ops/generalize-small.h: Regenerate. * src/atomic_ops/generalize.h (AO_compare_and_swap_acquire, AO_compare_and_swap_release, AO_compare_and_swap_write, AO_compare_and_swap_read, AO_compare_and_swap, AO_compare_and_swap_full, AO_compare_and_swap_release_write, AO_compare_and_swap_acquire_read, AO_compare_and_swap_dd_acquire_read, AO_fetch_compare_and_swap_acquire, AO_fetch_compare_and_swap_release, AO_fetch_compare_and_swap_write, AO_fetch_compare_and_swap_read, AO_fetch_compare_and_swap, AO_fetch_compare_and_swap_full, AO_fetch_compare_and_swap_release_write, AO_fetch_compare_and_swap_acquire_read, AO_fetch_compare_and_swap_dd_acquire_read): Remove (since present in the auto-generated generalize-small.h) together with the corresponding AO_HAVE_x. --- src/atomic_ops/generalize-small.h | 928 +++++++++++++++++++++++ src/atomic_ops/generalize-small.template | 232 ++++++ src/atomic_ops/generalize.h | 226 ------ 3 files changed, 1160 insertions(+), 226 deletions(-) diff --git a/src/atomic_ops/generalize-small.h b/src/atomic_ops/generalize-small.h index 0b6d5fb..9bd3a93 100644 --- a/src/atomic_ops/generalize-small.h +++ b/src/atomic_ops/generalize-small.h @@ -156,7 +156,239 @@ # define AO_HAVE_char_store_full #endif +/* char_fetch_compare_and_swap */ +#if defined(AO_HAVE_char_fetch_compare_and_swap) \ + && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_char_fetch_compare_and_swap_acquire) + AO_INLINE unsigned/**/char + AO_char_fetch_compare_and_swap_acquire(volatile unsigned/**/char *addr, + unsigned/**/char old_val, unsigned/**/char new_val) + { + unsigned/**/char result = AO_char_fetch_compare_and_swap(addr, old_val, new_val); + AO_nop_full(); + return result; + } +# define AO_HAVE_char_fetch_compare_and_swap_acquire +#endif +#if defined(AO_HAVE_char_fetch_compare_and_swap) \ + && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_char_fetch_compare_and_swap_release) +# define AO_char_fetch_compare_and_swap_release(addr, old_val, new_val) \ + (AO_nop_full(), \ + AO_char_fetch_compare_and_swap(addr, old_val, new_val)) +# define AO_HAVE_char_fetch_compare_and_swap_release +#endif +#if defined(AO_HAVE_char_fetch_compare_and_swap_full) +# if !defined(AO_HAVE_char_fetch_compare_and_swap_release) +# define AO_char_fetch_compare_and_swap_release(addr, old_val, new_val) \ + AO_char_fetch_compare_and_swap_full(addr, old_val, new_val) +# define AO_HAVE_char_fetch_compare_and_swap_release +# endif +# if !defined(AO_HAVE_char_fetch_compare_and_swap_acquire) +# define AO_char_fetch_compare_and_swap_acquire(addr, old_val, new_val) \ + AO_char_fetch_compare_and_swap_full(addr, old_val, new_val) +# define AO_HAVE_char_fetch_compare_and_swap_acquire +# endif +# if !defined(AO_HAVE_char_fetch_compare_and_swap_write) +# define AO_char_fetch_compare_and_swap_write(addr, old_val, new_val) \ + AO_char_fetch_compare_and_swap_full(addr, old_val, new_val) +# define AO_HAVE_char_fetch_compare_and_swap_write +# endif +# if !defined(AO_HAVE_char_fetch_compare_and_swap_read) +# define AO_char_fetch_compare_and_swap_read(addr, old_val, new_val) \ + AO_char_fetch_compare_and_swap_full(addr, old_val, new_val) +# define AO_HAVE_char_fetch_compare_and_swap_read +# endif +#endif /* AO_HAVE_char_fetch_compare_and_swap_full */ + +#if !defined(AO_HAVE_char_fetch_compare_and_swap) \ + && defined(AO_HAVE_char_fetch_compare_and_swap_release) +# define AO_char_fetch_compare_and_swap(addr, old_val, new_val) \ + AO_char_fetch_compare_and_swap_release(addr, old_val, new_val) +# define AO_HAVE_char_fetch_compare_and_swap +#endif +#if !defined(AO_HAVE_char_fetch_compare_and_swap) \ + && defined(AO_HAVE_char_fetch_compare_and_swap_acquire) +# define AO_char_fetch_compare_and_swap(addr, old_val, new_val) \ + AO_char_fetch_compare_and_swap_acquire(addr, old_val, new_val) +# define AO_HAVE_char_fetch_compare_and_swap +#endif +#if !defined(AO_HAVE_char_fetch_compare_and_swap) \ + && defined(AO_HAVE_char_fetch_compare_and_swap_write) +# define AO_char_fetch_compare_and_swap(addr, old_val, new_val) \ + AO_char_fetch_compare_and_swap_write(addr, old_val, new_val) +# define AO_HAVE_char_fetch_compare_and_swap +#endif +#if !defined(AO_HAVE_char_fetch_compare_and_swap) \ + && defined(AO_HAVE_char_fetch_compare_and_swap_read) +# define AO_char_fetch_compare_and_swap(addr, old_val, new_val) \ + AO_char_fetch_compare_and_swap_read(addr, old_val, new_val) +# define AO_HAVE_char_fetch_compare_and_swap +#endif + +#if defined(AO_HAVE_char_fetch_compare_and_swap_acquire) \ + && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_char_fetch_compare_and_swap_full) +# define AO_char_fetch_compare_and_swap_full(addr, old_val, new_val) \ + (AO_nop_full(), \ + AO_char_fetch_compare_and_swap_acquire(addr, old_val, new_val)) +# define AO_HAVE_char_fetch_compare_and_swap_full +#endif + +#if !defined(AO_HAVE_char_fetch_compare_and_swap_release_write) \ + && defined(AO_HAVE_char_fetch_compare_and_swap_write) +# define AO_char_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ + AO_char_fetch_compare_and_swap_write(addr, old_val, new_val) +# define AO_HAVE_char_fetch_compare_and_swap_release_write +#endif +#if !defined(AO_HAVE_char_fetch_compare_and_swap_release_write) \ + && defined(AO_HAVE_char_fetch_compare_and_swap_release) +# define AO_char_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ + AO_char_fetch_compare_and_swap_release(addr, old_val, new_val) +# define AO_HAVE_char_fetch_compare_and_swap_release_write +#endif +#if !defined(AO_HAVE_char_fetch_compare_and_swap_acquire_read) \ + && defined(AO_HAVE_char_fetch_compare_and_swap_read) +# define AO_char_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ + AO_char_fetch_compare_and_swap_read(addr, old_val, new_val) +# define AO_HAVE_char_fetch_compare_and_swap_acquire_read +#endif +#if !defined(AO_HAVE_char_fetch_compare_and_swap_acquire_read) \ + && defined(AO_HAVE_char_fetch_compare_and_swap_acquire) +# define AO_char_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ + AO_char_fetch_compare_and_swap_acquire(addr, old_val, new_val) +# define AO_HAVE_char_fetch_compare_and_swap_acquire_read +#endif + +#ifdef AO_NO_DD_ORDERING +# if defined(AO_HAVE_char_fetch_compare_and_swap_acquire_read) +# define AO_char_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ + AO_char_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) +# define AO_HAVE_char_fetch_compare_and_swap_dd_acquire_read +# endif +#else +# if defined(AO_HAVE_char_fetch_compare_and_swap) +# define AO_char_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ + AO_char_fetch_compare_and_swap(addr, old_val, new_val) +# define AO_HAVE_char_fetch_compare_and_swap_dd_acquire_read +# endif +#endif /* !AO_NO_DD_ORDERING */ + /* char_compare_and_swap */ +#if defined(AO_HAVE_char_compare_and_swap) && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_char_compare_and_swap_acquire) + AO_INLINE int + AO_char_compare_and_swap_acquire(volatile unsigned/**/char *addr, unsigned/**/char old, + unsigned/**/char new_val) + { + int result = AO_char_compare_and_swap(addr, old, new_val); + AO_nop_full(); + return result; + } +# define AO_HAVE_char_compare_and_swap_acquire +#endif +#if defined(AO_HAVE_char_compare_and_swap) && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_char_compare_and_swap_release) +# define AO_char_compare_and_swap_release(addr, old, new_val) \ + (AO_nop_full(), AO_char_compare_and_swap(addr, old, new_val)) +# define AO_HAVE_char_compare_and_swap_release +#endif +#if defined(AO_HAVE_char_compare_and_swap_full) +# if !defined(AO_HAVE_char_compare_and_swap_release) +# define AO_char_compare_and_swap_release(addr, old, new_val) \ + AO_char_compare_and_swap_full(addr, old, new_val) +# define AO_HAVE_char_compare_and_swap_release +# endif +# if !defined(AO_HAVE_char_compare_and_swap_acquire) +# define AO_char_compare_and_swap_acquire(addr, old, new_val) \ + AO_char_compare_and_swap_full(addr, old, new_val) +# define AO_HAVE_char_compare_and_swap_acquire +# endif +# if !defined(AO_HAVE_char_compare_and_swap_write) +# define AO_char_compare_and_swap_write(addr, old, new_val) \ + AO_char_compare_and_swap_full(addr, old, new_val) +# define AO_HAVE_char_compare_and_swap_write +# endif +# if !defined(AO_HAVE_char_compare_and_swap_read) +# define AO_char_compare_and_swap_read(addr, old, new_val) \ + AO_char_compare_and_swap_full(addr, old, new_val) +# define AO_HAVE_char_compare_and_swap_read +# endif +#endif /* AO_HAVE_char_compare_and_swap_full */ + +#if !defined(AO_HAVE_char_compare_and_swap) \ + && defined(AO_HAVE_char_compare_and_swap_release) +# define AO_char_compare_and_swap(addr, old, new_val) \ + AO_char_compare_and_swap_release(addr, old, new_val) +# define AO_HAVE_char_compare_and_swap +#endif +#if !defined(AO_HAVE_char_compare_and_swap) \ + && defined(AO_HAVE_char_compare_and_swap_acquire) +# define AO_char_compare_and_swap(addr, old, new_val) \ + AO_char_compare_and_swap_acquire(addr, old, new_val) +# define AO_HAVE_char_compare_and_swap +#endif +#if !defined(AO_HAVE_char_compare_and_swap) \ + && defined(AO_HAVE_char_compare_and_swap_write) +# define AO_char_compare_and_swap(addr, old, new_val) \ + AO_char_compare_and_swap_write(addr, old, new_val) +# define AO_HAVE_char_compare_and_swap +#endif +#if !defined(AO_HAVE_char_compare_and_swap) \ + && defined(AO_HAVE_char_compare_and_swap_read) +# define AO_char_compare_and_swap(addr, old, new_val) \ + AO_char_compare_and_swap_read(addr, old, new_val) +# define AO_HAVE_char_compare_and_swap +#endif + +#if defined(AO_HAVE_char_compare_and_swap_acquire) \ + && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_char_compare_and_swap_full) +# define AO_char_compare_and_swap_full(addr, old, new_val) \ + (AO_nop_full(), \ + AO_char_compare_and_swap_acquire(addr, old, new_val)) +# define AO_HAVE_char_compare_and_swap_full +#endif + +#if !defined(AO_HAVE_char_compare_and_swap_release_write) \ + && defined(AO_HAVE_char_compare_and_swap_write) +# define AO_char_compare_and_swap_release_write(addr, old, new_val) \ + AO_char_compare_and_swap_write(addr, old, new_val) +# define AO_HAVE_char_compare_and_swap_release_write +#endif +#if !defined(AO_HAVE_char_compare_and_swap_release_write) \ + && defined(AO_HAVE_char_compare_and_swap_release) +# define AO_char_compare_and_swap_release_write(addr, old, new_val) \ + AO_char_compare_and_swap_release(addr, old, new_val) +# define AO_HAVE_char_compare_and_swap_release_write +#endif +#if !defined(AO_HAVE_char_compare_and_swap_acquire_read) \ + && defined(AO_HAVE_char_compare_and_swap_read) +# define AO_char_compare_and_swap_acquire_read(addr, old, new_val) \ + AO_char_compare_and_swap_read(addr, old, new_val) +# define AO_HAVE_char_compare_and_swap_acquire_read +#endif +#if !defined(AO_HAVE_char_compare_and_swap_acquire_read) \ + && defined(AO_HAVE_char_compare_and_swap_acquire) +# define AO_char_compare_and_swap_acquire_read(addr, old, new_val) \ + AO_char_compare_and_swap_acquire(addr, old, new_val) +# define AO_HAVE_char_compare_and_swap_acquire_read +#endif + +#ifdef AO_NO_DD_ORDERING +# if defined(AO_HAVE_char_compare_and_swap_acquire_read) +# define AO_char_compare_and_swap_dd_acquire_read(addr, old, new_val) \ + AO_char_compare_and_swap_acquire_read(addr, old, new_val) +# define AO_HAVE_char_compare_and_swap_dd_acquire_read +# endif +#else +# if defined(AO_HAVE_char_compare_and_swap) +# define AO_char_compare_and_swap_dd_acquire_read(addr, old, new_val) \ + AO_char_compare_and_swap(addr, old, new_val) +# define AO_HAVE_char_compare_and_swap_dd_acquire_read +# endif +#endif /* !AO_NO_DD_ORDERING */ + #if defined(AO_HAVE_char_fetch_compare_and_swap_full) \ && !defined(AO_HAVE_char_compare_and_swap_full) AO_INLINE int @@ -1059,7 +1291,239 @@ # define AO_HAVE_short_store_full #endif +/* short_fetch_compare_and_swap */ +#if defined(AO_HAVE_short_fetch_compare_and_swap) \ + && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_short_fetch_compare_and_swap_acquire) + AO_INLINE unsigned/**/short + AO_short_fetch_compare_and_swap_acquire(volatile unsigned/**/short *addr, + unsigned/**/short old_val, unsigned/**/short new_val) + { + unsigned/**/short result = AO_short_fetch_compare_and_swap(addr, old_val, new_val); + AO_nop_full(); + return result; + } +# define AO_HAVE_short_fetch_compare_and_swap_acquire +#endif +#if defined(AO_HAVE_short_fetch_compare_and_swap) \ + && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_short_fetch_compare_and_swap_release) +# define AO_short_fetch_compare_and_swap_release(addr, old_val, new_val) \ + (AO_nop_full(), \ + AO_short_fetch_compare_and_swap(addr, old_val, new_val)) +# define AO_HAVE_short_fetch_compare_and_swap_release +#endif +#if defined(AO_HAVE_short_fetch_compare_and_swap_full) +# if !defined(AO_HAVE_short_fetch_compare_and_swap_release) +# define AO_short_fetch_compare_and_swap_release(addr, old_val, new_val) \ + AO_short_fetch_compare_and_swap_full(addr, old_val, new_val) +# define AO_HAVE_short_fetch_compare_and_swap_release +# endif +# if !defined(AO_HAVE_short_fetch_compare_and_swap_acquire) +# define AO_short_fetch_compare_and_swap_acquire(addr, old_val, new_val) \ + AO_short_fetch_compare_and_swap_full(addr, old_val, new_val) +# define AO_HAVE_short_fetch_compare_and_swap_acquire +# endif +# if !defined(AO_HAVE_short_fetch_compare_and_swap_write) +# define AO_short_fetch_compare_and_swap_write(addr, old_val, new_val) \ + AO_short_fetch_compare_and_swap_full(addr, old_val, new_val) +# define AO_HAVE_short_fetch_compare_and_swap_write +# endif +# if !defined(AO_HAVE_short_fetch_compare_and_swap_read) +# define AO_short_fetch_compare_and_swap_read(addr, old_val, new_val) \ + AO_short_fetch_compare_and_swap_full(addr, old_val, new_val) +# define AO_HAVE_short_fetch_compare_and_swap_read +# endif +#endif /* AO_HAVE_short_fetch_compare_and_swap_full */ + +#if !defined(AO_HAVE_short_fetch_compare_and_swap) \ + && defined(AO_HAVE_short_fetch_compare_and_swap_release) +# define AO_short_fetch_compare_and_swap(addr, old_val, new_val) \ + AO_short_fetch_compare_and_swap_release(addr, old_val, new_val) +# define AO_HAVE_short_fetch_compare_and_swap +#endif +#if !defined(AO_HAVE_short_fetch_compare_and_swap) \ + && defined(AO_HAVE_short_fetch_compare_and_swap_acquire) +# define AO_short_fetch_compare_and_swap(addr, old_val, new_val) \ + AO_short_fetch_compare_and_swap_acquire(addr, old_val, new_val) +# define AO_HAVE_short_fetch_compare_and_swap +#endif +#if !defined(AO_HAVE_short_fetch_compare_and_swap) \ + && defined(AO_HAVE_short_fetch_compare_and_swap_write) +# define AO_short_fetch_compare_and_swap(addr, old_val, new_val) \ + AO_short_fetch_compare_and_swap_write(addr, old_val, new_val) +# define AO_HAVE_short_fetch_compare_and_swap +#endif +#if !defined(AO_HAVE_short_fetch_compare_and_swap) \ + && defined(AO_HAVE_short_fetch_compare_and_swap_read) +# define AO_short_fetch_compare_and_swap(addr, old_val, new_val) \ + AO_short_fetch_compare_and_swap_read(addr, old_val, new_val) +# define AO_HAVE_short_fetch_compare_and_swap +#endif + +#if defined(AO_HAVE_short_fetch_compare_and_swap_acquire) \ + && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_short_fetch_compare_and_swap_full) +# define AO_short_fetch_compare_and_swap_full(addr, old_val, new_val) \ + (AO_nop_full(), \ + AO_short_fetch_compare_and_swap_acquire(addr, old_val, new_val)) +# define AO_HAVE_short_fetch_compare_and_swap_full +#endif + +#if !defined(AO_HAVE_short_fetch_compare_and_swap_release_write) \ + && defined(AO_HAVE_short_fetch_compare_and_swap_write) +# define AO_short_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ + AO_short_fetch_compare_and_swap_write(addr, old_val, new_val) +# define AO_HAVE_short_fetch_compare_and_swap_release_write +#endif +#if !defined(AO_HAVE_short_fetch_compare_and_swap_release_write) \ + && defined(AO_HAVE_short_fetch_compare_and_swap_release) +# define AO_short_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ + AO_short_fetch_compare_and_swap_release(addr, old_val, new_val) +# define AO_HAVE_short_fetch_compare_and_swap_release_write +#endif +#if !defined(AO_HAVE_short_fetch_compare_and_swap_acquire_read) \ + && defined(AO_HAVE_short_fetch_compare_and_swap_read) +# define AO_short_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ + AO_short_fetch_compare_and_swap_read(addr, old_val, new_val) +# define AO_HAVE_short_fetch_compare_and_swap_acquire_read +#endif +#if !defined(AO_HAVE_short_fetch_compare_and_swap_acquire_read) \ + && defined(AO_HAVE_short_fetch_compare_and_swap_acquire) +# define AO_short_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ + AO_short_fetch_compare_and_swap_acquire(addr, old_val, new_val) +# define AO_HAVE_short_fetch_compare_and_swap_acquire_read +#endif + +#ifdef AO_NO_DD_ORDERING +# if defined(AO_HAVE_short_fetch_compare_and_swap_acquire_read) +# define AO_short_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ + AO_short_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) +# define AO_HAVE_short_fetch_compare_and_swap_dd_acquire_read +# endif +#else +# if defined(AO_HAVE_short_fetch_compare_and_swap) +# define AO_short_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ + AO_short_fetch_compare_and_swap(addr, old_val, new_val) +# define AO_HAVE_short_fetch_compare_and_swap_dd_acquire_read +# endif +#endif /* !AO_NO_DD_ORDERING */ + /* short_compare_and_swap */ +#if defined(AO_HAVE_short_compare_and_swap) && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_short_compare_and_swap_acquire) + AO_INLINE int + AO_short_compare_and_swap_acquire(volatile unsigned/**/short *addr, unsigned/**/short old, + unsigned/**/short new_val) + { + int result = AO_short_compare_and_swap(addr, old, new_val); + AO_nop_full(); + return result; + } +# define AO_HAVE_short_compare_and_swap_acquire +#endif +#if defined(AO_HAVE_short_compare_and_swap) && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_short_compare_and_swap_release) +# define AO_short_compare_and_swap_release(addr, old, new_val) \ + (AO_nop_full(), AO_short_compare_and_swap(addr, old, new_val)) +# define AO_HAVE_short_compare_and_swap_release +#endif +#if defined(AO_HAVE_short_compare_and_swap_full) +# if !defined(AO_HAVE_short_compare_and_swap_release) +# define AO_short_compare_and_swap_release(addr, old, new_val) \ + AO_short_compare_and_swap_full(addr, old, new_val) +# define AO_HAVE_short_compare_and_swap_release +# endif +# if !defined(AO_HAVE_short_compare_and_swap_acquire) +# define AO_short_compare_and_swap_acquire(addr, old, new_val) \ + AO_short_compare_and_swap_full(addr, old, new_val) +# define AO_HAVE_short_compare_and_swap_acquire +# endif +# if !defined(AO_HAVE_short_compare_and_swap_write) +# define AO_short_compare_and_swap_write(addr, old, new_val) \ + AO_short_compare_and_swap_full(addr, old, new_val) +# define AO_HAVE_short_compare_and_swap_write +# endif +# if !defined(AO_HAVE_short_compare_and_swap_read) +# define AO_short_compare_and_swap_read(addr, old, new_val) \ + AO_short_compare_and_swap_full(addr, old, new_val) +# define AO_HAVE_short_compare_and_swap_read +# endif +#endif /* AO_HAVE_short_compare_and_swap_full */ + +#if !defined(AO_HAVE_short_compare_and_swap) \ + && defined(AO_HAVE_short_compare_and_swap_release) +# define AO_short_compare_and_swap(addr, old, new_val) \ + AO_short_compare_and_swap_release(addr, old, new_val) +# define AO_HAVE_short_compare_and_swap +#endif +#if !defined(AO_HAVE_short_compare_and_swap) \ + && defined(AO_HAVE_short_compare_and_swap_acquire) +# define AO_short_compare_and_swap(addr, old, new_val) \ + AO_short_compare_and_swap_acquire(addr, old, new_val) +# define AO_HAVE_short_compare_and_swap +#endif +#if !defined(AO_HAVE_short_compare_and_swap) \ + && defined(AO_HAVE_short_compare_and_swap_write) +# define AO_short_compare_and_swap(addr, old, new_val) \ + AO_short_compare_and_swap_write(addr, old, new_val) +# define AO_HAVE_short_compare_and_swap +#endif +#if !defined(AO_HAVE_short_compare_and_swap) \ + && defined(AO_HAVE_short_compare_and_swap_read) +# define AO_short_compare_and_swap(addr, old, new_val) \ + AO_short_compare_and_swap_read(addr, old, new_val) +# define AO_HAVE_short_compare_and_swap +#endif + +#if defined(AO_HAVE_short_compare_and_swap_acquire) \ + && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_short_compare_and_swap_full) +# define AO_short_compare_and_swap_full(addr, old, new_val) \ + (AO_nop_full(), \ + AO_short_compare_and_swap_acquire(addr, old, new_val)) +# define AO_HAVE_short_compare_and_swap_full +#endif + +#if !defined(AO_HAVE_short_compare_and_swap_release_write) \ + && defined(AO_HAVE_short_compare_and_swap_write) +# define AO_short_compare_and_swap_release_write(addr, old, new_val) \ + AO_short_compare_and_swap_write(addr, old, new_val) +# define AO_HAVE_short_compare_and_swap_release_write +#endif +#if !defined(AO_HAVE_short_compare_and_swap_release_write) \ + && defined(AO_HAVE_short_compare_and_swap_release) +# define AO_short_compare_and_swap_release_write(addr, old, new_val) \ + AO_short_compare_and_swap_release(addr, old, new_val) +# define AO_HAVE_short_compare_and_swap_release_write +#endif +#if !defined(AO_HAVE_short_compare_and_swap_acquire_read) \ + && defined(AO_HAVE_short_compare_and_swap_read) +# define AO_short_compare_and_swap_acquire_read(addr, old, new_val) \ + AO_short_compare_and_swap_read(addr, old, new_val) +# define AO_HAVE_short_compare_and_swap_acquire_read +#endif +#if !defined(AO_HAVE_short_compare_and_swap_acquire_read) \ + && defined(AO_HAVE_short_compare_and_swap_acquire) +# define AO_short_compare_and_swap_acquire_read(addr, old, new_val) \ + AO_short_compare_and_swap_acquire(addr, old, new_val) +# define AO_HAVE_short_compare_and_swap_acquire_read +#endif + +#ifdef AO_NO_DD_ORDERING +# if defined(AO_HAVE_short_compare_and_swap_acquire_read) +# define AO_short_compare_and_swap_dd_acquire_read(addr, old, new_val) \ + AO_short_compare_and_swap_acquire_read(addr, old, new_val) +# define AO_HAVE_short_compare_and_swap_dd_acquire_read +# endif +#else +# if defined(AO_HAVE_short_compare_and_swap) +# define AO_short_compare_and_swap_dd_acquire_read(addr, old, new_val) \ + AO_short_compare_and_swap(addr, old, new_val) +# define AO_HAVE_short_compare_and_swap_dd_acquire_read +# endif +#endif /* !AO_NO_DD_ORDERING */ + #if defined(AO_HAVE_short_fetch_compare_and_swap_full) \ && !defined(AO_HAVE_short_compare_and_swap_full) AO_INLINE int @@ -1962,7 +2426,239 @@ # define AO_HAVE_int_store_full #endif +/* int_fetch_compare_and_swap */ +#if defined(AO_HAVE_int_fetch_compare_and_swap) \ + && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_int_fetch_compare_and_swap_acquire) + AO_INLINE unsigned + AO_int_fetch_compare_and_swap_acquire(volatile unsigned *addr, + unsigned old_val, unsigned new_val) + { + unsigned result = AO_int_fetch_compare_and_swap(addr, old_val, new_val); + AO_nop_full(); + return result; + } +# define AO_HAVE_int_fetch_compare_and_swap_acquire +#endif +#if defined(AO_HAVE_int_fetch_compare_and_swap) \ + && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_int_fetch_compare_and_swap_release) +# define AO_int_fetch_compare_and_swap_release(addr, old_val, new_val) \ + (AO_nop_full(), \ + AO_int_fetch_compare_and_swap(addr, old_val, new_val)) +# define AO_HAVE_int_fetch_compare_and_swap_release +#endif +#if defined(AO_HAVE_int_fetch_compare_and_swap_full) +# if !defined(AO_HAVE_int_fetch_compare_and_swap_release) +# define AO_int_fetch_compare_and_swap_release(addr, old_val, new_val) \ + AO_int_fetch_compare_and_swap_full(addr, old_val, new_val) +# define AO_HAVE_int_fetch_compare_and_swap_release +# endif +# if !defined(AO_HAVE_int_fetch_compare_and_swap_acquire) +# define AO_int_fetch_compare_and_swap_acquire(addr, old_val, new_val) \ + AO_int_fetch_compare_and_swap_full(addr, old_val, new_val) +# define AO_HAVE_int_fetch_compare_and_swap_acquire +# endif +# if !defined(AO_HAVE_int_fetch_compare_and_swap_write) +# define AO_int_fetch_compare_and_swap_write(addr, old_val, new_val) \ + AO_int_fetch_compare_and_swap_full(addr, old_val, new_val) +# define AO_HAVE_int_fetch_compare_and_swap_write +# endif +# if !defined(AO_HAVE_int_fetch_compare_and_swap_read) +# define AO_int_fetch_compare_and_swap_read(addr, old_val, new_val) \ + AO_int_fetch_compare_and_swap_full(addr, old_val, new_val) +# define AO_HAVE_int_fetch_compare_and_swap_read +# endif +#endif /* AO_HAVE_int_fetch_compare_and_swap_full */ + +#if !defined(AO_HAVE_int_fetch_compare_and_swap) \ + && defined(AO_HAVE_int_fetch_compare_and_swap_release) +# define AO_int_fetch_compare_and_swap(addr, old_val, new_val) \ + AO_int_fetch_compare_and_swap_release(addr, old_val, new_val) +# define AO_HAVE_int_fetch_compare_and_swap +#endif +#if !defined(AO_HAVE_int_fetch_compare_and_swap) \ + && defined(AO_HAVE_int_fetch_compare_and_swap_acquire) +# define AO_int_fetch_compare_and_swap(addr, old_val, new_val) \ + AO_int_fetch_compare_and_swap_acquire(addr, old_val, new_val) +# define AO_HAVE_int_fetch_compare_and_swap +#endif +#if !defined(AO_HAVE_int_fetch_compare_and_swap) \ + && defined(AO_HAVE_int_fetch_compare_and_swap_write) +# define AO_int_fetch_compare_and_swap(addr, old_val, new_val) \ + AO_int_fetch_compare_and_swap_write(addr, old_val, new_val) +# define AO_HAVE_int_fetch_compare_and_swap +#endif +#if !defined(AO_HAVE_int_fetch_compare_and_swap) \ + && defined(AO_HAVE_int_fetch_compare_and_swap_read) +# define AO_int_fetch_compare_and_swap(addr, old_val, new_val) \ + AO_int_fetch_compare_and_swap_read(addr, old_val, new_val) +# define AO_HAVE_int_fetch_compare_and_swap +#endif + +#if defined(AO_HAVE_int_fetch_compare_and_swap_acquire) \ + && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_int_fetch_compare_and_swap_full) +# define AO_int_fetch_compare_and_swap_full(addr, old_val, new_val) \ + (AO_nop_full(), \ + AO_int_fetch_compare_and_swap_acquire(addr, old_val, new_val)) +# define AO_HAVE_int_fetch_compare_and_swap_full +#endif + +#if !defined(AO_HAVE_int_fetch_compare_and_swap_release_write) \ + && defined(AO_HAVE_int_fetch_compare_and_swap_write) +# define AO_int_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ + AO_int_fetch_compare_and_swap_write(addr, old_val, new_val) +# define AO_HAVE_int_fetch_compare_and_swap_release_write +#endif +#if !defined(AO_HAVE_int_fetch_compare_and_swap_release_write) \ + && defined(AO_HAVE_int_fetch_compare_and_swap_release) +# define AO_int_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ + AO_int_fetch_compare_and_swap_release(addr, old_val, new_val) +# define AO_HAVE_int_fetch_compare_and_swap_release_write +#endif +#if !defined(AO_HAVE_int_fetch_compare_and_swap_acquire_read) \ + && defined(AO_HAVE_int_fetch_compare_and_swap_read) +# define AO_int_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ + AO_int_fetch_compare_and_swap_read(addr, old_val, new_val) +# define AO_HAVE_int_fetch_compare_and_swap_acquire_read +#endif +#if !defined(AO_HAVE_int_fetch_compare_and_swap_acquire_read) \ + && defined(AO_HAVE_int_fetch_compare_and_swap_acquire) +# define AO_int_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ + AO_int_fetch_compare_and_swap_acquire(addr, old_val, new_val) +# define AO_HAVE_int_fetch_compare_and_swap_acquire_read +#endif + +#ifdef AO_NO_DD_ORDERING +# if defined(AO_HAVE_int_fetch_compare_and_swap_acquire_read) +# define AO_int_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ + AO_int_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) +# define AO_HAVE_int_fetch_compare_and_swap_dd_acquire_read +# endif +#else +# if defined(AO_HAVE_int_fetch_compare_and_swap) +# define AO_int_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ + AO_int_fetch_compare_and_swap(addr, old_val, new_val) +# define AO_HAVE_int_fetch_compare_and_swap_dd_acquire_read +# endif +#endif /* !AO_NO_DD_ORDERING */ + /* int_compare_and_swap */ +#if defined(AO_HAVE_int_compare_and_swap) && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_int_compare_and_swap_acquire) + AO_INLINE int + AO_int_compare_and_swap_acquire(volatile unsigned *addr, unsigned old, + unsigned new_val) + { + int result = AO_int_compare_and_swap(addr, old, new_val); + AO_nop_full(); + return result; + } +# define AO_HAVE_int_compare_and_swap_acquire +#endif +#if defined(AO_HAVE_int_compare_and_swap) && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_int_compare_and_swap_release) +# define AO_int_compare_and_swap_release(addr, old, new_val) \ + (AO_nop_full(), AO_int_compare_and_swap(addr, old, new_val)) +# define AO_HAVE_int_compare_and_swap_release +#endif +#if defined(AO_HAVE_int_compare_and_swap_full) +# if !defined(AO_HAVE_int_compare_and_swap_release) +# define AO_int_compare_and_swap_release(addr, old, new_val) \ + AO_int_compare_and_swap_full(addr, old, new_val) +# define AO_HAVE_int_compare_and_swap_release +# endif +# if !defined(AO_HAVE_int_compare_and_swap_acquire) +# define AO_int_compare_and_swap_acquire(addr, old, new_val) \ + AO_int_compare_and_swap_full(addr, old, new_val) +# define AO_HAVE_int_compare_and_swap_acquire +# endif +# if !defined(AO_HAVE_int_compare_and_swap_write) +# define AO_int_compare_and_swap_write(addr, old, new_val) \ + AO_int_compare_and_swap_full(addr, old, new_val) +# define AO_HAVE_int_compare_and_swap_write +# endif +# if !defined(AO_HAVE_int_compare_and_swap_read) +# define AO_int_compare_and_swap_read(addr, old, new_val) \ + AO_int_compare_and_swap_full(addr, old, new_val) +# define AO_HAVE_int_compare_and_swap_read +# endif +#endif /* AO_HAVE_int_compare_and_swap_full */ + +#if !defined(AO_HAVE_int_compare_and_swap) \ + && defined(AO_HAVE_int_compare_and_swap_release) +# define AO_int_compare_and_swap(addr, old, new_val) \ + AO_int_compare_and_swap_release(addr, old, new_val) +# define AO_HAVE_int_compare_and_swap +#endif +#if !defined(AO_HAVE_int_compare_and_swap) \ + && defined(AO_HAVE_int_compare_and_swap_acquire) +# define AO_int_compare_and_swap(addr, old, new_val) \ + AO_int_compare_and_swap_acquire(addr, old, new_val) +# define AO_HAVE_int_compare_and_swap +#endif +#if !defined(AO_HAVE_int_compare_and_swap) \ + && defined(AO_HAVE_int_compare_and_swap_write) +# define AO_int_compare_and_swap(addr, old, new_val) \ + AO_int_compare_and_swap_write(addr, old, new_val) +# define AO_HAVE_int_compare_and_swap +#endif +#if !defined(AO_HAVE_int_compare_and_swap) \ + && defined(AO_HAVE_int_compare_and_swap_read) +# define AO_int_compare_and_swap(addr, old, new_val) \ + AO_int_compare_and_swap_read(addr, old, new_val) +# define AO_HAVE_int_compare_and_swap +#endif + +#if defined(AO_HAVE_int_compare_and_swap_acquire) \ + && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_int_compare_and_swap_full) +# define AO_int_compare_and_swap_full(addr, old, new_val) \ + (AO_nop_full(), \ + AO_int_compare_and_swap_acquire(addr, old, new_val)) +# define AO_HAVE_int_compare_and_swap_full +#endif + +#if !defined(AO_HAVE_int_compare_and_swap_release_write) \ + && defined(AO_HAVE_int_compare_and_swap_write) +# define AO_int_compare_and_swap_release_write(addr, old, new_val) \ + AO_int_compare_and_swap_write(addr, old, new_val) +# define AO_HAVE_int_compare_and_swap_release_write +#endif +#if !defined(AO_HAVE_int_compare_and_swap_release_write) \ + && defined(AO_HAVE_int_compare_and_swap_release) +# define AO_int_compare_and_swap_release_write(addr, old, new_val) \ + AO_int_compare_and_swap_release(addr, old, new_val) +# define AO_HAVE_int_compare_and_swap_release_write +#endif +#if !defined(AO_HAVE_int_compare_and_swap_acquire_read) \ + && defined(AO_HAVE_int_compare_and_swap_read) +# define AO_int_compare_and_swap_acquire_read(addr, old, new_val) \ + AO_int_compare_and_swap_read(addr, old, new_val) +# define AO_HAVE_int_compare_and_swap_acquire_read +#endif +#if !defined(AO_HAVE_int_compare_and_swap_acquire_read) \ + && defined(AO_HAVE_int_compare_and_swap_acquire) +# define AO_int_compare_and_swap_acquire_read(addr, old, new_val) \ + AO_int_compare_and_swap_acquire(addr, old, new_val) +# define AO_HAVE_int_compare_and_swap_acquire_read +#endif + +#ifdef AO_NO_DD_ORDERING +# if defined(AO_HAVE_int_compare_and_swap_acquire_read) +# define AO_int_compare_and_swap_dd_acquire_read(addr, old, new_val) \ + AO_int_compare_and_swap_acquire_read(addr, old, new_val) +# define AO_HAVE_int_compare_and_swap_dd_acquire_read +# endif +#else +# if defined(AO_HAVE_int_compare_and_swap) +# define AO_int_compare_and_swap_dd_acquire_read(addr, old, new_val) \ + AO_int_compare_and_swap(addr, old, new_val) +# define AO_HAVE_int_compare_and_swap_dd_acquire_read +# endif +#endif /* !AO_NO_DD_ORDERING */ + #if defined(AO_HAVE_int_fetch_compare_and_swap_full) \ && !defined(AO_HAVE_int_compare_and_swap_full) AO_INLINE int @@ -2865,7 +3561,239 @@ # define AO_HAVE_store_full #endif +/* fetch_compare_and_swap */ +#if defined(AO_HAVE_fetch_compare_and_swap) \ + && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_fetch_compare_and_swap_acquire) + AO_INLINE AO_t + AO_fetch_compare_and_swap_acquire(volatile AO_t *addr, + AO_t old_val, AO_t new_val) + { + AO_t result = AO_fetch_compare_and_swap(addr, old_val, new_val); + AO_nop_full(); + return result; + } +# define AO_HAVE_fetch_compare_and_swap_acquire +#endif +#if defined(AO_HAVE_fetch_compare_and_swap) \ + && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_fetch_compare_and_swap_release) +# define AO_fetch_compare_and_swap_release(addr, old_val, new_val) \ + (AO_nop_full(), \ + AO_fetch_compare_and_swap(addr, old_val, new_val)) +# define AO_HAVE_fetch_compare_and_swap_release +#endif +#if defined(AO_HAVE_fetch_compare_and_swap_full) +# if !defined(AO_HAVE_fetch_compare_and_swap_release) +# define AO_fetch_compare_and_swap_release(addr, old_val, new_val) \ + AO_fetch_compare_and_swap_full(addr, old_val, new_val) +# define AO_HAVE_fetch_compare_and_swap_release +# endif +# if !defined(AO_HAVE_fetch_compare_and_swap_acquire) +# define AO_fetch_compare_and_swap_acquire(addr, old_val, new_val) \ + AO_fetch_compare_and_swap_full(addr, old_val, new_val) +# define AO_HAVE_fetch_compare_and_swap_acquire +# endif +# if !defined(AO_HAVE_fetch_compare_and_swap_write) +# define AO_fetch_compare_and_swap_write(addr, old_val, new_val) \ + AO_fetch_compare_and_swap_full(addr, old_val, new_val) +# define AO_HAVE_fetch_compare_and_swap_write +# endif +# if !defined(AO_HAVE_fetch_compare_and_swap_read) +# define AO_fetch_compare_and_swap_read(addr, old_val, new_val) \ + AO_fetch_compare_and_swap_full(addr, old_val, new_val) +# define AO_HAVE_fetch_compare_and_swap_read +# endif +#endif /* AO_HAVE_fetch_compare_and_swap_full */ + +#if !defined(AO_HAVE_fetch_compare_and_swap) \ + && defined(AO_HAVE_fetch_compare_and_swap_release) +# define AO_fetch_compare_and_swap(addr, old_val, new_val) \ + AO_fetch_compare_and_swap_release(addr, old_val, new_val) +# define AO_HAVE_fetch_compare_and_swap +#endif +#if !defined(AO_HAVE_fetch_compare_and_swap) \ + && defined(AO_HAVE_fetch_compare_and_swap_acquire) +# define AO_fetch_compare_and_swap(addr, old_val, new_val) \ + AO_fetch_compare_and_swap_acquire(addr, old_val, new_val) +# define AO_HAVE_fetch_compare_and_swap +#endif +#if !defined(AO_HAVE_fetch_compare_and_swap) \ + && defined(AO_HAVE_fetch_compare_and_swap_write) +# define AO_fetch_compare_and_swap(addr, old_val, new_val) \ + AO_fetch_compare_and_swap_write(addr, old_val, new_val) +# define AO_HAVE_fetch_compare_and_swap +#endif +#if !defined(AO_HAVE_fetch_compare_and_swap) \ + && defined(AO_HAVE_fetch_compare_and_swap_read) +# define AO_fetch_compare_and_swap(addr, old_val, new_val) \ + AO_fetch_compare_and_swap_read(addr, old_val, new_val) +# define AO_HAVE_fetch_compare_and_swap +#endif + +#if defined(AO_HAVE_fetch_compare_and_swap_acquire) \ + && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_fetch_compare_and_swap_full) +# define AO_fetch_compare_and_swap_full(addr, old_val, new_val) \ + (AO_nop_full(), \ + AO_fetch_compare_and_swap_acquire(addr, old_val, new_val)) +# define AO_HAVE_fetch_compare_and_swap_full +#endif + +#if !defined(AO_HAVE_fetch_compare_and_swap_release_write) \ + && defined(AO_HAVE_fetch_compare_and_swap_write) +# define AO_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ + AO_fetch_compare_and_swap_write(addr, old_val, new_val) +# define AO_HAVE_fetch_compare_and_swap_release_write +#endif +#if !defined(AO_HAVE_fetch_compare_and_swap_release_write) \ + && defined(AO_HAVE_fetch_compare_and_swap_release) +# define AO_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ + AO_fetch_compare_and_swap_release(addr, old_val, new_val) +# define AO_HAVE_fetch_compare_and_swap_release_write +#endif +#if !defined(AO_HAVE_fetch_compare_and_swap_acquire_read) \ + && defined(AO_HAVE_fetch_compare_and_swap_read) +# define AO_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ + AO_fetch_compare_and_swap_read(addr, old_val, new_val) +# define AO_HAVE_fetch_compare_and_swap_acquire_read +#endif +#if !defined(AO_HAVE_fetch_compare_and_swap_acquire_read) \ + && defined(AO_HAVE_fetch_compare_and_swap_acquire) +# define AO_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ + AO_fetch_compare_and_swap_acquire(addr, old_val, new_val) +# define AO_HAVE_fetch_compare_and_swap_acquire_read +#endif + +#ifdef AO_NO_DD_ORDERING +# if defined(AO_HAVE_fetch_compare_and_swap_acquire_read) +# define AO_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ + AO_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) +# define AO_HAVE_fetch_compare_and_swap_dd_acquire_read +# endif +#else +# if defined(AO_HAVE_fetch_compare_and_swap) +# define AO_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ + AO_fetch_compare_and_swap(addr, old_val, new_val) +# define AO_HAVE_fetch_compare_and_swap_dd_acquire_read +# endif +#endif /* !AO_NO_DD_ORDERING */ + /* compare_and_swap */ +#if defined(AO_HAVE_compare_and_swap) && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_compare_and_swap_acquire) + AO_INLINE int + AO_compare_and_swap_acquire(volatile AO_t *addr, AO_t old, + AO_t new_val) + { + int result = AO_compare_and_swap(addr, old, new_val); + AO_nop_full(); + return result; + } +# define AO_HAVE_compare_and_swap_acquire +#endif +#if defined(AO_HAVE_compare_and_swap) && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_compare_and_swap_release) +# define AO_compare_and_swap_release(addr, old, new_val) \ + (AO_nop_full(), AO_compare_and_swap(addr, old, new_val)) +# define AO_HAVE_compare_and_swap_release +#endif +#if defined(AO_HAVE_compare_and_swap_full) +# if !defined(AO_HAVE_compare_and_swap_release) +# define AO_compare_and_swap_release(addr, old, new_val) \ + AO_compare_and_swap_full(addr, old, new_val) +# define AO_HAVE_compare_and_swap_release +# endif +# if !defined(AO_HAVE_compare_and_swap_acquire) +# define AO_compare_and_swap_acquire(addr, old, new_val) \ + AO_compare_and_swap_full(addr, old, new_val) +# define AO_HAVE_compare_and_swap_acquire +# endif +# if !defined(AO_HAVE_compare_and_swap_write) +# define AO_compare_and_swap_write(addr, old, new_val) \ + AO_compare_and_swap_full(addr, old, new_val) +# define AO_HAVE_compare_and_swap_write +# endif +# if !defined(AO_HAVE_compare_and_swap_read) +# define AO_compare_and_swap_read(addr, old, new_val) \ + AO_compare_and_swap_full(addr, old, new_val) +# define AO_HAVE_compare_and_swap_read +# endif +#endif /* AO_HAVE_compare_and_swap_full */ + +#if !defined(AO_HAVE_compare_and_swap) \ + && defined(AO_HAVE_compare_and_swap_release) +# define AO_compare_and_swap(addr, old, new_val) \ + AO_compare_and_swap_release(addr, old, new_val) +# define AO_HAVE_compare_and_swap +#endif +#if !defined(AO_HAVE_compare_and_swap) \ + && defined(AO_HAVE_compare_and_swap_acquire) +# define AO_compare_and_swap(addr, old, new_val) \ + AO_compare_and_swap_acquire(addr, old, new_val) +# define AO_HAVE_compare_and_swap +#endif +#if !defined(AO_HAVE_compare_and_swap) \ + && defined(AO_HAVE_compare_and_swap_write) +# define AO_compare_and_swap(addr, old, new_val) \ + AO_compare_and_swap_write(addr, old, new_val) +# define AO_HAVE_compare_and_swap +#endif +#if !defined(AO_HAVE_compare_and_swap) \ + && defined(AO_HAVE_compare_and_swap_read) +# define AO_compare_and_swap(addr, old, new_val) \ + AO_compare_and_swap_read(addr, old, new_val) +# define AO_HAVE_compare_and_swap +#endif + +#if defined(AO_HAVE_compare_and_swap_acquire) \ + && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_compare_and_swap_full) +# define AO_compare_and_swap_full(addr, old, new_val) \ + (AO_nop_full(), \ + AO_compare_and_swap_acquire(addr, old, new_val)) +# define AO_HAVE_compare_and_swap_full +#endif + +#if !defined(AO_HAVE_compare_and_swap_release_write) \ + && defined(AO_HAVE_compare_and_swap_write) +# define AO_compare_and_swap_release_write(addr, old, new_val) \ + AO_compare_and_swap_write(addr, old, new_val) +# define AO_HAVE_compare_and_swap_release_write +#endif +#if !defined(AO_HAVE_compare_and_swap_release_write) \ + && defined(AO_HAVE_compare_and_swap_release) +# define AO_compare_and_swap_release_write(addr, old, new_val) \ + AO_compare_and_swap_release(addr, old, new_val) +# define AO_HAVE_compare_and_swap_release_write +#endif +#if !defined(AO_HAVE_compare_and_swap_acquire_read) \ + && defined(AO_HAVE_compare_and_swap_read) +# define AO_compare_and_swap_acquire_read(addr, old, new_val) \ + AO_compare_and_swap_read(addr, old, new_val) +# define AO_HAVE_compare_and_swap_acquire_read +#endif +#if !defined(AO_HAVE_compare_and_swap_acquire_read) \ + && defined(AO_HAVE_compare_and_swap_acquire) +# define AO_compare_and_swap_acquire_read(addr, old, new_val) \ + AO_compare_and_swap_acquire(addr, old, new_val) +# define AO_HAVE_compare_and_swap_acquire_read +#endif + +#ifdef AO_NO_DD_ORDERING +# if defined(AO_HAVE_compare_and_swap_acquire_read) +# define AO_compare_and_swap_dd_acquire_read(addr, old, new_val) \ + AO_compare_and_swap_acquire_read(addr, old, new_val) +# define AO_HAVE_compare_and_swap_dd_acquire_read +# endif +#else +# if defined(AO_HAVE_compare_and_swap) +# define AO_compare_and_swap_dd_acquire_read(addr, old, new_val) \ + AO_compare_and_swap(addr, old, new_val) +# define AO_HAVE_compare_and_swap_dd_acquire_read +# endif +#endif /* !AO_NO_DD_ORDERING */ + #if defined(AO_HAVE_fetch_compare_and_swap_full) \ && !defined(AO_HAVE_compare_and_swap_full) AO_INLINE int diff --git a/src/atomic_ops/generalize-small.template b/src/atomic_ops/generalize-small.template index ba824b5..27abab1 100644 --- a/src/atomic_ops/generalize-small.template +++ b/src/atomic_ops/generalize-small.template @@ -156,7 +156,239 @@ # define AO_HAVE_XSIZE_store_full #endif +/* XSIZE_fetch_compare_and_swap */ +#if defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \ + && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire) + AO_INLINE XCTYPE + AO_XSIZE_fetch_compare_and_swap_acquire(volatile XCTYPE *addr, + XCTYPE old_val, XCTYPE new_val) + { + XCTYPE result = AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val); + AO_nop_full(); + return result; + } +# define AO_HAVE_XSIZE_fetch_compare_and_swap_acquire +#endif +#if defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \ + && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release) +# define AO_XSIZE_fetch_compare_and_swap_release(addr, old_val, new_val) \ + (AO_nop_full(), \ + AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val)) +# define AO_HAVE_XSIZE_fetch_compare_and_swap_release +#endif +#if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_full) +# if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release) +# define AO_XSIZE_fetch_compare_and_swap_release(addr, old_val, new_val) \ + AO_XSIZE_fetch_compare_and_swap_full(addr, old_val, new_val) +# define AO_HAVE_XSIZE_fetch_compare_and_swap_release +# endif +# if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire) +# define AO_XSIZE_fetch_compare_and_swap_acquire(addr, old_val, new_val) \ + AO_XSIZE_fetch_compare_and_swap_full(addr, old_val, new_val) +# define AO_HAVE_XSIZE_fetch_compare_and_swap_acquire +# endif +# if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_write) +# define AO_XSIZE_fetch_compare_and_swap_write(addr, old_val, new_val) \ + AO_XSIZE_fetch_compare_and_swap_full(addr, old_val, new_val) +# define AO_HAVE_XSIZE_fetch_compare_and_swap_write +# endif +# if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_read) +# define AO_XSIZE_fetch_compare_and_swap_read(addr, old_val, new_val) \ + AO_XSIZE_fetch_compare_and_swap_full(addr, old_val, new_val) +# define AO_HAVE_XSIZE_fetch_compare_and_swap_read +# endif +#endif /* AO_HAVE_XSIZE_fetch_compare_and_swap_full */ + +#if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \ + && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release) +# define AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val) \ + AO_XSIZE_fetch_compare_and_swap_release(addr, old_val, new_val) +# define AO_HAVE_XSIZE_fetch_compare_and_swap +#endif +#if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \ + && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire) +# define AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val) \ + AO_XSIZE_fetch_compare_and_swap_acquire(addr, old_val, new_val) +# define AO_HAVE_XSIZE_fetch_compare_and_swap +#endif +#if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \ + && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_write) +# define AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val) \ + AO_XSIZE_fetch_compare_and_swap_write(addr, old_val, new_val) +# define AO_HAVE_XSIZE_fetch_compare_and_swap +#endif +#if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \ + && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_read) +# define AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val) \ + AO_XSIZE_fetch_compare_and_swap_read(addr, old_val, new_val) +# define AO_HAVE_XSIZE_fetch_compare_and_swap +#endif + +#if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire) \ + && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_full) +# define AO_XSIZE_fetch_compare_and_swap_full(addr, old_val, new_val) \ + (AO_nop_full(), \ + AO_XSIZE_fetch_compare_and_swap_acquire(addr, old_val, new_val)) +# define AO_HAVE_XSIZE_fetch_compare_and_swap_full +#endif + +#if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release_write) \ + && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_write) +# define AO_XSIZE_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ + AO_XSIZE_fetch_compare_and_swap_write(addr, old_val, new_val) +# define AO_HAVE_XSIZE_fetch_compare_and_swap_release_write +#endif +#if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release_write) \ + && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release) +# define AO_XSIZE_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ + AO_XSIZE_fetch_compare_and_swap_release(addr, old_val, new_val) +# define AO_HAVE_XSIZE_fetch_compare_and_swap_release_write +#endif +#if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire_read) \ + && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_read) +# define AO_XSIZE_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ + AO_XSIZE_fetch_compare_and_swap_read(addr, old_val, new_val) +# define AO_HAVE_XSIZE_fetch_compare_and_swap_acquire_read +#endif +#if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire_read) \ + && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire) +# define AO_XSIZE_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ + AO_XSIZE_fetch_compare_and_swap_acquire(addr, old_val, new_val) +# define AO_HAVE_XSIZE_fetch_compare_and_swap_acquire_read +#endif + +#ifdef AO_NO_DD_ORDERING +# if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire_read) +# define AO_XSIZE_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ + AO_XSIZE_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) +# define AO_HAVE_XSIZE_fetch_compare_and_swap_dd_acquire_read +# endif +#else +# if defined(AO_HAVE_XSIZE_fetch_compare_and_swap) +# define AO_XSIZE_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ + AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val) +# define AO_HAVE_XSIZE_fetch_compare_and_swap_dd_acquire_read +# endif +#endif /* !AO_NO_DD_ORDERING */ + /* XSIZE_compare_and_swap */ +#if defined(AO_HAVE_XSIZE_compare_and_swap) && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_XSIZE_compare_and_swap_acquire) + AO_INLINE int + AO_XSIZE_compare_and_swap_acquire(volatile XCTYPE *addr, XCTYPE old, + XCTYPE new_val) + { + int result = AO_XSIZE_compare_and_swap(addr, old, new_val); + AO_nop_full(); + return result; + } +# define AO_HAVE_XSIZE_compare_and_swap_acquire +#endif +#if defined(AO_HAVE_XSIZE_compare_and_swap) && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_XSIZE_compare_and_swap_release) +# define AO_XSIZE_compare_and_swap_release(addr, old, new_val) \ + (AO_nop_full(), AO_XSIZE_compare_and_swap(addr, old, new_val)) +# define AO_HAVE_XSIZE_compare_and_swap_release +#endif +#if defined(AO_HAVE_XSIZE_compare_and_swap_full) +# if !defined(AO_HAVE_XSIZE_compare_and_swap_release) +# define AO_XSIZE_compare_and_swap_release(addr, old, new_val) \ + AO_XSIZE_compare_and_swap_full(addr, old, new_val) +# define AO_HAVE_XSIZE_compare_and_swap_release +# endif +# if !defined(AO_HAVE_XSIZE_compare_and_swap_acquire) +# define AO_XSIZE_compare_and_swap_acquire(addr, old, new_val) \ + AO_XSIZE_compare_and_swap_full(addr, old, new_val) +# define AO_HAVE_XSIZE_compare_and_swap_acquire +# endif +# if !defined(AO_HAVE_XSIZE_compare_and_swap_write) +# define AO_XSIZE_compare_and_swap_write(addr, old, new_val) \ + AO_XSIZE_compare_and_swap_full(addr, old, new_val) +# define AO_HAVE_XSIZE_compare_and_swap_write +# endif +# if !defined(AO_HAVE_XSIZE_compare_and_swap_read) +# define AO_XSIZE_compare_and_swap_read(addr, old, new_val) \ + AO_XSIZE_compare_and_swap_full(addr, old, new_val) +# define AO_HAVE_XSIZE_compare_and_swap_read +# endif +#endif /* AO_HAVE_XSIZE_compare_and_swap_full */ + +#if !defined(AO_HAVE_XSIZE_compare_and_swap) \ + && defined(AO_HAVE_XSIZE_compare_and_swap_release) +# define AO_XSIZE_compare_and_swap(addr, old, new_val) \ + AO_XSIZE_compare_and_swap_release(addr, old, new_val) +# define AO_HAVE_XSIZE_compare_and_swap +#endif +#if !defined(AO_HAVE_XSIZE_compare_and_swap) \ + && defined(AO_HAVE_XSIZE_compare_and_swap_acquire) +# define AO_XSIZE_compare_and_swap(addr, old, new_val) \ + AO_XSIZE_compare_and_swap_acquire(addr, old, new_val) +# define AO_HAVE_XSIZE_compare_and_swap +#endif +#if !defined(AO_HAVE_XSIZE_compare_and_swap) \ + && defined(AO_HAVE_XSIZE_compare_and_swap_write) +# define AO_XSIZE_compare_and_swap(addr, old, new_val) \ + AO_XSIZE_compare_and_swap_write(addr, old, new_val) +# define AO_HAVE_XSIZE_compare_and_swap +#endif +#if !defined(AO_HAVE_XSIZE_compare_and_swap) \ + && defined(AO_HAVE_XSIZE_compare_and_swap_read) +# define AO_XSIZE_compare_and_swap(addr, old, new_val) \ + AO_XSIZE_compare_and_swap_read(addr, old, new_val) +# define AO_HAVE_XSIZE_compare_and_swap +#endif + +#if defined(AO_HAVE_XSIZE_compare_and_swap_acquire) \ + && defined(AO_HAVE_nop_full) \ + && !defined(AO_HAVE_XSIZE_compare_and_swap_full) +# define AO_XSIZE_compare_and_swap_full(addr, old, new_val) \ + (AO_nop_full(), \ + AO_XSIZE_compare_and_swap_acquire(addr, old, new_val)) +# define AO_HAVE_XSIZE_compare_and_swap_full +#endif + +#if !defined(AO_HAVE_XSIZE_compare_and_swap_release_write) \ + && defined(AO_HAVE_XSIZE_compare_and_swap_write) +# define AO_XSIZE_compare_and_swap_release_write(addr, old, new_val) \ + AO_XSIZE_compare_and_swap_write(addr, old, new_val) +# define AO_HAVE_XSIZE_compare_and_swap_release_write +#endif +#if !defined(AO_HAVE_XSIZE_compare_and_swap_release_write) \ + && defined(AO_HAVE_XSIZE_compare_and_swap_release) +# define AO_XSIZE_compare_and_swap_release_write(addr, old, new_val) \ + AO_XSIZE_compare_and_swap_release(addr, old, new_val) +# define AO_HAVE_XSIZE_compare_and_swap_release_write +#endif +#if !defined(AO_HAVE_XSIZE_compare_and_swap_acquire_read) \ + && defined(AO_HAVE_XSIZE_compare_and_swap_read) +# define AO_XSIZE_compare_and_swap_acquire_read(addr, old, new_val) \ + AO_XSIZE_compare_and_swap_read(addr, old, new_val) +# define AO_HAVE_XSIZE_compare_and_swap_acquire_read +#endif +#if !defined(AO_HAVE_XSIZE_compare_and_swap_acquire_read) \ + && defined(AO_HAVE_XSIZE_compare_and_swap_acquire) +# define AO_XSIZE_compare_and_swap_acquire_read(addr, old, new_val) \ + AO_XSIZE_compare_and_swap_acquire(addr, old, new_val) +# define AO_HAVE_XSIZE_compare_and_swap_acquire_read +#endif + +#ifdef AO_NO_DD_ORDERING +# if defined(AO_HAVE_XSIZE_compare_and_swap_acquire_read) +# define AO_XSIZE_compare_and_swap_dd_acquire_read(addr, old, new_val) \ + AO_XSIZE_compare_and_swap_acquire_read(addr, old, new_val) +# define AO_HAVE_XSIZE_compare_and_swap_dd_acquire_read +# endif +#else +# if defined(AO_HAVE_XSIZE_compare_and_swap) +# define AO_XSIZE_compare_and_swap_dd_acquire_read(addr, old, new_val) \ + AO_XSIZE_compare_and_swap(addr, old, new_val) +# define AO_HAVE_XSIZE_compare_and_swap_dd_acquire_read +# endif +#endif /* !AO_NO_DD_ORDERING */ + #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_full) \ && !defined(AO_HAVE_XSIZE_compare_and_swap_full) AO_INLINE int diff --git a/src/atomic_ops/generalize.h b/src/atomic_ops/generalize.h index 2318289..b4ededb 100644 --- a/src/atomic_ops/generalize.h +++ b/src/atomic_ops/generalize.h @@ -309,232 +309,6 @@ # endif #endif /* !AO_NO_DD_ORDERING */ -/* Compare_and_swap */ -#if defined(AO_HAVE_compare_and_swap) && defined(AO_HAVE_nop_full) \ - && !defined(AO_HAVE_compare_and_swap_acquire) - AO_INLINE int - AO_compare_and_swap_acquire(volatile AO_t *addr, AO_t old, AO_t new_val) - { - int result = AO_compare_and_swap(addr, old, new_val); - AO_nop_full(); - return result; - } -# define AO_HAVE_compare_and_swap_acquire -#endif -#if defined(AO_HAVE_compare_and_swap) && defined(AO_HAVE_nop_full) \ - && !defined(AO_HAVE_compare_and_swap_release) -# define AO_compare_and_swap_release(addr,old,new_val) \ - (AO_nop_full(), AO_compare_and_swap(addr,old,new_val)) -# define AO_HAVE_compare_and_swap_release -#endif -#if defined(AO_HAVE_compare_and_swap_full) -# if !defined(AO_HAVE_compare_and_swap_release) -# define AO_compare_and_swap_release(addr,old,new_val) \ - AO_compare_and_swap_full(addr,old,new_val) -# define AO_HAVE_compare_and_swap_release -# endif -# if !defined(AO_HAVE_compare_and_swap_acquire) -# define AO_compare_and_swap_acquire(addr,old,new_val) \ - AO_compare_and_swap_full(addr,old,new_val) -# define AO_HAVE_compare_and_swap_acquire -# endif -# if !defined(AO_HAVE_compare_and_swap_write) -# define AO_compare_and_swap_write(addr,old,new_val) \ - AO_compare_and_swap_full(addr,old,new_val) -# define AO_HAVE_compare_and_swap_write -# endif -# if !defined(AO_HAVE_compare_and_swap_read) -# define AO_compare_and_swap_read(addr,old,new_val) \ - AO_compare_and_swap_full(addr,old,new_val) -# define AO_HAVE_compare_and_swap_read -# endif -#endif /* AO_HAVE_compare_and_swap_full */ - -#if !defined(AO_HAVE_compare_and_swap) \ - && defined(AO_HAVE_compare_and_swap_release) -# define AO_compare_and_swap(addr,old,new_val) \ - AO_compare_and_swap_release(addr,old,new_val) -# define AO_HAVE_compare_and_swap -#endif -#if !defined(AO_HAVE_compare_and_swap) \ - && defined(AO_HAVE_compare_and_swap_acquire) -# define AO_compare_and_swap(addr,old,new_val) \ - AO_compare_and_swap_acquire(addr,old,new_val) -# define AO_HAVE_compare_and_swap -#endif -#if !defined(AO_HAVE_compare_and_swap) \ - && defined(AO_HAVE_compare_and_swap_write) -# define AO_compare_and_swap(addr,old,new_val) \ - AO_compare_and_swap_write(addr,old,new_val) -# define AO_HAVE_compare_and_swap -#endif -#if !defined(AO_HAVE_compare_and_swap) \ - && defined(AO_HAVE_compare_and_swap_read) -# define AO_compare_and_swap(addr,old,new_val) \ - AO_compare_and_swap_read(addr,old,new_val) -# define AO_HAVE_compare_and_swap -#endif - -#if defined(AO_HAVE_compare_and_swap_acquire) \ - && defined(AO_HAVE_nop_full) && !defined(AO_HAVE_compare_and_swap_full) -# define AO_compare_and_swap_full(addr,old,new_val) \ - (AO_nop_full(), AO_compare_and_swap_acquire(addr,old,new_val)) -# define AO_HAVE_compare_and_swap_full -#endif - -#if !defined(AO_HAVE_compare_and_swap_release_write) \ - && defined(AO_HAVE_compare_and_swap_write) -# define AO_compare_and_swap_release_write(addr,old,new_val) \ - AO_compare_and_swap_write(addr,old,new_val) -# define AO_HAVE_compare_and_swap_release_write -#endif -#if !defined(AO_HAVE_compare_and_swap_release_write) \ - && defined(AO_HAVE_compare_and_swap_release) -# define AO_compare_and_swap_release_write(addr,old,new_val) \ - AO_compare_and_swap_release(addr,old,new_val) -# define AO_HAVE_compare_and_swap_release_write -#endif -#if !defined(AO_HAVE_compare_and_swap_acquire_read) \ - && defined(AO_HAVE_compare_and_swap_read) -# define AO_compare_and_swap_acquire_read(addr,old,new_val) \ - AO_compare_and_swap_read(addr,old,new_val) -# define AO_HAVE_compare_and_swap_acquire_read -#endif -#if !defined(AO_HAVE_compare_and_swap_acquire_read) \ - && defined(AO_HAVE_compare_and_swap_acquire) -# define AO_compare_and_swap_acquire_read(addr,old,new_val) \ - AO_compare_and_swap_acquire(addr,old,new_val) -# define AO_HAVE_compare_and_swap_acquire_read -#endif - -#ifdef AO_NO_DD_ORDERING -# if defined(AO_HAVE_compare_and_swap_acquire_read) -# define AO_compare_and_swap_dd_acquire_read(addr,old,new_val) \ - AO_compare_and_swap_acquire_read(addr,old,new_val) -# define AO_HAVE_compare_and_swap_dd_acquire_read -# endif -#else -# if defined(AO_HAVE_compare_and_swap) -# define AO_compare_and_swap_dd_acquire_read(addr,old,new_val) \ - AO_compare_and_swap(addr,old,new_val) -# define AO_HAVE_compare_and_swap_dd_acquire_read -# endif -#endif /* !AO_NO_DD_ORDERING */ - -/* AO_fetch_compare_and_swap */ -#if defined(AO_HAVE_fetch_compare_and_swap) && defined(AO_HAVE_nop_full) \ - && !defined(AO_HAVE_fetch_compare_and_swap_acquire) - AO_INLINE AO_t - AO_fetch_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val, - AO_t new_val) - { - AO_t result = AO_fetch_compare_and_swap(addr, old_val, new_val); - AO_nop_full(); - return result; - } -# define AO_HAVE_fetch_compare_and_swap_acquire -#endif -#if defined(AO_HAVE_fetch_compare_and_swap) && defined(AO_HAVE_nop_full) \ - && !defined(AO_HAVE_fetch_compare_and_swap_release) -# define AO_fetch_compare_and_swap_release(addr,old_val,new_val) \ - (AO_nop_full(), AO_fetch_compare_and_swap(addr,old_val,new_val)) -# define AO_HAVE_fetch_compare_and_swap_release -#endif -#if defined(AO_HAVE_fetch_compare_and_swap_full) -# if !defined(AO_HAVE_fetch_compare_and_swap_release) -# define AO_fetch_compare_and_swap_release(addr,old_val,new_val) \ - AO_fetch_compare_and_swap_full(addr,old_val,new_val) -# define AO_HAVE_fetch_compare_and_swap_release -# endif -# if !defined(AO_HAVE_fetch_compare_and_swap_acquire) -# define AO_fetch_compare_and_swap_acquire(addr,old_val,new_val) \ - AO_fetch_compare_and_swap_full(addr,old_val,new_val) -# define AO_HAVE_fetch_compare_and_swap_acquire -# endif -# if !defined(AO_HAVE_fetch_compare_and_swap_write) -# define AO_fetch_compare_and_swap_write(addr,old_val,new_val) \ - AO_fetch_compare_and_swap_full(addr,old_val,new_val) -# define AO_HAVE_fetch_compare_and_swap_write -# endif -# if !defined(AO_HAVE_fetch_compare_and_swap_read) -# define AO_fetch_compare_and_swap_read(addr,old_val,new_val) \ - AO_fetch_compare_and_swap_full(addr,old_val,new_val) -# define AO_HAVE_fetch_compare_and_swap_read -# endif -#endif /* AO_HAVE_fetch_compare_and_swap_full */ - -#if !defined(AO_HAVE_fetch_compare_and_swap) \ - && defined(AO_HAVE_fetch_compare_and_swap_release) -# define AO_fetch_compare_and_swap(addr,old_val,new_val) \ - AO_fetch_compare_and_swap_release(addr,old_val,new_val) -# define AO_HAVE_fetch_compare_and_swap -#endif -#if !defined(AO_HAVE_fetch_compare_and_swap) \ - && defined(AO_HAVE_fetch_compare_and_swap_acquire) -# define AO_fetch_compare_and_swap(addr,old_val,new_val) \ - AO_fetch_compare_and_swap_acquire(addr,old_val,new_val) -# define AO_HAVE_fetch_compare_and_swap -#endif -#if !defined(AO_HAVE_fetch_compare_and_swap) \ - && defined(AO_HAVE_fetch_compare_and_swap_write) -# define AO_fetch_compare_and_swap(addr,old_val,new_val) \ - AO_fetch_compare_and_swap_write(addr,old_val,new_val) -# define AO_HAVE_fetch_compare_and_swap -#endif -#if !defined(AO_HAVE_fetch_compare_and_swap) \ - && defined(AO_HAVE_fetch_compare_and_swap_read) -# define AO_fetch_compare_and_swap(addr,old_val,new_val) \ - AO_fetch_compare_and_swap_read(addr,old_val,new_val) -# define AO_HAVE_fetch_compare_and_swap -#endif - -#if defined(AO_HAVE_fetch_compare_and_swap_acquire) \ - && defined(AO_HAVE_nop_full) \ - && !defined(AO_HAVE_fetch_compare_and_swap_full) -# define AO_fetch_compare_and_swap_full(addr,old_val,new_val) \ - (AO_nop_full(), AO_fetch_compare_and_swap_acquire(addr,old_val,new_val)) -# define AO_HAVE_fetch_compare_and_swap_full -#endif - -#if !defined(AO_HAVE_fetch_compare_and_swap_release_write) \ - && defined(AO_HAVE_fetch_compare_and_swap_write) -# define AO_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ - AO_fetch_compare_and_swap_write(addr,old_val,new_val) -# define AO_HAVE_fetch_compare_and_swap_release_write -#endif -#if !defined(AO_HAVE_fetch_compare_and_swap_release_write) \ - && defined(AO_HAVE_fetch_compare_and_swap_release) -# define AO_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ - AO_fetch_compare_and_swap_release(addr,old_val,new_val) -# define AO_HAVE_fetch_compare_and_swap_release_write -#endif -#if !defined(AO_HAVE_fetch_compare_and_swap_acquire_read) \ - && defined(AO_HAVE_fetch_compare_and_swap_read) -# define AO_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ - AO_fetch_compare_and_swap_read(addr,old_val,new_val) -# define AO_HAVE_fetch_compare_and_swap_acquire_read -#endif -#if !defined(AO_HAVE_fetch_compare_and_swap_acquire_read) \ - && defined(AO_HAVE_fetch_compare_and_swap_acquire) -# define AO_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ - AO_fetch_compare_and_swap_acquire(addr,old_val,new_val) -# define AO_HAVE_fetch_compare_and_swap_acquire_read -#endif - -#ifdef AO_NO_DD_ORDERING -# if defined(AO_HAVE_fetch_compare_and_swap_acquire_read) -# define AO_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ - AO_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) -# define AO_HAVE_fetch_compare_and_swap_dd_acquire_read -# endif -#else -# if defined(AO_HAVE_fetch_compare_and_swap) -# define AO_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ - AO_fetch_compare_and_swap(addr,old_val,new_val) -# define AO_HAVE_fetch_compare_and_swap_dd_acquire_read -# endif -#endif /* !AO_NO_DD_ORDERING */ - #include "generalize-small.h" /* Compare_double_and_swap_double based on double_compare_and_swap. */ -- 2.40.0