Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[cascardo/linux.git] / arch / powerpc / lib / hweight_64.S
1 /*
2  * This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License as published by
4  * the Free Software Foundation; either version 2 of the License, or
5  * (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software
14  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
15  *
16  * Copyright (C) IBM Corporation, 2010
17  *
18  * Author: Anton Blanchard <anton@au.ibm.com>
19  */
20 #include <asm/processor.h>
21 #include <asm/ppc_asm.h>
22 #include <asm/export.h>
23
24 /* Note: This code relies on -mminimal-toc */
25
26 _GLOBAL(__arch_hweight8)
27 BEGIN_FTR_SECTION
28         b __sw_hweight8
29         nop
30         nop
31 FTR_SECTION_ELSE
32         PPC_POPCNTB(R3,R3)
33         clrldi  r3,r3,64-8
34         blr
35 ALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB)
36 EXPORT_SYMBOL(__arch_hweight8)
37
38 _GLOBAL(__arch_hweight16)
39 BEGIN_FTR_SECTION
40         b __sw_hweight16
41         nop
42         nop
43         nop
44         nop
45 FTR_SECTION_ELSE
46   BEGIN_FTR_SECTION_NESTED(50)
47         PPC_POPCNTB(R3,R3)
48         srdi    r4,r3,8
49         add     r3,r4,r3
50         clrldi  r3,r3,64-8
51         blr
52   FTR_SECTION_ELSE_NESTED(50)
53         clrlwi  r3,r3,16
54         PPC_POPCNTW(R3,R3)
55         clrldi  r3,r3,64-8
56         blr
57   ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 50)
58 ALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB)
59 EXPORT_SYMBOL(__arch_hweight16)
60
61 _GLOBAL(__arch_hweight32)
62 BEGIN_FTR_SECTION
63         b __sw_hweight32
64         nop
65         nop
66         nop
67         nop
68         nop
69         nop
70 FTR_SECTION_ELSE
71   BEGIN_FTR_SECTION_NESTED(51)
72         PPC_POPCNTB(R3,R3)
73         srdi    r4,r3,16
74         add     r3,r4,r3
75         srdi    r4,r3,8
76         add     r3,r4,r3
77         clrldi  r3,r3,64-8
78         blr
79   FTR_SECTION_ELSE_NESTED(51)
80         PPC_POPCNTW(R3,R3)
81         clrldi  r3,r3,64-8
82         blr
83   ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 51)
84 ALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB)
85 EXPORT_SYMBOL(__arch_hweight32)
86
87 _GLOBAL(__arch_hweight64)
88 BEGIN_FTR_SECTION
89         b __sw_hweight64
90         nop
91         nop
92         nop
93         nop
94         nop
95         nop
96         nop
97         nop
98 FTR_SECTION_ELSE
99   BEGIN_FTR_SECTION_NESTED(52)
100         PPC_POPCNTB(R3,R3)
101         srdi    r4,r3,32
102         add     r3,r4,r3
103         srdi    r4,r3,16
104         add     r3,r4,r3
105         srdi    r4,r3,8
106         add     r3,r4,r3
107         clrldi  r3,r3,64-8
108         blr
109   FTR_SECTION_ELSE_NESTED(52)
110         PPC_POPCNTD(R3,R3)
111         clrldi  r3,r3,64-8
112         blr
113   ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 52)
114 ALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB)
115 EXPORT_SYMBOL(__arch_hweight64)