[ARM] fix fls() for 64-bit arguments
arm's fls() is implemented as a macro, causing it to misbehave when passed 64-bit arguments. Fix. Cc: Nickolay Vinogradov <nickolay@protei.ru> Tested-by: Krzysztof Halasa <khc@pm.waw.pl> Cc: <stable@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
9d9fa83bea
commit
0c65f459ce
|
@ -277,9 +277,16 @@ static inline int constant_fls(int x)
|
||||||
* the clz instruction for much better code efficiency.
|
* the clz instruction for much better code efficiency.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define fls(x) \
|
#define __fls(x) \
|
||||||
( __builtin_constant_p(x) ? constant_fls(x) : \
|
( __builtin_constant_p(x) ? constant_fls(x) : \
|
||||||
({ int __r; asm("clz\t%0, %1" : "=r"(__r) : "r"(x) : "cc"); 32-__r; }) )
|
({ int __r; asm("clz\t%0, %1" : "=r"(__r) : "r"(x) : "cc"); 32-__r; }) )
|
||||||
|
|
||||||
|
/* Implement fls() in C so that 64-bit args are suitably truncated */
|
||||||
|
static inline int fls(int x)
|
||||||
|
{
|
||||||
|
return __fls(x);
|
||||||
|
}
|
||||||
|
|
||||||
#define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); })
|
#define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); })
|
||||||
#define __ffs(x) (ffs(x) - 1)
|
#define __ffs(x) (ffs(x) - 1)
|
||||||
#define ffz(x) __ffs( ~(x) )
|
#define ffz(x) __ffs( ~(x) )
|
||||||
|
|
Loading…
Reference in New Issue