summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Kagstrom <[email protected]>2009-08-24 09:10:12 +0200
committerTom Rix <[email protected]>2009-10-03 09:04:26 -0500
commitc1d1bfa583ee8cb9073eba05f718b33c33c06296 (patch)
tree5f0f0f2a5d7b204c5228565f87083e5e58edd469
parentf83ab09566980fef4a3b37f6128b96b2bf91412a (diff)
Define ffs/fls for all architectures
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 <[email protected]>
-rw-r--r--include/asm-i386/bitops.h1
-rw-r--r--include/asm-m68k/bitops.h1
-rw-r--r--include/asm-nios/bitops.h1
-rw-r--r--include/asm-nios2/bitops.h1
-rw-r--r--include/asm-ppc/bitops.h2
-rw-r--r--include/asm-sh/bitops.h2
-rw-r--r--include/linux/bitops.h45
7 files changed, 53 insertions, 0 deletions
diff --git a/include/asm-i386/bitops.h b/include/asm-i386/bitops.h
index b768e20fbb6..ac6285aa5f2 100644
--- a/include/asm-i386/bitops.h
+++ b/include/asm-i386/bitops.h
@@ -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
diff --git a/include/asm-m68k/bitops.h b/include/asm-m68k/bitops.h
index 0f9e8abe9c1..e0c35fa7b05 100644
--- a/include/asm-m68k/bitops.h
+++ b/include/asm-m68k/bitops.h
@@ -51,6 +51,7 @@ extern __inline__ int ffs(int x)
return r;
}
#define __ffs(x) (ffs(x) - 1)
+#define ffs
#endif /* __KERNEL__ */
diff --git a/include/asm-nios/bitops.h b/include/asm-nios/bitops.h
index 7744212b45a..8315fb7caaf 100644
--- a/include/asm-nios/bitops.h
+++ b/include/asm-nios/bitops.h
@@ -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 */
diff --git a/include/asm-nios2/bitops.h b/include/asm-nios2/bitops.h
index e6c1a850d1b..b01a89d63cd 100644
--- a/include/asm-nios2/bitops.h
+++ b/include/asm-nios2/bitops.h
@@ -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 */
diff --git a/include/asm-ppc/bitops.h b/include/asm-ppc/bitops.h
index daa66cf9185..9ed2f5d6faa 100644
--- a/include/asm-ppc/bitops.h
+++ b/include/asm-ppc/bitops.h
@@ -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
diff --git a/include/asm-sh/bitops.h b/include/asm-sh/bitops.h
index 410fba46eff..95167bd45ac 100644
--- a/include/asm-sh/bitops.h
+++ b/include/asm-sh/bitops.h
@@ -146,6 +146,8 @@ static inline int ffs (int x)
}
return r;
}
+#define ffs
+
#endif /* __KERNEL__ */
#endif /* __ASM_SH_BITOPS_H */
diff --git a/include/linux/bitops.h b/include/linux/bitops.h
index 387a81813b9..e14e6c7b14f 100644
--- a/include/linux/bitops.h
+++ b/include/linux/bitops.h
@@ -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