| ... | ... | @@ -813,6 +813,15 @@ typedef ptrdiff_t intptr_t; |
| 813 | 813 | static inline int##w##_t zig_div_floor_i##w(int##w##_t lhs, int##w##_t rhs) { \ |
| 814 | 814 | return lhs / rhs + (lhs % rhs != INT##w##_C(0) ? zig_shr_i##w(lhs ^ rhs, UINT8_C(w) - UINT8_C(1)) : INT##w##_C(0)); \ |
| 815 | 815 | } \ |
| 816 | \ |
| 817 | static inline uint##w##_t zig_div_ceil_u##w(uint##w##_t lhs, uint##w##_t rhs) { \ |
| 818 | return lhs / rhs + (lhs % rhs != UINT##w##_C(0) ? UINT##w##_C(1) : UINT##w##_C(0)); \ |
| 819 | } \ |
| 820 | \ |
| 821 | static inline int##w##_t zig_div_ceil_i##w(int##w##_t lhs, int##w##_t rhs) { \ |
| 822 | return lhs / rhs + (lhs % rhs != INT##w##_C(0) \ |
| 823 | ? zig_shr_i##w(lhs ^ rhs, UINT8_C(w) - UINT8_C(1)) + INT##w##_C(1) : INT##w##_C(0)); \ |
| 824 | } \ |
| 816 | 825 | \ |
| 817 | 826 | zig_basic_operator(uint##w##_t, mod_u##w, %) \ |
| 818 | 827 | \ |
| ... | ... | @@ -2058,6 +2067,21 @@ static inline zig_i128 zig_div_floor_i128(zig_i128 lhs, zig_i128 rhs) { |
| 2058 | 2067 | return zig_add_i128(zig_div_trunc_i128(lhs, rhs), zig_make_i128(mask, (uint64_t)mask)); |
| 2059 | 2068 | } |
| 2060 | 2069 | |
| 2070 | static inline zig_u128 zig_div_ceil_u128(zig_u128 lhs, zig_u128 rhs) { |
| 2071 | zig_u128 rem = zig_rem_u128(lhs, rhs); |
| 2072 | uint64_t mask = zig_or_u64(zig_hi_u128(rem), zig_lo_u128(rem)) != UINT64_C(0) |
| 2073 | ? UINT64_C(1) : UINT64_C(0); |
| 2074 | return zig_add_u128(zig_div_trunc_u128(lhs, rhs), zig_make_u128(UINT64_C(0), mask)); |
| 2075 | } |
| 2076 | |
| 2077 | static inline zig_i128 zig_div_ceil_i128(zig_i128 lhs, zig_i128 rhs) { |
| 2078 | zig_i128 rem = zig_rem_i128(lhs, rhs); |
| 2079 | int64_t mask = zig_or_u64((uint64_t)zig_hi_i128(rem), zig_lo_i128(rem)) != UINT64_C(0) |
| 2080 | ? zig_shr_i64(zig_xor_i64(zig_hi_i128(lhs), zig_hi_i128(rhs)), UINT8_C(63)) + INT64_C(1) |
| 2081 | : INT64_C(0); |
| 2082 | return zig_add_i128(zig_div_trunc_i128(lhs, rhs), zig_make_i128(INT64_C(0), (uint64_t)mask)); |
| 2083 | } |
| 2084 | |
| 2061 | 2085 | #define zig_mod_u128 zig_rem_u128 |
| 2062 | 2086 | |
| 2063 | 2087 | static inline zig_i128 zig_mod_i128(zig_i128 lhs, zig_i128 rhs) { |
| ... | ... | @@ -3251,6 +3275,10 @@ static inline void zig_div_floor_big(void *res, const void *lhs, const void *rhs |
| 3251 | 3275 | zig_trap(); |
| 3252 | 3276 | } |
| 3253 | 3277 | |
| 3278 | static inline void zig_div_ceil_big(void *res, const void *lhs, const void *rhs, bool is_signed, uint16_t bits) { |
| 3279 | zig_trap(); |
| 3280 | } |
| 3281 | |
| 3254 | 3282 | zig_extern void __umodei4(uint32_t *res, const uint32_t *lhs, const uint32_t *rhs, uintptr_t bits); |
| 3255 | 3283 | static inline void zig_rem_big(void *res, const void *lhs, const void *rhs, bool is_signed, uint16_t bits) { |
| 3256 | 3284 | if (!is_signed) { |
| ... | ... | @@ -4010,6 +4038,10 @@ zig_float_negate_builtin(128, zig_make_u128, (UINT64_C(1) << 63, UINT64_C(0))) |
| 4010 | 4038 | static inline zig_f##w zig_div_floor_f##w(zig_f##w lhs, zig_f##w rhs) { \ |
| 4011 | 4039 | return zig_floor_f##w(zig_div_f##w(lhs, rhs)); \ |
| 4012 | 4040 | } \ |
| 4041 | \ |
| 4042 | static inline zig_f##w zig_div_ceil_f##w(zig_f##w lhs, zig_f##w rhs) { \ |
| 4043 | return zig_ceil_f##w(zig_div_f##w(lhs, rhs)); \ |
| 4044 | } \ |
| 4013 | 4045 | \ |
| 4014 | 4046 | static inline zig_f##w zig_mod_f##w(zig_f##w lhs, zig_f##w rhs) { \ |
| 4015 | 4047 | return zig_sub_f##w(lhs, zig_mul_f##w(zig_div_floor_f##w(lhs, rhs), rhs)); \ |