This source file includes following definitions.
- find_first_bit_inv
- find_next_bit_inv
1
2
3
4
5
6
7
8
9
10
11
12
13 #include <linux/compiler.h>
14 #include <linux/bitops.h>
15 #include <linux/export.h>
16
17 unsigned long find_first_bit_inv(const unsigned long *addr, unsigned long size)
18 {
19 const unsigned long *p = addr;
20 unsigned long result = 0;
21 unsigned long tmp;
22
23 while (size & ~(BITS_PER_LONG - 1)) {
24 if ((tmp = *(p++)))
25 goto found;
26 result += BITS_PER_LONG;
27 size -= BITS_PER_LONG;
28 }
29 if (!size)
30 return result;
31 tmp = (*p) & (~0UL << (BITS_PER_LONG - size));
32 if (!tmp)
33 return result + size;
34 found:
35 return result + (__fls(tmp) ^ (BITS_PER_LONG - 1));
36 }
37 EXPORT_SYMBOL(find_first_bit_inv);
38
39 unsigned long find_next_bit_inv(const unsigned long *addr, unsigned long size,
40 unsigned long offset)
41 {
42 const unsigned long *p = addr + (offset / BITS_PER_LONG);
43 unsigned long result = offset & ~(BITS_PER_LONG - 1);
44 unsigned long tmp;
45
46 if (offset >= size)
47 return size;
48 size -= result;
49 offset %= BITS_PER_LONG;
50 if (offset) {
51 tmp = *(p++);
52 tmp &= (~0UL >> offset);
53 if (size < BITS_PER_LONG)
54 goto found_first;
55 if (tmp)
56 goto found_middle;
57 size -= BITS_PER_LONG;
58 result += BITS_PER_LONG;
59 }
60 while (size & ~(BITS_PER_LONG-1)) {
61 if ((tmp = *(p++)))
62 goto found_middle;
63 result += BITS_PER_LONG;
64 size -= BITS_PER_LONG;
65 }
66 if (!size)
67 return result;
68 tmp = *p;
69 found_first:
70 tmp &= (~0UL << (BITS_PER_LONG - size));
71 if (!tmp)
72 return result + size;
73 found_middle:
74 return result + (__fls(tmp) ^ (BITS_PER_LONG - 1));
75 }
76 EXPORT_SYMBOL(find_next_bit_inv);