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

数学计算

开发平台:

Unix_Linux

  1. dnl  AMD64 mpn_addaddmul_1msb0, R = Au + Bv, u,v < 2^63.
  2. dnl  Copyright 2008 Free Software Foundation, Inc.
  3. dnl  This file is part of the GNU MP Library.
  4. dnl  The GNU MP Library is free software; you can redistribute it and/or modify
  5. dnl  it under the terms of the GNU Lesser General Public License as published
  6. dnl  by the Free Software Foundation; either version 3 of the License, or (at
  7. dnl  your option) any later version.
  8. dnl  The GNU MP Library is distributed in the hope that it will be useful, but
  9. dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  11. dnl  License for more details.
  12. dnl  You should have received a copy of the GNU Lesser General Public License
  13. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  14. include(`../config.m4')
  15. C      cycles/limb
  16. C K8:  2.167
  17. C P4: 12.0
  18. C P6-15:  4.0
  19. C TODO
  20. C  * Perhaps handle various n mod 3 sizes better.  The code now is too large.
  21. C INPUT PARAMETERS
  22. define(`rp', `%rdi')
  23. define(`ap', `%rsi')
  24. define(`bp_param', `%rdx')
  25. define(`n', `%rcx')
  26. define(`u0', `%r8')
  27. define(`v0', `%r9')
  28. define(`bp', `%rbp')
  29. ASM_START()
  30. TEXT
  31. ALIGN(16)
  32. PROLOGUE(mpn_addaddmul_1msb0)
  33. push %r12
  34. push %rbp
  35. lea (ap,n,8), ap
  36. lea (bp_param,n,8), bp
  37. lea (rp,n,8), rp
  38. neg n
  39. mov (ap,n,8), %rax
  40. mul %r8
  41. mov %rax, %r12
  42. mov (bp,n,8), %rax
  43. mov %rdx, %r10
  44. add $3, n
  45. jns L(end)
  46. ALIGN(16)
  47. L(top): mul %r9
  48. add %rax, %r12
  49. mov -16(ap,n,8), %rax
  50. adc %rdx, %r10
  51. mov %r12, -24(rp,n,8)
  52. mul %r8
  53. add %rax, %r10
  54. mov -16(bp,n,8), %rax
  55. mov $0, %r11d
  56. adc %rdx, %r11
  57. mul %r9
  58. add %rax, %r10
  59. mov -8(ap,n,8), %rax
  60. adc %rdx, %r11
  61. mov %r10, -16(rp,n,8)
  62. mul %r8
  63. add %rax, %r11
  64. mov -8(bp,n,8), %rax
  65. mov $0, %r12d
  66. adc %rdx, %r12
  67. mul %r9
  68. add %rax, %r11
  69. adc %rdx, %r12
  70. mov (ap,n,8), %rax
  71. mul %r8
  72. add %rax, %r12
  73. mov %r11, -8(rp,n,8)
  74. mov (bp,n,8), %rax
  75. mov $0, %r10d
  76. adc %rdx, %r10
  77. add $3, n
  78. js L(top)
  79. L(end): cmp $1, R32(n)
  80. ja 2f
  81. jz 1f
  82. mul %r9
  83. add %rax, %r12
  84. mov -16(ap), %rax
  85. adc %rdx, %r10
  86. mov %r12, -24(rp)
  87. mul %r8
  88. add %rax, %r10
  89. mov -16(bp), %rax
  90. mov $0, %r11d
  91. adc %rdx, %r11
  92. mul %r9
  93. add %rax, %r10
  94. mov -8(ap), %rax
  95. adc %rdx, %r11
  96. mov %r10, -16(rp)
  97. mul %r8
  98. add %rax, %r11
  99. mov -8(bp), %rax
  100. mov $0, %r12d
  101. adc %rdx, %r12
  102. mul %r9
  103. add %rax, %r11
  104. adc %rdx, %r12
  105. mov %r11, -8(rp)
  106. mov %r12, %rax
  107. pop %rbp
  108. pop %r12
  109. ret
  110. 1: mul %r9
  111. add %rax, %r12
  112. mov -8(ap), %rax
  113. adc %rdx, %r10
  114. mov %r12, -16(rp)
  115. mul %r8
  116. add %rax, %r10
  117. mov -8(bp), %rax
  118. mov $0, %r11d
  119. adc %rdx, %r11
  120. mul %r9
  121. add %rax, %r10
  122. adc %rdx, %r11
  123. mov %r10, -8(rp)
  124. mov %r11, %rax
  125. pop %rbp
  126. pop %r12
  127. ret
  128. 2: mul %r9
  129. add %rax, %r12
  130. mov %r12, -8(rp)
  131. adc %rdx, %r10
  132. mov %r10, %rax
  133. pop %rbp
  134. pop %r12
  135. ret
  136. EPILOGUE()