sh: Plug in SH-5 ffz()/__ffs() bitops.
authorPaul Mundt <lethal@linux-sh.org>
Sun, 11 Nov 2007 08:28:18 +0000 (17:28 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Mon, 28 Jan 2008 04:18:45 +0000 (13:18 +0900)
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
include/asm-sh/bitops.h

index df805f20b26786a3d74478a0c2fd6e10bf1777e5..a7bd81a7f064ab1e2130705f5701afbc62042667 100644 (file)
@@ -105,6 +105,7 @@ static inline int test_and_change_bit(int nr, volatile void * addr)
 
 #include <asm-generic/bitops/non-atomic.h>
 
+#ifdef CONFIG_SUPERH32
 static inline unsigned long ffz(unsigned long word)
 {
        unsigned long result;
@@ -138,6 +139,31 @@ static inline unsigned long __ffs(unsigned long word)
                : "t");
        return result;
 }
+#else
+static inline unsigned long ffz(unsigned long word)
+{
+       unsigned long result, __d2, __d3;
+
+        __asm__("gettr  tr0, %2\n\t"
+                "pta    $+32, tr0\n\t"
+                "andi   %1, 1, %3\n\t"
+                "beq    %3, r63, tr0\n\t"
+                "pta    $+4, tr0\n"
+                "0:\n\t"
+                "shlri.l        %1, 1, %1\n\t"
+                "addi   %0, 1, %0\n\t"
+                "andi   %1, 1, %3\n\t"
+                "beqi   %3, 1, tr0\n"
+                "1:\n\t"
+                "ptabs  %2, tr0\n\t"
+                : "=r" (result), "=r" (word), "=r" (__d2), "=r" (__d3)
+                : "0" (0L), "1" (word));
+
+       return result;
+}
+
+#include <asm-generic/bitops/__ffs.h>
+#endif
 
 #include <asm-generic/bitops/find.h>
 #include <asm-generic/bitops/ffs.h>