On 03/26/2016 11:06 PM, zhaoxiu.zeng wrote:
From: Zeng Zhaoxiu <zhaoxiu.zeng@xxxxxxxxx>
There is nothing MIPS specific here. Why not put it in asm-generic or some similar place where it can be shared by all architectures?
Also, are you sure __builtin_popcount() is available on all GCC versions that are supported for building the kernel?
David Daney
Signed-off-by: Zeng Zhaoxiu <zhaoxiu.zeng@xxxxxxxxx> --- arch/mips/include/asm/arch_parity.h | 44 +++++++++++++++++++++++++++++++++++++ arch/mips/include/asm/bitops.h | 3 +++ 2 files changed, 47 insertions(+) create mode 100644 arch/mips/include/asm/arch_parity.h diff --git a/arch/mips/include/asm/arch_parity.h b/arch/mips/include/asm/arch_parity.h new file mode 100644 index 0000000..23b3c23 --- /dev/null +++ b/arch/mips/include/asm/arch_parity.h @@ -0,0 +1,44 @@ +/* + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + */ +#ifndef _ASM_ARCH_PARITY_H +#define _ASM_ARCH_PARITY_H + +#ifdef ARCH_HAS_USABLE_BUILTIN_POPCOUNT + +#include <asm/types.h> + +static inline unsigned int __arch_parity32(unsigned int w) +{ + return __builtin_popcount(w) & 1; +} + +static inline unsigned int __arch_parity16(unsigned int w) +{ + return __arch_parity32(w & 0xffff); +} + +static inline unsigned int __arch_parity8(unsigned int w) +{ + return __arch_parity32(w & 0xff); +} + +static inline unsigned int __arch_parity4(unsigned int w) +{ + return __arch_parity32(w & 0xf); +} + +static inline unsigned int __arch_parity64(__u64 w) +{ + return (unsigned int)__builtin_popcountll(w) & 1; +} + +#else +#include <asm-generic/bitops/arch_hweight.h> +#include <asm-generic/bitops/arch_parity.h> +#endif + +#endif /* _ASM_ARCH_PARITY_H */ diff --git a/arch/mips/include/asm/bitops.h b/arch/mips/include/asm/bitops.h index ce9666c..0b87734 100644 --- a/arch/mips/include/asm/bitops.h +++ b/arch/mips/include/asm/bitops.h @@ -626,6 +626,9 @@ static inline int ffs(int word) #include <asm/arch_hweight.h> #include <asm-generic/bitops/const_hweight.h> +#include <asm/arch_parity.h> +#include <asm-generic/bitops/const_parity.h> + #include <asm-generic/bitops/le.h> #include <asm-generic/bitops/ext2-atomic.h>