#ifndef _SYS_BITCOUNT_H_
#define _SYS_BITCOUNT_H_
#include <sys/_types.h>
#define __const_bitcount8(x) ( \
!!((x) & (1 << 0)) + \
!!((x) & (1 << 1)) + \
!!((x) & (1 << 2)) + \
!!((x) & (1 << 3)) + \
!!((x) & (1 << 4)) + \
!!((x) & (1 << 5)) + \
!!((x) & (1 << 6)) + \
!!((x) & (1 << 7)))
#define __const_bitcount16(x) ( \
__const_bitcount8(x) + \
__const_bitcount8((x) >> 8))
#define __const_bitcount32(x) ( \
__const_bitcount16(x) + \
__const_bitcount16((x) >> 16))
#define __const_bitcount64(x) ( \
__const_bitcount32(x) + \
__const_bitcount32((x) >> 32))
#ifdef __POPCNT__
#define __bitcount64(x) __builtin_popcountll((__uint64_t)(x))
#define __bitcount32(x) __builtin_popcount((__uint32_t)(x))
#define __bitcount16(x) __builtin_popcount((__uint16_t)(x))
#define __bitcountl(x) __builtin_popcountl((unsigned long)(x))
#define __bitcount(x) __builtin_popcount((unsigned int)(x))
#else
static __inline __uint16_t
__bitcount16(__uint16_t _x)
{
_x = (_x & 0x5555) + ((_x & 0xaaaa) >> 1);
_x = (_x & 0x3333) + ((_x & 0xcccc) >> 2);
_x = (_x + (_x >> 4)) & 0x0f0f;
_x = (_x + (_x >> 8)) & 0x00ff;
return (_x);
}
static __inline __uint32_t
__bitcount32(__uint32_t _x)
{
_x = (_x & 0x55555555) + ((_x & 0xaaaaaaaa) >> 1);
_x = (_x & 0x33333333) + ((_x & 0xcccccccc) >> 2);
_x = (_x + (_x >> 4)) & 0x0f0f0f0f;
_x = (_x + (_x >> 8));
_x = (_x + (_x >> 16)) & 0x000000ff;
return (_x);
}
#ifdef __LP64__
static __inline __uint64_t
__bitcount64(__uint64_t _x)
{
_x = (_x & 0x5555555555555555) + ((_x & 0xaaaaaaaaaaaaaaaa) >> 1);
_x = (_x & 0x3333333333333333) + ((_x & 0xcccccccccccccccc) >> 2);
_x = (_x + (_x >> 4)) & 0x0f0f0f0f0f0f0f0f;
_x = (_x + (_x >> 8));
_x = (_x + (_x >> 16));
_x = (_x + (_x >> 32)) & 0x000000ff;
return (_x);
}
#define __bitcountl(x) __bitcount64((unsigned long)(x))
#else
static __inline __uint64_t
__bitcount64(__uint64_t _x)
{
return (__bitcount32(_x >> 32) + __bitcount32(_x));
}
#define __bitcountl(x) __bitcount32((unsigned long)(x))
#endif
#define __bitcount(x) __bitcount32((unsigned int)(x))
#endif
#endif