Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / include / asm-v850 / bitops.h
index c837ea0..1f6fd5a 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * include/asm-v850/bitops.h -- Bit operations
  *
- *  Copyright (C) 2001,02,03,04  NEC Electronics Corporation
- *  Copyright (C) 2001,02,03,04  Miles Bader <miles@gnu.org>
+ *  Copyright (C) 2001,02,03,04,05  NEC Electronics Corporation
+ *  Copyright (C) 2001,02,03,04,05  Miles Bader <miles@gnu.org>
  *  Copyright (C) 1992  Linus Torvalds.
  *
  * This file is subject to the terms and conditions of the GNU General
 
 #ifdef __KERNEL__
 
-/*
- * The __ functions are not atomic
- */
+#include <asm-generic/bitops/ffz.h>
 
 /*
- * ffz = Find First Zero in word. Undefined if no zero exists,
- * so code should check against ~0UL first..
+ * The __ functions are not atomic
  */
-extern __inline__ unsigned long ffz (unsigned long word)
-{
-       unsigned long result = 0;
-
-       while (word & 1) {
-               result++;
-               word >>= 1;
-       }
-       return result;
-}
-
 
 /* In the following constant-bit-op macros, a "g" constraint is used when
    we really need an integer ("i" constraint).  This is to avoid
@@ -127,20 +113,20 @@ extern __inline__ unsigned long ffz (unsigned long word)
 #define test_and_change_bit(nr, addr)  __tns_atomic_bit_op ("not1", nr, addr)
 
 
-#define __const_test_bit(nr, addr)                                     \
-  ({ int __test_bit_res;                                               \
-     __asm__ ("tst1 (%1 - 0x123), %2; setf nz, %0"                     \
-             : "=r" (__test_bit_res)                                   \
-             : "g" (((nr) & 0x7) + 0x123),                             \
-                "m" (*((const char *)(addr) + ((nr) >> 3))));          \
-     __test_bit_res;                                                   \
+#define __const_test_bit(nr, addr)                                           \
+  ({ int __test_bit_res;                                                     \
+     __asm__ __volatile__ ("tst1 (%1 - 0x123), %2; setf nz, %0"                      \
+                          : "=r" (__test_bit_res)                            \
+                          : "g" (((nr) & 0x7) + 0x123),                      \
+                            "m" (*((const char *)(addr) + ((nr) >> 3))));    \
+     __test_bit_res;                                                         \
   })
-extern __inline__ int __test_bit (int nr, const void *addr)
+static inline int __test_bit (int nr, const void *addr)
 {
        int res;
-       __asm__ ("tst1 %1, [%2]; setf nz, %0"
-                : "=r" (res)
-                : "r" (nr & 0x7), "r" (addr + (nr >> 3)));
+       __asm__ __volatile__ ("tst1 %1, [%2]; setf nz, %0"
+                             : "=r" (res)
+                             : "r" (nr & 0x7), "r" (addr + (nr >> 3)));
        return res;
 }
 #define test_bit(nr,addr)                                              \
@@ -153,120 +139,19 @@ extern __inline__ int __test_bit (int nr, const void *addr)
 #define smp_mb__before_clear_bit()     barrier ()
 #define smp_mb__after_clear_bit()      barrier ()
 
+#include <asm-generic/bitops/ffs.h>
+#include <asm-generic/bitops/fls.h>
+#include <asm-generic/bitops/fls64.h>
+#include <asm-generic/bitops/__ffs.h>
+#include <asm-generic/bitops/find.h>
+#include <asm-generic/bitops/sched.h>
+#include <asm-generic/bitops/hweight.h>
 
-#define find_first_zero_bit(addr, size) \
-  find_next_zero_bit ((addr), (size), 0)
-
-extern __inline__ int find_next_zero_bit (void *addr, int size, int offset)
-{
-       unsigned long *p = ((unsigned long *) addr) + (offset >> 5);
-       unsigned long result = offset & ~31UL;
-       unsigned long tmp;
-
-       if (offset >= size)
-               return size;
-       size -= result;
-       offset &= 31UL;
-       if (offset) {
-               tmp = * (p++);
-               tmp |= ~0UL >> (32-offset);
-               if (size < 32)
-                       goto found_first;
-               if (~tmp)
-                       goto found_middle;
-               size -= 32;
-               result += 32;
-       }
-       while (size & ~31UL) {
-               if (~ (tmp = * (p++)))
-                       goto found_middle;
-               result += 32;
-               size -= 32;
-       }
-       if (!size)
-               return result;
-       tmp = *p;
-
- found_first:
-       tmp |= ~0UL >> size;
- found_middle:
-       return result + ffz (tmp);
-}
-
-#define ffs(x) generic_ffs (x)
-#define fls(x) generic_fls (x)
-#define __ffs(x) ffs(x)
-
-/*
- * This is just `generic_ffs' from <linux/bitops.h>, except that it assumes
- * that at least one bit is set, and returns the real index of the bit
- * (rather than the bit index + 1, like ffs does).
- */
-static inline int sched_ffs(int x)
-{
-       int r = 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;
-}
-
-/*
- * Every architecture must define this function. It's the fastest
- * way of searching a 140-bit bitmap where the first 100 bits are
- * unlikely to be set. It's guaranteed that at least one of the 140
- * bits is set.
- */
-static inline int sched_find_first_bit(unsigned long *b)
-{
-       unsigned offs = 0;
-       while (! *b) {
-               b++;
-               offs += 32;
-       }
-       return sched_ffs (*b) + offs;
-}
-
-/*
- * hweightN: returns the hamming weight (i.e. the number
- * of bits set) of a N-bit word
- */
-#define hweight32(x)                   generic_hweight32 (x)
-#define hweight16(x)                   generic_hweight16 (x)
-#define hweight8(x)                    generic_hweight8 (x)
-
-#define ext2_set_bit                   test_and_set_bit
+#include <asm-generic/bitops/ext2-non-atomic.h>
 #define ext2_set_bit_atomic(l,n,a)      test_and_set_bit(n,a)
-#define ext2_clear_bit                 test_and_clear_bit
 #define ext2_clear_bit_atomic(l,n,a)    test_and_clear_bit(n,a)
-#define ext2_test_bit                  test_bit
-#define ext2_find_first_zero_bit       find_first_zero_bit
-#define ext2_find_next_zero_bit                find_next_zero_bit
 
-/* Bitmap functions for the minix filesystem.  */
-#define minix_test_and_set_bit         test_and_set_bit
-#define minix_set_bit                  set_bit
-#define minix_test_and_clear_bit       test_and_clear_bit
-#define minix_test_bit                         test_bit
-#define minix_find_first_zero_bit      find_first_zero_bit
+#include <asm-generic/bitops/minix.h>
 
 #endif /* __KERNEL__ */