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

数学计算

开发平台:

Unix_Linux

  1. dnl  PPC-64 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 POWER3/PPC630
  18. C POWER4/PPC970 39* 39*
  19. C POWER5 39* 39*
  20. C STATUS
  21. C  * Performace fluctuates like crazy
  22. C INPUT PARAMETERS
  23. C qp  = r3
  24. C fn  = r4
  25. C up  = r5
  26. C un  = r6
  27. C dp  = r7
  28. ifdef(`DARWIN',,`
  29. define(`r2',`r31')') C FIXME!
  30. ASM_START()
  31. EXTERN_FUNC(mpn_invert_limb)
  32. PROLOGUE(mpn_divrem_2)
  33. mflr r0
  34. std r23, -72(r1)
  35. std r24, -64(r1)
  36. std r25, -56(r1)
  37. std r26, -48(r1)
  38. std r27, -40(r1)
  39. std r28, -32(r1)
  40. std r29, -24(r1)
  41. std r30, -16(r1)
  42. std r31, -8(r1)
  43. std r0, 16(r1)
  44. stdu r1, -192(r1)
  45. mr r24, r3
  46. mr r25, r4
  47. sldi r0, r6, 3
  48. add r26, r5, r0
  49. addi r26, r26, -24
  50. ld r30, 8(r7)
  51. ld r28, 0(r7)
  52. ld r29, 16(r26)
  53. ld r31, 8(r26)
  54. ifelse(0,1,`
  55. li r23, 0
  56. cmpld cr7, r29, r30
  57. blt cr7, L(8)
  58. bgt cr7, L(9)
  59. cmpld cr0, r31, r28
  60. blt cr0, L(8)
  61. L(9): subfc r31, r28, r31
  62. subfe r29, r30, r29
  63. li r23, 1
  64. ',`
  65. li r23, 0
  66. cmpld cr7, r29, r30
  67. blt cr7, L(8)
  68. mfcr r0
  69. rlwinm r0, r0, 30, 1
  70. subfc r9, r28, r31
  71. addze. r0, r0
  72. nop
  73. beq cr0, L(8)
  74. subfc r31, r28, r31
  75. subfe r29, r30, r29
  76. li r23, 1
  77. ')
  78. L(8):
  79. add r27, r25, r6
  80. addic. r27, r27, -3
  81. blt cr0, L(18)
  82. mr r3, r30
  83. CALL( mpn_invert_limb)
  84. nop
  85. mulld r10, r3, r30
  86. mulhdu r0, r3, r28
  87. addc r8, r10, r28
  88. subfe r11, r1, r1
  89. addc r10, r8, r0
  90. addze. r11, r11
  91. blt cr0, L(91)
  92. L(40):
  93. subfc r10, r30, r10
  94. addme. r11, r11
  95. addi r3, r3, -1
  96. bge cr0, L(40)
  97. L(91):
  98. addi r5, r27,  1
  99. mtctr r5
  100. sldi r0, r27, 3
  101. add r24, r24, r0
  102. ALIGN(16)
  103. L(loop):
  104. mulhdu r8, r29, r3
  105. mulld r6, r29, r3
  106. addc r6, r6, r31
  107. adde r8, r8, r29
  108. mulld r0, r30, r8
  109. subf r31, r0, r31
  110. mulhdu r11, r28, r8
  111. mulld r10, r28, r8
  112. li r7, 0
  113. cmpd cr7, r27, r25
  114. blt cr7, L(60)
  115. ld r7, 0(r26)
  116. addi r26, r26, -8
  117. nop
  118. L(60): subfc r7, r28, r7
  119. subfe r31, r30, r31
  120. subfc r7, r10, r7
  121. subfe r4, r11, r31
  122. subfc r9, r6, r4
  123. subfe r9, r1, r1
  124. andc r6, r28, r9
  125. andc r0, r30, r9
  126. addc r31, r7, r6
  127. adde r29, r4, r0
  128. subf r8, r9, r8
  129. cmpld cr7, r29, r30
  130. bge- cr7, L(fix)
  131. L(bck): std r8, 0(r24)
  132. addi r24, r24, -8
  133. addi r27, r27, -1
  134. bdnz L(loop)
  135. L(18):
  136. std r31, 8(r26)
  137. std r29, 16(r26)
  138. mr r3, r23
  139. addi r1, r1, 192
  140. ld r0, 16(r1)
  141. mtlr r0
  142. ld r23, -72(r1)
  143. ld r24, -64(r1)
  144. ld r25, -56(r1)
  145. ld r26, -48(r1)
  146. ld r27, -40(r1)
  147. ld r28, -32(r1)
  148. ld r29, -24(r1)
  149. ld r30, -16(r1)
  150. ld r31, -8(r1)
  151. blr
  152. L(fix):
  153. mfcr r0
  154. rlwinm r0, r0, 30, 1
  155. subfc r9, r28, r31
  156. addze. r0, r0
  157. beq cr0, L(bck)
  158. subfc r31, r28, r31
  159. subfe r29, r30, r29
  160. addi r8, r8, 1
  161. b L(bck)
  162. EPILOGUE()