diff options
Diffstat (limited to 'include/asm-arm')
-rw-r--r-- | include/asm-arm/bitops.h | 146 |
1 files changed, 10 insertions, 136 deletions
diff --git a/include/asm-arm/bitops.h b/include/asm-arm/bitops.h index eaecd553e856..0ac54b1a8bad 100644 --- a/include/asm-arm/bitops.h +++ b/include/asm-arm/bitops.h | |||
@@ -117,65 +117,7 @@ ____atomic_test_and_change_bit(unsigned int bit, volatile unsigned long *p) | |||
117 | return res & mask; | 117 | return res & mask; |
118 | } | 118 | } |
119 | 119 | ||
120 | /* | 120 | #include <asm-generic/bitops/non-atomic.h> |
121 | * Now the non-atomic variants. We let the compiler handle all | ||
122 | * optimisations for these. These are all _native_ endian. | ||
123 | */ | ||
124 | static inline void __set_bit(int nr, volatile unsigned long *p) | ||
125 | { | ||
126 | p[nr >> 5] |= (1UL << (nr & 31)); | ||
127 | } | ||
128 | |||
129 | static inline void __clear_bit(int nr, volatile unsigned long *p) | ||
130 | { | ||
131 | p[nr >> 5] &= ~(1UL << (nr & 31)); | ||
132 | } | ||
133 | |||
134 | static inline void __change_bit(int nr, volatile unsigned long *p) | ||
135 | { | ||
136 | p[nr >> 5] ^= (1UL << (nr & 31)); | ||
137 | } | ||
138 | |||
139 | static inline int __test_and_set_bit(int nr, volatile unsigned long *p) | ||
140 | { | ||
141 | unsigned long oldval, mask = 1UL << (nr & 31); | ||
142 | |||
143 | p += nr >> 5; | ||
144 | |||
145 | oldval = *p; | ||
146 | *p = oldval | mask; | ||
147 | return oldval & mask; | ||
148 | } | ||
149 | |||
150 | static inline int __test_and_clear_bit(int nr, volatile unsigned long *p) | ||
151 | { | ||
152 | unsigned long oldval, mask = 1UL << (nr & 31); | ||
153 | |||
154 | p += nr >> 5; | ||
155 | |||
156 | oldval = *p; | ||
157 | *p = oldval & ~mask; | ||
158 | return oldval & mask; | ||
159 | } | ||
160 | |||
161 | static inline int __test_and_change_bit(int nr, volatile unsigned long *p) | ||
162 | { | ||
163 | unsigned long oldval, mask = 1UL << (nr & 31); | ||
164 | |||
165 | p += nr >> 5; | ||
166 | |||
167 | oldval = *p; | ||
168 | *p = oldval ^ mask; | ||
169 | return oldval & mask; | ||
170 | } | ||
171 | |||
172 | /* | ||
173 | * This routine doesn't need to be atomic. | ||
174 | */ | ||
175 | static inline int __test_bit(int nr, const volatile unsigned long * p) | ||
176 | { | ||
177 | return (p[nr >> 5] >> (nr & 31)) & 1UL; | ||
178 | } | ||
179 | 121 | ||
180 | /* | 122 | /* |
181 | * A note about Endian-ness. | 123 | * A note about Endian-ness. |
@@ -261,7 +203,6 @@ extern int _find_next_bit_be(const unsigned long *p, int size, int offset); | |||
261 | #define test_and_set_bit(nr,p) ATOMIC_BITOP_LE(test_and_set_bit,nr,p) | 203 | #define test_and_set_bit(nr,p) ATOMIC_BITOP_LE(test_and_set_bit,nr,p) |
262 | #define test_and_clear_bit(nr,p) ATOMIC_BITOP_LE(test_and_clear_bit,nr,p) | 204 | #define test_and_clear_bit(nr,p) ATOMIC_BITOP_LE(test_and_clear_bit,nr,p) |
263 | #define test_and_change_bit(nr,p) ATOMIC_BITOP_LE(test_and_change_bit,nr,p) | 205 | #define test_and_change_bit(nr,p) ATOMIC_BITOP_LE(test_and_change_bit,nr,p) |
264 | #define test_bit(nr,p) __test_bit(nr,p) | ||
265 | #define find_first_zero_bit(p,sz) _find_first_zero_bit_le(p,sz) | 206 | #define find_first_zero_bit(p,sz) _find_first_zero_bit_le(p,sz) |
266 | #define find_next_zero_bit(p,sz,off) _find_next_zero_bit_le(p,sz,off) | 207 | #define find_next_zero_bit(p,sz,off) _find_next_zero_bit_le(p,sz,off) |
267 | #define find_first_bit(p,sz) _find_first_bit_le(p,sz) | 208 | #define find_first_bit(p,sz) _find_first_bit_le(p,sz) |
@@ -280,7 +221,6 @@ extern int _find_next_bit_be(const unsigned long *p, int size, int offset); | |||
280 | #define test_and_set_bit(nr,p) ATOMIC_BITOP_BE(test_and_set_bit,nr,p) | 221 | #define test_and_set_bit(nr,p) ATOMIC_BITOP_BE(test_and_set_bit,nr,p) |
281 | #define test_and_clear_bit(nr,p) ATOMIC_BITOP_BE(test_and_clear_bit,nr,p) | 222 | #define test_and_clear_bit(nr,p) ATOMIC_BITOP_BE(test_and_clear_bit,nr,p) |
282 | #define test_and_change_bit(nr,p) ATOMIC_BITOP_BE(test_and_change_bit,nr,p) | 223 | #define test_and_change_bit(nr,p) ATOMIC_BITOP_BE(test_and_change_bit,nr,p) |
283 | #define test_bit(nr,p) __test_bit(nr,p) | ||
284 | #define find_first_zero_bit(p,sz) _find_first_zero_bit_be(p,sz) | 224 | #define find_first_zero_bit(p,sz) _find_first_zero_bit_be(p,sz) |
285 | #define find_next_zero_bit(p,sz,off) _find_next_zero_bit_be(p,sz,off) | 225 | #define find_next_zero_bit(p,sz,off) _find_next_zero_bit_be(p,sz,off) |
286 | #define find_first_bit(p,sz) _find_first_bit_be(p,sz) | 226 | #define find_first_bit(p,sz) _find_first_bit_be(p,sz) |
@@ -292,55 +232,10 @@ extern int _find_next_bit_be(const unsigned long *p, int size, int offset); | |||
292 | 232 | ||
293 | #if __LINUX_ARM_ARCH__ < 5 | 233 | #if __LINUX_ARM_ARCH__ < 5 |
294 | 234 | ||
295 | /* | 235 | #include <asm-generic/bitops/ffz.h> |
296 | * ffz = Find First Zero in word. Undefined if no zero exists, | 236 | #include <asm-generic/bitops/__ffs.h> |
297 | * so code should check against ~0UL first.. | 237 | #include <asm-generic/bitops/fls.h> |
298 | */ | 238 | #include <asm-generic/bitops/ffs.h> |
299 | static inline unsigned long ffz(unsigned long word) | ||
300 | { | ||
301 | int k; | ||
302 | |||
303 | word = ~word; | ||
304 | k = 31; | ||
305 | if (word & 0x0000ffff) { k -= 16; word <<= 16; } | ||
306 | if (word & 0x00ff0000) { k -= 8; word <<= 8; } | ||
307 | if (word & 0x0f000000) { k -= 4; word <<= 4; } | ||
308 | if (word & 0x30000000) { k -= 2; word <<= 2; } | ||
309 | if (word & 0x40000000) { k -= 1; } | ||
310 | return k; | ||
311 | } | ||
312 | |||
313 | /* | ||
314 | * ffz = Find First Zero in word. Undefined if no zero exists, | ||
315 | * so code should check against ~0UL first.. | ||
316 | */ | ||
317 | static inline unsigned long __ffs(unsigned long word) | ||
318 | { | ||
319 | int k; | ||
320 | |||
321 | k = 31; | ||
322 | if (word & 0x0000ffff) { k -= 16; word <<= 16; } | ||
323 | if (word & 0x00ff0000) { k -= 8; word <<= 8; } | ||
324 | if (word & 0x0f000000) { k -= 4; word <<= 4; } | ||
325 | if (word & 0x30000000) { k -= 2; word <<= 2; } | ||
326 | if (word & 0x40000000) { k -= 1; } | ||
327 | return k; | ||
328 | } | ||
329 | |||
330 | /* | ||
331 | * fls: find last bit set. | ||
332 | */ | ||
333 | |||
334 | #define fls(x) generic_fls(x) | ||
335 | #define fls64(x) generic_fls64(x) | ||
336 | |||
337 | /* | ||
338 | * ffs: find first bit set. This is defined the same way as | ||
339 | * the libc and compiler builtin ffs routines, therefore | ||
340 | * differs in spirit from the above ffz (man ffs). | ||
341 | */ | ||
342 | |||
343 | #define ffs(x) generic_ffs(x) | ||
344 | 239 | ||
345 | #else | 240 | #else |
346 | 241 | ||
@@ -381,37 +276,16 @@ static inline int constant_fls(int x) | |||
381 | #define fls(x) \ | 276 | #define fls(x) \ |
382 | ( __builtin_constant_p(x) ? constant_fls(x) : \ | 277 | ( __builtin_constant_p(x) ? constant_fls(x) : \ |
383 | ({ int __r; asm("clz\t%0, %1" : "=r"(__r) : "r"(x) : "cc"); 32-__r; }) ) | 278 | ({ int __r; asm("clz\t%0, %1" : "=r"(__r) : "r"(x) : "cc"); 32-__r; }) ) |
384 | #define fls64(x) generic_fls64(x) | ||
385 | #define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); }) | 279 | #define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); }) |
386 | #define __ffs(x) (ffs(x) - 1) | 280 | #define __ffs(x) (ffs(x) - 1) |
387 | #define ffz(x) __ffs( ~(x) ) | 281 | #define ffz(x) __ffs( ~(x) ) |
388 | 282 | ||
389 | #endif | 283 | #endif |
390 | 284 | ||
391 | /* | 285 | #include <asm-generic/bitops/fls64.h> |
392 | * Find first bit set in a 168-bit bitmap, where the first | ||
393 | * 128 bits are unlikely to be set. | ||
394 | */ | ||
395 | static inline int sched_find_first_bit(const unsigned long *b) | ||
396 | { | ||
397 | unsigned long v; | ||
398 | unsigned int off; | ||
399 | |||
400 | for (off = 0; v = b[off], off < 4; off++) { | ||
401 | if (unlikely(v)) | ||
402 | break; | ||
403 | } | ||
404 | return __ffs(v) + off * 32; | ||
405 | } | ||
406 | |||
407 | /* | ||
408 | * hweightN: returns the hamming weight (i.e. the number | ||
409 | * of bits set) of a N-bit word | ||
410 | */ | ||
411 | 286 | ||
412 | #define hweight32(x) generic_hweight32(x) | 287 | #include <asm-generic/bitops/sched.h> |
413 | #define hweight16(x) generic_hweight16(x) | 288 | #include <asm-generic/bitops/hweight.h> |
414 | #define hweight8(x) generic_hweight8(x) | ||
415 | 289 | ||
416 | /* | 290 | /* |
417 | * Ext2 is defined to use little-endian byte ordering. | 291 | * Ext2 is defined to use little-endian byte ordering. |
@@ -426,7 +300,7 @@ static inline int sched_find_first_bit(const unsigned long *b) | |||
426 | #define ext2_clear_bit_atomic(lock,nr,p) \ | 300 | #define ext2_clear_bit_atomic(lock,nr,p) \ |
427 | test_and_clear_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) | 301 | test_and_clear_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) |
428 | #define ext2_test_bit(nr,p) \ | 302 | #define ext2_test_bit(nr,p) \ |
429 | __test_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) | 303 | test_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) |
430 | #define ext2_find_first_zero_bit(p,sz) \ | 304 | #define ext2_find_first_zero_bit(p,sz) \ |
431 | _find_first_zero_bit_le(p,sz) | 305 | _find_first_zero_bit_le(p,sz) |
432 | #define ext2_find_next_zero_bit(p,sz,off) \ | 306 | #define ext2_find_next_zero_bit(p,sz,off) \ |
@@ -439,7 +313,7 @@ static inline int sched_find_first_bit(const unsigned long *b) | |||
439 | #define minix_set_bit(nr,p) \ | 313 | #define minix_set_bit(nr,p) \ |
440 | __set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) | 314 | __set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) |
441 | #define minix_test_bit(nr,p) \ | 315 | #define minix_test_bit(nr,p) \ |
442 | __test_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) | 316 | test_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) |
443 | #define minix_test_and_set_bit(nr,p) \ | 317 | #define minix_test_and_set_bit(nr,p) \ |
444 | __test_and_set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) | 318 | __test_and_set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) |
445 | #define minix_test_and_clear_bit(nr,p) \ | 319 | #define minix_test_and_clear_bit(nr,p) \ |