From: Willy Tarreau Date: Sat, 7 Mar 2020 23:41:00 +0000 (+0100) Subject: MINOR: tools: add 64-bit rotate operators X-Git-Tag: v2.1.4~67 X-Git-Url: http://git.haproxy.org/?a=commitdiff_plain;h=4deb8529fe01327ab23f18290cf7fdd2ef99090a;p=haproxy-2.1.git MINOR: tools: add 64-bit rotate operators This adds rotl64/rotr64 to rotate a 64-bit word by an arbitrary number of bits. It's mainly aimed at being used with constants. (cherry picked from commit 7a40909c00c13d2733bc1d41ddc7dc1d19e05da9) Signed-off-by: Willy Tarreau --- diff --git a/include/common/standard.h b/include/common/standard.h index 69d760d..0b2c1ec 100644 --- a/include/common/standard.h +++ b/include/common/standard.h @@ -61,6 +61,26 @@ * power of 2, and 0 otherwise */ #define POWEROF2(x) (((x) & ((x)-1)) == 0) +/* rotate left a 64-bit integer by bits */ +static inline uint64_t rotl64(uint64_t v, uint8_t bits) +{ +#if !defined(__ARM_ARCH_8A) && !defined(__x86_64__) + bits &= 63; +#endif + v = (v << bits) | (v >> (-bits & 63)); + return v; +} + +/* rotate right a 64-bit integer by bits */ +static inline uint64_t rotr64(uint64_t v, uint8_t bits) +{ +#if !defined(__ARM_ARCH_8A) && !defined(__x86_64__) + bits &= 63; +#endif + v = (v >> bits) | (v << (-bits & 63)); + return v; +} + /* DEFNULL() returns either the argument as-is, or NULL if absent. This is for * use in macros arguments. */