Commit 9c6250fb authored by Nicolas Pitre's avatar Nicolas Pitre Committed by Russell King

[ARM PATCH] 1531/1: optimized ffs/ffz/fls for ARMv5

Patch from Nicolas Pitre
parent 2febe49d
...@@ -277,6 +277,8 @@ extern int _find_next_zero_bit_be(void * p, int size, int offset); ...@@ -277,6 +277,8 @@ extern int _find_next_zero_bit_be(void * p, int size, int offset);
#endif #endif
#if __LINUX_ARM_ARCH__ < 5
/* /*
* ffz = Find First Zero in word. Undefined if no zero exists, * ffz = Find First Zero in word. Undefined if no zero exists,
* so code should check against ~0UL first.. * so code should check against ~0UL first..
...@@ -326,6 +328,23 @@ static inline unsigned long __ffs(unsigned long word) ...@@ -326,6 +328,23 @@ static inline unsigned long __ffs(unsigned long word)
#define ffs(x) generic_ffs(x) #define ffs(x) generic_ffs(x)
#else
/*
* On ARMv5 and above those functions can be implemented around
* the clz instruction for much better code efficiency.
*/
extern __inline__ int generic_fls(int x);
#define fls(x) \
( __builtin_constant_p(x) ? generic_fls(x) : \
({ int __r; asm("clz%?\t%0, %1" : "=r"(__r) : "r"(x)); 32-__r; }) )
#define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); })
#define __ffs(x) (ffs(x) - 1)
#define ffz(x) __ffs( ~(x) )
#endif
/* /*
* Find first bit set in a 168-bit bitmap, where the first * Find first bit set in a 168-bit bitmap, where the first
* 128 bits are unlikely to be set. * 128 bits are unlikely to be set.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment