0001
0002 #ifndef _ASM_GENERIC_BITOPS_CONST_HWEIGHT_H_
0003 #define _ASM_GENERIC_BITOPS_CONST_HWEIGHT_H_
0004
0005
0006
0007
0008 #define __const_hweight8(w) \
0009 ((unsigned int) \
0010 ((!!((w) & (1ULL << 0))) + \
0011 (!!((w) & (1ULL << 1))) + \
0012 (!!((w) & (1ULL << 2))) + \
0013 (!!((w) & (1ULL << 3))) + \
0014 (!!((w) & (1ULL << 4))) + \
0015 (!!((w) & (1ULL << 5))) + \
0016 (!!((w) & (1ULL << 6))) + \
0017 (!!((w) & (1ULL << 7)))))
0018
0019 #define __const_hweight16(w) (__const_hweight8(w) + __const_hweight8((w) >> 8 ))
0020 #define __const_hweight32(w) (__const_hweight16(w) + __const_hweight16((w) >> 16))
0021 #define __const_hweight64(w) (__const_hweight32(w) + __const_hweight32((w) >> 32))
0022
0023
0024
0025
0026 #define hweight8(w) (__builtin_constant_p(w) ? __const_hweight8(w) : __arch_hweight8(w))
0027 #define hweight16(w) (__builtin_constant_p(w) ? __const_hweight16(w) : __arch_hweight16(w))
0028 #define hweight32(w) (__builtin_constant_p(w) ? __const_hweight32(w) : __arch_hweight32(w))
0029 #define hweight64(w) (__builtin_constant_p(w) ? __const_hweight64(w) : __arch_hweight64(w))
0030
0031
0032
0033
0034 #define HWEIGHT8(w) (BUILD_BUG_ON_ZERO(!__builtin_constant_p(w)) + __const_hweight8(w))
0035 #define HWEIGHT16(w) (BUILD_BUG_ON_ZERO(!__builtin_constant_p(w)) + __const_hweight16(w))
0036 #define HWEIGHT32(w) (BUILD_BUG_ON_ZERO(!__builtin_constant_p(w)) + __const_hweight32(w))
0037 #define HWEIGHT64(w) (BUILD_BUG_ON_ZERO(!__builtin_constant_p(w)) + __const_hweight64(w))
0038
0039
0040
0041
0042 #define HWEIGHT(w) HWEIGHT64((u64)w)
0043
0044 #endif