| ... | @@ -316,7 +316,7 @@ zig_extern void *memset (void *, int, size_t); | ... | @@ -316,7 +316,7 @@ zig_extern void *memset (void *, int, size_t); |
| 316 | | 316 | |
| 317 | /* ===================== 8/16/32/64-bit Integer Support ===================== */ | 317 | /* ===================== 8/16/32/64-bit Integer Support ===================== */ |
| 318 | | 318 | |
| 319 | #if __STDC_VERSION__ >= 199901L | 319 | #if __STDC_VERSION__ >= 199901L || _MSC_VER |
| 320 | #include <stdint.h> | 320 | #include <stdint.h> |
| 321 | #else | 321 | #else |
| 322 | | 322 | |
| ... | @@ -1923,6 +1923,7 @@ typedef double zig_f16; | ... | @@ -1923,6 +1923,7 @@ typedef double zig_f16; |
| 1923 | #define zig_make_f16(fp, repr) fp | 1923 | #define zig_make_f16(fp, repr) fp |
| 1924 | #elif LDBL_MANT_DIG == 11 | 1924 | #elif LDBL_MANT_DIG == 11 |
| 1925 | #define zig_bitSizeOf_c_longdouble 16 | 1925 | #define zig_bitSizeOf_c_longdouble 16 |
| | 1926 | typedef uint16_t zig_repr_c_longdouble; |
| 1926 | typedef long double zig_f16; | 1927 | typedef long double zig_f16; |
| 1927 | #define zig_make_f16(fp, repr) fp##l | 1928 | #define zig_make_f16(fp, repr) fp##l |
| 1928 | #elif FLT16_MANT_DIG == 11 && (zig_has_builtin(inff16) || defined(zig_gnuc)) | 1929 | #elif FLT16_MANT_DIG == 11 && (zig_has_builtin(inff16) || defined(zig_gnuc)) |
| ... | @@ -1959,6 +1960,7 @@ typedef double zig_f32; | ... | @@ -1959,6 +1960,7 @@ typedef double zig_f32; |
| 1959 | #define zig_make_f32(fp, repr) fp | 1960 | #define zig_make_f32(fp, repr) fp |
| 1960 | #elif LDBL_MANT_DIG == 24 | 1961 | #elif LDBL_MANT_DIG == 24 |
| 1961 | #define zig_bitSizeOf_c_longdouble 32 | 1962 | #define zig_bitSizeOf_c_longdouble 32 |
| | 1963 | typedef uint32_t zig_repr_c_longdouble; |
| 1962 | typedef long double zig_f32; | 1964 | typedef long double zig_f32; |
| 1963 | #define zig_make_f32(fp, repr) fp##l | 1965 | #define zig_make_f32(fp, repr) fp##l |
| 1964 | #elif FLT32_MANT_DIG == 24 | 1966 | #elif FLT32_MANT_DIG == 24 |
| ... | @@ -1982,6 +1984,7 @@ typedef int32_t zig_f32; | ... | @@ -1982,6 +1984,7 @@ typedef int32_t zig_f32; |
| 1982 | #if _MSC_VER | 1984 | #if _MSC_VER |
| 1983 | #ifdef ZIG_TARGET_ABI_MSVC | 1985 | #ifdef ZIG_TARGET_ABI_MSVC |
| 1984 | #define zig_bitSizeOf_c_longdouble 64 | 1986 | #define zig_bitSizeOf_c_longdouble 64 |
| | 1987 | typedef uint64_t zig_repr_c_longdouble; |
| 1985 | #endif | 1988 | #endif |
| 1986 | #define zig_make_special_constant_f64(sign, name, arg, repr) sign zig_make_f64(zig_msvc_flt_##name, ) | 1989 | #define zig_make_special_constant_f64(sign, name, arg, repr) sign zig_make_f64(zig_msvc_flt_##name, ) |
| 1987 | #else /* _MSC_VER */ | 1990 | #else /* _MSC_VER */ |
| ... | @@ -1995,6 +1998,7 @@ typedef double zig_f64; | ... | @@ -1995,6 +1998,7 @@ typedef double zig_f64; |
| 1995 | #define zig_make_f64(fp, repr) fp | 1998 | #define zig_make_f64(fp, repr) fp |
| 1996 | #elif LDBL_MANT_DIG == 53 | 1999 | #elif LDBL_MANT_DIG == 53 |
| 1997 | #define zig_bitSizeOf_c_longdouble 64 | 2000 | #define zig_bitSizeOf_c_longdouble 64 |
| | 2001 | typedef uint64_t zig_repr_c_longdouble; |
| 1998 | typedef long double zig_f64; | 2002 | typedef long double zig_f64; |
| 1999 | #define zig_make_f64(fp, repr) fp##l | 2003 | #define zig_make_f64(fp, repr) fp##l |
| 2000 | #elif FLT64_MANT_DIG == 53 | 2004 | #elif FLT64_MANT_DIG == 53 |
| ... | @@ -2027,6 +2031,7 @@ typedef double zig_f80; | ... | @@ -2027,6 +2031,7 @@ typedef double zig_f80; |
| 2027 | #define zig_make_f80(fp, repr) fp | 2031 | #define zig_make_f80(fp, repr) fp |
| 2028 | #elif LDBL_MANT_DIG == 64 | 2032 | #elif LDBL_MANT_DIG == 64 |
| 2029 | #define zig_bitSizeOf_c_longdouble 80 | 2033 | #define zig_bitSizeOf_c_longdouble 80 |
| | 2034 | typedef zig_u128 zig_repr_c_longdouble; |
| 2030 | typedef long double zig_f80; | 2035 | typedef long double zig_f80; |
| 2031 | #define zig_make_f80(fp, repr) fp##l | 2036 | #define zig_make_f80(fp, repr) fp##l |
| 2032 | #elif FLT80_MANT_DIG == 64 | 2037 | #elif FLT80_MANT_DIG == 64 |
| ... | @@ -2062,6 +2067,7 @@ typedef double zig_f128; | ... | @@ -2062,6 +2067,7 @@ typedef double zig_f128; |
| 2062 | #define zig_make_f128(fp, repr) fp | 2067 | #define zig_make_f128(fp, repr) fp |
| 2063 | #elif LDBL_MANT_DIG == 113 | 2068 | #elif LDBL_MANT_DIG == 113 |
| 2064 | #define zig_bitSizeOf_c_longdouble 128 | 2069 | #define zig_bitSizeOf_c_longdouble 128 |
| | 2070 | typedef zig_u128 zig_repr_c_longdouble; |
| 2065 | typedef long double zig_f128; | 2071 | typedef long double zig_f128; |
| 2066 | #define zig_make_f128(fp, repr) fp##l | 2072 | #define zig_make_f128(fp, repr) fp##l |
| 2067 | #elif FLT128_MANT_DIG == 113 | 2073 | #elif FLT128_MANT_DIG == 113 |
| ... | @@ -2099,9 +2105,10 @@ typedef zig_i128 zig_f128; | ... | @@ -2099,9 +2105,10 @@ typedef zig_i128 zig_f128; |
| 2099 | #ifdef zig_bitSizeOf_c_longdouble | 2105 | #ifdef zig_bitSizeOf_c_longdouble |
| 2100 | | 2106 | |
| 2101 | #ifdef ZIG_TARGET_ABI_MSVC | 2107 | #ifdef ZIG_TARGET_ABI_MSVC |
| 2102 | typedef double zig_c_longdouble; | | |
| 2103 | #undef zig_bitSizeOf_c_longdouble | 2108 | #undef zig_bitSizeOf_c_longdouble |
| 2104 | #define zig_bitSizeOf_c_longdouble 64 | 2109 | #define zig_bitSizeOf_c_longdouble 64 |
| | 2110 | typedef uint64_t zig_repr_c_longdouble; |
| | 2111 | typedef zig_f64 zig_c_longdouble; |
| 2105 | #define zig_make_c_longdouble(fp, repr) fp | 2112 | #define zig_make_c_longdouble(fp, repr) fp |
| 2106 | #else | 2113 | #else |
| 2107 | typedef long double zig_c_longdouble; | 2114 | typedef long double zig_c_longdouble; |
| ... | @@ -2113,6 +2120,7 @@ typedef long double zig_c_longdouble; | ... | @@ -2113,6 +2120,7 @@ typedef long double zig_c_longdouble; |
| 2113 | #undef zig_has_c_longdouble | 2120 | #undef zig_has_c_longdouble |
| 2114 | #define zig_has_c_longdouble 0 | 2121 | #define zig_has_c_longdouble 0 |
| 2115 | #define zig_bitSizeOf_c_longdouble 80 | 2122 | #define zig_bitSizeOf_c_longdouble 80 |
| | 2123 | typedef zig_u128 zig_repr_c_longdouble; |
| 2116 | #define zig_compiler_rt_abbrev_c_longdouble zig_compiler_rt_abbrev_f80 | 2124 | #define zig_compiler_rt_abbrev_c_longdouble zig_compiler_rt_abbrev_f80 |
| 2117 | #define zig_bitSizeOf_repr_c_longdouble 128 | 2125 | #define zig_bitSizeOf_repr_c_longdouble 128 |
| 2118 | typedef zig_i128 zig_c_longdouble; | 2126 | typedef zig_i128 zig_c_longdouble; |
| ... | @@ -2126,21 +2134,18 @@ typedef zig_i128 zig_c_longdouble; | ... | @@ -2126,21 +2134,18 @@ typedef zig_i128 zig_c_longdouble; |
| 2126 | | 2134 | |
| 2127 | #if !zig_has_float_builtins | 2135 | #if !zig_has_float_builtins |
| 2128 | #define zig_float_from_repr(Type, ReprType) \ | 2136 | #define zig_float_from_repr(Type, ReprType) \ |
| 2129 | static inline zig_##Type zig_float_from_repr_##Type(zig_##ReprType repr) { \ | 2137 | static inline zig_##Type zig_float_from_repr_##Type(ReprType repr) { \ |
| 2130 | return *((zig_##Type*)&repr); \ | 2138 | zig_##Type result; \ |
| | 2139 | memcpy(&result, &repr, sizeof(result)); \ |
| | 2140 | return result; \ |
| 2131 | } | 2141 | } |
| 2132 | | 2142 | |
| 2133 | zig_float_from_repr(f16, u16) | 2143 | zig_float_from_repr(f16, uint16_t) |
| 2134 | zig_float_from_repr(f32, u32) | 2144 | zig_float_from_repr(f32, uint32_t) |
| 2135 | zig_float_from_repr(f64, u64) | 2145 | zig_float_from_repr(f64, uint64_t) |
| 2136 | zig_float_from_repr(f80, u128) | 2146 | zig_float_from_repr(f80, zig_u128) |
| 2137 | zig_float_from_repr(f128, u128) | 2147 | zig_float_from_repr(f128, zig_u128) |
| 2138 | #if zig_bitSizeOf_c_longdouble == 80 | 2148 | zig_float_from_repr(c_longdouble, zig_repr_c_longdouble) |
| 2139 | zig_float_from_repr(c_longdouble, u128) | | |
| 2140 | #else | | |
| 2141 | #define zig_expand_float_from_repr(Type, ReprType) zig_float_from_repr(Type, ReprType) | | |
| 2142 | zig_expand_float_from_repr(c_longdouble, zig_expand_concat(u, zig_bitSizeOf_c_longdouble)) | | |
| 2143 | #endif | | |
| 2144 | #endif | 2149 | #endif |
| 2145 | | 2150 | |
| 2146 | #define zig_cast_f16 (zig_f16) | 2151 | #define zig_cast_f16 (zig_f16) |
| ... | @@ -2288,98 +2293,98 @@ zig_float_builtins(c_longdouble) | ... | @@ -2288,98 +2293,98 @@ zig_float_builtins(c_longdouble) |
| 2288 | | 2293 | |
| 2289 | // TODO: zig_msvc_atomic_load should load 32 bit without interlocked on x86, and load 64 bit without interlocked on x64 | 2294 | // TODO: zig_msvc_atomic_load should load 32 bit without interlocked on x86, and load 64 bit without interlocked on x64 |
| 2290 | | 2295 | |
| 2291 | #define zig_msvc_atomics(Type, suffix) \ | 2296 | #define zig_msvc_atomics(ZigType, Type, suffix) \ |
| 2292 | static inline bool zig_msvc_cmpxchg_##Type(zig_##Type volatile* obj, zig_##Type* expected, zig_##Type desired) { \ | 2297 | static inline bool zig_msvc_cmpxchg_##ZigType(Type volatile* obj, Type* expected, Type desired) { \ |
| 2293 | zig_##Type comparand = *expected; \ | 2298 | Type comparand = *expected; \ |
| 2294 | zig_##Type initial = _InterlockedCompareExchange##suffix(obj, desired, comparand); \ | 2299 | Type initial = _InterlockedCompareExchange##suffix(obj, desired, comparand); \ |
| 2295 | bool exchanged = initial == comparand; \ | 2300 | bool exchanged = initial == comparand; \ |
| 2296 | if (!exchanged) { \ | 2301 | if (!exchanged) { \ |
| 2297 | *expected = initial; \ | 2302 | *expected = initial; \ |
| 2298 | } \ | 2303 | } \ |
| 2299 | return exchanged; \ | 2304 | return exchanged; \ |
| 2300 | } \ | 2305 | } \ |
| 2301 | static inline zig_##Type zig_msvc_atomicrmw_xchg_##Type(zig_##Type volatile* obj, zig_##Type value) { \ | 2306 | static inline Type zig_msvc_atomicrmw_xchg_##ZigType(Type volatile* obj, Type value) { \ |
| 2302 | return _InterlockedExchange##suffix(obj, value); \ | 2307 | return _InterlockedExchange##suffix(obj, value); \ |
| 2303 | } \ | 2308 | } \ |
| 2304 | static inline zig_##Type zig_msvc_atomicrmw_add_##Type(zig_##Type volatile* obj, zig_##Type value) { \ | 2309 | static inline Type zig_msvc_atomicrmw_add_##ZigType(Type volatile* obj, Type value) { \ |
| 2305 | return _InterlockedExchangeAdd##suffix(obj, value); \ | 2310 | return _InterlockedExchangeAdd##suffix(obj, value); \ |
| 2306 | } \ | 2311 | } \ |
| 2307 | static inline zig_##Type zig_msvc_atomicrmw_sub_##Type(zig_##Type volatile* obj, zig_##Type value) { \ | 2312 | static inline Type zig_msvc_atomicrmw_sub_##ZigType(Type volatile* obj, Type value) { \ |
| 2308 | bool success = false; \ | 2313 | bool success = false; \ |
| 2309 | zig_##Type new; \ | 2314 | Type new; \ |
| 2310 | zig_##Type prev; \ | 2315 | Type prev; \ |
| 2311 | while (!success) { \ | 2316 | while (!success) { \ |
| 2312 | prev = *obj; \ | 2317 | prev = *obj; \ |
| 2313 | new = prev - value; \ | 2318 | new = prev - value; \ |
| 2314 | success = zig_msvc_cmpxchg_##Type(obj, &prev, new); \ | 2319 | success = zig_msvc_cmpxchg_##ZigType(obj, &prev, new); \ |
| 2315 | } \ | 2320 | } \ |
| 2316 | return prev; \ | 2321 | return prev; \ |
| 2317 | } \ | 2322 | } \ |
| 2318 | static inline zig_##Type zig_msvc_atomicrmw_or_##Type(zig_##Type volatile* obj, zig_##Type value) { \ | 2323 | static inline Type zig_msvc_atomicrmw_or_##ZigType(Type volatile* obj, Type value) { \ |
| 2319 | return _InterlockedOr##suffix(obj, value); \ | 2324 | return _InterlockedOr##suffix(obj, value); \ |
| 2320 | } \ | 2325 | } \ |
| 2321 | static inline zig_##Type zig_msvc_atomicrmw_xor_##Type(zig_##Type volatile* obj, zig_##Type value) { \ | 2326 | static inline Type zig_msvc_atomicrmw_xor_##ZigType(Type volatile* obj, Type value) { \ |
| 2322 | return _InterlockedXor##suffix(obj, value); \ | 2327 | return _InterlockedXor##suffix(obj, value); \ |
| 2323 | } \ | 2328 | } \ |
| 2324 | static inline zig_##Type zig_msvc_atomicrmw_and_##Type(zig_##Type volatile* obj, zig_##Type value) { \ | 2329 | static inline Type zig_msvc_atomicrmw_and_##ZigType(Type volatile* obj, Type value) { \ |
| 2325 | return _InterlockedAnd##suffix(obj, value); \ | 2330 | return _InterlockedAnd##suffix(obj, value); \ |
| 2326 | } \ | 2331 | } \ |
| 2327 | static inline zig_##Type zig_msvc_atomicrmw_nand_##Type(zig_##Type volatile* obj, zig_##Type value) { \ | 2332 | static inline Type zig_msvc_atomicrmw_nand_##ZigType(Type volatile* obj, Type value) { \ |
| 2328 | bool success = false; \ | 2333 | bool success = false; \ |
| 2329 | zig_##Type new; \ | 2334 | Type new; \ |
| 2330 | zig_##Type prev; \ | 2335 | Type prev; \ |
| 2331 | while (!success) { \ | 2336 | while (!success) { \ |
| 2332 | prev = *obj; \ | 2337 | prev = *obj; \ |
| 2333 | new = ~(prev & value); \ | 2338 | new = ~(prev & value); \ |
| 2334 | success = zig_msvc_cmpxchg_##Type(obj, &prev, new); \ | 2339 | success = zig_msvc_cmpxchg_##ZigType(obj, &prev, new); \ |
| 2335 | } \ | 2340 | } \ |
| 2336 | return prev; \ | 2341 | return prev; \ |
| 2337 | } \ | 2342 | } \ |
| 2338 | static inline zig_##Type zig_msvc_atomicrmw_min_##Type(zig_##Type volatile* obj, zig_##Type value) { \ | 2343 | static inline Type zig_msvc_atomicrmw_min_##ZigType(Type volatile* obj, Type value) { \ |
| 2339 | bool success = false; \ | 2344 | bool success = false; \ |
| 2340 | zig_##Type new; \ | 2345 | Type new; \ |
| 2341 | zig_##Type prev; \ | 2346 | Type prev; \ |
| 2342 | while (!success) { \ | 2347 | while (!success) { \ |
| 2343 | prev = *obj; \ | 2348 | prev = *obj; \ |
| 2344 | new = value < prev ? value : prev; \ | 2349 | new = value < prev ? value : prev; \ |
| 2345 | success = zig_msvc_cmpxchg_##Type(obj, &prev, new); \ | 2350 | success = zig_msvc_cmpxchg_##ZigType(obj, &prev, new); \ |
| 2346 | } \ | 2351 | } \ |
| 2347 | return prev; \ | 2352 | return prev; \ |
| 2348 | } \ | 2353 | } \ |
| 2349 | static inline zig_##Type zig_msvc_atomicrmw_max_##Type(zig_##Type volatile* obj, zig_##Type value) { \ | 2354 | static inline Type zig_msvc_atomicrmw_max_##ZigType(Type volatile* obj, Type value) { \ |
| 2350 | bool success = false; \ | 2355 | bool success = false; \ |
| 2351 | zig_##Type new; \ | 2356 | Type new; \ |
| 2352 | zig_##Type prev; \ | 2357 | Type prev; \ |
| 2353 | while (!success) { \ | 2358 | while (!success) { \ |
| 2354 | prev = *obj; \ | 2359 | prev = *obj; \ |
| 2355 | new = value > prev ? value : prev; \ | 2360 | new = value > prev ? value : prev; \ |
| 2356 | success = zig_msvc_cmpxchg_##Type(obj, &prev, new); \ | 2361 | success = zig_msvc_cmpxchg_##ZigType(obj, &prev, new); \ |
| 2357 | } \ | 2362 | } \ |
| 2358 | return prev; \ | 2363 | return prev; \ |
| 2359 | } \ | 2364 | } \ |
| 2360 | static inline void zig_msvc_atomic_store_##Type(zig_##Type volatile* obj, zig_##Type value) { \ | 2365 | static inline void zig_msvc_atomic_store_##ZigType(Type volatile* obj, Type value) { \ |
| 2361 | _InterlockedExchange##suffix(obj, value); \ | 2366 | _InterlockedExchange##suffix(obj, value); \ |
| 2362 | } \ | 2367 | } \ |
| 2363 | static inline zig_##Type zig_msvc_atomic_load_##Type(zig_##Type volatile* obj) { \ | 2368 | static inline Type zig_msvc_atomic_load_##ZigType(Type volatile* obj) { \ |
| 2364 | return _InterlockedOr##suffix(obj, 0); \ | 2369 | return _InterlockedOr##suffix(obj, 0); \ |
| 2365 | } | 2370 | } |
| 2366 | | 2371 | |
| 2367 | zig_msvc_atomics(u8, 8) | 2372 | zig_msvc_atomics( u8, uint8_t, 8) |
| 2368 | zig_msvc_atomics(i8, 8) | 2373 | zig_msvc_atomics( i8, int8_t, 8) |
| 2369 | zig_msvc_atomics(u16, 16) | 2374 | zig_msvc_atomics(u16, uint16_t, 16) |
| 2370 | zig_msvc_atomics(i16, 16) | 2375 | zig_msvc_atomics(i16, int16_t, 16) |
| 2371 | zig_msvc_atomics(u32, ) | 2376 | zig_msvc_atomics(u32, uint32_t, ) |
| 2372 | zig_msvc_atomics(i32, ) | 2377 | zig_msvc_atomics(i32, int32_t, ) |
| 2373 | | 2378 | |
| 2374 | #if _M_X64 | 2379 | #if _M_X64 |
| 2375 | zig_msvc_atomics(u64, 64) | 2380 | zig_msvc_atomics(u64, uint64_t, 64) |
| 2376 | zig_msvc_atomics(i64, 64) | 2381 | zig_msvc_atomics(i64, int64_t, 64) |
| 2377 | #endif | 2382 | #endif |
| 2378 | | 2383 | |
| 2379 | #define zig_msvc_flt_atomics(Type, ReprType, suffix) \ | 2384 | #define zig_msvc_flt_atomics(Type, ReprType, suffix) \ |
| 2380 | static inline bool zig_msvc_cmpxchg_##Type(zig_##Type volatile* obj, zig_##Type* expected, zig_##Type desired) { \ | 2385 | static inline bool zig_msvc_cmpxchg_##Type(zig_##Type volatile* obj, zig_##Type* expected, zig_##Type desired) { \ |
| 2381 | zig_##ReprType comparand = *((zig_##ReprType*)expected); \ | 2386 | ReprType comparand = *((ReprType*)expected); \ |
| 2382 | zig_##ReprType initial = _InterlockedCompareExchange##suffix((zig_##ReprType volatile*)obj, *((zig_##ReprType*)&desired), comparand); \ | 2387 | ReprType initial = _InterlockedCompareExchange##suffix((ReprType volatile*)obj, *((ReprType*)&desired), comparand); \ |
| 2383 | bool exchanged = initial == comparand; \ | 2388 | bool exchanged = initial == comparand; \ |
| 2384 | if (!exchanged) { \ | 2389 | if (!exchanged) { \ |
| 2385 | *expected = *((zig_##Type*)&initial); \ | 2390 | *expected = *((zig_##Type*)&initial); \ |
| ... | @@ -2387,35 +2392,35 @@ zig_msvc_atomics(i64, 64) | ... | @@ -2387,35 +2392,35 @@ zig_msvc_atomics(i64, 64) |
| 2387 | return exchanged; \ | 2392 | return exchanged; \ |
| 2388 | } \ | 2393 | } \ |
| 2389 | static inline zig_##Type zig_msvc_atomicrmw_xchg_##Type(zig_##Type volatile* obj, zig_##Type value) { \ | 2394 | static inline zig_##Type zig_msvc_atomicrmw_xchg_##Type(zig_##Type volatile* obj, zig_##Type value) { \ |
| 2390 | zig_##ReprType initial = _InterlockedExchange##suffix((zig_##ReprType volatile*)obj, *((zig_##ReprType*)&value)); \ | 2395 | ReprType initial = _InterlockedExchange##suffix((ReprType volatile*)obj, *((ReprType*)&value)); \ |
| 2391 | return *((zig_##Type*)&initial); \ | 2396 | return *((zig_##Type*)&initial); \ |
| 2392 | } \ | 2397 | } \ |
| 2393 | static inline zig_##Type zig_msvc_atomicrmw_add_##Type(zig_##Type volatile* obj, zig_##Type value) { \ | 2398 | static inline zig_##Type zig_msvc_atomicrmw_add_##Type(zig_##Type volatile* obj, zig_##Type value) { \ |
| 2394 | bool success = false; \ | 2399 | bool success = false; \ |
| 2395 | zig_##ReprType new; \ | 2400 | ReprType new; \ |
| 2396 | zig_##Type prev; \ | 2401 | zig_##Type prev; \ |
| 2397 | while (!success) { \ | 2402 | while (!success) { \ |
| 2398 | prev = *obj; \ | 2403 | prev = *obj; \ |
| 2399 | new = prev + value; \ | 2404 | new = prev + value; \ |
| 2400 | success = zig_msvc_cmpxchg_##Type(obj, &prev, *((zig_##ReprType*)&new)); \ | 2405 | success = zig_msvc_cmpxchg_##Type(obj, &prev, *((ReprType*)&new)); \ |
| 2401 | } \ | 2406 | } \ |
| 2402 | return prev; \ | 2407 | return prev; \ |
| 2403 | } \ | 2408 | } \ |
| 2404 | static inline zig_##Type zig_msvc_atomicrmw_sub_##Type(zig_##Type volatile* obj, zig_##Type value) { \ | 2409 | static inline zig_##Type zig_msvc_atomicrmw_sub_##Type(zig_##Type volatile* obj, zig_##Type value) { \ |
| 2405 | bool success = false; \ | 2410 | bool success = false; \ |
| 2406 | zig_##ReprType new; \ | 2411 | ReprType new; \ |
| 2407 | zig_##Type prev; \ | 2412 | zig_##Type prev; \ |
| 2408 | while (!success) { \ | 2413 | while (!success) { \ |
| 2409 | prev = *obj; \ | 2414 | prev = *obj; \ |
| 2410 | new = prev - value; \ | 2415 | new = prev - value; \ |
| 2411 | success = zig_msvc_cmpxchg_##Type(obj, &prev, *((zig_##ReprType*)&new)); \ | 2416 | success = zig_msvc_cmpxchg_##Type(obj, &prev, *((ReprType*)&new)); \ |
| 2412 | } \ | 2417 | } \ |
| 2413 | return prev; \ | 2418 | return prev; \ |
| 2414 | } | 2419 | } |
| 2415 | | 2420 | |
| 2416 | zig_msvc_flt_atomics(f32, u32, ) | 2421 | zig_msvc_flt_atomics(f32, uint32_t, ) |
| 2417 | #if _M_X64 | 2422 | #if _M_X64 |
| 2418 | zig_msvc_flt_atomics(f64, u64, 64) | 2423 | zig_msvc_flt_atomics(f64, uint64_t, 64) |
| 2419 | #endif | 2424 | #endif |
| 2420 | | 2425 | |
| 2421 | #if _M_IX86 | 2426 | #if _M_IX86 |
| ... | @@ -2426,11 +2431,11 @@ static inline void zig_msvc_atomic_barrier() { | ... | @@ -2426,11 +2431,11 @@ static inline void zig_msvc_atomic_barrier() { |
| 2426 | } | 2431 | } |
| 2427 | } | 2432 | } |
| 2428 | | 2433 | |
| 2429 | static inline void* zig_msvc_atomicrmw_xchg_p32(void** obj, uint32_t* arg) { | 2434 | static inline void* zig_msvc_atomicrmw_xchg_p32(void** obj, void* arg) { |
| 2430 | return _InterlockedExchangePointer(obj, arg); | 2435 | return _InterlockedExchangePointer(obj, arg); |
| 2431 | } | 2436 | } |
| 2432 | | 2437 | |
| 2433 | static inline void zig_msvc_atomic_store_p32(void** obj, uint32_t* arg) { | 2438 | static inline void zig_msvc_atomic_store_p32(void** obj, void* arg) { |
| 2434 | _InterlockedExchangePointer(obj, arg); | 2439 | _InterlockedExchangePointer(obj, arg); |
| 2435 | } | 2440 | } |
| 2436 | | 2441 | |
| ... | @@ -2448,11 +2453,11 @@ static inline bool zig_msvc_cmpxchg_p32(void** obj, void** expected, void* desir | ... | @@ -2448,11 +2453,11 @@ static inline bool zig_msvc_cmpxchg_p32(void** obj, void** expected, void* desir |
| 2448 | return exchanged; | 2453 | return exchanged; |
| 2449 | } | 2454 | } |
| 2450 | #else /* _M_IX86 */ | 2455 | #else /* _M_IX86 */ |
| 2451 | static inline void* zig_msvc_atomicrmw_xchg_p64(void** obj, uint64_t* arg) { | 2456 | static inline void* zig_msvc_atomicrmw_xchg_p64(void** obj, void* arg) { |
| 2452 | return _InterlockedExchangePointer(obj, arg); | 2457 | return _InterlockedExchangePointer(obj, arg); |
| 2453 | } | 2458 | } |
| 2454 | | 2459 | |
| 2455 | static inline void zig_msvc_atomic_store_p64(void** obj, uint64_t* arg) { | 2460 | static inline void zig_msvc_atomic_store_p64(void** obj, void* arg) { |
| 2456 | _InterlockedExchangePointer(obj, arg); | 2461 | _InterlockedExchangePointer(obj, arg); |
| 2457 | } | 2462 | } |
| 2458 | | 2463 | |