aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkcbanner <kcbanner@gmail.com>2023-01-19 23:52:30 -0500
committerkcbanner <kcbanner@gmail.com>2023-01-23 13:48:36 -0500
commitb22b84de9d1a978a554d08e37e993295d99a92c1 (patch)
tree0aa2affdb6e25f4652e7d893870342c419bb6c95
parent1aa2c32055c53657fd3a9825427454e0d74c20ed (diff)
downloadzig-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.h14
1 files changed, 13 insertions, 1 deletions
diff --git a/lib/zig.h b/lib/zig.h
index 8da6fb774d..a22f7f35de 100644
--- 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);
}