]> mj.ucw.cz Git - libucw.git/blobdiff - ucw/bitops.h
Compatibility with GCC < 4.0 is not needed any longer
[libucw.git] / ucw / bitops.h
index c1e6371027a5d39e6fef6dca8883af6e8f922280..21f40c47fc140a8c9e34a3b69665dc51baf29cce 100644 (file)
@@ -2,6 +2,7 @@
  *     UCW Library -- Bit Operations
  *
  *     (c) 2005 Martin Mares <mj@ucw.cz>
+ *     (c) 2012 Pavel Charvat <pchar@ucw.cz>
  *
  *     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 */
@@ -20,7 +26,7 @@ extern const byte ffs_table[256];
 
 #ifdef __pentium4              /* On other ia32 machines, the C version is faster */
 
-static inline uns bit_ffs(uns w)
+static inline uint bit_ffs(uint w)
 {
   asm("bsfl %1,%0" :"=r" (w) :"rm" (w));
   return w;
@@ -28,13 +34,20 @@ static inline uns bit_ffs(uns w)
 
 #else
 
-static inline uns bit_ffs(uns w)
+static inline uint bit_ffs(uint w)
 {
-  uns b = (w & 0xffff) ? 0 : 16;
+  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