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

数学计算

开发平台:

Unix_Linux

  1. dnl  x86 mpn_add_n/mpn_sub_n -- mpn addition and subtraction.
  2. dnl  Copyright 1992, 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software
  3. dnl  Foundation, 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:   3.375
  22. C P6:   3.125
  23. C K6:   3.5
  24. C K7:   2.25
  25. C P4:   8.75
  26. ifdef(`OPERATION_add_n',`
  27. define(M4_inst,        adcl)
  28. define(M4_function_n,  mpn_add_n)
  29. define(M4_function_nc, mpn_add_nc)
  30. ',`ifdef(`OPERATION_sub_n',`
  31. define(M4_inst,        sbbl)
  32. define(M4_function_n,  mpn_sub_n)
  33. define(M4_function_nc, mpn_sub_nc)
  34. ',`m4_error(`Need OPERATION_add_n or OPERATION_sub_n
  35. ')')')
  36. MULFUNC_PROLOGUE(mpn_add_n mpn_add_nc mpn_sub_n mpn_sub_nc)
  37. C mp_limb_t M4_function_n (mp_ptr dst, mp_srcptr src1, mp_srcptr src2,
  38. C                          mp_size_t size);
  39. C mp_limb_t M4_function_nc (mp_ptr dst, mp_srcptr src1, mp_srcptr src2,
  40. C                     mp_size_t size, mp_limb_t carry);
  41. defframe(PARAM_CARRY,20)
  42. defframe(PARAM_SIZE, 16)
  43. defframe(PARAM_SRC2, 12)
  44. defframe(PARAM_SRC1, 8)
  45. defframe(PARAM_DST,  4)
  46. TEXT
  47. ALIGN(8)
  48. PROLOGUE(M4_function_nc)
  49. deflit(`FRAME',0)
  50. pushl %edi FRAME_pushl()
  51. pushl %esi FRAME_pushl()
  52. movl PARAM_DST,%edi
  53. movl PARAM_SRC1,%esi
  54. movl PARAM_SRC2,%edx
  55. movl PARAM_SIZE,%ecx
  56. movl %ecx,%eax
  57. shrl $3,%ecx C compute count for unrolled loop
  58. negl %eax
  59. andl $7,%eax C get index where to start loop
  60. jz L(oopgo) C necessary special case for 0
  61. incl %ecx C adjust loop count
  62. shll $2,%eax C adjustment for pointers...
  63. subl %eax,%edi C ... since they are offset ...
  64. subl %eax,%esi C ... by a constant when we ...
  65. subl %eax,%edx C ... enter the loop
  66. shrl $2,%eax C restore previous value
  67. ifdef(`PIC',`
  68. C Calculate start address in loop for PIC.  Due to limitations in
  69. C old gas, LF(M4_function_n,oop)-L(0a)-3 cannot be put into the leal
  70. call L(0a)
  71. L(0a): leal (%eax,%eax,8),%eax
  72. addl (%esp),%eax
  73. addl $L(oop)-L(0a)-3,%eax
  74. addl $4,%esp
  75. ',`
  76. C Calculate start address in loop for non-PIC.
  77. leal L(oop)-3(%eax,%eax,8),%eax
  78. ')
  79. C These lines initialize carry from the 5th parameter.  Should be
  80. C possible to simplify.
  81. pushl %ebp FRAME_pushl()
  82. movl PARAM_CARRY,%ebp
  83. shrl $1,%ebp C shift bit 0 into carry
  84. popl %ebp FRAME_popl()
  85. jmp *%eax C jump into loop
  86. EPILOGUE()
  87. ALIGN(16)
  88. PROLOGUE(M4_function_n)
  89. deflit(`FRAME',0)
  90. pushl %edi FRAME_pushl()
  91. pushl %esi FRAME_pushl()
  92. movl PARAM_DST,%edi
  93. movl PARAM_SRC1,%esi
  94. movl PARAM_SRC2,%edx
  95. movl PARAM_SIZE,%ecx
  96. movl %ecx,%eax
  97. shrl $3,%ecx C compute count for unrolled loop
  98. negl %eax
  99. andl $7,%eax C get index where to start loop
  100. jz L(oop) C necessary special case for 0
  101. incl %ecx C adjust loop count
  102. shll $2,%eax C adjustment for pointers...
  103. subl %eax,%edi C ... since they are offset ...
  104. subl %eax,%esi C ... by a constant when we ...
  105. subl %eax,%edx C ... enter the loop
  106. shrl $2,%eax C restore previous value
  107. ifdef(`PIC',`
  108. C Calculate start address in loop for PIC.  Due to limitations in
  109. C some assemblers, L(oop)-L(0b)-3 cannot be put into the leal
  110. call L(0b)
  111. L(0b): leal (%eax,%eax,8),%eax
  112. addl (%esp),%eax
  113. addl $L(oop)-L(0b)-3,%eax
  114. addl $4,%esp
  115. ',`
  116. C Calculate start address in loop for non-PIC.
  117. leal L(oop)-3(%eax,%eax,8),%eax
  118. ')
  119. jmp *%eax C jump into loop
  120. L(oopgo):
  121. pushl %ebp FRAME_pushl()
  122. movl PARAM_CARRY,%ebp
  123. shrl $1,%ebp C shift bit 0 into carry
  124. popl %ebp FRAME_popl()
  125. ALIGN(16)
  126. L(oop): movl (%esi),%eax
  127. M4_inst (%edx),%eax
  128. movl %eax,(%edi)
  129. movl 4(%esi),%eax
  130. M4_inst 4(%edx),%eax
  131. movl %eax,4(%edi)
  132. movl 8(%esi),%eax
  133. M4_inst 8(%edx),%eax
  134. movl %eax,8(%edi)
  135. movl 12(%esi),%eax
  136. M4_inst 12(%edx),%eax
  137. movl %eax,12(%edi)
  138. movl 16(%esi),%eax
  139. M4_inst 16(%edx),%eax
  140. movl %eax,16(%edi)
  141. movl 20(%esi),%eax
  142. M4_inst 20(%edx),%eax
  143. movl %eax,20(%edi)
  144. movl 24(%esi),%eax
  145. M4_inst 24(%edx),%eax
  146. movl %eax,24(%edi)
  147. movl 28(%esi),%eax
  148. M4_inst 28(%edx),%eax
  149. movl %eax,28(%edi)
  150. leal 32(%edi),%edi
  151. leal 32(%esi),%esi
  152. leal 32(%edx),%edx
  153. decl %ecx
  154. jnz L(oop)
  155. sbbl %eax,%eax
  156. negl %eax
  157. popl %esi
  158. popl %edi
  159. ret
  160. EPILOGUE()