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