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

数学计算

开发平台:

Unix_Linux

  1. dnl  AMD K7 mpn_addmul_1/mpn_submul_1 -- add or subtract mpn multiple.
  2. dnl  Copyright 1999, 2000, 2001, 2002, 2005, 2008 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                           cycles/limb
  21. C P5:
  22. C P6 model 0-8,10-12)
  23. C P6 model 9  (Banias)
  24. C P6 model 13 (Dothan)
  25. C P4 model 0  (Willamette)
  26. C P4 model 1  (?)
  27. C P4 model 2  (Northwood)
  28. C P4 model 3  (Prescott)
  29. C P4 model 4  (Nocona)
  30. C K6:
  31. C K7:                            3.75
  32. C K8:
  33. C TODO
  34. C  * Improve feed-in and wind-down code.  We beat the old code for all n != 1,
  35. C    but lose by 2x for n == 1.
  36. ifdef(`OPERATION_addmul_1',`
  37.       define(`ADDSUB',        `add')
  38.       define(`func',  `mpn_addmul_1')
  39. ')
  40. ifdef(`OPERATION_submul_1',`
  41.       define(`ADDSUB',        `sub')
  42.       define(`func',  `mpn_submul_1')
  43. ')
  44. MULFUNC_PROLOGUE(mpn_addmul_1 mpn_submul_1)
  45. ASM_START()
  46. TEXT
  47. ALIGN(16)
  48. PROLOGUE(func)
  49. add $-16, %esp
  50. mov %ebp, (%esp)
  51. mov %ebx, 4(%esp)
  52. mov %esi, 8(%esp)
  53. mov %edi, 12(%esp)
  54. mov 20(%esp), %edi
  55. mov 24(%esp), %esi
  56. mov 28(%esp), %eax
  57. mov 32(%esp), %ecx
  58. mov %eax, %ebx
  59. shr $2, %eax
  60. mov %eax, 28(%esp)
  61. mov (%esi), %eax
  62. and $3, %ebx
  63. jz L(b0)
  64. cmp $2, %ebx
  65. jz L(b2)
  66. jg L(b3)
  67. L(b1): lea -4(%esi), %esi
  68. lea -4(%edi), %edi
  69. mul %ecx
  70. mov %eax, %ebx
  71. mov %edx, %ebp
  72. cmpl $0, 28(%esp)
  73. jz L(cj1)
  74. mov 8(%esi), %eax
  75. jmp L(1)
  76. L(b2): mul %ecx
  77. mov %eax, %ebp
  78. mov 4(%esi), %eax
  79. mov %edx, %ebx
  80. cmpl $0, 28(%esp)
  81. jne L(2)
  82. jmp L(cj2)
  83. L(b3): lea -12(%esi), %esi
  84. lea -12(%edi), %edi
  85. mul %ecx
  86. mov %eax, %ebx
  87. mov %edx, %ebp
  88. mov 16(%esi), %eax
  89. incl 28(%esp)
  90. jmp L(3)
  91. L(b0): lea -8(%esi), %esi
  92. lea -8(%edi), %edi
  93. mul %ecx
  94. mov %eax, %ebp
  95. mov 12(%esi), %eax
  96. mov %edx, %ebx
  97. jmp L(0)
  98. ALIGN(16)
  99. L(top): lea 16(%edi), %edi
  100. L(2): mul %ecx
  101. ADDSUB %ebp, 0(%edi)
  102. mov $0, %ebp
  103. adc %eax, %ebx
  104. mov 8(%esi), %eax
  105. adc %edx, %ebp
  106. L(1): mul %ecx
  107. ADDSUB %ebx, 4(%edi)
  108. mov $0, %ebx
  109. adc %eax, %ebp
  110. mov 12(%esi), %eax
  111. adc %edx, %ebx
  112. L(0): mul %ecx
  113. ADDSUB %ebp, 8(%edi)
  114. mov $0, %ebp
  115. adc %eax, %ebx
  116. adc %edx, %ebp
  117. mov 16(%esi), %eax
  118. L(3): mul %ecx
  119. ADDSUB %ebx, 12(%edi)
  120. adc %eax, %ebp
  121. mov 20(%esi), %eax
  122. lea 16(%esi), %esi
  123. mov $0, %ebx
  124. adc %edx, %ebx
  125. decl 28(%esp)
  126. jnz L(top)
  127. L(end): lea 16(%edi), %edi
  128. L(cj2): mul %ecx
  129. ADDSUB %ebp, (%edi)
  130. adc %eax, %ebx
  131. adc $0, %edx
  132. L(cj1): ADDSUB %ebx, 4(%edi)
  133. adc $0, %edx
  134. mov %edx, %eax
  135. mov (%esp), %ebp
  136. mov 4(%esp), %ebx
  137. mov 8(%esp), %esi
  138. mov 12(%esp), %edi
  139. add $16, %esp
  140. ret
  141. EPILOGUE()
  142. ASM_END()