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

数学计算

开发平台:

Unix_Linux

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