1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef _ASM_GENERIC_BITOPS_CONST_HWEIGHT_H_ |
3 | #define _ASM_GENERIC_BITOPS_CONST_HWEIGHT_H_ |
4 | |
5 | /* |
6 | * Compile time versions of __arch_hweightN() |
7 | */ |
8 | #define __const_hweight8(w) \ |
9 | ((unsigned int) \ |
10 | ((!!((w) & (1ULL << 0))) + \ |
11 | (!!((w) & (1ULL << 1))) + \ |
12 | (!!((w) & (1ULL << 2))) + \ |
13 | (!!((w) & (1ULL << 3))) + \ |
14 | (!!((w) & (1ULL << 4))) + \ |
15 | (!!((w) & (1ULL << 5))) + \ |
16 | (!!((w) & (1ULL << 6))) + \ |
17 | (!!((w) & (1ULL << 7))))) |
18 | |
19 | #define __const_hweight16(w) (__const_hweight8(w) + __const_hweight8((w) >> 8 )) |
20 | #define __const_hweight32(w) (__const_hweight16(w) + __const_hweight16((w) >> 16)) |
21 | #define __const_hweight64(w) (__const_hweight32(w) + __const_hweight32((w) >> 32)) |
22 | |
23 | /* |
24 | * Generic interface. |
25 | */ |
26 | #define hweight8(w) (__builtin_constant_p(w) ? __const_hweight8(w) : __arch_hweight8(w)) |
27 | #define hweight16(w) (__builtin_constant_p(w) ? __const_hweight16(w) : __arch_hweight16(w)) |
28 | #define hweight32(w) (__builtin_constant_p(w) ? __const_hweight32(w) : __arch_hweight32(w)) |
29 | #define hweight64(w) (__builtin_constant_p(w) ? __const_hweight64(w) : __arch_hweight64(w)) |
30 | |
31 | /* |
32 | * Interface for known constant arguments |
33 | */ |
34 | #define HWEIGHT8(w) (BUILD_BUG_ON_ZERO(!__builtin_constant_p(w)) + __const_hweight8(w)) |
35 | #define HWEIGHT16(w) (BUILD_BUG_ON_ZERO(!__builtin_constant_p(w)) + __const_hweight16(w)) |
36 | #define HWEIGHT32(w) (BUILD_BUG_ON_ZERO(!__builtin_constant_p(w)) + __const_hweight32(w)) |
37 | #define HWEIGHT64(w) (BUILD_BUG_ON_ZERO(!__builtin_constant_p(w)) + __const_hweight64(w)) |
38 | |
39 | /* |
40 | * Type invariant interface to the compile time constant hweight functions. |
41 | */ |
42 | #define HWEIGHT(w) HWEIGHT64((u64)w) |
43 | |
44 | #endif /* _ASM_GENERIC_BITOPS_CONST_HWEIGHT_H_ */ |
45 | |