diff options
author | Paul Mackerras <paulus@samba.org> | 2008-04-18 14:26:08 +1000 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2008-04-18 16:25:15 +1000 |
commit | 9f264be6101c42cb9e471c58322fb83a5cde1461 (patch) | |
tree | 5d96ec582d5483c67e5511f0aa0c61d869a48640 /include/asm-powerpc/bitops.h | |
parent | 945feb174b14e7098cc7ecf0cf4768d35bc52f9c (diff) | |
download | blackbird-op-linux-9f264be6101c42cb9e471c58322fb83a5cde1461.tar.gz blackbird-op-linux-9f264be6101c42cb9e471c58322fb83a5cde1461.zip |
[POWERPC] Optimize fls64() on 64-bit processors
64-bit powerpc processors can find the leftmost 1 bit in a 64-bit
doubleword in one instruction, so use that rather than using the
generic fls64(), which does two 32-bit fls() calls.
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'include/asm-powerpc/bitops.h')
-rw-r--r-- | include/asm-powerpc/bitops.h | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/include/asm-powerpc/bitops.h b/include/asm-powerpc/bitops.h index 36c8f3a43792..a99a74929475 100644 --- a/include/asm-powerpc/bitops.h +++ b/include/asm-powerpc/bitops.h @@ -312,7 +312,24 @@ static __inline__ int fls(unsigned int x) asm ("cntlzw %0,%1" : "=r" (lz) : "r" (x)); return 32 - lz; } + +/* + * 64-bit can do this using one cntlzd (count leading zeroes doubleword) + * instruction; for 32-bit we use the generic version, which does two + * 32-bit fls calls. + */ +#ifdef __powerpc64__ +static __inline__ int fls64(__u64 x) +{ + int lz; + + asm ("cntlzd %0,%1" : "=r" (lz) : "r" (x)); + return 64 - lz; +} +#else #include <asm-generic/bitops/fls64.h> +#endif /* __powerpc64__ */ + #include <asm-generic/bitops/hweight.h> #include <asm-generic/bitops/find.h> |