#define nop asm volatile ("hint @pause" ::: "memory");
#define read_barrier() asm volatile ("mf" ::: "memory")
+#define ia64_popcnt(x) \
+({ \
+ unsigned long ia64_intri_res; \
+ asm ("popcnt %0=%1" : "=r" (ia64_intri_res) : "r" (x)); \
+ ia64_intri_res; \
+})
+
+static inline unsigned long arch_ffz(unsigned long bitmask)
+{
+ return ia64_popcnt(bitmask & (~bitmask - 1));
+}
+#define ARCH_HAVE_FFZ
+
#endif
__asm__ __volatile__ ("sync" : : : "memory")
#endif
+static inline int __ilog2(unsigned long bitmask)
+{
+ int lz;
+
+ asm ("cntlzw %0,%1" : "=r" (lz) : "r" (bitmask));
+ return 31 - lz;
+}
+
+static inline int arch_ffz(unsigned long bitmask)
+{
+ if ((bitmask = ~bitmask) == 0)
+ return 32;
+ return __ilog2(bitmask & -bitmask);
+}
+#define ARCH_HAVE_FFZ
+
#endif
#define nop __asm__ __volatile__("rep;nop": : :"memory")
#define read_barrier() asm volatile ("": : :"memory")
+static inline unsigned long arch_ffz(unsigned long bitmask)
+{
+ __asm__("bsfl %1,%0" :"=r" (bitmask) :"r" (~bitmask));
+ return bitmask;
+}
+#define ARCH_HAVE_FFZ
+
#endif
#define nop __asm__ __volatile__("rep;nop": : :"memory")
#define read_barrier() asm volatile("lfence":::"memory")
+static inline unsigned long arch_ffz(unsigned long bitmask)
+{
+ __asm__("bsfq %1,%0" :"=r" (bitmask) :"r" (~bitmask));
+ return bitmask;
+}
+#define ARCH_HAVE_FFZ
+
#endif
#error "Unsupported arch"
#endif
+#ifdef ARCH_HAVE_FFZ
+#define ffz(bitmask) arch_ffz(bitmask)
+#else
+#include "../lib/ffz.h"
+#endif
+
#endif
#include "fio.h"
#include "hash.h"
-#include "lib/ffz.h"
/*
* Change this define to play with the timeout handling