| ... | ... | @@ -316,7 +316,7 @@ zig_extern void *memset (void *, int, size_t); |
| 316 | 316 | |
| 317 | 317 | /* ===================== 8/16/32/64-bit Integer Support ===================== */ |
| 318 | 318 | |
| 319 | | #if __STDC_VERSION__ >= 199901L |
| 319 | #if __STDC_VERSION__ >= 199901L || _MSC_VER |
| 320 | 320 | #include <stdint.h> |
| 321 | 321 | #else |
| 322 | 322 | |
| ... | ... | @@ -1923,6 +1923,7 @@ typedef double zig_f16; |
| 1923 | 1923 | #define zig_make_f16(fp, repr) fp |
| 1924 | 1924 | #elif LDBL_MANT_DIG == 11 |
| 1925 | 1925 | #define zig_bitSizeOf_c_longdouble 16 |
| 1926 | typedef uint16_t zig_repr_c_longdouble; |
| 1926 | 1927 | typedef long double zig_f16; |
| 1927 | 1928 | #define zig_make_f16(fp, repr) fp##l |
| 1928 | 1929 | #elif FLT16_MANT_DIG == 11 && (zig_has_builtin(inff16) || defined(zig_gnuc)) |
| ... | ... | @@ -1959,6 +1960,7 @@ typedef double zig_f32; |
| 1959 | 1960 | #define zig_make_f32(fp, repr) fp |
| 1960 | 1961 | #elif LDBL_MANT_DIG == 24 |
| 1961 | 1962 | #define zig_bitSizeOf_c_longdouble 32 |
| 1963 | typedef uint32_t zig_repr_c_longdouble; |
| 1962 | 1964 | typedef long double zig_f32; |
| 1963 | 1965 | #define zig_make_f32(fp, repr) fp##l |
| 1964 | 1966 | #elif FLT32_MANT_DIG == 24 |
| ... | ... | @@ -1982,6 +1984,7 @@ typedef int32_t zig_f32; |
| 1982 | 1984 | #if _MSC_VER |
| 1983 | 1985 | #ifdef ZIG_TARGET_ABI_MSVC |
| 1984 | 1986 | #define zig_bitSizeOf_c_longdouble 64 |
| 1987 | typedef uint64_t zig_repr_c_longdouble; |
| 1985 | 1988 | #endif |
| 1986 | 1989 | #define zig_make_special_constant_f64(sign, name, arg, repr) sign zig_make_f64(zig_msvc_flt_##name, ) |
| 1987 | 1990 | #else /* _MSC_VER */ |
| ... | ... | @@ -1995,6 +1998,7 @@ typedef double zig_f64; |
| 1995 | 1998 | #define zig_make_f64(fp, repr) fp |
| 1996 | 1999 | #elif LDBL_MANT_DIG == 53 |
| 1997 | 2000 | #define zig_bitSizeOf_c_longdouble 64 |
| 2001 | typedef uint64_t zig_repr_c_longdouble; |
| 1998 | 2002 | typedef long double zig_f64; |
| 1999 | 2003 | #define zig_make_f64(fp, repr) fp##l |
| 2000 | 2004 | #elif FLT64_MANT_DIG == 53 |
| ... | ... | @@ -2027,6 +2031,7 @@ typedef double zig_f80; |
| 2027 | 2031 | #define zig_make_f80(fp, repr) fp |
| 2028 | 2032 | #elif LDBL_MANT_DIG == 64 |
| 2029 | 2033 | #define zig_bitSizeOf_c_longdouble 80 |
| 2034 | typedef zig_u128 zig_repr_c_longdouble; |
| 2030 | 2035 | typedef long double zig_f80; |
| 2031 | 2036 | #define zig_make_f80(fp, repr) fp##l |
| 2032 | 2037 | #elif FLT80_MANT_DIG == 64 |
| ... | ... | @@ -2062,6 +2067,7 @@ typedef double zig_f128; |
| 2062 | 2067 | #define zig_make_f128(fp, repr) fp |
| 2063 | 2068 | #elif LDBL_MANT_DIG == 113 |
| 2064 | 2069 | #define zig_bitSizeOf_c_longdouble 128 |
| 2070 | typedef zig_u128 zig_repr_c_longdouble; |
| 2065 | 2071 | typedef long double zig_f128; |
| 2066 | 2072 | #define zig_make_f128(fp, repr) fp##l |
| 2067 | 2073 | #elif FLT128_MANT_DIG == 113 |
| ... | ... | @@ -2099,9 +2105,10 @@ typedef zig_i128 zig_f128; |
| 2099 | 2105 | #ifdef zig_bitSizeOf_c_longdouble |
| 2100 | 2106 | |
| 2101 | 2107 | #ifdef ZIG_TARGET_ABI_MSVC |
| 2102 | | typedef double zig_c_longdouble; |
| 2103 | 2108 | #undef zig_bitSizeOf_c_longdouble |
| 2104 | 2109 | #define zig_bitSizeOf_c_longdouble 64 |
| 2110 | typedef uint64_t zig_repr_c_longdouble; |
| 2111 | typedef zig_f64 zig_c_longdouble; |
| 2105 | 2112 | #define zig_make_c_longdouble(fp, repr) fp |
| 2106 | 2113 | #else |
| 2107 | 2114 | typedef long double zig_c_longdouble; |
| ... | ... | @@ -2113,6 +2120,7 @@ typedef long double zig_c_longdouble; |
| 2113 | 2120 | #undef zig_has_c_longdouble |
| 2114 | 2121 | #define zig_has_c_longdouble 0 |
| 2115 | 2122 | #define zig_bitSizeOf_c_longdouble 80 |
| 2123 | typedef zig_u128 zig_repr_c_longdouble; |
| 2116 | 2124 | #define zig_compiler_rt_abbrev_c_longdouble zig_compiler_rt_abbrev_f80 |
| 2117 | 2125 | #define zig_bitSizeOf_repr_c_longdouble 128 |
| 2118 | 2126 | typedef zig_i128 zig_c_longdouble; |
| ... | ... | @@ -2126,21 +2134,18 @@ typedef zig_i128 zig_c_longdouble; |
| 2126 | 2134 | |
| 2127 | 2135 | #if !zig_has_float_builtins |
| 2128 | 2136 | #define zig_float_from_repr(Type, ReprType) \ |
| 2129 | | static inline zig_##Type zig_float_from_repr_##Type(zig_##ReprType repr) { \ |
| 2130 | | return *((zig_##Type*)&repr); \ |
| 2137 | static inline zig_##Type zig_float_from_repr_##Type(ReprType 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) |
| 2134 | | zig_float_from_repr(f32, u32) |
| 2135 | | zig_float_from_repr(f64, u64) |
| 2136 | | zig_float_from_repr(f80, u128) |
| 2137 | | zig_float_from_repr(f128, u128) |
| 2138 | | #if zig_bitSizeOf_c_longdouble == 80 |
| 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 |
| 2143 | zig_float_from_repr(f16, uint16_t) |
| 2144 | zig_float_from_repr(f32, uint32_t) |
| 2145 | zig_float_from_repr(f64, uint64_t) |
| 2146 | zig_float_from_repr(f80, zig_u128) |
| 2147 | zig_float_from_repr(f128, zig_u128) |
| 2148 | zig_float_from_repr(c_longdouble, zig_repr_c_longdouble) |
| 2144 | 2149 | #endif |
| 2145 | 2150 | |
| 2146 | 2151 | #define zig_cast_f16 (zig_f16) |
| ... | ... | @@ -2288,98 +2293,98 @@ zig_float_builtins(c_longdouble) |
| 2288 | 2293 | |
| 2289 | 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) \ |
| 2292 | | static inline bool zig_msvc_cmpxchg_##Type(zig_##Type volatile* obj, zig_##Type* expected, zig_##Type desired) { \ |
| 2293 | | zig_##Type comparand = *expected; \ |
| 2294 | | zig_##Type initial = _InterlockedCompareExchange##suffix(obj, desired, comparand); \ |
| 2296 | #define zig_msvc_atomics(ZigType, Type, suffix) \ |
| 2297 | static inline bool zig_msvc_cmpxchg_##ZigType(Type volatile* obj, Type* expected, Type desired) { \ |
| 2298 | Type comparand = *expected; \ |
| 2299 | Type initial = _InterlockedCompareExchange##suffix(obj, desired, comparand); \ |
| 2295 | 2300 | bool exchanged = initial == comparand; \ |
| 2296 | 2301 | if (!exchanged) { \ |
| 2297 | 2302 | *expected = initial; \ |
| 2298 | 2303 | } \ |
| 2299 | 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 | 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 | 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 | 2313 | bool success = false; \ |
| 2309 | | zig_##Type new; \ |
| 2310 | | zig_##Type prev; \ |
| 2314 | Type new; \ |
| 2315 | Type prev; \ |
| 2311 | 2316 | while (!success) { \ |
| 2312 | 2317 | prev = *obj; \ |
| 2313 | 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 | 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 | 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 | 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 | 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 | 2333 | bool success = false; \ |
| 2329 | | zig_##Type new; \ |
| 2330 | | zig_##Type prev; \ |
| 2334 | Type new; \ |
| 2335 | Type prev; \ |
| 2331 | 2336 | while (!success) { \ |
| 2332 | 2337 | prev = *obj; \ |
| 2333 | 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 | 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 | 2344 | bool success = false; \ |
| 2340 | | zig_##Type new; \ |
| 2341 | | zig_##Type prev; \ |
| 2345 | Type new; \ |
| 2346 | Type prev; \ |
| 2342 | 2347 | while (!success) { \ |
| 2343 | 2348 | prev = *obj; \ |
| 2344 | 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 | 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 | 2355 | bool success = false; \ |
| 2351 | | zig_##Type new; \ |
| 2352 | | zig_##Type prev; \ |
| 2356 | Type new; \ |
| 2357 | Type prev; \ |
| 2353 | 2358 | while (!success) { \ |
| 2354 | 2359 | prev = *obj; \ |
| 2355 | 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 | 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 | 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 | 2369 | return _InterlockedOr##suffix(obj, 0); \ |
| 2365 | 2370 | } |
| 2366 | 2371 | |
| 2367 | | zig_msvc_atomics(u8, 8) |
| 2368 | | zig_msvc_atomics(i8, 8) |
| 2369 | | zig_msvc_atomics(u16, 16) |
| 2370 | | zig_msvc_atomics(i16, 16) |
| 2371 | | zig_msvc_atomics(u32, ) |
| 2372 | | zig_msvc_atomics(i32, ) |
| 2372 | zig_msvc_atomics( u8, uint8_t, 8) |
| 2373 | zig_msvc_atomics( i8, int8_t, 8) |
| 2374 | zig_msvc_atomics(u16, uint16_t, 16) |
| 2375 | zig_msvc_atomics(i16, int16_t, 16) |
| 2376 | zig_msvc_atomics(u32, uint32_t, ) |
| 2377 | zig_msvc_atomics(i32, int32_t, ) |
| 2373 | 2378 | |
| 2374 | 2379 | #if _M_X64 |
| 2375 | | zig_msvc_atomics(u64, 64) |
| 2376 | | zig_msvc_atomics(i64, 64) |
| 2380 | zig_msvc_atomics(u64, uint64_t, 64) |
| 2381 | zig_msvc_atomics(i64, int64_t, 64) |
| 2377 | 2382 | #endif |
| 2378 | 2383 | |
| 2379 | 2384 | #define zig_msvc_flt_atomics(Type, ReprType, suffix) \ |
| 2380 | 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); \ |
| 2382 | | zig_##ReprType initial = _InterlockedCompareExchange##suffix((zig_##ReprType volatile*)obj, *((zig_##ReprType*)&desired), comparand); \ |
| 2386 | ReprType comparand = *((ReprType*)expected); \ |
| 2387 | ReprType initial = _InterlockedCompareExchange##suffix((ReprType volatile*)obj, *((ReprType*)&desired), comparand); \ |
| 2383 | 2388 | bool exchanged = initial == comparand; \ |
| 2384 | 2389 | if (!exchanged) { \ |
| 2385 | 2390 | *expected = *((zig_##Type*)&initial); \ |
| ... | ... | @@ -2387,35 +2392,35 @@ zig_msvc_atomics(i64, 64) |
| 2387 | 2392 | return exchanged; \ |
| 2388 | 2393 | } \ |
| 2389 | 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 | 2396 | return *((zig_##Type*)&initial); \ |
| 2392 | 2397 | } \ |
| 2393 | 2398 | static inline zig_##Type zig_msvc_atomicrmw_add_##Type(zig_##Type volatile* obj, zig_##Type value) { \ |
| 2394 | 2399 | bool success = false; \ |
| 2395 | | zig_##ReprType new; \ |
| 2400 | ReprType new; \ |
| 2396 | 2401 | zig_##Type prev; \ |
| 2397 | 2402 | while (!success) { \ |
| 2398 | 2403 | prev = *obj; \ |
| 2399 | 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 | 2407 | return prev; \ |
| 2403 | 2408 | } \ |
| 2404 | 2409 | static inline zig_##Type zig_msvc_atomicrmw_sub_##Type(zig_##Type volatile* obj, zig_##Type value) { \ |
| 2405 | 2410 | bool success = false; \ |
| 2406 | | zig_##ReprType new; \ |
| 2411 | ReprType new; \ |
| 2407 | 2412 | zig_##Type prev; \ |
| 2408 | 2413 | while (!success) { \ |
| 2409 | 2414 | prev = *obj; \ |
| 2410 | 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 | 2418 | return prev; \ |
| 2414 | 2419 | } |
| 2415 | 2420 | |
| 2416 | | zig_msvc_flt_atomics(f32, u32, ) |
| 2421 | zig_msvc_flt_atomics(f32, uint32_t, ) |
| 2417 | 2422 | #if _M_X64 |
| 2418 | | zig_msvc_flt_atomics(f64, u64, 64) |
| 2423 | zig_msvc_flt_atomics(f64, uint64_t, 64) |
| 2419 | 2424 | #endif |
| 2420 | 2425 | |
| 2421 | 2426 | #if _M_IX86 |
| ... | ... | @@ -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 | 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 | 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 | 2453 | return exchanged; |
| 2449 | 2454 | } |
| 2450 | 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 | 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 | 2461 | _InterlockedExchangePointer(obj, arg); |
| 2457 | 2462 | } |
| 2458 | 2463 | |