1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun/* 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) IBM Corporation, 2010 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Author: Anton Blanchard <anton@au.ibm.com> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun#include <asm/processor.h> 9*4882a593Smuzhiyun#include <asm/ppc_asm.h> 10*4882a593Smuzhiyun#include <asm/export.h> 11*4882a593Smuzhiyun#include <asm/feature-fixups.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun/* Note: This code relies on -mminimal-toc */ 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun_GLOBAL(__arch_hweight8) 16*4882a593SmuzhiyunBEGIN_FTR_SECTION 17*4882a593Smuzhiyun b __sw_hweight8 18*4882a593Smuzhiyun nop 19*4882a593Smuzhiyun nop 20*4882a593SmuzhiyunFTR_SECTION_ELSE 21*4882a593Smuzhiyun PPC_POPCNTB(R3,R3) 22*4882a593Smuzhiyun clrldi r3,r3,64-8 23*4882a593Smuzhiyun blr 24*4882a593SmuzhiyunALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB) 25*4882a593SmuzhiyunEXPORT_SYMBOL(__arch_hweight8) 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun_GLOBAL(__arch_hweight16) 28*4882a593SmuzhiyunBEGIN_FTR_SECTION 29*4882a593Smuzhiyun b __sw_hweight16 30*4882a593Smuzhiyun nop 31*4882a593Smuzhiyun nop 32*4882a593Smuzhiyun nop 33*4882a593Smuzhiyun nop 34*4882a593SmuzhiyunFTR_SECTION_ELSE 35*4882a593Smuzhiyun BEGIN_FTR_SECTION_NESTED(50) 36*4882a593Smuzhiyun PPC_POPCNTB(R3,R3) 37*4882a593Smuzhiyun srdi r4,r3,8 38*4882a593Smuzhiyun add r3,r4,r3 39*4882a593Smuzhiyun clrldi r3,r3,64-8 40*4882a593Smuzhiyun blr 41*4882a593Smuzhiyun FTR_SECTION_ELSE_NESTED(50) 42*4882a593Smuzhiyun clrlwi r3,r3,16 43*4882a593Smuzhiyun PPC_POPCNTW(R3,R3) 44*4882a593Smuzhiyun clrldi r3,r3,64-8 45*4882a593Smuzhiyun blr 46*4882a593Smuzhiyun ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 50) 47*4882a593SmuzhiyunALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB) 48*4882a593SmuzhiyunEXPORT_SYMBOL(__arch_hweight16) 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun_GLOBAL(__arch_hweight32) 51*4882a593SmuzhiyunBEGIN_FTR_SECTION 52*4882a593Smuzhiyun b __sw_hweight32 53*4882a593Smuzhiyun nop 54*4882a593Smuzhiyun nop 55*4882a593Smuzhiyun nop 56*4882a593Smuzhiyun nop 57*4882a593Smuzhiyun nop 58*4882a593Smuzhiyun nop 59*4882a593SmuzhiyunFTR_SECTION_ELSE 60*4882a593Smuzhiyun BEGIN_FTR_SECTION_NESTED(51) 61*4882a593Smuzhiyun PPC_POPCNTB(R3,R3) 62*4882a593Smuzhiyun srdi r4,r3,16 63*4882a593Smuzhiyun add r3,r4,r3 64*4882a593Smuzhiyun srdi r4,r3,8 65*4882a593Smuzhiyun add r3,r4,r3 66*4882a593Smuzhiyun clrldi r3,r3,64-8 67*4882a593Smuzhiyun blr 68*4882a593Smuzhiyun FTR_SECTION_ELSE_NESTED(51) 69*4882a593Smuzhiyun PPC_POPCNTW(R3,R3) 70*4882a593Smuzhiyun clrldi r3,r3,64-8 71*4882a593Smuzhiyun blr 72*4882a593Smuzhiyun ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 51) 73*4882a593SmuzhiyunALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB) 74*4882a593SmuzhiyunEXPORT_SYMBOL(__arch_hweight32) 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun_GLOBAL(__arch_hweight64) 77*4882a593SmuzhiyunBEGIN_FTR_SECTION 78*4882a593Smuzhiyun b __sw_hweight64 79*4882a593Smuzhiyun nop 80*4882a593Smuzhiyun nop 81*4882a593Smuzhiyun nop 82*4882a593Smuzhiyun nop 83*4882a593Smuzhiyun nop 84*4882a593Smuzhiyun nop 85*4882a593Smuzhiyun nop 86*4882a593Smuzhiyun nop 87*4882a593SmuzhiyunFTR_SECTION_ELSE 88*4882a593Smuzhiyun BEGIN_FTR_SECTION_NESTED(52) 89*4882a593Smuzhiyun PPC_POPCNTB(R3,R3) 90*4882a593Smuzhiyun srdi r4,r3,32 91*4882a593Smuzhiyun add r3,r4,r3 92*4882a593Smuzhiyun srdi r4,r3,16 93*4882a593Smuzhiyun add r3,r4,r3 94*4882a593Smuzhiyun srdi r4,r3,8 95*4882a593Smuzhiyun add r3,r4,r3 96*4882a593Smuzhiyun clrldi r3,r3,64-8 97*4882a593Smuzhiyun blr 98*4882a593Smuzhiyun FTR_SECTION_ELSE_NESTED(52) 99*4882a593Smuzhiyun PPC_POPCNTD(R3,R3) 100*4882a593Smuzhiyun clrldi r3,r3,64-8 101*4882a593Smuzhiyun blr 102*4882a593Smuzhiyun ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 52) 103*4882a593SmuzhiyunALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB) 104*4882a593SmuzhiyunEXPORT_SYMBOL(__arch_hweight64) 105