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

数学计算

开发平台:

Unix_Linux

  1. dnl  Intel Pentium mpn_com -- mpn ones complement.
  2. dnl  Copyright 1996, 2001, 2002, 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
  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 P5: 1.75 cycles/limb
  20. NAILS_SUPPORT(0-31)
  21. C void mpn_com (mp_ptr dst, mp_srcptr src, mp_size_t size);
  22. C
  23. C This code is similar to mpn_copyi, basically there's just some "xorl
  24. C $GMP_NUMB_MASK"s inserted.
  25. C
  26. C Alternatives:
  27. C
  28. C On P55 some MMX code could be 1.25 c/l (8 limb unrolled) if src and dst
  29. C are the same alignment mod 8, but it doesn't seem worth the trouble for
  30. C just that case (there'd need to be some plain integer available too for
  31. C the unaligned case).
  32. defframe(PARAM_SIZE,12)
  33. defframe(PARAM_SRC, 8)
  34. defframe(PARAM_DST, 4)
  35. TEXT
  36. ALIGN(8)
  37. PROLOGUE(mpn_com)
  38. deflit(`FRAME',0)
  39. movl PARAM_SRC, %eax
  40. movl PARAM_SIZE, %ecx
  41. pushl %esi FRAME_pushl()
  42. pushl %edi FRAME_pushl()
  43. leal (%eax,%ecx,4), %eax
  44. xorl $-1, %ecx C -size-1
  45. movl PARAM_DST, %edx
  46. addl $8, %ecx C -size+7
  47. jns L(end)
  48. movl (%edx), %esi C fetch destination cache line
  49. nop
  50. L(top):
  51. C eax &src[size]
  52. C ebx
  53. C ecx counter, limbs, negative
  54. C edx dst, incrementing
  55. C esi scratch
  56. C edi scratch
  57. C ebp
  58. movl 28(%edx), %esi C destination prefetch
  59. addl $32, %edx
  60. movl -28(%eax,%ecx,4), %esi
  61. movl -24(%eax,%ecx,4), %edi
  62. xorl $GMP_NUMB_MASK, %esi
  63. xorl $GMP_NUMB_MASK, %edi
  64. movl %esi, -32(%edx)
  65. movl %edi, -28(%edx)
  66. movl -20(%eax,%ecx,4), %esi
  67. movl -16(%eax,%ecx,4), %edi
  68. xorl $GMP_NUMB_MASK, %esi
  69. xorl $GMP_NUMB_MASK, %edi
  70. movl %esi, -24(%edx)
  71. movl %edi, -20(%edx)
  72. movl -12(%eax,%ecx,4), %esi
  73. movl -8(%eax,%ecx,4), %edi
  74. xorl $GMP_NUMB_MASK, %esi
  75. xorl $GMP_NUMB_MASK, %edi
  76. movl %esi, -16(%edx)
  77. movl %edi, -12(%edx)
  78. movl -4(%eax,%ecx,4), %esi
  79. movl (%eax,%ecx,4), %edi
  80. xorl $GMP_NUMB_MASK, %esi
  81. xorl $GMP_NUMB_MASK, %edi
  82. movl %esi, -8(%edx)
  83. movl %edi, -4(%edx)
  84. addl $8, %ecx
  85. js L(top)
  86. L(end):
  87. C eax &src[size]
  88. C ecx 0 to 7, representing respectively 7 to 0 limbs remaining
  89. C edx dst, next location to store
  90. subl $4, %ecx
  91. nop
  92. jns L(no4)
  93. movl -12(%eax,%ecx,4), %esi
  94. movl -8(%eax,%ecx,4), %edi
  95. xorl $GMP_NUMB_MASK, %esi
  96. xorl $GMP_NUMB_MASK, %edi
  97. movl %esi, (%edx)
  98. movl %edi, 4(%edx)
  99. movl -4(%eax,%ecx,4), %esi
  100. movl (%eax,%ecx,4), %edi
  101. xorl $GMP_NUMB_MASK, %esi
  102. xorl $GMP_NUMB_MASK, %edi
  103. movl %esi, 8(%edx)
  104. movl %edi, 12(%edx)
  105. addl $16, %edx
  106. addl $4, %ecx
  107. L(no4):
  108. subl $2, %ecx
  109. nop
  110. jns L(no2)
  111. movl -4(%eax,%ecx,4), %esi
  112. movl (%eax,%ecx,4), %edi
  113. xorl $GMP_NUMB_MASK, %esi
  114. xorl $GMP_NUMB_MASK, %edi
  115. movl %esi, (%edx)
  116. movl %edi, 4(%edx)
  117. addl $8, %edx
  118. addl $2, %ecx
  119. L(no2):
  120. popl %edi
  121. jnz L(done)
  122. movl -4(%eax), %ecx
  123. xorl $GMP_NUMB_MASK, %ecx
  124. popl %esi
  125. movl %ecx, (%edx)
  126. ret
  127. L(done):
  128. popl %esi
  129. ret
  130. EPILOGUE()