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

数学计算

开发平台:

Unix_Linux

  1. dnl  x86-64 mpn_rshift optimized for Pentium 4.
  2. dnl  Copyright 2003, 2005, 2007, 2008 Free Software Foundation, Inc.
  3. dnl
  4. dnl  This file is part of the GNU MP Library.
  5. dnl
  6. dnl  The GNU MP Library is free software; you can redistribute it and/or
  7. dnl  modify it under the terms of the GNU Lesser General Public License as
  8. dnl  published by the Free Software Foundation; either version 3 of the
  9. dnl  License, or (at your option) any later version.
  10. dnl
  11. dnl  The GNU MP Library is distributed in the hope that it will be useful,
  12. dnl  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. dnl  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14. dnl  Lesser General Public License for more details.
  15. dnl
  16. dnl  You should have received a copy of the GNU Lesser General Public License
  17. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  18. include(`../config.m4')
  19. C      cycles/limb
  20. C K8,K9:  2.5
  21. C K10:  ?
  22. C P4:  3.29
  23. C P6-15 (Core2): 2.1 (fluctuates, presumably cache related)
  24. C P6-28 (Atom): 14.3
  25. C INPUT PARAMETERS
  26. define(`rp',`%rdi')
  27. define(`up',`%rsi')
  28. define(`n',`%rdx')
  29. define(`cnt',`%cl')
  30. ASM_START()
  31. TEXT
  32. ALIGN(32)
  33. PROLOGUE(mpn_rshift)
  34. mov (up), %rax
  35. movd %ecx, %mm4
  36. neg %ecx C put lsh count in cl
  37. and $63, %ecx
  38. movd %ecx, %mm5
  39. lea -8(up,n,8), up
  40. lea -8(rp,n,8), rp
  41. lea 1(n), %r8d
  42. neg n
  43. shl %cl, %rax C function return value
  44. and $3, %r8d
  45. je L(rol) C jump for n = 3, 7, 11, ...
  46. dec %r8d
  47. jne L(1)
  48. C n = 4, 8, 12, ...
  49. movq 8(up,n,8), %mm2
  50. psrlq %mm4, %mm2
  51. movq 16(up,n,8), %mm0
  52. psllq %mm5, %mm0
  53. por %mm0, %mm2
  54. movq %mm2, 8(rp,n,8)
  55. inc n
  56. jmp L(rol)
  57. L(1): dec %r8d
  58. je L(1x) C jump for n = 1, 5, 9, 13, ...
  59. C n = 2, 6, 10, 16, ...
  60. movq 8(up,n,8), %mm2
  61. psrlq %mm4, %mm2
  62. movq 16(up,n,8), %mm0
  63. psllq %mm5, %mm0
  64. por %mm0, %mm2
  65. movq %mm2, 8(rp,n,8)
  66. inc n
  67. L(1x):
  68. cmp $-1, n
  69. je L(ast)
  70. movq 8(up,n,8), %mm2
  71. psrlq %mm4, %mm2
  72. movq 16(up,n,8), %mm3
  73. psrlq %mm4, %mm3
  74. movq 16(up,n,8), %mm0
  75. movq 24(up,n,8), %mm1
  76. psllq %mm5, %mm0
  77. por %mm0, %mm2
  78. psllq %mm5, %mm1
  79. por %mm1, %mm3
  80. movq %mm2, 8(rp,n,8)
  81. movq %mm3, 16(rp,n,8)
  82. add $2, n
  83. L(rol): movq 8(up,n,8), %mm2
  84. psrlq %mm4, %mm2
  85. movq 16(up,n,8), %mm3
  86. psrlq %mm4, %mm3
  87. add $4, n C       4
  88. jb L(end) C       2
  89. ALIGN(32)
  90. L(top):
  91. C finish stuff from lsh block
  92. movq -16(up,n,8), %mm0
  93. movq -8(up,n,8), %mm1
  94. psllq %mm5, %mm0
  95. por %mm0, %mm2
  96. psllq %mm5, %mm1
  97. movq (up,n,8), %mm0
  98. por %mm1, %mm3
  99. movq 8(up,n,8), %mm1
  100. movq %mm2, -24(rp,n,8)
  101. movq %mm3, -16(rp,n,8)
  102. C start two new rsh
  103. psllq %mm5, %mm0
  104. psllq %mm5, %mm1
  105. C finish stuff from rsh block
  106. movq -8(up,n,8), %mm2
  107. movq (up,n,8), %mm3
  108. psrlq %mm4, %mm2
  109. por %mm2, %mm0
  110. psrlq %mm4, %mm3
  111. movq 8(up,n,8), %mm2
  112. por %mm3, %mm1
  113. movq 16(up,n,8), %mm3
  114. movq %mm0, -8(rp,n,8)
  115. movq %mm1, (rp,n,8)
  116. C start two new lsh
  117. add $4, n
  118. psrlq %mm4, %mm2
  119. psrlq %mm4, %mm3
  120. jae L(top) C       2
  121. L(end):
  122. movq -16(up,n,8), %mm0
  123. psllq %mm5, %mm0
  124. por %mm0, %mm2
  125. movq -8(up,n,8), %mm1
  126. psllq %mm5, %mm1
  127. por %mm1, %mm3
  128. movq %mm2, -24(rp,n,8)
  129. movq %mm3, -16(rp,n,8)
  130. L(ast): movq (up), %mm2
  131. psrlq %mm4, %mm2
  132. movq %mm2, (rp)
  133. emms
  134. ret
  135. EPILOGUE()