Undo accidental checkin.
[glibc.git] / sysdeps / i386 / i686 / multiarch / strcmp-ssse3.S
blob607b69b6fff2c1e33664f29ba70a6794ebfac439
1 /* strcmp with SSSE3
2    Copyright (C) 2010 Free Software Foundation, Inc.
3    Contributed by Intel Corporation.
4    This file is part of the GNU C Library.
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.
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.
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.  */
21 #ifndef NOT_IN_libc
23 #include <sysdep.h>
24 #include "asm-syntax.h"
26 #define CFI_PUSH(REG)                                           \
27   cfi_adjust_cfa_offset (4);                                    \
28   cfi_rel_offset (REG, 0)
30 #define CFI_POP(REG)                                            \
31   cfi_adjust_cfa_offset (-4);                                   \
32   cfi_restore (REG)
34 #define PUSH(REG)       pushl REG; CFI_PUSH (REG)
35 #define POP(REG)        popl REG; CFI_POP (REG)
37 #ifndef USE_AS_STRNCMP
38 # ifndef STRCMP
39 #  define STRCMP        __strcmp_ssse3
40 # endif
41 # define STR1           4
42 # define STR2           STR1+4
43 # define RETURN         ret; .p2align 4
44 # define UPDATE_STRNCMP_COUNTER
45 #else
46 # ifndef STRCMP
47 #  define STRCMP        __strncmp_ssse3
48 # endif
49 # define STR1           8
50 # define STR2           STR1+4
51 # define CNT            STR2+4
52 # define RETURN         POP (%ebp); ret; .p2align 4; CFI_PUSH (%ebp)
53 # define UPDATE_STRNCMP_COUNTER                         \
54         /* calculate left number to compare */          \
55         mov     $16, %esi;                              \
56         sub     %ecx, %esi;                             \
57         cmp     %esi, %ebp;                             \
58         jbe     L(more8byteseq);                        \
59         sub     %esi, %ebp
60 #endif
62         .section .text.ssse3,"ax",@progbits
63 ENTRY (STRCMP)
64 #ifdef USE_AS_STRNCMP
65         PUSH    (%ebp)
66 #endif
67         movl    STR1(%esp), %edx
68         movl    STR2(%esp), %eax
69 #ifdef USE_AS_STRNCMP
70         movl    CNT(%esp), %ebp
71         cmp     $16, %ebp
72         jb      L(less16bytes_sncmp)
73 #else
74         movzbl  (%eax), %ecx
75         cmpb    %cl, (%edx)
76         jne     L(neq)
77         cmpl    $0, %ecx
78         je      L(eq)
80         movzbl  1(%eax), %ecx
81         cmpb    %cl, 1(%edx)
82         jne     L(neq)
83         cmpl    $0, %ecx
84         je      L(eq)
86         movzbl  2(%eax), %ecx
87         cmpb    %cl, 2(%edx)
88         jne     L(neq)
89         cmpl    $0, %ecx
90         je      L(eq)
92         movzbl  3(%eax), %ecx
93         cmpb    %cl, 3(%edx)
94         jne     L(neq)
95         cmpl    $0, %ecx
96         je      L(eq)
98         movzbl  4(%eax), %ecx
99         cmpb    %cl, 4(%edx)
100         jne     L(neq)
101         cmpl    $0, %ecx
102         je      L(eq)
104         movzbl  5(%eax), %ecx
105         cmpb    %cl, 5(%edx)
106         jne     L(neq)
107         cmpl    $0, %ecx
108         je      L(eq)
110         movzbl  6(%eax), %ecx
111         cmpb    %cl, 6(%edx)
112         jne     L(neq)
113         cmpl    $0, %ecx
114         je      L(eq)
116         movzbl  7(%eax), %ecx
117         cmpb    %cl, 7(%edx)
118         jne     L(neq)
119         cmpl    $0, %ecx
120         je      L(eq)
122         add     $8, %edx
123         add     $8, %eax
124 #endif
125         movl    %edx, %ecx
126         and     $0xfff, %ecx
127         cmp     $0xff0, %ecx
128         ja      L(crosspage)
129         mov     %eax, %ecx
130         and     $0xfff, %ecx
131         cmp     $0xff0, %ecx
132         ja      L(crosspage)
133         pxor    %xmm0, %xmm0
134         movlpd  (%eax), %xmm1
135         movlpd  (%edx), %xmm2
136         movhpd  8(%eax), %xmm1
137         movhpd  8(%edx), %xmm2
138         pcmpeqb %xmm1, %xmm0
139         pcmpeqb %xmm2, %xmm1
140         psubb   %xmm0, %xmm1
141         pmovmskb %xmm1, %ecx
142         sub     $0xffff, %ecx
143         jnz     L(less16bytes)
144 #ifdef USE_AS_STRNCMP
145         cmp     $16, %ebp
146         lea     -16(%ebp), %ebp
147         jbe     L(eq)
148 #endif
149         add     $16, %eax
150         add     $16, %edx
152 L(crosspage):
154         PUSH    (%ebx)
155         PUSH    (%edi)
156         PUSH    (%esi)
157 #ifdef USE_AS_STRNCMP
158         cfi_remember_state
159 #endif
161         movl    %edx, %edi
162         movl    %eax, %ecx
163         and     $0xf, %ecx
164         and     $0xf, %edi
165         xor     %ecx, %eax
166         xor     %edi, %edx
167         xor     %ebx, %ebx
168         cmp     %edi, %ecx
169         je      L(ashr_0)
170         ja      L(bigger)
171         or      $0x20, %ebx
172         xchg    %edx, %eax
173         xchg    %ecx, %edi
174 L(bigger):
175         lea     15(%edi), %edi
176         sub     %ecx, %edi
177         cmp     $8, %edi
178         jle     L(ashr_less_8)
179         cmp     $14, %edi
180         je      L(ashr_15)
181         cmp     $13, %edi
182         je      L(ashr_14)
183         cmp     $12, %edi
184         je      L(ashr_13)
185         cmp     $11, %edi
186         je      L(ashr_12)
187         cmp     $10, %edi
188         je      L(ashr_11)
189         cmp     $9, %edi
190         je      L(ashr_10)
191 L(ashr_less_8):
192         je      L(ashr_9)
193         cmp     $7, %edi
194         je      L(ashr_8)
195         cmp     $6, %edi
196         je      L(ashr_7)
197         cmp     $5, %edi
198         je      L(ashr_6)
199         cmp     $4, %edi
200         je      L(ashr_5)
201         cmp     $3, %edi
202         je      L(ashr_4)
203         cmp     $2, %edi
204         je      L(ashr_3)
205         cmp     $1, %edi
206         je      L(ashr_2)
207         cmp     $0, %edi
208         je      L(ashr_1)
211  * The following cases will be handled by ashr_0
212  *  ecx(offset of esi)  eax(offset of edi)  relative offset  corresponding case
213  *        n(0~15)            n(0~15)           15(15+ n-n)         ashr_0
214  */
215         .p2align 4
216 L(ashr_0):
217         mov     $0xffff, %esi
218         movdqa  (%eax), %xmm1
219         pxor    %xmm0, %xmm0
220         pcmpeqb %xmm1, %xmm0
221         pcmpeqb (%edx), %xmm1
222         psubb   %xmm0, %xmm1
223         pmovmskb %xmm1, %edi
224         shr     %cl, %esi
225         shr     %cl, %edi
226         sub     %edi, %esi
227         mov     %ecx, %edi
228         jne     L(less32bytes)
229         UPDATE_STRNCMP_COUNTER
230         mov     $0x10, %ebx
231         mov     $0x10, %ecx
232         pxor    %xmm0, %xmm0
233         .p2align 4
234 L(loop_ashr_0):
235         movdqa  (%eax, %ecx), %xmm1
236         movdqa  (%edx, %ecx), %xmm2
238         pcmpeqb %xmm1, %xmm0
239         pcmpeqb %xmm2, %xmm1
240         psubb   %xmm0, %xmm1
241         pmovmskb %xmm1, %esi
242         sub     $0xffff, %esi
243         jnz     L(exit)
244 #ifdef USE_AS_STRNCMP
245         cmp     $16, %ebp
246         lea     -16(%ebp), %ebp
247         jbe     L(more8byteseq)
248 #endif
249         add     $16, %ecx
250         jmp     L(loop_ashr_0)
253  * The following cases will be handled by ashr_1
254  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
255  *        n(15)            n -15            0(15 +(n-15) - n)         ashr_1
256  */
257         .p2align 4
258 L(ashr_1):
259         mov     $0xffff, %esi
260         pxor    %xmm0, %xmm0
261         movdqa  (%edx), %xmm2
262         movdqa  (%eax), %xmm1
263         pcmpeqb %xmm1, %xmm0
264         pslldq  $15, %xmm2
265         pcmpeqb %xmm1, %xmm2
266         psubb   %xmm0, %xmm2
267         pmovmskb %xmm2, %edi
268         shr     %cl, %esi
269         shr     %cl, %edi
270         sub     %edi, %esi
271         lea     -15(%ecx), %edi
272         jnz     L(less32bytes)
274         UPDATE_STRNCMP_COUNTER
276         movdqa  (%edx), %xmm3
277         pxor    %xmm0, %xmm0
278         mov     $16, %ecx
279         or      $1, %ebx
280         lea     1(%edx), %edi
281         and     $0xfff, %edi
282         sub     $0x1000, %edi
284         .p2align 4
285 L(loop_ashr_1):
286         add     $16, %edi
287         jg      L(nibble_ashr_1)
289 L(gobble_ashr_1):
290         movdqa  (%eax, %ecx), %xmm1
291         movdqa  (%edx, %ecx), %xmm2
292         movdqa  %xmm2, %xmm4
294         palignr $1, %xmm3, %xmm2
296         pcmpeqb %xmm1, %xmm0
297         pcmpeqb %xmm2, %xmm1
298         psubb   %xmm0, %xmm1
299         pmovmskb %xmm1, %esi
300         sub     $0xffff, %esi
301         jnz     L(exit)
302 #ifdef USE_AS_STRNCMP
303         cmp     $16, %ebp
304         lea     -16(%ebp), %ebp
305         jbe     L(more8byteseq)
306 #endif
308         add     $16, %ecx
309         movdqa  %xmm4, %xmm3
311         add     $16, %edi
312         jg      L(nibble_ashr_1)
314         movdqa  (%eax, %ecx), %xmm1
315         movdqa  (%edx, %ecx), %xmm2
316         movdqa  %xmm2, %xmm4
318         palignr $1, %xmm3, %xmm2
320         pcmpeqb %xmm1, %xmm0
321         pcmpeqb %xmm2, %xmm1
322         psubb   %xmm0, %xmm1
323         pmovmskb %xmm1, %esi
324         sub     $0xffff, %esi
325         jnz     L(exit)
327 #ifdef USE_AS_STRNCMP
328         cmp     $16, %ebp
329         lea     -16(%ebp), %ebp
330         jbe     L(more8byteseq)
331 #endif
332         add     $16, %ecx
333         movdqa  %xmm4, %xmm3
334         jmp     L(loop_ashr_1)
336         .p2align 4
337 L(nibble_ashr_1):
338         pcmpeqb %xmm3, %xmm0
339         pmovmskb %xmm0, %esi
340         test    $0xfffe, %esi
341         jnz     L(ashr_1_exittail)
343 #ifdef USE_AS_STRNCMP
344         cmp     $15, %ebp
345         jbe     L(ashr_1_exittail)
346 #endif
347         pxor    %xmm0, %xmm0
348         sub     $0x1000, %edi
349         jmp     L(gobble_ashr_1)
351         .p2align 4
352 L(ashr_1_exittail):
353         movdqa  (%eax, %ecx), %xmm1
354         psrldq  $1, %xmm0
355         psrldq  $1, %xmm3
356         jmp     L(aftertail)
359  * The following cases will be handled by ashr_2
360  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
361  *        n(14~15)            n -14            1(15 +(n-14) - n)         ashr_2
362  */
363         .p2align 4
364 L(ashr_2):
365         mov     $0xffff, %esi
366         pxor    %xmm0, %xmm0
367         movdqa  (%edx), %xmm2
368         movdqa  (%eax), %xmm1
369         pcmpeqb %xmm1, %xmm0
370         pslldq  $14, %xmm2
371         pcmpeqb %xmm1, %xmm2
372         psubb   %xmm0, %xmm2
373         pmovmskb %xmm2, %edi
374         shr     %cl, %esi
375         shr     %cl, %edi
376         sub     %edi, %esi
377         lea     -14(%ecx), %edi
378         jnz     L(less32bytes)
380         UPDATE_STRNCMP_COUNTER
382         movdqa  (%edx), %xmm3
383         pxor    %xmm0, %xmm0
384         mov     $16, %ecx
385         or      $2, %ebx
386         lea     2(%edx), %edi
387         and     $0xfff, %edi
388         sub     $0x1000, %edi
390         .p2align 4
391 L(loop_ashr_2):
392         add     $16, %edi
393         jg      L(nibble_ashr_2)
395 L(gobble_ashr_2):
396         movdqa  (%eax, %ecx), %xmm1
397         movdqa  (%edx, %ecx), %xmm2
398         movdqa  %xmm2, %xmm4
400         palignr $2, %xmm3, %xmm2
402         pcmpeqb %xmm1, %xmm0
403         pcmpeqb %xmm2, %xmm1
404         psubb   %xmm0, %xmm1
405         pmovmskb %xmm1, %esi
406         sub     $0xffff, %esi
407         jnz     L(exit)
409 #ifdef USE_AS_STRNCMP
410         cmp     $16, %ebp
411         lea     -16(%ebp), %ebp
412         jbe     L(more8byteseq)
413 #endif
414         add     $16, %ecx
415         movdqa  %xmm4, %xmm3
417         add     $16, %edi
418         jg      L(nibble_ashr_2)
420         movdqa  (%eax, %ecx), %xmm1
421         movdqa  (%edx, %ecx), %xmm2
422         movdqa  %xmm2, %xmm4
424         palignr $2, %xmm3, %xmm2
426         pcmpeqb %xmm1, %xmm0
427         pcmpeqb %xmm2, %xmm1
428         psubb   %xmm0, %xmm1
429         pmovmskb %xmm1, %esi
430         sub     $0xffff, %esi
431         jnz     L(exit)
433 #ifdef USE_AS_STRNCMP
434         cmp     $16, %ebp
435         lea     -16(%ebp), %ebp
436         jbe     L(more8byteseq)
437 #endif
438         add     $16, %ecx
439         movdqa  %xmm4, %xmm3
440         jmp     L(loop_ashr_2)
442         .p2align 4
443 L(nibble_ashr_2):
444         pcmpeqb %xmm3, %xmm0
445         pmovmskb %xmm0, %esi
446         test    $0xfffc, %esi
447         jnz     L(ashr_2_exittail)
449 #ifdef USE_AS_STRNCMP
450         cmp     $14, %ebp
451         jbe     L(ashr_2_exittail)
452 #endif
454         pxor    %xmm0, %xmm0
455         sub     $0x1000, %edi
456         jmp     L(gobble_ashr_2)
458         .p2align 4
459 L(ashr_2_exittail):
460         movdqa  (%eax, %ecx), %xmm1
461         psrldq  $2, %xmm0
462         psrldq  $2, %xmm3
463         jmp     L(aftertail)
466  * The following cases will be handled by ashr_3
467  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
468  *        n(13~15)            n -13            2(15 +(n-13) - n)         ashr_3
469  */
470         .p2align 4
471 L(ashr_3):
472         mov     $0xffff, %esi
473         pxor    %xmm0, %xmm0
474         movdqa  (%edx), %xmm2
475         movdqa  (%eax), %xmm1
476         pcmpeqb %xmm1, %xmm0
477         pslldq  $13, %xmm2
478         pcmpeqb %xmm1, %xmm2
479         psubb   %xmm0, %xmm2
480         pmovmskb %xmm2, %edi
481         shr     %cl, %esi
482         shr     %cl, %edi
483         sub     %edi, %esi
484         lea     -13(%ecx), %edi
485         jnz     L(less32bytes)
487         UPDATE_STRNCMP_COUNTER
489         movdqa  (%edx), %xmm3
490         pxor    %xmm0, %xmm0
491         mov     $16, %ecx
492         or      $3, %ebx
493         lea     3(%edx), %edi
494         and     $0xfff, %edi
495         sub     $0x1000, %edi
497         .p2align 4
498 L(loop_ashr_3):
499         add     $16, %edi
500         jg      L(nibble_ashr_3)
502 L(gobble_ashr_3):
503         movdqa  (%eax, %ecx), %xmm1
504         movdqa  (%edx, %ecx), %xmm2
505         movdqa  %xmm2, %xmm4
507         palignr $3, %xmm3, %xmm2
509         pcmpeqb %xmm1, %xmm0
510         pcmpeqb %xmm2, %xmm1
511         psubb   %xmm0, %xmm1
512         pmovmskb %xmm1, %esi
513         sub     $0xffff, %esi
514         jnz     L(exit)
516 #ifdef USE_AS_STRNCMP
517         cmp     $16, %ebp
518         lea     -16(%ebp), %ebp
519         jbe     L(more8byteseq)
520 #endif
521         add     $16, %ecx
522         movdqa  %xmm4, %xmm3
524         add     $16, %edi
525         jg      L(nibble_ashr_3)
527         movdqa  (%eax, %ecx), %xmm1
528         movdqa  (%edx, %ecx), %xmm2
529         movdqa  %xmm2, %xmm4
531         palignr $3, %xmm3, %xmm2
533         pcmpeqb %xmm1, %xmm0
534         pcmpeqb %xmm2, %xmm1
535         psubb   %xmm0, %xmm1
536         pmovmskb %xmm1, %esi
537         sub     $0xffff, %esi
538         jnz     L(exit)
540 #ifdef USE_AS_STRNCMP
541         cmp     $16, %ebp
542         lea     -16(%ebp), %ebp
543         jbe     L(more8byteseq)
544 #endif
545         add     $16, %ecx
546         movdqa  %xmm4, %xmm3
547         jmp     L(loop_ashr_3)
549         .p2align 4
550 L(nibble_ashr_3):
551         pcmpeqb %xmm3, %xmm0
552         pmovmskb %xmm0, %esi
553         test    $0xfff8, %esi
554         jnz     L(ashr_3_exittail)
556 #ifdef USE_AS_STRNCMP
557         cmp     $13, %ebp
558         jbe     L(ashr_3_exittail)
559 #endif
560         pxor    %xmm0, %xmm0
561         sub     $0x1000, %edi
562         jmp     L(gobble_ashr_3)
564         .p2align 4
565 L(ashr_3_exittail):
566         movdqa  (%eax, %ecx), %xmm1
567         psrldq  $3, %xmm0
568         psrldq  $3, %xmm3
569         jmp     L(aftertail)
572  * The following cases will be handled by ashr_4
573  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
574  *        n(12~15)            n -12            3(15 +(n-12) - n)         ashr_4
575  */
576         .p2align 4
577 L(ashr_4):
578         mov     $0xffff, %esi
579         pxor    %xmm0, %xmm0
580         movdqa  (%edx), %xmm2
581         movdqa  (%eax), %xmm1
582         pcmpeqb %xmm1, %xmm0
583         pslldq  $12, %xmm2
584         pcmpeqb %xmm1, %xmm2
585         psubb   %xmm0, %xmm2
586         pmovmskb %xmm2, %edi
587         shr     %cl, %esi
588         shr     %cl, %edi
589         sub     %edi, %esi
590         lea     -12(%ecx), %edi
591         jnz     L(less32bytes)
593         UPDATE_STRNCMP_COUNTER
595         movdqa  (%edx), %xmm3
596         pxor    %xmm0, %xmm0
597         mov     $16, %ecx
598         or      $4, %ebx
599         lea     4(%edx), %edi
600         and     $0xfff, %edi
601         sub     $0x1000, %edi
603         .p2align 4
604 L(loop_ashr_4):
605         add     $16, %edi
606         jg      L(nibble_ashr_4)
608 L(gobble_ashr_4):
609         movdqa  (%eax, %ecx), %xmm1
610         movdqa  (%edx, %ecx), %xmm2
611         movdqa  %xmm2, %xmm4
613         palignr $4, %xmm3, %xmm2
615         pcmpeqb %xmm1, %xmm0
616         pcmpeqb %xmm2, %xmm1
617         psubb   %xmm0, %xmm1
618         pmovmskb %xmm1, %esi
619         sub     $0xffff, %esi
620         jnz     L(exit)
622 #ifdef USE_AS_STRNCMP
623         cmp     $16, %ebp
624         lea     -16(%ebp), %ebp
625         jbe     L(more8byteseq)
626 #endif
628         add     $16, %ecx
629         movdqa  %xmm4, %xmm3
631         add     $16, %edi
632         jg      L(nibble_ashr_4)
634         movdqa  (%eax, %ecx), %xmm1
635         movdqa  (%edx, %ecx), %xmm2
636         movdqa  %xmm2, %xmm4
638         palignr $4, %xmm3, %xmm2
640         pcmpeqb %xmm1, %xmm0
641         pcmpeqb %xmm2, %xmm1
642         psubb   %xmm0, %xmm1
643         pmovmskb %xmm1, %esi
644         sub     $0xffff, %esi
645         jnz     L(exit)
647 #ifdef USE_AS_STRNCMP
648         cmp     $16, %ebp
649         lea     -16(%ebp), %ebp
650         jbe     L(more8byteseq)
651 #endif
653         add     $16, %ecx
654         movdqa  %xmm4, %xmm3
655         jmp     L(loop_ashr_4)
657         .p2align 4
658 L(nibble_ashr_4):
659         pcmpeqb %xmm3, %xmm0
660         pmovmskb %xmm0, %esi
661         test    $0xfff0, %esi
662         jnz     L(ashr_4_exittail)
664 #ifdef USE_AS_STRNCMP
665         cmp     $12, %ebp
666         jbe     L(ashr_4_exittail)
667 #endif
669         pxor    %xmm0, %xmm0
670         sub     $0x1000, %edi
671         jmp     L(gobble_ashr_4)
673         .p2align 4
674 L(ashr_4_exittail):
675         movdqa  (%eax, %ecx), %xmm1
676         psrldq  $4, %xmm0
677         psrldq  $4, %xmm3
678         jmp     L(aftertail)
681  * The following cases will be handled by ashr_5
682  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
683  *        n(11~15)            n -11            4(15 +(n-11) - n)         ashr_5
684  */
685         .p2align 4
686 L(ashr_5):
687         mov     $0xffff, %esi
688         pxor    %xmm0, %xmm0
689         movdqa  (%edx), %xmm2
690         movdqa  (%eax), %xmm1
691         pcmpeqb %xmm1, %xmm0
692         pslldq  $11, %xmm2
693         pcmpeqb %xmm1, %xmm2
694         psubb   %xmm0, %xmm2
695         pmovmskb %xmm2, %edi
696         shr     %cl, %esi
697         shr     %cl, %edi
698         sub     %edi, %esi
699         lea     -11(%ecx), %edi
700         jnz     L(less32bytes)
702         UPDATE_STRNCMP_COUNTER
704         movdqa  (%edx), %xmm3
705         pxor    %xmm0, %xmm0
706         mov     $16, %ecx
707         or      $5, %ebx
708         lea     5(%edx), %edi
709         and     $0xfff, %edi
710         sub     $0x1000, %edi
712         .p2align 4
713 L(loop_ashr_5):
714         add     $16, %edi
715         jg      L(nibble_ashr_5)
717 L(gobble_ashr_5):
718         movdqa  (%eax, %ecx), %xmm1
719         movdqa  (%edx, %ecx), %xmm2
720         movdqa  %xmm2, %xmm4
722         palignr $5, %xmm3, %xmm2
724         pcmpeqb %xmm1, %xmm0
725         pcmpeqb %xmm2, %xmm1
726         psubb   %xmm0, %xmm1
727         pmovmskb %xmm1, %esi
728         sub     $0xffff, %esi
729         jnz     L(exit)
731 #ifdef USE_AS_STRNCMP
732         cmp     $16, %ebp
733         lea     -16(%ebp), %ebp
734         jbe     L(more8byteseq)
735 #endif
736         add     $16, %ecx
737         movdqa  %xmm4, %xmm3
739         add     $16, %edi
740         jg      L(nibble_ashr_5)
742         movdqa  (%eax, %ecx), %xmm1
743         movdqa  (%edx, %ecx), %xmm2
744         movdqa  %xmm2, %xmm4
746         palignr $5, %xmm3, %xmm2
748         pcmpeqb %xmm1, %xmm0
749         pcmpeqb %xmm2, %xmm1
750         psubb   %xmm0, %xmm1
751         pmovmskb %xmm1, %esi
752         sub     $0xffff, %esi
753         jnz     L(exit)
755 #ifdef USE_AS_STRNCMP
756         cmp     $16, %ebp
757         lea     -16(%ebp), %ebp
758         jbe     L(more8byteseq)
759 #endif
760         add     $16, %ecx
761         movdqa  %xmm4, %xmm3
762         jmp     L(loop_ashr_5)
764         .p2align 4
765 L(nibble_ashr_5):
766         pcmpeqb %xmm3, %xmm0
767         pmovmskb %xmm0, %esi
768         test    $0xffe0, %esi
769         jnz     L(ashr_5_exittail)
771 #ifdef USE_AS_STRNCMP
772         cmp     $11, %ebp
773         jbe     L(ashr_5_exittail)
774 #endif
775         pxor    %xmm0, %xmm0
776         sub     $0x1000, %edi
777         jmp     L(gobble_ashr_5)
779         .p2align 4
780 L(ashr_5_exittail):
781         movdqa  (%eax, %ecx), %xmm1
782         psrldq  $5, %xmm0
783         psrldq  $5, %xmm3
784         jmp     L(aftertail)
787  * The following cases will be handled by ashr_6
788  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
789  *        n(10~15)            n -10            5(15 +(n-10) - n)         ashr_6
790  */
792         .p2align 4
793 L(ashr_6):
794         mov     $0xffff, %esi
795         pxor    %xmm0, %xmm0
796         movdqa  (%edx), %xmm2
797         movdqa  (%eax), %xmm1
798         pcmpeqb %xmm1, %xmm0
799         pslldq  $10, %xmm2
800         pcmpeqb %xmm1, %xmm2
801         psubb   %xmm0, %xmm2
802         pmovmskb %xmm2, %edi
803         shr     %cl, %esi
804         shr     %cl, %edi
805         sub     %edi, %esi
806         lea     -10(%ecx), %edi
807         jnz     L(less32bytes)
809         UPDATE_STRNCMP_COUNTER
811         movdqa  (%edx), %xmm3
812         pxor    %xmm0, %xmm0
813         mov     $16, %ecx
814         or      $6, %ebx
815         lea     6(%edx), %edi
816         and     $0xfff, %edi
817         sub     $0x1000, %edi
819         .p2align 4
820 L(loop_ashr_6):
821         add     $16, %edi
822         jg      L(nibble_ashr_6)
824 L(gobble_ashr_6):
825         movdqa  (%eax, %ecx), %xmm1
826         movdqa  (%edx, %ecx), %xmm2
827         movdqa  %xmm2, %xmm4
829         palignr $6, %xmm3, %xmm2
831         pcmpeqb %xmm1, %xmm0
832         pcmpeqb %xmm2, %xmm1
833         psubb   %xmm0, %xmm1
834         pmovmskb %xmm1, %esi
835         sub     $0xffff, %esi
836         jnz     L(exit)
838 #ifdef USE_AS_STRNCMP
839         cmp     $16, %ebp
840         lea     -16(%ebp), %ebp
841         jbe     L(more8byteseq)
842 #endif
844         add     $16, %ecx
845         movdqa  %xmm4, %xmm3
847         add     $16, %edi
848         jg      L(nibble_ashr_6)
850         movdqa  (%eax, %ecx), %xmm1
851         movdqa  (%edx, %ecx), %xmm2
852         movdqa  %xmm2, %xmm4
854         palignr $6, %xmm3, %xmm2
856         pcmpeqb %xmm1, %xmm0
857         pcmpeqb %xmm2, %xmm1
858         psubb   %xmm0, %xmm1
859         pmovmskb %xmm1, %esi
860         sub     $0xffff, %esi
861         jnz     L(exit)
862 #ifdef USE_AS_STRNCMP
863         cmp     $16, %ebp
864         lea     -16(%ebp), %ebp
865         jbe     L(more8byteseq)
866 #endif
868         add     $16, %ecx
869         movdqa  %xmm4, %xmm3
870         jmp     L(loop_ashr_6)
872         .p2align 4
873 L(nibble_ashr_6):
874         pcmpeqb %xmm3, %xmm0
875         pmovmskb %xmm0, %esi
876         test    $0xffc0, %esi
877         jnz     L(ashr_6_exittail)
879 #ifdef USE_AS_STRNCMP
880         cmp     $10, %ebp
881         jbe     L(ashr_6_exittail)
882 #endif
883         pxor    %xmm0, %xmm0
884         sub     $0x1000, %edi
885         jmp     L(gobble_ashr_6)
887         .p2align 4
888 L(ashr_6_exittail):
889         movdqa  (%eax, %ecx), %xmm1
890         psrldq  $6, %xmm0
891         psrldq  $6, %xmm3
892         jmp     L(aftertail)
895  * The following cases will be handled by ashr_7
896  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
897  *        n(9~15)            n - 9            6(15 +(n-9) - n)         ashr_7
898  */
900         .p2align 4
901 L(ashr_7):
902         mov     $0xffff, %esi
903         pxor    %xmm0, %xmm0
904         movdqa  (%edx), %xmm2
905         movdqa  (%eax), %xmm1
906         pcmpeqb %xmm1, %xmm0
907         pslldq  $9, %xmm2
908         pcmpeqb %xmm1, %xmm2
909         psubb   %xmm0, %xmm2
910         pmovmskb %xmm2, %edi
911         shr     %cl, %esi
912         shr     %cl, %edi
913         sub     %edi, %esi
914         lea     -9(%ecx), %edi
915         jnz     L(less32bytes)
917         UPDATE_STRNCMP_COUNTER
919         movdqa  (%edx), %xmm3
920         pxor    %xmm0, %xmm0
921         mov     $16, %ecx
922         or      $7, %ebx
923         lea     8(%edx), %edi
924         and     $0xfff, %edi
925         sub     $0x1000, %edi
927         .p2align 4
928 L(loop_ashr_7):
929         add     $16, %edi
930         jg      L(nibble_ashr_7)
932 L(gobble_ashr_7):
933         movdqa  (%eax, %ecx), %xmm1
934         movdqa  (%edx, %ecx), %xmm2
935         movdqa  %xmm2, %xmm4
937         palignr $7, %xmm3, %xmm2
939         pcmpeqb %xmm1, %xmm0
940         pcmpeqb %xmm2, %xmm1
941         psubb   %xmm0, %xmm1
942         pmovmskb %xmm1, %esi
943         sub     $0xffff, %esi
944         jnz     L(exit)
946 #ifdef USE_AS_STRNCMP
947         cmp     $16, %ebp
948         lea     -16(%ebp), %ebp
949         jbe     L(more8byteseq)
950 #endif
952         add     $16, %ecx
953         movdqa  %xmm4, %xmm3
955         add     $16, %edi
956         jg      L(nibble_ashr_7)
958         movdqa  (%eax, %ecx), %xmm1
959         movdqa  (%edx, %ecx), %xmm2
960         movdqa  %xmm2, %xmm4
962         palignr $7, %xmm3, %xmm2
964         pcmpeqb %xmm1, %xmm0
965         pcmpeqb %xmm2, %xmm1
966         psubb   %xmm0, %xmm1
967         pmovmskb %xmm1, %esi
968         sub     $0xffff, %esi
969         jnz     L(exit)
971 #ifdef USE_AS_STRNCMP
972         cmp     $16, %ebp
973         lea     -16(%ebp), %ebp
974         jbe     L(more8byteseq)
975 #endif
977         add     $16, %ecx
978         movdqa  %xmm4, %xmm3
979         jmp     L(loop_ashr_7)
981         .p2align 4
982 L(nibble_ashr_7):
983         pcmpeqb %xmm3, %xmm0
984         pmovmskb %xmm0, %esi
985         test    $0xff80, %esi
986         jnz     L(ashr_7_exittail)
988 #ifdef USE_AS_STRNCMP
989         cmp     $9, %ebp
990         jbe     L(ashr_7_exittail)
991 #endif
992         pxor    %xmm0, %xmm0
993         pxor    %xmm0, %xmm0
994         sub     $0x1000, %edi
995         jmp     L(gobble_ashr_7)
997         .p2align 4
998 L(ashr_7_exittail):
999         movdqa  (%eax, %ecx), %xmm1
1000         psrldq  $7, %xmm0
1001         psrldq  $7, %xmm3
1002         jmp     L(aftertail)
1005  * The following cases will be handled by ashr_8
1006  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1007  *        n(8~15)            n - 8            7(15 +(n-8) - n)         ashr_8
1008  */
1009         .p2align 4
1010 L(ashr_8):
1011         mov     $0xffff, %esi
1012         pxor    %xmm0, %xmm0
1013         movdqa  (%edx), %xmm2
1014         movdqa  (%eax), %xmm1
1015         pcmpeqb %xmm1, %xmm0
1016         pslldq  $8, %xmm2
1017         pcmpeqb %xmm1, %xmm2
1018         psubb   %xmm0, %xmm2
1019         pmovmskb %xmm2, %edi
1020         shr     %cl, %esi
1021         shr     %cl, %edi
1022         sub     %edi, %esi
1023         lea     -8(%ecx), %edi
1024         jnz     L(less32bytes)
1026         UPDATE_STRNCMP_COUNTER
1028         movdqa  (%edx), %xmm3
1029         pxor    %xmm0, %xmm0
1030         mov     $16, %ecx
1031         or      $8, %ebx
1032         lea     8(%edx), %edi
1033         and     $0xfff, %edi
1034         sub     $0x1000, %edi
1036         .p2align 4
1037 L(loop_ashr_8):
1038         add     $16, %edi
1039         jg      L(nibble_ashr_8)
1041 L(gobble_ashr_8):
1042         movdqa  (%eax, %ecx), %xmm1
1043         movdqa  (%edx, %ecx), %xmm2
1044         movdqa  %xmm2, %xmm4
1046         palignr $8, %xmm3, %xmm2
1048         pcmpeqb %xmm1, %xmm0
1049         pcmpeqb %xmm2, %xmm1
1050         psubb   %xmm0, %xmm1
1051         pmovmskb %xmm1, %esi
1052         sub     $0xffff, %esi
1053         jnz     L(exit)
1055 #ifdef USE_AS_STRNCMP
1056         cmp     $16, %ebp
1057         lea     -16(%ebp), %ebp
1058         jbe     L(more8byteseq)
1059 #endif
1060         add     $16, %ecx
1061         movdqa  %xmm4, %xmm3
1063         add     $16, %edi
1064         jg      L(nibble_ashr_8)
1066         movdqa  (%eax, %ecx), %xmm1
1067         movdqa  (%edx, %ecx), %xmm2
1068         movdqa  %xmm2, %xmm4
1070         palignr $8, %xmm3, %xmm2
1072         pcmpeqb %xmm1, %xmm0
1073         pcmpeqb %xmm2, %xmm1
1074         psubb   %xmm0, %xmm1
1075         pmovmskb %xmm1, %esi
1076         sub     $0xffff, %esi
1077         jnz     L(exit)
1079 #ifdef USE_AS_STRNCMP
1080         cmp     $16, %ebp
1081         lea     -16(%ebp), %ebp
1082         jbe     L(more8byteseq)
1083 #endif
1084         add     $16, %ecx
1085         movdqa  %xmm4, %xmm3
1086         jmp     L(loop_ashr_8)
1088         .p2align 4
1089 L(nibble_ashr_8):
1090         pcmpeqb %xmm3, %xmm0
1091         pmovmskb %xmm0, %esi
1092         test    $0xff00, %esi
1093         jnz     L(ashr_8_exittail)
1095 #ifdef USE_AS_STRNCMP
1096         cmp     $8, %ebp
1097         jbe     L(ashr_8_exittail)
1098 #endif
1099         pxor    %xmm0, %xmm0
1100         pxor    %xmm0, %xmm0
1101         sub     $0x1000, %edi
1102         jmp     L(gobble_ashr_8)
1104         .p2align 4
1105 L(ashr_8_exittail):
1106         movdqa  (%eax, %ecx), %xmm1
1107         psrldq  $8, %xmm0
1108         psrldq  $8, %xmm3
1109         jmp     L(aftertail)
1112  * The following cases will be handled by ashr_9
1113  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1114  *        n(7~15)            n - 7            8(15 +(n-7) - n)         ashr_9
1115  */
1116         .p2align 4
1117 L(ashr_9):
1118         mov     $0xffff, %esi
1119         pxor    %xmm0, %xmm0
1120         movdqa  (%edx), %xmm2
1121         movdqa  (%eax), %xmm1
1122         pcmpeqb %xmm1, %xmm0
1123         pslldq  $7, %xmm2
1124         pcmpeqb %xmm1, %xmm2
1125         psubb   %xmm0, %xmm2
1126         pmovmskb %xmm2, %edi
1127         shr     %cl, %esi
1128         shr     %cl, %edi
1129         sub     %edi, %esi
1130         lea     -7(%ecx), %edi
1131         jnz     L(less32bytes)
1133         UPDATE_STRNCMP_COUNTER
1135         movdqa  (%edx), %xmm3
1136         pxor    %xmm0, %xmm0
1137         mov     $16, %ecx
1138         or      $9, %ebx
1139         lea     9(%edx), %edi
1140         and     $0xfff, %edi
1141         sub     $0x1000, %edi
1143         .p2align 4
1144 L(loop_ashr_9):
1145         add     $16, %edi
1146         jg      L(nibble_ashr_9)
1148 L(gobble_ashr_9):
1149         movdqa  (%eax, %ecx), %xmm1
1150         movdqa  (%edx, %ecx), %xmm2
1151         movdqa  %xmm2, %xmm4
1153         palignr $9, %xmm3, %xmm2
1155         pcmpeqb %xmm1, %xmm0
1156         pcmpeqb %xmm2, %xmm1
1157         psubb   %xmm0, %xmm1
1158         pmovmskb %xmm1, %esi
1159         sub     $0xffff, %esi
1160         jnz     L(exit)
1162 #ifdef USE_AS_STRNCMP
1163         cmp     $16, %ebp
1164         lea     -16(%ebp), %ebp
1165         jbe     L(more8byteseq)
1166 #endif
1167         add     $16, %ecx
1168         movdqa  %xmm4, %xmm3
1170         add     $16, %edi
1171         jg      L(nibble_ashr_9)
1173         movdqa  (%eax, %ecx), %xmm1
1174         movdqa  (%edx, %ecx), %xmm2
1175         movdqa  %xmm2, %xmm4
1177         palignr $9, %xmm3, %xmm2
1179         pcmpeqb %xmm1, %xmm0
1180         pcmpeqb %xmm2, %xmm1
1181         psubb   %xmm0, %xmm1
1182         pmovmskb %xmm1, %esi
1183         sub     $0xffff, %esi
1184         jnz     L(exit)
1186 #ifdef USE_AS_STRNCMP
1187         cmp     $16, %ebp
1188         lea     -16(%ebp), %ebp
1189         jbe     L(more8byteseq)
1190 #endif
1191         add     $16, %ecx
1192         movdqa  %xmm4, %xmm3
1193         jmp     L(loop_ashr_9)
1195         .p2align 4
1196 L(nibble_ashr_9):
1197         pcmpeqb %xmm3, %xmm0
1198         pmovmskb %xmm0, %esi
1199         test    $0xfe00, %esi
1200         jnz     L(ashr_9_exittail)
1202 #ifdef USE_AS_STRNCMP
1203         cmp     $7, %ebp
1204         jbe     L(ashr_9_exittail)
1205 #endif
1206         pxor    %xmm0, %xmm0
1207         sub     $0x1000, %edi
1208         jmp     L(gobble_ashr_9)
1210         .p2align 4
1211 L(ashr_9_exittail):
1212         movdqa  (%eax, %ecx), %xmm1
1213         psrldq  $9, %xmm0
1214         psrldq  $9, %xmm3
1215         jmp     L(aftertail)
1218  * The following cases will be handled by ashr_10
1219  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1220  *        n(6~15)            n - 6            9(15 +(n-6) - n)         ashr_10
1221  */
1222         .p2align 4
1223 L(ashr_10):
1224         mov     $0xffff, %esi
1225         pxor    %xmm0, %xmm0
1226         movdqa  (%edx), %xmm2
1227         movdqa  (%eax), %xmm1
1228         pcmpeqb %xmm1, %xmm0
1229         pslldq  $6, %xmm2
1230         pcmpeqb %xmm1, %xmm2
1231         psubb   %xmm0, %xmm2
1232         pmovmskb %xmm2, %edi
1233         shr     %cl, %esi
1234         shr     %cl, %edi
1235         sub     %edi, %esi
1236         lea     -6(%ecx), %edi
1237         jnz     L(less32bytes)
1239         UPDATE_STRNCMP_COUNTER
1241         movdqa  (%edx), %xmm3
1242         pxor    %xmm0, %xmm0
1243         mov     $16, %ecx
1244         or      $10, %ebx
1245         lea     10(%edx), %edi
1246         and     $0xfff, %edi
1247         sub     $0x1000, %edi
1249         .p2align 4
1250 L(loop_ashr_10):
1251         add     $16, %edi
1252         jg      L(nibble_ashr_10)
1254 L(gobble_ashr_10):
1255         movdqa  (%eax, %ecx), %xmm1
1256         movdqa  (%edx, %ecx), %xmm2
1257         movdqa  %xmm2, %xmm4
1259         palignr $10, %xmm3, %xmm2
1261         pcmpeqb %xmm1, %xmm0
1262         pcmpeqb %xmm2, %xmm1
1263         psubb   %xmm0, %xmm1
1264         pmovmskb %xmm1, %esi
1265         sub     $0xffff, %esi
1266         jnz     L(exit)
1268 #ifdef USE_AS_STRNCMP
1269         cmp     $16, %ebp
1270         lea     -16(%ebp), %ebp
1271         jbe     L(more8byteseq)
1272 #endif
1273         add     $16, %ecx
1274         movdqa  %xmm4, %xmm3
1276         add     $16, %edi
1277         jg      L(nibble_ashr_10)
1279         movdqa  (%eax, %ecx), %xmm1
1280         movdqa  (%edx, %ecx), %xmm2
1281         movdqa  %xmm2, %xmm4
1283         palignr $10, %xmm3, %xmm2
1285         pcmpeqb %xmm1, %xmm0
1286         pcmpeqb %xmm2, %xmm1
1287         psubb   %xmm0, %xmm1
1288         pmovmskb %xmm1, %esi
1289         sub     $0xffff, %esi
1290         jnz     L(exit)
1292 #ifdef USE_AS_STRNCMP
1293         cmp     $16, %ebp
1294         lea     -16(%ebp), %ebp
1295         jbe     L(more8byteseq)
1296 #endif
1297         add     $16, %ecx
1298         movdqa  %xmm4, %xmm3
1299         jmp     L(loop_ashr_10)
1301         .p2align 4
1302 L(nibble_ashr_10):
1303         pcmpeqb %xmm3, %xmm0
1304         pmovmskb %xmm0, %esi
1305         test    $0xfc00, %esi
1306         jnz     L(ashr_10_exittail)
1308 #ifdef USE_AS_STRNCMP
1309         cmp     $6, %ebp
1310         jbe     L(ashr_10_exittail)
1311 #endif
1312         pxor    %xmm0, %xmm0
1313         sub     $0x1000, %edi
1314         jmp     L(gobble_ashr_10)
1316         .p2align 4
1317 L(ashr_10_exittail):
1318         movdqa  (%eax, %ecx), %xmm1
1319         psrldq  $10, %xmm0
1320         psrldq  $10, %xmm3
1321         jmp     L(aftertail)
1324  * The following cases will be handled by ashr_11
1325  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1326  *        n(5~15)            n - 5            10(15 +(n-5) - n)         ashr_11
1327  */
1328         .p2align 4
1329 L(ashr_11):
1330         mov     $0xffff, %esi
1331         pxor    %xmm0, %xmm0
1332         movdqa  (%edx), %xmm2
1333         movdqa  (%eax), %xmm1
1334         pcmpeqb %xmm1, %xmm0
1335         pslldq  $5, %xmm2
1336         pcmpeqb %xmm1, %xmm2
1337         psubb   %xmm0, %xmm2
1338         pmovmskb %xmm2, %edi
1339         shr     %cl, %esi
1340         shr     %cl, %edi
1341         sub     %edi, %esi
1342         lea     -5(%ecx), %edi
1343         jnz     L(less32bytes)
1345         UPDATE_STRNCMP_COUNTER
1347         movdqa  (%edx), %xmm3
1348         pxor    %xmm0, %xmm0
1349         mov     $16, %ecx
1350         or      $11, %ebx
1351         lea     11(%edx), %edi
1352         and     $0xfff, %edi
1353         sub     $0x1000, %edi
1355         .p2align 4
1356 L(loop_ashr_11):
1357         add     $16, %edi
1358         jg      L(nibble_ashr_11)
1360 L(gobble_ashr_11):
1361         movdqa  (%eax, %ecx), %xmm1
1362         movdqa  (%edx, %ecx), %xmm2
1363         movdqa  %xmm2, %xmm4
1365         palignr $11, %xmm3, %xmm2
1367         pcmpeqb %xmm1, %xmm0
1368         pcmpeqb %xmm2, %xmm1
1369         psubb   %xmm0, %xmm1
1370         pmovmskb %xmm1, %esi
1371         sub     $0xffff, %esi
1372         jnz     L(exit)
1374 #ifdef USE_AS_STRNCMP
1375         cmp     $16, %ebp
1376         lea     -16(%ebp), %ebp
1377         jbe     L(more8byteseq)
1378 #endif
1379         add     $16, %ecx
1380         movdqa  %xmm4, %xmm3
1382         add     $16, %edi
1383         jg      L(nibble_ashr_11)
1385         movdqa  (%eax, %ecx), %xmm1
1386         movdqa  (%edx, %ecx), %xmm2
1387         movdqa  %xmm2, %xmm4
1389         palignr $11, %xmm3, %xmm2
1391         pcmpeqb %xmm1, %xmm0
1392         pcmpeqb %xmm2, %xmm1
1393         psubb   %xmm0, %xmm1
1394         pmovmskb %xmm1, %esi
1395         sub     $0xffff, %esi
1396         jnz     L(exit)
1398 #ifdef USE_AS_STRNCMP
1399         cmp     $16, %ebp
1400         lea     -16(%ebp), %ebp
1401         jbe     L(more8byteseq)
1402 #endif
1403         add     $16, %ecx
1404         movdqa  %xmm4, %xmm3
1405         jmp     L(loop_ashr_11)
1407         .p2align 4
1408 L(nibble_ashr_11):
1409         pcmpeqb %xmm3, %xmm0
1410         pmovmskb %xmm0, %esi
1411         test    $0xf800, %esi
1412         jnz     L(ashr_11_exittail)
1414 #ifdef USE_AS_STRNCMP
1415         cmp     $5, %ebp
1416         jbe     L(ashr_11_exittail)
1417 #endif
1418         pxor    %xmm0, %xmm0
1419         sub     $0x1000, %edi
1420         jmp     L(gobble_ashr_11)
1422         .p2align 4
1423 L(ashr_11_exittail):
1424         movdqa  (%eax, %ecx), %xmm1
1425         psrldq  $11, %xmm0
1426         psrldq  $11, %xmm3
1427         jmp     L(aftertail)
1430  * The following cases will be handled by ashr_12
1431  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1432  *        n(4~15)            n - 4            11(15 +(n-4) - n)         ashr_12
1433  */
1434         .p2align 4
1435 L(ashr_12):
1436         mov     $0xffff, %esi
1437         pxor    %xmm0, %xmm0
1438         movdqa  (%edx), %xmm2
1439         movdqa  (%eax), %xmm1
1440         pcmpeqb %xmm1, %xmm0
1441         pslldq  $4, %xmm2
1442         pcmpeqb %xmm1, %xmm2
1443         psubb   %xmm0, %xmm2
1444         pmovmskb %xmm2, %edi
1445         shr     %cl, %esi
1446         shr     %cl, %edi
1447         sub     %edi, %esi
1448         lea     -4(%ecx), %edi
1449         jnz     L(less32bytes)
1451         UPDATE_STRNCMP_COUNTER
1453         movdqa  (%edx), %xmm3
1454         pxor    %xmm0, %xmm0
1455         mov     $16, %ecx
1456         or      $12, %ebx
1457         lea     12(%edx), %edi
1458         and     $0xfff, %edi
1459         sub     $0x1000, %edi
1461         .p2align 4
1462 L(loop_ashr_12):
1463         add     $16, %edi
1464         jg      L(nibble_ashr_12)
1466 L(gobble_ashr_12):
1467         movdqa  (%eax, %ecx), %xmm1
1468         movdqa  (%edx, %ecx), %xmm2
1469         movdqa  %xmm2, %xmm4
1471         palignr $12, %xmm3, %xmm2
1473         pcmpeqb %xmm1, %xmm0
1474         pcmpeqb %xmm2, %xmm1
1475         psubb   %xmm0, %xmm1
1476         pmovmskb %xmm1, %esi
1477         sub     $0xffff, %esi
1478         jnz     L(exit)
1480 #ifdef USE_AS_STRNCMP
1481         cmp     $16, %ebp
1482         lea     -16(%ebp), %ebp
1483         jbe     L(more8byteseq)
1484 #endif
1486         add     $16, %ecx
1487         movdqa  %xmm4, %xmm3
1489         add     $16, %edi
1490         jg      L(nibble_ashr_12)
1492         movdqa  (%eax, %ecx), %xmm1
1493         movdqa  (%edx, %ecx), %xmm2
1494         movdqa  %xmm2, %xmm4
1496         palignr $12, %xmm3, %xmm2
1498         pcmpeqb %xmm1, %xmm0
1499         pcmpeqb %xmm2, %xmm1
1500         psubb   %xmm0, %xmm1
1501         pmovmskb %xmm1, %esi
1502         sub     $0xffff, %esi
1503         jnz     L(exit)
1505 #ifdef USE_AS_STRNCMP
1506         cmp     $16, %ebp
1507         lea     -16(%ebp), %ebp
1508         jbe     L(more8byteseq)
1509 #endif
1510         add     $16, %ecx
1511         movdqa  %xmm4, %xmm3
1512         jmp     L(loop_ashr_12)
1514         .p2align 4
1515 L(nibble_ashr_12):
1516         pcmpeqb %xmm3, %xmm0
1517         pmovmskb %xmm0, %esi
1518         test    $0xf000, %esi
1519         jnz     L(ashr_12_exittail)
1521 #ifdef USE_AS_STRNCMP
1522         cmp     $4, %ebp
1523         jbe     L(ashr_12_exittail)
1524 #endif
1525         pxor    %xmm0, %xmm0
1526         sub     $0x1000, %edi
1527         jmp     L(gobble_ashr_12)
1529         .p2align 4
1530 L(ashr_12_exittail):
1531         movdqa  (%eax, %ecx), %xmm1
1532         psrldq  $12, %xmm0
1533         psrldq  $12, %xmm3
1534         jmp     L(aftertail)
1537  * The following cases will be handled by ashr_13
1538  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1539  *        n(3~15)            n - 3            12(15 +(n-3) - n)         ashr_13
1540  */
1541         .p2align 4
1542 L(ashr_13):
1543         mov     $0xffff, %esi
1544         pxor    %xmm0, %xmm0
1545         movdqa  (%edx), %xmm2
1546         movdqa  (%eax), %xmm1
1547         pcmpeqb %xmm1, %xmm0
1548         pslldq  $3, %xmm2
1549         pcmpeqb %xmm1, %xmm2
1550         psubb   %xmm0, %xmm2
1551         pmovmskb %xmm2, %edi
1552         shr     %cl, %esi
1553         shr     %cl, %edi
1554         sub     %edi, %esi
1555         lea     -3(%ecx), %edi
1556         jnz     L(less32bytes)
1558         UPDATE_STRNCMP_COUNTER
1560         movdqa  (%edx), %xmm3
1561         pxor    %xmm0, %xmm0
1562         mov     $16, %ecx
1563         or      $13, %ebx
1564         lea     13(%edx), %edi
1565         and     $0xfff, %edi
1566         sub     $0x1000, %edi
1568         .p2align 4
1569 L(loop_ashr_13):
1570         add     $16, %edi
1571         jg      L(nibble_ashr_13)
1573 L(gobble_ashr_13):
1574         movdqa  (%eax, %ecx), %xmm1
1575         movdqa  (%edx, %ecx), %xmm2
1576         movdqa  %xmm2, %xmm4
1578         palignr $13, %xmm3, %xmm2
1580         pcmpeqb %xmm1, %xmm0
1581         pcmpeqb %xmm2, %xmm1
1582         psubb   %xmm0, %xmm1
1583         pmovmskb %xmm1, %esi
1584         sub     $0xffff, %esi
1585         jnz     L(exit)
1587 #ifdef USE_AS_STRNCMP
1588         cmp     $16, %ebp
1589         lea     -16(%ebp), %ebp
1590         jbe     L(more8byteseq)
1591 #endif
1592         add     $16, %ecx
1593         movdqa  %xmm4, %xmm3
1595         add     $16, %edi
1596         jg      L(nibble_ashr_13)
1598         movdqa  (%eax, %ecx), %xmm1
1599         movdqa  (%edx, %ecx), %xmm2
1600         movdqa  %xmm2, %xmm4
1602         palignr $13, %xmm3, %xmm2
1604         pcmpeqb %xmm1, %xmm0
1605         pcmpeqb %xmm2, %xmm1
1606         psubb   %xmm0, %xmm1
1607         pmovmskb %xmm1, %esi
1608         sub     $0xffff, %esi
1609         jnz     L(exit)
1611 #ifdef USE_AS_STRNCMP
1612         cmp     $16, %ebp
1613         lea     -16(%ebp), %ebp
1614         jbe     L(more8byteseq)
1615 #endif
1616         add     $16, %ecx
1617         movdqa  %xmm4, %xmm3
1618         jmp     L(loop_ashr_13)
1620         .p2align 4
1621 L(nibble_ashr_13):
1622         pcmpeqb %xmm3, %xmm0
1623         pmovmskb %xmm0, %esi
1624         test    $0xe000, %esi
1625         jnz     L(ashr_13_exittail)
1627 #ifdef USE_AS_STRNCMP
1628         cmp     $3, %ebp
1629         jbe     L(ashr_13_exittail)
1630 #endif
1631         pxor    %xmm0, %xmm0
1632         sub     $0x1000, %edi
1633         jmp     L(gobble_ashr_13)
1635         .p2align 4
1636 L(ashr_13_exittail):
1637         movdqa  (%eax, %ecx), %xmm1
1638         psrldq  $13, %xmm0
1639         psrldq  $13, %xmm3
1640         jmp     L(aftertail)
1643  * The following cases will be handled by ashr_14
1644  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1645  *        n(2~15)            n - 2            13(15 +(n-2) - n)         ashr_14
1646  */
1647         .p2align 4
1648 L(ashr_14):
1649         mov     $0xffff, %esi
1650         pxor    %xmm0, %xmm0
1651         movdqa  (%edx), %xmm2
1652         movdqa  (%eax), %xmm1
1653         pcmpeqb %xmm1, %xmm0
1654         pslldq  $2, %xmm2
1655         pcmpeqb %xmm1, %xmm2
1656         psubb   %xmm0, %xmm2
1657         pmovmskb %xmm2, %edi
1658         shr     %cl, %esi
1659         shr     %cl, %edi
1660         sub     %edi, %esi
1661         lea     -2(%ecx), %edi
1662         jnz     L(less32bytes)
1664         UPDATE_STRNCMP_COUNTER
1666         movdqa  (%edx), %xmm3
1667         pxor    %xmm0, %xmm0
1668         mov     $16, %ecx
1669         or      $14, %ebx
1670         lea     14(%edx), %edi
1671         and     $0xfff, %edi
1672         sub     $0x1000, %edi
1674         .p2align 4
1675 L(loop_ashr_14):
1676         add     $16, %edi
1677         jg      L(nibble_ashr_14)
1679 L(gobble_ashr_14):
1680         movdqa  (%eax, %ecx), %xmm1
1681         movdqa  (%edx, %ecx), %xmm2
1682         movdqa  %xmm2, %xmm4
1684         palignr $14, %xmm3, %xmm2
1686         pcmpeqb %xmm1, %xmm0
1687         pcmpeqb %xmm2, %xmm1
1688         psubb   %xmm0, %xmm1
1689         pmovmskb %xmm1, %esi
1690         sub     $0xffff, %esi
1691         jnz     L(exit)
1693 #ifdef USE_AS_STRNCMP
1694         cmp     $16, %ebp
1695         lea     -16(%ebp), %ebp
1696         jbe     L(more8byteseq)
1697 #endif
1698         add     $16, %ecx
1699         movdqa  %xmm4, %xmm3
1701         add     $16, %edi
1702         jg      L(nibble_ashr_14)
1704         movdqa  (%eax, %ecx), %xmm1
1705         movdqa  (%edx, %ecx), %xmm2
1706         movdqa  %xmm2, %xmm4
1708         palignr $14, %xmm3, %xmm2
1710         pcmpeqb %xmm1, %xmm0
1711         pcmpeqb %xmm2, %xmm1
1712         psubb   %xmm0, %xmm1
1713         pmovmskb %xmm1, %esi
1714         sub     $0xffff, %esi
1715         jnz     L(exit)
1717 #ifdef USE_AS_STRNCMP
1718         cmp     $16, %ebp
1719         lea     -16(%ebp), %ebp
1720         jbe     L(more8byteseq)
1721 #endif
1722         add     $16, %ecx
1723         movdqa  %xmm4, %xmm3
1724         jmp     L(loop_ashr_14)
1726         .p2align 4
1727 L(nibble_ashr_14):
1728         pcmpeqb %xmm3, %xmm0
1729         pmovmskb %xmm0, %esi
1730         test    $0xc000, %esi
1731         jnz     L(ashr_14_exittail)
1733 #ifdef USE_AS_STRNCMP
1734         cmp     $2, %ebp
1735         jbe     L(ashr_14_exittail)
1736 #endif
1737         pxor    %xmm0, %xmm0
1738         sub     $0x1000, %edi
1739         jmp     L(gobble_ashr_14)
1741         .p2align 4
1742 L(ashr_14_exittail):
1743         movdqa  (%eax, %ecx), %xmm1
1744         psrldq  $14, %xmm0
1745         psrldq  $14, %xmm3
1746         jmp     L(aftertail)
1749  * The following cases will be handled by ashr_14
1750  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1751  *        n(1~15)            n - 1            14(15 +(n-1) - n)         ashr_15
1752  */
1754         .p2align 4
1755 L(ashr_15):
1756         mov     $0xffff, %esi
1757         pxor    %xmm0, %xmm0
1758         movdqa  (%edx), %xmm2
1759         movdqa  (%eax), %xmm1
1760         pcmpeqb %xmm1, %xmm0
1761         pslldq  $1, %xmm2
1762         pcmpeqb %xmm1, %xmm2
1763         psubb   %xmm0, %xmm2
1764         pmovmskb %xmm2, %edi
1765         shr     %cl, %esi
1766         shr     %cl, %edi
1767         sub     %edi, %esi
1768         lea     -1(%ecx), %edi
1769         jnz     L(less32bytes)
1771         UPDATE_STRNCMP_COUNTER
1773         movdqa  (%edx), %xmm3
1774         pxor    %xmm0, %xmm0
1775         mov     $16, %ecx
1776         or      $15, %ebx
1777         lea     15(%edx), %edi
1778         and     $0xfff, %edi
1779         sub     $0x1000, %edi
1781         .p2align 4
1782 L(loop_ashr_15):
1783         add     $16, %edi
1784         jg      L(nibble_ashr_15)
1786 L(gobble_ashr_15):
1787         movdqa  (%eax, %ecx), %xmm1
1788         movdqa  (%edx, %ecx), %xmm2
1789         movdqa  %xmm2, %xmm4
1791         palignr $15, %xmm3, %xmm2
1793         pcmpeqb %xmm1, %xmm0
1794         pcmpeqb %xmm2, %xmm1
1795         psubb   %xmm0, %xmm1
1796         pmovmskb %xmm1, %esi
1797         sub     $0xffff, %esi
1798         jnz     L(exit)
1800 #ifdef USE_AS_STRNCMP
1801         cmp     $16, %ebp
1802         lea     -16(%ebp), %ebp
1803         jbe     L(more8byteseq)
1804 #endif
1805         add     $16, %ecx
1806         movdqa  %xmm4, %xmm3
1808         add     $16, %edi
1809         jg      L(nibble_ashr_15)
1811         movdqa  (%eax, %ecx), %xmm1
1812         movdqa  (%edx, %ecx), %xmm2
1813         movdqa  %xmm2, %xmm4
1815         palignr $15, %xmm3, %xmm2
1817         pcmpeqb %xmm1, %xmm0
1818         pcmpeqb %xmm2, %xmm1
1819         psubb   %xmm0, %xmm1
1820         pmovmskb %xmm1, %esi
1821         sub     $0xffff, %esi
1822         jnz     L(exit)
1824 #ifdef USE_AS_STRNCMP
1825         cmp     $16, %ebp
1826         lea     -16(%ebp), %ebp
1827         jbe     L(more8byteseq)
1828 #endif
1829         add     $16, %ecx
1830         movdqa  %xmm4, %xmm3
1831         jmp     L(loop_ashr_15)
1833         .p2align 4
1834 L(nibble_ashr_15):
1835         pcmpeqb %xmm3, %xmm0
1836         pmovmskb %xmm0, %esi
1837         test    $0x8000, %esi
1838         jnz     L(ashr_15_exittail)
1840 #ifdef USE_AS_STRNCMP
1841         cmp     $1, %ebp
1842         jbe     L(ashr_15_exittail)
1843 #endif
1844         pxor    %xmm0, %xmm0
1845         sub     $0x1000, %edi
1846         jmp     L(gobble_ashr_15)
1848         .p2align 4
1849 L(ashr_15_exittail):
1850         movdqa  (%eax, %ecx), %xmm1
1851         psrldq  $15, %xmm0
1852         psrldq  $15, %xmm3
1853         jmp     L(aftertail)
1855         .p2align 4
1856 L(aftertail):
1857         pcmpeqb %xmm3, %xmm1
1858         psubb   %xmm0, %xmm1
1859         pmovmskb %xmm1, %esi
1860         not     %esi
1861 L(exit):
1862         mov     %ebx, %edi
1863         and     $0x1f, %edi
1864         lea     -16(%edi, %ecx), %edi
1865 L(less32bytes):
1866         add     %edi, %edx
1867         add     %ecx, %eax
1868         test    $0x20, %ebx
1869         jz      L(ret2)
1870         xchg    %eax, %edx
1872         .p2align 4
1873 L(ret2):
1874         mov     %esi, %ecx
1875         POP     (%esi)
1876         POP     (%edi)
1877         POP     (%ebx)
1878 L(less16bytes):
1879         test    %cl, %cl
1880         jz      L(2next_8_bytes)
1882         test    $0x01, %cl
1883         jnz     L(Byte0)
1885         test    $0x02, %cl
1886         jnz     L(Byte1)
1888         test    $0x04, %cl
1889         jnz     L(Byte2)
1891         test    $0x08, %cl
1892         jnz     L(Byte3)
1894         test    $0x10, %cl
1895         jnz     L(Byte4)
1897         test    $0x20, %cl
1898         jnz     L(Byte5)
1900         test    $0x40, %cl
1901         jnz     L(Byte6)
1902 #ifdef USE_AS_STRNCMP
1903         cmp     $7, %ebp
1904         jbe     L(eq)
1905 #endif
1907         movzx   7(%eax), %ecx
1908         movzx   7(%edx), %eax
1910         sub     %ecx, %eax
1911         RETURN
1913 L(Byte0):
1914 #ifdef USE_AS_STRNCMP
1915         cmp     $0, %ebp
1916         jbe     L(eq)
1917 #endif
1918         movzx   (%eax), %ecx
1919         movzx   (%edx), %eax
1921         sub     %ecx, %eax
1922         RETURN
1924 L(Byte1):
1925 #ifdef USE_AS_STRNCMP
1926         cmp     $1, %ebp
1927         jbe     L(eq)
1928 #endif
1929         movzx   1(%eax), %ecx
1930         movzx   1(%edx), %eax
1932         sub     %ecx, %eax
1933         RETURN
1935 L(Byte2):
1936 #ifdef USE_AS_STRNCMP
1937         cmp     $2, %ebp
1938         jbe     L(eq)
1939 #endif
1940         movzx   2(%eax), %ecx
1941         movzx   2(%edx), %eax
1943         sub     %ecx, %eax
1944         RETURN
1946 L(Byte3):
1947 #ifdef USE_AS_STRNCMP
1948         cmp     $3, %ebp
1949         jbe     L(eq)
1950 #endif
1951         movzx   3(%eax), %ecx
1952         movzx   3(%edx), %eax
1954         sub     %ecx, %eax
1955         RETURN
1957 L(Byte4):
1958 #ifdef USE_AS_STRNCMP
1959         cmp     $4, %ebp
1960         jbe     L(eq)
1961 #endif
1962         movzx   4(%eax), %ecx
1963         movzx   4(%edx), %eax
1965         sub     %ecx, %eax
1966         RETURN
1968 L(Byte5):
1969 #ifdef USE_AS_STRNCMP
1970         cmp     $5, %ebp
1971         jbe     L(eq)
1972 #endif
1973         movzx   5(%eax), %ecx
1974         movzx   5(%edx), %eax
1976         sub     %ecx, %eax
1977         RETURN
1979 L(Byte6):
1980 #ifdef USE_AS_STRNCMP
1981         cmp     $6, %ebp
1982         jbe     L(eq)
1983 #endif
1984         movzx   6(%eax), %ecx
1985         movzx   6(%edx), %eax
1987         sub     %ecx, %eax
1988         RETURN
1990 L(2next_8_bytes):
1991         add     $8, %eax
1992         add     $8, %edx
1993 #ifdef USE_AS_STRNCMP
1994         cmp     $8, %ebp
1995         lea     -8(%ebp), %ebp
1996         jbe     L(eq)
1997 #endif
1999         test    $0x01, %ch
2000         jnz     L(Byte0)
2002         test    $0x02, %ch
2003         jnz     L(Byte1)
2005         test    $0x04, %ch
2006         jnz     L(Byte2)
2008         test    $0x08, %ch
2009         jnz     L(Byte3)
2011         test    $0x10, %ch
2012         jnz     L(Byte4)
2014         test    $0x20, %ch
2015         jnz     L(Byte5)
2017         test    $0x40, %ch
2018         jnz     L(Byte6)
2020 #ifdef USE_AS_STRNCMP
2021         cmp     $7, %ebp
2022         jbe     L(eq)
2023 #endif
2024         movzx   7(%eax), %ecx
2025         movzx   7(%edx), %eax
2027         sub     %ecx, %eax
2028         RETURN
2030 L(neq):
2031         mov     $1, %eax
2032         ja      L(neq_bigger)
2033         neg     %eax
2034 L(neq_bigger):
2035 #ifdef USE_AS_STRNCMP
2036         POP     (%ebp)
2037 #endif
2038         ret
2040 #ifdef USE_AS_STRNCMP
2041         .p2align 4
2042         cfi_restore_state
2043 L(more8byteseq):
2044         POP     (%esi)
2045         POP     (%edi)
2046         POP     (%ebx)
2047 #endif
2049 L(eq):
2051 #ifdef USE_AS_STRNCMP
2052         POP     (%ebp)
2053 #endif
2054         xorl    %eax, %eax
2055         ret
2057 #ifdef USE_AS_STRNCMP
2058         .p2align 4
2059         CFI_PUSH (%ebp)
2060 L(less16bytes_sncmp):
2061         test    %ebp, %ebp
2062         jz      L(eq)
2064         movzbl  (%eax), %ecx
2065         cmpb    %cl, (%edx)
2066         jne     L(neq)
2067         test    %cl, %cl
2068         je      L(eq)
2070         cmp     $1, %ebp
2071         je      L(eq)
2073         movzbl  1(%eax), %ecx
2074         cmpb    %cl, 1(%edx)
2075         jne     L(neq)
2076         test    %cl, %cl
2077         je      L(eq)
2079         cmp     $2, %ebp
2080         je      L(eq)
2082         movzbl  2(%eax), %ecx
2083         cmpb    %cl, 2(%edx)
2084         jne     L(neq)
2085         test    %cl, %cl
2086         je      L(eq)
2088         cmp     $3, %ebp
2089         je      L(eq)
2091         movzbl  3(%eax), %ecx
2092         cmpb    %cl, 3(%edx)
2093         jne     L(neq)
2094         test    %cl, %cl
2095         je      L(eq)
2097         cmp     $4, %ebp
2098         je      L(eq)
2100         movzbl  4(%eax), %ecx
2101         cmpb    %cl, 4(%edx)
2102         jne     L(neq)
2103         test    %cl, %cl
2104         je      L(eq)
2106         cmp     $5, %ebp
2107         je      L(eq)
2109         movzbl  5(%eax), %ecx
2110         cmpb    %cl, 5(%edx)
2111         jne     L(neq)
2112         test    %cl, %cl
2113         je      L(eq)
2115         cmp     $6, %ebp
2116         je      L(eq)
2118         movzbl  6(%eax), %ecx
2119         cmpb    %cl, 6(%edx)
2120         jne     L(neq)
2121         test    %cl, %cl
2122         je      L(eq)
2124         cmp     $7, %ebp
2125         je      L(eq)
2127         movzbl  7(%eax), %ecx
2128         cmpb    %cl, 7(%edx)
2129         jne     L(neq)
2130         test    %cl, %cl
2131         je      L(eq)
2134         cmp     $8, %ebp
2135         je      L(eq)
2137         movzbl  8(%eax), %ecx
2138         cmpb    %cl, 8(%edx)
2139         jne     L(neq)
2140         test    %cl, %cl
2141         je      L(eq)
2143         cmp     $9, %ebp
2144         je      L(eq)
2146         movzbl  9(%eax), %ecx
2147         cmpb    %cl, 9(%edx)
2148         jne     L(neq)
2149         test    %cl, %cl
2150         je      L(eq)
2152         cmp     $10, %ebp
2153         je      L(eq)
2155         movzbl  10(%eax), %ecx
2156         cmpb    %cl, 10(%edx)
2157         jne     L(neq)
2158         test    %cl, %cl
2159         je      L(eq)
2161         cmp     $11, %ebp
2162         je      L(eq)
2164         movzbl  11(%eax), %ecx
2165         cmpb    %cl, 11(%edx)
2166         jne     L(neq)
2167         test    %cl, %cl
2168         je      L(eq)
2171         cmp     $12, %ebp
2172         je      L(eq)
2174         movzbl  12(%eax), %ecx
2175         cmpb    %cl, 12(%edx)
2176         jne     L(neq)
2177         test    %cl, %cl
2178         je      L(eq)
2180         cmp     $13, %ebp
2181         je      L(eq)
2183         movzbl  13(%eax), %ecx
2184         cmpb    %cl, 13(%edx)
2185         jne     L(neq)
2186         test    %cl, %cl
2187         je      L(eq)
2189         cmp     $14, %ebp
2190         je      L(eq)
2192         movzbl  14(%eax), %ecx
2193         cmpb    %cl, 14(%edx)
2194         jne     L(neq)
2195         test    %cl, %cl
2196         je      L(eq)
2198         cmp     $15, %ebp
2199         je      L(eq)
2201         movzbl  15(%eax), %ecx
2202         cmpb    %cl, 15(%edx)
2203         jne     L(neq)
2204         test    %cl, %cl
2205         je      L(eq)
2207         POP     (%ebp)
2208         xor     %eax, %eax
2209         ret
2210 #endif
2212 END (STRCMP)
2214 #endif