sync hh.org
[hh.org.git] / arch / i386 / lib / bitops.c
blob97db3853dc82a2f04308b18a6a2e2ab766eee3d3
1 #include <linux/bitops.h>
2 #include <linux/module.h>
4 /**
5 * find_next_bit - find the first set bit in a memory region
6 * @addr: The address to base the search on
7 * @offset: The bitnumber to start searching at
8 * @size: The maximum size to search
9 */
10 int find_next_bit(const unsigned long *addr, int size, int offset)
12 const unsigned long *p = addr + (offset >> 5);
13 int set = 0, bit = offset & 31, res;
15 if (bit) {
17 * Look for nonzero in the first 32 bits:
19 __asm__("bsfl %1,%0\n\t"
20 "jne 1f\n\t"
21 "movl $32, %0\n"
22 "1:"
23 : "=r" (set)
24 : "r" (*p >> bit));
25 if (set < (32 - bit))
26 return set + offset;
27 set = 32 - bit;
28 p++;
31 * No set bit yet, search remaining full words for a bit
33 res = find_first_bit (p, size - 32 * (p - addr));
34 return (offset + set + res);
36 EXPORT_SYMBOL(find_next_bit);
38 /**
39 * find_next_zero_bit - find the first zero bit in a memory region
40 * @addr: The address to base the search on
41 * @offset: The bitnumber to start searching at
42 * @size: The maximum size to search
44 int find_next_zero_bit(const unsigned long *addr, int size, int offset)
46 unsigned long * p = ((unsigned long *) addr) + (offset >> 5);
47 int set = 0, bit = offset & 31, res;
49 if (bit) {
51 * Look for zero in the first 32 bits.
53 __asm__("bsfl %1,%0\n\t"
54 "jne 1f\n\t"
55 "movl $32, %0\n"
56 "1:"
57 : "=r" (set)
58 : "r" (~(*p >> bit)));
59 if (set < (32 - bit))
60 return set + offset;
61 set = 32 - bit;
62 p++;
65 * No zero yet, search remaining full bytes for a zero
67 res = find_first_zero_bit (p, size - 32 * (p - (unsigned long *) addr));
68 return (offset + set + res);
70 EXPORT_SYMBOL(find_next_zero_bit);