diff options
| author | Nicolas Pitre <nico@cam.org> | 2008-12-03 21:59:41 -0500 |
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2008-12-04 04:21:55 -0500 |
| commit | 94fc7336646b392234c0fafea5d696d020c3677c (patch) | |
| tree | 95137c3233bf0d4f07a52e8529122dfa284a5353 | |
| parent | 82676d76252680fc035247fd4cfdb07ffce5db52 (diff) | |
[ARM] 5339/1: fix __fls() on ARM
Commit 0c65f459ce6c intended to fix truncation issues with fls() on
ARMv5+ by renaming it to __fls() and wrapping it into a C function.
However that didn't take into account the fact that __fls() already
already had different semantics in the kernel.
Let's move the __fls() code into fls() function directly, and redefine
__fls() with the appropriate semantics. While at it, bring a generic
__fls() definition for pre ARMv5 too.
Signed-off-by: Nicolas Pitre <nico@marvell.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
| -rw-r--r-- | arch/arm/include/asm/bitops.h | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/arch/arm/include/asm/bitops.h b/arch/arm/include/asm/bitops.h index 9a1db20e032a..63a481fbbed4 100644 --- a/arch/arm/include/asm/bitops.h +++ b/arch/arm/include/asm/bitops.h | |||
| @@ -237,6 +237,7 @@ extern int _find_next_bit_be(const unsigned long *p, int size, int offset); | |||
| 237 | #if __LINUX_ARM_ARCH__ < 5 | 237 | #if __LINUX_ARM_ARCH__ < 5 |
| 238 | 238 | ||
| 239 | #include <asm-generic/bitops/ffz.h> | 239 | #include <asm-generic/bitops/ffz.h> |
| 240 | #include <asm-generic/bitops/__fls.h> | ||
| 240 | #include <asm-generic/bitops/__ffs.h> | 241 | #include <asm-generic/bitops/__ffs.h> |
| 241 | #include <asm-generic/bitops/fls.h> | 242 | #include <asm-generic/bitops/fls.h> |
| 242 | #include <asm-generic/bitops/ffs.h> | 243 | #include <asm-generic/bitops/ffs.h> |
| @@ -277,16 +278,19 @@ static inline int constant_fls(int x) | |||
| 277 | * the clz instruction for much better code efficiency. | 278 | * the clz instruction for much better code efficiency. |
| 278 | */ | 279 | */ |
| 279 | 280 | ||
| 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) | 281 | static inline int fls(int x) |
| 286 | { | 282 | { |
| 287 | return __fls(x); | 283 | int ret; |
| 284 | |||
| 285 | if (__builtin_constant_p(x)) | ||
| 286 | return constant_fls(x); | ||
| 287 | |||
| 288 | asm("clz\t%0, %1" : "=r" (ret) : "r" (x) : "cc"); | ||
| 289 | ret = 32 - ret; | ||
| 290 | return ret; | ||
| 288 | } | 291 | } |
| 289 | 292 | ||
| 293 | #define __fls(x) (fls(x) - 1) | ||
| 290 | #define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); }) | 294 | #define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); }) |
| 291 | #define __ffs(x) (ffs(x) - 1) | 295 | #define __ffs(x) (ffs(x) - 1) |
| 292 | #define ffz(x) __ffs( ~(x) ) | 296 | #define ffz(x) __ffs( ~(x) ) |
