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 9 static inline uint64_t 10 div_u64(uint64_t x, uint32_t y) 11 { 12 return (x / y); 13 } 14 15 static inline int64_t 16 div_s64(int64_t x, int64_t y) 17 { 18 return (x / y); 19 } 20 21 static inline uint64_t 22 div64_u64(uint64_t x, uint64_t y) 23 { 24 return (x / y); 25 } 26 27 static inline uint64_t 28 div64_u64_rem(uint64_t x, uint64_t y, uint64_t *rem) 29 { 30 *rem = x % y; 31 return (x / y); 32 } 33 34 static inline uint64_t 35 div_u64_rem(uint64_t x, uint32_t y, uint32_t *rem) 36 { 37 *rem = x % y; 38 return (x / y); 39 } 40 41 static inline int64_t 42 div64_s64(int64_t x, int64_t y) 43 { 44 return (x / y); 45 } 46 47 static inline uint64_t 48 mul_u32_u32(uint32_t x, uint32_t y) 49 { 50 return (uint64_t)x * y; 51 } 52 53 static inline uint64_t 54 mul_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 65 static inline uint64_t 66 mul_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