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

数学计算

开发平台:

Unix_Linux

  1. dnl  Intel Pentium mpn_addmul_1 -- mpn by limb multiplication.
  2. dnl  Copyright 1992, 1994, 1996, 1999, 2000, 2002 Free Software Foundation,
  3. dnl  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. include(`../config.m4')
  20. C P5: 14.0 cycles/limb
  21. ifdef(`OPERATION_addmul_1', `
  22.       define(M4_inst,        addl)
  23.       define(M4_function_1,  mpn_addmul_1)
  24.       define(M4_function_1c, mpn_addmul_1c)
  25. ',`ifdef(`OPERATION_submul_1', `
  26.       define(M4_inst,        subl)
  27.       define(M4_function_1,  mpn_submul_1)
  28.       define(M4_function_1c, mpn_submul_1c)
  29. ',`m4_error(`Need OPERATION_addmul_1 or OPERATION_submul_1
  30. ')')')
  31. MULFUNC_PROLOGUE(mpn_addmul_1 mpn_addmul_1c mpn_submul_1 mpn_submul_1c)
  32. C mp_limb_t mpn_addmul_1 (mp_ptr dst, mp_srcptr src, mp_size_t size,
  33. C                         mp_limb_t mult);
  34. C mp_limb_t mpn_addmul_1c (mp_ptr dst, mp_srcptr src, mp_size_t size,
  35. C                          mp_limb_t mult, mp_limb_t carry);
  36. C
  37. C mp_limb_t mpn_submul_1 (mp_ptr dst, mp_srcptr src, mp_size_t size,
  38. C                         mp_limb_t mult);
  39. C mp_limb_t mpn_submul_1c (mp_ptr dst, mp_srcptr src, mp_size_t size,
  40. C                          mp_limb_t mult, mp_limb_t carry);
  41. C
  42. defframe(PARAM_CARRY,     20)
  43. defframe(PARAM_MULTIPLIER,16)
  44. defframe(PARAM_SIZE,      12)
  45. defframe(PARAM_SRC,       8)
  46. defframe(PARAM_DST,       4)
  47. TEXT
  48. ALIGN(8)
  49. PROLOGUE(M4_function_1c)
  50. deflit(`FRAME',0)
  51. movl PARAM_CARRY, %ecx
  52. pushl %esi FRAME_pushl()
  53. jmp L(start_1c)
  54. EPILOGUE()
  55. ALIGN(8)
  56. PROLOGUE(M4_function_1)
  57. deflit(`FRAME',0)
  58. xorl %ecx, %ecx
  59. pushl %esi FRAME_pushl()
  60. L(start_1c):
  61. movl PARAM_SRC, %esi
  62. movl PARAM_SIZE, %eax
  63. pushl %edi FRAME_pushl()
  64. pushl %ebx FRAME_pushl()
  65. movl PARAM_DST, %edi
  66. leal -1(%eax), %ebx C size-1
  67. leal (%esi,%eax,4), %esi
  68. xorl $-1, %ebx C -size, and clear carry
  69. leal (%edi,%eax,4), %edi
  70. L(top):
  71. C eax
  72. C ebx counter, negative
  73. C ecx carry
  74. C edx
  75. C esi src end
  76. C edi dst end
  77. C ebp
  78. adcl $0, %ecx
  79. movl (%esi,%ebx,4), %eax
  80. mull PARAM_MULTIPLIER
  81. addl %ecx, %eax
  82. movl (%edi,%ebx,4), %ecx
  83. adcl $0, %edx
  84. M4_inst %eax, %ecx
  85. movl %ecx, (%edi,%ebx,4)
  86. incl %ebx
  87. movl %edx, %ecx
  88. jnz L(top)
  89. adcl $0, %ecx
  90. popl %ebx
  91. movl %ecx, %eax
  92. popl %edi
  93. popl %esi
  94. ret
  95. EPILOGUE()