[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>

authored by

Andrew Morton and committed by
Russell King
0c65f459 9d9fa83b

+8 -1
+8 -1
include/asm-arm/bitops.h
··· 277 * the clz instruction for much better code efficiency. 278 */ 279 280 - #define fls(x) \ 281 ( __builtin_constant_p(x) ? constant_fls(x) : \ 282 ({ int __r; asm("clz\t%0, %1" : "=r"(__r) : "r"(x) : "cc"); 32-__r; }) ) 283 #define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); }) 284 #define __ffs(x) (ffs(x) - 1) 285 #define ffz(x) __ffs( ~(x) )
··· 277 * the clz instruction for much better code efficiency. 278 */ 279 280 + #define __fls(x) \ 281 ( __builtin_constant_p(x) ? constant_fls(x) : \ 282 ({ int __r; asm("clz\t%0, %1" : "=r"(__r) : "r"(x) : "cc"); 32-__r; }) ) 283 + 284 + /* Implement fls() in C so that 64-bit args are suitably truncated */ 285 + static inline int fls(int x) 286 + { 287 + return __fls(x); 288 + } 289 + 290 #define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); }) 291 #define __ffs(x) (ffs(x) - 1) 292 #define ffz(x) __ffs( ~(x) )