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

数学计算

开发平台:

Unix_Linux

  1. dnl  Intel P6 mpn_mod_34lsub1 -- remainder modulo 2^24-1.
  2. dnl  Copyright 2000, 2001, 2002, 2004 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
  7. dnl  modify it under the terms of the GNU Lesser General Public License as
  8. dnl  published by the Free Software Foundation; either version 3 of the
  9. dnl  License, or (at your option) any later version.
  10. dnl
  11. dnl  The GNU MP Library is distributed in the hope that it will be useful,
  12. dnl  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. dnl  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14. dnl  Lesser General Public 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 P6: 2.0 cycles/limb
  20. C TODO
  21. C  Experiments with more unrolling indicate that 1.5 c/l is possible on P6-13
  22. C  with the current carry handling scheme.
  23. C mp_limb_t mpn_mod_34lsub1 (mp_srcptr src, mp_size_t size)
  24. C
  25. C Groups of three limbs are handled, with carry bits from 0mod3 into 1mod3
  26. C into 2mod3, but at that point going into a separate carries total so we
  27. C don't keep the carry flag live across the loop control.  Avoiding decl
  28. C lets us get to 2.0 c/l, as compared to the generic x86 code at 3.66.
  29. C
  30. defframe(PARAM_SIZE, 8)
  31. defframe(PARAM_SRC,  4)
  32. dnl  re-use parameter space
  33. define(SAVE_EBX, `PARAM_SIZE')
  34. define(SAVE_ESI, `PARAM_SRC')
  35. TEXT
  36. ALIGN(16)
  37. PROLOGUE(mpn_mod_34lsub1)
  38. deflit(`FRAME',0)
  39. movl PARAM_SIZE, %ecx
  40. movl PARAM_SRC, %edx
  41. subl $2, %ecx C size-2
  42. movl (%edx), %eax C src[0]
  43. ja L(three_or_more)
  44. jb L(one)
  45. C size==2
  46. movl 4(%edx), %ecx C src[1]
  47. movl %eax, %edx C src[0]
  48. shrl $24, %eax C src[0] high
  49. andl $0xFFFFFF, %edx C src[0] low
  50. addl %edx, %eax
  51. movl %ecx, %edx C src[1]
  52. shrl $16, %ecx C src[1] high
  53. andl $0xFFFF, %edx
  54. addl %ecx, %eax
  55. shll $8, %edx C src[1] low
  56. addl %edx, %eax
  57. L(one):
  58. ret
  59. L(three_or_more):
  60. C eax src[0], initial acc 0mod3
  61. C ebx
  62. C ecx size-2
  63. C edx src
  64. C esi
  65. C edi
  66. C ebp
  67. movl %ebx, SAVE_EBX
  68. movl 4(%edx), %ebx C src[1], initial 1mod3
  69. subl $3, %ecx C size-5
  70. movl %esi, SAVE_ESI
  71. movl 8(%edx), %esi C src[2], initial 2mod3
  72. pushl %edi FRAME_pushl()
  73. movl $0, %edi C initial carries 0mod3
  74. jng L(done) C if size < 6
  75. L(top):
  76. C eax acc 0mod3
  77. C ebx acc 1mod3
  78. C ecx counter, limbs
  79. C edx src
  80. C esi acc 2mod3
  81. C edi carrys into 0mod3
  82. C ebp
  83. addl 12(%edx), %eax
  84. adcl 16(%edx), %ebx
  85. adcl 20(%edx), %esi
  86. leal 12(%edx), %edx
  87. adcl $0, %edi
  88. subl $3, %ecx
  89. jg L(top) C at least 3 more to process
  90. L(done):
  91. C ecx is -2, -1 or 0 representing 0, 1 or 2 more limbs respectively
  92. cmpl $-1, %ecx
  93. jl L(done_0) C if -2, meaning 0 more limbs
  94. C 1 or 2 more limbs
  95. movl $0, %ecx
  96. je L(done_1) C if -1, meaning 1 more limb only
  97. movl 16(%edx), %ecx
  98. L(done_1):
  99. addl 12(%edx), %eax C 0mod3
  100. adcl %ecx, %ebx C 1mod3
  101. adcl $0, %esi C 2mod3
  102. adcl $0, %edi C carries 0mod3
  103. L(done_0):
  104. C eax acc 0mod3
  105. C ebx acc 1mod3
  106. C ecx
  107. C edx
  108. C esi acc 2mod3
  109. C edi carries 0mod3
  110. C ebp
  111. movl %eax, %ecx C 0mod3
  112. shrl $24, %eax C 0mod3 high initial total
  113. andl $0xFFFFFF, %ecx C 0mod3 low
  114. movl %edi, %edx C carries
  115. shrl $24, %edi C carries high
  116. addl %ecx, %eax C add 0mod3 low
  117. andl $0xFFFFFF, %edx C carries 0mod3 low
  118. movl %ebx, %ecx C 1mod3
  119. shrl $16, %ebx C 1mod3 high
  120. addl %edi, %eax C add carries high
  121. addl %edx, %eax C add carries 0mod3 low
  122. andl $0xFFFF, %ecx C 1mod3 low mask
  123. addl %ebx, %eax C add 1mod3 high
  124. movl SAVE_EBX, %ebx
  125. shll $8, %ecx C 1mod3 low
  126. movl %esi, %edx C 2mod3
  127. popl %edi FRAME_popl()
  128. shrl $8, %esi C 2mod3 high
  129. andl $0xFF, %edx C 2mod3 low mask
  130. addl %ecx, %eax C add 1mod3 low
  131. shll $16, %edx C 2mod3 low
  132. addl %esi, %eax C add 2mod3 high
  133. movl SAVE_ESI, %esi
  134. addl %edx, %eax C add 2mod3 low
  135. ret
  136. EPILOGUE()