Skip to content

Commit c318710

Browse files
committed
zig.h: expand zig_msvc_atomic_load_ into version for relaxed, acquire, and seq_cst
1 parent 373e53d commit c318710

File tree

2 files changed

+60
-14
lines changed

2 files changed

+60
-14
lines changed

lib/zig.h

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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)
37603768
zig_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

stage1/zig.h

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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)
37603768
zig_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

Comments
 (0)