e2c1b8e94a39731fd2dbcfe6bebd8a19c69dd830
[fio.git] / lib / ffz.h
1 #ifndef FIO_FFZ_H
2 #define FIO_FFZ_H
3
4 #include <inttypes.h>
5
6 static inline int ffs64(uint64_t word)
7 {
8         int r = 0;
9
10         if ((word & 0xffffffff) == 0) {
11                 r += 32;
12                 word >>= 32;
13         }
14         if (!(word & 0xffff)) {
15                 word >>= 16;
16                 r += 16;
17         }
18         if (!(word & 0xff)) {
19                 word >>= 8;
20                 r += 8;
21         }
22         if (!(word & 0xf)) {
23                 word >>= 4;
24                 r += 4;
25         }
26         if (!(word & 3)) {
27                 word >>= 2;
28                 r += 2;
29         }
30         if (!(word & 1)) {
31                 word >>= 1;
32                 r += 1;
33         }
34
35         return r;
36 }
37
38 #ifndef ARCH_HAVE_FFZ
39
40 static inline int ffz(unsigned long bitmask)
41 {
42         return ffs64(~bitmask);
43 }
44
45 #else
46 #define ffz(bitmask)    arch_ffz(bitmask)
47 #endif
48
49 static inline int ffz64(uint64_t bitmask)
50 {
51         return ffs64(~bitmask);
52 }
53
54 #endif