[MIPS] Cleanup fls implementation.
authorRalf Baechle <ralf@linux-mips.org>
Mon, 30 Jan 2006 17:14:41 +0000 (17:14 +0000)
committerRalf Baechle <ralf@linux-mips.org>
Tue, 7 Feb 2006 13:30:24 +0000 (13:30 +0000)
fls was the only called of flz, so fold flz into fls, same for the
__ilog2 call.  Delete the now unused flz function.

Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
include/asm-mips/bitops.h

index 3b0c8aaf6e8bfaf62ec78fd854fe790a7af3f907..8e802059fe67d5a5016795d3d7ea1d00e127bf1f 100644 (file)
@@ -644,20 +644,26 @@ static inline unsigned long ffz(unsigned long word)
 }
 
 /*
- * flz - find last zero in word.
+ * fls - find last bit set.
  * @word: The word to search
  *
- * Returns 0..SZLONG-1
- * Undefined if no zero exists, so code should check against ~0UL first.
+ * Returns 1..SZLONG
+ * Returns 0 if no bit exists
  */
-static inline unsigned long flz(unsigned long word)
+static inline unsigned long fls(unsigned long word)
 {
-#if defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64)
-       return __ilog2(~word);
-#else
 #ifdef CONFIG_32BIT
-       int r = 31, s;
-       word = ~word;
+#ifdef CONFIG_CPU_MIPS32
+       __asm__ ("clz %0, %1" : "=r" (word) : "r" (word));
+
+       return 32 - word;
+#else
+       {
+       int r = 32, s;
+
+       if (word == 0)
+               return 0;
+
        s = 16; if ((word & 0xffff0000)) s = 0; r -= s; word <<= s;
        s = 8;  if ((word & 0xff000000)) s = 0; r -= s; word <<= s;
        s = 4;  if ((word & 0xf0000000)) s = 0; r -= s; word <<= s;
@@ -665,10 +671,23 @@ static inline unsigned long flz(unsigned long word)
        s = 1;  if ((word & 0x80000000)) s = 0; r -= s;
 
        return r;
+       }
 #endif
+#endif /* CONFIG_32BIT */
+
 #ifdef CONFIG_64BIT
-       int r = 63, s;
-       word = ~word;
+#ifdef CONFIG_CPU_MIPS64
+
+       __asm__ ("dclz %0, %1" : "=r" (word) : "r" (word));
+
+       return 64 - word;
+#else
+       {
+       int r = 64, s;
+
+       if (word == 0)
+               return 0;
+
        s = 32; if ((word & 0xffffffff00000000UL)) s = 0; r -= s; word <<= s;
        s = 16; if ((word & 0xffff000000000000UL)) s = 0; r -= s; word <<= s;
        s = 8;  if ((word & 0xff00000000000000UL)) s = 0; r -= s; word <<= s;
@@ -677,24 +696,11 @@ static inline unsigned long flz(unsigned long word)
        s = 1;  if ((word & 0x8000000000000000UL)) s = 0; r -= s;
 
        return r;
+       }
 #endif
-#endif
+#endif /* CONFIG_64BIT */
 }
 
-/*
- * fls - find last bit set.
- * @word: The word to search
- *
- * Returns 1..SZLONG
- * Returns 0 if no bit exists
- */
-static inline unsigned long fls(unsigned long word)
-{
-       if (word == 0)
-               return 0;
-
-       return flz(~word) + 1;
-}
 #define fls64(x)   generic_fls64(x)
 
 /*