authorgravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2022-12-19 00:47:17-05:00
committergravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2023-01-01 16:44:29-05:00
log5d59799641608741d3a4eb45e125e59235c2e94c
tree8879caab88542b5f9a05aeabf2d0bbfd5512ed8a
parent6ed049fe3642c775e53b3bef2f9bfb6a1de0f325

cbe: add msvc flt atomics, re-enable test


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

lib/zig.h+40
......@@ -2202,6 +2202,46 @@ zig_msvc_atomics(i32, )
22022202zig_msvc_atomics(u64, 64)
22032203zig_msvc_atomics(i64, 64)
22042204
2205#define zig_msvc_flt_atomics(Type, ReprType, suffix) \
2206 static inline bool zig_msvc_cmpxchg_##Type(zig_##Type volatile* obj, zig_##Type* expected, zig_##Type desired) { \
2207 zig_##ReprType comparand = *((zig_##ReprType*)expected); \
2208 zig_##ReprType initial = _InterlockedCompareExchange##suffix((zig_##ReprType volatile*)obj, *((zig_##ReprType*)&desired), comparand); \
2209 bool exchanged = initial == comparand; \
2210 if (!exchanged) { \
2211 *expected = *((zig_##Type*)&initial); \
2212 } \
2213 return exchanged; \
2214 } \
2215 static inline zig_##Type zig_msvc_atomicrmw_xchg_##Type(zig_##Type volatile* obj, zig_##Type value) { \
2216 zig_##ReprType initial = _InterlockedExchange##suffix((zig_##ReprType volatile*)obj, *((zig_##ReprType*)&value)); \
2217 return *((zig_##Type*)&initial); \
2218 } \
2219 static inline zig_##Type zig_msvc_atomicrmw_add_##Type(zig_##Type volatile* obj, zig_##Type value) { \
2220 bool success = false; \
2221 zig_##ReprType new; \
2222 zig_##Type prev; \
2223 while (!success) { \
2224 prev = *obj; \
2225 new = prev + value; \
2226 success = zig_msvc_cmpxchg_##Type(obj, &prev, *((zig_##ReprType*)&new)); \
2227 } \
2228 return prev; \
2229 } \
2230 static inline zig_##Type zig_msvc_atomicrmw_sub_##Type(zig_##Type volatile* obj, zig_##Type value) { \
2231 bool success = false; \
2232 zig_##ReprType new; \
2233 zig_##Type prev; \
2234 while (!success) { \
2235 prev = *obj; \
2236 new = prev - value; \
2237 success = zig_msvc_cmpxchg_##Type(obj, &prev, *((zig_##ReprType*)&new)); \
2238 } \
2239 return prev; \
2240 }
2241
2242zig_msvc_flt_atomics(f32, u32, )
2243zig_msvc_flt_atomics(f64, u64, 32)
2244
22052245#if _M_IX86
22062246static inline void* zig_msvc_atomicrmw_xchg_p32(void** obj, zig_u32* arg) {
22072247 return _InterlockedExchangePointer(obj, arg);
test/behavior/atomics.zig-1
......@@ -217,7 +217,6 @@ test "atomicrmw with floats" {
217217 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
218218 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
219219 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
220 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
221220
222221 if ((builtin.zig_backend == .stage2_llvm or builtin.zig_backend == .stage2_c) and
223222 builtin.cpu.arch == .aarch64)