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

数学计算

开发平台:

Unix_Linux

  1. dnl  Intel P6 mpn_lshsub_n -- mpn papillion support.
  2. dnl  Copyright 2006 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 modify
  7. dnl  it under the terms of the GNU Lesser General Public License as published
  8. dnl  by the Free Software Foundation; either version 3 of the License, or (at
  9. dnl  your option) any later version.
  10. dnl
  11. dnl  The GNU MP Library is distributed in the hope that it will be useful, but
  12. dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  13. dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  14. dnl  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 P6/13: 3.35 cycles/limb (separate mpn_sub_n + mpn_lshift needs 4.12)
  20. C (1) The loop is is not scheduled in any way, and scheduling attempts have not
  21. C     improved speed on P6/13.  Presumably, the K7 will want scheduling, if it
  22. C     at all wants to use MMX.
  23. C (2) We could save a register by not alternatingly using eax and edx in the
  24. C     loop.
  25. define(`rp', `%edi')
  26. define(`up', `%esi')
  27. define(`vp', `%ebx')
  28. define(`n', `%ecx')
  29. define(`cnt', `%mm7')
  30. ASM_START()
  31. TEXT
  32. ALIGN(16)
  33. PROLOGUE(mpn_lshsub_n)
  34. push %edi
  35. push %esi
  36. push %ebx
  37. mov 16(%esp), rp
  38. mov 20(%esp), up
  39. mov 24(%esp), vp
  40. mov 28(%esp), n
  41. mov $32, %eax
  42. sub 32(%esp), %eax
  43. movd %eax, cnt
  44. lea (up,n,4), up
  45. lea (vp,n,4), vp
  46. lea (rp,n,4), rp
  47. neg n
  48. mov n, %eax
  49. and $-8, n
  50. and $7, %eax
  51. shl %eax C eax = 2x
  52. lea (%eax,%eax,4), %edx C edx = 10x
  53. ifdef(`PIC',`
  54. call L(pic_calc)
  55. L(here):
  56. ',`
  57. lea L(ent)(%eax,%edx,2), %eax C eax = 22x
  58. ')
  59. pxor %mm1, %mm1
  60. pxor %mm0, %mm0
  61. jmp *%eax
  62. ifdef(`PIC',`
  63. L(pic_calc):
  64. C See mpn/x86/README about old gas bugs
  65. lea (%eax,%edx,2), %eax
  66. add $L(ent)-L(here), %eax
  67. add (%esp), %eax
  68. ret_internal
  69. ')
  70. L(end): C compute (cy<<cnt) | (edx>>(32-cnt))
  71. sbb %eax, %eax
  72. neg %eax
  73. mov 32(%esp), %ecx
  74. shld %cl, %edx, %eax
  75. emms
  76. pop %ebx
  77. pop %esi
  78. pop %edi
  79. ret
  80. ALIGN(16)
  81. L(top): jecxz L(end)
  82. L(ent): mov    0(up,n,4), %eax
  83. sbb    0(vp,n,4), %eax
  84. movd    %eax, %mm0
  85. punpckldq  %mm0, %mm1
  86. psrlq    %mm7, %mm1
  87. movd    %mm1, 0(rp,n,4)
  88. mov    4(up,n,4), %edx
  89. sbb    4(vp,n,4), %edx
  90. movd    %edx, %mm1
  91. punpckldq  %mm1, %mm0
  92. psrlq    %mm7, %mm0
  93. movd    %mm0, 4(rp,n,4)
  94. mov    8(up,n,4), %eax
  95. sbb    8(vp,n,4), %eax
  96. movd    %eax, %mm0
  97. punpckldq  %mm0, %mm1
  98. psrlq    %mm7, %mm1
  99. movd    %mm1, 8(rp,n,4)
  100. mov    12(up,n,4), %edx
  101. sbb    12(vp,n,4), %edx
  102. movd    %edx, %mm1
  103. punpckldq  %mm1, %mm0
  104. psrlq    %mm7, %mm0
  105. movd    %mm0, 12(rp,n,4)
  106. mov    16(up,n,4), %eax
  107. sbb    16(vp,n,4), %eax
  108. movd    %eax, %mm0
  109. punpckldq  %mm0, %mm1
  110. psrlq    %mm7, %mm1
  111. movd    %mm1, 16(rp,n,4)
  112. mov    20(up,n,4), %edx
  113. sbb    20(vp,n,4), %edx
  114. movd    %edx, %mm1
  115. punpckldq  %mm1, %mm0
  116. psrlq    %mm7, %mm0
  117. movd    %mm0, 20(rp,n,4)
  118. mov    24(up,n,4), %eax
  119. sbb    24(vp,n,4), %eax
  120. movd    %eax, %mm0
  121. punpckldq  %mm0, %mm1
  122. psrlq    %mm7, %mm1
  123. movd    %mm1, 24(rp,n,4)
  124. mov    28(up,n,4), %edx
  125. sbb    28(vp,n,4), %edx
  126. movd    %edx, %mm1
  127. punpckldq  %mm1, %mm0
  128. psrlq    %mm7, %mm0
  129. movd    %mm0, 28(rp,n,4)
  130. lea    8(n), n
  131. jmp    L(top)
  132. EPILOGUE()