@@ -3636,7 +3636,7 @@ typedef int zig_memory_order;
36363636#define zig_atomicrmw_min (res , obj , arg , order , Type , ReprType ) res = zig_msvc_atomicrmw_min_ ##Type(obj, arg)
36373637#define zig_atomicrmw_max (res , obj , arg , order , Type , ReprType ) res = zig_msvc_atomicrmw_max_ ##Type(obj, arg)
36383638#define zig_atomic_store ( obj , arg , order , Type , ReprType ) zig_msvc_atomic_store_ ##Type(obj, arg)
3639- #define zig_atomic_load (res , obj , order , Type , ReprType ) res = zig_msvc_atomic_load_ ##Type(obj)
3639+ #define zig_atomic_load (res , obj , order , Type , ReprType ) res = zig_msvc_atomic_load_ ##order##_## Type(obj)
36403640#if _M_X64
36413641#define zig_fence (order ) __faststorefence()
36423642#else
@@ -3742,7 +3742,15 @@ typedef int zig_memory_order;
37423742 static inline void zig_msvc_atomic_store_##ZigType(Type volatile* obj, Type value) { \
37433743 (void)_InterlockedExchange##suffix((SigType volatile*)obj, (SigType)value); \
37443744 } \
3745- static inline Type zig_msvc_atomic_load_##ZigType(Type volatile* obj) { \
3745+ static inline Type zig_msvc_atomic_load_zig_memory_order_relaxed_##ZigType(Type volatile* obj) { \
3746+ return __iso_volatile_load##iso_suffix((SigType volatile*)obj); \
3747+ } \
3748+ static inline Type zig_msvc_atomic_load_zig_memory_order_acquire_##ZigType(Type volatile* obj) { \
3749+ Type val = __iso_volatile_load##iso_suffix((SigType volatile*)obj); \
3750+ _ReadWriteBarrier(); \
3751+ return val; \
3752+ } \
3753+ static inline Type zig_msvc_atomic_load_zig_memory_order_seq_cst_##ZigType(Type volatile* obj) { \
37463754 Type val = __iso_volatile_load##iso_suffix((SigType volatile*)obj); \
37473755 _ReadWriteBarrier(); \
37483756 return val; \
@@ -3760,7 +3768,7 @@ zig_msvc_atomics(u64, uint64_t, __int64, 64, 64)
37603768zig_msvc_atomics (i64 , int64_t , __int64 , 64 , 64 )
37613769#endif
37623770
3763- #define zig_msvc_flt_atomics (Type , SigType , suffix ) \
3771+ #define zig_msvc_flt_atomics (Type , SigType , suffix , iso_suffix ) \
37643772 static inline bool zig_msvc_cmpxchg_##Type(zig_##Type volatile* obj, zig_##Type* expected, zig_##Type desired) { \
37653773 SigType exchange; \
37663774 SigType comparand; \
@@ -3778,15 +3786,30 @@ zig_msvc_atomics(i64, int64_t, __int64, 64, 64)
37783786 memcpy(&value, &arg, sizeof(value)); \
37793787 (void)_InterlockedExchange##suffix((SigType volatile*)obj, value); \
37803788 } \
3781- static inline zig_##Type zig_msvc_atomic_load_ ##Type(zig_##Type volatile* obj) { \
3789+ static inline zig_##Type zig_msvc_atomic_load_zig_memory_order_relaxed_ ##Type(zig_##Type volatile* obj) { \
37823790 zig_##Type result; \
3783- SigType initial = _InterlockedExchangeAdd##suffix ((SigType volatile*)obj, (SigType)0 ); \
3791+ SigType initial = __iso_volatile_load##iso_suffix ((SigType volatile*)obj); \
37843792 memcpy(&result, &initial, sizeof(result)); \
37853793 return result; \
3794+ } \
3795+ static inline zig_##Type zig_msvc_atomic_load_zig_memory_order_acquire_##Type(zig_##Type volatile* obj) { \
3796+ zig_##Type result; \
3797+ SigType initial = __iso_volatile_load##iso_suffix((SigType volatile*)obj); \
3798+ _ReadWriteBarrier(); \
3799+ memcpy(&result, &initial, sizeof(result)); \
3800+ return result; \
3801+ } \
3802+ static inline zig_##Type zig_msvc_atomic_load_zig_memory_order_seq_cst_##Type(zig_##Type volatile* obj) { \
3803+ zig_##Type result; \
3804+ SigType initial = __iso_volatile_load##iso_suffix((SigType volatile*)obj); \
3805+ _ReadWriteBarrier(); \
3806+ memcpy(&result, &initial, sizeof(result)); \
3807+ return result; \
37863808 }
3787- zig_msvc_flt_atomics (f32 , long , )
3809+
3810+ zig_msvc_flt_atomics (f32 , long , , 32 )
37883811#if _M_X64
3789- zig_msvc_flt_atomics (f64 , int64_t , 64 )
3812+ zig_msvc_flt_atomics (f64 , int64_t , 64 , 64 )
37903813#endif
37913814
37923815#if _M_IX86
0 commit comments