aboutsummaryrefslogtreecommitdiff
path: root/include/asm-s390/div64.h
blob: af098dc3cf59b614aedb59f80fb85d83d46e8217 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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