| ... | @@ -481,6 +481,7 @@ | ... | @@ -481,6 +481,7 @@ |
| 481 | | 481 | |
| 482 | zig_extern void *memcpy (void *zig_restrict, void const *zig_restrict, size_t); | 482 | zig_extern void *memcpy (void *zig_restrict, void const *zig_restrict, size_t); |
| 483 | zig_extern void *memset (void *, int, size_t); | 483 | zig_extern void *memset (void *, int, size_t); |
| | 484 | zig_extern void *memmove (void *, void const *, size_t); |
| 484 | | 485 | |
| 485 | /* ================ Bool and 8/16/32/64-bit Integer Support ================= */ | 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,14 +1115,15 @@ static inline bool zig_mulo_i16(int16_t *res, int16_t lhs, int16_t rhs, uint8_t |
| 1114 | \ | 1115 | \ |
| 1115 | static inline uint##w##_t zig_shls_u##w(uint##w##_t lhs, uint##w##_t rhs, uint8_t bits) { \ | 1116 | static inline uint##w##_t zig_shls_u##w(uint##w##_t lhs, uint##w##_t rhs, uint8_t bits) { \ |
| 1116 | uint##w##_t res; \ | 1117 | uint##w##_t res; \ |
| 1117 | if (rhs >= bits) return lhs != UINT##w##_C(0) ? zig_maxInt_u(w, bits) : lhs; \ | 1118 | if (rhs < bits && !zig_shlo_u##w(&res, lhs, rhs, bits)) return res; \ |
| 1118 | return zig_shlo_u##w(&res, lhs, (uint8_t)rhs, bits) ? zig_maxInt_u(w, bits) : 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 | int##w##_t res; \ | 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 | if (rhs < bits && !zig_shlo_i##w(&res, lhs, rhs, bits)) return res; \ |
| 1124 | return lhs < INT##w##_C(0) ? zig_minInt_i(w, bits) : zig_maxInt_i(w, bits); \ | 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 | static inline uint##w##_t zig_adds_u##w(uint##w##_t lhs, uint##w##_t rhs, uint8_t bits) { \ | 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,15 +1852,23 @@ static inline bool zig_shlo_i128(zig_i128 *res, zig_i128 lhs, uint8_t rhs, uint8 |
| 1850 | | 1852 | |
| 1851 | static inline zig_u128 zig_shls_u128(zig_u128 lhs, zig_u128 rhs, uint8_t bits) { | 1853 | static inline zig_u128 zig_shls_u128(zig_u128 lhs, zig_u128 rhs, uint8_t bits) { |
| 1852 | zig_u128 res; | 1854 | zig_u128 res; |
| 1853 | if (zig_cmp_u128(rhs, zig_make_u128(0, bits)) >= INT32_C(0)) | 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; |
| 1854 | return zig_cmp_u128(lhs, zig_make_u128(0, 0)) != INT32_C(0) ? zig_maxInt_u(128, bits) : lhs; | 1856 | switch (zig_cmp_u128(lhs, zig_make_u128(0, 0))) { |
| 1855 | return zig_shlo_u128(&res, lhs, (uint8_t)zig_lo_u128(rhs), bits) ? zig_maxInt_u(128, bits) : res; | 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 | zig_i128 res; | 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; | 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; |
| 1861 | return zig_cmp_i128(lhs, zig_make_i128(0, 0)) < INT32_C(0) ? zig_minInt_i(128, bits) : zig_maxInt_i(128, bits); | 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 | static inline zig_u128 zig_adds_u128(zig_u128 lhs, zig_u128 rhs, uint8_t bits) { | 1874 | static inline zig_u128 zig_adds_u128(zig_u128 lhs, zig_u128 rhs, uint8_t bits) { |