1/* Public domain. */
2
3#ifndef _LINUX_MATH64_H
4#define _LINUX_MATH64_H
5
6#include <sys/types.h>
7#include <asm/div64.h>
8
9static inline uint64_t
10div_u64(uint64_t x, uint32_t y)
11{
12	return (x / y);
13}
14
15static inline int64_t
16div_s64(int64_t x, int64_t y)
17{
18	return (x / y);
19}
20
21static inline uint64_t
22div64_u64(uint64_t x, uint64_t y)
23{
24	return (x / y);
25}
26
27static inline uint64_t
28div64_u64_rem(uint64_t x, uint64_t y, uint64_t *rem)
29{
30	*rem = x % y;
31	return (x / y);
32}
33
34static inline uint64_t
35div_u64_rem(uint64_t x, uint32_t y, uint32_t *rem)
36{
37	*rem = x % y;
38	return (x / y);
39}
40
41static inline int64_t
42div64_s64(int64_t x, int64_t y)
43{
44	return (x / y);
45}
46
47static inline uint64_t
48mul_u32_u32(uint32_t x, uint32_t y)
49{
50	return (uint64_t)x * y;
51}
52
53static inline uint64_t
54mul_u64_u32_div(uint64_t x, uint32_t y, uint32_t div)
55{
56	return (x * y) / div;
57}
58
59#define DIV64_U64_ROUND_UP(x, y)	\
60({					\
61	uint64_t _t = (y);		\
62	div64_u64((x) + _t - 1, _t);	\
63})
64
65static inline uint64_t
66mul_u64_u32_shr(uint64_t x, uint32_t y, unsigned int shift)
67{
68	uint32_t hi, lo;
69	hi = x >> 32;
70	lo = x & 0xffffffff;
71
72	return (mul_u32_u32(lo, y) >> shift) +
73	    (mul_u32_u32(hi, y) << (32 - shift));
74}
75
76#endif
77