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