]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/i386/i686/multiarch/strcmp-ssse3.S
Add SSE4.2 support for strcasecmp and strncasecmp on x86-32
[thirdparty/glibc.git] / sysdeps / i386 / i686 / multiarch / strcmp-ssse3.S
CommitLineData
904057bc 1/* strcmp with SSSE3
fe72eebd 2 Copyright (C) 2010, 2011 Free Software Foundation, Inc.
904057bc
L
3 Contributed by Intel Corporation.
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, write to the Free
18 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19 02111-1307 USA. */
20
21#ifndef NOT_IN_libc
22
23#include <sysdep.h>
24#include "asm-syntax.h"
25
26#define CFI_PUSH(REG) \
27 cfi_adjust_cfa_offset (4); \
28 cfi_rel_offset (REG, 0)
29
30#define CFI_POP(REG) \
31 cfi_adjust_cfa_offset (-4); \
32 cfi_restore (REG)
33
34#define PUSH(REG) pushl REG; CFI_PUSH (REG)
35#define POP(REG) popl REG; CFI_POP (REG)
36
76e3966e 37#ifdef USE_AS_STRNCMP
904057bc 38# ifndef STRCMP
76e3966e 39# define STRCMP __strncmp_ssse3
904057bc 40# endif
76e3966e 41# define STR1 8
904057bc 42# define STR2 STR1+4
76e3966e
UD
43# define CNT STR2+4
44# define RETURN POP (REM); ret; .p2align 4; CFI_PUSH (REM)
45# define UPDATE_STRNCMP_COUNTER \
46 /* calculate left number to compare */ \
47 mov $16, %esi; \
48 sub %ecx, %esi; \
49 cmp %esi, REM; \
50 jbe L(more8byteseq); \
51 sub %esi, REM
52# define FLAGS %ebx
53# define REM %ebp
54#elif defined USE_AS_STRCASECMP_L
55# include "locale-defines.h"
904057bc 56# ifndef STRCMP
76e3966e 57# define STRCMP __strcasecmp_l_ssse3
904057bc
L
58# endif
59# define STR1 8
60# define STR2 STR1+4
76e3966e
UD
61# define LOCALE 12 /* Loaded before the adjustement. */
62# ifdef PIC
63# define RETURN POP (%ebx); ret; .p2align 4; CFI_PUSH (%ebx)
64# else
65# define RETURN ret; .p2align 4
66# endif
67# define UPDATE_STRNCMP_COUNTER
68# define FLAGS (%esp)
69# define NONASCII __strcasecmp_nonascii
70#elif defined USE_AS_STRNCASECMP_L
71# include "locale-defines.h"
72# ifndef STRCMP
73# define STRCMP __strncasecmp_l_ssse3
74# endif
75# define STR1 12
76# define STR2 STR1+4
904057bc 77# define CNT STR2+4
76e3966e
UD
78# define LOCALE 16 /* Loaded before the adjustement. */
79# ifdef PIC
80# define RETURN POP (REM); POP (%ebx); ret; \
81 .p2align 4; CFI_PUSH (%ebx); CFI_PUSH (REM)
82# else
83# define RETURN POP (REM); ret; .p2align 4; CFI_PUSH (REM)
84# endif
904057bc
L
85# define UPDATE_STRNCMP_COUNTER \
86 /* calculate left number to compare */ \
87 mov $16, %esi; \
88 sub %ecx, %esi; \
76e3966e 89 cmp %esi, REM; \
904057bc 90 jbe L(more8byteseq); \
76e3966e
UD
91 sub %esi, REM
92# define FLAGS (%esp)
93# define REM %ebp
94# define NONASCII __strncasecmp_nonascii
95#else
96# ifndef STRCMP
97# define STRCMP __strcmp_ssse3
98# endif
99# define STR1 4
100# define STR2 STR1+4
101# define RETURN ret; .p2align 4
102# define UPDATE_STRNCMP_COUNTER
103# define FLAGS %ebx
904057bc
L
104#endif
105
106 .section .text.ssse3,"ax",@progbits
76e3966e
UD
107
108#ifdef USE_AS_STRCASECMP_L
109ENTRY (__strcasecmp_ssse3)
110# ifdef PIC
111 PUSH (%ebx)
112 call __i686.get_pc_thunk.bx
113 addl $_GLOBAL_OFFSET_TABLE_, %ebx
114 movl __libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
115# else
116 movl __libc_tsd_LOCALE@NTPOFF, %eax
117# endif
118 movl %gs:(%eax), %eax
119# if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
120 movl LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
121# else
122 movl (%eax), %eax
123# endif
124 testl $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
125 jne __strcasecmp_nonascii
6abf3465 126 jmp L(ascii)
76e3966e
UD
127END (__strcasecmp_ssse3)
128#endif
129
130#ifdef USE_AS_STRNCASECMP_L
131ENTRY (__strncasecmp_ssse3)
132# ifdef PIC
133 PUSH (%ebx)
134 call __i686.get_pc_thunk.bx
135 addl $_GLOBAL_OFFSET_TABLE_, %ebx
136 movl __libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
137# else
138 movl __libc_tsd_LOCALE@NTPOFF, %eax
139# endif
140 movl %gs:(%eax), %eax
141# if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
142 movl LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
143# else
144 movl (%eax), %eax
145# endif
146 testl $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
147 jne __strncasecmp_nonascii
6abf3465 148 jmp L(ascii)
76e3966e
UD
149END (__strncasecmp_ssse3)
150#endif
151
904057bc 152ENTRY (STRCMP)
76e3966e
UD
153#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
154 movl LOCALE(%esp), %eax
155# if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
156 movl LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
157# else
158 movl (%eax), %eax
159# endif
160 testl $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
161 jne NONASCII
162
163# ifdef PIC
164 PUSH (%ebx)
165 call __i686.get_pc_thunk.bx
166 addl $_GLOBAL_OFFSET_TABLE_, %ebx
167# endif
6abf3465 168L(ascii):
76e3966e
UD
169 .section .rodata.cst16,"aM",@progbits,16
170 .align 16
171.Lbelowupper:
172 .quad 0x4040404040404040
173 .quad 0x4040404040404040
174.Ltopupper:
175 .quad 0x5b5b5b5b5b5b5b5b
176 .quad 0x5b5b5b5b5b5b5b5b
177.Ltouppermask:
178 .quad 0x2020202020202020
179 .quad 0x2020202020202020
180 .previous
181
182# ifdef PIC
183# define UCLOW_reg .Lbelowupper@GOTOFF(%ebx)
184# define UCHIGH_reg .Ltopupper@GOTOFF(%ebx)
185# define LCQWORD_reg .Ltouppermask@GOTOFF(%ebx)
186# else
187# define UCLOW_reg .Lbelowupper
188# define UCHIGH_reg .Ltopupper
189# define LCQWORD_reg .Ltouppermask
190# endif
904057bc 191#endif
76e3966e
UD
192
193#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
194 PUSH (REM)
195#endif
196
904057bc
L
197 movl STR1(%esp), %edx
198 movl STR2(%esp), %eax
76e3966e
UD
199#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
200 movl CNT(%esp), REM
201 cmp $16, REM
904057bc 202 jb L(less16bytes_sncmp)
76e3966e 203#elif !defined USE_AS_STRCASECMP_L
904057bc
L
204 movzbl (%eax), %ecx
205 cmpb %cl, (%edx)
206 jne L(neq)
207 cmpl $0, %ecx
208 je L(eq)
209
210 movzbl 1(%eax), %ecx
211 cmpb %cl, 1(%edx)
212 jne L(neq)
213 cmpl $0, %ecx
214 je L(eq)
215
216 movzbl 2(%eax), %ecx
217 cmpb %cl, 2(%edx)
218 jne L(neq)
219 cmpl $0, %ecx
220 je L(eq)
221
222 movzbl 3(%eax), %ecx
223 cmpb %cl, 3(%edx)
224 jne L(neq)
225 cmpl $0, %ecx
226 je L(eq)
227
228 movzbl 4(%eax), %ecx
229 cmpb %cl, 4(%edx)
230 jne L(neq)
231 cmpl $0, %ecx
232 je L(eq)
233
234 movzbl 5(%eax), %ecx
235 cmpb %cl, 5(%edx)
236 jne L(neq)
237 cmpl $0, %ecx
238 je L(eq)
239
240 movzbl 6(%eax), %ecx
241 cmpb %cl, 6(%edx)
242 jne L(neq)
243 cmpl $0, %ecx
244 je L(eq)
245
246 movzbl 7(%eax), %ecx
247 cmpb %cl, 7(%edx)
248 jne L(neq)
249 cmpl $0, %ecx
250 je L(eq)
251
252 add $8, %edx
253 add $8, %eax
904057bc
L
254#endif
255 movl %edx, %ecx
256 and $0xfff, %ecx
257 cmp $0xff0, %ecx
258 ja L(crosspage)
259 mov %eax, %ecx
260 and $0xfff, %ecx
261 cmp $0xff0, %ecx
262 ja L(crosspage)
263 pxor %xmm0, %xmm0
264 movlpd (%eax), %xmm1
265 movlpd (%edx), %xmm2
266 movhpd 8(%eax), %xmm1
267 movhpd 8(%edx), %xmm2
76e3966e
UD
268#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
269# define TOLOWER(reg1, reg2) \
270 movdqa reg1, %xmm5; \
271 movdqa reg2, %xmm7; \
272 movdqa UCHIGH_reg, %xmm6; \
273 pcmpgtb UCLOW_reg, %xmm5; \
274 pcmpgtb UCLOW_reg, %xmm7; \
275 pcmpgtb reg1, %xmm6; \
276 pand %xmm6, %xmm5; \
277 movdqa UCHIGH_reg, %xmm6; \
278 pcmpgtb reg2, %xmm6; \
279 pand %xmm6, %xmm7; \
280 pand LCQWORD_reg, %xmm5; \
281 por %xmm5, reg1; \
282 pand LCQWORD_reg, %xmm7; \
283 por %xmm7, reg2
284 TOLOWER (%xmm1, %xmm2)
285#else
286# define TOLOWER(reg1, reg2)
287#endif
904057bc
L
288 pcmpeqb %xmm1, %xmm0
289 pcmpeqb %xmm2, %xmm1
290 psubb %xmm0, %xmm1
291 pmovmskb %xmm1, %ecx
292 sub $0xffff, %ecx
293 jnz L(less16bytes)
76e3966e
UD
294#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
295 cmp $16, REM
296 lea -16(REM), REM
904057bc
L
297 jbe L(eq)
298#endif
299 add $16, %eax
300 add $16, %edx
301
302L(crosspage):
303
76e3966e
UD
304#if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
305 PUSH (FLAGS)
306#endif
904057bc
L
307 PUSH (%edi)
308 PUSH (%esi)
76e3966e
UD
309#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
310 pushl $0
311 cfi_adjust_cfa_offset (4)
312#endif
313#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
6bb74d9f
UD
314 cfi_remember_state
315#endif
904057bc
L
316
317 movl %edx, %edi
318 movl %eax, %ecx
319 and $0xf, %ecx
320 and $0xf, %edi
321 xor %ecx, %eax
322 xor %edi, %edx
76e3966e
UD
323#if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
324 xor FLAGS, FLAGS
325#endif
904057bc
L
326 cmp %edi, %ecx
327 je L(ashr_0)
328 ja L(bigger)
76e3966e 329 orl $0x20, FLAGS
904057bc
L
330 xchg %edx, %eax
331 xchg %ecx, %edi
332L(bigger):
333 lea 15(%edi), %edi
334 sub %ecx, %edi
335 cmp $8, %edi
336 jle L(ashr_less_8)
337 cmp $14, %edi
338 je L(ashr_15)
339 cmp $13, %edi
340 je L(ashr_14)
341 cmp $12, %edi
342 je L(ashr_13)
343 cmp $11, %edi
344 je L(ashr_12)
345 cmp $10, %edi
346 je L(ashr_11)
347 cmp $9, %edi
348 je L(ashr_10)
349L(ashr_less_8):
350 je L(ashr_9)
351 cmp $7, %edi
352 je L(ashr_8)
353 cmp $6, %edi
354 je L(ashr_7)
355 cmp $5, %edi
356 je L(ashr_6)
357 cmp $4, %edi
358 je L(ashr_5)
359 cmp $3, %edi
360 je L(ashr_4)
361 cmp $2, %edi
362 je L(ashr_3)
363 cmp $1, %edi
364 je L(ashr_2)
365 cmp $0, %edi
366 je L(ashr_1)
367
368/*
369 * The following cases will be handled by ashr_0
370 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
371 * n(0~15) n(0~15) 15(15+ n-n) ashr_0
372 */
373 .p2align 4
374L(ashr_0):
375 mov $0xffff, %esi
376 movdqa (%eax), %xmm1
377 pxor %xmm0, %xmm0
378 pcmpeqb %xmm1, %xmm0
76e3966e
UD
379#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
380 movdqa (%edx), %xmm2
381 TOLOWER (%xmm1, %xmm2)
382 pcmpeqb %xmm2, %xmm1
383#else
904057bc 384 pcmpeqb (%edx), %xmm1
76e3966e 385#endif
904057bc
L
386 psubb %xmm0, %xmm1
387 pmovmskb %xmm1, %edi
388 shr %cl, %esi
389 shr %cl, %edi
390 sub %edi, %esi
391 mov %ecx, %edi
392 jne L(less32bytes)
393 UPDATE_STRNCMP_COUNTER
76e3966e 394 movl $0x10, FLAGS
904057bc
L
395 mov $0x10, %ecx
396 pxor %xmm0, %xmm0
397 .p2align 4
398L(loop_ashr_0):
399 movdqa (%eax, %ecx), %xmm1
76e3966e 400#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
904057bc 401 movdqa (%edx, %ecx), %xmm2
76e3966e 402 TOLOWER (%xmm1, %xmm2)
904057bc
L
403
404 pcmpeqb %xmm1, %xmm0
405 pcmpeqb %xmm2, %xmm1
76e3966e
UD
406#else
407 pcmpeqb %xmm1, %xmm0
408 pcmpeqb (%edx, %ecx), %xmm1
409#endif
904057bc
L
410 psubb %xmm0, %xmm1
411 pmovmskb %xmm1, %esi
412 sub $0xffff, %esi
413 jnz L(exit)
76e3966e
UD
414#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
415 cmp $16, REM
416 lea -16(REM), REM
904057bc
L
417 jbe L(more8byteseq)
418#endif
419 add $16, %ecx
420 jmp L(loop_ashr_0)
421
422/*
423 * The following cases will be handled by ashr_1
6bb74d9f 424 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
904057bc
L
425 * n(15) n -15 0(15 +(n-15) - n) ashr_1
426 */
427 .p2align 4
428L(ashr_1):
429 mov $0xffff, %esi
430 pxor %xmm0, %xmm0
431 movdqa (%edx), %xmm2
432 movdqa (%eax), %xmm1
433 pcmpeqb %xmm1, %xmm0
434 pslldq $15, %xmm2
76e3966e 435 TOLOWER (%xmm1, %xmm2)
904057bc
L
436 pcmpeqb %xmm1, %xmm2
437 psubb %xmm0, %xmm2
438 pmovmskb %xmm2, %edi
439 shr %cl, %esi
440 shr %cl, %edi
441 sub %edi, %esi
442 lea -15(%ecx), %edi
443 jnz L(less32bytes)
444
445 UPDATE_STRNCMP_COUNTER
446
447 movdqa (%edx), %xmm3
448 pxor %xmm0, %xmm0
449 mov $16, %ecx
76e3966e 450 orl $1, FLAGS
904057bc
L
451 lea 1(%edx), %edi
452 and $0xfff, %edi
453 sub $0x1000, %edi
454
455 .p2align 4
456L(loop_ashr_1):
457 add $16, %edi
458 jg L(nibble_ashr_1)
459
460L(gobble_ashr_1):
461 movdqa (%eax, %ecx), %xmm1
462 movdqa (%edx, %ecx), %xmm2
463 movdqa %xmm2, %xmm4
464
465 palignr $1, %xmm3, %xmm2
76e3966e 466 TOLOWER (%xmm1, %xmm2)
904057bc
L
467
468 pcmpeqb %xmm1, %xmm0
469 pcmpeqb %xmm2, %xmm1
470 psubb %xmm0, %xmm1
471 pmovmskb %xmm1, %esi
472 sub $0xffff, %esi
473 jnz L(exit)
76e3966e
UD
474#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
475 cmp $16, REM
476 lea -16(REM), REM
904057bc
L
477 jbe L(more8byteseq)
478#endif
479
480 add $16, %ecx
481 movdqa %xmm4, %xmm3
482
483 add $16, %edi
484 jg L(nibble_ashr_1)
485
486 movdqa (%eax, %ecx), %xmm1
487 movdqa (%edx, %ecx), %xmm2
488 movdqa %xmm2, %xmm4
489
490 palignr $1, %xmm3, %xmm2
76e3966e 491 TOLOWER (%xmm1, %xmm2)
904057bc
L
492
493 pcmpeqb %xmm1, %xmm0
494 pcmpeqb %xmm2, %xmm1
495 psubb %xmm0, %xmm1
496 pmovmskb %xmm1, %esi
497 sub $0xffff, %esi
498 jnz L(exit)
499
76e3966e
UD
500#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
501 cmp $16, REM
502 lea -16(REM), REM
904057bc
L
503 jbe L(more8byteseq)
504#endif
505 add $16, %ecx
506 movdqa %xmm4, %xmm3
507 jmp L(loop_ashr_1)
508
509 .p2align 4
510L(nibble_ashr_1):
511 pcmpeqb %xmm3, %xmm0
512 pmovmskb %xmm0, %esi
513 test $0xfffe, %esi
514 jnz L(ashr_1_exittail)
515
76e3966e
UD
516#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
517 cmp $15, REM
904057bc
L
518 jbe L(ashr_1_exittail)
519#endif
520 pxor %xmm0, %xmm0
521 sub $0x1000, %edi
522 jmp L(gobble_ashr_1)
523
524 .p2align 4
525L(ashr_1_exittail):
526 movdqa (%eax, %ecx), %xmm1
527 psrldq $1, %xmm0
528 psrldq $1, %xmm3
529 jmp L(aftertail)
530
531/*
532 * The following cases will be handled by ashr_2
6bb74d9f 533 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
904057bc
L
534 * n(14~15) n -14 1(15 +(n-14) - n) ashr_2
535 */
536 .p2align 4
537L(ashr_2):
538 mov $0xffff, %esi
539 pxor %xmm0, %xmm0
540 movdqa (%edx), %xmm2
541 movdqa (%eax), %xmm1
542 pcmpeqb %xmm1, %xmm0
543 pslldq $14, %xmm2
76e3966e 544 TOLOWER (%xmm1, %xmm2)
904057bc
L
545 pcmpeqb %xmm1, %xmm2
546 psubb %xmm0, %xmm2
547 pmovmskb %xmm2, %edi
548 shr %cl, %esi
549 shr %cl, %edi
550 sub %edi, %esi
551 lea -14(%ecx), %edi
552 jnz L(less32bytes)
553
554 UPDATE_STRNCMP_COUNTER
555
556 movdqa (%edx), %xmm3
557 pxor %xmm0, %xmm0
558 mov $16, %ecx
76e3966e 559 orl $2, FLAGS
904057bc
L
560 lea 2(%edx), %edi
561 and $0xfff, %edi
562 sub $0x1000, %edi
563
564 .p2align 4
565L(loop_ashr_2):
566 add $16, %edi
567 jg L(nibble_ashr_2)
568
569L(gobble_ashr_2):
570 movdqa (%eax, %ecx), %xmm1
571 movdqa (%edx, %ecx), %xmm2
572 movdqa %xmm2, %xmm4
573
574 palignr $2, %xmm3, %xmm2
76e3966e 575 TOLOWER (%xmm1, %xmm2)
904057bc
L
576
577 pcmpeqb %xmm1, %xmm0
578 pcmpeqb %xmm2, %xmm1
579 psubb %xmm0, %xmm1
580 pmovmskb %xmm1, %esi
581 sub $0xffff, %esi
582 jnz L(exit)
583
76e3966e
UD
584#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
585 cmp $16, REM
586 lea -16(REM), REM
904057bc
L
587 jbe L(more8byteseq)
588#endif
589 add $16, %ecx
590 movdqa %xmm4, %xmm3
591
592 add $16, %edi
593 jg L(nibble_ashr_2)
594
595 movdqa (%eax, %ecx), %xmm1
596 movdqa (%edx, %ecx), %xmm2
597 movdqa %xmm2, %xmm4
598
599 palignr $2, %xmm3, %xmm2
76e3966e 600 TOLOWER (%xmm1, %xmm2)
904057bc
L
601
602 pcmpeqb %xmm1, %xmm0
603 pcmpeqb %xmm2, %xmm1
604 psubb %xmm0, %xmm1
605 pmovmskb %xmm1, %esi
606 sub $0xffff, %esi
607 jnz L(exit)
608
76e3966e
UD
609#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
610 cmp $16, REM
611 lea -16(REM), REM
904057bc
L
612 jbe L(more8byteseq)
613#endif
614 add $16, %ecx
615 movdqa %xmm4, %xmm3
616 jmp L(loop_ashr_2)
617
618 .p2align 4
619L(nibble_ashr_2):
620 pcmpeqb %xmm3, %xmm0
621 pmovmskb %xmm0, %esi
622 test $0xfffc, %esi
623 jnz L(ashr_2_exittail)
624
76e3966e
UD
625#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
626 cmp $14, REM
904057bc
L
627 jbe L(ashr_2_exittail)
628#endif
629
630 pxor %xmm0, %xmm0
631 sub $0x1000, %edi
632 jmp L(gobble_ashr_2)
633
634 .p2align 4
635L(ashr_2_exittail):
636 movdqa (%eax, %ecx), %xmm1
637 psrldq $2, %xmm0
638 psrldq $2, %xmm3
639 jmp L(aftertail)
640
641/*
642 * The following cases will be handled by ashr_3
6bb74d9f 643 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
904057bc
L
644 * n(13~15) n -13 2(15 +(n-13) - n) ashr_3
645 */
646 .p2align 4
647L(ashr_3):
648 mov $0xffff, %esi
649 pxor %xmm0, %xmm0
650 movdqa (%edx), %xmm2
651 movdqa (%eax), %xmm1
652 pcmpeqb %xmm1, %xmm0
653 pslldq $13, %xmm2
76e3966e 654 TOLOWER (%xmm1, %xmm2)
904057bc
L
655 pcmpeqb %xmm1, %xmm2
656 psubb %xmm0, %xmm2
657 pmovmskb %xmm2, %edi
658 shr %cl, %esi
659 shr %cl, %edi
660 sub %edi, %esi
661 lea -13(%ecx), %edi
662 jnz L(less32bytes)
663
664 UPDATE_STRNCMP_COUNTER
665
666 movdqa (%edx), %xmm3
667 pxor %xmm0, %xmm0
668 mov $16, %ecx
76e3966e 669 orl $3, FLAGS
904057bc
L
670 lea 3(%edx), %edi
671 and $0xfff, %edi
672 sub $0x1000, %edi
673
674 .p2align 4
675L(loop_ashr_3):
676 add $16, %edi
677 jg L(nibble_ashr_3)
678
679L(gobble_ashr_3):
680 movdqa (%eax, %ecx), %xmm1
681 movdqa (%edx, %ecx), %xmm2
682 movdqa %xmm2, %xmm4
683
684 palignr $3, %xmm3, %xmm2
76e3966e 685 TOLOWER (%xmm1, %xmm2)
904057bc
L
686
687 pcmpeqb %xmm1, %xmm0
688 pcmpeqb %xmm2, %xmm1
689 psubb %xmm0, %xmm1
690 pmovmskb %xmm1, %esi
691 sub $0xffff, %esi
692 jnz L(exit)
693
76e3966e
UD
694#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
695 cmp $16, REM
696 lea -16(REM), REM
904057bc
L
697 jbe L(more8byteseq)
698#endif
699 add $16, %ecx
700 movdqa %xmm4, %xmm3
701
702 add $16, %edi
703 jg L(nibble_ashr_3)
704
705 movdqa (%eax, %ecx), %xmm1
706 movdqa (%edx, %ecx), %xmm2
707 movdqa %xmm2, %xmm4
708
709 palignr $3, %xmm3, %xmm2
76e3966e 710 TOLOWER (%xmm1, %xmm2)
904057bc
L
711
712 pcmpeqb %xmm1, %xmm0
713 pcmpeqb %xmm2, %xmm1
714 psubb %xmm0, %xmm1
715 pmovmskb %xmm1, %esi
716 sub $0xffff, %esi
717 jnz L(exit)
718
76e3966e
UD
719#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
720 cmp $16, REM
721 lea -16(REM), REM
904057bc
L
722 jbe L(more8byteseq)
723#endif
724 add $16, %ecx
725 movdqa %xmm4, %xmm3
726 jmp L(loop_ashr_3)
727
728 .p2align 4
729L(nibble_ashr_3):
730 pcmpeqb %xmm3, %xmm0
731 pmovmskb %xmm0, %esi
732 test $0xfff8, %esi
733 jnz L(ashr_3_exittail)
734
76e3966e
UD
735#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
736 cmp $13, REM
904057bc
L
737 jbe L(ashr_3_exittail)
738#endif
739 pxor %xmm0, %xmm0
740 sub $0x1000, %edi
741 jmp L(gobble_ashr_3)
742
743 .p2align 4
744L(ashr_3_exittail):
745 movdqa (%eax, %ecx), %xmm1
746 psrldq $3, %xmm0
747 psrldq $3, %xmm3
748 jmp L(aftertail)
749
750/*
751 * The following cases will be handled by ashr_4
6bb74d9f 752 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
904057bc
L
753 * n(12~15) n -12 3(15 +(n-12) - n) ashr_4
754 */
755 .p2align 4
756L(ashr_4):
757 mov $0xffff, %esi
758 pxor %xmm0, %xmm0
759 movdqa (%edx), %xmm2
760 movdqa (%eax), %xmm1
761 pcmpeqb %xmm1, %xmm0
762 pslldq $12, %xmm2
76e3966e 763 TOLOWER (%xmm1, %xmm2)
904057bc
L
764 pcmpeqb %xmm1, %xmm2
765 psubb %xmm0, %xmm2
766 pmovmskb %xmm2, %edi
767 shr %cl, %esi
768 shr %cl, %edi
769 sub %edi, %esi
770 lea -12(%ecx), %edi
771 jnz L(less32bytes)
772
773 UPDATE_STRNCMP_COUNTER
774
775 movdqa (%edx), %xmm3
776 pxor %xmm0, %xmm0
777 mov $16, %ecx
76e3966e 778 orl $4, FLAGS
904057bc
L
779 lea 4(%edx), %edi
780 and $0xfff, %edi
781 sub $0x1000, %edi
782
783 .p2align 4
784L(loop_ashr_4):
785 add $16, %edi
786 jg L(nibble_ashr_4)
787
788L(gobble_ashr_4):
789 movdqa (%eax, %ecx), %xmm1
790 movdqa (%edx, %ecx), %xmm2
791 movdqa %xmm2, %xmm4
792
793 palignr $4, %xmm3, %xmm2
76e3966e 794 TOLOWER (%xmm1, %xmm2)
904057bc
L
795
796 pcmpeqb %xmm1, %xmm0
797 pcmpeqb %xmm2, %xmm1
798 psubb %xmm0, %xmm1
799 pmovmskb %xmm1, %esi
800 sub $0xffff, %esi
801 jnz L(exit)
802
76e3966e
UD
803#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
804 cmp $16, REM
805 lea -16(REM), REM
904057bc
L
806 jbe L(more8byteseq)
807#endif
808
809 add $16, %ecx
810 movdqa %xmm4, %xmm3
811
812 add $16, %edi
813 jg L(nibble_ashr_4)
814
815 movdqa (%eax, %ecx), %xmm1
816 movdqa (%edx, %ecx), %xmm2
817 movdqa %xmm2, %xmm4
818
819 palignr $4, %xmm3, %xmm2
76e3966e 820 TOLOWER (%xmm1, %xmm2)
904057bc
L
821
822 pcmpeqb %xmm1, %xmm0
823 pcmpeqb %xmm2, %xmm1
824 psubb %xmm0, %xmm1
825 pmovmskb %xmm1, %esi
826 sub $0xffff, %esi
827 jnz L(exit)
828
76e3966e
UD
829#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
830 cmp $16, REM
831 lea -16(REM), REM
904057bc
L
832 jbe L(more8byteseq)
833#endif
834
835 add $16, %ecx
836 movdqa %xmm4, %xmm3
837 jmp L(loop_ashr_4)
838
839 .p2align 4
840L(nibble_ashr_4):
841 pcmpeqb %xmm3, %xmm0
842 pmovmskb %xmm0, %esi
843 test $0xfff0, %esi
844 jnz L(ashr_4_exittail)
845
76e3966e
UD
846#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
847 cmp $12, REM
904057bc
L
848 jbe L(ashr_4_exittail)
849#endif
850
851 pxor %xmm0, %xmm0
852 sub $0x1000, %edi
853 jmp L(gobble_ashr_4)
854
855 .p2align 4
856L(ashr_4_exittail):
857 movdqa (%eax, %ecx), %xmm1
858 psrldq $4, %xmm0
859 psrldq $4, %xmm3
860 jmp L(aftertail)
861
862/*
863 * The following cases will be handled by ashr_5
6bb74d9f 864 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
904057bc
L
865 * n(11~15) n -11 4(15 +(n-11) - n) ashr_5
866 */
867 .p2align 4
868L(ashr_5):
869 mov $0xffff, %esi
870 pxor %xmm0, %xmm0
871 movdqa (%edx), %xmm2
872 movdqa (%eax), %xmm1
873 pcmpeqb %xmm1, %xmm0
874 pslldq $11, %xmm2
76e3966e 875 TOLOWER (%xmm1, %xmm2)
904057bc
L
876 pcmpeqb %xmm1, %xmm2
877 psubb %xmm0, %xmm2
878 pmovmskb %xmm2, %edi
879 shr %cl, %esi
880 shr %cl, %edi
881 sub %edi, %esi
882 lea -11(%ecx), %edi
883 jnz L(less32bytes)
884
885 UPDATE_STRNCMP_COUNTER
886
887 movdqa (%edx), %xmm3
888 pxor %xmm0, %xmm0
889 mov $16, %ecx
76e3966e 890 orl $5, FLAGS
904057bc
L
891 lea 5(%edx), %edi
892 and $0xfff, %edi
893 sub $0x1000, %edi
894
895 .p2align 4
896L(loop_ashr_5):
897 add $16, %edi
898 jg L(nibble_ashr_5)
899
900L(gobble_ashr_5):
901 movdqa (%eax, %ecx), %xmm1
902 movdqa (%edx, %ecx), %xmm2
903 movdqa %xmm2, %xmm4
904
905 palignr $5, %xmm3, %xmm2
76e3966e 906 TOLOWER (%xmm1, %xmm2)
904057bc
L
907
908 pcmpeqb %xmm1, %xmm0
909 pcmpeqb %xmm2, %xmm1
910 psubb %xmm0, %xmm1
911 pmovmskb %xmm1, %esi
912 sub $0xffff, %esi
913 jnz L(exit)
914
76e3966e
UD
915#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
916 cmp $16, REM
917 lea -16(REM), REM
904057bc
L
918 jbe L(more8byteseq)
919#endif
920 add $16, %ecx
921 movdqa %xmm4, %xmm3
922
923 add $16, %edi
924 jg L(nibble_ashr_5)
925
926 movdqa (%eax, %ecx), %xmm1
927 movdqa (%edx, %ecx), %xmm2
928 movdqa %xmm2, %xmm4
929
930 palignr $5, %xmm3, %xmm2
76e3966e 931 TOLOWER (%xmm1, %xmm2)
904057bc
L
932
933 pcmpeqb %xmm1, %xmm0
934 pcmpeqb %xmm2, %xmm1
935 psubb %xmm0, %xmm1
936 pmovmskb %xmm1, %esi
937 sub $0xffff, %esi
938 jnz L(exit)
939
76e3966e
UD
940#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
941 cmp $16, REM
942 lea -16(REM), REM
904057bc
L
943 jbe L(more8byteseq)
944#endif
945 add $16, %ecx
946 movdqa %xmm4, %xmm3
947 jmp L(loop_ashr_5)
948
949 .p2align 4
950L(nibble_ashr_5):
951 pcmpeqb %xmm3, %xmm0
952 pmovmskb %xmm0, %esi
953 test $0xffe0, %esi
954 jnz L(ashr_5_exittail)
955
76e3966e
UD
956#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
957 cmp $11, REM
904057bc
L
958 jbe L(ashr_5_exittail)
959#endif
960 pxor %xmm0, %xmm0
961 sub $0x1000, %edi
962 jmp L(gobble_ashr_5)
963
964 .p2align 4
965L(ashr_5_exittail):
966 movdqa (%eax, %ecx), %xmm1
967 psrldq $5, %xmm0
968 psrldq $5, %xmm3
969 jmp L(aftertail)
970
971/*
972 * The following cases will be handled by ashr_6
6bb74d9f 973 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
904057bc
L
974 * n(10~15) n -10 5(15 +(n-10) - n) ashr_6
975 */
976
977 .p2align 4
978L(ashr_6):
979 mov $0xffff, %esi
980 pxor %xmm0, %xmm0
981 movdqa (%edx), %xmm2
982 movdqa (%eax), %xmm1
983 pcmpeqb %xmm1, %xmm0
984 pslldq $10, %xmm2
76e3966e 985 TOLOWER (%xmm1, %xmm2)
904057bc
L
986 pcmpeqb %xmm1, %xmm2
987 psubb %xmm0, %xmm2
988 pmovmskb %xmm2, %edi
989 shr %cl, %esi
990 shr %cl, %edi
991 sub %edi, %esi
992 lea -10(%ecx), %edi
993 jnz L(less32bytes)
994
995 UPDATE_STRNCMP_COUNTER
996
997 movdqa (%edx), %xmm3
998 pxor %xmm0, %xmm0
999 mov $16, %ecx
76e3966e 1000 orl $6, FLAGS
904057bc
L
1001 lea 6(%edx), %edi
1002 and $0xfff, %edi
1003 sub $0x1000, %edi
1004
1005 .p2align 4
1006L(loop_ashr_6):
1007 add $16, %edi
1008 jg L(nibble_ashr_6)
1009
1010L(gobble_ashr_6):
1011 movdqa (%eax, %ecx), %xmm1
1012 movdqa (%edx, %ecx), %xmm2
1013 movdqa %xmm2, %xmm4
1014
1015 palignr $6, %xmm3, %xmm2
76e3966e 1016 TOLOWER (%xmm1, %xmm2)
904057bc
L
1017
1018 pcmpeqb %xmm1, %xmm0
1019 pcmpeqb %xmm2, %xmm1
1020 psubb %xmm0, %xmm1
1021 pmovmskb %xmm1, %esi
1022 sub $0xffff, %esi
1023 jnz L(exit)
1024
76e3966e
UD
1025#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1026 cmp $16, REM
1027 lea -16(REM), REM
904057bc
L
1028 jbe L(more8byteseq)
1029#endif
1030
1031 add $16, %ecx
1032 movdqa %xmm4, %xmm3
1033
1034 add $16, %edi
1035 jg L(nibble_ashr_6)
1036
1037 movdqa (%eax, %ecx), %xmm1
1038 movdqa (%edx, %ecx), %xmm2
1039 movdqa %xmm2, %xmm4
1040
1041 palignr $6, %xmm3, %xmm2
76e3966e 1042 TOLOWER (%xmm1, %xmm2)
904057bc
L
1043
1044 pcmpeqb %xmm1, %xmm0
1045 pcmpeqb %xmm2, %xmm1
1046 psubb %xmm0, %xmm1
1047 pmovmskb %xmm1, %esi
1048 sub $0xffff, %esi
1049 jnz L(exit)
76e3966e
UD
1050#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1051 cmp $16, REM
1052 lea -16(REM), REM
904057bc
L
1053 jbe L(more8byteseq)
1054#endif
1055
1056 add $16, %ecx
1057 movdqa %xmm4, %xmm3
1058 jmp L(loop_ashr_6)
1059
1060 .p2align 4
1061L(nibble_ashr_6):
1062 pcmpeqb %xmm3, %xmm0
1063 pmovmskb %xmm0, %esi
1064 test $0xffc0, %esi
1065 jnz L(ashr_6_exittail)
1066
76e3966e
UD
1067#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1068 cmp $10, REM
904057bc
L
1069 jbe L(ashr_6_exittail)
1070#endif
1071 pxor %xmm0, %xmm0
1072 sub $0x1000, %edi
1073 jmp L(gobble_ashr_6)
1074
1075 .p2align 4
1076L(ashr_6_exittail):
1077 movdqa (%eax, %ecx), %xmm1
1078 psrldq $6, %xmm0
1079 psrldq $6, %xmm3
1080 jmp L(aftertail)
1081
1082/*
1083 * The following cases will be handled by ashr_7
6bb74d9f 1084 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
904057bc
L
1085 * n(9~15) n - 9 6(15 +(n-9) - n) ashr_7
1086 */
1087
1088 .p2align 4
1089L(ashr_7):
1090 mov $0xffff, %esi
1091 pxor %xmm0, %xmm0
1092 movdqa (%edx), %xmm2
1093 movdqa (%eax), %xmm1
1094 pcmpeqb %xmm1, %xmm0
1095 pslldq $9, %xmm2
76e3966e 1096 TOLOWER (%xmm1, %xmm2)
904057bc
L
1097 pcmpeqb %xmm1, %xmm2
1098 psubb %xmm0, %xmm2
1099 pmovmskb %xmm2, %edi
1100 shr %cl, %esi
1101 shr %cl, %edi
1102 sub %edi, %esi
1103 lea -9(%ecx), %edi
1104 jnz L(less32bytes)
1105
1106 UPDATE_STRNCMP_COUNTER
1107
1108 movdqa (%edx), %xmm3
1109 pxor %xmm0, %xmm0
1110 mov $16, %ecx
76e3966e 1111 orl $7, FLAGS
904057bc
L
1112 lea 8(%edx), %edi
1113 and $0xfff, %edi
1114 sub $0x1000, %edi
1115
1116 .p2align 4
1117L(loop_ashr_7):
1118 add $16, %edi
1119 jg L(nibble_ashr_7)
1120
1121L(gobble_ashr_7):
1122 movdqa (%eax, %ecx), %xmm1
1123 movdqa (%edx, %ecx), %xmm2
1124 movdqa %xmm2, %xmm4
1125
1126 palignr $7, %xmm3, %xmm2
76e3966e 1127 TOLOWER (%xmm1, %xmm2)
904057bc
L
1128
1129 pcmpeqb %xmm1, %xmm0
1130 pcmpeqb %xmm2, %xmm1
1131 psubb %xmm0, %xmm1
1132 pmovmskb %xmm1, %esi
1133 sub $0xffff, %esi
1134 jnz L(exit)
1135
76e3966e
UD
1136#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1137 cmp $16, REM
1138 lea -16(REM), REM
904057bc
L
1139 jbe L(more8byteseq)
1140#endif
1141
1142 add $16, %ecx
1143 movdqa %xmm4, %xmm3
1144
1145 add $16, %edi
1146 jg L(nibble_ashr_7)
1147
1148 movdqa (%eax, %ecx), %xmm1
1149 movdqa (%edx, %ecx), %xmm2
1150 movdqa %xmm2, %xmm4
1151
1152 palignr $7, %xmm3, %xmm2
76e3966e 1153 TOLOWER (%xmm1, %xmm2)
904057bc
L
1154
1155 pcmpeqb %xmm1, %xmm0
1156 pcmpeqb %xmm2, %xmm1
1157 psubb %xmm0, %xmm1
1158 pmovmskb %xmm1, %esi
1159 sub $0xffff, %esi
1160 jnz L(exit)
1161
76e3966e
UD
1162#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1163 cmp $16, REM
1164 lea -16(REM), REM
904057bc
L
1165 jbe L(more8byteseq)
1166#endif
1167
1168 add $16, %ecx
1169 movdqa %xmm4, %xmm3
1170 jmp L(loop_ashr_7)
1171
1172 .p2align 4
1173L(nibble_ashr_7):
1174 pcmpeqb %xmm3, %xmm0
1175 pmovmskb %xmm0, %esi
1176 test $0xff80, %esi
1177 jnz L(ashr_7_exittail)
1178
76e3966e
UD
1179#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1180 cmp $9, REM
904057bc
L
1181 jbe L(ashr_7_exittail)
1182#endif
1183 pxor %xmm0, %xmm0
1184 pxor %xmm0, %xmm0
1185 sub $0x1000, %edi
1186 jmp L(gobble_ashr_7)
1187
1188 .p2align 4
1189L(ashr_7_exittail):
1190 movdqa (%eax, %ecx), %xmm1
1191 psrldq $7, %xmm0
1192 psrldq $7, %xmm3
1193 jmp L(aftertail)
1194
1195/*
1196 * The following cases will be handled by ashr_8
6bb74d9f 1197 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
904057bc
L
1198 * n(8~15) n - 8 7(15 +(n-8) - n) ashr_8
1199 */
1200 .p2align 4
1201L(ashr_8):
1202 mov $0xffff, %esi
1203 pxor %xmm0, %xmm0
1204 movdqa (%edx), %xmm2
1205 movdqa (%eax), %xmm1
1206 pcmpeqb %xmm1, %xmm0
1207 pslldq $8, %xmm2
76e3966e 1208 TOLOWER (%xmm1, %xmm2)
904057bc
L
1209 pcmpeqb %xmm1, %xmm2
1210 psubb %xmm0, %xmm2
1211 pmovmskb %xmm2, %edi
1212 shr %cl, %esi
1213 shr %cl, %edi
1214 sub %edi, %esi
1215 lea -8(%ecx), %edi
1216 jnz L(less32bytes)
1217
1218 UPDATE_STRNCMP_COUNTER
1219
1220 movdqa (%edx), %xmm3
1221 pxor %xmm0, %xmm0
1222 mov $16, %ecx
76e3966e 1223 orl $8, FLAGS
904057bc
L
1224 lea 8(%edx), %edi
1225 and $0xfff, %edi
1226 sub $0x1000, %edi
1227
1228 .p2align 4
1229L(loop_ashr_8):
1230 add $16, %edi
1231 jg L(nibble_ashr_8)
1232
1233L(gobble_ashr_8):
1234 movdqa (%eax, %ecx), %xmm1
1235 movdqa (%edx, %ecx), %xmm2
1236 movdqa %xmm2, %xmm4
1237
1238 palignr $8, %xmm3, %xmm2
76e3966e 1239 TOLOWER (%xmm1, %xmm2)
904057bc
L
1240
1241 pcmpeqb %xmm1, %xmm0
1242 pcmpeqb %xmm2, %xmm1
1243 psubb %xmm0, %xmm1
1244 pmovmskb %xmm1, %esi
1245 sub $0xffff, %esi
1246 jnz L(exit)
1247
76e3966e
UD
1248#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1249 cmp $16, REM
1250 lea -16(REM), REM
904057bc
L
1251 jbe L(more8byteseq)
1252#endif
1253 add $16, %ecx
1254 movdqa %xmm4, %xmm3
1255
1256 add $16, %edi
1257 jg L(nibble_ashr_8)
1258
1259 movdqa (%eax, %ecx), %xmm1
1260 movdqa (%edx, %ecx), %xmm2
1261 movdqa %xmm2, %xmm4
1262
1263 palignr $8, %xmm3, %xmm2
76e3966e 1264 TOLOWER (%xmm1, %xmm2)
904057bc
L
1265
1266 pcmpeqb %xmm1, %xmm0
1267 pcmpeqb %xmm2, %xmm1
1268 psubb %xmm0, %xmm1
1269 pmovmskb %xmm1, %esi
1270 sub $0xffff, %esi
1271 jnz L(exit)
1272
76e3966e
UD
1273#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1274 cmp $16, REM
1275 lea -16(REM), REM
904057bc
L
1276 jbe L(more8byteseq)
1277#endif
1278 add $16, %ecx
1279 movdqa %xmm4, %xmm3
1280 jmp L(loop_ashr_8)
1281
1282 .p2align 4
1283L(nibble_ashr_8):
1284 pcmpeqb %xmm3, %xmm0
1285 pmovmskb %xmm0, %esi
1286 test $0xff00, %esi
1287 jnz L(ashr_8_exittail)
1288
76e3966e
UD
1289#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1290 cmp $8, REM
904057bc
L
1291 jbe L(ashr_8_exittail)
1292#endif
1293 pxor %xmm0, %xmm0
1294 pxor %xmm0, %xmm0
1295 sub $0x1000, %edi
1296 jmp L(gobble_ashr_8)
1297
1298 .p2align 4
1299L(ashr_8_exittail):
1300 movdqa (%eax, %ecx), %xmm1
1301 psrldq $8, %xmm0
1302 psrldq $8, %xmm3
1303 jmp L(aftertail)
1304
1305/*
1306 * The following cases will be handled by ashr_9
6bb74d9f 1307 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
904057bc
L
1308 * n(7~15) n - 7 8(15 +(n-7) - n) ashr_9
1309 */
1310 .p2align 4
1311L(ashr_9):
1312 mov $0xffff, %esi
1313 pxor %xmm0, %xmm0
1314 movdqa (%edx), %xmm2
1315 movdqa (%eax), %xmm1
1316 pcmpeqb %xmm1, %xmm0
1317 pslldq $7, %xmm2
76e3966e 1318 TOLOWER (%xmm1, %xmm2)
904057bc
L
1319 pcmpeqb %xmm1, %xmm2
1320 psubb %xmm0, %xmm2
1321 pmovmskb %xmm2, %edi
1322 shr %cl, %esi
1323 shr %cl, %edi
1324 sub %edi, %esi
1325 lea -7(%ecx), %edi
1326 jnz L(less32bytes)
1327
1328 UPDATE_STRNCMP_COUNTER
1329
1330 movdqa (%edx), %xmm3
1331 pxor %xmm0, %xmm0
1332 mov $16, %ecx
76e3966e 1333 orl $9, FLAGS
904057bc
L
1334 lea 9(%edx), %edi
1335 and $0xfff, %edi
1336 sub $0x1000, %edi
1337
1338 .p2align 4
1339L(loop_ashr_9):
1340 add $16, %edi
1341 jg L(nibble_ashr_9)
1342
1343L(gobble_ashr_9):
1344 movdqa (%eax, %ecx), %xmm1
1345 movdqa (%edx, %ecx), %xmm2
1346 movdqa %xmm2, %xmm4
1347
1348 palignr $9, %xmm3, %xmm2
76e3966e 1349 TOLOWER (%xmm1, %xmm2)
904057bc
L
1350
1351 pcmpeqb %xmm1, %xmm0
1352 pcmpeqb %xmm2, %xmm1
1353 psubb %xmm0, %xmm1
1354 pmovmskb %xmm1, %esi
1355 sub $0xffff, %esi
1356 jnz L(exit)
1357
76e3966e
UD
1358#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1359 cmp $16, REM
1360 lea -16(REM), REM
904057bc
L
1361 jbe L(more8byteseq)
1362#endif
1363 add $16, %ecx
1364 movdqa %xmm4, %xmm3
1365
1366 add $16, %edi
1367 jg L(nibble_ashr_9)
1368
1369 movdqa (%eax, %ecx), %xmm1
1370 movdqa (%edx, %ecx), %xmm2
1371 movdqa %xmm2, %xmm4
1372
1373 palignr $9, %xmm3, %xmm2
76e3966e 1374 TOLOWER (%xmm1, %xmm2)
904057bc
L
1375
1376 pcmpeqb %xmm1, %xmm0
1377 pcmpeqb %xmm2, %xmm1
1378 psubb %xmm0, %xmm1
1379 pmovmskb %xmm1, %esi
1380 sub $0xffff, %esi
1381 jnz L(exit)
1382
76e3966e
UD
1383#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1384 cmp $16, REM
1385 lea -16(REM), REM
904057bc
L
1386 jbe L(more8byteseq)
1387#endif
1388 add $16, %ecx
1389 movdqa %xmm4, %xmm3
1390 jmp L(loop_ashr_9)
1391
1392 .p2align 4
1393L(nibble_ashr_9):
1394 pcmpeqb %xmm3, %xmm0
1395 pmovmskb %xmm0, %esi
1396 test $0xfe00, %esi
1397 jnz L(ashr_9_exittail)
1398
76e3966e
UD
1399#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1400 cmp $7, REM
904057bc
L
1401 jbe L(ashr_9_exittail)
1402#endif
1403 pxor %xmm0, %xmm0
1404 sub $0x1000, %edi
1405 jmp L(gobble_ashr_9)
1406
1407 .p2align 4
1408L(ashr_9_exittail):
1409 movdqa (%eax, %ecx), %xmm1
1410 psrldq $9, %xmm0
1411 psrldq $9, %xmm3
1412 jmp L(aftertail)
1413
1414/*
1415 * The following cases will be handled by ashr_10
6bb74d9f 1416 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
904057bc
L
1417 * n(6~15) n - 6 9(15 +(n-6) - n) ashr_10
1418 */
1419 .p2align 4
1420L(ashr_10):
1421 mov $0xffff, %esi
1422 pxor %xmm0, %xmm0
1423 movdqa (%edx), %xmm2
1424 movdqa (%eax), %xmm1
1425 pcmpeqb %xmm1, %xmm0
1426 pslldq $6, %xmm2
76e3966e 1427 TOLOWER (%xmm1, %xmm2)
904057bc
L
1428 pcmpeqb %xmm1, %xmm2
1429 psubb %xmm0, %xmm2
1430 pmovmskb %xmm2, %edi
1431 shr %cl, %esi
1432 shr %cl, %edi
1433 sub %edi, %esi
1434 lea -6(%ecx), %edi
1435 jnz L(less32bytes)
1436
1437 UPDATE_STRNCMP_COUNTER
1438
1439 movdqa (%edx), %xmm3
1440 pxor %xmm0, %xmm0
1441 mov $16, %ecx
76e3966e 1442 orl $10, FLAGS
904057bc
L
1443 lea 10(%edx), %edi
1444 and $0xfff, %edi
1445 sub $0x1000, %edi
1446
1447 .p2align 4
1448L(loop_ashr_10):
1449 add $16, %edi
1450 jg L(nibble_ashr_10)
1451
1452L(gobble_ashr_10):
1453 movdqa (%eax, %ecx), %xmm1
1454 movdqa (%edx, %ecx), %xmm2
1455 movdqa %xmm2, %xmm4
1456
1457 palignr $10, %xmm3, %xmm2
76e3966e 1458 TOLOWER (%xmm1, %xmm2)
904057bc
L
1459
1460 pcmpeqb %xmm1, %xmm0
1461 pcmpeqb %xmm2, %xmm1
1462 psubb %xmm0, %xmm1
1463 pmovmskb %xmm1, %esi
1464 sub $0xffff, %esi
1465 jnz L(exit)
1466
76e3966e
UD
1467#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1468 cmp $16, REM
1469 lea -16(REM), REM
904057bc
L
1470 jbe L(more8byteseq)
1471#endif
1472 add $16, %ecx
1473 movdqa %xmm4, %xmm3
1474
1475 add $16, %edi
1476 jg L(nibble_ashr_10)
1477
1478 movdqa (%eax, %ecx), %xmm1
1479 movdqa (%edx, %ecx), %xmm2
1480 movdqa %xmm2, %xmm4
1481
1482 palignr $10, %xmm3, %xmm2
76e3966e 1483 TOLOWER (%xmm1, %xmm2)
904057bc
L
1484
1485 pcmpeqb %xmm1, %xmm0
1486 pcmpeqb %xmm2, %xmm1
1487 psubb %xmm0, %xmm1
1488 pmovmskb %xmm1, %esi
1489 sub $0xffff, %esi
1490 jnz L(exit)
1491
76e3966e
UD
1492#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1493 cmp $16, REM
1494 lea -16(REM), REM
904057bc
L
1495 jbe L(more8byteseq)
1496#endif
1497 add $16, %ecx
1498 movdqa %xmm4, %xmm3
1499 jmp L(loop_ashr_10)
1500
1501 .p2align 4
1502L(nibble_ashr_10):
1503 pcmpeqb %xmm3, %xmm0
1504 pmovmskb %xmm0, %esi
1505 test $0xfc00, %esi
1506 jnz L(ashr_10_exittail)
1507
76e3966e
UD
1508#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1509 cmp $6, REM
904057bc
L
1510 jbe L(ashr_10_exittail)
1511#endif
1512 pxor %xmm0, %xmm0
1513 sub $0x1000, %edi
1514 jmp L(gobble_ashr_10)
1515
1516 .p2align 4
1517L(ashr_10_exittail):
1518 movdqa (%eax, %ecx), %xmm1
1519 psrldq $10, %xmm0
1520 psrldq $10, %xmm3
1521 jmp L(aftertail)
1522
1523/*
1524 * The following cases will be handled by ashr_11
6bb74d9f 1525 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
904057bc
L
1526 * n(5~15) n - 5 10(15 +(n-5) - n) ashr_11
1527 */
1528 .p2align 4
1529L(ashr_11):
1530 mov $0xffff, %esi
1531 pxor %xmm0, %xmm0
1532 movdqa (%edx), %xmm2
1533 movdqa (%eax), %xmm1
1534 pcmpeqb %xmm1, %xmm0
1535 pslldq $5, %xmm2
76e3966e 1536 TOLOWER (%xmm1, %xmm2)
904057bc
L
1537 pcmpeqb %xmm1, %xmm2
1538 psubb %xmm0, %xmm2
1539 pmovmskb %xmm2, %edi
1540 shr %cl, %esi
1541 shr %cl, %edi
1542 sub %edi, %esi
1543 lea -5(%ecx), %edi
1544 jnz L(less32bytes)
1545
1546 UPDATE_STRNCMP_COUNTER
1547
1548 movdqa (%edx), %xmm3
1549 pxor %xmm0, %xmm0
1550 mov $16, %ecx
76e3966e 1551 orl $11, FLAGS
904057bc
L
1552 lea 11(%edx), %edi
1553 and $0xfff, %edi
1554 sub $0x1000, %edi
1555
1556 .p2align 4
1557L(loop_ashr_11):
1558 add $16, %edi
1559 jg L(nibble_ashr_11)
1560
1561L(gobble_ashr_11):
1562 movdqa (%eax, %ecx), %xmm1
1563 movdqa (%edx, %ecx), %xmm2
1564 movdqa %xmm2, %xmm4
1565
1566 palignr $11, %xmm3, %xmm2
76e3966e 1567 TOLOWER (%xmm1, %xmm2)
904057bc
L
1568
1569 pcmpeqb %xmm1, %xmm0
1570 pcmpeqb %xmm2, %xmm1
1571 psubb %xmm0, %xmm1
1572 pmovmskb %xmm1, %esi
1573 sub $0xffff, %esi
1574 jnz L(exit)
1575
76e3966e
UD
1576#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1577 cmp $16, REM
1578 lea -16(REM), REM
904057bc
L
1579 jbe L(more8byteseq)
1580#endif
1581 add $16, %ecx
1582 movdqa %xmm4, %xmm3
1583
1584 add $16, %edi
1585 jg L(nibble_ashr_11)
1586
1587 movdqa (%eax, %ecx), %xmm1
1588 movdqa (%edx, %ecx), %xmm2
1589 movdqa %xmm2, %xmm4
1590
1591 palignr $11, %xmm3, %xmm2
76e3966e 1592 TOLOWER (%xmm1, %xmm2)
904057bc
L
1593
1594 pcmpeqb %xmm1, %xmm0
1595 pcmpeqb %xmm2, %xmm1
1596 psubb %xmm0, %xmm1
1597 pmovmskb %xmm1, %esi
1598 sub $0xffff, %esi
1599 jnz L(exit)
1600
76e3966e
UD
1601#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1602 cmp $16, REM
1603 lea -16(REM), REM
904057bc
L
1604 jbe L(more8byteseq)
1605#endif
1606 add $16, %ecx
1607 movdqa %xmm4, %xmm3
1608 jmp L(loop_ashr_11)
1609
1610 .p2align 4
1611L(nibble_ashr_11):
1612 pcmpeqb %xmm3, %xmm0
1613 pmovmskb %xmm0, %esi
1614 test $0xf800, %esi
1615 jnz L(ashr_11_exittail)
1616
76e3966e
UD
1617#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1618 cmp $5, REM
904057bc
L
1619 jbe L(ashr_11_exittail)
1620#endif
1621 pxor %xmm0, %xmm0
1622 sub $0x1000, %edi
1623 jmp L(gobble_ashr_11)
1624
1625 .p2align 4
1626L(ashr_11_exittail):
1627 movdqa (%eax, %ecx), %xmm1
1628 psrldq $11, %xmm0
1629 psrldq $11, %xmm3
1630 jmp L(aftertail)
1631
1632/*
1633 * The following cases will be handled by ashr_12
6bb74d9f 1634 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
904057bc
L
1635 * n(4~15) n - 4 11(15 +(n-4) - n) ashr_12
1636 */
1637 .p2align 4
1638L(ashr_12):
1639 mov $0xffff, %esi
1640 pxor %xmm0, %xmm0
1641 movdqa (%edx), %xmm2
1642 movdqa (%eax), %xmm1
1643 pcmpeqb %xmm1, %xmm0
1644 pslldq $4, %xmm2
76e3966e 1645 TOLOWER (%xmm1, %xmm2)
904057bc
L
1646 pcmpeqb %xmm1, %xmm2
1647 psubb %xmm0, %xmm2
1648 pmovmskb %xmm2, %edi
1649 shr %cl, %esi
1650 shr %cl, %edi
1651 sub %edi, %esi
1652 lea -4(%ecx), %edi
1653 jnz L(less32bytes)
1654
1655 UPDATE_STRNCMP_COUNTER
1656
1657 movdqa (%edx), %xmm3
1658 pxor %xmm0, %xmm0
1659 mov $16, %ecx
76e3966e 1660 orl $12, FLAGS
904057bc
L
1661 lea 12(%edx), %edi
1662 and $0xfff, %edi
1663 sub $0x1000, %edi
1664
1665 .p2align 4
1666L(loop_ashr_12):
1667 add $16, %edi
1668 jg L(nibble_ashr_12)
1669
1670L(gobble_ashr_12):
1671 movdqa (%eax, %ecx), %xmm1
1672 movdqa (%edx, %ecx), %xmm2
1673 movdqa %xmm2, %xmm4
1674
1675 palignr $12, %xmm3, %xmm2
76e3966e 1676 TOLOWER (%xmm1, %xmm2)
904057bc
L
1677
1678 pcmpeqb %xmm1, %xmm0
1679 pcmpeqb %xmm2, %xmm1
1680 psubb %xmm0, %xmm1
1681 pmovmskb %xmm1, %esi
1682 sub $0xffff, %esi
1683 jnz L(exit)
1684
76e3966e
UD
1685#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1686 cmp $16, REM
1687 lea -16(REM), REM
6cc2b8a6
L
1688 jbe L(more8byteseq)
1689#endif
1690
904057bc
L
1691 add $16, %ecx
1692 movdqa %xmm4, %xmm3
1693
1694 add $16, %edi
1695 jg L(nibble_ashr_12)
1696
904057bc
L
1697 movdqa (%eax, %ecx), %xmm1
1698 movdqa (%edx, %ecx), %xmm2
1699 movdqa %xmm2, %xmm4
1700
1701 palignr $12, %xmm3, %xmm2
76e3966e 1702 TOLOWER (%xmm1, %xmm2)
904057bc
L
1703
1704 pcmpeqb %xmm1, %xmm0
1705 pcmpeqb %xmm2, %xmm1
1706 psubb %xmm0, %xmm1
1707 pmovmskb %xmm1, %esi
1708 sub $0xffff, %esi
1709 jnz L(exit)
1710
76e3966e
UD
1711#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1712 cmp $16, REM
1713 lea -16(REM), REM
904057bc
L
1714 jbe L(more8byteseq)
1715#endif
1716 add $16, %ecx
1717 movdqa %xmm4, %xmm3
1718 jmp L(loop_ashr_12)
1719
1720 .p2align 4
1721L(nibble_ashr_12):
1722 pcmpeqb %xmm3, %xmm0
1723 pmovmskb %xmm0, %esi
1724 test $0xf000, %esi
1725 jnz L(ashr_12_exittail)
1726
76e3966e
UD
1727#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1728 cmp $4, REM
904057bc
L
1729 jbe L(ashr_12_exittail)
1730#endif
1731 pxor %xmm0, %xmm0
1732 sub $0x1000, %edi
1733 jmp L(gobble_ashr_12)
1734
1735 .p2align 4
1736L(ashr_12_exittail):
1737 movdqa (%eax, %ecx), %xmm1
1738 psrldq $12, %xmm0
1739 psrldq $12, %xmm3
1740 jmp L(aftertail)
1741
1742/*
1743 * The following cases will be handled by ashr_13
6bb74d9f 1744 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
904057bc
L
1745 * n(3~15) n - 3 12(15 +(n-3) - n) ashr_13
1746 */
1747 .p2align 4
1748L(ashr_13):
1749 mov $0xffff, %esi
1750 pxor %xmm0, %xmm0
1751 movdqa (%edx), %xmm2
1752 movdqa (%eax), %xmm1
1753 pcmpeqb %xmm1, %xmm0
1754 pslldq $3, %xmm2
76e3966e 1755 TOLOWER (%xmm1, %xmm2)
904057bc
L
1756 pcmpeqb %xmm1, %xmm2
1757 psubb %xmm0, %xmm2
1758 pmovmskb %xmm2, %edi
1759 shr %cl, %esi
1760 shr %cl, %edi
1761 sub %edi, %esi
1762 lea -3(%ecx), %edi
1763 jnz L(less32bytes)
1764
1765 UPDATE_STRNCMP_COUNTER
1766
1767 movdqa (%edx), %xmm3
1768 pxor %xmm0, %xmm0
1769 mov $16, %ecx
76e3966e 1770 orl $13, FLAGS
904057bc
L
1771 lea 13(%edx), %edi
1772 and $0xfff, %edi
1773 sub $0x1000, %edi
1774
1775 .p2align 4
1776L(loop_ashr_13):
1777 add $16, %edi
1778 jg L(nibble_ashr_13)
1779
1780L(gobble_ashr_13):
1781 movdqa (%eax, %ecx), %xmm1
1782 movdqa (%edx, %ecx), %xmm2
1783 movdqa %xmm2, %xmm4
1784
1785 palignr $13, %xmm3, %xmm2
76e3966e 1786 TOLOWER (%xmm1, %xmm2)
904057bc
L
1787
1788 pcmpeqb %xmm1, %xmm0
1789 pcmpeqb %xmm2, %xmm1
1790 psubb %xmm0, %xmm1
1791 pmovmskb %xmm1, %esi
1792 sub $0xffff, %esi
1793 jnz L(exit)
1794
76e3966e
UD
1795#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1796 cmp $16, REM
1797 lea -16(REM), REM
904057bc
L
1798 jbe L(more8byteseq)
1799#endif
1800 add $16, %ecx
1801 movdqa %xmm4, %xmm3
1802
1803 add $16, %edi
1804 jg L(nibble_ashr_13)
1805
1806 movdqa (%eax, %ecx), %xmm1
1807 movdqa (%edx, %ecx), %xmm2
1808 movdqa %xmm2, %xmm4
1809
1810 palignr $13, %xmm3, %xmm2
76e3966e 1811 TOLOWER (%xmm1, %xmm2)
904057bc
L
1812
1813 pcmpeqb %xmm1, %xmm0
1814 pcmpeqb %xmm2, %xmm1
1815 psubb %xmm0, %xmm1
1816 pmovmskb %xmm1, %esi
1817 sub $0xffff, %esi
1818 jnz L(exit)
1819
76e3966e
UD
1820#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1821 cmp $16, REM
1822 lea -16(REM), REM
904057bc
L
1823 jbe L(more8byteseq)
1824#endif
1825 add $16, %ecx
1826 movdqa %xmm4, %xmm3
1827 jmp L(loop_ashr_13)
1828
1829 .p2align 4
1830L(nibble_ashr_13):
1831 pcmpeqb %xmm3, %xmm0
1832 pmovmskb %xmm0, %esi
1833 test $0xe000, %esi
1834 jnz L(ashr_13_exittail)
1835
76e3966e
UD
1836#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1837 cmp $3, REM
904057bc
L
1838 jbe L(ashr_13_exittail)
1839#endif
1840 pxor %xmm0, %xmm0
1841 sub $0x1000, %edi
1842 jmp L(gobble_ashr_13)
1843
1844 .p2align 4
1845L(ashr_13_exittail):
1846 movdqa (%eax, %ecx), %xmm1
1847 psrldq $13, %xmm0
1848 psrldq $13, %xmm3
1849 jmp L(aftertail)
1850
1851/*
1852 * The following cases will be handled by ashr_14
6bb74d9f 1853 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
904057bc
L
1854 * n(2~15) n - 2 13(15 +(n-2) - n) ashr_14
1855 */
1856 .p2align 4
1857L(ashr_14):
1858 mov $0xffff, %esi
1859 pxor %xmm0, %xmm0
1860 movdqa (%edx), %xmm2
1861 movdqa (%eax), %xmm1
1862 pcmpeqb %xmm1, %xmm0
1863 pslldq $2, %xmm2
76e3966e 1864 TOLOWER (%xmm1, %xmm2)
904057bc
L
1865 pcmpeqb %xmm1, %xmm2
1866 psubb %xmm0, %xmm2
1867 pmovmskb %xmm2, %edi
1868 shr %cl, %esi
1869 shr %cl, %edi
1870 sub %edi, %esi
1871 lea -2(%ecx), %edi
1872 jnz L(less32bytes)
1873
1874 UPDATE_STRNCMP_COUNTER
1875
1876 movdqa (%edx), %xmm3
1877 pxor %xmm0, %xmm0
1878 mov $16, %ecx
76e3966e 1879 orl $14, FLAGS
904057bc
L
1880 lea 14(%edx), %edi
1881 and $0xfff, %edi
1882 sub $0x1000, %edi
1883
1884 .p2align 4
1885L(loop_ashr_14):
1886 add $16, %edi
1887 jg L(nibble_ashr_14)
1888
1889L(gobble_ashr_14):
1890 movdqa (%eax, %ecx), %xmm1
1891 movdqa (%edx, %ecx), %xmm2
1892 movdqa %xmm2, %xmm4
1893
1894 palignr $14, %xmm3, %xmm2
76e3966e 1895 TOLOWER (%xmm1, %xmm2)
904057bc
L
1896
1897 pcmpeqb %xmm1, %xmm0
1898 pcmpeqb %xmm2, %xmm1
1899 psubb %xmm0, %xmm1
1900 pmovmskb %xmm1, %esi
1901 sub $0xffff, %esi
1902 jnz L(exit)
1903
76e3966e
UD
1904#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1905 cmp $16, REM
1906 lea -16(REM), REM
904057bc
L
1907 jbe L(more8byteseq)
1908#endif
1909 add $16, %ecx
1910 movdqa %xmm4, %xmm3
1911
1912 add $16, %edi
1913 jg L(nibble_ashr_14)
1914
1915 movdqa (%eax, %ecx), %xmm1
1916 movdqa (%edx, %ecx), %xmm2
1917 movdqa %xmm2, %xmm4
1918
1919 palignr $14, %xmm3, %xmm2
76e3966e 1920 TOLOWER (%xmm1, %xmm2)
904057bc
L
1921
1922 pcmpeqb %xmm1, %xmm0
1923 pcmpeqb %xmm2, %xmm1
1924 psubb %xmm0, %xmm1
1925 pmovmskb %xmm1, %esi
1926 sub $0xffff, %esi
1927 jnz L(exit)
1928
76e3966e
UD
1929#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1930 cmp $16, REM
1931 lea -16(REM), REM
904057bc
L
1932 jbe L(more8byteseq)
1933#endif
1934 add $16, %ecx
1935 movdqa %xmm4, %xmm3
1936 jmp L(loop_ashr_14)
1937
1938 .p2align 4
1939L(nibble_ashr_14):
1940 pcmpeqb %xmm3, %xmm0
1941 pmovmskb %xmm0, %esi
1942 test $0xc000, %esi
1943 jnz L(ashr_14_exittail)
1944
76e3966e
UD
1945#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1946 cmp $2, REM
904057bc
L
1947 jbe L(ashr_14_exittail)
1948#endif
1949 pxor %xmm0, %xmm0
1950 sub $0x1000, %edi
1951 jmp L(gobble_ashr_14)
1952
1953 .p2align 4
1954L(ashr_14_exittail):
1955 movdqa (%eax, %ecx), %xmm1
1956 psrldq $14, %xmm0
1957 psrldq $14, %xmm3
1958 jmp L(aftertail)
1959
1960/*
1961 * The following cases will be handled by ashr_14
6bb74d9f 1962 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
904057bc
L
1963 * n(1~15) n - 1 14(15 +(n-1) - n) ashr_15
1964 */
1965
1966 .p2align 4
1967L(ashr_15):
1968 mov $0xffff, %esi
1969 pxor %xmm0, %xmm0
1970 movdqa (%edx), %xmm2
1971 movdqa (%eax), %xmm1
1972 pcmpeqb %xmm1, %xmm0
1973 pslldq $1, %xmm2
76e3966e 1974 TOLOWER (%xmm1, %xmm2)
904057bc
L
1975 pcmpeqb %xmm1, %xmm2
1976 psubb %xmm0, %xmm2
1977 pmovmskb %xmm2, %edi
1978 shr %cl, %esi
1979 shr %cl, %edi
1980 sub %edi, %esi
1981 lea -1(%ecx), %edi
1982 jnz L(less32bytes)
1983
1984 UPDATE_STRNCMP_COUNTER
1985
1986 movdqa (%edx), %xmm3
1987 pxor %xmm0, %xmm0
1988 mov $16, %ecx
76e3966e 1989 orl $15, FLAGS
904057bc
L
1990 lea 15(%edx), %edi
1991 and $0xfff, %edi
1992 sub $0x1000, %edi
1993
1994 .p2align 4
1995L(loop_ashr_15):
1996 add $16, %edi
1997 jg L(nibble_ashr_15)
1998
1999L(gobble_ashr_15):
2000 movdqa (%eax, %ecx), %xmm1
2001 movdqa (%edx, %ecx), %xmm2
2002 movdqa %xmm2, %xmm4
2003
2004 palignr $15, %xmm3, %xmm2
76e3966e 2005 TOLOWER (%xmm1, %xmm2)
904057bc
L
2006
2007 pcmpeqb %xmm1, %xmm0
2008 pcmpeqb %xmm2, %xmm1
2009 psubb %xmm0, %xmm1
2010 pmovmskb %xmm1, %esi
2011 sub $0xffff, %esi
2012 jnz L(exit)
2013
76e3966e
UD
2014#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2015 cmp $16, REM
2016 lea -16(REM), REM
904057bc
L
2017 jbe L(more8byteseq)
2018#endif
2019 add $16, %ecx
2020 movdqa %xmm4, %xmm3
2021
2022 add $16, %edi
2023 jg L(nibble_ashr_15)
2024
2025 movdqa (%eax, %ecx), %xmm1
2026 movdqa (%edx, %ecx), %xmm2
2027 movdqa %xmm2, %xmm4
2028
2029 palignr $15, %xmm3, %xmm2
76e3966e 2030 TOLOWER (%xmm1, %xmm2)
904057bc
L
2031
2032 pcmpeqb %xmm1, %xmm0
2033 pcmpeqb %xmm2, %xmm1
2034 psubb %xmm0, %xmm1
2035 pmovmskb %xmm1, %esi
2036 sub $0xffff, %esi
2037 jnz L(exit)
2038
76e3966e
UD
2039#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2040 cmp $16, REM
2041 lea -16(REM), REM
904057bc
L
2042 jbe L(more8byteseq)
2043#endif
2044 add $16, %ecx
2045 movdqa %xmm4, %xmm3
2046 jmp L(loop_ashr_15)
2047
2048 .p2align 4
2049L(nibble_ashr_15):
2050 pcmpeqb %xmm3, %xmm0
2051 pmovmskb %xmm0, %esi
2052 test $0x8000, %esi
2053 jnz L(ashr_15_exittail)
2054
76e3966e
UD
2055#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2056 cmp $1, REM
904057bc
L
2057 jbe L(ashr_15_exittail)
2058#endif
2059 pxor %xmm0, %xmm0
2060 sub $0x1000, %edi
2061 jmp L(gobble_ashr_15)
2062
2063 .p2align 4
2064L(ashr_15_exittail):
2065 movdqa (%eax, %ecx), %xmm1
2066 psrldq $15, %xmm0
2067 psrldq $15, %xmm3
2068 jmp L(aftertail)
2069
2070 .p2align 4
2071L(aftertail):
76e3966e 2072 TOLOWER (%xmm1, %xmm3)
904057bc
L
2073 pcmpeqb %xmm3, %xmm1
2074 psubb %xmm0, %xmm1
2075 pmovmskb %xmm1, %esi
2076 not %esi
2077L(exit):
76e3966e 2078 mov FLAGS, %edi
904057bc
L
2079 and $0x1f, %edi
2080 lea -16(%edi, %ecx), %edi
2081L(less32bytes):
2082 add %edi, %edx
2083 add %ecx, %eax
76e3966e 2084 testl $0x20, FLAGS
904057bc
L
2085 jz L(ret2)
2086 xchg %eax, %edx
2087
2088 .p2align 4
2089L(ret2):
2090 mov %esi, %ecx
76e3966e
UD
2091#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2092 addl $4, %esp
2093 cfi_adjust_cfa_offset (-4)
2094#endif
904057bc
L
2095 POP (%esi)
2096 POP (%edi)
76e3966e
UD
2097#if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
2098 POP (FLAGS)
2099#endif
904057bc
L
2100L(less16bytes):
2101 test %cl, %cl
2102 jz L(2next_8_bytes)
2103
2104 test $0x01, %cl
2105 jnz L(Byte0)
2106
2107 test $0x02, %cl
2108 jnz L(Byte1)
2109
2110 test $0x04, %cl
2111 jnz L(Byte2)
2112
2113 test $0x08, %cl
2114 jnz L(Byte3)
2115
2116 test $0x10, %cl
2117 jnz L(Byte4)
2118
2119 test $0x20, %cl
2120 jnz L(Byte5)
2121
2122 test $0x40, %cl
2123 jnz L(Byte6)
76e3966e
UD
2124#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2125 cmp $7, REM
904057bc
L
2126 jbe L(eq)
2127#endif
2128
2129 movzx 7(%eax), %ecx
2130 movzx 7(%edx), %eax
76e3966e
UD
2131#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2132# ifdef PIC
2133 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2134 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
2135# else
2136 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2137 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
2138# endif
2139#endif
904057bc
L
2140
2141 sub %ecx, %eax
82abe82a 2142 RETURN
904057bc 2143
904057bc 2144L(Byte0):
76e3966e
UD
2145#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2146 cmp $0, REM
904057bc
L
2147 jbe L(eq)
2148#endif
2149 movzx (%eax), %ecx
2150 movzx (%edx), %eax
2151
76e3966e
UD
2152#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2153# ifdef PIC
2154 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2155 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
2156# else
2157 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2158 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
2159# endif
2160#endif
2161
904057bc 2162 sub %ecx, %eax
82abe82a 2163 RETURN
904057bc 2164
904057bc 2165L(Byte1):
76e3966e
UD
2166#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2167 cmp $1, REM
904057bc
L
2168 jbe L(eq)
2169#endif
2170 movzx 1(%eax), %ecx
2171 movzx 1(%edx), %eax
2172
76e3966e
UD
2173#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2174# ifdef PIC
2175 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2176 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
2177# else
2178 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2179 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
2180# endif
2181#endif
2182
904057bc 2183 sub %ecx, %eax
82abe82a 2184 RETURN
904057bc 2185
904057bc 2186L(Byte2):
76e3966e
UD
2187#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2188 cmp $2, REM
904057bc
L
2189 jbe L(eq)
2190#endif
2191 movzx 2(%eax), %ecx
2192 movzx 2(%edx), %eax
2193
76e3966e
UD
2194#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2195# ifdef PIC
2196 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2197 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
2198# else
2199 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2200 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
2201# endif
2202#endif
2203
904057bc 2204 sub %ecx, %eax
82abe82a 2205 RETURN
904057bc 2206
904057bc 2207L(Byte3):
76e3966e
UD
2208#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2209 cmp $3, REM
904057bc
L
2210 jbe L(eq)
2211#endif
2212 movzx 3(%eax), %ecx
2213 movzx 3(%edx), %eax
2214
76e3966e
UD
2215#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2216# ifdef PIC
2217 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2218 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
2219# else
2220 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2221 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
2222# endif
2223#endif
2224
904057bc 2225 sub %ecx, %eax
82abe82a 2226 RETURN
904057bc 2227
904057bc 2228L(Byte4):
76e3966e
UD
2229#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2230 cmp $4, REM
904057bc
L
2231 jbe L(eq)
2232#endif
2233 movzx 4(%eax), %ecx
2234 movzx 4(%edx), %eax
2235
76e3966e
UD
2236#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2237# ifdef PIC
2238 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2239 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
2240# else
2241 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2242 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
2243# endif
2244#endif
2245
904057bc 2246 sub %ecx, %eax
82abe82a 2247 RETURN
6bb74d9f 2248
904057bc 2249L(Byte5):
76e3966e
UD
2250#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2251 cmp $5, REM
904057bc
L
2252 jbe L(eq)
2253#endif
2254 movzx 5(%eax), %ecx
2255 movzx 5(%edx), %eax
2256
76e3966e
UD
2257#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2258# ifdef PIC
2259 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2260 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
2261# else
2262 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2263 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
2264# endif
2265#endif
2266
904057bc 2267 sub %ecx, %eax
82abe82a 2268 RETURN
904057bc 2269
904057bc 2270L(Byte6):
76e3966e
UD
2271#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2272 cmp $6, REM
904057bc
L
2273 jbe L(eq)
2274#endif
2275 movzx 6(%eax), %ecx
2276 movzx 6(%edx), %eax
2277
76e3966e
UD
2278#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2279# ifdef PIC
2280 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2281 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
2282# else
2283 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2284 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
2285# endif
2286#endif
2287
904057bc 2288 sub %ecx, %eax
82abe82a 2289 RETURN
904057bc 2290
904057bc
L
2291L(2next_8_bytes):
2292 add $8, %eax
2293 add $8, %edx
76e3966e
UD
2294#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2295 cmp $8, REM
2296 lea -8(REM), REM
904057bc
L
2297 jbe L(eq)
2298#endif
2299
2300 test $0x01, %ch
2301 jnz L(Byte0)
2302
2303 test $0x02, %ch
2304 jnz L(Byte1)
2305
2306 test $0x04, %ch
2307 jnz L(Byte2)
2308
2309 test $0x08, %ch
2310 jnz L(Byte3)
2311
2312 test $0x10, %ch
2313 jnz L(Byte4)
2314
2315 test $0x20, %ch
2316 jnz L(Byte5)
2317
2318 test $0x40, %ch
2319 jnz L(Byte6)
2320
76e3966e
UD
2321#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2322 cmp $7, REM
904057bc
L
2323 jbe L(eq)
2324#endif
2325 movzx 7(%eax), %ecx
2326 movzx 7(%edx), %eax
2327
76e3966e
UD
2328#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2329# ifdef PIC
2330 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2331 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
2332# else
2333 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2334 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
2335# endif
2336#endif
2337
904057bc 2338 sub %ecx, %eax
82abe82a 2339 RETURN
904057bc 2340
76e3966e
UD
2341#ifdef USE_AS_STRNCMP
2342L(neq_sncmp):
2343#endif
904057bc
L
2344L(neq):
2345 mov $1, %eax
2346 ja L(neq_bigger)
2347 neg %eax
2348L(neq_bigger):
76e3966e
UD
2349#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2350 addl $4, %esp
2351 cfi_adjust_cfa_offset (-4)
2352#endif
2353#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2354 POP (REM)
2355#endif
2356#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2357# ifdef PIC
2358 POP (%ebx)
2359# endif
904057bc
L
2360#endif
2361 ret
2362
76e3966e 2363#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
82abe82a
UD
2364 .p2align 4
2365 cfi_restore_state
904057bc 2366L(more8byteseq):
76e3966e
UD
2367
2368# ifdef USE_AS_STRNCASECMP_L
2369 addl $4, %esp
2370 cfi_adjust_cfa_offset (-4)
2371# endif
904057bc
L
2372 POP (%esi)
2373 POP (%edi)
76e3966e
UD
2374# ifdef USE_AS_STRNCMP
2375 POP (FLAGS)
2376# endif
904057bc
L
2377#endif
2378
76e3966e
UD
2379#ifdef USE_AS_STRNCMP
2380L(eq_sncmp):
2381#endif
904057bc
L
2382L(eq):
2383
76e3966e
UD
2384#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2385 POP (REM)
2386#endif
2387#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2388# ifdef PIC
2389 POP (%ebx)
2390# endif
904057bc
L
2391#endif
2392 xorl %eax, %eax
2393 ret
6bb74d9f 2394
76e3966e 2395#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
82abe82a 2396 .p2align 4
76e3966e
UD
2397# if defined USE_AS_STRNCASECMP_L && defined PIC
2398 CFI_PUSH (%ebx)
2399# endif
2400 CFI_PUSH (REM)
904057bc 2401L(less16bytes_sncmp):
76e3966e
UD
2402# ifdef USE_AS_STRNCASECMP_L
2403 PUSH (%esi)
2404# endif
2405 test REM, REM
2406 jz L(eq_sncmp)
904057bc
L
2407
2408 movzbl (%eax), %ecx
76e3966e
UD
2409# ifdef USE_AS_STRNCASECMP_L
2410 movzbl (%edx), %esi
2411# ifdef PIC
2412 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2413 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2414# else
2415 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2416 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2417# endif
2418 cmpl %ecx, %esi
2419# else
904057bc 2420 cmpb %cl, (%edx)
76e3966e
UD
2421# endif
2422 jne L(neq_sncmp)
904057bc
L
2423 test %cl, %cl
2424 je L(eq)
2425
76e3966e
UD
2426 cmp $1, REM
2427 je L(eq_sncmp)
904057bc
L
2428
2429 movzbl 1(%eax), %ecx
76e3966e
UD
2430# ifdef USE_AS_STRNCASECMP_L
2431 movzbl 1(%edx), %esi
2432# ifdef PIC
2433 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2434 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2435# else
2436 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2437 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2438# endif
2439 cmpl %ecx, %esi
2440# else
904057bc 2441 cmpb %cl, 1(%edx)
76e3966e
UD
2442# endif
2443 jne L(neq_sncmp)
904057bc 2444 test %cl, %cl
76e3966e 2445 je L(eq_sncmp)
904057bc 2446
76e3966e
UD
2447 cmp $2, REM
2448 je L(eq_sncmp)
904057bc
L
2449
2450 movzbl 2(%eax), %ecx
76e3966e
UD
2451# ifdef USE_AS_STRNCASECMP_L
2452 movzbl 2(%edx), %esi
2453# ifdef PIC
2454 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2455 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2456# else
2457 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2458 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2459# endif
2460 cmpl %ecx, %esi
2461# else
904057bc 2462 cmpb %cl, 2(%edx)
76e3966e
UD
2463# endif
2464 jne L(neq_sncmp)
904057bc 2465 test %cl, %cl
76e3966e 2466 je L(eq_sncmp)
904057bc 2467
76e3966e
UD
2468 cmp $3, REM
2469 je L(eq_sncmp)
904057bc
L
2470
2471 movzbl 3(%eax), %ecx
76e3966e
UD
2472# ifdef USE_AS_STRNCASECMP_L
2473 movzbl 3(%edx), %esi
2474# ifdef PIC
2475 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2476 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2477# else
2478 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2479 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2480# endif
2481 cmpl %ecx, %esi
2482# else
904057bc 2483 cmpb %cl, 3(%edx)
76e3966e
UD
2484# endif
2485 jne L(neq_sncmp)
904057bc 2486 test %cl, %cl
76e3966e 2487 je L(eq_sncmp)
904057bc 2488
76e3966e
UD
2489 cmp $4, REM
2490 je L(eq_sncmp)
904057bc
L
2491
2492 movzbl 4(%eax), %ecx
76e3966e
UD
2493# ifdef USE_AS_STRNCASECMP_L
2494 movzbl 4(%edx), %esi
2495# ifdef PIC
2496 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2497 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2498# else
2499 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2500 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2501# endif
2502 cmpl %ecx, %esi
2503# else
904057bc 2504 cmpb %cl, 4(%edx)
76e3966e
UD
2505# endif
2506 jne L(neq_sncmp)
904057bc 2507 test %cl, %cl
76e3966e 2508 je L(eq_sncmp)
904057bc 2509
76e3966e
UD
2510 cmp $5, REM
2511 je L(eq_sncmp)
904057bc
L
2512
2513 movzbl 5(%eax), %ecx
76e3966e
UD
2514# ifdef USE_AS_STRNCASECMP_L
2515 movzbl 5(%edx), %esi
2516# ifdef PIC
2517 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2518 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2519# else
2520 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2521 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2522# endif
2523 cmpl %ecx, %esi
2524# else
904057bc 2525 cmpb %cl, 5(%edx)
76e3966e
UD
2526# endif
2527 jne L(neq_sncmp)
904057bc 2528 test %cl, %cl
76e3966e 2529 je L(eq_sncmp)
904057bc 2530
76e3966e
UD
2531 cmp $6, REM
2532 je L(eq_sncmp)
904057bc
L
2533
2534 movzbl 6(%eax), %ecx
76e3966e
UD
2535# ifdef USE_AS_STRNCASECMP_L
2536 movzbl 6(%edx), %esi
2537# ifdef PIC
2538 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2539 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2540# else
2541 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2542 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2543# endif
2544 cmpl %ecx, %esi
2545# else
904057bc 2546 cmpb %cl, 6(%edx)
76e3966e
UD
2547# endif
2548 jne L(neq_sncmp)
904057bc 2549 test %cl, %cl
76e3966e 2550 je L(eq_sncmp)
904057bc 2551
76e3966e
UD
2552 cmp $7, REM
2553 je L(eq_sncmp)
904057bc
L
2554
2555 movzbl 7(%eax), %ecx
76e3966e
UD
2556# ifdef USE_AS_STRNCASECMP_L
2557 movzbl 7(%edx), %esi
2558# ifdef PIC
2559 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2560 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2561# else
2562 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2563 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2564# endif
2565 cmpl %ecx, %esi
2566# else
904057bc 2567 cmpb %cl, 7(%edx)
76e3966e
UD
2568# endif
2569 jne L(neq_sncmp)
904057bc 2570 test %cl, %cl
76e3966e 2571 je L(eq_sncmp)
904057bc
L
2572
2573
76e3966e
UD
2574 cmp $8, REM
2575 je L(eq_sncmp)
904057bc
L
2576
2577 movzbl 8(%eax), %ecx
76e3966e
UD
2578# ifdef USE_AS_STRNCASECMP_L
2579 movzbl 8(%edx), %esi
2580# ifdef PIC
2581 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2582 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2583# else
2584 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2585 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2586# endif
2587 cmpl %ecx, %esi
2588# else
904057bc 2589 cmpb %cl, 8(%edx)
76e3966e
UD
2590# endif
2591 jne L(neq_sncmp)
904057bc 2592 test %cl, %cl
76e3966e 2593 je L(eq_sncmp)
904057bc 2594
76e3966e
UD
2595 cmp $9, REM
2596 je L(eq_sncmp)
904057bc
L
2597
2598 movzbl 9(%eax), %ecx
76e3966e
UD
2599# ifdef USE_AS_STRNCASECMP_L
2600 movzbl 9(%edx), %esi
2601# ifdef PIC
2602 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2603 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2604# else
2605 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2606 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2607# endif
2608 cmpl %ecx, %esi
2609# else
904057bc 2610 cmpb %cl, 9(%edx)
76e3966e
UD
2611# endif
2612 jne L(neq_sncmp)
904057bc 2613 test %cl, %cl
76e3966e 2614 je L(eq_sncmp)
904057bc 2615
76e3966e
UD
2616 cmp $10, REM
2617 je L(eq_sncmp)
904057bc
L
2618
2619 movzbl 10(%eax), %ecx
76e3966e
UD
2620# ifdef USE_AS_STRNCASECMP_L
2621 movzbl 10(%edx), %esi
2622# ifdef PIC
2623 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2624 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2625# else
2626 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2627 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2628# endif
2629 cmpl %ecx, %esi
2630# else
904057bc 2631 cmpb %cl, 10(%edx)
76e3966e
UD
2632# endif
2633 jne L(neq_sncmp)
904057bc 2634 test %cl, %cl
76e3966e 2635 je L(eq_sncmp)
904057bc 2636
76e3966e
UD
2637 cmp $11, REM
2638 je L(eq_sncmp)
904057bc
L
2639
2640 movzbl 11(%eax), %ecx
76e3966e
UD
2641# ifdef USE_AS_STRNCASECMP_L
2642 movzbl 11(%edx), %esi
2643# ifdef PIC
2644 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2645 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2646# else
2647 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2648 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2649# endif
2650 cmpl %ecx, %esi
2651# else
904057bc 2652 cmpb %cl, 11(%edx)
76e3966e
UD
2653# endif
2654 jne L(neq_sncmp)
904057bc 2655 test %cl, %cl
76e3966e 2656 je L(eq_sncmp)
904057bc
L
2657
2658
76e3966e
UD
2659 cmp $12, REM
2660 je L(eq_sncmp)
904057bc
L
2661
2662 movzbl 12(%eax), %ecx
76e3966e
UD
2663# ifdef USE_AS_STRNCASECMP_L
2664 movzbl 12(%edx), %esi
2665# ifdef PIC
2666 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2667 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2668# else
2669 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2670 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2671# endif
2672 cmpl %ecx, %esi
2673# else
904057bc 2674 cmpb %cl, 12(%edx)
76e3966e
UD
2675# endif
2676 jne L(neq_sncmp)
904057bc 2677 test %cl, %cl
76e3966e 2678 je L(eq_sncmp)
904057bc 2679
76e3966e
UD
2680 cmp $13, REM
2681 je L(eq_sncmp)
904057bc
L
2682
2683 movzbl 13(%eax), %ecx
76e3966e
UD
2684# ifdef USE_AS_STRNCASECMP_L
2685 movzbl 13(%edx), %esi
2686# ifdef PIC
2687 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2688 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2689# else
2690 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2691 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2692# endif
2693 cmpl %ecx, %esi
2694# else
904057bc 2695 cmpb %cl, 13(%edx)
76e3966e
UD
2696# endif
2697 jne L(neq_sncmp)
904057bc 2698 test %cl, %cl
76e3966e 2699 je L(eq_sncmp)
904057bc 2700
76e3966e
UD
2701 cmp $14, REM
2702 je L(eq_sncmp)
904057bc
L
2703
2704 movzbl 14(%eax), %ecx
76e3966e
UD
2705# ifdef USE_AS_STRNCASECMP_L
2706 movzbl 14(%edx), %esi
2707# ifdef PIC
2708 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2709 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2710# else
2711 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2712 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2713# endif
2714 cmpl %ecx, %esi
2715# else
904057bc 2716 cmpb %cl, 14(%edx)
76e3966e
UD
2717# endif
2718 jne L(neq_sncmp)
904057bc 2719 test %cl, %cl
76e3966e 2720 je L(eq_sncmp)
904057bc 2721
76e3966e
UD
2722 cmp $15, REM
2723 je L(eq_sncmp)
904057bc
L
2724
2725 movzbl 15(%eax), %ecx
76e3966e
UD
2726# ifdef USE_AS_STRNCASECMP_L
2727 movzbl 15(%edx), %esi
2728# ifdef PIC
2729 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2730 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2731# else
2732 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2733 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2734# endif
2735 cmpl %ecx, %esi
2736# else
904057bc 2737 cmpb %cl, 15(%edx)
76e3966e
UD
2738# endif
2739 jne L(neq_sncmp)
904057bc 2740
76e3966e
UD
2741# ifdef USE_AS_STRNCASECMP_L
2742L(eq_sncmp):
2743 POP (%esi)
2744# endif
2745 POP (REM)
2746# if defined USE_AS_STRNCASECMP_L && defined PIC
2747 POP (%ebx)
2748# endif
904057bc
L
2749 xor %eax, %eax
2750 ret
76e3966e
UD
2751
2752# ifdef USE_AS_STRNCASECMP_L
2753 .p2align 4
2754# ifdef PIC
2755 CFI_PUSH (%ebx)
2756# endif
2757 CFI_PUSH (REM)
2758 CFI_PUSH (%esi)
2759L(neq_sncmp):
2760 mov $1, %eax
2761 mov $-1, %edx
2762 cmovna %edx, %eax
2763 POP (%esi)
2764 POP (REM)
2765# ifdef PIC
2766 POP (%ebx)
2767# endif
2768 ret
2769# endif
904057bc
L
2770#endif
2771
2772END (STRCMP)
2773
2774#endif