Define ffs/fls for all architectures
authorSimon Kagstrom <simon.kagstrom@netinsight.net>
Mon, 24 Aug 2009 07:10:12 +0000 (09:10 +0200)
committerTom Rix <Tom.Rix@windriver.com>
Sat, 3 Oct 2009 14:04:26 +0000 (09:04 -0500)
UBIFS requires fls(), which is not defined for arm (and some other
architectures) and this patch adds it. The implementation is taken from
Linux and is generic. ffs() is also defined for those that miss it.

Signed-off-by: Simon Kagstrom <simon.kagstrom@netinsight.net>
include/asm-i386/bitops.h
include/asm-m68k/bitops.h
include/asm-nios/bitops.h
include/asm-nios2/bitops.h
include/asm-ppc/bitops.h
include/asm-sh/bitops.h
include/linux/bitops.h

index b768e20fbb66484cbccc42235500e4c1651db278..ac6285aa5f2eb6cae88a0a17f57c911fc54e04b4 100644 (file)
@@ -349,6 +349,7 @@ static __inline__ int ffs(int x)
                "1:" : "=r" (r) : "g" (x));
        return r+1;
 }
+#define ffs
 
 /**
  * hweightN - returns the hamming weight of a N-bit word
index 0f9e8abe9c12e43e23865686e1a8edea3ae29203..e0c35fa7b055162aee02451bc2219528393db349 100644 (file)
@@ -51,6 +51,7 @@ extern __inline__ int ffs(int x)
        return r;
 }
 #define __ffs(x) (ffs(x) - 1)
+#define ffs
 
 #endif /* __KERNEL__ */
 
index 7744212b45ad6e3661ee0acb026121e263984974..8315fb7caafa6986b8c2cf8df7c5b932d13957df 100644 (file)
@@ -33,5 +33,6 @@ extern int test_and_set_bit(int nr, volatile void * a);
 extern int test_and_change_bit(int nr, volatile void * addr);
 extern int test_bit(int nr, volatile void * a);
 extern int ffs(int i);
+#define ffs
 
 #endif /* _ASM_NIOS_BITOPS_H */
index e6c1a850d1b4be482149372764af8b0d466a6097..b01a89d63cd3f4bf18597e7e9ac19b35a9dbfb27 100644 (file)
@@ -33,5 +33,6 @@ extern int test_and_set_bit(int nr, volatile void * a);
 extern int test_and_change_bit(int nr, volatile void * addr);
 extern int test_bit(int nr, volatile void * a);
 extern int ffs(int i);
+#define ffs
 
 #endif /* __ASM_NIOS2_BITOPS_H */
index daa66cf9185bbc19967c22a4aa4f65629c472fcd..9ed2f5d6faa7e7e79152a10d3f210b49b099cc1f 100644 (file)
@@ -178,6 +178,7 @@ static __inline__ int fls(unsigned int x)
 {
        return __ilog2(x) + 1;
 }
+#define fls
 
 /**
  * fls64 - find last set bit in a 64-bit word
@@ -230,6 +231,7 @@ extern __inline__ int ffs(int x)
 {
        return __ilog2(x & -x) + 1;
 }
+#define ffs
 
 /*
  * hweightN: returns the hamming weight (i.e. the number
index 410fba46effef90dbaa5f157b66489507ca3a0aa..95167bd45acb877b4de070967a316097d4baae97 100644 (file)
@@ -146,6 +146,8 @@ static inline int ffs (int x)
        }
        return r;
 }
+#define ffs
+
 #endif /* __KERNEL__ */
 
 #endif /* __ASM_SH_BITOPS_H */
index 387a81813b9903c480fa2bed141284058d863347..e14e6c7b14fc1ef1595337ae58c1d7985d689d47 100644 (file)
@@ -38,6 +38,43 @@ static inline int generic_ffs(int x)
        return r;
 }
 
+/**
+ * fls - find last (most-significant) bit set
+ * @x: the word to search
+ *
+ * This is defined the same way as ffs.
+ * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
+ */
+static inline int generic_fls(int x)
+{
+       int r = 32;
+
+       if (!x)
+               return 0;
+       if (!(x & 0xffff0000u)) {
+               x <<= 16;
+               r -= 16;
+       }
+       if (!(x & 0xff000000u)) {
+               x <<= 8;
+               r -= 8;
+       }
+       if (!(x & 0xf0000000u)) {
+               x <<= 4;
+               r -= 4;
+       }
+       if (!(x & 0xc0000000u)) {
+               x <<= 2;
+               r -= 2;
+       }
+       if (!(x & 0x80000000u)) {
+               x <<= 1;
+               r -= 1;
+       }
+       return r;
+}
+
+
 /*
  * hweightN: returns the hamming weight (i.e. the number
  * of bits set) of a N-bit word
@@ -82,6 +119,14 @@ static inline unsigned int generic_hweight8(unsigned int w)
 # define __clear_bit generic_clear_bit
 #endif
 
+#ifndef ffs
+# define ffs generic_ffs
+#endif
+
+#ifndef fls
+# define fls generic_fls
+#endif
+
 /**
  * __set_bit - Set a bit in memory
  * @nr: the bit to set