commit 7c1574660a1ee13e59769e86ef6aec4c18d754d5
parent faa22537775db1efe4cd1a0321e5ef3b67f779e4
Author: Robert Russell <robertrussell.72001@gmail.com>
Date: Sun, 28 May 2023 20:36:37 -0700
Add bit rotates
Diffstat:
1 file changed, 10 insertions(+), 0 deletions(-)
diff --git a/inc/bits.h b/inc/bits.h
@@ -4,6 +4,16 @@
#include "def.h"
+static inline u8 r_rotl8 (u8 n, uint c) { return (n << (c& 7u)) | (n >> (-c& 7u)); }
+static inline u16 r_rotl16(u16 n, uint c) { return (n << (c&15u)) | (n >> (-c&15u)); }
+static inline u32 r_rotl32(u32 n, uint c) { return (n << (c&31u)) | (n >> (-c&31u)); }
+static inline u64 r_rotl64(u64 n, uint c) { return (n << (c&63u)) | (n >> (-c&63u)); }
+
+static inline u8 r_rotr8 (u8 n, uint c) { return (n >> (c& 7u)) | (n << (-c& 7u)); }
+static inline u16 r_rotr16(u16 n, uint c) { return (n >> (c&15u)) | (n << (-c&15u)); }
+static inline u32 r_rotr32(u32 n, uint c) { return (n >> (c&31u)) | (n << (-c&31u)); }
+static inline u64 r_rotr64(u64 n, uint c) { return (n >> (c&63u)) | (n << (-c&63u)); }
+
/* The GCC builtin's do not use hardware popcnt unless an appropriate -march
* is specified, in which case __POPCNT__ is defined. Otherwise, GCC emits
* calls to libgcc which are slower than the below custom implementions. */