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

数学计算

开发平台:

Unix_Linux

  1. dnl  AMD64 mpn_addlsh1_n -- rp[] = up[] + (vp[] << 1)
  2. dnl  AMD64 mpn_rsblsh1_n -- rp[] = (vp[] << 1) - up[]
  3. dnl  Copyright 2003, 2005, 2006, 2007, 2008, 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:  2
  18. C K10:  2
  19. C P4:  13
  20. C P6 core2:   3.45
  21. C P6 corei7:  3.45
  22. C P6 atom:  ?
  23. C Sometimes speed degenerates, supposedly related to that some operand
  24. C alignments cause cache conflicts.
  25. C The speed is limited by decoding/issue bandwidth.  There are 22 instructions
  26. C in the loop, which corresponds to ceil(22/3)/4 = 1.83 c/l.
  27. C INPUT PARAMETERS
  28. define(`rp',`%rdi')
  29. define(`up',`%rsi')
  30. define(`vp',`%rdx')
  31. define(`n', `%rcx')
  32. ifdef(`OPERATION_addlsh1_n', `
  33. define(ADDSUB,       add)
  34. define(ADCSBB,       adc)
  35. define(func,       mpn_addlsh1_n)')
  36. ifdef(`OPERATION_rsblsh1_n', `
  37. define(ADDSUB,       sub)
  38. define(ADCSBB,       sbb)
  39. define(func,       mpn_rsblsh1_n)')
  40. MULFUNC_PROLOGUE(mpn_addlsh1_n mpn_rsblsh1_n)
  41. ASM_START()
  42. TEXT
  43. ALIGN(16)
  44. PROLOGUE(func)
  45. push %rbp
  46. mov (vp), %r8
  47. mov R32(n), R32(%rax)
  48. lea (rp,n,8), rp
  49. lea (up,n,8), up
  50. lea (vp,n,8), vp
  51. neg n
  52. xor R32(%rbp), R32(%rbp)
  53. and $3, R32(%rax)
  54. je L(b00)
  55. cmp $2, R32(%rax)
  56. jc L(b01)
  57. je L(b10)
  58. L(b11): add %r8, %r8
  59. mov 8(vp,n,8), %r9
  60. adc %r9, %r9
  61. mov 16(vp,n,8), %r10
  62. adc %r10, %r10
  63. sbb R32(%rax), R32(%rax) C save scy
  64. ADDSUB (up,n,8), %r8
  65. ADCSBB 8(up,n,8), %r9
  66. mov %r8, (rp,n,8)
  67. mov %r9, 8(rp,n,8)
  68. ADCSBB 16(up,n,8), %r10
  69. mov %r10, 16(rp,n,8)
  70. sbb R32(%rbp), R32(%rbp) C save acy
  71. add $3, n
  72. jmp L(ent)
  73. L(b10): add %r8, %r8
  74. mov 8(vp,n,8), %r9
  75. adc %r9, %r9
  76. sbb R32(%rax), R32(%rax) C save scy
  77. ADDSUB (up,n,8), %r8
  78. ADCSBB 8(up,n,8), %r9
  79. mov %r8, (rp,n,8)
  80. mov %r9, 8(rp,n,8)
  81. sbb R32(%rbp), R32(%rbp) C save acy
  82. add $2, n
  83. jmp L(ent)
  84. L(b01): add %r8, %r8
  85. sbb R32(%rax), R32(%rax) C save scy
  86. ADDSUB (up,n,8), %r8
  87. mov %r8, (rp,n,8)
  88. sbb R32(%rbp), R32(%rbp) C save acy
  89. inc n
  90. L(ent): jns L(end)
  91. ALIGN(16)
  92. L(top): add R32(%rax), R32(%rax) C restore scy
  93. mov (vp,n,8), %r8
  94. L(b00): adc %r8, %r8
  95. mov 8(vp,n,8), %r9
  96. adc %r9, %r9
  97. mov 16(vp,n,8), %r10
  98. adc %r10, %r10
  99. mov 24(vp,n,8), %r11
  100. adc %r11, %r11
  101. sbb R32(%rax), R32(%rax) C save scy
  102. add R32(%rbp), R32(%rbp) C restore acy
  103. ADCSBB (up,n,8), %r8
  104. nop C Hammer speedup!
  105. ADCSBB 8(up,n,8), %r9
  106. mov %r8, (rp,n,8)
  107. mov %r9, 8(rp,n,8)
  108. ADCSBB 16(up,n,8), %r10
  109. ADCSBB 24(up,n,8), %r11
  110. mov %r10, 16(rp,n,8)
  111. mov %r11, 24(rp,n,8)
  112. sbb R32(%rbp), R32(%rbp) C save acy
  113. add $4, n
  114. js L(top)
  115. L(end):
  116. ifdef(`OPERATION_addlsh1_n',`
  117. add R32(%rbp), R32(%rax)
  118. neg R32(%rax)')
  119. ifdef(`OPERATION_rsblsh1_n',`
  120. sub R32(%rax), R32(%rbp)
  121. movslq R32(%rbp), %rax')
  122. pop %rbp
  123. ret
  124. EPILOGUE()