This commit was manufactured by cvs2svn to create branch 'vserver'.
[linux-2.6.git] / include / asm-m32r / div64.h
1 #ifndef _ASM_M32R_DIV64
2 #define _ASM_M32R_DIV64
3
4 /* $Id$ */
5
6 /* unsigned long long division.
7  * Input:
8  *  unsigned long long  n
9  *  unsigned long  base
10  * Output:
11  *  n = n / base;
12  *  return value = n % base;
13  */
14 #define do_div(n, base)                                         \
15 ({                                                              \
16         unsigned long _res, _high, _mid, _low;                  \
17                                                                 \
18         _low = (n) & 0xffffffffUL;                              \
19         _high = (n) >> 32;                                      \
20         if (_high) {                                            \
21                 _mid = (_high % (unsigned long)(base)) << 16;   \
22                 _high = _high / (unsigned long)(base);          \
23                 _mid += _low >> 16;                             \
24                 _low &= 0x0000ffffUL;                           \
25                 _low += (_mid % (unsigned long)(base)) << 16;   \
26                 _mid = _mid / (unsigned long)(base);            \
27                 _res = _low % (unsigned long)(base);            \
28                 _low = _low / (unsigned long)(base);            \
29                 n = _low + ((long long)_mid << 16) +            \
30                         ((long long)_high << 32);               \
31         } else {                                                \
32                 _res = _low % (unsigned long)(base);            \
33                 n = (_low / (unsigned long)(base));             \
34         }                                                       \
35         _res;                                                   \
36 })
37
38 #endif  /* _ASM_M32R_DIV64 */