From: Peter Johnson Date: Sat, 25 Sep 2004 06:38:57 +0000 (-0000) Subject: * util.h (BitCount): Change bit-counting algorithm; the old one miscounted X-Git-Tag: v0.4.0~23 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=eafa10819179860fbce2283ba2dd9bde3f25cd1e;p=yasm * util.h (BitCount): Change bit-counting algorithm; the old one miscounted 4096 (0x1000) as having 257 bits; almost certainly other values were broken as well. svn path=/trunk/yasm/; revision=1148 --- diff --git a/util.h b/util.h index 4d4e08fa..5e0db54a 100644 --- a/util.h +++ b/util.h @@ -137,16 +137,15 @@ #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