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