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

数学计算

开发平台:

Unix_Linux

  1. dnl  IA-64 mpn_divrem_1 and mpn_preinv_divrem_1 -- Divide an mpn number by an
  2. dnl  unnormalized limb.
  3. dnl  Copyright 2002, 2004, 2005 Free Software Foundation, Inc.
  4. dnl  This file is part of the GNU MP Library.
  5. dnl  The GNU MP Library is free software; you can redistribute it and/or modify
  6. dnl  it under the terms of the GNU Lesser General Public License as published
  7. dnl  by the Free Software Foundation; either version 3 of the License, or (at
  8. dnl  your option) any later version.
  9. dnl  The GNU MP Library is distributed in the hope that it will be useful, but
  10. dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  11. dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  12. dnl  License for more details.
  13. dnl  You should have received a copy of the GNU Lesser General Public License
  14. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  15. include(`../config.m4')
  16. C         cycles/limb
  17. C Itanium:    40-42
  18. C Itanium 2:  29-30
  19. C This was generated by gcc, then the loops were optimized.  The preinv entry
  20. C point was shoehorned into the file.  Lots of things outside the loops could
  21. C be streamlined.  It would probably be a good idea to merge the loops for
  22. C normalized and unnormalized divisor, since the shifting stuff is done for
  23. C free in parallel with other operations.  It would even be possible to merge
  24. C all loops, if the ld8 were made conditional.
  25. C TODO
  26. C  * Consider delaying inversion for normalized mpn_divrem_1 entry till after
  27. C    computing leading limb.
  28. C  * Inline and interleave limb inversion code with loop setup code.
  29. ASM_START()
  30. C HP's assembler requires these declarations for importing mpn_invert_limb
  31. .global mpn_invert_limb
  32. .type mpn_invert_limb,@function
  33. C INPUT PARAMETERS
  34. C rp    = r32
  35. C qxn   = r33
  36. C up    = r34
  37. C n     = r35
  38. C vl    = r36
  39. C vlinv = r37  (preinv only)
  40. C cnt = r38    (preinv only)
  41. PROLOGUE(mpn_preinv_divrem_1)
  42. .prologue
  43. .save ar.pfs, r42
  44. alloc r42 = ar.pfs, 7, 8, 1, 0
  45. .save ar.lc, r44
  46. mov r44 = ar.lc
  47. .save rp, r41
  48. mov r41 = b0
  49. .body
  50. ifdef(`HAVE_ABI_32',
  51. ` addp4 r32 = 0, r32
  52. sxt4 r33 = r33
  53. addp4 r34 = 0, r34
  54. sxt4 r35 = r35
  55. ;;
  56. ')
  57. mov r40 = r38
  58. shladd r34 = r35, 3, r34
  59. ;;
  60. adds r34 = -8, r34
  61. ;;
  62. ld8 r39 = [r34], -8
  63. ;;
  64. add r15 = r35, r33
  65. ;;
  66. mov r8 = r37
  67. shladd r32 = r15, 3, r32 C r32 = rp + n + qxn
  68. cmp.le p8, p0 = 0, r36
  69. ;;
  70. adds r32 = -8, r32 C r32 = rp + n + qxn - 1
  71. cmp.leu p6, p7 = r36, r39
  72.    (p8) br.cond.dpnt .Lpunnorm
  73. ;;
  74.    (p6) addl r15 = 1, r0
  75.    (p7) mov r15 = r0
  76. ;;
  77.    (p6) sub r38 = r39, r36
  78.    (p7) mov r38 = r39
  79. st8 [r32] = r15, -8
  80. adds r35 = -2, r35 C un -= 2
  81. br .Lpn
  82. .Lpunnorm:
  83.    (p6) add r34 = 8, r34
  84. mov r38 = 0 C r = 0
  85. shl r36 = r36, r40
  86.    (p6) br.cond.dptk .Lpu
  87. ;;
  88. shl r38 = r39, r40 C r = ahigh << cnt
  89. cmp.ne p8, p0 = 1, r35
  90. st8 [r32] = r0, -8
  91. adds r35 = -1, r35 C un--
  92.    (p8) br.cond.dpnt .Lpu
  93. mov r23 = 1
  94. ;;
  95. setf.sig f6 = r8
  96. setf.sig f12 = r23
  97. br .L435
  98. EPILOGUE()
  99. PROLOGUE(mpn_divrem_1)
  100. .prologue
  101. .save ar.pfs, r42
  102. alloc r42 = ar.pfs, 5, 8, 1, 0
  103. .save ar.lc, r44
  104. mov r44 = ar.lc
  105. .save rp, r41
  106. mov r41 = b0
  107. .body
  108. ifdef(`HAVE_ABI_32',
  109. ` addp4 r32 = 0, r32
  110. sxt4 r33 = r33
  111. addp4 r34 = 0, r34
  112. sxt4 r35 = r35
  113. ;;
  114. ')
  115. mov r38 = r0
  116. add r15 = r35, r33
  117. ;;
  118. cmp.ne p6, p7 = 0, r15
  119. ;;
  120.    (p7) mov r8 = r0
  121.    (p7) br.cond.dpnt .Lret
  122. shladd r14 = r15, 3, r32 C r14 = rp + n + qxn
  123. cmp.le p6, p7 = 0, r36
  124. ;;
  125. adds r32 = -8, r14 C r32 = rp + n + qxn - 1
  126.    (p6) br.cond.dpnt .Lunnorm
  127. cmp.eq p6, p7 = 0, r35
  128.    (p6) br.cond.dpnt .L179
  129. shladd r14 = r35, 3, r34
  130. ;;
  131. adds r14 = -8, r14
  132. adds r35 = -1, r35
  133. ;;
  134. ld8 r38 = [r14]
  135. ;;
  136. cmp.leu p6, p7 = r36, r38
  137. ;;
  138.    (p6) addl r15 = 1, r0
  139.    (p7) mov r15 = r0
  140. ;;
  141. st8 [r32] = r15, -8
  142.   (p6) sub r38 = r38, r36
  143. .L179:
  144. mov r45 = r36
  145. adds r35 = -1, r35
  146. br.call.sptk.many b0 = mpn_invert_limb
  147. ;;
  148. shladd r34 = r35, 3, r34
  149. .Lpn:
  150. mov r23 = 1
  151. ;;
  152. setf.sig f6 = r8
  153. setf.sig f12 = r23
  154. cmp.le p6, p7 = 0, r35
  155. mov r40 = 0
  156.    (p7) br.cond.dpnt .L435
  157. setf.sig f10 = r36
  158. mov ar.lc = r35
  159. setf.sig f7 = r38
  160. ;;
  161. sub r28 = -1, r36
  162. C Develop quotient limbs for normalized divisor
  163. .Loop1: C 00 C q=r18 nh=r38/f7
  164. ld8 r20 = [r34], -8
  165. xma.hu f11 = f7, f6, f0
  166. ;; C 04
  167. xma.l f8 = f11, f12, f7 C q = q + nh
  168. ;; C 08
  169. getf.sig r18 = f8
  170. xma.hu f9 = f8, f10, f0
  171. xma.l f8 = f8, f10, f0
  172. ;; C 12
  173. getf.sig r16 = f9
  174. C 13
  175. getf.sig r15 = f8
  176. ;; C 18
  177. cmp.ltu p6, p7 = r20, r15
  178. sub r15 = r20, r15
  179. sub r16 = r38, r16
  180. ;; C 19
  181.    (p6) cmp.ne p8, p9 = 1, r16 C is rH != 0?
  182.    (p7) cmp.ne p8, p9 = 0, r16 C is rH != 0?
  183.    (p6) add r16 = -1, r16
  184.    (p0) cmp.ne.unc p6, p7 = r0, r0
  185. ;; C 20
  186.    (p8) cmp.ltu p6, p7 = r15, r36
  187.    (p8) sub r15 = r15, r36
  188.    (p8) add r18 = 1, r18 C q = q + 1; done if: rH > 0
  189. ;; C 21
  190. .pred.rel "mutex",p6,p7
  191.    (p6) cmp.ne p8, p9 = 1, r16 C is rH != 0 still?
  192.    (p7) cmp.ne p8, p9 = 0, r16 C is rH != 0 still?
  193. cmp.ltu p6, p7 = r15, r36 C speculative
  194. sub r28 = r15, r36 C speculative, just for cmp
  195. ;; C 22
  196.    (p8) cmp.ltu p6, p7 = r28, r36 C redo last cmp if needed
  197.    (p8) mov r15 = r28
  198.    (p8) add r18 = 1, r18 C q = q + 1; done if: rH > 0
  199. ;; C 23
  200.    (p6) setf.sig f7 = r15
  201.    (p7) sub r15 = r15, r36
  202.    (p7) add r18 = 1, r18 C q = q + 1; done if: rH > 0
  203. ;; C 24
  204.    (p7) setf.sig f7 = r15
  205. st8 [r32] = r18, -8
  206. mov r38 = r15
  207. br.cloop.dptk .Loop1
  208. C 29/30
  209. br.sptk .L435
  210. ;;
  211. .Lunnorm:
  212. mux1 r16 = r36, @rev
  213. cmp.eq p6, p7 = 0, r35
  214.    (p6) br.cond.dpnt .L322
  215. shladd r34 = r35, 3, r34
  216. ;;
  217. adds r34 = -8, r34
  218. ;;
  219. ld8 r39 = [r34]
  220. ;;
  221. cmp.leu p6, p7 = r36, r39
  222.    (p6) br.cond.dptk .L322
  223. adds r34 = -8, r34
  224. ;;
  225. mov r38 = r39
  226. ;;
  227. cmp.ne p6, p7 = 1, r15
  228. st8 [r32] = r0, -8
  229. ;;
  230.    (p7) mov r8 = r38
  231.    (p7) br.cond.dpnt .Lret
  232. adds r35 = -1, r35
  233. .L322:
  234. sub r14 = r0, r16
  235. ;;
  236. or r14 = r16, r14
  237. ;;
  238. mov r16 = -8
  239. czx1.l r14 = r14
  240. ;;
  241. shladd r16 = r14, 3, r16
  242. ;;
  243. shr.u r14 = r36, r16
  244. ;;
  245. cmp.geu p6, p7 = 15, r14
  246. ;;
  247.    (p7) shr.u r14 = r14, 4
  248.    (p7) adds r16 = 4, r16
  249. ;;
  250. cmp.geu p6, p7 = 3, r14
  251. ;;
  252.    (p7) shr.u r14 = r14, 2
  253.    (p7) adds r16 = 2, r16
  254. ;;
  255. tbit.nz p6, p7 = r14, 1
  256. ;;
  257. .pred.rel "mutex",p6,p7
  258.   (p6) sub r40 = 62, r16
  259.   (p7) sub r40 = 63, r16
  260. ;;
  261. shl r45 = r36, r40
  262. shl r36 = r36, r40
  263. shl r38 = r38, r40
  264. br.call.sptk.many b0 = mpn_invert_limb
  265. ;;
  266. .Lpu:
  267. mov r23 = 1
  268. ;;
  269. setf.sig f6 = r8
  270. setf.sig f12 = r23
  271. cmp.eq p6, p7 = 0, r35
  272.    (p6) br.cond.dpnt .L435
  273. sub r16 = 64, r40
  274. adds r35 = -2, r35
  275. ;;
  276. ld8 r39 = [r34], -8
  277. cmp.le p6, p7 = 0, r35
  278. ;;
  279. shr.u r14 = r39, r16
  280. ;;
  281. or r38 = r14, r38
  282.    (p7) br.cond.dpnt .Lend3
  283. ;;
  284. mov r22 = r16
  285. setf.sig f10 = r36
  286. setf.sig f7 = r38
  287. mov ar.lc = r35
  288. ;;
  289. C Develop quotient limbs for unnormalized divisor
  290. .Loop3:
  291. ld8 r14 = [r34], -8
  292. xma.hu f11 = f7, f6, f0
  293. ;;
  294. xma.l f8 = f11, f12, f7 C q = q + nh
  295. ;;
  296. getf.sig r18 = f8
  297. xma.hu f9 = f8, f10, f0
  298. shl r20 = r39, r40
  299. xma.l f8 = f8, f10, f0
  300. shr.u r24 = r14, r22
  301. ;;
  302. getf.sig r16 = f9
  303. getf.sig r15 = f8
  304. or r20 = r24, r20
  305. ;;
  306. cmp.ltu p6, p7 = r20, r15
  307. sub r15 = r20, r15
  308. sub r16 = r38, r16
  309. ;;
  310.    (p6) cmp.ne p8, p9 = 1, r16 C is rH != 0?
  311.    (p7) cmp.ne p8, p9 = 0, r16 C is rH != 0?
  312.    (p6) add r16 = -1, r16
  313.    (p0) cmp.ne.unc p6, p7 = r0, r0
  314. ;;
  315.    (p8) cmp.ltu p6, p7 = r15, r36
  316.    (p8) sub r15 = r15, r36
  317.    (p8) add r18 = 1, r18 C q = q + 1; done if: rH > 0
  318. ;;
  319. .pred.rel "mutex",p6,p7
  320.    (p6) cmp.ne p8, p9 = 1, r16 C is rH != 0 still?
  321.    (p7) cmp.ne p8, p9 = 0, r16 C is rH != 0 still?
  322. cmp.ltu p6, p7 = r15, r36 C speculative
  323. sub r28 = r15, r36 C speculative, just for cmp
  324. ;;
  325.    (p8) cmp.ltu p6, p7 = r28, r36 C redo last cmp if needed
  326.    (p8) mov r15 = r28
  327.    (p8) add r18 = 1, r18 C q = q + 1; done if: rH > 0
  328. ;;
  329.    (p6) setf.sig f7 = r15
  330.    (p7) sub r15 = r15, r36
  331.    (p7) add r18 = 1, r18 C q = q + 1; done if: rH > 0
  332. ;;
  333.    (p7) setf.sig f7 = r15
  334. st8 [r32] = r18, -8
  335. mov r39 = r14
  336. mov r38 = r15
  337. br.cloop.dptk .Loop3
  338. ;;
  339. .Lend3:
  340. setf.sig f10 = r36
  341. setf.sig f7 = r38
  342. ;;
  343. xma.hu f11 = f7, f6, f0
  344. ;;
  345. xma.l f8 = f11, f12, f7 C q = q + nh
  346. ;;
  347. getf.sig r18 = f8
  348. xma.hu f9 = f8, f10, f0
  349. shl r20 = r39, r40
  350. xma.l f8 = f8, f10, f0
  351. ;;
  352. getf.sig r16 = f9
  353. getf.sig r15 = f8
  354. ;;
  355. cmp.ltu p6, p7 = r20, r15
  356. sub r15 = r20, r15
  357. sub r16 = r38, r16
  358. ;;
  359.    (p6) cmp.ne p8, p9 = 1, r16 C is rH != 0?
  360.    (p7) cmp.ne p8, p9 = 0, r16 C is rH != 0?
  361.    (p6) add r16 = -1, r16
  362.    (p0) cmp.ne.unc p6, p7 = r0, r0
  363. ;;
  364.    (p8) cmp.ltu p6, p7 = r15, r36
  365.    (p8) sub r15 = r15, r36
  366.    (p8) add r18 = 1, r18 C q = q + 1; done if: rH > 0
  367. ;;
  368. .pred.rel "mutex",p6,p7
  369.    (p6) cmp.ne p8, p9 = 1, r16 C is rH != 0 still?
  370.    (p7) cmp.ne p8, p9 = 0, r16 C is rH != 0 still?
  371. ;;
  372.    (p8) sub r15 = r15, r36
  373.    (p8) add r18 = 1, r18 C q = q + 1; done if: rH > 0
  374. ;;
  375. cmp.ltu p6, p7 = r15, r36
  376. ;;
  377.    (p7) sub r15 = r15, r36
  378.    (p7) add r18 = 1, r18 C q = q + 1; done if: rH > 0
  379. ;;
  380. st8 [r32] = r18, -8
  381. mov r38 = r15
  382. .L435:
  383. adds r35 = -1, r33
  384. cmp.le p6, p7 = 1, r33
  385.    (p7) br.cond.dpnt .Lend4
  386. ;;
  387. setf.sig f7 = r38
  388. setf.sig f10 = r36
  389. mov ar.lc = r35
  390. ;;
  391. .Loop4:
  392. xma.hu f11 = f7, f6, f0
  393. ;;
  394. xma.l f8 = f11, f12, f7 C q = q + nh
  395. ;;
  396. getf.sig r18 = f8
  397. xma.hu f9 = f8, f10, f0
  398. xma.l f8 = f8, f10, f0
  399. ;;
  400. getf.sig r16 = f9
  401. getf.sig r15 = f8
  402. ;;
  403. cmp.ltu p6, p7 = 0, r15
  404. sub r15 = 0, r15
  405. sub r16 = r38, r16
  406. ;;
  407.    (p6) cmp.ne p8, p9 = 1, r16 C is rH != 0?
  408.    (p7) cmp.ne p8, p9 = 0, r16 C is rH != 0?
  409.    (p6) add r16 = -1, r16
  410.    (p0) cmp.ne.unc p6, p7 = r0, r0
  411. ;;
  412.    (p8) cmp.ltu p6, p7 = r15, r36
  413.    (p8) sub r15 = r15, r36
  414.    (p8) add r18 = 1, r18 C q = q + 1; done if: rH > 0
  415. ;;
  416. .pred.rel "mutex",p6,p7
  417.    (p6) cmp.ne p8, p9 = 1, r16 C is rH != 0 still?
  418.    (p7) cmp.ne p8, p9 = 0, r16 C is rH != 0 still?
  419. cmp.ltu p6, p7 = r15, r36 C speculative
  420. sub r28 = r15, r36 C speculative, just for cmp
  421. ;;
  422.    (p8) cmp.ltu p6, p7 = r28, r36 C redo last cmp if needed
  423.    (p8) mov r15 = r28
  424.    (p8) add r18 = 1, r18 C q = q + 1; done if: rH > 0
  425. ;;
  426.    (p6) setf.sig f7 = r15
  427.    (p7) sub r15 = r15, r36
  428.    (p7) add r18 = 1, r18 C q = q + 1; done if: rH > 0
  429. ;;
  430.    (p7) setf.sig f7 = r15
  431. st8 [r32] = r18, -8
  432. mov r38 = r15
  433. br.cloop.dptk .Loop4
  434. ;;
  435. .Lend4:
  436. shr.u r8 = r38, r40
  437. .Lret:
  438. mov ar.pfs = r42
  439. mov ar.lc = r44
  440. mov b0 = r41
  441. br.ret.sptk.many b0
  442. EPILOGUE()
  443. ASM_END()