1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Based on arch/x86/include/asm/arch_hweight.h
6 #ifndef _ASM_RISCV_HWEIGHT_H
7 #define _ASM_RISCV_HWEIGHT_H
9 #include <asm/alternative-macros.h>
10 #include <asm/hwcap.h>
12 #if (BITS_PER_LONG == 64)
13 #define CPOPW "cpopw "
14 #elif (BITS_PER_LONG == 32)
17 #error "Unexpected BITS_PER_LONG"
20 static __always_inline
unsigned int __arch_hweight32(unsigned int w
)
22 #ifdef CONFIG_RISCV_ISA_ZBB
23 asm goto(ALTERNATIVE("j %l[legacy]", "nop", 0,
31 : "=r" (w
) : "r" (w
) :);
37 return __sw_hweight32(w
);
40 static inline unsigned int __arch_hweight16(unsigned int w
)
42 return __arch_hweight32(w
& 0xffff);
45 static inline unsigned int __arch_hweight8(unsigned int w
)
47 return __arch_hweight32(w
& 0xff);
50 #if BITS_PER_LONG == 64
51 static __always_inline
unsigned long __arch_hweight64(__u64 w
)
53 # ifdef CONFIG_RISCV_ISA_ZBB
54 asm goto(ALTERNATIVE("j %l[legacy]", "nop", 0,
62 : "=r" (w
) : "r" (w
) :);
68 return __sw_hweight64(w
);
70 #else /* BITS_PER_LONG == 64 */
71 static inline unsigned long __arch_hweight64(__u64 w
)
73 return __arch_hweight32((u32
)w
) +
74 __arch_hweight32((u32
)(w
>> 32));
76 #endif /* !(BITS_PER_LONG == 64) */
78 #endif /* _ASM_RISCV_HWEIGHT_H */