commit 8b2de8638745c598813c2f7d34b2a450e45384f3 parent 403d9be45e3ad1bf18f116b767d7404461b2d811 Author: Robert Russell <robert@rr3.xyz> Date: Sun, 12 Jan 2025 16:28:48 -0800 Rewrite sign extension functions to support weird bit lengths Diffstat:
| M | inc/bits.h | | | 32 | ++++++++++++++++++++------------ |
1 file changed, 20 insertions(+), 12 deletions(-)
diff --git a/inc/bits.h b/inc/bits.h @@ -384,21 +384,29 @@ r_swap64(u64 n) { /* ----- Sign extension ----- */ -static inline u16 r_sext_16_8(u8 x) { return (u16)(i16)(i8)x; } +static inline u8 +r_sext8(u8 x, uint b) { + uint c = 8 - b; + return (u8)((i8)(x << c) >> c); +} -static inline u32 r_sext_32_8(u8 x) { return (u32)(i32)(i8)x; } -static inline u32 r_sext_32_16(u16 x) { return (u32)(i32)(i16)x; } +static inline u16 +r_sext16(u16 x, uint b) { + uint c = 16 - b; + return (u16)((i16)(x << c) >> c); +} -static inline u64 r_sext_64_8(u8 x) { return (u64)(i64)(i8)x; } -static inline u64 r_sext_64_16(u16 x) { return (u64)(i64)(i16)x; } -static inline u64 r_sext_64_32(u32 x) { return (u64)(i64)(i32)x; } +static inline u32 +r_sext32(u32 x, uint b) { + uint c = 32 - b; + return (u32)((i32)(x << c) >> c); +} -#ifdef R_HAVE_128 -static inline u128 r_sext_128_8(u8 x) { return (u128)(i128)(i8)x; } -static inline u128 r_sext_128_16(u16 x) { return (u128)(i128)(i16)x; } -static inline u128 r_sext_128_32(u32 x) { return (u128)(i128)(i32)x; } -static inline u128 r_sext_128_64(u64 x) { return (u128)(i128)(i64)x; } -#endif +static inline u64 +r_sext64(u64 x, uint b) { + uint c = 64 - b; + return (u64)((i64)(x << c) >> c); +} /* ----- Endian conversions ----- */