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

数学计算

开发平台:

Unix_Linux

  1. dnl  x86 __gmpn_addmul_1 (for 386 and 486) -- Multiply a limb vector with a
  2. dnl  limb and add the result to a second limb vector.
  3. dnl  Copyright 1992, 1994, 1997, 1999, 2000, 2001, 2002, 2005 Free Software
  4. dnl  Foundation, Inc.
  5. dnl
  6. dnl  This file is part of the GNU MP Library.
  7. dnl
  8. dnl  The GNU MP Library is free software; you can redistribute it and/or
  9. dnl  modify it under the terms of the GNU Lesser General Public License as
  10. dnl  published by the Free Software Foundation; either version 3 of the
  11. dnl  License, or (at your option) any later version.
  12. dnl
  13. dnl  The GNU MP Library is distributed in the hope that it will be useful,
  14. dnl  but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. dnl  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16. dnl  Lesser General Public License for more details.
  17. dnl
  18. dnl  You should have received a copy of the GNU Lesser General Public License
  19. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  20. include(`../config.m4')
  21. C                           cycles/limb
  22. C P5:                           14.75
  23. C P6 model 0-8,10-12)            7.5
  24. C P6 model 9  (Banias)
  25. C P6 model 13 (Dothan)           6.75
  26. C P4 model 0  (Willamette)      24.0
  27. C P4 model 1  (?)               24.0
  28. C P4 model 2  (Northwood)       24.0
  29. C P4 model 3  (Prescott)
  30. C P4 model 4  (Nocona)
  31. C K6:                           12.5
  32. C K7:                            5.25
  33. C K8:
  34. ifdef(`OPERATION_addmul_1',`
  35.       define(M4_inst,        addl)
  36.       define(M4_function_1,  mpn_addmul_1)
  37. ',`ifdef(`OPERATION_submul_1',`
  38.       define(M4_inst,        subl)
  39.       define(M4_function_1,  mpn_submul_1)
  40. ',`m4_error(`Need OPERATION_addmul_1 or OPERATION_submul_1
  41. ')')')
  42. MULFUNC_PROLOGUE(mpn_addmul_1 mpn_submul_1)
  43. C mp_limb_t M4_function_1 (mp_ptr dst, mp_srcptr src, mp_size_t size,
  44. C                          mp_limb_t mult);
  45. define(PARAM_MULTIPLIER, `FRAME+16(%esp)')
  46. define(PARAM_SIZE,       `FRAME+12(%esp)')
  47. define(PARAM_SRC,        `FRAME+8(%esp)')
  48. define(PARAM_DST,        `FRAME+4(%esp)')
  49. TEXT
  50. ALIGN(8)
  51. PROLOGUE(M4_function_1)
  52. deflit(`FRAME',0)
  53. pushl %edi
  54. pushl %esi
  55. pushl %ebx
  56. pushl %ebp
  57. deflit(`FRAME',16)
  58. movl PARAM_DST,%edi
  59. movl PARAM_SRC,%esi
  60. movl PARAM_SIZE,%ecx
  61. xorl %ebx,%ebx
  62. andl $3,%ecx
  63. jz L(end0)
  64. L(oop0):
  65. movl (%esi),%eax
  66. mull PARAM_MULTIPLIER
  67. leal 4(%esi),%esi
  68. addl %ebx,%eax
  69. movl $0,%ebx
  70. adcl %ebx,%edx
  71. M4_inst %eax,(%edi)
  72. adcl %edx,%ebx C propagate carry into cylimb
  73. leal 4(%edi),%edi
  74. decl %ecx
  75. jnz L(oop0)
  76. L(end0):
  77. movl PARAM_SIZE,%ecx
  78. shrl $2,%ecx
  79. jz L(end)
  80. ALIGN(8)
  81. L(oop): movl (%esi),%eax
  82. mull PARAM_MULTIPLIER
  83. addl %eax,%ebx
  84. movl $0,%ebp
  85. adcl %edx,%ebp
  86. movl 4(%esi),%eax
  87. mull PARAM_MULTIPLIER
  88. M4_inst %ebx,(%edi)
  89. adcl %eax,%ebp C new lo + cylimb
  90. movl $0,%ebx
  91. adcl %edx,%ebx
  92. movl 8(%esi),%eax
  93. mull PARAM_MULTIPLIER
  94. M4_inst %ebp,4(%edi)
  95. adcl %eax,%ebx C new lo + cylimb
  96. movl $0,%ebp
  97. adcl %edx,%ebp
  98. movl 12(%esi),%eax
  99. mull PARAM_MULTIPLIER
  100. M4_inst %ebx,8(%edi)
  101. adcl %eax,%ebp C new lo + cylimb
  102. movl $0,%ebx
  103. adcl %edx,%ebx
  104. M4_inst %ebp,12(%edi)
  105. adcl $0,%ebx C propagate carry into cylimb
  106. leal 16(%esi),%esi
  107. leal 16(%edi),%edi
  108. decl %ecx
  109. jnz L(oop)
  110. L(end): movl %ebx,%eax
  111. popl %ebp
  112. popl %ebx
  113. popl %esi
  114. popl %edi
  115. ret
  116. EPILOGUE()