32bit memcmp/strcmp/strncmp optimized for SSSE3/SSS4.2
[glibc.git] / sysdeps / i386 / i686 / multiarch / strcmp-ssse3.S
blob14caae29a12752d04cc82a3972097c8bf4c7b914
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 UPDATE_STRNCMP_COUNTER
44 #else
45 # ifndef STRCMP
46 #  define STRCMP        __strncmp_ssse3
47 # endif
48 # define STR1           8
49 # define STR2           STR1+4
50 # define CNT            STR2+4
52 # define UPDATE_STRNCMP_COUNTER                         \
53         /* calculate left number to compare */          \
54         mov     $16, %esi;                              \
55         sub     %ecx, %esi;                             \
56         cmp     %esi, %ebp;                             \
57         jbe     L(more8byteseq);                        \
58         sub     %esi, %ebp
59 #endif
61         .section .text.ssse3,"ax",@progbits
62 ENTRY (STRCMP)
63 #ifdef USE_AS_STRNCMP
64         PUSH    (%ebp)
65 #endif
66         movl    STR1(%esp), %edx
67         movl    STR2(%esp), %eax
68 #ifdef USE_AS_STRNCMP
69         movl    CNT(%esp), %ebp
70         cmp     $16, %ebp
71         jb      L(less16bytes_sncmp)
72         jmp     L(more16bytes)
73 #endif
75         movzbl  (%eax), %ecx
76         cmpb    %cl, (%edx)
77         jne     L(neq)
78         cmpl    $0, %ecx
79         je      L(eq)
81         movzbl  1(%eax), %ecx
82         cmpb    %cl, 1(%edx)
83         jne     L(neq)
84         cmpl    $0, %ecx
85         je      L(eq)
87         movzbl  2(%eax), %ecx
88         cmpb    %cl, 2(%edx)
89         jne     L(neq)
90         cmpl    $0, %ecx
91         je      L(eq)
93         movzbl  3(%eax), %ecx
94         cmpb    %cl, 3(%edx)
95         jne     L(neq)
96         cmpl    $0, %ecx
97         je      L(eq)
99         movzbl  4(%eax), %ecx
100         cmpb    %cl, 4(%edx)
101         jne     L(neq)
102         cmpl    $0, %ecx
103         je      L(eq)
105         movzbl  5(%eax), %ecx
106         cmpb    %cl, 5(%edx)
107         jne     L(neq)
108         cmpl    $0, %ecx
109         je      L(eq)
111         movzbl  6(%eax), %ecx
112         cmpb    %cl, 6(%edx)
113         jne     L(neq)
114         cmpl    $0, %ecx
115         je      L(eq)
117         movzbl  7(%eax), %ecx
118         cmpb    %cl, 7(%edx)
119         jne     L(neq)
120         cmpl    $0, %ecx
121         je      L(eq)
123         add     $8, %edx
124         add     $8, %eax
125 #ifdef USE_AS_STRNCMP
126         cmp     $8, %ebp
127         lea     -8(%ebp), %ebp
128         je      L(eq)
129 L(more16bytes):
130 #endif
131         movl    %edx, %ecx
132         and     $0xfff, %ecx
133         cmp     $0xff0, %ecx
134         ja      L(crosspage)
135         mov     %eax, %ecx
136         and     $0xfff, %ecx
137         cmp     $0xff0, %ecx
138         ja      L(crosspage)
139         pxor    %xmm0, %xmm0
140         movlpd  (%eax), %xmm1
141         movlpd  (%edx), %xmm2
142         movhpd  8(%eax), %xmm1
143         movhpd  8(%edx), %xmm2
144         pcmpeqb %xmm1, %xmm0
145         pcmpeqb %xmm2, %xmm1
146         psubb   %xmm0, %xmm1
147         pmovmskb %xmm1, %ecx
148         sub     $0xffff, %ecx
149         jnz     L(less16bytes)
150 #ifdef USE_AS_STRNCMP
151         cmp     $16, %ebp
152         lea     -16(%ebp), %ebp
153         jbe     L(eq)
154 #endif
155         add     $16, %eax
156         add     $16, %edx
158 L(crosspage):
160         PUSH    (%ebx)
161         PUSH    (%edi)
162         PUSH    (%esi)
164         movl    %edx, %edi
165         movl    %eax, %ecx
166         and     $0xf, %ecx
167         and     $0xf, %edi
168         xor     %ecx, %eax
169         xor     %edi, %edx
170         xor     %ebx, %ebx
171         cmp     %edi, %ecx
172         je      L(ashr_0)
173         ja      L(bigger)
174         or      $0x20, %ebx
175         xchg    %edx, %eax
176         xchg    %ecx, %edi
177 L(bigger):
178         lea     15(%edi), %edi
179         sub     %ecx, %edi
180         cmp     $8, %edi
181         jle     L(ashr_less_8)
182         cmp     $14, %edi
183         je      L(ashr_15)
184         cmp     $13, %edi
185         je      L(ashr_14)
186         cmp     $12, %edi
187         je      L(ashr_13)
188         cmp     $11, %edi
189         je      L(ashr_12)
190         cmp     $10, %edi
191         je      L(ashr_11)
192         cmp     $9, %edi
193         je      L(ashr_10)
194 L(ashr_less_8):
195         je      L(ashr_9)
196         cmp     $7, %edi
197         je      L(ashr_8)
198         cmp     $6, %edi
199         je      L(ashr_7)
200         cmp     $5, %edi
201         je      L(ashr_6)
202         cmp     $4, %edi
203         je      L(ashr_5)
204         cmp     $3, %edi
205         je      L(ashr_4)
206         cmp     $2, %edi
207         je      L(ashr_3)
208         cmp     $1, %edi
209         je      L(ashr_2)
210         cmp     $0, %edi
211         je      L(ashr_1)
214  * The following cases will be handled by ashr_0
215  *  ecx(offset of esi)  eax(offset of edi)  relative offset  corresponding case
216  *        n(0~15)            n(0~15)           15(15+ n-n)         ashr_0
217  */
218         .p2align 4
219 L(ashr_0):
220         mov     $0xffff, %esi
221         movdqa  (%eax), %xmm1
222         pxor    %xmm0, %xmm0
223         pcmpeqb %xmm1, %xmm0
224         pcmpeqb (%edx), %xmm1
225         psubb   %xmm0, %xmm1
226         pmovmskb %xmm1, %edi
227         shr     %cl, %esi
228         shr     %cl, %edi
229         sub     %edi, %esi
230         mov     %ecx, %edi
231         jne     L(less32bytes)
232         UPDATE_STRNCMP_COUNTER
233         mov     $0x10, %ebx
234         mov     $0x10, %ecx
235         pxor    %xmm0, %xmm0
236         .p2align 4
237 L(loop_ashr_0):
238         movdqa  (%eax, %ecx), %xmm1
239         movdqa  (%edx, %ecx), %xmm2
241         pcmpeqb %xmm1, %xmm0
242         pcmpeqb %xmm2, %xmm1
243         psubb   %xmm0, %xmm1
244         pmovmskb %xmm1, %esi
245         sub     $0xffff, %esi
246         jnz     L(exit)
247 #ifdef USE_AS_STRNCMP
248         cmp     $16, %ebp
249         lea     -16(%ebp), %ebp
250         jbe     L(more8byteseq)
251 #endif
252         add     $16, %ecx
253         jmp     L(loop_ashr_0)
256  * The following cases will be handled by ashr_1
257  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
258  *        n(15)            n -15            0(15 +(n-15) - n)         ashr_1
259  */
260         .p2align 4
261 L(ashr_1):
262         mov     $0xffff, %esi
263         pxor    %xmm0, %xmm0
264         movdqa  (%edx), %xmm2
265         movdqa  (%eax), %xmm1
266         pcmpeqb %xmm1, %xmm0
267         pslldq  $15, %xmm2
268         pcmpeqb %xmm1, %xmm2
269         psubb   %xmm0, %xmm2
270         pmovmskb %xmm2, %edi
271         shr     %cl, %esi
272         shr     %cl, %edi
273         sub     %edi, %esi
274         lea     -15(%ecx), %edi
275         jnz     L(less32bytes)
277         UPDATE_STRNCMP_COUNTER
279         movdqa  (%edx), %xmm3
280         pxor    %xmm0, %xmm0
281         mov     $16, %ecx
282         or      $1, %ebx
283         lea     1(%edx), %edi
284         and     $0xfff, %edi
285         sub     $0x1000, %edi
287         .p2align 4
288 L(loop_ashr_1):
289         add     $16, %edi
290         jg      L(nibble_ashr_1)
292 L(gobble_ashr_1):
293         movdqa  (%eax, %ecx), %xmm1
294         movdqa  (%edx, %ecx), %xmm2
295         movdqa  %xmm2, %xmm4
297         palignr $1, %xmm3, %xmm2
299         pcmpeqb %xmm1, %xmm0
300         pcmpeqb %xmm2, %xmm1
301         psubb   %xmm0, %xmm1
302         pmovmskb %xmm1, %esi
303         sub     $0xffff, %esi
304         jnz     L(exit)
305 #ifdef USE_AS_STRNCMP
306         cmp     $16, %ebp
307         lea     -16(%ebp), %ebp
308         jbe     L(more8byteseq)
309 #endif
311         add     $16, %ecx
312         movdqa  %xmm4, %xmm3
314         add     $16, %edi
315         jg      L(nibble_ashr_1)
317         movdqa  (%eax, %ecx), %xmm1
318         movdqa  (%edx, %ecx), %xmm2
319         movdqa  %xmm2, %xmm4
321         palignr $1, %xmm3, %xmm2
323         pcmpeqb %xmm1, %xmm0
324         pcmpeqb %xmm2, %xmm1
325         psubb   %xmm0, %xmm1
326         pmovmskb %xmm1, %esi
327         sub     $0xffff, %esi
328         jnz     L(exit)
330 #ifdef USE_AS_STRNCMP
331         cmp     $16, %ebp
332         lea     -16(%ebp), %ebp
333         jbe     L(more8byteseq)
334 #endif
335         add     $16, %ecx
336         movdqa  %xmm4, %xmm3
337         jmp     L(loop_ashr_1)
339         .p2align 4
340 L(nibble_ashr_1):
341         pcmpeqb %xmm3, %xmm0
342         pmovmskb %xmm0, %esi
343         test    $0xfffe, %esi
344         jnz     L(ashr_1_exittail)
346 #ifdef USE_AS_STRNCMP
347         cmp     $15, %ebp
348         jbe     L(ashr_1_exittail)
349 #endif
350         pxor    %xmm0, %xmm0
351         sub     $0x1000, %edi
352         jmp     L(gobble_ashr_1)
354         .p2align 4
355 L(ashr_1_exittail):
356         movdqa  (%eax, %ecx), %xmm1
357         psrldq  $1, %xmm0
358         psrldq  $1, %xmm3
359         jmp     L(aftertail)
362  * The following cases will be handled by ashr_2
363  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
364  *        n(14~15)            n -14            1(15 +(n-14) - n)         ashr_2
365  */
366         .p2align 4
367 L(ashr_2):
368         mov     $0xffff, %esi
369         pxor    %xmm0, %xmm0
370         movdqa  (%edx), %xmm2
371         movdqa  (%eax), %xmm1
372         pcmpeqb %xmm1, %xmm0
373         pslldq  $14, %xmm2
374         pcmpeqb %xmm1, %xmm2
375         psubb   %xmm0, %xmm2
376         pmovmskb %xmm2, %edi
377         shr     %cl, %esi
378         shr     %cl, %edi
379         sub     %edi, %esi
380         lea     -14(%ecx), %edi
381         jnz     L(less32bytes)
383         UPDATE_STRNCMP_COUNTER
385         movdqa  (%edx), %xmm3
386         pxor    %xmm0, %xmm0
387         mov     $16, %ecx
388         or      $2, %ebx
389         lea     2(%edx), %edi
390         and     $0xfff, %edi
391         sub     $0x1000, %edi
393         .p2align 4
394 L(loop_ashr_2):
395         add     $16, %edi
396         jg      L(nibble_ashr_2)
398 L(gobble_ashr_2):
399         movdqa  (%eax, %ecx), %xmm1
400         movdqa  (%edx, %ecx), %xmm2
401         movdqa  %xmm2, %xmm4
403         palignr $2, %xmm3, %xmm2
405         pcmpeqb %xmm1, %xmm0
406         pcmpeqb %xmm2, %xmm1
407         psubb   %xmm0, %xmm1
408         pmovmskb %xmm1, %esi
409         sub     $0xffff, %esi
410         jnz     L(exit)
412 #ifdef USE_AS_STRNCMP
413         cmp     $16, %ebp
414         lea     -16(%ebp), %ebp
415         jbe     L(more8byteseq)
416 #endif
417         add     $16, %ecx
418         movdqa  %xmm4, %xmm3
420         add     $16, %edi
421         jg      L(nibble_ashr_2)
423         movdqa  (%eax, %ecx), %xmm1
424         movdqa  (%edx, %ecx), %xmm2
425         movdqa  %xmm2, %xmm4
427         palignr $2, %xmm3, %xmm2
429         pcmpeqb %xmm1, %xmm0
430         pcmpeqb %xmm2, %xmm1
431         psubb   %xmm0, %xmm1
432         pmovmskb %xmm1, %esi
433         sub     $0xffff, %esi
434         jnz     L(exit)
436 #ifdef USE_AS_STRNCMP
437         cmp     $16, %ebp
438         lea     -16(%ebp), %ebp
439         jbe     L(more8byteseq)
440 #endif
441         add     $16, %ecx
442         movdqa  %xmm4, %xmm3
443         jmp     L(loop_ashr_2)
445         .p2align 4
446 L(nibble_ashr_2):
447         pcmpeqb %xmm3, %xmm0
448         pmovmskb %xmm0, %esi
449         test    $0xfffc, %esi
450         jnz     L(ashr_2_exittail)
452 #ifdef USE_AS_STRNCMP
453         cmp     $14, %ebp
454         jbe     L(ashr_2_exittail)
455 #endif
457         pxor    %xmm0, %xmm0
458         sub     $0x1000, %edi
459         jmp     L(gobble_ashr_2)
461         .p2align 4
462 L(ashr_2_exittail):
463         movdqa  (%eax, %ecx), %xmm1
464         psrldq  $2, %xmm0
465         psrldq  $2, %xmm3
466         jmp     L(aftertail)
469  * The following cases will be handled by ashr_3
470  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
471  *        n(13~15)            n -13            2(15 +(n-13) - n)         ashr_3
472  */
473         .p2align 4
474 L(ashr_3):
475         mov     $0xffff, %esi
476         pxor    %xmm0, %xmm0
477         movdqa  (%edx), %xmm2
478         movdqa  (%eax), %xmm1
479         pcmpeqb %xmm1, %xmm0
480         pslldq  $13, %xmm2
481         pcmpeqb %xmm1, %xmm2
482         psubb   %xmm0, %xmm2
483         pmovmskb %xmm2, %edi
484         shr     %cl, %esi
485         shr     %cl, %edi
486         sub     %edi, %esi
487         lea     -13(%ecx), %edi
488         jnz     L(less32bytes)
490         UPDATE_STRNCMP_COUNTER
492         movdqa  (%edx), %xmm3
493         pxor    %xmm0, %xmm0
494         mov     $16, %ecx
495         or      $3, %ebx
496         lea     3(%edx), %edi
497         and     $0xfff, %edi
498         sub     $0x1000, %edi
500         .p2align 4
501 L(loop_ashr_3):
502         add     $16, %edi
503         jg      L(nibble_ashr_3)
505 L(gobble_ashr_3):
506         movdqa  (%eax, %ecx), %xmm1
507         movdqa  (%edx, %ecx), %xmm2
508         movdqa  %xmm2, %xmm4
510         palignr $3, %xmm3, %xmm2
512         pcmpeqb %xmm1, %xmm0
513         pcmpeqb %xmm2, %xmm1
514         psubb   %xmm0, %xmm1
515         pmovmskb %xmm1, %esi
516         sub     $0xffff, %esi
517         jnz     L(exit)
519 #ifdef USE_AS_STRNCMP
520         cmp     $16, %ebp
521         lea     -16(%ebp), %ebp
522         jbe     L(more8byteseq)
523 #endif
524         add     $16, %ecx
525         movdqa  %xmm4, %xmm3
527         add     $16, %edi
528         jg      L(nibble_ashr_3)
530         movdqa  (%eax, %ecx), %xmm1
531         movdqa  (%edx, %ecx), %xmm2
532         movdqa  %xmm2, %xmm4
534         palignr $3, %xmm3, %xmm2
536         pcmpeqb %xmm1, %xmm0
537         pcmpeqb %xmm2, %xmm1
538         psubb   %xmm0, %xmm1
539         pmovmskb %xmm1, %esi
540         sub     $0xffff, %esi
541         jnz     L(exit)
543 #ifdef USE_AS_STRNCMP
544         cmp     $16, %ebp
545         lea     -16(%ebp), %ebp
546         jbe     L(more8byteseq)
547 #endif
548         add     $16, %ecx
549         movdqa  %xmm4, %xmm3
550         jmp     L(loop_ashr_3)
552         .p2align 4
553 L(nibble_ashr_3):
554         pcmpeqb %xmm3, %xmm0
555         pmovmskb %xmm0, %esi
556         test    $0xfff8, %esi
557         jnz     L(ashr_3_exittail)
559 #ifdef USE_AS_STRNCMP
560         cmp     $13, %ebp
561         jbe     L(ashr_3_exittail)
562 #endif
563         pxor    %xmm0, %xmm0
564         sub     $0x1000, %edi
565         jmp     L(gobble_ashr_3)
567         .p2align 4
568 L(ashr_3_exittail):
569         movdqa  (%eax, %ecx), %xmm1
570         psrldq  $3, %xmm0
571         psrldq  $3, %xmm3
572         jmp     L(aftertail)
575  * The following cases will be handled by ashr_4
576  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
577  *        n(12~15)            n -12            3(15 +(n-12) - n)         ashr_4
578  */
579         .p2align 4
580 L(ashr_4):
581         mov     $0xffff, %esi
582         pxor    %xmm0, %xmm0
583         movdqa  (%edx), %xmm2
584         movdqa  (%eax), %xmm1
585         pcmpeqb %xmm1, %xmm0
586         pslldq  $12, %xmm2
587         pcmpeqb %xmm1, %xmm2
588         psubb   %xmm0, %xmm2
589         pmovmskb %xmm2, %edi
590         shr     %cl, %esi
591         shr     %cl, %edi
592         sub     %edi, %esi
593         lea     -12(%ecx), %edi
594         jnz     L(less32bytes)
596         UPDATE_STRNCMP_COUNTER
598         movdqa  (%edx), %xmm3
599         pxor    %xmm0, %xmm0
600         mov     $16, %ecx
601         or      $4, %ebx
602         lea     4(%edx), %edi
603         and     $0xfff, %edi
604         sub     $0x1000, %edi
606         .p2align 4
607 L(loop_ashr_4):
608         add     $16, %edi
609         jg      L(nibble_ashr_4)
611 L(gobble_ashr_4):
612         movdqa  (%eax, %ecx), %xmm1
613         movdqa  (%edx, %ecx), %xmm2
614         movdqa  %xmm2, %xmm4
616         palignr $4, %xmm3, %xmm2
618         pcmpeqb %xmm1, %xmm0
619         pcmpeqb %xmm2, %xmm1
620         psubb   %xmm0, %xmm1
621         pmovmskb %xmm1, %esi
622         sub     $0xffff, %esi
623         jnz     L(exit)
625 #ifdef USE_AS_STRNCMP
626         cmp     $16, %ebp
627         lea     -16(%ebp), %ebp
628         jbe     L(more8byteseq)
629 #endif
631         add     $16, %ecx
632         movdqa  %xmm4, %xmm3
634         add     $16, %edi
635         jg      L(nibble_ashr_4)
637         movdqa  (%eax, %ecx), %xmm1
638         movdqa  (%edx, %ecx), %xmm2
639         movdqa  %xmm2, %xmm4
641         palignr $4, %xmm3, %xmm2
643         pcmpeqb %xmm1, %xmm0
644         pcmpeqb %xmm2, %xmm1
645         psubb   %xmm0, %xmm1
646         pmovmskb %xmm1, %esi
647         sub     $0xffff, %esi
648         jnz     L(exit)
650 #ifdef USE_AS_STRNCMP
651         cmp     $16, %ebp
652         lea     -16(%ebp), %ebp
653         jbe     L(more8byteseq)
654 #endif
656         add     $16, %ecx
657         movdqa  %xmm4, %xmm3
658         jmp     L(loop_ashr_4)
660         .p2align 4
661 L(nibble_ashr_4):
662         pcmpeqb %xmm3, %xmm0
663         pmovmskb %xmm0, %esi
664         test    $0xfff0, %esi
665         jnz     L(ashr_4_exittail)
667 #ifdef USE_AS_STRNCMP
668         cmp     $12, %ebp
669         jbe     L(ashr_4_exittail)
670 #endif
672         pxor    %xmm0, %xmm0
673         sub     $0x1000, %edi
674         jmp     L(gobble_ashr_4)
676         .p2align 4
677 L(ashr_4_exittail):
678         movdqa  (%eax, %ecx), %xmm1
679         psrldq  $4, %xmm0
680         psrldq  $4, %xmm3
681         jmp     L(aftertail)
684  * The following cases will be handled by ashr_5
685  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
686  *        n(11~15)            n -11            4(15 +(n-11) - n)         ashr_5
687  */
688         .p2align 4
689 L(ashr_5):
690         mov     $0xffff, %esi
691         pxor    %xmm0, %xmm0
692         movdqa  (%edx), %xmm2
693         movdqa  (%eax), %xmm1
694         pcmpeqb %xmm1, %xmm0
695         pslldq  $11, %xmm2
696         pcmpeqb %xmm1, %xmm2
697         psubb   %xmm0, %xmm2
698         pmovmskb %xmm2, %edi
699         shr     %cl, %esi
700         shr     %cl, %edi
701         sub     %edi, %esi
702         lea     -11(%ecx), %edi
703         jnz     L(less32bytes)
705         UPDATE_STRNCMP_COUNTER
707         movdqa  (%edx), %xmm3
708         pxor    %xmm0, %xmm0
709         mov     $16, %ecx
710         or      $5, %ebx
711         lea     5(%edx), %edi
712         and     $0xfff, %edi
713         sub     $0x1000, %edi
715         .p2align 4
716 L(loop_ashr_5):
717         add     $16, %edi
718         jg      L(nibble_ashr_5)
720 L(gobble_ashr_5):
721         movdqa  (%eax, %ecx), %xmm1
722         movdqa  (%edx, %ecx), %xmm2
723         movdqa  %xmm2, %xmm4
725         palignr $5, %xmm3, %xmm2
727         pcmpeqb %xmm1, %xmm0
728         pcmpeqb %xmm2, %xmm1
729         psubb   %xmm0, %xmm1
730         pmovmskb %xmm1, %esi
731         sub     $0xffff, %esi
732         jnz     L(exit)
734 #ifdef USE_AS_STRNCMP
735         cmp     $16, %ebp
736         lea     -16(%ebp), %ebp
737         jbe     L(more8byteseq)
738 #endif
739         add     $16, %ecx
740         movdqa  %xmm4, %xmm3
742         add     $16, %edi
743         jg      L(nibble_ashr_5)
745         movdqa  (%eax, %ecx), %xmm1
746         movdqa  (%edx, %ecx), %xmm2
747         movdqa  %xmm2, %xmm4
749         palignr $5, %xmm3, %xmm2
751         pcmpeqb %xmm1, %xmm0
752         pcmpeqb %xmm2, %xmm1
753         psubb   %xmm0, %xmm1
754         pmovmskb %xmm1, %esi
755         sub     $0xffff, %esi
756         jnz     L(exit)
758 #ifdef USE_AS_STRNCMP
759         cmp     $16, %ebp
760         lea     -16(%ebp), %ebp
761         jbe     L(more8byteseq)
762 #endif
763         add     $16, %ecx
764         movdqa  %xmm4, %xmm3
765         jmp     L(loop_ashr_5)
767         .p2align 4
768 L(nibble_ashr_5):
769         pcmpeqb %xmm3, %xmm0
770         pmovmskb %xmm0, %esi
771         test    $0xffe0, %esi
772         jnz     L(ashr_5_exittail)
774 #ifdef USE_AS_STRNCMP
775         cmp     $11, %ebp
776         jbe     L(ashr_5_exittail)
777 #endif
778         pxor    %xmm0, %xmm0
779         sub     $0x1000, %edi
780         jmp     L(gobble_ashr_5)
782         .p2align 4
783 L(ashr_5_exittail):
784         movdqa  (%eax, %ecx), %xmm1
785         psrldq  $5, %xmm0
786         psrldq  $5, %xmm3
787         jmp     L(aftertail)
790  * The following cases will be handled by ashr_6
791  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
792  *        n(10~15)            n -10            5(15 +(n-10) - n)         ashr_6
793  */
795         .p2align 4
796 L(ashr_6):
797         mov     $0xffff, %esi
798         pxor    %xmm0, %xmm0
799         movdqa  (%edx), %xmm2
800         movdqa  (%eax), %xmm1
801         pcmpeqb %xmm1, %xmm0
802         pslldq  $10, %xmm2
803         pcmpeqb %xmm1, %xmm2
804         psubb   %xmm0, %xmm2
805         pmovmskb %xmm2, %edi
806         shr     %cl, %esi
807         shr     %cl, %edi
808         sub     %edi, %esi
809         lea     -10(%ecx), %edi
810         jnz     L(less32bytes)
812         UPDATE_STRNCMP_COUNTER
814         movdqa  (%edx), %xmm3
815         pxor    %xmm0, %xmm0
816         mov     $16, %ecx
817         or      $6, %ebx
818         lea     6(%edx), %edi
819         and     $0xfff, %edi
820         sub     $0x1000, %edi
822         .p2align 4
823 L(loop_ashr_6):
824         add     $16, %edi
825         jg      L(nibble_ashr_6)
827 L(gobble_ashr_6):
828         movdqa  (%eax, %ecx), %xmm1
829         movdqa  (%edx, %ecx), %xmm2
830         movdqa  %xmm2, %xmm4
832         palignr $6, %xmm3, %xmm2
834         pcmpeqb %xmm1, %xmm0
835         pcmpeqb %xmm2, %xmm1
836         psubb   %xmm0, %xmm1
837         pmovmskb %xmm1, %esi
838         sub     $0xffff, %esi
839         jnz     L(exit)
841 #ifdef USE_AS_STRNCMP
842         cmp     $16, %ebp
843         lea     -16(%ebp), %ebp
844         jbe     L(more8byteseq)
845 #endif
847         add     $16, %ecx
848         movdqa  %xmm4, %xmm3
850         add     $16, %edi
851         jg      L(nibble_ashr_6)
853         movdqa  (%eax, %ecx), %xmm1
854         movdqa  (%edx, %ecx), %xmm2
855         movdqa  %xmm2, %xmm4
857         palignr $6, %xmm3, %xmm2
859         pcmpeqb %xmm1, %xmm0
860         pcmpeqb %xmm2, %xmm1
861         psubb   %xmm0, %xmm1
862         pmovmskb %xmm1, %esi
863         sub     $0xffff, %esi
864         jnz     L(exit)
865 #ifdef USE_AS_STRNCMP
866         cmp     $16, %ebp
867         lea     -16(%ebp), %ebp
868         jbe     L(more8byteseq)
869 #endif
871         add     $16, %ecx
872         movdqa  %xmm4, %xmm3
873         jmp     L(loop_ashr_6)
875         .p2align 4
876 L(nibble_ashr_6):
877         pcmpeqb %xmm3, %xmm0
878         pmovmskb %xmm0, %esi
879         test    $0xffc0, %esi
880         jnz     L(ashr_6_exittail)
882 #ifdef USE_AS_STRNCMP
883         cmp     $10, %ebp
884         jbe     L(ashr_6_exittail)
885 #endif
886         pxor    %xmm0, %xmm0
887         sub     $0x1000, %edi
888         jmp     L(gobble_ashr_6)
890         .p2align 4
891 L(ashr_6_exittail):
892         movdqa  (%eax, %ecx), %xmm1
893         psrldq  $6, %xmm0
894         psrldq  $6, %xmm3
895         jmp     L(aftertail)
898  * The following cases will be handled by ashr_7
899  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
900  *        n(9~15)            n - 9            6(15 +(n-9) - n)         ashr_7
901  */
903         .p2align 4
904 L(ashr_7):
905         mov     $0xffff, %esi
906         pxor    %xmm0, %xmm0
907         movdqa  (%edx), %xmm2
908         movdqa  (%eax), %xmm1
909         pcmpeqb %xmm1, %xmm0
910         pslldq  $9, %xmm2
911         pcmpeqb %xmm1, %xmm2
912         psubb   %xmm0, %xmm2
913         pmovmskb %xmm2, %edi
914         shr     %cl, %esi
915         shr     %cl, %edi
916         sub     %edi, %esi
917         lea     -9(%ecx), %edi
918         jnz     L(less32bytes)
920         UPDATE_STRNCMP_COUNTER
922         movdqa  (%edx), %xmm3
923         pxor    %xmm0, %xmm0
924         mov     $16, %ecx
925         or      $7, %ebx
926         lea     8(%edx), %edi
927         and     $0xfff, %edi
928         sub     $0x1000, %edi
930         .p2align 4
931 L(loop_ashr_7):
932         add     $16, %edi
933         jg      L(nibble_ashr_7)
935 L(gobble_ashr_7):
936         movdqa  (%eax, %ecx), %xmm1
937         movdqa  (%edx, %ecx), %xmm2
938         movdqa  %xmm2, %xmm4
940         palignr $7, %xmm3, %xmm2
942         pcmpeqb %xmm1, %xmm0
943         pcmpeqb %xmm2, %xmm1
944         psubb   %xmm0, %xmm1
945         pmovmskb %xmm1, %esi
946         sub     $0xffff, %esi
947         jnz     L(exit)
949 #ifdef USE_AS_STRNCMP
950         cmp     $16, %ebp
951         lea     -16(%ebp), %ebp
952         jbe     L(more8byteseq)
953 #endif
955         add     $16, %ecx
956         movdqa  %xmm4, %xmm3
958         add     $16, %edi
959         jg      L(nibble_ashr_7)
961         movdqa  (%eax, %ecx), %xmm1
962         movdqa  (%edx, %ecx), %xmm2
963         movdqa  %xmm2, %xmm4
965         palignr $7, %xmm3, %xmm2
967         pcmpeqb %xmm1, %xmm0
968         pcmpeqb %xmm2, %xmm1
969         psubb   %xmm0, %xmm1
970         pmovmskb %xmm1, %esi
971         sub     $0xffff, %esi
972         jnz     L(exit)
974 #ifdef USE_AS_STRNCMP
975         cmp     $16, %ebp
976         lea     -16(%ebp), %ebp
977         jbe     L(more8byteseq)
978 #endif
980         add     $16, %ecx
981         movdqa  %xmm4, %xmm3
982         jmp     L(loop_ashr_7)
984         .p2align 4
985 L(nibble_ashr_7):
986         pcmpeqb %xmm3, %xmm0
987         pmovmskb %xmm0, %esi
988         test    $0xff80, %esi
989         jnz     L(ashr_7_exittail)
991 #ifdef USE_AS_STRNCMP
992         cmp     $9, %ebp
993         jbe     L(ashr_7_exittail)
994 #endif
995         pxor    %xmm0, %xmm0
996         pxor    %xmm0, %xmm0
997         sub     $0x1000, %edi
998         jmp     L(gobble_ashr_7)
1000         .p2align 4
1001 L(ashr_7_exittail):
1002         movdqa  (%eax, %ecx), %xmm1
1003         psrldq  $7, %xmm0
1004         psrldq  $7, %xmm3
1005         jmp     L(aftertail)
1008  * The following cases will be handled by ashr_8
1009  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1010  *        n(8~15)            n - 8            7(15 +(n-8) - n)         ashr_8
1011  */
1012         .p2align 4
1013 L(ashr_8):
1014         mov     $0xffff, %esi
1015         pxor    %xmm0, %xmm0
1016         movdqa  (%edx), %xmm2
1017         movdqa  (%eax), %xmm1
1018         pcmpeqb %xmm1, %xmm0
1019         pslldq  $8, %xmm2
1020         pcmpeqb %xmm1, %xmm2
1021         psubb   %xmm0, %xmm2
1022         pmovmskb %xmm2, %edi
1023         shr     %cl, %esi
1024         shr     %cl, %edi
1025         sub     %edi, %esi
1026         lea     -8(%ecx), %edi
1027         jnz     L(less32bytes)
1029         UPDATE_STRNCMP_COUNTER
1031         movdqa  (%edx), %xmm3
1032         pxor    %xmm0, %xmm0
1033         mov     $16, %ecx
1034         or      $8, %ebx
1035         lea     8(%edx), %edi
1036         and     $0xfff, %edi
1037         sub     $0x1000, %edi
1039         .p2align 4
1040 L(loop_ashr_8):
1041         add     $16, %edi
1042         jg      L(nibble_ashr_8)
1044 L(gobble_ashr_8):
1045         movdqa  (%eax, %ecx), %xmm1
1046         movdqa  (%edx, %ecx), %xmm2
1047         movdqa  %xmm2, %xmm4
1049         palignr $8, %xmm3, %xmm2
1051         pcmpeqb %xmm1, %xmm0
1052         pcmpeqb %xmm2, %xmm1
1053         psubb   %xmm0, %xmm1
1054         pmovmskb %xmm1, %esi
1055         sub     $0xffff, %esi
1056         jnz     L(exit)
1058 #ifdef USE_AS_STRNCMP
1059         cmp     $16, %ebp
1060         lea     -16(%ebp), %ebp
1061         jbe     L(more8byteseq)
1062 #endif
1063         add     $16, %ecx
1064         movdqa  %xmm4, %xmm3
1066         add     $16, %edi
1067         jg      L(nibble_ashr_8)
1069         movdqa  (%eax, %ecx), %xmm1
1070         movdqa  (%edx, %ecx), %xmm2
1071         movdqa  %xmm2, %xmm4
1073         palignr $8, %xmm3, %xmm2
1075         pcmpeqb %xmm1, %xmm0
1076         pcmpeqb %xmm2, %xmm1
1077         psubb   %xmm0, %xmm1
1078         pmovmskb %xmm1, %esi
1079         sub     $0xffff, %esi
1080         jnz     L(exit)
1082 #ifdef USE_AS_STRNCMP
1083         cmp     $16, %ebp
1084         lea     -16(%ebp), %ebp
1085         jbe     L(more8byteseq)
1086 #endif
1087         add     $16, %ecx
1088         movdqa  %xmm4, %xmm3
1089         jmp     L(loop_ashr_8)
1091         .p2align 4
1092 L(nibble_ashr_8):
1093         pcmpeqb %xmm3, %xmm0
1094         pmovmskb %xmm0, %esi
1095         test    $0xff00, %esi
1096         jnz     L(ashr_8_exittail)
1098 #ifdef USE_AS_STRNCMP
1099         cmp     $8, %ebp
1100         jbe     L(ashr_8_exittail)
1101 #endif
1102         pxor    %xmm0, %xmm0
1103         pxor    %xmm0, %xmm0
1104         sub     $0x1000, %edi
1105         jmp     L(gobble_ashr_8)
1107         .p2align 4
1108 L(ashr_8_exittail):
1109         movdqa  (%eax, %ecx), %xmm1
1110         psrldq  $8, %xmm0
1111         psrldq  $8, %xmm3
1112         jmp     L(aftertail)
1115  * The following cases will be handled by ashr_9
1116  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1117  *        n(7~15)            n - 7            8(15 +(n-7) - n)         ashr_9
1118  */
1119         .p2align 4
1120 L(ashr_9):
1121         mov     $0xffff, %esi
1122         pxor    %xmm0, %xmm0
1123         movdqa  (%edx), %xmm2
1124         movdqa  (%eax), %xmm1
1125         pcmpeqb %xmm1, %xmm0
1126         pslldq  $7, %xmm2
1127         pcmpeqb %xmm1, %xmm2
1128         psubb   %xmm0, %xmm2
1129         pmovmskb %xmm2, %edi
1130         shr     %cl, %esi
1131         shr     %cl, %edi
1132         sub     %edi, %esi
1133         lea     -7(%ecx), %edi
1134         jnz     L(less32bytes)
1136         UPDATE_STRNCMP_COUNTER
1138         movdqa  (%edx), %xmm3
1139         pxor    %xmm0, %xmm0
1140         mov     $16, %ecx
1141         or      $9, %ebx
1142         lea     9(%edx), %edi
1143         and     $0xfff, %edi
1144         sub     $0x1000, %edi
1146         .p2align 4
1147 L(loop_ashr_9):
1148         add     $16, %edi
1149         jg      L(nibble_ashr_9)
1151 L(gobble_ashr_9):
1152         movdqa  (%eax, %ecx), %xmm1
1153         movdqa  (%edx, %ecx), %xmm2
1154         movdqa  %xmm2, %xmm4
1156         palignr $9, %xmm3, %xmm2
1158         pcmpeqb %xmm1, %xmm0
1159         pcmpeqb %xmm2, %xmm1
1160         psubb   %xmm0, %xmm1
1161         pmovmskb %xmm1, %esi
1162         sub     $0xffff, %esi
1163         jnz     L(exit)
1165 #ifdef USE_AS_STRNCMP
1166         cmp     $16, %ebp
1167         lea     -16(%ebp), %ebp
1168         jbe     L(more8byteseq)
1169 #endif
1170         add     $16, %ecx
1171         movdqa  %xmm4, %xmm3
1173         add     $16, %edi
1174         jg      L(nibble_ashr_9)
1176         movdqa  (%eax, %ecx), %xmm1
1177         movdqa  (%edx, %ecx), %xmm2
1178         movdqa  %xmm2, %xmm4
1180         palignr $9, %xmm3, %xmm2
1182         pcmpeqb %xmm1, %xmm0
1183         pcmpeqb %xmm2, %xmm1
1184         psubb   %xmm0, %xmm1
1185         pmovmskb %xmm1, %esi
1186         sub     $0xffff, %esi
1187         jnz     L(exit)
1189 #ifdef USE_AS_STRNCMP
1190         cmp     $16, %ebp
1191         lea     -16(%ebp), %ebp
1192         jbe     L(more8byteseq)
1193 #endif
1194         add     $16, %ecx
1195         movdqa  %xmm4, %xmm3
1196         jmp     L(loop_ashr_9)
1198         .p2align 4
1199 L(nibble_ashr_9):
1200         pcmpeqb %xmm3, %xmm0
1201         pmovmskb %xmm0, %esi
1202         test    $0xfe00, %esi
1203         jnz     L(ashr_9_exittail)
1205 #ifdef USE_AS_STRNCMP
1206         cmp     $7, %ebp
1207         jbe     L(ashr_9_exittail)
1208 #endif
1209         pxor    %xmm0, %xmm0
1210         sub     $0x1000, %edi
1211         jmp     L(gobble_ashr_9)
1213         .p2align 4
1214 L(ashr_9_exittail):
1215         movdqa  (%eax, %ecx), %xmm1
1216         psrldq  $9, %xmm0
1217         psrldq  $9, %xmm3
1218         jmp     L(aftertail)
1221  * The following cases will be handled by ashr_10
1222  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1223  *        n(6~15)            n - 6            9(15 +(n-6) - n)         ashr_10
1224  */
1225         .p2align 4
1226 L(ashr_10):
1227         mov     $0xffff, %esi
1228         pxor    %xmm0, %xmm0
1229         movdqa  (%edx), %xmm2
1230         movdqa  (%eax), %xmm1
1231         pcmpeqb %xmm1, %xmm0
1232         pslldq  $6, %xmm2
1233         pcmpeqb %xmm1, %xmm2
1234         psubb   %xmm0, %xmm2
1235         pmovmskb %xmm2, %edi
1236         shr     %cl, %esi
1237         shr     %cl, %edi
1238         sub     %edi, %esi
1239         lea     -6(%ecx), %edi
1240         jnz     L(less32bytes)
1242         UPDATE_STRNCMP_COUNTER
1244         movdqa  (%edx), %xmm3
1245         pxor    %xmm0, %xmm0
1246         mov     $16, %ecx
1247         or      $10, %ebx
1248         lea     10(%edx), %edi
1249         and     $0xfff, %edi
1250         sub     $0x1000, %edi
1252         .p2align 4
1253 L(loop_ashr_10):
1254         add     $16, %edi
1255         jg      L(nibble_ashr_10)
1257 L(gobble_ashr_10):
1258         movdqa  (%eax, %ecx), %xmm1
1259         movdqa  (%edx, %ecx), %xmm2
1260         movdqa  %xmm2, %xmm4
1262         palignr $10, %xmm3, %xmm2
1264         pcmpeqb %xmm1, %xmm0
1265         pcmpeqb %xmm2, %xmm1
1266         psubb   %xmm0, %xmm1
1267         pmovmskb %xmm1, %esi
1268         sub     $0xffff, %esi
1269         jnz     L(exit)
1271 #ifdef USE_AS_STRNCMP
1272         cmp     $16, %ebp
1273         lea     -16(%ebp), %ebp
1274         jbe     L(more8byteseq)
1275 #endif
1276         add     $16, %ecx
1277         movdqa  %xmm4, %xmm3
1279         add     $16, %edi
1280         jg      L(nibble_ashr_10)
1282         movdqa  (%eax, %ecx), %xmm1
1283         movdqa  (%edx, %ecx), %xmm2
1284         movdqa  %xmm2, %xmm4
1286         palignr $10, %xmm3, %xmm2
1288         pcmpeqb %xmm1, %xmm0
1289         pcmpeqb %xmm2, %xmm1
1290         psubb   %xmm0, %xmm1
1291         pmovmskb %xmm1, %esi
1292         sub     $0xffff, %esi
1293         jnz     L(exit)
1295 #ifdef USE_AS_STRNCMP
1296         cmp     $16, %ebp
1297         lea     -16(%ebp), %ebp
1298         jbe     L(more8byteseq)
1299 #endif
1300         add     $16, %ecx
1301         movdqa  %xmm4, %xmm3
1302         jmp     L(loop_ashr_10)
1304         .p2align 4
1305 L(nibble_ashr_10):
1306         pcmpeqb %xmm3, %xmm0
1307         pmovmskb %xmm0, %esi
1308         test    $0xfc00, %esi
1309         jnz     L(ashr_10_exittail)
1311 #ifdef USE_AS_STRNCMP
1312         cmp     $6, %ebp
1313         jbe     L(ashr_10_exittail)
1314 #endif
1315         pxor    %xmm0, %xmm0
1316         sub     $0x1000, %edi
1317         jmp     L(gobble_ashr_10)
1319         .p2align 4
1320 L(ashr_10_exittail):
1321         movdqa  (%eax, %ecx), %xmm1
1322         psrldq  $10, %xmm0
1323         psrldq  $10, %xmm3
1324         jmp     L(aftertail)
1327  * The following cases will be handled by ashr_11
1328  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1329  *        n(5~15)            n - 5            10(15 +(n-5) - n)         ashr_11
1330  */
1331         .p2align 4
1332 L(ashr_11):
1333         mov     $0xffff, %esi
1334         pxor    %xmm0, %xmm0
1335         movdqa  (%edx), %xmm2
1336         movdqa  (%eax), %xmm1
1337         pcmpeqb %xmm1, %xmm0
1338         pslldq  $5, %xmm2
1339         pcmpeqb %xmm1, %xmm2
1340         psubb   %xmm0, %xmm2
1341         pmovmskb %xmm2, %edi
1342         shr     %cl, %esi
1343         shr     %cl, %edi
1344         sub     %edi, %esi
1345         lea     -5(%ecx), %edi
1346         jnz     L(less32bytes)
1348         UPDATE_STRNCMP_COUNTER
1350         movdqa  (%edx), %xmm3
1351         pxor    %xmm0, %xmm0
1352         mov     $16, %ecx
1353         or      $11, %ebx
1354         lea     11(%edx), %edi
1355         and     $0xfff, %edi
1356         sub     $0x1000, %edi
1358         .p2align 4
1359 L(loop_ashr_11):
1360         add     $16, %edi
1361         jg      L(nibble_ashr_11)
1363 L(gobble_ashr_11):
1364         movdqa  (%eax, %ecx), %xmm1
1365         movdqa  (%edx, %ecx), %xmm2
1366         movdqa  %xmm2, %xmm4
1368         palignr $11, %xmm3, %xmm2
1370         pcmpeqb %xmm1, %xmm0
1371         pcmpeqb %xmm2, %xmm1
1372         psubb   %xmm0, %xmm1
1373         pmovmskb %xmm1, %esi
1374         sub     $0xffff, %esi
1375         jnz     L(exit)
1377 #ifdef USE_AS_STRNCMP
1378         cmp     $16, %ebp
1379         lea     -16(%ebp), %ebp
1380         jbe     L(more8byteseq)
1381 #endif
1382         add     $16, %ecx
1383         movdqa  %xmm4, %xmm3
1385         add     $16, %edi
1386         jg      L(nibble_ashr_11)
1388         movdqa  (%eax, %ecx), %xmm1
1389         movdqa  (%edx, %ecx), %xmm2
1390         movdqa  %xmm2, %xmm4
1392         palignr $11, %xmm3, %xmm2
1394         pcmpeqb %xmm1, %xmm0
1395         pcmpeqb %xmm2, %xmm1
1396         psubb   %xmm0, %xmm1
1397         pmovmskb %xmm1, %esi
1398         sub     $0xffff, %esi
1399         jnz     L(exit)
1401 #ifdef USE_AS_STRNCMP
1402         cmp     $16, %ebp
1403         lea     -16(%ebp), %ebp
1404         jbe     L(more8byteseq)
1405 #endif
1406         add     $16, %ecx
1407         movdqa  %xmm4, %xmm3
1408         jmp     L(loop_ashr_11)
1410         .p2align 4
1411 L(nibble_ashr_11):
1412         pcmpeqb %xmm3, %xmm0
1413         pmovmskb %xmm0, %esi
1414         test    $0xf800, %esi
1415         jnz     L(ashr_11_exittail)
1417 #ifdef USE_AS_STRNCMP
1418         cmp     $5, %ebp
1419         jbe     L(ashr_11_exittail)
1420 #endif
1421         pxor    %xmm0, %xmm0
1422         sub     $0x1000, %edi
1423         jmp     L(gobble_ashr_11)
1425         .p2align 4
1426 L(ashr_11_exittail):
1427         movdqa  (%eax, %ecx), %xmm1
1428         psrldq  $11, %xmm0
1429         psrldq  $11, %xmm3
1430         jmp     L(aftertail)
1433  * The following cases will be handled by ashr_12
1434  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1435  *        n(4~15)            n - 4            11(15 +(n-4) - n)         ashr_12
1436  */
1437         .p2align 4
1438 L(ashr_12):
1439         mov     $0xffff, %esi
1440         pxor    %xmm0, %xmm0
1441         movdqa  (%edx), %xmm2
1442         movdqa  (%eax), %xmm1
1443         pcmpeqb %xmm1, %xmm0
1444         pslldq  $4, %xmm2
1445         pcmpeqb %xmm1, %xmm2
1446         psubb   %xmm0, %xmm2
1447         pmovmskb %xmm2, %edi
1448         shr     %cl, %esi
1449         shr     %cl, %edi
1450         sub     %edi, %esi
1451         lea     -4(%ecx), %edi
1452         jnz     L(less32bytes)
1454         UPDATE_STRNCMP_COUNTER
1456         movdqa  (%edx), %xmm3
1457         pxor    %xmm0, %xmm0
1458         mov     $16, %ecx
1459         or      $12, %ebx
1460         lea     12(%edx), %edi
1461         and     $0xfff, %edi
1462         sub     $0x1000, %edi
1464         .p2align 4
1465 L(loop_ashr_12):
1466         add     $16, %edi
1467         jg      L(nibble_ashr_12)
1469 L(gobble_ashr_12):
1470         movdqa  (%eax, %ecx), %xmm1
1471         movdqa  (%edx, %ecx), %xmm2
1472         movdqa  %xmm2, %xmm4
1474         palignr $12, %xmm3, %xmm2
1476         pcmpeqb %xmm1, %xmm0
1477         pcmpeqb %xmm2, %xmm1
1478         psubb   %xmm0, %xmm1
1479         pmovmskb %xmm1, %esi
1480         sub     $0xffff, %esi
1481         jnz     L(exit)
1483         add     $16, %ecx
1484         movdqa  %xmm4, %xmm3
1486         add     $16, %edi
1487         jg      L(nibble_ashr_12)
1489 #ifdef USE_AS_STRNCMP
1490         cmp     $16, %ebp
1491         lea     -16(%ebp), %ebp
1492         jbe     L(more8byteseq)
1493 #endif
1494         movdqa  (%eax, %ecx), %xmm1
1495         movdqa  (%edx, %ecx), %xmm2
1496         movdqa  %xmm2, %xmm4
1498         palignr $12, %xmm3, %xmm2
1500         pcmpeqb %xmm1, %xmm0
1501         pcmpeqb %xmm2, %xmm1
1502         psubb   %xmm0, %xmm1
1503         pmovmskb %xmm1, %esi
1504         sub     $0xffff, %esi
1505         jnz     L(exit)
1507 #ifdef USE_AS_STRNCMP
1508         cmp     $16, %ebp
1509         lea     -16(%ebp), %ebp
1510         jbe     L(more8byteseq)
1511 #endif
1512         add     $16, %ecx
1513         movdqa  %xmm4, %xmm3
1514         jmp     L(loop_ashr_12)
1516         .p2align 4
1517 L(nibble_ashr_12):
1518         pcmpeqb %xmm3, %xmm0
1519         pmovmskb %xmm0, %esi
1520         test    $0xf000, %esi
1521         jnz     L(ashr_12_exittail)
1523 #ifdef USE_AS_STRNCMP
1524         cmp     $4, %ebp
1525         jbe     L(ashr_12_exittail)
1526 #endif
1527         pxor    %xmm0, %xmm0
1528         sub     $0x1000, %edi
1529         jmp     L(gobble_ashr_12)
1531         .p2align 4
1532 L(ashr_12_exittail):
1533         movdqa  (%eax, %ecx), %xmm1
1534         psrldq  $12, %xmm0
1535         psrldq  $12, %xmm3
1536         jmp     L(aftertail)
1539  * The following cases will be handled by ashr_13
1540  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1541  *        n(3~15)            n - 3            12(15 +(n-3) - n)         ashr_13
1542  */
1543         .p2align 4
1544 L(ashr_13):
1545         mov     $0xffff, %esi
1546         pxor    %xmm0, %xmm0
1547         movdqa  (%edx), %xmm2
1548         movdqa  (%eax), %xmm1
1549         pcmpeqb %xmm1, %xmm0
1550         pslldq  $3, %xmm2
1551         pcmpeqb %xmm1, %xmm2
1552         psubb   %xmm0, %xmm2
1553         pmovmskb %xmm2, %edi
1554         shr     %cl, %esi
1555         shr     %cl, %edi
1556         sub     %edi, %esi
1557         lea     -3(%ecx), %edi
1558         jnz     L(less32bytes)
1560         UPDATE_STRNCMP_COUNTER
1562         movdqa  (%edx), %xmm3
1563         pxor    %xmm0, %xmm0
1564         mov     $16, %ecx
1565         or      $13, %ebx
1566         lea     13(%edx), %edi
1567         and     $0xfff, %edi
1568         sub     $0x1000, %edi
1570         .p2align 4
1571 L(loop_ashr_13):
1572         add     $16, %edi
1573         jg      L(nibble_ashr_13)
1575 L(gobble_ashr_13):
1576         movdqa  (%eax, %ecx), %xmm1
1577         movdqa  (%edx, %ecx), %xmm2
1578         movdqa  %xmm2, %xmm4
1580         palignr $13, %xmm3, %xmm2
1582         pcmpeqb %xmm1, %xmm0
1583         pcmpeqb %xmm2, %xmm1
1584         psubb   %xmm0, %xmm1
1585         pmovmskb %xmm1, %esi
1586         sub     $0xffff, %esi
1587         jnz     L(exit)
1589 #ifdef USE_AS_STRNCMP
1590         cmp     $16, %ebp
1591         lea     -16(%ebp), %ebp
1592         jbe     L(more8byteseq)
1593 #endif
1594         add     $16, %ecx
1595         movdqa  %xmm4, %xmm3
1597         add     $16, %edi
1598         jg      L(nibble_ashr_13)
1600         movdqa  (%eax, %ecx), %xmm1
1601         movdqa  (%edx, %ecx), %xmm2
1602         movdqa  %xmm2, %xmm4
1604         palignr $13, %xmm3, %xmm2
1606         pcmpeqb %xmm1, %xmm0
1607         pcmpeqb %xmm2, %xmm1
1608         psubb   %xmm0, %xmm1
1609         pmovmskb %xmm1, %esi
1610         sub     $0xffff, %esi
1611         jnz     L(exit)
1613 #ifdef USE_AS_STRNCMP
1614         cmp     $16, %ebp
1615         lea     -16(%ebp), %ebp
1616         jbe     L(more8byteseq)
1617 #endif
1618         add     $16, %ecx
1619         movdqa  %xmm4, %xmm3
1620         jmp     L(loop_ashr_13)
1622         .p2align 4
1623 L(nibble_ashr_13):
1624         pcmpeqb %xmm3, %xmm0
1625         pmovmskb %xmm0, %esi
1626         test    $0xe000, %esi
1627         jnz     L(ashr_13_exittail)
1629 #ifdef USE_AS_STRNCMP
1630         cmp     $3, %ebp
1631         jbe     L(ashr_13_exittail)
1632 #endif
1633         pxor    %xmm0, %xmm0
1634         sub     $0x1000, %edi
1635         jmp     L(gobble_ashr_13)
1637         .p2align 4
1638 L(ashr_13_exittail):
1639         movdqa  (%eax, %ecx), %xmm1
1640         psrldq  $13, %xmm0
1641         psrldq  $13, %xmm3
1642         jmp     L(aftertail)
1645  * The following cases will be handled by ashr_14
1646  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1647  *        n(2~15)            n - 2            13(15 +(n-2) - n)         ashr_14
1648  */
1649         .p2align 4
1650 L(ashr_14):
1651         mov     $0xffff, %esi
1652         pxor    %xmm0, %xmm0
1653         movdqa  (%edx), %xmm2
1654         movdqa  (%eax), %xmm1
1655         pcmpeqb %xmm1, %xmm0
1656         pslldq  $2, %xmm2
1657         pcmpeqb %xmm1, %xmm2
1658         psubb   %xmm0, %xmm2
1659         pmovmskb %xmm2, %edi
1660         shr     %cl, %esi
1661         shr     %cl, %edi
1662         sub     %edi, %esi
1663         lea     -2(%ecx), %edi
1664         jnz     L(less32bytes)
1666         UPDATE_STRNCMP_COUNTER
1668         movdqa  (%edx), %xmm3
1669         pxor    %xmm0, %xmm0
1670         mov     $16, %ecx
1671         or      $14, %ebx
1672         lea     14(%edx), %edi
1673         and     $0xfff, %edi
1674         sub     $0x1000, %edi
1676         .p2align 4
1677 L(loop_ashr_14):
1678         add     $16, %edi
1679         jg      L(nibble_ashr_14)
1681 L(gobble_ashr_14):
1682         movdqa  (%eax, %ecx), %xmm1
1683         movdqa  (%edx, %ecx), %xmm2
1684         movdqa  %xmm2, %xmm4
1686         palignr $14, %xmm3, %xmm2
1688         pcmpeqb %xmm1, %xmm0
1689         pcmpeqb %xmm2, %xmm1
1690         psubb   %xmm0, %xmm1
1691         pmovmskb %xmm1, %esi
1692         sub     $0xffff, %esi
1693         jnz     L(exit)
1695 #ifdef USE_AS_STRNCMP
1696         cmp     $16, %ebp
1697         lea     -16(%ebp), %ebp
1698         jbe     L(more8byteseq)
1699 #endif
1700         add     $16, %ecx
1701         movdqa  %xmm4, %xmm3
1703         add     $16, %edi
1704         jg      L(nibble_ashr_14)
1706         movdqa  (%eax, %ecx), %xmm1
1707         movdqa  (%edx, %ecx), %xmm2
1708         movdqa  %xmm2, %xmm4
1710         palignr $14, %xmm3, %xmm2
1712         pcmpeqb %xmm1, %xmm0
1713         pcmpeqb %xmm2, %xmm1
1714         psubb   %xmm0, %xmm1
1715         pmovmskb %xmm1, %esi
1716         sub     $0xffff, %esi
1717         jnz     L(exit)
1719 #ifdef USE_AS_STRNCMP
1720         cmp     $16, %ebp
1721         lea     -16(%ebp), %ebp
1722         jbe     L(more8byteseq)
1723 #endif
1724         add     $16, %ecx
1725         movdqa  %xmm4, %xmm3
1726         jmp     L(loop_ashr_14)
1728         .p2align 4
1729 L(nibble_ashr_14):
1730         pcmpeqb %xmm3, %xmm0
1731         pmovmskb %xmm0, %esi
1732         test    $0xc000, %esi
1733         jnz     L(ashr_14_exittail)
1735 #ifdef USE_AS_STRNCMP
1736         cmp     $2, %ebp
1737         jbe     L(ashr_14_exittail)
1738 #endif
1739         pxor    %xmm0, %xmm0
1740         sub     $0x1000, %edi
1741         jmp     L(gobble_ashr_14)
1743         .p2align 4
1744 L(ashr_14_exittail):
1745         movdqa  (%eax, %ecx), %xmm1
1746         psrldq  $14, %xmm0
1747         psrldq  $14, %xmm3
1748         jmp     L(aftertail)
1751  * The following cases will be handled by ashr_14
1752  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1753  *        n(1~15)            n - 1            14(15 +(n-1) - n)         ashr_15
1754  */
1756         .p2align 4
1757 L(ashr_15):
1758         mov     $0xffff, %esi
1759         pxor    %xmm0, %xmm0
1760         movdqa  (%edx), %xmm2
1761         movdqa  (%eax), %xmm1
1762         pcmpeqb %xmm1, %xmm0
1763         pslldq  $1, %xmm2
1764         pcmpeqb %xmm1, %xmm2
1765         psubb   %xmm0, %xmm2
1766         pmovmskb %xmm2, %edi
1767         shr     %cl, %esi
1768         shr     %cl, %edi
1769         sub     %edi, %esi
1770         lea     -1(%ecx), %edi
1771         jnz     L(less32bytes)
1773         UPDATE_STRNCMP_COUNTER
1775         movdqa  (%edx), %xmm3
1776         pxor    %xmm0, %xmm0
1777         mov     $16, %ecx
1778         or      $15, %ebx
1779         lea     15(%edx), %edi
1780         and     $0xfff, %edi
1781         sub     $0x1000, %edi
1783         .p2align 4
1784 L(loop_ashr_15):
1785         add     $16, %edi
1786         jg      L(nibble_ashr_15)
1788 L(gobble_ashr_15):
1789         movdqa  (%eax, %ecx), %xmm1
1790         movdqa  (%edx, %ecx), %xmm2
1791         movdqa  %xmm2, %xmm4
1793         palignr $15, %xmm3, %xmm2
1795         pcmpeqb %xmm1, %xmm0
1796         pcmpeqb %xmm2, %xmm1
1797         psubb   %xmm0, %xmm1
1798         pmovmskb %xmm1, %esi
1799         sub     $0xffff, %esi
1800         jnz     L(exit)
1802 #ifdef USE_AS_STRNCMP
1803         cmp     $16, %ebp
1804         lea     -16(%ebp), %ebp
1805         jbe     L(more8byteseq)
1806 #endif
1807         add     $16, %ecx
1808         movdqa  %xmm4, %xmm3
1810         add     $16, %edi
1811         jg      L(nibble_ashr_15)
1813         movdqa  (%eax, %ecx), %xmm1
1814         movdqa  (%edx, %ecx), %xmm2
1815         movdqa  %xmm2, %xmm4
1817         palignr $15, %xmm3, %xmm2
1819         pcmpeqb %xmm1, %xmm0
1820         pcmpeqb %xmm2, %xmm1
1821         psubb   %xmm0, %xmm1
1822         pmovmskb %xmm1, %esi
1823         sub     $0xffff, %esi
1824         jnz     L(exit)
1826 #ifdef USE_AS_STRNCMP
1827         cmp     $16, %ebp
1828         lea     -16(%ebp), %ebp
1829         jbe     L(more8byteseq)
1830 #endif
1831         add     $16, %ecx
1832         movdqa  %xmm4, %xmm3
1833         jmp     L(loop_ashr_15)
1835         .p2align 4
1836 L(nibble_ashr_15):
1837         pcmpeqb %xmm3, %xmm0
1838         pmovmskb %xmm0, %esi
1839         test    $0x8000, %esi
1840         jnz     L(ashr_15_exittail)
1842 #ifdef USE_AS_STRNCMP
1843         cmp     $1, %ebp
1844         jbe     L(ashr_15_exittail)
1845 #endif
1846         pxor    %xmm0, %xmm0
1847         sub     $0x1000, %edi
1848         jmp     L(gobble_ashr_15)
1850         .p2align 4
1851 L(ashr_15_exittail):
1852         movdqa  (%eax, %ecx), %xmm1
1853         psrldq  $15, %xmm0
1854         psrldq  $15, %xmm3
1855         jmp     L(aftertail)
1857         .p2align 4
1858 L(aftertail):
1859         pcmpeqb %xmm3, %xmm1
1860         psubb   %xmm0, %xmm1
1861         pmovmskb %xmm1, %esi
1862         not     %esi
1863 L(exit):
1864         mov     %ebx, %edi
1865         and     $0x1f, %edi
1866         lea     -16(%edi, %ecx), %edi
1867 L(less32bytes):
1868         add     %edi, %edx
1869         add     %ecx, %eax
1870         test    $0x20, %ebx
1871         jz      L(ret2)
1872         xchg    %eax, %edx
1874         .p2align 4
1875 L(ret2):
1876         mov     %esi, %ecx
1877         POP     (%esi)
1878         POP     (%edi)
1879         POP     (%ebx)
1880 L(less16bytes):
1881         test    %cl, %cl
1882         jz      L(2next_8_bytes)
1884         test    $0x01, %cl
1885         jnz     L(Byte0)
1887         test    $0x02, %cl
1888         jnz     L(Byte1)
1890         test    $0x04, %cl
1891         jnz     L(Byte2)
1893         test    $0x08, %cl
1894         jnz     L(Byte3)
1896         test    $0x10, %cl
1897         jnz     L(Byte4)
1899         test    $0x20, %cl
1900         jnz     L(Byte5)
1902         test    $0x40, %cl
1903         jnz     L(Byte6)
1904 #ifdef USE_AS_STRNCMP
1905         cmp     $7, %ebp
1906         jbe     L(eq)
1907 #endif
1909         movzx   7(%eax), %ecx
1910         movzx   7(%edx), %eax
1912         sub     %ecx, %eax
1913 #ifdef USE_AS_STRNCMP
1914         POP     (%ebp)
1915 #endif
1916         ret
1918         .p2align 4
1919 L(Byte0):
1920 #ifdef USE_AS_STRNCMP
1921         cmp     $0, %ebp
1922         jbe     L(eq)
1923 #endif
1924         movzx   (%eax), %ecx
1925         movzx   (%edx), %eax
1927         sub     %ecx, %eax
1928 #ifdef USE_AS_STRNCMP
1929         POP     (%ebp)
1930 #endif
1931         ret
1933         .p2align 4
1934 L(Byte1):
1935 #ifdef USE_AS_STRNCMP
1936         cmp     $1, %ebp
1937         jbe     L(eq)
1938 #endif
1939         movzx   1(%eax), %ecx
1940         movzx   1(%edx), %eax
1942         sub     %ecx, %eax
1943 #ifdef USE_AS_STRNCMP
1944         POP     (%ebp)
1945 #endif
1946         ret
1948         .p2align 4
1949 L(Byte2):
1950 #ifdef USE_AS_STRNCMP
1951         cmp     $2, %ebp
1952         jbe     L(eq)
1953 #endif
1954         movzx   2(%eax), %ecx
1955         movzx   2(%edx), %eax
1957         sub     %ecx, %eax
1958 #ifdef USE_AS_STRNCMP
1959         POP     (%ebp)
1960 #endif
1961         ret
1963         .p2align 4
1964 L(Byte3):
1965 #ifdef USE_AS_STRNCMP
1966         cmp     $3, %ebp
1967         jbe     L(eq)
1968 #endif
1969         movzx   3(%eax), %ecx
1970         movzx   3(%edx), %eax
1972         sub     %ecx, %eax
1973 #ifdef USE_AS_STRNCMP
1974         POP     (%ebp)
1975 #endif
1976         ret
1978         .p2align 4
1979 L(Byte4):
1980 #ifdef USE_AS_STRNCMP
1981         cmp     $4, %ebp
1982         jbe     L(eq)
1983 #endif
1984         movzx   4(%eax), %ecx
1985         movzx   4(%edx), %eax
1987         sub     %ecx, %eax
1988 #ifdef USE_AS_STRNCMP
1989         POP     (%ebp)
1990 #endif
1991         ret
1992         .p2align 4
1993 L(Byte5):
1994 #ifdef USE_AS_STRNCMP
1995         cmp     $5, %ebp
1996         jbe     L(eq)
1997 #endif
1998         movzx   5(%eax), %ecx
1999         movzx   5(%edx), %eax
2001         sub     %ecx, %eax
2002 #ifdef USE_AS_STRNCMP
2003         POP     (%ebp)
2004 #endif
2005         ret
2007         .p2align 4
2008 L(Byte6):
2009 #ifdef USE_AS_STRNCMP
2010         cmp     $6, %ebp
2011         jbe     L(eq)
2012 #endif
2013         movzx   6(%eax), %ecx
2014         movzx   6(%edx), %eax
2016         sub     %ecx, %eax
2017 #ifdef USE_AS_STRNCMP
2018         POP     (%ebp)
2019 #endif
2020         ret
2022         .p2align 4
2023 L(2next_8_bytes):
2024         add     $8, %eax
2025         add     $8, %edx
2026 #ifdef USE_AS_STRNCMP
2027         cmp     $8, %ebp
2028         lea     -8(%ebp), %ebp
2029         jbe     L(eq)
2030 #endif
2032         test    $0x01, %ch
2033         jnz     L(Byte0)
2035         test    $0x02, %ch
2036         jnz     L(Byte1)
2038         test    $0x04, %ch
2039         jnz     L(Byte2)
2041         test    $0x08, %ch
2042         jnz     L(Byte3)
2044         test    $0x10, %ch
2045         jnz     L(Byte4)
2047         test    $0x20, %ch
2048         jnz     L(Byte5)
2050         test    $0x40, %ch
2051         jnz     L(Byte6)
2053 #ifdef USE_AS_STRNCMP
2054         cmp     $7, %ebp
2055         jbe     L(eq)
2056 #endif
2057         movzx   7(%eax), %ecx
2058         movzx   7(%edx), %eax
2060         sub     %ecx, %eax
2061 #ifdef USE_AS_STRNCMP
2062         POP     (%ebp)
2063 #endif
2064         ret
2066 L(neq):
2067         mov     $1, %eax
2068         ja      L(neq_bigger)
2069         neg     %eax
2070 L(neq_bigger):
2071 #ifdef USE_AS_STRNCMP
2072         POP     (%ebp)
2073 #endif
2074         ret
2076 #ifdef USE_AS_STRNCMP
2077 L(more8byteseq):
2078         POP     (%esi)
2079         POP     (%edi)
2080         POP     (%ebx)
2081 #endif
2083 L(eq):
2085 #ifdef USE_AS_STRNCMP
2086         POP     (%ebp)
2087 #endif
2088         xorl    %eax, %eax
2089         ret
2090 #ifdef USE_AS_STRNCMP
2091 L(less16bytes_sncmp):
2092         test    %ebp, %ebp
2093         jz      L(eq)
2095         movzbl  (%eax), %ecx
2096         cmpb    %cl, (%edx)
2097         jne     L(neq)
2098         test    %cl, %cl
2099         je      L(eq)
2101         cmp     $1, %ebp
2102         je      L(eq)
2104         movzbl  1(%eax), %ecx
2105         cmpb    %cl, 1(%edx)
2106         jne     L(neq)
2107         test    %cl, %cl
2108         je      L(eq)
2110         cmp     $2, %ebp
2111         je      L(eq)
2113         movzbl  2(%eax), %ecx
2114         cmpb    %cl, 2(%edx)
2115         jne     L(neq)
2116         test    %cl, %cl
2117         je      L(eq)
2119         cmp     $3, %ebp
2120         je      L(eq)
2122         movzbl  3(%eax), %ecx
2123         cmpb    %cl, 3(%edx)
2124         jne     L(neq)
2125         test    %cl, %cl
2126         je      L(eq)
2128         cmp     $4, %ebp
2129         je      L(eq)
2131         movzbl  4(%eax), %ecx
2132         cmpb    %cl, 4(%edx)
2133         jne     L(neq)
2134         test    %cl, %cl
2135         je      L(eq)
2137         cmp     $5, %ebp
2138         je      L(eq)
2140         movzbl  5(%eax), %ecx
2141         cmpb    %cl, 5(%edx)
2142         jne     L(neq)
2143         test    %cl, %cl
2144         je      L(eq)
2146         cmp     $6, %ebp
2147         je      L(eq)
2149         movzbl  6(%eax), %ecx
2150         cmpb    %cl, 6(%edx)
2151         jne     L(neq)
2152         test    %cl, %cl
2153         je      L(eq)
2155         cmp     $7, %ebp
2156         je      L(eq)
2158         movzbl  7(%eax), %ecx
2159         cmpb    %cl, 7(%edx)
2160         jne     L(neq)
2161         test    %cl, %cl
2162         je      L(eq)
2165         cmp     $8, %ebp
2166         je      L(eq)
2168         movzbl  8(%eax), %ecx
2169         cmpb    %cl, 8(%edx)
2170         jne     L(neq)
2171         test    %cl, %cl
2172         je      L(eq)
2174         cmp     $9, %ebp
2175         je      L(eq)
2177         movzbl  9(%eax), %ecx
2178         cmpb    %cl, 9(%edx)
2179         jne     L(neq)
2180         test    %cl, %cl
2181         je      L(eq)
2183         cmp     $10, %ebp
2184         je      L(eq)
2186         movzbl  10(%eax), %ecx
2187         cmpb    %cl, 10(%edx)
2188         jne     L(neq)
2189         test    %cl, %cl
2190         je      L(eq)
2192         cmp     $11, %ebp
2193         je      L(eq)
2195         movzbl  11(%eax), %ecx
2196         cmpb    %cl, 11(%edx)
2197         jne     L(neq)
2198         test    %cl, %cl
2199         je      L(eq)
2202         cmp     $12, %ebp
2203         je      L(eq)
2205         movzbl  12(%eax), %ecx
2206         cmpb    %cl, 12(%edx)
2207         jne     L(neq)
2208         test    %cl, %cl
2209         je      L(eq)
2211         cmp     $13, %ebp
2212         je      L(eq)
2214         movzbl  13(%eax), %ecx
2215         cmpb    %cl, 13(%edx)
2216         jne     L(neq)
2217         test    %cl, %cl
2218         je      L(eq)
2220         cmp     $14, %ebp
2221         je      L(eq)
2223         movzbl  14(%eax), %ecx
2224         cmpb    %cl, 14(%edx)
2225         jne     L(neq)
2226         test    %cl, %cl
2227         je      L(eq)
2229         cmp     $15, %ebp
2230         je      L(eq)
2232         movzbl  15(%eax), %ecx
2233         cmpb    %cl, 15(%edx)
2234         jne     L(neq)
2235         test    %cl, %cl
2236         je      L(eq)
2238         POP     (%ebp)
2239         xor     %eax, %eax
2240         ret
2241 #endif
2243 END (STRCMP)
2245 #endif