1#ifndef __S390_DIV64
2#define __S390_DIV64
3
4
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