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

数学计算

开发平台:

Unix_Linux

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