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

数学计算

开发平台:

Unix_Linux

  1. dnl  AMD64 mpn_lshiftc -- mpn left shift with complement.
  2. dnl  Copyright 2003, 2005, 2006, 2009 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.75
  21. C K10:  2.75
  22. C P4:  ?
  23. C P6-15 (Core2): ?
  24. C P6-28 (Atom):  ?
  25. C INPUT PARAMETERS
  26. define(`rp', `%rdi')
  27. define(`up', `%rsi')
  28. define(`n', `%rdx')
  29. define(`cnt', `%rcx')
  30. ASM_START()
  31. TEXT
  32. ALIGN(32)
  33. PROLOGUE(mpn_lshiftc)
  34. neg R32(%rcx) C put rsh count in cl
  35. mov -8(up,n,8), %rax
  36. shr R8(%rcx), %rax C function return value
  37. neg R32(%rcx) C put lsh count in cl
  38. lea 1(n), R32(%r8)
  39. and $3, R32(%r8)
  40. je L(rlx) C jump for n = 3, 7, 11, ...
  41. dec R32(%r8)
  42. jne L(1)
  43. C n = 4, 8, 12, ...
  44. mov -8(up,n,8), %r10
  45. shl R8(%rcx), %r10
  46. neg R32(%rcx) C put rsh count in cl
  47. mov -16(up,n,8), %r8
  48. shr R8(%rcx), %r8
  49. or %r8, %r10
  50. not %r10
  51. mov %r10, -8(rp,n,8)
  52. dec n
  53. jmp L(rll)
  54. L(1): dec R32(%r8)
  55. je L(1x) C jump for n = 1, 5, 9, 13, ...
  56. C n = 2, 6, 10, 16, ...
  57. mov -8(up,n,8), %r10
  58. shl R8(%rcx), %r10
  59. neg R32(%rcx) C put rsh count in cl
  60. mov -16(up,n,8), %r8
  61. shr R8(%rcx), %r8
  62. or %r8, %r10
  63. not %r10
  64. mov %r10, -8(rp,n,8)
  65. dec n
  66. neg R32(%rcx) C put lsh count in cl
  67. L(1x):
  68. cmp $1, n
  69. je L(ast)
  70. mov -8(up,n,8), %r10
  71. shl R8(%rcx), %r10
  72. mov -16(up,n,8), %r11
  73. shl R8(%rcx), %r11
  74. neg R32(%rcx) C put rsh count in cl
  75. mov -16(up,n,8), %r8
  76. mov -24(up,n,8), %r9
  77. shr R8(%rcx), %r8
  78. or %r8, %r10
  79. shr R8(%rcx), %r9
  80. or %r9, %r11
  81. not %r10
  82. not %r11
  83. mov %r10, -8(rp,n,8)
  84. mov %r11, -16(rp,n,8)
  85. sub $2, n
  86. L(rll): neg R32(%rcx) C put lsh count in cl
  87. L(rlx): mov -8(up,n,8), %r10
  88. shl R8(%rcx), %r10
  89. mov -16(up,n,8), %r11
  90. shl R8(%rcx), %r11
  91. sub $4, n C       4
  92. jb L(end) C       2
  93. ALIGN(16)
  94. L(top):
  95. C finish stuff from lsh block
  96. neg R32(%rcx) C put rsh count in cl
  97. mov 16(up,n,8), %r8
  98. mov 8(up,n,8), %r9
  99. shr R8(%rcx), %r8
  100. or %r8, %r10
  101. shr R8(%rcx), %r9
  102. or %r9, %r11
  103. not %r10
  104. not %r11
  105. mov %r10, 24(rp,n,8)
  106. mov %r11, 16(rp,n,8)
  107. C start two new rsh
  108. mov 0(up,n,8), %r8
  109. mov -8(up,n,8), %r9
  110. shr R8(%rcx), %r8
  111. shr R8(%rcx), %r9
  112. C finish stuff from rsh block
  113. neg R32(%rcx) C put lsh count in cl
  114. mov 8(up,n,8), %r10
  115. mov 0(up,n,8), %r11
  116. shl R8(%rcx), %r10
  117. or %r10, %r8
  118. shl R8(%rcx), %r11
  119. or %r11, %r9
  120. not %r8
  121. not %r9
  122. mov %r8, 8(rp,n,8)
  123. mov %r9, 0(rp,n,8)
  124. C start two new lsh
  125. mov -8(up,n,8), %r10
  126. mov -16(up,n,8), %r11
  127. shl R8(%rcx), %r10
  128. shl R8(%rcx), %r11
  129. sub $4, n
  130. jae L(top) C       2
  131. L(end):
  132. neg R32(%rcx) C put rsh count in cl
  133. mov 16(up,n,8), %r8
  134. shr R8(%rcx), %r8
  135. or %r8, %r10
  136. mov 8(up,n,8), %r9
  137. shr R8(%rcx), %r9
  138. or %r9, %r11
  139. not %r10
  140. not %r11
  141. mov %r10, 24(rp,n,8)
  142. mov %r11, 16(rp,n,8)
  143. neg R32(%rcx) C put lsh count in cl
  144. L(ast): mov (up), %r10
  145. shl R8(%rcx), %r10
  146. not %r10
  147. mov %r10, (rp)
  148. ret
  149. EPILOGUE()