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

数学计算

开发平台:

Unix_Linux

  1. dnl  mpn_mul_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)         4.17
  26. C P4 model 0-1 (Willamette): 4
  27. C P4 model 2   (Northwood):     4
  28. C P4 model 3-4 (Prescott):      4.55
  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_mul_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_mul_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. lea 4(%edx), %edx
  56. pmuludq %mm7, %mm0
  57. paddq %mm0, %mm6
  58. movd %mm6, -4(%edx)
  59. psrlq $32, %mm6
  60. dec %ecx
  61. jnz L(lp0)
  62. movd %mm6, %eax
  63. emms
  64. ret
  65. L(big): and $3, %ecx
  66. je L(0)
  67. cmp $2, %ecx
  68. jc L(1)
  69. je L(2)
  70. jmp L(3) C FIXME: one case should fall through
  71. L(0): movd (%eax), %mm3
  72. sub 12(%esp), %ecx C loop count
  73. lea -16(%eax), %eax
  74. lea -12(%edx), %edx
  75. pmuludq %mm7, %mm3
  76. movd 20(%eax), %mm0
  77. pmuludq %mm7, %mm0
  78. movd 24(%eax), %mm1
  79. jmp L(00)
  80. L(1): movd (%eax), %mm2
  81. sub 12(%esp), %ecx
  82. lea -12(%eax), %eax
  83. lea -8(%edx), %edx
  84. pmuludq %mm7, %mm2
  85. movd 16(%eax), %mm3
  86. pmuludq %mm7, %mm3
  87. movd 20(%eax), %mm0
  88. jmp L(01)
  89. L(2): movd (%eax), %mm1
  90. sub 12(%esp), %ecx
  91. lea -8(%eax), %eax
  92. lea -4(%edx), %edx
  93. pmuludq %mm7, %mm1
  94. movd 12(%eax), %mm2
  95. pmuludq %mm7, %mm2
  96. movd 16(%eax), %mm3
  97. jmp L(10)
  98. L(3): movd (%eax), %mm0
  99. sub 12(%esp), %ecx
  100. lea -4(%eax), %eax
  101. pmuludq %mm7, %mm0
  102. movd 8(%eax), %mm1
  103. pmuludq %mm7, %mm1
  104. movd 12(%eax), %mm2
  105. ALIGN(16)
  106. L(top): pmuludq %mm7, %mm2
  107. paddq %mm0, %mm6
  108. movd 16(%eax), %mm3
  109. movd %mm6, 0(%edx)
  110. psrlq $32, %mm6
  111. L(10): pmuludq %mm7, %mm3
  112. paddq %mm1, %mm6
  113. movd 20(%eax), %mm0
  114. movd %mm6, 4(%edx)
  115. psrlq $32, %mm6
  116. L(01): pmuludq %mm7, %mm0
  117. paddq %mm2, %mm6
  118. movd 24(%eax), %mm1
  119. movd %mm6, 8(%edx)
  120. psrlq $32, %mm6
  121. L(00): pmuludq %mm7, %mm1
  122. paddq %mm3, %mm6
  123. movd 28(%eax), %mm2
  124. movd %mm6, 12(%edx)
  125. psrlq $32, %mm6
  126. lea 16(%eax), %eax
  127. lea 16(%edx), %edx
  128. add $4, %ecx
  129. ja L(top)
  130. L(end): pmuludq %mm7, %mm2
  131. paddq %mm0, %mm6
  132. movd %mm6, 0(%edx)
  133. psrlq $32, %mm6
  134. paddq %mm1, %mm6
  135. movd %mm6, 4(%edx)
  136. psrlq $32, %mm6
  137. paddq %mm2, %mm6
  138. movd %mm6, 8(%edx)
  139. psrlq $32, %mm6
  140. movd %mm6, %eax
  141. emms
  142. ret
  143. EPILOGUE()