div64.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:1k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef __ASM_PARISC_DIV64
  2. #define __ASM_PARISC_DIV64
  3. #ifdef __LP64__
  4. /*
  5.  * Copyright (C) 1999 Hewlett-Packard Co
  6.  * Copyright (C) 1999 David Mosberger-Tang <davidm@hpl.hp.com>
  7.  *
  8.  * vsprintf uses this to divide a 64-bit integer N by a small integer BASE.
  9.  * This is incredibly hard on IA-64 and HPPA
  10.  */
  11. #define do_div(n,base)
  12. ({
  13. int _res;
  14. _res = ((unsigned long) (n)) % (unsigned) (base);
  15. (n) = ((unsigned long) (n)) / (unsigned) (base);
  16. _res;
  17. })
  18. #else
  19. /*
  20.  * unsigned long long division.  Yuck Yuck!  What is Linux coming to?
  21.  * This is 100% disgusting
  22.  */
  23. #define do_div(n,base)
  24. ({
  25. unsigned long __low, __low2, __high, __rem;
  26. __low  = (n) & 0xffffffff;
  27. __high = (n) >> 32;
  28. if (__high) {
  29. __rem   = __high % (unsigned long)base;
  30. __high  = __high / (unsigned long)base;
  31. __low2  = __low >> 16;
  32. __low2 += __rem << 16;
  33. __rem   = __low2 % (unsigned long)base;
  34. __low2  = __low2 / (unsigned long)base;
  35. __low   = __low & 0xffff;
  36. __low  += __rem << 16;
  37. __rem   = __low  % (unsigned long)base;
  38. __low   = __low  / (unsigned long)base;
  39. n = __low  + ((long long)__low2 << 16) +
  40. ((long long) __high << 32);
  41. } else {
  42. __rem = __low % (unsigned long)base;
  43. n = (__low / (unsigned long)base);
  44. }
  45. __rem;
  46. })
  47. #endif
  48. #endif