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

数学计算

开发平台:

Unix_Linux

  1. dnl  Intel P5 mpn_mod_34lsub1 -- mpn remainder modulo 2**24-1.
  2. dnl  Copyright 2000, 2001, 2002 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 P5: 1.66 cycles/limb
  20. C mp_limb_t mpn_mod_34lsub1 (mp_srcptr src, mp_size_t size)
  21. C
  22. defframe(PARAM_SIZE, 8)
  23. defframe(PARAM_SRC,  4)
  24. TEXT
  25. ALIGN(16)
  26. PROLOGUE(mpn_mod_34lsub1)
  27. deflit(`FRAME',0)
  28. movl PARAM_SIZE, %ecx
  29. movl PARAM_SRC, %edx
  30. subl $2, %ecx
  31. ja L(three_or_more)
  32. movl (%edx), %eax
  33. jne L(one)
  34. movl 4(%edx), %ecx
  35. movl %eax, %edx
  36. shrl $24, %edx
  37. andl $0xFFFFFF, %eax
  38. addl %edx, %eax
  39. movl %ecx, %edx
  40. shrl $16, %ecx
  41. andl $0xFFFF, %edx
  42. shll $8, %edx
  43. addl %ecx, %eax
  44. addl %edx, %eax
  45. L(one):
  46. ret
  47. L(three_or_more):
  48. C eax
  49. C ebx
  50. C ecx size-2
  51. C edx src
  52. C esi
  53. C edi
  54. C ebp
  55. pushl %ebx FRAME_pushl()
  56. pushl %esi FRAME_pushl()
  57. pushl %edi FRAME_pushl()
  58. pushl %ebp FRAME_pushl()
  59. xorl %esi, %esi C 0mod3
  60. xorl %edi, %edi C 1mod3
  61. xorl %ebp, %ebp C 2mod3, and clear carry
  62. L(top):
  63. C eax scratch
  64. C ebx scratch
  65. C ecx counter, limbs
  66. C edx src
  67. C esi 0mod3
  68. C edi 1mod3
  69. C ebp 2mod3
  70. movl (%edx), %eax
  71. movl 4(%edx), %ebx
  72. adcl %eax, %esi
  73. movl 8(%edx), %eax
  74. adcl %ebx, %edi
  75. leal 12(%edx), %edx
  76. adcl %eax, %ebp
  77. leal -2(%ecx), %ecx
  78. decl %ecx
  79. jg L(top)
  80. C ecx is -2, -1 or 0, representing 0, 1 or 2 more limbs, respectively
  81. movl $0xFFFFFFFF, %ebx C mask
  82. incl %ecx
  83. js L(combine) C 0 more
  84. movl (%edx), %eax
  85. movl $0xFFFFFF00, %ebx
  86. adcl %eax, %esi
  87. decl %ecx
  88. js L(combine) C 1 more
  89. movl 4(%edx), %eax
  90. movl $0xFFFF0000, %ebx
  91. adcl %eax, %edi
  92. L(combine):
  93. C eax
  94. C ebx mask
  95. C ecx
  96. C edx
  97. C esi 0mod3
  98. C edi 1mod3
  99. C ebp 2mod3
  100. sbbl %ecx, %ecx C carry
  101. movl %esi, %eax C 0mod3
  102. andl %ebx, %ecx C masked for position
  103. andl $0xFFFFFF, %eax C 0mod3 low
  104. shrl $24, %esi C 0mod3 high
  105. subl %ecx, %eax C apply carry
  106. addl %esi, %eax C apply 0mod3
  107. movl %edi, %ebx C 1mod3
  108. shrl $16, %edi C 1mod3 high
  109. andl $0x0000FFFF, %ebx
  110. shll $8, %ebx C 1mod3 low
  111. addl %edi, %eax C apply 1mod3 high
  112. addl %ebx, %eax C apply 1mod3 low
  113. movl %ebp, %ebx C 2mod3
  114. shrl $8, %ebp C 2mod3 high
  115. andl $0xFF, %ebx
  116. shll $16, %ebx C 2mod3 low
  117. addl %ebp, %eax C apply 2mod3 high
  118. addl %ebx, %eax C apply 2mod3 low
  119. popl %ebp
  120. popl %edi
  121. popl %esi
  122. popl %ebx
  123. ret
  124. EPILOGUE()