diff options
author | Alexander van Heukelum <heukelum@mailshack.com> | 2008-03-15 13:04:42 +0100 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-04-26 19:21:16 +0200 |
commit | 12d9c8420b9daa1da3d9e090640fb24bcd0deba2 (patch) | |
tree | 60affb5bdc5b857dfb3969234659caedbf2ff02a /include/asm-x86/bitops_32.h | |
parent | 64970b68d2b3ed32b964b0b30b1b98518fde388e (diff) | |
download | op-kernel-dev-12d9c8420b9daa1da3d9e090640fb24bcd0deba2.zip op-kernel-dev-12d9c8420b9daa1da3d9e090640fb24bcd0deba2.tar.gz |
x86: merge the simple bitops and move them to bitops.h
Some of those can be written in such a way that the same
inline assembly can be used to generate both 32 bit and
64 bit code.
For ffs and fls, x86_64 unconditionally used the cmov
instruction and i386 unconditionally used a conditional
branch over a mov instruction. In the current patch I
chose to select the version based on the availability
of the cmov instruction instead. A small detail here is
that x86_64 did not previously set CONFIG_X86_CMOV=y.
Improved comments for ffs, ffz, fls and variations.
Signed-off-by: Alexander van Heukelum <heukelum@fastmail.fm>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'include/asm-x86/bitops_32.h')
-rw-r--r-- | include/asm-x86/bitops_32.h | 64 |
1 files changed, 0 insertions, 64 deletions
diff --git a/include/asm-x86/bitops_32.h b/include/asm-x86/bitops_32.h index 7c9ed75..3ed64b2 100644 --- a/include/asm-x86/bitops_32.h +++ b/include/asm-x86/bitops_32.h @@ -40,20 +40,6 @@ static inline int find_first_zero_bit(const unsigned long *addr, unsigned size) } /** - * __ffs - find first bit in word. - * @word: The word to search - * - * Undefined if no bit exists, so code should check against 0 first. - */ -static inline unsigned long __ffs(unsigned long word) -{ - __asm__("bsfl %1,%0" - :"=r" (word) - :"rm" (word)); - return word; -} - -/** * find_first_bit - find the first set bit in a memory region * @addr: The address to start the search at * @size: The maximum size to search @@ -74,60 +60,10 @@ static inline unsigned find_first_bit(const unsigned long *addr, unsigned size) return x; } -/** - * ffz - find first zero in word. - * @word: The word to search - * - * Undefined if no zero exists, so code should check against ~0UL first. - */ -static inline unsigned long ffz(unsigned long word) -{ - __asm__("bsfl %1,%0" - :"=r" (word) - :"r" (~word)); - return word; -} - #ifdef __KERNEL__ #include <asm-generic/bitops/sched.h> -/** - * ffs - find first bit set - * @x: the word to search - * - * This is defined the same way as - * the libc and compiler builtin ffs routines, therefore - * differs in spirit from the above ffz() (man ffs). - */ -static inline int ffs(int x) -{ - int r; - - __asm__("bsfl %1,%0\n\t" - "jnz 1f\n\t" - "movl $-1,%0\n" - "1:" : "=r" (r) : "rm" (x)); - return r+1; -} - -/** - * fls - find last bit set - * @x: the word to search - * - * This is defined the same way as ffs(). - */ -static inline int fls(int x) -{ - int r; - - __asm__("bsrl %1,%0\n\t" - "jnz 1f\n\t" - "movl $-1,%0\n" - "1:" : "=r" (r) : "rm" (x)); - return r+1; -} - #include <asm-generic/bitops/hweight.h> #endif /* __KERNEL__ */ |