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

数学计算

开发平台:

Unix_Linux

  1. dnl  PPC-32 mpn_divrem_2 -- Divide an mpn number by a normalized 2-limb number.
  2. dnl  Copyright 2007, 2008 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 norm frac
  17. C 7410 ~36.5 ~36.5
  18. C 744x, 745x  29  29
  19. C INPUT PARAMETERS
  20. C qp  = r3
  21. C fn  = r4
  22. C up  = r5
  23. C un  = r6
  24. C d   = r7
  25. C TODO
  26. C  * Decrease register usage.
  27. C  * Make sure mul operands and optimal for early-out.
  28. C  * Check that things work well for a shared library build.
  29. C  * Write an invert_limb, perhaps inline, perhaps as a private call.  Or at
  30. C    least vastly improve the current __udiv_qrnnd_c based code.
  31. ASM_START()
  32. PROLOGUE(mpn_divrem_2)
  33. stwu r1, -32(r1)
  34. slwi r0, r6, 2
  35. add r5, r5, r0
  36. stmw r28, 8(r1)
  37. addi r29, r5, -8 C up = up_param + un - 2
  38. lwz r10, 4(r7)
  39. lwz r12, 4(r29)
  40. addi r8, r3, -12
  41. lwz r7, 0(r7)
  42. cmplw cr7, r12, r10
  43. lwz r28, 0(r29)
  44. blt- cr7, L(2)
  45. bgt+ cr7, L(4)
  46. cmplw cr7, r28, r7
  47. blt- cr7, L(2)
  48. L(4): subfc r28, r7, r28
  49. subfe r12, r10, r12
  50. li r3, 1
  51. b L(6)
  52. L(2): li r3, 0
  53. L(6): add r0, r4, r6
  54. addic. r30, r0, -2
  55. ble- cr0, L(ret)
  56. slwi r9, r0, 2
  57. add r8, r8, r9 C rp += un + fn
  58. mtctr r30
  59. C Compute di from d1
  60. srwi r11, r10, 16
  61. nor r0, r10, r10
  62. divwu r31, r0, r11
  63. rlwinm r5, r10, 0, 16, 31
  64. mullw r9, r11, r31
  65. mullw r6, r5, r31
  66. subf r0, r9, r0
  67. slwi r0, r0, 16
  68. ori r0, r0, 65535
  69. cmplw cr7, r0, r6
  70. bge- cr7, L(9)
  71. add r0, r0, r10
  72. cmplw cr7, r0, r10
  73. cmplw cr6, r0, r6
  74. addi r31, r31, -1 C q1--
  75. cror 28, 28, 25
  76. bc+ 12, 28, L(9)
  77. addi r31, r31, -1 C q1--
  78. add r0, r0, r10
  79. L(9): subf r0, r6, r0
  80. divwu r6, r0, r11
  81. mullw r9, r11, r6
  82. mullw r11, r5, r6
  83. subf r0, r9, r0
  84. slwi r0, r0, 16
  85. ori r0, r0, 65535
  86. cmplw cr7, r0, r11
  87. bge- cr7, L(13)
  88. add r0, r0, r10
  89. cmplw cr7, r0, r10
  90. cmplw cr6, r0, r11
  91. addi r6, r6, -1 C q0--
  92. cror 28, 28, 25
  93. bc+ 12, 28, L(13)
  94. C add r0, r0, r10 C final remainder
  95. addi r6, r6, -1 C q0--
  96. L(13): rlwimi r6, r31, 16, 0, 15 C assemble final quotient
  97. C Adjust di by including d0
  98. mullw r9, r10, r6 C t0 = LO(di * d1)
  99. addc r11, r9, r7
  100. subfe r0, r1, r1
  101. mulhwu r9, r6, r7 C s1 = HI(di * d0)
  102. addc r9, r11, r9
  103. addze. r0, r0
  104. blt cr0, L(17)
  105. L(18): subfc r9, r10, r9
  106. addi r6, r6, -1
  107. addme. r0, r0
  108. bge+ cr0, L(18)
  109. L(17):
  110. C r0  r3  r4  r5  r6  r7  r8  r9 r10 r11 r12 r28 r29 r30 r31
  111. C     msl         di  d0  qp     d1          fn  up  un
  112. L(loop):
  113. mullw r0, r12, r6 C q0 = LO(n2 * di)
  114. cmpw cr7, r30, r4
  115. addc r31, r0, r28 C q0 += n1
  116. mulhwu r9, r12, r6 C q  = HI(n2 * di)
  117. adde r12, r9, r12 C q  += n2
  118. addi r30, r30, -1
  119. mullw r0, r10, r12 C d1 * q
  120. li r9, 0
  121. subf r0, r0, r28 C n1 -= d1 * q
  122. addi r5, r12, 1
  123. ble- cr7, L(23)
  124. lwzu r9, -4(r29)
  125. L(23): mullw r11, r12, r7 C t0 = LO(d0 * q)
  126. subfc r28, r7, r9 C n0 -= d0
  127. subfe r0, r10, r0 C n1 -= d1
  128. mulhwu r12, r12, r7 C t1 = HI(d0 * q)
  129. subfc r28, r11, r28 C n0 -= t0
  130. subfe r12, r12, r0 C n1 -= t1
  131. cmplw cr7, r12, r31
  132. blt+ cr7, L(24)
  133. addc r28, r28, r7
  134. adde r12, r12, r10
  135. addi r5, r5, -1
  136. L(24): cmplw cr7, r12, r10
  137. bge- cr7, L(fix)
  138. L(bck): stw r5, 0(r8)
  139. addi r8, r8, -4
  140. bdnz L(loop)
  141. L(ret): stw r28, 0(r29)
  142. stw r12, 4(r29)
  143. lmw r28, 8(r1)
  144. addi r1, r1, 32
  145. blr
  146. L(fix): cmplw cr6, r28, r7
  147. bgt+ cr7, L(28)
  148. blt- cr6, L(bck)
  149. L(28): subfc r28, r7, r28
  150. subfe r12, r10, r12
  151. addi r5, r5, 1
  152. b L(bck)
  153. EPILOGUE()