Beside this linux-2.4.18 compiled with gcc-3.1 20020311 works fine for
me.
diff -ur linux-/include/asm-i386/bitops.h linux/include/asm-i386/bitops.h
--- linux-/include/asm-i386/bitops.h Thu Nov 22 20:46:18 2001
+++ linux/include/asm-i386/bitops.h Tue Mar 5 21:08:15 2002
@@ -316,6 +316,8 @@
return (offset + set + res);
}
+#include <linux/bitops.h>
+
/**
* ffz - find first zero in word.
* @word: The word to search
@@ -324,10 +326,16 @@
*/
static __inline__ unsigned long ffz(unsigned long word)
{
- __asm__("bsfl %1,%0"
- :"=r" (word)
- :"r" (~word));
- return word;
+ /* The generic_ffs function is used to avoid the asm when the
+ argument is a constant. */
+ if (__builtin_constant_p (word)) {
+ return (~word ? (unsigned long) generic_ffs ((int) ~word) - 1 : 32);
+ } else {
+ __asm__("bsfl %1,%0"
+ :"=r" (word)
+ :"r" (~word));
+ return word;
+ }
}
#ifdef __KERNEL__
@@ -342,13 +350,19 @@
*/
static __inline__ int ffs(int x)
{
- int r;
-
- __asm__("bsfl %1,%0\n\t"
- "jnz 1f\n\t"
- "movl $-1,%0\n"
- "1:" : "=r" (r) : "g" (x));
- return r+1;
+ /* The generic_ffs function is used to avoid the asm when the
+ argument is a constant. */
+ if (__builtin_constant_p (x)) {
+ return generic_ffs (x);
+ } else {
+ int r;
+
+ __asm__("bsfl %1,%0\n\t"
+ "jnz 1f\n\t"
+ "movl $-1,%0\n"
+ "1:" : "=r" (r) : "g" (x));
+ return r+1;
+ }
}
/**
-- : Michal Moskal :::::::: malekith/at/pld.org.pl : GCS {C,UL}++++$ a? !tv : PLD Linux ::::::: Wroclaw University, CS Dept : {E-,w}-- {b++,e}>+++ h- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/