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