diff options
author | Corbin Simpson <[email protected]> | 2009-11-28 10:13:51 -0800 |
---|---|---|
committer | Corbin Simpson <[email protected]> | 2009-11-28 10:14:42 -0800 |
commit | c93dcbfea7b8e1cd0f14a96bc466419bdce7eb30 (patch) | |
tree | 220977df5981c34cea97300c29e042d06632124f /src/gallium/auxiliary/util/u_math.h | |
parent | cad14c2542698de144bb5434cefa02d7a00aaa74 (diff) |
util: Improve bitcount.
Sorry for not pushing this before, it got lost in stashes.
Diffstat (limited to 'src/gallium/auxiliary/util/u_math.h')
-rw-r--r-- | src/gallium/auxiliary/util/u_math.h | 12 |
1 files changed, 8 insertions, 4 deletions
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 |