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
45