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

数学计算

开发平台:

Unix_Linux

  1. dnl  Intel Pentium-4 mpn_addlsh1_n -- mpn x+2*y.
  2. dnl  Copyright 2001, 2002, 2003, 2004, 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          cycles/limb (approx)
  20. C          dst!=src1,2  dst==src1  dst==src2
  21. C P4 m2:      4.5         ?7.25      ?6.75
  22. C P4 m3:      5.3         ?      ?
  23. C mp_limb_t mpn_addlsh1_n (mp_ptr dst, mp_srcptr src1, mp_srcptr src2,
  24. C                          mp_size_t size);
  25. C
  26. C The slightly strange combination of indexing and pointer incrementing
  27. C that's used seems to work best.  Not sure why, but %ecx,4 with src1 and/or
  28. C src2 is a slowdown.
  29. C
  30. C The dependent chain is simply the paddq of x+2*y to the previous carry,
  31. C then psrlq to get the new carry.  That makes 4 c/l the target speed, which
  32. C is almost achieved for separate src/dst but when src==dst the write
  33. C combining anomalies slow it down.
  34. defframe(PARAM_SIZE, 16)
  35. defframe(PARAM_SRC2, 12)
  36. defframe(PARAM_SRC1, 8)
  37. defframe(PARAM_DST,  4)
  38. dnl  re-use parameter space
  39. define(SAVE_EBX,`PARAM_SRC1')
  40. TEXT
  41. ALIGN(8)
  42. PROLOGUE(mpn_addlsh1_n)
  43. deflit(`FRAME',0)
  44. movl PARAM_SRC1, %eax
  45. movl %ebx, SAVE_EBX
  46. movl PARAM_SRC2, %ebx
  47. pxor %mm0, %mm0 C initial carry
  48. movl PARAM_DST, %edx
  49. movl PARAM_SIZE, %ecx
  50. leal (%edx,%ecx,4), %edx C dst end
  51. negl %ecx C -size
  52. L(top):
  53. C eax src1 end
  54. C ebx src2 end
  55. C ecx counter, limbs, negative
  56. C edx dst end
  57. C mm0 carry
  58. movd (%eax), %mm1
  59. movd (%ebx), %mm2
  60. psrlq $32, %mm0
  61. leal 4(%eax), %eax
  62. leal 4(%ebx), %ebx
  63. paddq %mm2, %mm1
  64. paddq %mm2, %mm1
  65. paddq %mm1, %mm0
  66. movd %mm0, (%edx,%ecx,4)
  67. addl $1, %ecx
  68. jnz L(top)
  69. psrlq $32, %mm0
  70. movl SAVE_EBX, %ebx
  71. movd %mm0, %eax
  72. emms
  73. ret
  74. EPILOGUE()