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