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

数学计算

开发平台:

Unix_Linux

  1. dnl  AMD64 mpn_mod_1s_4p
  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 K8,K9:  3.0
  18. C K10:  3.0
  19. C P4: 14.5
  20. C P6 core2:  5.0
  21. C P6 corei7:  4.3
  22. C P6 atom: 25.0
  23. ASM_START()
  24. TEXT
  25. ALIGN(16)
  26. PROLOGUE(mpn_mod_1s_4p)
  27. push %r14
  28. push %r13
  29. push %r12
  30. push %rbp
  31. push %rbx
  32. mov %rdx, -16(%rsp)
  33. mov %rcx, %r14
  34. mov 16(%rcx), %r11
  35. mov 24(%rcx), %rbx
  36. mov 32(%rcx), %rbp
  37. mov 40(%rcx), %r13
  38. mov 48(%rcx), %r12
  39. xor R32(%r8), R32(%r8)
  40. mov R32(%rsi), R32(%rdx)
  41. and $3, R32(%rdx)
  42. je L(b0)
  43. cmp $2, R32(%rdx)
  44. jc L(b1)
  45. je L(b2)
  46. L(b3): lea -24(%rdi,%rsi,8), %rdi
  47. mov 8(%rdi), %rax
  48. mul %r11
  49. mov (%rdi), %r9
  50. add %rax, %r9
  51. adc %rdx, %r8
  52. mov 16(%rdi), %rax
  53. mul %rbx
  54. jmp L(m0)
  55. ALIGN(8)
  56. L(b0): lea -32(%rdi,%rsi,8), %rdi
  57. mov 8(%rdi), %rax
  58. mul %r11
  59. mov (%rdi), %r9
  60. add %rax, %r9
  61. adc %rdx, %r8
  62. mov 16(%rdi), %rax
  63. mul %rbx
  64. add %rax, %r9
  65. adc %rdx, %r8
  66. mov 24(%rdi), %rax
  67. mul %rbp
  68. jmp L(m0)
  69. ALIGN(8)
  70. L(b1): lea -8(%rdi,%rsi,8), %rdi
  71. mov (%rdi), %r9
  72. jmp L(m1)
  73. ALIGN(8)
  74. L(b2): lea -16(%rdi,%rsi,8), %rdi
  75. mov 8(%rdi), %rax
  76. mul %r11
  77. mov (%rdi), %r9
  78. jmp L(m0)
  79. ALIGN(16)
  80. L(top): mov -24(%rdi), %rax
  81. mov -32(%rdi), %r10
  82. mul %r11
  83. add %rax, %r10
  84. mov -16(%rdi), %rax
  85. mov %rdx, %rcx
  86. adc $0, %rcx
  87. mul %rbx
  88. add %rax, %r10
  89. mov -8(%rdi), %rax
  90. adc %rdx, %rcx
  91. sub $32, %rdi
  92. mul %rbp
  93. add %rax, %r10
  94. mov %r9, %rax
  95. adc %rdx, %rcx
  96. mul %r13
  97. add %rax, %r10
  98. mov %r8, %rax
  99. adc %rdx, %rcx
  100. mul %r12
  101. mov %r10, %r9
  102. mov %rcx, %r8
  103. L(m0): add %rax, %r9
  104. adc %rdx, %r8
  105. L(m1): sub $4, %rsi
  106. ja L(top)
  107. L(end): mov 8(%r14), R32(%rsi)
  108. mov %r8, %rax
  109. mul %r11
  110. mov %rax, %r8
  111. add %r9, %r8
  112. adc $0, %rdx
  113. xor R32(%rcx), R32(%rcx)
  114. sub R32(%rsi), R32(%rcx)
  115. mov %r8, %rdi
  116. shr R8(%rcx), %rdi
  117. mov R32(%rsi), R32(%rcx)
  118. sal R8(%rcx), %rdx
  119. or %rdx, %rdi
  120. mov %rdi, %rax
  121. mulq (%r14)
  122. mov -16(%rsp), %rbx
  123. mov %rax, %r9
  124. sal R8(%rcx), %r8
  125. inc %rdi
  126. add %r8, %r9
  127. adc %rdi, %rdx
  128. imul %rbx, %rdx
  129. sub %rdx, %r8
  130. lea (%r8,%rbx), %rax
  131. cmp %r8, %r9
  132. cmovb %rax, %r8
  133. mov %r8, %rax
  134. sub %rbx, %rax
  135. cmovb %r8, %rax
  136. shr R8(%rcx), %rax
  137. pop %rbx
  138. pop %rbp
  139. pop %r12
  140. pop %r13
  141. pop %r14
  142. ret
  143. EPILOGUE()
  144. ALIGN(16)
  145. PROLOGUE(mpn_mod_1s_4p_cps)
  146. push %r12
  147. bsr %rsi, %rcx
  148. push %rbp
  149. xor $63, R32(%rcx)
  150. mov %rsi, %rbp
  151. mov R32(%rcx), R32(%r12)
  152. sal R8(%rcx), %rbp
  153. push %rbx
  154. mov %rdi, %rbx
  155. mov %rbp, %rdi
  156. CALL( mpn_invert_limb)
  157. mov R32(%r12), R32(%rcx)
  158. mov $1, R32(%r10)
  159. sal R8(%rcx), %r10
  160. mov $64, R32(%rcx)
  161. mov %rax, %r9
  162. sub R32(%r12), R32(%rcx)
  163. mov %r9, (%rbx)
  164. shr R8(%rcx), %rax
  165. mov R32(%r12), R32(%rcx)
  166. or %rax, %r10
  167. mov %rbp, %rax
  168. neg %rax
  169. imul %rax, %r10
  170. mov %r10, %rax
  171. mul %r9
  172. lea 1(%r10,%rdx), %r8
  173. neg %r8
  174. imul %rbp, %r8
  175. cmp %r8, %rax
  176. lea (%r8,%rbp), %rdx
  177. cmovb %rdx, %r8
  178. mov %r8, %rax
  179. mul %r9
  180. lea 1(%r8,%rdx), %rdi
  181. neg %rdi
  182. imul %rbp, %rdi
  183. cmp %rdi, %rax
  184. lea (%rdi,%rbp), %rdx
  185. cmovb %rdx, %rdi
  186. mov %rdi, %rax
  187. mul %r9
  188. lea 1(%rdi,%rdx), %rsi
  189. neg %rsi
  190. imul %rbp, %rsi
  191. cmp %rsi, %rax
  192. lea (%rsi,%rbp), %rdx
  193. cmovb %rdx, %rsi
  194. mov %rsi, %rax
  195. mul %r9
  196. lea 1(%rsi,%rdx), %rdx
  197. neg %rdx
  198. imul %rbp, %rdx
  199. cmp %rdx, %rax
  200. lea (%rdx,%rbp), %rbp
  201. movslq R32(%r12), %rax
  202. cmovae %rdx, %rbp
  203. shr R8(%rcx), %r10
  204. shr R8(%rcx), %r8
  205. shr R8(%rcx), %rbp
  206. shr R8(%rcx), %rdi
  207. shr R8(%rcx), %rsi
  208. mov %rbp, 48(%rbx)
  209. mov %rax, 8(%rbx)
  210. mov %r10, 16(%rbx)
  211. mov %r8, 24(%rbx)
  212. mov %rdi, 32(%rbx)
  213. mov %rsi, 40(%rbx)
  214. pop %rbx
  215. pop %rbp
  216. pop %r12
  217. ret
  218. EPILOGUE()