summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/util/u_math.h
diff options
context:
space:
mode:
authorCorbin Simpson <[email protected]>2009-11-28 10:13:51 -0800
committerCorbin Simpson <[email protected]>2009-11-28 10:14:42 -0800
commitc93dcbfea7b8e1cd0f14a96bc466419bdce7eb30 (patch)
tree220977df5981c34cea97300c29e042d06632124f /src/gallium/auxiliary/util/u_math.h
parentcad14c2542698de144bb5434cefa02d7a00aaa74 (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.h12
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