|
|
|
@ -17,18 +17,20 @@ |
|
|
|
|
* This ends up being the most efficient "calling |
|
|
|
|
* convention" on x86. |
|
|
|
|
*/ |
|
|
|
|
#define do_div(n,base) ({ \ |
|
|
|
|
unsigned long __upper, __low, __high, __mod, __base; \
|
|
|
|
|
__base = (base); \
|
|
|
|
|
asm("":"=a" (__low), "=d" (__high):"A" (n)); \
|
|
|
|
|
__upper = __high; \
|
|
|
|
|
if (__high) { \
|
|
|
|
|
__upper = __high % (__base); \
|
|
|
|
|
__high = __high / (__base); \
|
|
|
|
|
} \
|
|
|
|
|
asm("divl %2":"=a" (__low), "=d" (__mod):"rm" (__base), "0" (__low), "1" (__upper)); \
|
|
|
|
|
asm("":"=A" (n):"a" (__low),"d" (__high)); \
|
|
|
|
|
__mod; \
|
|
|
|
|
#define do_div(n, base) \ |
|
|
|
|
({ \
|
|
|
|
|
unsigned long __upper, __low, __high, __mod, __base; \
|
|
|
|
|
__base = (base); \
|
|
|
|
|
asm("":"=a" (__low), "=d" (__high) : "A" (n)); \
|
|
|
|
|
__upper = __high; \
|
|
|
|
|
if (__high) { \
|
|
|
|
|
__upper = __high % (__base); \
|
|
|
|
|
__high = __high / (__base); \
|
|
|
|
|
} \
|
|
|
|
|
asm("divl %2":"=a" (__low), "=d" (__mod) \
|
|
|
|
|
: "rm" (__base), "0" (__low), "1" (__upper)); \
|
|
|
|
|
asm("":"=A" (n) : "a" (__low), "d" (__high)); \
|
|
|
|
|
__mod; \
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -37,14 +39,13 @@ |
|
|
|
|
* |
|
|
|
|
* Warning, this will do an exception if X overflows. |
|
|
|
|
*/ |
|
|
|
|
#define div_long_long_rem(a,b,c) div_ll_X_l_rem(a,b,c) |
|
|
|
|
#define div_long_long_rem(a, b, c) div_ll_X_l_rem(a, b, c) |
|
|
|
|
|
|
|
|
|
static inline long |
|
|
|
|
div_ll_X_l_rem(long long divs, long div, long *rem) |
|
|
|
|
static inline long div_ll_X_l_rem(long long divs, long div, long *rem) |
|
|
|
|
{ |
|
|
|
|
long dum2; |
|
|
|
|
__asm__("divl %2":"=a"(dum2), "=d"(*rem) |
|
|
|
|
: "rm"(div), "A"(divs)); |
|
|
|
|
asm("divl %2":"=a"(dum2), "=d"(*rem) |
|
|
|
|
: "rm"(div), "A"(divs)); |
|
|
|
|
|
|
|
|
|
return dum2; |
|
|
|
|
|
|
|
|
|