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 @@
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>
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__ <= 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,68 +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(__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)
260368#define zig_trap() __asm__ volatile(".word 0x0")
261#elif defined(__mips__)
369#elif defined(zig_mips)
262370#define zig_trap() __asm__ volatile(".word 0x3d")
263#elif defined(__riscv)
371#elif defined(zig_riscv)
264372#define zig_trap() __asm__ volatile("unimp")
265#elif defined(__s390__)
373#elif defined(zig_s390x)
266374#define zig_trap() __asm__ volatile("j 0x2")
267#elif defined(__sparc__)
375#elif defined(zig_sparc)
268376#define zig_trap() __asm__ volatile("illtrap")
269#elif defined(__i386__) || defined(__x86_64__)
377#elif defined(zig_x86)
270378#define zig_trap() __asm__ volatile("ud2")
271379#else
272380#define zig_trap() zig_trap_unavailable
273381#endif
274382
383#else
384#define zig_trap() zig_trap_unavailable
385#endif
386
275387#if zig_has_builtin(debugtrap)
276388#define zig_breakpoint() __builtin_debugtrap()
277#elif defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__)
389#elif defined(zig_msvc)
278390#define zig_breakpoint() __debugbreak()
279#elif defined(__arm__)
391#elif defined(zig_gnuc_asm)
392
393#if defined(zig_arm)
280394#define zig_breakpoint() __asm__ volatile("bkpt #0x0")
281#elif defined(__aarch64__)
395#elif defined(zig_aarch64)
282396#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)
284400#define zig_breakpoint() __asm__ volatile("break 0x0")
285#elif defined(__mips__)
401#elif defined(zig_mips)
286402#define zig_breakpoint() __asm__ volatile("break")
287#elif defined(__powerpc__)
403#elif defined(zig_powerpc)
288404#define zig_breakpoint() __asm__ volatile("trap")
289#elif defined(__riscv)
405#elif defined(zig_riscv)
290406#define zig_breakpoint() __asm__ volatile("ebreak")
291#elif defined(__s390__)
407#elif defined(zig_s390x)
292408#define zig_breakpoint() __asm__ volatile("j 0x6")
293#elif defined(__sparc__)
409#elif defined(zig_sparc)
294410#define zig_breakpoint() __asm__ volatile("ta 0x1")
295#elif defined(__i386__) || defined(__x86_64__)
411#elif defined(zig_x86)
296412#define zig_breakpoint() __asm__ volatile("int $0x3")
297413#else
298414#define zig_breakpoint() zig_breakpoint_unavailable
299415#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)
302422#define zig_return_address() __builtin_extract_return_addr(__builtin_return_address(0))
303#elif defined(_MSC_VER)
423#elif defined(zig_msvc)
304424#define zig_return_address() _ReturnAddress()
305425#else
306426#define zig_return_address() 0
307427#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)
310430#define zig_frame_address() __builtin_frame_address(0)
431#elif defined(zig_msvc)
432#define zig_frame_address() _AddressOfReturnAddress()
311433#else
312434#define zig_frame_address() 0
313435#endif
......@@ -326,18 +448,18 @@ typedef char bool;
326448#define zig_wasm_memory_grow(index, delta) zig_unimplemented()
327449#endif
328450
329#if __STDC_VERSION__ >= 201112L
451#if __STDC_VERSION__ >= 202311L
452#define zig_noreturn [[noreturn]]
453#elif __STDC_VERSION__ >= 201112L
330454#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)
332456#define zig_noreturn __attribute__((noreturn))
333#elif _MSC_VER
457#elif defined(zig_msvc)
334458#define zig_noreturn __declspec(noreturn)
335459#else
336460#define zig_noreturn
337461#endif
338462
339#define zig_bitSizeOf(T) (CHAR_BIT * sizeof(T))
340
341463#define zig_compiler_rt_abbrev_uint32_t si
342464#define zig_compiler_rt_abbrev_int32_t si
343465#define zig_compiler_rt_abbrev_uint64_t di
......@@ -353,12 +475,25 @@ typedef char bool;
353475zig_extern void *memcpy (void *zig_restrict, void const *zig_restrict, size_t);
354476zig_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_VER
359#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>
360488#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
362497#if SCHAR_MIN == ~0x7F && SCHAR_MAX == 0x7F && UCHAR_MAX == 0xFF
363498typedef unsigned char uint8_t;
364499typedef signed char int8_t;
......@@ -1132,7 +1267,7 @@ static inline int64_t zig_bit_reverse_i64(int64_t val, uint8_t bits) {
11321267 static inline uint8_t zig_popcount_i##w(int##w##_t val, uint8_t bits) { \
11331268 return zig_popcount_u##w((uint##w##_t)val, bits); \
11341269 }
1135#if zig_has_builtin(popcount) || defined(zig_gnuc)
1270#if zig_has_builtin(popcount) || defined(zig_gnuc) || defined(zig_tinyc)
11361271#define zig_builtin_popcount(w) \
11371272 static inline uint8_t zig_popcount_u##w(uint##w##_t val, uint8_t bits) { \
11381273 (void)bits; \
......@@ -1161,7 +1296,7 @@ zig_builtin_popcount(64)
11611296 static inline uint8_t zig_ctz_i##w(int##w##_t val, uint8_t bits) { \
11621297 return zig_ctz_u##w((uint##w##_t)val, bits); \
11631298 }
1164#if zig_has_builtin(ctz) || defined(zig_gnuc)
1299#if zig_has_builtin(ctz) || defined(zig_gnuc) || defined(zig_tinyc)
11651300#define zig_builtin_ctz(w) \
11661301 static inline uint8_t zig_ctz_u##w(uint##w##_t val, uint8_t bits) { \
11671302 if (val == 0) return bits; \
......@@ -1186,7 +1321,7 @@ zig_builtin_ctz(64)
11861321 static inline uint8_t zig_clz_i##w(int##w##_t val, uint8_t bits) { \
11871322 return zig_clz_u##w((uint##w##_t)val, bits); \
11881323 }
1189#if zig_has_builtin(clz) || defined(zig_gnuc)
1324#if zig_has_builtin(clz) || defined(zig_gnuc) || defined(zig_tinyc)
11901325#define zig_builtin_clz(w) \
11911326 static inline uint8_t zig_clz_u##w(uint##w##_t val, uint8_t bits) { \
11921327 if (val == 0) return bits; \
......@@ -1254,7 +1389,7 @@ typedef struct { zig_align(16) int64_t hi; uint64_t lo; } zig_i128;
12541389#define zig_make_u128(hi, lo) ((zig_u128){ .h##i = (hi), .l##o = (lo) })
12551390#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 */
12581393#define zig_init_u128(hi, lo) { .h##i = (hi), .l##o = (lo) }
12591394#define zig_init_i128(hi, lo) { .h##i = (hi), .l##o = (lo) }
12601395#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_
30163151
30173152/* ========================= Floating Point Support ========================= */
30183153
3019#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)
30203161float __cdecl nanf(char const* input);
30213162double __cdecl nan(char const* input);
30223163long double __cdecl nanl(char const* input);
......@@ -3078,7 +3219,7 @@ typedef uint16_t zig_f16;
30783219#undef zig_init_special_f16
30793220#define zig_init_special_f16(sign, name, arg, repr) repr
30803221#endif
3081#if __APPLE__ && (defined(__i386__) || defined(__x86_64__))
3222#if defined(zig_darwin) && defined(zig_x86)
30823223typedef uint16_t zig_compiler_rt_f16;
30833224#else
30843225typedef zig_f16 zig_compiler_rt_f16;
......@@ -3086,7 +3227,7 @@ typedef zig_f16 zig_compiler_rt_f16;
30863227
30873228#define zig_has_f32 1
30883229#define zig_libc_name_f32(name) name##f
3089#if _MSC_VER
3230#if defined(zig_msvc)
30903231#define zig_init_special_f32(sign, name, arg, repr) sign zig_make_f32(zig_msvc_flt_##name, )
30913232#else
30923233#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;
31183259#define zig_has_f64 1
31193260#define zig_libc_name_f64(name) name
31203261
3121#if _MSC_VER
3262#if defined(zig_msvc)
31223263#define zig_init_special_f64(sign, name, arg, repr) sign zig_make_f64(zig_msvc_flt_##name, )
31233264#else
31243265#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;
31833324#define zig_init_special_f80(sign, name, arg, repr) repr
31843325#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
31863333#define zig_has_f128 1
31873334#define zig_libc_name_f128(name) name##q
31883335#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;
32113358#define zig_has_f128 0
32123359#undef zig_make_special_f128
32133360#undef zig_init_special_f128
3214#if __APPLE__ || defined(__aarch64__)
3361#if defined(zig_darwin) || defined(zig_aarch64)
32153362typedef __attribute__((__vector_size__(2 * sizeof(uint64_t)))) uint64_t zig_v2u64;
32163363zig_basic_operator(zig_v2u64, xor_v2u64, ^)
32173364#define zig_repr_f128 v2u64
......@@ -3230,10 +3377,10 @@ typedef zig_u128 zig_f128;
32303377#endif
32313378#endif
32323379
3233#if !_MSC_VER && defined(ZIG_TARGET_ABI_MSVC)
3380#if !defined(zig_msvc) && defined(ZIG_TARGET_ABI_MSVC)
32343381/* Emulate msvc abi on a gnu compiler */
32353382typedef zig_f64 zig_c_longdouble;
3236#elif _MSC_VER && !defined(ZIG_TARGET_ABI_MSVC)
3383#elif defined(zig_msvc) && !defined(ZIG_TARGET_ABI_MSVC)
32373384/* Emulate gnu abi on an msvc compiler */
32383385typedef zig_f128 zig_c_longdouble;
32393386#else
......@@ -3582,7 +3729,7 @@ zig_float_builtins(64)
35823729 res = zig_atomicrmw_expected; \
35833730} 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__)
35863733#include <stdatomic.h>
35873734typedef enum memory_order zig_memory_order;
35883735#define zig_memory_order_relaxed memory_order_relaxed
......@@ -3610,7 +3757,7 @@ typedef enum memory_order zig_memory_order;
36103757#define zig_atomicrmw_add_float zig_atomicrmw_add
36113758#undef zig_atomicrmw_sub_float
36123759#define zig_atomicrmw_sub_float zig_atomicrmw_sub
3613#elif defined(__GNUC__)
3760#elif defined(zig_gnuc)
36143761typedef int zig_memory_order;
36153762#define zig_memory_order_relaxed __ATOMIC_RELAXED
36163763#define zig_memory_order_acquire __ATOMIC_ACQUIRE
......@@ -3633,7 +3780,7 @@ typedef int zig_memory_order;
36333780#define zig_atomic_load(res, obj, order, Type, ReprType) __atomic_load (obj, &(res), order)
36343781#undef zig_atomicrmw_xchg_float
36353782#define zig_atomicrmw_xchg_float zig_atomicrmw_xchg
3636#elif _MSC_VER && (_M_IX86 || _M_X64)
3783#elif defined(zig_msvc) && defined(zig_x86)
36373784#define zig_memory_order_relaxed 0
36383785#define zig_memory_order_acquire 2
36393786#define zig_memory_order_release 3
......@@ -3653,7 +3800,7 @@ typedef int zig_memory_order;
36533800#define zig_atomicrmw_max(res, obj, arg, order, Type, ReprType) res = zig_msvc_atomicrmw_max_ ##Type(obj, arg)
36543801#define zig_atomic_store( obj, arg, order, Type, ReprType) zig_msvc_atomic_store_ ##Type(obj, arg)
36553802#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) */
36573804#else
36583805#define zig_memory_order_relaxed 0
36593806#define zig_memory_order_acquire 2
......@@ -3676,7 +3823,7 @@ typedef int zig_memory_order;
36763823#define zig_atomic_load(res, obj, order, Type, ReprType) zig_atomics_unavailable
36773824#endif
36783825
3679#if _MSC_VER && (_M_IX86 || _M_X64)
3826#if defined(zig_msvc) && defined(zig_x86)
36803827
36813828/* 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)
37733920zig_msvc_atomics(u32, uint32_t, long, , 32)
37743921zig_msvc_atomics(i32, int32_t, long, , 32)
37753922
3776#if _M_X64
3923#if defined(zig_x86_64)
37773924zig_msvc_atomics(u64, uint64_t, __int64, 64, 64)
37783925zig_msvc_atomics(i64, int64_t, __int64, 64, 64)
37793926#endif
......@@ -3818,11 +3965,11 @@ zig_msvc_atomics(i64, int64_t, __int64, 64, 64)
38183965 }
38193966
38203967zig_msvc_flt_atomics(f32, long, , 32)
3821#if _M_X64
3968#if defined(zig_x86_64)
38223969zig_msvc_flt_atomics(f64, int64_t, 64, 64)
38233970#endif
38243971
3825#if _M_IX86
3972#if defined(zig_x86_32)
38263973static inline void zig_msvc_atomic_barrier() {
38273974 int32_t barrier;
38283975 __asm {
......@@ -3859,7 +4006,7 @@ static inline bool zig_msvc_cmpxchg_p32(void volatile* obj, void* expected, void
38594006 if (!success) *(void**)expected = initial;
38604007 return success;
38614008}
3862#else /* _M_IX86 */
4009#else /* zig_x86_32 */
38634010static inline void* zig_msvc_atomicrmw_xchg_p64(void volatile* obj, void* arg) {
38644011 return _InterlockedExchangePointer(obj, arg);
38654012}
......@@ -3920,55 +4067,59 @@ static inline void zig_msvc_atomic_store_i128(zig_i128 volatile* obj, zig_i128 a
39204067 while (!zig_cmpxchg_weak(obj, expected, arg, zig_memory_order_seq_cst, zig_memory_order_seq_cst, i128, zig_i128));
39214068}
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
39274074/* ======================== 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
39314082static inline void* zig_thumb_windows_teb(void) {
39324083 void* teb = 0;
3933#if defined(_MSC_VER)
4084#if defined(zig_msvc)
39344085 teb = (void*)_MoveFromCoprocessor(15, 0, 13, 0, 2);
3935#elif defined(__GNUC__)
4086#elif defined(zig_gnuc_asm)
39364087 __asm__ ("mrc p15, 0, %[ptr], c13, c0, 2" : [ptr] "=r" (teb));
39374088#endif
39384089 return teb;
39394090}
39404091
3941#elif defined(_M_ARM64) || defined(__arch64__)
4092#elif defined(zig_aarch64)
39424093
39434094static inline void* zig_aarch64_windows_teb(void) {
39444095 void* teb = 0;
3945#if defined(_MSC_VER)
4096#if defined(zig_msvc)
39464097 teb = (void*)__readx18qword(0x0);
3947#elif defined(__GNUC__)
4098#elif defined(zig_gnuc_asm)
39484099 __asm__ ("mov %[ptr], x18" : [ptr] "=r" (teb));
39494100#endif
39504101 return teb;
39514102}
39524103
3953#elif defined(_M_IX86) || defined(__i386__)
4104#elif defined(zig_x86_32)
39544105
39554106static inline void* zig_x86_windows_teb(void) {
39564107 void* teb = 0;
3957#if defined(_MSC_VER)
4108#if defined(zig_msvc)
39584109 teb = (void*)__readfsdword(0x18);
3959#elif defined(__GNUC__)
4110#elif defined(zig_gnuc_asm)
39604111 __asm__ ("movl %%fs:0x18, %[ptr]" : [ptr] "=r" (teb));
39614112#endif
39624113 return teb;
39634114}
39644115
3965#elif defined(_M_X64) || defined(__x86_64__)
4116#elif defined(zig_x86_64)
39664117
39674118static inline void* zig_x86_64_windows_teb(void) {
39684119 void* teb = 0;
3969#if defined(_MSC_VER)
4120#if defined(zig_msvc)
39704121 teb = (void*)__readgsqword(0x30);
3971#elif defined(__GNUC__)
4122#elif defined(zig_gnuc_asm)
39724123 __asm__ ("movq %%gs:0x30, %[ptr]" : [ptr] "=r" (teb));
39734124#endif
39744125 return teb;
......@@ -3976,29 +4127,39 @@ static inline void* zig_x86_64_windows_teb(void) {
39764127
39774128#endif
39784129
3979#if (_MSC_VER && (_M_IX86 || _M_X64)) || defined(__i386__) || defined(__x86_64__)
4130#if defined(zig_x86)
39804131
39814132static 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_VER
4133#if defined(zig_msvc)
39834134 int cpu_info[4];
39844135 __cpuidex(cpu_info, leaf_id, subid);
39854136 *eax = (uint32_t)cpu_info[0];
39864137 *ebx = (uint32_t)cpu_info[1];
39874138 *ecx = (uint32_t)cpu_info[2];
39884139 *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));
39894142#else
3990 __cpuid_count(leaf_id, subid, *eax, *ebx, *ecx, *edx);
4143 *eax = 0;
4144 *ebx = 0;
4145 *ecx = 0;
4146 *edx = 0;
39914147#endif
39924148}
39934149
39944150static inline uint32_t zig_x86_get_xcr0(void) {
3995#if _MSC_VER
4151#if defined(zig_msvc)
39964152 return (uint32_t)_xgetbv(0);
3997#else
4153#elif defined(zig_gnuc_asm)
39984154 uint32_t eax;
39994155 uint32_t edx;
40004156 __asm__("xgetbv" : "=a"(eax), "=d"(edx) : "c"(0));
40014157 return eax;
4158#else
4159 *eax = 0;
4160 *ebx = 0;
4161 *ecx = 0;
4162 *edx = 0;
40024163#endif
40034164}
40044165
stage1/zig1.wasm
Binary files a/stage1/zig1.wasm and b/stage1/zig1.wasm differ