zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit b22b84de9d1a978a554d08e37e993295d99a92c1 (tree)
parent 1aa2c32055c53657fd3a9825427454e0d74c20ed
Author: kcbanner <kcbanner@gmail.com>
Date:   Thu, 19 Jan 2023 23:52:30 -0500

cbe: fixup x86 atomics

- add zig_msvc_atomic_barrier()
- fix zig_msvc_atomic_load_p32

Diffstat:
Mlib/zig.h | 14+++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/lib/zig.h b/lib/zig.h @@ -225,7 +225,12 @@ typedef char bool; #define zig_atomicrmw_max(obj, arg, order, type) zig_expand_concat(zig_msvc_atomicrmw_max_, type)(obj, arg) #define zig_atomic_store(obj, arg, order, type) zig_expand_concat(zig_msvc_atomic_store_, type)(obj, arg) #define zig_atomic_load(obj, order, type) zig_expand_concat(zig_msvc_atomic_load_, type)(obj) +#if _M_X64 #define zig_fence(order) __faststorefence() +#else +#define zig_fence(order) zig_msvc_atomic_barrier() +#endif + // TODO: _MSC_VER && (_M_ARM || _M_ARM64) #else #define memory_order_relaxed 0 @@ -2271,6 +2276,13 @@ zig_msvc_flt_atomics(f64, u64, 64) #endif #if _M_IX86 +static inline void zig_msvc_atomic_barrier() { + zig_i32 barrier; + __asm { + xchg barrier, eax + } +} + static inline void* zig_msvc_atomicrmw_xchg_p32(void** obj, zig_u32* arg) { return _InterlockedExchangePointer(obj, arg); } @@ -2279,7 +2291,7 @@ static inline void zig_msvc_atomic_store_p32(void** obj, zig_u32* arg) { _InterlockedExchangePointer(obj, arg); } -static inline void* zig_msvc_atomic_load_p32(void** obj, zig_u32* arg) { +static inline void* zig_msvc_atomic_load_p32(void** obj) { return (void*)_InterlockedOr((void*)obj, 0); }