diff --git a/stage1/zig.h b/stage1/zig.h index 5ac70d2a24..233c2961cb 100644 --- a/stage1/zig.h +++ b/stage1/zig.h @@ -946,6 +946,24 @@ typedef unsigned long zig_Builtin64; typedef unsigned long long zig_Builtin64; #endif +#define zig_builtin8_rev(name, val) __builtin_##name(val) + +#define zig_builtin16_rev(name, val) __builtin_##name(val) + +#if INT_MIN <= INT32_MIN +#define zig_builtin32_rev(name, val) __builtin_##name(val) +#elif LONG_MIN <= INT32_MIN +#define zig_builtin32_rev(name, val) __builtin_l##name(val) +#endif + +#if INT_MIN <= INT64_MIN +#define zig_builtin64_rev(name, val) __builtin_##name(val) +#elif LONG_MIN <= INT64_MIN +#define zig_builtin64_rev(name, val) __builtin_l##name(val) +#elif LLONG_MIN <= INT64_MIN +#define zig_builtin64_rev(name, val) __builtin_ll##name(val) +#endif + static inline uint8_t zig_byte_swap_u8(uint8_t val, uint8_t bits) { return zig_wrap_u8(val >> (8 - bits), bits); } @@ -1141,6 +1159,24 @@ zig_builtin_clz(16) zig_builtin_clz(32) zig_builtin_clz(64) +#if zig_has_builtin(abs) || defined(zig_gnuc) +#define zig_builtin_abs(w) \ + static inline int##w##_t zig_abs_i##w(int##w##_t val) { \ + return zig_builtin##w##_rev(abs, val); \ + } +#else +#define zig_builtin_abs(w) \ + static inline int##w##_t zig_abs_i##w(int##w##_t val) { \ + if (val == INT##w##_MIN) return val; \ + int##w##_t tmp = val >> (w - 1); \ + return (val ^ tmp) - tmp; \ + } +#endif +zig_builtin_abs(8) +zig_builtin_abs(16) +zig_builtin_abs(32) +zig_builtin_abs(64) + /* ======================== 128-bit Integer Support ========================= */ #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) { return zig_wrap_i128(zig_bitCast_i128(zig_mul_u128(zig_bitCast_u128(lhs), zig_bitCast_u128(rhs))), bits); } +static inline zig_u128 zig_abs_i128(zig_i128 val) { + zig_i128 tmp = zig_shr_i128(val, 127); + return zig_bitCast_u128(zig_sub_i128(zig_xor_i128(val, tmp), tmp)); +} + #if zig_has_int128 static inline bool zig_addo_u128(zig_u128 *res, zig_u128 lhs, zig_u128 rhs, uint8_t bits) { diff --git a/stage1/zig1.wasm b/stage1/zig1.wasm index 1db7712fe3..2f6d9abc4e 100644 Binary files a/stage1/zig1.wasm and b/stage1/zig1.wasm differ