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

数学计算

开发平台:

Unix_Linux

  1. dnl  Intel Pentium mpn_add_n/mpn_sub_n -- mpn addition and subtraction.
  2. dnl  Copyright 1992, 1994, 1995, 1996, 1999, 2000, 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 P5: 2.375 cycles/limb
  21. ifdef(`OPERATION_add_n',`
  22. define(M4_inst,        adcl)
  23. define(M4_function_n,  mpn_add_n)
  24. define(M4_function_nc, mpn_add_nc)
  25. ',`ifdef(`OPERATION_sub_n',`
  26. define(M4_inst,        sbbl)
  27. define(M4_function_n,  mpn_sub_n)
  28. define(M4_function_nc, mpn_sub_nc)
  29. ',`m4_error(`Need OPERATION_add_n or OPERATION_sub_n
  30. ')')')
  31. MULFUNC_PROLOGUE(mpn_add_n mpn_add_nc mpn_sub_n mpn_sub_nc)
  32. C mp_limb_t M4_function_n (mp_ptr dst, mp_srcptr src1, mp_srcptr src2,
  33. C                          mp_size_t size);
  34. C mp_limb_t M4_function_nc (mp_ptr dst, mp_srcptr src1, mp_srcptr src2,
  35. C                           mp_size_t size, mp_limb_t carry);
  36. defframe(PARAM_CARRY,20)
  37. defframe(PARAM_SIZE, 16)
  38. defframe(PARAM_SRC2, 12)
  39. defframe(PARAM_SRC1, 8)
  40. defframe(PARAM_DST,  4)
  41. TEXT
  42. ALIGN(8)
  43. PROLOGUE(M4_function_nc)
  44. pushl %edi
  45. pushl %esi
  46. pushl %ebx
  47. pushl %ebp
  48. deflit(`FRAME',16)
  49. movl PARAM_DST,%edi
  50. movl PARAM_SRC1,%esi
  51. movl PARAM_SRC2,%ebp
  52. movl PARAM_SIZE,%ecx
  53. movl (%ebp),%ebx
  54. decl %ecx
  55. movl %ecx,%edx
  56. shrl $3,%ecx
  57. andl $7,%edx
  58. testl %ecx,%ecx C zero carry flag
  59. jz L(endgo)
  60. pushl %edx
  61. FRAME_pushl()
  62. movl PARAM_CARRY,%eax
  63. shrl $1,%eax C shift bit 0 into carry
  64. jmp L(oop)
  65. L(endgo):
  66. deflit(`FRAME',16)
  67. movl PARAM_CARRY,%eax
  68. shrl $1,%eax C shift bit 0 into carry
  69. jmp L(end)
  70. EPILOGUE()
  71. ALIGN(8)
  72. PROLOGUE(M4_function_n)
  73. pushl %edi
  74. pushl %esi
  75. pushl %ebx
  76. pushl %ebp
  77. deflit(`FRAME',16)
  78. movl PARAM_DST,%edi
  79. movl PARAM_SRC1,%esi
  80. movl PARAM_SRC2,%ebp
  81. movl PARAM_SIZE,%ecx
  82. movl (%ebp),%ebx
  83. decl %ecx
  84. movl %ecx,%edx
  85. shrl $3,%ecx
  86. andl $7,%edx
  87. testl %ecx,%ecx C zero carry flag
  88. jz L(end)
  89. pushl %edx
  90. FRAME_pushl()
  91. ALIGN(8)
  92. L(oop): movl 28(%edi),%eax C fetch destination cache line
  93. leal 32(%edi),%edi
  94. L(1): movl (%esi),%eax
  95. movl 4(%esi),%edx
  96. M4_inst %ebx,%eax
  97. movl 4(%ebp),%ebx
  98. M4_inst %ebx,%edx
  99. movl 8(%ebp),%ebx
  100. movl %eax,-32(%edi)
  101. movl %edx,-28(%edi)
  102. L(2): movl 8(%esi),%eax
  103. movl 12(%esi),%edx
  104. M4_inst %ebx,%eax
  105. movl 12(%ebp),%ebx
  106. M4_inst %ebx,%edx
  107. movl 16(%ebp),%ebx
  108. movl %eax,-24(%edi)
  109. movl %edx,-20(%edi)
  110. L(3): movl 16(%esi),%eax
  111. movl 20(%esi),%edx
  112. M4_inst %ebx,%eax
  113. movl 20(%ebp),%ebx
  114. M4_inst %ebx,%edx
  115. movl 24(%ebp),%ebx
  116. movl %eax,-16(%edi)
  117. movl %edx,-12(%edi)
  118. L(4): movl 24(%esi),%eax
  119. movl 28(%esi),%edx
  120. M4_inst %ebx,%eax
  121. movl 28(%ebp),%ebx
  122. M4_inst %ebx,%edx
  123. movl 32(%ebp),%ebx
  124. movl %eax,-8(%edi)
  125. movl %edx,-4(%edi)
  126. leal 32(%esi),%esi
  127. leal 32(%ebp),%ebp
  128. decl %ecx
  129. jnz L(oop)
  130. popl %edx
  131. FRAME_popl()
  132. L(end):
  133. decl %edx C test %edx w/o clobbering carry
  134. js L(end2)
  135. incl %edx
  136. L(oop2):
  137. leal 4(%edi),%edi
  138. movl (%esi),%eax
  139. M4_inst %ebx,%eax
  140. movl 4(%ebp),%ebx
  141. movl %eax,-4(%edi)
  142. leal 4(%esi),%esi
  143. leal 4(%ebp),%ebp
  144. decl %edx
  145. jnz L(oop2)
  146. L(end2):
  147. movl (%esi),%eax
  148. M4_inst %ebx,%eax
  149. movl %eax,(%edi)
  150. sbbl %eax,%eax
  151. negl %eax
  152. popl %ebp
  153. popl %ebx
  154. popl %esi
  155. popl %edi
  156. ret
  157. EPILOGUE()