mirror of
https://github.com/yasm/yasm
synced 2026-08-26 22:26:05 -04:00
* 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
This commit is contained in:
parent
ad2c7b3e3f
commit
eafa108191
1 changed files with 8 additions and 9 deletions
17
util.h
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…
Add table
Add a link
Reference in a new issue