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

数学计算

开发平台:

Unix_Linux

  1. dnl  AMD K7 mpn_mod_34lsub1 -- remainder modulo 2^24-1.
  2. dnl  Copyright 2000, 2001, 2002, 2004, 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 Athlon:     1
  22. C Hammer:     1
  23. C mp_limb_t mpn_mod_34lsub1 (mp_srcptr src, mp_size_t size)
  24. C
  25. C The loop form below and the 64 byte code alignment seem necessary for the
  26. C claimed speed.  This is a bit strange, since normally k7 isn't very
  27. C sensitive to such things.  Perhaps there has to be 6 instructions in the
  28. C first 16 bytes for the BTB entry or something.
  29. defframe(PARAM_SIZE, 8)
  30. defframe(PARAM_SRC,  4)
  31. dnl  re-use parameter space
  32. define(SAVE_EDI, `PARAM_SIZE')
  33. TEXT
  34. ALIGN(64)
  35. PROLOGUE(mpn_mod_34lsub1)
  36. deflit(`FRAME',0)
  37. movl PARAM_SIZE, %ecx
  38. movl PARAM_SRC, %edx
  39. subl $2, %ecx
  40. ja L(three_or_more)
  41. movl (%edx), %eax
  42. jb L(one)
  43. movl 4(%edx), %ecx
  44. movl %eax, %edx
  45. shrl $24, %eax C src[0] low
  46. andl $0xFFFFFF, %edx C src[0] high
  47. addl %edx, %eax
  48. movl %ecx, %edx
  49. andl $0xFFFF, %ecx
  50. shrl $16, %edx C src[1] high
  51. addl %edx, %eax
  52. shll $8, %ecx C src[1] low
  53. addl %ecx, %eax
  54. L(one):
  55. ret
  56. L(three_or_more):
  57. C eax
  58. C ebx
  59. C ecx size-2
  60. C edx src
  61. C esi
  62. C edi
  63. pushl %ebx FRAME_pushl()
  64. xorl %eax, %eax
  65. xorl %ebx, %ebx
  66. movl %edi, SAVE_EDI
  67. pushl %esi FRAME_pushl()
  68. xorl %esi, %esi C and clear carry flag
  69. C code offset 0x40 at this point
  70. L(top):
  71. C eax acc 0mod3
  72. C ebx acc 1mod3
  73. C ecx counter, limbs
  74. C edx src
  75. C esi acc 2mod3
  76. C edi
  77. leal 24(%edx), %edx
  78. leal -2(%ecx), %ecx
  79. adcl -24(%edx), %eax
  80. adcl -20(%edx), %ebx
  81. adcl -16(%edx), %esi
  82. decl %ecx
  83. jng L(done_loop)
  84. leal -2(%ecx), %ecx
  85. adcl -12(%edx), %eax
  86. adcl -8(%edx), %ebx
  87. adcl -4(%edx), %esi
  88. decl %ecx
  89. jg L(top)
  90. leal 12(%edx), %edx
  91. L(done_loop):
  92. C ecx is -2, -1 or 0 representing 0, 1 or 2 more limbs, respectively
  93. incl %ecx
  94. movl $0xFFFFFFFF, %edi
  95. js L(combine)
  96. adcl -12(%edx), %eax
  97. decl %ecx
  98. movl $0xFFFFFF00, %edi
  99. js L(combine)
  100. adcl -8(%edx), %ebx
  101. movl $0xFFFF0000, %edi
  102. L(combine):
  103. C eax acc 0mod3
  104. C ebx acc 1mod3
  105. C ecx
  106. C edx
  107. C esi acc 2mod3
  108. C edi mask
  109. sbbl %ecx, %ecx C carry
  110. movl %eax, %edx C 0mod3
  111. shrl $24, %eax C 0mod3 high
  112. andl %edi, %ecx C carry masked
  113. andl $0x00FFFFFF, %edx C 0mod3 low
  114. movl %ebx, %edi C 1mod3
  115. subl %ecx, %eax C apply carry
  116. shrl $16, %ebx C 1mod3 high
  117. andl $0xFFFF, %edi
  118. addl %edx, %eax C apply 0mod3 low
  119. movl %esi, %edx C 2mod3
  120. shll $8, %edi C 1mod3 low
  121. addl %ebx, %eax C apply 1mod3 high
  122. shrl $8, %esi C 2mod3 high
  123. movzbl %dl, %edx C 2mod3 low
  124. addl %edi, %eax C apply 1mod3 low
  125. shll $16, %edx C 2mod3 low
  126. addl %esi, %eax C apply 2mod3 high
  127. popl %esi FRAME_popl()
  128. movl SAVE_EDI, %edi
  129. addl %edx, %eax C apply 2mod3 low
  130. popl %ebx FRAME_popl()
  131. ret
  132. EPILOGUE()