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

数学计算

开发平台:

Unix_Linux

  1. dnl  AMD64 mpn_rsh1add_n -- rp[] = (up[] + vp[]) >> 1
  2. dnl  Copyright 2003, 2005, 2009 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,K9:  2.14 (mpn_add_n + mpn_rshift need 4.125)
  17. C K10:  2.14 (mpn_add_n + mpn_rshift need 4.125)
  18. C P4: 12.75
  19. C P6-15:  3.75
  20. C TODO
  21. C  * Rewrite to use indexed addressing, like addlsh1.asm and sublsh1.asm.
  22. C  * Try to approach the cache bandwidth 1.5 c/l.  It should be possible.
  23. C INPUT PARAMETERS
  24. define(`rp',`%rdi')
  25. define(`up',`%rsi')
  26. define(`vp',`%rdx')
  27. define(`n',`%rcx')
  28. define(`n32',`%ecx')
  29. ifdef(`OPERATION_rsh1add_n', `
  30. define(ADDSUB,       add)
  31. define(ADCSBB,       adc)
  32. define(func_n,       mpn_rsh1add_n)
  33. define(func_nc,       mpn_rsh1add_nc)')
  34. ifdef(`OPERATION_rsh1sub_n', `
  35. define(ADDSUB,       sub)
  36. define(ADCSBB,       sbb)
  37. define(func_n,       mpn_rsh1sub_n)
  38. define(func_nc,       mpn_rsh1sub_nc)')
  39. MULFUNC_PROLOGUE(mpn_rsh1add_n mpn_rsh1add_nc mpn_rsh1sub_n mpn_rsh1sub_nc)
  40. ASM_START()
  41. TEXT
  42. ALIGN(16)
  43. PROLOGUE(func_nc)
  44. push %rbx
  45. xor %eax, %eax
  46. neg %r8 C set C flag from parameter
  47. mov (up), %rbx
  48. ADCSBB (vp), %rbx
  49. jmp L(ent)
  50. EPILOGUE()
  51. ALIGN(16)
  52. PROLOGUE(func_n)
  53. push %rbx
  54. xor %eax, %eax
  55. mov (up), %rbx
  56. ADDSUB (vp), %rbx
  57. L(ent):
  58. rcr %rbx C rotate, save acy
  59. adc %eax, %eax C return value
  60. mov n32, R32(%r11)
  61. and $3, R32(%r11)
  62. cmp $1, R32(%r11)
  63. je L(do) C jump if n = 1 5 9 ...
  64. L(n1): cmp $2, R32(%r11)
  65. jne L(n2) C jump unless n = 2 6 10 ...
  66. add %rbx, %rbx C rotate carry limb, restore acy
  67. mov 8(up), %r10
  68. ADCSBB 8(vp), %r10
  69. lea 8(up), up
  70. lea 8(vp), vp
  71. lea 8(rp), rp
  72. rcr %r10
  73. rcr %rbx
  74. mov %rbx, -8(rp)
  75. jmp L(cj1)
  76. L(n2): cmp $3, R32(%r11)
  77. jne L(n3) C jump unless n = 3 7 11 ...
  78. add %rbx, %rbx C rotate carry limb, restore acy
  79. mov 8(up), %r9
  80. mov 16(up), %r10
  81. ADCSBB 8(vp), %r9
  82. ADCSBB 16(vp), %r10
  83. lea 16(up), up
  84. lea 16(vp), vp
  85. lea 16(rp), rp
  86. rcr %r10
  87. rcr %r9
  88. rcr %rbx
  89. mov %rbx, -16(rp)
  90. jmp L(cj2)
  91. L(n3): dec n C come here for n = 4 8 12 ...
  92. add %rbx, %rbx C rotate carry limb, restore acy
  93. mov 8(up), %r8
  94. mov 16(up), %r9
  95. ADCSBB 8(vp), %r8
  96. ADCSBB 16(vp), %r9
  97. mov 24(up), %r10
  98. ADCSBB 24(vp), %r10
  99. lea 24(up), up
  100. lea 24(vp), vp
  101. lea 24(rp), rp
  102. rcr %r10
  103. rcr %r9
  104. rcr %r8
  105. rcr %rbx
  106. mov %rbx, -24(rp)
  107. mov %r8, -16(rp)
  108. L(cj2): mov %r9, -8(rp)
  109. L(cj1): mov %r10, %rbx
  110. L(do):
  111. shr $2, n C 4
  112. je L(end) C 2
  113. ALIGN(16)
  114. L(top): add %rbx, %rbx C rotate carry limb, restore acy
  115. mov 8(up), %r8
  116. mov 16(up), %r9
  117. ADCSBB 8(vp), %r8
  118. ADCSBB 16(vp), %r9
  119. mov 24(up), %r10
  120. mov 32(up), %r11
  121. ADCSBB 24(vp), %r10
  122. ADCSBB 32(vp), %r11
  123. lea 32(up), up
  124. lea 32(vp), vp
  125. rcr %r11 C rotate, save acy
  126. rcr %r10
  127. rcr %r9
  128. rcr %r8
  129. rcr %rbx
  130. mov %rbx, (rp)
  131. mov %r8, 8(rp)
  132. mov %r9, 16(rp)
  133. mov %r10, 24(rp)
  134. mov %r11, %rbx
  135. lea 32(rp), rp
  136. dec n
  137. jne L(top)
  138. L(end): mov %rbx, (rp)
  139. pop %rbx
  140. ret
  141. EPILOGUE()