authorgravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2022-12-17 00:27:34-05:00
committergravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2023-01-01 16:44:28-05:00
log047fe58a53f8381503d8cffd29dab37216cb5557
tree9c14df994b1b8ce20dc2da950aada81e90e64988
parent4f8f7b749cbac5eb7c282e8ffeab248ae7933fb9

cbe: fix msvc cmpxchg implementations


1 files changed, 31 insertions(+), 15 deletions(-)

lib/zig.h+31-15
......@@ -196,7 +196,7 @@ typedef char bool;
196196#define memory_order_acq_rel 4
197197#define memory_order_seq_cst 5
198198#define zig_atomic(type) type
199#define zig_cmpxchg_strong(obj, expected, desired, succ, fail, type) zig_expand_concat(zig_msvc_cmpxchg_, type)(obj, expected, desired)
199#define zig_cmpxchg_strong(obj, expected, desired, succ, fail, type) zig_expand_concat(zig_msvc_cmpxchg_, type)(obj, &(expected), desired)
200200#define zig_cmpxchg_weak(obj, expected, desired, succ, fail, type) zig_cmpxchg_strong(obj, expected, desired, succ, fail, type)
201201#define zig_atomicrmw_xchg(obj, arg, order, type) zig_expand_concat(zig_msvc_atomicrmw_xchg_, type)(obj, arg)
202202#define zig_atomicrmw_add(obj, arg, order, type) zig_expand_concat(zig_msvc_atomicrmw_add_, type)(obj, arg)
......@@ -2096,12 +2096,18 @@ zig_float_builtins(c_longdouble)
20962096#if _MSC_VER && (_M_IX86 || _M_X64)
20972097#include <intrin.h>
20982098
2099// TODO: zig_msvc_atomic_load should load 32 bit without interlocked on x86, load 64 bit without interlocked on x64
2100// TODO: Fix obviously broken nand / min / max, these don't exist on msvc _InterlockedNand
2099// TODO: zig_msvc_atomic_load should just load 32 bit without interlocked on x86, and just load 64 bit without interlocked on x64
2100// TODO: Fix obviously broken nand / min / max, these don't exist on msvc
21012101
21022102#define zig_msvc_atomics(type, suffix) \
2103 static inline bool zig_msvc_cmpxchg_##type(zig_##type volatile* obj, zig_##type expected, zig_##type desired) { \
2104 return _InterlockedCompareExchange##suffix(obj, desired, expected) == expected; \
2103 static inline bool zig_msvc_cmpxchg_##type(zig_##type volatile* obj, zig_##type* expected, zig_##type desired) { \
2104 zig_##type comparand = *expected; \
2105 zig_##type initial = _InterlockedCompareExchange##suffix(obj, desired, comparand); \
2106 bool exchanged = initial == comparand; \
2107 if (!exchanged) { \
2108 *expected = initial; \
2109 } \
2110 return exchanged; \
21052111 } \
21062112 static inline zig_##type zig_msvc_atomicrmw_xchg_##type(zig_##type volatile* obj, zig_##type value) { \
21072113 return _InterlockedExchange##suffix(obj, value); \
......@@ -2146,12 +2152,24 @@ zig_msvc_atomics(i32, )
21462152zig_msvc_atomics(u64, 64)
21472153zig_msvc_atomics(i64, 64)
21482154
2149static inline bool zig_msvc_cmpxchg_p32(void** obj, void* expected, void* desired) {
2150 return _InterlockedCompareExchangePointer(obj, desired, expected) == expected;
2155static inline bool zig_msvc_cmpxchg_p32(void** obj, void** expected, void* desired) {
2156 void* comparand = *expected;
2157 void* initial = _InterlockedCompareExchangePointer(obj, desired, comparand);
2158 bool exchanged = initial == comparand;
2159 if (!exchanged) {
2160 *expected = initial;
2161 }
2162 return exchanged;
21512163}
21522164
2153static inline bool zig_msvc_cmpxchg_p64(void** obj, void* expected, void* desired) {
2154 return _InterlockedCompareExchangePointer(obj, desired, expected) == expected;
2165static inline bool zig_msvc_cmpxchg_p64(void** obj, void** expected, void* desired) {
2166 void* comparand = *expected;
2167 void* initial = _InterlockedCompareExchangePointer(obj, desired, comparand);
2168 bool exchanged = initial == comparand;
2169 if (!exchanged) {
2170 *expected = initial;
2171 }
2172 return exchanged;
21552173}
21562174
21572175#if _M_IX86
......@@ -2180,13 +2198,11 @@ static inline void* zig_msvc_atomic_load_p64(void** obj) {
21802198}
21812199#endif
21822200
2183static inline bool zig_msvc_cmpxchg_u128(zig_u128 volatile* obj, zig_u128 expected, zig_u128 desired) {
2184 zig_u128 comparand_result = desired;
2185 return _InterlockedCompareExchange128((zig_i64 volatile*)obj, expected.hi, expected.lo, (zig_i64*)&comparand_result);
2201static inline bool zig_msvc_cmpxchg_u128(zig_u128 volatile* obj, zig_u128* expected, zig_u128 desired) {
2202 return _InterlockedCompareExchange128((zig_i64 volatile*)obj, desired.hi, desired.lo, (zig_i64*)expected);
21862203}
21872204
2188static inline bool zig_msvc_cmpxchg_i128(zig_i128 volatile* obj, zig_i128 expected, zig_i128 desired) {
2189 zig_i128 comparand_result = desired;
2190 return _InterlockedCompareExchange128((zig_i64 volatile*)obj, expected.hi, expected.lo, (zig_u64*)&comparand_result);
2205static inline bool zig_msvc_cmpxchg_i128(zig_i128 volatile* obj, zig_i128* expected, zig_i128 desired) {
2206 return _InterlockedCompareExchange128((zig_i64 volatile*)obj, desired.hi, desired.lo, (zig_u64*)expected);
21912207}
21922208#endif