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

数学计算

开发平台:

Unix_Linux

  1. dnl  Intel Pentium-4 mpn_sub_n -- mpn subtraction.
  2. dnl  Copyright 2001, 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 P4 Willamette, Northwood: 4.0 cycles/limb if dst!=src1 and dst!=src2
  20. C     6.0 cycles/limb if dst==src1 or dst==src2
  21. C P4 Prescott:     >= 5 cycles/limb
  22. C mp_limb_t mpn_sub_n (mp_ptr dst, mp_srcptr src1, mp_srcptr src2,
  23. C                      mp_size_t size);
  24. C mp_limb_t mpn_sub_nc (mp_ptr dst, mp_srcptr src1, mp_srcptr src2,
  25. C                       mp_size_t size, mp_limb_t carry);
  26. C
  27. C The main loop code is 2x unrolled so that the carry bit can alternate
  28. C between mm0 and mm1.
  29. defframe(PARAM_CARRY,20)
  30. defframe(PARAM_SIZE, 16)
  31. defframe(PARAM_SRC2, 12)
  32. defframe(PARAM_SRC1, 8)
  33. defframe(PARAM_DST,  4)
  34. dnl  re-use parameter space
  35. define(SAVE_EBX,`PARAM_SRC1')
  36. TEXT
  37. ALIGN(8)
  38. PROLOGUE(mpn_sub_nc)
  39. deflit(`FRAME',0)
  40. movd PARAM_CARRY, %mm0
  41. jmp L(start_nc)
  42. EPILOGUE()
  43. ALIGN(8)
  44. PROLOGUE(mpn_sub_n)
  45. deflit(`FRAME',0)
  46. pxor %mm0, %mm0
  47. L(start_nc):
  48. movl PARAM_SRC1, %eax
  49. movl %ebx, SAVE_EBX
  50. movl PARAM_SRC2, %ebx
  51. movl PARAM_DST, %edx
  52. movl PARAM_SIZE, %ecx
  53. leal (%eax,%ecx,4), %eax C src1 end
  54. leal (%ebx,%ecx,4), %ebx C src2 end
  55. leal (%edx,%ecx,4), %edx C dst end
  56. negl %ecx C -size
  57. L(top):
  58. C eax src1 end
  59. C ebx src2 end
  60. C ecx counter, limbs, negative
  61. C edx dst end
  62. C mm0 carry bit
  63. movd (%eax,%ecx,4), %mm1
  64. movd (%ebx,%ecx,4), %mm2
  65. psubq %mm2, %mm1
  66. psubq %mm0, %mm1
  67. movd %mm1, (%edx,%ecx,4)
  68. psrlq $63, %mm1
  69. addl $1, %ecx
  70. jz L(done_mm1)
  71. movd (%eax,%ecx,4), %mm0
  72. movd (%ebx,%ecx,4), %mm2
  73. psubq %mm2, %mm0
  74. psubq %mm1, %mm0
  75. movd %mm0, (%edx,%ecx,4)
  76. psrlq $63, %mm0
  77. addl $1, %ecx
  78. jnz L(top)
  79. movd %mm0, %eax
  80. movl SAVE_EBX, %ebx
  81. emms
  82. ret
  83. L(done_mm1):
  84. movd %mm1, %eax
  85. movl SAVE_EBX, %ebx
  86. emms
  87. ret
  88. EPILOGUE()