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