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

数学计算

开发平台:

Unix_Linux

  1. dnl  Intel Pentium mpn_copyi -- copy limb vector, incrementing.
  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.25 cycles/limb
  20. C void mpn_copyi (mp_ptr dst, mp_srcptr src, mp_size_t size);
  21. C
  22. C Destination prefetching is done to avoid repeated write-throughs on lines
  23. C not already in L1.
  24. C
  25. C At least one of the src or dst pointer needs to be incremented rather than
  26. C using indexing, so that there's somewhere to put the loop control without
  27. C an AGI.  Incrementing one and not two lets us keep loop overhead to 2
  28. C cycles.  Making it the src pointer incremented avoids an AGI on the %ecx
  29. C subtracts in the finishup code.
  30. C
  31. C The block of finishup code is almost as big as the main loop itself, which
  32. C is unfortunate, but it's faster that way than with say rep movsl, by about
  33. C 10 cycles for instance on P55.
  34. C
  35. C There's nothing to be gained from MMX on P55, since it can do only one
  36. C movq load (or store) per cycle, so the throughput would be the same as the
  37. C code here (and even then only if src and dst have the same alignment mod
  38. C 8).
  39. defframe(PARAM_SIZE,12)
  40. defframe(PARAM_SRC, 8)
  41. defframe(PARAM_DST, 4)
  42. TEXT
  43. ALIGN(8)
  44. PROLOGUE(mpn_copyi)
  45. deflit(`FRAME',0)
  46. movl PARAM_SIZE, %ecx
  47. movl PARAM_DST, %edx
  48. pushl %ebx FRAME_pushl()
  49. pushl %esi FRAME_pushl()
  50. leal (%edx,%ecx,4), %edx C &dst[size-1]
  51. xorl $-1, %ecx C -size-1
  52. movl PARAM_SRC, %esi
  53. addl $8, %ecx C -size+7
  54. jns L(end)
  55. movl -28(%edx,%ecx,4), %eax C fetch destination cache line, dst[0]
  56. nop
  57. L(top):
  58. C eax scratch
  59. C ebx scratch
  60. C ecx counter, limbs, negative
  61. C edx &dst[size-1]
  62. C esi src, incrementing
  63. C edi
  64. C ebp
  65. movl (%edx,%ecx,4), %eax C fetch destination cache line
  66. addl $8, %ecx
  67. movl (%esi), %eax C read words pairwise
  68. movl 4(%esi), %ebx
  69. movl %eax, -60(%edx,%ecx,4) C store words pairwise
  70. movl %ebx, -56(%edx,%ecx,4)
  71. movl 8(%esi), %eax
  72. movl 12(%esi), %ebx
  73. movl %eax, -52(%edx,%ecx,4)
  74. movl %ebx, -48(%edx,%ecx,4)
  75. movl 16(%esi), %eax
  76. movl 20(%esi), %ebx
  77. movl %eax, -44(%edx,%ecx,4)
  78. movl %ebx, -40(%edx,%ecx,4)
  79. movl 24(%esi), %eax
  80. movl 28(%esi), %ebx
  81. movl %eax, -36(%edx,%ecx,4)
  82. movl %ebx, -32(%edx,%ecx,4)
  83. leal 32(%esi), %esi
  84. js L(top)
  85. L(end):
  86. C ecx 0 to 7, representing respectively 7 to 0 limbs remaining
  87. C esi src end
  88. C edx dst, next location to store
  89. subl $4, %ecx
  90. jns L(no4)
  91. movl (%esi), %eax
  92. movl 4(%esi), %ebx
  93. movl %eax, -12(%edx,%ecx,4)
  94. movl %ebx, -8(%edx,%ecx,4)
  95. movl 8(%esi), %eax
  96. movl 12(%esi), %ebx
  97. movl %eax, -4(%edx,%ecx,4)
  98. movl %ebx, (%edx,%ecx,4)
  99. addl $16, %esi
  100. addl $4, %ecx
  101. L(no4):
  102. subl $2, %ecx
  103. jns L(no2)
  104. movl (%esi), %eax
  105. movl 4(%esi), %ebx
  106. movl %eax, -4(%edx,%ecx,4)
  107. movl %ebx, (%edx,%ecx,4)
  108. addl $8, %esi
  109. addl $2, %ecx
  110. L(no2):
  111. jnz L(done)
  112. movl (%esi), %eax
  113. movl %eax, -4(%edx,%ecx,4) C risk of cache bank clash here
  114. L(done):
  115. popl %esi
  116. popl %ebx
  117. ret
  118. EPILOGUE()