| 1 |
|
| 2 | #ifndef _ASM_GENERIC_BITOPS_FLS_H_
|
| 3 | #define _ASM_GENERIC_BITOPS_FLS_H_
|
| 4 |
|
| 5 | |
| 6 | * generic_fls - find last (most-significant) bit set
|
| 7 | * @x: the word to search
|
| 8 | *
|
| 9 | * This is defined the same way as ffs.
|
| 10 | * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
|
| 11 |
|
| 12 |
|
| 13 | static __always_inline __attribute_const__ int generic_fls(unsigned int x)
|
| 14 | {
|
| 15 | int r = 32;
|
| 16 |
|
| 17 | if (!x)
|
| 18 | return 0;
|
| 19 | if (!(x & 0xffff0000u)) {
|
| 20 | x <<= 16;
|
| 21 | r -= 16;
|
| 22 | }
|
| 23 | if (!(x & 0xff000000u)) {
|
| 24 | x <<= 8;
|
| 25 | r -= 8;
|
| 26 | }
|
| 27 | if (!(x & 0xf0000000u)) {
|
| 28 | x <<= 4;
|
| 29 | r -= 4;
|
| 30 | }
|
| 31 | if (!(x & 0xc0000000u)) {
|
| 32 | x <<= 2;
|
| 33 | r -= 2;
|
| 34 | }
|
| 35 | if (!(x & 0x80000000u)) {
|
| 36 | x <<= 1;
|
| 37 | r -= 1;
|
| 38 | }
|
| 39 | return r;
|
| 40 | }
|
| 41 |
|
| 42 | #ifndef __HAVE_ARCH_FLS
|
| 43 | #define fls(x) generic_fls(x)
|
| 44 | #endif
|
| 45 |
|
| 46 | #endif
|