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

数学计算

开发平台:

Unix_Linux

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