#define AO_HAVE_char_store_release
#ifdef AO_GCC_HAVE_char_SYNC_CAS
+
AO_INLINE unsigned/**/char
AO_char_fetch_compare_and_swap(volatile unsigned/**/char *addr,
unsigned/**/char old_val, unsigned/**/char new_val)
{
- return __sync_val_compare_and_swap(addr, old_val, new_val
- /* empty protection list */);
+ (void)__atomic_compare_exchange_n(addr,
+ &old_val /* p_expected */,
+ new_val /* desired */,
+ 0 /* is_weak: false */,
+ __ATOMIC_RELAXED /* success */,
+ __ATOMIC_RELAXED /* failure */);
+ return old_val;
}
# define AO_HAVE_char_fetch_compare_and_swap
- /* TODO: Add CAS _acquire/release/full primitives. */
+ AO_INLINE unsigned/**/char
+ AO_char_fetch_compare_and_swap_acquire(volatile unsigned/**/char *addr,
+ unsigned/**/char old_val, unsigned/**/char new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
+ return old_val;
+ }
+# define AO_HAVE_char_fetch_compare_and_swap_acquire
+
+ AO_INLINE unsigned/**/char
+ AO_char_fetch_compare_and_swap_release(volatile unsigned/**/char *addr,
+ unsigned/**/char old_val, unsigned/**/char new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELEASE,
+ __ATOMIC_RELAXED /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_char_fetch_compare_and_swap_release
+
+ AO_INLINE unsigned/**/char
+ AO_char_fetch_compare_and_swap_full(volatile unsigned/**/char *addr,
+ unsigned/**/char old_val, unsigned/**/char new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQ_REL,
+ __ATOMIC_ACQUIRE /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_char_fetch_compare_and_swap_full
# ifndef AO_GENERALIZE_ASM_BOOL_CAS
AO_INLINE int
AO_char_compare_and_swap(volatile unsigned/**/char *addr,
unsigned/**/char old_val, unsigned/**/char new_val)
{
- return __sync_bool_compare_and_swap(addr, old_val, new_val
- /* empty protection list */);
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELAXED, __ATOMIC_RELAXED);
}
# define AO_HAVE_char_compare_and_swap
+
+ AO_INLINE int
+ AO_char_compare_and_swap_acquire(volatile unsigned/**/char *addr,
+ unsigned/**/char old_val, unsigned/**/char new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_char_compare_and_swap_acquire
+
+ AO_INLINE int
+ AO_char_compare_and_swap_release(volatile unsigned/**/char *addr,
+ unsigned/**/char old_val, unsigned/**/char new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELEASE,
+ __ATOMIC_RELAXED /* failure */);
+ }
+# define AO_HAVE_char_compare_and_swap_release
+
+ AO_INLINE int
+ AO_char_compare_and_swap_full(volatile unsigned/**/char *addr,
+ unsigned/**/char old_val, unsigned/**/char new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQ_REL,
+ __ATOMIC_ACQUIRE /* failure */);
+ }
+# define AO_HAVE_char_compare_and_swap_full
+
# endif /* !AO_GENERALIZE_ASM_BOOL_CAS */
+
#endif /* AO_GCC_HAVE_char_SYNC_CAS */
/*
* Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
#define AO_HAVE_short_store_release
#ifdef AO_GCC_HAVE_short_SYNC_CAS
+
AO_INLINE unsigned/**/short
AO_short_fetch_compare_and_swap(volatile unsigned/**/short *addr,
unsigned/**/short old_val, unsigned/**/short new_val)
{
- return __sync_val_compare_and_swap(addr, old_val, new_val
- /* empty protection list */);
+ (void)__atomic_compare_exchange_n(addr,
+ &old_val /* p_expected */,
+ new_val /* desired */,
+ 0 /* is_weak: false */,
+ __ATOMIC_RELAXED /* success */,
+ __ATOMIC_RELAXED /* failure */);
+ return old_val;
}
# define AO_HAVE_short_fetch_compare_and_swap
- /* TODO: Add CAS _acquire/release/full primitives. */
+ AO_INLINE unsigned/**/short
+ AO_short_fetch_compare_and_swap_acquire(volatile unsigned/**/short *addr,
+ unsigned/**/short old_val, unsigned/**/short new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
+ return old_val;
+ }
+# define AO_HAVE_short_fetch_compare_and_swap_acquire
+
+ AO_INLINE unsigned/**/short
+ AO_short_fetch_compare_and_swap_release(volatile unsigned/**/short *addr,
+ unsigned/**/short old_val, unsigned/**/short new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELEASE,
+ __ATOMIC_RELAXED /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_short_fetch_compare_and_swap_release
+
+ AO_INLINE unsigned/**/short
+ AO_short_fetch_compare_and_swap_full(volatile unsigned/**/short *addr,
+ unsigned/**/short old_val, unsigned/**/short new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQ_REL,
+ __ATOMIC_ACQUIRE /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_short_fetch_compare_and_swap_full
# ifndef AO_GENERALIZE_ASM_BOOL_CAS
AO_INLINE int
AO_short_compare_and_swap(volatile unsigned/**/short *addr,
unsigned/**/short old_val, unsigned/**/short new_val)
{
- return __sync_bool_compare_and_swap(addr, old_val, new_val
- /* empty protection list */);
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELAXED, __ATOMIC_RELAXED);
}
# define AO_HAVE_short_compare_and_swap
+
+ AO_INLINE int
+ AO_short_compare_and_swap_acquire(volatile unsigned/**/short *addr,
+ unsigned/**/short old_val, unsigned/**/short new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_short_compare_and_swap_acquire
+
+ AO_INLINE int
+ AO_short_compare_and_swap_release(volatile unsigned/**/short *addr,
+ unsigned/**/short old_val, unsigned/**/short new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELEASE,
+ __ATOMIC_RELAXED /* failure */);
+ }
+# define AO_HAVE_short_compare_and_swap_release
+
+ AO_INLINE int
+ AO_short_compare_and_swap_full(volatile unsigned/**/short *addr,
+ unsigned/**/short old_val, unsigned/**/short new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQ_REL,
+ __ATOMIC_ACQUIRE /* failure */);
+ }
+# define AO_HAVE_short_compare_and_swap_full
+
# endif /* !AO_GENERALIZE_ASM_BOOL_CAS */
+
#endif /* AO_GCC_HAVE_short_SYNC_CAS */
/*
* Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
#define AO_HAVE_int_store_release
#ifdef AO_GCC_HAVE_int_SYNC_CAS
+
AO_INLINE unsigned
AO_int_fetch_compare_and_swap(volatile unsigned *addr,
unsigned old_val, unsigned new_val)
{
- return __sync_val_compare_and_swap(addr, old_val, new_val
- /* empty protection list */);
+ (void)__atomic_compare_exchange_n(addr,
+ &old_val /* p_expected */,
+ new_val /* desired */,
+ 0 /* is_weak: false */,
+ __ATOMIC_RELAXED /* success */,
+ __ATOMIC_RELAXED /* failure */);
+ return old_val;
}
# define AO_HAVE_int_fetch_compare_and_swap
- /* TODO: Add CAS _acquire/release/full primitives. */
+ AO_INLINE unsigned
+ AO_int_fetch_compare_and_swap_acquire(volatile unsigned *addr,
+ unsigned old_val, unsigned new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
+ return old_val;
+ }
+# define AO_HAVE_int_fetch_compare_and_swap_acquire
+
+ AO_INLINE unsigned
+ AO_int_fetch_compare_and_swap_release(volatile unsigned *addr,
+ unsigned old_val, unsigned new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELEASE,
+ __ATOMIC_RELAXED /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_int_fetch_compare_and_swap_release
+
+ AO_INLINE unsigned
+ AO_int_fetch_compare_and_swap_full(volatile unsigned *addr,
+ unsigned old_val, unsigned new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQ_REL,
+ __ATOMIC_ACQUIRE /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_int_fetch_compare_and_swap_full
# ifndef AO_GENERALIZE_ASM_BOOL_CAS
AO_INLINE int
AO_int_compare_and_swap(volatile unsigned *addr,
unsigned old_val, unsigned new_val)
{
- return __sync_bool_compare_and_swap(addr, old_val, new_val
- /* empty protection list */);
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELAXED, __ATOMIC_RELAXED);
}
# define AO_HAVE_int_compare_and_swap
+
+ AO_INLINE int
+ AO_int_compare_and_swap_acquire(volatile unsigned *addr,
+ unsigned old_val, unsigned new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_int_compare_and_swap_acquire
+
+ AO_INLINE int
+ AO_int_compare_and_swap_release(volatile unsigned *addr,
+ unsigned old_val, unsigned new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELEASE,
+ __ATOMIC_RELAXED /* failure */);
+ }
+# define AO_HAVE_int_compare_and_swap_release
+
+ AO_INLINE int
+ AO_int_compare_and_swap_full(volatile unsigned *addr,
+ unsigned old_val, unsigned new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQ_REL,
+ __ATOMIC_ACQUIRE /* failure */);
+ }
+# define AO_HAVE_int_compare_and_swap_full
+
# endif /* !AO_GENERALIZE_ASM_BOOL_CAS */
+
#endif /* AO_GCC_HAVE_int_SYNC_CAS */
/*
* Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
#define AO_HAVE_store_release
#ifdef AO_GCC_HAVE_SYNC_CAS
+
AO_INLINE AO_t
AO_fetch_compare_and_swap(volatile AO_t *addr,
AO_t old_val, AO_t new_val)
{
- return __sync_val_compare_and_swap(addr, old_val, new_val
- /* empty protection list */);
+ (void)__atomic_compare_exchange_n(addr,
+ &old_val /* p_expected */,
+ new_val /* desired */,
+ 0 /* is_weak: false */,
+ __ATOMIC_RELAXED /* success */,
+ __ATOMIC_RELAXED /* failure */);
+ return old_val;
}
# define AO_HAVE_fetch_compare_and_swap
- /* TODO: Add CAS _acquire/release/full primitives. */
+ AO_INLINE AO_t
+ AO_fetch_compare_and_swap_acquire(volatile AO_t *addr,
+ AO_t old_val, AO_t new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
+ return old_val;
+ }
+# define AO_HAVE_fetch_compare_and_swap_acquire
+
+ AO_INLINE AO_t
+ AO_fetch_compare_and_swap_release(volatile AO_t *addr,
+ AO_t old_val, AO_t new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELEASE,
+ __ATOMIC_RELAXED /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_fetch_compare_and_swap_release
+
+ AO_INLINE AO_t
+ AO_fetch_compare_and_swap_full(volatile AO_t *addr,
+ AO_t old_val, AO_t new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQ_REL,
+ __ATOMIC_ACQUIRE /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_fetch_compare_and_swap_full
# ifndef AO_GENERALIZE_ASM_BOOL_CAS
AO_INLINE int
AO_compare_and_swap(volatile AO_t *addr,
AO_t old_val, AO_t new_val)
{
- return __sync_bool_compare_and_swap(addr, old_val, new_val
- /* empty protection list */);
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELAXED, __ATOMIC_RELAXED);
}
# define AO_HAVE_compare_and_swap
+
+ AO_INLINE int
+ AO_compare_and_swap_acquire(volatile AO_t *addr,
+ AO_t old_val, AO_t new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_compare_and_swap_acquire
+
+ AO_INLINE int
+ AO_compare_and_swap_release(volatile AO_t *addr,
+ AO_t old_val, AO_t new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELEASE,
+ __ATOMIC_RELAXED /* failure */);
+ }
+# define AO_HAVE_compare_and_swap_release
+
+ AO_INLINE int
+ AO_compare_and_swap_full(volatile AO_t *addr,
+ AO_t old_val, AO_t new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQ_REL,
+ __ATOMIC_ACQUIRE /* failure */);
+ }
+# define AO_HAVE_compare_and_swap_full
+
# endif /* !AO_GENERALIZE_ASM_BOOL_CAS */
+
#endif /* AO_GCC_HAVE_SYNC_CAS */
#define AO_HAVE_XSIZE_store_release
#ifdef AO_GCC_HAVE_XSIZE_SYNC_CAS
+
AO_INLINE XCTYPE
AO_XSIZE_fetch_compare_and_swap(volatile XCTYPE *addr,
XCTYPE old_val, XCTYPE new_val)
{
- return __sync_val_compare_and_swap(addr, old_val, new_val
- /* empty protection list */);
+ (void)__atomic_compare_exchange_n(addr,
+ &old_val /* p_expected */,
+ new_val /* desired */,
+ 0 /* is_weak: false */,
+ __ATOMIC_RELAXED /* success */,
+ __ATOMIC_RELAXED /* failure */);
+ return old_val;
}
# define AO_HAVE_XSIZE_fetch_compare_and_swap
- /* TODO: Add CAS _acquire/release/full primitives. */
+ AO_INLINE XCTYPE
+ AO_XSIZE_fetch_compare_and_swap_acquire(volatile XCTYPE *addr,
+ XCTYPE old_val, XCTYPE new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
+ return old_val;
+ }
+# define AO_HAVE_XSIZE_fetch_compare_and_swap_acquire
+
+ AO_INLINE XCTYPE
+ AO_XSIZE_fetch_compare_and_swap_release(volatile XCTYPE *addr,
+ XCTYPE old_val, XCTYPE new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELEASE,
+ __ATOMIC_RELAXED /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_XSIZE_fetch_compare_and_swap_release
+
+ AO_INLINE XCTYPE
+ AO_XSIZE_fetch_compare_and_swap_full(volatile XCTYPE *addr,
+ XCTYPE old_val, XCTYPE new_val)
+ {
+ (void)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQ_REL,
+ __ATOMIC_ACQUIRE /* failure */);
+ return old_val;
+ }
+# define AO_HAVE_XSIZE_fetch_compare_and_swap_full
# ifndef AO_GENERALIZE_ASM_BOOL_CAS
AO_INLINE int
AO_XSIZE_compare_and_swap(volatile XCTYPE *addr,
XCTYPE old_val, XCTYPE new_val)
{
- return __sync_bool_compare_and_swap(addr, old_val, new_val
- /* empty protection list */);
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELAXED, __ATOMIC_RELAXED);
}
# define AO_HAVE_XSIZE_compare_and_swap
+
+ AO_INLINE int
+ AO_XSIZE_compare_and_swap_acquire(volatile XCTYPE *addr,
+ XCTYPE old_val, XCTYPE new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
+ }
+# define AO_HAVE_XSIZE_compare_and_swap_acquire
+
+ AO_INLINE int
+ AO_XSIZE_compare_and_swap_release(volatile XCTYPE *addr,
+ XCTYPE old_val, XCTYPE new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_RELEASE,
+ __ATOMIC_RELAXED /* failure */);
+ }
+# define AO_HAVE_XSIZE_compare_and_swap_release
+
+ AO_INLINE int
+ AO_XSIZE_compare_and_swap_full(volatile XCTYPE *addr,
+ XCTYPE old_val, XCTYPE new_val)
+ {
+ return (int)__atomic_compare_exchange_n(addr, &old_val, new_val, 0,
+ __ATOMIC_ACQ_REL,
+ __ATOMIC_ACQUIRE /* failure */);
+ }
+# define AO_HAVE_XSIZE_compare_and_swap_full
+
# endif /* !AO_GENERALIZE_ASM_BOOL_CAS */
+
#endif /* AO_GCC_HAVE_XSIZE_SYNC_CAS */