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

数学计算

开发平台:

Unix_Linux

  1. dnl  mpn_addmul_1 for Pentium 4 and P6 models with SSE2 (i.e., 9,D,E,F).
  2. dnl  Copyright 2005, 2007 Free Software Foundation, Inc.
  3. dnl
  4. dnl  This file is part of the GNU MP Library.
  5. dnl
  6. dnl  The GNU MP Library is free software; you can redistribute it and/or modify
  7. dnl  it under the terms of the GNU Lesser General Public License as published
  8. dnl  by the Free Software Foundation; either version 3 of the License, or (at
  9. dnl  your option) any later version.
  10. dnl
  11. dnl  The GNU MP Library is distributed in the hope that it will be useful, but
  12. dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  13. dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  14. dnl  License for more details.
  15. dnl
  16. dnl  You should have received a copy of the GNU Lesser General Public License
  17. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  18. include(`../config.m4')
  19. C TODO:
  20. C  * Tweak eax/edx offsets in loop as to save some lea's
  21. C  * Perhaps software pipeline small-case code
  22. C                           cycles/limb
  23. C P6 model 0-8,10-12)           -
  24. C P6 model 9   (Banias)         ?
  25. C P6 model 13  (Dothan)         5.24
  26. C P4 model 0-1 (Willamette):    5
  27. C P4 model 2   (Northwood):     5
  28. C P4 model 3-4 (Prescott):      5
  29. C INPUT PARAMETERS
  30. C rp sp + 4
  31. C up sp + 8
  32. C n sp + 12
  33. C v0 sp + 16
  34. TEXT
  35. ALIGN(16)
  36. PROLOGUE(mpn_addmul_1c)
  37. mov 4(%esp), %edx
  38. mov 8(%esp), %eax
  39. mov 12(%esp), %ecx
  40. movd 16(%esp), %mm7
  41. movd 20(%esp), %mm6
  42. jmp L(ent)
  43. EPILOGUE()
  44. ALIGN(16)
  45. PROLOGUE(mpn_addmul_1)
  46. mov 4(%esp), %edx
  47. mov 8(%esp), %eax
  48. mov 12(%esp), %ecx
  49. movd 16(%esp), %mm7
  50. pxor %mm6, %mm6
  51. L(ent): cmp $4, %ecx
  52. jnc L(big)
  53. L(lp0): movd (%eax), %mm0
  54. lea 4(%eax), %eax
  55. movd (%edx), %mm4
  56. lea 4(%edx), %edx
  57. pmuludq %mm7, %mm0
  58. paddq %mm0, %mm4
  59. paddq %mm4, %mm6
  60. movd %mm6, -4(%edx)
  61. psrlq $32, %mm6
  62. dec %ecx
  63. jnz L(lp0)
  64. movd %mm6, %eax
  65. emms
  66. ret
  67. L(big): and $3, %ecx
  68. je L(0)
  69. cmp $2, %ecx
  70. jc L(1)
  71. je L(2)
  72. jmp L(3) C FIXME: one case should fall through
  73. L(0): movd (%eax), %mm3
  74. sub 12(%esp), %ecx C loop count
  75. lea -16(%eax), %eax
  76. lea -12(%edx), %edx
  77. pmuludq %mm7, %mm3
  78. movd 20(%eax), %mm0
  79. movd 12(%edx), %mm5
  80. pmuludq %mm7, %mm0
  81. movd 24(%eax), %mm1
  82. paddq %mm3, %mm5
  83. movd 16(%edx), %mm4
  84. jmp L(00)
  85. L(1): movd (%eax), %mm2
  86. sub 12(%esp), %ecx
  87. lea -12(%eax), %eax
  88. lea -8(%edx), %edx
  89. movd 8(%edx), %mm4
  90. pmuludq %mm7, %mm2
  91. movd 16(%eax), %mm3
  92. pmuludq %mm7, %mm3
  93. movd 20(%eax), %mm0
  94. paddq %mm2, %mm4
  95. movd 12(%edx), %mm5
  96. jmp L(01)
  97. L(2): movd (%eax), %mm1
  98. sub 12(%esp), %ecx
  99. lea -8(%eax), %eax
  100. lea -4(%edx), %edx
  101. pmuludq %mm7, %mm1
  102. movd 12(%eax), %mm2
  103. movd 4(%edx), %mm5
  104. pmuludq %mm7, %mm2
  105. movd 16(%eax), %mm3
  106. paddq %mm1, %mm5
  107. movd 8(%edx), %mm4
  108. jmp L(10)
  109. L(3): movd (%eax), %mm0
  110. sub 12(%esp), %ecx
  111. lea -4(%eax), %eax
  112. pmuludq %mm7, %mm0
  113. movd 8(%eax), %mm1
  114. movd (%edx), %mm4
  115. pmuludq %mm7, %mm1
  116. movd 12(%eax), %mm2
  117. paddq %mm0, %mm4
  118. movd 4(%edx), %mm5
  119. ALIGN(16)
  120. L(top): pmuludq %mm7, %mm2
  121. paddq %mm4, %mm6
  122. movd 16(%eax), %mm3
  123. paddq %mm1, %mm5
  124. movd 8(%edx), %mm4
  125. movd %mm6, 0(%edx)
  126. psrlq $32, %mm6
  127. L(10): pmuludq %mm7, %mm3
  128. paddq %mm5, %mm6
  129. movd 20(%eax), %mm0
  130. paddq %mm2, %mm4
  131. movd 12(%edx), %mm5
  132. movd %mm6, 4(%edx)
  133. psrlq $32, %mm6
  134. L(01): pmuludq %mm7, %mm0
  135. paddq %mm4, %mm6
  136. movd 24(%eax), %mm1
  137. paddq %mm3, %mm5
  138. movd 16(%edx), %mm4
  139. movd %mm6, 8(%edx)
  140. psrlq $32, %mm6
  141. L(00): pmuludq %mm7, %mm1
  142. paddq %mm5, %mm6
  143. movd 28(%eax), %mm2
  144. paddq %mm0, %mm4
  145. movd 20(%edx), %mm5
  146. movd %mm6, 12(%edx)
  147. psrlq $32, %mm6
  148. lea 16(%eax), %eax
  149. lea 16(%edx), %edx
  150. add $4, %ecx
  151. jnz L(top)
  152. L(end): pmuludq %mm7, %mm2
  153. paddq %mm4, %mm6
  154. paddq %mm1, %mm5
  155. movd 8(%edx), %mm4
  156. movd %mm6, 0(%edx)
  157. psrlq $32, %mm6
  158. paddq %mm5, %mm6
  159. paddq %mm2, %mm4
  160. movd %mm6, 4(%edx)
  161. psrlq $32, %mm6
  162. paddq %mm4, %mm6
  163. movd %mm6, 8(%edx)
  164. psrlq $32, %mm6
  165. movd %mm6, %eax
  166. emms
  167. ret
  168. EPILOGUE()