linux-mm / kernel / git / torvalds / linux / 2a24ab628aa7b190be32f63dfb6d96f3fb61580a / . / include / asm-m32r / div64.h

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