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

数学计算

开发平台:

Unix_Linux

  1. dnl  Intel Pentium mpn_mul_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: 12.0 cycles/limb
  21. C mp_limb_t mpn_mul_1 (mp_ptr dst, mp_srcptr src, mp_size_t size,
  22. C                      mp_limb_t multiplier);
  23. C mp_limb_t mpn_mul_1c (mp_ptr dst, mp_srcptr src, mp_size_t size,
  24. C                       mp_limb_t multiplier, mp_limb_t carry);
  25. C
  26. defframe(PARAM_CARRY,     20)
  27. defframe(PARAM_MULTIPLIER,16)
  28. defframe(PARAM_SIZE,      12)
  29. defframe(PARAM_SRC,       8)
  30. defframe(PARAM_DST,       4)
  31. TEXT
  32. ALIGN(8)
  33. PROLOGUE(mpn_mul_1c)
  34. deflit(`FRAME',0)
  35. movl PARAM_CARRY, %ecx
  36. pushl %esi FRAME_pushl()
  37. jmp L(start_1c)
  38. EPILOGUE()
  39. ALIGN(8)
  40. PROLOGUE(mpn_mul_1)
  41. deflit(`FRAME',0)
  42. xorl %ecx, %ecx
  43. pushl %esi FRAME_pushl()
  44. L(start_1c):
  45. movl PARAM_SRC, %esi
  46. movl PARAM_SIZE, %eax
  47. shrl %eax
  48. jnz L(two_or_more)
  49. C one limb only
  50. movl (%esi), %eax
  51. mull PARAM_MULTIPLIER
  52. addl %eax, %ecx
  53. movl PARAM_DST, %eax
  54. adcl $0, %edx
  55. popl %esi
  56. movl %ecx, (%eax)
  57. movl %edx, %eax
  58. ret
  59. L(two_or_more):
  60. C eax size/2
  61. C ebx
  62. C ecx carry
  63. C edx
  64. C esi src
  65. C edi
  66. C ebp
  67. pushl %edi FRAME_pushl()
  68. pushl %ebx FRAME_pushl()
  69. movl PARAM_DST, %edi
  70. leal -1(%eax), %ebx C size/2-1
  71. notl %ebx C -size, preserve carry
  72. leal (%esi,%eax,8), %esi C src end
  73. leal (%edi,%eax,8), %edi C dst end
  74. pushl %ebp FRAME_pushl()
  75. jnc L(top)
  76. C size was odd, process one limb separately
  77. movl (%esi,%ebx,8), %eax
  78. addl $4, %esi
  79. mull PARAM_MULTIPLIER
  80. addl %ecx, %eax
  81. movl %edx, %ecx
  82. movl %eax, (%edi,%ebx,8)
  83. leal 4(%edi), %edi
  84. L(top):
  85. C eax
  86. C ebx counter, negative
  87. C ecx carry
  88. C edx
  89. C esi src end
  90. C edi dst end
  91. C ebp
  92. adcl $0, %ecx
  93. movl (%esi,%ebx,8), %eax
  94. mull PARAM_MULTIPLIER
  95. movl %edx, %ebp
  96. addl %eax, %ecx
  97. adcl $0, %ebp
  98. movl 4(%esi,%ebx,8), %eax
  99. mull PARAM_MULTIPLIER
  100. movl %ecx, (%edi,%ebx,8)
  101. addl %ebp, %eax
  102. movl %eax, 4(%edi,%ebx,8)
  103. incl %ebx
  104. movl %edx, %ecx
  105. jnz L(top)
  106. adcl $0, %ecx
  107. popl %ebp
  108. movl %ecx, %eax
  109. popl %ebx
  110. popl %edi
  111. popl %esi
  112. ret
  113. EPILOGUE()