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

数学计算

开发平台:

Unix_Linux

  1. dnl  AMD64 mpn_lshsub_n.  R = 2^k(U - V).
  2. dnl  Copyright 2006 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:  3.15 (mpn_sub_n + mpn_lshift costs about 4 c/l)
  17. C K10:  3.15 (mpn_sub_n + mpn_lshift costs about 4 c/l)
  18. C P4: 16.5
  19. C P6-15:  4.35
  20. C This was written quickly and not optimized at all, but it runs very well on
  21. C K8.  But perhaps one could get under 3 c/l.  Ideas:
  22. C   1) Use indexing to save the 3 LEA
  23. C   2) Write reasonable feed-in code
  24. C   3) Be more clever about register usage
  25. C   4) Unroll more, handling CL negation, carry save/restore cost much now
  26. C   5) Reschedule
  27. C INPUT PARAMETERS
  28. define(`rp', `%rdi')
  29. define(`up', `%rsi')
  30. define(`vp', `%rdx')
  31. define(`n', `%rcx')
  32. define(`cnt' `%r8')
  33. ASM_START()
  34. TEXT
  35. ALIGN(16)
  36. PROLOGUE(mpn_lshsub_n)
  37. push %r12
  38. push %r13
  39. push %r14
  40. push %r15
  41. push %rbx
  42. mov n, %rax
  43. xor %ebx, %ebx C clear carry save register
  44. mov %r8d, %ecx C shift count
  45. xor %r15d, %r15d C limb carry
  46. mov %eax, %r11d
  47. and $3, %r11d
  48. je L(4)
  49. sub $1, %r11d
  50. L(oopette):
  51. add %ebx, %ebx C restore carry flag
  52. mov 0(up), %r8
  53. lea 8(up), up
  54. sbb 0(vp), %r8
  55. mov %r8, %r12
  56. sbb %ebx, %ebx C save carry flag
  57. shl %cl, %r8
  58. or %r15, %r8
  59. mov %r12, %r15
  60. lea 8(vp), vp
  61. neg %cl
  62. shr %cl, %r15
  63. neg %cl
  64. mov %r8, 0(rp)
  65. lea 8(rp), rp
  66. sub $1, %r11d
  67. jnc L(oopette)
  68. L(4):
  69. sub $4, %rax
  70. jc L(end)
  71. ALIGN(16)
  72. L(oop):
  73. add %ebx, %ebx C restore carry flag
  74. mov 0(up), %r8
  75. mov 8(up), %r9
  76. mov 16(up), %r10
  77. mov 24(up), %r11
  78. lea 32(up), up
  79. sbb 0(vp), %r8
  80. mov %r8, %r12
  81. sbb 8(vp), %r9
  82. mov %r9, %r13
  83. sbb 16(vp), %r10
  84. mov %r10, %r14
  85. sbb 24(vp), %r11
  86. sbb %ebx, %ebx C save carry flag
  87. shl %cl, %r8
  88. shl %cl, %r9
  89. shl %cl, %r10
  90. or %r15, %r8
  91. mov %r11, %r15
  92. shl %cl, %r11
  93. lea 32(vp), vp
  94. neg %cl
  95. shr %cl, %r12
  96. shr %cl, %r13
  97. shr %cl, %r14
  98. shr %cl, %r15 C used next loop
  99. or %r12, %r9
  100. or %r13, %r10
  101. or %r14, %r11
  102. neg %cl
  103. mov %r8, 0(rp)
  104. mov %r9, 8(rp)
  105. mov %r10, 16(rp)
  106. mov %r11, 24(rp)
  107. lea 32(rp), rp
  108. sub $4, %rax
  109. jnc L(oop)
  110. L(end):
  111. neg %ebx
  112. shl %cl, %rbx
  113. adc %r15, %rbx
  114. mov %rbx, %rax
  115. pop %rbx
  116. pop %r15
  117. pop %r14
  118. pop %r13
  119. pop %r12
  120. ret
  121. EPILOGUE()