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 3164ff3128SAnton Blanchard 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) 4564ff3128SAnton Blanchard 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 5264ff3128SAnton Blanchard 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) 6964ff3128SAnton Blanchard 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) 7764ff3128SAnton Blanchard 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) 9664ff3128SAnton Blanchard 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) 10664ff3128SAnton Blanchard 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