diff options
Diffstat (limited to 'include/linux/bitops.h')
| -rw-r--r-- | include/linux/bitops.h | 72 | 
1 files changed, 72 insertions, 0 deletions
diff --git a/include/linux/bitops.h b/include/linux/bitops.h new file mode 100644 index 000000000..b155b7796 --- /dev/null +++ b/include/linux/bitops.h @@ -0,0 +1,72 @@ +#ifndef _LINUX_BITOPS_H +#define _LINUX_BITOPS_H + + +/* + * ffs: find first bit set. This is defined the same way as + * the libc and compiler builtin ffs routines, therefore + * differs in spirit from the above ffz (man ffs). + */ + +static inline int generic_ffs(int x) +{ +	int r = 1; + +	if (!x) +		return 0; +	if (!(x & 0xffff)) { +		x >>= 16; +		r += 16; +	} +	if (!(x & 0xff)) { +		x >>= 8; +		r += 8; +	} +	if (!(x & 0xf)) { +		x >>= 4; +		r += 4; +	} +	if (!(x & 3)) { +		x >>= 2; +		r += 2; +	} +	if (!(x & 1)) { +		x >>= 1; +		r += 1; +	} +	return r; +} + +/* + * hweightN: returns the hamming weight (i.e. the number + * of bits set) of a N-bit word + */ + +static inline unsigned int generic_hweight32(unsigned int w) +{ +        unsigned int res = (w & 0x55555555) + ((w >> 1) & 0x55555555); +        res = (res & 0x33333333) + ((res >> 2) & 0x33333333); +        res = (res & 0x0F0F0F0F) + ((res >> 4) & 0x0F0F0F0F); +        res = (res & 0x00FF00FF) + ((res >> 8) & 0x00FF00FF); +        return (res & 0x0000FFFF) + ((res >> 16) & 0x0000FFFF); +} + +static inline unsigned int generic_hweight16(unsigned int w) +{ +        unsigned int res = (w & 0x5555) + ((w >> 1) & 0x5555); +        res = (res & 0x3333) + ((res >> 2) & 0x3333); +        res = (res & 0x0F0F) + ((res >> 4) & 0x0F0F); +        return (res & 0x00FF) + ((res >> 8) & 0x00FF); +} + +static inline unsigned int generic_hweight8(unsigned int w) +{ +        unsigned int res = (w & 0x55) + ((w >> 1) & 0x55); +        res = (res & 0x33) + ((res >> 2) & 0x33); +        return (res & 0x0F) + ((res >> 4) & 0x0F); +} + +#include <asm/bitops.h> + + +#endif  |