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

数学计算

开发平台:

Unix_Linux

  1. dnl  AMD K7 mpn_mul_1.
  2. dnl  Copyright 1999, 2000, 2001, 2002, 2005, 2008 Free Software Foundation,
  3. dnl  Inc.
  4. dnl
  5. dnl  This file is part of the GNU MP Library.
  6. dnl
  7. dnl  The GNU MP Library is free software; you can redistribute it and/or
  8. dnl  modify it under the terms of the GNU Lesser General Public License as
  9. dnl  published by the Free Software Foundation; either version 3 of the
  10. dnl  License, or (at your option) any later version.
  11. dnl
  12. dnl  The GNU MP Library is distributed in the hope that it will be useful,
  13. dnl  but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. dnl  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15. dnl  Lesser General Public License for more details.
  16. dnl
  17. dnl  You should have received a copy of the GNU Lesser General Public License
  18. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  19. include(`../config.m4')
  20. C                           cycles/limb
  21. C P5:
  22. C P6 model 0-8,10-12)
  23. C P6 model 9  (Banias)
  24. C P6 model 13 (Dothan)
  25. C P4 model 0  (Willamette)
  26. C P4 model 1  (?)
  27. C P4 model 2  (Northwood)
  28. C P4 model 3  (Prescott)
  29. C P4 model 4  (Nocona)
  30. C K6:
  31. C K7:                            3.25
  32. C K8:
  33. C TODO
  34. C  * Improve feed-in and wind-down code.  We beat the old code for all n != 1,
  35. C    but we might be able to do even better.
  36. C  * The feed-in code for mul_1c is crude.
  37. ASM_START()
  38. TEXT
  39. ALIGN(16)
  40. PROLOGUE(mpn_mul_1c)
  41. add $-16, %esp
  42. mov %ebp, (%esp)
  43. mov %ebx, 4(%esp)
  44. mov %esi, 8(%esp)
  45. mov %edi, 12(%esp)
  46. mov 20(%esp), %edi
  47. mov 24(%esp), %esi
  48. mov 28(%esp), %ebp
  49. mov 32(%esp), %ecx
  50. mov %ebp, %ebx
  51. shr $2, %ebp
  52. mov %ebp, 28(%esp)
  53. mov (%esi), %eax
  54. and $3, %ebx
  55. jz L(c0)
  56. cmp $2, %ebx
  57. mov 36(%esp), %ebx
  58. jz L(c2)
  59. jg L(c3)
  60. L(c1): lea -4(%edi), %edi
  61. mul %ecx
  62. test %ebp, %ebp
  63. jnz 1f
  64. add %ebx, %eax
  65. mov %eax, 4(%edi)
  66. mov %edx, %eax
  67. adc %ebp, %eax
  68. jmp L(rt)
  69. 1: add %eax, %ebx
  70. mov $0, %ebp
  71. adc %edx, %ebp
  72. mov 4(%esi), %eax
  73. jmp L(1)
  74. L(c2): lea 4(%esi), %esi
  75. mul %ecx
  76. test %ebp, %ebp
  77. mov %ebx, %ebp
  78. jnz 2f
  79. add %eax, %ebp
  80. mov $0, %ebx
  81. adc %edx, %ebx
  82. mov (%esi), %eax
  83. jmp L(cj2)
  84. 2: add %eax, %ebp
  85. mov $0, %ebx
  86. adc %edx, %ebx
  87. mov (%esi), %eax
  88. jmp L(2)
  89. L(c3): lea 8(%esi), %esi
  90. lea -12(%edi), %edi
  91. mul %ecx
  92. add %eax, %ebx
  93. mov $0, %ebp
  94. adc %edx, %ebp
  95. mov -4(%esi), %eax
  96. incl 28(%esp)
  97. jmp L(3)
  98. L(c0): mov 36(%esp), %ebx
  99. lea -4(%esi), %esi
  100. lea -8(%edi), %edi
  101. mul %ecx
  102. mov %ebx, %ebp
  103. add %eax, %ebp
  104. mov $0, %ebx
  105. adc %edx, %ebx
  106. mov 8(%esi), %eax
  107. jmp L(0)
  108. EPILOGUE()
  109. ALIGN(16)
  110. PROLOGUE(mpn_mul_1)
  111. add $-16, %esp
  112. mov %ebp, (%esp)
  113. mov %ebx, 4(%esp)
  114. mov %esi, 8(%esp)
  115. mov %edi, 12(%esp)
  116. mov 20(%esp), %edi
  117. mov 24(%esp), %esi
  118. mov 28(%esp), %ebp
  119. mov 32(%esp), %ecx
  120. mov %ebp, %ebx
  121. shr $2, %ebp
  122. mov %ebp, 28(%esp)
  123. mov (%esi), %eax
  124. and $3, %ebx
  125. jz L(b0)
  126. cmp $2, %ebx
  127. jz L(b2)
  128. jg L(b3)
  129. L(b1): lea -4(%edi), %edi
  130. mul %ecx
  131. test %ebp, %ebp
  132. jnz L(gt1)
  133. mov %eax, 4(%edi)
  134. mov %edx, %eax
  135. jmp L(rt)
  136. L(gt1): mov %eax, %ebx
  137. mov %edx, %ebp
  138. mov 4(%esi), %eax
  139. jmp L(1)
  140. L(b2): lea 4(%esi), %esi
  141. mul %ecx
  142. test %ebp, %ebp
  143. mov %eax, %ebp
  144. mov %edx, %ebx
  145. mov (%esi), %eax
  146. jnz L(2)
  147. jmp L(cj2)
  148. L(b3): lea 8(%esi), %esi
  149. lea -12(%edi), %edi
  150. mul %ecx
  151. mov %eax, %ebx
  152. mov %edx, %ebp
  153. mov -4(%esi), %eax
  154. incl 28(%esp)
  155. jmp L(3)
  156. L(b0): lea -4(%esi), %esi
  157. lea -8(%edi), %edi
  158. mul %ecx
  159. mov %eax, %ebp
  160. mov %edx, %ebx
  161. mov 8(%esi), %eax
  162. jmp L(0)
  163. ALIGN(16)
  164. L(top): mov $0, %ebx
  165. adc %edx, %ebx
  166. L(2): mul %ecx
  167. add %eax, %ebx
  168. mov %ebp, 0(%edi)
  169. mov 4(%esi), %eax
  170. mov $0, %ebp
  171. adc %edx, %ebp
  172. L(1): mul %ecx
  173. add %eax, %ebp
  174. mov 8(%esi), %eax
  175. mov %ebx, 4(%edi)
  176. mov $0, %ebx
  177. adc %edx, %ebx
  178. L(0): mov %ebp, 8(%edi)
  179. mul %ecx
  180. add %eax, %ebx
  181. mov 12(%esi), %eax
  182. lea 16(%esi), %esi
  183. mov $0, %ebp
  184. adc %edx, %ebp
  185. L(3): mov %ebx, 12(%edi)
  186. mul %ecx
  187. lea 16(%edi), %edi
  188. add %eax, %ebp
  189. decl 28(%esp)
  190. mov 0(%esi), %eax
  191. jnz L(top)
  192. L(end): mov $0, %ebx
  193. adc %edx, %ebx
  194. L(cj2): mul %ecx
  195. add %eax, %ebx
  196. mov %ebp, (%edi)
  197. L(cj1): mov %ebx, 4(%edi)
  198. adc $0, %edx
  199. mov %edx, %eax
  200. L(rt): mov (%esp), %ebp
  201. mov 4(%esp), %ebx
  202. mov 8(%esp), %esi
  203. mov 12(%esp), %edi
  204. add $16, %esp
  205. ret
  206. EPILOGUE()
  207. ASM_END()