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

数学计算

开发平台:

Unix_Linux

  1. dnl  AMD K7 mpn_modexact_1_odd -- exact division style remainder.
  2. dnl  Copyright 2000, 2001, 2002, 2004, 2007 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          cycles/limb
  20. C Athlon:     11.0
  21. C Hammer:      7.0
  22. C mp_limb_t mpn_modexact_1_odd (mp_srcptr src, mp_size_t size,
  23. C                               mp_limb_t divisor);
  24. C mp_limb_t mpn_modexact_1c_odd (mp_srcptr src, mp_size_t size,
  25. C                                mp_limb_t divisor, mp_limb_t carry);
  26. C
  27. C With the loop running at just 11 cycles it doesn't seem worth bothering to
  28. C check for high<divisor to save one step.
  29. C
  30. C Using a divl for size==1 measures slower than the modexact method, which
  31. C is not too surprising since for the latter it's only about 24 cycles to
  32. C calculate the modular inverse.
  33. defframe(PARAM_CARRY,  16)
  34. defframe(PARAM_DIVISOR,12)
  35. defframe(PARAM_SIZE,   8)
  36. defframe(PARAM_SRC,    4)
  37. defframe(SAVE_EBX,     -4)
  38. defframe(SAVE_ESI,     -8)
  39. defframe(SAVE_EDI,    -12)
  40. defframe(SAVE_EBP,    -16)
  41. deflit(STACK_SPACE, 16)
  42. TEXT
  43. ALIGN(16)
  44. PROLOGUE(mpn_modexact_1c_odd)
  45. deflit(`FRAME',0)
  46. movl PARAM_CARRY, %ecx
  47. jmp L(start_1c)
  48. EPILOGUE()
  49. ALIGN(16)
  50. PROLOGUE(mpn_modexact_1_odd)
  51. deflit(`FRAME',0)
  52. xorl %ecx, %ecx
  53. L(start_1c):
  54. movl PARAM_DIVISOR, %eax
  55. subl $STACK_SPACE, %esp FRAME_subl_esp(STACK_SPACE)
  56. movl %esi, SAVE_ESI
  57. movl PARAM_DIVISOR, %esi
  58. movl %edi, SAVE_EDI
  59. shrl %eax C d/2
  60. andl $127, %eax
  61. ifdef(`PIC',`
  62. LEA( binvert_limb_table, %edi)
  63. movzbl (%eax,%edi), %edi C inv 8 bits
  64. ',`
  65. movzbl binvert_limb_table(%eax), %edi C inv 8 bits
  66. ')
  67. xorl %edx, %edx C initial extra carry
  68. leal (%edi,%edi), %eax C 2*inv
  69. imull %edi, %edi C inv*inv
  70. movl %ebp, SAVE_EBP
  71. movl PARAM_SIZE, %ebp
  72. movl %ebx, SAVE_EBX
  73. movl PARAM_SRC, %ebx
  74. imull %esi, %edi C inv*inv*d
  75. subl %edi, %eax C inv = 2*inv - inv*inv*d
  76. leal (%eax,%eax), %edi C 2*inv
  77. imull %eax, %eax C inv*inv
  78. imull %esi, %eax C inv*inv*d
  79. leal (%ebx,%ebp,4), %ebx C src end
  80. negl %ebp C -size
  81. subl %eax, %edi C inv = 2*inv - inv*inv*d
  82. ASSERT(e,` C d*inv == 1 mod 2^GMP_LIMB_BITS
  83. movl %esi, %eax
  84. imull %edi, %eax
  85. cmpl $1, %eax')
  86. C The dependent chain here is
  87. C
  88. C                            cycles
  89. C subl %edx, %eax 1
  90. C imull %edi, %eax 4
  91. C mull %esi 6  (high limb)
  92. C       ----
  93. C       total        11
  94. C
  95. C Out of order execution hides the load latency for the source data, so no
  96. C special scheduling is required.
  97. L(top):
  98. C eax src limb
  99. C ebx src end ptr
  100. C ecx next carry bit, 0 or 1 (or initial carry param)
  101. C edx carry limb, high of last product
  102. C esi divisor
  103. C edi inverse
  104. C ebp counter, limbs, negative
  105. movl (%ebx,%ebp,4), %eax
  106. subl %ecx, %eax C apply carry bit
  107. movl $0, %ecx
  108. setc %cl C new carry bit
  109. subl %edx, %eax C apply carry limb
  110. adcl $0, %ecx
  111. imull %edi, %eax
  112. mull %esi
  113. incl %ebp
  114. jnz L(top)
  115. movl SAVE_ESI, %esi
  116. movl SAVE_EDI, %edi
  117. leal (%ecx,%edx), %eax
  118. movl SAVE_EBX, %ebx
  119. movl SAVE_EBP, %ebp
  120. addl $STACK_SPACE, %esp
  121. ret
  122. EPILOGUE()