diff options
| author | kcbanner <kcbanner@gmail.com> | 2023-01-19 23:52:30 -0500 |
|---|---|---|
| committer | kcbanner <kcbanner@gmail.com> | 2023-01-23 13:48:36 -0500 |
| commit | b22b84de9d1a978a554d08e37e993295d99a92c1 (patch) | |
| tree | 0aa2affdb6e25f4652e7d893870342c419bb6c95 | |
| parent | 1aa2c32055c53657fd3a9825427454e0d74c20ed (diff) | |
| download | zig-b22b84de9d1a978a554d08e37e993295d99a92c1.tar.gz zig-b22b84de9d1a978a554d08e37e993295d99a92c1.zip | |
cbe: fixup x86 atomics
- add zig_msvc_atomic_barrier()
- fix zig_msvc_atomic_load_p32
| -rw-r--r-- | lib/zig.h | 14 |
1 files changed, 13 insertions, 1 deletions
@@ -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); } |
