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:
Willy Tarreau 2019-02-02 20:17:31 +01:00
parent 4ed84c96cf
commit cafa56ecd6
1 changed files with 7 additions and 7 deletions

View File

@ -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 */