1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _LINUX_CALC64_H
2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _LINUX_CALC64_H
3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/types.h>
5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/div64.h>
6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This is a generic macro which is used when the architecture
9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * specific div64.h does not provide a optimized one.
10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The 64bit dividend is divided by the divisor (data type long), the
12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * result is returned and the remainder stored in the variable
13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * referenced by remainder (data type long *). In contrast to the
14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * do_div macro the dividend is kept intact.
15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef div_long_long_rem
17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define div_long_long_rem(dividend, divisor, remainder)	\
18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	do_div_llr((dividend), divisor, remainder)
19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned long do_div_llr(const long long dividend,
21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				       const long divisor, long *remainder)
22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	u64 result = dividend;
24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	*(remainder) = do_div(result, divisor);
26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return (unsigned long) result;
27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Sign aware variation of the above. On some architectures a
32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * negative dividend leads to an divide overflow exception, which
33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * is avoided by the sign check.
34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline long div_long_long_rem_signed(const long long dividend,
36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					    const long divisor, long *remainder)
37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	long res;
39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	if (unlikely(dividend < 0)) {
41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		res = -div_long_long_rem(-dividend, divisor, remainder);
42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		*remainder = -(*remainder);
43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	} else
44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		res = div_long_long_rem(dividend, divisor, remainder);
45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return res;
47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
50