diff options
Diffstat (limited to 'include/linux/math64.h')
-rw-r--r-- | include/linux/math64.h | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/include/linux/math64.h b/include/linux/math64.h new file mode 100644 index 000000000000..6d1716641008 --- /dev/null +++ b/include/linux/math64.h | |||
@@ -0,0 +1,72 @@ | |||
1 | #ifndef _LINUX_MATH64_H | ||
2 | #define _LINUX_MATH64_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | #include <asm/div64.h> | ||
6 | |||
7 | #if BITS_PER_LONG == 64 | ||
8 | |||
9 | /** | ||
10 | * div_u64_rem - unsigned 64bit divide with 32bit divisor with remainder | ||
11 | * | ||
12 | * This is commonly provided by 32bit archs to provide an optimized 64bit | ||
13 | * divide. | ||
14 | */ | ||
15 | static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) | ||
16 | { | ||
17 | *remainder = dividend % divisor; | ||
18 | return dividend / divisor; | ||
19 | } | ||
20 | |||
21 | /** | ||
22 | * div_s64_rem - signed 64bit divide with 32bit divisor with remainder | ||
23 | */ | ||
24 | static inline s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder) | ||
25 | { | ||
26 | *remainder = dividend % divisor; | ||
27 | return dividend / divisor; | ||
28 | } | ||
29 | |||
30 | #elif BITS_PER_LONG == 32 | ||
31 | |||
32 | #ifndef div_u64_rem | ||
33 | static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) | ||
34 | { | ||
35 | *remainder = do_div(dividend, divisor); | ||
36 | return dividend; | ||
37 | } | ||
38 | #endif | ||
39 | |||
40 | #ifndef div_s64_rem | ||
41 | extern s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder); | ||
42 | #endif | ||
43 | |||
44 | #endif /* BITS_PER_LONG */ | ||
45 | |||
46 | /** | ||
47 | * div_u64 - unsigned 64bit divide with 32bit divisor | ||
48 | * | ||
49 | * This is the most common 64bit divide and should be used if possible, | ||
50 | * as many 32bit archs can optimize this variant better than a full 64bit | ||
51 | * divide. | ||
52 | */ | ||
53 | #ifndef div_u64 | ||
54 | static inline u64 div_u64(u64 dividend, u32 divisor) | ||
55 | { | ||
56 | u32 remainder; | ||
57 | return div_u64_rem(dividend, divisor, &remainder); | ||
58 | } | ||
59 | #endif | ||
60 | |||
61 | /** | ||
62 | * div_s64 - signed 64bit divide with 32bit divisor | ||
63 | */ | ||
64 | #ifndef div_s64 | ||
65 | static inline s64 div_s64(s64 dividend, s32 divisor) | ||
66 | { | ||
67 | s32 remainder; | ||
68 | return div_s64_rem(dividend, divisor, &remainder); | ||
69 | } | ||
70 | #endif | ||
71 | |||
72 | #endif /* _LINUX_MATH64_H */ | ||