From f8582257a0b6d6592f8276bdbd33bb611b139ca3 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Wed, 23 Dec 2015 09:09:23 -0700 Subject: [PATCH] arch: add ffs64 and ffz64 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 --- arch/arch.h | 4 ---- lib/ffz.h | 19 +++++++++++++++---- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/arch/arch.h b/arch/arch.h index 5671b9a0..043e2838 100644 --- a/arch/arch.h +++ b/arch/arch.h @@ -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[]) diff --git a/lib/ffz.h b/lib/ffz.h index eef612d1..e2c1b8e9 100644 --- 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 + +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 -- 2.25.1