diff options
Diffstat (limited to 'include/asm-x86')
-rw-r--r-- | include/asm-x86/div64.h | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/include/asm-x86/div64.h b/include/asm-x86/div64.h index 0dbf8bf3ef0a..c7892cfe9ce6 100644 --- a/include/asm-x86/div64.h +++ b/include/asm-x86/div64.h | |||
@@ -51,6 +51,26 @@ static inline long div_ll_X_l_rem(long long divs, long div, long *rem) | |||
51 | 51 | ||
52 | } | 52 | } |
53 | 53 | ||
54 | static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) | ||
55 | { | ||
56 | union { | ||
57 | u64 v64; | ||
58 | u32 v32[2]; | ||
59 | } d = { dividend }; | ||
60 | u32 upper; | ||
61 | |||
62 | upper = d.v32[1]; | ||
63 | d.v32[1] = 0; | ||
64 | if (upper >= divisor) { | ||
65 | d.v32[1] = upper / divisor; | ||
66 | upper %= divisor; | ||
67 | } | ||
68 | asm ("divl %2" : "=a" (d.v32[0]), "=d" (*remainder) : | ||
69 | "rm" (divisor), "0" (d.v32[0]), "1" (upper)); | ||
70 | return d.v64; | ||
71 | } | ||
72 | #define div_u64_rem div_u64_rem | ||
73 | |||
54 | extern uint64_t div64_64(uint64_t dividend, uint64_t divisor); | 74 | extern uint64_t div64_64(uint64_t dividend, uint64_t divisor); |
55 | 75 | ||
56 | #else | 76 | #else |