| ... | @@ -40,6 +40,8 @@ | ... | @@ -40,6 +40,8 @@ |
| 40 | #elif defined(__mips__) | 40 | #elif defined(__mips__) |
| 41 | #define zig_mips32 | 41 | #define zig_mips32 |
| 42 | #define zig_mips | 42 | #define zig_mips |
| | 43 | #elif defined(__or1k__) |
| | 44 | #define zig_or1k |
| 43 | #elif defined(__powerpc64__) | 45 | #elif defined(__powerpc64__) |
| 44 | #define zig_powerpc64 | 46 | #define zig_powerpc64 |
| 45 | #define zig_powerpc | 47 | #define zig_powerpc |
| ... | @@ -72,6 +74,9 @@ | ... | @@ -72,6 +74,9 @@ |
| 72 | #elif defined (__x86_64__) || (defined(zig_msvc) && defined(_M_X64)) | 74 | #elif defined (__x86_64__) || (defined(zig_msvc) && defined(_M_X64)) |
| 73 | #define zig_x86_64 | 75 | #define zig_x86_64 |
| 74 | #define zig_x86 | 76 | #define zig_x86 |
| | 77 | #elif defined(__I86__) |
| | 78 | #define zig_x86_16 |
| | 79 | #define zig_x86 |
| 75 | #endif | 80 | #endif |
| 76 | | 81 | |
| 77 | #if defined(zig_msvc) || __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ | 82 | #if defined(zig_msvc) || __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ |
| ... | @@ -82,9 +87,7 @@ | ... | @@ -82,9 +87,7 @@ |
| 82 | #define zig_big_endian 1 | 87 | #define zig_big_endian 1 |
| 83 | #endif | 88 | #endif |
| 84 | | 89 | |
| 85 | #if defined(_AIX) | 90 | #if defined(__MACH__) |
| 86 | #define zig_aix | | |
| 87 | #elif defined(__MACH__) | | |
| 88 | #define zig_darwin | 91 | #define zig_darwin |
| 89 | #elif defined(__DragonFly__) | 92 | #elif defined(__DragonFly__) |
| 90 | #define zig_dragonfly | 93 | #define zig_dragonfly |
| ... | @@ -114,20 +117,14 @@ | ... | @@ -114,20 +117,14 @@ |
| 114 | #define zig_wasi | 117 | #define zig_wasi |
| 115 | #elif defined(_WIN32) | 118 | #elif defined(_WIN32) |
| 116 | #define zig_windows | 119 | #define zig_windows |
| 117 | #elif defined(__MVS__) | | |
| 118 | #define zig_zos | | |
| 119 | #endif | 120 | #endif |
| 120 | | 121 | |
| 121 | #if defined(zig_windows) | 122 | #if defined(zig_windows) |
| 122 | #define zig_coff | 123 | #define zig_coff |
| 123 | #elif defined(__ELF__) | 124 | #elif defined(__ELF__) |
| 124 | #define zig_elf | 125 | #define zig_elf |
| 125 | #elif defined(zig_zos) | | |
| 126 | #define zig_goff | | |
| 127 | #elif defined(zig_darwin) | 126 | #elif defined(zig_darwin) |
| 128 | #define zig_macho | 127 | #define zig_macho |
| 129 | #elif defined(zig_aix) | | |
| 130 | #define zig_xcoff | | |
| 131 | #endif | 128 | #endif |
| 132 | | 129 | |
| 133 | #define zig_concat(lhs, rhs) lhs##rhs | 130 | #define zig_concat(lhs, rhs) lhs##rhs |
| ... | @@ -390,12 +387,16 @@ | ... | @@ -390,12 +387,16 @@ |
| 390 | #define zig_trap() __asm__ volatile(".word 0x0") | 387 | #define zig_trap() __asm__ volatile(".word 0x0") |
| 391 | #elif defined(zig_mips) | 388 | #elif defined(zig_mips) |
| 392 | #define zig_trap() __asm__ volatile(".word 0x3d") | 389 | #define zig_trap() __asm__ volatile(".word 0x3d") |
| | 390 | #elif defined(zig_or1k) |
| | 391 | #define zig_trap() __asm__ volatile("l.cust8") |
| 393 | #elif defined(zig_riscv) | 392 | #elif defined(zig_riscv) |
| 394 | #define zig_trap() __asm__ volatile("unimp") | 393 | #define zig_trap() __asm__ volatile("unimp") |
| 395 | #elif defined(zig_s390x) | 394 | #elif defined(zig_s390x) |
| 396 | #define zig_trap() __asm__ volatile("j 0x2") | 395 | #define zig_trap() __asm__ volatile("j 0x2") |
| 397 | #elif defined(zig_sparc) | 396 | #elif defined(zig_sparc) |
| 398 | #define zig_trap() __asm__ volatile("illtrap") | 397 | #define zig_trap() __asm__ volatile("illtrap") |
| | 398 | #elif defined(zig_x86_16) |
| | 399 | #define zig_trap() __asm__ volatile("int $0x3") |
| 399 | #elif defined(zig_x86) | 400 | #elif defined(zig_x86) |
| 400 | #define zig_trap() __asm__ volatile("ud2") | 401 | #define zig_trap() __asm__ volatile("ud2") |
| 401 | #else | 402 | #else |
| ... | @@ -422,6 +423,8 @@ | ... | @@ -422,6 +423,8 @@ |
| 422 | #define zig_breakpoint() __asm__ volatile("break 0x0") | 423 | #define zig_breakpoint() __asm__ volatile("break 0x0") |
| 423 | #elif defined(zig_mips) | 424 | #elif defined(zig_mips) |
| 424 | #define zig_breakpoint() __asm__ volatile("break") | 425 | #define zig_breakpoint() __asm__ volatile("break") |
| | 426 | #elif defined(zig_or1k) |
| | 427 | #define zig_breakpoint() __asm__ volatile("l.trap 0x0") |
| 425 | #elif defined(zig_powerpc) | 428 | #elif defined(zig_powerpc) |
| 426 | #define zig_breakpoint() __asm__ volatile("trap") | 429 | #define zig_breakpoint() __asm__ volatile("trap") |
| 427 | #elif defined(zig_riscv) | 430 | #elif defined(zig_riscv) |
| ... | @@ -804,15 +807,13 @@ static inline bool zig_addo_u32(uint32_t *res, uint32_t lhs, uint32_t rhs, uint8 | ... | @@ -804,15 +807,13 @@ static inline bool zig_addo_u32(uint32_t *res, uint32_t lhs, uint32_t rhs, uint8 |
| 804 | #endif | 807 | #endif |
| 805 | } | 808 | } |
| 806 | | 809 | |
| 807 | zig_extern int32_t __addosi4(int32_t lhs, int32_t rhs, int *overflow); | | |
| 808 | static inline bool zig_addo_i32(int32_t *res, int32_t lhs, int32_t rhs, uint8_t bits) { | 810 | static inline bool zig_addo_i32(int32_t *res, int32_t lhs, int32_t rhs, uint8_t bits) { |
| 809 | #if zig_has_builtin(add_overflow) || defined(zig_gcc) | 811 | #if zig_has_builtin(add_overflow) || defined(zig_gcc) |
| 810 | int32_t full_res; | 812 | int32_t full_res; |
| 811 | bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); | 813 | bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| 812 | #else | 814 | #else |
| 813 | int overflow_int; | 815 | int32_t full_res = (int32_t)((uint32_t)lhs + (uint32_t)rhs); |
| 814 | int32_t full_res = __addosi4(lhs, rhs, &overflow_int); | 816 | bool overflow = ((full_res ^ lhs) & (full_res ^ rhs)) < 0; |
| 815 | bool overflow = overflow_int != 0; | | |
| 816 | #endif | 817 | #endif |
| 817 | *res = zig_wrap_i32(full_res, bits); | 818 | *res = zig_wrap_i32(full_res, bits); |
| 818 | return overflow || full_res < zig_minInt_i(32, bits) || full_res > zig_maxInt_i(32, bits); | 819 | return overflow || full_res < zig_minInt_i(32, bits) || full_res > zig_maxInt_i(32, bits); |
| ... | @@ -830,15 +831,13 @@ static inline bool zig_addo_u64(uint64_t *res, uint64_t lhs, uint64_t rhs, uint8 | ... | @@ -830,15 +831,13 @@ static inline bool zig_addo_u64(uint64_t *res, uint64_t lhs, uint64_t rhs, uint8 |
| 830 | #endif | 831 | #endif |
| 831 | } | 832 | } |
| 832 | | 833 | |
| 833 | zig_extern int64_t __addodi4(int64_t lhs, int64_t rhs, int *overflow); | | |
| 834 | static inline bool zig_addo_i64(int64_t *res, int64_t lhs, int64_t rhs, uint8_t bits) { | 834 | static inline bool zig_addo_i64(int64_t *res, int64_t lhs, int64_t rhs, uint8_t bits) { |
| 835 | #if zig_has_builtin(add_overflow) || defined(zig_gcc) | 835 | #if zig_has_builtin(add_overflow) || defined(zig_gcc) |
| 836 | int64_t full_res; | 836 | int64_t full_res; |
| 837 | bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); | 837 | bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| 838 | #else | 838 | #else |
| 839 | int overflow_int; | 839 | int64_t full_res = (int64_t)((uint64_t)lhs + (uint64_t)rhs); |
| 840 | int64_t full_res = __addodi4(lhs, rhs, &overflow_int); | 840 | bool overflow = ((full_res ^ lhs) & (full_res ^ rhs)) < 0; |
| 841 | bool overflow = overflow_int != 0; | | |
| 842 | #endif | 841 | #endif |
| 843 | *res = zig_wrap_i64(full_res, bits); | 842 | *res = zig_wrap_i64(full_res, bits); |
| 844 | return overflow || full_res < zig_minInt_i(64, bits) || full_res > zig_maxInt_i(64, bits); | 843 | return overflow || full_res < zig_minInt_i(64, bits) || full_res > zig_maxInt_i(64, bits); |
| ... | @@ -912,15 +911,13 @@ static inline bool zig_subo_u32(uint32_t *res, uint32_t lhs, uint32_t rhs, uint8 | ... | @@ -912,15 +911,13 @@ static inline bool zig_subo_u32(uint32_t *res, uint32_t lhs, uint32_t rhs, uint8 |
| 912 | #endif | 911 | #endif |
| 913 | } | 912 | } |
| 914 | | 913 | |
| 915 | zig_extern int32_t __subosi4(int32_t lhs, int32_t rhs, int *overflow); | | |
| 916 | static inline bool zig_subo_i32(int32_t *res, int32_t lhs, int32_t rhs, uint8_t bits) { | 914 | static inline bool zig_subo_i32(int32_t *res, int32_t lhs, int32_t rhs, uint8_t bits) { |
| 917 | #if zig_has_builtin(sub_overflow) || defined(zig_gcc) | 915 | #if zig_has_builtin(sub_overflow) || defined(zig_gcc) |
| 918 | int32_t full_res; | 916 | int32_t full_res; |
| 919 | bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); | 917 | bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| 920 | #else | 918 | #else |
| 921 | int overflow_int; | 919 | int32_t full_res = (int32_t)((uint32_t)lhs - (uint32_t)rhs); |
| 922 | int32_t full_res = __subosi4(lhs, rhs, &overflow_int); | 920 | bool overflow = ((lhs ^ rhs) & (full_res ^ lhs)) < 0; |
| 923 | bool overflow = overflow_int != 0; | | |
| 924 | #endif | 921 | #endif |
| 925 | *res = zig_wrap_i32(full_res, bits); | 922 | *res = zig_wrap_i32(full_res, bits); |
| 926 | return overflow || full_res < zig_minInt_i(32, bits) || full_res > zig_maxInt_i(32, bits); | 923 | return overflow || full_res < zig_minInt_i(32, bits) || full_res > zig_maxInt_i(32, bits); |
| ... | @@ -938,15 +935,13 @@ static inline bool zig_subo_u64(uint64_t *res, uint64_t lhs, uint64_t rhs, uint8 | ... | @@ -938,15 +935,13 @@ static inline bool zig_subo_u64(uint64_t *res, uint64_t lhs, uint64_t rhs, uint8 |
| 938 | #endif | 935 | #endif |
| 939 | } | 936 | } |
| 940 | | 937 | |
| 941 | zig_extern int64_t __subodi4(int64_t lhs, int64_t rhs, int *overflow); | | |
| 942 | static inline bool zig_subo_i64(int64_t *res, int64_t lhs, int64_t rhs, uint8_t bits) { | 938 | static inline bool zig_subo_i64(int64_t *res, int64_t lhs, int64_t rhs, uint8_t bits) { |
| 943 | #if zig_has_builtin(sub_overflow) || defined(zig_gcc) | 939 | #if zig_has_builtin(sub_overflow) || defined(zig_gcc) |
| 944 | int64_t full_res; | 940 | int64_t full_res; |
| 945 | bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); | 941 | bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| 946 | #else | 942 | #else |
| 947 | int overflow_int; | 943 | int64_t full_res = (int64_t)((uint64_t)lhs - (uint64_t)rhs); |
| 948 | int64_t full_res = __subodi4(lhs, rhs, &overflow_int); | 944 | bool overflow = ((lhs ^ rhs) & (full_res ^ lhs)) < 0; |
| 949 | bool overflow = overflow_int != 0; | | |
| 950 | #endif | 945 | #endif |
| 951 | *res = zig_wrap_i64(full_res, bits); | 946 | *res = zig_wrap_i64(full_res, bits); |
| 952 | return overflow || full_res < zig_minInt_i(64, bits) || full_res > zig_maxInt_i(64, bits); | 947 | return overflow || full_res < zig_minInt_i(64, bits) || full_res > zig_maxInt_i(64, bits); |
| ... | @@ -1750,15 +1745,13 @@ static inline bool zig_addo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, uint | ... | @@ -1750,15 +1745,13 @@ static inline bool zig_addo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, uint |
| 1750 | #endif | 1745 | #endif |
| 1751 | } | 1746 | } |
| 1752 | | 1747 | |
| 1753 | zig_extern zig_i128 __addoti4(zig_i128 lhs, zig_i128 rhs, int *overflow); | | |
| 1754 | static inline bool zig_addo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, uint8_t bits) { | 1748 | static inline bool zig_addo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, uint8_t bits) { |
| 1755 | #if zig_has_builtin(add_overflow) | 1749 | #if zig_has_builtin(add_overflow) |
| 1756 | zig_i128 full_res; | 1750 | zig_i128 full_res; |
| 1757 | bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); | 1751 | bool overflow = __builtin_add_overflow(lhs, rhs, &full_res); |
| 1758 | #else | 1752 | #else |
| 1759 | int overflow_int; | 1753 | zig_i128 full_res = (zig_i128)((zig_u128)lhs + (zig_u128)rhs); |
| 1760 | zig_i128 full_res = __addoti4(lhs, rhs, &overflow_int); | 1754 | bool overflow = ((full_res ^ lhs) & (full_res ^ rhs)) < 0; |
| 1761 | bool overflow = overflow_int != 0; | | |
| 1762 | #endif | 1755 | #endif |
| 1763 | *res = zig_wrap_i128(full_res, bits); | 1756 | *res = zig_wrap_i128(full_res, bits); |
| 1764 | return overflow || full_res < zig_minInt_i(128, bits) || full_res > zig_maxInt_i(128, bits); | 1757 | return overflow || full_res < zig_minInt_i(128, bits) || full_res > zig_maxInt_i(128, bits); |
| ... | @@ -1776,15 +1769,13 @@ static inline bool zig_subo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, uint | ... | @@ -1776,15 +1769,13 @@ static inline bool zig_subo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, uint |
| 1776 | #endif | 1769 | #endif |
| 1777 | } | 1770 | } |
| 1778 | | 1771 | |
| 1779 | zig_extern zig_i128 __suboti4(zig_i128 lhs, zig_i128 rhs, int *overflow); | | |
| 1780 | static inline bool zig_subo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, uint8_t bits) { | 1772 | static inline bool zig_subo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, uint8_t bits) { |
| 1781 | #if zig_has_builtin(sub_overflow) | 1773 | #if zig_has_builtin(sub_overflow) |
| 1782 | zig_i128 full_res; | 1774 | zig_i128 full_res; |
| 1783 | bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); | 1775 | bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res); |
| 1784 | #else | 1776 | #else |
| 1785 | int overflow_int; | 1777 | zig_i128 full_res = (zig_i128)((zig_u128)lhs - (zig_u128)rhs); |
| 1786 | zig_i128 full_res = __suboti4(lhs, rhs, &overflow_int); | 1778 | bool overflow = ((lhs ^ rhs) & (full_res ^ lhs)) < 0; |
| 1787 | bool overflow = overflow_int != 0; | | |
| 1788 | #endif | 1779 | #endif |
| 1789 | *res = zig_wrap_i128(full_res, bits); | 1780 | *res = zig_wrap_i128(full_res, bits); |
| 1790 | return overflow || full_res < zig_minInt_i(128, bits) || full_res > zig_maxInt_i(128, bits); | 1781 | return overflow || full_res < zig_minInt_i(128, bits) || full_res > zig_maxInt_i(128, bits); |
| ... | @@ -4213,7 +4204,7 @@ static inline void zig_loongarch_cpucfg(uint32_t word, uint32_t* result) { | ... | @@ -4213,7 +4204,7 @@ static inline void zig_loongarch_cpucfg(uint32_t word, uint32_t* result) { |
| 4213 | #endif | 4204 | #endif |
| 4214 | } | 4205 | } |
| 4215 | | 4206 | |
| 4216 | #elif defined(zig_x86) | 4207 | #elif defined(zig_x86) && !defined(zig_x86_16) |
| 4217 | | 4208 | |
| 4218 | 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) { | 4209 | 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) { |
| 4219 | #if defined(zig_msvc) | 4210 | #if defined(zig_msvc) |