rcx

miscellaneous C library
git clone git://git.rr3.xyz/rcx
Log | Files | Refs | README | LICENSE

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:
Minc/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 ----- */