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

数学计算

开发平台:

Unix_Linux

  1. dnl  IA-64 mpn_mul_1, mpn_mul_1c -- Multiply a limb vector with a limb and
  2. dnl  store the result in a second limb vector.
  3. dnl  Copyright 2000, 2001, 2002, 2003, 2004, 2006, 2007 Free Software
  4. dnl  Foundation, Inc.
  5. dnl  This file is part of the GNU MP Library.
  6. dnl  The GNU MP Library is free software; you can redistribute it and/or modify
  7. dnl  it under the terms of the GNU Lesser General Public License as published
  8. dnl  by the Free Software Foundation; either version 3 of the License, or (at
  9. dnl  your option) any later version.
  10. dnl  The GNU MP Library is distributed in the hope that it will be useful, but
  11. dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  12. dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  13. dnl  License for more details.
  14. dnl  You should have received a copy of the GNU Lesser General Public License
  15. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  16. include(`../config.m4')
  17. C         cycles/limb
  18. C Itanium:    4.0
  19. C Itanium 2:  2.0
  20. C TODO
  21. C  * Further optimize feed-in and wind-down code, both for speed and code size.
  22. C  * Handle low limb input and results specially, using a common stf8 in the
  23. C    epilogue.
  24. C  * Use 1 c/l carry propagation scheme in wind-down code.
  25. C  * Use extra pointer register for `up' to speed up feed-in loads.
  26. C  * Work out final differences with addmul_1.asm.
  27. C INPUT PARAMETERS
  28. define(`rp', `r32')
  29. define(`up', `r33')
  30. define(`n', `r34')
  31. define(`vl', `r35')
  32. define(`cy', `r36') C for mpn_mul_1c
  33. ASM_START()
  34. PROLOGUE(mpn_mul_1)
  35. .prologue
  36. .save ar.lc, r2
  37. .body
  38. ifdef(`HAVE_ABI_32',
  39. ` addp4 rp = 0, rp C M I
  40. addp4 up = 0, up C M I
  41. zxt4 n = n C I
  42. ;;
  43. ')
  44. {.mfi
  45. adds r15 = -1, n C M I
  46. mov f9 = f0 C F
  47. mov.i r2 = ar.lc C I0
  48. }
  49. {.mmi
  50. ldf8 f7 = [up], 8 C M
  51. nop.m 0 C M
  52. and r14 = 3, n C M I
  53. ;;
  54. }
  55. .Lcommon:
  56. {.mii
  57. setf.sig f6 = vl C M2 M3
  58. shr.u r31 = r15, 2 C I0
  59. cmp.eq p10, p0 = 0, r14 C M I
  60. }
  61. {.mii
  62. cmp.eq p11, p0 = 2, r14 C M I
  63. cmp.eq p12, p0 = 3, r14 C M I
  64. nop.i 0 C I
  65. ;;
  66. }
  67. {.mii
  68. cmp.ne p6, p7 = r0, r0 C M I
  69. mov.i ar.lc = r31 C I0
  70. cmp.ne p8, p9 = r0, r0 C M I
  71. }
  72. {.bbb
  73.   (p10) br.dptk .Lb00 C B
  74.   (p11) br.dptk .Lb10 C B
  75.   (p12) br.dptk .Lb11 C B
  76. ;;
  77. }
  78. .Lb01: mov r20 = 0
  79. br.cloop.dptk .grt1 C B
  80. xma.l f39 = f7, f6, f9 C F
  81. xma.hu f43 = f7, f6, f9 C F
  82. ;;
  83. getf.sig r8 = f43 C M2
  84. stf8 [rp] = f39 C M2 M3
  85. mov.i ar.lc = r2 C I0
  86. br.ret.sptk.many b0 C B
  87. .grt1:
  88. ldf8 f32 = [up], 8
  89. ;;
  90. ldf8 f33 = [up], 8
  91. ;;
  92. ldf8 f34 = [up], 8
  93. xma.l f39 = f7, f6, f9
  94. xma.hu f43 = f7, f6, f9
  95. ;;
  96. ldf8 f35 = [up], 8
  97. br.cloop.dptk .grt5
  98. xma.l f36 = f32, f6, f0
  99. xma.hu f40 = f32, f6, f0
  100. ;;
  101. stf8 [rp] = f39, 8
  102. xma.l f37 = f33, f6, f0
  103. xma.hu f41 = f33, f6, f0
  104. ;;
  105. getf.sig r21 = f43
  106. getf.sig r18 = f36
  107. xma.l f38 = f34, f6, f0
  108. xma.hu f42 = f34, f6, f0
  109. ;;
  110. getf.sig r22 = f40
  111. getf.sig r19 = f37
  112. xma.l f39 = f35, f6, f0
  113. xma.hu f43 = f35, f6, f0
  114. ;;
  115. getf.sig r23 = f41
  116. getf.sig r16 = f38
  117. br .Lcj5
  118. .grt5:
  119. xma.l f36 = f32, f6, f0
  120. xma.hu f40 = f32, f6, f0
  121. ;;
  122. getf.sig r17 = f39
  123. ldf8 f32 = [up], 8
  124. xma.l f37 = f33, f6, f0
  125. xma.hu f41 = f33, f6, f0
  126. ;;
  127. getf.sig r21 = f43
  128. ldf8 f33 = [up], 8
  129. xma.l f38 = f34, f6, f0
  130. ;;
  131. getf.sig r18 = f36
  132. xma.hu f42 = f34, f6, f0
  133. ;;
  134. getf.sig r22 = f40
  135. ldf8 f34 = [up], 8
  136. xma.l f39 = f35, f6, f0
  137. ;;
  138. getf.sig r19 = f37
  139. xma.hu f43 = f35, f6, f0
  140. br .LL01
  141. .Lb10: ldf8 f35 = [up], 8
  142. mov r23 = 0
  143. br.cloop.dptk .grt2
  144. xma.l f38 = f7, f6, f9
  145. xma.hu f42 = f7, f6, f9
  146. ;;
  147. stf8 [rp] = f38, 8
  148. xma.l f39 = f35, f6, f42
  149. xma.hu f43 = f35, f6, f42
  150. ;;
  151. getf.sig r8 = f43
  152. stf8 [rp] = f39
  153. mov.i ar.lc = r2
  154. br.ret.sptk.many b0
  155. .grt2:
  156. ldf8 f32 = [up], 8
  157. ;;
  158. ldf8 f33 = [up], 8
  159. xma.l f38 = f7, f6, f9
  160. xma.hu f42 = f7, f6, f9
  161. ;;
  162. ldf8 f34 = [up], 8
  163. xma.l f39 = f35, f6, f0
  164. xma.hu f43 = f35, f6, f0
  165. ;;
  166. ldf8 f35 = [up], 8
  167. br.cloop.dptk .grt6
  168. stf8 [rp] = f38, 8
  169. xma.l f36 = f32, f6, f0
  170. xma.hu f40 = f32, f6, f0
  171. ;;
  172. getf.sig r20 = f42
  173. getf.sig r17 = f39
  174. xma.l f37 = f33, f6, f0
  175. xma.hu f41 = f33, f6, f0
  176. ;;
  177. getf.sig r21 = f43
  178. getf.sig r18 = f36
  179. xma.l f38 = f34, f6, f0
  180. xma.hu f42 = f34, f6, f0
  181. ;;
  182. getf.sig r22 = f40
  183. getf.sig r19 = f37
  184. xma.l f39 = f35, f6, f0
  185. xma.hu f43 = f35, f6, f0
  186. br .Lcj6
  187. .grt6:
  188. getf.sig r16 = f38
  189. xma.l f36 = f32, f6, f0
  190. xma.hu f40 = f32, f6, f0
  191. ;;
  192. getf.sig r20 = f42
  193. ldf8 f32 = [up], 8
  194. xma.l f37 = f33, f6, f0
  195. ;;
  196. getf.sig r17 = f39
  197. xma.hu f41 = f33, f6, f0
  198. ;;
  199. getf.sig r21 = f43
  200. ldf8 f33 = [up], 8
  201. xma.l f38 = f34, f6, f0
  202. ;;
  203. getf.sig r18 = f36
  204. xma.hu f42 = f34, f6, f0
  205. br .LL10
  206. .Lb11: ldf8 f34 = [up], 8
  207. mov r22 = 0
  208. ;;
  209. ldf8 f35 = [up], 8
  210. br.cloop.dptk .grt3
  211. ;;
  212. xma.l f37 = f7, f6, f9
  213. xma.hu f41 = f7, f6, f9
  214. xma.l f38 = f34, f6, f0
  215. xma.hu f42 = f34, f6, f0
  216. xma.l f39 = f35, f6, f0
  217. xma.hu f43 = f35, f6, f0
  218. ;;
  219. getf.sig r23 = f41
  220. stf8 [rp] = f37, 8
  221. getf.sig r16 = f38
  222. getf.sig r20 = f42
  223. getf.sig r17 = f39
  224. getf.sig r8 = f43
  225. br .Lcj3
  226. .grt3:
  227. ldf8 f32 = [up], 8
  228. xma.l f37 = f7, f6, f9
  229. xma.hu f41 = f7, f6, f9
  230. ;;
  231. ldf8 f33 = [up], 8
  232. xma.l f38 = f34, f6, f0
  233. xma.hu f42 = f34, f6, f0
  234. ;;
  235. getf.sig r19 = f37
  236. ldf8 f34 = [up], 8
  237. xma.l f39 = f35, f6, f0
  238. xma.hu f43 = f35, f6, f0
  239. ;;
  240. getf.sig r23 = f41
  241. ldf8 f35 = [up], 8
  242. br.cloop.dptk .grt7
  243. getf.sig r16 = f38
  244. xma.l f36 = f32, f6, f0
  245. getf.sig r20 = f42
  246. xma.hu f40 = f32, f6, f0
  247. ;;
  248. getf.sig r17 = f39
  249. xma.l f37 = f33, f6, f0
  250. getf.sig r21 = f43
  251. xma.hu f41 = f33, f6, f0
  252. ;;
  253. getf.sig r18 = f36
  254. st8 [rp] = r19, 8
  255. xma.l f38 = f34, f6, f0
  256. xma.hu f42 = f34, f6, f0
  257. br .Lcj7
  258. .grt7:
  259. getf.sig r16 = f38
  260. xma.l f36 = f32, f6, f0
  261. xma.hu f40 = f32, f6, f0
  262. ;;
  263. getf.sig r20 = f42
  264. ldf8 f32 = [up], 8
  265. xma.l f37 = f33, f6, f0
  266. ;;
  267. getf.sig r17 = f39
  268. xma.hu f41 = f33, f6, f0
  269. br .LL11
  270. .Lb00: ldf8 f33 = [up], 8
  271. mov r21 = 0
  272. ;;
  273. ldf8 f34 = [up], 8
  274. ;;
  275. ldf8 f35 = [up], 8
  276. xma.l f36 = f7, f6, f9
  277. xma.hu f40 = f7, f6, f9
  278. br.cloop.dptk .grt4
  279. xma.l f37 = f33, f6, f0
  280. xma.hu f41 = f33, f6, f0
  281. xma.l f38 = f34, f6, f0
  282. xma.hu f42 = f34, f6, f0
  283. ;;
  284. getf.sig r22 = f40
  285. stf8 [rp] = f36, 8
  286. xma.l f39 = f35, f6, f0
  287. getf.sig r19 = f37
  288. xma.hu f43 = f35, f6, f0
  289. ;;
  290. getf.sig r23 = f41
  291. getf.sig r16 = f38
  292. getf.sig r20 = f42
  293. getf.sig r17 = f39
  294. br .Lcj4
  295. .grt4:
  296. ldf8 f32 = [up], 8
  297. xma.l f37 = f33, f6, f0
  298. xma.hu f41 = f33, f6, f0
  299. ;;
  300. getf.sig r18 = f36
  301. ldf8 f33 = [up], 8
  302. xma.l f38 = f34, f6, f0
  303. xma.hu f42 = f34, f6, f0
  304. ;;
  305. getf.sig r22 = f40
  306. ldf8 f34 = [up], 8
  307. xma.l f39 = f35, f6, f0
  308. ;;
  309. getf.sig r19 = f37
  310. getf.sig r23 = f41
  311. xma.hu f43 = f35, f6, f0
  312. ldf8 f35 = [up], 8
  313. br.cloop.dptk .grt8
  314. getf.sig r16 = f38
  315. xma.l f36 = f32, f6, f0
  316. getf.sig r20 = f42
  317. xma.hu f40 = f32, f6, f0
  318. ;;
  319. getf.sig r17 = f39
  320. st8 [rp] = r18, 8
  321. xma.l f37 = f33, f6, f0
  322. xma.hu f41 = f33, f6, f0
  323. br .Lcj8
  324. .grt8:
  325. getf.sig r16 = f38
  326. xma.l f36 = f32, f6, f0
  327. xma.hu f40 = f32, f6, f0
  328. br .LL00
  329. C *** MAIN LOOP START ***
  330. ALIGN(32)
  331. .Loop:
  332. .pred.rel "mutex",p6,p7
  333. getf.sig r16 = f38
  334. xma.l f36 = f32, f6, f0
  335.    (p6) cmp.leu p8, p9 = r24, r17
  336. st8 [rp] = r24, 8
  337. xma.hu f40 = f32, f6, f0
  338.    (p7) cmp.ltu p8, p9 = r24, r17
  339. ;;
  340. .LL00:
  341. .pred.rel "mutex",p8,p9
  342. getf.sig r20 = f42
  343.    (p8) add r24 = r18, r21, 1
  344. nop.b 0
  345. ldf8 f32 = [up], 8
  346.    (p9) add r24 = r18, r21
  347. nop.b 0
  348. ;;
  349. .pred.rel "mutex",p8,p9
  350. getf.sig r17 = f39
  351. xma.l f37 = f33, f6, f0
  352.    (p8) cmp.leu p6, p7 = r24, r18
  353. st8 [rp] = r24, 8
  354. xma.hu f41 = f33, f6, f0
  355.    (p9) cmp.ltu p6, p7 = r24, r18
  356. ;;
  357. .LL11:
  358. .pred.rel "mutex",p6,p7
  359. getf.sig r21 = f43
  360.    (p6) add r24 = r19, r22, 1
  361. nop.b 0
  362. ldf8 f33 = [up], 8
  363.    (p7) add r24 = r19, r22
  364. nop.b 0
  365. ;;
  366. .pred.rel "mutex",p6,p7
  367. getf.sig r18 = f36
  368. xma.l f38 = f34, f6, f0
  369.    (p6) cmp.leu p8, p9 = r24, r19
  370. st8 [rp] = r24, 8
  371. xma.hu f42 = f34, f6, f0
  372.    (p7) cmp.ltu p8, p9 = r24, r19
  373. ;;
  374. .LL10:
  375. .pred.rel "mutex",p8,p9
  376. getf.sig r22 = f40
  377.    (p8) add r24 = r16, r23, 1
  378. nop.b 0
  379. ldf8 f34 = [up], 8
  380.    (p9) add r24 = r16, r23
  381. nop.b 0
  382. ;;
  383. .pred.rel "mutex",p8,p9
  384. getf.sig r19 = f37
  385. xma.l f39 = f35, f6, f0
  386.    (p8) cmp.leu p6, p7 = r24, r16
  387. st8 [rp] = r24, 8
  388. xma.hu f43 = f35, f6, f0
  389.    (p9) cmp.ltu p6, p7 = r24, r16
  390. ;;
  391. .LL01:
  392. .pred.rel "mutex",p6,p7
  393. getf.sig r23 = f41
  394.    (p6) add r24 = r17, r20, 1
  395. nop.b 0
  396. ldf8 f35 = [up], 8
  397.    (p7) add r24 = r17, r20
  398. br.cloop.dptk .Loop
  399. C *** MAIN LOOP END ***
  400. ;;
  401. .Lcj9:
  402. .pred.rel "mutex",p6,p7
  403. getf.sig r16 = f38
  404. xma.l f36 = f32, f6, f0
  405.    (p6) cmp.leu p8, p9 = r24, r17
  406. st8 [rp] = r24, 8
  407. xma.hu f40 = f32, f6, f0
  408.    (p7) cmp.ltu p8, p9 = r24, r17
  409. ;;
  410. .pred.rel "mutex",p8,p9
  411. getf.sig r20 = f42
  412.    (p8) add r24 = r18, r21, 1
  413.    (p9) add r24 = r18, r21
  414. ;;
  415. .pred.rel "mutex",p8,p9
  416. getf.sig r17 = f39
  417. xma.l f37 = f33, f6, f0
  418.    (p8) cmp.leu p6, p7 = r24, r18
  419. st8 [rp] = r24, 8
  420. xma.hu f41 = f33, f6, f0
  421.    (p9) cmp.ltu p6, p7 = r24, r18
  422. ;;
  423. .Lcj8:
  424. .pred.rel "mutex",p6,p7
  425. getf.sig r21 = f43
  426.    (p6) add r24 = r19, r22, 1
  427.    (p7) add r24 = r19, r22
  428. ;;
  429. .pred.rel "mutex",p6,p7
  430. getf.sig r18 = f36
  431. xma.l f38 = f34, f6, f0
  432.    (p6) cmp.leu p8, p9 = r24, r19
  433. st8 [rp] = r24, 8
  434. xma.hu f42 = f34, f6, f0
  435.    (p7) cmp.ltu p8, p9 = r24, r19
  436. ;;
  437. .Lcj7:
  438. .pred.rel "mutex",p8,p9
  439. getf.sig r22 = f40
  440.    (p8) add r24 = r16, r23, 1
  441.    (p9) add r24 = r16, r23
  442. ;;
  443. .pred.rel "mutex",p8,p9
  444. getf.sig r19 = f37
  445. xma.l f39 = f35, f6, f0
  446.    (p8) cmp.leu p6, p7 = r24, r16
  447. st8 [rp] = r24, 8
  448. xma.hu f43 = f35, f6, f0
  449.    (p9) cmp.ltu p6, p7 = r24, r16
  450. ;;
  451. .Lcj6:
  452. .pred.rel "mutex",p6,p7
  453. getf.sig r23 = f41
  454.    (p6) add r24 = r17, r20, 1
  455.    (p7) add r24 = r17, r20
  456. ;;
  457. .pred.rel "mutex",p6,p7
  458.    (p6) cmp.leu p8, p9 = r24, r17
  459.    (p7) cmp.ltu p8, p9 = r24, r17
  460. getf.sig r16 = f38
  461. st8 [rp] = r24, 8
  462. ;;
  463. .Lcj5:
  464. .pred.rel "mutex",p8,p9
  465. getf.sig r20 = f42
  466.    (p8) add r24 = r18, r21, 1
  467.    (p9) add r24 = r18, r21
  468. ;;
  469. .pred.rel "mutex",p8,p9
  470.    (p8) cmp.leu p6, p7 = r24, r18
  471.    (p9) cmp.ltu p6, p7 = r24, r18
  472. getf.sig r17 = f39
  473. st8 [rp] = r24, 8
  474. ;;
  475. .Lcj4:
  476. .pred.rel "mutex",p6,p7
  477. getf.sig r8 = f43
  478.    (p6) add r24 = r19, r22, 1
  479.    (p7) add r24 = r19, r22
  480. ;;
  481. .pred.rel "mutex",p6,p7
  482. st8 [rp] = r24, 8
  483.    (p6) cmp.leu p8, p9 = r24, r19
  484.    (p7) cmp.ltu p8, p9 = r24, r19
  485. ;;
  486. .Lcj3:
  487. .pred.rel "mutex",p8,p9
  488.    (p8) add r24 = r16, r23, 1
  489.    (p9) add r24 = r16, r23
  490. ;;
  491. .pred.rel "mutex",p8,p9
  492. st8 [rp] = r24, 8
  493.    (p8) cmp.leu p6, p7 = r24, r16
  494.    (p9) cmp.ltu p6, p7 = r24, r16
  495. ;;
  496. .Lcj2:
  497. .pred.rel "mutex",p6,p7
  498.    (p6) add r24 = r17, r20, 1
  499.    (p7) add r24 = r17, r20
  500. ;;
  501. .pred.rel "mutex",p6,p7
  502. st8 [rp] = r24, 8
  503.    (p6) cmp.leu p8, p9 = r24, r17
  504.    (p7) cmp.ltu p8, p9 = r24, r17
  505. ;;
  506. .pred.rel "mutex",p8,p9
  507.    (p8) add r8 = 1, r8
  508. mov.i ar.lc = r2
  509. br.ret.sptk.many b0
  510. EPILOGUE()
  511. PROLOGUE(mpn_mul_1c)
  512. .prologue
  513. .save ar.lc, r2
  514. .body
  515. ifdef(`HAVE_ABI_32',
  516. ` addp4 rp = 0, rp C M I
  517. addp4 up = 0, up C M I
  518. zxt4 n = n C I
  519. ;;
  520. ')
  521. {.mmi
  522. adds r15 = -1, n C M I
  523. setf.sig f9 = cy C M2 M3
  524. mov.i r2 = ar.lc C I0
  525. }
  526. {.mmb
  527. ldf8 f7 = [up], 8 C M
  528. and r14 = 3, n C M I
  529. br.sptk .Lcommon
  530. ;;
  531. }
  532. EPILOGUE()
  533. ASM_END()