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

数学计算

开发平台:

Unix_Linux

  1. dnl  AMD K7 mpn_copyd -- copy limb vector, decrementing.
  2. dnl  Copyright 1999, 2000, 2002 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    alignment dst/src, A=0mod8 N=4mod8
  20. C       A/A   A/N   N/A   N/N
  21. C K7    0.75  1.0   1.0   0.75
  22. C void mpn_copyd (mp_ptr dst, mp_srcptr src, mp_size_t size);
  23. C
  24. C The various comments in mpn/x86/k7/copyi.asm apply here too.
  25. defframe(PARAM_SIZE,12)
  26. defframe(PARAM_SRC, 8)
  27. defframe(PARAM_DST, 4)
  28. deflit(`FRAME',0)
  29. dnl  parameter space reused
  30. define(SAVE_EBX,`PARAM_SIZE')
  31. define(SAVE_ESI,`PARAM_SRC')
  32. dnl  minimum 5 since the unrolled code can't handle less than 5
  33. deflit(UNROLL_THRESHOLD, 5)
  34. TEXT
  35. ALIGN(32)
  36. PROLOGUE(mpn_copyd)
  37. movl PARAM_SIZE, %ecx
  38. movl %ebx, SAVE_EBX
  39. movl PARAM_SRC, %eax
  40. movl PARAM_DST, %edx
  41. cmpl $UNROLL_THRESHOLD, %ecx
  42. jae L(unroll)
  43. orl %ecx, %ecx
  44. jz L(simple_done)
  45. L(simple):
  46. C eax src
  47. C ebx scratch
  48. C ecx counter
  49. C edx dst
  50. C
  51. C this loop is 2 cycles/limb
  52. movl -4(%eax,%ecx,4), %ebx
  53. movl %ebx, -4(%edx,%ecx,4)
  54. decl %ecx
  55. jnz L(simple)
  56. L(simple_done):
  57. movl SAVE_EBX, %ebx
  58. ret
  59. L(unroll):
  60. movl %esi, SAVE_ESI
  61. leal (%eax,%ecx,4), %ebx
  62. leal (%edx,%ecx,4), %esi
  63. andl %esi, %ebx
  64. movl SAVE_ESI, %esi
  65. subl $4, %ecx C size-4
  66. testl $4, %ebx   C testl to pad code closer to 16 bytes for L(top)
  67. jz L(aligned)
  68. C both src and dst unaligned, process one limb to align them
  69. movl 12(%eax,%ecx,4), %ebx
  70. movl %ebx, 12(%edx,%ecx,4)
  71. decl %ecx
  72. L(aligned):
  73. ALIGN(16)
  74. L(top):
  75. C eax src
  76. C ebx
  77. C ecx counter, limbs
  78. C edx dst
  79. movq 8(%eax,%ecx,4), %mm0
  80. movq (%eax,%ecx,4), %mm1
  81. subl $4, %ecx
  82. movq %mm0, 16+8(%edx,%ecx,4)
  83. movq %mm1, 16(%edx,%ecx,4)
  84. jns L(top)
  85. C now %ecx is -4 to -1 representing respectively 0 to 3 limbs remaining
  86. testb $2, %cl
  87. jz L(finish_not_two)
  88. movq 8(%eax,%ecx,4), %mm0
  89. movq %mm0, 8(%edx,%ecx,4)
  90. L(finish_not_two):
  91. testb $1, %cl
  92. jz L(done)
  93. movl (%eax), %ebx
  94. movl %ebx, (%edx)
  95. L(done):
  96. movl SAVE_EBX, %ebx
  97. emms
  98. ret
  99. EPILOGUE()