| #ifndef _LINUX_CALC64_H |
| #define _LINUX_CALC64_H |
| |
| #include <linux/types.h> |
| #include <asm/div64.h> |
| |
| /* |
| * This is a generic macro which is used when the architecture |
| * specific div64.h does not provide a optimized one. |
| * |
| * The 64bit dividend is divided by the divisor (data type long), the |
| * result is returned and the remainder stored in the variable |
| * referenced by remainder (data type long *). In contrast to the |
| * do_div macro the dividend is kept intact. |
| */ |
| #ifndef div_long_long_rem |
| #define div_long_long_rem(dividend, divisor, remainder) \ |
| do_div_llr((dividend), divisor, remainder) |
| |
| static inline unsigned long do_div_llr(const long long dividend, |
| const long divisor, long *remainder) |
| { |
| u64 result = dividend; |
| |
| *(remainder) = do_div(result, divisor); |
| return (unsigned long) result; |
| } |
| #endif |
| |
| /* |
| * Sign aware variation of the above. On some architectures a |
| * negative dividend leads to an divide overflow exception, which |
| * is avoided by the sign check. |
| */ |
| static inline long div_long_long_rem_signed(const long long dividend, |
| const long divisor, long *remainder) |
| { |
| long res; |
| |
| if (unlikely(dividend < 0)) { |
| res = -div_long_long_rem(-dividend, divisor, remainder); |
| *remainder = -(*remainder); |
| } else |
| res = div_long_long_rem(dividend, divisor, remainder); |
| |
| return res; |
| } |
| |
| #endif |