arch: add ffs64 and ffz64
authorJens Axboe <axboe@fb.com>
Wed, 23 Dec 2015 16:09:23 +0000 (09:09 -0700)
committerJens Axboe <axboe@fb.com>
Wed, 23 Dec 2015 16:09:23 +0000 (09:09 -0700)
These just use the normal C software version, extended to 64-bit
even on 32-bit archs. The fast variant is still machine word native.

Signed-off-by: Jens Axboe <axboe@fb.com>
arch/arch.h
lib/ffz.h

index 5671b9a0f8885a9ca6302483915b01cb9245860b..043e2838b308f8b338c53d4464f395874eae024c 100644 (file)
@@ -63,11 +63,7 @@ extern unsigned long arch_flags;
 #include "arch-generic.h"
 #endif
 
-#ifdef ARCH_HAVE_FFZ
-#define ffz(bitmask)   arch_ffz(bitmask)
-#else
 #include "../lib/ffz.h"
-#endif
 
 #ifndef ARCH_HAVE_INIT
 static inline int arch_init(char *envp[])
index eef612d1a136106feacc4d65939da21f3fcefa26..e2c1b8e94a39731fd2dbcfe6bebd8a19c69dd830 100644 (file)
--- a/lib/ffz.h
+++ b/lib/ffz.h
@@ -1,16 +1,16 @@
 #ifndef FIO_FFZ_H
 #define FIO_FFZ_H
 
-static inline int __ffs(unsigned long word)
+#include <inttypes.h>
+
+static inline int ffs64(uint64_t word)
 {
        int r = 0;
 
-#if BITS_PER_LONG == 64
        if ((word & 0xffffffff) == 0) {
                r += 32;
                word >>= 32;
        }
-#endif
        if (!(word & 0xffff)) {
                word >>= 16;
                r += 16;
@@ -35,9 +35,20 @@ static inline int __ffs(unsigned long word)
        return r;
 }
 
+#ifndef ARCH_HAVE_FFZ
+
 static inline int ffz(unsigned long bitmask)
 {
-       return __ffs(~bitmask);
+       return ffs64(~bitmask);
+}
+
+#else
+#define ffz(bitmask)   arch_ffz(bitmask)
+#endif
+
+static inline int ffz64(uint64_t bitmask)
+{
+       return ffs64(~bitmask);
 }
 
 #endif