diff options
Diffstat (limited to 'include/asm-x86/div64.h')
-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) } +static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) +{ + union { + u64 v64; + u32 v32[2]; + } d = { dividend }; + u32 upper; + + upper = d.v32[1]; + d.v32[1] = 0; + if (upper >= divisor) { + d.v32[1] = upper / divisor; + upper %= divisor; + } + asm ("divl %2" : "=a" (d.v32[0]), "=d" (*remainder) : + "rm" (divisor), "0" (d.v32[0]), "1" (upper)); + return d.v64; +} +#define div_u64_rem div_u64_rem + extern uint64_t div64_64(uint64_t dividend, uint64_t divisor); #else |