]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - include/asm-i386/bitops.h
Merge with /home/shaggy/git/linus-clean/
[linux-2.6-omap-h63xx.git] / include / asm-i386 / bitops.h
index 9db0b712d57a724567ec94920b60a3ae55c2c02c..ddf1739dc7fd1968954ff0eed7d9053346f1360f 100644 (file)
@@ -310,6 +310,20 @@ static inline int find_first_zero_bit(const unsigned long *addr, unsigned size)
  */
 int find_next_zero_bit(const unsigned long *addr, int size, int offset);
 
+/**
+ * __ffs - find first bit in word.
+ * @word: The word to search
+ *
+ * Undefined if no bit exists, so code should check against 0 first.
+ */
+static inline unsigned long __ffs(unsigned long word)
+{
+       __asm__("bsfl %1,%0"
+               :"=r" (word)
+               :"rm" (word));
+       return word;
+}
+
 /**
  * find_first_bit - find the first set bit in a memory region
  * @addr: The address to start the search at
@@ -320,22 +334,15 @@ int find_next_zero_bit(const unsigned long *addr, int size, int offset);
  */
 static inline int find_first_bit(const unsigned long *addr, unsigned size)
 {
-       int d0, d1;
-       int res;
-
-       /* This looks at memory. Mark it volatile to tell gcc not to move it around */
-       __asm__ __volatile__(
-               "xorl %%eax,%%eax\n\t"
-               "repe; scasl\n\t"
-               "jz 1f\n\t"
-               "leal -4(%%edi),%%edi\n\t"
-               "bsfl (%%edi),%%eax\n"
-               "1:\tsubl %%ebx,%%edi\n\t"
-               "shll $3,%%edi\n\t"
-               "addl %%edi,%%eax"
-               :"=a" (res), "=&c" (d0), "=&D" (d1)
-               :"1" ((size + 31) >> 5), "2" (addr), "b" (addr) : "memory");
-       return res;
+       int x = 0;
+
+       while (x < size) {
+               unsigned long val = *addr++;
+               if (val)
+                       return __ffs(val) + x;
+               x += (sizeof(*addr)<<3);
+       }
+       return x;
 }
 
 /**
@@ -360,20 +367,6 @@ static inline unsigned long ffz(unsigned long word)
        return word;
 }
 
-/**
- * __ffs - find first bit in word.
- * @word: The word to search
- *
- * Undefined if no bit exists, so code should check against 0 first.
- */
-static inline unsigned long __ffs(unsigned long word)
-{
-       __asm__("bsfl %1,%0"
-               :"=r" (word)
-               :"rm" (word));
-       return word;
-}
-
 /*
  * fls: find last bit set.
  */