From 5e2ae50214e8557b5b3d6417b1318a9b2d6b7d1d Mon Sep 17 00:00:00 2001 From: Martins Mozeiko Date: Wed, 20 May 2026 13:05:05 -0700 Subject: [PATCH] cleanup atomic wrappers * use iso_volatile_load for just a load of u64/u32 from memory on msvc * use intrin.h _interlocked* intrinsics instead of defines from windows.h * use better suited fetch_xyz instead of xyz_fetch ones on gcc/clang --- src/base/base_core.h | 46 ++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/base/base_core.h b/src/base/base_core.h index 01e56b26..73d265c5 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -252,42 +252,42 @@ #if COMPILER_MSVC # include # if ARCH_X64 -# define ins_atomic_u128_eval_cond_assign(x,k,c) (B32)InterlockedCompareExchange128((__int64 *)(x), ((__int64 *)&(k))[1], ((__int64 *)&(k))[0], (__int64 *)c) -# define ins_atomic_u64_eval(x) InterlockedAdd64((__int64 *)(x), 0) -# define ins_atomic_u64_inc_eval(x) InterlockedIncrement64((__int64 *)(x)) -# define ins_atomic_u64_dec_eval(x) InterlockedDecrement64((__int64 *)(x)) -# define ins_atomic_u64_eval_assign(x,c) InterlockedExchange64((__int64 *)(x),(c)) -# define ins_atomic_u64_add_eval(x,c) InterlockedAdd64((__int64 *)(x), c) -# define ins_atomic_u64_eval_cond_assign(x,k,c) InterlockedCompareExchange64((__int64 *)(x),(k),(c)) -# define ins_atomic_u32_eval(x) InterlockedAdd((LONG *)(x), 0) -# define ins_atomic_u32_inc_eval(x) InterlockedIncrement((LONG *)(x)) -# define ins_atomic_u32_dec_eval(x) InterlockedDecrement((LONG *)(x)) -# define ins_atomic_u32_eval_assign(x,c) InterlockedExchange((LONG *)(x),(c)) -# define ins_atomic_u32_eval_cond_assign(x,k,c) InterlockedCompareExchange((LONG *)(x),(k),(c)) -# define ins_atomic_u32_add_eval(x,c) InterlockedAdd((LONG *)(x), (c)) -# define ins_atomic_u8_eval_assign(x,c) InterlockedExchange8((CHAR *)(x), (c)) -# define ins_atomic_u8_or(x,c) InterlockedOr8((char *)(x), (char)c) -# define ins_atomic_u32_or(x,c) InterlockedOr((LONG *)(x), (LONG)c) +# define ins_atomic_u128_eval_cond_assign(x,k,c) (B32)_InterlockedCompareExchange128((__int64 *)(x), ((__int64 *)&(k))[1], ((__int64 *)&(k))[0], (__int64 *)(c)) +# define ins_atomic_u64_eval(x) (U64)__iso_volatile_load64((__int64*)(x)) +# define ins_atomic_u64_inc_eval(x) _InterlockedIncrement64((__int64 *)(x)) +# define ins_atomic_u64_dec_eval(x) _InterlockedDecrement64((__int64 *)(x)) +# define ins_atomic_u64_eval_assign(x,c) _InterlockedExchange64((__int64 *)(x), (c)) +# define ins_atomic_u64_add_eval(x,c) _interlockedadd64((__int64 *)(x), (c)) +# define ins_atomic_u64_eval_cond_assign(x,k,c) _InterlockedCompareExchange64((__int64 *)(x), (k), (c)) +# define ins_atomic_u32_eval(x) (U32)__iso_volatile_load32((__int32*)(x)) +# define ins_atomic_u32_inc_eval(x) _InterlockedIncrement((long *)(x)) +# define ins_atomic_u32_dec_eval(x) _InterlockedDecrement((long *)(x)) +# define ins_atomic_u32_eval_assign(x,c) _InterlockedExchange((long *)(x), (c)) +# define ins_atomic_u32_eval_cond_assign(x,k,c) _InterlockedCompareExchange((long *)(x), (k), (c)) +# define ins_atomic_u32_add_eval(x,c) _interlockedadd((long *)(x), (c)) +# define ins_atomic_u8_eval_assign(x,c) _InterlockedExchange8((char *)(x), (char)(c)) +# define ins_atomic_u8_or(x,c) _InterlockedOr8((char *)(x), (char)(c)) +# define ins_atomic_u32_or(x,c) _InterlockedOr((long *)(x), (long)(c)) # else # error Atomic intrinsics not defined for this compiler / architecture combination. # endif #elif COMPILER_CLANG || COMPILER_GCC # define ins_atomic_u128_eval_cond_assign(x,k,c) (B32)__atomic_compare_exchange_n((__int128 *)(x),(__int128 *)(c),*(__int128 *)(k),0,__ATOMIC_SEQ_CST,__ATOMIC_SEQ_CST) # define ins_atomic_u64_eval(x) __atomic_load_n((U64 *)(x), __ATOMIC_SEQ_CST) -# define ins_atomic_u64_inc_eval(x) (__atomic_fetch_add((U64 *)(x), 1, __ATOMIC_SEQ_CST) + 1) -# define ins_atomic_u64_dec_eval(x) (__atomic_fetch_sub((U64 *)(x), 1, __ATOMIC_SEQ_CST) - 1) +# define ins_atomic_u64_inc_eval(x) __atomic_add_fetch((U64 *)(x), 1, __ATOMIC_SEQ_CST) +# define ins_atomic_u64_dec_eval(x) __atomic_sub_fetch((U64 *)(x), 1, __ATOMIC_SEQ_CST) # define ins_atomic_u64_eval_assign(x,c) __atomic_exchange_n(x, c, __ATOMIC_SEQ_CST) -# define ins_atomic_u64_add_eval(x,c) (__atomic_fetch_add((U64 *)(x), c, __ATOMIC_SEQ_CST) + (c)) +# define ins_atomic_u64_add_eval(x,c) __atomic_add_fetch((U64 *)(x), c, __ATOMIC_SEQ_CST) # define ins_atomic_u64_eval_cond_assign(x,k,c) ({ U64 _new = (c); __atomic_compare_exchange_n((U64 *)(x),&_new,(k),0,__ATOMIC_SEQ_CST,__ATOMIC_SEQ_CST); _new; }) # define ins_atomic_u32_eval(x) __atomic_load_n(x, __ATOMIC_SEQ_CST) -# define ins_atomic_u32_inc_eval(x) (__atomic_fetch_add((U32 *)(x), 1, __ATOMIC_SEQ_CST) + 1) -# define ins_atomic_u32_dec_eval(x) (__atomic_fetch_sub((U32 *)(x), 1, __ATOMIC_SEQ_CST) - 1) -# define ins_atomic_u32_add_eval(x,c) (__atomic_fetch_add((U32 *)(x), c, __ATOMIC_SEQ_CST) + (c)) +# define ins_atomic_u32_inc_eval(x) __atomic_add_fetch((U32 *)(x), 1, __ATOMIC_SEQ_CST) +# define ins_atomic_u32_dec_eval(x) __atomic_sub_fetch((U32 *)(x), 1, __ATOMIC_SEQ_CST) +# define ins_atomic_u32_add_eval(x,c) __atomic_add_fetch((U32 *)(x), c, __ATOMIC_SEQ_CST) # define ins_atomic_u32_eval_assign(x,c) __atomic_exchange_n((x), (c), __ATOMIC_SEQ_CST) # define ins_atomic_u32_eval_cond_assign(x,k,c) ({ U32 _new = (c); __atomic_compare_exchange_n((U32 *)(x),&_new,(k),0,__ATOMIC_SEQ_CST,__ATOMIC_SEQ_CST); _new; }) # define ins_atomic_u8_eval_assign(x,c) __atomic_exchange_n((x), (c), __ATOMIC_SEQ_CST) # define ins_atomic_u8_or(x,c) __atomic_fetch_or((U8 *)(x), (U8)(c), __ATOMIC_SEQ_CST) -# define ins_atomic_u32_or(x,c) __atomic_fetch_or((U32 *)(x), (U32)(c), __ATOMIC_SEQ_CST) +# define ins_atomic_u32_or(x,c) __atomic_fetch_or((U32 *)(x), (U32)(c), __ATOMIC_SEQ_CST) #else # error Atomic intrinsics not defined for this compiler / architecture. #endif