mirror of https://gitee.com/openkylin/linux.git
50 lines
1.3 KiB
C
50 lines
1.3 KiB
C
#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
|