Merge master.kernel.org:/home/rmk/linux-2.6-serial
[linux-2.6] / include / asm-s390 / div64.h
1 #ifndef __S390_DIV64
2 #define __S390_DIV64
3
4 #ifndef __s390x__
5
6 /* for do_div "base" needs to be smaller than 2^31-1 */
7 #define do_div(n, base) ({                                      \
8         unsigned long long __n = (n);                           \
9         unsigned long __r;                                      \
10                                                                 \
11         asm ("   slr  0,0\n"                                    \
12              "   l    1,%1\n"                                   \
13              "   srdl 0,1\n"                                    \
14              "   dr   0,%2\n"                                   \
15              "   alr  1,1\n"                                    \
16              "   alr  0,0\n"                                    \
17              "   lhi  2,1\n"                                    \
18              "   n    2,%1\n"                                   \
19              "   alr  0,2\n"                                    \
20              "   clr  0,%2\n"                                   \
21              "   jl   0f\n"                                     \
22              "   slr  0,%2\n"                                   \
23              "   ahi  1,1\n"                                    \
24              "0: st   1,%1\n"                                   \
25              "   l    1,4+%1\n"                                 \
26              "   srdl 0,1\n"                                    \
27              "   dr   0,%2\n"                                   \
28              "   alr  1,1\n"                                    \
29              "   alr  0,0\n"                                    \
30              "   lhi  2,1\n"                                    \
31              "   n    2,4+%1\n"                                 \
32              "   alr  0,2\n"                                    \
33              "   clr  0,%2\n"                                   \
34              "   jl   1f\n"                                     \
35              "   slr  0,%2\n"                                   \
36              "   ahi  1,1\n"                                    \
37              "1: st   1,4+%1\n"                                 \
38              "   lr   %0,0"                                     \
39              : "=d" (__r), "=m" (__n)                           \
40              : "d" (base), "m" (__n) : "0", "1", "2", "cc" );   \
41         (n) = (__n);                                            \
42         __r;                                                    \
43 })
44
45 #else /* __s390x__ */
46 #include <asm-generic/div64.h>
47 #endif /* __s390x__ */
48
49 #endif