rcx

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

commit 0014ba79a8b1c54889853961c5d3ad261cb0140f
parent 049677860ea5914ab78224f9493374002d16c8cf
Author: Robert Russell <robertrussell.72001@gmail.com>
Date:   Sun, 21 May 2023 16:50:26 -0700

Add read{16,32,64}{b,l,h} functions

Diffstat:
Minc/bits.h | 27+++++++++++++++++++++------
Msrc/bits.c | 8++++----
2 files changed, 25 insertions(+), 10 deletions(-)

diff --git a/inc/bits.h b/inc/bits.h @@ -1,12 +1,28 @@ #pragma once +#include <endian.h> + #include "def.h" -int r_popcnt_8(u8 n); -int r_popcnt_16(u16 n); -int r_popcnt_32(u32 n); -int r_popcnt_64(u64 n); +int r_popcnt8(u8 n); +int r_popcnt16(u16 n); +int r_popcnt32(u32 n); +int r_popcnt64(u64 n); /* Perform a full-width multiply of x and y, storing the upper (resp., lower) * 64 bits of the product in *h (resp., *l). */ -void r_mul64(u64 *h, u64 *l, u64 x, u64 y); -\ No newline at end of file +void r_mul64(u64 *h, u64 *l, u64 x, u64 y); + +static inline u16 r_read16b(u8 *p) { return ((u16)p[0] << 8) | ((u16)p[1] << 0); } +static inline u16 r_read16l(u8 *p) { return ((u16)p[1] << 8) | ((u16)p[0] << 0); } +static inline u16 r_read16h(u8 *p) { return le16toh(r_read16l(p)); } + +static inline u32 r_read32b(u8 *p) { return ((u32)r_read16b(p+0) << 16) | (u32)r_read16b(p+2); } +static inline u32 r_read32l(u8 *p) { return ((u32)r_read16l(p+2) << 16) | (u32)r_read16l(p+0); } +static inline u32 r_read32h(u8 *p) { return le32toh(r_read32l(p)); } + +static inline u64 r_read64b(u8 *p) { return ((u64)r_read32b(p+0) << 32) | (u64)r_read32b(p+4); } +static inline u64 r_read64l(u8 *p) { return ((u64)r_read32l(p+4) << 32) | (u64)r_read32l(p+0); } +static inline u64 r_read64h(u8 *p) { return le64toh(r_read64l(p)); } + +// TODO: r_write{16,32,64}{b,l,h} diff --git a/src/bits.c b/src/bits.c @@ -5,7 +5,7 @@ * See Henry Warren, Hacker's Delight, 2 ed., sec. 5.1. */ int -r_popcnt_8(u8 n) { +r_popcnt8(u8 n) { n = (n & U8_C(0x55)) + ((n>>1) & U8_C(0x55)); n = (n & U8_C(0x33)) + ((n>>2) & U8_C(0x33)); n = (n & U8_C(0x0f)) + ((n>>4) & U8_C(0x0f)); @@ -13,7 +13,7 @@ r_popcnt_8(u8 n) { } int -r_popcnt_16(u16 n) { +r_popcnt16(u16 n) { n = (n & U16_C(0x5555)) + ((n>>1) & U16_C(0x5555)); n = (n & U16_C(0x3333)) + ((n>>2) & U16_C(0x3333)); n = (n & U16_C(0x0f0f)) + ((n>>4) & U16_C(0x0f0f)); @@ -22,7 +22,7 @@ r_popcnt_16(u16 n) { } int -r_popcnt_32(u32 n) { +r_popcnt32(u32 n) { n = (n & U32_C(0x55555555)) + ((n>>1) & U32_C(0x55555555)); n = (n & U32_C(0x33333333)) + ((n>>2) & U32_C(0x33333333)); n = (n & U32_C(0x0f0f0f0f)) + ((n>>4) & U32_C(0x0f0f0f0f)); @@ -32,7 +32,7 @@ r_popcnt_32(u32 n) { } int -r_popcnt_64(u64 n) { +r_popcnt64(u64 n) { n = (n & U64_C(0x5555555555555555)) + ((n>>1) & U64_C(0x5555555555555555)); n = (n & U64_C(0x3333333333333333)) + ((n>>2) & U64_C(0x3333333333333333)); n = (n & U64_C(0x0f0f0f0f0f0f0f0f)) + ((n>>4) & U64_C(0x0f0f0f0f0f0f0f0f));