#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 |