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

数学计算

开发平台:

Unix_Linux

  1. dnl  x86-32 mpn_mod_1s_4p, requiring cmov.
  2. dnl  Contributed to the GNU project by Torbjorn Granlund.
  3. dnl  Copyright 2009 Free Software Foundation, Inc.
  4. dnl  This file is part of the GNU MP Library.
  5. dnl  The GNU MP Library is free software; you can redistribute it and/or modify
  6. dnl  it under the terms of the GNU Lesser General Public License as published
  7. dnl  by the Free Software Foundation; either version 3 of the License, or (at
  8. dnl  your option) any later version.
  9. dnl  The GNU MP Library is distributed in the hope that it will be useful, but
  10. dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  11. dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  12. dnl  License for more details.
  13. dnl  You should have received a copy of the GNU Lesser General Public License
  14. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  15. include(`../config.m4')
  16. C                           cycles/limb
  17. C P5:
  18. C P6 model 0-8,10-12)
  19. C P6 model 9  (Banias)
  20. C P6 model 13 (Dothan)  6.0
  21. C P4 model 0  (Willamette)
  22. C P4 model 1  (?)
  23. C P4 model 2  (Northwood) 15.5
  24. C P4 model 3  (Prescott)
  25. C P4 model 4  (Nocona)
  26. C K6:
  27. C K7:                            4.75
  28. C K8:
  29. C Ths inner loop was manually written, it ought to be loopmixed.
  30. C Presumably, we could get to 4 c/l for K7.
  31. C The cps function was compiler generated.  It can clearly be optimized.
  32. ASM_START()
  33. TEXT
  34. ALIGN(16)
  35. PROLOGUE(mpn_mod_1s_4p)
  36. push %ebp
  37. push %edi
  38. push %esi
  39. push %ebx
  40. sub $28, %esp
  41. mov 60(%esp), %edi C cps
  42. mov 8(%edi), %eax
  43. mov 12(%edi), %edx
  44. mov 16(%edi), %ecx
  45. mov 20(%edi), %esi
  46. mov 24(%edi), %edi
  47. mov %eax, 4(%esp)
  48. mov %edx, 8(%esp)
  49. mov %ecx, 12(%esp)
  50. mov %esi, 16(%esp)
  51. mov %edi, 20(%esp)
  52. mov 52(%esp), %eax C n
  53. xor %edi, %edi
  54. mov 48(%esp), %esi C up
  55. lea -12(%esi,%eax,4), %esi
  56. and $3, %eax
  57. je L(b0)
  58. cmp $2, %eax
  59. jc L(b1)
  60. je L(b2)
  61. L(b3): mov 4(%esi), %eax
  62. mull 4(%esp)
  63. mov (%esi), %ebp
  64. add %eax, %ebp
  65. adc %edx, %edi
  66. mov 8(%esi), %eax
  67. mull 8(%esp)
  68. lea -12(%esi), %esi
  69. jmp L(m0)
  70. L(b0): mov (%esi), %eax
  71. mull 4(%esp)
  72. mov -4(%esi), %ebp
  73. add %eax, %ebp
  74. adc %edx, %edi
  75. mov 4(%esi), %eax
  76. mull 8(%esp)
  77. add %eax, %ebp
  78. adc %edx, %edi
  79. mov 8(%esi), %eax
  80. mull 12(%esp)
  81. lea -16(%esi), %esi
  82. jmp L(m0)
  83. L(b1): mov 8(%esi), %ebp
  84. lea -4(%esi), %esi
  85. jmp L(m1)
  86. L(b2): mov 8(%esi), %eax
  87. mull 4(%esp)
  88. mov 4(%esi), %ebp
  89. lea -8(%esi), %esi
  90. jmp L(m0)
  91. ALIGN(16)
  92. L(top): mov (%esi), %eax
  93. mull 4(%esp)
  94. mov -4(%esi), %ebx
  95. xor %ecx, %ecx
  96. add %eax, %ebx
  97. adc %edx, %ecx
  98. mov 4(%esi), %eax
  99. mull 8(%esp)
  100. add %eax, %ebx
  101. adc %edx, %ecx
  102. mov 8(%esi), %eax
  103. mull 12(%esp)
  104. add %eax, %ebx
  105. adc %edx, %ecx
  106. lea -16(%esi), %esi
  107. mov 16(%esp), %eax
  108. mul %ebp
  109. add %eax, %ebx
  110. adc %edx, %ecx
  111. mov 20(%esp), %eax
  112. mul %edi
  113. mov %ebx, %ebp
  114. mov %ecx, %edi
  115. L(m0): add %eax, %ebp
  116. adc %edx, %edi
  117. L(m1): sub $4, 52(%esp)
  118. ja L(top)
  119. L(end): mov 4(%esp), %eax
  120. mul %edi
  121. mov 60(%esp), %edi
  122. add %eax, %ebp
  123. adc $0, %edx
  124. mov 4(%edi), %ecx
  125. mov %edx, %esi
  126. mov %ebp, %eax
  127. sal %cl, %esi
  128. mov %ecx, %ebx
  129. neg %ecx
  130. shr %cl, %eax
  131. or %esi, %eax
  132. lea 1(%eax), %esi
  133. mull (%edi)
  134. mov %ebx, %ecx
  135. mov %eax, %ebx
  136. mov %ebp, %eax
  137. sal %cl, %eax
  138. add %eax, %ebx
  139. adc %esi, %edx
  140. imul 56(%esp), %edx
  141. mov 56(%esp), %esi
  142. sub %edx, %eax
  143. lea (%eax,%esi), %edx
  144. cmp %eax, %ebx
  145. cmovb( %edx, %eax)
  146. mov %eax, %edx
  147. sub %esi, %eax
  148. cmovb( %edx, %eax)
  149. add $28, %esp
  150. pop %ebx
  151. pop %esi
  152. pop %edi
  153. pop %ebp
  154. shr %cl, %eax
  155. ret
  156. EPILOGUE()
  157. ALIGN(16)
  158. PROLOGUE(mpn_mod_1s_4p_cps)
  159. sub $56, %esp
  160. mov %esi, 44(%esp)
  161. mov 64(%esp), %esi
  162. mov %edi, 48(%esp)
  163. mov %ebx, 40(%esp)
  164. mov $-1, %ebx
  165. mov %ebp, 52(%esp)
  166. bsr %esi, %eax
  167. xor $31, %eax
  168. mov %eax, %ecx
  169. mov %eax, 24(%esp)
  170. mov %ebx, %eax
  171. sal %cl, %esi
  172. mov %esi, %ecx
  173. mov %esi, %edi
  174. mov %esi, %ebp
  175. neg %ecx
  176. not %edi
  177. mov %ecx, 20(%esp)
  178. mov $32, %ecx
  179. sub 24(%esp), %ecx
  180. mov %edi, %edx
  181. mov %edi, 16(%esp)
  182. mov 20(%esp), %edi
  183. div %esi
  184. mov %eax, %ebx
  185. shr %cl, %eax
  186. movzbl 24(%esp), %ecx
  187. mov %eax, 12(%esp)
  188. mov $1, %eax
  189. sal %cl, %eax
  190. or %eax, 12(%esp)
  191. imul 12(%esp), %edi
  192. mov %edi, %eax
  193. mov %edi, 20(%esp)
  194. mul %ebx
  195. mov %eax, %ecx
  196. lea 1(%edx,%edi), %eax
  197. neg %eax
  198. imul %eax, %ebp
  199. lea (%ebp,%esi), %eax
  200. cmp %ebp, %ecx
  201. cmovb( %eax, %ebp)
  202. mov %ebp, %eax
  203. mul %ebx
  204. lea 1(%ebp,%edx), %edi
  205. mov %eax, %ecx
  206. neg %edi
  207. mov %edi, 8(%esp)
  208. imul %esi, %edi
  209. mov %edi, %eax
  210. add %esi, %eax
  211. cmp %edi, %ecx
  212. cmovae( %edi, %eax)
  213. mov %eax, 32(%esp)
  214. mov 32(%esp), %edi
  215. mul %ebx
  216. mov %eax, 36(%esp)
  217. lea 1(%edi,%edx), %eax
  218. negl %eax
  219. imul %esi, %eax
  220. mov %eax, %ecx
  221. add %esi, %ecx
  222. cmp %eax, 36(%esp)
  223. cmovae( %eax, %ecx)
  224. mov %ecx, (%esp)
  225. mov %ecx, %eax
  226. mul %ebx
  227. mov %eax, %edi
  228. mov (%esp), %eax
  229. lea 1(%eax,%edx), %ecx
  230. mov 60(%esp), %edx
  231. neg %ecx
  232. imul %esi, %ecx
  233. mov %ebx, (%edx)
  234. add %ecx, %esi
  235. cmp %ecx, %edi
  236. cmovae( %ecx, %esi)
  237. mov 24(%esp), %ecx
  238. shrl %cl, 20(%esp)
  239. mov 20(%esp), %edi
  240. mov %esi, 4(%esp)
  241. mov %ecx, 4(%edx)
  242. movzbl 24(%esp), %ecx
  243. mov %edi, 8(%edx)
  244. shr %cl, %ebp
  245. shr %cl, %eax
  246. mov %ebp, 12(%edx)
  247. shrl %cl, 32(%esp)
  248. mov 32(%esp), %edi
  249. shrl %cl, 4(%esp)
  250. mov %eax, 20(%edx)
  251. mov %edi, 16(%edx)
  252. mov 4(%esp), %edi
  253. mov %edi, 24(%edx)
  254. mov 40(%esp), %ebx
  255. mov 44(%esp), %esi
  256. mov 48(%esp), %edi
  257. mov 52(%esp), %ebp
  258. add $56, %esp
  259. ret
  260. EPILOGUE()