| #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 */ |