mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-04-24 20:08:01 +00:00
MINOR: tools: improve the popcount() operation
We'll call popcount() more often so better use a parallel method than an iterative one. One optimal design is proposed at the site below. It requires a fast multiplication though, but even without it will still be faster than the iterative one, and all relevant 64 bit platforms do have a multiply unit. https://graphics.stanford.edu/~seander/bithacks.html
This commit is contained in:
parent
4ed84c96cf
commit
cafa56ecd6
@ -790,15 +790,15 @@ static inline unsigned int div64_32(unsigned long long o1, unsigned int o2)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Simple popcountl implementation. It returns the number of ones in a word */
|
/* Simple popcountl implementation. It returns the number of ones in a word.
|
||||||
|
* Described here : https://graphics.stanford.edu/~seander/bithacks.html
|
||||||
|
*/
|
||||||
static inline unsigned int my_popcountl(unsigned long a)
|
static inline unsigned int my_popcountl(unsigned long a)
|
||||||
{
|
{
|
||||||
unsigned int cnt;
|
a = a - ((a >> 1) & ~0UL/3);
|
||||||
for (cnt = 0; a; a >>= 1) {
|
a = (a & ~0UL/15*3) + ((a >> 2) & ~0UL/15*3);
|
||||||
if (a & 1)
|
a = (a + (a >> 4)) & ~0UL/255*15;
|
||||||
cnt++;
|
return (unsigned long)(a * (~0UL/255)) >> (sizeof(unsigned long) - 1) * 8;
|
||||||
}
|
|
||||||
return cnt;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* returns non-zero if <a> has at least 2 bits set */
|
/* returns non-zero if <a> has at least 2 bits set */
|
||||||
|
Loading…
Reference in New Issue
Block a user