]> granicus.if.org Git - yasm/commitdiff
* util.h (BitCount): Change bit-counting algorithm; the old one miscounted
authorPeter Johnson <peter@tortall.net>
Sat, 25 Sep 2004 06:38:57 +0000 (06:38 -0000)
committerPeter Johnson <peter@tortall.net>
Sat, 25 Sep 2004 06:38:57 +0000 (06:38 -0000)
4096 (0x1000) as having 257 bits; almost certainly other values were broken
as well.

svn path=/trunk/yasm/; revision=1148

util.h

diff --git a/util.h b/util.h
index 4d4e08fa61b6eb859c3f66a103804d2cd2568acc..5e0db54a0469d0aa3b4a56978fa9e40e560d0704 100644 (file)
--- a/util.h
+++ b/util.h
 #endif
 
 /* Bit-counting: used primarily by HAMT but also in a few other places. */
-#define SK5    0x55555555
-#define SK3    0x33333333
-#define SKF0   0x0F0F0F0F
+#define BC_TWO(c)      (0x1ul << (c))
+#define BC_MSK(c)      (((unsigned long)(-1)) / (BC_TWO(BC_TWO(c)) + 1ul))
+#define BC_COUNT(x,c)  ((x) & BC_MSK(c)) + (((x) >> (BC_TWO(c))) & BC_MSK(c))
 #define BitCount(d, s)         do {            \
-       d = s;                                  \
-       d -= (d>>1) & SK5;                      \
-       d = (d & SK3) + ((d>>2) & SK3);         \
-       d = (d & SKF0) + ((d>>4) & SKF0);       \
-       d += d>>16;                             \
-       d += d>>8;                              \
+       d = BC_COUNT(s, 0);                     \
+       d = BC_COUNT(d, 1);                     \
+       d = BC_COUNT(d, 2);                     \
+       d = BC_COUNT(d, 3);                     \
+       d = BC_COUNT(d, 4);                     \
     } while (0)
 
 #ifndef NELEMS