1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* |
3 | * |
4 | * Copyright (C) IBM Corporation, 2010 |
5 | * |
6 | * Author: Anton Blanchard <anton@au.ibm.com> |
7 | */ |
8 | #include <linux/export.h> |
9 | #include <asm/processor.h> |
10 | #include <asm/ppc_asm.h> |
11 | #include <asm/feature-fixups.h> |
12 | |
13 | /* Note: This code relies on -mminimal-toc */ |
14 | |
15 | _GLOBAL(__arch_hweight8) |
16 | BEGIN_FTR_SECTION |
17 | b CFUNC(__sw_hweight8) |
18 | nop |
19 | nop |
20 | FTR_SECTION_ELSE |
21 | PPC_POPCNTB(R3,R3) |
22 | clrldi r3,r3,64-8 |
23 | blr |
24 | ALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB) |
25 | EXPORT_SYMBOL(__arch_hweight8) |
26 | |
27 | _GLOBAL(__arch_hweight16) |
28 | BEGIN_FTR_SECTION |
29 | b CFUNC(__sw_hweight16) |
30 | nop |
31 | nop |
32 | nop |
33 | nop |
34 | FTR_SECTION_ELSE |
35 | BEGIN_FTR_SECTION_NESTED(50) |
36 | PPC_POPCNTB(R3,R3) |
37 | srdi r4,r3,8 |
38 | add r3,r4,r3 |
39 | clrldi r3,r3,64-8 |
40 | blr |
41 | FTR_SECTION_ELSE_NESTED(50) |
42 | clrlwi r3,r3,16 |
43 | PPC_POPCNTW(R3,R3) |
44 | clrldi r3,r3,64-8 |
45 | blr |
46 | ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 50) |
47 | ALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB) |
48 | EXPORT_SYMBOL(__arch_hweight16) |
49 | |
50 | _GLOBAL(__arch_hweight32) |
51 | BEGIN_FTR_SECTION |
52 | b CFUNC(__sw_hweight32) |
53 | nop |
54 | nop |
55 | nop |
56 | nop |
57 | nop |
58 | nop |
59 | FTR_SECTION_ELSE |
60 | BEGIN_FTR_SECTION_NESTED(51) |
61 | PPC_POPCNTB(R3,R3) |
62 | srdi r4,r3,16 |
63 | add r3,r4,r3 |
64 | srdi r4,r3,8 |
65 | add r3,r4,r3 |
66 | clrldi r3,r3,64-8 |
67 | blr |
68 | FTR_SECTION_ELSE_NESTED(51) |
69 | PPC_POPCNTW(R3,R3) |
70 | clrldi r3,r3,64-8 |
71 | blr |
72 | ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 51) |
73 | ALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB) |
74 | EXPORT_SYMBOL(__arch_hweight32) |
75 | |
76 | _GLOBAL(__arch_hweight64) |
77 | BEGIN_FTR_SECTION |
78 | b CFUNC(__sw_hweight64) |
79 | nop |
80 | nop |
81 | nop |
82 | nop |
83 | nop |
84 | nop |
85 | nop |
86 | nop |
87 | FTR_SECTION_ELSE |
88 | BEGIN_FTR_SECTION_NESTED(52) |
89 | PPC_POPCNTB(R3,R3) |
90 | srdi r4,r3,32 |
91 | add r3,r4,r3 |
92 | srdi r4,r3,16 |
93 | add r3,r4,r3 |
94 | srdi r4,r3,8 |
95 | add r3,r4,r3 |
96 | clrldi r3,r3,64-8 |
97 | blr |
98 | FTR_SECTION_ELSE_NESTED(52) |
99 | PPC_POPCNTD(R3,R3) |
100 | clrldi r3,r3,64-8 |
101 | blr |
102 | ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 52) |
103 | ALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB) |
104 | EXPORT_SYMBOL(__arch_hweight64) |
105 | |