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:
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));