164ff3128SAnton Blanchard/* 264ff3128SAnton Blanchard * This program is free software; you can redistribute it and/or modify 364ff3128SAnton Blanchard * it under the terms of the GNU General Public License as published by 464ff3128SAnton Blanchard * the Free Software Foundation; either version 2 of the License, or 564ff3128SAnton Blanchard * (at your option) any later version. 664ff3128SAnton Blanchard * 764ff3128SAnton Blanchard * This program is distributed in the hope that it will be useful, 864ff3128SAnton Blanchard * but WITHOUT ANY WARRANTY; without even the implied warranty of 964ff3128SAnton Blanchard * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1064ff3128SAnton Blanchard * GNU General Public License for more details. 1164ff3128SAnton Blanchard * 1264ff3128SAnton Blanchard * You should have received a copy of the GNU General Public License 1364ff3128SAnton Blanchard * along with this program; if not, write to the Free Software 1464ff3128SAnton Blanchard * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 1564ff3128SAnton Blanchard * 1664ff3128SAnton Blanchard * Copyright (C) IBM Corporation, 2010 1764ff3128SAnton Blanchard * 1864ff3128SAnton Blanchard * Author: Anton Blanchard <anton@au.ibm.com> 1964ff3128SAnton Blanchard */ 2064ff3128SAnton Blanchard#include <asm/processor.h> 2164ff3128SAnton Blanchard#include <asm/ppc_asm.h> 229445aa1aSAl Viro#include <asm/export.h> 2364ff3128SAnton Blanchard 2464ff3128SAnton Blanchard/* Note: This code relies on -mminimal-toc */ 2564ff3128SAnton Blanchard 2664ff3128SAnton Blanchard_GLOBAL(__arch_hweight8) 2764ff3128SAnton BlanchardBEGIN_FTR_SECTION 28b1576fecSAnton Blanchard b __sw_hweight8 2964ff3128SAnton Blanchard nop 3064ff3128SAnton Blanchard nop 3164ff3128SAnton BlanchardFTR_SECTION_ELSE 32c75df6f9SMichael Neuling PPC_POPCNTB(R3,R3) 3364ff3128SAnton Blanchard clrldi r3,r3,64-8 3464ff3128SAnton Blanchard blr 3564ff3128SAnton BlanchardALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB) 369445aa1aSAl ViroEXPORT_SYMBOL(__arch_hweight8) 3764ff3128SAnton Blanchard 3864ff3128SAnton Blanchard_GLOBAL(__arch_hweight16) 3964ff3128SAnton BlanchardBEGIN_FTR_SECTION 40b1576fecSAnton Blanchard b __sw_hweight16 4164ff3128SAnton Blanchard nop 4264ff3128SAnton Blanchard nop 4364ff3128SAnton Blanchard nop 4464ff3128SAnton Blanchard nop 4564ff3128SAnton BlanchardFTR_SECTION_ELSE 4664ff3128SAnton Blanchard BEGIN_FTR_SECTION_NESTED(50) 47c75df6f9SMichael Neuling PPC_POPCNTB(R3,R3) 4864ff3128SAnton Blanchard srdi r4,r3,8 4964ff3128SAnton Blanchard add r3,r4,r3 5064ff3128SAnton Blanchard clrldi r3,r3,64-8 5164ff3128SAnton Blanchard blr 5264ff3128SAnton Blanchard FTR_SECTION_ELSE_NESTED(50) 5364ff3128SAnton Blanchard clrlwi r3,r3,16 54c75df6f9SMichael Neuling PPC_POPCNTW(R3,R3) 5564ff3128SAnton Blanchard clrldi r3,r3,64-8 5664ff3128SAnton Blanchard blr 5764ff3128SAnton Blanchard ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 50) 5864ff3128SAnton BlanchardALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB) 599445aa1aSAl ViroEXPORT_SYMBOL(__arch_hweight16) 6064ff3128SAnton Blanchard 6164ff3128SAnton Blanchard_GLOBAL(__arch_hweight32) 6264ff3128SAnton BlanchardBEGIN_FTR_SECTION 63b1576fecSAnton Blanchard b __sw_hweight32 6464ff3128SAnton Blanchard nop 6564ff3128SAnton Blanchard nop 6664ff3128SAnton Blanchard nop 6764ff3128SAnton Blanchard nop 6864ff3128SAnton Blanchard nop 6964ff3128SAnton Blanchard nop 7064ff3128SAnton BlanchardFTR_SECTION_ELSE 7164ff3128SAnton Blanchard BEGIN_FTR_SECTION_NESTED(51) 72c75df6f9SMichael Neuling PPC_POPCNTB(R3,R3) 7364ff3128SAnton Blanchard srdi r4,r3,16 7464ff3128SAnton Blanchard add r3,r4,r3 7564ff3128SAnton Blanchard srdi r4,r3,8 7664ff3128SAnton Blanchard add r3,r4,r3 7764ff3128SAnton Blanchard clrldi r3,r3,64-8 7864ff3128SAnton Blanchard blr 7964ff3128SAnton Blanchard FTR_SECTION_ELSE_NESTED(51) 80c75df6f9SMichael Neuling PPC_POPCNTW(R3,R3) 8164ff3128SAnton Blanchard clrldi r3,r3,64-8 8264ff3128SAnton Blanchard blr 8364ff3128SAnton Blanchard ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 51) 8464ff3128SAnton BlanchardALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB) 859445aa1aSAl ViroEXPORT_SYMBOL(__arch_hweight32) 8664ff3128SAnton Blanchard 8764ff3128SAnton Blanchard_GLOBAL(__arch_hweight64) 8864ff3128SAnton BlanchardBEGIN_FTR_SECTION 89b1576fecSAnton Blanchard b __sw_hweight64 9064ff3128SAnton Blanchard nop 9164ff3128SAnton Blanchard nop 9264ff3128SAnton Blanchard nop 9364ff3128SAnton Blanchard nop 9464ff3128SAnton Blanchard nop 9564ff3128SAnton Blanchard nop 9664ff3128SAnton Blanchard nop 9764ff3128SAnton Blanchard nop 9864ff3128SAnton BlanchardFTR_SECTION_ELSE 9964ff3128SAnton Blanchard BEGIN_FTR_SECTION_NESTED(52) 100c75df6f9SMichael Neuling PPC_POPCNTB(R3,R3) 10164ff3128SAnton Blanchard srdi r4,r3,32 10264ff3128SAnton Blanchard add r3,r4,r3 10364ff3128SAnton Blanchard srdi r4,r3,16 10464ff3128SAnton Blanchard add r3,r4,r3 10564ff3128SAnton Blanchard srdi r4,r3,8 10664ff3128SAnton Blanchard add r3,r4,r3 10764ff3128SAnton Blanchard clrldi r3,r3,64-8 10864ff3128SAnton Blanchard blr 10964ff3128SAnton Blanchard FTR_SECTION_ELSE_NESTED(52) 110c75df6f9SMichael Neuling PPC_POPCNTD(R3,R3) 11164ff3128SAnton Blanchard clrldi r3,r3,64-8 11264ff3128SAnton Blanchard blr 11364ff3128SAnton Blanchard ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 52) 11464ff3128SAnton BlanchardALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB) 1159445aa1aSAl ViroEXPORT_SYMBOL(__arch_hweight64) 116