blob: b7692d0636e94c9ede10b00680103e9cd3471b14 [file] [log] [blame]
lh9ed821d2023-04-07 01:36:19 -07001#ifndef _LINUX_MATH64_H
2#define _LINUX_MATH64_H
3
4#include <linux/types.h>
5#include <div64.h>
6
7
8#if BITS_PER_LONG == 64
9
10/**
11 * div_u64_rem - unsigned 64bit divide with 32bit divisor with remainder
12 *
13 * This is commonly provided by 32bit archs to provide an optimized 64bit
14 * divide.
15 */
16static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder)
17{
18 *remainder = dividend % divisor;
19 return dividend / divisor;
20}
21
22/**
23 * div_s64_rem - signed 64bit divide with 32bit divisor with remainder
24 */
25static inline s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder)
26{
27 *remainder = dividend % divisor;
28 return dividend / divisor;
29}
30
31/**
32 * div64_u64 - unsigned 64bit divide with 64bit divisor
33 */
34static inline u64 div64_u64(u64 dividend, u64 divisor)
35{
36 return dividend / divisor;
37}
38
39#elif BITS_PER_LONG == 32
40
41#ifndef div_u64_rem
42static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder)
43{
44 *remainder = do_div(dividend, divisor);
45 return dividend;
46}
47#endif
48
49#ifndef div_s64_rem
50extern s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder);
51#endif
52
53#ifndef div64_u64
54extern u64 div64_u64(u64 dividend, u64 divisor);
55#endif
56
57#endif /* BITS_PER_LONG */
58
59/**
60 * div_u64 - unsigned 64bit divide with 32bit divisor
61 *
62 * This is the most common 64bit divide and should be used if possible,
63 * as many 32bit archs can optimize this variant better than a full 64bit
64 * divide.
65 */
66#ifndef div_u64
67static inline u64 div_u64(u64 dividend, u32 divisor)
68{
69 u32 remainder;
70 return div_u64_rem(dividend, divisor, &remainder);
71}
72#endif
73
74/**
75 * div_s64 - signed 64bit divide with 32bit divisor
76 */
77#ifndef div_s64
78static inline s64 div_s64(s64 dividend, s32 divisor)
79{
80 s32 remainder;
81 return div_s64_rem(dividend, divisor, &remainder);
82}
83#endif
84
85u32 iter_div_u64_rem(u64 dividend, u32 divisor, u64 *remainder);
86
87#endif /* _LINUX_MATH64_H */