divrem_2.asm
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:4k
源码类别:

数学计算

开发平台:

Unix_Linux

  1. dnl  x86 mpn_divrem_2 -- Divide an mpn number by a normalized 2-limb number.
  2. dnl  Copyright 2007, 2008 Free Software Foundation, Inc.
  3. dnl  This file is part of the GNU MP Library.
  4. dnl  The GNU MP Library is free software; you can redistribute it and/or modify
  5. dnl  it under the terms of the GNU Lesser General Public License as published
  6. dnl  by the Free Software Foundation; either version 3 of the License, or (at
  7. dnl  your option) any later version.
  8. dnl  The GNU MP Library is distributed in the hope that it will be useful, but
  9. dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  11. dnl  License for more details.
  12. dnl  You should have received a copy of the GNU Lesser General Public License
  13. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  14. include(`../config.m4')
  15. C norm frac
  16. C 486
  17. C P5
  18. C P6-13 29.2
  19. C P6-15 *26
  20. C K6
  21. C K7 22
  22. C K8 *19
  23. C P4-f1
  24. C P4-f2 *65
  25. C P4-f3
  26. C P4-f4 *72
  27. C A star means numbers not updated for the latest version of the code.
  28. C TODO
  29. C  * Perhaps keep ecx or esi in stack slot, freeing up a reg for q0.
  30. C  * The loop has not been carefully tuned.  We should at the very least do
  31. C    some local insn swapping.
  32. C  * The code outside the main loop is what gcc generated.  Clean up!
  33. C  * Clean up stack slot usage.
  34. C INPUT PARAMETERS
  35. C qp
  36. C fn
  37. C up_param
  38. C un_param
  39. C dp
  40. C eax ebx ecx edx esi edi ebp
  41. C         cnt         qp
  42. ASM_START()
  43. TEXT
  44. ALIGN(16)
  45. PROLOGUE(mpn_divrem_2)
  46. push %ebp
  47. push %edi
  48. push %esi
  49. push %ebx
  50. sub $36, %esp
  51. mov 68(%esp), %ecx C un
  52. mov 72(%esp), %esi C dp
  53. movl $0, 32(%esp)
  54. lea 0(,%ecx,4), %edi
  55. add 64(%esp), %edi C up
  56. mov (%esi), %ebx
  57. mov 4(%esi), %eax
  58. mov %ebx, 20(%esp)
  59. sub $12, %edi
  60. mov %eax, 24(%esp)
  61. mov %edi, 12(%esp)
  62. mov 8(%edi), %ebx
  63. mov 4(%edi), %ebp
  64. cmp %eax, %ebx
  65. jb L(8)
  66. seta %dl
  67. cmp 20(%esp), %ebp
  68. setae %al
  69. or %dl, %al
  70. jne L(35)
  71. L(8):
  72. mov 60(%esp), %esi C fn
  73. lea -3(%esi,%ecx), %edi
  74. test %edi, %edi
  75. js L(9)
  76. mov 24(%esp), %edx
  77. mov $-1, %esi
  78. mov %esi, %eax
  79. mov %esi, %ecx
  80. not %edx
  81. divl 24(%esp)
  82. mov %eax, %esi
  83. imul 24(%esp), %eax
  84. mov %eax, (%esp)
  85. mov %esi, %eax
  86. mull 20(%esp)
  87. mov (%esp), %eax
  88. add 20(%esp), %eax
  89. adc $0, %ecx
  90. add %eax, %edx
  91. adc $0, %ecx
  92. mov %ecx, %eax
  93. js L(32)
  94. L(36): dec %esi
  95. sub 24(%esp), %edx
  96. sbb $0, %eax
  97. jns L(36)
  98. L(32):
  99. mov %esi, 16(%esp) C di
  100. mov %edi, %ecx C un
  101. mov 12(%esp), %esi C up
  102. mov 24(%esp), %eax
  103. neg %eax
  104. mov %eax, 4(%esp) C -d1
  105. ALIGN(16)
  106. nop
  107. C eax ebx ecx edx esi edi ebp  0    4   8   12  16  20  24  28  32   56  60
  108. C     n2  un      up      n1   q0  -d1          di  d0  d1      msl  qp  fn
  109. L(loop):
  110. mov 16(%esp), %eax C di
  111. mul %ebx
  112. add %ebp, %eax
  113. mov %eax, (%esp) C q0
  114. adc %ebx, %edx
  115. mov %edx, %edi C q
  116. imul 4(%esp), %edx
  117. mov 20(%esp), %eax
  118. lea (%edx, %ebp), %ebx C n1 -= ...
  119. mul %edi
  120. xor %ebp, %ebp
  121. cmp 60(%esp), %ecx
  122. jl L(19)
  123. mov (%esi), %ebp
  124. sub $4, %esi
  125. L(19): sub 20(%esp), %ebp
  126. sbb 24(%esp), %ebx
  127. sub %eax, %ebp
  128. sbb %edx, %ebx
  129. mov 20(%esp), %eax C d1
  130. inc %edi
  131. xor %edx, %edx
  132. cmp (%esp), %ebx
  133. adc $-1, %edx C mask
  134. add %edx, %edi C q--
  135. and %edx, %eax C d0 or 0
  136. and 24(%esp), %edx C d1 or 0
  137. add %eax, %ebp
  138. adc %edx, %ebx
  139. cmp 24(%esp), %ebx
  140. jae L(fix)
  141. L(bck): mov 56(%esp), %edx
  142. mov %edi, (%edx, %ecx, 4)
  143. dec %ecx
  144. jns L(loop)
  145. L(9): mov 64(%esp), %esi C up
  146. mov %ebp, (%esi)
  147. mov %ebx, 4(%esi)
  148. mov 32(%esp), %eax
  149. add $36, %esp
  150. pop %ebx
  151. pop %esi
  152. pop %edi
  153. pop %ebp
  154. ret
  155. L(fix): seta %dl
  156. cmp 20(%esp), %ebp
  157. setae %al
  158. or %dl, %al
  159. je L(bck)
  160. inc %edi
  161. sub 20(%esp), %ebp
  162. sbb 24(%esp), %ebx
  163. jmp L(bck)
  164. L(35): sub 20(%esp), %ebp
  165. sbb 24(%esp), %ebx
  166. movl $1, 32(%esp)
  167. jmp L(8)
  168. EPILOGUE()