162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright (C) IBM Corporation, 2010
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Author: Anton Blanchard <anton@au.ibm.com>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci#include <linux/export.h>
962306a36Sopenharmony_ci#include <asm/processor.h>
1062306a36Sopenharmony_ci#include <asm/ppc_asm.h>
1162306a36Sopenharmony_ci#include <asm/feature-fixups.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci/* Note: This code relies on -mminimal-toc */
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci_GLOBAL(__arch_hweight8)
1662306a36Sopenharmony_ciBEGIN_FTR_SECTION
1762306a36Sopenharmony_ci	b CFUNC(__sw_hweight8)
1862306a36Sopenharmony_ci	nop
1962306a36Sopenharmony_ci	nop
2062306a36Sopenharmony_ciFTR_SECTION_ELSE
2162306a36Sopenharmony_ci	PPC_POPCNTB(R3,R3)
2262306a36Sopenharmony_ci	clrldi	r3,r3,64-8
2362306a36Sopenharmony_ci	blr
2462306a36Sopenharmony_ciALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB)
2562306a36Sopenharmony_ciEXPORT_SYMBOL(__arch_hweight8)
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci_GLOBAL(__arch_hweight16)
2862306a36Sopenharmony_ciBEGIN_FTR_SECTION
2962306a36Sopenharmony_ci	b CFUNC(__sw_hweight16)
3062306a36Sopenharmony_ci	nop
3162306a36Sopenharmony_ci	nop
3262306a36Sopenharmony_ci	nop
3362306a36Sopenharmony_ci	nop
3462306a36Sopenharmony_ciFTR_SECTION_ELSE
3562306a36Sopenharmony_ci  BEGIN_FTR_SECTION_NESTED(50)
3662306a36Sopenharmony_ci	PPC_POPCNTB(R3,R3)
3762306a36Sopenharmony_ci	srdi	r4,r3,8
3862306a36Sopenharmony_ci	add	r3,r4,r3
3962306a36Sopenharmony_ci	clrldi	r3,r3,64-8
4062306a36Sopenharmony_ci	blr
4162306a36Sopenharmony_ci  FTR_SECTION_ELSE_NESTED(50)
4262306a36Sopenharmony_ci	clrlwi  r3,r3,16
4362306a36Sopenharmony_ci	PPC_POPCNTW(R3,R3)
4462306a36Sopenharmony_ci	clrldi	r3,r3,64-8
4562306a36Sopenharmony_ci	blr
4662306a36Sopenharmony_ci  ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 50)
4762306a36Sopenharmony_ciALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB)
4862306a36Sopenharmony_ciEXPORT_SYMBOL(__arch_hweight16)
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci_GLOBAL(__arch_hweight32)
5162306a36Sopenharmony_ciBEGIN_FTR_SECTION
5262306a36Sopenharmony_ci	b CFUNC(__sw_hweight32)
5362306a36Sopenharmony_ci	nop
5462306a36Sopenharmony_ci	nop
5562306a36Sopenharmony_ci	nop
5662306a36Sopenharmony_ci	nop
5762306a36Sopenharmony_ci	nop
5862306a36Sopenharmony_ci	nop
5962306a36Sopenharmony_ciFTR_SECTION_ELSE
6062306a36Sopenharmony_ci  BEGIN_FTR_SECTION_NESTED(51)
6162306a36Sopenharmony_ci	PPC_POPCNTB(R3,R3)
6262306a36Sopenharmony_ci	srdi	r4,r3,16
6362306a36Sopenharmony_ci	add	r3,r4,r3
6462306a36Sopenharmony_ci	srdi	r4,r3,8
6562306a36Sopenharmony_ci	add	r3,r4,r3
6662306a36Sopenharmony_ci	clrldi	r3,r3,64-8
6762306a36Sopenharmony_ci	blr
6862306a36Sopenharmony_ci  FTR_SECTION_ELSE_NESTED(51)
6962306a36Sopenharmony_ci	PPC_POPCNTW(R3,R3)
7062306a36Sopenharmony_ci	clrldi	r3,r3,64-8
7162306a36Sopenharmony_ci	blr
7262306a36Sopenharmony_ci  ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 51)
7362306a36Sopenharmony_ciALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB)
7462306a36Sopenharmony_ciEXPORT_SYMBOL(__arch_hweight32)
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci_GLOBAL(__arch_hweight64)
7762306a36Sopenharmony_ciBEGIN_FTR_SECTION
7862306a36Sopenharmony_ci	b CFUNC(__sw_hweight64)
7962306a36Sopenharmony_ci	nop
8062306a36Sopenharmony_ci	nop
8162306a36Sopenharmony_ci	nop
8262306a36Sopenharmony_ci	nop
8362306a36Sopenharmony_ci	nop
8462306a36Sopenharmony_ci	nop
8562306a36Sopenharmony_ci	nop
8662306a36Sopenharmony_ci	nop
8762306a36Sopenharmony_ciFTR_SECTION_ELSE
8862306a36Sopenharmony_ci  BEGIN_FTR_SECTION_NESTED(52)
8962306a36Sopenharmony_ci	PPC_POPCNTB(R3,R3)
9062306a36Sopenharmony_ci	srdi	r4,r3,32
9162306a36Sopenharmony_ci	add	r3,r4,r3
9262306a36Sopenharmony_ci	srdi	r4,r3,16
9362306a36Sopenharmony_ci	add	r3,r4,r3
9462306a36Sopenharmony_ci	srdi	r4,r3,8
9562306a36Sopenharmony_ci	add	r3,r4,r3
9662306a36Sopenharmony_ci	clrldi	r3,r3,64-8
9762306a36Sopenharmony_ci	blr
9862306a36Sopenharmony_ci  FTR_SECTION_ELSE_NESTED(52)
9962306a36Sopenharmony_ci	PPC_POPCNTD(R3,R3)
10062306a36Sopenharmony_ci	clrldi	r3,r3,64-8
10162306a36Sopenharmony_ci	blr
10262306a36Sopenharmony_ci  ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 52)
10362306a36Sopenharmony_ciALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB)
10462306a36Sopenharmony_ciEXPORT_SYMBOL(__arch_hweight64)
105