Skip to content

Commit

Permalink
[PATCH] x86_64: fls in asm for x86_64
Browse files Browse the repository at this point in the history
Use single instruction for find largest set bit on x86_64.

[Updated by Jan Beulich to fix wrong asm constraints in original
patch -AK]

Cc: jbeulich@novell.com
Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Stephen Hemminger authored and Linus Torvalds committed Jan 12, 2006
1 parent bd9cb64 commit 636dd2b
Showing 1 changed file with 16 additions and 3 deletions.
19 changes: 16 additions & 3 deletions include/asm-x86_64/bitops.h
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,22 @@ static __inline__ int fls64(__u64 x)
return __fls(x) + 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"
"cmovzl %2,%0"
: "=&r" (r) : "rm" (x), "rm" (-1));
return r+1;
}

/**
* hweightN - returns the hamming weight of a N-bit word
* @x: the word to weigh
Expand Down Expand Up @@ -434,9 +450,6 @@ static __inline__ int fls64(__u64 x)
#define minix_find_first_zero_bit(addr,size) \
find_first_zero_bit((void*)addr,size)

/* find last set bit */
#define fls(x) generic_fls(x)

#endif /* __KERNEL__ */

#endif /* _X86_64_BITOPS_H */

0 comments on commit 636dd2b

Please sign in to comment.