Path: blob/master/arch/riscv/include/asm/arch_hweight.h
50843 views
/* SPDX-License-Identifier: GPL-2.0 */1/*2* Based on arch/x86/include/asm/arch_hweight.h3*/45#ifndef _ASM_RISCV_HWEIGHT_H6#define _ASM_RISCV_HWEIGHT_H78#include <asm/alternative-macros.h>9#include <asm/hwcap.h>1011#if (BITS_PER_LONG == 64)12#define CPOPW "cpopw "13#elif (BITS_PER_LONG == 32)14#define CPOPW "cpop "15#else16#error "Unexpected BITS_PER_LONG"17#endif1819static __always_inline unsigned int __arch_hweight32(unsigned int w)20{21if (!(IS_ENABLED(CONFIG_RISCV_ISA_ZBB) &&22IS_ENABLED(CONFIG_TOOLCHAIN_HAS_ZBB) &&23riscv_has_extension_likely(RISCV_ISA_EXT_ZBB)))24return __sw_hweight32(w);2526asm (".option push\n"27".option arch,+zbb\n"28CPOPW "%0, %1\n"29".option pop\n"30: "=r" (w) : "r" (w) :);3132return w;33}3435static inline unsigned int __arch_hweight16(unsigned int w)36{37return __arch_hweight32(w & 0xffff);38}3940static inline unsigned int __arch_hweight8(unsigned int w)41{42return __arch_hweight32(w & 0xff);43}4445#if BITS_PER_LONG == 6446static __always_inline unsigned long __arch_hweight64(__u64 w)47{48if (!(IS_ENABLED(CONFIG_RISCV_ISA_ZBB) &&49IS_ENABLED(CONFIG_TOOLCHAIN_HAS_ZBB) &&50riscv_has_extension_likely(RISCV_ISA_EXT_ZBB)))51return __sw_hweight64(w);5253asm (".option push\n"54".option arch,+zbb\n"55"cpop %0, %1\n"56".option pop\n"57: "=r" (w) : "r" (w) :);5859return w;60}61#else /* BITS_PER_LONG == 64 */62static inline unsigned long __arch_hweight64(__u64 w)63{64return __arch_hweight32((u32)w) +65__arch_hweight32((u32)(w >> 32));66}67#endif /* !(BITS_PER_LONG == 64) */6869#endif /* _ASM_RISCV_HWEIGHT_H */707172