From c31871065394c78d7d316b2a1709077437d29ccf Mon Sep 17 00:00:00 2001 From: kcbanner Date: Sat, 13 Jul 2024 19:45:45 -0400 Subject: [PATCH] zig.h: expand zig_msvc_atomic_load_ into version for relaxed, acquire, and seq_cst --- lib/zig.h | 37 ++++++++++++++++++++++++++++++------- stage1/zig.h | 37 ++++++++++++++++++++++++++++++------- 2 files changed, 60 insertions(+), 14 deletions(-) diff --git a/lib/zig.h b/lib/zig.h index 0c7ca7352b..2b238ef1fa 100644 --- a/lib/zig.h +++ b/lib/zig.h @@ -3636,7 +3636,7 @@ typedef int zig_memory_order; #define zig_atomicrmw_min(res, obj, arg, order, Type, ReprType) res = zig_msvc_atomicrmw_min_ ##Type(obj, arg) #define zig_atomicrmw_max(res, obj, arg, order, Type, ReprType) res = zig_msvc_atomicrmw_max_ ##Type(obj, arg) #define zig_atomic_store( obj, arg, order, Type, ReprType) zig_msvc_atomic_store_ ##Type(obj, arg) -#define zig_atomic_load(res, obj, order, Type, ReprType) res = zig_msvc_atomic_load_ ##Type(obj) +#define zig_atomic_load(res, obj, order, Type, ReprType) res = zig_msvc_atomic_load_ ##order##_##Type(obj) #if _M_X64 #define zig_fence(order) __faststorefence() #else @@ -3742,7 +3742,15 @@ typedef int zig_memory_order; static inline void zig_msvc_atomic_store_##ZigType(Type volatile* obj, Type value) { \ (void)_InterlockedExchange##suffix((SigType volatile*)obj, (SigType)value); \ } \ - static inline Type zig_msvc_atomic_load_##ZigType(Type volatile* obj) { \ + static inline Type zig_msvc_atomic_load_zig_memory_order_relaxed_##ZigType(Type volatile* obj) { \ + return __iso_volatile_load##iso_suffix((SigType volatile*)obj); \ + } \ + static inline Type zig_msvc_atomic_load_zig_memory_order_acquire_##ZigType(Type volatile* obj) { \ + Type val = __iso_volatile_load##iso_suffix((SigType volatile*)obj); \ + _ReadWriteBarrier(); \ + return val; \ + } \ + static inline Type zig_msvc_atomic_load_zig_memory_order_seq_cst_##ZigType(Type volatile* obj) { \ Type val = __iso_volatile_load##iso_suffix((SigType volatile*)obj); \ _ReadWriteBarrier(); \ return val; \ @@ -3760,7 +3768,7 @@ zig_msvc_atomics(u64, uint64_t, __int64, 64, 64) zig_msvc_atomics(i64, int64_t, __int64, 64, 64) #endif -#define zig_msvc_flt_atomics(Type, SigType, suffix) \ +#define zig_msvc_flt_atomics(Type, SigType, suffix, iso_suffix) \ static inline bool zig_msvc_cmpxchg_##Type(zig_##Type volatile* obj, zig_##Type* expected, zig_##Type desired) { \ SigType exchange; \ SigType comparand; \ @@ -3778,15 +3786,30 @@ zig_msvc_atomics(i64, int64_t, __int64, 64, 64) memcpy(&value, &arg, sizeof(value)); \ (void)_InterlockedExchange##suffix((SigType volatile*)obj, value); \ } \ - static inline zig_##Type zig_msvc_atomic_load_##Type(zig_##Type volatile* obj) { \ + static inline zig_##Type zig_msvc_atomic_load_zig_memory_order_relaxed_##Type(zig_##Type volatile* obj) { \ zig_##Type result; \ - SigType initial = _InterlockedExchangeAdd##suffix((SigType volatile*)obj, (SigType)0); \ + SigType initial = __iso_volatile_load##iso_suffix((SigType volatile*)obj); \ memcpy(&result, &initial, sizeof(result)); \ return result; \ + } \ + static inline zig_##Type zig_msvc_atomic_load_zig_memory_order_acquire_##Type(zig_##Type volatile* obj) { \ + zig_##Type result; \ + SigType initial = __iso_volatile_load##iso_suffix((SigType volatile*)obj); \ + _ReadWriteBarrier(); \ + memcpy(&result, &initial, sizeof(result)); \ + return result; \ + } \ + static inline zig_##Type zig_msvc_atomic_load_zig_memory_order_seq_cst_##Type(zig_##Type volatile* obj) { \ + zig_##Type result; \ + SigType initial = __iso_volatile_load##iso_suffix((SigType volatile*)obj); \ + _ReadWriteBarrier(); \ + memcpy(&result, &initial, sizeof(result)); \ + return result; \ } -zig_msvc_flt_atomics(f32, long, ) + +zig_msvc_flt_atomics(f32, long, , 32) #if _M_X64 -zig_msvc_flt_atomics(f64, int64_t, 64) +zig_msvc_flt_atomics(f64, int64_t, 64, 64) #endif #if _M_IX86 diff --git a/stage1/zig.h b/stage1/zig.h index 0c7ca7352b..2b238ef1fa 100644 --- a/stage1/zig.h +++ b/stage1/zig.h @@ -3636,7 +3636,7 @@ typedef int zig_memory_order; #define zig_atomicrmw_min(res, obj, arg, order, Type, ReprType) res = zig_msvc_atomicrmw_min_ ##Type(obj, arg) #define zig_atomicrmw_max(res, obj, arg, order, Type, ReprType) res = zig_msvc_atomicrmw_max_ ##Type(obj, arg) #define zig_atomic_store( obj, arg, order, Type, ReprType) zig_msvc_atomic_store_ ##Type(obj, arg) -#define zig_atomic_load(res, obj, order, Type, ReprType) res = zig_msvc_atomic_load_ ##Type(obj) +#define zig_atomic_load(res, obj, order, Type, ReprType) res = zig_msvc_atomic_load_ ##order##_##Type(obj) #if _M_X64 #define zig_fence(order) __faststorefence() #else @@ -3742,7 +3742,15 @@ typedef int zig_memory_order; static inline void zig_msvc_atomic_store_##ZigType(Type volatile* obj, Type value) { \ (void)_InterlockedExchange##suffix((SigType volatile*)obj, (SigType)value); \ } \ - static inline Type zig_msvc_atomic_load_##ZigType(Type volatile* obj) { \ + static inline Type zig_msvc_atomic_load_zig_memory_order_relaxed_##ZigType(Type volatile* obj) { \ + return __iso_volatile_load##iso_suffix((SigType volatile*)obj); \ + } \ + static inline Type zig_msvc_atomic_load_zig_memory_order_acquire_##ZigType(Type volatile* obj) { \ + Type val = __iso_volatile_load##iso_suffix((SigType volatile*)obj); \ + _ReadWriteBarrier(); \ + return val; \ + } \ + static inline Type zig_msvc_atomic_load_zig_memory_order_seq_cst_##ZigType(Type volatile* obj) { \ Type val = __iso_volatile_load##iso_suffix((SigType volatile*)obj); \ _ReadWriteBarrier(); \ return val; \ @@ -3760,7 +3768,7 @@ zig_msvc_atomics(u64, uint64_t, __int64, 64, 64) zig_msvc_atomics(i64, int64_t, __int64, 64, 64) #endif -#define zig_msvc_flt_atomics(Type, SigType, suffix) \ +#define zig_msvc_flt_atomics(Type, SigType, suffix, iso_suffix) \ static inline bool zig_msvc_cmpxchg_##Type(zig_##Type volatile* obj, zig_##Type* expected, zig_##Type desired) { \ SigType exchange; \ SigType comparand; \ @@ -3778,15 +3786,30 @@ zig_msvc_atomics(i64, int64_t, __int64, 64, 64) memcpy(&value, &arg, sizeof(value)); \ (void)_InterlockedExchange##suffix((SigType volatile*)obj, value); \ } \ - static inline zig_##Type zig_msvc_atomic_load_##Type(zig_##Type volatile* obj) { \ + static inline zig_##Type zig_msvc_atomic_load_zig_memory_order_relaxed_##Type(zig_##Type volatile* obj) { \ zig_##Type result; \ - SigType initial = _InterlockedExchangeAdd##suffix((SigType volatile*)obj, (SigType)0); \ + SigType initial = __iso_volatile_load##iso_suffix((SigType volatile*)obj); \ memcpy(&result, &initial, sizeof(result)); \ return result; \ + } \ + static inline zig_##Type zig_msvc_atomic_load_zig_memory_order_acquire_##Type(zig_##Type volatile* obj) { \ + zig_##Type result; \ + SigType initial = __iso_volatile_load##iso_suffix((SigType volatile*)obj); \ + _ReadWriteBarrier(); \ + memcpy(&result, &initial, sizeof(result)); \ + return result; \ + } \ + static inline zig_##Type zig_msvc_atomic_load_zig_memory_order_seq_cst_##Type(zig_##Type volatile* obj) { \ + zig_##Type result; \ + SigType initial = __iso_volatile_load##iso_suffix((SigType volatile*)obj); \ + _ReadWriteBarrier(); \ + memcpy(&result, &initial, sizeof(result)); \ + return result; \ } -zig_msvc_flt_atomics(f32, long, ) + +zig_msvc_flt_atomics(f32, long, , 32) #if _M_X64 -zig_msvc_flt_atomics(f64, int64_t, 64) +zig_msvc_flt_atomics(f64, int64_t, 64, 64) #endif #if _M_IX86