home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / asm-generic / bitops / __fls.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  872 b   |  44 lines

  1. #ifndef _ASM_GENERIC_BITOPS___FLS_H_
  2. #define _ASM_GENERIC_BITOPS___FLS_H_
  3.  
  4. #include <asm/types.h>
  5.  
  6. /**
  7.  * __fls - find last (most-significant) set bit in a long word
  8.  * @word: the word to search
  9.  *
  10.  * Undefined if no set bit exists, so code should check against 0 first.
  11.  */
  12. static inline unsigned long __fls(unsigned long word)
  13. {
  14.     int num = BITS_PER_LONG - 1;
  15.  
  16. #if BITS_PER_LONG == 64
  17.     if (!(word & (~0ul << 32))) {
  18.         num -= 32;
  19.         word <<= 32;
  20.     }
  21. #endif
  22.     if (!(word & (~0ul << (BITS_PER_LONG-16)))) {
  23.         num -= 16;
  24.         word <<= 16;
  25.     }
  26.     if (!(word & (~0ul << (BITS_PER_LONG-8)))) {
  27.         num -= 8;
  28.         word <<= 8;
  29.     }
  30.     if (!(word & (~0ul << (BITS_PER_LONG-4)))) {
  31.         num -= 4;
  32.         word <<= 4;
  33.     }
  34.     if (!(word & (~0ul << (BITS_PER_LONG-2)))) {
  35.         num -= 2;
  36.         word <<= 2;
  37.     }
  38.     if (!(word & (~0ul << (BITS_PER_LONG-1))))
  39.         num -= 1;
  40.     return num;
  41. }
  42.  
  43. #endif /* _ASM_GENERIC_BITOPS___FLS_H_ */
  44.