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

数学计算

开发平台:

Unix_Linux

  1. dnl  HP-PA 2.0 64-bit mpn_mul_1 -- Multiply a limb vector with a limb and store
  2. dnl  the result in 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: 6.5
  18. C 8500,8600,8700: 5.625
  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_mul_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. C define(`r000',`%r3') C FIXME don't save r3 for n < 4.
  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. b L(0_two_out)
  146. depd m096, 31, 32, ma064
  147. LDEF(three_or_more)
  148. fldd 0(up), %fr4
  149. add p032a1, p032a2, m032
  150. add,dc %r0, %r0, m096
  151. depd,z m032, 31, 32, ma000
  152. extrd,u m032, 31, 32, ma064
  153. C addib,= -1, %r5, L(0_out)
  154. depd m096, 31, 32, ma064
  155. LDEF(loop0)
  156. C xmpyu %fr8R, %fr4L, %fr22
  157. C xmpyu %fr8L, %fr4R, %fr23
  158. C ldd -0x78(%r30), p032a1
  159. C fstd %fr22, -0x78(%r30) C mid product to  -0x78..-0x71
  160. C
  161. C xmpyu %fr8R, %fr4R, %fr24
  162. C xmpyu %fr8L, %fr4L, %fr25
  163. C ldd -0x70(%r30), p032a2
  164. C fstd %fr23, -0x70(%r30) C mid product to  -0x70..-0x69
  165. C
  166. C ldo 8(rp), rp
  167. C add climb, p000a, s000
  168. C ldd -0x80(%r30), p000a
  169. C fstd %fr24, -0x80(%r30) C low product to  -0x80..-0x79
  170. C
  171. C add,dc p064a, %r0, climb
  172. C ldo 8(up), up
  173. C ldd -0x68(%r30), p064a
  174. C fstd %fr25, -0x68(%r30) C high product to -0x68..-0x61
  175. C
  176. C add ma000, s000, s000
  177. C add,dc ma064, climb, climb
  178. C fldd 0(up), %fr4
  179. C
  180. C std s000, -8(rp)
  181. C
  182. C add p032a1, p032a2, m032
  183. C add,dc %r0, %r0, m096
  184. C
  185. C depd,z m032, 31, 32, ma000
  186. C extrd,u m032, 31, 32, ma064
  187. C addib,<> -1, %r5, L(loop0)
  188. C depd m096, 31, 32, ma064
  189. LDEF(0_out)
  190. ldo 8(up), up
  191. xmpyu %fr8R, %fr4L, %fr22
  192. xmpyu %fr8L, %fr4R, %fr23
  193. ldd -0x78(%r30), p032a1
  194. fstd %fr22, -0x78(%r30) C mid product to  -0x78..-0x71
  195. xmpyu %fr8R, %fr4R, %fr24
  196. xmpyu %fr8L, %fr4L, %fr25
  197. ldd -0x70(%r30), p032a2
  198. fstd %fr23, -0x70(%r30) C mid product to  -0x70..-0x69
  199. ldo 8(rp), rp
  200. add climb, p000a, s000
  201. ldd -0x80(%r30), p000a
  202. fstd %fr24, -0x80(%r30) C low product to  -0x80..-0x79
  203. add,dc p064a, %r0, climb
  204. ldd -0x68(%r30), p064a
  205. fstd %fr25, -0x68(%r30) C high product to -0x68..-0x61
  206. add ma000, s000, s000
  207. add,dc ma064, climb, climb
  208. std s000, -8(rp)
  209. add p032a1, p032a2, m032
  210. add,dc %r0, %r0, m096
  211. depd,z m032, 31, 32, ma000
  212. extrd,u m032, 31, 32, ma064
  213. depd m096, 31, 32, ma064
  214. LDEF(0_two_out)
  215. ldd -0x78(%r30), p032a1
  216. ldd -0x70(%r30), p032a2
  217. ldo 8(rp), rp
  218. add climb, p000a, s000
  219. ldd -0x80(%r30), p000a
  220. add,dc p064a, %r0, climb
  221. ldd -0x68(%r30), p064a
  222. add ma000, s000, s000
  223. add,dc ma064, climb, climb
  224. std s000, -8(rp)
  225. LDEF(0_one_out)
  226. add p032a1, p032a2, m032
  227. add,dc %r0, %r0, m096
  228. depd,z m032, 31, 32, ma000
  229. extrd,u m032, 31, 32, ma064
  230. depd m096, 31, 32, ma064
  231. add climb, p000a, s000
  232. add,dc p064a, %r0, climb
  233. add ma000, s000, s000
  234. add,dc ma064, climb, climb
  235. std s000, 0(rp)
  236. cmpib,>= 4, n, L(done)
  237. ldo 8(rp), rp
  238. C 4-way unrolled code.
  239. LDEF(BIG)
  240. define(`p032a1',`%r1') C
  241. define(`p032a2',`%r19') C
  242. define(`p096b1',`%r20') C
  243. define(`p096b2',`%r21') C
  244. define(`p160c1',`%r22') C
  245. define(`p160c2',`%r29') C
  246. define(`p224d1',`%r31') C
  247. define(`p224d2',`%r3') C
  248. C
  249. define(`m032',`%r4') C
  250. define(`m096',`%r5') C
  251. define(`m160',`%r6') C
  252. define(`m224',`%r7') C
  253. define(`m288',`%r8') C
  254. C
  255. define(`p000a',`%r1') C
  256. define(`p064a',`%r19') C
  257. define(`p064b',`%r20') C
  258. define(`p128b',`%r21') C
  259. define(`p128c',`%r22') C
  260. define(`p192c',`%r29') C
  261. define(`p192d',`%r31') C
  262. define(`p256d',`%r3') C
  263. C
  264. define(`s000',`%r10') C
  265. define(`s064',`%r11') C
  266. define(`s128',`%r12') C
  267. define(`s192',`%r13') C
  268. C
  269. define(`ma000',`%r9') C
  270. define(`ma064',`%r4') C
  271. define(`ma128',`%r5') C
  272. define(`ma192',`%r6') C
  273. define(`ma256',`%r7') C
  274. std %r6, -0xe8(%r30)
  275. std %r7, -0xe0(%r30)
  276. std %r8, -0xd8(%r30)
  277. std %r9, -0xd0(%r30)
  278. std %r10, -0xc8(%r30)
  279. std %r11, -0xc0(%r30)
  280. std %r12, -0xb8(%r30)
  281. std %r13, -0xb0(%r30)
  282. ifdef(`HAVE_ABI_2_0w',
  283. ` extrd,u n, 61, 62, n C right shift 2
  284. ',` extrd,u n, 61, 30, n C right shift 2, zero extend
  285. ')
  286. LDEF(4_or_more)
  287. fldd 0(up), %fr4
  288. fldd 8(up), %fr5
  289. fldd 16(up), %fr6
  290. fldd 24(up), %fr7
  291. xmpyu %fr8R, %fr4L, %fr22
  292. xmpyu %fr8L, %fr4R, %fr23
  293. xmpyu %fr8R, %fr5L, %fr24
  294. xmpyu %fr8L, %fr5R, %fr25
  295. xmpyu %fr8R, %fr6L, %fr26
  296. xmpyu %fr8L, %fr6R, %fr27
  297. fstd %fr22, -0x78(%r30) C mid product to  -0x78..-0x71
  298. xmpyu %fr8R, %fr7L, %fr28
  299. xmpyu %fr8L, %fr7R, %fr29
  300. fstd %fr23, -0x70(%r30) C mid product to  -0x70..-0x69
  301. xmpyu %fr8R, %fr4R, %fr30
  302. xmpyu %fr8L, %fr4L, %fr31
  303. fstd %fr24, -0x38(%r30) C mid product to  -0x38..-0x31
  304. xmpyu %fr8R, %fr5R, %fr22
  305. xmpyu %fr8L, %fr5L, %fr23
  306. fstd %fr25, -0x30(%r30) C mid product to  -0x30..-0x29
  307. xmpyu %fr8R, %fr6R, %fr24
  308. xmpyu %fr8L, %fr6L, %fr25
  309. fstd %fr26, -0x58(%r30) C mid product to  -0x58..-0x51
  310. xmpyu %fr8R, %fr7R, %fr26
  311. fstd %fr27, -0x50(%r30) C mid product to  -0x50..-0x49
  312. addib,<> -1, n, L(8_or_more)
  313. xmpyu %fr8L, %fr7L, %fr27
  314. fstd %fr28, -0x18(%r30) C mid product to  -0x18..-0x11
  315. fstd %fr29, -0x10(%r30) C mid product to  -0x10..-0x09
  316. fstd %fr30, -0x80(%r30) C low product to  -0x80..-0x79
  317. fstd %fr31, -0x68(%r30) C high product to -0x68..-0x61
  318. fstd %fr22, -0x40(%r30) C low product to  -0x40..-0x39
  319. fstd %fr23, -0x28(%r30) C high product to -0x28..-0x21
  320. fstd %fr24, -0x60(%r30) C low product to  -0x60..-0x59
  321. fstd %fr25, -0x48(%r30) C high product to -0x48..-0x41
  322. fstd %fr26, -0x20(%r30) C low product to  -0x20..-0x19
  323. fstd %fr27, -0x88(%r30) C high product to -0x88..-0x81
  324. ldd -0x78(%r30), p032a1
  325. ldd -0x70(%r30), p032a2
  326. ldd -0x38(%r30), p096b1
  327. ldd -0x30(%r30), p096b2
  328. ldd -0x58(%r30), p160c1
  329. ldd -0x50(%r30), p160c2
  330. ldd -0x18(%r30), p224d1
  331. ldd -0x10(%r30), p224d2
  332. b L(end1)
  333. nop
  334. LDEF(8_or_more)
  335. fstd %fr28, -0x18(%r30) C mid product to  -0x18..-0x11
  336. fstd %fr29, -0x10(%r30) C mid product to  -0x10..-0x09
  337. ldo 32(up), up
  338. fstd %fr30, -0x80(%r30) C low product to  -0x80..-0x79
  339. fstd %fr31, -0x68(%r30) C high product to -0x68..-0x61
  340. fstd %fr22, -0x40(%r30) C low product to  -0x40..-0x39
  341. fstd %fr23, -0x28(%r30) C high product to -0x28..-0x21
  342. fstd %fr24, -0x60(%r30) C low product to  -0x60..-0x59
  343. fstd %fr25, -0x48(%r30) C high product to -0x48..-0x41
  344. fstd %fr26, -0x20(%r30) C low product to  -0x20..-0x19
  345. fstd %fr27, -0x88(%r30) C high product to -0x88..-0x81
  346. fldd 0(up), %fr4
  347. fldd 8(up), %fr5
  348. fldd 16(up), %fr6
  349. fldd 24(up), %fr7
  350. xmpyu %fr8R, %fr4L, %fr22
  351. ldd -0x78(%r30), p032a1
  352. xmpyu %fr8L, %fr4R, %fr23
  353. xmpyu %fr8R, %fr5L, %fr24
  354. ldd -0x70(%r30), p032a2
  355. xmpyu %fr8L, %fr5R, %fr25
  356. xmpyu %fr8R, %fr6L, %fr26
  357. ldd -0x38(%r30), p096b1
  358. xmpyu %fr8L, %fr6R, %fr27
  359. fstd %fr22, -0x78(%r30) C mid product to  -0x78..-0x71
  360. xmpyu %fr8R, %fr7L, %fr28
  361. ldd -0x30(%r30), p096b2
  362. xmpyu %fr8L, %fr7R, %fr29
  363. fstd %fr23, -0x70(%r30) C mid product to  -0x70..-0x69
  364. xmpyu %fr8R, %fr4R, %fr30
  365. ldd -0x58(%r30), p160c1
  366. xmpyu %fr8L, %fr4L, %fr31
  367. fstd %fr24, -0x38(%r30) C mid product to  -0x38..-0x31
  368. xmpyu %fr8R, %fr5R, %fr22
  369. ldd -0x50(%r30), p160c2
  370. xmpyu %fr8L, %fr5L, %fr23
  371. fstd %fr25, -0x30(%r30) C mid product to  -0x30..-0x29
  372. xmpyu %fr8R, %fr6R, %fr24
  373. ldd -0x18(%r30), p224d1
  374. xmpyu %fr8L, %fr6L, %fr25
  375. fstd %fr26, -0x58(%r30) C mid product to  -0x58..-0x51
  376. xmpyu %fr8R, %fr7R, %fr26
  377. ldd -0x10(%r30), p224d2
  378. fstd %fr27, -0x50(%r30) C mid product to  -0x50..-0x49
  379. addib,= -1, n, L(end2)
  380. xmpyu %fr8L, %fr7L, %fr27
  381. LDEF(loop)
  382. add p032a1, p032a2, m032
  383. ldd -0x80(%r30), p000a
  384. add,dc p096b1, p096b2, m096
  385. fstd %fr28, -0x18(%r30) C mid product to  -0x18..-0x11
  386. add,dc p160c1, p160c2, m160
  387. ldd -0x68(%r30), p064a
  388. add,dc p224d1, p224d2, m224
  389. fstd %fr29, -0x10(%r30) C mid product to  -0x10..-0x09
  390. add,dc %r0, %r0, m288
  391. ldd -0x40(%r30), p064b
  392. ldo 32(up), up
  393. fstd %fr30, -0x80(%r30) C low product to  -0x80..-0x79
  394. depd,z m032, 31, 32, ma000
  395. ldd -0x28(%r30), p128b
  396. extrd,u m032, 31, 32, ma064
  397. fstd %fr31, -0x68(%r30) C high product to -0x68..-0x61
  398. depd m096, 31, 32, ma064
  399. ldd -0x60(%r30), p128c
  400. extrd,u m096, 31, 32, ma128
  401. fstd %fr22, -0x40(%r30) C low product to  -0x40..-0x39
  402. depd m160, 31, 32, ma128
  403. ldd -0x48(%r30), p192c
  404. extrd,u m160, 31, 32, ma192
  405. fstd %fr23, -0x28(%r30) C high product to -0x28..-0x21
  406. depd m224, 31, 32, ma192
  407. ldd -0x20(%r30), p192d
  408. extrd,u m224, 31, 32, ma256
  409. fstd %fr24, -0x60(%r30) C low product to  -0x60..-0x59
  410. depd m288, 31, 32, ma256
  411. ldd -0x88(%r30), p256d
  412. add climb, p000a, s000
  413. fstd %fr25, -0x48(%r30) C high product to -0x48..-0x41
  414. add,dc p064a, p064b, s064
  415. add,dc p128b, p128c, s128
  416. fstd %fr26, -0x20(%r30) C low product to  -0x20..-0x19
  417. add,dc p192c, p192d, s192
  418. add,dc p256d, %r0, climb
  419. fstd %fr27, -0x88(%r30) C high product to -0x88..-0x81
  420. add ma000, s000, s000 C accum mid 0
  421. fldd 0(up), %fr4
  422. add,dc ma064, s064, s064 C accum mid 1
  423. std s000, 0(rp)
  424. add,dc ma128, s128, s128 C accum mid 2
  425. fldd 8(up), %fr5
  426. add,dc ma192, s192, s192 C accum mid 3
  427. std s064, 8(rp)
  428. add,dc ma256, climb, climb
  429. fldd 16(up), %fr6
  430. std s128, 16(rp)
  431. xmpyu %fr8R, %fr4L, %fr22
  432. ldd -0x78(%r30), p032a1
  433. xmpyu %fr8L, %fr4R, %fr23
  434. fldd 24(up), %fr7
  435. xmpyu %fr8R, %fr5L, %fr24
  436. ldd -0x70(%r30), p032a2
  437. xmpyu %fr8L, %fr5R, %fr25
  438. std s192, 24(rp)
  439. xmpyu %fr8R, %fr6L, %fr26
  440. ldd -0x38(%r30), p096b1
  441. xmpyu %fr8L, %fr6R, %fr27
  442. fstd %fr22, -0x78(%r30) C mid product to  -0x78..-0x71
  443. xmpyu %fr8R, %fr7L, %fr28
  444. ldd -0x30(%r30), p096b2
  445. xmpyu %fr8L, %fr7R, %fr29
  446. fstd %fr23, -0x70(%r30) C mid product to  -0x70..-0x69
  447. xmpyu %fr8R, %fr4R, %fr30
  448. ldd -0x58(%r30), p160c1
  449. xmpyu %fr8L, %fr4L, %fr31
  450. fstd %fr24, -0x38(%r30) C mid product to  -0x38..-0x31
  451. xmpyu %fr8R, %fr5R, %fr22
  452. ldd -0x50(%r30), p160c2
  453. xmpyu %fr8L, %fr5L, %fr23
  454. fstd %fr25, -0x30(%r30) C mid product to  -0x30..-0x29
  455. xmpyu %fr8R, %fr6R, %fr24
  456. ldd -0x18(%r30), p224d1
  457. xmpyu %fr8L, %fr6L, %fr25
  458. fstd %fr26, -0x58(%r30) C mid product to  -0x58..-0x51
  459. xmpyu %fr8R, %fr7R, %fr26
  460. ldd -0x10(%r30), p224d2
  461. fstd %fr27, -0x50(%r30) C mid product to  -0x50..-0x49
  462. xmpyu %fr8L, %fr7L, %fr27
  463. addib,<> -1, n, L(loop)
  464. ldo 32(rp), rp
  465. LDEF(end2)
  466. add p032a1, p032a2, m032
  467. ldd -0x80(%r30), p000a
  468. add,dc p096b1, p096b2, m096
  469. fstd %fr28, -0x18(%r30) C mid product to  -0x18..-0x11
  470. add,dc p160c1, p160c2, m160
  471. ldd -0x68(%r30), p064a
  472. add,dc p224d1, p224d2, m224
  473. fstd %fr29, -0x10(%r30) C mid product to  -0x10..-0x09
  474. add,dc %r0, %r0, m288
  475. ldd -0x40(%r30), p064b
  476. fstd %fr30, -0x80(%r30) C low product to  -0x80..-0x79
  477. depd,z m032, 31, 32, ma000
  478. ldd -0x28(%r30), p128b
  479. extrd,u m032, 31, 32, ma064
  480. fstd %fr31, -0x68(%r30) C high product to -0x68..-0x61
  481. depd m096, 31, 32, ma064
  482. ldd -0x60(%r30), p128c
  483. extrd,u m096, 31, 32, ma128
  484. fstd %fr22, -0x40(%r30) C low product to  -0x40..-0x39
  485. depd m160, 31, 32, ma128
  486. ldd -0x48(%r30), p192c
  487. extrd,u m160, 31, 32, ma192
  488. fstd %fr23, -0x28(%r30) C high product to -0x28..-0x21
  489. depd m224, 31, 32, ma192
  490. ldd -0x20(%r30), p192d
  491. extrd,u m224, 31, 32, ma256
  492. fstd %fr24, -0x60(%r30) C low product to  -0x60..-0x59
  493. depd m288, 31, 32, ma256
  494. ldd -0x88(%r30), p256d
  495. add climb, p000a, s000
  496. fstd %fr25, -0x48(%r30) C high product to -0x48..-0x41
  497. add,dc p064a, p064b, s064
  498. add,dc p128b, p128c, s128
  499. fstd %fr26, -0x20(%r30) C low product to  -0x20..-0x19
  500. add,dc p192c, p192d, s192
  501. add,dc p256d, %r0, climb
  502. fstd %fr27, -0x88(%r30) C high product to -0x88..-0x81
  503. add ma000, s000, s000 C accum mid 0
  504. add,dc ma064, s064, s064 C accum mid 1
  505. add,dc ma128, s128, s128 C accum mid 2
  506. add,dc ma192, s192, s192 C accum mid 3
  507. add,dc ma256, climb, climb
  508. std s000, 0(rp)
  509. std s064, 8(rp)
  510. ldd -0x78(%r30), p032a1
  511. std s128, 16(rp)
  512. ldd -0x70(%r30), p032a2
  513. std s192, 24(rp)
  514. ldd -0x38(%r30), p096b1
  515. ldd -0x30(%r30), p096b2
  516. ldd -0x58(%r30), p160c1
  517. ldd -0x50(%r30), p160c2
  518. ldd -0x18(%r30), p224d1
  519. ldd -0x10(%r30), p224d2
  520. ldo 32(rp), rp
  521. LDEF(end1)
  522. add p032a1, p032a2, m032
  523. ldd -0x80(%r30), p000a
  524. add,dc p096b1, p096b2, m096
  525. add,dc p160c1, p160c2, m160
  526. ldd -0x68(%r30), p064a
  527. add,dc p224d1, p224d2, m224
  528. add,dc %r0, %r0, m288
  529. ldd -0x40(%r30), p064b
  530. depd,z m032, 31, 32, ma000
  531. ldd -0x28(%r30), p128b
  532. extrd,u m032, 31, 32, ma064
  533. depd m096, 31, 32, ma064
  534. ldd -0x60(%r30), p128c
  535. extrd,u m096, 31, 32, ma128
  536. depd m160, 31, 32, ma128
  537. ldd -0x48(%r30), p192c
  538. extrd,u m160, 31, 32, ma192
  539. depd m224, 31, 32, ma192
  540. ldd -0x20(%r30), p192d
  541. extrd,u m224, 31, 32, ma256
  542. depd m288, 31, 32, ma256
  543. ldd -0x88(%r30), p256d
  544. add climb, p000a, s000
  545. add,dc p064a, p064b, s064
  546. add,dc p128b, p128c, s128
  547. add,dc p192c, p192d, s192
  548. add,dc p256d, %r0, climb
  549. add ma000, s000, s000 C accum mid 0
  550. add,dc ma064, s064, s064 C accum mid 1
  551. add,dc ma128, s128, s128 C accum mid 2
  552. add,dc ma192, s192, s192 C accum mid 3
  553. add,dc ma256, climb, climb
  554. std s000, 0(rp)
  555. std s064, 8(rp)
  556. std s128, 16(rp)
  557. std s192, 24(rp)
  558. ldd -0xb0(%r30), %r13
  559. ldd -0xb8(%r30), %r12
  560. ldd -0xc0(%r30), %r11
  561. ldd -0xc8(%r30), %r10
  562. ldd -0xd0(%r30), %r9
  563. ldd -0xd8(%r30), %r8
  564. ldd -0xe0(%r30), %r7
  565. ldd -0xe8(%r30), %r6
  566. LDEF(done)
  567. ifdef(`HAVE_ABI_2_0w',
  568. ` copy climb, %r28
  569. ',` extrd,u climb, 63, 32, %r29
  570. extrd,u climb, 31, 32, %r28
  571. ')
  572. ldd -0xf0(%r30), %r5
  573. ldd -0xf8(%r30), %r4
  574. bve (%r2)
  575. ldd,mb -0x100(%r30), %r3
  576. EPILOGUE(mpn_mul_1)