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 @@...@@ -1,33 +1,143 @@
1#undef linux1#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>
8#include <stdarg.h>3#include <stdarg.h>
9#include <stddef.h>4#include <stddef.h>
10#include <stdint.h>
115
12#if _MSC_VER6#if defined(_MSC_VER)
13#include <intrin.h>7#define zig_msvc
14#elif defined(__i386__) || defined(__x86_64__)8#elif defined(__clang__)
15#include <cpuid.h>9#define zig_clang
16#endif10#define zig_gnuc
1711#elif defined(__GNUC__)
18#if !defined(__cplusplus) && __STDC_VERSION__ <= 201710L12#define zig_gnuc
19#if __STDC_VERSION__ >= 199901L13#elif defined(__IBMC__)
20#include <stdbool.h>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
21#else79#else
22typedef char bool;80#define zig_little_endian 0
23#define false 081#define zig_big_endian 1
24#define true 1
25#endif82#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
26#endif130#endif
27131
28#define zig_concat(lhs, rhs) lhs##rhs132#define zig_concat(lhs, rhs) lhs##rhs
29#define zig_expand_concat(lhs, rhs) zig_concat(lhs, rhs)133#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
31#if defined(__has_builtin)141#if defined(__has_builtin)
32#define zig_has_builtin(builtin) __has_builtin(__builtin_##builtin)142#define zig_has_builtin(builtin) __has_builtin(__builtin_##builtin)
33#else143#else
...@@ -41,37 +151,19 @@ typedef char bool;...@@ -41,37 +151,19 @@ typedef char bool;
41#define zig_has_attribute(attribute) 0151#define zig_has_attribute(attribute) 0
42#endif152#endif
43153
44#if __LITTLE_ENDIAN__ || _MSC_VER154#if __STDC_VERSION__ >= 202311L
45#define zig_little_endian 1155#define zig_threadlocal thread_local
46#define zig_big_endian 0156#elif __STDC_VERSION__ >= 201112L
47#else
48#define zig_little_endian 0
49#define zig_big_endian 1
50#endif
51
52#if __STDC_VERSION__ >= 201112L
53#define zig_threadlocal _Thread_local157#define zig_threadlocal _Thread_local
54#elif defined(__GNUC__)158#elif defined(zig_gnuc) || defined(zig_slimcc)
55#define zig_threadlocal __thread159#define zig_threadlocal __thread
56#elif _MSC_VER160#elif defined(zig_msvc)
57#define zig_threadlocal __declspec(thread)161#define zig_threadlocal __declspec(thread)
58#else162#else
59#define zig_threadlocal zig_threadlocal_unavailable163#define zig_threadlocal zig_threadlocal_unavailable
60#endif164#endif
61165
62#if defined(__clang__)166#if defined(zig_msvc)
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
75#define zig_const_arr167#define zig_const_arr
76#define zig_callconv(c) __##c168#define zig_callconv(c) __##c
77#else169#else
...@@ -82,7 +174,7 @@ typedef char bool;...@@ -82,7 +174,7 @@ typedef char bool;
82#if zig_has_attribute(naked) || defined(zig_gnuc)174#if zig_has_attribute(naked) || defined(zig_gnuc)
83#define zig_naked_decl __attribute__((naked))175#define zig_naked_decl __attribute__((naked))
84#define zig_naked __attribute__((naked))176#define zig_naked __attribute__((naked))
85#elif defined(_MSC_VER)177#elif defined(zig_msvc)
86#define zig_naked_decl178#define zig_naked_decl
87#define zig_naked __declspec(naked)179#define zig_naked __declspec(naked)
88#else180#else
...@@ -104,7 +196,7 @@ typedef char bool;...@@ -104,7 +196,7 @@ typedef char bool;
104196
105#if zig_has_attribute(noinline)197#if zig_has_attribute(noinline)
106#define zig_never_inline __attribute__((noinline)) zig_maybe_flatten198#define zig_never_inline __attribute__((noinline)) zig_maybe_flatten
107#elif defined(_MSC_VER)199#elif defined(zig_msvc)
108#define zig_never_inline __declspec(noinline) zig_maybe_flatten200#define zig_never_inline __declspec(noinline) zig_maybe_flatten
109#else201#else
110#define zig_never_inline zig_never_inline_unavailable202#define zig_never_inline zig_never_inline_unavailable
...@@ -124,46 +216,48 @@ typedef char bool;...@@ -124,46 +216,48 @@ typedef char bool;
124216
125#if __STDC_VERSION__ >= 199901L217#if __STDC_VERSION__ >= 199901L
126#define zig_restrict restrict218#define zig_restrict restrict
127#elif defined(__GNUC__)219#elif defined(zig_gnuc) || defined(zig_tinyc)
128#define zig_restrict __restrict220#define zig_restrict __restrict
129#else221#else
130#define zig_restrict222#define zig_restrict
131#endif223#endif
132224
133#if zig_has_attribute(aligned)225#if zig_has_attribute(aligned) || defined(zig_tinyc)
134#define zig_under_align(alignment) __attribute__((aligned(alignment)))226#define zig_under_align(alignment) __attribute__((aligned(alignment)))
135#elif _MSC_VER227#elif defined(zig_msvc)
136#define zig_under_align(alignment) __declspec(align(alignment))228#define zig_under_align(alignment) __declspec(align(alignment))
137#else229#else
138#define zig_under_align zig_align_unavailable230#define zig_under_align zig_align_unavailable
139#endif231#endif
140232
141#if __STDC_VERSION__ >= 201112L233#if __STDC_VERSION__ >= 202311L
234#define zig_align(alignment) alignas(alignment)
235#elif __STDC_VERSION__ >= 201112L
142#define zig_align(alignment) _Alignas(alignment)236#define zig_align(alignment) _Alignas(alignment)
143#else237#else
144#define zig_align(alignment) zig_under_align(alignment)238#define zig_align(alignment) zig_under_align(alignment)
145#endif239#endif
146240
147#if zig_has_attribute(aligned)241#if zig_has_attribute(aligned) || defined(zig_tinyc)
148#define zig_align_fn(alignment) __attribute__((aligned(alignment)))242#define zig_align_fn(alignment) __attribute__((aligned(alignment)))
149#elif _MSC_VER243#elif defined(zig_msvc)
150#define zig_align_fn(alignment)244#define zig_align_fn(alignment)
151#else245#else
152#define zig_align_fn zig_align_fn_unavailable246#define zig_align_fn zig_align_fn_unavailable
153#endif247#endif
154248
155#if zig_has_attribute(packed)249#if zig_has_attribute(packed) || defined(zig_tinyc)
156#define zig_packed(definition) __attribute__((packed)) definition250#define zig_packed(definition) __attribute__((packed)) definition
157#elif _MSC_VER251#elif defined(zig_msvc)
158#define zig_packed(definition) __pragma(pack(1)) definition __pragma(pack())252#define zig_packed(definition) __pragma(pack(1)) definition __pragma(pack())
159#else253#else
160#define zig_packed(definition) zig_packed_unavailable254#define zig_packed(definition) zig_packed_unavailable
161#endif255#endif
162256
163#if zig_has_attribute(section)257#if zig_has_attribute(section) || defined(zig_tinyc)
164#define zig_linksection(name) __attribute__((section(name)))258#define zig_linksection(name) __attribute__((section(name)))
165#define zig_linksection_fn zig_linksection259#define zig_linksection_fn zig_linksection
166#elif _MSC_VER260#elif defined(zig_msvc)
167#define zig_linksection(name) __pragma(section(name, read, write)) __declspec(allocate(name))261#define zig_linksection(name) __pragma(section(name, read, write)) __declspec(allocate(name))
168#define zig_linksection_fn(name) __pragma(section(name, read, execute)) __declspec(code_seg(name))262#define zig_linksection_fn(name) __pragma(section(name, read, execute)) __declspec(code_seg(name))
169#else263#else
...@@ -171,8 +265,10 @@ typedef char bool;...@@ -171,8 +265,10 @@ typedef char bool;
171#define zig_linksection_fn zig_linksection265#define zig_linksection_fn zig_linksection
172#endif266#endif
173267
174#if zig_has_builtin(unreachable) || defined(zig_gnuc)268#if zig_has_builtin(unreachable) || defined(zig_gnuc) || defined(zig_tinyc)
175#define zig_unreachable() __builtin_unreachable()269#define zig_unreachable() __builtin_unreachable()
270#elif defined(zig_msvc)
271#define zig_unreachable() __assume(0)
176#else272#else
177#define zig_unreachable()273#define zig_unreachable()
178#endif274#endif
...@@ -183,23 +279,23 @@ typedef char bool;...@@ -183,23 +279,23 @@ typedef char bool;
183#define zig_extern extern279#define zig_extern extern
184#endif280#endif
185281
186#if _MSC_VER282#if defined(zig_msvc)
187#if _M_X64283#if defined(zig_x86_64)
188#define zig_mangle_c(symbol) symbol284#define zig_mangle_c(symbol) symbol
189#else /*_M_X64 */285#else /* zig_x86_64 */
190#define zig_mangle_c(symbol) "_" symbol286#define zig_mangle_c(symbol) "_" symbol
191#endif /*_M_X64 */287#endif /* zig_x86_64 */
192#else /* _MSC_VER */288#else /* zig_msvc */
193#if __APPLE__289#if defined(zig_macho)
194#define zig_mangle_c(symbol) "_" symbol290#define zig_mangle_c(symbol) "_" symbol
195#else /* __APPLE__ */291#else /* zig_macho */
196#define zig_mangle_c(symbol) symbol292#define zig_mangle_c(symbol) symbol
197#endif /* __APPLE__ */293#endif /* zig_macho */
198#endif /* _MSC_VER */294#endif /* zig_msvc */
199295
200#if zig_has_attribute(alias) && !__APPLE__296#if (zig_has_attribute(alias) || defined(zig_tinyc)) && !defined(zig_macho)
201#define zig_export(symbol, name) __attribute__((alias(symbol)))297#define zig_export(symbol, name) __attribute__((alias(symbol)))
202#elif _MSC_VER298#elif defined(zig_msvc)
203#define zig_export(symbol, name) ; \299#define zig_export(symbol, name) ; \
204 __pragma(comment(linker, "/alternatename:" zig_mangle_c(name) "=" zig_mangle_c(symbol)))300 __pragma(comment(linker, "/alternatename:" zig_mangle_c(name) "=" zig_mangle_c(symbol)))
205#else301#else
...@@ -209,24 +305,24 @@ typedef char bool;...@@ -209,24 +305,24 @@ typedef char bool;
209305
210#define zig_mangled_tentative zig_mangled306#define zig_mangled_tentative zig_mangled
211#define zig_mangled_final zig_mangled307#define zig_mangled_final zig_mangled
212#if _MSC_VER308#if defined(zig_msvc)
213#define zig_mangled(mangled, unmangled) ; \309#define zig_mangled(mangled, unmangled) ; \
214 zig_export(#mangled, unmangled)310 zig_export(#mangled, unmangled)
215#define zig_mangled_export(mangled, unmangled, symbol) \311#define zig_mangled_export(mangled, unmangled, symbol) \
216 zig_export(unmangled, #mangled) \312 zig_export(unmangled, #mangled) \
217 zig_export(symbol, unmangled)313 zig_export(symbol, unmangled)
218#else /* _MSC_VER */314#else /* zig_msvc */
219#define zig_mangled(mangled, unmangled) __asm(zig_mangle_c(unmangled))315#define zig_mangled(mangled, unmangled) __asm(zig_mangle_c(unmangled))
220#define zig_mangled_export(mangled, unmangled, symbol) \316#define zig_mangled_export(mangled, unmangled, symbol) \
221 zig_mangled_final(mangled, unmangled) \317 zig_mangled_final(mangled, unmangled) \
222 zig_export(symbol, unmangled)318 zig_export(symbol, unmangled)
223#endif /* _MSC_VER */319#endif /* zig_msvc */
224320
225#if _MSC_VER321#if defined(zig_msvc)
226#define zig_import(Type, fn_name, libc_name, sig_args, call_args) zig_extern Type fn_name sig_args;\322#define zig_import(Type, fn_name, libc_name, sig_args, call_args) zig_extern Type fn_name sig_args;\
227 __pragma(comment(linker, "/alternatename:" zig_mangle_c(#fn_name) "=" zig_mangle_c(#libc_name)));323 __pragma(comment(linker, "/alternatename:" zig_mangle_c(#fn_name) "=" zig_mangle_c(#libc_name)));
228#define zig_import_builtin(Type, fn_name, libc_name, sig_args, call_args) zig_import(Type, fn_name, sig_args, call_args)324#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 */
230#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));326#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));
231#define zig_import_builtin(Type, fn_name, libc_name, sig_args, call_args) zig_extern Type libc_name sig_args; \327#define zig_import_builtin(Type, fn_name, libc_name, sig_args, call_args) zig_extern Type libc_name sig_args; \
232 static inline Type fn_name sig_args { return libc_name call_args; }328 static inline Type fn_name sig_args { return libc_name call_args; }
...@@ -235,10 +331,10 @@ typedef char bool;...@@ -235,10 +331,10 @@ typedef char bool;
235#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)331#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)
236#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)332#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)
239#define zig_weak_linkage __attribute__((weak))335#define zig_weak_linkage __attribute__((weak))
240#define zig_weak_linkage_fn __attribute__((weak))336#define zig_weak_linkage_fn __attribute__((weak))
241#elif _MSC_VER337#elif defined(zig_msvc)
242#define zig_weak_linkage __declspec(selectany)338#define zig_weak_linkage __declspec(selectany)
243#define zig_weak_linkage_fn339#define zig_weak_linkage_fn
244#else340#else
...@@ -246,72 +342,94 @@ typedef char bool;...@@ -246,72 +342,94 @@ typedef char bool;
246#define zig_weak_linkage_fn zig_weak_linkage_unavailable342#define zig_weak_linkage_fn zig_weak_linkage_unavailable
247#endif343#endif
248344
345#if defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc)
346#define zig_gnuc_asm
347#endif
348
249#if zig_has_builtin(trap)349#if zig_has_builtin(trap)
250#define zig_trap() __builtin_trap()350#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)
252#define zig_trap() __ud2()354#define zig_trap() __ud2()
253#elif defined(_MSC_VER)355#else
254#define zig_trap() __fastfail(7)356#define zig_trap() __fastfail(7)
255#elif defined(__thumb__)357#endif
358
359#elif defined(zig_gnuc_asm)
360
361#if defined(zig_thumb)
256#define zig_trap() __asm__ volatile("udf #0xfe")362#define zig_trap() __asm__ volatile("udf #0xfe")
257#elif defined(__arm__) || defined(__aarch64__)363#elif defined(zig_arm) || defined(zig_aarch64)
258#define zig_trap() __asm__ volatile("udf #0xfdee")364#define zig_trap() __asm__ volatile("udf #0xfdee")
259#elif defined(__hexagon__)365#elif defined(zig_hexagon)
260#define zig_trap() __asm__ volatile("r27:26 = memd(#0xbadc0fee)")366#define zig_trap() __asm__ volatile("r27:26 = memd(#0xbadc0fee)")
261#elif defined(__loongarch__) || defined(__powerpc__)367#elif defined(zig_loongarch) || defined(zig_powerpc)
262#define zig_trap() __asm__ volatile(".word 0x0")368#define zig_trap() __asm__ volatile(".word 0x0")
263#elif defined(__mips__)369#elif defined(zig_mips)
264#define zig_trap() __asm__ volatile(".word 0x3d")370#define zig_trap() __asm__ volatile(".word 0x3d")
265#elif defined(__riscv)371#elif defined(zig_riscv)
266#define zig_trap() __asm__ volatile("unimp")372#define zig_trap() __asm__ volatile("unimp")
267#elif defined(__s390__)373#elif defined(zig_s390x)
268#define zig_trap() __asm__ volatile("j 0x2")374#define zig_trap() __asm__ volatile("j 0x2")
269#elif defined(__sparc__)375#elif defined(zig_sparc)
270#define zig_trap() __asm__ volatile("illtrap")376#define zig_trap() __asm__ volatile("illtrap")
271#elif defined(__i386__) || defined(__x86_64__)377#elif defined(zig_x86)
272#define zig_trap() __asm__ volatile("ud2")378#define zig_trap() __asm__ volatile("ud2")
273#else379#else
274#define zig_trap() zig_trap_unavailable380#define zig_trap() zig_trap_unavailable
275#endif381#endif
276382
383#else
384#define zig_trap() zig_trap_unavailable
385#endif
386
277#if zig_has_builtin(debugtrap)387#if zig_has_builtin(debugtrap)
278#define zig_breakpoint() __builtin_debugtrap()388#define zig_breakpoint() __builtin_debugtrap()
279#elif defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__)389#elif defined(zig_msvc)
280#define zig_breakpoint() __debugbreak()390#define zig_breakpoint() __debugbreak()
281#elif defined(__arm__)391#elif defined(zig_gnuc_asm)
392
393#if defined(zig_arm)
282#define zig_breakpoint() __asm__ volatile("bkpt #0x0")394#define zig_breakpoint() __asm__ volatile("bkpt #0x0")
283#elif defined(__aarch64__)395#elif defined(zig_aarch64)
284#define zig_breakpoint() __asm__ volatile("brk #0xf000")396#define zig_breakpoint() __asm__ volatile("brk #0xf000")
285#elif defined(__hexagon__)397#elif defined(zig_hexagon)
286#define zig_breakpoint() __asm__ volatile("brkpt")398#define zig_breakpoint() __asm__ volatile("brkpt")
287#elif defined(__loongarch__)399#elif defined(zig_loongarch)
288#define zig_breakpoint() __asm__ volatile("break 0x0")400#define zig_breakpoint() __asm__ volatile("break 0x0")
289#elif defined(__mips__)401#elif defined(zig_mips)
290#define zig_breakpoint() __asm__ volatile("break")402#define zig_breakpoint() __asm__ volatile("break")
291#elif defined(__powerpc__)403#elif defined(zig_powerpc)
292#define zig_breakpoint() __asm__ volatile("trap")404#define zig_breakpoint() __asm__ volatile("trap")
293#elif defined(__riscv)405#elif defined(zig_riscv)
294#define zig_breakpoint() __asm__ volatile("ebreak")406#define zig_breakpoint() __asm__ volatile("ebreak")
295#elif defined(__s390__)407#elif defined(zig_s390x)
296#define zig_breakpoint() __asm__ volatile("j 0x6")408#define zig_breakpoint() __asm__ volatile("j 0x6")
297#elif defined(__sparc__)409#elif defined(zig_sparc)
298#define zig_breakpoint() __asm__ volatile("ta 0x1")410#define zig_breakpoint() __asm__ volatile("ta 0x1")
299#elif defined(__i386__) || defined(__x86_64__)411#elif defined(zig_x86)
300#define zig_breakpoint() __asm__ volatile("int $0x3")412#define zig_breakpoint() __asm__ volatile("int $0x3")
301#else413#else
302#define zig_breakpoint() zig_breakpoint_unavailable414#define zig_breakpoint() zig_breakpoint_unavailable
303#endif415#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)
306#define zig_return_address() __builtin_extract_return_addr(__builtin_return_address(0))422#define zig_return_address() __builtin_extract_return_addr(__builtin_return_address(0))
307#elif defined(_MSC_VER)423#elif defined(zig_msvc)
308#define zig_return_address() _ReturnAddress()424#define zig_return_address() _ReturnAddress()
309#else425#else
310#define zig_return_address() 0426#define zig_return_address() 0
311#endif427#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)
314#define zig_frame_address() __builtin_frame_address(0)430#define zig_frame_address() __builtin_frame_address(0)
431#elif defined(zig_msvc)
432#define zig_frame_address() _AddressOfReturnAddress()
315#else433#else
316#define zig_frame_address() 0434#define zig_frame_address() 0
317#endif435#endif
...@@ -330,18 +448,18 @@ typedef char bool;...@@ -330,18 +448,18 @@ typedef char bool;
330#define zig_wasm_memory_grow(index, delta) zig_unimplemented()448#define zig_wasm_memory_grow(index, delta) zig_unimplemented()
331#endif449#endif
332450
333#if __STDC_VERSION__ >= 201112L451#if __STDC_VERSION__ >= 202311L
452#define zig_noreturn [[noreturn]]
453#elif __STDC_VERSION__ >= 201112L
334#define zig_noreturn _Noreturn454#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)
336#define zig_noreturn __attribute__((noreturn))456#define zig_noreturn __attribute__((noreturn))
337#elif _MSC_VER457#elif defined(zig_msvc)
338#define zig_noreturn __declspec(noreturn)458#define zig_noreturn __declspec(noreturn)
339#else459#else
340#define zig_noreturn460#define zig_noreturn
341#endif461#endif
342462
343#define zig_bitSizeOf(T) (CHAR_BIT * sizeof(T))
344
345#define zig_compiler_rt_abbrev_uint32_t si463#define zig_compiler_rt_abbrev_uint32_t si
346#define zig_compiler_rt_abbrev_int32_t si464#define zig_compiler_rt_abbrev_int32_t si
347#define zig_compiler_rt_abbrev_uint64_t di465#define zig_compiler_rt_abbrev_uint64_t di
...@@ -357,12 +475,25 @@ typedef char bool;...@@ -357,12 +475,25 @@ typedef char bool;
357zig_extern void *memcpy (void *zig_restrict, void const *zig_restrict, size_t);475zig_extern void *memcpy (void *zig_restrict, void const *zig_restrict, size_t);
358zig_extern void *memset (void *, int, size_t);476zig_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_VER480#include <limits.h>
363#include <stdint.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>
364#else488#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
366#if SCHAR_MIN == ~0x7F && SCHAR_MAX == 0x7F && UCHAR_MAX == 0xFF497#if SCHAR_MIN == ~0x7F && SCHAR_MAX == 0x7F && UCHAR_MAX == 0xFF
367typedef unsigned char uint8_t;498typedef unsigned char uint8_t;
368typedef signed char int8_t;499typedef signed char int8_t;
...@@ -1136,7 +1267,7 @@ static inline int64_t zig_bit_reverse_i64(int64_t val, uint8_t bits) {...@@ -1136,7 +1267,7 @@ static inline int64_t zig_bit_reverse_i64(int64_t val, uint8_t bits) {
1136 static inline uint8_t zig_popcount_i##w(int##w##_t val, uint8_t bits) { \1267 static inline uint8_t zig_popcount_i##w(int##w##_t val, uint8_t bits) { \
1137 return zig_popcount_u##w((uint##w##_t)val, bits); \1268 return zig_popcount_u##w((uint##w##_t)val, bits); \
1138 }1269 }
1139#if zig_has_builtin(popcount) || defined(zig_gnuc)1270#if zig_has_builtin(popcount) || defined(zig_gnuc) || defined(zig_tinyc)
1140#define zig_builtin_popcount(w) \1271#define zig_builtin_popcount(w) \
1141 static inline uint8_t zig_popcount_u##w(uint##w##_t val, uint8_t bits) { \1272 static inline uint8_t zig_popcount_u##w(uint##w##_t val, uint8_t bits) { \
1142 (void)bits; \1273 (void)bits; \
...@@ -1165,7 +1296,7 @@ zig_builtin_popcount(64)...@@ -1165,7 +1296,7 @@ zig_builtin_popcount(64)
1165 static inline uint8_t zig_ctz_i##w(int##w##_t val, uint8_t bits) { \1296 static inline uint8_t zig_ctz_i##w(int##w##_t val, uint8_t bits) { \
1166 return zig_ctz_u##w((uint##w##_t)val, bits); \1297 return zig_ctz_u##w((uint##w##_t)val, bits); \
1167 }1298 }
1168#if zig_has_builtin(ctz) || defined(zig_gnuc)1299#if zig_has_builtin(ctz) || defined(zig_gnuc) || defined(zig_tinyc)
1169#define zig_builtin_ctz(w) \1300#define zig_builtin_ctz(w) \
1170 static inline uint8_t zig_ctz_u##w(uint##w##_t val, uint8_t bits) { \1301 static inline uint8_t zig_ctz_u##w(uint##w##_t val, uint8_t bits) { \
1171 if (val == 0) return bits; \1302 if (val == 0) return bits; \
...@@ -1190,7 +1321,7 @@ zig_builtin_ctz(64)...@@ -1190,7 +1321,7 @@ zig_builtin_ctz(64)
1190 static inline uint8_t zig_clz_i##w(int##w##_t val, uint8_t bits) { \1321 static inline uint8_t zig_clz_i##w(int##w##_t val, uint8_t bits) { \
1191 return zig_clz_u##w((uint##w##_t)val, bits); \1322 return zig_clz_u##w((uint##w##_t)val, bits); \
1192 }1323 }
1193#if zig_has_builtin(clz) || defined(zig_gnuc)1324#if zig_has_builtin(clz) || defined(zig_gnuc) || defined(zig_tinyc)
1194#define zig_builtin_clz(w) \1325#define zig_builtin_clz(w) \
1195 static inline uint8_t zig_clz_u##w(uint##w##_t val, uint8_t bits) { \1326 static inline uint8_t zig_clz_u##w(uint##w##_t val, uint8_t bits) { \
1196 if (val == 0) return bits; \1327 if (val == 0) return bits; \
...@@ -1258,7 +1389,7 @@ typedef struct { zig_align(16) int64_t hi; uint64_t lo; } zig_i128;...@@ -1258,7 +1389,7 @@ typedef struct { zig_align(16) int64_t hi; uint64_t lo; } zig_i128;
1258#define zig_make_u128(hi, lo) ((zig_u128){ .h##i = (hi), .l##o = (lo) })1389#define zig_make_u128(hi, lo) ((zig_u128){ .h##i = (hi), .l##o = (lo) })
1259#define zig_make_i128(hi, lo) ((zig_i128){ .h##i = (hi), .l##o = (lo) })1390#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 */
1262#define zig_init_u128(hi, lo) { .h##i = (hi), .l##o = (lo) }1393#define zig_init_u128(hi, lo) { .h##i = (hi), .l##o = (lo) }
1263#define zig_init_i128(hi, lo) { .h##i = (hi), .l##o = (lo) }1394#define zig_init_i128(hi, lo) { .h##i = (hi), .l##o = (lo) }
1264#else /* But non-MSVC doesn't like the unprotected commas */1395#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_...@@ -3020,7 +3151,13 @@ static inline uint16_t zig_popcount_big(const void *val, bool is_signed, uint16_
30203151
3021/* ========================= Floating Point Support ========================= */3152/* ========================= Floating Point Support ========================= */
30223153
3023#if _MSC_VER3154#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)
3024float __cdecl nanf(char const* input);3161float __cdecl nanf(char const* input);
3025double __cdecl nan(char const* input);3162double __cdecl nan(char const* input);
3026long double __cdecl nanl(char const* input);3163long double __cdecl nanl(char const* input);
...@@ -3082,7 +3219,7 @@ typedef uint16_t zig_f16;...@@ -3082,7 +3219,7 @@ typedef uint16_t zig_f16;
3082#undef zig_init_special_f163219#undef zig_init_special_f16
3083#define zig_init_special_f16(sign, name, arg, repr) repr3220#define zig_init_special_f16(sign, name, arg, repr) repr
3084#endif3221#endif
3085#if __APPLE__ && (defined(__i386__) || defined(__x86_64__))3222#if defined(zig_darwin) && defined(zig_x86)
3086typedef uint16_t zig_compiler_rt_f16;3223typedef uint16_t zig_compiler_rt_f16;
3087#else3224#else
3088typedef zig_f16 zig_compiler_rt_f16;3225typedef zig_f16 zig_compiler_rt_f16;
...@@ -3090,7 +3227,7 @@ typedef zig_f16 zig_compiler_rt_f16;...@@ -3090,7 +3227,7 @@ typedef zig_f16 zig_compiler_rt_f16;
30903227
3091#define zig_has_f32 13228#define zig_has_f32 1
3092#define zig_libc_name_f32(name) name##f3229#define zig_libc_name_f32(name) name##f
3093#if _MSC_VER3230#if defined(zig_msvc)
3094#define zig_init_special_f32(sign, name, arg, repr) sign zig_make_f32(zig_msvc_flt_##name, )3231#define zig_init_special_f32(sign, name, arg, repr) sign zig_make_f32(zig_msvc_flt_##name, )
3095#else3232#else
3096#define zig_init_special_f32(sign, name, arg, repr) zig_make_special_f32(sign, name, arg, repr)3233#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;...@@ -3122,7 +3259,7 @@ typedef uint32_t zig_f32;
3122#define zig_has_f64 13259#define zig_has_f64 1
3123#define zig_libc_name_f64(name) name3260#define zig_libc_name_f64(name) name
31243261
3125#if _MSC_VER3262#if defined(zig_msvc)
3126#define zig_init_special_f64(sign, name, arg, repr) sign zig_make_f64(zig_msvc_flt_##name, )3263#define zig_init_special_f64(sign, name, arg, repr) sign zig_make_f64(zig_msvc_flt_##name, )
3127#else3264#else
3128#define zig_init_special_f64(sign, name, arg, repr) zig_make_special_f64(sign, name, arg, repr)3265#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;...@@ -3187,6 +3324,12 @@ typedef zig_u128 zig_f80;
3187#define zig_init_special_f80(sign, name, arg, repr) repr3324#define zig_init_special_f80(sign, name, arg, repr) repr
3188#endif3325#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
3190#define zig_has_f128 13333#define zig_has_f128 1
3191#define zig_libc_name_f128(name) name##q3334#define zig_libc_name_f128(name) name##q
3192#define zig_init_special_f128(sign, name, arg, repr) zig_make_special_f128(sign, name, arg, repr)3335#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;...@@ -3215,7 +3358,7 @@ typedef __float128 zig_f128;
3215#define zig_has_f128 03358#define zig_has_f128 0
3216#undef zig_make_special_f1283359#undef zig_make_special_f128
3217#undef zig_init_special_f1283360#undef zig_init_special_f128
3218#if __APPLE__ || defined(__aarch64__)3361#if defined(zig_darwin) || defined(zig_aarch64)
3219typedef __attribute__((__vector_size__(2 * sizeof(uint64_t)))) uint64_t zig_v2u64;3362typedef __attribute__((__vector_size__(2 * sizeof(uint64_t)))) uint64_t zig_v2u64;
3220zig_basic_operator(zig_v2u64, xor_v2u64, ^)3363zig_basic_operator(zig_v2u64, xor_v2u64, ^)
3221#define zig_repr_f128 v2u643364#define zig_repr_f128 v2u64
...@@ -3234,10 +3377,10 @@ typedef zig_u128 zig_f128;...@@ -3234,10 +3377,10 @@ typedef zig_u128 zig_f128;
3234#endif3377#endif
3235#endif3378#endif
32363379
3237#if !_MSC_VER && defined(ZIG_TARGET_ABI_MSVC)3380#if !defined(zig_msvc) && defined(ZIG_TARGET_ABI_MSVC)
3238/* Emulate msvc abi on a gnu compiler */3381/* Emulate msvc abi on a gnu compiler */
3239typedef zig_f64 zig_c_longdouble;3382typedef zig_f64 zig_c_longdouble;
3240#elif _MSC_VER && !defined(ZIG_TARGET_ABI_MSVC)3383#elif defined(zig_msvc) && !defined(ZIG_TARGET_ABI_MSVC)
3241/* Emulate gnu abi on an msvc compiler */3384/* Emulate gnu abi on an msvc compiler */
3242typedef zig_f128 zig_c_longdouble;3385typedef zig_f128 zig_c_longdouble;
3243#else3386#else
...@@ -3586,7 +3729,7 @@ zig_float_builtins(64)...@@ -3586,7 +3729,7 @@ zig_float_builtins(64)
3586 res = zig_atomicrmw_expected; \3729 res = zig_atomicrmw_expected; \
3587} while (0)3730} 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__)
3590#include <stdatomic.h>3733#include <stdatomic.h>
3591typedef enum memory_order zig_memory_order;3734typedef enum memory_order zig_memory_order;
3592#define zig_memory_order_relaxed memory_order_relaxed3735#define zig_memory_order_relaxed memory_order_relaxed
...@@ -3614,7 +3757,7 @@ typedef enum memory_order zig_memory_order;...@@ -3614,7 +3757,7 @@ typedef enum memory_order zig_memory_order;
3614#define zig_atomicrmw_add_float zig_atomicrmw_add3757#define zig_atomicrmw_add_float zig_atomicrmw_add
3615#undef zig_atomicrmw_sub_float3758#undef zig_atomicrmw_sub_float
3616#define zig_atomicrmw_sub_float zig_atomicrmw_sub3759#define zig_atomicrmw_sub_float zig_atomicrmw_sub
3617#elif defined(__GNUC__)3760#elif defined(zig_gnuc)
3618typedef int zig_memory_order;3761typedef int zig_memory_order;
3619#define zig_memory_order_relaxed __ATOMIC_RELAXED3762#define zig_memory_order_relaxed __ATOMIC_RELAXED
3620#define zig_memory_order_acquire __ATOMIC_ACQUIRE3763#define zig_memory_order_acquire __ATOMIC_ACQUIRE
...@@ -3637,7 +3780,7 @@ typedef int zig_memory_order;...@@ -3637,7 +3780,7 @@ typedef int zig_memory_order;
3637#define zig_atomic_load(res, obj, order, Type, ReprType) __atomic_load (obj, &(res), order)3780#define zig_atomic_load(res, obj, order, Type, ReprType) __atomic_load (obj, &(res), order)
3638#undef zig_atomicrmw_xchg_float3781#undef zig_atomicrmw_xchg_float
3639#define zig_atomicrmw_xchg_float zig_atomicrmw_xchg3782#define zig_atomicrmw_xchg_float zig_atomicrmw_xchg
3640#elif _MSC_VER && (_M_IX86 || _M_X64)3783#elif defined(zig_msvc) && defined(zig_x86)
3641#define zig_memory_order_relaxed 03784#define zig_memory_order_relaxed 0
3642#define zig_memory_order_acquire 23785#define zig_memory_order_acquire 2
3643#define zig_memory_order_release 33786#define zig_memory_order_release 3
...@@ -3657,7 +3800,7 @@ typedef int zig_memory_order;...@@ -3657,7 +3800,7 @@ typedef int zig_memory_order;
3657#define zig_atomicrmw_max(res, obj, arg, order, Type, ReprType) res = zig_msvc_atomicrmw_max_ ##Type(obj, arg)3800#define zig_atomicrmw_max(res, obj, arg, order, Type, ReprType) res = zig_msvc_atomicrmw_max_ ##Type(obj, arg)
3658#define zig_atomic_store( obj, arg, order, Type, ReprType) zig_msvc_atomic_store_ ##Type(obj, arg)3801#define zig_atomic_store( obj, arg, order, Type, ReprType) zig_msvc_atomic_store_ ##Type(obj, arg)
3659#define zig_atomic_load(res, obj, order, Type, ReprType) res = zig_msvc_atomic_load_ ##order##_##Type(obj)3802#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) */
3661#else3804#else
3662#define zig_memory_order_relaxed 03805#define zig_memory_order_relaxed 0
3663#define zig_memory_order_acquire 23806#define zig_memory_order_acquire 2
...@@ -3680,7 +3823,7 @@ typedef int zig_memory_order;...@@ -3680,7 +3823,7 @@ typedef int zig_memory_order;
3680#define zig_atomic_load(res, obj, order, Type, ReprType) zig_atomics_unavailable3823#define zig_atomic_load(res, obj, order, Type, ReprType) zig_atomics_unavailable
3681#endif3824#endif
36823825
3683#if _MSC_VER && (_M_IX86 || _M_X64)3826#if defined(zig_msvc) && defined(zig_x86)
36843827
3685/* TODO: zig_msvc_atomic_load should load 32 bit without interlocked on x86, and load 64 bit without interlocked on x64 */3828/* 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)...@@ -3777,7 +3920,7 @@ zig_msvc_atomics(i16, int16_t, short, 16, 16)
3777zig_msvc_atomics(u32, uint32_t, long, , 32)3920zig_msvc_atomics(u32, uint32_t, long, , 32)
3778zig_msvc_atomics(i32, int32_t, long, , 32)3921zig_msvc_atomics(i32, int32_t, long, , 32)
37793922
3780#if _M_X643923#if defined(zig_x86_64)
3781zig_msvc_atomics(u64, uint64_t, __int64, 64, 64)3924zig_msvc_atomics(u64, uint64_t, __int64, 64, 64)
3782zig_msvc_atomics(i64, int64_t, __int64, 64, 64)3925zig_msvc_atomics(i64, int64_t, __int64, 64, 64)
3783#endif3926#endif
...@@ -3822,11 +3965,11 @@ zig_msvc_atomics(i64, int64_t, __int64, 64, 64)...@@ -3822,11 +3965,11 @@ zig_msvc_atomics(i64, int64_t, __int64, 64, 64)
3822 }3965 }
38233966
3824zig_msvc_flt_atomics(f32, long, , 32)3967zig_msvc_flt_atomics(f32, long, , 32)
3825#if _M_X643968#if defined(zig_x86_64)
3826zig_msvc_flt_atomics(f64, int64_t, 64, 64)3969zig_msvc_flt_atomics(f64, int64_t, 64, 64)
3827#endif3970#endif
38283971
3829#if _M_IX863972#if defined(zig_x86_32)
3830static inline void zig_msvc_atomic_barrier() {3973static inline void zig_msvc_atomic_barrier() {
3831 int32_t barrier;3974 int32_t barrier;
3832 __asm {3975 __asm {
...@@ -3863,7 +4006,7 @@ static inline bool zig_msvc_cmpxchg_p32(void volatile* obj, void* expected, void...@@ -3863,7 +4006,7 @@ static inline bool zig_msvc_cmpxchg_p32(void volatile* obj, void* expected, void
3863 if (!success) *(void**)expected = initial;4006 if (!success) *(void**)expected = initial;
3864 return success;4007 return success;
3865}4008}
3866#else /* _M_IX86 */4009#else /* zig_x86_32 */
3867static inline void* zig_msvc_atomicrmw_xchg_p64(void volatile* obj, void* arg) {4010static inline void* zig_msvc_atomicrmw_xchg_p64(void volatile* obj, void* arg) {
3868 return _InterlockedExchangePointer(obj, arg);4011 return _InterlockedExchangePointer(obj, arg);
3869}4012}
...@@ -3924,55 +4067,59 @@ static inline void zig_msvc_atomic_store_i128(zig_i128 volatile* obj, zig_i128 a...@@ -3924,55 +4067,59 @@ static inline void zig_msvc_atomic_store_i128(zig_i128 volatile* obj, zig_i128 a
3924 while (!zig_cmpxchg_weak(obj, expected, arg, zig_memory_order_seq_cst, zig_memory_order_seq_cst, i128, zig_i128));4067 while (!zig_cmpxchg_weak(obj, expected, arg, zig_memory_order_seq_cst, zig_memory_order_seq_cst, i128, zig_i128));
3925}4068}
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
3931/* ======================== Special Case Intrinsics ========================= */4074/* ======================== 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
3935static inline void* zig_thumb_windows_teb(void) {4082static inline void* zig_thumb_windows_teb(void) {
3936 void* teb = 0;4083 void* teb = 0;
3937#if defined(_MSC_VER)4084#if defined(zig_msvc)
3938 teb = (void*)_MoveFromCoprocessor(15, 0, 13, 0, 2);4085 teb = (void*)_MoveFromCoprocessor(15, 0, 13, 0, 2);
3939#elif defined(__GNUC__)4086#elif defined(zig_gnuc_asm)
3940 __asm__ ("mrc p15, 0, %[ptr], c13, c0, 2" : [ptr] "=r" (teb));4087 __asm__ ("mrc p15, 0, %[ptr], c13, c0, 2" : [ptr] "=r" (teb));
3941#endif4088#endif
3942 return teb;4089 return teb;
3943}4090}
39444091
3945#elif defined(_M_ARM64) || defined(__arch64__)4092#elif defined(zig_aarch64)
39464093
3947static inline void* zig_aarch64_windows_teb(void) {4094static inline void* zig_aarch64_windows_teb(void) {
3948 void* teb = 0;4095 void* teb = 0;
3949#if defined(_MSC_VER)4096#if defined(zig_msvc)
3950 teb = (void*)__readx18qword(0x0);4097 teb = (void*)__readx18qword(0x0);
3951#elif defined(__GNUC__)4098#elif defined(zig_gnuc_asm)
3952 __asm__ ("mov %[ptr], x18" : [ptr] "=r" (teb));4099 __asm__ ("mov %[ptr], x18" : [ptr] "=r" (teb));
3953#endif4100#endif
3954 return teb;4101 return teb;
3955}4102}
39564103
3957#elif defined(_M_IX86) || defined(__i386__)4104#elif defined(zig_x86_32)
39584105
3959static inline void* zig_x86_windows_teb(void) {4106static inline void* zig_x86_windows_teb(void) {
3960 void* teb = 0;4107 void* teb = 0;
3961#if defined(_MSC_VER)4108#if defined(zig_msvc)
3962 teb = (void*)__readfsdword(0x18);4109 teb = (void*)__readfsdword(0x18);
3963#elif defined(__GNUC__)4110#elif defined(zig_gnuc_asm)
3964 __asm__ ("movl %%fs:0x18, %[ptr]" : [ptr] "=r" (teb));4111 __asm__ ("movl %%fs:0x18, %[ptr]" : [ptr] "=r" (teb));
3965#endif4112#endif
3966 return teb;4113 return teb;
3967}4114}
39684115
3969#elif defined(_M_X64) || defined(__x86_64__)4116#elif defined(zig_x86_64)
39704117
3971static inline void* zig_x86_64_windows_teb(void) {4118static inline void* zig_x86_64_windows_teb(void) {
3972 void* teb = 0;4119 void* teb = 0;
3973#if defined(_MSC_VER)4120#if defined(zig_msvc)
3974 teb = (void*)__readgsqword(0x30);4121 teb = (void*)__readgsqword(0x30);
3975#elif defined(__GNUC__)4122#elif defined(zig_gnuc_asm)
3976 __asm__ ("movq %%gs:0x30, %[ptr]" : [ptr] "=r" (teb));4123 __asm__ ("movq %%gs:0x30, %[ptr]" : [ptr] "=r" (teb));
3977#endif4124#endif
3978 return teb;4125 return teb;
...@@ -3980,29 +4127,39 @@ static inline void* zig_x86_64_windows_teb(void) {...@@ -3980,29 +4127,39 @@ static inline void* zig_x86_64_windows_teb(void) {
39804127
3981#endif4128#endif
39824129
3983#if (_MSC_VER && (_M_IX86 || _M_X64)) || defined(__i386__) || defined(__x86_64__)4130#if defined(zig_x86)
39844131
3985static inline void zig_x86_cpuid(uint32_t leaf_id, uint32_t subid, uint32_t* eax, uint32_t* ebx, uint32_t* ecx, uint32_t* edx) {4132static 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_VER4133#if defined(zig_msvc)
3987 int cpu_info[4];4134 int cpu_info[4];
3988 __cpuidex(cpu_info, leaf_id, subid);4135 __cpuidex(cpu_info, leaf_id, subid);
3989 *eax = (uint32_t)cpu_info[0];4136 *eax = (uint32_t)cpu_info[0];
3990 *ebx = (uint32_t)cpu_info[1];4137 *ebx = (uint32_t)cpu_info[1];
3991 *ecx = (uint32_t)cpu_info[2];4138 *ecx = (uint32_t)cpu_info[2];
3992 *edx = (uint32_t)cpu_info[3];4139 *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));
3993#else4142#else
3994 __cpuid_count(leaf_id, subid, *eax, *ebx, *ecx, *edx);4143 *eax = 0;
4144 *ebx = 0;
4145 *ecx = 0;
4146 *edx = 0;
3995#endif4147#endif
3996}4148}
39974149
3998static inline uint32_t zig_x86_get_xcr0(void) {4150static inline uint32_t zig_x86_get_xcr0(void) {
3999#if _MSC_VER4151#if defined(zig_msvc)
4000 return (uint32_t)_xgetbv(0);4152 return (uint32_t)_xgetbv(0);
4001#else4153#elif defined(zig_gnuc_asm)
4002 uint32_t eax;4154 uint32_t eax;
4003 uint32_t edx;4155 uint32_t edx;
4004 __asm__("xgetbv" : "=a"(eax), "=d"(edx) : "c"(0));4156 __asm__("xgetbv" : "=a"(eax), "=d"(edx) : "c"(0));
4005 return eax;4157 return eax;
4158#else
4159 *eax = 0;
4160 *ebx = 0;
4161 *ecx = 0;
4162 *edx = 0;
4006#endif4163#endif
4007}4164}
40084165