* 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
0.4
Peter Johnson 20 years ago
parent ad2c7b3e3f
commit eafa108191
  1. 17
      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

Loading…
Cancel
Save