Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : #ifndef _ASM_X86_HWEIGHT_H 3 : : #define _ASM_X86_HWEIGHT_H 4 : : 5 : : #include <asm/cpufeatures.h> 6 : : 7 : : #ifdef CONFIG_64BIT 8 : : #define REG_IN "D" 9 : : #define REG_OUT "a" 10 : : #else 11 : : #define REG_IN "a" 12 : : #define REG_OUT "a" 13 : : #endif 14 : : 15 : 198 : static __always_inline unsigned int __arch_hweight32(unsigned int w) 16 : : { 17 : 198 : unsigned int res; 18 : : 19 : 198 : asm (ALTERNATIVE("call __sw_hweight32", "popcntl %1, %0", X86_FEATURE_POPCNT) 20 : : : "="REG_OUT (res) 21 : : : REG_IN (w)); 22 : : 23 [ # # ]: 198 : return res; 24 : : } 25 : : 26 : 0 : static inline unsigned int __arch_hweight16(unsigned int w) 27 : : { 28 : 0 : return __arch_hweight32(w & 0xffff); 29 : : } 30 : : 31 : 0 : static inline unsigned int __arch_hweight8(unsigned int w) 32 : : { 33 : 0 : return __arch_hweight32(w & 0xff); 34 : : } 35 : : 36 : : #ifdef CONFIG_X86_32 37 : : static inline unsigned long __arch_hweight64(__u64 w) 38 : : { 39 : : return __arch_hweight32((u32)w) + 40 : : __arch_hweight32((u32)(w >> 32)); 41 : : } 42 : : #else 43 : 1100 : static __always_inline unsigned long __arch_hweight64(__u64 w) 44 : : { 45 : 1100 : unsigned long res; 46 : : 47 : 1100 : asm (ALTERNATIVE("call __sw_hweight64", "popcntq %1, %0", X86_FEATURE_POPCNT) 48 : : : "="REG_OUT (res) 49 : : : REG_IN (w)); 50 : : 51 : 1100 : return res; 52 : : } 53 : : #endif /* CONFIG_X86_32 */ 54 : : 55 : : #endif