]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/sparc/sparc64/strncmp.S
Update copyright dates with scripts/update-copyrights
[thirdparty/glibc.git] / sysdeps / sparc / sparc64 / strncmp.S
CommitLineData
9c84384c
JM
1/* Compare no more than N characters of S1 and S2, returning less than,
2 equal to or greater than zero if S1 is lexicographically less than,
ae6b8730
RH
3 equal to or greater than S2.
4 For SPARC v9.
2b778ceb 5 Copyright (C) 1997-2021 Free Software Foundation, Inc.
ae6b8730 6 This file is part of the GNU C Library.
e6855a3b 7 Contributed by Jan Vondrák <jvon4518@ss1000.ms.mff.cuni.cz> and
ae6b8730
RH
8 Jakub Jelinek <jj@ultra.linux.cz>.
9
10 The GNU C Library is free software; you can redistribute it and/or
41bdb6e2
AJ
11 modify it under the terms of the GNU Lesser General Public
12 License as published by the Free Software Foundation; either
13 version 2.1 of the License, or (at your option) any later version.
ae6b8730
RH
14
15 The GNU C Library is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
41bdb6e2 18 Lesser General Public License for more details.
ae6b8730 19
41bdb6e2 20 You should have received a copy of the GNU Lesser General Public
59ba27a6 21 License along with the GNU C Library; if not, see
5a82c748 22 <https://www.gnu.org/licenses/>. */
ae6b8730
RH
23
24#include <sysdep.h>
25#include <asm/asi.h>
26#ifndef XCC
27#define XCC xcc
28#define USE_BPR
8cb079d4
UD
29 .register %g2, #scratch
30 .register %g3, #scratch
62f29da7 31 .register %g6, #scratch
ae6b8730
RH
32#endif
33
34 /* Normally, this uses
35 ((xword - 0x0101010101010101) & 0x8080808080808080) test
36 to find out if any byte in xword could be zero. This is fast, but
37 also gives false alarm for any byte in range 0x81-0xff. It does
38 not matter for correctness, as if this test tells us there could
39 be some zero byte, we check it byte by byte, but if bytes with
40 high bits set are common in the strings, then this will give poor
41 performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
42 will use one tick slower, but more precise test
43 ((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
44 which does not give any false alarms (but if some bits are set,
45 one cannot assume from it which bytes are zero and which are not).
46 It is yet to be measured, what is the correct default for glibc
47 in these days for an average user.
48 */
49
50 .text
51 .align 32
52ENTRY(strncmp)
53#ifdef USE_BPR
54 brz,pn %o2, 4f /* CTI+IEU1 Group */
55#else
56 tst %o2 /* IEU1 Group */
57 be,pn %XCC, 4f /* CTI */
58#endif
59 sethi %hi(0x1010101), %g1 /* IEU0 */
60 andcc %o0, 7, %g0 /* IEU1 Group */
61 bne,pn %icc, 9f /* CTI */
62
63 or %g1, %lo(0x1010101), %g1 /* IEU0 */
64 andcc %o1, 7, %g3 /* IEU1 Group */
65 bne,pn %icc, 11f /* CTI */
66 sllx %g1, 32, %g2 /* IEU0 */
67
68 ldx [%o0], %g4 /* Load Group */
69 or %g1, %g2, %g1 /* IEU0 */
701: ldx [%o1], %o3 /* Load Group */
71 sllx %g1, 7, %g2 /* IEU0 */
72
73 add %o0, 8, %o0 /* IEU1 */
742: subcc %o2, 8, %o2 /* IEU1 Group */
aa4980fc 75 bcs,pn %XCC, 5f /* CTI */
ae6b8730
RH
76 add %o1, 8, %o1 /* IEU0 */
77
78 sub %g4, %g1, %g3 /* IEU0 Group */
79 subcc %g4, %o3, %o4 /* IEU1 */
80#ifdef EIGHTBIT_NOT_RARE
62f29da7 81 andn %g3, %g4, %g6 /* IEU0 Group */
ae6b8730
RH
82#endif
83 bne,pn %xcc, 6f /* CTI */
84 ldxa [%o0] ASI_PNF, %g4 /* Load Group */
85
86 add %o0, 8, %o0 /* IEU0 */
87#ifdef EIGHTBIT_NOT_RARE
62f29da7 88 andcc %g6, %g2, %g0 /* IEU1 */
ae6b8730
RH
89#else
90 andcc %g3, %g2, %g0 /* IEU1 */
91#endif
92 be,a,pt %xcc, 2b /* CTI */
93 ldxa [%o1] ASI_PNF, %o3 /* Load Group */
94
95 addcc %g3, %g1, %o4 /* IEU1 */
96#ifdef EIGHTBIT_NOT_RARE
62f29da7
UD
97 srlx %g6, 32, %g6 /* IEU0 */
98 andcc %g6, %g2, %g0 /* IEU1 Group */
ae6b8730
RH
99#else
100 srlx %g3, 32, %g3 /* IEU0 */
101 andcc %g3, %g2, %g0 /* IEU1 Group */
102#endif
103 be,pt %xcc, 3f /* CTI */
104
105 srlx %o4, 56, %o5 /* IEU0 */
106 andcc %o5, 0xff, %g0 /* IEU1 Group */
107 be,pn %icc, 4f /* CTI */
108 srlx %o4, 48, %o5 /* IEU0 */
109
110 andcc %o5, 0xff, %g0 /* IEU1 Group */
111 be,pn %icc, 4f /* CTI */
112 srlx %o4, 40, %o5 /* IEU0 */
113 andcc %o5, 0xff, %g0 /* IEU1 Group */
114
115 be,pn %icc, 4f /* CTI */
116 srlx %o4, 32, %o5 /* IEU0 */
117 andcc %o5, 0xff, %g0 /* IEU1 Group */
118 be,pn %icc, 4f /* CTI */
119
1203: srlx %o4, 24, %o5 /* IEU0 */
121 andcc %o5, 0xff, %g0 /* IEU1 Group */
122 be,pn %icc, 4f /* CTI */
123 srlx %o4, 16, %o5 /* IEU0 */
124
125 andcc %o5, 0xff, %g0 /* IEU1 Group */
126 be,pn %icc, 4f /* CTI */
127 srlx %o4, 8, %o5 /* IEU0 */
128 andcc %o5, 0xff, %g0 /* IEU1 Group */
129
130 be,pn %icc, 4f /* CTI */
131 andcc %o4, 0xff, %g0 /* IEU1 Group */
132 bne,a,pn %icc, 2b /* CTI */
133 ldxa [%o1] ASI_PNF, %o3 /* Load */
134
1354: retl /* CTI+IEU1 Group */
136 clr %o0 /* IEU0 */
137
138 .align 16
1395: srlx %g4, 56, %o4 /* IEU0 Group */
140 cmp %o2, -8 /* IEU1 */
141 be,pn %XCC, 4b /* CTI */
142 srlx %o3, 56, %o5 /* IEU0 Group */
9c84384c 143
ae6b8730
RH
144 andcc %o4, 0xff, %g0 /* IEU1 */
145 be,pn %xcc, 8f /* CTI */
146 subcc %o4, %o5, %o4 /* IEU1 Group */
147 bne,pn %xcc, 8f /* CTI */
148
149 srlx %o3, 48, %o5 /* IEU0 */
150 cmp %o2, -7 /* IEU1 Group */
151 be,pn %XCC, 4b /* CTI */
152 srlx %g4, 48, %o4 /* IEU0 */
153
154 andcc %o4, 0xff, %g0 /* IEU1 Group */
155 be,pn %xcc, 8f /* CTI */
156 subcc %o4, %o5, %o4 /* IEU1 Group */
157 bne,pn %xcc, 8f /* CTI */
158
159 srlx %o3, 40, %o5 /* IEU0 */
160 cmp %o2, -6 /* IEU1 Group */
161 be,pn %XCC, 4b /* CTI */
162 srlx %g4, 40, %o4 /* IEU0 */
163
164 andcc %o4, 0xff, %g0 /* IEU1 Group */
165 be,pn %xcc, 8f /* CTI */
166 subcc %o4, %o5, %o4 /* IEU1 Group */
167 bne,pn %xcc, 8f /* CTI */
168
169 srlx %o3, 32, %o5 /* IEU0 */
170 cmp %o2, -5 /* IEU1 Group */
171 be,pn %XCC, 4b /* CTI */
172 srlx %g4, 32, %o4 /* IEU0 */
173
174 andcc %o4, 0xff, %g0 /* IEU1 Group */
175 be,pn %xcc, 8f /* CTI */
176 subcc %o4, %o5, %o4 /* IEU1 Group */
177 bne,pn %xcc, 8f /* CTI */
178
179 srlx %o3, 24, %o5 /* IEU0 */
180 cmp %o2, -4 /* IEU1 Group */
181 be,pn %XCC, 4b /* CTI */
182 srlx %g4, 24, %o4 /* IEU0 */
183
184 andcc %o4, 0xff, %g0 /* IEU1 Group */
185 be,pn %xcc, 8f /* CTI */
186 subcc %o4, %o5, %o4 /* IEU1 Group */
187 bne,pn %xcc, 8f /* CTI */
188
189 srlx %o3, 16, %o5 /* IEU0 */
190 cmp %o2, -3 /* IEU1 Group */
191 be,pn %XCC, 4b /* CTI */
192 srlx %g4, 16, %o4 /* IEU0 */
193
194 andcc %o4, 0xff, %g0 /* IEU1 Group */
195 be,pn %xcc, 8f /* CTI */
196 subcc %o4, %o5, %o4 /* IEU1 Group */
197 bne,pn %xcc, 8f /* CTI */
198
199 srlx %o3, 8, %o5 /* IEU0 */
200 cmp %o2, -2 /* IEU1 Group */
201 be,pn %XCC, 4b /* CTI */
202 srlx %g4, 8, %o4 /* IEU0 */
203
204 retl /* CTI+IEU1 Group */
205 sub %o4, %o5, %o0 /* IEU0 */
2066: addcc %o3, %o4, %g4 /* IEU1 */
2077: srlx %o3, 56, %o5 /* IEU0 */
208
209 srlx %g4, 56, %o4 /* IEU0 Group */
210 andcc %o4, 0xff, %g0 /* IEU1 Group */
211 be,pn %xcc, 8f /* CTI */
212 subcc %o4, %o5, %o4 /* IEU1 Group */
213
214 bne,pn %xcc, 8f /* CTI */
215 srlx %o3, 48, %o5 /* IEU0 */
216 srlx %g4, 48, %o4 /* IEU0 Group */
217 andcc %o4, 0xff, %g0 /* IEU1 Group */
218
219 be,pn %xcc, 8f /* CTI */
220 subcc %o4, %o5, %o4 /* IEU1 Group */
221 bne,pn %xcc, 8f /* CTI */
222 srlx %o3, 40, %o5 /* IEU0 */
223
224 srlx %g4, 40, %o4 /* IEU0 Group */
225 andcc %o4, 0xff, %g0 /* IEU1 Group */
226 be,pn %xcc, 8f /* CTI */
227 subcc %o4, %o5, %o4 /* IEU1 Group */
228
229 bne,pn %xcc, 8f /* CTI */
230 srlx %o3, 32, %o5 /* IEU0 */
231 srlx %g4, 32, %o4 /* IEU0 Group */
232 andcc %o4, 0xff, %g0 /* IEU1 Group */
233
234 be,pn %xcc, 8f /* CTI */
235 subcc %o4, %o5, %o4 /* IEU1 Group */
236 bne,pn %xcc, 8f /* CTI */
237 srlx %o3, 24, %o5 /* IEU0 */
238
239 srlx %g4, 24, %o4 /* IEU0 Group */
240 andcc %o4, 0xff, %g0 /* IEU1 Group */
241 be,pn %xcc, 8f /* CTI */
242 subcc %o4, %o5, %o4 /* IEU1 Group */
243
244 bne,pn %xcc, 8f /* CTI */
245 srlx %o3, 16, %o5 /* IEU0 */
246 srlx %g4, 16, %o4 /* IEU0 Group */
247 andcc %o4, 0xff, %g0 /* IEU1 Group */
248
249 be,pn %xcc, 8f /* CTI */
250 subcc %o4, %o5, %o4 /* IEU1 Group */
251 bne,pn %xcc, 8f /* CTI */
252 srlx %o3, 8, %o5 /* IEU0 */
253
254 srlx %g4, 8, %o4 /* IEU0 Group */
255 andcc %o4, 0xff, %g0 /* IEU1 Group */
256 be,pn %xcc, 8f /* CTI */
257 subcc %o4, %o5, %o4 /* IEU1 Group */
258
259 retl /* CTI+IEU1 Group */
260 sub %g4, %o3, %o0 /* IEU0 */
2618: retl /* CTI+IEU1 Group */
262 mov %o4, %o0 /* IEU0 */
263
2649: ldub [%o0], %g4 /* Load Group */
265 add %o0, 1, %o0 /* IEU0 */
266 ldub [%o1], %o3 /* Load Group */
267 sllx %g1, 32, %g2 /* IEU0 */
268
26910: subcc %o2, 1, %o2 /* IEU1 Group */
270 be,pn %XCC, 8b /* CTI */
271 sub %g4, %o3, %o4 /* IEU0 */
272 add %o1, 1, %o1 /* IEU0 Group */
273
274 cmp %g4, %o3 /* IEU1 */
275 bne,pn %xcc, 8b /* CTI */
276 lduba [%o0] ASI_PNF, %g4 /* Load Group */
277 andcc %o3, 0xff, %g0 /* IEU1 */
278
279 be,pn %icc, 4b /* CTI */
280 lduba [%o1] ASI_PNF, %o3 /* Load Group */
281 andcc %o0, 7, %g0 /* IEU1 */
282 bne,a,pn %icc, 10b /* CTI */
283
284 add %o0, 1, %o0 /* IEU0 Group */
285 or %g1, %g2, %g1 /* IEU1 */
286 andcc %o1, 7, %g3 /* IEU1 Group */
287 be,pn %icc, 1b /* CTI */
288
289 ldxa [%o0] ASI_PNF, %g4 /* Load */
29011: sllx %g3, 3, %g5 /* IEU0 Group */
62f29da7 291 mov 64, %g6 /* IEU1 */
cf299341
UD
292 or %g1, %g2, %g1 /* IEU0 Group */
293 sub %o1, %g3, %o1 /* IEU1 */
ae6b8730 294
62f29da7 295 sub %g6, %g5, %g6 /* IEU0 Group */
ae6b8730 296 ldxa [%o1] ASI_PNF, %o4 /* Load */
cf299341
UD
297 sllx %g1, 7, %g2 /* IEU1 */
298 add %o1, 8, %o1 /* IEU0 Group */
ae6b8730 299 /* %g1 = 0101010101010101
cf299341 300 %g2 = 8080808080808080
ae6b8730
RH
301 %g3 = %o1 alignment
302 %g5 = number of bits to shift left
62f29da7 303 %g6 = number of bits to shift right */
ae6b8730
RH
304
30512: sllx %o4, %g5, %o3 /* IEU0 Group */
306 ldxa [%o1] ASI_PNF, %o4 /* Load */
307 add %o1, 8, %o1 /* IEU1 */
30813: ldxa [%o0] ASI_PNF, %g4 /* Load Group */
309
310 addcc %o0, 8, %o0 /* IEU1 */
62f29da7 311 srlx %o4, %g6, %o5 /* IEU0 */
ae6b8730 312 subcc %o2, 8, %o2 /* IEU1 Group */
aa4980fc 313 bcs,pn %XCC, 5b /* CTI */
ae6b8730
RH
314
315 or %o3, %o5, %o3 /* IEU0 */
316 cmp %g4, %o3 /* IEU1 Group */
317 bne,pn %xcc, 7b /* CTI */
318 sub %g4, %g1, %o5 /* IEU0 */
319
320#ifdef EIGHTBIT_NOT_RARE
321 andn %o5, %g4, %o5 /* IEU0 Group */
322#endif
323 andcc %o5, %g2, %g0 /* IEU1 Group */
324 be,pt %xcc, 12b /* CTI */
325 srlx %o5, 32, %o5 /* IEU0 */
326 andcc %o5, %g2, %g0 /* IEU1 Group */
327
328 be,pt %xcc, 14f /* CTI */
329 srlx %g4, 56, %o5 /* IEU0 */
330 andcc %o5, 0xff, %g0 /* IEU1 Group */
331 be,pn %icc, 4b /* CTI */
332
333 srlx %g4, 48, %o5 /* IEU0 */
334 andcc %o5, 0xff, %g0 /* IEU1 Group */
335 be,pn %icc, 4b /* CTI */
336 srlx %g4, 40, %o5 /* IEU0 */
337
338 andcc %o5, 0xff, %g0 /* IEU1 Group */
339 be,pn %icc, 4b /* CTI */
340 srlx %g4, 32, %o5 /* IEU0 */
341 andcc %o5, 0xff, %g0 /* IEU1 Group */
342
343 be,pn %icc, 4b /* CTI */
34414: srlx %g4, 24, %o5 /* IEU0 */
345 andcc %o5, 0xff, %g0 /* IEU1 Group */
346 be,pn %icc, 4b /* CTI */
347
348 srlx %g4, 16, %o5 /* IEU0 */
349 andcc %o5, 0xff, %g0 /* IEU1 Group */
350 be,pn %icc, 4b /* CTI */
351 srlx %g4, 8, %o5 /* IEU0 */
352
353 andcc %o5, 0xff, %g0 /* IEU1 Group */
354 be,pn %icc, 4b /* CTI */
355 andcc %g4, 0xff, %g0 /* IEU1 Group */
356 be,pn %icc, 4b /* CTI */
357
358 sllx %o4, %g5, %o3 /* IEU0 */
359 ldxa [%o1] ASI_PNF, %o4 /* Load Group */
360 ba,pt %xcc, 13b /* CTI */
361 add %o1, 8, %o1 /* IEU0 */
362END(strncmp)
85dd1003 363libc_hidden_builtin_def (strncmp)