|
481 | 481 |
|
482 | 482 | zig_extern void *memcpy (void *zig_restrict, void const *zig_restrict, size_t);
|
483 | 483 | zig_extern void *memset (void *, int, size_t);
|
| 484 | +zig_extern void *memmove (void *, void const *, size_t); |
484 | 485 |
|
485 | 486 | /* ================ Bool and 8/16/32/64-bit Integer Support ================= */
|
486 | 487 |
|
@@ -1114,14 +1115,15 @@ static inline bool zig_mulo_i16(int16_t *res, int16_t lhs, int16_t rhs, uint8_t
|
1114 | 1115 | \
|
1115 | 1116 | static inline uint##w##_t zig_shls_u##w(uint##w##_t lhs, uint##w##_t rhs, uint8_t bits) { \
|
1116 | 1117 | uint##w##_t res; \
|
1117 |
| - if (rhs >= bits) return lhs != UINT##w##_C(0) ? zig_maxInt_u(w, bits) : lhs; \ |
1118 |
| - return zig_shlo_u##w(&res, lhs, (uint8_t)rhs, bits) ? zig_maxInt_u(w, bits) : res; \ |
| 1118 | + if (rhs < bits && !zig_shlo_u##w(&res, lhs, rhs, bits)) return res; \ |
| 1119 | + return lhs == INT##w##_C(0) ? INT##w##_C(0) : zig_maxInt_u(w, bits); \ |
1119 | 1120 | } \
|
1120 | 1121 | \
|
1121 |
| - static inline int##w##_t zig_shls_i##w(int##w##_t lhs, int##w##_t rhs, uint8_t bits) { \ |
| 1122 | + static inline int##w##_t zig_shls_i##w(int##w##_t lhs, uint##w##_t rhs, uint8_t bits) { \ |
1122 | 1123 | int##w##_t res; \
|
1123 |
| - if ((uint##w##_t)rhs < (uint##w##_t)bits && !zig_shlo_i##w(&res, lhs, (uint8_t)rhs, bits)) return res; \ |
1124 |
| - return lhs < INT##w##_C(0) ? zig_minInt_i(w, bits) : zig_maxInt_i(w, bits); \ |
| 1124 | + if (rhs < bits && !zig_shlo_i##w(&res, lhs, rhs, bits)) return res; \ |
| 1125 | + return lhs == INT##w##_C(0) ? INT##w##_C(0) : \ |
| 1126 | + lhs < INT##w##_C(0) ? zig_minInt_i(w, bits) : zig_maxInt_i(w, bits); \ |
1125 | 1127 | } \
|
1126 | 1128 | \
|
1127 | 1129 | static inline uint##w##_t zig_adds_u##w(uint##w##_t lhs, uint##w##_t rhs, uint8_t bits) { \
|
@@ -1850,15 +1852,23 @@ static inline bool zig_shlo_i128(zig_i128 *res, zig_i128 lhs, uint8_t rhs, uint8
|
1850 | 1852 |
|
1851 | 1853 | static inline zig_u128 zig_shls_u128(zig_u128 lhs, zig_u128 rhs, uint8_t bits) {
|
1852 | 1854 | zig_u128 res;
|
1853 |
| - if (zig_cmp_u128(rhs, zig_make_u128(0, bits)) >= INT32_C(0)) |
1854 |
| - return zig_cmp_u128(lhs, zig_make_u128(0, 0)) != INT32_C(0) ? zig_maxInt_u(128, bits) : lhs; |
1855 |
| - return zig_shlo_u128(&res, lhs, (uint8_t)zig_lo_u128(rhs), bits) ? zig_maxInt_u(128, bits) : res; |
| 1855 | + if (zig_cmp_u128(rhs, zig_make_u128(0, bits)) < INT32_C(0) && !zig_shlo_u128(&res, lhs, (uint8_t)zig_lo_u128(rhs), bits)) return res; |
| 1856 | + switch (zig_cmp_u128(lhs, zig_make_u128(0, 0))) { |
| 1857 | + case 0: return zig_make_u128(0, 0); |
| 1858 | + case 1: return zig_maxInt_u(128, bits); |
| 1859 | + default: zig_unreachable(); |
| 1860 | + } |
1856 | 1861 | }
|
1857 | 1862 |
|
1858 |
| -static inline zig_i128 zig_shls_i128(zig_i128 lhs, zig_i128 rhs, uint8_t bits) { |
| 1863 | +static inline zig_i128 zig_shls_i128(zig_i128 lhs, zig_u128 rhs, uint8_t bits) { |
1859 | 1864 | zig_i128 res;
|
1860 |
| - 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; |
1861 |
| - return zig_cmp_i128(lhs, zig_make_i128(0, 0)) < INT32_C(0) ? zig_minInt_i(128, bits) : zig_maxInt_i(128, bits); |
| 1865 | + if (zig_cmp_u128(rhs, zig_make_u128(0, bits)) < INT32_C(0) && !zig_shlo_i128(&res, lhs, (uint8_t)zig_lo_u128(rhs), bits)) return res; |
| 1866 | + switch (zig_cmp_i128(lhs, zig_make_i128(0, 0))) { |
| 1867 | + case -1: return zig_minInt_i(128, bits); |
| 1868 | + case 0: return zig_make_i128(0, 0); |
| 1869 | + case 1: return zig_maxInt_i(128, bits); |
| 1870 | + default: zig_unreachable(); |
| 1871 | + } |
1862 | 1872 | }
|
1863 | 1873 |
|
1864 | 1874 | static inline zig_u128 zig_adds_u128(zig_u128 lhs, zig_u128 rhs, uint8_t bits) {
|
|
0 commit comments