|  | /* SPDX-License-Identifier: GPL-2.0 */ | 
|  | #ifndef _ASM_X86_HWEIGHT_H | 
|  | #define _ASM_X86_HWEIGHT_H | 
|  |  | 
|  | #include <asm/cpufeatures.h> | 
|  |  | 
|  | #ifdef CONFIG_64BIT | 
|  | #define REG_IN "D" | 
|  | #define REG_OUT "a" | 
|  | #else | 
|  | #define REG_IN "a" | 
|  | #define REG_OUT "a" | 
|  | #endif | 
|  |  | 
|  | static __always_inline unsigned int __arch_hweight32(unsigned int w) | 
|  | { | 
|  | unsigned int res; | 
|  |  | 
|  | asm (ALTERNATIVE("call __sw_hweight32", "popcntl %1, %0", X86_FEATURE_POPCNT) | 
|  | : "="REG_OUT (res) | 
|  | : REG_IN (w)); | 
|  |  | 
|  | return res; | 
|  | } | 
|  |  | 
|  | static inline unsigned int __arch_hweight16(unsigned int w) | 
|  | { | 
|  | return __arch_hweight32(w & 0xffff); | 
|  | } | 
|  |  | 
|  | static inline unsigned int __arch_hweight8(unsigned int w) | 
|  | { | 
|  | return __arch_hweight32(w & 0xff); | 
|  | } | 
|  |  | 
|  | #ifdef CONFIG_X86_32 | 
|  | static inline unsigned long __arch_hweight64(__u64 w) | 
|  | { | 
|  | return  __arch_hweight32((u32)w) + | 
|  | __arch_hweight32((u32)(w >> 32)); | 
|  | } | 
|  | #else | 
|  | static __always_inline unsigned long __arch_hweight64(__u64 w) | 
|  | { | 
|  | unsigned long res; | 
|  |  | 
|  | asm (ALTERNATIVE("call __sw_hweight64", "popcntq %1, %0", X86_FEATURE_POPCNT) | 
|  | : "="REG_OUT (res) | 
|  | : REG_IN (w)); | 
|  |  | 
|  | return res; | 
|  | } | 
|  | #endif /* CONFIG_X86_32 */ | 
|  |  | 
|  | #endif |