X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=lib%2Fffz.h;h=16c9ae9ebea8adaefbf11d6c51de26be71a9473b;hb=3a03f0cf8005221d90045bed762e7d5e38f944fb;hp=7fc7d4567ef155035527e9bc5c5751feafd5d9d9;hpb=064c636d364fab601a908e040d3aa5eaf2775694;p=fio.git diff --git a/lib/ffz.h b/lib/ffz.h index 7fc7d456..16c9ae9e 100644 --- a/lib/ffz.h +++ b/lib/ffz.h @@ -1,10 +1,16 @@ #ifndef FIO_FFZ_H #define FIO_FFZ_H -static inline int __ffs(int word) +#include + +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; @@ -21,17 +27,26 @@ static inline int __ffs(int word) word >>= 2; r += 2; } - if (!(word & 1)) { - word >>= 1; + if (!(word & 1)) r += 1; - } return r; } -static inline int ffz(unsigned int bitmask) +#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 ffs(~bitmask); + return ffs64(~bitmask); } #endif