| ... | @@ -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) }) |
| 1359 | | 1359 | |
| 1360 | #if _MSC_VER | 1360 | #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 | #else | 1363 | #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 | #endif | 1366 | #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 | } |
| 1423 | | 1423 | |
| | 1424 | static 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 | |
| 1424 | static inline zig_i128 zig_shl_i128(zig_i128 lhs, uint8_t rhs) { | 1429 | static 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 | } |
| 1498 | | 1503 | |
| | 1504 | static 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 | |
| 1499 | static inline zig_i128 zig_shl_i128(zig_i128 lhs, uint8_t rhs) { | 1510 | static 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 | } |
| 1528 | | 1539 | |
| 1529 | zig_extern zig_i128 __multi3(zig_i128 lhs, zig_i128 rhs); | 1540 | zig_extern zig_i128 __multi3(zig_i128 lhs, zig_i128 rhs); |
| 1530 | static 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 | | | |
| 1534 | static zig_i128 zig_mul_i128(zig_i128 lhs, zig_i128 rhs) { | 1541 | static zig_i128 zig_mul_i128(zig_i128 lhs, zig_i128 rhs) { |
| 1535 | return __multi3(lhs, rhs); | 1542 | return __multi3(lhs, rhs); |
| 1536 | } | 1543 | } |
| 1537 | | 1544 | |
| | 1545 | static 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 | |
| 1538 | zig_extern zig_u128 __udivti3(zig_u128 lhs, zig_u128 rhs); | 1549 | zig_extern zig_u128 __udivti3(zig_u128 lhs, zig_u128 rhs); |
| 1539 | static zig_u128 zig_div_trunc_u128(zig_u128 lhs, zig_u128 rhs) { | 1550 | static 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) { |
| 1557 | | 1568 | |
| 1558 | static inline zig_i128 zig_mod_i128(zig_i128 lhs, zig_i128 rhs) { | 1569 | static 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 | } |
| 1562 | | 1573 | |
| 1563 | static inline zig_i128 zig_div_floor_i128(zig_i128 lhs, zig_i128 rhs) { | 1574 | static 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 | } |
| 1591 | | 1602 | |
| 1592 | static 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 | | | |
| 1597 | static inline zig_u128 zig_wrap_u128(zig_u128 val, uint8_t bits) { | 1603 | static 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 |
| 1716 | | 1722 | |
| 1717 | #else /* zig_has_int128 */ | 1723 | #else /* zig_has_int128 */ |
| 1718 | | 1724 | |
| 1719 | static 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 | | | |
| 1725 | static 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 | | | |
| 1731 | static inline bool zig_addo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, uint8_t bits) { | 1725 | static 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 | } |
| 1739 | | 1730 | |
| 1740 | zig_extern zig_i128 __addoti4(zig_i128 lhs, zig_i128 rhs, int *overflow); | | |
| 1741 | static inline bool zig_addo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, uint8_t bits) { | 1731 | static 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 | } |
| 1747 | | 1736 | |
| 1748 | static inline bool zig_subo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, uint8_t bits) { | 1737 | static 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 | } |
| 1756 | | 1742 | |
| 1757 | zig_extern zig_i128 __suboti4(zig_i128 lhs, zig_i128 rhs, int *overflow); | | |
| 1758 | static inline bool zig_subo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, uint8_t bits) { | 1743 | static 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 | } |
| 1764 | | 1748 | |
| 1765 | static inline bool zig_mulo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, uint8_t bits) { | 1749 | static 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); |
| 1772 | static inline bool zig_mulo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, uint8_t bits) { | 1756 | static 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 | } |
| 1778 | | 1765 | |
| 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; |
| 1797 | | 1784 | 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 | } |
| 1804 | | 1786 | |
| 1805 | static inline zig_i128 zig_shls_i128(zig_i128 lhs, zig_i128 rhs, uint8_t bits) { | 1787 | static 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 | } |
| 1810 | | 1792 | |