From: Darrick J. Wong Date: Wed, 6 Dec 2017 15:17:07 +0000 (-0600) Subject: libfrog: add bit manipulation functions X-Git-Tag: v4.15.0-rc1~134 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1ca68d672421b76d96f0e79e0bc8208f8deac255;p=thirdparty%2Fxfsprogs-dev.git libfrog: add bit manipulation functions Duplicate the libxfs bit manipulation functions -- this is for programs that don't need libxfs. Signed-off-by: Darrick J. Wong Reviewed-by: Eric Sandeen Signed-off-by: Eric Sandeen --- diff --git a/include/bitops.h b/include/bitops.h index 7774950ad..dd561c26b 100644 --- a/include/bitops.h +++ b/include/bitops.h @@ -56,4 +56,62 @@ static inline unsigned fls_long(unsigned long l) */ #define ffz(x) ffs(~(x)) +/* + * XFS bit manipulation routines. Repeated here so that some programs + * don't have to link in all of libxfs just to have bit manipulation. + */ + +/* + * masks with n high/low bits set, 64-bit values + */ +static inline uint64_t mask64hi(int n) +{ + return (uint64_t)-1 << (64 - (n)); +} +static inline uint32_t mask32lo(int n) +{ + return ((uint32_t)1 << (n)) - 1; +} +static inline uint64_t mask64lo(int n) +{ + return ((uint64_t)1 << (n)) - 1; +} + +/* Get high bit set out of 32-bit argument, -1 if none set */ +static inline int highbit32(uint32_t v) +{ + return fls(v) - 1; +} + +/* Get high bit set out of 64-bit argument, -1 if none set */ +static inline int highbit64(uint64_t v) +{ + return fls64(v) - 1; +} + +/* Get low bit set out of 32-bit argument, -1 if none set */ +static inline int lowbit32(uint32_t v) +{ + return ffs(v) - 1; +} + +/* Get low bit set out of 64-bit argument, -1 if none set */ +static inline int lowbit64(uint64_t v) +{ + uint32_t w = (uint32_t)v; + int n = 0; + + if (w) { /* lower bits */ + n = ffs(w); + } else { /* upper bits */ + w = (uint32_t)(v >> 32); + if (w) { + n = ffs(w); + if (n) + n += 32; + } + } + return n - 1; +} + #endif