Home | History | Annotate | Download | only in bitops
      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 __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