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

数学计算

开发平台:

Unix_Linux

  1. dnl  HP-PA 2.0 64-bit mpn_addmul_1 -- Multiply a limb vector with a limb and
  2. dnl  add the result to a second limb vector.
  3. dnl  Copyright 1998, 1999, 2000, 2002, 2003 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 8000,8200: 7
  18. C 8500,8600,8700: 6.375
  19. C  The feed-in and wind-down code has not yet been scheduled.  Many cycles
  20. C  could be saved there per call.
  21. C  DESCRIPTION:
  22. C  The main loop "BIG" is 4-way unrolled, mainly to allow
  23. C  effective use of ADD,DC.  Delays in moving data via the cache from the FP
  24. C  registers to the IU registers, have demanded a deep software pipeline, and
  25. C  a lot of stack slots for partial products in flight.
  26. C
  27. C  CODE STRUCTURE:
  28. C  save-some-registers
  29. C  do 0, 1, 2, or 3 limbs
  30. C  if done, restore-some-regs and return
  31. C  save-many-regs
  32. C  do 4, 8, ... limb
  33. C  restore-all-regs
  34. C  STACK LAYOUT:
  35. C  HP-PA stack grows upwards.  We could allocate 8 fewer slots by using the
  36. C  slots marked FREE, as well as some slots in the caller's "frame marker".
  37. C
  38. C -00 <- r30
  39. C -08  FREE
  40. C -10  tmp
  41. C -18  tmp
  42. C -20  tmp
  43. C -28  tmp
  44. C -30  tmp
  45. C -38  tmp
  46. C -40  tmp
  47. C -48  tmp
  48. C -50  tmp
  49. C -58  tmp
  50. C -60  tmp
  51. C -68  tmp
  52. C -70  tmp
  53. C -78  tmp
  54. C -80  tmp
  55. C -88  tmp
  56. C -90  FREE
  57. C -98  FREE
  58. C -a0  FREE
  59. C -a8  FREE
  60. C -b0  r13
  61. C -b8  r12
  62. C -c0  r11
  63. C -c8  r10
  64. C -d0  r8
  65. C -d8  r8
  66. C -e0  r7
  67. C -e8  r6
  68. C -f0  r5
  69. C -f8  r4
  70. C -100 r3
  71. C  Previous frame:
  72. C  [unused area]
  73. C -38/-138 vlimb home slot.  For 2.0N, the vlimb arg will arrive here.
  74. include(`../config.m4')
  75. C INPUT PARAMETERS:
  76. define(`rp',`%r26') C
  77. define(`up',`%r25') C
  78. define(`n',`%r24') C
  79. define(`vlimb',`%r23') C
  80. define(`climb',`%r23') C
  81. ifdef(`HAVE_ABI_2_0w',
  82. ` .level 2.0w
  83. ',` .level 2.0
  84. ')
  85. PROLOGUE(mpn_addmul_1)
  86. ifdef(`HAVE_ABI_2_0w',
  87. ` std vlimb, -0x38(%r30) C store vlimb into "home" slot
  88. ')
  89. std,ma %r3, 0x100(%r30)
  90. std %r4, -0xf8(%r30)
  91. std %r5, -0xf0(%r30)
  92. ldo 0(%r0), climb C clear climb
  93. fldd -0x138(%r30), %fr8 C put vlimb in fp register
  94. define(`p032a1',`%r1') C
  95. define(`p032a2',`%r19') C
  96. define(`m032',`%r20') C
  97. define(`m096',`%r21') C
  98. define(`p000a',`%r22') C
  99. define(`p064a',`%r29') C
  100. define(`s000',`%r31') C
  101. define(`ma000',`%r4') C
  102. define(`ma064',`%r20') C
  103. define(`r000',`%r3') C
  104. extrd,u n, 63, 2, %r5
  105. cmpb,= %r5, %r0, L(BIG)
  106. nop
  107. fldd 0(up), %fr4
  108. ldo 8(up), up
  109. xmpyu %fr8R, %fr4L, %fr22
  110. xmpyu %fr8L, %fr4R, %fr23
  111. fstd %fr22, -0x78(%r30) C mid product to  -0x78..-0x71
  112. xmpyu %fr8R, %fr4R, %fr24
  113. xmpyu %fr8L, %fr4L, %fr25
  114. fstd %fr23, -0x70(%r30) C mid product to  -0x70..-0x69
  115. fstd %fr24, -0x80(%r30) C low product to  -0x80..-0x79
  116. addib,<> -1, %r5, L(two_or_more)
  117. fstd %fr25, -0x68(%r30) C high product to -0x68..-0x61
  118. LDEF(one)
  119. ldd -0x78(%r30), p032a1
  120. ldd -0x70(%r30), p032a2
  121. ldd -0x80(%r30), p000a
  122. b L(0_one_out)
  123. ldd -0x68(%r30), p064a
  124. LDEF(two_or_more)
  125. fldd 0(up), %fr4
  126. ldo 8(up), up
  127. xmpyu %fr8R, %fr4L, %fr22
  128. xmpyu %fr8L, %fr4R, %fr23
  129. ldd -0x78(%r30), p032a1
  130. fstd %fr22, -0x78(%r30) C mid product to  -0x78..-0x71
  131. xmpyu %fr8R, %fr4R, %fr24
  132. xmpyu %fr8L, %fr4L, %fr25
  133. ldd -0x70(%r30), p032a2
  134. fstd %fr23, -0x70(%r30) C mid product to  -0x70..-0x69
  135. ldd -0x80(%r30), p000a
  136. fstd %fr24, -0x80(%r30) C low product to  -0x80..-0x79
  137. ldd -0x68(%r30), p064a
  138. addib,<> -1, %r5, L(three_or_more)
  139. fstd %fr25, -0x68(%r30) C high product to -0x68..-0x61
  140. LDEF(two)
  141. add p032a1, p032a2, m032
  142. add,dc %r0, %r0, m096
  143. depd,z m032, 31, 32, ma000
  144. extrd,u m032, 31, 32, ma064
  145. ldd 0(rp), r000
  146. b L(0_two_out)
  147. depd m096, 31, 32, ma064
  148. LDEF(three_or_more)
  149. fldd 0(up), %fr4
  150. add p032a1, p032a2, m032
  151. add,dc %r0, %r0, m096
  152. depd,z m032, 31, 32, ma000
  153. extrd,u m032, 31, 32, ma064
  154. ldd 0(rp), r000
  155. C addib,= -1, %r5, L(0_out)
  156. depd m096, 31, 32, ma064
  157. LDEF(loop0)
  158. C xmpyu %fr8R, %fr4L, %fr22
  159. C xmpyu %fr8L, %fr4R, %fr23
  160. C ldd -0x78(%r30), p032a1
  161. C fstd %fr22, -0x78(%r30) C mid product to  -0x78..-0x71
  162. C
  163. C xmpyu %fr8R, %fr4R, %fr24
  164. C xmpyu %fr8L, %fr4L, %fr25
  165. C ldd -0x70(%r30), p032a2
  166. C fstd %fr23, -0x70(%r30) C mid product to  -0x70..-0x69
  167. C
  168. C ldo 8(rp), rp
  169. C add climb, p000a, s000
  170. C ldd -0x80(%r30), p000a
  171. C fstd %fr24, -0x80(%r30) C low product to  -0x80..-0x79
  172. C
  173. C add,dc p064a, %r0, climb
  174. C ldo 8(up), up
  175. C ldd -0x68(%r30), p064a
  176. C fstd %fr25, -0x68(%r30) C high product to -0x68..-0x61
  177. C
  178. C add ma000, s000, s000
  179. C add,dc ma064, climb, climb
  180. C fldd 0(up), %fr4
  181. C
  182. C add r000, s000, s000
  183. C add,dc %r0, climb, climb
  184. C std s000, -8(rp)
  185. C
  186. C add p032a1, p032a2, m032
  187. C add,dc %r0, %r0, m096
  188. C
  189. C depd,z m032, 31, 32, ma000
  190. C extrd,u m032, 31, 32, ma064
  191. C ldd 0(rp), r000
  192. C addib,<> -1, %r5, L(loop0)
  193. C depd m096, 31, 32, ma064
  194. LDEF(0_out)
  195. ldo 8(up), up
  196. xmpyu %fr8R, %fr4L, %fr22
  197. xmpyu %fr8L, %fr4R, %fr23
  198. ldd -0x78(%r30), p032a1
  199. fstd %fr22, -0x78(%r30) C mid product to  -0x78..-0x71
  200. xmpyu %fr8R, %fr4R, %fr24
  201. xmpyu %fr8L, %fr4L, %fr25
  202. ldd -0x70(%r30), p032a2
  203. fstd %fr23, -0x70(%r30) C mid product to  -0x70..-0x69
  204. ldo 8(rp), rp
  205. add climb, p000a, s000
  206. ldd -0x80(%r30), p000a
  207. fstd %fr24, -0x80(%r30) C low product to  -0x80..-0x79
  208. add,dc p064a, %r0, climb
  209. ldd -0x68(%r30), p064a
  210. fstd %fr25, -0x68(%r30) C high product to -0x68..-0x61
  211. add ma000, s000, s000
  212. add,dc ma064, climb, climb
  213. add r000, s000, s000
  214. add,dc %r0, climb, climb
  215. std s000, -8(rp)
  216. add p032a1, p032a2, m032
  217. add,dc %r0, %r0, m096
  218. depd,z m032, 31, 32, ma000
  219. extrd,u m032, 31, 32, ma064
  220. ldd 0(rp), r000
  221. depd m096, 31, 32, ma064
  222. LDEF(0_two_out)
  223. ldd -0x78(%r30), p032a1
  224. ldd -0x70(%r30), p032a2
  225. ldo 8(rp), rp
  226. add climb, p000a, s000
  227. ldd -0x80(%r30), p000a
  228. add,dc p064a, %r0, climb
  229. ldd -0x68(%r30), p064a
  230. add ma000, s000, s000
  231. add,dc ma064, climb, climb
  232. add r000, s000, s000
  233. add,dc %r0, climb, climb
  234. std s000, -8(rp)
  235. LDEF(0_one_out)
  236. add p032a1, p032a2, m032
  237. add,dc %r0, %r0, m096
  238. depd,z m032, 31, 32, ma000
  239. extrd,u m032, 31, 32, ma064
  240. ldd 0(rp), r000
  241. depd m096, 31, 32, ma064
  242. add climb, p000a, s000
  243. add,dc p064a, %r0, climb
  244. add ma000, s000, s000
  245. add,dc ma064, climb, climb
  246. add r000, s000, s000
  247. add,dc %r0, climb, climb
  248. std s000, 0(rp)
  249. cmpib,>= 4, n, L(done)
  250. ldo 8(rp), rp
  251. C 4-way unrolled code.
  252. LDEF(BIG)
  253. define(`p032a1',`%r1') C
  254. define(`p032a2',`%r19') C
  255. define(`p096b1',`%r20') C
  256. define(`p096b2',`%r21') C
  257. define(`p160c1',`%r22') C
  258. define(`p160c2',`%r29') C
  259. define(`p224d1',`%r31') C
  260. define(`p224d2',`%r3') C
  261. C
  262. define(`m032',`%r4') C
  263. define(`m096',`%r5') C
  264. define(`m160',`%r6') C
  265. define(`m224',`%r7') C
  266. define(`m288',`%r8') C
  267. C
  268. define(`p000a',`%r1') C
  269. define(`p064a',`%r19') C
  270. define(`p064b',`%r20') C
  271. define(`p128b',`%r21') C
  272. define(`p128c',`%r22') C
  273. define(`p192c',`%r29') C
  274. define(`p192d',`%r31') C
  275. define(`p256d',`%r3') C
  276. C
  277. define(`s000',`%r10') C
  278. define(`s064',`%r11') C
  279. define(`s128',`%r12') C
  280. define(`s192',`%r13') C
  281. C
  282. define(`ma000',`%r9') C
  283. define(`ma064',`%r4') C
  284. define(`ma128',`%r5') C
  285. define(`ma192',`%r6') C
  286. define(`ma256',`%r7') C
  287. C
  288. define(`r000',`%r1') C
  289. define(`r064',`%r19') C
  290. define(`r128',`%r20') C
  291. define(`r192',`%r21') C
  292. std %r6, -0xe8(%r30)
  293. std %r7, -0xe0(%r30)
  294. std %r8, -0xd8(%r30)
  295. std %r9, -0xd0(%r30)
  296. std %r10, -0xc8(%r30)
  297. std %r11, -0xc0(%r30)
  298. std %r12, -0xb8(%r30)
  299. std %r13, -0xb0(%r30)
  300. ifdef(`HAVE_ABI_2_0w',
  301. ` extrd,u n, 61, 62, n C right shift 2
  302. ',` extrd,u n, 61, 30, n C right shift 2, zero extend
  303. ')
  304. LDEF(4_or_more)
  305. fldd 0(up), %fr4
  306. fldd 8(up), %fr5
  307. fldd 16(up), %fr6
  308. fldd 24(up), %fr7
  309. xmpyu %fr8R, %fr4L, %fr22
  310. xmpyu %fr8L, %fr4R, %fr23
  311. xmpyu %fr8R, %fr5L, %fr24
  312. xmpyu %fr8L, %fr5R, %fr25
  313. xmpyu %fr8R, %fr6L, %fr26
  314. xmpyu %fr8L, %fr6R, %fr27
  315. fstd %fr22, -0x78(%r30) C mid product to  -0x78..-0x71
  316. xmpyu %fr8R, %fr7L, %fr28
  317. xmpyu %fr8L, %fr7R, %fr29
  318. fstd %fr23, -0x70(%r30) C mid product to  -0x70..-0x69
  319. xmpyu %fr8R, %fr4R, %fr30
  320. xmpyu %fr8L, %fr4L, %fr31
  321. fstd %fr24, -0x38(%r30) C mid product to  -0x38..-0x31
  322. xmpyu %fr8R, %fr5R, %fr22
  323. xmpyu %fr8L, %fr5L, %fr23
  324. fstd %fr25, -0x30(%r30) C mid product to  -0x30..-0x29
  325. xmpyu %fr8R, %fr6R, %fr24
  326. xmpyu %fr8L, %fr6L, %fr25
  327. fstd %fr26, -0x58(%r30) C mid product to  -0x58..-0x51
  328. xmpyu %fr8R, %fr7R, %fr26
  329. fstd %fr27, -0x50(%r30) C mid product to  -0x50..-0x49
  330. addib,<> -1, n, L(8_or_more)
  331. xmpyu %fr8L, %fr7L, %fr27
  332. fstd %fr28, -0x18(%r30) C mid product to  -0x18..-0x11
  333. fstd %fr29, -0x10(%r30) C mid product to  -0x10..-0x09
  334. fstd %fr30, -0x80(%r30) C low product to  -0x80..-0x79
  335. fstd %fr31, -0x68(%r30) C high product to -0x68..-0x61
  336. fstd %fr22, -0x40(%r30) C low product to  -0x40..-0x39
  337. fstd %fr23, -0x28(%r30) C high product to -0x28..-0x21
  338. fstd %fr24, -0x60(%r30) C low product to  -0x60..-0x59
  339. fstd %fr25, -0x48(%r30) C high product to -0x48..-0x41
  340. fstd %fr26, -0x20(%r30) C low product to  -0x20..-0x19
  341. fstd %fr27, -0x88(%r30) C high product to -0x88..-0x81
  342. ldd -0x78(%r30), p032a1
  343. ldd -0x70(%r30), p032a2
  344. ldd -0x38(%r30), p096b1
  345. ldd -0x30(%r30), p096b2
  346. ldd -0x58(%r30), p160c1
  347. ldd -0x50(%r30), p160c2
  348. ldd -0x18(%r30), p224d1
  349. ldd -0x10(%r30), p224d2
  350. b L(end1)
  351. nop
  352. LDEF(8_or_more)
  353. fstd %fr28, -0x18(%r30) C mid product to  -0x18..-0x11
  354. fstd %fr29, -0x10(%r30) C mid product to  -0x10..-0x09
  355. ldo 32(up), up
  356. fstd %fr30, -0x80(%r30) C low product to  -0x80..-0x79
  357. fstd %fr31, -0x68(%r30) C high product to -0x68..-0x61
  358. fstd %fr22, -0x40(%r30) C low product to  -0x40..-0x39
  359. fstd %fr23, -0x28(%r30) C high product to -0x28..-0x21
  360. fstd %fr24, -0x60(%r30) C low product to  -0x60..-0x59
  361. fstd %fr25, -0x48(%r30) C high product to -0x48..-0x41
  362. fstd %fr26, -0x20(%r30) C low product to  -0x20..-0x19
  363. fstd %fr27, -0x88(%r30) C high product to -0x88..-0x81
  364. fldd 0(up), %fr4
  365. fldd 8(up), %fr5
  366. fldd 16(up), %fr6
  367. fldd 24(up), %fr7
  368. xmpyu %fr8R, %fr4L, %fr22
  369. ldd -0x78(%r30), p032a1
  370. xmpyu %fr8L, %fr4R, %fr23
  371. xmpyu %fr8R, %fr5L, %fr24
  372. ldd -0x70(%r30), p032a2
  373. xmpyu %fr8L, %fr5R, %fr25
  374. xmpyu %fr8R, %fr6L, %fr26
  375. ldd -0x38(%r30), p096b1
  376. xmpyu %fr8L, %fr6R, %fr27
  377. fstd %fr22, -0x78(%r30) C mid product to  -0x78..-0x71
  378. xmpyu %fr8R, %fr7L, %fr28
  379. ldd -0x30(%r30), p096b2
  380. xmpyu %fr8L, %fr7R, %fr29
  381. fstd %fr23, -0x70(%r30) C mid product to  -0x70..-0x69
  382. xmpyu %fr8R, %fr4R, %fr30
  383. ldd -0x58(%r30), p160c1
  384. xmpyu %fr8L, %fr4L, %fr31
  385. fstd %fr24, -0x38(%r30) C mid product to  -0x38..-0x31
  386. xmpyu %fr8R, %fr5R, %fr22
  387. ldd -0x50(%r30), p160c2
  388. xmpyu %fr8L, %fr5L, %fr23
  389. fstd %fr25, -0x30(%r30) C mid product to  -0x30..-0x29
  390. xmpyu %fr8R, %fr6R, %fr24
  391. ldd -0x18(%r30), p224d1
  392. xmpyu %fr8L, %fr6L, %fr25
  393. fstd %fr26, -0x58(%r30) C mid product to  -0x58..-0x51
  394. xmpyu %fr8R, %fr7R, %fr26
  395. ldd -0x10(%r30), p224d2
  396. fstd %fr27, -0x50(%r30) C mid product to  -0x50..-0x49
  397. addib,= -1, n, L(end2)
  398. xmpyu %fr8L, %fr7L, %fr27
  399. LDEF(loop)
  400. add p032a1, p032a2, m032
  401. ldd -0x80(%r30), p000a
  402. add,dc p096b1, p096b2, m096
  403. fstd %fr28, -0x18(%r30) C mid product to  -0x18..-0x11
  404. add,dc p160c1, p160c2, m160
  405. ldd -0x68(%r30), p064a
  406. add,dc p224d1, p224d2, m224
  407. fstd %fr29, -0x10(%r30) C mid product to  -0x10..-0x09
  408. add,dc %r0, %r0, m288
  409. ldd -0x40(%r30), p064b
  410. ldo 32(up), up
  411. fstd %fr30, -0x80(%r30) C low product to  -0x80..-0x79
  412. depd,z m032, 31, 32, ma000
  413. ldd -0x28(%r30), p128b
  414. extrd,u m032, 31, 32, ma064
  415. fstd %fr31, -0x68(%r30) C high product to -0x68..-0x61
  416. depd m096, 31, 32, ma064
  417. ldd -0x60(%r30), p128c
  418. extrd,u m096, 31, 32, ma128
  419. fstd %fr22, -0x40(%r30) C low product to  -0x40..-0x39
  420. depd m160, 31, 32, ma128
  421. ldd -0x48(%r30), p192c
  422. extrd,u m160, 31, 32, ma192
  423. fstd %fr23, -0x28(%r30) C high product to -0x28..-0x21
  424. depd m224, 31, 32, ma192
  425. ldd -0x20(%r30), p192d
  426. extrd,u m224, 31, 32, ma256
  427. fstd %fr24, -0x60(%r30) C low product to  -0x60..-0x59
  428. depd m288, 31, 32, ma256
  429. ldd -0x88(%r30), p256d
  430. add climb, p000a, s000
  431. fstd %fr25, -0x48(%r30) C high product to -0x48..-0x41
  432. add,dc p064a, p064b, s064
  433. ldd 0(rp), r000
  434. add,dc p128b, p128c, s128
  435. fstd %fr26, -0x20(%r30) C low product to  -0x20..-0x19
  436. add,dc p192c, p192d, s192
  437. ldd 8(rp), r064
  438. add,dc p256d, %r0, climb
  439. fstd %fr27, -0x88(%r30) C high product to -0x88..-0x81
  440. ldd 16(rp), r128
  441. add ma000, s000, s000 C accum mid 0
  442. ldd 24(rp), r192
  443. add,dc ma064, s064, s064 C accum mid 1
  444. add,dc ma128, s128, s128 C accum mid 2
  445. fldd 0(up), %fr4
  446. add,dc ma192, s192, s192 C accum mid 3
  447. fldd 8(up), %fr5
  448. add,dc ma256, climb, climb
  449. fldd 16(up), %fr6
  450. add r000, s000, s000 C accum rlimb 0
  451. fldd 24(up), %fr7
  452. add,dc r064, s064, s064 C accum rlimb 1
  453. add,dc r128, s128, s128 C accum rlimb 2
  454. std s000, 0(rp)
  455. add,dc r192, s192, s192 C accum rlimb 3
  456. add,dc %r0, climb, climb
  457. std s064, 8(rp)
  458. xmpyu %fr8R, %fr4L, %fr22
  459. ldd -0x78(%r30), p032a1
  460. xmpyu %fr8L, %fr4R, %fr23
  461. std s128, 16(rp)
  462. xmpyu %fr8R, %fr5L, %fr24
  463. ldd -0x70(%r30), p032a2
  464. xmpyu %fr8L, %fr5R, %fr25
  465. std s192, 24(rp)
  466. xmpyu %fr8R, %fr6L, %fr26
  467. ldd -0x38(%r30), p096b1
  468. xmpyu %fr8L, %fr6R, %fr27
  469. fstd %fr22, -0x78(%r30) C mid product to  -0x78..-0x71
  470. xmpyu %fr8R, %fr7L, %fr28
  471. ldd -0x30(%r30), p096b2
  472. xmpyu %fr8L, %fr7R, %fr29
  473. fstd %fr23, -0x70(%r30) C mid product to  -0x70..-0x69
  474. xmpyu %fr8R, %fr4R, %fr30
  475. ldd -0x58(%r30), p160c1
  476. xmpyu %fr8L, %fr4L, %fr31
  477. fstd %fr24, -0x38(%r30) C mid product to  -0x38..-0x31
  478. xmpyu %fr8R, %fr5R, %fr22
  479. ldd -0x50(%r30), p160c2
  480. xmpyu %fr8L, %fr5L, %fr23
  481. fstd %fr25, -0x30(%r30) C mid product to  -0x30..-0x29
  482. xmpyu %fr8R, %fr6R, %fr24
  483. ldd -0x18(%r30), p224d1
  484. xmpyu %fr8L, %fr6L, %fr25
  485. fstd %fr26, -0x58(%r30) C mid product to  -0x58..-0x51
  486. xmpyu %fr8R, %fr7R, %fr26
  487. ldd -0x10(%r30), p224d2
  488. fstd %fr27, -0x50(%r30) C mid product to  -0x50..-0x49
  489. xmpyu %fr8L, %fr7L, %fr27
  490. addib,<> -1, n, L(loop)
  491. ldo 32(rp), rp
  492. LDEF(end2)
  493. add p032a1, p032a2, m032
  494. ldd -0x80(%r30), p000a
  495. add,dc p096b1, p096b2, m096
  496. fstd %fr28, -0x18(%r30) C mid product to  -0x18..-0x11
  497. add,dc p160c1, p160c2, m160
  498. ldd -0x68(%r30), p064a
  499. add,dc p224d1, p224d2, m224
  500. fstd %fr29, -0x10(%r30) C mid product to  -0x10..-0x09
  501. add,dc %r0, %r0, m288
  502. ldd -0x40(%r30), p064b
  503. fstd %fr30, -0x80(%r30) C low product to  -0x80..-0x79
  504. depd,z m032, 31, 32, ma000
  505. ldd -0x28(%r30), p128b
  506. extrd,u m032, 31, 32, ma064
  507. fstd %fr31, -0x68(%r30) C high product to -0x68..-0x61
  508. depd m096, 31, 32, ma064
  509. ldd -0x60(%r30), p128c
  510. extrd,u m096, 31, 32, ma128
  511. fstd %fr22, -0x40(%r30) C low product to  -0x40..-0x39
  512. depd m160, 31, 32, ma128
  513. ldd -0x48(%r30), p192c
  514. extrd,u m160, 31, 32, ma192
  515. fstd %fr23, -0x28(%r30) C high product to -0x28..-0x21
  516. depd m224, 31, 32, ma192
  517. ldd -0x20(%r30), p192d
  518. extrd,u m224, 31, 32, ma256
  519. fstd %fr24, -0x60(%r30) C low product to  -0x60..-0x59
  520. depd m288, 31, 32, ma256
  521. ldd -0x88(%r30), p256d
  522. add climb, p000a, s000
  523. fstd %fr25, -0x48(%r30) C high product to -0x48..-0x41
  524. add,dc p064a, p064b, s064
  525. ldd 0(rp), r000
  526. add,dc p128b, p128c, s128
  527. fstd %fr26, -0x20(%r30) C low product to  -0x20..-0x19
  528. add,dc p192c, p192d, s192
  529. ldd 8(rp), r064
  530. add,dc p256d, %r0, climb
  531. fstd %fr27, -0x88(%r30) C high product to -0x88..-0x81
  532. ldd 16(rp), r128
  533. add ma000, s000, s000 C accum mid 0
  534. ldd 24(rp), r192
  535. add,dc ma064, s064, s064 C accum mid 1
  536. add,dc ma128, s128, s128 C accum mid 2
  537. add,dc ma192, s192, s192 C accum mid 3
  538. add,dc ma256, climb, climb
  539. add r000, s000, s000 C accum rlimb 0
  540. add,dc r064, s064, s064 C accum rlimb 1
  541. add,dc r128, s128, s128 C accum rlimb 2
  542. std s000, 0(rp)
  543. add,dc r192, s192, s192 C accum rlimb 3
  544. add,dc %r0, climb, climb
  545. std s064, 8(rp)
  546. ldd -0x78(%r30), p032a1
  547. std s128, 16(rp)
  548. ldd -0x70(%r30), p032a2
  549. std s192, 24(rp)
  550. ldd -0x38(%r30), p096b1
  551. ldd -0x30(%r30), p096b2
  552. ldd -0x58(%r30), p160c1
  553. ldd -0x50(%r30), p160c2
  554. ldd -0x18(%r30), p224d1
  555. ldd -0x10(%r30), p224d2
  556. ldo 32(rp), rp
  557. LDEF(end1)
  558. add p032a1, p032a2, m032
  559. ldd -0x80(%r30), p000a
  560. add,dc p096b1, p096b2, m096
  561. add,dc p160c1, p160c2, m160
  562. ldd -0x68(%r30), p064a
  563. add,dc p224d1, p224d2, m224
  564. add,dc %r0, %r0, m288
  565. ldd -0x40(%r30), p064b
  566. depd,z m032, 31, 32, ma000
  567. ldd -0x28(%r30), p128b
  568. extrd,u m032, 31, 32, ma064
  569. depd m096, 31, 32, ma064
  570. ldd -0x60(%r30), p128c
  571. extrd,u m096, 31, 32, ma128
  572. depd m160, 31, 32, ma128
  573. ldd -0x48(%r30), p192c
  574. extrd,u m160, 31, 32, ma192
  575. depd m224, 31, 32, ma192
  576. ldd -0x20(%r30), p192d
  577. extrd,u m224, 31, 32, ma256
  578. depd m288, 31, 32, ma256
  579. ldd -0x88(%r30), p256d
  580. add climb, p000a, s000
  581. add,dc p064a, p064b, s064
  582. ldd 0(rp), r000
  583. add,dc p128b, p128c, s128
  584. add,dc p192c, p192d, s192
  585. ldd 8(rp), r064
  586. add,dc p256d, %r0, climb
  587. ldd 16(rp), r128
  588. add ma000, s000, s000 C accum mid 0
  589. ldd 24(rp), r192
  590. add,dc ma064, s064, s064 C accum mid 1
  591. add,dc ma128, s128, s128 C accum mid 2
  592. add,dc ma192, s192, s192 C accum mid 3
  593. add,dc ma256, climb, climb
  594. add r000, s000, s000 C accum rlimb 0
  595. add,dc r064, s064, s064 C accum rlimb 1
  596. add,dc r128, s128, s128 C accum rlimb 2
  597. std s000, 0(rp)
  598. add,dc r192, s192, s192 C accum rlimb 3
  599. add,dc %r0, climb, climb
  600. std s064, 8(rp)
  601. std s128, 16(rp)
  602. std s192, 24(rp)
  603. ldd -0xb0(%r30), %r13
  604. ldd -0xb8(%r30), %r12
  605. ldd -0xc0(%r30), %r11
  606. ldd -0xc8(%r30), %r10
  607. ldd -0xd0(%r30), %r9
  608. ldd -0xd8(%r30), %r8
  609. ldd -0xe0(%r30), %r7
  610. ldd -0xe8(%r30), %r6
  611. LDEF(done)
  612. ifdef(`HAVE_ABI_2_0w',
  613. ` copy climb, %r28
  614. ',` extrd,u climb, 63, 32, %r29
  615. extrd,u climb, 31, 32, %r28
  616. ')
  617. ldd -0xf0(%r30), %r5
  618. ldd -0xf8(%r30), %r4
  619. bve (%r2)
  620. ldd,mb -0x100(%r30), %r3
  621. EPILOGUE(mpn_addmul_1)