import of ftp.dlink.com/GPL/DSMG-600_reB/ppclinux.tar.gz
[linux-2.4.21-pre4.git] / include / asm-s390 / div64.h
1 #ifndef __S390_DIV64
2 #define __S390_DIV64
3
4 /* for do_div "base" needs to be smaller than 2^31-1 */
5  
6 #define do_div(n, base) ({                                      \
7         unsigned long long __n = (n);                           \
8         unsigned long __r;                                      \
9                                                                 \
10         asm ("   slr  0,0\n"                                    \
11              "   l    1,%1\n"                                   \
12              "   srdl 0,1\n"                                    \
13              "   dr   0,%2\n"                                   \
14              "   alr  1,1\n"                                    \
15              "   alr  0,0\n"                                    \
16              "   lhi  2,1\n"                                    \
17              "   n    2,%1\n"                                   \
18              "   alr  0,2\n"                                    \
19              "   clr  0,%2\n"                                   \
20              "   jl   0f\n"                                     \
21              "   slr  0,%2\n"                                   \
22              "   ahi  1,1\n"                                    \
23              "0: st   1,%1\n"                                   \
24              "   l    1,4+%1\n"                                 \
25              "   srdl 0,1\n"                                    \
26              "   dr   0,%2\n"                                   \
27              "   alr  1,1\n"                                    \
28              "   alr  0,0\n"                                    \
29              "   lhi  2,1\n"                                    \
30              "   n    2,4+%1\n"                                 \
31              "   alr  0,2\n"                                    \
32              "   clr  0,%2\n"                                   \
33              "   jl   1f\n"                                     \
34              "   slr  0,%2\n"                                   \
35              "   ahi  1,1\n"                                    \
36              "1: st   1,4+%1\n"                                 \
37              "   lr   %0,0"                                     \
38              : "=d" (__r), "+m" (__n)                           \
39              : "d" (base) : "0", "1", "2", "cc" );              \
40         (n) = (__n);                                            \
41         __r;                                                    \
42 })
43
44 #endif