diff options
Diffstat (limited to 'arch/x86/lib/bitops_64.c')
-rw-r--r-- | arch/x86/lib/bitops_64.c | 68 |
1 files changed, 0 insertions, 68 deletions
diff --git a/arch/x86/lib/bitops_64.c b/arch/x86/lib/bitops_64.c index 0e8f491e6ccc..0eeb704d2513 100644 --- a/arch/x86/lib/bitops_64.c +++ b/arch/x86/lib/bitops_64.c | |||
@@ -1,9 +1,7 @@ | |||
1 | #include <linux/bitops.h> | 1 | #include <linux/bitops.h> |
2 | 2 | ||
3 | #undef find_first_zero_bit | 3 | #undef find_first_zero_bit |
4 | #undef find_next_zero_bit | ||
5 | #undef find_first_bit | 4 | #undef find_first_bit |
6 | #undef find_next_bit | ||
7 | 5 | ||
8 | static inline long | 6 | static inline long |
9 | __find_first_zero_bit(const unsigned long * addr, unsigned long size) | 7 | __find_first_zero_bit(const unsigned long * addr, unsigned long size) |
@@ -57,39 +55,6 @@ long find_first_zero_bit(const unsigned long * addr, unsigned long size) | |||
57 | return __find_first_zero_bit (addr, size); | 55 | return __find_first_zero_bit (addr, size); |
58 | } | 56 | } |
59 | 57 | ||
60 | /** | ||
61 | * find_next_zero_bit - find the next zero bit in a memory region | ||
62 | * @addr: The address to base the search on | ||
63 | * @offset: The bitnumber to start searching at | ||
64 | * @size: The maximum size to search | ||
65 | */ | ||
66 | long find_next_zero_bit (const unsigned long * addr, long size, long offset) | ||
67 | { | ||
68 | const unsigned long * p = addr + (offset >> 6); | ||
69 | unsigned long set = 0; | ||
70 | unsigned long res, bit = offset&63; | ||
71 | |||
72 | if (bit) { | ||
73 | /* | ||
74 | * Look for zero in first word | ||
75 | */ | ||
76 | asm("bsfq %1,%0\n\t" | ||
77 | "cmoveq %2,%0" | ||
78 | : "=r" (set) | ||
79 | : "r" (~(*p >> bit)), "r"(64L)); | ||
80 | if (set < (64 - bit)) | ||
81 | return set + offset; | ||
82 | set = 64 - bit; | ||
83 | p++; | ||
84 | } | ||
85 | /* | ||
86 | * No zero yet, search remaining full words for a zero | ||
87 | */ | ||
88 | res = __find_first_zero_bit (p, size - 64 * (p - addr)); | ||
89 | |||
90 | return (offset + set + res); | ||
91 | } | ||
92 | |||
93 | static inline long | 58 | static inline long |
94 | __find_first_bit(const unsigned long * addr, unsigned long size) | 59 | __find_first_bit(const unsigned long * addr, unsigned long size) |
95 | { | 60 | { |
@@ -136,40 +101,7 @@ long find_first_bit(const unsigned long * addr, unsigned long size) | |||
136 | return __find_first_bit(addr,size); | 101 | return __find_first_bit(addr,size); |
137 | } | 102 | } |
138 | 103 | ||
139 | /** | ||
140 | * find_next_bit - find the first set bit in a memory region | ||
141 | * @addr: The address to base the search on | ||
142 | * @offset: The bitnumber to start searching at | ||
143 | * @size: The maximum size to search | ||
144 | */ | ||
145 | long find_next_bit(const unsigned long * addr, long size, long offset) | ||
146 | { | ||
147 | const unsigned long * p = addr + (offset >> 6); | ||
148 | unsigned long set = 0, bit = offset & 63, res; | ||
149 | |||
150 | if (bit) { | ||
151 | /* | ||
152 | * Look for nonzero in the first 64 bits: | ||
153 | */ | ||
154 | asm("bsfq %1,%0\n\t" | ||
155 | "cmoveq %2,%0\n\t" | ||
156 | : "=r" (set) | ||
157 | : "r" (*p >> bit), "r" (64L)); | ||
158 | if (set < (64 - bit)) | ||
159 | return set + offset; | ||
160 | set = 64 - bit; | ||
161 | p++; | ||
162 | } | ||
163 | /* | ||
164 | * No set bit yet, search remaining full words for a bit | ||
165 | */ | ||
166 | res = __find_first_bit (p, size - 64 * (p - addr)); | ||
167 | return (offset + set + res); | ||
168 | } | ||
169 | |||
170 | #include <linux/module.h> | 104 | #include <linux/module.h> |
171 | 105 | ||
172 | EXPORT_SYMBOL(find_next_bit); | ||
173 | EXPORT_SYMBOL(find_first_bit); | 106 | EXPORT_SYMBOL(find_first_bit); |
174 | EXPORT_SYMBOL(find_first_zero_bit); | 107 | EXPORT_SYMBOL(find_first_zero_bit); |
175 | EXPORT_SYMBOL(find_next_zero_bit); | ||