39 lines
952 B
C
39 lines
952 B
C
|
#ifndef _ASM_M32R_DIV64
|
||
|
#define _ASM_M32R_DIV64
|
||
|
|
||
|
/* $Id$ */
|
||
|
|
||
|
/* unsigned long long division.
|
||
|
* Input:
|
||
|
* unsigned long long n
|
||
|
* unsigned long base
|
||
|
* Output:
|
||
|
* n = n / base;
|
||
|
* return value = n % base;
|
||
|
*/
|
||
|
#define do_div(n, base) \
|
||
|
({ \
|
||
|
unsigned long _res, _high, _mid, _low; \
|
||
|
\
|
||
|
_low = (n) & 0xffffffffUL; \
|
||
|
_high = (n) >> 32; \
|
||
|
if (_high) { \
|
||
|
_mid = (_high % (unsigned long)(base)) << 16; \
|
||
|
_high = _high / (unsigned long)(base); \
|
||
|
_mid += _low >> 16; \
|
||
|
_low &= 0x0000ffffUL; \
|
||
|
_low += (_mid % (unsigned long)(base)) << 16; \
|
||
|
_mid = _mid / (unsigned long)(base); \
|
||
|
_res = _low % (unsigned long)(base); \
|
||
|
_low = _low / (unsigned long)(base); \
|
||
|
n = _low + ((long long)_mid << 16) + \
|
||
|
((long long)_high << 32); \
|
||
|
} else { \
|
||
|
_res = _low % (unsigned long)(base); \
|
||
|
n = (_low / (unsigned long)(base)); \
|
||
|
} \
|
||
|
_res; \
|
||
|
})
|
||
|
|
||
|
#endif /* _ASM_M32R_DIV64 */
|