diff options
Diffstat (limited to 'include/asm-x86/div64.h')
| -rw-r--r-- | include/asm-x86/div64.h | 34 |
1 files changed, 17 insertions, 17 deletions
diff --git a/include/asm-x86/div64.h b/include/asm-x86/div64.h index 0dbf8bf3ef0a..9a2d644c08ef 100644 --- a/include/asm-x86/div64.h +++ b/include/asm-x86/div64.h | |||
| @@ -33,25 +33,25 @@ | |||
| 33 | __mod; \ | 33 | __mod; \ |
| 34 | }) | 34 | }) |
| 35 | 35 | ||
| 36 | /* | 36 | static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) |
| 37 | * (long)X = ((long long)divs) / (long)div | ||
| 38 | * (long)rem = ((long long)divs) % (long)div | ||
| 39 | * | ||
| 40 | * Warning, this will do an exception if X overflows. | ||
| 41 | */ | ||
| 42 | #define div_long_long_rem(a, b, c) div_ll_X_l_rem(a, b, c) | ||
| 43 | |||
| 44 | static inline long div_ll_X_l_rem(long long divs, long div, long *rem) | ||
| 45 | { | 37 | { |
| 46 | long dum2; | 38 | union { |
| 47 | asm("divl %2":"=a"(dum2), "=d"(*rem) | 39 | u64 v64; |
| 48 | : "rm"(div), "A"(divs)); | 40 | u32 v32[2]; |
| 49 | 41 | } d = { dividend }; | |
| 50 | return dum2; | 42 | u32 upper; |
| 51 | 43 | ||
| 44 | upper = d.v32[1]; | ||
| 45 | d.v32[1] = 0; | ||
| 46 | if (upper >= divisor) { | ||
| 47 | d.v32[1] = upper / divisor; | ||
| 48 | upper %= divisor; | ||
| 49 | } | ||
| 50 | asm ("divl %2" : "=a" (d.v32[0]), "=d" (*remainder) : | ||
| 51 | "rm" (divisor), "0" (d.v32[0]), "1" (upper)); | ||
| 52 | return d.v64; | ||
| 52 | } | 53 | } |
| 53 | 54 | #define div_u64_rem div_u64_rem | |
| 54 | extern uint64_t div64_64(uint64_t dividend, uint64_t divisor); | ||
| 55 | 55 | ||
| 56 | #else | 56 | #else |
| 57 | # include <asm-generic/div64.h> | 57 | # include <asm-generic/div64.h> |
