| ... | @@ -946,6 +946,24 @@ typedef unsigned long zig_Builtin64; | ... | @@ -946,6 +946,24 @@ typedef unsigned long zig_Builtin64; |
| 946 | typedef unsigned long long zig_Builtin64; | 946 | typedef unsigned long long zig_Builtin64; |
| 947 | #endif | 947 | #endif |
| 948 | | 948 | |
| | 949 | #define zig_builtin8_rev(name, val) __builtin_##name(val) |
| | 950 | |
| | 951 | #define zig_builtin16_rev(name, val) __builtin_##name(val) |
| | 952 | |
| | 953 | #if INT_MIN <= INT32_MIN |
| | 954 | #define zig_builtin32_rev(name, val) __builtin_##name(val) |
| | 955 | #elif LONG_MIN <= INT32_MIN |
| | 956 | #define zig_builtin32_rev(name, val) __builtin_l##name(val) |
| | 957 | #endif |
| | 958 | |
| | 959 | #if INT_MIN <= INT64_MIN |
| | 960 | #define zig_builtin64_rev(name, val) __builtin_##name(val) |
| | 961 | #elif LONG_MIN <= INT64_MIN |
| | 962 | #define zig_builtin64_rev(name, val) __builtin_l##name(val) |
| | 963 | #elif LLONG_MIN <= INT64_MIN |
| | 964 | #define zig_builtin64_rev(name, val) __builtin_ll##name(val) |
| | 965 | #endif |
| | 966 | |
| 949 | static inline uint8_t zig_byte_swap_u8(uint8_t val, uint8_t bits) { | 967 | static inline uint8_t zig_byte_swap_u8(uint8_t val, uint8_t bits) { |
| 950 | return zig_wrap_u8(val >> (8 - bits), bits); | 968 | return zig_wrap_u8(val >> (8 - bits), bits); |
| 951 | } | 969 | } |
| ... | @@ -1141,6 +1159,24 @@ zig_builtin_clz(16) | ... | @@ -1141,6 +1159,24 @@ zig_builtin_clz(16) |
| 1141 | zig_builtin_clz(32) | 1159 | zig_builtin_clz(32) |
| 1142 | zig_builtin_clz(64) | 1160 | zig_builtin_clz(64) |
| 1143 | | 1161 | |
| | 1162 | #if zig_has_builtin(abs) || defined(zig_gnuc) |
| | 1163 | #define zig_builtin_abs(w) \ |
| | 1164 | static inline int##w##_t zig_abs_i##w(int##w##_t val) { \ |
| | 1165 | return zig_builtin##w##_rev(abs, val); \ |
| | 1166 | } |
| | 1167 | #else |
| | 1168 | #define zig_builtin_abs(w) \ |
| | 1169 | static inline int##w##_t zig_abs_i##w(int##w##_t val) { \ |
| | 1170 | if (val == INT##w##_MIN) return val; \ |
| | 1171 | int##w##_t tmp = val >> (w - 1); \ |
| | 1172 | return (val ^ tmp) - tmp; \ |
| | 1173 | } |
| | 1174 | #endif |
| | 1175 | zig_builtin_abs(8) |
| | 1176 | zig_builtin_abs(16) |
| | 1177 | zig_builtin_abs(32) |
| | 1178 | zig_builtin_abs(64) |
| | 1179 | |
| 1144 | /* ======================== 128-bit Integer Support ========================= */ | 1180 | /* ======================== 128-bit Integer Support ========================= */ |
| 1145 | | 1181 | |
| 1146 | #if !defined(zig_has_int128) | 1182 | #if !defined(zig_has_int128) |
| ... | @@ -1466,6 +1502,11 @@ static inline zig_i128 zig_mulw_i128(zig_i128 lhs, zig_i128 rhs, uint8_t bits) { | ... | @@ -1466,6 +1502,11 @@ static inline zig_i128 zig_mulw_i128(zig_i128 lhs, zig_i128 rhs, uint8_t bits) { |
| 1466 | return zig_wrap_i128(zig_bitCast_i128(zig_mul_u128(zig_bitCast_u128(lhs), zig_bitCast_u128(rhs))), bits); | 1502 | return zig_wrap_i128(zig_bitCast_i128(zig_mul_u128(zig_bitCast_u128(lhs), zig_bitCast_u128(rhs))), bits); |
| 1467 | } | 1503 | } |
| 1468 | | 1504 | |
| | 1505 | static inline zig_u128 zig_abs_i128(zig_i128 val) { |
| | 1506 | zig_i128 tmp = zig_shr_i128(val, 127); |
| | 1507 | return zig_bitCast_u128(zig_sub_i128(zig_xor_i128(val, tmp), tmp)); |
| | 1508 | } |
| | 1509 | |
| 1469 | #if zig_has_int128 | 1510 | #if zig_has_int128 |
| 1470 | | 1511 | |
| 1471 | static inline bool zig_addo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, uint8_t bits) { | 1512 | static inline bool zig_addo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, uint8_t bits) { |