1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- #ifndef _ASM_GENERIC_BITOPS___FLS_H_
- #define _ASM_GENERIC_BITOPS___FLS_H_
- #include <asm/types.h>
- /**
- * __fls - find last (most-significant) set bit in a long word
- * @word: the word to search
- *
- * Undefined if no set bit exists, so code should check against 0 first.
- */
- static __always_inline unsigned long __fls(unsigned long word)
- {
- int num = BITS_PER_LONG - 1;
- #if BITS_PER_LONG == 64
- if (!(word & (~0ul << 32))) {
- num -= 32;
- word <<= 32;
- }
- #endif
- if (!(word & (~0ul << (BITS_PER_LONG-16)))) {
- num -= 16;
- word <<= 16;
- }
- if (!(word & (~0ul << (BITS_PER_LONG-8)))) {
- num -= 8;
- word <<= 8;
- }
- if (!(word & (~0ul << (BITS_PER_LONG-4)))) {
- num -= 4;
- word <<= 4;
- }
- if (!(word & (~0ul << (BITS_PER_LONG-2)))) {
- num -= 2;
- word <<= 2;
- }
- if (!(word & (~0ul << (BITS_PER_LONG-1))))
- num -= 1;
- return num;
- }
- #endif /* _ASM_GENERIC_BITOPS___FLS_H_ */
|