diff options
Diffstat (limited to 'include/asm-mips/bitops.h')
-rw-r--r-- | include/asm-mips/bitops.h | 56 |
1 files changed, 24 insertions, 32 deletions
diff --git a/include/asm-mips/bitops.h b/include/asm-mips/bitops.h index 0e71df31f81c..098cec263681 100644 --- a/include/asm-mips/bitops.h +++ b/include/asm-mips/bitops.h | |||
@@ -466,64 +466,56 @@ static inline unsigned long __ffs(unsigned long word) | |||
466 | } | 466 | } |
467 | 467 | ||
468 | /* | 468 | /* |
469 | * ffs - find first bit set. | 469 | * fls - find last bit set. |
470 | * @word: The word to search | 470 | * @word: The word to search |
471 | * | 471 | * |
472 | * Returns 1..SZLONG | 472 | * This is defined the same way as ffs. |
473 | * Returns 0 if no bit exists | 473 | * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32. |
474 | */ | 474 | */ |
475 | 475 | static inline int fls(int word) | |
476 | static inline unsigned long ffs(unsigned long word) | ||
477 | { | 476 | { |
478 | if (!word) | 477 | __asm__ ("clz %0, %1" : "=r" (word) : "r" (word)); |
479 | return 0; | ||
480 | 478 | ||
481 | return __ffs(word) + 1; | 479 | return 32 - word; |
482 | } | 480 | } |
483 | 481 | ||
484 | /* | 482 | #if defined(CONFIG_64BIT) && defined(CONFIG_CPU_MIPS64) |
485 | * ffz - find first zero in word. | 483 | static inline int fls64(__u64 word) |
486 | * @word: The word to search | ||
487 | * | ||
488 | * Undefined if no zero exists, so code should check against ~0UL first. | ||
489 | */ | ||
490 | static inline unsigned long ffz(unsigned long word) | ||
491 | { | 484 | { |
492 | return __ffs (~word); | 485 | __asm__ ("dclz %0, %1" : "=r" (word) : "r" (word)); |
486 | |||
487 | return 64 - word; | ||
493 | } | 488 | } |
489 | #else | ||
490 | #include <asm-generic/bitops/fls64.h> | ||
491 | #endif | ||
494 | 492 | ||
495 | /* | 493 | /* |
496 | * fls - find last bit set. | 494 | * ffs - find first bit set. |
497 | * @word: The word to search | 495 | * @word: The word to search |
498 | * | 496 | * |
499 | * Returns 1..SZLONG | 497 | * This is defined the same way as |
500 | * Returns 0 if no bit exists | 498 | * the libc and compiler builtin ffs routines, therefore |
499 | * differs in spirit from the above ffz (man ffs). | ||
501 | */ | 500 | */ |
502 | static inline unsigned long fls(unsigned long word) | 501 | static inline int ffs(int word) |
503 | { | 502 | { |
504 | #ifdef CONFIG_CPU_MIPS32 | 503 | if (!word) |
505 | __asm__ ("clz %0, %1" : "=r" (word) : "r" (word)); | 504 | return 0; |
506 | |||
507 | return 32 - word; | ||
508 | #endif | ||
509 | |||
510 | #ifdef CONFIG_CPU_MIPS64 | ||
511 | __asm__ ("dclz %0, %1" : "=r" (word) : "r" (word)); | ||
512 | 505 | ||
513 | return 64 - word; | 506 | return fls(word & -word); |
514 | #endif | ||
515 | } | 507 | } |
516 | 508 | ||
517 | #else | 509 | #else |
518 | 510 | ||
519 | #include <asm-generic/bitops/__ffs.h> | 511 | #include <asm-generic/bitops/__ffs.h> |
520 | #include <asm-generic/bitops/ffs.h> | 512 | #include <asm-generic/bitops/ffs.h> |
521 | #include <asm-generic/bitops/ffz.h> | ||
522 | #include <asm-generic/bitops/fls.h> | 513 | #include <asm-generic/bitops/fls.h> |
514 | #include <asm-generic/bitops/fls64.h> | ||
523 | 515 | ||
524 | #endif /*defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64) */ | 516 | #endif /*defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64) */ |
525 | 517 | ||
526 | #include <asm-generic/bitops/fls64.h> | 518 | #include <asm-generic/bitops/ffz.h> |
527 | #include <asm-generic/bitops/find.h> | 519 | #include <asm-generic/bitops/find.h> |
528 | 520 | ||
529 | #ifdef __KERNEL__ | 521 | #ifdef __KERNEL__ |