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

数学计算

开发平台:

Unix_Linux

  1. dnl  Pentium-4 mpn_copyi -- copy limb vector, incrementing.
  2. dnl
  3. dnl  Copyright 1999, 2000, 2001 Free Software Foundation, Inc.
  4. dnl
  5. dnl  This file is part of the GNU MP Library.
  6. dnl
  7. dnl  The GNU MP Library is free software; you can redistribute it and/or
  8. dnl  modify it under the terms of the GNU Lesser General Public License as
  9. dnl  published by the Free Software Foundation; either version 3 of the
  10. dnl  License, or (at your option) any later version.
  11. dnl
  12. dnl  The GNU MP Library is distributed in the hope that it will be useful,
  13. dnl  but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. dnl  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15. dnl  Lesser General Public License for more details.
  16. dnl
  17. dnl  You should have received a copy of the GNU Lesser General Public License
  18. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  19. dnl  The rep/movsl is very slow for small blocks on pentium4.  Its startup
  20. dnl  time seems to be about 110 cycles.  It then copies at a rate of one
  21. dnl  limb per cycle.  We therefore fall back to an open-coded 2 c/l copying
  22. dnl  loop for smaller sizes.
  23. dnl  Ultimately, we may want to use 64-bit movd or 128-bit movdqu in some
  24. dnl  nifty unrolled arrangement.  Clearly, that could reach much higher
  25. dnl  speeds, at least for large blocks.
  26. include(`../config.m4')
  27. defframe(PARAM_SIZE, 12)
  28. defframe(PARAM_SRC, 8)
  29. defframe(PARAM_DST,  4)
  30. TEXT
  31. ALIGN(8)
  32. PROLOGUE(mpn_copyi)
  33. deflit(`FRAME',0)
  34. movl PARAM_SIZE, %ecx
  35. cmpl $150, %ecx
  36. jg L(replmovs)
  37. movl PARAM_SRC, %eax
  38. movl PARAM_DST, %edx
  39. movl %ebx, PARAM_SIZE
  40. testl %ecx, %ecx
  41. jz L(end)
  42. L(loop):
  43. movl (%eax), %ebx
  44. leal 4(%eax), %eax
  45. addl $-1, %ecx
  46. movl %ebx, (%edx)
  47. leal 4(%edx), %edx
  48. jnz L(loop)
  49. L(end):
  50. movl PARAM_SIZE, %ebx
  51. ret
  52. L(replmovs):
  53. cld C better safe than sorry, see mpn/x86/README
  54. movl %esi, %eax
  55. movl PARAM_SRC, %esi
  56. movl %edi, %edx
  57. movl PARAM_DST, %edi
  58. rep
  59. movsl
  60. movl %eax, %esi
  61. movl %edx, %edi
  62. ret
  63. EPILOGUE()