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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * include/asm-mips/div64.h
  3.  * 
  4.  * Copyright (C) 2000  Maciej W. Rozycki
  5.  *
  6.  * This file is subject to the terms and conditions of the GNU General Public
  7.  * License.  See the file "COPYING" in the main directory of this archive
  8.  * for more details.
  9.  */
  10. #ifndef _ASM_DIV64_H
  11. #define _ASM_DIV64_H
  12. #include <asm/sgidefs.h>
  13. /*
  14.  * No traps on overflows for any of these...
  15.  */
  16. #if (_MIPS_ISA == _MIPS_ISA_MIPS1 ) || (_MIPS_ISA == _MIPS_ISA_MIPS2) || 
  17.     (_MIPS_ISA == _MIPS_ISA_MIPS32)
  18. #define do_div64_32(res, high, low, base) ({ 
  19. unsigned long __quot, __mod; 
  20. unsigned long __cf, __tmp, __i; 
  21. __asm__(".set pushnt" 
  22. ".set noatnt" 
  23. ".set noreordernt" 
  24. "b 1fnt" 
  25. " li %4,0x21n" 
  26. "0:nt" 
  27. "sll $1,%0,0x1nt" 
  28. "srl %3,%0,0x1fnt" 
  29. "or %0,$1,$2nt" 
  30. "sll %1,%1,0x1nt" 
  31. "sll %2,%2,0x1n" 
  32. "1:nt" 
  33. "bnez %3,2fnt" 
  34. "sltu $2,%0,%z5nt" 
  35. "bnez $2,3fnt" 
  36. "2:nt" 
  37. " addiu %4,%4,-1nt" 
  38. "subu %0,%0,%z5nt" 
  39. "addiu %2,%2,1n" 
  40. "3:nt" 
  41. "bnez %4,0bnt" 
  42. " srl $2,%1,0x1fnt" 
  43. ".set pop" 
  44. : "=&r" (__mod), "=&r" (__tmp), "=&r" (__quot), "=&r" (__cf), 
  45.   "=&r" (__i) 
  46. : "Jr" (base), "0" (high), "1" (low), "2" (0), "3" (0) 
  47. /* Aarrgh!  Ran out of gcc's limit on constraints... */ 
  48. : "$1", "$2"); 
  49. (res) = __quot; 
  50. __mod; })
  51. #define do_div(n, base) ({ 
  52. unsigned long long __quot; 
  53. unsigned long __upper, __low, __high, __mod; 
  54. __quot = (n); 
  55. __high = __quot >> 32; 
  56. __low = __quot; 
  57. __upper = __high; 
  58. if (__high) 
  59. __asm__("divu $0,%z2,%z3" 
  60. : "=h" (__upper), "=l" (__high) 
  61. : "Jr" (__high), "Jr" (base)); 
  62. __mod = do_div64_32(__low, __upper, __low, base); 
  63. __quot = __high; 
  64. __quot = __quot << 32 | __low; 
  65. (n) = __quot; 
  66. __mod; })
  67. #else
  68. #define do_div64_32(res, high, low, base) ({ 
  69. unsigned long __quot, __mod, __r0; 
  70. __asm__("dsll32 %2,%z3,0nt" 
  71. "or %2,%2,%z4nt" 
  72. "ddivu $0,%2,%z5" 
  73. : "=h" (__mod), "=l" (__quot), "=&r" (__r0) 
  74. : "Jr" (high), "Jr" (low), "Jr" (base)); 
  75. (res) = __quot; 
  76. __mod; })
  77. #define do_div(n, base) ({ 
  78. unsigned long long __quot; 
  79. unsigned long __mod, __r0; 
  80. __quot = (n); 
  81. __asm__("dsll32 %2,%M3,0nt" 
  82. "or %2,%2,%L3nt" 
  83. "ddivu $0,%2,%z4nt" 
  84. "mflo %L1nt" 
  85. "dsra32 %M1,%L1,0nt" 
  86. "dsll32 %L1,%L1,0nt" 
  87. "dsra32 %L1,%L1,0" 
  88. : "=h" (__mod), "=r" (__quot), "=&r" (__r0) 
  89. : "r" (n), "Jr" (base)); 
  90. (n) = __quot; 
  91. __mod; })
  92. #endif
  93. #endif /* _ASM_DIV64_H */