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

数学计算

开发平台:

Unix_Linux

  1. dnl  x86 mpn_divexact_1 -- mpn by limb exact division.
  2. dnl  Copyright 2001, 2002, 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 P54    30.0
  21. C P55    29.0
  22. C P6     13.0 odd divisor, 12.0 even (strangely)
  23. C K6     14.0
  24. C K7     12.0
  25. C P4     42.0
  26. C mp_limb_t mpn_divexact_1 (mp_ptr dst, mp_srcptr src, mp_size_t size,
  27. C                           mp_limb_t divisor);
  28. C
  29. defframe(PARAM_DIVISOR,16)
  30. defframe(PARAM_SIZE,   12)
  31. defframe(PARAM_SRC,    8)
  32. defframe(PARAM_DST,    4)
  33. dnl  re-use parameter space
  34. define(VAR_INVERSE,`PARAM_SRC')
  35. TEXT
  36. ALIGN(16)
  37. PROLOGUE(mpn_divexact_1)
  38. deflit(`FRAME',0)
  39. movl PARAM_DIVISOR, %eax
  40. pushl %ebp FRAME_pushl()
  41. movl PARAM_SIZE, %ebp
  42. pushl %edi FRAME_pushl()
  43. pushl %ebx FRAME_pushl()
  44. movl $-1, %ecx C shift count
  45. pushl %esi FRAME_pushl()
  46. L(strip_twos):
  47. incl %ecx
  48. shrl %eax
  49. jnc L(strip_twos)
  50. leal 1(%eax,%eax), %ebx C d without twos
  51. andl $127, %eax C d/2, 7 bits
  52. ifdef(`PIC',`
  53. LEA( binvert_limb_table, %edx)
  54. movzbl (%eax,%edx), %eax C inv 8 bits
  55. ',`
  56. movzbl binvert_limb_table(%eax), %eax C inv 8 bits
  57. ')
  58. leal (%eax,%eax), %edx C 2*inv
  59. movl %ebx, PARAM_DIVISOR C d without twos
  60. imull %eax, %eax C inv*inv
  61. movl PARAM_SRC, %esi
  62. movl PARAM_DST, %edi
  63. imull %ebx, %eax C inv*inv*d
  64. subl %eax, %edx C inv = 2*inv - inv*inv*d
  65. leal (%edx,%edx), %eax C 2*inv
  66. imull %edx, %edx C inv*inv
  67. leal (%esi,%ebp,4), %esi C src end
  68. leal (%edi,%ebp,4), %edi C dst end
  69. negl %ebp C -size
  70. imull %ebx, %edx C inv*inv*d
  71. subl %edx, %eax C inv = 2*inv - inv*inv*d
  72. ASSERT(e,` C expect d*inv == 1 mod 2^GMP_LIMB_BITS
  73. pushl %eax FRAME_pushl()
  74. imull PARAM_DIVISOR, %eax
  75. cmpl $1, %eax
  76. popl %eax FRAME_popl()')
  77. movl %eax, VAR_INVERSE
  78. movl (%esi,%ebp,4), %eax C src[0]
  79. xorl %ebx, %ebx
  80. xorl %edx, %edx
  81. incl %ebp
  82. jz L(one)
  83. movl (%esi,%ebp,4), %edx C src[1]
  84. shrdl( %cl, %edx, %eax)
  85. movl VAR_INVERSE, %edx
  86. jmp L(entry)
  87. ALIGN(8)
  88. nop C k6 code alignment
  89. nop
  90. L(top):
  91. C eax q
  92. C ebx carry bit, 0 or -1
  93. C ecx shift
  94. C edx carry limb
  95. C esi src end
  96. C edi dst end
  97. C ebp counter, limbs, negative
  98. movl -4(%esi,%ebp,4), %eax
  99. subl %ebx, %edx C accumulate carry bit
  100. movl (%esi,%ebp,4), %ebx
  101. shrdl( %cl, %ebx, %eax)
  102. subl %edx, %eax C apply carry limb
  103. movl VAR_INVERSE, %edx
  104. sbbl %ebx, %ebx
  105. L(entry):
  106. imull %edx, %eax
  107. movl %eax, -4(%edi,%ebp,4)
  108. movl PARAM_DIVISOR, %edx
  109. mull %edx
  110. incl %ebp
  111. jnz L(top)
  112. movl -4(%esi), %eax C src high limb
  113. L(one):
  114. shrl %cl, %eax
  115. popl %esi FRAME_popl()
  116. addl %ebx, %eax C apply carry bit
  117. popl %ebx FRAME_popl()
  118. subl %edx, %eax C apply carry limb
  119. imull VAR_INVERSE, %eax
  120. movl %eax, -4(%edi)
  121. popl %edi
  122. popl %ebp
  123. ret
  124. EPILOGUE()