authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-12-07 12:11:57+01:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2024-12-07 12:11:57+01:00
log4894ac4bcb468d6e609fd66fe99bfa7a6b95cc3b
tree2b6c6c585d06415aec4e6246ffa204f72f4f255d
parenteb9c9a38f268f48ac51223e04fab7af5d8a5a1bd
parentc27488a387ea3a1f1b6352d353bb45157ff5dcf3
signaturebadge-check Signed by PGP key B5690EEEBB952194

Merge pull request #22130 from alexrp/zig-h-portability

Some portability improvements and cleanups in `zig.h`

1 files changed, 302 insertions(+), 145 deletions(-)

lib/zig.h+302-145
......@@ -1,33 +1,143 @@
11#undef linux
22
3#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__
4#define __STDC_WANT_IEC_60559_TYPES_EXT__
5#endif
6#include <float.h>
7#include <limits.h>
83#include <stdarg.h>
94#include <stddef.h>
10#include <stdint.h>
115
12#if _MSC_VER
13#include <intrin.h>
14#elif defined(__i386__) || defined(__x86_64__)
15#include <cpuid.h>
16#endif
17
18#if !defined(__cplusplus) && __STDC_VERSION__ <= 201710L
19#if __STDC_VERSION__ >= 199901L
20#include <stdbool.h>
6#if defined(_MSC_VER)
7#define zig_msvc
8#elif defined(__clang__)
9#define zig_clang
10#define zig_gnuc
11#elif defined(__GNUC__)
12#define zig_gnuc
13#elif defined(__IBMC__)
14#define zig_xlc
15#elif defined(__TINYC__)
16#define zig_tinyc
17#elif defined(__slimcc__)
18#define zig_slimcc
19#endif
20
21#if defined(__aarch64__) || (defined(zig_msvc) && defined(_M_ARM64))
22#define zig_aarch64
23#elif defined(__thumb__) || (defined(zig_msvc) && defined(_M_ARM))
24#define zig_thumb
25#define zig_arm
26#elif defined(__arm__)
27#define zig_arm
28#elif defined(__hexagon__)
29#define zig_hexagon
30#elif defined(__loongarch32)
31#define zig_loongarch32
32#define zig_loongarch
33#elif defined(__loongarch64)
34#define zig_loongarch64
35#define zig_loongarch
36#elif defined(__mips64)
37#define zig_mips64
38#define zig_mips
39#elif defined(__mips__)
40#define zig_mips32
41#define zig_mips
42#elif defined(__powerpc64__)
43#define zig_powerpc64
44#define zig_powerpc
45#elif defined(__powerpc__)
46#define zig_powerpc32
47#define zig_powerpc
48#elif defined(__riscv) && __riscv_xlen == 32
49#define zig_riscv32
50#define zig_riscv
51#elif defined(__riscv) && __riscv_xlen == 64
52#define zig_riscv64
53#define zig_riscv
54#elif defined(__s390x__)
55#define zig_s390x
56#elif defined(__sparc__) && defined(__arch64__)
57#define zig_sparc64
58#define zig_sparc
59#elif defined(__sparc__)
60#define zig_sparc32
61#define zig_sparc
62#elif defined(__wasm32__)
63#define zig_wasm32
64#define zig_wasm
65#elif defined(__wasm64__)
66#define zig_wasm64
67#define zig_wasm
68#elif defined(__i386__) || (defined(zig_msvc) && defined(_M_IX86))
69#define zig_x86_32
70#define zig_x86
71#elif defined (__x86_64__) || (defined(zig_msvc) && defined(_M_X64))
72#define zig_x86_64
73#define zig_x86
74#endif
75
76#if defined(zig_msvc) || __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
77#define zig_little_endian 1
78#define zig_big_endian 0
2179#else
22typedef char bool;
23#define false 0
24#define true 1
80#define zig_little_endian 0
81#define zig_big_endian 1
2582#endif
83
84#if defined(_AIX)
85#define zig_aix
86#elif defined(__MACH__)
87#define zig_darwin
88#elif defined(__DragonFly__)
89#define zig_dragonfly
90#define zig_bsd
91#elif defined(__EMSCRIPTEN__)
92#define zig_emscripten
93#elif defined(__FreeBSD__)
94#define zig_freebsd
95#define zig_bsd
96#elif defined(__Fuchsia__)
97#define zig_fuchsia
98#elif defined(__HAIKU__)
99#define zig_haiku
100#elif defined(__gnu_hurd__)
101#define zig_hurd
102#elif defined(__linux__)
103#define zig_linux
104#elif defined(__NetBSD__)
105#define zig_netbsd
106#define zig_bsd
107#elif defined(__OpenBSD__)
108#define zig_openbsd
109#define zig_bsd
110#elif defined(__SVR4)
111#define zig_solaris
112#elif defined(__wasi__)
113#define zig_wasi
114#elif defined(_WIN32)
115#define zig_windows
116#elif defined(__MVS__)
117#define zig_zos
118#endif
119
120#if defined(zig_windows)
121#define zig_coff
122#elif defined(__ELF__)
123#define zig_elf
124#elif defined(zig_zos)
125#define zig_goff
126#elif defined(zig_darwin)
127#define zig_macho
128#elif defined(zig_aix)
129#define zig_xcoff
26130#endif
27131
28132#define zig_concat(lhs, rhs) lhs##rhs
29133#define zig_expand_concat(lhs, rhs) zig_concat(lhs, rhs)
30134
135#if defined(__has_include)
136#define zig_has_include(include) __has_include(include)
137#else
138#define zig_has_include(include) 0
139#endif
140
31141#if defined(__has_builtin)
32142#define zig_has_builtin(builtin) __has_builtin(__builtin_##builtin)
33143#else
......@@ -41,37 +151,19 @@ typedef char bool;
41151#define zig_has_attribute(attribute) 0
42152#endif
43153
44#if __LITTLE_ENDIAN__ || _MSC_VER
45#define zig_little_endian 1
46#define zig_big_endian 0
47#else
48#define zig_little_endian 0
49#define zig_big_endian 1
50#endif
51
52#if __STDC_VERSION__ >= 201112L
154#if __STDC_VERSION__ >= 202311L
155#define zig_threadlocal thread_local
156#elif __STDC_VERSION__ >= 201112L
53157#define zig_threadlocal _Thread_local
54#elif defined(__GNUC__)
158#elif defined(zig_gnuc) || defined(zig_slimcc)
55159#define zig_threadlocal __thread
56#elif _MSC_VER
160#elif defined(zig_msvc)
57161#define zig_threadlocal __declspec(thread)
58162#else
59163#define zig_threadlocal zig_threadlocal_unavailable
60164#endif
61165
62#if defined(__clang__)
63#define zig_clang
64#elif defined(__GNUC__)
65#define zig_gnuc
66#endif
67
68#if defined(zig_gnuc) && (defined(__i386__) || defined(__x86_64__))
69#define zig_f128_has_miscompilations 1
70#else
71#define zig_f128_has_miscompilations 0
72#endif
73
74#if _MSC_VER
166#if defined(zig_msvc)
75167#define zig_const_arr
76168#define zig_callconv(c) __##c
77169#else
......@@ -82,7 +174,7 @@ typedef char bool;
82174#if zig_has_attribute(naked) || defined(zig_gnuc)
83175#define zig_naked_decl __attribute__((naked))
84176#define zig_naked __attribute__((naked))
85#elif defined(_MSC_VER)
177#elif defined(zig_msvc)
86178#define zig_naked_decl
87179#define zig_naked __declspec(naked)
88180#else
......@@ -104,7 +196,7 @@ typedef char bool;
104196
105197#if zig_has_attribute(noinline)
106198#define zig_never_inline __attribute__((noinline)) zig_maybe_flatten
107#elif defined(_MSC_VER)
199#elif defined(zig_msvc)
108200#define zig_never_inline __declspec(noinline) zig_maybe_flatten
109201#else
110202#define zig_never_inline zig_never_inline_unavailable
......@@ -124,46 +216,48 @@ typedef char bool;
124216
125217#if __STDC_VERSION__ >= 199901L
126218#define zig_restrict restrict
127#elif defined(__GNUC__)
219#elif defined(zig_gnuc) || defined(zig_tinyc)
128220#define zig_restrict __restrict
129221#else
130222#define zig_restrict
131223#endif
132224
133#if zig_has_attribute(aligned)
225#if zig_has_attribute(aligned) || defined(zig_tinyc)
134226#define zig_under_align(alignment) __attribute__((aligned(alignment)))
135#elif _MSC_VER
227#elif defined(zig_msvc)
136228#define zig_under_align(alignment) __declspec(align(alignment))
137229#else
138230#define zig_under_align zig_align_unavailable
139231#endif
140232
141#if __STDC_VERSION__ >= 201112L
233#if __STDC_VERSION__ >= 202311L
234#define zig_align(alignment) alignas(alignment)
235#elif __STDC_VERSION__ >= 201112L
142236#define zig_align(alignment) _Alignas(alignment)
143237#else
144238#define zig_align(alignment) zig_under_align(alignment)
145239#endif
146240
147#if zig_has_attribute(aligned)
241#if zig_has_attribute(aligned) || defined(zig_tinyc)
148242#define zig_align_fn(alignment) __attribute__((aligned(alignment)))
149#elif _MSC_VER
243#elif defined(zig_msvc)
150244#define zig_align_fn(alignment)
151245#else
152246#define zig_align_fn zig_align_fn_unavailable
153247#endif
154248
155#if zig_has_attribute(packed)
249#if zig_has_attribute(packed) || defined(zig_tinyc)
156250#define zig_packed(definition) __attribute__((packed)) definition
157#elif _MSC_VER
251#elif defined(zig_msvc)
158252#define zig_packed(definition) __pragma(pack(1)) definition __pragma(pack())
159253#else
160254#define zig_packed(definition) zig_packed_unavailable
161255#endif
162256
163#if zig_has_attribute(section)
257#if zig_has_attribute(section) || defined(zig_tinyc)
164258#define zig_linksection(name) __attribute__((section(name)))
165259#define zig_linksection_fn zig_linksection
166#elif _MSC_VER
260#elif defined(zig_msvc)
167261#define zig_linksection(name) __pragma(section(name, read, write)) __declspec(allocate(name))
168262#define zig_linksection_fn(name) __pragma(section(name, read, execute)) __declspec(code_seg(name))
169263#else
......@@ -171,8 +265,10 @@ typedef char bool;
171265#define zig_linksection_fn zig_linksection
172266#endif
173267
174#if zig_has_builtin(unreachable) || defined(zig_gnuc)
268#if zig_has_builtin(unreachable) || defined(zig_gnuc) || defined(zig_tinyc)
175269#define zig_unreachable() __builtin_unreachable()
270#elif defined(zig_msvc)
271#define zig_unreachable() __assume(0)
176272#else
177273#define zig_unreachable()
178274#endif
......@@ -183,23 +279,23 @@ typedef char bool;
183279#define zig_extern extern
184280#endif
185281
186#if _MSC_VER
187#if _M_X64
282#if defined(zig_msvc)
283#if defined(zig_x86_64)
188284#define zig_mangle_c(symbol) symbol
189#else /*_M_X64 */
285#else /* zig_x86_64 */
190286#define zig_mangle_c(symbol) "_" symbol
191#endif /*_M_X64 */
192#else /* _MSC_VER */
193#if __APPLE__
287#endif /* zig_x86_64 */
288#else /* zig_msvc */
289#if defined(zig_macho)
194290#define zig_mangle_c(symbol) "_" symbol
195#else /* __APPLE__ */
291#else /* zig_macho */
196292#define zig_mangle_c(symbol) symbol
197#endif /* __APPLE__ */
198#endif /* _MSC_VER */
293#endif /* zig_macho */
294#endif /* zig_msvc */
199295
200#if zig_has_attribute(alias) && !__APPLE__
296#if (zig_has_attribute(alias) || defined(zig_tinyc)) && !defined(zig_macho)
201297#define zig_export(symbol, name) __attribute__((alias(symbol)))
202#elif _MSC_VER
298#elif defined(zig_msvc)
203299#define zig_export(symbol, name) ; \
204300 __pragma(comment(linker, "/alternatename:" zig_mangle_c(name) "=" zig_mangle_c(symbol)))
205301#else
......@@ -209,24 +305,24 @@ typedef char bool;
209305
210306#define zig_mangled_tentative zig_mangled
211307#define zig_mangled_final zig_mangled
212#if _MSC_VER
308#if defined(zig_msvc)
213309#define zig_mangled(mangled, unmangled) ; \
214310 zig_export(#mangled, unmangled)
215311#define zig_mangled_export(mangled, unmangled, symbol) \
216312 zig_export(unmangled, #mangled) \
217313 zig_export(symbol, unmangled)
218#else /* _MSC_VER */
314#else /* zig_msvc */
219315#define zig_mangled(mangled, unmangled) __asm(zig_mangle_c(unmangled))
220316#define zig_mangled_export(mangled, unmangled, symbol) \
221317 zig_mangled_final(mangled, unmangled) \
222318 zig_export(symbol, unmangled)
223#endif /* _MSC_VER */
319#endif /* zig_msvc */
224320
225#if _MSC_VER
321#if defined(zig_msvc)
226322#define zig_import(Type, fn_name, libc_name, sig_args, call_args) zig_extern Type fn_name sig_args;\
227323 __pragma(comment(linker, "/alternatename:" zig_mangle_c(#fn_name) "=" zig_mangle_c(#libc_name)));
228324#define zig_import_builtin(Type, fn_name, libc_name, sig_args, call_args) zig_import(Type, fn_name, sig_args, call_args)
229#else /* _MSC_VER */
325#else /* zig_msvc */
230326#define zig_import(Type, fn_name, libc_name, sig_args, call_args) zig_extern Type fn_name sig_args __asm(zig_mangle_c(#libc_name));
231327#define zig_import_builtin(Type, fn_name, libc_name, sig_args, call_args) zig_extern Type libc_name sig_args; \
232328 static inline Type fn_name sig_args { return libc_name call_args; }
......@@ -235,10 +331,10 @@ typedef char bool;
235331#define zig_expand_import_0(Type, fn_name, libc_name, sig_args, call_args) zig_import(Type, fn_name, libc_name, sig_args, call_args)
236332#define zig_expand_import_1(Type, fn_name, libc_name, sig_args, call_args) zig_import_builtin(Type, fn_name, libc_name, sig_args, call_args)
237333
238#if zig_has_attribute(weak) || defined(zig_gnuc)
334#if zig_has_attribute(weak) || defined(zig_gnuc) || defined(zig_tinyc)
239335#define zig_weak_linkage __attribute__((weak))
240336#define zig_weak_linkage_fn __attribute__((weak))
241#elif _MSC_VER
337#elif defined(zig_msvc)
242338#define zig_weak_linkage __declspec(selectany)
243339#define zig_weak_linkage_fn
244340#else
......@@ -246,72 +342,94 @@ typedef char bool;
246342#define zig_weak_linkage_fn zig_weak_linkage_unavailable
247343#endif
248344
345#if defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc)
346#define zig_gnuc_asm
347#endif
348
249349#if zig_has_builtin(trap)
250350#define zig_trap() __builtin_trap()
251#elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))
351#elif defined(zig_msvc)
352
353#if defined(zig_x86)
252354#define zig_trap() __ud2()
253#elif defined(_MSC_VER)
355#else
254356#define zig_trap() __fastfail(7)
255#elif defined(__thumb__)
357#endif
358
359#elif defined(zig_gnuc_asm)
360
361#if defined(zig_thumb)
256362#define zig_trap() __asm__ volatile("udf #0xfe")
257#elif defined(__arm__) || defined(__aarch64__)
363#elif defined(zig_arm) || defined(zig_aarch64)
258364#define zig_trap() __asm__ volatile("udf #0xfdee")
259#elif defined(__hexagon__)
365#elif defined(zig_hexagon)
260366#define zig_trap() __asm__ volatile("r27:26 = memd(#0xbadc0fee)")
261#elif defined(__loongarch__) || defined(__powerpc__)
367#elif defined(zig_loongarch) || defined(zig_powerpc)
262368#define zig_trap() __asm__ volatile(".word 0x0")
263#elif defined(__mips__)
369#elif defined(zig_mips)
264370#define zig_trap() __asm__ volatile(".word 0x3d")
265#elif defined(__riscv)
371#elif defined(zig_riscv)
266372#define zig_trap() __asm__ volatile("unimp")
267#elif defined(__s390__)
373#elif defined(zig_s390x)
268374#define zig_trap() __asm__ volatile("j 0x2")
269#elif defined(__sparc__)
375#elif defined(zig_sparc)
270376#define zig_trap() __asm__ volatile("illtrap")
271#elif defined(__i386__) || defined(__x86_64__)
377#elif defined(zig_x86)
272378#define zig_trap() __asm__ volatile("ud2")
273379#else
274380#define zig_trap() zig_trap_unavailable
275381#endif
276382
383#else
384#define zig_trap() zig_trap_unavailable
385#endif
386
277387#if zig_has_builtin(debugtrap)
278388#define zig_breakpoint() __builtin_debugtrap()
279#elif defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__)
389#elif defined(zig_msvc)
280390#define zig_breakpoint() __debugbreak()
281#elif defined(__arm__)
391#elif defined(zig_gnuc_asm)
392
393#if defined(zig_arm)
282394#define zig_breakpoint() __asm__ volatile("bkpt #0x0")
283#elif defined(__aarch64__)
395#elif defined(zig_aarch64)
284396#define zig_breakpoint() __asm__ volatile("brk #0xf000")
285#elif defined(__hexagon__)
397#elif defined(zig_hexagon)
286398#define zig_breakpoint() __asm__ volatile("brkpt")
287#elif defined(__loongarch__)
399#elif defined(zig_loongarch)
288400#define zig_breakpoint() __asm__ volatile("break 0x0")
289#elif defined(__mips__)
401#elif defined(zig_mips)
290402#define zig_breakpoint() __asm__ volatile("break")
291#elif defined(__powerpc__)
403#elif defined(zig_powerpc)
292404#define zig_breakpoint() __asm__ volatile("trap")
293#elif defined(__riscv)
405#elif defined(zig_riscv)
294406#define zig_breakpoint() __asm__ volatile("ebreak")
295#elif defined(__s390__)
407#elif defined(zig_s390x)
296408#define zig_breakpoint() __asm__ volatile("j 0x6")
297#elif defined(__sparc__)
409#elif defined(zig_sparc)
298410#define zig_breakpoint() __asm__ volatile("ta 0x1")
299#elif defined(__i386__) || defined(__x86_64__)
411#elif defined(zig_x86)
300412#define zig_breakpoint() __asm__ volatile("int $0x3")
301413#else
302414#define zig_breakpoint() zig_breakpoint_unavailable
303415#endif
304416
305#if zig_has_builtin(return_address) || defined(zig_gnuc)
417#else
418#define zig_breakpoint() zig_breakpoint_unavailable
419#endif
420
421#if zig_has_builtin(return_address) || defined(zig_gnuc) || defined(zig_tinyc)
306422#define zig_return_address() __builtin_extract_return_addr(__builtin_return_address(0))
307#elif defined(_MSC_VER)
423#elif defined(zig_msvc)
308424#define zig_return_address() _ReturnAddress()
309425#else
310426#define zig_return_address() 0
311427#endif
312428
313#if zig_has_builtin(frame_address) || defined(zig_gnuc)
429#if zig_has_builtin(frame_address) || defined(zig_gnuc) || defined(zig_tinyc)
314430#define zig_frame_address() __builtin_frame_address(0)
431#elif defined(zig_msvc)
432#define zig_frame_address() _AddressOfReturnAddress()
315433#else
316434#define zig_frame_address() 0
317435#endif
......@@ -330,18 +448,18 @@ typedef char bool;
330448#define zig_wasm_memory_grow(index, delta) zig_unimplemented()
331449#endif
332450
333#if __STDC_VERSION__ >= 201112L
451#if __STDC_VERSION__ >= 202311L
452#define zig_noreturn [[noreturn]]
453#elif __STDC_VERSION__ >= 201112L
334454#define zig_noreturn _Noreturn
335#elif zig_has_attribute(noreturn) || defined(zig_gnuc)
455#elif zig_has_attribute(noreturn) || defined(zig_gnuc) || defined(zig_tinyc)
336456#define zig_noreturn __attribute__((noreturn))
337#elif _MSC_VER
457#elif defined(zig_msvc)
338458#define zig_noreturn __declspec(noreturn)
339459#else
340460#define zig_noreturn
341461#endif
342462
343#define zig_bitSizeOf(T) (CHAR_BIT * sizeof(T))
344
345463#define zig_compiler_rt_abbrev_uint32_t si
346464#define zig_compiler_rt_abbrev_int32_t si
347465#define zig_compiler_rt_abbrev_uint64_t di
......@@ -357,12 +475,25 @@ typedef char bool;
357475zig_extern void *memcpy (void *zig_restrict, void const *zig_restrict, size_t);
358476zig_extern void *memset (void *, int, size_t);
359477
360/* ===================== 8/16/32/64-bit Integer Support ===================== */
478/* ================ Bool and 8/16/32/64-bit Integer Support ================= */
361479
362#if __STDC_VERSION__ >= 199901L || _MSC_VER
363#include <stdint.h>
480#include <limits.h>
481
482#define zig_bitSizeOf(T) (CHAR_BIT * sizeof(T))
483
484#if __STDC_VERSION__ >= 202311L
485/* bool, true, and false are provided by the language. */
486#elif __STDC_VERSION__ >= 199901L || zig_has_include(<stdbool.h>)
487#include <stdbool.h>
364488#else
489typedef char bool;
490#define false 0
491#define true 1
492#endif
365493
494#if __STDC_VERSION__ >= 199901L || defined(zig_msvc) || zig_has_include(<stdint.h>)
495#include <stdint.h>
496#else
366497#if SCHAR_MIN == ~0x7F && SCHAR_MAX == 0x7F && UCHAR_MAX == 0xFF
367498typedef unsigned char uint8_t;
368499typedef signed char int8_t;
......@@ -1136,7 +1267,7 @@ static inline int64_t zig_bit_reverse_i64(int64_t val, uint8_t bits) {
11361267 static inline uint8_t zig_popcount_i##w(int##w##_t val, uint8_t bits) { \
11371268 return zig_popcount_u##w((uint##w##_t)val, bits); \
11381269 }
1139#if zig_has_builtin(popcount) || defined(zig_gnuc)
1270#if zig_has_builtin(popcount) || defined(zig_gnuc) || defined(zig_tinyc)
11401271#define zig_builtin_popcount(w) \
11411272 static inline uint8_t zig_popcount_u##w(uint##w##_t val, uint8_t bits) { \
11421273 (void)bits; \
......@@ -1165,7 +1296,7 @@ zig_builtin_popcount(64)
11651296 static inline uint8_t zig_ctz_i##w(int##w##_t val, uint8_t bits) { \
11661297 return zig_ctz_u##w((uint##w##_t)val, bits); \
11671298 }
1168#if zig_has_builtin(ctz) || defined(zig_gnuc)
1299#if zig_has_builtin(ctz) || defined(zig_gnuc) || defined(zig_tinyc)
11691300#define zig_builtin_ctz(w) \
11701301 static inline uint8_t zig_ctz_u##w(uint##w##_t val, uint8_t bits) { \
11711302 if (val == 0) return bits; \
......@@ -1190,7 +1321,7 @@ zig_builtin_ctz(64)
11901321 static inline uint8_t zig_clz_i##w(int##w##_t val, uint8_t bits) { \
11911322 return zig_clz_u##w((uint##w##_t)val, bits); \
11921323 }
1193#if zig_has_builtin(clz) || defined(zig_gnuc)
1324#if zig_has_builtin(clz) || defined(zig_gnuc) || defined(zig_tinyc)
11941325#define zig_builtin_clz(w) \
11951326 static inline uint8_t zig_clz_u##w(uint##w##_t val, uint8_t bits) { \
11961327 if (val == 0) return bits; \
......@@ -1258,7 +1389,7 @@ typedef struct { zig_align(16) int64_t hi; uint64_t lo; } zig_i128;
12581389#define zig_make_u128(hi, lo) ((zig_u128){ .h##i = (hi), .l##o = (lo) })
12591390#define zig_make_i128(hi, lo) ((zig_i128){ .h##i = (hi), .l##o = (lo) })
12601391
1261#if _MSC_VER /* MSVC doesn't allow struct literals in constant expressions */
1392#if defined(zig_msvc) /* MSVC doesn't allow struct literals in constant expressions */
12621393#define zig_init_u128(hi, lo) { .h##i = (hi), .l##o = (lo) }
12631394#define zig_init_i128(hi, lo) { .h##i = (hi), .l##o = (lo) }
12641395#else /* But non-MSVC doesn't like the unprotected commas */
......@@ -3020,7 +3151,13 @@ static inline uint16_t zig_popcount_big(const void *val, bool is_signed, uint16_
30203151
30213152/* ========================= Floating Point Support ========================= */
30223153
3023#if _MSC_VER
3154#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__
3155#define __STDC_WANT_IEC_60559_TYPES_EXT__
3156#endif
3157
3158#include <float.h>
3159
3160#if defined(zig_msvc)
30243161float __cdecl nanf(char const* input);
30253162double __cdecl nan(char const* input);
30263163long double __cdecl nanl(char const* input);
......@@ -3082,7 +3219,7 @@ typedef uint16_t zig_f16;
30823219#undef zig_init_special_f16
30833220#define zig_init_special_f16(sign, name, arg, repr) repr
30843221#endif
3085#if __APPLE__ && (defined(__i386__) || defined(__x86_64__))
3222#if defined(zig_darwin) && defined(zig_x86)
30863223typedef uint16_t zig_compiler_rt_f16;
30873224#else
30883225typedef zig_f16 zig_compiler_rt_f16;
......@@ -3090,7 +3227,7 @@ typedef zig_f16 zig_compiler_rt_f16;
30903227
30913228#define zig_has_f32 1
30923229#define zig_libc_name_f32(name) name##f
3093#if _MSC_VER
3230#if defined(zig_msvc)
30943231#define zig_init_special_f32(sign, name, arg, repr) sign zig_make_f32(zig_msvc_flt_##name, )
30953232#else
30963233#define zig_init_special_f32(sign, name, arg, repr) zig_make_special_f32(sign, name, arg, repr)
......@@ -3122,7 +3259,7 @@ typedef uint32_t zig_f32;
31223259#define zig_has_f64 1
31233260#define zig_libc_name_f64(name) name
31243261
3125#if _MSC_VER
3262#if defined(zig_msvc)
31263263#define zig_init_special_f64(sign, name, arg, repr) sign zig_make_f64(zig_msvc_flt_##name, )
31273264#else
31283265#define zig_init_special_f64(sign, name, arg, repr) zig_make_special_f64(sign, name, arg, repr)
......@@ -3187,6 +3324,12 @@ typedef zig_u128 zig_f80;
31873324#define zig_init_special_f80(sign, name, arg, repr) repr
31883325#endif
31893326
3327#if !defined(zig_clang) && defined(zig_gnuc) && defined(zig_x86)
3328#define zig_f128_has_miscompilations 1
3329#else
3330#define zig_f128_has_miscompilations 0
3331#endif
3332
31903333#define zig_has_f128 1
31913334#define zig_libc_name_f128(name) name##q
31923335#define zig_init_special_f128(sign, name, arg, repr) zig_make_special_f128(sign, name, arg, repr)
......@@ -3215,7 +3358,7 @@ typedef __float128 zig_f128;
32153358#define zig_has_f128 0
32163359#undef zig_make_special_f128
32173360#undef zig_init_special_f128
3218#if __APPLE__ || defined(__aarch64__)
3361#if defined(zig_darwin) || defined(zig_aarch64)
32193362typedef __attribute__((__vector_size__(2 * sizeof(uint64_t)))) uint64_t zig_v2u64;
32203363zig_basic_operator(zig_v2u64, xor_v2u64, ^)
32213364#define zig_repr_f128 v2u64
......@@ -3234,10 +3377,10 @@ typedef zig_u128 zig_f128;
32343377#endif
32353378#endif
32363379
3237#if !_MSC_VER && defined(ZIG_TARGET_ABI_MSVC)
3380#if !defined(zig_msvc) && defined(ZIG_TARGET_ABI_MSVC)
32383381/* Emulate msvc abi on a gnu compiler */
32393382typedef zig_f64 zig_c_longdouble;
3240#elif _MSC_VER && !defined(ZIG_TARGET_ABI_MSVC)
3383#elif defined(zig_msvc) && !defined(ZIG_TARGET_ABI_MSVC)
32413384/* Emulate gnu abi on an msvc compiler */
32423385typedef zig_f128 zig_c_longdouble;
32433386#else
......@@ -3586,7 +3729,7 @@ zig_float_builtins(64)
35863729 res = zig_atomicrmw_expected; \
35873730} while (0)
35883731
3589#if __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_ATOMICS__)
3732#if (__STDC_VERSION__ >= 201112L || (zig_has_include(<stdatomic.h>) && !defined(zig_msvc))) && !defined(__STDC_NO_ATOMICS__)
35903733#include <stdatomic.h>
35913734typedef enum memory_order zig_memory_order;
35923735#define zig_memory_order_relaxed memory_order_relaxed
......@@ -3614,7 +3757,7 @@ typedef enum memory_order zig_memory_order;
36143757#define zig_atomicrmw_add_float zig_atomicrmw_add
36153758#undef zig_atomicrmw_sub_float
36163759#define zig_atomicrmw_sub_float zig_atomicrmw_sub
3617#elif defined(__GNUC__)
3760#elif defined(zig_gnuc)
36183761typedef int zig_memory_order;
36193762#define zig_memory_order_relaxed __ATOMIC_RELAXED
36203763#define zig_memory_order_acquire __ATOMIC_ACQUIRE
......@@ -3637,7 +3780,7 @@ typedef int zig_memory_order;
36373780#define zig_atomic_load(res, obj, order, Type, ReprType) __atomic_load (obj, &(res), order)
36383781#undef zig_atomicrmw_xchg_float
36393782#define zig_atomicrmw_xchg_float zig_atomicrmw_xchg
3640#elif _MSC_VER && (_M_IX86 || _M_X64)
3783#elif defined(zig_msvc) && defined(zig_x86)
36413784#define zig_memory_order_relaxed 0
36423785#define zig_memory_order_acquire 2
36433786#define zig_memory_order_release 3
......@@ -3657,7 +3800,7 @@ typedef int zig_memory_order;
36573800#define zig_atomicrmw_max(res, obj, arg, order, Type, ReprType) res = zig_msvc_atomicrmw_max_ ##Type(obj, arg)
36583801#define zig_atomic_store( obj, arg, order, Type, ReprType) zig_msvc_atomic_store_ ##Type(obj, arg)
36593802#define zig_atomic_load(res, obj, order, Type, ReprType) res = zig_msvc_atomic_load_ ##order##_##Type(obj)
3660/* TODO: _MSC_VER && (_M_ARM || _M_ARM64) */
3803/* TODO: zig_msvc && (zig_thumb || zig_aarch64) */
36613804#else
36623805#define zig_memory_order_relaxed 0
36633806#define zig_memory_order_acquire 2
......@@ -3680,7 +3823,7 @@ typedef int zig_memory_order;
36803823#define zig_atomic_load(res, obj, order, Type, ReprType) zig_atomics_unavailable
36813824#endif
36823825
3683#if _MSC_VER && (_M_IX86 || _M_X64)
3826#if defined(zig_msvc) && defined(zig_x86)
36843827
36853828/* TODO: zig_msvc_atomic_load should load 32 bit without interlocked on x86, and load 64 bit without interlocked on x64 */
36863829
......@@ -3777,7 +3920,7 @@ zig_msvc_atomics(i16, int16_t, short, 16, 16)
37773920zig_msvc_atomics(u32, uint32_t, long, , 32)
37783921zig_msvc_atomics(i32, int32_t, long, , 32)
37793922
3780#if _M_X64
3923#if defined(zig_x86_64)
37813924zig_msvc_atomics(u64, uint64_t, __int64, 64, 64)
37823925zig_msvc_atomics(i64, int64_t, __int64, 64, 64)
37833926#endif
......@@ -3822,11 +3965,11 @@ zig_msvc_atomics(i64, int64_t, __int64, 64, 64)
38223965 }
38233966
38243967zig_msvc_flt_atomics(f32, long, , 32)
3825#if _M_X64
3968#if defined(zig_x86_64)
38263969zig_msvc_flt_atomics(f64, int64_t, 64, 64)
38273970#endif
38283971
3829#if _M_IX86
3972#if defined(zig_x86_32)
38303973static inline void zig_msvc_atomic_barrier() {
38313974 int32_t barrier;
38323975 __asm {
......@@ -3863,7 +4006,7 @@ static inline bool zig_msvc_cmpxchg_p32(void volatile* obj, void* expected, void
38634006 if (!success) *(void**)expected = initial;
38644007 return success;
38654008}
3866#else /* _M_IX86 */
4009#else /* zig_x86_32 */
38674010static inline void* zig_msvc_atomicrmw_xchg_p64(void volatile* obj, void* arg) {
38684011 return _InterlockedExchangePointer(obj, arg);
38694012}
......@@ -3924,55 +4067,59 @@ static inline void zig_msvc_atomic_store_i128(zig_i128 volatile* obj, zig_i128 a
39244067 while (!zig_cmpxchg_weak(obj, expected, arg, zig_memory_order_seq_cst, zig_memory_order_seq_cst, i128, zig_i128));
39254068}
39264069
3927#endif /* _M_IX86 */
4070#endif /* zig_x86_32 */
39284071
3929#endif /* _MSC_VER && (_M_IX86 || _M_X64) */
4072#endif /* zig_msvc && zig_x86 */
39304073
39314074/* ======================== Special Case Intrinsics ========================= */
39324075
3933#if defined(_M_ARM) || defined(__thumb__)
4076#if defined(zig_msvc)
4077#include <intrin.h>
4078#endif
4079
4080#if defined(zig_thumb)
39344081
39354082static inline void* zig_thumb_windows_teb(void) {
39364083 void* teb = 0;
3937#if defined(_MSC_VER)
4084#if defined(zig_msvc)
39384085 teb = (void*)_MoveFromCoprocessor(15, 0, 13, 0, 2);
3939#elif defined(__GNUC__)
4086#elif defined(zig_gnuc_asm)
39404087 __asm__ ("mrc p15, 0, %[ptr], c13, c0, 2" : [ptr] "=r" (teb));
39414088#endif
39424089 return teb;
39434090}
39444091
3945#elif defined(_M_ARM64) || defined(__arch64__)
4092#elif defined(zig_aarch64)
39464093
39474094static inline void* zig_aarch64_windows_teb(void) {
39484095 void* teb = 0;
3949#if defined(_MSC_VER)
4096#if defined(zig_msvc)
39504097 teb = (void*)__readx18qword(0x0);
3951#elif defined(__GNUC__)
4098#elif defined(zig_gnuc_asm)
39524099 __asm__ ("mov %[ptr], x18" : [ptr] "=r" (teb));
39534100#endif
39544101 return teb;
39554102}
39564103
3957#elif defined(_M_IX86) || defined(__i386__)
4104#elif defined(zig_x86_32)
39584105
39594106static inline void* zig_x86_windows_teb(void) {
39604107 void* teb = 0;
3961#if defined(_MSC_VER)
4108#if defined(zig_msvc)
39624109 teb = (void*)__readfsdword(0x18);
3963#elif defined(__GNUC__)
4110#elif defined(zig_gnuc_asm)
39644111 __asm__ ("movl %%fs:0x18, %[ptr]" : [ptr] "=r" (teb));
39654112#endif
39664113 return teb;
39674114}
39684115
3969#elif defined(_M_X64) || defined(__x86_64__)
4116#elif defined(zig_x86_64)
39704117
39714118static inline void* zig_x86_64_windows_teb(void) {
39724119 void* teb = 0;
3973#if defined(_MSC_VER)
4120#if defined(zig_msvc)
39744121 teb = (void*)__readgsqword(0x30);
3975#elif defined(__GNUC__)
4122#elif defined(zig_gnuc_asm)
39764123 __asm__ ("movq %%gs:0x30, %[ptr]" : [ptr] "=r" (teb));
39774124#endif
39784125 return teb;
......@@ -3980,29 +4127,39 @@ static inline void* zig_x86_64_windows_teb(void) {
39804127
39814128#endif
39824129
3983#if (_MSC_VER && (_M_IX86 || _M_X64)) || defined(__i386__) || defined(__x86_64__)
4130#if defined(zig_x86)
39844131
39854132static inline void zig_x86_cpuid(uint32_t leaf_id, uint32_t subid, uint32_t* eax, uint32_t* ebx, uint32_t* ecx, uint32_t* edx) {
3986#if _MSC_VER
4133#if defined(zig_msvc)
39874134 int cpu_info[4];
39884135 __cpuidex(cpu_info, leaf_id, subid);
39894136 *eax = (uint32_t)cpu_info[0];
39904137 *ebx = (uint32_t)cpu_info[1];
39914138 *ecx = (uint32_t)cpu_info[2];
39924139 *edx = (uint32_t)cpu_info[3];
4140#elif defined(zig_gnuc_asm)
4141 __asm__("cpuid" : "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx) : "a"(leaf_id), "c"(subid));
39934142#else
3994 __cpuid_count(leaf_id, subid, *eax, *ebx, *ecx, *edx);
4143 *eax = 0;
4144 *ebx = 0;
4145 *ecx = 0;
4146 *edx = 0;
39954147#endif
39964148}
39974149
39984150static inline uint32_t zig_x86_get_xcr0(void) {
3999#if _MSC_VER
4151#if defined(zig_msvc)
40004152 return (uint32_t)_xgetbv(0);
4001#else
4153#elif defined(zig_gnuc_asm)
40024154 uint32_t eax;
40034155 uint32_t edx;
40044156 __asm__("xgetbv" : "=a"(eax), "=d"(edx) : "c"(0));
40054157 return eax;
4158#else
4159 *eax = 0;
4160 *ebx = 0;
4161 *ecx = 0;
4162 *edx = 0;
40064163#endif
40074164}
40084165