#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