util: Improve bitcount.
authorCorbin Simpson <MostAwesomeDude@gmail.com>
Sat, 28 Nov 2009 18:13:51 +0000 (10:13 -0800)
committerCorbin Simpson <MostAwesomeDude@gmail.com>
Sat, 28 Nov 2009 18:14:42 +0000 (10:14 -0800)
Sorry for not pushing this before, it got lost in stashes.

src/gallium/auxiliary/util/u_math.h

index 7e75702701dc95ca3054e35fcafc9aa479f2d7e5..c4faec671cb9a893c2997857424574374f76aabb 100644 (file)
@@ -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