atomic: Use builtin atomics with USE_ATOMIC_COMPILER_BUILTINS

Use builtin atomics for atomic_compare_and_exchange_* and
atomic_exchange_and_add if USE_ATOMIC_COMPILER_BUILTINS is enabled.
This allows removing target atomic-machine.h headers.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
This commit is contained in:
Wilco Dijkstra 2025-09-08 17:46:29 +00:00
parent 5c522d7a58
commit 2a035debbb
1 changed files with 43 additions and 0 deletions

View File

@ -82,6 +82,36 @@
__atg2_result; \
})
#if USE_ATOMIC_COMPILER_BUILTINS
# undef atomic_compare_and_exchange_val_acq
# define atomic_compare_and_exchange_val_acq(mem, newval, oldval) \
({ \
__typeof (*(mem)) __atg3_old = (oldval); \
atomic_compare_exchange_acquire (mem, (void*)&__atg3_old, newval); \
__atg3_old; \
})
# undef atomic_compare_and_exchange_val_rel
# define atomic_compare_and_exchange_val_rel(mem, newval, oldval) \
({ \
__typeof (*(mem)) __atg3_old = (oldval); \
atomic_compare_exchange_release (mem, (void*)&__atg3_old, newval); \
__atg3_old; \
})
# undef atomic_compare_and_exchange_bool_acq
# define atomic_compare_and_exchange_bool_acq(mem, newval, oldval) \
({ \
__typeof (*(mem)) __atg3_old = (oldval); \
!atomic_compare_exchange_acquire (mem, (void*)&__atg3_old, newval); \
})
# undef atomic_exchange_and_add
# define atomic_exchange_and_add(mem, val) atomic_fetch_add_relaxed(mem,val)
#endif
/* Atomically store NEWVAL in *MEM if *MEM is equal to OLDVAL.
Return the old *MEM value. */
@ -603,6 +633,19 @@ void __atomic_link_error (void);
__atomic_compare_exchange_n ((mem), (expected), (desired), 1, \
__ATOMIC_RELEASE, __ATOMIC_RELAXED); })
# define atomic_compare_exchange_relaxed(mem, expected, desired) \
({ __atomic_check_size((mem)); \
__atomic_compare_exchange_n ((mem), (expected), (desired), 0, \
__ATOMIC_RELAXED, __ATOMIC_RELAXED); })
# define atomic_compare_exchange_acquire(mem, expected, desired) \
({ __atomic_check_size((mem)); \
__atomic_compare_exchange_n ((mem), (expected), (desired), 0, \
__ATOMIC_ACQUIRE, __ATOMIC_RELAXED); })
# define atomic_compare_exchange_release(mem, expected, desired) \
({ __atomic_check_size((mem)); \
__atomic_compare_exchange_n ((mem), (expected), (desired), 0, \
__ATOMIC_RELEASE, __ATOMIC_RELAXED); })
# define atomic_exchange_relaxed(mem, desired) \
({ __atomic_check_size((mem)); \
__atomic_exchange_n ((mem), (desired), __ATOMIC_RELAXED); })