1! SPARC v9 64-bit VIS3 __mpn_sub_n -- Subtract two limb vectors of the same length > 0
2! and store difference 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_sub_n_vis3)
35	subcc	sz, 1, sz
36	be	.Lfinal_limb
37	 cmp	%g0, 1
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	xnor	tmp1, %g0, tmp1
49	addxccc	tmp1, tmp2, tmp1
50	stx	tmp1, [res_ptr - 0x10]
51	xnor	tmp3, %g0, tmp3
52	addxccc	tmp3, tmp4, tmp3
53	brgz	sz, .Lloop
54	stx	tmp3, [res_ptr - 0x08]
55
56	brlz,pt	sz, .Lfinish
57	 nop
58
59.Lfinal_limb:
60	ldx	[s2_ptr + 0x00], tmp1
61	ldx	[s1_ptr + 0x00], tmp2
62	xnor	tmp1, %g0, tmp1
63	addxccc	tmp1, tmp2, tmp1
64	stx	tmp1, [res_ptr + 0x00]
65
66.Lfinish:
67	clr	%o0
68	retl
69	 movcc	%xcc, 1, %o0
70END(__mpn_sub_n_vis3)
71