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