aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorkcbanner <kcbanner@gmail.com>2022-12-17 14:40:40 -0500
committerkcbanner <kcbanner@gmail.com>2023-01-01 16:44:29 -0500
commit5470708a89cb11eefc3e0cbb43337dbf3f99c8ac (patch)
tree67c7fa4172dc2cbcf1ee83a88a2406dfc8b909c4 /lib
parentd63b8d21b36645a773d201e4b343b32859cc9927 (diff)
downloadzig-5470708a89cb11eefc3e0cbb43337dbf3f99c8ac.tar.gz
zig-5470708a89cb11eefc3e0cbb43337dbf3f99c8ac.zip
cbe: implement 128 bit atomic operations with cmpxchg loops
- Enable 128 bit atomic int tests for the cbe only
Diffstat (limited to 'lib')
-rw-r--r--lib/zig.h40
1 files changed, 40 insertions, 0 deletions
diff --git a/lib/zig.h b/lib/zig.h
index 496012a579..a43fcf16be 100644
--- a/lib/zig.h
+++ b/lib/zig.h
@@ -1397,6 +1397,10 @@ static inline zig_i128 zig_mod_i128(zig_i128 lhs, zig_i128 rhs) {
#define zig_div_floor_u128 zig_div_trunc_u128
#define zig_mod_u128 zig_rem_u128
+static inline zig_u128 zig_nand_u128(zig_u128 lhs, zig_u128 rhs) {
+ return zig_not_u128(zig_and_u128(lhs, rhs), 128);
+}
+
static inline zig_u128 zig_min_u128(zig_u128 lhs, zig_u128 rhs) {
return zig_cmp_u128(lhs, rhs) < zig_as_i32(0) ? lhs : rhs;
}
@@ -2237,4 +2241,40 @@ static inline bool zig_msvc_cmpxchg_i128(zig_i128 volatile* obj, zig_i128* expec
return _InterlockedCompareExchange128((zig_i64 volatile*)obj, desired.hi, desired.lo, (zig_u64*)expected);
}
+#define zig_msvc_atomics_128xchg(Type) \
+ static inline zig_##Type zig_msvc_atomicrmw_xchg_##Type(zig_##Type volatile* obj, zig_##Type value) { \
+ bool success = false; \
+ zig_##Type prev; \
+ while (!success) { \
+ prev = *obj; \
+ success = zig_msvc_cmpxchg_##Type(obj, &prev, value); \
+ } \
+ return prev; \
+ }
+
+zig_msvc_atomics_128xchg(u128)
+zig_msvc_atomics_128xchg(i128)
+
+#define zig_msvc_atomics_128op(Type, operation) \
+ static inline zig_##Type zig_msvc_atomicrmw_##operation##_##Type(zig_##Type volatile* obj, zig_##Type value) { \
+ bool success = false; \
+ zig_##Type new; \
+ zig_##Type prev; \
+ while (!success) { \
+ prev = *obj; \
+ new = zig_##operation##_##Type(prev, value); \
+ success = zig_msvc_cmpxchg_##Type(obj, &prev, new); \
+ } \
+ return prev; \
+ }
+
+zig_msvc_atomics_128op(u128, add)
+zig_msvc_atomics_128op(u128, sub)
+zig_msvc_atomics_128op(u128, or)
+zig_msvc_atomics_128op(u128, xor)
+zig_msvc_atomics_128op(u128, and)
+zig_msvc_atomics_128op(u128, nand)
+zig_msvc_atomics_128op(u128, min)
+zig_msvc_atomics_128op(u128, max)
+
#endif