1/* Copy SRC to DEST returning the address of the terminating '\0' in DEST.
2   For SPARC v7.
3   Copyright (C) 1996-2021 Free Software Foundation, Inc.
4   This file is part of the GNU C Library.
5
6   The GNU C Library is free software; you can redistribute it and/or
7   modify it under the terms of the GNU Lesser General Public
8   License as published by the Free Software Foundation; either
9   version 2.1 of the License, or (at your option) any later version.
10
11   The GNU C Library is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   Lesser General Public License for more details.
15
16   You should have received a copy of the GNU Lesser General Public
17   License along with the GNU C Library; if not, see
18   <https://www.gnu.org/licenses/>.  */
19
20#include <sysdep.h>
21
22	/* Normally, this uses ((xword - 0x01010101) & 0x80808080) test
23	   to find out if any byte in xword could be zero. This is fast, but
24	   also gives false alarm for any byte in range 0x81-0xff. It does
25	   not matter for correctness, as if this test tells us there could
26	   be some zero byte, we check it byte by byte, but if bytes with
27	   high bits set are common in the strings, then this will give poor
28	   performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
29	   will use one tick slower, but more precise test
30	   ((xword - 0x01010101) & (~xword) & 0x80808080),
31	   which does not give any false alarms (but if some bits are set,
32	   one cannot assume from it which bytes are zero and which are not).
33	   It is yet to be measured, what is the correct default for glibc
34	   in these days for an average user.
35	 */
36
37	.text
38	.align		4
39
40ENTRY(__stpcpy)
41	andcc		%o1, 3, %g0
42	be		20f
43	 sethi		%hi(0x80808080), %o4
44
45	ldub		[%o1], %o5
46	stb		%o5, [%o0]
47	cmp		%o5, 0
48	add		%o0, 1, %o0
49	be		1f
50	 add		%o1, 1, %o1
51	andcc		%o1, 3, %g0
52	be		4f
53	 or		%o4, %lo(0x80808080), %o3
54	ldub		[%o1], %o5
55	stb		%o5, [%o0]
56	cmp		%o5, 0
57	add		%o0, 1, %o0
58	be		1f
59	 add		%o1, 1, %o1
60	andcc		%o1, 3, %g0
61	be		5f
62	 sethi		%hi(0x01010101), %o4
63	ldub		[%o1], %o5
64	stb		%o5, [%o0]
65	cmp		%o5, 0
66	add		%o0, 1, %o0
67	be		1f
68	 add		%o1, 1, %o1
69	b		6f
70	 or		%o4, %lo(0x01010101), %o2
711:	retl
72	 add		%o0, -1, %o0
73
7420:	or		%o4, %lo(0x80808080), %o3
754:	sethi		%hi(0x01010101), %o4
765:	or		%o4, %lo(0x01010101), %o2
776:	andcc		%o0, 3, %g0
78	bne		16f
79	 sub		%g0, 4, %g1
80
8111:	add		%g1, 4, %g1
82	ld		[%o1 + %g1], %o5
83	sub		%o5, %o2, %o4
84#ifdef EIGHTBIT_NOT_RARE
85	andn		%o4, %o5, %o4
86#endif
87	andcc		%o4, %o3, %g0
88	be,a		11b
89	 st		%o5, [%o0 + %g1]
90
91	/* Check every byte. */
92	srl		%o5, 24, %g5
93	andcc		%g5, 0xff, %g0
94	be		14f
95	 srl		%o5, 16, %g5
96	andcc		%g5, 0xff, %g0
97	be		13f
98	 srl		%o5, 8, %g5
99	andcc		%g5, 0xff, %g0
100	be		12f
101	 andcc		%o5, 0xff, %g0
102	bne		11b
103	 st		%o5, [%o0 + %g1]
104	add		%o0, %g1, %o0
105	retl
106	 add		%o0, 3, %o0
10712:	srl		%o5, 16, %o5
108	sth		%o5, [%o0 + %g1]
109	add		%g1, 2, %g1
110	stb		%g0, [%o0 + %g1]
111	retl
112	 add		%o0, %g1, %o0
11313:	srl		%o5, 16, %o5
114	sth		%o5, [%o0 + %g1]
115	add		%g1, 1, %g1
116	retl
117	 add		%o0, %g1, %o0
11814:	stb		%g0, [%o0 + %g1]
119	retl
120	 add		%o0, %g1, %o0
121
12215:	srl		%o5, 24, %o4
123	srl		%o5, 16, %g1
124	stb		%o4, [%o0]
125	srl		%o5, 8, %g4
126	stb		%g1, [%o0 + 1]
127	stb		%g4, [%o0 + 2]
128	stb		%o5, [%o0 + 3]
129	add		%o0, 4, %o0
13016:	ld		[%o1], %o5
131	sub		%o5, %o2, %o4
132	andcc		%o4, %o3, %g0
133	be		15b
134	 add		%o1, 4, %o1
135
136	/* Check every byte. */
137	srl		%o5, 24, %g5
138	andcc		%g5, 0xff, %g4
139	be		19f
140	 stb		%g4, [%o0]
141	srl		%o5, 16, %g5
142	andcc		%g5, 0xff, %g4
143	be		18f
144	 stb		%g4, [%o0 + 1]
145	srl		%o5, 8, %g5
146	andcc		%g5, 0xff, %g4
147	be		17f
148 	 stb		%g4, [%o0 + 2]
149	andcc		%o5, 0xff, %g4
150	stb		%g4, [%o0 + 3]
151	bne		16b
152	 add		%o0, 4, %o0
153	retl
154	 sub		%o0, 1, %o0
15517:	retl
156	 add		%o0, 2, %o0
15718:	retl
158	 add		%o0, 1, %o0
15919:	retl
160	 nop
161END(__stpcpy)
162
163weak_alias (__stpcpy, stpcpy)
164libc_hidden_def (__stpcpy)
165libc_hidden_builtin_def (stpcpy)
166