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

数学计算

开发平台:

Unix_Linux

  1. dnl  Intel Pentium mpn_mul_basecase -- mpn by mpn multiplication.
  2. dnl  Copyright 1996, 1998, 1999, 2000, 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 P5: 14.2 cycles/crossproduct (approx)
  20. C void mpn_mul_basecase (mp_ptr wp,
  21. C                        mp_srcptr xp, mp_size_t xsize,
  22. C                        mp_srcptr yp, mp_size_t ysize);
  23. defframe(PARAM_YSIZE, 20)
  24. defframe(PARAM_YP,    16)
  25. defframe(PARAM_XSIZE, 12)
  26. defframe(PARAM_XP,    8)
  27. defframe(PARAM_WP,    4)
  28. defframe(VAR_COUNTER, -4)
  29. TEXT
  30. ALIGN(8)
  31. PROLOGUE(mpn_mul_basecase)
  32. pushl %eax C dummy push for allocating stack slot
  33. pushl %esi
  34. pushl %ebp
  35. pushl %edi
  36. deflit(`FRAME',16)
  37. movl PARAM_XP,%esi
  38. movl PARAM_WP,%edi
  39. movl PARAM_YP,%ebp
  40. movl (%esi),%eax C load xp[0]
  41. mull (%ebp) C multiply by yp[0]
  42. movl %eax,(%edi) C store to wp[0]
  43. movl PARAM_XSIZE,%ecx C xsize
  44. decl %ecx C If xsize = 1, ysize = 1 too
  45. jz L(done)
  46. movl PARAM_XSIZE,%eax
  47. pushl %ebx
  48. FRAME_pushl()
  49. movl %edx,%ebx
  50. leal (%esi,%eax,4),%esi C make xp point at end
  51. leal (%edi,%eax,4),%edi C offset wp by xsize
  52. negl %ecx C negate j size/index for inner loop
  53. xorl %eax,%eax C clear carry
  54. ALIGN(8)
  55. L(oop1): adcl $0,%ebx
  56. movl (%esi,%ecx,4),%eax C load next limb at xp[j]
  57. mull (%ebp)
  58. addl %ebx,%eax
  59. movl %eax,(%edi,%ecx,4)
  60. incl %ecx
  61. movl %edx,%ebx
  62. jnz L(oop1)
  63. adcl $0,%ebx
  64. movl PARAM_YSIZE,%eax
  65. movl %ebx,(%edi) C most significant limb of product
  66. addl $4,%edi C increment wp
  67. decl %eax
  68. jz L(skip)
  69. movl %eax,VAR_COUNTER C set index i to ysize
  70. L(outer):
  71. addl $4,%ebp C make ebp point to next y limb
  72. movl PARAM_XSIZE,%ecx
  73. negl %ecx
  74. xorl %ebx,%ebx
  75. C code at 0x61 here, close enough to aligned
  76. L(oop2):
  77. adcl $0,%ebx
  78. movl (%esi,%ecx,4),%eax
  79. mull (%ebp)
  80. addl %ebx,%eax
  81. movl (%edi,%ecx,4),%ebx
  82. adcl $0,%edx
  83. addl %eax,%ebx
  84. movl %ebx,(%edi,%ecx,4)
  85. incl %ecx
  86. movl %edx,%ebx
  87. jnz L(oop2)
  88. adcl $0,%ebx
  89. movl %ebx,(%edi)
  90. addl $4,%edi
  91. movl VAR_COUNTER,%eax
  92. decl %eax
  93. movl %eax,VAR_COUNTER
  94. jnz L(outer)
  95. L(skip):
  96. popl %ebx
  97. popl %edi
  98. popl %ebp
  99. popl %esi
  100. addl $4,%esp
  101. ret
  102. L(done):
  103. movl %edx,4(%edi) C store to wp[1]
  104. popl %edi
  105. popl %ebp
  106. popl %esi
  107. popl %eax C dummy pop for deallocating stack slot
  108. ret
  109. EPILOGUE()