authorgravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2022-12-17 14:40:40-05:00
committergravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2023-01-01 16:44:29-05:00
log5470708a89cb11eefc3e0cbb43337dbf3f99c8ac
tree67c7fa4172dc2cbcf1ee83a88a2406dfc8b909c4
parentd63b8d21b36645a773d201e4b343b32859cc9927

cbe: implement 128 bit atomic operations with cmpxchg loops

- Enable 128 bit atomic int tests for the cbe only

2 files changed, 41 insertions(+), 1 deletions(-)

lib/zig.h+40
...@@ -1397,6 +1397,10 @@ static inline zig_i128 zig_mod_i128(zig_i128 lhs, zig_i128 rhs) {...@@ -1397,6 +1397,10 @@ static inline zig_i128 zig_mod_i128(zig_i128 lhs, zig_i128 rhs) {
1397#define zig_div_floor_u128 zig_div_trunc_u1281397#define zig_div_floor_u128 zig_div_trunc_u128
1398#define zig_mod_u128 zig_rem_u1281398#define zig_mod_u128 zig_rem_u128
13991399
1400static inline zig_u128 zig_nand_u128(zig_u128 lhs, zig_u128 rhs) {
1401 return zig_not_u128(zig_and_u128(lhs, rhs), 128);
1402}
1403
1400static inline zig_u128 zig_min_u128(zig_u128 lhs, zig_u128 rhs) {1404static inline zig_u128 zig_min_u128(zig_u128 lhs, zig_u128 rhs) {
1401 return zig_cmp_u128(lhs, rhs) < zig_as_i32(0) ? lhs : rhs;1405 return zig_cmp_u128(lhs, rhs) < zig_as_i32(0) ? lhs : rhs;
1402}1406}
...@@ -2237,4 +2241,40 @@ static inline bool zig_msvc_cmpxchg_i128(zig_i128 volatile* obj, zig_i128* expec...@@ -2237,4 +2241,40 @@ static inline bool zig_msvc_cmpxchg_i128(zig_i128 volatile* obj, zig_i128* expec
2237 return _InterlockedCompareExchange128((zig_i64 volatile*)obj, desired.hi, desired.lo, (zig_u64*)expected);2241 return _InterlockedCompareExchange128((zig_i64 volatile*)obj, desired.hi, desired.lo, (zig_u64*)expected);
2238}2242}
22392243
2244#define zig_msvc_atomics_128xchg(Type) \
2245 static inline zig_##Type zig_msvc_atomicrmw_xchg_##Type(zig_##Type volatile* obj, zig_##Type value) { \
2246 bool success = false; \
2247 zig_##Type prev; \
2248 while (!success) { \
2249 prev = *obj; \
2250 success = zig_msvc_cmpxchg_##Type(obj, &prev, value); \
2251 } \
2252 return prev; \
2253 }
2254
2255zig_msvc_atomics_128xchg(u128)
2256zig_msvc_atomics_128xchg(i128)
2257
2258#define zig_msvc_atomics_128op(Type, operation) \
2259 static inline zig_##Type zig_msvc_atomicrmw_##operation##_##Type(zig_##Type volatile* obj, zig_##Type value) { \
2260 bool success = false; \
2261 zig_##Type new; \
2262 zig_##Type prev; \
2263 while (!success) { \
2264 prev = *obj; \
2265 new = zig_##operation##_##Type(prev, value); \
2266 success = zig_msvc_cmpxchg_##Type(obj, &prev, new); \
2267 } \
2268 return prev; \
2269 }
2270
2271zig_msvc_atomics_128op(u128, add)
2272zig_msvc_atomics_128op(u128, sub)
2273zig_msvc_atomics_128op(u128, or)
2274zig_msvc_atomics_128op(u128, xor)
2275zig_msvc_atomics_128op(u128, and)
2276zig_msvc_atomics_128op(u128, nand)
2277zig_msvc_atomics_128op(u128, min)
2278zig_msvc_atomics_128op(u128, max)
2279
2240#endif2280#endif
test/behavior/atomics.zig+1-1
...@@ -252,7 +252,7 @@ test "atomicrmw with ints" {...@@ -252,7 +252,7 @@ test "atomicrmw with ints" {
252 }252 }
253253
254 // TODO: https://github.com/ziglang/zig/issues/13989254 // TODO: https://github.com/ziglang/zig/issues/13989
255 const bit_values = [_]usize{ 8, 16, 32, 64 };// ++ if (builtin.zig_backend != .stage2_c) [_]usize{ } else [_]usize{ 128 };255 const bit_values = [_]usize{ 8, 16, 32, 64 } ++ if (builtin.zig_backend != .stage2_c) [_]usize{ } else [_]usize{ 128 };
256 inline for (bit_values) |bits| {256 inline for (bit_values) |bits| {
257 try testAtomicRmwInt(.unsigned, bits);257 try testAtomicRmwInt(.unsigned, bits);
258 comptime try testAtomicRmwInt(.unsigned, bits);258 comptime try testAtomicRmwInt(.unsigned, bits);