| ... | ... | @@ -1445,18 +1445,6 @@ static inline zig_i128 zig_mulw_i128(zig_i128 lhs, zig_i128 rhs, zig_u8 bits) { |
| 1445 | 1445 | |
| 1446 | 1446 | #if zig_has_int128 |
| 1447 | 1447 | |
| 1448 | | static inline bool zig_shlo_u128(zig_u128 *res, zig_u128 lhs, zig_u8 rhs, zig_u8 bits) { |
| 1449 | | *res = zig_shlw_u128(lhs, rhs, bits); |
| 1450 | | return zig_cmp_u128(lhs, zig_shr_u128(zig_maxInt(u128, bits), rhs)) > zig_as_i32(0); |
| 1451 | | } |
| 1452 | | |
| 1453 | | static inline bool zig_shlo_i128(zig_i128 *res, zig_i128 lhs, zig_u8 rhs, zig_u8 bits) { |
| 1454 | | *res = zig_shlw_i128(lhs, rhs, bits); |
| 1455 | | zig_i128 mask = zig_bitcast_i128(zig_shl_u128(zig_maxInt_u128, bits - rhs - zig_as_u8(1))); |
| 1456 | | return zig_cmp_i128(zig_and_i128(lhs, mask), zig_as_i128(0, 0)) != zig_as_i32(0) && |
| 1457 | | zig_cmp_i128(zig_and_i128(lhs, mask), mask) != zig_as_i32(0); |
| 1458 | | } |
| 1459 | | |
| 1460 | 1448 | static inline bool zig_addo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, zig_u8 bits) { |
| 1461 | 1449 | #if zig_has_builtin(add_overflow) |
| 1462 | 1450 | zig_u128 full_res; |
| ... | ... | @@ -1537,18 +1525,80 @@ static inline bool zig_mulo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, zig_ |
| 1537 | 1525 | |
| 1538 | 1526 | #else /* zig_has_int128 */ |
| 1539 | 1527 | |
| 1540 | | /* static inline bool zig_addo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs) { */ |
| 1541 | | /* return zig_addo_u64(&res->hi, lhs.hi, rhs.hi, UINT64_MAX) | */ |
| 1542 | | /* zig_addo_u64(&res->hi, res->hi, zig_addo_u64(&res->lo, lhs.lo, rhs.lo, UINT64_MAX)); */ |
| 1543 | | /* } */ |
| 1528 | static inline bool zig_overflow_u128(bool overflow, zig_u128 full_res, zig_u8 bits) { |
| 1529 | return overflow || |
| 1530 | zig_cmp_u128(full_res, zig_minInt(u128, bits)) < zig_as_i32(0) || |
| 1531 | zig_cmp_u128(full_res, zig_maxInt(u128, bits)) > zig_as_i32(0); |
| 1532 | } |
| 1533 | |
| 1534 | static inline bool zig_overflow_i128(bool overflow, zig_i128 full_res, zig_u8 bits) { |
| 1535 | return overflow || |
| 1536 | zig_cmp_i128(full_res, zig_minInt(i128, bits)) < zig_as_i32(0) || |
| 1537 | zig_cmp_i128(full_res, zig_maxInt(i128, bits)) > zig_as_i32(0); |
| 1538 | } |
| 1539 | |
| 1540 | static inline bool zig_addo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, zig_u8 bits) { |
| 1541 | zig_u128 full_res; |
| 1542 | bool overflow = |
| 1543 | zig_addo_u64(&full_res.hi, lhs.hi, rhs.hi, 64) | |
| 1544 | zig_addo_u64(&full_res.hi, full_res.hi, zig_addo_u64(&full_res.lo, lhs.lo, rhs.lo, 64), 64); |
| 1545 | *res = zig_wrap_u128(full_res, bits); |
| 1546 | return zig_overflow_u128(overflow, full_res, bits); |
| 1547 | } |
| 1548 | |
| 1549 | zig_extern zig_i128 __addoti4(zig_i128 lhs, zig_i128 rhs, zig_c_int *overflow); |
| 1550 | static inline bool zig_addo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, zig_u8 bits) { |
| 1551 | zig_c_int overflow_int; |
| 1552 | zig_i128 full_res = __addoti4(lhs, rhs, &overflow_int); |
| 1553 | *res = zig_wrap_i128(full_res, bits); |
| 1554 | return zig_overflow_i128(overflow_int, full_res, bits); |
| 1555 | } |
| 1556 | |
| 1557 | static inline bool zig_subo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, zig_u8 bits) { |
| 1558 | zig_u128 full_res; |
| 1559 | bool overflow = |
| 1560 | zig_subo_u64(&full_res.hi, lhs.hi, rhs.hi, 64) | |
| 1561 | zig_subo_u64(&full_res.hi, full_res.hi, zig_subo_u64(&full_res.lo, lhs.lo, rhs.lo, 64), 64); |
| 1562 | *res = zig_wrap_u128(full_res, bits); |
| 1563 | return zig_overflow_u128(overflow, full_res, bits); |
| 1564 | } |
| 1565 | |
| 1566 | zig_extern zig_i128 __suboti4(zig_i128 lhs, zig_i128 rhs, zig_c_int *overflow); |
| 1567 | static inline bool zig_subo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, zig_u8 bits) { |
| 1568 | zig_c_int overflow_int; |
| 1569 | zig_i128 full_res = __suboti4(lhs, rhs, &overflow_int); |
| 1570 | *res = zig_wrap_i128(full_res, bits); |
| 1571 | return zig_overflow_i128(overflow_int, full_res, bits); |
| 1572 | } |
| 1573 | |
| 1574 | static inline bool zig_mulo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, zig_u8 bits) { |
| 1575 | *res = zig_mulw_u128(lhs, rhs, bits); |
| 1576 | return zig_cmp_u128(*res, zig_as_u128(0, 0)) != zig_as_i32(0) && |
| 1577 | zig_cmp_u128(lhs, zig_div_trunc_u128(zig_maxInt(u128, bits), rhs)) > zig_as_i32(0); |
| 1578 | } |
| 1544 | 1579 | |
| 1545 | | /* static inline bool zig_subo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs) { */ |
| 1546 | | /* return zig_subo_u64(&res->hi, lhs.hi, rhs.hi, UINT64_MAX) | */ |
| 1547 | | /* zig_subo_u64(&res->hi, res->hi, zig_subo_u64(&res->lo, lhs.lo, rhs.lo, UINT64_MAX)); */ |
| 1548 | | /* } */ |
| 1580 | zig_extern zig_i128 __muloti4(zig_i128 lhs, zig_i128 rhs, zig_c_int *overflow); |
| 1581 | static inline bool zig_mulo_i128(zig_i128 *res, zig_i128 lhs, zig_i128 rhs, zig_u8 bits) { |
| 1582 | zig_c_int overflow_int; |
| 1583 | zig_i128 full_res = __muloti4(lhs, rhs, &overflow_int); |
| 1584 | *res = zig_wrap_i128(full_res, bits); |
| 1585 | return zig_overflow_i128(overflow_int, full_res, bits); |
| 1586 | } |
| 1549 | 1587 | |
| 1550 | 1588 | #endif /* zig_has_int128 */ |
| 1551 | 1589 | |
| 1590 | static inline bool zig_shlo_u128(zig_u128 *res, zig_u128 lhs, zig_u8 rhs, zig_u8 bits) { |
| 1591 | *res = zig_shlw_u128(lhs, rhs, bits); |
| 1592 | return zig_cmp_u128(lhs, zig_shr_u128(zig_maxInt(u128, bits), rhs)) > zig_as_i32(0); |
| 1593 | } |
| 1594 | |
| 1595 | static inline bool zig_shlo_i128(zig_i128 *res, zig_i128 lhs, zig_u8 rhs, zig_u8 bits) { |
| 1596 | *res = zig_shlw_i128(lhs, rhs, bits); |
| 1597 | zig_i128 mask = zig_bitcast_i128(zig_shl_u128(zig_maxInt_u128, bits - rhs - zig_as_u8(1))); |
| 1598 | return zig_cmp_i128(zig_and_i128(lhs, mask), zig_as_i128(0, 0)) != zig_as_i32(0) && |
| 1599 | zig_cmp_i128(zig_and_i128(lhs, mask), mask) != zig_as_i32(0); |
| 1600 | } |
| 1601 | |
| 1552 | 1602 | static inline zig_u128 zig_shls_u128(zig_u128 lhs, zig_u128 rhs, zig_u8 bits) { |
| 1553 | 1603 | zig_u128 res; |
| 1554 | 1604 | if (zig_cmp_u128(rhs, zig_as_u128(0, bits)) >= zig_as_i32(0)) |
| ... | ... | @@ -1563,7 +1613,7 @@ static inline zig_u128 zig_shls_u128(zig_u128 lhs, zig_u128 rhs, zig_u8 bits) { |
| 1563 | 1613 | |
| 1564 | 1614 | static inline zig_i128 zig_shls_i128(zig_i128 lhs, zig_i128 rhs, zig_u8 bits) { |
| 1565 | 1615 | zig_i128 res; |
| 1566 | | if (zig_cmp_u128(zig_bitcast_u128(rhs), zig_as_u128(0, bits)) < zig_as_i32(0) && !zig_shlo_i128(&res, lhs, rhs, bits)) return res; |
| 1616 | if (zig_cmp_u128(zig_bitcast_u128(rhs), zig_as_u128(0, bits)) < zig_as_i32(0) && !zig_shlo_i128(&res, lhs, zig_lo_i128(rhs), bits)) return res; |
| 1567 | 1617 | return zig_cmp_i128(lhs, zig_as_i128(0, 0)) < zig_as_i32(0) ? zig_minInt(i128, bits) : zig_maxInt(i128, bits); |
| 1568 | 1618 | } |
| 1569 | 1619 | |