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

数学计算

开发平台:

Unix_Linux

  1. dnl  AMD64 mpn_divexact_1 -- mpn by limb exact division.
  2. dnl  Copyright 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
  3. dnl  This file is part of the GNU MP Library.
  4. dnl  The GNU MP Library is free software; you can redistribute it and/or modify
  5. dnl  it under the terms of the GNU Lesser General Public License as published
  6. dnl  by the Free Software Foundation; either version 3 of the License, or (at
  7. dnl  your option) any later version.
  8. dnl The GNU MP Library is distributed in the hope that it will be useful, but
  9. dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  11. dnl  License for more details.
  12. dnl  You should have received a copy of the GNU Lesser General Public License
  13. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  14. include(`../config.m4')
  15. C      cycles/limb
  16. C K8,K9: 10
  17. C K10: 10
  18. C P4: 33
  19. C P6 core2: 13.25
  20. C P6 corei7: 14
  21. C P6 atom: 42
  22. C A quick adoption of the 32-bit K7 code.
  23. C INPUT PARAMETERS
  24. C rp rdi
  25. C up rsi
  26. C n rdx
  27. C divisor rcx
  28. ASM_START()
  29. TEXT
  30. ALIGN(16)
  31. PROLOGUE(mpn_divexact_1)
  32. push %rbx
  33. mov %rcx, %rax
  34. xor R32(%rcx), R32(%rcx) C shift count
  35. mov %rdx, %r8
  36. bt $0, R32(%rax)
  37. jnc L(evn) C skip bsfq unless divisor is even
  38. L(odd): mov %rax, %rbx
  39. shr R32(%rax)
  40. and $127, R32(%rax) C d/2, 7 bits
  41. ifdef(`PIC',`
  42. mov binvert_limb_table@GOTPCREL(%rip), %rdx
  43. ',`
  44. movabs $binvert_limb_table, %rdx
  45. ')
  46. movzbl (%rdx,%rax), R32(%rax) C inv 8 bits
  47. mov %rbx, %r11 C d without twos
  48. lea (%rax,%rax), R32(%rdx) C 2*inv
  49. imul R32(%rax), R32(%rax) C inv*inv
  50. imul R32(%rbx), R32(%rax) C inv*inv*d
  51. sub R32(%rax), R32(%rdx) C inv = 2*inv - inv*inv*d, 16 bits
  52. lea (%rdx,%rdx), R32(%rax) C 2*inv
  53. imul R32(%rdx), R32(%rdx) C inv*inv
  54. imul R32(%rbx), R32(%rdx) C inv*inv*d
  55. sub R32(%rdx), R32(%rax) C inv = 2*inv - inv*inv*d, 32 bits
  56. lea (%rax,%rax), %r10 C 2*inv
  57. imul %rax, %rax C inv*inv
  58. imul %rbx, %rax C inv*inv*d
  59. sub %rax, %r10 C inv = 2*inv - inv*inv*d, 64 bits
  60. lea (%rsi,%r8,8), %rsi C up end
  61. lea -8(%rdi,%r8,8), %rdi C rp end
  62. neg %r8 C -n
  63. mov (%rsi,%r8,8), %rax C up[0]
  64. inc %r8
  65. jz L(one)
  66. mov (%rsi,%r8,8), %rdx C up[1]
  67. shrd R8(%rcx), %rdx, %rax
  68. xor R32(%rbx), R32(%rbx)
  69. jmp L(ent)
  70. L(evn): bsf %rax, %rcx
  71. shr R8(%rcx), %rax
  72. jmp L(odd)
  73. ALIGN(8)
  74. L(top):
  75. C rax q
  76. C rbx carry bit, 0 or 1
  77. C rcx shift
  78. C rdx
  79. C rsi up end
  80. C rdi rp end
  81. C r8 counter, limbs, negative
  82. C r10 d^(-1) mod 2^64
  83. C r11 d, shifted down
  84. mul %r11 C carry limb in rdx 0 10
  85. mov -8(%rsi,%r8,8), %rax C
  86. mov (%rsi,%r8,8), %r9 C
  87. shrd R8(%rcx), %r9, %rax C
  88. nop C
  89. sub %rbx, %rax C apply carry bit
  90. setc %bl C
  91. sub %rdx, %rax C apply carry limb 5
  92. adc $0, %rbx C 6
  93. L(ent): imul %r10, %rax C 6
  94. mov %rax, (%rdi,%r8,8) C
  95. inc %r8 C
  96. jnz L(top)
  97. mul %r11 C carry limb in rdx
  98. mov -8(%rsi), %rax C up high limb
  99. shr R8(%rcx), %rax
  100. sub %rbx, %rax C apply carry bit
  101. sub %rdx, %rax C apply carry limb
  102. imul %r10, %rax
  103. mov %rax, (%rdi)
  104. pop %rbx
  105. ret
  106. L(one): shr R8(%rcx), %rax
  107. imul %r10, %rax
  108. mov %rax, (%rdi)
  109. pop %rbx
  110. ret
  111. EPILOGUE()