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

数学计算

开发平台:

Unix_Linux

  1. dnl  mpn_mod_1_4 for Pentium 4 and P6 models with SSE2 (i.e., 9,D,E,F).
  2. dnl  Contributed to the GNU project by Torbjorn Granlund.
  3. dnl  Copyright 2009 Free Software Foundation, 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 modify
  8. dnl  it under the terms of the GNU Lesser General Public License as published
  9. dnl  by the Free Software Foundation; either version 3 of the License, or (at
  10. dnl  your option) any later version.
  11. dnl
  12. dnl  The GNU MP Library is distributed in the hope that it will be useful, but
  13. dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  14. dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  15. dnl  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 TODO:
  21. C  * Optimize.  The present code was written quite straightforwardly.
  22. C  * Optimize post-loop reduction code.
  23. C                           cycles/limb
  24. C P6 model 0-8,10-12)           -
  25. C P6 model 9   (Banias)         ?
  26. C P6 model 13  (Dothan)         3.4
  27. C P4 model 0-1 (Willamette):    ?
  28. C P4 model 2   (Northwood):     4
  29. C P4 model 3-4 (Prescott):      ?
  30. C INPUT PARAMETERS
  31. C ap sp + 4
  32. C n sp + 8
  33. C b sp + 12
  34. C cps sp + 16
  35. define(`B1modb', `%mm1')
  36. define(`B2modb', `%mm2')
  37. define(`B3modb', `%mm3')
  38. define(`B4modb', `%mm4')
  39. define(`B5modb', `%mm5')
  40. define(`ap', `%edx')
  41. define(`n', `%eax')
  42. TEXT
  43. ALIGN(16)
  44. PROLOGUE(mpn_mod_1s_4p)
  45. push %ebx
  46. mov 8(%esp), ap
  47. mov 12(%esp), n
  48. mov 20(%esp), %ecx
  49. movd 8(%ecx), B1modb
  50. movd 12(%ecx), B2modb
  51. movd 16(%ecx), B3modb
  52. movd 20(%ecx), B4modb
  53. movd 24(%ecx), B5modb
  54. mov n, %ebx
  55. lea -4(ap,n,4), ap
  56. and $3, %ebx
  57. je L(b0)
  58. cmp $2, %ebx
  59. jc L(b1)
  60. je L(b2)
  61. L(b3): movd -4(ap), %mm7
  62. pmuludq B1modb, %mm7
  63. movd -8(ap), %mm6
  64. paddq %mm6, %mm7
  65. movd (ap), %mm6
  66. pmuludq B2modb, %mm6
  67. paddq %mm6, %mm7
  68. lea -24(ap), ap
  69. add $-3, n
  70. jz L(end)
  71. jmp L(top)
  72. L(b0): movd -8(ap), %mm7
  73. pmuludq B1modb, %mm7
  74. movd -12(ap), %mm6
  75. paddq %mm6, %mm7
  76. movd -4(ap), %mm6
  77. pmuludq B2modb, %mm6
  78. paddq %mm6, %mm7
  79. movd (ap), %mm6
  80. pmuludq B3modb, %mm6
  81. paddq %mm6, %mm7
  82. lea -28(ap), ap
  83. add $-4, n
  84. jz L(end)
  85. jmp L(top)
  86. L(b1): movd (ap), %mm7
  87. lea -16(ap), ap
  88. dec n
  89. jz L(x)
  90. jmp L(top)
  91. L(b2): movd (ap), %mm7
  92. pmuludq B1modb, %mm7
  93. movd -4(ap), %mm6
  94. paddq %mm6, %mm7
  95. lea -20(ap), ap
  96. add $-2, n
  97. jz L(end)
  98. ALIGN(8)
  99. L(top): movd 4(ap), %mm0
  100. pmuludq B1modb, %mm0
  101. movd 0(ap), %mm6
  102. paddq %mm6, %mm0
  103. movd 8(ap), %mm6
  104. pmuludq B2modb, %mm6
  105. paddq %mm6, %mm0
  106. movd 12(ap), %mm6
  107. pmuludq B3modb, %mm6
  108. paddq %mm6, %mm0
  109. movq %mm7, %mm6
  110. psrlq $32, %mm7 C rh
  111. pmuludq B5modb, %mm7
  112. pmuludq B4modb, %mm6
  113. paddq %mm0, %mm7
  114. paddq %mm6, %mm7
  115. add $-16, ap
  116. add $-4, n
  117. jnz L(top)
  118. L(end):
  119. pcmpeqd %mm4, %mm4
  120. psrlq $32, %mm4 C 0x00000000FFFFFFFF
  121. pand %mm7, %mm4 C rl
  122. psrlq $32, %mm7 C rh
  123. pmuludq B1modb, %mm7 C rh,cl
  124. paddq %mm4, %mm7 C rh,rl
  125. L(x): movd 4(%ecx), %mm4 C cnt
  126. psllq %mm4, %mm7 C rh,rl normalized
  127. movq %mm7, %mm2 C rl in low half
  128. psrlq $32, %mm7 C rh
  129. movd (%ecx), %mm1 C bi
  130. pmuludq %mm7, %mm1 C qh,ql
  131. paddq %mm2, %mm1 C qh-1,ql
  132. movd %mm1, %ecx C ql
  133. psrlq $32, %mm1 C qh-1
  134. movd 16(%esp), %mm3 C b
  135. pmuludq %mm1, %mm3 C (qh-1) * b
  136. psubq %mm3, %mm2 C r in low half (could use psubd)
  137. movd %mm2, %eax C r
  138. mov 16(%esp), %ebx
  139. sub %ebx, %eax C r
  140. cmp %eax, %ecx
  141. lea (%eax,%ebx), %edx
  142. cmovc( %edx, %eax)
  143. movd %mm4, %ecx C cnt
  144. cmp %ebx, %eax
  145. jae L(fix)
  146. emms
  147. pop %ebx
  148. shr %cl, %eax
  149. ret
  150. L(fix): sub %ebx, %eax
  151. emms
  152. pop %ebx
  153. shr %cl, %eax
  154. ret
  155. EPILOGUE()
  156. PROLOGUE(mpn_mod_1s_4p_cps)
  157. push %ebp
  158. push %edi
  159. push %esi
  160. push %ebx
  161. sub $12, %esp
  162. mov 36(%esp), %ebx
  163. bsr %ebx, %ecx
  164. xor $31, %ecx
  165. mov %ecx, 4(%esp)
  166. sal %cl, %ebx
  167. mov %ebx, %edx
  168. not %edx
  169. mov $-1, %eax
  170. div %ebx
  171. mov %eax, %esi
  172. mov $1, %ebp
  173. sal %cl, %ebp
  174. neg %ecx
  175. shr %cl, %eax
  176. or %eax, %ebp
  177. mov %ebx, %eax
  178. neg %eax
  179. imul %ebp, %eax
  180. mov %esi, %ecx
  181. mov %eax, 8(%esp)
  182. mul %ecx
  183. mov %edx, %esi
  184. not %esi
  185. sub 8(%esp), %esi
  186. imul %ebx, %esi
  187. lea (%esi,%ebx), %edx
  188. cmp %esi, %eax
  189. cmovb( %edx, %esi)
  190. mov %esi, %eax
  191. mul %ecx
  192. lea (%esi,%edx), %edi
  193. not %edi
  194. imul %ebx, %edi
  195. lea (%edi,%ebx), %edx
  196. cmp %edi, %eax
  197. cmovb( %edx, %edi)
  198. mov %edi, %eax
  199. mul %ecx
  200. lea (%edi,%edx), %ebp
  201. not %ebp
  202. imul %ebx, %ebp
  203. lea (%ebp,%ebx), %edx
  204. cmp %ebp, %eax
  205. cmovb( %edx, %ebp)
  206. mov %ebp, %eax
  207. mul %ecx
  208. add %ebp, %edx
  209. not %edx
  210. imul %ebx, %edx
  211. add %edx, %ebx
  212. cmp %edx, %eax
  213. cmovb( %ebx, %edx)
  214. mov 32(%esp), %eax
  215. mov %ecx, (%eax)
  216. mov 4(%esp), %ecx
  217. mov %ecx, 4(%eax)
  218. mov 8(%esp), %ebx
  219. shr %cl, %ebx
  220. mov %ebx, 8(%eax)
  221. shr %cl, %esi
  222. mov %esi, 12(%eax)
  223. shr %cl, %edi
  224. mov %edi, 16(%eax)
  225. shr %cl, %ebp
  226. mov %ebp, 20(%eax)
  227. shr %cl, %edx
  228. mov %edx, 24(%eax)
  229. add $12, %esp
  230. pop %ebx
  231. pop %esi
  232. pop %edi
  233. pop %ebp
  234. ret
  235. EPILOGUE()