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

数学计算

开发平台:

Unix_Linux

  1. dnl  PowerPC-64 mpn_divrem_1 -- Divide an mpn number by an unnormalized limb.
  2. dnl  Copyright 2003, 2004, 2005, 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 unorm frac
  17. C POWER3/PPC630 16-34 16-34 ~11
  18. C POWER4/PPC970  29  19
  19. C POWER5  29  29 ~20
  20. C INPUT PARAMETERS
  21. C qp  = r3
  22. C fn  = r4
  23. C up  = r5
  24. C un  = r6
  25. C d   = r7
  26. C We use a not very predictable branch in the frac code, therefore the cycle
  27. C count wobbles somewhat.  With the alternative branch-free code, things run
  28. C considerably slower on POWER4/PPC970 and POWER5.
  29. C Add preinv entry point.
  30. ASM_START()
  31. EXTERN_FUNC(mpn_invert_limb)
  32. PROLOGUE(mpn_divrem_1)
  33. mfcr r12
  34. add. r10, r6, r4
  35. std r25, -56(r1)
  36. mr r25, r4
  37. mflr r0
  38. std r26, -48(r1)
  39. mr r26, r5
  40. std r28, -32(r1)
  41. mr r28, r6
  42. std r29, -24(r1)
  43. mr r29, r3
  44. li r3, 0
  45. std r30, -16(r1)
  46. mr r30, r7
  47. std r31, -8(r1)
  48. li r31, 0
  49. std r27, -40(r1)
  50. std r0, 16(r1)
  51. stw r12, 8(r1)
  52. stdu r1, -176(r1)
  53. beq- cr0, L(1)
  54. cmpdi cr7, r7, 0
  55. sldi r0, r10, 3
  56. add r11, r0, r29
  57. addi r29, r11, -8
  58. blt- cr7, L(162)
  59. cmpdi cr4, r6, 0
  60. beq+ cr4, L(71)
  61. L(163):
  62. sldi r9, r6, 3
  63. add r9, r9, r5
  64. ld r7, -8(r9)
  65. cmpld cr7, r7, r30
  66. bge- cr7, L(71)
  67. cmpdi cr7, r10, 1
  68. li r0, 0
  69. mr r31, r7
  70. std r0, -8(r11)
  71. addi r29, r29, -8
  72. mr r3, r7
  73. beq- cr7, L(1)
  74. addi r28, r6, -1
  75. cmpdi cr4, r28, 0
  76. L(71):
  77. cntlzd r27, r30
  78. sld r30, r30, r27
  79. sld r31, r31, r27
  80. mr r3, r30
  81. CALL( mpn_invert_limb)
  82. nop
  83. beq- cr4, L(110)
  84. sldi r9, r28, 3
  85. addic. r6, r28, -2
  86. add r9, r9, r26
  87. subfic r5, r27, 64
  88. ld r8, -8(r9)
  89. srd r0, r8, r5
  90. or r31, r31, r0
  91. sld r7, r8, r27
  92. blt- cr0, L(154)
  93. addi r28, r28, -1
  94. mtctr r28
  95. sldi r6, r6, 3
  96. ALIGN(16)
  97. L(uloop):
  98. addi r11, r31, 1
  99. ldx r8, r26, r6
  100. mulld r0, r31, r3
  101. mulhdu r10, r31, r3
  102. addi r6, r6, -8
  103. srd r9, r8, r5
  104. or r9, r7, r9
  105. addc r0, r0, r9
  106. adde r10, r10, r11
  107. mulld r31, r10, r30
  108. subf r31, r31, r9
  109. subfc r0, r0, r31 C r >= ql
  110. subfe r0, r0, r0 C r0 = -(r >= ql)
  111. not r7, r0
  112. add r10, r7, r10 C qh -= (r >= ql)
  113. andc r0, r30, r0
  114. add r31, r31, r0
  115. cmpld cr7, r31, r30
  116. bge- cr7, L(164)
  117. L(123):
  118. std r10, 0(r29)
  119. addi r29, r29, -8
  120. sld r7, r8, r27
  121. bdnz L(uloop)
  122. L(154):
  123. addi r11, r31, 1
  124. nop
  125. mulld r0, r31, r3
  126. mulhdu r8, r31, r3
  127. addc r0, r0, r7
  128. adde r8, r8, r11
  129. mulld r31, r8, r30
  130. subf r31, r31, r7
  131. subfc r0, r0, r31 C r >= ql
  132. subfe r0, r0, r0 C r0 = -(r >= ql)
  133. not r7, r0
  134. add r8, r7, r8 C qh -= (r >= ql)
  135. andc r0, r30, r0
  136. add r31, r31, r0
  137. cmpld cr7, r31, r30
  138. bge- cr7, L(165)
  139. L(134):
  140. std r8, 0(r29)
  141. addi r29, r29, -8
  142. L(110):
  143. addic. r0, r25, -1
  144. blt- cr0, L(156)
  145. mtctr r25
  146. neg r9, r30
  147. ALIGN(16)
  148. L(ufloop):
  149. addi r11, r31, 1
  150. nop
  151. mulld r7, r3, r31
  152. mulhdu r10, r3, r31
  153. add r10, r10, r11
  154. mulld r31, r9, r10
  155. ifelse(0,1,`
  156. subfc r0, r7, r31
  157. subfe r0, r0, r0 C r0 = -(r >= ql)
  158. not r7, r0
  159. add r10, r7, r10 C qh -= (r >= ql)
  160. andc r0, r30, r0
  161. add r31, r31, r0
  162. ',`
  163. cmpld cr7, r31, r7
  164. blt cr7, L(29)
  165. add r31, r30, r31
  166. addi r10, r10, -1
  167. L(29):
  168. ')
  169. std r10, 0(r29)
  170. addi r29, r29, -8
  171. bdnz L(ufloop)
  172. L(156):
  173. srd r3, r31, r27
  174. L(1):
  175. addi r1, r1, 176
  176. ld r0, 16(r1)
  177. lwz r12, 8(r1)
  178. mtlr r0
  179. ld r25, -56(r1)
  180. ld r26, -48(r1)
  181. mtcrf 8, r12
  182. ld r27, -40(r1)
  183. ld r28, -32(r1)
  184. ld r29, -24(r1)
  185. ld r30, -16(r1)
  186. ld r31, -8(r1)
  187. blr
  188. L(162):
  189. cmpdi cr7, r6, 0
  190. beq- cr7, L(8)
  191. sldi r9, r6, 3
  192. addi r29, r29, -8
  193. add r9, r9, r5
  194. addi r28, r6, -1
  195. ld r31, -8(r9)
  196. subfc r9, r7, r31
  197. li r9, 0
  198. adde r9, r9, r9
  199. neg r0, r9
  200. std r9, -8(r11)
  201. and r0, r0, r7
  202. subf r31, r0, r31
  203. L(8):
  204. L(10):
  205. mr r3, r30
  206. CALL( mpn_invert_limb)
  207. nop
  208. addic. r6, r28, -1
  209. blt- cr0, L(150)
  210. mtctr r28
  211. sldi r6, r6, 3
  212. ALIGN(16)
  213. L(nloop):
  214. addi r11, r31, 1
  215. ldx r8, r26, r6
  216. mulld r0, r31, r3
  217. addi r6, r6, -8
  218. mulhdu r10, r31, r3
  219. addc r7, r0, r8
  220. adde r10, r10, r11
  221. mulld r31, r10, r30
  222. subf r31, r31, r8 C r = nl - qh * d
  223. subfc r0, r7, r31 C r >= ql
  224. subfe r0, r0, r0 C r0 = -(r >= ql)
  225. not r7, r0
  226. add r10, r7, r10 C qh -= (r >= ql)
  227. andc r0, r30, r0
  228. add r31, r31, r0
  229. cmpld cr7, r31, r30
  230. bge- cr7, L(167)
  231. L(51):
  232. std r10, 0(r29)
  233. addi r29, r29, -8
  234. bdnz L(nloop)
  235. L(150):
  236. addic. r9, r25, -1
  237. blt- cr0, L(152)
  238. mtctr r25
  239. neg r9, r30
  240. ALIGN(16)
  241. L(nfloop):
  242. addi r11, r31, 1
  243. nop
  244. mulld r7, r3, r31
  245. mulhdu r10, r3, r31
  246. add r10, r10, r11
  247. mulld r31, r9, r10
  248. ifelse(0,1,`
  249. subfc r0, r7, r31
  250. subfe r0, r0, r0 C r0 = -(r >= ql)
  251. not r7, r0
  252. add r10, r7, r10 C qh -= (r >= ql)
  253. andc r0, r30, r0
  254. add r31, r31, r0
  255. ',`
  256. cmpld cr7, r31, r7
  257. blt cr7, L(28)
  258. add r31, r30, r31
  259. addi r10, r10, -1
  260. L(28):
  261. ')
  262. std r10, 0(r29)
  263. addi r29, r29, -8
  264. bdnz L(nfloop)
  265. L(152):
  266. addi r1, r1, 176
  267. mr r3, r31
  268. ld r0, 16(r1)
  269. lwz r12, 8(r1)
  270. mtlr r0
  271. ld r25, -56(r1)
  272. ld r26, -48(r1)
  273. mtcrf 8, r12
  274. ld r27, -40(r1)
  275. ld r28, -32(r1)
  276. ld r29, -24(r1)
  277. ld r30, -16(r1)
  278. ld r31, -8(r1)
  279. blr
  280. L(164):
  281. subf r31, r30, r31
  282. addi r10, r10, 1
  283. b L(123)
  284. L(167):
  285. subf r31, r30, r31
  286. addi r10, r10, 1
  287. b L(51)
  288. L(165):
  289. subf r31, r30, r31
  290. addi r8, r8, 1
  291. b L(134)
  292. EPILOGUE()