From: Corbin Simpson Date: Sat, 28 Nov 2009 18:13:51 +0000 (-0800) Subject: util: Improve bitcount. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c93dcbfea7b8e1cd0f14a96bc466419bdce7eb30;p=mesa.git util: Improve bitcount. Sorry for not pushing this before, it got lost in stashes. --- diff --git a/src/gallium/auxiliary/util/u_math.h b/src/gallium/auxiliary/util/u_math.h index 7e75702701d..c4faec671cb 100644 --- a/src/gallium/auxiliary/util/u_math.h +++ b/src/gallium/auxiliary/util/u_math.h @@ -499,11 +499,15 @@ util_bitcount(unsigned n) #if defined(PIPE_CC_GCC) return __builtin_popcount(n); #else - /* XXX there are more clever ways of doing this */ + /* K&R classic bitcount. + * + * For each iteration, clear the LSB from the bitfield. + * Requires only one iteration per set bit, instead of + * one iteration per bit less than highest set bit. + */ unsigned bits = 0; - while (n) { - bits += (n & 1); - n = n >> 1; + for (bits, n, bits++) { + n &= n - 1; } return bits; #endif