| ... | ... | @@ -487,14 +487,14 @@ typedef ptrdiff_t intptr_t; |
| 487 | 487 | zig_basic_operator(uint##w##_t, div_floor_u##w, /) \ |
| 488 | 488 | \ |
| 489 | 489 | static inline int##w##_t zig_div_floor_i##w(int##w##_t lhs, int##w##_t rhs) { \ |
| 490 | | return lhs / rhs - (((lhs ^ rhs) & (lhs % rhs)) < INT##w##_C(0)); \ |
| 490 | 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)); \ |
| 491 | 491 | } \ |
| 492 | 492 | \ |
| 493 | 493 | zig_basic_operator(uint##w##_t, mod_u##w, %) \ |
| 494 | 494 | \ |
| 495 | 495 | static inline int##w##_t zig_mod_i##w(int##w##_t lhs, int##w##_t rhs) { \ |
| 496 | 496 | int##w##_t rem = lhs % rhs; \ |
| 497 | | return rem + (((lhs ^ rhs) & rem) < INT##w##_C(0) ? rhs : INT##w##_C(0)); \ |
| 497 | return rem + (rem != INT##w##_C(0) ? rhs & zig_shr_i##w(lhs ^ rhs, UINT8_C(w) - UINT8_C(1)) : INT##w##_C(0)); \ |
| 498 | 498 | } \ |
| 499 | 499 | \ |
| 500 | 500 | static inline uint##w##_t zig_shlw_u##w(uint##w##_t lhs, uint8_t rhs, uint8_t bits) { \ |
| ... | ... | @@ -1078,7 +1078,7 @@ static inline int64_t zig_bit_reverse_i64(int64_t val, uint8_t bits) { |
| 1078 | 1078 | uint##w##_t temp = val - ((val >> 1) & (UINT##w##_MAX / 3)); \ |
| 1079 | 1079 | temp = (temp & (UINT##w##_MAX / 5)) + ((temp >> 2) & (UINT##w##_MAX / 5)); \ |
| 1080 | 1080 | temp = (temp + (temp >> 4)) & (UINT##w##_MAX / 17); \ |
| 1081 | | return temp * (UINT##w##_MAX / 255) >> (w - 8); \ |
| 1081 | return temp * (UINT##w##_MAX / 255) >> (UINT8_C(w) - UINT8_C(8)); \ |
| 1082 | 1082 | } \ |
| 1083 | 1083 | \ |
| 1084 | 1084 | zig_builtin_popcount_common(w) |
| ... | ... | @@ -1298,15 +1298,6 @@ static inline zig_i128 zig_rem_i128(zig_i128 lhs, zig_i128 rhs) { |
| 1298 | 1298 | return lhs % rhs; |
| 1299 | 1299 | } |
| 1300 | 1300 | |
| 1301 | | static inline zig_i128 zig_div_floor_i128(zig_i128 lhs, zig_i128 rhs) { |
| 1302 | | return zig_div_trunc_i128(lhs, rhs) - (((lhs ^ rhs) & zig_rem_i128(lhs, rhs)) < zig_make_i128(0, 0)); |
| 1303 | | } |
| 1304 | | |
| 1305 | | static inline zig_i128 zig_mod_i128(zig_i128 lhs, zig_i128 rhs) { |
| 1306 | | zig_i128 rem = zig_rem_i128(lhs, rhs); |
| 1307 | | return rem + (((lhs ^ rhs) & rem) < zig_make_i128(0, 0) ? rhs : zig_make_i128(0, 0)); |
| 1308 | | } |
| 1309 | | |
| 1310 | 1301 | #else /* zig_has_int128 */ |
| 1311 | 1302 | |
| 1312 | 1303 | static inline zig_u128 zig_not_u128(zig_u128 val, uint8_t bits) { |
| ... | ... | @@ -1394,20 +1385,26 @@ static zig_i128 zig_rem_i128(zig_i128 lhs, zig_i128 rhs) { |
| 1394 | 1385 | return __modti3(lhs, rhs); |
| 1395 | 1386 | } |
| 1396 | 1387 | |
| 1397 | | static inline zig_i128 zig_mod_i128(zig_i128 lhs, zig_i128 rhs) { |
| 1398 | | zig_i128 rem = zig_rem_i128(lhs, rhs); |
| 1399 | | return zig_add_i128(rem, ((lhs.hi ^ rhs.hi) & rem.hi) < INT64_C(0) ? rhs : zig_make_i128(0, 0)); |
| 1400 | | } |
| 1388 | #endif /* zig_has_int128 */ |
| 1389 | |
| 1390 | #define zig_div_floor_u128 zig_div_trunc_u128 |
| 1401 | 1391 | |
| 1402 | 1392 | static inline zig_i128 zig_div_floor_i128(zig_i128 lhs, zig_i128 rhs) { |
| 1403 | | return zig_sub_i128(zig_div_trunc_i128(lhs, rhs), zig_make_i128(0, zig_cmp_i128(zig_and_i128(zig_xor_i128(lhs, rhs), zig_rem_i128(lhs, rhs)), zig_make_i128(0, 0)) < INT32_C(0))); |
| 1393 | zig_i128 rem = zig_rem_i128(lhs, rhs); |
| 1394 | int64_t mask = zig_or_u64((uint64_t)zig_hi_i128(rem), zig_lo_i128(rem)) != UINT64_C(0) |
| 1395 | ? zig_shr_i64(zig_xor_i64(zig_hi_i128(lhs), zig_hi_i128(rhs)), UINT8_C(63)) : INT64_C(0); |
| 1396 | return zig_add_i128(zig_div_trunc_i128(lhs, rhs), zig_make_i128(mask, (uint64_t)mask)); |
| 1404 | 1397 | } |
| 1405 | 1398 | |
| 1406 | | #endif /* zig_has_int128 */ |
| 1407 | | |
| 1408 | | #define zig_div_floor_u128 zig_div_trunc_u128 |
| 1409 | 1399 | #define zig_mod_u128 zig_rem_u128 |
| 1410 | 1400 | |
| 1401 | static inline zig_i128 zig_mod_i128(zig_i128 lhs, zig_i128 rhs) { |
| 1402 | zig_i128 rem = zig_rem_i128(lhs, rhs); |
| 1403 | int64_t mask = zig_or_u64((uint64_t)zig_hi_i128(rem), zig_lo_i128(rem)) != UINT64_C(0) |
| 1404 | ? zig_shr_i64(zig_xor_i64(zig_hi_i128(lhs), zig_hi_i128(rhs)), UINT8_C(63)) : INT64_C(0); |
| 1405 | return zig_add_i128(rem, zig_and_i128(rhs, zig_make_i128(mask, (uint64_t)mask))); |
| 1406 | } |
| 1407 | |
| 1411 | 1408 | static inline zig_u128 zig_min_u128(zig_u128 lhs, zig_u128 rhs) { |
| 1412 | 1409 | return zig_cmp_u128(lhs, rhs) < INT32_C(0) ? lhs : rhs; |
| 1413 | 1410 | } |