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