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> 2264ff3128SAnton Blanchard 2364ff3128SAnton Blanchard/* Note: This code relies on -mminimal-toc */ 2464ff3128SAnton Blanchard 2564ff3128SAnton Blanchard_GLOBAL(__arch_hweight8) 2664ff3128SAnton BlanchardBEGIN_FTR_SECTION 2764ff3128SAnton Blanchard b .__sw_hweight8 2864ff3128SAnton Blanchard nop 2964ff3128SAnton Blanchard nop 3064ff3128SAnton BlanchardFTR_SECTION_ELSE 31c75df6f9SMichael Neuling PPC_POPCNTB(R3,R3) 3264ff3128SAnton Blanchard clrldi r3,r3,64-8 3364ff3128SAnton Blanchard blr 3464ff3128SAnton BlanchardALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB) 3564ff3128SAnton Blanchard 3664ff3128SAnton Blanchard_GLOBAL(__arch_hweight16) 3764ff3128SAnton BlanchardBEGIN_FTR_SECTION 3864ff3128SAnton Blanchard b .__sw_hweight16 3964ff3128SAnton Blanchard nop 4064ff3128SAnton Blanchard nop 4164ff3128SAnton Blanchard nop 4264ff3128SAnton Blanchard nop 4364ff3128SAnton BlanchardFTR_SECTION_ELSE 4464ff3128SAnton Blanchard BEGIN_FTR_SECTION_NESTED(50) 45c75df6f9SMichael Neuling PPC_POPCNTB(R3,R3) 4664ff3128SAnton Blanchard srdi r4,r3,8 4764ff3128SAnton Blanchard add r3,r4,r3 4864ff3128SAnton Blanchard clrldi r3,r3,64-8 4964ff3128SAnton Blanchard blr 5064ff3128SAnton Blanchard FTR_SECTION_ELSE_NESTED(50) 5164ff3128SAnton Blanchard clrlwi r3,r3,16 52c75df6f9SMichael Neuling PPC_POPCNTW(R3,R3) 5364ff3128SAnton Blanchard clrldi r3,r3,64-8 5464ff3128SAnton Blanchard blr 5564ff3128SAnton Blanchard ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 50) 5664ff3128SAnton BlanchardALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB) 5764ff3128SAnton Blanchard 5864ff3128SAnton Blanchard_GLOBAL(__arch_hweight32) 5964ff3128SAnton BlanchardBEGIN_FTR_SECTION 6064ff3128SAnton Blanchard b .__sw_hweight32 6164ff3128SAnton Blanchard nop 6264ff3128SAnton Blanchard nop 6364ff3128SAnton Blanchard nop 6464ff3128SAnton Blanchard nop 6564ff3128SAnton Blanchard nop 6664ff3128SAnton Blanchard nop 6764ff3128SAnton BlanchardFTR_SECTION_ELSE 6864ff3128SAnton Blanchard BEGIN_FTR_SECTION_NESTED(51) 69c75df6f9SMichael Neuling PPC_POPCNTB(R3,R3) 7064ff3128SAnton Blanchard srdi r4,r3,16 7164ff3128SAnton Blanchard add r3,r4,r3 7264ff3128SAnton Blanchard srdi r4,r3,8 7364ff3128SAnton Blanchard add r3,r4,r3 7464ff3128SAnton Blanchard clrldi r3,r3,64-8 7564ff3128SAnton Blanchard blr 7664ff3128SAnton Blanchard FTR_SECTION_ELSE_NESTED(51) 77c75df6f9SMichael Neuling PPC_POPCNTW(R3,R3) 7864ff3128SAnton Blanchard clrldi r3,r3,64-8 7964ff3128SAnton Blanchard blr 8064ff3128SAnton Blanchard ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 51) 8164ff3128SAnton BlanchardALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB) 8264ff3128SAnton Blanchard 8364ff3128SAnton Blanchard_GLOBAL(__arch_hweight64) 8464ff3128SAnton BlanchardBEGIN_FTR_SECTION 8564ff3128SAnton Blanchard b .__sw_hweight64 8664ff3128SAnton Blanchard nop 8764ff3128SAnton Blanchard nop 8864ff3128SAnton Blanchard nop 8964ff3128SAnton Blanchard nop 9064ff3128SAnton Blanchard nop 9164ff3128SAnton Blanchard nop 9264ff3128SAnton Blanchard nop 9364ff3128SAnton Blanchard nop 9464ff3128SAnton BlanchardFTR_SECTION_ELSE 9564ff3128SAnton Blanchard BEGIN_FTR_SECTION_NESTED(52) 96c75df6f9SMichael Neuling PPC_POPCNTB(R3,R3) 9764ff3128SAnton Blanchard srdi r4,r3,32 9864ff3128SAnton Blanchard add r3,r4,r3 9964ff3128SAnton Blanchard srdi r4,r3,16 10064ff3128SAnton Blanchard add r3,r4,r3 10164ff3128SAnton Blanchard srdi r4,r3,8 10264ff3128SAnton Blanchard add r3,r4,r3 10364ff3128SAnton Blanchard clrldi r3,r3,64-8 10464ff3128SAnton Blanchard blr 10564ff3128SAnton Blanchard FTR_SECTION_ELSE_NESTED(52) 106c75df6f9SMichael Neuling PPC_POPCNTD(R3,R3) 10764ff3128SAnton Blanchard clrldi r3,r3,64-8 10864ff3128SAnton Blanchard blr 10964ff3128SAnton Blanchard ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 52) 11064ff3128SAnton BlanchardALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB) 111