Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |