18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Copyright (C) IBM Corporation, 2010
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * Author: Anton Blanchard <anton@au.ibm.com>
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci#include <asm/processor.h>
98c2ecf20Sopenharmony_ci#include <asm/ppc_asm.h>
108c2ecf20Sopenharmony_ci#include <asm/export.h>
118c2ecf20Sopenharmony_ci#include <asm/feature-fixups.h>
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci/* Note: This code relies on -mminimal-toc */
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci_GLOBAL(__arch_hweight8)
168c2ecf20Sopenharmony_ciBEGIN_FTR_SECTION
178c2ecf20Sopenharmony_ci	b __sw_hweight8
188c2ecf20Sopenharmony_ci	nop
198c2ecf20Sopenharmony_ci	nop
208c2ecf20Sopenharmony_ciFTR_SECTION_ELSE
218c2ecf20Sopenharmony_ci	PPC_POPCNTB(R3,R3)
228c2ecf20Sopenharmony_ci	clrldi	r3,r3,64-8
238c2ecf20Sopenharmony_ci	blr
248c2ecf20Sopenharmony_ciALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB)
258c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__arch_hweight8)
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci_GLOBAL(__arch_hweight16)
288c2ecf20Sopenharmony_ciBEGIN_FTR_SECTION
298c2ecf20Sopenharmony_ci	b __sw_hweight16
308c2ecf20Sopenharmony_ci	nop
318c2ecf20Sopenharmony_ci	nop
328c2ecf20Sopenharmony_ci	nop
338c2ecf20Sopenharmony_ci	nop
348c2ecf20Sopenharmony_ciFTR_SECTION_ELSE
358c2ecf20Sopenharmony_ci  BEGIN_FTR_SECTION_NESTED(50)
368c2ecf20Sopenharmony_ci	PPC_POPCNTB(R3,R3)
378c2ecf20Sopenharmony_ci	srdi	r4,r3,8
388c2ecf20Sopenharmony_ci	add	r3,r4,r3
398c2ecf20Sopenharmony_ci	clrldi	r3,r3,64-8
408c2ecf20Sopenharmony_ci	blr
418c2ecf20Sopenharmony_ci  FTR_SECTION_ELSE_NESTED(50)
428c2ecf20Sopenharmony_ci	clrlwi  r3,r3,16
438c2ecf20Sopenharmony_ci	PPC_POPCNTW(R3,R3)
448c2ecf20Sopenharmony_ci	clrldi	r3,r3,64-8
458c2ecf20Sopenharmony_ci	blr
468c2ecf20Sopenharmony_ci  ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 50)
478c2ecf20Sopenharmony_ciALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB)
488c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__arch_hweight16)
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci_GLOBAL(__arch_hweight32)
518c2ecf20Sopenharmony_ciBEGIN_FTR_SECTION
528c2ecf20Sopenharmony_ci	b __sw_hweight32
538c2ecf20Sopenharmony_ci	nop
548c2ecf20Sopenharmony_ci	nop
558c2ecf20Sopenharmony_ci	nop
568c2ecf20Sopenharmony_ci	nop
578c2ecf20Sopenharmony_ci	nop
588c2ecf20Sopenharmony_ci	nop
598c2ecf20Sopenharmony_ciFTR_SECTION_ELSE
608c2ecf20Sopenharmony_ci  BEGIN_FTR_SECTION_NESTED(51)
618c2ecf20Sopenharmony_ci	PPC_POPCNTB(R3,R3)
628c2ecf20Sopenharmony_ci	srdi	r4,r3,16
638c2ecf20Sopenharmony_ci	add	r3,r4,r3
648c2ecf20Sopenharmony_ci	srdi	r4,r3,8
658c2ecf20Sopenharmony_ci	add	r3,r4,r3
668c2ecf20Sopenharmony_ci	clrldi	r3,r3,64-8
678c2ecf20Sopenharmony_ci	blr
688c2ecf20Sopenharmony_ci  FTR_SECTION_ELSE_NESTED(51)
698c2ecf20Sopenharmony_ci	PPC_POPCNTW(R3,R3)
708c2ecf20Sopenharmony_ci	clrldi	r3,r3,64-8
718c2ecf20Sopenharmony_ci	blr
728c2ecf20Sopenharmony_ci  ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 51)
738c2ecf20Sopenharmony_ciALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB)
748c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__arch_hweight32)
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ci_GLOBAL(__arch_hweight64)
778c2ecf20Sopenharmony_ciBEGIN_FTR_SECTION
788c2ecf20Sopenharmony_ci	b __sw_hweight64
798c2ecf20Sopenharmony_ci	nop
808c2ecf20Sopenharmony_ci	nop
818c2ecf20Sopenharmony_ci	nop
828c2ecf20Sopenharmony_ci	nop
838c2ecf20Sopenharmony_ci	nop
848c2ecf20Sopenharmony_ci	nop
858c2ecf20Sopenharmony_ci	nop
868c2ecf20Sopenharmony_ci	nop
878c2ecf20Sopenharmony_ciFTR_SECTION_ELSE
888c2ecf20Sopenharmony_ci  BEGIN_FTR_SECTION_NESTED(52)
898c2ecf20Sopenharmony_ci	PPC_POPCNTB(R3,R3)
908c2ecf20Sopenharmony_ci	srdi	r4,r3,32
918c2ecf20Sopenharmony_ci	add	r3,r4,r3
928c2ecf20Sopenharmony_ci	srdi	r4,r3,16
938c2ecf20Sopenharmony_ci	add	r3,r4,r3
948c2ecf20Sopenharmony_ci	srdi	r4,r3,8
958c2ecf20Sopenharmony_ci	add	r3,r4,r3
968c2ecf20Sopenharmony_ci	clrldi	r3,r3,64-8
978c2ecf20Sopenharmony_ci	blr
988c2ecf20Sopenharmony_ci  FTR_SECTION_ELSE_NESTED(52)
998c2ecf20Sopenharmony_ci	PPC_POPCNTD(R3,R3)
1008c2ecf20Sopenharmony_ci	clrldi	r3,r3,64-8
1018c2ecf20Sopenharmony_ci	blr
1028c2ecf20Sopenharmony_ci  ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 52)
1038c2ecf20Sopenharmony_ciALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB)
1048c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__arch_hweight64)
105