Commit 52d61227 authored by Simon Kagstrom's avatar Simon Kagstrom Committed by Wolfgang Denk
Browse files

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: default avatarSimon Kagstrom <simon.kagstrom@netinsight.net>
parent 4b15de08
......@@ -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
......
......@@ -51,6 +51,7 @@ extern __inline__ int ffs(int x)
return r;
}
#define __ffs(x) (ffs(x) - 1)
#define ffs
#endif /* __KERNEL__ */
......
......@@ -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 */
......@@ -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 */
......@@ -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
......
......@@ -146,6 +146,8 @@ static inline int ffs (int x)
}
return r;
}
#define ffs
#endif /* __KERNEL__ */
#endif /* __ASM_SH_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
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment