| ... | ... | @@ -1,33 +1,143 @@ |
| 1 | 1 | #undef linux |
| 2 | 2 | |
| 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 | 3 | #include <stdarg.h> |
| 9 | 4 | #include <stddef.h> |
| 10 | | #include <stdint.h> |
| 11 | 5 | |
| 12 | | #if _MSC_VER |
| 13 | | #include <intrin.h> |
| 14 | | #elif defined(__i386__) || defined(__x86_64__) |
| 15 | | #include <cpuid.h> |
| 16 | | #endif |
| 17 | | |
| 18 | | #if !defined(__cplusplus) && __STDC_VERSION__ <= 201710L |
| 19 | | #if __STDC_VERSION__ >= 199901L |
| 20 | | #include <stdbool.h> |
| 6 | #if defined(_MSC_VER) |
| 7 | #define zig_msvc |
| 8 | #elif defined(__clang__) |
| 9 | #define zig_clang |
| 10 | #define zig_gnuc |
| 11 | #elif defined(__GNUC__) |
| 12 | #define zig_gnuc |
| 13 | #elif defined(__IBMC__) |
| 14 | #define zig_xlc |
| 15 | #elif defined(__TINYC__) |
| 16 | #define zig_tinyc |
| 17 | #elif defined(__slimcc__) |
| 18 | #define zig_slimcc |
| 19 | #endif |
| 20 | |
| 21 | #if defined(__aarch64__) || (defined(zig_msvc) && defined(_M_ARM64)) |
| 22 | #define zig_aarch64 |
| 23 | #elif defined(__thumb__) || (defined(zig_msvc) && defined(_M_ARM)) |
| 24 | #define zig_thumb |
| 25 | #define zig_arm |
| 26 | #elif defined(__arm__) |
| 27 | #define zig_arm |
| 28 | #elif defined(__hexagon__) |
| 29 | #define zig_hexagon |
| 30 | #elif defined(__loongarch32) |
| 31 | #define zig_loongarch32 |
| 32 | #define zig_loongarch |
| 33 | #elif defined(__loongarch64) |
| 34 | #define zig_loongarch64 |
| 35 | #define zig_loongarch |
| 36 | #elif defined(__mips64) |
| 37 | #define zig_mips64 |
| 38 | #define zig_mips |
| 39 | #elif defined(__mips__) |
| 40 | #define zig_mips32 |
| 41 | #define zig_mips |
| 42 | #elif defined(__powerpc64__) |
| 43 | #define zig_powerpc64 |
| 44 | #define zig_powerpc |
| 45 | #elif defined(__powerpc__) |
| 46 | #define zig_powerpc32 |
| 47 | #define zig_powerpc |
| 48 | #elif defined(__riscv) && __riscv_xlen == 32 |
| 49 | #define zig_riscv32 |
| 50 | #define zig_riscv |
| 51 | #elif defined(__riscv) && __riscv_xlen == 64 |
| 52 | #define zig_riscv64 |
| 53 | #define zig_riscv |
| 54 | #elif defined(__s390x__) |
| 55 | #define zig_s390x |
| 56 | #elif defined(__sparc__) && defined(__arch64__) |
| 57 | #define zig_sparc64 |
| 58 | #define zig_sparc |
| 59 | #elif defined(__sparc__) |
| 60 | #define zig_sparc32 |
| 61 | #define zig_sparc |
| 62 | #elif defined(__wasm32__) |
| 63 | #define zig_wasm32 |
| 64 | #define zig_wasm |
| 65 | #elif defined(__wasm64__) |
| 66 | #define zig_wasm64 |
| 67 | #define zig_wasm |
| 68 | #elif defined(__i386__) || (defined(zig_msvc) && defined(_M_IX86)) |
| 69 | #define zig_x86_32 |
| 70 | #define zig_x86 |
| 71 | #elif defined (__x86_64__) || (defined(zig_msvc) && defined(_M_X64)) |
| 72 | #define zig_x86_64 |
| 73 | #define zig_x86 |
| 74 | #endif |
| 75 | |
| 76 | #if defined(zig_msvc) || __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ |
| 77 | #define zig_little_endian 1 |
| 78 | #define zig_big_endian 0 |
| 21 | 79 | #else |
| 22 | | typedef char bool; |
| 23 | | #define false 0 |
| 24 | | #define true 1 |
| 80 | #define zig_little_endian 0 |
| 81 | #define zig_big_endian 1 |
| 25 | 82 | #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 | 130 | #endif |
| 27 | 131 | |
| 28 | 132 | #define zig_concat(lhs, rhs) lhs##rhs |
| 29 | 133 | #define zig_expand_concat(lhs, rhs) zig_concat(lhs, rhs) |
| 30 | 134 | |
| 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 | 141 | #if defined(__has_builtin) |
| 32 | 142 | #define zig_has_builtin(builtin) __has_builtin(__builtin_##builtin) |
| 33 | 143 | #else |
| ... | ... | @@ -41,37 +151,19 @@ typedef char bool; |
| 41 | 151 | #define zig_has_attribute(attribute) 0 |
| 42 | 152 | #endif |
| 43 | 153 | |
| 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 |
| 53 | 157 | #define zig_threadlocal _Thread_local |
| 54 | | #elif defined(__GNUC__) |
| 158 | #elif defined(zig_gnuc) || defined(zig_slimcc) |
| 55 | 159 | #define zig_threadlocal __thread |
| 56 | | #elif _MSC_VER |
| 160 | #elif defined(zig_msvc) |
| 57 | 161 | #define zig_threadlocal __declspec(thread) |
| 58 | 162 | #else |
| 59 | 163 | #define zig_threadlocal zig_threadlocal_unavailable |
| 60 | 164 | #endif |
| 61 | 165 | |
| 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) |
| 75 | 167 | #define zig_const_arr |
| 76 | 168 | #define zig_callconv(c) __##c |
| 77 | 169 | #else |
| ... | ... | @@ -82,7 +174,7 @@ typedef char bool; |
| 82 | 174 | #if zig_has_attribute(naked) || defined(zig_gnuc) |
| 83 | 175 | #define zig_naked_decl __attribute__((naked)) |
| 84 | 176 | #define zig_naked __attribute__((naked)) |
| 85 | | #elif defined(_MSC_VER) |
| 177 | #elif defined(zig_msvc) |
| 86 | 178 | #define zig_naked_decl |
| 87 | 179 | #define zig_naked __declspec(naked) |
| 88 | 180 | #else |
| ... | ... | @@ -104,7 +196,7 @@ typedef char bool; |
| 104 | 196 | |
| 105 | 197 | #if zig_has_attribute(noinline) |
| 106 | 198 | #define zig_never_inline __attribute__((noinline)) zig_maybe_flatten |
| 107 | | #elif defined(_MSC_VER) |
| 199 | #elif defined(zig_msvc) |
| 108 | 200 | #define zig_never_inline __declspec(noinline) zig_maybe_flatten |
| 109 | 201 | #else |
| 110 | 202 | #define zig_never_inline zig_never_inline_unavailable |
| ... | ... | @@ -124,46 +216,48 @@ typedef char bool; |
| 124 | 216 | |
| 125 | 217 | #if __STDC_VERSION__ >= 199901L |
| 126 | 218 | #define zig_restrict restrict |
| 127 | | #elif defined(__GNUC__) |
| 219 | #elif defined(zig_gnuc) || defined(zig_tinyc) |
| 128 | 220 | #define zig_restrict __restrict |
| 129 | 221 | #else |
| 130 | 222 | #define zig_restrict |
| 131 | 223 | #endif |
| 132 | 224 | |
| 133 | | #if zig_has_attribute(aligned) |
| 225 | #if zig_has_attribute(aligned) || defined(zig_tinyc) |
| 134 | 226 | #define zig_under_align(alignment) __attribute__((aligned(alignment))) |
| 135 | | #elif _MSC_VER |
| 227 | #elif defined(zig_msvc) |
| 136 | 228 | #define zig_under_align(alignment) __declspec(align(alignment)) |
| 137 | 229 | #else |
| 138 | 230 | #define zig_under_align zig_align_unavailable |
| 139 | 231 | #endif |
| 140 | 232 | |
| 141 | | #if __STDC_VERSION__ >= 201112L |
| 233 | #if __STDC_VERSION__ >= 202311L |
| 234 | #define zig_align(alignment) alignas(alignment) |
| 235 | #elif __STDC_VERSION__ >= 201112L |
| 142 | 236 | #define zig_align(alignment) _Alignas(alignment) |
| 143 | 237 | #else |
| 144 | 238 | #define zig_align(alignment) zig_under_align(alignment) |
| 145 | 239 | #endif |
| 146 | 240 | |
| 147 | | #if zig_has_attribute(aligned) |
| 241 | #if zig_has_attribute(aligned) || defined(zig_tinyc) |
| 148 | 242 | #define zig_align_fn(alignment) __attribute__((aligned(alignment))) |
| 149 | | #elif _MSC_VER |
| 243 | #elif defined(zig_msvc) |
| 150 | 244 | #define zig_align_fn(alignment) |
| 151 | 245 | #else |
| 152 | 246 | #define zig_align_fn zig_align_fn_unavailable |
| 153 | 247 | #endif |
| 154 | 248 | |
| 155 | | #if zig_has_attribute(packed) |
| 249 | #if zig_has_attribute(packed) || defined(zig_tinyc) |
| 156 | 250 | #define zig_packed(definition) __attribute__((packed)) definition |
| 157 | | #elif _MSC_VER |
| 251 | #elif defined(zig_msvc) |
| 158 | 252 | #define zig_packed(definition) __pragma(pack(1)) definition __pragma(pack()) |
| 159 | 253 | #else |
| 160 | 254 | #define zig_packed(definition) zig_packed_unavailable |
| 161 | 255 | #endif |
| 162 | 256 | |
| 163 | | #if zig_has_attribute(section) |
| 257 | #if zig_has_attribute(section) || defined(zig_tinyc) |
| 164 | 258 | #define zig_linksection(name) __attribute__((section(name))) |
| 165 | 259 | #define zig_linksection_fn zig_linksection |
| 166 | | #elif _MSC_VER |
| 260 | #elif defined(zig_msvc) |
| 167 | 261 | #define zig_linksection(name) __pragma(section(name, read, write)) __declspec(allocate(name)) |
| 168 | 262 | #define zig_linksection_fn(name) __pragma(section(name, read, execute)) __declspec(code_seg(name)) |
| 169 | 263 | #else |
| ... | ... | @@ -171,8 +265,10 @@ typedef char bool; |
| 171 | 265 | #define zig_linksection_fn zig_linksection |
| 172 | 266 | #endif |
| 173 | 267 | |
| 174 | | #if zig_has_builtin(unreachable) || defined(zig_gnuc) |
| 268 | #if zig_has_builtin(unreachable) || defined(zig_gnuc) || defined(zig_tinyc) |
| 175 | 269 | #define zig_unreachable() __builtin_unreachable() |
| 270 | #elif defined(zig_msvc) |
| 271 | #define zig_unreachable() __assume(0) |
| 176 | 272 | #else |
| 177 | 273 | #define zig_unreachable() |
| 178 | 274 | #endif |
| ... | ... | @@ -183,23 +279,23 @@ typedef char bool; |
| 183 | 279 | #define zig_extern extern |
| 184 | 280 | #endif |
| 185 | 281 | |
| 186 | | #if _MSC_VER |
| 187 | | #if _M_X64 |
| 282 | #if defined(zig_msvc) |
| 283 | #if defined(zig_x86_64) |
| 188 | 284 | #define zig_mangle_c(symbol) symbol |
| 189 | | #else /*_M_X64 */ |
| 285 | #else /* zig_x86_64 */ |
| 190 | 286 | #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) |
| 194 | 290 | #define zig_mangle_c(symbol) "_" symbol |
| 195 | | #else /* __APPLE__ */ |
| 291 | #else /* zig_macho */ |
| 196 | 292 | #define zig_mangle_c(symbol) symbol |
| 197 | | #endif /* __APPLE__ */ |
| 198 | | #endif /* _MSC_VER */ |
| 293 | #endif /* zig_macho */ |
| 294 | #endif /* zig_msvc */ |
| 199 | 295 | |
| 200 | | #if zig_has_attribute(alias) && !__APPLE__ |
| 296 | #if (zig_has_attribute(alias) || defined(zig_tinyc)) && !defined(zig_macho) |
| 201 | 297 | #define zig_export(symbol, name) __attribute__((alias(symbol))) |
| 202 | | #elif _MSC_VER |
| 298 | #elif defined(zig_msvc) |
| 203 | 299 | #define zig_export(symbol, name) ; \ |
| 204 | 300 | __pragma(comment(linker, "/alternatename:" zig_mangle_c(name) "=" zig_mangle_c(symbol))) |
| 205 | 301 | #else |
| ... | ... | @@ -209,24 +305,24 @@ typedef char bool; |
| 209 | 305 | |
| 210 | 306 | #define zig_mangled_tentative zig_mangled |
| 211 | 307 | #define zig_mangled_final zig_mangled |
| 212 | | #if _MSC_VER |
| 308 | #if defined(zig_msvc) |
| 213 | 309 | #define zig_mangled(mangled, unmangled) ; \ |
| 214 | 310 | zig_export(#mangled, unmangled) |
| 215 | 311 | #define zig_mangled_export(mangled, unmangled, symbol) \ |
| 216 | 312 | zig_export(unmangled, #mangled) \ |
| 217 | 313 | zig_export(symbol, unmangled) |
| 218 | | #else /* _MSC_VER */ |
| 314 | #else /* zig_msvc */ |
| 219 | 315 | #define zig_mangled(mangled, unmangled) __asm(zig_mangle_c(unmangled)) |
| 220 | 316 | #define zig_mangled_export(mangled, unmangled, symbol) \ |
| 221 | 317 | zig_mangled_final(mangled, unmangled) \ |
| 222 | 318 | zig_export(symbol, unmangled) |
| 223 | | #endif /* _MSC_VER */ |
| 319 | #endif /* zig_msvc */ |
| 224 | 320 | |
| 225 | | #if _MSC_VER |
| 321 | #if defined(zig_msvc) |
| 226 | 322 | #define zig_import(Type, fn_name, libc_name, sig_args, call_args) zig_extern Type fn_name sig_args;\ |
| 227 | 323 | __pragma(comment(linker, "/alternatename:" zig_mangle_c(#fn_name) "=" zig_mangle_c(#libc_name))); |
| 228 | 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 | 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 | 327 | #define zig_import_builtin(Type, fn_name, libc_name, sig_args, call_args) zig_extern Type libc_name sig_args; \ |
| 232 | 328 | static inline Type fn_name sig_args { return libc_name call_args; } |
| ... | ... | @@ -235,10 +331,10 @@ typedef char bool; |
| 235 | 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 | 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) |
| 237 | 333 | |
| 238 | | #if zig_has_attribute(weak) || defined(zig_gnuc) |
| 334 | #if zig_has_attribute(weak) || defined(zig_gnuc) || defined(zig_tinyc) |
| 239 | 335 | #define zig_weak_linkage __attribute__((weak)) |
| 240 | 336 | #define zig_weak_linkage_fn __attribute__((weak)) |
| 241 | | #elif _MSC_VER |
| 337 | #elif defined(zig_msvc) |
| 242 | 338 | #define zig_weak_linkage __declspec(selectany) |
| 243 | 339 | #define zig_weak_linkage_fn |
| 244 | 340 | #else |
| ... | ... | @@ -246,72 +342,94 @@ typedef char bool; |
| 246 | 342 | #define zig_weak_linkage_fn zig_weak_linkage_unavailable |
| 247 | 343 | #endif |
| 248 | 344 | |
| 345 | #if defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc) |
| 346 | #define zig_gnuc_asm |
| 347 | #endif |
| 348 | |
| 249 | 349 | #if zig_has_builtin(trap) |
| 250 | 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 | 354 | #define zig_trap() __ud2() |
| 253 | | #elif defined(_MSC_VER) |
| 355 | #else |
| 254 | 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 | 362 | #define zig_trap() __asm__ volatile("udf #0xfe") |
| 257 | | #elif defined(__arm__) || defined(__aarch64__) |
| 363 | #elif defined(zig_arm) || defined(zig_aarch64) |
| 258 | 364 | #define zig_trap() __asm__ volatile("udf #0xfdee") |
| 259 | | #elif defined(__hexagon__) |
| 365 | #elif defined(zig_hexagon) |
| 260 | 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 | 368 | #define zig_trap() __asm__ volatile(".word 0x0") |
| 263 | | #elif defined(__mips__) |
| 369 | #elif defined(zig_mips) |
| 264 | 370 | #define zig_trap() __asm__ volatile(".word 0x3d") |
| 265 | | #elif defined(__riscv) |
| 371 | #elif defined(zig_riscv) |
| 266 | 372 | #define zig_trap() __asm__ volatile("unimp") |
| 267 | | #elif defined(__s390__) |
| 373 | #elif defined(zig_s390x) |
| 268 | 374 | #define zig_trap() __asm__ volatile("j 0x2") |
| 269 | | #elif defined(__sparc__) |
| 375 | #elif defined(zig_sparc) |
| 270 | 376 | #define zig_trap() __asm__ volatile("illtrap") |
| 271 | | #elif defined(__i386__) || defined(__x86_64__) |
| 377 | #elif defined(zig_x86) |
| 272 | 378 | #define zig_trap() __asm__ volatile("ud2") |
| 273 | 379 | #else |
| 274 | 380 | #define zig_trap() zig_trap_unavailable |
| 275 | 381 | #endif |
| 276 | 382 | |
| 383 | #else |
| 384 | #define zig_trap() zig_trap_unavailable |
| 385 | #endif |
| 386 | |
| 277 | 387 | #if zig_has_builtin(debugtrap) |
| 278 | 388 | #define zig_breakpoint() __builtin_debugtrap() |
| 279 | | #elif defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__) |
| 389 | #elif defined(zig_msvc) |
| 280 | 390 | #define zig_breakpoint() __debugbreak() |
| 281 | | #elif defined(__arm__) |
| 391 | #elif defined(zig_gnuc_asm) |
| 392 | |
| 393 | #if defined(zig_arm) |
| 282 | 394 | #define zig_breakpoint() __asm__ volatile("bkpt #0x0") |
| 283 | | #elif defined(__aarch64__) |
| 395 | #elif defined(zig_aarch64) |
| 284 | 396 | #define zig_breakpoint() __asm__ volatile("brk #0xf000") |
| 285 | | #elif defined(__hexagon__) |
| 397 | #elif defined(zig_hexagon) |
| 286 | 398 | #define zig_breakpoint() __asm__ volatile("brkpt") |
| 287 | | #elif defined(__loongarch__) |
| 399 | #elif defined(zig_loongarch) |
| 288 | 400 | #define zig_breakpoint() __asm__ volatile("break 0x0") |
| 289 | | #elif defined(__mips__) |
| 401 | #elif defined(zig_mips) |
| 290 | 402 | #define zig_breakpoint() __asm__ volatile("break") |
| 291 | | #elif defined(__powerpc__) |
| 403 | #elif defined(zig_powerpc) |
| 292 | 404 | #define zig_breakpoint() __asm__ volatile("trap") |
| 293 | | #elif defined(__riscv) |
| 405 | #elif defined(zig_riscv) |
| 294 | 406 | #define zig_breakpoint() __asm__ volatile("ebreak") |
| 295 | | #elif defined(__s390__) |
| 407 | #elif defined(zig_s390x) |
| 296 | 408 | #define zig_breakpoint() __asm__ volatile("j 0x6") |
| 297 | | #elif defined(__sparc__) |
| 409 | #elif defined(zig_sparc) |
| 298 | 410 | #define zig_breakpoint() __asm__ volatile("ta 0x1") |
| 299 | | #elif defined(__i386__) || defined(__x86_64__) |
| 411 | #elif defined(zig_x86) |
| 300 | 412 | #define zig_breakpoint() __asm__ volatile("int $0x3") |
| 301 | 413 | #else |
| 302 | 414 | #define zig_breakpoint() zig_breakpoint_unavailable |
| 303 | 415 | #endif |
| 304 | 416 | |
| 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 | 422 | #define zig_return_address() __builtin_extract_return_addr(__builtin_return_address(0)) |
| 307 | | #elif defined(_MSC_VER) |
| 423 | #elif defined(zig_msvc) |
| 308 | 424 | #define zig_return_address() _ReturnAddress() |
| 309 | 425 | #else |
| 310 | 426 | #define zig_return_address() 0 |
| 311 | 427 | #endif |
| 312 | 428 | |
| 313 | | #if zig_has_builtin(frame_address) || defined(zig_gnuc) |
| 429 | #if zig_has_builtin(frame_address) || defined(zig_gnuc) || defined(zig_tinyc) |
| 314 | 430 | #define zig_frame_address() __builtin_frame_address(0) |
| 431 | #elif defined(zig_msvc) |
| 432 | #define zig_frame_address() _AddressOfReturnAddress() |
| 315 | 433 | #else |
| 316 | 434 | #define zig_frame_address() 0 |
| 317 | 435 | #endif |
| ... | ... | @@ -330,18 +448,18 @@ typedef char bool; |
| 330 | 448 | #define zig_wasm_memory_grow(index, delta) zig_unimplemented() |
| 331 | 449 | #endif |
| 332 | 450 | |
| 333 | | #if __STDC_VERSION__ >= 201112L |
| 451 | #if __STDC_VERSION__ >= 202311L |
| 452 | #define zig_noreturn [[noreturn]] |
| 453 | #elif __STDC_VERSION__ >= 201112L |
| 334 | 454 | #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 | 456 | #define zig_noreturn __attribute__((noreturn)) |
| 337 | | #elif _MSC_VER |
| 457 | #elif defined(zig_msvc) |
| 338 | 458 | #define zig_noreturn __declspec(noreturn) |
| 339 | 459 | #else |
| 340 | 460 | #define zig_noreturn |
| 341 | 461 | #endif |
| 342 | 462 | |
| 343 | | #define zig_bitSizeOf(T) (CHAR_BIT * sizeof(T)) |
| 344 | | |
| 345 | 463 | #define zig_compiler_rt_abbrev_uint32_t si |
| 346 | 464 | #define zig_compiler_rt_abbrev_int32_t si |
| 347 | 465 | #define zig_compiler_rt_abbrev_uint64_t di |
| ... | ... | @@ -357,12 +475,25 @@ typedef char bool; |
| 357 | 475 | zig_extern void *memcpy (void *zig_restrict, void const *zig_restrict, size_t); |
| 358 | 476 | zig_extern void *memset (void *, int, size_t); |
| 359 | 477 | |
| 360 | | /* ===================== 8/16/32/64-bit Integer Support ===================== */ |
| 478 | /* ================ Bool and 8/16/32/64-bit Integer Support ================= */ |
| 361 | 479 | |
| 362 | | #if __STDC_VERSION__ >= 199901L || _MSC_VER |
| 363 | | #include <stdint.h> |
| 480 | #include <limits.h> |
| 481 | |
| 482 | #define zig_bitSizeOf(T) (CHAR_BIT * sizeof(T)) |
| 483 | |
| 484 | #if __STDC_VERSION__ >= 202311L |
| 485 | /* bool, true, and false are provided by the language. */ |
| 486 | #elif __STDC_VERSION__ >= 199901L || zig_has_include(<stdbool.h>) |
| 487 | #include <stdbool.h> |
| 364 | 488 | #else |
| 489 | typedef char bool; |
| 490 | #define false 0 |
| 491 | #define true 1 |
| 492 | #endif |
| 365 | 493 | |
| 494 | #if __STDC_VERSION__ >= 199901L || defined(zig_msvc) || zig_has_include(<stdint.h>) |
| 495 | #include <stdint.h> |
| 496 | #else |
| 366 | 497 | #if SCHAR_MIN == ~0x7F && SCHAR_MAX == 0x7F && UCHAR_MAX == 0xFF |
| 367 | 498 | typedef unsigned char uint8_t; |
| 368 | 499 | typedef signed char int8_t; |
| ... | ... | @@ -1136,7 +1267,7 @@ static inline int64_t zig_bit_reverse_i64(int64_t val, uint8_t bits) { |
| 1136 | 1267 | static inline uint8_t zig_popcount_i##w(int##w##_t val, uint8_t bits) { \ |
| 1137 | 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 | 1271 | #define zig_builtin_popcount(w) \ |
| 1141 | 1272 | static inline uint8_t zig_popcount_u##w(uint##w##_t val, uint8_t bits) { \ |
| 1142 | 1273 | (void)bits; \ |
| ... | ... | @@ -1165,7 +1296,7 @@ zig_builtin_popcount(64) |
| 1165 | 1296 | static inline uint8_t zig_ctz_i##w(int##w##_t val, uint8_t bits) { \ |
| 1166 | 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 | 1300 | #define zig_builtin_ctz(w) \ |
| 1170 | 1301 | static inline uint8_t zig_ctz_u##w(uint##w##_t val, uint8_t bits) { \ |
| 1171 | 1302 | if (val == 0) return bits; \ |
| ... | ... | @@ -1190,7 +1321,7 @@ zig_builtin_ctz(64) |
| 1190 | 1321 | static inline uint8_t zig_clz_i##w(int##w##_t val, uint8_t bits) { \ |
| 1191 | 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 | 1325 | #define zig_builtin_clz(w) \ |
| 1195 | 1326 | static inline uint8_t zig_clz_u##w(uint##w##_t val, uint8_t bits) { \ |
| 1196 | 1327 | if (val == 0) return bits; \ |
| ... | ... | @@ -1258,7 +1389,7 @@ typedef struct { zig_align(16) int64_t hi; uint64_t lo; } zig_i128; |
| 1258 | 1389 | #define zig_make_u128(hi, lo) ((zig_u128){ .h##i = (hi), .l##o = (lo) }) |
| 1259 | 1390 | #define zig_make_i128(hi, lo) ((zig_i128){ .h##i = (hi), .l##o = (lo) }) |
| 1260 | 1391 | |
| 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 | 1393 | #define zig_init_u128(hi, lo) { .h##i = (hi), .l##o = (lo) } |
| 1263 | 1394 | #define zig_init_i128(hi, lo) { .h##i = (hi), .l##o = (lo) } |
| 1264 | 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 | 3151 | |
| 3021 | 3152 | /* ========================= Floating Point Support ========================= */ |
| 3022 | 3153 | |
| 3023 | | #if _MSC_VER |
| 3154 | #ifndef __STDC_WANT_IEC_60559_TYPES_EXT__ |
| 3155 | #define __STDC_WANT_IEC_60559_TYPES_EXT__ |
| 3156 | #endif |
| 3157 | |
| 3158 | #include <float.h> |
| 3159 | |
| 3160 | #if defined(zig_msvc) |
| 3024 | 3161 | float __cdecl nanf(char const* input); |
| 3025 | 3162 | double __cdecl nan(char const* input); |
| 3026 | 3163 | long double __cdecl nanl(char const* input); |
| ... | ... | @@ -3082,7 +3219,7 @@ typedef uint16_t zig_f16; |
| 3082 | 3219 | #undef zig_init_special_f16 |
| 3083 | 3220 | #define zig_init_special_f16(sign, name, arg, repr) repr |
| 3084 | 3221 | #endif |
| 3085 | | #if __APPLE__ && (defined(__i386__) || defined(__x86_64__)) |
| 3222 | #if defined(zig_darwin) && defined(zig_x86) |
| 3086 | 3223 | typedef uint16_t zig_compiler_rt_f16; |
| 3087 | 3224 | #else |
| 3088 | 3225 | typedef zig_f16 zig_compiler_rt_f16; |
| ... | ... | @@ -3090,7 +3227,7 @@ typedef zig_f16 zig_compiler_rt_f16; |
| 3090 | 3227 | |
| 3091 | 3228 | #define zig_has_f32 1 |
| 3092 | 3229 | #define zig_libc_name_f32(name) name##f |
| 3093 | | #if _MSC_VER |
| 3230 | #if defined(zig_msvc) |
| 3094 | 3231 | #define zig_init_special_f32(sign, name, arg, repr) sign zig_make_f32(zig_msvc_flt_##name, ) |
| 3095 | 3232 | #else |
| 3096 | 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 | 3259 | #define zig_has_f64 1 |
| 3123 | 3260 | #define zig_libc_name_f64(name) name |
| 3124 | 3261 | |
| 3125 | | #if _MSC_VER |
| 3262 | #if defined(zig_msvc) |
| 3126 | 3263 | #define zig_init_special_f64(sign, name, arg, repr) sign zig_make_f64(zig_msvc_flt_##name, ) |
| 3127 | 3264 | #else |
| 3128 | 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 | 3324 | #define zig_init_special_f80(sign, name, arg, repr) repr |
| 3188 | 3325 | #endif |
| 3189 | 3326 | |
| 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 | 3333 | #define zig_has_f128 1 |
| 3191 | 3334 | #define zig_libc_name_f128(name) name##q |
| 3192 | 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 | 3358 | #define zig_has_f128 0 |
| 3216 | 3359 | #undef zig_make_special_f128 |
| 3217 | 3360 | #undef zig_init_special_f128 |
| 3218 | | #if __APPLE__ || defined(__aarch64__) |
| 3361 | #if defined(zig_darwin) || defined(zig_aarch64) |
| 3219 | 3362 | typedef __attribute__((__vector_size__(2 * sizeof(uint64_t)))) uint64_t zig_v2u64; |
| 3220 | 3363 | zig_basic_operator(zig_v2u64, xor_v2u64, ^) |
| 3221 | 3364 | #define zig_repr_f128 v2u64 |
| ... | ... | @@ -3234,10 +3377,10 @@ typedef zig_u128 zig_f128; |
| 3234 | 3377 | #endif |
| 3235 | 3378 | #endif |
| 3236 | 3379 | |
| 3237 | | #if !_MSC_VER && defined(ZIG_TARGET_ABI_MSVC) |
| 3380 | #if !defined(zig_msvc) && defined(ZIG_TARGET_ABI_MSVC) |
| 3238 | 3381 | /* Emulate msvc abi on a gnu compiler */ |
| 3239 | 3382 | typedef 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 | 3384 | /* Emulate gnu abi on an msvc compiler */ |
| 3242 | 3385 | typedef zig_f128 zig_c_longdouble; |
| 3243 | 3386 | #else |
| ... | ... | @@ -3586,7 +3729,7 @@ zig_float_builtins(64) |
| 3586 | 3729 | res = zig_atomicrmw_expected; \ |
| 3587 | 3730 | } while (0) |
| 3588 | 3731 | |
| 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 | 3733 | #include <stdatomic.h> |
| 3591 | 3734 | typedef enum memory_order zig_memory_order; |
| 3592 | 3735 | #define zig_memory_order_relaxed memory_order_relaxed |
| ... | ... | @@ -3614,7 +3757,7 @@ typedef enum memory_order zig_memory_order; |
| 3614 | 3757 | #define zig_atomicrmw_add_float zig_atomicrmw_add |
| 3615 | 3758 | #undef zig_atomicrmw_sub_float |
| 3616 | 3759 | #define zig_atomicrmw_sub_float zig_atomicrmw_sub |
| 3617 | | #elif defined(__GNUC__) |
| 3760 | #elif defined(zig_gnuc) |
| 3618 | 3761 | typedef int zig_memory_order; |
| 3619 | 3762 | #define zig_memory_order_relaxed __ATOMIC_RELAXED |
| 3620 | 3763 | #define zig_memory_order_acquire __ATOMIC_ACQUIRE |
| ... | ... | @@ -3637,7 +3780,7 @@ typedef int zig_memory_order; |
| 3637 | 3780 | #define zig_atomic_load(res, obj, order, Type, ReprType) __atomic_load (obj, &(res), order) |
| 3638 | 3781 | #undef zig_atomicrmw_xchg_float |
| 3639 | 3782 | #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 | 3784 | #define zig_memory_order_relaxed 0 |
| 3642 | 3785 | #define zig_memory_order_acquire 2 |
| 3643 | 3786 | #define zig_memory_order_release 3 |
| ... | ... | @@ -3657,7 +3800,7 @@ typedef int zig_memory_order; |
| 3657 | 3800 | #define zig_atomicrmw_max(res, obj, arg, order, Type, ReprType) res = zig_msvc_atomicrmw_max_ ##Type(obj, arg) |
| 3658 | 3801 | #define zig_atomic_store( obj, arg, order, Type, ReprType) zig_msvc_atomic_store_ ##Type(obj, arg) |
| 3659 | 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 | 3804 | #else |
| 3662 | 3805 | #define zig_memory_order_relaxed 0 |
| 3663 | 3806 | #define zig_memory_order_acquire 2 |
| ... | ... | @@ -3680,7 +3823,7 @@ typedef int zig_memory_order; |
| 3680 | 3823 | #define zig_atomic_load(res, obj, order, Type, ReprType) zig_atomics_unavailable |
| 3681 | 3824 | #endif |
| 3682 | 3825 | |
| 3683 | | #if _MSC_VER && (_M_IX86 || _M_X64) |
| 3826 | #if defined(zig_msvc) && defined(zig_x86) |
| 3684 | 3827 | |
| 3685 | 3828 | /* TODO: zig_msvc_atomic_load should load 32 bit without interlocked on x86, and load 64 bit without interlocked on x64 */ |
| 3686 | 3829 | |
| ... | ... | @@ -3777,7 +3920,7 @@ zig_msvc_atomics(i16, int16_t, short, 16, 16) |
| 3777 | 3920 | zig_msvc_atomics(u32, uint32_t, long, , 32) |
| 3778 | 3921 | zig_msvc_atomics(i32, int32_t, long, , 32) |
| 3779 | 3922 | |
| 3780 | | #if _M_X64 |
| 3923 | #if defined(zig_x86_64) |
| 3781 | 3924 | zig_msvc_atomics(u64, uint64_t, __int64, 64, 64) |
| 3782 | 3925 | zig_msvc_atomics(i64, int64_t, __int64, 64, 64) |
| 3783 | 3926 | #endif |
| ... | ... | @@ -3822,11 +3965,11 @@ zig_msvc_atomics(i64, int64_t, __int64, 64, 64) |
| 3822 | 3965 | } |
| 3823 | 3966 | |
| 3824 | 3967 | zig_msvc_flt_atomics(f32, long, , 32) |
| 3825 | | #if _M_X64 |
| 3968 | #if defined(zig_x86_64) |
| 3826 | 3969 | zig_msvc_flt_atomics(f64, int64_t, 64, 64) |
| 3827 | 3970 | #endif |
| 3828 | 3971 | |
| 3829 | | #if _M_IX86 |
| 3972 | #if defined(zig_x86_32) |
| 3830 | 3973 | static inline void zig_msvc_atomic_barrier() { |
| 3831 | 3974 | int32_t barrier; |
| 3832 | 3975 | __asm { |
| ... | ... | @@ -3863,7 +4006,7 @@ static inline bool zig_msvc_cmpxchg_p32(void volatile* obj, void* expected, void |
| 3863 | 4006 | if (!success) *(void**)expected = initial; |
| 3864 | 4007 | return success; |
| 3865 | 4008 | } |
| 3866 | | #else /* _M_IX86 */ |
| 4009 | #else /* zig_x86_32 */ |
| 3867 | 4010 | static inline void* zig_msvc_atomicrmw_xchg_p64(void volatile* obj, void* arg) { |
| 3868 | 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 | 4067 | while (!zig_cmpxchg_weak(obj, expected, arg, zig_memory_order_seq_cst, zig_memory_order_seq_cst, i128, zig_i128)); |
| 3925 | 4068 | } |
| 3926 | 4069 | |
| 3927 | | #endif /* _M_IX86 */ |
| 4070 | #endif /* zig_x86_32 */ |
| 3928 | 4071 | |
| 3929 | | #endif /* _MSC_VER && (_M_IX86 || _M_X64) */ |
| 4072 | #endif /* zig_msvc && zig_x86 */ |
| 3930 | 4073 | |
| 3931 | 4074 | /* ======================== Special Case Intrinsics ========================= */ |
| 3932 | 4075 | |
| 3933 | | #if defined(_M_ARM) || defined(__thumb__) |
| 4076 | #if defined(zig_msvc) |
| 4077 | #include <intrin.h> |
| 4078 | #endif |
| 4079 | |
| 4080 | #if defined(zig_thumb) |
| 3934 | 4081 | |
| 3935 | 4082 | static inline void* zig_thumb_windows_teb(void) { |
| 3936 | 4083 | void* teb = 0; |
| 3937 | | #if defined(_MSC_VER) |
| 4084 | #if defined(zig_msvc) |
| 3938 | 4085 | teb = (void*)_MoveFromCoprocessor(15, 0, 13, 0, 2); |
| 3939 | | #elif defined(__GNUC__) |
| 4086 | #elif defined(zig_gnuc_asm) |
| 3940 | 4087 | __asm__ ("mrc p15, 0, %[ptr], c13, c0, 2" : [ptr] "=r" (teb)); |
| 3941 | 4088 | #endif |
| 3942 | 4089 | return teb; |
| 3943 | 4090 | } |
| 3944 | 4091 | |
| 3945 | | #elif defined(_M_ARM64) || defined(__arch64__) |
| 4092 | #elif defined(zig_aarch64) |
| 3946 | 4093 | |
| 3947 | 4094 | static inline void* zig_aarch64_windows_teb(void) { |
| 3948 | 4095 | void* teb = 0; |
| 3949 | | #if defined(_MSC_VER) |
| 4096 | #if defined(zig_msvc) |
| 3950 | 4097 | teb = (void*)__readx18qword(0x0); |
| 3951 | | #elif defined(__GNUC__) |
| 4098 | #elif defined(zig_gnuc_asm) |
| 3952 | 4099 | __asm__ ("mov %[ptr], x18" : [ptr] "=r" (teb)); |
| 3953 | 4100 | #endif |
| 3954 | 4101 | return teb; |
| 3955 | 4102 | } |
| 3956 | 4103 | |
| 3957 | | #elif defined(_M_IX86) || defined(__i386__) |
| 4104 | #elif defined(zig_x86_32) |
| 3958 | 4105 | |
| 3959 | 4106 | static inline void* zig_x86_windows_teb(void) { |
| 3960 | 4107 | void* teb = 0; |
| 3961 | | #if defined(_MSC_VER) |
| 4108 | #if defined(zig_msvc) |
| 3962 | 4109 | teb = (void*)__readfsdword(0x18); |
| 3963 | | #elif defined(__GNUC__) |
| 4110 | #elif defined(zig_gnuc_asm) |
| 3964 | 4111 | __asm__ ("movl %%fs:0x18, %[ptr]" : [ptr] "=r" (teb)); |
| 3965 | 4112 | #endif |
| 3966 | 4113 | return teb; |
| 3967 | 4114 | } |
| 3968 | 4115 | |
| 3969 | | #elif defined(_M_X64) || defined(__x86_64__) |
| 4116 | #elif defined(zig_x86_64) |
| 3970 | 4117 | |
| 3971 | 4118 | static inline void* zig_x86_64_windows_teb(void) { |
| 3972 | 4119 | void* teb = 0; |
| 3973 | | #if defined(_MSC_VER) |
| 4120 | #if defined(zig_msvc) |
| 3974 | 4121 | teb = (void*)__readgsqword(0x30); |
| 3975 | | #elif defined(__GNUC__) |
| 4122 | #elif defined(zig_gnuc_asm) |
| 3976 | 4123 | __asm__ ("movq %%gs:0x30, %[ptr]" : [ptr] "=r" (teb)); |
| 3977 | 4124 | #endif |
| 3978 | 4125 | return teb; |
| ... | ... | @@ -3980,29 +4127,39 @@ static inline void* zig_x86_64_windows_teb(void) { |
| 3980 | 4127 | |
| 3981 | 4128 | #endif |
| 3982 | 4129 | |
| 3983 | | #if (_MSC_VER && (_M_IX86 || _M_X64)) || defined(__i386__) || defined(__x86_64__) |
| 4130 | #if defined(zig_x86) |
| 3984 | 4131 | |
| 3985 | 4132 | static inline void zig_x86_cpuid(uint32_t leaf_id, uint32_t subid, uint32_t* eax, uint32_t* ebx, uint32_t* ecx, uint32_t* edx) { |
| 3986 | | #if _MSC_VER |
| 4133 | #if defined(zig_msvc) |
| 3987 | 4134 | int cpu_info[4]; |
| 3988 | 4135 | __cpuidex(cpu_info, leaf_id, subid); |
| 3989 | 4136 | *eax = (uint32_t)cpu_info[0]; |
| 3990 | 4137 | *ebx = (uint32_t)cpu_info[1]; |
| 3991 | 4138 | *ecx = (uint32_t)cpu_info[2]; |
| 3992 | 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 | 4142 | #else |
| 3994 | | __cpuid_count(leaf_id, subid, *eax, *ebx, *ecx, *edx); |
| 4143 | *eax = 0; |
| 4144 | *ebx = 0; |
| 4145 | *ecx = 0; |
| 4146 | *edx = 0; |
| 3995 | 4147 | #endif |
| 3996 | 4148 | } |
| 3997 | 4149 | |
| 3998 | 4150 | static inline uint32_t zig_x86_get_xcr0(void) { |
| 3999 | | #if _MSC_VER |
| 4151 | #if defined(zig_msvc) |
| 4000 | 4152 | return (uint32_t)_xgetbv(0); |
| 4001 | | #else |
| 4153 | #elif defined(zig_gnuc_asm) |
| 4002 | 4154 | uint32_t eax; |
| 4003 | 4155 | uint32_t edx; |
| 4004 | 4156 | __asm__("xgetbv" : "=a"(eax), "=d"(edx) : "c"(0)); |
| 4005 | 4157 | return eax; |
| 4158 | #else |
| 4159 | *eax = 0; |
| 4160 | *ebx = 0; |
| 4161 | *ecx = 0; |
| 4162 | *edx = 0; |
| 4006 | 4163 | #endif |
| 4007 | 4164 | } |
| 4008 | 4165 | |