authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2025-01-15 17:01:22+00:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2025-01-16 12:49:58+00:00
log0cc9d68b77b31c6502da80ce7e6dabaf9316ca48
tree881c36d16830dd338e14a1e855dd1f9f2d5138c8
parent726c94d5f169d1d9f769f970aa3e53ef03342dc4
signaturelock-open Commit is signed but in an unrecognized format.

stage1: update zig1.wasm

Implementing the changes from the prior commit, to prepare for the following commit. This also means that zig1 now uses the new value interpret mode, so that adding and removing fields from `std.builtin` types is easier. Signed-off-by: mlugg <mlugg@mlugg.co.uk>

2 files changed, 304 insertions(+), 143 deletions(-)

stage1/zig.h+304-143
...@@ -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>
11
12#if _MSC_VER
13#include <intrin.h>
14#elif defined(__i386__) || defined(__x86_64__)
15#include <cpuid.h>
16#endif
175
18#if !defined(__cplusplus) && __STDC_VERSION__ <= 201710L6#if defined(_MSC_VER)
19#if __STDC_VERSION__ >= 199901L7#define zig_msvc
20#include <stdbool.h>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
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,68 +342,94 @@ typedef char bool;...@@ -246,68 +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(__loongarch__) || defined(__powerpc__)365#elif defined(zig_hexagon)
366#define zig_trap() __asm__ volatile("r27:26 = memd(#0xbadc0fee)")
367#elif defined(zig_loongarch) || defined(zig_powerpc)
260#define zig_trap() __asm__ volatile(".word 0x0")368#define zig_trap() __asm__ volatile(".word 0x0")
261#elif defined(__mips__)369#elif defined(zig_mips)
262#define zig_trap() __asm__ volatile(".word 0x3d")370#define zig_trap() __asm__ volatile(".word 0x3d")
263#elif defined(__riscv)371#elif defined(zig_riscv)
264#define zig_trap() __asm__ volatile("unimp")372#define zig_trap() __asm__ volatile("unimp")
265#elif defined(__s390__)373#elif defined(zig_s390x)
266#define zig_trap() __asm__ volatile("j 0x2")374#define zig_trap() __asm__ volatile("j 0x2")
267#elif defined(__sparc__)375#elif defined(zig_sparc)
268#define zig_trap() __asm__ volatile("illtrap")376#define zig_trap() __asm__ volatile("illtrap")
269#elif defined(__i386__) || defined(__x86_64__)377#elif defined(zig_x86)
270#define zig_trap() __asm__ volatile("ud2")378#define zig_trap() __asm__ volatile("ud2")
271#else379#else
272#define zig_trap() zig_trap_unavailable380#define zig_trap() zig_trap_unavailable
273#endif381#endif
274382
383#else
384#define zig_trap() zig_trap_unavailable
385#endif
386
275#if zig_has_builtin(debugtrap)387#if zig_has_builtin(debugtrap)
276#define zig_breakpoint() __builtin_debugtrap()388#define zig_breakpoint() __builtin_debugtrap()
277#elif defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__)389#elif defined(zig_msvc)
278#define zig_breakpoint() __debugbreak()390#define zig_breakpoint() __debugbreak()
279#elif defined(__arm__)391#elif defined(zig_gnuc_asm)
392
393#if defined(zig_arm)
280#define zig_breakpoint() __asm__ volatile("bkpt #0x0")394#define zig_breakpoint() __asm__ volatile("bkpt #0x0")
281#elif defined(__aarch64__)395#elif defined(zig_aarch64)
282#define zig_breakpoint() __asm__ volatile("brk #0xf000")396#define zig_breakpoint() __asm__ volatile("brk #0xf000")
283#elif defined(__loongarch__)397#elif defined(zig_hexagon)
398#define zig_breakpoint() __asm__ volatile("brkpt")
399#elif defined(zig_loongarch)
284#define zig_breakpoint() __asm__ volatile("break 0x0")400#define zig_breakpoint() __asm__ volatile("break 0x0")
285#elif defined(__mips__)401#elif defined(zig_mips)
286#define zig_breakpoint() __asm__ volatile("break")402#define zig_breakpoint() __asm__ volatile("break")
287#elif defined(__powerpc__)403#elif defined(zig_powerpc)
288#define zig_breakpoint() __asm__ volatile("trap")404#define zig_breakpoint() __asm__ volatile("trap")
289#elif defined(__riscv)405#elif defined(zig_riscv)
290#define zig_breakpoint() __asm__ volatile("ebreak")406#define zig_breakpoint() __asm__ volatile("ebreak")
291#elif defined(__s390__)407#elif defined(zig_s390x)
292#define zig_breakpoint() __asm__ volatile("j 0x6")408#define zig_breakpoint() __asm__ volatile("j 0x6")
293#elif defined(__sparc__)409#elif defined(zig_sparc)
294#define zig_breakpoint() __asm__ volatile("ta 0x1")410#define zig_breakpoint() __asm__ volatile("ta 0x1")
295#elif defined(__i386__) || defined(__x86_64__)411#elif defined(zig_x86)
296#define zig_breakpoint() __asm__ volatile("int $0x3")412#define zig_breakpoint() __asm__ volatile("int $0x3")
297#else413#else
298#define zig_breakpoint() zig_breakpoint_unavailable414#define zig_breakpoint() zig_breakpoint_unavailable
299#endif415#endif
300416
301#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)
302#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))
303#elif defined(_MSC_VER)423#elif defined(zig_msvc)
304#define zig_return_address() _ReturnAddress()424#define zig_return_address() _ReturnAddress()
305#else425#else
306#define zig_return_address() 0426#define zig_return_address() 0
307#endif427#endif
308428
309#if zig_has_builtin(frame_address) || defined(zig_gnuc)429#if zig_has_builtin(frame_address) || defined(zig_gnuc) || defined(zig_tinyc)
310#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()
311#else433#else
312#define zig_frame_address() 0434#define zig_frame_address() 0
313#endif435#endif
...@@ -326,18 +448,18 @@ typedef char bool;...@@ -326,18 +448,18 @@ typedef char bool;
326#define zig_wasm_memory_grow(index, delta) zig_unimplemented()448#define zig_wasm_memory_grow(index, delta) zig_unimplemented()
327#endif449#endif
328450
329#if __STDC_VERSION__ >= 201112L451#if __STDC_VERSION__ >= 202311L
452#define zig_noreturn [[noreturn]]
453#elif __STDC_VERSION__ >= 201112L
330#define zig_noreturn _Noreturn454#define zig_noreturn _Noreturn
331#elif zig_has_attribute(noreturn) || defined(zig_gnuc)455#elif zig_has_attribute(noreturn) || defined(zig_gnuc) || defined(zig_tinyc)
332#define zig_noreturn __attribute__((noreturn))456#define zig_noreturn __attribute__((noreturn))
333#elif _MSC_VER457#elif defined(zig_msvc)
334#define zig_noreturn __declspec(noreturn)458#define zig_noreturn __declspec(noreturn)
335#else459#else
336#define zig_noreturn460#define zig_noreturn
337#endif461#endif
338462
339#define zig_bitSizeOf(T) (CHAR_BIT * sizeof(T))
340
341#define zig_compiler_rt_abbrev_uint32_t si463#define zig_compiler_rt_abbrev_uint32_t si
342#define zig_compiler_rt_abbrev_int32_t si464#define zig_compiler_rt_abbrev_int32_t si
343#define zig_compiler_rt_abbrev_uint64_t di465#define zig_compiler_rt_abbrev_uint64_t di
...@@ -353,12 +475,25 @@ typedef char bool;...@@ -353,12 +475,25 @@ typedef char bool;
353zig_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);
354zig_extern void *memset (void *, int, size_t);476zig_extern void *memset (void *, int, size_t);
355477
356/* ===================== 8/16/32/64-bit Integer Support ===================== */478/* ================ Bool and 8/16/32/64-bit Integer Support ================= */
357479
358#if __STDC_VERSION__ >= 199901L || _MSC_VER480#include <limits.h>
359#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>
360#else488#else
489typedef char bool;
490#define false 0
491#define true 1
492#endif
361493
494#if __STDC_VERSION__ >= 199901L || defined(zig_msvc) || zig_has_include(<stdint.h>)
495#include <stdint.h>
496#else
362#if SCHAR_MIN == ~0x7F && SCHAR_MAX == 0x7F && UCHAR_MAX == 0xFF497#if SCHAR_MIN == ~0x7F && SCHAR_MAX == 0x7F && UCHAR_MAX == 0xFF
363typedef unsigned char uint8_t;498typedef unsigned char uint8_t;
364typedef signed char int8_t;499typedef signed char int8_t;
...@@ -1132,7 +1267,7 @@ static inline int64_t zig_bit_reverse_i64(int64_t val, uint8_t bits) {...@@ -1132,7 +1267,7 @@ static inline int64_t zig_bit_reverse_i64(int64_t val, uint8_t bits) {
1132 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) { \
1133 return zig_popcount_u##w((uint##w##_t)val, bits); \1268 return zig_popcount_u##w((uint##w##_t)val, bits); \
1134 }1269 }
1135#if zig_has_builtin(popcount) || defined(zig_gnuc)1270#if zig_has_builtin(popcount) || defined(zig_gnuc) || defined(zig_tinyc)
1136#define zig_builtin_popcount(w) \1271#define zig_builtin_popcount(w) \
1137 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) { \
1138 (void)bits; \1273 (void)bits; \
...@@ -1161,7 +1296,7 @@ zig_builtin_popcount(64)...@@ -1161,7 +1296,7 @@ zig_builtin_popcount(64)
1161 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) { \
1162 return zig_ctz_u##w((uint##w##_t)val, bits); \1297 return zig_ctz_u##w((uint##w##_t)val, bits); \
1163 }1298 }
1164#if zig_has_builtin(ctz) || defined(zig_gnuc)1299#if zig_has_builtin(ctz) || defined(zig_gnuc) || defined(zig_tinyc)
1165#define zig_builtin_ctz(w) \1300#define zig_builtin_ctz(w) \
1166 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) { \
1167 if (val == 0) return bits; \1302 if (val == 0) return bits; \
...@@ -1186,7 +1321,7 @@ zig_builtin_ctz(64)...@@ -1186,7 +1321,7 @@ zig_builtin_ctz(64)
1186 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) { \
1187 return zig_clz_u##w((uint##w##_t)val, bits); \1322 return zig_clz_u##w((uint##w##_t)val, bits); \
1188 }1323 }
1189#if zig_has_builtin(clz) || defined(zig_gnuc)1324#if zig_has_builtin(clz) || defined(zig_gnuc) || defined(zig_tinyc)
1190#define zig_builtin_clz(w) \1325#define zig_builtin_clz(w) \
1191 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) { \
1192 if (val == 0) return bits; \1327 if (val == 0) return bits; \
...@@ -1254,7 +1389,7 @@ typedef struct { zig_align(16) int64_t hi; uint64_t lo; } zig_i128;...@@ -1254,7 +1389,7 @@ typedef struct { zig_align(16) int64_t hi; uint64_t lo; } zig_i128;
1254#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) })
1255#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) })
12561391
1257#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 */
1258#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) }
1259#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) }
1260#else /* But non-MSVC doesn't like the unprotected commas */1395#else /* But non-MSVC doesn't like the unprotected commas */
...@@ -3016,7 +3151,13 @@ static inline uint16_t zig_popcount_big(const void *val, bool is_signed, uint16_...@@ -3016,7 +3151,13 @@ static inline uint16_t zig_popcount_big(const void *val, bool is_signed, uint16_
30163151
3017/* ========================= Floating Point Support ========================= */3152/* ========================= Floating Point Support ========================= */
30183153
3019#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)
3020float __cdecl nanf(char const* input);3161float __cdecl nanf(char const* input);
3021double __cdecl nan(char const* input);3162double __cdecl nan(char const* input);
3022long double __cdecl nanl(char const* input);3163long double __cdecl nanl(char const* input);
...@@ -3078,7 +3219,7 @@ typedef uint16_t zig_f16;...@@ -3078,7 +3219,7 @@ typedef uint16_t zig_f16;
3078#undef zig_init_special_f163219#undef zig_init_special_f16
3079#define zig_init_special_f16(sign, name, arg, repr) repr3220#define zig_init_special_f16(sign, name, arg, repr) repr
3080#endif3221#endif
3081#if __APPLE__ && (defined(__i386__) || defined(__x86_64__))3222#if defined(zig_darwin) && defined(zig_x86)
3082typedef uint16_t zig_compiler_rt_f16;3223typedef uint16_t zig_compiler_rt_f16;
3083#else3224#else
3084typedef zig_f16 zig_compiler_rt_f16;3225typedef zig_f16 zig_compiler_rt_f16;
...@@ -3086,7 +3227,7 @@ typedef zig_f16 zig_compiler_rt_f16;...@@ -3086,7 +3227,7 @@ typedef zig_f16 zig_compiler_rt_f16;
30863227
3087#define zig_has_f32 13228#define zig_has_f32 1
3088#define zig_libc_name_f32(name) name##f3229#define zig_libc_name_f32(name) name##f
3089#if _MSC_VER3230#if defined(zig_msvc)
3090#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, )
3091#else3232#else
3092#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)
...@@ -3118,7 +3259,7 @@ typedef uint32_t zig_f32;...@@ -3118,7 +3259,7 @@ typedef uint32_t zig_f32;
3118#define zig_has_f64 13259#define zig_has_f64 1
3119#define zig_libc_name_f64(name) name3260#define zig_libc_name_f64(name) name
31203261
3121#if _MSC_VER3262#if defined(zig_msvc)
3122#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, )
3123#else3264#else
3124#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)
...@@ -3183,6 +3324,12 @@ typedef zig_u128 zig_f80;...@@ -3183,6 +3324,12 @@ typedef zig_u128 zig_f80;
3183#define zig_init_special_f80(sign, name, arg, repr) repr3324#define zig_init_special_f80(sign, name, arg, repr) repr
3184#endif3325#endif
31853326
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
3186#define zig_has_f128 13333#define zig_has_f128 1
3187#define zig_libc_name_f128(name) name##q3334#define zig_libc_name_f128(name) name##q
3188#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)
...@@ -3211,7 +3358,7 @@ typedef __float128 zig_f128;...@@ -3211,7 +3358,7 @@ typedef __float128 zig_f128;
3211#define zig_has_f128 03358#define zig_has_f128 0
3212#undef zig_make_special_f1283359#undef zig_make_special_f128
3213#undef zig_init_special_f1283360#undef zig_init_special_f128
3214#if __APPLE__ || defined(__aarch64__)3361#if defined(zig_darwin) || defined(zig_aarch64)
3215typedef __attribute__((__vector_size__(2 * sizeof(uint64_t)))) uint64_t zig_v2u64;3362typedef __attribute__((__vector_size__(2 * sizeof(uint64_t)))) uint64_t zig_v2u64;
3216zig_basic_operator(zig_v2u64, xor_v2u64, ^)3363zig_basic_operator(zig_v2u64, xor_v2u64, ^)
3217#define zig_repr_f128 v2u643364#define zig_repr_f128 v2u64
...@@ -3230,10 +3377,10 @@ typedef zig_u128 zig_f128;...@@ -3230,10 +3377,10 @@ typedef zig_u128 zig_f128;
3230#endif3377#endif
3231#endif3378#endif
32323379
3233#if !_MSC_VER && defined(ZIG_TARGET_ABI_MSVC)3380#if !defined(zig_msvc) && defined(ZIG_TARGET_ABI_MSVC)
3234/* Emulate msvc abi on a gnu compiler */3381/* Emulate msvc abi on a gnu compiler */
3235typedef zig_f64 zig_c_longdouble;3382typedef zig_f64 zig_c_longdouble;
3236#elif _MSC_VER && !defined(ZIG_TARGET_ABI_MSVC)3383#elif defined(zig_msvc) && !defined(ZIG_TARGET_ABI_MSVC)
3237/* Emulate gnu abi on an msvc compiler */3384/* Emulate gnu abi on an msvc compiler */
3238typedef zig_f128 zig_c_longdouble;3385typedef zig_f128 zig_c_longdouble;
3239#else3386#else
...@@ -3582,7 +3729,7 @@ zig_float_builtins(64)...@@ -3582,7 +3729,7 @@ zig_float_builtins(64)
3582 res = zig_atomicrmw_expected; \3729 res = zig_atomicrmw_expected; \
3583} while (0)3730} while (0)
35843731
3585#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__)
3586#include <stdatomic.h>3733#include <stdatomic.h>
3587typedef enum memory_order zig_memory_order;3734typedef enum memory_order zig_memory_order;
3588#define zig_memory_order_relaxed memory_order_relaxed3735#define zig_memory_order_relaxed memory_order_relaxed
...@@ -3610,7 +3757,7 @@ typedef enum memory_order zig_memory_order;...@@ -3610,7 +3757,7 @@ typedef enum memory_order zig_memory_order;
3610#define zig_atomicrmw_add_float zig_atomicrmw_add3757#define zig_atomicrmw_add_float zig_atomicrmw_add
3611#undef zig_atomicrmw_sub_float3758#undef zig_atomicrmw_sub_float
3612#define zig_atomicrmw_sub_float zig_atomicrmw_sub3759#define zig_atomicrmw_sub_float zig_atomicrmw_sub
3613#elif defined(__GNUC__)3760#elif defined(zig_gnuc)
3614typedef int zig_memory_order;3761typedef int zig_memory_order;
3615#define zig_memory_order_relaxed __ATOMIC_RELAXED3762#define zig_memory_order_relaxed __ATOMIC_RELAXED
3616#define zig_memory_order_acquire __ATOMIC_ACQUIRE3763#define zig_memory_order_acquire __ATOMIC_ACQUIRE
...@@ -3633,7 +3780,7 @@ typedef int zig_memory_order;...@@ -3633,7 +3780,7 @@ typedef int zig_memory_order;
3633#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)
3634#undef zig_atomicrmw_xchg_float3781#undef zig_atomicrmw_xchg_float
3635#define zig_atomicrmw_xchg_float zig_atomicrmw_xchg3782#define zig_atomicrmw_xchg_float zig_atomicrmw_xchg
3636#elif _MSC_VER && (_M_IX86 || _M_X64)3783#elif defined(zig_msvc) && defined(zig_x86)
3637#define zig_memory_order_relaxed 03784#define zig_memory_order_relaxed 0
3638#define zig_memory_order_acquire 23785#define zig_memory_order_acquire 2
3639#define zig_memory_order_release 33786#define zig_memory_order_release 3
...@@ -3653,7 +3800,7 @@ typedef int zig_memory_order;...@@ -3653,7 +3800,7 @@ typedef int zig_memory_order;
3653#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)
3654#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)
3655#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)
3656/* TODO: _MSC_VER && (_M_ARM || _M_ARM64) */3803/* TODO: zig_msvc && (zig_thumb || zig_aarch64) */
3657#else3804#else
3658#define zig_memory_order_relaxed 03805#define zig_memory_order_relaxed 0
3659#define zig_memory_order_acquire 23806#define zig_memory_order_acquire 2
...@@ -3676,7 +3823,7 @@ typedef int zig_memory_order;...@@ -3676,7 +3823,7 @@ typedef int zig_memory_order;
3676#define zig_atomic_load(res, obj, order, Type, ReprType) zig_atomics_unavailable3823#define zig_atomic_load(res, obj, order, Type, ReprType) zig_atomics_unavailable
3677#endif3824#endif
36783825
3679#if _MSC_VER && (_M_IX86 || _M_X64)3826#if defined(zig_msvc) && defined(zig_x86)
36803827
3681/* 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 */
36823829
...@@ -3773,7 +3920,7 @@ zig_msvc_atomics(i16, int16_t, short, 16, 16)...@@ -3773,7 +3920,7 @@ zig_msvc_atomics(i16, int16_t, short, 16, 16)
3773zig_msvc_atomics(u32, uint32_t, long, , 32)3920zig_msvc_atomics(u32, uint32_t, long, , 32)
3774zig_msvc_atomics(i32, int32_t, long, , 32)3921zig_msvc_atomics(i32, int32_t, long, , 32)
37753922
3776#if _M_X643923#if defined(zig_x86_64)
3777zig_msvc_atomics(u64, uint64_t, __int64, 64, 64)3924zig_msvc_atomics(u64, uint64_t, __int64, 64, 64)
3778zig_msvc_atomics(i64, int64_t, __int64, 64, 64)3925zig_msvc_atomics(i64, int64_t, __int64, 64, 64)
3779#endif3926#endif
...@@ -3818,11 +3965,11 @@ zig_msvc_atomics(i64, int64_t, __int64, 64, 64)...@@ -3818,11 +3965,11 @@ zig_msvc_atomics(i64, int64_t, __int64, 64, 64)
3818 }3965 }
38193966
3820zig_msvc_flt_atomics(f32, long, , 32)3967zig_msvc_flt_atomics(f32, long, , 32)
3821#if _M_X643968#if defined(zig_x86_64)
3822zig_msvc_flt_atomics(f64, int64_t, 64, 64)3969zig_msvc_flt_atomics(f64, int64_t, 64, 64)
3823#endif3970#endif
38243971
3825#if _M_IX863972#if defined(zig_x86_32)
3826static inline void zig_msvc_atomic_barrier() {3973static inline void zig_msvc_atomic_barrier() {
3827 int32_t barrier;3974 int32_t barrier;
3828 __asm {3975 __asm {
...@@ -3859,7 +4006,7 @@ static inline bool zig_msvc_cmpxchg_p32(void volatile* obj, void* expected, void...@@ -3859,7 +4006,7 @@ static inline bool zig_msvc_cmpxchg_p32(void volatile* obj, void* expected, void
3859 if (!success) *(void**)expected = initial;4006 if (!success) *(void**)expected = initial;
3860 return success;4007 return success;
3861}4008}
3862#else /* _M_IX86 */4009#else /* zig_x86_32 */
3863static 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) {
3864 return _InterlockedExchangePointer(obj, arg);4011 return _InterlockedExchangePointer(obj, arg);
3865}4012}
...@@ -3920,55 +4067,59 @@ static inline void zig_msvc_atomic_store_i128(zig_i128 volatile* obj, zig_i128 a...@@ -3920,55 +4067,59 @@ static inline void zig_msvc_atomic_store_i128(zig_i128 volatile* obj, zig_i128 a
3920 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));
3921}4068}
39224069
3923#endif /* _M_IX86 */4070#endif /* zig_x86_32 */
39244071
3925#endif /* _MSC_VER && (_M_IX86 || _M_X64) */4072#endif /* zig_msvc && zig_x86 */
39264073
3927/* ======================== Special Case Intrinsics ========================= */4074/* ======================== Special Case Intrinsics ========================= */
39284075
3929#if defined(_M_ARM) || defined(__thumb__)4076#if defined(zig_msvc)
4077#include <intrin.h>
4078#endif
4079
4080#if defined(zig_thumb)
39304081
3931static inline void* zig_thumb_windows_teb(void) {4082static inline void* zig_thumb_windows_teb(void) {
3932 void* teb = 0;4083 void* teb = 0;
3933#if defined(_MSC_VER)4084#if defined(zig_msvc)
3934 teb = (void*)_MoveFromCoprocessor(15, 0, 13, 0, 2);4085 teb = (void*)_MoveFromCoprocessor(15, 0, 13, 0, 2);
3935#elif defined(__GNUC__)4086#elif defined(zig_gnuc_asm)
3936 __asm__ ("mrc p15, 0, %[ptr], c13, c0, 2" : [ptr] "=r" (teb));4087 __asm__ ("mrc p15, 0, %[ptr], c13, c0, 2" : [ptr] "=r" (teb));
3937#endif4088#endif
3938 return teb;4089 return teb;
3939}4090}
39404091
3941#elif defined(_M_ARM64) || defined(__arch64__)4092#elif defined(zig_aarch64)
39424093
3943static inline void* zig_aarch64_windows_teb(void) {4094static inline void* zig_aarch64_windows_teb(void) {
3944 void* teb = 0;4095 void* teb = 0;
3945#if defined(_MSC_VER)4096#if defined(zig_msvc)
3946 teb = (void*)__readx18qword(0x0);4097 teb = (void*)__readx18qword(0x0);
3947#elif defined(__GNUC__)4098#elif defined(zig_gnuc_asm)
3948 __asm__ ("mov %[ptr], x18" : [ptr] "=r" (teb));4099 __asm__ ("mov %[ptr], x18" : [ptr] "=r" (teb));
3949#endif4100#endif
3950 return teb;4101 return teb;
3951}4102}
39524103
3953#elif defined(_M_IX86) || defined(__i386__)4104#elif defined(zig_x86_32)
39544105
3955static inline void* zig_x86_windows_teb(void) {4106static inline void* zig_x86_windows_teb(void) {
3956 void* teb = 0;4107 void* teb = 0;
3957#if defined(_MSC_VER)4108#if defined(zig_msvc)
3958 teb = (void*)__readfsdword(0x18);4109 teb = (void*)__readfsdword(0x18);
3959#elif defined(__GNUC__)4110#elif defined(zig_gnuc_asm)
3960 __asm__ ("movl %%fs:0x18, %[ptr]" : [ptr] "=r" (teb));4111 __asm__ ("movl %%fs:0x18, %[ptr]" : [ptr] "=r" (teb));
3961#endif4112#endif
3962 return teb;4113 return teb;
3963}4114}
39644115
3965#elif defined(_M_X64) || defined(__x86_64__)4116#elif defined(zig_x86_64)
39664117
3967static inline void* zig_x86_64_windows_teb(void) {4118static inline void* zig_x86_64_windows_teb(void) {
3968 void* teb = 0;4119 void* teb = 0;
3969#if defined(_MSC_VER)4120#if defined(zig_msvc)
3970 teb = (void*)__readgsqword(0x30);4121 teb = (void*)__readgsqword(0x30);
3971#elif defined(__GNUC__)4122#elif defined(zig_gnuc_asm)
3972 __asm__ ("movq %%gs:0x30, %[ptr]" : [ptr] "=r" (teb));4123 __asm__ ("movq %%gs:0x30, %[ptr]" : [ptr] "=r" (teb));
3973#endif4124#endif
3974 return teb;4125 return teb;
...@@ -3976,29 +4127,39 @@ static inline void* zig_x86_64_windows_teb(void) {...@@ -3976,29 +4127,39 @@ static inline void* zig_x86_64_windows_teb(void) {
39764127
3977#endif4128#endif
39784129
3979#if (_MSC_VER && (_M_IX86 || _M_X64)) || defined(__i386__) || defined(__x86_64__)4130#if defined(zig_x86)
39804131
3981static 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) {
3982#if _MSC_VER4133#if defined(zig_msvc)
3983 int cpu_info[4];4134 int cpu_info[4];
3984 __cpuidex(cpu_info, leaf_id, subid);4135 __cpuidex(cpu_info, leaf_id, subid);
3985 *eax = (uint32_t)cpu_info[0];4136 *eax = (uint32_t)cpu_info[0];
3986 *ebx = (uint32_t)cpu_info[1];4137 *ebx = (uint32_t)cpu_info[1];
3987 *ecx = (uint32_t)cpu_info[2];4138 *ecx = (uint32_t)cpu_info[2];
3988 *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));
3989#else4142#else
3990 __cpuid_count(leaf_id, subid, *eax, *ebx, *ecx, *edx);4143 *eax = 0;
4144 *ebx = 0;
4145 *ecx = 0;
4146 *edx = 0;
3991#endif4147#endif
3992}4148}
39934149
3994static inline uint32_t zig_x86_get_xcr0(void) {4150static inline uint32_t zig_x86_get_xcr0(void) {
3995#if _MSC_VER4151#if defined(zig_msvc)
3996 return (uint32_t)_xgetbv(0);4152 return (uint32_t)_xgetbv(0);
3997#else4153#elif defined(zig_gnuc_asm)
3998 uint32_t eax;4154 uint32_t eax;
3999 uint32_t edx;4155 uint32_t edx;
4000 __asm__("xgetbv" : "=a"(eax), "=d"(edx) : "c"(0));4156 __asm__("xgetbv" : "=a"(eax), "=d"(edx) : "c"(0));
4001 return eax;4157 return eax;
4158#else
4159 *eax = 0;
4160 *ebx = 0;
4161 *ecx = 0;
4162 *edx = 0;
4002#endif4163#endif
4003}4164}
40044165
stage1/zig1.wasm
Binary files a/stage1/zig1.wasm and b/stage1/zig1.wasm differ