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

数学计算

开发平台:

Unix_Linux

  1. dnl  Intel P6 mpn_add_n/mpn_sub_n -- mpn add or subtract.
  2. dnl  Copyright 2006 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 modify
  7. dnl  it under the terms of the GNU Lesser General Public License as published
  8. dnl  by the Free Software Foundation; either version 3 of the License, or (at
  9. dnl  your option) any later version.
  10. dnl
  11. dnl  The GNU MP Library is distributed in the hope that it will be useful, but
  12. dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  13. dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  14. dnl  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 TODO:
  20. C  * Avoid indexed addressing, it makes us stall on the two-ported register
  21. C    file.
  22. C                           cycles/limb
  23. C P6 model 0-8,10-12)           3.17
  24. C P6 model 9   (Banias)         ?
  25. C P6 model 13  (Dothan)         2.25
  26. define(`rp', `%edi')
  27. define(`up', `%esi')
  28. define(`vp', `%ebx')
  29. define(`n', `%ecx')
  30. ifdef(`OPERATION_add_n', `
  31. define(ADCSBB,       adc)
  32. define(func,       mpn_add_n)
  33. define(func_nc,       mpn_add_nc)')
  34. ifdef(`OPERATION_sub_n', `
  35. define(ADCSBB,       sbb)
  36. define(func,       mpn_sub_n)
  37. define(func_nc,       mpn_sub_nc)')
  38. MULFUNC_PROLOGUE(mpn_add_n mpn_add_nc mpn_sub_n mpn_sub_nc)
  39. ASM_START()
  40. TEXT
  41. ALIGN(16)
  42. PROLOGUE(func)
  43. xor %edx, %edx
  44. L(start):
  45. push %edi
  46. push %esi
  47. push %ebx
  48. mov 16(%esp), rp
  49. mov 20(%esp), up
  50. mov 24(%esp), vp
  51. mov 28(%esp), n
  52. lea (up,n,4), up
  53. lea (vp,n,4), vp
  54. lea (rp,n,4), rp
  55. neg n
  56. mov n, %eax
  57. and $-8, n
  58. and $7, %eax
  59. shl $2, %eax C 4x
  60. ifdef(`PIC',`
  61. call L(pic_calc)
  62. L(here):
  63. ',`
  64. lea L(ent) (%eax,%eax,2), %eax C 12x
  65. ')
  66. shr %edx C set cy flag
  67. jmp *%eax
  68. ifdef(`PIC',`
  69. L(pic_calc):
  70. C See mpn/x86/README about old gas bugs
  71. lea (%eax,%eax,2), %eax
  72. add $L(ent)-L(here), %eax
  73. add (%esp), %eax
  74. ret_internal
  75. ')
  76. L(end):
  77. sbb %eax, %eax
  78. neg %eax
  79. pop %ebx
  80. pop %esi
  81. pop %edi
  82. ret
  83. ALIGN(16)
  84. L(top):
  85. jecxz L(end)
  86. L(ent):
  87. Zdisp( mov, 0,(up,n,4), %eax)
  88. Zdisp( ADCSBB, 0,(vp,n,4), %eax)
  89. Zdisp( mov, %eax, 0,(rp,n,4))
  90. mov 4(up,n,4), %edx
  91. ADCSBB 4(vp,n,4), %edx
  92. mov %edx, 4(rp,n,4)
  93. mov 8(up,n,4), %eax
  94. ADCSBB 8(vp,n,4), %eax
  95. mov %eax, 8(rp,n,4)
  96. mov 12(up,n,4), %edx
  97. ADCSBB 12(vp,n,4), %edx
  98. mov %edx, 12(rp,n,4)
  99. mov 16(up,n,4), %eax
  100. ADCSBB 16(vp,n,4), %eax
  101. mov %eax, 16(rp,n,4)
  102. mov 20(up,n,4), %edx
  103. ADCSBB 20(vp,n,4), %edx
  104. mov %edx, 20(rp,n,4)
  105. mov 24(up,n,4), %eax
  106. ADCSBB 24(vp,n,4), %eax
  107. mov %eax, 24(rp,n,4)
  108. mov 28(up,n,4), %edx
  109. ADCSBB 28(vp,n,4), %edx
  110. mov %edx, 28(rp,n,4)
  111. lea 8(n), n
  112. jmp L(top)
  113. EPILOGUE()
  114. PROLOGUE(func_nc)
  115. movl 20(%esp), %edx
  116. jmp L(start)
  117. EPILOGUE()