Commit | Line | Data |
---|---|---|
5f97f7f9 HS |
1 | /* |
2 | * Copyright (C) 2006 Atmel Corporation | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or modify | |
5 | * it under the terms of the GNU General Public License version 2 as | |
6 | * published by the Free Software Foundation. | |
7 | */ | |
8 | #include <linux/linkage.h> | |
9 | ||
10 | .text | |
11 | /* | |
12 | * unsigned long find_first_zero_bit(const unsigned long *addr, | |
13 | * unsigned long size) | |
14 | */ | |
15 | ENTRY(find_first_zero_bit) | |
16 | cp.w r11, 0 | |
17 | reteq r11 | |
18 | mov r9, r11 | |
19 | 1: ld.w r8, r12[0] | |
20 | com r8 | |
21 | brne .L_found | |
22 | sub r12, -4 | |
23 | sub r9, 32 | |
24 | brgt 1b | |
25 | retal r11 | |
26 | ||
27 | /* | |
28 | * unsigned long find_next_zero_bit(const unsigned long *addr, | |
29 | * unsigned long size, | |
30 | * unsigned long offset) | |
31 | */ | |
32 | ENTRY(find_next_zero_bit) | |
33 | lsr r8, r10, 5 | |
34 | sub r9, r11, r10 | |
35 | retle r11 | |
36 | ||
37 | lsl r8, 2 | |
38 | add r12, r8 | |
39 | andl r10, 31, COH | |
40 | breq 1f | |
41 | ||
42 | /* offset is not word-aligned. Handle the first (32 - r10) bits */ | |
43 | ld.w r8, r12[0] | |
44 | com r8 | |
45 | sub r12, -4 | |
46 | lsr r8, r8, r10 | |
47 | brne .L_found | |
48 | ||
49 | /* r9 = r9 - (32 - r10) = r9 + r10 - 32 */ | |
50 | add r9, r10 | |
51 | sub r9, 32 | |
52 | retle r11 | |
53 | ||
54 | /* Main loop. offset must be word-aligned */ | |
55 | 1: ld.w r8, r12[0] | |
56 | com r8 | |
57 | brne .L_found | |
58 | sub r12, -4 | |
59 | sub r9, 32 | |
60 | brgt 1b | |
61 | retal r11 | |
62 | ||
63 | /* Common return path for when a bit is actually found. */ | |
64 | .L_found: | |
65 | brev r8 | |
66 | clz r10, r8 | |
67 | rsub r9, r11 | |
68 | add r10, r9 | |
69 | ||
70 | /* XXX: If we don't have to return exactly "size" when the bit | |
71 | is not found, we may drop this "min" thing */ | |
72 | min r12, r11, r10 | |
73 | retal r12 | |
74 | ||
75 | /* | |
76 | * unsigned long find_first_bit(const unsigned long *addr, | |
77 | * unsigned long size) | |
78 | */ | |
79 | ENTRY(find_first_bit) | |
80 | cp.w r11, 0 | |
81 | reteq r11 | |
82 | mov r9, r11 | |
83 | 1: ld.w r8, r12[0] | |
84 | cp.w r8, 0 | |
85 | brne .L_found | |
86 | sub r12, -4 | |
87 | sub r9, 32 | |
88 | brgt 1b | |
89 | retal r11 | |
90 | ||
91 | /* | |
92 | * unsigned long find_next_bit(const unsigned long *addr, | |
93 | * unsigned long size, | |
94 | * unsigned long offset) | |
95 | */ | |
96 | ENTRY(find_next_bit) | |
97 | lsr r8, r10, 5 | |
98 | sub r9, r11, r10 | |
99 | retle r11 | |
100 | ||
101 | lsl r8, 2 | |
102 | add r12, r8 | |
103 | andl r10, 31, COH | |
104 | breq 1f | |
105 | ||
106 | /* offset is not word-aligned. Handle the first (32 - r10) bits */ | |
107 | ld.w r8, r12[0] | |
108 | sub r12, -4 | |
109 | lsr r8, r8, r10 | |
110 | brne .L_found | |
111 | ||
112 | /* r9 = r9 - (32 - r10) = r9 + r10 - 32 */ | |
113 | add r9, r10 | |
114 | sub r9, 32 | |
115 | retle r11 | |
116 | ||
117 | /* Main loop. offset must be word-aligned */ | |
118 | 1: ld.w r8, r12[0] | |
119 | cp.w r8, 0 | |
120 | brne .L_found | |
121 | sub r12, -4 | |
122 | sub r9, 32 | |
123 | brgt 1b | |
124 | retal r11 | |
125 | ||
c4945b9e | 126 | ENTRY(find_next_bit_le) |
e37925eb HCE |
127 | lsr r8, r10, 5 |
128 | sub r9, r11, r10 | |
129 | retle r11 | |
130 | ||
131 | lsl r8, 2 | |
132 | add r12, r8 | |
133 | andl r10, 31, COH | |
134 | breq 1f | |
135 | ||
136 | /* offset is not word-aligned. Handle the first (32 - r10) bits */ | |
137 | ldswp.w r8, r12[0] | |
138 | sub r12, -4 | |
139 | lsr r8, r8, r10 | |
140 | brne .L_found | |
141 | ||
142 | /* r9 = r9 - (32 - r10) = r9 + r10 - 32 */ | |
143 | add r9, r10 | |
144 | sub r9, 32 | |
145 | retle r11 | |
146 | ||
147 | /* Main loop. offset must be word-aligned */ | |
148 | 1: ldswp.w r8, r12[0] | |
149 | cp.w r8, 0 | |
150 | brne .L_found | |
151 | sub r12, -4 | |
152 | sub r9, 32 | |
153 | brgt 1b | |
154 | retal r11 | |
155 | ||
c4945b9e | 156 | ENTRY(find_next_zero_bit_le) |
5f97f7f9 HS |
157 | lsr r8, r10, 5 |
158 | sub r9, r11, r10 | |
159 | retle r11 | |
160 | ||
161 | lsl r8, 2 | |
162 | add r12, r8 | |
163 | andl r10, 31, COH | |
164 | breq 1f | |
165 | ||
166 | /* offset is not word-aligned. Handle the first (32 - r10) bits */ | |
167 | ldswp.w r8, r12[0] | |
168 | sub r12, -4 | |
168c8fa3 | 169 | com r8 |
5f97f7f9 HS |
170 | lsr r8, r8, r10 |
171 | brne .L_found | |
172 | ||
173 | /* r9 = r9 - (32 - r10) = r9 + r10 - 32 */ | |
174 | add r9, r10 | |
175 | sub r9, 32 | |
176 | retle r11 | |
177 | ||
178 | /* Main loop. offset must be word-aligned */ | |
179 | 1: ldswp.w r8, r12[0] | |
168c8fa3 | 180 | com r8 |
5f97f7f9 HS |
181 | brne .L_found |
182 | sub r12, -4 | |
183 | sub r9, 32 | |
184 | brgt 1b | |
185 | retal r11 |