Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
__fls.h
Go to the documentation of this file.
1 #ifndef _ASM_GENERIC_BITOPS___FLS_H_
2 #define _ASM_GENERIC_BITOPS___FLS_H_
3 
4 #include <asm/types.h>
5 
12 static __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_ */