linux/include/asm-generic/bitops/__fls.h
<<
>>
Prefs
   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 */
  12static __always_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