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 static __always_inline unsigned int __arch_hweight32(unsigned int w) 16 { 17 unsigned int res; 18 19 asm (ALTERNATIVE("call __sw_hweight32", "popcntl %1, %0", X86_FEATURE_POPCNT) 20 : "="REG_OUT (res) 21 : REG_IN (w)); 22 23 return res; 24 } 25 26 static inline unsigned int __arch_hweight16(unsigned int w) 27 { 28 return __arch_hweight32(w & 0xffff); 29 } 30 31 static inline unsigned int __arch_hweight8(unsigned int w) 32 { 33 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 static __always_inline unsigned long __arch_hweight64(__u64 w) 44 { 45 unsigned long res; 46 47 asm (ALTERNATIVE("call __sw_hweight64", "popcntq %1, %0", X86_FEATURE_POPCNT) 48 : "="REG_OUT (res) 49 : REG_IN (w)); 50 51 return res; 52 } 53 #endif /* CONFIG_X86_32 */ 54 55 #endif 56