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

数学计算

开发平台:

Unix_Linux

  1. dnl  SPARC v9 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, 2000, 2001, 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 UltraSPARC 1&2:     14
  18. C UltraSPARC 3:       18.5
  19. C Algorithm: We use eight floating-point multiplies per limb product, with the
  20. C invariant v operand split into four 16-bit pieces, and the s1 operand split
  21. C into 32-bit pieces.  We sum pairs of 48-bit partial products using
  22. C floating-point add, then convert the four 49-bit product-sums and transfer
  23. C them to the integer unit.
  24. C Possible optimizations:
  25. C   1. Align the stack area where we transfer the four 49-bit product-sums
  26. C      to a 32-byte boundary.  That would minimize the cache collision.
  27. C      (UltraSPARC-1/2 use a direct-mapped cache.)  (Perhaps even better would
  28. C      be to align the area to map to the area immediately before s1?)
  29. C   2. Sum the 4 49-bit quantities using 32-bit operations, as in the
  30. C      develop mpn_addmul_2.  This would save many integer instructions.
  31. C   3. Unrolling.  Questionable if it is worth the code expansion, given that
  32. C      it could only save 1 cycle/limb.
  33. C   4. Specialize for particular v values.  If its upper 32 bits are zero, we
  34. C      could save many operations, in the FPU (fmuld), but more so in the IEU
  35. C      since we'll be summing 48-bit quantities, which might be simpler.
  36. C   5. Ideally, we should schedule the f2/f3 and f4/f5 RAW further apart, and
  37. C      the i00,i16,i32,i48 RAW less apart.  The latter apart-scheduling should
  38. C      not be greater than needed for L2 cache latency, and also not so great
  39. C      that i16 needs to be copied.
  40. C   6. Avoid performing mem+fa+fm in the same cycle, at least not when we want
  41. C      to get high IEU bandwidth.  (12 of the 14 cycles will be free for 2 IEU
  42. C      ops.)
  43. C Instruction classification (as per UltraSPARC-1/2 functional units):
  44. C    8 FM
  45. C   10 FA
  46. C   11 MEM
  47. C   9 ISHIFT + 10? IADDLOG
  48. C    1 BRANCH
  49. C   49 insns totally (plus three mov insns that should be optimized out)
  50. C The loop executes 53 instructions in 14 cycles on UltraSPARC-1/2, i.e we
  51. C sustain 3.79 instructions/cycle.
  52. C INPUT PARAMETERS
  53. C rp i0
  54. C up i1
  55. C n i2
  56. C v i3
  57. ASM_START()
  58. REGISTER(%g2,#scratch)
  59. REGISTER(%g3,#scratch)
  60. define(`p00', `%f8') define(`p16',`%f10') define(`p32',`%f12') define(`p48',`%f14')
  61. define(`r32',`%f16') define(`r48',`%f18') define(`r64',`%f20') define(`r80',`%f22')
  62. define(`v00',`%f24') define(`v16',`%f26') define(`v32',`%f28') define(`v48',`%f30')
  63. define(`u00',`%f32') define(`u32', `%f34')
  64. define(`a00',`%f36') define(`a16',`%f38') define(`a32',`%f40') define(`a48',`%f42')
  65. define(`cy',`%g1')
  66. define(`rlimb',`%g3')
  67. define(`i00',`%l0') define(`i16',`%l1') define(`i32',`%l2') define(`i48',`%l3')
  68. define(`xffffffff',`%l7')
  69. define(`xffff',`%o0')
  70. PROLOGUE(mpn_mul_1)
  71. C Initialization.  (1) Split v operand into four 16-bit chunks and store them
  72. C as IEEE double in fp registers.  (2) Clear upper 32 bits of fp register pairs
  73. C f2 and f4.  (3) Store masks in registers aliased to `xffff' and `xffffffff'.
  74. save %sp, -256, %sp
  75. mov -1, %g4
  76. srlx %g4, 48, xffff C store mask in register `xffff'
  77. and %i3, xffff, %g2
  78. stx %g2, [%sp+2223+0]
  79. srlx %i3, 16, %g3
  80. and %g3, xffff, %g3
  81. stx %g3, [%sp+2223+8]
  82. srlx %i3, 32, %g2
  83. and %g2, xffff, %g2
  84. stx %g2, [%sp+2223+16]
  85. srlx %i3, 48, %g3
  86. stx %g3, [%sp+2223+24]
  87. srlx %g4, 32, xffffffff C store mask in register `xffffffff'
  88. sllx %i2, 3, %i2
  89. mov 0, cy C clear cy
  90. add %i0, %i2, %i0
  91. add %i1, %i2, %i1
  92. neg %i2
  93. add %i1, 4, %i5
  94. add %i0, -32, %i4
  95. add %i0, -16, %i0
  96. ldd [%sp+2223+0], v00
  97. ldd [%sp+2223+8], v16
  98. ldd [%sp+2223+16], v32
  99. ldd [%sp+2223+24], v48
  100. ld [%sp+2223+0],%f2 C zero f2
  101. ld [%sp+2223+0],%f4 C zero f4
  102. ld [%i5+%i2], %f3 C read low 32 bits of up[i]
  103. ld [%i1+%i2], %f5 C read high 32 bits of up[i]
  104. fxtod v00, v00
  105. fxtod v16, v16
  106. fxtod v32, v32
  107. fxtod v48, v48
  108. C Start real work.  (We sneakingly read f3 and f5 above...)
  109. C The software pipeline is very deep, requiring 4 feed-in stages.
  110. fxtod %f2, u00
  111. fxtod %f4, u32
  112. fmuld u00, v00, a00
  113. fmuld u00, v16, a16
  114. fmuld u00, v32, p32
  115. fmuld u32, v00, r32
  116. fmuld u00, v48, p48
  117. addcc %i2, 8, %i2
  118. bnz,pt %icc, .L_two_or_more
  119. fmuld u32, v16, r48
  120. .L_one:
  121. fmuld u32, v32, r64 C FIXME not urgent
  122. faddd p32, r32, a32
  123. fdtox a00, a00
  124. faddd p48, r48, a48
  125. fmuld u32, v48, r80 C FIXME not urgent
  126. fdtox a16, a16
  127. fdtox a32, a32
  128. fdtox a48, a48
  129. std a00, [%sp+2223+0]
  130. std a16, [%sp+2223+8]
  131. std a32, [%sp+2223+16]
  132. std a48, [%sp+2223+24]
  133. add %i2, 8, %i2
  134. fdtox r64, a00
  135. fdtox r80, a16
  136. ldx [%sp+2223+0], i00
  137. ldx [%sp+2223+8], i16
  138. ldx [%sp+2223+16], i32
  139. ldx [%sp+2223+24], i48
  140. std a00, [%sp+2223+0]
  141. std a16, [%sp+2223+8]
  142. add %i2, 8, %i2
  143. mov i00, %g5 C i00+ now in g5
  144. ldx [%sp+2223+0], i00
  145. srlx i16, 48, %l4 C (i16 >> 48)
  146. mov i16, %g2
  147. ldx [%sp+2223+8], i16
  148. srlx i48, 16, %l5 C (i48 >> 16)
  149. mov i32, %g4 C i32+ now in g4
  150. sllx i48, 32, %l6 C (i48 << 32)
  151. srlx %g4, 32, %o3 C (i32 >> 32)
  152. add %l5, %l4, %o1 C hi64- in %o1
  153. std a00, [%sp+2223+0]
  154. sllx %g4, 16, %o2 C (i32 << 16)
  155. add %o3, %o1, %o1 C hi64 in %o1   1st ASSIGNMENT
  156. std a16, [%sp+2223+8]
  157. sllx %o1, 48, %o3 C (hi64 << 48)
  158. add %g2, %o2, %o2 C mi64- in %o2
  159. add %l6, %o2, %o2 C mi64- in %o2
  160. sub %o2, %o3, %o2 C mi64 in %o2   1st ASSIGNMENT
  161. add cy, %g5, %o4 C x = prev(i00) + cy
  162. b .L_out_1
  163. add %i2, 8, %i2
  164. .L_two_or_more:
  165. ld [%i5+%i2], %f3 C read low 32 bits of up[i]
  166. fmuld u32, v32, r64 C FIXME not urgent
  167. faddd p32, r32, a32
  168. ld [%i1+%i2], %f5 C read high 32 bits of up[i]
  169. fdtox a00, a00
  170. faddd p48, r48, a48
  171. fmuld u32, v48, r80 C FIXME not urgent
  172. fdtox a16, a16
  173. fdtox a32, a32
  174. fxtod %f2, u00
  175. fxtod %f4, u32
  176. fdtox a48, a48
  177. std a00, [%sp+2223+0]
  178. fmuld u00, v00, p00
  179. std a16, [%sp+2223+8]
  180. fmuld u00, v16, p16
  181. std a32, [%sp+2223+16]
  182. fmuld u00, v32, p32
  183. std a48, [%sp+2223+24]
  184. faddd p00, r64, a00
  185. fmuld u32, v00, r32
  186. faddd p16, r80, a16
  187. fmuld u00, v48, p48
  188. addcc %i2, 8, %i2
  189. bnz,pt %icc, .L_three_or_more
  190. fmuld u32, v16, r48
  191. .L_two:
  192. fmuld u32, v32, r64 C FIXME not urgent
  193. faddd p32, r32, a32
  194. fdtox a00, a00
  195. faddd p48, r48, a48
  196. fmuld u32, v48, r80 C FIXME not urgent
  197. fdtox a16, a16
  198. ldx [%sp+2223+0], i00
  199. fdtox a32, a32
  200. ldx [%sp+2223+8], i16
  201. ldx [%sp+2223+16], i32
  202. ldx [%sp+2223+24], i48
  203. fdtox a48, a48
  204. std a00, [%sp+2223+0]
  205. std a16, [%sp+2223+8]
  206. std a32, [%sp+2223+16]
  207. std a48, [%sp+2223+24]
  208. add %i2, 8, %i2
  209. fdtox r64, a00
  210. mov i00, %g5 C i00+ now in g5
  211. fdtox r80, a16
  212. ldx [%sp+2223+0], i00
  213. srlx i16, 48, %l4 C (i16 >> 48)
  214. mov i16, %g2
  215. ldx [%sp+2223+8], i16
  216. srlx i48, 16, %l5 C (i48 >> 16)
  217. mov i32, %g4 C i32+ now in g4
  218. ldx [%sp+2223+16], i32
  219. sllx i48, 32, %l6 C (i48 << 32)
  220. ldx [%sp+2223+24], i48
  221. srlx %g4, 32, %o3 C (i32 >> 32)
  222. add %l5, %l4, %o1 C hi64- in %o1
  223. std a00, [%sp+2223+0]
  224. sllx %g4, 16, %o2 C (i32 << 16)
  225. add %o3, %o1, %o1 C hi64 in %o1   1st ASSIGNMENT
  226. std a16, [%sp+2223+8]
  227. sllx %o1, 48, %o3 C (hi64 << 48)
  228. add %g2, %o2, %o2 C mi64- in %o2
  229. add %l6, %o2, %o2 C mi64- in %o2
  230. sub %o2, %o3, %o2 C mi64 in %o2   1st ASSIGNMENT
  231. add cy, %g5, %o4 C x = prev(i00) + cy
  232. b .L_out_2
  233. add %i2, 8, %i2
  234. .L_three_or_more:
  235. ld [%i5+%i2], %f3 C read low 32 bits of up[i]
  236. fmuld u32, v32, r64 C FIXME not urgent
  237. faddd p32, r32, a32
  238. ld [%i1+%i2], %f5 C read high 32 bits of up[i]
  239. fdtox a00, a00
  240. faddd p48, r48, a48
  241. fmuld u32, v48, r80 C FIXME not urgent
  242. fdtox a16, a16
  243. ldx [%sp+2223+0], i00
  244. fdtox a32, a32
  245. ldx [%sp+2223+8], i16
  246. fxtod %f2, u00
  247. ldx [%sp+2223+16], i32
  248. fxtod %f4, u32
  249. ldx [%sp+2223+24], i48
  250. fdtox a48, a48
  251. std a00, [%sp+2223+0]
  252. fmuld u00, v00, p00
  253. std a16, [%sp+2223+8]
  254. fmuld u00, v16, p16
  255. std a32, [%sp+2223+16]
  256. fmuld u00, v32, p32
  257. std a48, [%sp+2223+24]
  258. faddd p00, r64, a00
  259. fmuld u32, v00, r32
  260. faddd p16, r80, a16
  261. fmuld u00, v48, p48
  262. addcc %i2, 8, %i2
  263. bnz,pt %icc, .L_four_or_more
  264. fmuld u32, v16, r48
  265. .L_three:
  266. fmuld u32, v32, r64 C FIXME not urgent
  267. faddd p32, r32, a32
  268. fdtox a00, a00
  269. faddd p48, r48, a48
  270. mov i00, %g5 C i00+ now in g5
  271. fmuld u32, v48, r80 C FIXME not urgent
  272. fdtox a16, a16
  273. ldx [%sp+2223+0], i00
  274. fdtox a32, a32
  275. srlx i16, 48, %l4 C (i16 >> 48)
  276. mov i16, %g2
  277. ldx [%sp+2223+8], i16
  278. srlx i48, 16, %l5 C (i48 >> 16)
  279. mov i32, %g4 C i32+ now in g4
  280. ldx [%sp+2223+16], i32
  281. sllx i48, 32, %l6 C (i48 << 32)
  282. ldx [%sp+2223+24], i48
  283. fdtox a48, a48
  284. srlx %g4, 32, %o3 C (i32 >> 32)
  285. add %l5, %l4, %o1 C hi64- in %o1
  286. std a00, [%sp+2223+0]
  287. sllx %g4, 16, %o2 C (i32 << 16)
  288. add %o3, %o1, %o1 C hi64 in %o1   1st ASSIGNMENT
  289. std a16, [%sp+2223+8]
  290. sllx %o1, 48, %o3 C (hi64 << 48)
  291. add %g2, %o2, %o2 C mi64- in %o2
  292. std a32, [%sp+2223+16]
  293. add %l6, %o2, %o2 C mi64- in %o2
  294. std a48, [%sp+2223+24]
  295. sub %o2, %o3, %o2 C mi64 in %o2   1st ASSIGNMENT
  296. add cy, %g5, %o4 C x = prev(i00) + cy
  297. b .L_out_3
  298. add %i2, 8, %i2
  299. .L_four_or_more:
  300. ld [%i5+%i2], %f3 C read low 32 bits of up[i]
  301. fmuld u32, v32, r64 C FIXME not urgent
  302. faddd p32, r32, a32
  303. ld [%i1+%i2], %f5 C read high 32 bits of up[i]
  304. fdtox a00, a00
  305. faddd p48, r48, a48
  306. mov i00, %g5 C i00+ now in g5
  307. fmuld u32, v48, r80 C FIXME not urgent
  308. fdtox a16, a16
  309. ldx [%sp+2223+0], i00
  310. fdtox a32, a32
  311. srlx i16, 48, %l4 C (i16 >> 48)
  312. mov i16, %g2
  313. ldx [%sp+2223+8], i16
  314. fxtod %f2, u00
  315. srlx i48, 16, %l5 C (i48 >> 16)
  316. mov i32, %g4 C i32+ now in g4
  317. ldx [%sp+2223+16], i32
  318. fxtod %f4, u32
  319. sllx i48, 32, %l6 C (i48 << 32)
  320. ldx [%sp+2223+24], i48
  321. fdtox a48, a48
  322. srlx %g4, 32, %o3 C (i32 >> 32)
  323. add %l5, %l4, %o1 C hi64- in %o1
  324. std a00, [%sp+2223+0]
  325. fmuld u00, v00, p00
  326. sllx %g4, 16, %o2 C (i32 << 16)
  327. add %o3, %o1, %o1 C hi64 in %o1   1st ASSIGNMENT
  328. std a16, [%sp+2223+8]
  329. fmuld u00, v16, p16
  330. sllx %o1, 48, %o3 C (hi64 << 48)
  331. add %g2, %o2, %o2 C mi64- in %o2
  332. std a32, [%sp+2223+16]
  333. fmuld u00, v32, p32
  334. add %l6, %o2, %o2 C mi64- in %o2
  335. std a48, [%sp+2223+24]
  336. faddd p00, r64, a00
  337. fmuld u32, v00, r32
  338. sub %o2, %o3, %o2 C mi64 in %o2   1st ASSIGNMENT
  339. faddd p16, r80, a16
  340. fmuld u00, v48, p48
  341. add cy, %g5, %o4 C x = prev(i00) + cy
  342. addcc %i2, 8, %i2
  343. bnz,pt %icc, .Loop
  344. fmuld u32, v16, r48
  345. .L_four:
  346. b,a .L_out_4
  347. C BEGIN MAIN LOOP
  348. .align 16
  349. .Loop:
  350. C 00
  351. srlx %o4, 16, %o5 C (x >> 16)
  352. ld [%i5+%i2], %f3 C read low 32 bits of up[i]
  353. fmuld u32, v32, r64 C FIXME not urgent
  354. faddd p32, r32, a32
  355. C 01
  356. add %o5, %o2, %o2 C mi64 in %o2   2nd ASSIGNMENT
  357. and %o4, xffff, %o5 C (x & 0xffff)
  358. ld [%i1+%i2], %f5 C read high 32 bits of up[i]
  359. fdtox a00, a00
  360. C 02
  361. faddd p48, r48, a48
  362. C 03
  363. srlx %o2, 48, %o7 C (mi64 >> 48)
  364. mov i00, %g5 C i00+ now in g5
  365. fmuld u32, v48, r80 C FIXME not urgent
  366. fdtox a16, a16
  367. C 04
  368. sllx %o2, 16, %i3 C (mi64 << 16)
  369. add %o7, %o1, cy C new cy
  370. ldx [%sp+2223+0], i00
  371. fdtox a32, a32
  372. C 05
  373. srlx i16, 48, %l4 C (i16 >> 48)
  374. mov i16, %g2
  375. ldx [%sp+2223+8], i16
  376. fxtod %f2, u00
  377. C 06
  378. srlx i48, 16, %l5 C (i48 >> 16)
  379. mov i32, %g4 C i32+ now in g4
  380. ldx [%sp+2223+16], i32
  381. fxtod %f4, u32
  382. C 07
  383. sllx i48, 32, %l6 C (i48 << 32)
  384. or %i3, %o5, %o5
  385. ldx [%sp+2223+24], i48
  386. fdtox a48, a48
  387. C 08
  388. srlx %g4, 32, %o3 C (i32 >> 32)
  389. add %l5, %l4, %o1 C hi64- in %o1
  390. std a00, [%sp+2223+0]
  391. fmuld u00, v00, p00
  392. C 09
  393. sllx %g4, 16, %o2 C (i32 << 16)
  394. add %o3, %o1, %o1 C hi64 in %o1   1st ASSIGNMENT
  395. std a16, [%sp+2223+8]
  396. fmuld u00, v16, p16
  397. C 10
  398. sllx %o1, 48, %o3 C (hi64 << 48)
  399. add %g2, %o2, %o2 C mi64- in %o2
  400. std a32, [%sp+2223+16]
  401. fmuld u00, v32, p32
  402. C 11
  403. add %l6, %o2, %o2 C mi64- in %o2
  404. std a48, [%sp+2223+24]
  405. faddd p00, r64, a00
  406. fmuld u32, v00, r32
  407. C 12
  408. sub %o2, %o3, %o2 C mi64 in %o2   1st ASSIGNMENT
  409. stx %o5, [%i4+%i2]
  410. faddd p16, r80, a16
  411. fmuld u00, v48, p48
  412. C 13
  413. add cy, %g5, %o4 C x = prev(i00) + cy
  414. addcc %i2, 8, %i2
  415. bnz,pt %icc, .Loop
  416. fmuld u32, v16, r48
  417. C END MAIN LOOP
  418. .L_out_4:
  419. srlx %o4, 16, %o5 C (x >> 16)
  420. fmuld u32, v32, r64 C FIXME not urgent
  421. faddd p32, r32, a32
  422. add %o5, %o2, %o2 C mi64 in %o2   2nd ASSIGNMENT
  423. and %o4, xffff, %o5 C (x & 0xffff)
  424. fdtox a00, a00
  425. faddd p48, r48, a48
  426. srlx %o2, 48, %o7 C (mi64 >> 48)
  427. mov i00, %g5 C i00+ now in g5
  428. fmuld u32, v48, r80 C FIXME not urgent
  429. fdtox a16, a16
  430. sllx %o2, 16, %i3 C (mi64 << 16)
  431. add %o7, %o1, cy C new cy
  432. ldx [%sp+2223+0], i00
  433. fdtox a32, a32
  434. srlx i16, 48, %l4 C (i16 >> 48)
  435. mov i16, %g2
  436. ldx [%sp+2223+8], i16
  437. srlx i48, 16, %l5 C (i48 >> 16)
  438. mov i32, %g4 C i32+ now in g4
  439. ldx [%sp+2223+16], i32
  440. sllx i48, 32, %l6 C (i48 << 32)
  441. or %i3, %o5, %o5
  442. ldx [%sp+2223+24], i48
  443. fdtox a48, a48
  444. srlx %g4, 32, %o3 C (i32 >> 32)
  445. add %l5, %l4, %o1 C hi64- in %o1
  446. std a00, [%sp+2223+0]
  447. sllx %g4, 16, %o2 C (i32 << 16)
  448. add %o3, %o1, %o1 C hi64 in %o1   1st ASSIGNMENT
  449. std a16, [%sp+2223+8]
  450. sllx %o1, 48, %o3 C (hi64 << 48)
  451. add %g2, %o2, %o2 C mi64- in %o2
  452. std a32, [%sp+2223+16]
  453. add %l6, %o2, %o2 C mi64- in %o2
  454. std a48, [%sp+2223+24]
  455. sub %o2, %o3, %o2 C mi64 in %o2   1st ASSIGNMENT
  456. stx %o5, [%i4+%i2]
  457. add cy, %g5, %o4 C x = prev(i00) + cy
  458. add %i2, 8, %i2
  459. .L_out_3:
  460. srlx %o4, 16, %o5 C (x >> 16)
  461. add %o5, %o2, %o2 C mi64 in %o2   2nd ASSIGNMENT
  462. and %o4, xffff, %o5 C (x & 0xffff)
  463. fdtox r64, a00
  464. srlx %o2, 48, %o7 C (mi64 >> 48)
  465. mov i00, %g5 C i00+ now in g5
  466. fdtox r80, a16
  467. sllx %o2, 16, %i3 C (mi64 << 16)
  468. add %o7, %o1, cy C new cy
  469. ldx [%sp+2223+0], i00
  470. srlx i16, 48, %l4 C (i16 >> 48)
  471. mov i16, %g2
  472. ldx [%sp+2223+8], i16
  473. srlx i48, 16, %l5 C (i48 >> 16)
  474. mov i32, %g4 C i32+ now in g4
  475. ldx [%sp+2223+16], i32
  476. sllx i48, 32, %l6 C (i48 << 32)
  477. or %i3, %o5, %o5
  478. ldx [%sp+2223+24], i48
  479. srlx %g4, 32, %o3 C (i32 >> 32)
  480. add %l5, %l4, %o1 C hi64- in %o1
  481. std a00, [%sp+2223+0]
  482. sllx %g4, 16, %o2 C (i32 << 16)
  483. add %o3, %o1, %o1 C hi64 in %o1   1st ASSIGNMENT
  484. std a16, [%sp+2223+8]
  485. sllx %o1, 48, %o3 C (hi64 << 48)
  486. add %g2, %o2, %o2 C mi64- in %o2
  487. add %l6, %o2, %o2 C mi64- in %o2
  488. sub %o2, %o3, %o2 C mi64 in %o2   1st ASSIGNMENT
  489. stx %o5, [%i4+%i2]
  490. add cy, %g5, %o4 C x = prev(i00) + cy
  491. add %i2, 8, %i2
  492. .L_out_2:
  493. srlx %o4, 16, %o5 C (x >> 16)
  494. add %o5, %o2, %o2 C mi64 in %o2   2nd ASSIGNMENT
  495. and %o4, xffff, %o5 C (x & 0xffff)
  496. srlx %o2, 48, %o7 C (mi64 >> 48)
  497. mov i00, %g5 C i00+ now in g5
  498. sllx %o2, 16, %i3 C (mi64 << 16)
  499. add %o7, %o1, cy C new cy
  500. ldx [%sp+2223+0], i00
  501. srlx i16, 48, %l4 C (i16 >> 48)
  502. mov i16, %g2
  503. ldx [%sp+2223+8], i16
  504. srlx i48, 16, %l5 C (i48 >> 16)
  505. mov i32, %g4 C i32+ now in g4
  506. sllx i48, 32, %l6 C (i48 << 32)
  507. or %i3, %o5, %o5
  508. srlx %g4, 32, %o3 C (i32 >> 32)
  509. add %l5, %l4, %o1 C hi64- in %o1
  510. sllx %g4, 16, %o2 C (i32 << 16)
  511. add %o3, %o1, %o1 C hi64 in %o1   1st ASSIGNMENT
  512. sllx %o1, 48, %o3 C (hi64 << 48)
  513. add %g2, %o2, %o2 C mi64- in %o2
  514. add %l6, %o2, %o2 C mi64- in %o2
  515. sub %o2, %o3, %o2 C mi64 in %o2   1st ASSIGNMENT
  516. stx %o5, [%i4+%i2]
  517. add cy, %g5, %o4 C x = prev(i00) + cy
  518. add %i2, 8, %i2
  519. .L_out_1:
  520. srlx %o4, 16, %o5 C (x >> 16)
  521. add %o5, %o2, %o2 C mi64 in %o2   2nd ASSIGNMENT
  522. and %o4, xffff, %o5 C (x & 0xffff)
  523. srlx %o2, 48, %o7 C (mi64 >> 48)
  524. sllx %o2, 16, %i3 C (mi64 << 16)
  525. add %o7, %o1, cy C new cy
  526. or %i3, %o5, %o5
  527. stx %o5, [%i4+%i2]
  528. sllx i00, 0, %g2
  529. add %g2, cy, cy
  530. sllx i16, 16, %g3
  531. add %g3, cy, cy
  532. return %i7+8
  533. mov cy, %o0
  534. EPILOGUE(mpn_mul_1)