1! SPARC v9 64-bit VIS3 __mpn_add_n -- Add two limb vectors of the same length > 0 and
2! store sum in a third limb vector.
3!
4! Copyright (C) 2013-2022 Free Software Foundation, Inc.
5! This file is part of the GNU C Library.
6!
7! The GNU C Library is free software; you can redistribute it and/or
8! modify it under the terms of the GNU Lesser General Public
9! License as published by the Free Software Foundation; either
10! version 2.1 of the License, or (at your option) any later version.
11!
12! The GNU C Library is distributed in the hope that it will be useful,
13! but WITHOUT ANY WARRANTY; without even the implied warranty of
14! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15! Lesser General Public License for more details.
16!
17! You should have received a copy of the GNU Lesser General Public
18! License along with the GNU C Library; if not, see
19! <https://www.gnu.org/licenses/>.
20
21#include <sysdep.h>
22
23#define res_ptr	%o0
24#define s1_ptr	%o1
25#define s2_ptr	%o2
26#define sz	%o3
27#define tmp1	%g1
28#define tmp2	%g2
29#define tmp3	%g3
30#define tmp4	%o4
31
32	.register	%g2,#scratch
33	.register	%g3,#scratch
34ENTRY(__mpn_add_n_vis3)
35	subcc	sz, 1, sz
36	be	.Lfinal_limb
37	 cmp	%g0, 0
38
39.Lloop:
40	ldx	[s2_ptr + 0x00], tmp1
41	add	s2_ptr, 0x10, s2_ptr
42	ldx	[s1_ptr + 0x00], tmp2
43	add	s1_ptr, 0x10, s1_ptr
44	ldx	[s2_ptr - 0x08], tmp3
45	add	res_ptr, 0x10, res_ptr
46	ldx	[s1_ptr - 0x08], tmp4
47	sub	sz, 2, sz
48	addxccc	tmp1, tmp2, tmp1
49	stx	tmp1, [res_ptr - 0x10]
50	addxccc	tmp3, tmp4, tmp3
51	brgz	sz, .Lloop
52	stx	tmp3, [res_ptr - 0x08]
53
54	brlz,pt	sz, .Lfinish
55	 nop
56
57.Lfinal_limb:
58	ldx	[s2_ptr + 0x00], tmp1
59	ldx	[s1_ptr + 0x00], tmp2
60	addxccc	tmp1, tmp2, tmp1
61	stx	tmp1, [res_ptr + 0x00]
62
63.Lfinish:
64	retl
65	 addxc	%g0, %g0, %o0
66END(__mpn_add_n_vis3)
67