From: Jens Axboe Date: Mon, 21 Jan 2013 19:28:23 +0000 (-0700) Subject: Add hweight64() X-Git-Tag: fio-2.0.14~108 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=def823d406ad78d3f9690ee8804e743e1d5a8aff Add hweight64() Signed-off-by: Jens Axboe --- diff --git a/lib/hweight.c b/lib/hweight.c index 738ed277..bc9b51bc 100644 --- a/lib/hweight.c +++ b/lib/hweight.c @@ -17,3 +17,17 @@ unsigned int hweight32(uint32_t w) res = res + (res >> 8); return (res + (res >> 16)) & 0x000000FF; } + +unsigned int hweight64(uint64_t w) +{ +#if BITS_PER_LONG == 32 + return hweight32((unsigned int)(w >> 32)) + hweight32((unsigned int)w); +#else + uint64_t res = w - ((w >> 1) & 0x5555555555555555ul); + res = (res & 0x3333333333333333ul) + ((res >> 2) & 0x3333333333333333ul); + res = (res + (res >> 4)) & 0x0F0F0F0F0F0F0F0Ful; + res = res + (res >> 8); + res = res + (res >> 16); + return (res + (res >> 32)) & 0x00000000000000FFul; +#endif +} diff --git a/lib/hweight.h b/lib/hweight.h index 1965eaa6..68861ddd 100644 --- a/lib/hweight.h +++ b/lib/hweight.h @@ -5,5 +5,6 @@ unsigned int hweight8(uint8_t w); unsigned int hweight32(uint32_t w); +unsigned int hweight64(uint64_t w); #endif