summaryrefslogtreecommitdiff
path: root/libc/string/sparc/sparc32/strcmp.S
blob: 07284cd18a7b71495f26be2ee0de8cc993fbcc09 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
/* Compare two strings for differences.
   For SPARC v7.
   Copyright (C) 1996, 97, 99, 2003 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   Contributed by Jakub Jelinek <jj@ultra.linux.cz>.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

	/* Normally, this uses ((xword - 0x01010101) & 0x80808080) test
	   to find out if any byte in xword could be zero. This is fast, but
	   also gives false alarm for any byte in range 0x81-0xff. It does
	   not matter for correctness, as if this test tells us there could
	   be some zero byte, we check it byte by byte, but if bytes with
	   high bits set are common in the strings, then this will give poor
	   performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
	   will use one tick slower, but more precise test
	   ((xword - 0x01010101) & (~xword) & 0x80808080),
	   which does not give any false alarms (but if some bits are set,
	   one cannot assume from it which bytes are zero and which are not).
	   It is yet to be measured, what is the correct default for glibc
	   in these days for an average user.
	 */

	.text
	.align		4
10:	ldub		[%o0], %o4
	add		%o0, 1, %o0
	ldub		[%o1], %o5
	cmp		%o4, 0
	add		%o1, 1, %o1
	be		2f
	 subcc		%o4, %o5, %o4
	bne		2f
	 andcc		%o0, 3, %g0
	be		4f
	 or		%g1, %lo(0x80808080), %o3
	ldub		[%o0], %o4
	add		%o0, 1, %o0
	ldub		[%o1], %o5
	cmp		%o4, 0
	add		%o1, 1, %o1
	be		2f
	 subcc		%o4, %o5, %o4
	bne		2f
	 andcc		%o0, 3, %g0
	be		5f
	 sethi		%hi(0x01010101), %g1
	ldub		[%o0], %o4
	add		%o0, 1, %o0
	ldub		[%o1], %o5
	cmp		%o4, 0
	add		%o1, 1, %o1
	be		2f
	 subcc		%o4, %o5, %o4
	bne		2f
	 andcc		%o1, 3, %g2
	bne		12f
	 or		%g1, %lo(0x01010101), %o2
	b		1f
	 ld		[%o0], %o4
2:	retl
	 mov		%o4, %o0

ENTRY(strcmp)
	andcc		%o0, 3, %g0
	bne		10b
	 sethi		%hi(0x80808080), %g1
	or		%g1, %lo(0x80808080), %o3
4:	sethi		%hi(0x01010101), %g1
5:	andcc		%o1, 3, %g2
	bne		12f
	 or		%g1, %lo(0x01010101), %o2

0:	ld		[%o0], %o4
1:	ld		[%o1], %o5
	sub		%o4, %o2, %g1
	add		%o0, 4, %o0
	cmp		%o4, %o5
#ifdef EIGHTBIT_NOT_RARE
	andn		%g1, %o4, %g1
#endif
	bne		11f
	 andcc		%g1, %o3, %g0
	be		0b
	 add		%o1, 4, %o1

	srl		%o4, 24, %g4
	andcc		%g4, 0xff, %g0
	be		2f
	 srl		%o4, 16, %g4
	andcc		%g4, 0xff, %g0
	be		2f
	 srl		%o4, 8, %g4
	andcc		%g4, 0xff, %g0
	be		2f
	 andcc		%o4, 0xff, %g0
	bne,a		1b
	 ld		[%o0], %o4
2:	retl
	 clr		%o0

11:	srl		%o4, 24, %g4
	srl		%o5, 24, %g5
	andcc		%g4, 0xff, %g0
	be		3f
	 subcc		%g4, %g5, %g4
	bne		3f
	 srl		%o5, 16, %g5
	srl		%o4, 16, %g4
	andcc		%g4, 0xff, %g0
	be		3f
	 subcc		%g4, %g5, %g4
	bne		3f
	 srl		%o5, 8, %g5
	srl		%o4, 8, %g4
	andcc		%g4, 0xff, %g0
	be		3f
	 subcc		%g4, %g5, %g4
	bne		3f
	 subcc		%o4, %o5, %o4
	retl
	 mov		%o4, %o0
3:	retl
	 mov		%g4, %o0

12:	save		%sp, -64, %sp
	ld		[%i0], %i4
	sll		%g2, 3, %g3
	andn		%i1, 3, %i1
	mov		32, %l1
	ld		[%i1], %l2
	mov		-1, %g6
	add		%i1, 4, %i1
	sub		%l1, %g3, %l1
	sll		%g6, %g3, %g6

1:	sll		%l2, %g3, %g5
	and		%i4, %g6, %l3
	sub		%i4, %i2, %g1
#ifdef EIGHTBIT_NOT_RARE
	andn		%g1, %i4, %g1
#endif
	andcc		%g1, %i3, %g1
	bne		3f
	 cmp		%g5, %l3
	bne		2f
	 add		%i0, 4, %i0
	ld		[%i1], %l2
	add		%i1, 4, %i1
	srl		%l2, %l1, %l4
	or		%l4, %g5, %l4
	cmp		%l4, %i4
	be,a		1b
	 ld		[%i0], %i4
	restore		%l4, %g0, %o3
	retl
	 sub		%o4, %o3, %o0

2:	sll		%l2, %g3, %i2
	srl		%i4, %g3, %i3
	srl		%i2, %g3, %i2
	restore
	retl
	 sub		%o3, %o2, %o0

3:	srl		%i4, 24, %g4
	srl		%g5, 24, %l6
	andcc		%g4, 0xff, %g0
	be		4f
	 subcc		%g4, %l6, %g4
	bne		4f
	 cmp		%g2, 3
	be		6f
	 srl		%i4, 16, %g4
	srl		%g5, 16, %l6
	andcc		%g4, 0xff, %g0
	be		4f
	 subcc		%g4, %l6, %g4
	bne		4f
	 cmp		%g2, 2
	be		5f
	 srl		%i4, 8, %g4
	srl		%g5, 8, %l6
	andcc		%g4, 0xff, %g0
	be		4f
	 subcc		%g4, %l6, %g4
	bne		4f
	 add		%i0, 4, %i0
	ld		[%i1], %l2
	add		%i1, 4, %i1
	srl		%l2, 24, %g5
	andcc		%i4, 0xff, %g4
	be		4f
	 subcc		%g4, %g5, %g4
	be,a		1b
	 ld		[%i0], %i4
4:	jmpl		%i7 + 8, %g0
	 restore	%g4, %g0, %o0

5:	ld		[%i1], %l2
	add		%i1, 4, %i1
	add		%i0, 4, %i0
	srl		%l2, 24, %l6
	andcc		%g4, 0xff, %g4
	be		4b
	 subcc		%g4, %l6, %g4
	bne		4b
	 srl		%l2, 16, %l6
	andcc		%i4, 0xff, %g4
	and		%l6, 0xff, %l6
	be		4b
	 subcc		%g4, %l6, %g4
	be,a		1b
	 ld		[%i0], %i4
	jmpl		%i7 + 8, %g0
	 restore	%g4, %g0, %o0

6:	ld		[%i1], %l2
	add		%i1, 4, %i1
	add		%i0, 4, %i0
	srl		%l2, 24, %l6
	andcc		%g4, 0xff, %g4
	be		4b
	 subcc		%g4, %l6, %g4
	bne		4b
	 srl		%l2, 16, %l6
	srl		%i4, 8, %g4
	and		%l6, 0xff, %l6
	andcc		%g4, 0xff, %g4
	be		4b
	 subcc		%g4, %l6, %g4
	bne		4b
	 srl		%l2, 8, %l6
	andcc		%i4, 0xff, %g4
	and		%l6, 0xff, %l6
	be		4b
	 subcc		%g4, %l6, %g4
	be,a		1b
	 ld		[%i0], %i4
	jmpl		%i7 + 8, %g0
	 restore	%g4, %g0, %o0
END(strcmp)
libc_hidden_def(strcmp)
ons of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it!