authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-01-03 00:22:39-05:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-02-21 00:27:12-05:00
logb76fed82061823fb1ed1f4ab81296135858ce26c
tree406b8f3a59fb47d0ea5d9231a9b800444cdec050
parent1a1598daf08fabe2b7e154dfb94f0f53e3577895

zig.h: get no int128 path working on non-msvc


1 files changed, 36 insertions(+), 54 deletions(-)

lib/zig.h+36-54
...@@ -1357,10 +1357,10 @@ typedef struct { zig_align(16) int64_t hi; uint64_t lo; } zig_i128;...@@ -1357,10 +1357,10 @@ typedef struct { zig_align(16) int64_t hi; uint64_t lo; } zig_i128;
1357#define zig_make_u128(hi, lo) ((zig_u128){ .h##i = (hi), .l##o = (lo) })1357#define zig_make_u128(hi, lo) ((zig_u128){ .h##i = (hi), .l##o = (lo) })
1358#define zig_make_i128(hi, lo) ((zig_i128){ .h##i = (hi), .l##o = (lo) })1358#define zig_make_i128(hi, lo) ((zig_i128){ .h##i = (hi), .l##o = (lo) })
13591359
1360#if _MSC_VER1360#if _MSC_VER /* MSVC doesn't allow struct literals in constant expressions */
1361#define zig_make_constant_u128(hi, lo) { .h##i = (hi), .l##o = (lo) }1361#define zig_make_constant_u128(hi, lo) { .h##i = (hi), .l##o = (lo) }
1362#define zig_make_constant_i128(hi, lo) { .h##i = (hi), .l##o = (lo) }1362#define zig_make_constant_i128(hi, lo) { .h##i = (hi), .l##o = (lo) }
1363#else1363#else /* But non-MSVC doesn't like the unprotected commas */
1364#define zig_make_constant_u128(hi, lo) zig_make_u128(hi, lo)1364#define zig_make_constant_u128(hi, lo) zig_make_u128(hi, lo)
1365#define zig_make_constant_i128(hi, lo) zig_make_i128(hi, lo)1365#define zig_make_constant_i128(hi, lo) zig_make_i128(hi, lo)
1366#endif1366#endif
...@@ -1421,6 +1421,11 @@ static inline zig_u128 zig_shl_u128(zig_u128 lhs, uint8_t rhs) {...@@ -1421,6 +1421,11 @@ static inline zig_u128 zig_shl_u128(zig_u128 lhs, uint8_t rhs) {
1421 return lhs << rhs;1421 return lhs << rhs;
1422}1422}
14231423
1424static inline zig_i128 zig_shr_i128(zig_i128 lhs, uint8_t rhs) {
1425 zig_i128 sign_mask = lhs < zig_make_i128(0, 0) ? -zig_make_i128(0, 1) : zig_make_i128(0, 0);
1426 return ((lhs ^ sign_mask) >> rhs) ^ sign_mask;
1427}
1428
1424static inline zig_i128 zig_shl_i128(zig_i128 lhs, uint8_t rhs) {1429static inline zig_i128 zig_shl_i128(zig_i128 lhs, uint8_t rhs) {
1425 return lhs << rhs;1430 return lhs << rhs;
1426}1431}
...@@ -1496,6 +1501,12 @@ static inline zig_u128 zig_shl_u128(zig_u128 lhs, uint8_t rhs) {...@@ -1496,6 +1501,12 @@ static inline zig_u128 zig_shl_u128(zig_u128 lhs, uint8_t rhs) {
1496 return (zig_u128){ .hi = lhs.hi << rhs | lhs.lo >> (UINT8_C(64) - rhs), .lo = lhs.lo << rhs };1501 return (zig_u128){ .hi = lhs.hi << rhs | lhs.lo >> (UINT8_C(64) - rhs), .lo = lhs.lo << rhs };
1497}1502}
14981503
1504static inline zig_i128 zig_shr_i128(zig_i128 lhs, uint8_t rhs) {
1505 if (rhs == UINT8_C(0)) return lhs;
1506 if (rhs >= UINT8_C(64)) return (zig_i128){ .hi = zig_shr_i64(lhs.hi, 63), .lo = zig_shr_i64(lhs.hi, (rhs - UINT8_C(64))) };
1507 return (zig_i128){ .hi = zig_shr_i64(lhs.hi, rhs), .lo = lhs.lo >> rhs | (uint64_t)lhs.hi << (UINT8_C(64) - rhs) };
1508}
1509
1499static inline zig_i128 zig_shl_i128(zig_i128 lhs, uint8_t rhs) {1510static inline zig_i128 zig_shl_i128(zig_i128 lhs, uint8_t rhs) {
1500 if (rhs == UINT8_C(0)) return lhs;1511 if (rhs == UINT8_C(0)) return lhs;
1501 if (rhs >= UINT8_C(64)) return (zig_i128){ .hi = lhs.lo << (rhs - UINT8_C(64)), .lo = zig_minInt_u64 };1512 if (rhs >= UINT8_C(64)) return (zig_i128){ .hi = lhs.lo << (rhs - UINT8_C(64)), .lo = zig_minInt_u64 };
...@@ -1527,14 +1538,14 @@ static inline zig_i128 zig_sub_i128(zig_i128 lhs, zig_i128 rhs) {...@@ -1527,14 +1538,14 @@ static inline zig_i128 zig_sub_i128(zig_i128 lhs, zig_i128 rhs) {
1527}1538}
15281539
1529zig_extern zig_i128 __multi3(zig_i128 lhs, zig_i128 rhs);1540zig_extern zig_i128 __multi3(zig_i128 lhs, zig_i128 rhs);
1530static zig_u128 zig_mul_u128(zig_u128 lhs, zig_u128 rhs) {
1531 return zig_bitcast_u128(__multi3(zig_bitcast_i128(lhs), zig_bitcast_i128(rhs)));
1532}
1533
1534static zig_i128 zig_mul_i128(zig_i128 lhs, zig_i128 rhs) {1541static zig_i128 zig_mul_i128(zig_i128 lhs, zig_i128 rhs) {
1535 return __multi3(lhs, rhs);1542 return __multi3(lhs, rhs);
1536}1543}
15371544
1545static zig_u128 zig_mul_u128(zig_u128 lhs, zig_u128 rhs) {
1546 return zig_bitcast_u128(zig_mul_i128(zig_bitcast_i128(lhs), zig_bitcast_i128(rhs)));
1547}
1548
1538zig_extern zig_u128 __udivti3(zig_u128 lhs, zig_u128 rhs);1549zig_extern zig_u128 __udivti3(zig_u128 lhs, zig_u128 rhs);
1539static zig_u128 zig_div_trunc_u128(zig_u128 lhs, zig_u128 rhs) {1550static zig_u128 zig_div_trunc_u128(zig_u128 lhs, zig_u128 rhs) {
1540 return __udivti3(lhs, rhs);1551 return __udivti3(lhs, rhs);
...@@ -1557,7 +1568,7 @@ static zig_i128 zig_rem_i128(zig_i128 lhs, zig_i128 rhs) {...@@ -1557,7 +1568,7 @@ static zig_i128 zig_rem_i128(zig_i128 lhs, zig_i128 rhs) {
15571568
1558static inline zig_i128 zig_mod_i128(zig_i128 lhs, zig_i128 rhs) {1569static inline zig_i128 zig_mod_i128(zig_i128 lhs, zig_i128 rhs) {
1559 zig_i128 rem = zig_rem_i128(lhs, rhs);1570 zig_i128 rem = zig_rem_i128(lhs, rhs);
1560 return zig_add_i128(rem, (((lhs.hi ^ rhs.hi) & rem.hi) < INT64_C(0) ? rhs : zig_make_i128(0, 0)));1571 return zig_add_i128(rem, ((lhs.hi ^ rhs.hi) & rem.hi) < INT64_C(0) ? rhs : zig_make_i128(0, 0));
1561}1572}
15621573
1563static inline zig_i128 zig_div_floor_i128(zig_i128 lhs, zig_i128 rhs) {1574static inline zig_i128 zig_div_floor_i128(zig_i128 lhs, zig_i128 rhs) {
...@@ -1589,11 +1600,6 @@ static inline zig_i128 zig_max_i128(zig_i128 lhs, zig_i128 rhs) {...@@ -1589,11 +1600,6 @@ static inline zig_i128 zig_max_i128(zig_i128 lhs, zig_i128 rhs) {
1589 return zig_cmp_i128(lhs, rhs) > INT32_C(0) ? lhs : rhs;1600 return zig_cmp_i128(lhs, rhs) > INT32_C(0) ? lhs : rhs;
1590}1601}
15911602
1592static inline zig_i128 zig_shr_i128(zig_i128 lhs, uint8_t rhs) {
1593 zig_i128 sign_mask = zig_cmp_i128(lhs, zig_make_i128(0, 0)) < INT32_C(0) ? zig_sub_i128(zig_make_i128(0, 0), zig_make_i128(0, 1)) : zig_make_i128(0, 0);
1594 return zig_xor_i128(zig_bitcast_i128(zig_shr_u128(zig_bitcast_u128(zig_xor_i128(lhs, sign_mask)), rhs)), sign_mask);
1595}
1596
1597static inline zig_u128 zig_wrap_u128(zig_u128 val, uint8_t bits) {1603static inline zig_u128 zig_wrap_u128(zig_u128 val, uint8_t bits) {
1598 return zig_and_u128(val, zig_maxInt_u(128, bits));1604 return zig_and_u128(val, zig_maxInt_u(128, bits));
1599}1605}
...@@ -1716,50 +1722,28 @@ static inline bool zig_mulo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, uint...@@ -1716,50 +1722,28 @@ static inline bool zig_mulo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, uint
17161722
1717#else /* zig_has_int128 */1723#else /* zig_has_int128 */
17181724
1719static inline bool zig_overflow_u128(bool overflow, zig_u128 full_res, uint8_t bits) {
1720 return overflow ||
1721 zig_cmp_u128(full_res, zig_minInt_u(128, bits)) < INT32_C(0) ||
1722 zig_cmp_u128(full_res, zig_maxInt_u(128, bits)) > INT32_C(0);
1723}
1724
1725static inline bool zig_overflow_i128(bool overflow, zig_i128 full_res, uint8_t bits) {
1726 return overflow ||
1727 zig_cmp_i128(full_res, zig_minInt_i(128, bits)) < INT32_C(0) ||
1728 zig_cmp_i128(full_res, zig_maxInt_i(128, bits)) > INT32_C(0);
1729}
1730
1731static inline bool zig_addo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, uint8_t bits) {1725static inline bool zig_addo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, uint8_t bits) {
1732 zig_u128 full_res;1726 uint64_t hi;
1733 bool overflow =1727 bool overflow = zig_addo_u64(&hi, lhs.hi, rhs.hi, bits - 64);
1734 zig_addo_u64(&full_res.hi, lhs.hi, rhs.hi, 64) |1728 return overflow ^ zig_addo_u64(&res->hi, hi, zig_addo_u64(&res->lo, lhs.lo, rhs.lo, 64), bits - 64);
1735 zig_addo_u64(&full_res.hi, full_res.hi, zig_addo_u64(&full_res.lo, lhs.lo, rhs.lo, 64), 64);
1736 *res = zig_wrap_u128(full_res, bits);
1737 return zig_overflow_u128(overflow, full_res, bits);
1738}1729}
17391730
1740zig_extern zig_i128 __addoti4(zig_i128 lhs, zig_i128 rhs, int *overflow);
1741static inline bool zig_addo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, uint8_t bits) {1731static inline bool zig_addo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, uint8_t bits) {
1742 int overflow_int;1732 int64_t hi;
1743 zig_i128 full_res = __addoti4(lhs, rhs, &overflow_int);1733 bool overflow = zig_addo_i64(&hi, lhs.hi, rhs.hi, bits - 64);
1744 *res = zig_wrap_i128(full_res, bits);1734 return overflow ^ zig_addo_i64(&res->hi, hi, zig_addo_u64(&res->lo, lhs.lo, rhs.lo, 64), bits - 64);
1745 return zig_overflow_i128(overflow_int, full_res, bits);
1746}1735}
17471736
1748static inline bool zig_subo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, uint8_t bits) {1737static inline bool zig_subo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, uint8_t bits) {
1749 zig_u128 full_res;1738 uint64_t hi;
1750 bool overflow =1739 bool overflow = zig_subo_u64(&hi, lhs.hi, rhs.hi, bits - 64);
1751 zig_subo_u64(&full_res.hi, lhs.hi, rhs.hi, 64) |1740 return overflow ^ zig_subo_u64(&res->hi, hi, zig_subo_u64(&res->lo, lhs.lo, rhs.lo, 64), bits - 64);
1752 zig_subo_u64(&full_res.hi, full_res.hi, zig_subo_u64(&full_res.lo, lhs.lo, rhs.lo, 64), 64);
1753 *res = zig_wrap_u128(full_res, bits);
1754 return zig_overflow_u128(overflow, full_res, bits);
1755}1741}
17561742
1757zig_extern zig_i128 __suboti4(zig_i128 lhs, zig_i128 rhs, int *overflow);
1758static inline bool zig_subo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, uint8_t bits) {1743static inline bool zig_subo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, uint8_t bits) {
1759 int overflow_int;1744 int64_t hi;
1760 zig_i128 full_res = __suboti4(lhs, rhs, &overflow_int);1745 bool overflow = zig_subo_i64(&hi, lhs.hi, rhs.hi, bits - 64);
1761 *res = zig_wrap_i128(full_res, bits);1746 return overflow ^ zig_subo_i64(&res->hi, hi, zig_subo_u64(&res->lo, lhs.lo, rhs.lo, 64), bits - 64);
1762 return zig_overflow_i128(overflow_int, full_res, bits);
1763}1747}
17641748
1765static inline bool zig_mulo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, uint8_t bits) {1749static inline bool zig_mulo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, uint8_t bits) {
...@@ -1772,8 +1756,11 @@ zig_extern zig_i128 __muloti4(zig_i128 lhs, zig_i128 rhs, int *overflow);...@@ -1772,8 +1756,11 @@ zig_extern zig_i128 __muloti4(zig_i128 lhs, zig_i128 rhs, int *overflow);
1772static inline bool zig_mulo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, uint8_t bits) {1756static inline bool zig_mulo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, uint8_t bits) {
1773 int overflow_int;1757 int overflow_int;
1774 zig_i128 full_res = __muloti4(lhs, rhs, &overflow_int);1758 zig_i128 full_res = __muloti4(lhs, rhs, &overflow_int);
1759 bool overflow = overflow_int != 0 ||
1760 zig_cmp_i128(full_res, zig_minInt_i(128, bits)) < INT32_C(0) ||
1761 zig_cmp_i128(full_res, zig_maxInt_i(128, bits)) > INT32_C(0);
1775 *res = zig_wrap_i128(full_res, bits);1762 *res = zig_wrap_i128(full_res, bits);
1776 return zig_overflow_i128(overflow_int, full_res, bits);1763 return overflow;
1777}1764}
17781765
1779#endif /* zig_has_int128 */1766#endif /* zig_has_int128 */
...@@ -1794,17 +1781,12 @@ static inline zig_u128 zig_shls_u128(zig_u128 lhs, zig_u128 rhs, uint8_t bits) {...@@ -1794,17 +1781,12 @@ static inline zig_u128 zig_shls_u128(zig_u128 lhs, zig_u128 rhs, uint8_t bits) {
1794 zig_u128 res;1781 zig_u128 res;
1795 if (zig_cmp_u128(rhs, zig_make_u128(0, bits)) >= INT32_C(0))1782 if (zig_cmp_u128(rhs, zig_make_u128(0, bits)) >= INT32_C(0))
1796 return zig_cmp_u128(lhs, zig_make_u128(0, 0)) != INT32_C(0) ? zig_maxInt_u(128, bits) : lhs;1783 return zig_cmp_u128(lhs, zig_make_u128(0, 0)) != INT32_C(0) ? zig_maxInt_u(128, bits) : lhs;
17971784 return zig_shlo_u128(&res, lhs, (uint8_t)zig_lo_u128(rhs), bits) ? zig_maxInt_u(128, bits) : res;
1798#if zig_has_int128
1799 return zig_shlo_u128(&res, lhs, (uint8_t)rhs, bits) ? zig_maxInt_u(128, bits) : res;
1800#else
1801 return zig_shlo_u128(&res, lhs, (uint8_t)rhs.lo, bits) ? zig_maxInt_u(128, bits) : res;
1802#endif
1803}1785}
18041786
1805static inline zig_i128 zig_shls_i128(zig_i128 lhs, zig_i128 rhs, uint8_t bits) {1787static inline zig_i128 zig_shls_i128(zig_i128 lhs, zig_i128 rhs, uint8_t bits) {
1806 zig_i128 res;1788 zig_i128 res;
1807 if (zig_cmp_u128(zig_bitcast_u128(rhs), zig_make_u128(0, bits)) < INT32_C(0) && !zig_shlo_i128(&res, lhs, zig_lo_i128(rhs), bits)) return res;1789 if (zig_cmp_u128(zig_bitcast_u128(rhs), zig_make_u128(0, bits)) < INT32_C(0) && !zig_shlo_i128(&res, lhs, (uint8_t)zig_lo_i128(rhs), bits)) return res;
1808 return zig_cmp_i128(lhs, zig_make_i128(0, 0)) < INT32_C(0) ? zig_minInt_i(128, bits) : zig_maxInt_i(128, bits);1790 return zig_cmp_i128(lhs, zig_make_i128(0, 0)) < INT32_C(0) ? zig_minInt_i(128, bits) : zig_maxInt_i(128, bits);
1809}1791}
18101792