From ab4927f3e04918fd8a53c2d91be4dfc65fe9782d Mon Sep 17 00:00:00 2001 From: Ilia Mirkin Date: Fri, 25 Apr 2014 18:07:41 -0400 Subject: [PATCH] gallium/util: add helpers for bitfield manipulation Add bitwise reversing and signed MSB helpers for software implementation of the new TGSI opcodes. Signed-off-by: Ilia Mirkin Reviewed-by: Roland Scheidegger --- src/gallium/auxiliary/util/u_math.h | 31 +++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/gallium/auxiliary/util/u_math.h b/src/gallium/auxiliary/util/u_math.h index ec03e4e5886..a60e1830a72 100644 --- a/src/gallium/auxiliary/util/u_math.h +++ b/src/gallium/auxiliary/util/u_math.h @@ -567,6 +567,22 @@ static INLINE unsigned util_last_bit(unsigned u) #endif } +/** + * Find last bit in a word that does not match the sign bit. The least + * significant bit is 1. + * Return 0 if no bits are set. + */ +static INLINE unsigned util_last_bit_signed(int i) +{ +#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 407) + return 31 - __builtin_clrsb(i); +#else + if (i >= 0) + return util_last_bit(i); + else + return util_last_bit(~(unsigned)i); +#endif +} /* Destructively loop over all of the bits in a mask as in: * @@ -715,6 +731,21 @@ util_bitcount(unsigned n) #endif } +/** + * Reverse bits in n + * Algorithm taken from: + * http://stackoverflow.com/questions/9144800/c-reverse-bits-in-unsigned-integer + */ +static INLINE unsigned +util_bitreverse(unsigned n) +{ + n = ((n >> 1) & 0x55555555u) | ((n & 0x55555555u) << 1); + n = ((n >> 2) & 0x33333333u) | ((n & 0x33333333u) << 2); + n = ((n >> 4) & 0x0f0f0f0fu) | ((n & 0x0f0f0f0fu) << 4); + n = ((n >> 8) & 0x00ff00ffu) | ((n & 0x00ff00ffu) << 8); + n = ((n >> 16) & 0xffffu) | ((n & 0xffffu) << 16); + return n; +} /** * Convert from little endian to CPU byte order. -- 2.30.2