authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2025-11-09 20:46:06+00:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2025-11-12 16:00:16+00:00
log5df5e2ed267deba810811831060a6e1a3593b0f5
treee84d74e532f9bca64ca546ed8374e9068db3fd6c
parent69f39868b4125e79e4070a88bbdfcd3643dbc90d
signaturelock-open Commit is signed but in an unrecognized format.

zig.h: drop dependency on deleted compiler_rt functions

It turns out we did use these in the C backend. However, it's really just as easy, if not easier, to replicate the logic directly in C. Synchronizes stage1/zig.h to make sure the bootstrap doesn't depend on these functions either. The actual zig1 tarball is unmodified because regenerating it is unnecessary in this instance.

2 files changed, 37 insertions(+), 58 deletions(-)

lib/zig.h+12-24
...@@ -809,15 +809,13 @@ static inline bool zig_addo_u32(uint32_t *res, uint32_t lhs, uint32_t rhs, uint8...@@ -809,15 +809,13 @@ static inline bool zig_addo_u32(uint32_t *res, uint32_t lhs, uint32_t rhs, uint8
809#endif809#endif
810}810}
811811
812zig_extern int32_t __addosi4(int32_t lhs, int32_t rhs, int *overflow);
813static inline bool zig_addo_i32(int32_t *res, int32_t lhs, int32_t rhs, uint8_t bits) {812static inline bool zig_addo_i32(int32_t *res, int32_t lhs, int32_t rhs, uint8_t bits) {
814#if zig_has_builtin(add_overflow) || defined(zig_gcc)813#if zig_has_builtin(add_overflow) || defined(zig_gcc)
815 int32_t full_res;814 int32_t full_res;
816 bool overflow = __builtin_add_overflow(lhs, rhs, &full_res);815 bool overflow = __builtin_add_overflow(lhs, rhs, &full_res);
817#else816#else
818 int overflow_int;817 int32_t full_res = (int32_t)((uint32_t)lhs + (uint32_t)rhs);
819 int32_t full_res = __addosi4(lhs, rhs, &overflow_int);818 bool overflow = ((full_res ^ lhs) & (full_res ^ rhs)) < 0;
820 bool overflow = overflow_int != 0;
821#endif819#endif
822 *res = zig_wrap_i32(full_res, bits);820 *res = zig_wrap_i32(full_res, bits);
823 return overflow || full_res < zig_minInt_i(32, bits) || full_res > zig_maxInt_i(32, bits);821 return overflow || full_res < zig_minInt_i(32, bits) || full_res > zig_maxInt_i(32, bits);
...@@ -835,15 +833,13 @@ static inline bool zig_addo_u64(uint64_t *res, uint64_t lhs, uint64_t rhs, uint8...@@ -835,15 +833,13 @@ static inline bool zig_addo_u64(uint64_t *res, uint64_t lhs, uint64_t rhs, uint8
835#endif833#endif
836}834}
837835
838zig_extern int64_t __addodi4(int64_t lhs, int64_t rhs, int *overflow);
839static inline bool zig_addo_i64(int64_t *res, int64_t lhs, int64_t rhs, uint8_t bits) {836static inline bool zig_addo_i64(int64_t *res, int64_t lhs, int64_t rhs, uint8_t bits) {
840#if zig_has_builtin(add_overflow) || defined(zig_gcc)837#if zig_has_builtin(add_overflow) || defined(zig_gcc)
841 int64_t full_res;838 int64_t full_res;
842 bool overflow = __builtin_add_overflow(lhs, rhs, &full_res);839 bool overflow = __builtin_add_overflow(lhs, rhs, &full_res);
843#else840#else
844 int overflow_int;841 int64_t full_res = (int64_t)((uint64_t)lhs + (uint64_t)rhs);
845 int64_t full_res = __addodi4(lhs, rhs, &overflow_int);842 bool overflow = ((full_res ^ lhs) & (full_res ^ rhs)) < 0;
846 bool overflow = overflow_int != 0;
847#endif843#endif
848 *res = zig_wrap_i64(full_res, bits);844 *res = zig_wrap_i64(full_res, bits);
849 return overflow || full_res < zig_minInt_i(64, bits) || full_res > zig_maxInt_i(64, bits);845 return overflow || full_res < zig_minInt_i(64, bits) || full_res > zig_maxInt_i(64, bits);
...@@ -917,15 +913,13 @@ static inline bool zig_subo_u32(uint32_t *res, uint32_t lhs, uint32_t rhs, uint8...@@ -917,15 +913,13 @@ static inline bool zig_subo_u32(uint32_t *res, uint32_t lhs, uint32_t rhs, uint8
917#endif913#endif
918}914}
919915
920zig_extern int32_t __subosi4(int32_t lhs, int32_t rhs, int *overflow);
921static inline bool zig_subo_i32(int32_t *res, int32_t lhs, int32_t rhs, uint8_t bits) {916static inline bool zig_subo_i32(int32_t *res, int32_t lhs, int32_t rhs, uint8_t bits) {
922#if zig_has_builtin(sub_overflow) || defined(zig_gcc)917#if zig_has_builtin(sub_overflow) || defined(zig_gcc)
923 int32_t full_res;918 int32_t full_res;
924 bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res);919 bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res);
925#else920#else
926 int overflow_int;921 int32_t full_res = (int32_t)((uint32_t)lhs - (uint32_t)rhs);
927 int32_t full_res = __subosi4(lhs, rhs, &overflow_int);922 bool overflow = ((lhs ^ rhs) & (full_res ^ lhs)) < 0;
928 bool overflow = overflow_int != 0;
929#endif923#endif
930 *res = zig_wrap_i32(full_res, bits);924 *res = zig_wrap_i32(full_res, bits);
931 return overflow || full_res < zig_minInt_i(32, bits) || full_res > zig_maxInt_i(32, bits);925 return overflow || full_res < zig_minInt_i(32, bits) || full_res > zig_maxInt_i(32, bits);
...@@ -943,15 +937,13 @@ static inline bool zig_subo_u64(uint64_t *res, uint64_t lhs, uint64_t rhs, uint8...@@ -943,15 +937,13 @@ static inline bool zig_subo_u64(uint64_t *res, uint64_t lhs, uint64_t rhs, uint8
943#endif937#endif
944}938}
945939
946zig_extern int64_t __subodi4(int64_t lhs, int64_t rhs, int *overflow);
947static inline bool zig_subo_i64(int64_t *res, int64_t lhs, int64_t rhs, uint8_t bits) {940static inline bool zig_subo_i64(int64_t *res, int64_t lhs, int64_t rhs, uint8_t bits) {
948#if zig_has_builtin(sub_overflow) || defined(zig_gcc)941#if zig_has_builtin(sub_overflow) || defined(zig_gcc)
949 int64_t full_res;942 int64_t full_res;
950 bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res);943 bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res);
951#else944#else
952 int overflow_int;945 int64_t full_res = (int64_t)((uint64_t)lhs - (uint64_t)rhs);
953 int64_t full_res = __subodi4(lhs, rhs, &overflow_int);946 bool overflow = ((lhs ^ rhs) & (full_res ^ lhs)) < 0;
954 bool overflow = overflow_int != 0;
955#endif947#endif
956 *res = zig_wrap_i64(full_res, bits);948 *res = zig_wrap_i64(full_res, bits);
957 return overflow || full_res < zig_minInt_i(64, bits) || full_res > zig_maxInt_i(64, bits);949 return overflow || full_res < zig_minInt_i(64, bits) || full_res > zig_maxInt_i(64, bits);
...@@ -1755,15 +1747,13 @@ static inline bool zig_addo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, uint...@@ -1755,15 +1747,13 @@ static inline bool zig_addo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, uint
1755#endif1747#endif
1756}1748}
17571749
1758zig_extern zig_i128 __addoti4(zig_i128 lhs, zig_i128 rhs, int *overflow);
1759static inline bool zig_addo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, uint8_t bits) {1750static inline bool zig_addo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, uint8_t bits) {
1760#if zig_has_builtin(add_overflow)1751#if zig_has_builtin(add_overflow)
1761 zig_i128 full_res;1752 zig_i128 full_res;
1762 bool overflow = __builtin_add_overflow(lhs, rhs, &full_res);1753 bool overflow = __builtin_add_overflow(lhs, rhs, &full_res);
1763#else1754#else
1764 int overflow_int;1755 zig_i128 full_res = (zig_i128)((zig_u128)lhs + (zig_u128)rhs);
1765 zig_i128 full_res = __addoti4(lhs, rhs, &overflow_int);1756 bool overflow = ((full_res ^ lhs) & (full_res ^ rhs)) < 0;
1766 bool overflow = overflow_int != 0;
1767#endif1757#endif
1768 *res = zig_wrap_i128(full_res, bits);1758 *res = zig_wrap_i128(full_res, bits);
1769 return overflow || full_res < zig_minInt_i(128, bits) || full_res > zig_maxInt_i(128, bits);1759 return overflow || full_res < zig_minInt_i(128, bits) || full_res > zig_maxInt_i(128, bits);
...@@ -1781,15 +1771,13 @@ static inline bool zig_subo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, uint...@@ -1781,15 +1771,13 @@ static inline bool zig_subo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, uint
1781#endif1771#endif
1782}1772}
17831773
1784zig_extern zig_i128 __suboti4(zig_i128 lhs, zig_i128 rhs, int *overflow);
1785static inline bool zig_subo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, uint8_t bits) {1774static inline bool zig_subo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, uint8_t bits) {
1786#if zig_has_builtin(sub_overflow)1775#if zig_has_builtin(sub_overflow)
1787 zig_i128 full_res;1776 zig_i128 full_res;
1788 bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res);1777 bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res);
1789#else1778#else
1790 int overflow_int;1779 zig_i128 full_res = (zig_i128)((zig_u128)lhs - (zig_u128)rhs);
1791 zig_i128 full_res = __suboti4(lhs, rhs, &overflow_int);1780 bool overflow = ((lhs ^ rhs) & (full_res ^ lhs)) < 0;
1792 bool overflow = overflow_int != 0;
1793#endif1781#endif
1794 *res = zig_wrap_i128(full_res, bits);1782 *res = zig_wrap_i128(full_res, bits);
1795 return overflow || full_res < zig_minInt_i(128, bits) || full_res > zig_maxInt_i(128, bits);1783 return overflow || full_res < zig_minInt_i(128, bits) || full_res > zig_maxInt_i(128, bits);
stage1/zig.h+25-34
...@@ -40,6 +40,8 @@...@@ -40,6 +40,8 @@
40#elif defined(__mips__)40#elif defined(__mips__)
41#define zig_mips3241#define zig_mips32
42#define zig_mips42#define zig_mips
43#elif defined(__or1k__)
44#define zig_or1k
43#elif defined(__powerpc64__)45#elif defined(__powerpc64__)
44#define zig_powerpc6446#define zig_powerpc64
45#define zig_powerpc47#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_6475#define zig_x86_64
74#define zig_x8676#define zig_x86
77#elif defined(__I86__)
78#define zig_x86_16
79#define zig_x86
75#endif80#endif
7681
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 187#define zig_big_endian 1
83#endif88#endif
8489
85#if defined(_AIX)90#if defined(__MACH__)
86#define zig_aix
87#elif defined(__MACH__)
88#define zig_darwin91#define zig_darwin
89#elif defined(__DragonFly__)92#elif defined(__DragonFly__)
90#define zig_dragonfly93#define zig_dragonfly
...@@ -114,20 +117,14 @@...@@ -114,20 +117,14 @@
114#define zig_wasi117#define zig_wasi
115#elif defined(_WIN32)118#elif defined(_WIN32)
116#define zig_windows119#define zig_windows
117#elif defined(__MVS__)
118#define zig_zos
119#endif120#endif
120121
121#if defined(zig_windows)122#if defined(zig_windows)
122#define zig_coff123#define zig_coff
123#elif defined(__ELF__)124#elif defined(__ELF__)
124#define zig_elf125#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_macho127#define zig_macho
129#elif defined(zig_aix)
130#define zig_xcoff
131#endif128#endif
132129
133#define zig_concat(lhs, rhs) lhs##rhs130#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#else402#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#endif807#endif
805}808}
806809
807zig_extern int32_t __addosi4(int32_t lhs, int32_t rhs, int *overflow);
808static inline bool zig_addo_i32(int32_t *res, int32_t lhs, int32_t rhs, uint8_t bits) {810static 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#else814#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#endif817#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#endif831#endif
831}832}
832833
833zig_extern int64_t __addodi4(int64_t lhs, int64_t rhs, int *overflow);
834static inline bool zig_addo_i64(int64_t *res, int64_t lhs, int64_t rhs, uint8_t bits) {834static 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#else838#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#endif841#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#endif911#endif
913}912}
914913
915zig_extern int32_t __subosi4(int32_t lhs, int32_t rhs, int *overflow);
916static inline bool zig_subo_i32(int32_t *res, int32_t lhs, int32_t rhs, uint8_t bits) {914static 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#else918#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#endif921#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#endif935#endif
939}936}
940937
941zig_extern int64_t __subodi4(int64_t lhs, int64_t rhs, int *overflow);
942static inline bool zig_subo_i64(int64_t *res, int64_t lhs, int64_t rhs, uint8_t bits) {938static 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#else942#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#endif945#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#endif1745#endif
1751}1746}
17521747
1753zig_extern zig_i128 __addoti4(zig_i128 lhs, zig_i128 rhs, int *overflow);
1754static inline bool zig_addo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, uint8_t bits) {1748static 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#else1752#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#endif1755#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#endif1769#endif
1777}1770}
17781771
1779zig_extern zig_i128 __suboti4(zig_i128 lhs, zig_i128 rhs, int *overflow);
1780static inline bool zig_subo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, uint8_t bits) {1772static 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#else1776#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#endif1779#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#endif4204#endif
4214}4205}
42154206
4216#elif defined(zig_x86)4207#elif defined(zig_x86) && !defined(zig_x86_16)
42174208
4218static inline void zig_x86_cpuid(uint32_t leaf_id, uint32_t subid, uint32_t* eax, uint32_t* ebx, uint32_t* ecx, uint32_t* edx) {4209static 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)