/* * UCW Library -- Bit Operations * * (c) 2005 Martin Mares * (c) 2012 Pavel Charvat * * This software may be freely distributed and used according to the terms * of the GNU Lesser General Public License. */ #ifndef _UCW_BITOPS_H #define _UCW_BITOPS_H #ifdef CONFIG_UCW_CLEAN_ABI #define bit_fls ucw_bit_fls #define ffs_table ucw_ffs_table #endif /* Find highest bit set (i.e., the floor of the binary logarithm) (bit-fls.c) */ int bit_fls(u32 x); /* bit_fls(0)=-1 */ /* Find lowest bit set, undefined for zero argument (bit-ffs.c) */ extern const byte ffs_table[256]; #ifdef __pentium4 /* On other ia32 machines, the C version is faster */ static inline uint bit_ffs(uint w) { asm("bsfl %1,%0" :"=r" (w) :"rm" (w)); return w; } #else static inline uint bit_ffs(uint w) { uint b = (w & 0xffff) ? 0 : 16; b += ((w >> b) & 0xff) ? 0 : 8; return b + ffs_table[(w >> b) & 0xff]; } #endif /* Count the number of bits set */ static inline uint bit_count(uint w) { return __builtin_popcount(w); } #endif