Linux 2.6.25-rc4
[linux-2.6/next.git] / arch / x86 / lib / bitops_32.c
blobb65440459859e4843ee23a672c05519d2669876b
1 #include <linux/bitops.h>
2 #include <linux/module.h>
4 /**
5 * find_next_bit - find the next 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 const unsigned long *p = 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 - addr));
68 return (offset + set + res);
70 EXPORT_SYMBOL(find_next_zero_bit);