| #ifndef FIO_FFZ_H |
| #define FIO_FFZ_H |
| |
| #include <inttypes.h> |
| |
| static inline int ffs64(uint64_t word) |
| { |
| int r = 0; |
| |
| if ((word & 0xffffffff) == 0) { |
| r += 32; |
| word >>= 32; |
| } |
| if (!(word & 0xffff)) { |
| word >>= 16; |
| r += 16; |
| } |
| if (!(word & 0xff)) { |
| word >>= 8; |
| r += 8; |
| } |
| if (!(word & 0xf)) { |
| word >>= 4; |
| r += 4; |
| } |
| if (!(word & 3)) { |
| word >>= 2; |
| r += 2; |
| } |
| if (!(word & 1)) { |
| word >>= 1; |
| r += 1; |
| } |
| |
| return r; |
| } |
| |
| #ifndef ARCH_HAVE_FFZ |
| |
| static inline int ffz(unsigned long bitmask) |
| { |
| return ffs64(~bitmask); |
| } |
| |
| #else |
| #define ffz(bitmask) arch_ffz(bitmask) |
| #endif |
| |
| static inline int ffz64(uint64_t bitmask) |
| { |
| return ffs64(~bitmask); |
| } |
| |
| #endif |