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

数学计算

开发平台:

Unix_Linux

  1. dnl  IA-64 mpn_addmul_1 -- Multiply a limb vector with a limb and add the
  2. dnl  result to a second limb vector.
  3. dnl  Copyright 2000, 2001, 2002, 2003, 2004, 2005, 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:    3.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 registers for `up' and rp to speed up feed-in loads.
  26. C  * Work out final differences with mul_1.asm.  That function is 300 bytes
  27. C    smaller than this due to better loop scheduling and thus simpler feed-in
  28. C    code.
  29. C INPUT PARAMETERS
  30. define(`rp', `r32')
  31. define(`up', `r33')
  32. define(`n', `r34')
  33. define(`vl', `r35')
  34. ASM_START()
  35. PROLOGUE(mpn_addmul_1)
  36. .prologue
  37. .save ar.lc, r2
  38. .body
  39. ifdef(`HAVE_ABI_32',
  40. ` addp4 rp = 0, rp C M I
  41. addp4 up = 0, up C M I
  42. zxt4 n = n C I
  43. ;;
  44. ')
  45. {.mmi
  46. adds r15 = -1, n C M I
  47. mov r20 = rp C M I
  48. mov.i r2 = ar.lc C I0
  49. }
  50. {.mmi
  51. ldf8 f7 = [up], 8 C M
  52. ldf8 f8 = [rp], 8 C M
  53. and r14 = 3, n C M I
  54. ;;
  55. }
  56. {.mmi
  57. setf.sig f6 = vl C M2 M3
  58. cmp.eq p10, p0 = 0, r14 C M I
  59. shr.u r31 = r15, 2 C I0
  60. }
  61. {.mmi
  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: br.cloop.dptk .grt1 C B
  79. xma.l f39 = f7, f6, f8 C F
  80. xma.hu f43 = f7, f6, f8 C F
  81. ;;
  82. getf.sig r8 = f43 C M2
  83. stf8 [r20] = f39 C M2 M3
  84. mov.i ar.lc = r2 C I0
  85. br.ret.sptk.many b0 C B
  86. .grt1:
  87. ldf8 f32 = [up], 8
  88. ldf8 f44 = [rp], 8
  89. ;;
  90. ldf8 f33 = [up], 8
  91. ldf8 f45 = [rp], 8
  92. ;;
  93. ldf8 f34 = [up], 8
  94. xma.l f39 = f7, f6, f8
  95. ldf8 f46 = [rp], 8
  96. xma.hu f43 = f7, f6, f8
  97. ;;
  98. ldf8 f35 = [up], 8
  99. ldf8 f47 = [rp], 8
  100. br.cloop.dptk .grt5
  101. xma.l f36 = f32, f6, f44
  102. xma.hu f40 = f32, f6, f44
  103. ;;
  104. stf8 [r20] = f39, 8
  105. xma.l f37 = f33, f6, f45
  106. xma.hu f41 = f33, f6, f45
  107. ;;
  108. getf.sig r31 = f43
  109. getf.sig r24 = f36
  110. xma.l f38 = f34, f6, f46
  111. xma.hu f42 = f34, f6, f46
  112. ;;
  113. getf.sig r28 = f40
  114. getf.sig r25 = f37
  115. xma.l f39 = f35, f6, f47
  116. xma.hu f43 = f35, f6, f47
  117. ;;
  118. getf.sig r29 = f41
  119. getf.sig r26 = f38
  120. br .Lcj5
  121. .grt5:
  122. mov r30 = 0
  123. xma.l f36 = f32, f6, f44
  124. xma.hu f40 = f32, f6, f44
  125. ;;
  126. ldf8 f32 = [up], 8
  127. xma.l f37 = f33, f6, f45
  128. ldf8 f44 = [rp], 8
  129. xma.hu f41 = f33, f6, f45
  130. ;;
  131. ldf8 f33 = [up], 8
  132. getf.sig r27 = f39
  133. ;;
  134. getf.sig r31 = f43
  135. xma.l f38 = f34, f6, f46
  136. ldf8 f45 = [rp], 8
  137. xma.hu f42 = f34, f6, f46
  138. ;;
  139. ldf8 f34 = [up], 8
  140. getf.sig r24 = f36
  141. ;;
  142. getf.sig r28 = f40
  143. xma.l f39 = f35, f6, f47
  144. ldf8 f46 = [rp], 8
  145. xma.hu f43 = f35, f6, f47
  146. ;;
  147. ldf8 f35 = [up], 8
  148. getf.sig r25 = f37
  149. br.cloop.dptk .Loop
  150. br .Le0
  151. .Lb10: ldf8 f35 = [up], 8
  152. ldf8 f47 = [rp], 8
  153. br.cloop.dptk .grt2
  154. xma.l f38 = f7, f6, f8
  155. xma.hu f42 = f7, f6, f8
  156. ;;
  157. xma.l f39 = f35, f6, f47
  158. xma.hu f43 = f35, f6, f47
  159. ;;
  160. getf.sig r30 = f42
  161. stf8 [r20] = f38, 8
  162. getf.sig r27 = f39
  163. getf.sig r8 = f43
  164. br .Lcj2
  165. .grt2:
  166. ldf8 f32 = [up], 8
  167. ldf8 f44 = [rp], 8
  168. ;;
  169. ldf8 f33 = [up], 8
  170. xma.l f38 = f7, f6, f8
  171. ldf8 f45 = [rp], 8
  172. xma.hu f42 = f7, f6, f8
  173. ;;
  174. ldf8 f34 = [up], 8
  175. xma.l f39 = f35, f6, f47
  176. ldf8 f46 = [rp], 8
  177. xma.hu f43 = f35, f6, f47
  178. ;;
  179. ldf8 f35 = [up], 8
  180. ldf8 f47 = [rp], 8
  181. br.cloop.dptk .grt6
  182. stf8 [r20] = f38, 8
  183. xma.l f36 = f32, f6, f44
  184. xma.hu f40 = f32, f6, f44
  185. ;;
  186. getf.sig r30 = f42
  187. getf.sig r27 = f39
  188. xma.l f37 = f33, f6, f45
  189. xma.hu f41 = f33, f6, f45
  190. ;;
  191. getf.sig r31 = f43
  192. getf.sig r24 = f36
  193. xma.l f38 = f34, f6, f46
  194. xma.hu f42 = f34, f6, f46
  195. ;;
  196. getf.sig r28 = f40
  197. getf.sig r25 = f37
  198. xma.l f39 = f35, f6, f47
  199. xma.hu f43 = f35, f6, f47
  200. br .Lcj6
  201. .grt6:
  202. mov r29 = 0
  203. xma.l f36 = f32, f6, f44
  204. xma.hu f40 = f32, f6, f44
  205. ;;
  206. ldf8 f32 = [up], 8
  207. getf.sig r26 = f38
  208. ;;
  209. getf.sig r30 = f42
  210. xma.l f37 = f33, f6, f45
  211. ldf8 f44 = [rp], 8
  212. xma.hu f41 = f33, f6, f45
  213. ;;
  214. ldf8 f33 = [up], 8
  215. getf.sig r27 = f39
  216. ;;
  217. getf.sig r31 = f43
  218. xma.l f38 = f34, f6, f46
  219. ldf8 f45 = [rp], 8
  220. xma.hu f42 = f34, f6, f46
  221. ;;
  222. ldf8 f34 = [up], 8
  223. getf.sig r24 = f36
  224. br .LL10
  225. .Lb11: ldf8 f34 = [up], 8
  226. ldf8 f46 = [rp], 8
  227. ;;
  228. ldf8 f35 = [up], 8
  229. ldf8 f47 = [rp], 8
  230. br.cloop.dptk .grt3
  231. ;;
  232. xma.l f37 = f7, f6, f8
  233. xma.hu f41 = f7, f6, f8
  234. xma.l f38 = f34, f6, f46
  235. xma.hu f42 = f34, f6, f46
  236. xma.l f39 = f35, f6, f47
  237. xma.hu f43 = f35, f6, f47
  238. ;;
  239. getf.sig r29 = f41
  240. stf8 [r20] = f37, 8
  241. getf.sig r26 = f38
  242. getf.sig r30 = f42
  243. getf.sig r27 = f39
  244. getf.sig r8 = f43
  245. br .Lcj3
  246. .grt3:
  247. ldf8 f32 = [up], 8
  248. xma.l f37 = f7, f6, f8
  249. ldf8 f44 = [rp], 8
  250. xma.hu f41 = f7, f6, f8
  251. ;;
  252. ldf8 f33 = [up], 8
  253. xma.l f38 = f34, f6, f46
  254. ldf8 f45 = [rp], 8
  255. xma.hu f42 = f34, f6, f46
  256. ;;
  257. ldf8 f34 = [up], 8
  258. xma.l f39 = f35, f6, f47
  259. ldf8 f46 = [rp], 8
  260. xma.hu f43 = f35, f6, f47
  261. ;;
  262. ldf8 f35 = [up], 8
  263. getf.sig r25 = f37 C FIXME
  264. ldf8 f47 = [rp], 8
  265. br.cloop.dptk .grt7
  266. getf.sig r29 = f41
  267. stf8 [r20] = f37, 8 C FIXME
  268. xma.l f36 = f32, f6, f44
  269. getf.sig r26 = f38
  270. xma.hu f40 = f32, f6, f44
  271. ;;
  272. getf.sig r30 = f42
  273. xma.l f37 = f33, f6, f45
  274. getf.sig r27 = f39
  275. xma.hu f41 = f33, f6, f45
  276. ;;
  277. getf.sig r31 = f43
  278. xma.l f38 = f34, f6, f46
  279. getf.sig r24 = f36
  280. xma.hu f42 = f34, f6, f46
  281. br .Lcj7
  282. .grt7:
  283. getf.sig r29 = f41
  284. xma.l f36 = f32, f6, f44
  285. mov r28 = 0
  286. xma.hu f40 = f32, f6, f44
  287. ;;
  288. ldf8 f32 = [up], 8
  289. getf.sig r26 = f38
  290. ;;
  291. getf.sig r30 = f42
  292. xma.l f37 = f33, f6, f45
  293. ldf8 f44 = [rp], 8
  294. xma.hu f41 = f33, f6, f45
  295. ;;
  296. ldf8 f33 = [up], 8
  297. getf.sig r27 = f39
  298. br .LL11
  299. .Lb00: ldf8 f33 = [up], 8
  300. ldf8 f45 = [rp], 8
  301. ;;
  302. ldf8 f34 = [up], 8
  303. ldf8 f46 = [rp], 8
  304. ;;
  305. ldf8 f35 = [up], 8
  306. xma.l f36 = f7, f6, f8
  307. ldf8 f47 = [rp], 8
  308. xma.hu f40 = f7, f6, f8
  309. br.cloop.dptk .grt4
  310. xma.l f37 = f33, f6, f45
  311. xma.hu f41 = f33, f6, f45
  312. xma.l f38 = f34, f6, f46
  313. xma.hu f42 = f34, f6, f46
  314. ;;
  315. getf.sig r28 = f40
  316. stf8 [r20] = f36, 8
  317. xma.l f39 = f35, f6, f47
  318. getf.sig r25 = f37
  319. xma.hu f43 = f35, f6, f47
  320. ;;
  321. getf.sig r29 = f41
  322. getf.sig r26 = f38
  323. getf.sig r30 = f42
  324. getf.sig r27 = f39
  325. br .Lcj4
  326. .grt4:
  327. ldf8 f32 = [up], 8
  328. xma.l f37 = f33, f6, f45
  329. ldf8 f44 = [rp], 8
  330. xma.hu f41 = f33, f6, f45
  331. ;;
  332. ldf8 f33 = [up], 8
  333. xma.l f38 = f34, f6, f46
  334. ldf8 f45 = [rp], 8
  335. xma.hu f42 = f34, f6, f46
  336. ;;
  337. ldf8 f34 = [up], 8
  338. getf.sig r24 = f36 C FIXME
  339. xma.l f39 = f35, f6, f47
  340. ldf8 f46 = [rp], 8
  341. getf.sig r28 = f40
  342. xma.hu f43 = f35, f6, f47
  343. ;;
  344. ldf8 f35 = [up], 8
  345. getf.sig r25 = f37
  346. ldf8 f47 = [rp], 8
  347. br.cloop.dptk .grt8
  348. getf.sig r29 = f41
  349. stf8 [r20] = f36, 8 C FIXME
  350. xma.l f36 = f32, f6, f44
  351. getf.sig r26 = f38
  352. getf.sig r30 = f42
  353. xma.hu f40 = f32, f6, f44
  354. ;;
  355. xma.l f37 = f33, f6, f45
  356. getf.sig r27 = f39
  357. xma.hu f41 = f33, f6, f45
  358. br .Lcj8
  359. .grt8:
  360. getf.sig r29 = f41
  361. xma.l f36 = f32, f6, f44
  362. mov r31 = 0
  363. xma.hu f40 = f32, f6, f44
  364. ;;
  365. ldf8 f32 = [up], 8
  366. getf.sig r26 = f38
  367. br .LL00
  368. C *** MAIN LOOP START ***
  369. ALIGN(32) C insn fed cycle #
  370. .Loop:
  371. .pred.rel "mutex", p6, p7 C num by i1 i2
  372. getf.sig r29 = f41 C 00 16 0   0
  373. xma.l f36 = f32, f6, f44 C 01 06,15 0   0
  374.    (p6) add r14 = r30, r27, 1 C 02 0   0
  375. ldf8 f47 = [rp], 8 C 03 0   0
  376. xma.hu f40 = f32, f6, f44 C 04 06,15 0   0
  377.    (p7) add r14 = r30, r27 C 05 0   0
  378. ;;
  379. .pred.rel "mutex", p6, p7
  380. ldf8 f32 = [up], 8 C 06 1   1
  381.    (p6) cmp.leu p8, p9 = r14, r27 C 07 1   1
  382.    (p7) cmp.ltu p8, p9 = r14, r27 C 08 1   1
  383. getf.sig r26 = f38 C 09 25 2   1
  384. st8 [r20] = r14, 8 C 10 2   1
  385. nop.b 0 C 11 2   1
  386. ;;
  387. .LL00:
  388. .pred.rel "mutex", p8, p9
  389. getf.sig r30 = f42 C 12 28 3   2
  390. xma.l f37 = f33, f6, f45 C 13 18,27 3   2
  391.    (p8) add r16 = r31, r24, 1 C 14 3   2
  392. ldf8 f44 = [rp], 8 C 15 3   2
  393. xma.hu f41 = f33, f6, f45 C 16 18,27 3   2
  394.    (p9) add r16 = r31, r24 C 17 3   2
  395. ;;
  396. .pred.rel "mutex", p8, p9
  397. ldf8 f33 = [up], 8 C 18 4   3
  398.    (p8) cmp.leu p6, p7 = r16, r24 C 19 4   3
  399.    (p9) cmp.ltu p6, p7 = r16, r24 C 20 4   3
  400. getf.sig r27 = f39 C 21 37 5   3
  401. st8 [r20] = r16, 8 C 22 5   3
  402. nop.b 0 C 23 5   3
  403. ;;
  404. .LL11:
  405. .pred.rel "mutex", p6, p7
  406. getf.sig r31 = f43 C 24 40 6   4
  407. xma.l f38 = f34, f6, f46 C 25 30,39 6   4
  408.    (p6) add r14 = r28, r25, 1 C 26 6   4
  409. ldf8 f45 = [rp], 8 C 27 6   4
  410. xma.hu f42 = f34, f6, f46 C 28 30,39 6   4
  411.    (p7) add r14 = r28, r25 C 29 6   4
  412. ;;
  413. .pred.rel "mutex", p6, p7
  414. ldf8 f34 = [up], 8 C 30 7   5
  415.    (p6) cmp.leu p8, p9 = r14, r25 C 31 7   5
  416.    (p7) cmp.ltu p8, p9 = r14, r25 C 32 7   5
  417. getf.sig r24 = f36 C 33 01 8   5
  418. st8 [r20] = r14, 8 C 34 8   5
  419. nop.b 0 C 35 8   5
  420. ;;
  421. .LL10:
  422. .pred.rel "mutex", p8, p9
  423. getf.sig r28 = f40 C 36 04 9   6
  424. xma.l f39 = f35, f6, f47 C 37 42,03 9   6
  425.    (p8) add r16 = r29, r26, 1 C 38 9   6
  426. ldf8 f46 = [rp], 8 C 39 9   6
  427. xma.hu f43 = f35, f6, f47 C 40 42,03 9   6
  428.    (p9) add r16 = r29, r26 C 41 9   6
  429. ;;
  430. .pred.rel "mutex", p8, p9
  431. ldf8 f35 = [up], 8 C 42        10   7
  432.    (p8) cmp.leu p6, p7 = r16, r26 C 43        10   7
  433.    (p9) cmp.ltu p6, p7 = r16, r26 C 44        10   7
  434. getf.sig r25 = f37 C 45 13     11   7
  435. st8 [r20] = r16, 8 C 46        11   7
  436. br.cloop.dptk .Loop C 47        11   7
  437. C *** MAIN LOOP END ***
  438. ;;
  439. .Le0:
  440. .pred.rel "mutex", p6, p7
  441. getf.sig r29 = f41 C
  442. xma.l f36 = f32, f6, f44 C
  443.    (p6) add r14 = r30, r27, 1 C
  444. ldf8 f47 = [rp], 8 C
  445. xma.hu f40 = f32, f6, f44 C
  446.    (p7) add r14 = r30, r27 C
  447. ;;
  448. .pred.rel "mutex", p6, p7
  449.    (p6) cmp.leu p8, p9 = r14, r27 C
  450.    (p7) cmp.ltu p8, p9 = r14, r27 C
  451. getf.sig r26 = f38 C
  452. st8 [r20] = r14, 8 C
  453. ;;
  454. .pred.rel "mutex", p8, p9
  455. getf.sig r30 = f42 C
  456. xma.l f37 = f33, f6, f45 C
  457.    (p8) add r16 = r31, r24, 1 C
  458. xma.hu f41 = f33, f6, f45 C
  459.    (p9) add r16 = r31, r24 C
  460. ;;
  461. .pred.rel "mutex", p8, p9
  462.    (p8) cmp.leu p6, p7 = r16, r24 C
  463.    (p9) cmp.ltu p6, p7 = r16, r24 C
  464. getf.sig r27 = f39 C
  465. st8 [r20] = r16, 8 C
  466. ;;
  467. .Lcj8:
  468. .pred.rel "mutex", p6, p7
  469. getf.sig r31 = f43 C
  470. xma.l f38 = f34, f6, f46 C
  471.    (p6) add r14 = r28, r25, 1 C
  472. xma.hu f42 = f34, f6, f46 C
  473.    (p7) add r14 = r28, r25 C
  474. ;;
  475. .pred.rel "mutex", p6, p7
  476.    (p6) cmp.leu p8, p9 = r14, r25 C
  477.    (p7) cmp.ltu p8, p9 = r14, r25 C
  478. getf.sig r24 = f36 C
  479. st8 [r20] = r14, 8 C
  480. ;;
  481. .Lcj7:
  482. .pred.rel "mutex", p8, p9
  483. getf.sig r28 = f40 C
  484. xma.l f39 = f35, f6, f47 C
  485.    (p8) add r16 = r29, r26, 1 C
  486. xma.hu f43 = f35, f6, f47 C
  487.    (p9) add r16 = r29, r26 C
  488. ;;
  489. .pred.rel "mutex", p8, p9
  490.    (p8) cmp.leu p6, p7 = r16, r26 C
  491.    (p9) cmp.ltu p6, p7 = r16, r26 C
  492. getf.sig r25 = f37 C
  493. st8 [r20] = r16, 8 C
  494. ;;
  495. .Lcj6:
  496. .pred.rel "mutex", p6, p7
  497. getf.sig r29 = f41 C
  498.    (p6) add r14 = r30, r27, 1 C
  499.    (p7) add r14 = r30, r27 C
  500. ;;
  501. .pred.rel "mutex", p6, p7
  502.    (p6) cmp.leu p8, p9 = r14, r27 C
  503.    (p7) cmp.ltu p8, p9 = r14, r27 C
  504. getf.sig r26 = f38 C
  505. st8 [r20] = r14, 8 C
  506. ;;
  507. .Lcj5:
  508. .pred.rel "mutex", p8, p9
  509. getf.sig r30 = f42 C
  510.    (p8) add r16 = r31, r24, 1 C
  511.    (p9) add r16 = r31, r24 C
  512. ;;
  513. .pred.rel "mutex", p8, p9
  514.    (p8) cmp.leu p6, p7 = r16, r24 C
  515.    (p9) cmp.ltu p6, p7 = r16, r24 C
  516. getf.sig r27 = f39 C
  517. st8 [r20] = r16, 8 C
  518. ;;
  519. .Lcj4:
  520. .pred.rel "mutex", p6, p7
  521. getf.sig r8 = f43 C
  522.    (p6) add r14 = r28, r25, 1 C
  523.    (p7) add r14 = r28, r25 C
  524. ;;
  525. .pred.rel "mutex", p6, p7
  526. st8 [r20] = r14, 8 C
  527.    (p6) cmp.leu p8, p9 = r14, r25 C
  528.    (p7) cmp.ltu p8, p9 = r14, r25 C
  529. ;;
  530. .Lcj3:
  531. .pred.rel "mutex", p8, p9
  532.    (p8) add r16 = r29, r26, 1 C
  533.    (p9) add r16 = r29, r26 C
  534. ;;
  535. .pred.rel "mutex", p8, p9
  536. st8 [r20] = r16, 8 C
  537.    (p8) cmp.leu p6, p7 = r16, r26 C
  538.    (p9) cmp.ltu p6, p7 = r16, r26 C
  539. ;;
  540. .Lcj2:
  541. .pred.rel "mutex", p6, p7
  542.    (p6) add r14 = r30, r27, 1 C
  543.    (p7) add r14 = r30, r27 C
  544. ;;
  545. .pred.rel "mutex", p6, p7
  546. st8 [r20] = r14 C
  547.    (p6) cmp.leu p8, p9 = r14, r27 C
  548.    (p7) cmp.ltu p8, p9 = r14, r27 C
  549. ;;
  550.    (p8) add r8 = 1, r8 C M I
  551. mov.i ar.lc = r2 C I0
  552. br.ret.sptk.many b0 C B
  553. EPILOGUE()
  554. ASM_END()