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 <imirkin@alum.mit.edu> Reviewed-by: Roland Scheidegger <sroland@vmware.com>
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user