linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / include / asm-s390 / div64.h
index 6cd978c..af098dc 100644 (file)
@@ -1 +1,49 @@
+#ifndef __S390_DIV64
+#define __S390_DIV64
+
+#ifndef __s390x__
+
+/* for do_div "base" needs to be smaller than 2^31-1 */
+#define do_div(n, base) ({                                      \
+       unsigned long long __n = (n);                           \
+       unsigned long __r;                                      \
+                                                               \
+       asm ("   slr  0,0\n"                                    \
+            "   l    1,%1\n"                                   \
+            "   srdl 0,1\n"                                    \
+            "   dr   0,%2\n"                                   \
+            "   alr  1,1\n"                                    \
+            "   alr  0,0\n"                                    \
+            "   lhi  2,1\n"                                    \
+            "   n    2,%1\n"                                   \
+            "   alr  0,2\n"                                    \
+            "   clr  0,%2\n"                                   \
+            "   jl   0f\n"                                     \
+            "   slr  0,%2\n"                                   \
+             "   ahi  1,1\n"                                   \
+            "0: st   1,%1\n"                                   \
+            "   l    1,4+%1\n"                                 \
+            "   srdl 0,1\n"                                    \
+             "   dr   0,%2\n"                                  \
+            "   alr  1,1\n"                                    \
+            "   alr  0,0\n"                                    \
+            "   lhi  2,1\n"                                    \
+            "   n    2,4+%1\n"                                 \
+            "   alr  0,2\n"                                    \
+            "   clr  0,%2\n"                                   \
+             "   jl   1f\n"                                    \
+            "   slr  0,%2\n"                                   \
+            "   ahi  1,1\n"                                    \
+            "1: st   1,4+%1\n"                                 \
+             "   lr   %0,0"                                    \
+            : "=d" (__r), "=m" (__n)                           \
+            : "d" (base), "m" (__n) : "0", "1", "2", "cc" );   \
+       (n) = (__n);                                            \
+        __r;                                                    \
+})
+
+#else /* __s390x__ */
 #include <asm-generic/div64.h>
+#endif /* __s390x__ */
+
+#endif