xref: /openbmc/linux/arch/powerpc/lib/hweight_64.S (revision 9445aa1a)
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