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