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