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

数学计算

开发平台:

Unix_Linux

  1. dnl  IA-64 mpn_submul_1 -- Multiply a limb vector with a limb and subtract the
  2. dnl  result from a second limb vector.
  3. dnl  Copyright 2000, 2001, 2002, 2003, 2004 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:    4.0
  18. C Itanium 2:  2.25 (alignment dependent, sometimes it seems to need 3 c/l)
  19. C TODO
  20. C  * Optimize feed-in and wind-down code, both for speed and code size.
  21. C  * Handle low limb input and results specially, using a common stf8 in the
  22. C    epilogue.
  23. C  * Delay r8, r10 initialization, put cmp-p6 in 1st bundle and br .Ldone in
  24. C    2nd bundle.  This will allow the bbb bundle to be one cycle earlier and
  25. C    save a cycle.
  26. C INPUT PARAMETERS
  27. define(`rp', `r32')
  28. define(`up', `r33')
  29. define(`n',  `r34')
  30. define(`vl', `r35')
  31. ASM_START()
  32. PROLOGUE(mpn_submul_1)
  33. .prologue
  34. .save ar.lc, r2
  35. .body
  36. ifdef(`HAVE_ABI_32',
  37. ` addp4 rp = 0, rp C M I
  38. addp4 up = 0, up C M I
  39. zxt4 n = n C I
  40. ;;
  41. ')
  42. {.mmi
  43. mov r10 = rp C M I
  44. mov r9 = up C M I
  45. sub vl = r0, vl C M I negate vl
  46. }
  47. {.mmi
  48. ldf8 f8 = [rp], 8 C M
  49. ldf8 f7 = [up], 8 C M
  50. add r19 = -1, n C M I n - 1
  51. ;;
  52. }
  53. {.mmi
  54. cmp.eq p6, p0 = 0, vl C M I
  55. mov r8 = 0 C M I zero cylimb
  56. mov r2 = ar.lc C I0
  57. }
  58. {.mmi
  59. setf.sig f6 = vl C M2 M3
  60. and r14 = 3, n C M I
  61. shr.u r19 = r19, 2 C I0
  62. ;;
  63. }
  64. {.mmb
  65. nop 0
  66. cmp.eq p10, p0 = 0, r14 C M I
  67.    (p6) br.spnt .Ldone C B vl == 0
  68. }
  69. {.mmi
  70. cmp.eq p11, p0 = 2, r14 C M I
  71. cmp.eq p12, p0 = 3, r14 C M I
  72. mov ar.lc = r19 C I0
  73. }
  74. {.bbb
  75.   (p10) br.dptk .Lb00 C B
  76.   (p11) br.dptk .Lb10 C B
  77.   (p12) br.dptk .Lb11 C B
  78. ;;
  79. }
  80. .Lb01: br.cloop.dptk .grt1
  81. xma.l f39 = f7, f6, f8
  82. xma.hu f43 = f7, f6, f8
  83. ;;
  84. getf.sig r27 = f39 C lo
  85. getf.sig r31 = f43 C hi
  86. ld8 r20 = [r9], 8
  87. br .Lcj1
  88. .grt1: ldf8 f44 = [rp], 8
  89. ldf8 f32 = [up], 8
  90. ;;
  91. ldf8 f45 = [rp], 8
  92. ldf8 f33 = [up], 8
  93. ;;
  94. ldf8 f46 = [rp], 8
  95. xma.l f39 = f7, f6, f8
  96. ldf8 f34 = [up], 8
  97. xma.hu f43 = f7, f6, f8
  98. ;;
  99. ldf8 f47 = [rp], 8
  100. xma.l f36 = f32, f6, f44
  101. ldf8 f35 = [up], 8
  102. xma.hu f40 = f32, f6, f44
  103. br.cloop.dptk .grt5
  104. ;;
  105. getf.sig r27 = f39 C lo
  106. xma.l f37 = f33, f6, f45
  107. ld8 r20 = [r9], 8
  108. xma.hu f41 = f33, f6, f45
  109. ;;
  110. getf.sig r31 = f43 C hi
  111. getf.sig r24 = f36 C lo
  112. xma.l f38 = f34, f6, f46
  113. ld8 r21 = [r9], 8
  114. xma.hu f42 = f34, f6, f46
  115. ;;
  116. getf.sig r28 = f40 C hi
  117. getf.sig r25 = f37 C lo
  118. xma.l f39 = f35, f6, f47
  119. ld8 r22 = [r9], 8
  120. xma.hu f43 = f35, f6, f47
  121. ;;
  122. getf.sig r29 = f41 C hi
  123. getf.sig r26 = f38 C lo
  124. ld8 r23 = [r9], 8
  125. br .Lcj5
  126. .grt5: ldf8 f44 = [rp], 8
  127. ldf8 f32 = [up], 8
  128. ;;
  129. getf.sig r27 = f39 C lo
  130. xma.l f37 = f33, f6, f45
  131. ld8 r20 = [r9], 8
  132. xma.hu f41 = f33, f6, f45
  133. ;;
  134. ldf8 f45 = [rp], 8
  135. getf.sig r31 = f43 C hi
  136. ldf8 f33 = [up], 8
  137. ;;
  138. getf.sig r24 = f36 C lo
  139. xma.l f38 = f34, f6, f46
  140. ld8 r21 = [r9], 8
  141. xma.hu f42 = f34, f6, f46
  142. ;;
  143. ldf8 f46 = [rp], 8
  144. getf.sig r28 = f40 C hi
  145. ldf8 f34 = [up], 8
  146. ;;
  147. getf.sig r25 = f37 C lo
  148. xma.l f39 = f35, f6, f47
  149. ld8 r22 = [r9], 8
  150. xma.hu f43 = f35, f6, f47
  151. ;;
  152. ldf8 f47 = [rp], 8
  153. getf.sig r29 = f41 C hi
  154. ldf8 f35 = [up], 8
  155. ;;
  156. getf.sig r26 = f38 C lo
  157. xma.l f36 = f32, f6, f44
  158. ld8 r23 = [r9], 8
  159. xma.hu f40 = f32, f6, f44
  160. br.cloop.dptk .Loop
  161. br .Lend
  162. .Lb10: ldf8 f47 = [rp], 8
  163. ldf8 f35 = [up], 8
  164. br.cloop.dptk .grt2
  165. xma.l f38 = f7, f6, f8
  166. xma.hu f42 = f7, f6, f8
  167. ;;
  168. xma.l f39 = f35, f6, f47
  169. xma.hu f43 = f35, f6, f47
  170. ;;
  171. getf.sig r26 = f38 C lo
  172. getf.sig r30 = f42 C hi
  173. ld8 r23 = [r9], 8
  174. ;;
  175. getf.sig r27 = f39 C lo
  176. getf.sig r31 = f43 C hi
  177. ld8 r20 = [r9], 8
  178. br .Lcj2
  179. .grt2: ldf8 f44 = [rp], 8
  180. ldf8 f32 = [up], 8
  181. ;;
  182. ldf8 f45 = [rp], 8
  183. ldf8 f33 = [up], 8
  184. xma.l f38 = f7, f6, f8
  185. xma.hu f42 = f7, f6, f8
  186. ;;
  187. ldf8 f46 = [rp], 8
  188. ldf8 f34 = [up], 8
  189. xma.l f39 = f35, f6, f47
  190. xma.hu f43 = f35, f6, f47
  191. ;;
  192. ldf8 f47 = [rp], 8
  193. ldf8 f35 = [up], 8
  194. ;;
  195. getf.sig r26 = f38 C lo
  196. xma.l f36 = f32, f6, f44
  197. ld8 r23 = [r9], 8
  198. xma.hu f40 = f32, f6, f44
  199. br.cloop.dptk .grt6
  200. getf.sig r30 = f42 C hi
  201. ;;
  202. getf.sig r27 = f39 C lo
  203. xma.l f37 = f33, f6, f45
  204. ld8 r20 = [r9], 8
  205. xma.hu f41 = f33, f6, f45
  206. ;;
  207. getf.sig r31 = f43 C hi
  208. getf.sig r24 = f36 C lo
  209. xma.l f38 = f34, f6, f46
  210. ld8 r21 = [r9], 8
  211. xma.hu f42 = f34, f6, f46
  212. ;;
  213. getf.sig r28 = f40 C hi
  214. getf.sig r25 = f37 C lo
  215. xma.l f39 = f35, f6, f47
  216. ld8 r22 = [r9], 8
  217. xma.hu f43 = f35, f6, f47
  218. br .Lcj6
  219. .grt6: ldf8 f44 = [rp], 8
  220. getf.sig r30 = f42 C hi
  221. ldf8 f32 = [up], 8
  222. ;;
  223. getf.sig r27 = f39 C lo
  224. xma.l f37 = f33, f6, f45
  225. ld8 r20 = [r9], 8
  226. xma.hu f41 = f33, f6, f45
  227. ;;
  228. ldf8 f45 = [rp], 8
  229. getf.sig r31 = f43 C hi
  230. ldf8 f33 = [up], 8
  231. ;;
  232. getf.sig r24 = f36 C lo
  233. xma.l f38 = f34, f6, f46
  234. ld8 r21 = [r9], 8
  235. xma.hu f42 = f34, f6, f46
  236. ;;
  237. ldf8 f46 = [rp], 8
  238. getf.sig r28 = f40 C hi
  239. ldf8 f34 = [up], 8
  240. ;;
  241. getf.sig r25 = f37 C lo
  242. xma.l f39 = f35, f6, f47
  243. ld8 r22 = [r9], 8
  244. xma.hu f43 = f35, f6, f47
  245. br .LL10
  246. .Lb11: ldf8 f46 = [rp], 8
  247. ldf8 f34 = [up], 8
  248. ;;
  249. ldf8 f47 = [rp], 8
  250. ldf8 f35 = [up], 8
  251. br.cloop.dptk .grt3
  252. xma.l f37 = f7, f6, f8
  253. xma.hu f41 = f7, f6, f8
  254. ;;
  255. xma.l f38 = f34, f6, f46
  256. xma.hu f42 = f34, f6, f46
  257. ;;
  258. getf.sig r25 = f37 C lo
  259. xma.l f39 = f35, f6, f47
  260. xma.hu f43 = f35, f6, f47
  261. ;;
  262. getf.sig r29 = f41 C hi
  263. ld8 r22 = [r9], 8
  264. ;;
  265. getf.sig r26 = f38 C lo
  266. getf.sig r30 = f42 C hi
  267. ld8 r23 = [r9], 8
  268. ;;
  269. getf.sig r27 = f39 C lo
  270. getf.sig r31 = f43 C hi
  271. ld8 r20 = [r9], 8
  272. br .Lcj3
  273. .grt3: ldf8 f44 = [rp], 8
  274. xma.l f37 = f7, f6, f8
  275. ldf8 f32 = [up], 8
  276. xma.hu f41 = f7, f6, f8
  277. ;;
  278. ldf8 f45 = [rp], 8
  279. xma.l f38 = f34, f6, f46
  280. ldf8 f33 = [up], 8
  281. xma.hu f42 = f34, f6, f46
  282. ;;
  283. ldf8 f46 = [rp], 8
  284. ldf8 f34 = [up], 8
  285. ;;
  286. getf.sig r25 = f37 C lo
  287. xma.l f39 = f35, f6, f47
  288. ld8 r22 = [r9], 8
  289. xma.hu f43 = f35, f6, f47
  290. ;;
  291. ldf8 f47 = [rp], 8
  292. getf.sig r29 = f41 C hi
  293. ldf8 f35 = [up], 8
  294. ;;
  295. getf.sig r26 = f38 C lo
  296. xma.l f36 = f32, f6, f44
  297. ld8 r23 = [r9], 8
  298. xma.hu f40 = f32, f6, f44
  299. br.cloop.dptk .grt7
  300. ;;
  301. getf.sig r30 = f42 C hi
  302. getf.sig r27 = f39 C lo
  303. xma.l f37 = f33, f6, f45
  304. ld8 r20 = [r9], 8
  305. xma.hu f41 = f33, f6, f45
  306. ;;
  307. getf.sig r31 = f43 C hi
  308. getf.sig r24 = f36 C lo
  309. xma.l f38 = f34, f6, f46
  310. ld8 r21 = [r9], 8
  311. xma.hu f42 = f34, f6, f46
  312. br .Lcj7
  313. .grt7: ldf8 f44 = [rp], 8
  314. getf.sig r30 = f42 C hi
  315. ldf8 f32 = [up], 8
  316. ;;
  317. getf.sig r27 = f39 C lo
  318. xma.l f37 = f33, f6, f45
  319. ld8 r20 = [r9], 8
  320. xma.hu f41 = f33, f6, f45
  321. ;;
  322. ldf8 f45 = [rp], 8
  323. getf.sig r31 = f43 C hi
  324. ldf8 f33 = [up], 8
  325. ;;
  326. getf.sig r24 = f36 C lo
  327. xma.l f38 = f34, f6, f46
  328. ld8 r21 = [r9], 8
  329. xma.hu f42 = f34, f6, f46
  330. br .LL11
  331. .Lb00: ldf8 f45 = [rp], 8
  332. ldf8 f33 = [up], 8
  333. ;;
  334. ldf8 f46 = [rp], 8
  335. ldf8 f34 = [up], 8
  336. ;;
  337. ldf8 f47 = [rp], 8
  338. xma.l f36 = f7, f6, f8
  339. ldf8 f35 = [up], 8
  340. xma.hu f40 = f7, f6, f8
  341. br.cloop.dptk .grt4
  342. xma.l f37 = f33, f6, f45
  343. xma.hu f41 = f33, f6, f45
  344. ;;
  345. getf.sig r24 = f36 C lo
  346. xma.l f38 = f34, f6, f46
  347. ld8 r21 = [r9], 8
  348. xma.hu f42 = f34, f6, f46
  349. ;;
  350. getf.sig r28 = f40 C hi
  351. xma.l f39 = f35, f6, f47
  352. getf.sig r25 = f37 C lo
  353. ld8 r22 = [r9], 8
  354. xma.hu f43 = f35, f6, f47
  355. ;;
  356. getf.sig r29 = f41 C hi
  357. getf.sig r26 = f38 C lo
  358. ld8 r23 = [r9], 8
  359. ;;
  360. getf.sig r30 = f42 C hi
  361. getf.sig r27 = f39 C lo
  362. ld8 r20 = [r9], 8
  363. br .Lcj4
  364. .grt4: ldf8 f44 = [rp], 8
  365. xma.l f37 = f33, f6, f45
  366. ldf8 f32 = [up], 8
  367. xma.hu f41 = f33, f6, f45
  368. ;;
  369. ldf8 f45 = [rp], 8
  370. ldf8 f33 = [up], 8
  371. xma.l f38 = f34, f6, f46
  372. getf.sig r24 = f36 C lo
  373. ld8 r21 = [r9], 8
  374. xma.hu f42 = f34, f6, f46
  375. ;;
  376. ldf8 f46 = [rp], 8
  377. getf.sig r28 = f40 C hi
  378. ldf8 f34 = [up], 8
  379. xma.l f39 = f35, f6, f47
  380. getf.sig r25 = f37 C lo
  381. ld8 r22 = [r9], 8
  382. xma.hu f43 = f35, f6, f47
  383. ;;
  384. ldf8 f47 = [rp], 8
  385. getf.sig r29 = f41 C hi
  386. ldf8 f35 = [up], 8
  387. ;;
  388. getf.sig r26 = f38 C lo
  389. xma.l f36 = f32, f6, f44
  390. ld8 r23 = [r9], 8
  391. xma.hu f40 = f32, f6, f44
  392. br.cloop.dptk .grt8
  393. ;;
  394. getf.sig r30 = f42 C hi
  395. getf.sig r27 = f39 C lo
  396. xma.l f37 = f33, f6, f45
  397. ld8 r20 = [r9], 8
  398. xma.hu f41 = f33, f6, f45
  399. br .Lcj8
  400. .grt8: ldf8 f44 = [rp], 8
  401. getf.sig r30 = f42 C hi
  402. ldf8 f32 = [up], 8
  403. ;;
  404. getf.sig r27 = f39 C lo
  405. xma.l f37 = f33, f6, f45
  406. ld8 r20 = [r9], 8
  407. xma.hu f41 = f33, f6, f45
  408. br .LL00
  409. ALIGN(32)
  410. .Loop:
  411. {.mmi
  412. ldf8 f44 = [rp], 8
  413. cmp.ltu p6, p0 = r27, r8 C lo cmp
  414. sub r14 = r27, r8 C lo sub
  415. }
  416. {.mmi
  417. getf.sig r30 = f42 C hi
  418. ldf8 f32 = [up], 8
  419. sub r8 = r20, r31 C hi sub
  420. ;; C 01
  421. }
  422. {.mmf
  423. getf.sig r27 = f39 C lo
  424. st8 [r10] = r14, 8
  425. xma.l f37 = f33, f6, f45
  426. }
  427. {.mfi
  428. ld8 r20 = [r9], 8
  429. xma.hu f41 = f33, f6, f45
  430.    (p6) add r8 = 1, r8
  431. ;; C 02
  432. }
  433. {.mmi
  434. .LL00: ldf8 f45 = [rp], 8
  435. cmp.ltu p6, p0 = r24, r8
  436. sub r14 = r24, r8
  437. }
  438. {.mmi
  439. getf.sig r31 = f43 C hi
  440. ldf8 f33 = [up], 8
  441. sub r8 = r21, r28
  442. ;; C 03
  443. }
  444. {.mmf
  445. getf.sig r24 = f36 C lo
  446. st8 [r10] = r14, 8
  447. xma.l f38 = f34, f6, f46
  448. }
  449. {.mfi
  450. ld8 r21 = [r9], 8
  451. xma.hu f42 = f34, f6, f46
  452.    (p6) add r8 = 1, r8
  453. ;; C 04
  454. }
  455. {.mmi
  456. .LL11: ldf8 f46 = [rp], 8
  457. cmp.ltu p6, p0 = r25, r8
  458. sub r14 = r25, r8
  459. }
  460. {.mmi
  461. getf.sig r28 = f40 C hi
  462. ldf8 f34 = [up], 8
  463. sub r8 = r22, r29
  464. ;; C 05
  465. }
  466. {.mmf
  467. getf.sig r25 = f37 C lo
  468. st8 [r10] = r14, 8
  469. xma.l f39 = f35, f6, f47
  470. }
  471. {.mfi
  472. ld8 r22 = [r9], 8
  473. xma.hu f43 = f35, f6, f47
  474.    (p6) add r8 = 1, r8
  475. ;; C 06
  476. }
  477. {.mmi
  478. .LL10: ldf8 f47 = [rp], 8
  479. cmp.ltu p6, p0 = r26, r8
  480. sub r14 = r26, r8
  481. }
  482. {.mmi
  483. getf.sig r29 = f41 C hi
  484. ldf8 f35 = [up], 8
  485. sub r8 = r23, r30
  486. ;; C 07
  487. }
  488. {.mmf
  489. getf.sig r26 = f38 C lo
  490. st8 [r10] = r14, 8
  491. xma.l f36 = f32, f6, f44
  492. }
  493. {.mfi
  494. ld8 r23 = [r9], 8
  495. xma.hu f40 = f32, f6, f44
  496.    (p6) add r8 = 1, r8
  497. }
  498. br.cloop.dptk .Loop
  499. ;;
  500. .Lend:
  501. cmp.ltu p6, p0 = r27, r8
  502. sub r14 = r27, r8
  503. getf.sig r30 = f42
  504. sub r8 = r20, r31
  505. ;;
  506. getf.sig r27 = f39
  507. st8 [r10] = r14, 8
  508. xma.l f37 = f33, f6, f45
  509. ld8 r20 = [r9], 8
  510. xma.hu f41 = f33, f6, f45
  511.    (p6) add r8 = 1, r8
  512. ;;
  513. .Lcj8:
  514. cmp.ltu p6, p0 = r24, r8
  515. sub r14 = r24, r8
  516. getf.sig r31 = f43
  517. sub r8 = r21, r28
  518. ;;
  519. getf.sig r24 = f36
  520. st8 [r10] = r14, 8
  521. xma.l f38 = f34, f6, f46
  522. ld8 r21 = [r9], 8
  523. xma.hu f42 = f34, f6, f46
  524.    (p6) add r8 = 1, r8
  525. ;;
  526. .Lcj7:
  527. cmp.ltu p6, p0 = r25, r8
  528. sub r14 = r25, r8
  529. getf.sig r28 = f40
  530. sub r8 = r22, r29
  531. ;;
  532. getf.sig r25 = f37
  533. st8 [r10] = r14, 8
  534. xma.l f39 = f35, f6, f47
  535. ld8 r22 = [r9], 8
  536. xma.hu f43 = f35, f6, f47
  537.    (p6) add r8 = 1, r8
  538. ;;
  539. .Lcj6:
  540. cmp.ltu p6, p0 = r26, r8
  541. sub r14 = r26, r8
  542. getf.sig r29 = f41
  543. sub r8 = r23, r30
  544. ;;
  545. getf.sig r26 = f38
  546. st8 [r10] = r14, 8
  547. ld8 r23 = [r9], 8
  548.    (p6) add r8 = 1, r8
  549. ;;
  550. .Lcj5:
  551. cmp.ltu p6, p0 = r27, r8
  552. sub r14 = r27, r8
  553. getf.sig r30 = f42
  554. sub r8 = r20, r31
  555. ;;
  556. getf.sig r27 = f39
  557. st8 [r10] = r14, 8
  558. ld8 r20 = [r9], 8
  559.    (p6) add r8 = 1, r8
  560. ;;
  561. .Lcj4:
  562. cmp.ltu p6, p0 = r24, r8
  563. sub r14 = r24, r8
  564. getf.sig r31 = f43
  565. sub r8 = r21, r28
  566. ;;
  567. st8 [r10] = r14, 8
  568.    (p6) add r8 = 1, r8
  569. ;;
  570. .Lcj3:
  571. cmp.ltu p6, p0 = r25, r8
  572. sub r14 = r25, r8
  573. sub r8 = r22, r29
  574. ;;
  575. st8 [r10] = r14, 8
  576.    (p6) add r8 = 1, r8
  577. ;;
  578. .Lcj2:
  579. cmp.ltu p6, p0 = r26, r8
  580. sub r14 = r26, r8
  581. sub r8 = r23, r30
  582. ;;
  583. st8 [r10] = r14, 8
  584.    (p6) add r8 = 1, r8
  585. ;;
  586. .Lcj1:
  587. cmp.ltu p6, p0 = r27, r8
  588. sub r14 = r27, r8
  589. sub r8 = r20, r31
  590. ;;
  591. st8 [r10] = r14, 8
  592. mov ar.lc = r2
  593.    (p6) add r8 = 1, r8
  594. br.ret.sptk.many b0
  595. .Ldone: mov ar.lc = r2
  596. br.ret.sptk.many b0
  597. EPILOGUE()
  598. ASM_END()