Fix sysdeps/i386/i686/multiarch/memcmp-ssse3.S
[glibc.git] / sysdeps / i386 / i686 / multiarch / memcmp-ssse3.S
blob2e0d15fe55de0a11d93b3cf39f839756785afb3d
1 /* memcmp 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 #ifndef MEMCMP
27 # define MEMCMP         __memcmp_ssse3
28 #endif
30 #define CFI_PUSH(REG)                                           \
31   cfi_adjust_cfa_offset (4);                                    \
32   cfi_rel_offset (REG, 0)
34 #define CFI_POP(REG)                                            \
35   cfi_adjust_cfa_offset (-4);                                   \
36   cfi_restore (REG)
38 #define PUSH(REG)       pushl REG; CFI_PUSH (REG)
39 #define POP(REG)        popl REG; CFI_POP (REG)
41 #define PARMS           4
42 #define BLK1            PARMS
43 #define BLK2            BLK1+4
44 #define LEN             BLK2+4
45 #define RETURN_END      POP (%edi); POP (%esi); POP (%ebx); ret
46 #define RETURN          RETURN_END; cfi_restore_state; cfi_remember_state
48         .section .text.ssse3,"ax",@progbits
49 ENTRY (MEMCMP)
50         movl    LEN(%esp), %ecx
51         movl    BLK1(%esp), %eax
52         cmp     $48, %ecx
53         movl    BLK2(%esp), %edx
54         jae     L(48bytesormore)
55         cmp     $1, %ecx
56         jbe     L(less1bytes)
57         PUSH (%ebx)
58         add     %ecx, %edx
59         add     %ecx, %eax
60         jmp     L(less48bytes)
62         ALIGN (4)
63         CFI_POP (%ebx)
64 L(less1bytes):
65         jb      L(zero)
66         movb    (%eax), %cl
67         cmp     (%edx), %cl
68         je      L(zero)
69         mov     $1, %eax
70         ja      L(1bytesend)
71         neg     %eax
72 L(1bytesend):
73         ret
75         ALIGN (4)
76 L(zero):
77         mov     $0, %eax
78         ret
80         ALIGN (4)
81 L(48bytesormore):
82         PUSH (%ebx)
83         PUSH (%esi)
84         PUSH (%edi)
85         cfi_remember_state
86         movdqu    (%eax), %xmm3
87         movdqu    (%edx), %xmm0
88         movl    %eax, %edi
89         movl    %edx, %esi
90         pcmpeqb   %xmm0, %xmm3
91         pmovmskb  %xmm3, %edx
92         lea     16(%edi), %edi
94         sub      $0xffff, %edx
95         lea     16(%esi), %esi
96         jnz       L(less16bytes)
97         mov     %edi, %edx
98         and     $0xf, %edx
99         xor     %edx, %edi
100         sub     %edx, %esi
101         add     %edx, %ecx
102         mov     %esi, %edx
103         and     $0xf, %edx
104         jz      L(shr_0)
105         xor     %edx, %esi
107         cmp     $8, %edx
108         jae     L(next_unaligned_table)
109         cmp     $0, %edx
110         je      L(shr_0)
111         cmp     $1, %edx
112         je      L(shr_1)
113         cmp     $2, %edx
114         je      L(shr_2)
115         cmp     $3, %edx
116         je      L(shr_3)
117         cmp     $4, %edx
118         je      L(shr_4)
119         cmp     $5, %edx
120         je      L(shr_5)
121         cmp     $6, %edx
122         je      L(shr_6)
123         jmp     L(shr_7)
125         ALIGN (4)
126 L(next_unaligned_table):
127         cmp     $8, %edx
128         je      L(shr_8)
129         cmp     $9, %edx
130         je      L(shr_9)
131         cmp     $10, %edx
132         je      L(shr_10)
133         cmp     $11, %edx
134         je      L(shr_11)
135         cmp     $12, %edx
136         je      L(shr_12)
137         cmp     $13, %edx
138         je      L(shr_13)
139         cmp     $14, %edx
140         je      L(shr_14)
141         jmp     L(shr_15)
143         ALIGN (4)
144 L(shr_0):
145         cmp     $80, %ecx
146         jae     L(shr_0_gobble)
147         lea     -48(%ecx), %ecx
148         xor     %eax, %eax
149         movaps  (%esi), %xmm1
150         pcmpeqb (%edi), %xmm1
151         movaps  16(%esi), %xmm2
152         pcmpeqb 16(%edi), %xmm2
153         pand    %xmm1, %xmm2
154         pmovmskb %xmm2, %edx
155         add     $32, %edi
156         add     $32, %esi
157         sub     $0xffff, %edx
158         jnz     L(exit)
160         lea     (%ecx, %edi,1), %eax
161         lea     (%ecx, %esi,1), %edx
162         POP (%edi)
163         POP (%esi)
164         jmp     L(less48bytes)
166         cfi_restore_state
167         cfi_remember_state
168         ALIGN (4)
169 L(shr_0_gobble):
170         lea     -48(%ecx), %ecx
171         movdqa  (%esi), %xmm0
172         xor     %eax, %eax
173         pcmpeqb (%edi), %xmm0
174         sub     $32, %ecx
175         movdqa  16(%esi), %xmm2
176         pcmpeqb 16(%edi), %xmm2
177 L(shr_0_gobble_loop):
178         pand    %xmm0, %xmm2
179         sub     $32, %ecx
180         pmovmskb %xmm2, %edx
181         movdqa  %xmm0, %xmm1
182         movdqa  32(%esi), %xmm0
183         movdqa  48(%esi), %xmm2
184         sbb     $0xffff, %edx
185         pcmpeqb 32(%edi), %xmm0
186         pcmpeqb 48(%edi), %xmm2
187         lea     32(%edi), %edi
188         lea     32(%esi), %esi
189         jz      L(shr_0_gobble_loop)
191         pand    %xmm0, %xmm2
192         cmp     $0, %ecx
193         jge     L(shr_0_gobble_loop_next)
194         inc     %edx
195         add     $32, %ecx
196 L(shr_0_gobble_loop_next):
197         test    %edx, %edx
198         jnz     L(exit)
200         pmovmskb %xmm2, %edx
201         movdqa  %xmm0, %xmm1
202         lea     32(%edi), %edi
203         lea     32(%esi), %esi
204         sub     $0xffff, %edx
205         jnz     L(exit)
206         lea     (%ecx, %edi,1), %eax
207         lea     (%ecx, %esi,1), %edx
208         POP (%edi)
209         POP (%esi)
210         jmp     L(less48bytes)
212         cfi_restore_state
213         cfi_remember_state
214         ALIGN (4)
215 L(shr_1):
216         cmp     $80, %ecx
217         lea     -48(%ecx), %ecx
218         mov     %edx, %eax
219         jae     L(shr_1_gobble)
221         movdqa  16(%esi), %xmm1
222         movdqa  %xmm1, %xmm2
223         palignr $1,(%esi), %xmm1
224         pcmpeqb (%edi), %xmm1
226         movdqa  32(%esi), %xmm3
227         palignr $1,%xmm2, %xmm3
228         pcmpeqb 16(%edi), %xmm3
230         pand    %xmm1, %xmm3
231         pmovmskb %xmm3, %edx
232         lea     32(%edi), %edi
233         lea     32(%esi), %esi
234         sub     $0xffff, %edx
235         jnz     L(exit)
236         lea     (%ecx, %edi,1), %eax
237         lea     1(%ecx, %esi,1), %edx
238         POP (%edi)
239         POP (%esi)
240         jmp     L(less48bytes)
242         cfi_restore_state
243         cfi_remember_state
244         ALIGN (4)
245 L(shr_1_gobble):
246         sub     $32, %ecx
247         movdqa  16(%esi), %xmm0
248         palignr $1,(%esi), %xmm0
249         pcmpeqb (%edi), %xmm0
251         movdqa  32(%esi), %xmm3
252         palignr $1,16(%esi), %xmm3
253         pcmpeqb 16(%edi), %xmm3
255 L(shr_1_gobble_loop):
256         pand    %xmm0, %xmm3
257         sub     $32, %ecx
258         pmovmskb %xmm3, %edx
259         movdqa  %xmm0, %xmm1
261         movdqa  64(%esi), %xmm3
262         palignr $1,48(%esi), %xmm3
263         sbb     $0xffff, %edx
264         movdqa  48(%esi), %xmm0
265         palignr $1,32(%esi), %xmm0
266         pcmpeqb 32(%edi), %xmm0
267         lea     32(%esi), %esi
268         pcmpeqb 48(%edi), %xmm3
270         lea     32(%edi), %edi
271         jz      L(shr_1_gobble_loop)
272         pand    %xmm0, %xmm3
274         cmp     $0, %ecx
275         jge     L(shr_1_gobble_next)
276         inc     %edx
277         add     $32, %ecx
278 L(shr_1_gobble_next):
279         test    %edx, %edx
280         jnz     L(exit)
282         pmovmskb %xmm3, %edx
283         movdqa  %xmm0, %xmm1
284         lea     32(%edi), %edi
285         lea     32(%esi), %esi
286         sub     $0xffff, %edx
287         jnz     L(exit)
289         lea     (%ecx, %edi,1), %eax
290         lea     1(%ecx, %esi,1), %edx
291         POP (%edi)
292         POP (%esi)
293         jmp     L(less48bytes)
296         cfi_restore_state
297         cfi_remember_state
298         ALIGN (4)
299 L(shr_2):
300         cmp     $80, %ecx
301         lea     -48(%ecx), %ecx
302         mov     %edx, %eax
303         jae     L(shr_2_gobble)
305         movdqa  16(%esi), %xmm1
306         movdqa  %xmm1, %xmm2
307         palignr $2,(%esi), %xmm1
308         pcmpeqb (%edi), %xmm1
310         movdqa  32(%esi), %xmm3
311         palignr $2,%xmm2, %xmm3
312         pcmpeqb 16(%edi), %xmm3
314         pand    %xmm1, %xmm3
315         pmovmskb %xmm3, %edx
316         lea     32(%edi), %edi
317         lea     32(%esi), %esi
318         sub     $0xffff, %edx
319         jnz     L(exit)
320         lea     (%ecx, %edi,1), %eax
321         lea     2(%ecx, %esi,1), %edx
322         POP (%edi)
323         POP (%esi)
324         jmp     L(less48bytes)
326         cfi_restore_state
327         cfi_remember_state
328         ALIGN (4)
329 L(shr_2_gobble):
330         sub     $32, %ecx
331         movdqa  16(%esi), %xmm0
332         palignr $2,(%esi), %xmm0
333         pcmpeqb (%edi), %xmm0
335         movdqa  32(%esi), %xmm3
336         palignr $2,16(%esi), %xmm3
337         pcmpeqb 16(%edi), %xmm3
339 L(shr_2_gobble_loop):
340         pand    %xmm0, %xmm3
341         sub     $32, %ecx
342         pmovmskb %xmm3, %edx
343         movdqa  %xmm0, %xmm1
345         movdqa  64(%esi), %xmm3
346         palignr $2,48(%esi), %xmm3
347         sbb     $0xffff, %edx
348         movdqa  48(%esi), %xmm0
349         palignr $2,32(%esi), %xmm0
350         pcmpeqb 32(%edi), %xmm0
351         lea     32(%esi), %esi
352         pcmpeqb 48(%edi), %xmm3
354         lea     32(%edi), %edi
355         jz      L(shr_2_gobble_loop)
356         pand    %xmm0, %xmm3
358         cmp     $0, %ecx
359         jge     L(shr_2_gobble_next)
360         inc     %edx
361         add     $32, %ecx
362 L(shr_2_gobble_next):
363         test    %edx, %edx
364         jnz     L(exit)
366         pmovmskb %xmm3, %edx
367         movdqa  %xmm0, %xmm1
368         lea     32(%edi), %edi
369         lea     32(%esi), %esi
370         sub     $0xffff, %edx
371         jnz     L(exit)
373         lea     (%ecx, %edi,1), %eax
374         lea     2(%ecx, %esi,1), %edx
375         POP (%edi)
376         POP (%esi)
377         jmp     L(less48bytes)
379         cfi_restore_state
380         cfi_remember_state
381         ALIGN (4)
382 L(shr_3):
383         cmp     $80, %ecx
384         lea     -48(%ecx), %ecx
385         mov     %edx, %eax
386         jae     L(shr_3_gobble)
388         movdqa  16(%esi), %xmm1
389         movdqa  %xmm1, %xmm2
390         palignr $3,(%esi), %xmm1
391         pcmpeqb (%edi), %xmm1
393         movdqa  32(%esi), %xmm3
394         palignr $3,%xmm2, %xmm3
395         pcmpeqb 16(%edi), %xmm3
397         pand    %xmm1, %xmm3
398         pmovmskb %xmm3, %edx
399         lea     32(%edi), %edi
400         lea     32(%esi), %esi
401         sub     $0xffff, %edx
402         jnz     L(exit)
403         lea     (%ecx, %edi,1), %eax
404         lea     3(%ecx, %esi,1), %edx
405         POP (%edi)
406         POP (%esi)
407         jmp     L(less48bytes)
409         cfi_restore_state
410         cfi_remember_state
411         ALIGN (4)
412 L(shr_3_gobble):
413         sub     $32, %ecx
414         movdqa  16(%esi), %xmm0
415         palignr $3,(%esi), %xmm0
416         pcmpeqb (%edi), %xmm0
418         movdqa  32(%esi), %xmm3
419         palignr $3,16(%esi), %xmm3
420         pcmpeqb 16(%edi), %xmm3
422 L(shr_3_gobble_loop):
423         pand    %xmm0, %xmm3
424         sub     $32, %ecx
425         pmovmskb %xmm3, %edx
426         movdqa  %xmm0, %xmm1
428         movdqa  64(%esi), %xmm3
429         palignr $3,48(%esi), %xmm3
430         sbb     $0xffff, %edx
431         movdqa  48(%esi), %xmm0
432         palignr $3,32(%esi), %xmm0
433         pcmpeqb 32(%edi), %xmm0
434         lea     32(%esi), %esi
435         pcmpeqb 48(%edi), %xmm3
437         lea     32(%edi), %edi
438         jz      L(shr_3_gobble_loop)
439         pand    %xmm0, %xmm3
441         cmp     $0, %ecx
442         jge     L(shr_3_gobble_next)
443         inc     %edx
444         add     $32, %ecx
445 L(shr_3_gobble_next):
446         test    %edx, %edx
447         jnz     L(exit)
449         pmovmskb %xmm3, %edx
450         movdqa  %xmm0, %xmm1
451         lea     32(%edi), %edi
452         lea     32(%esi), %esi
453         sub     $0xffff, %edx
454         jnz     L(exit)
456         lea     (%ecx, %edi,1), %eax
457         lea     3(%ecx, %esi,1), %edx
458         POP (%edi)
459         POP (%esi)
460         jmp     L(less48bytes)
462         cfi_restore_state
463         cfi_remember_state
464         ALIGN (4)
465 L(shr_4):
466         cmp     $80, %ecx
467         lea     -48(%ecx), %ecx
468         mov     %edx, %eax
469         jae     L(shr_4_gobble)
471         movdqa  16(%esi), %xmm1
472         movdqa  %xmm1, %xmm2
473         palignr $4,(%esi), %xmm1
474         pcmpeqb (%edi), %xmm1
476         movdqa  32(%esi), %xmm3
477         palignr $4,%xmm2, %xmm3
478         pcmpeqb 16(%edi), %xmm3
480         pand    %xmm1, %xmm3
481         pmovmskb %xmm3, %edx
482         lea     32(%edi), %edi
483         lea     32(%esi), %esi
484         sub     $0xffff, %edx
485         jnz     L(exit)
486         lea     (%ecx, %edi,1), %eax
487         lea     4(%ecx, %esi,1), %edx
488         POP (%edi)
489         POP (%esi)
490         jmp     L(less48bytes)
492         cfi_restore_state
493         cfi_remember_state
494         ALIGN (4)
495 L(shr_4_gobble):
496         sub     $32, %ecx
497         movdqa  16(%esi), %xmm0
498         palignr $4,(%esi), %xmm0
499         pcmpeqb (%edi), %xmm0
501         movdqa  32(%esi), %xmm3
502         palignr $4,16(%esi), %xmm3
503         pcmpeqb 16(%edi), %xmm3
505 L(shr_4_gobble_loop):
506         pand    %xmm0, %xmm3
507         sub     $32, %ecx
508         pmovmskb %xmm3, %edx
509         movdqa  %xmm0, %xmm1
511         movdqa  64(%esi), %xmm3
512         palignr $4,48(%esi), %xmm3
513         sbb     $0xffff, %edx
514         movdqa  48(%esi), %xmm0
515         palignr $4,32(%esi), %xmm0
516         pcmpeqb 32(%edi), %xmm0
517         lea     32(%esi), %esi
518         pcmpeqb 48(%edi), %xmm3
520         lea     32(%edi), %edi
521         jz      L(shr_4_gobble_loop)
522         pand    %xmm0, %xmm3
524         cmp     $0, %ecx
525         jge     L(shr_4_gobble_next)
526         inc     %edx
527         add     $32, %ecx
528 L(shr_4_gobble_next):
529         test    %edx, %edx
530         jnz     L(exit)
532         pmovmskb %xmm3, %edx
533         movdqa  %xmm0, %xmm1
534         lea     32(%edi), %edi
535         lea     32(%esi), %esi
536         sub     $0xffff, %edx
537         jnz     L(exit)
539         lea     (%ecx, %edi,1), %eax
540         lea     4(%ecx, %esi,1), %edx
541         POP (%edi)
542         POP (%esi)
543         jmp     L(less48bytes)
545         cfi_restore_state
546         cfi_remember_state
547         ALIGN (4)
548 L(shr_5):
549         cmp     $80, %ecx
550         lea     -48(%ecx), %ecx
551         mov     %edx, %eax
552         jae     L(shr_5_gobble)
554         movdqa  16(%esi), %xmm1
555         movdqa  %xmm1, %xmm2
556         palignr $5,(%esi), %xmm1
557         pcmpeqb (%edi), %xmm1
559         movdqa  32(%esi), %xmm3
560         palignr $5,%xmm2, %xmm3
561         pcmpeqb 16(%edi), %xmm3
563         pand    %xmm1, %xmm3
564         pmovmskb %xmm3, %edx
565         lea     32(%edi), %edi
566         lea     32(%esi), %esi
567         sub     $0xffff, %edx
568         jnz     L(exit)
569         lea     (%ecx, %edi,1), %eax
570         lea     5(%ecx, %esi,1), %edx
571         POP (%edi)
572         POP (%esi)
573         jmp     L(less48bytes)
575         cfi_restore_state
576         cfi_remember_state
577         ALIGN (4)
578 L(shr_5_gobble):
579         sub     $32, %ecx
580         movdqa  16(%esi), %xmm0
581         palignr $5,(%esi), %xmm0
582         pcmpeqb (%edi), %xmm0
584         movdqa  32(%esi), %xmm3
585         palignr $5,16(%esi), %xmm3
586         pcmpeqb 16(%edi), %xmm3
588 L(shr_5_gobble_loop):
589         pand    %xmm0, %xmm3
590         sub     $32, %ecx
591         pmovmskb %xmm3, %edx
592         movdqa  %xmm0, %xmm1
594         movdqa  64(%esi), %xmm3
595         palignr $5,48(%esi), %xmm3
596         sbb     $0xffff, %edx
597         movdqa  48(%esi), %xmm0
598         palignr $5,32(%esi), %xmm0
599         pcmpeqb 32(%edi), %xmm0
600         lea     32(%esi), %esi
601         pcmpeqb 48(%edi), %xmm3
603         lea     32(%edi), %edi
604         jz      L(shr_5_gobble_loop)
605         pand    %xmm0, %xmm3
607         cmp     $0, %ecx
608         jge     L(shr_5_gobble_next)
609         inc     %edx
610         add     $32, %ecx
611 L(shr_5_gobble_next):
612         test    %edx, %edx
613         jnz     L(exit)
615         pmovmskb %xmm3, %edx
616         movdqa  %xmm0, %xmm1
617         lea     32(%edi), %edi
618         lea     32(%esi), %esi
619         sub     $0xffff, %edx
620         jnz     L(exit)
622         lea     (%ecx, %edi,1), %eax
623         lea     5(%ecx, %esi,1), %edx
624         POP (%edi)
625         POP (%esi)
626         jmp     L(less48bytes)
628         cfi_restore_state
629         cfi_remember_state
630         ALIGN (4)
631 L(shr_6):
632         cmp     $80, %ecx
633         lea     -48(%ecx), %ecx
634         mov     %edx, %eax
635         jae     L(shr_6_gobble)
637         movdqa  16(%esi), %xmm1
638         movdqa  %xmm1, %xmm2
639         palignr $6,(%esi), %xmm1
640         pcmpeqb (%edi), %xmm1
642         movdqa  32(%esi), %xmm3
643         palignr $6,%xmm2, %xmm3
644         pcmpeqb 16(%edi), %xmm3
646         pand    %xmm1, %xmm3
647         pmovmskb %xmm3, %edx
648         lea     32(%edi), %edi
649         lea     32(%esi), %esi
650         sub     $0xffff, %edx
651         jnz     L(exit)
652         lea     (%ecx, %edi,1), %eax
653         lea     6(%ecx, %esi,1), %edx
654         POP (%edi)
655         POP (%esi)
656         jmp     L(less48bytes)
658         cfi_restore_state
659         cfi_remember_state
660         ALIGN (4)
661 L(shr_6_gobble):
662         sub     $32, %ecx
663         movdqa  16(%esi), %xmm0
664         palignr $6,(%esi), %xmm0
665         pcmpeqb (%edi), %xmm0
667         movdqa  32(%esi), %xmm3
668         palignr $6,16(%esi), %xmm3
669         pcmpeqb 16(%edi), %xmm3
671 L(shr_6_gobble_loop):
672         pand    %xmm0, %xmm3
673         sub     $32, %ecx
674         pmovmskb %xmm3, %edx
675         movdqa  %xmm0, %xmm1
677         movdqa  64(%esi), %xmm3
678         palignr $6,48(%esi), %xmm3
679         sbb     $0xffff, %edx
680         movdqa  48(%esi), %xmm0
681         palignr $6,32(%esi), %xmm0
682         pcmpeqb 32(%edi), %xmm0
683         lea     32(%esi), %esi
684         pcmpeqb 48(%edi), %xmm3
686         lea     32(%edi), %edi
687         jz      L(shr_6_gobble_loop)
688         pand    %xmm0, %xmm3
690         cmp     $0, %ecx
691         jge     L(shr_6_gobble_next)
692         inc     %edx
693         add     $32, %ecx
694 L(shr_6_gobble_next):
695         test    %edx, %edx
696         jnz     L(exit)
698         pmovmskb %xmm3, %edx
699         movdqa  %xmm0, %xmm1
700         lea     32(%edi), %edi
701         lea     32(%esi), %esi
702         sub     $0xffff, %edx
703         jnz     L(exit)
705         lea     (%ecx, %edi,1), %eax
706         lea     6(%ecx, %esi,1), %edx
707         POP (%edi)
708         POP (%esi)
709         jmp     L(less48bytes)
711         cfi_restore_state
712         cfi_remember_state
713         ALIGN (4)
714 L(shr_7):
715         cmp     $80, %ecx
716         lea     -48(%ecx), %ecx
717         mov     %edx, %eax
718         jae     L(shr_7_gobble)
720         movdqa  16(%esi), %xmm1
721         movdqa  %xmm1, %xmm2
722         palignr $7,(%esi), %xmm1
723         pcmpeqb (%edi), %xmm1
725         movdqa  32(%esi), %xmm3
726         palignr $7,%xmm2, %xmm3
727         pcmpeqb 16(%edi), %xmm3
729         pand    %xmm1, %xmm3
730         pmovmskb %xmm3, %edx
731         lea     32(%edi), %edi
732         lea     32(%esi), %esi
733         sub     $0xffff, %edx
734         jnz     L(exit)
735         lea     (%ecx, %edi,1), %eax
736         lea     7(%ecx, %esi,1), %edx
737         POP (%edi)
738         POP (%esi)
739         jmp     L(less48bytes)
741         cfi_restore_state
742         cfi_remember_state
743         ALIGN (4)
744 L(shr_7_gobble):
745         sub     $32, %ecx
746         movdqa  16(%esi), %xmm0
747         palignr $7,(%esi), %xmm0
748         pcmpeqb (%edi), %xmm0
750         movdqa  32(%esi), %xmm3
751         palignr $7,16(%esi), %xmm3
752         pcmpeqb 16(%edi), %xmm3
754 L(shr_7_gobble_loop):
755         pand    %xmm0, %xmm3
756         sub     $32, %ecx
757         pmovmskb %xmm3, %edx
758         movdqa  %xmm0, %xmm1
760         movdqa  64(%esi), %xmm3
761         palignr $7,48(%esi), %xmm3
762         sbb     $0xffff, %edx
763         movdqa  48(%esi), %xmm0
764         palignr $7,32(%esi), %xmm0
765         pcmpeqb 32(%edi), %xmm0
766         lea     32(%esi), %esi
767         pcmpeqb 48(%edi), %xmm3
769         lea     32(%edi), %edi
770         jz      L(shr_7_gobble_loop)
771         pand    %xmm0, %xmm3
773         cmp     $0, %ecx
774         jge     L(shr_7_gobble_next)
775         inc     %edx
776         add     $32, %ecx
777 L(shr_7_gobble_next):
778         test    %edx, %edx
779         jnz     L(exit)
781         pmovmskb %xmm3, %edx
782         movdqa  %xmm0, %xmm1
783         lea     32(%edi), %edi
784         lea     32(%esi), %esi
785         sub     $0xffff, %edx
786         jnz     L(exit)
788         lea     (%ecx, %edi,1), %eax
789         lea     7(%ecx, %esi,1), %edx
790         POP (%edi)
791         POP (%esi)
792         jmp     L(less48bytes)
794         cfi_restore_state
795         cfi_remember_state
796         ALIGN (4)
797 L(shr_8):
798         cmp     $80, %ecx
799         lea     -48(%ecx), %ecx
800         mov     %edx, %eax
801         jae     L(shr_8_gobble)
803         movdqa  16(%esi), %xmm1
804         movdqa  %xmm1, %xmm2
805         palignr $8,(%esi), %xmm1
806         pcmpeqb (%edi), %xmm1
808         movdqa  32(%esi), %xmm3
809         palignr $8,%xmm2, %xmm3
810         pcmpeqb 16(%edi), %xmm3
812         pand    %xmm1, %xmm3
813         pmovmskb %xmm3, %edx
814         lea     32(%edi), %edi
815         lea     32(%esi), %esi
816         sub     $0xffff, %edx
817         jnz     L(exit)
818         lea     (%ecx, %edi,1), %eax
819         lea     8(%ecx, %esi,1), %edx
820         POP (%edi)
821         POP (%esi)
822         jmp     L(less48bytes)
824         cfi_restore_state
825         cfi_remember_state
826         ALIGN (4)
827 L(shr_8_gobble):
828         sub     $32, %ecx
829         movdqa  16(%esi), %xmm0
830         palignr $8,(%esi), %xmm0
831         pcmpeqb (%edi), %xmm0
833         movdqa  32(%esi), %xmm3
834         palignr $8,16(%esi), %xmm3
835         pcmpeqb 16(%edi), %xmm3
837 L(shr_8_gobble_loop):
838         pand    %xmm0, %xmm3
839         sub     $32, %ecx
840         pmovmskb %xmm3, %edx
841         movdqa  %xmm0, %xmm1
843         movdqa  64(%esi), %xmm3
844         palignr $8,48(%esi), %xmm3
845         sbb     $0xffff, %edx
846         movdqa  48(%esi), %xmm0
847         palignr $8,32(%esi), %xmm0
848         pcmpeqb 32(%edi), %xmm0
849         lea     32(%esi), %esi
850         pcmpeqb 48(%edi), %xmm3
852         lea     32(%edi), %edi
853         jz      L(shr_8_gobble_loop)
854         pand    %xmm0, %xmm3
856         cmp     $0, %ecx
857         jge     L(shr_8_gobble_next)
858         inc     %edx
859         add     $32, %ecx
860 L(shr_8_gobble_next):
861         test    %edx, %edx
862         jnz     L(exit)
864         pmovmskb %xmm3, %edx
865         movdqa  %xmm0, %xmm1
866         lea     32(%edi), %edi
867         lea     32(%esi), %esi
868         sub     $0xffff, %edx
869         jnz     L(exit)
871         lea     (%ecx, %edi,1), %eax
872         lea     8(%ecx, %esi,1), %edx
873         POP (%edi)
874         POP (%esi)
875         jmp     L(less48bytes)
877         cfi_restore_state
878         cfi_remember_state
879         ALIGN (4)
880 L(shr_9):
881         cmp     $80, %ecx
882         lea     -48(%ecx), %ecx
883         mov     %edx, %eax
884         jae     L(shr_9_gobble)
886         movdqa  16(%esi), %xmm1
887         movdqa  %xmm1, %xmm2
888         palignr $9,(%esi), %xmm1
889         pcmpeqb (%edi), %xmm1
891         movdqa  32(%esi), %xmm3
892         palignr $9,%xmm2, %xmm3
893         pcmpeqb 16(%edi), %xmm3
895         pand    %xmm1, %xmm3
896         pmovmskb %xmm3, %edx
897         lea     32(%edi), %edi
898         lea     32(%esi), %esi
899         sub     $0xffff, %edx
900         jnz     L(exit)
901         lea     (%ecx, %edi,1), %eax
902         lea     9(%ecx, %esi,1), %edx
903         POP (%edi)
904         POP (%esi)
905         jmp     L(less48bytes)
907         cfi_restore_state
908         cfi_remember_state
909         ALIGN (4)
910 L(shr_9_gobble):
911         sub     $32, %ecx
912         movdqa  16(%esi), %xmm0
913         palignr $9,(%esi), %xmm0
914         pcmpeqb (%edi), %xmm0
916         movdqa  32(%esi), %xmm3
917         palignr $9,16(%esi), %xmm3
918         pcmpeqb 16(%edi), %xmm3
920 L(shr_9_gobble_loop):
921         pand    %xmm0, %xmm3
922         sub     $32, %ecx
923         pmovmskb %xmm3, %edx
924         movdqa  %xmm0, %xmm1
926         movdqa  64(%esi), %xmm3
927         palignr $9,48(%esi), %xmm3
928         sbb     $0xffff, %edx
929         movdqa  48(%esi), %xmm0
930         palignr $9,32(%esi), %xmm0
931         pcmpeqb 32(%edi), %xmm0
932         lea     32(%esi), %esi
933         pcmpeqb 48(%edi), %xmm3
935         lea     32(%edi), %edi
936         jz      L(shr_9_gobble_loop)
937         pand    %xmm0, %xmm3
939         cmp     $0, %ecx
940         jge     L(shr_9_gobble_next)
941         inc     %edx
942         add     $32, %ecx
943 L(shr_9_gobble_next):
944         test    %edx, %edx
945         jnz     L(exit)
947         pmovmskb %xmm3, %edx
948         movdqa  %xmm0, %xmm1
949         lea     32(%edi), %edi
950         lea     32(%esi), %esi
951         sub     $0xffff, %edx
952         jnz     L(exit)
954         lea     (%ecx, %edi,1), %eax
955         lea     9(%ecx, %esi,1), %edx
956         POP (%edi)
957         POP (%esi)
958         jmp     L(less48bytes)
960         cfi_restore_state
961         cfi_remember_state
962         ALIGN (4)
963 L(shr_10):
964         cmp     $80, %ecx
965         lea     -48(%ecx), %ecx
966         mov     %edx, %eax
967         jae     L(shr_10_gobble)
969         movdqa  16(%esi), %xmm1
970         movdqa  %xmm1, %xmm2
971         palignr $10, (%esi), %xmm1
972         pcmpeqb (%edi), %xmm1
974         movdqa  32(%esi), %xmm3
975         palignr $10,%xmm2, %xmm3
976         pcmpeqb 16(%edi), %xmm3
978         pand    %xmm1, %xmm3
979         pmovmskb %xmm3, %edx
980         lea     32(%edi), %edi
981         lea     32(%esi), %esi
982         sub     $0xffff, %edx
983         jnz     L(exit)
984         lea     (%ecx, %edi,1), %eax
985         lea     10(%ecx, %esi,1), %edx
986         POP (%edi)
987         POP (%esi)
988         jmp     L(less48bytes)
990         cfi_restore_state
991         cfi_remember_state
992         ALIGN (4)
993 L(shr_10_gobble):
994         sub     $32, %ecx
995         movdqa  16(%esi), %xmm0
996         palignr $10, (%esi), %xmm0
997         pcmpeqb (%edi), %xmm0
999         movdqa  32(%esi), %xmm3
1000         palignr $10, 16(%esi), %xmm3
1001         pcmpeqb 16(%edi), %xmm3
1003 L(shr_10_gobble_loop):
1004         pand    %xmm0, %xmm3
1005         sub     $32, %ecx
1006         pmovmskb %xmm3, %edx
1007         movdqa  %xmm0, %xmm1
1009         movdqa  64(%esi), %xmm3
1010         palignr $10,48(%esi), %xmm3
1011         sbb     $0xffff, %edx
1012         movdqa  48(%esi), %xmm0
1013         palignr $10,32(%esi), %xmm0
1014         pcmpeqb 32(%edi), %xmm0
1015         lea     32(%esi), %esi
1016         pcmpeqb 48(%edi), %xmm3
1018         lea     32(%edi), %edi
1019         jz      L(shr_10_gobble_loop)
1020         pand    %xmm0, %xmm3
1022         cmp     $0, %ecx
1023         jge     L(shr_10_gobble_next)
1024         inc     %edx
1025         add     $32, %ecx
1026 L(shr_10_gobble_next):
1027         test    %edx, %edx
1028         jnz     L(exit)
1030         pmovmskb %xmm3, %edx
1031         movdqa  %xmm0, %xmm1
1032         lea     32(%edi), %edi
1033         lea     32(%esi), %esi
1034         sub     $0xffff, %edx
1035         jnz     L(exit)
1037         lea     (%ecx, %edi,1), %eax
1038         lea     10(%ecx, %esi,1), %edx
1039         POP (%edi)
1040         POP (%esi)
1041         jmp     L(less48bytes)
1043         cfi_restore_state
1044         cfi_remember_state
1045         ALIGN (4)
1046 L(shr_11):
1047         cmp     $80, %ecx
1048         lea     -48(%ecx), %ecx
1049         mov     %edx, %eax
1050         jae     L(shr_11_gobble)
1052         movdqa  16(%esi), %xmm1
1053         movdqa  %xmm1, %xmm2
1054         palignr $11, (%esi), %xmm1
1055         pcmpeqb (%edi), %xmm1
1057         movdqa  32(%esi), %xmm3
1058         palignr $11, %xmm2, %xmm3
1059         pcmpeqb 16(%edi), %xmm3
1061         pand    %xmm1, %xmm3
1062         pmovmskb %xmm3, %edx
1063         lea     32(%edi), %edi
1064         lea     32(%esi), %esi
1065         sub     $0xffff, %edx
1066         jnz     L(exit)
1067         lea     (%ecx, %edi,1), %eax
1068         lea     11(%ecx, %esi,1), %edx
1069         POP (%edi)
1070         POP (%esi)
1071         jmp     L(less48bytes)
1073         cfi_restore_state
1074         cfi_remember_state
1075         ALIGN (4)
1076 L(shr_11_gobble):
1077         sub     $32, %ecx
1078         movdqa  16(%esi), %xmm0
1079         palignr $11, (%esi), %xmm0
1080         pcmpeqb (%edi), %xmm0
1082         movdqa  32(%esi), %xmm3
1083         palignr $11, 16(%esi), %xmm3
1084         pcmpeqb 16(%edi), %xmm3
1086 L(shr_11_gobble_loop):
1087         pand    %xmm0, %xmm3
1088         sub     $32, %ecx
1089         pmovmskb %xmm3, %edx
1090         movdqa  %xmm0, %xmm1
1092         movdqa  64(%esi), %xmm3
1093         palignr $11,48(%esi), %xmm3
1094         sbb     $0xffff, %edx
1095         movdqa  48(%esi), %xmm0
1096         palignr $11,32(%esi), %xmm0
1097         pcmpeqb 32(%edi), %xmm0
1098         lea     32(%esi), %esi
1099         pcmpeqb 48(%edi), %xmm3
1101         lea     32(%edi), %edi
1102         jz      L(shr_11_gobble_loop)
1103         pand    %xmm0, %xmm3
1105         cmp     $0, %ecx
1106         jge     L(shr_11_gobble_next)
1107         inc     %edx
1108         add     $32, %ecx
1109 L(shr_11_gobble_next):
1110         test    %edx, %edx
1111         jnz     L(exit)
1113         pmovmskb %xmm3, %edx
1114         movdqa  %xmm0, %xmm1
1115         lea     32(%edi), %edi
1116         lea     32(%esi), %esi
1117         sub     $0xffff, %edx
1118         jnz     L(exit)
1120         lea     (%ecx, %edi,1), %eax
1121         lea     11(%ecx, %esi,1), %edx
1122         POP (%edi)
1123         POP (%esi)
1124         jmp     L(less48bytes)
1126         cfi_restore_state
1127         cfi_remember_state
1128         ALIGN (4)
1129 L(shr_12):
1130         cmp     $80, %ecx
1131         lea     -48(%ecx), %ecx
1132         mov     %edx, %eax
1133         jae     L(shr_12_gobble)
1135         movdqa  16(%esi), %xmm1
1136         movdqa  %xmm1, %xmm2
1137         palignr $12, (%esi), %xmm1
1138         pcmpeqb (%edi), %xmm1
1140         movdqa  32(%esi), %xmm3
1141         palignr $12, %xmm2, %xmm3
1142         pcmpeqb 16(%edi), %xmm3
1144         pand    %xmm1, %xmm3
1145         pmovmskb %xmm3, %edx
1146         lea     32(%edi), %edi
1147         lea     32(%esi), %esi
1148         sub     $0xffff, %edx
1149         jnz     L(exit)
1150         lea     (%ecx, %edi,1), %eax
1151         lea     12(%ecx, %esi,1), %edx
1152         POP (%edi)
1153         POP (%esi)
1154         jmp     L(less48bytes)
1156         cfi_restore_state
1157         cfi_remember_state
1158         ALIGN (4)
1159 L(shr_12_gobble):
1160         sub     $32, %ecx
1161         movdqa  16(%esi), %xmm0
1162         palignr $12, (%esi), %xmm0
1163         pcmpeqb (%edi), %xmm0
1165         movdqa  32(%esi), %xmm3
1166         palignr $12, 16(%esi), %xmm3
1167         pcmpeqb 16(%edi), %xmm3
1169 L(shr_12_gobble_loop):
1170         pand    %xmm0, %xmm3
1171         sub     $32, %ecx
1172         pmovmskb %xmm3, %edx
1173         movdqa  %xmm0, %xmm1
1175         movdqa  64(%esi), %xmm3
1176         palignr $12,48(%esi), %xmm3
1177         sbb     $0xffff, %edx
1178         movdqa  48(%esi), %xmm0
1179         palignr $12,32(%esi), %xmm0
1180         pcmpeqb 32(%edi), %xmm0
1181         lea     32(%esi), %esi
1182         pcmpeqb 48(%edi), %xmm3
1184         lea     32(%edi), %edi
1185         jz      L(shr_12_gobble_loop)
1186         pand    %xmm0, %xmm3
1188         cmp     $0, %ecx
1189         jge     L(shr_12_gobble_next)
1190         inc     %edx
1191         add     $32, %ecx
1192 L(shr_12_gobble_next):
1193         test    %edx, %edx
1194         jnz     L(exit)
1196         pmovmskb %xmm3, %edx
1197         movdqa  %xmm0, %xmm1
1198         lea     32(%edi), %edi
1199         lea     32(%esi), %esi
1200         sub     $0xffff, %edx
1201         jnz     L(exit)
1203         lea     (%ecx, %edi,1), %eax
1204         lea     12(%ecx, %esi,1), %edx
1205         POP (%edi)
1206         POP (%esi)
1207         jmp     L(less48bytes)
1209         cfi_restore_state
1210         cfi_remember_state
1211         ALIGN (4)
1212 L(shr_13):
1213         cmp     $80, %ecx
1214         lea     -48(%ecx), %ecx
1215         mov     %edx, %eax
1216         jae     L(shr_13_gobble)
1218         movdqa  16(%esi), %xmm1
1219         movdqa  %xmm1, %xmm2
1220         palignr $13, (%esi), %xmm1
1221         pcmpeqb (%edi), %xmm1
1223         movdqa  32(%esi), %xmm3
1224         palignr $13, %xmm2, %xmm3
1225         pcmpeqb 16(%edi), %xmm3
1227         pand    %xmm1, %xmm3
1228         pmovmskb %xmm3, %edx
1229         lea     32(%edi), %edi
1230         lea     32(%esi), %esi
1231         sub     $0xffff, %edx
1232         jnz     L(exit)
1233         lea     (%ecx, %edi,1), %eax
1234         lea     13(%ecx, %esi,1), %edx
1235         POP (%edi)
1236         POP (%esi)
1237         jmp     L(less48bytes)
1239         cfi_restore_state
1240         cfi_remember_state
1241         ALIGN (4)
1242 L(shr_13_gobble):
1243         sub     $32, %ecx
1244         movdqa  16(%esi), %xmm0
1245         palignr $13, (%esi), %xmm0
1246         pcmpeqb (%edi), %xmm0
1248         movdqa  32(%esi), %xmm3
1249         palignr $13, 16(%esi), %xmm3
1250         pcmpeqb 16(%edi), %xmm3
1252 L(shr_13_gobble_loop):
1253         pand    %xmm0, %xmm3
1254         sub     $32, %ecx
1255         pmovmskb %xmm3, %edx
1256         movdqa  %xmm0, %xmm1
1258         movdqa  64(%esi), %xmm3
1259         palignr $13,48(%esi), %xmm3
1260         sbb     $0xffff, %edx
1261         movdqa  48(%esi), %xmm0
1262         palignr $13,32(%esi), %xmm0
1263         pcmpeqb 32(%edi), %xmm0
1264         lea     32(%esi), %esi
1265         pcmpeqb 48(%edi), %xmm3
1267         lea     32(%edi), %edi
1268         jz      L(shr_13_gobble_loop)
1269         pand    %xmm0, %xmm3
1271         cmp     $0, %ecx
1272         jge     L(shr_13_gobble_next)
1273         inc     %edx
1274         add     $32, %ecx
1275 L(shr_13_gobble_next):
1276         test    %edx, %edx
1277         jnz     L(exit)
1279         pmovmskb %xmm3, %edx
1280         movdqa  %xmm0, %xmm1
1281         lea     32(%edi), %edi
1282         lea     32(%esi), %esi
1283         sub     $0xffff, %edx
1284         jnz     L(exit)
1286         lea     (%ecx, %edi,1), %eax
1287         lea     13(%ecx, %esi,1), %edx
1288         POP (%edi)
1289         POP (%esi)
1290         jmp     L(less48bytes)
1292         cfi_restore_state
1293         cfi_remember_state
1294         ALIGN (4)
1295 L(shr_14):
1296         cmp     $80, %ecx
1297         lea     -48(%ecx), %ecx
1298         mov     %edx, %eax
1299         jae     L(shr_14_gobble)
1301         movdqa  16(%esi), %xmm1
1302         movdqa  %xmm1, %xmm2
1303         palignr $14, (%esi), %xmm1
1304         pcmpeqb (%edi), %xmm1
1306         movdqa  32(%esi), %xmm3
1307         palignr $14, %xmm2, %xmm3
1308         pcmpeqb 16(%edi), %xmm3
1310         pand    %xmm1, %xmm3
1311         pmovmskb %xmm3, %edx
1312         lea     32(%edi), %edi
1313         lea     32(%esi), %esi
1314         sub     $0xffff, %edx
1315         jnz     L(exit)
1316         lea     (%ecx, %edi,1), %eax
1317         lea     14(%ecx, %esi,1), %edx
1318         POP (%edi)
1319         POP (%esi)
1320         jmp     L(less48bytes)
1322         cfi_restore_state
1323         cfi_remember_state
1324         ALIGN (4)
1325 L(shr_14_gobble):
1326         sub     $32, %ecx
1327         movdqa  16(%esi), %xmm0
1328         palignr $14, (%esi), %xmm0
1329         pcmpeqb (%edi), %xmm0
1331         movdqa  32(%esi), %xmm3
1332         palignr $14, 16(%esi), %xmm3
1333         pcmpeqb 16(%edi), %xmm3
1335 L(shr_14_gobble_loop):
1336         pand    %xmm0, %xmm3
1337         sub     $32, %ecx
1338         pmovmskb %xmm3, %edx
1339         movdqa  %xmm0, %xmm1
1341         movdqa  64(%esi), %xmm3
1342         palignr $14,48(%esi), %xmm3
1343         sbb     $0xffff, %edx
1344         movdqa  48(%esi), %xmm0
1345         palignr $14,32(%esi), %xmm0
1346         pcmpeqb 32(%edi), %xmm0
1347         lea     32(%esi), %esi
1348         pcmpeqb 48(%edi), %xmm3
1350         lea     32(%edi), %edi
1351         jz      L(shr_14_gobble_loop)
1352         pand    %xmm0, %xmm3
1354         cmp     $0, %ecx
1355         jge     L(shr_14_gobble_next)
1356         inc     %edx
1357         add     $32, %ecx
1358 L(shr_14_gobble_next):
1359         test    %edx, %edx
1360         jnz     L(exit)
1362         pmovmskb %xmm3, %edx
1363         movdqa  %xmm0, %xmm1
1364         lea     32(%edi), %edi
1365         lea     32(%esi), %esi
1366         sub     $0xffff, %edx
1367         jnz     L(exit)
1369         lea     (%ecx, %edi,1), %eax
1370         lea     14(%ecx, %esi,1), %edx
1371         POP (%edi)
1372         POP (%esi)
1373         jmp     L(less48bytes)
1375         cfi_restore_state
1376         cfi_remember_state
1377         ALIGN (4)
1378 L(shr_15):
1379         cmp     $80, %ecx
1380         lea     -48(%ecx), %ecx
1381         mov     %edx, %eax
1382         jae     L(shr_15_gobble)
1384         movdqa  16(%esi), %xmm1
1385         movdqa  %xmm1, %xmm2
1386         palignr $15, (%esi), %xmm1
1387         pcmpeqb (%edi), %xmm1
1389         movdqa  32(%esi), %xmm3
1390         palignr $15, %xmm2, %xmm3
1391         pcmpeqb 16(%edi), %xmm3
1393         pand    %xmm1, %xmm3
1394         pmovmskb %xmm3, %edx
1395         lea     32(%edi), %edi
1396         lea     32(%esi), %esi
1397         sub     $0xffff, %edx
1398         jnz     L(exit)
1399         lea     (%ecx, %edi,1), %eax
1400         lea     15(%ecx, %esi,1), %edx
1401         POP (%edi)
1402         POP (%esi)
1403         jmp     L(less48bytes)
1405         cfi_restore_state
1406         cfi_remember_state
1407         ALIGN (4)
1408 L(shr_15_gobble):
1409         sub     $32, %ecx
1410         movdqa  16(%esi), %xmm0
1411         palignr $15, (%esi), %xmm0
1412         pcmpeqb (%edi), %xmm0
1414         movdqa  32(%esi), %xmm3
1415         palignr $15, 16(%esi), %xmm3
1416         pcmpeqb 16(%edi), %xmm3
1418 L(shr_15_gobble_loop):
1419         pand    %xmm0, %xmm3
1420         sub     $32, %ecx
1421         pmovmskb %xmm3, %edx
1422         movdqa  %xmm0, %xmm1
1424         movdqa  64(%esi), %xmm3
1425         palignr $15,48(%esi), %xmm3
1426         sbb     $0xffff, %edx
1427         movdqa  48(%esi), %xmm0
1428         palignr $15,32(%esi), %xmm0
1429         pcmpeqb 32(%edi), %xmm0
1430         lea     32(%esi), %esi
1431         pcmpeqb 48(%edi), %xmm3
1433         lea     32(%edi), %edi
1434         jz      L(shr_15_gobble_loop)
1435         pand    %xmm0, %xmm3
1437         cmp     $0, %ecx
1438         jge     L(shr_15_gobble_next)
1439         inc     %edx
1440         add     $32, %ecx
1441 L(shr_15_gobble_next):
1442         test    %edx, %edx
1443         jnz     L(exit)
1445         pmovmskb %xmm3, %edx
1446         movdqa  %xmm0, %xmm1
1447         lea     32(%edi), %edi
1448         lea     32(%esi), %esi
1449         sub     $0xffff, %edx
1450         jnz     L(exit)
1452         lea     (%ecx, %edi,1), %eax
1453         lea     15(%ecx, %esi,1), %edx
1454         POP (%edi)
1455         POP (%esi)
1456         jmp     L(less48bytes)
1458         cfi_restore_state
1459         cfi_remember_state
1460         ALIGN (4)
1461 L(exit):
1462         pmovmskb %xmm1, %ebx
1463         sub     $0xffff, %ebx
1464         jz      L(first16bytes)
1465         lea     -16(%esi), %esi
1466         lea     -16(%edi), %edi
1467         mov     %ebx, %edx
1468 L(first16bytes):
1469         add     %eax, %esi
1470 L(less16bytes):
1471         test    %dl, %dl
1472         jz      L(next_24_bytes)
1474         test    $0x01, %dl
1475         jnz     L(Byte16)
1477         test    $0x02, %dl
1478         jnz     L(Byte17)
1480         test    $0x04, %dl
1481         jnz     L(Byte18)
1483         test    $0x08, %dl
1484         jnz     L(Byte19)
1486         test    $0x10, %dl
1487         jnz     L(Byte20)
1489         test    $0x20, %dl
1490         jnz     L(Byte21)
1492         test    $0x40, %dl
1493         jnz     L(Byte22)
1494 L(Byte23):
1495         movzbl   -9(%edi), %eax
1496         movzbl   -9(%esi), %edx
1497         sub     %edx, %eax
1498         RETURN
1500         ALIGN (4)
1501 L(Byte16):
1502         movzbl   -16(%edi), %eax
1503         movzbl   -16(%esi), %edx
1504         sub     %edx, %eax
1505         RETURN
1507         ALIGN (4)
1508 L(Byte17):
1509         movzbl   -15(%edi), %eax
1510         movzbl   -15(%esi), %edx
1511         sub     %edx, %eax
1512         RETURN
1514         ALIGN (4)
1515 L(Byte18):
1516         movzbl   -14(%edi), %eax
1517         movzbl   -14(%esi), %edx
1518         sub     %edx, %eax
1519         RETURN
1521         ALIGN (4)
1522 L(Byte19):
1523         movzbl   -13(%edi), %eax
1524         movzbl   -13(%esi), %edx
1525         sub     %edx, %eax
1526         RETURN
1528         ALIGN (4)
1529 L(Byte20):
1530         movzbl   -12(%edi), %eax
1531         movzbl   -12(%esi), %edx
1532         sub     %edx, %eax
1533         RETURN
1535         ALIGN (4)
1536 L(Byte21):
1537         movzbl   -11(%edi), %eax
1538         movzbl   -11(%esi), %edx
1539         sub     %edx, %eax
1540         RETURN
1542         ALIGN (4)
1543 L(Byte22):
1544         movzbl   -10(%edi), %eax
1545         movzbl   -10(%esi), %edx
1546         sub     %edx, %eax
1547         RETURN
1549         ALIGN (4)
1550 L(next_24_bytes):
1551         lea     8(%edi), %edi
1552         lea     8(%esi), %esi
1553         test    $0x01, %dh
1554         jnz     L(Byte16)
1556         test    $0x02, %dh
1557         jnz     L(Byte17)
1559         test    $0x04, %dh
1560         jnz     L(Byte18)
1562         test    $0x08, %dh
1563         jnz     L(Byte19)
1565         test    $0x10, %dh
1566         jnz     L(Byte20)
1568         test    $0x20, %dh
1569         jnz     L(Byte21)
1571         test    $0x40, %dh
1572         jnz     L(Byte22)
1574         ALIGN (4)
1575 L(Byte31):
1576         movzbl   -9(%edi), %eax
1577         movzbl   -9(%esi), %edx
1578         sub     %edx, %eax
1579         RETURN_END
1581         CFI_PUSH (%ebx)
1582         ALIGN (4)
1583 L(more8bytes):
1584         cmp     $16, %ecx
1585         jae     L(more16bytes)
1586         cmp     $8, %ecx
1587         je      L(8bytes)
1588         cmp     $9, %ecx
1589         je      L(9bytes)
1590         cmp     $10, %ecx
1591         je      L(10bytes)
1592         cmp     $11, %ecx
1593         je      L(11bytes)
1594         cmp     $12, %ecx
1595         je      L(12bytes)
1596         cmp     $13, %ecx
1597         je      L(13bytes)
1598         cmp     $14, %ecx
1599         je      L(14bytes)
1600         jmp     L(15bytes)
1602         ALIGN (4)
1603 L(more16bytes):
1604         cmp     $24, %ecx
1605         jae     L(more24bytes)
1606         cmp     $16, %ecx
1607         je      L(16bytes)
1608         cmp     $17, %ecx
1609         je      L(17bytes)
1610         cmp     $18, %ecx
1611         je      L(18bytes)
1612         cmp     $19, %ecx
1613         je      L(19bytes)
1614         cmp     $20, %ecx
1615         je      L(20bytes)
1616         cmp     $21, %ecx
1617         je      L(21bytes)
1618         cmp     $22, %ecx
1619         je      L(22bytes)
1620         jmp     L(23bytes)
1622         ALIGN (4)
1623 L(more24bytes):
1624         cmp     $32, %ecx
1625         jae     L(more32bytes)
1626         cmp     $24, %ecx
1627         je      L(24bytes)
1628         cmp     $25, %ecx
1629         je      L(25bytes)
1630         cmp     $26, %ecx
1631         je      L(26bytes)
1632         cmp     $27, %ecx
1633         je      L(27bytes)
1634         cmp     $28, %ecx
1635         je      L(28bytes)
1636         cmp     $29, %ecx
1637         je      L(29bytes)
1638         cmp     $30, %ecx
1639         je      L(30bytes)
1640         jmp     L(31bytes)
1642         ALIGN (4)
1643 L(more32bytes):
1644         cmp     $40, %ecx
1645         jae     L(more40bytes)
1646         cmp     $32, %ecx
1647         je      L(32bytes)
1648         cmp     $33, %ecx
1649         je      L(33bytes)
1650         cmp     $34, %ecx
1651         je      L(34bytes)
1652         cmp     $35, %ecx
1653         je      L(35bytes)
1654         cmp     $36, %ecx
1655         je      L(36bytes)
1656         cmp     $37, %ecx
1657         je      L(37bytes)
1658         cmp     $38, %ecx
1659         je      L(38bytes)
1660         jmp     L(39bytes)
1662         ALIGN (4)
1663 L(more40bytes):
1664         cmp     $40, %ecx
1665         je      L(40bytes)
1666         cmp     $41, %ecx
1667         je      L(41bytes)
1668         cmp     $42, %ecx
1669         je      L(42bytes)
1670         cmp     $43, %ecx
1671         je      L(43bytes)
1672         cmp     $44, %ecx
1673         je      L(44bytes)
1674         cmp     $45, %ecx
1675         je      L(45bytes)
1676         cmp     $46, %ecx
1677         je      L(46bytes)
1678         jmp     L(47bytes)
1680         ALIGN (4)
1681 L(less48bytes):
1682         cmp     $8, %ecx
1683         jae     L(more8bytes)
1684         cmp     $2, %ecx
1685         je      L(2bytes)
1686         cmp     $3, %ecx
1687         je      L(3bytes)
1688         cmp     $4, %ecx
1689         je      L(4bytes)
1690         cmp     $5, %ecx
1691         je      L(5bytes)
1692         cmp     $6, %ecx
1693         je      L(6bytes)
1694         jmp     L(7bytes)
1696         ALIGN (4)
1697 L(44bytes):
1698         mov     -44(%eax), %ecx
1699         mov     -44(%edx), %ebx
1700         cmp     %ebx, %ecx
1701         jne     L(find_diff)
1702 L(40bytes):
1703         mov     -40(%eax), %ecx
1704         mov     -40(%edx), %ebx
1705         cmp     %ebx, %ecx
1706         jne     L(find_diff)
1707 L(36bytes):
1708         mov     -36(%eax), %ecx
1709         mov     -36(%edx), %ebx
1710         cmp     %ebx, %ecx
1711         jne     L(find_diff)
1712 L(32bytes):
1713         mov     -32(%eax), %ecx
1714         mov     -32(%edx), %ebx
1715         cmp     %ebx, %ecx
1716         jne     L(find_diff)
1717 L(28bytes):
1718         mov     -28(%eax), %ecx
1719         mov     -28(%edx), %ebx
1720         cmp     %ebx, %ecx
1721         jne     L(find_diff)
1722 L(24bytes):
1723         mov     -24(%eax), %ecx
1724         mov     -24(%edx), %ebx
1725         cmp     %ebx, %ecx
1726         jne     L(find_diff)
1727 L(20bytes):
1728         mov     -20(%eax), %ecx
1729         mov     -20(%edx), %ebx
1730         cmp     %ebx, %ecx
1731         jne     L(find_diff)
1732 L(16bytes):
1733         mov     -16(%eax), %ecx
1734         mov     -16(%edx), %ebx
1735         cmp     %ebx, %ecx
1736         jne     L(find_diff)
1737 L(12bytes):
1738         mov     -12(%eax), %ecx
1739         mov     -12(%edx), %ebx
1740         cmp     %ebx, %ecx
1741         jne     L(find_diff)
1742 L(8bytes):
1743         mov     -8(%eax), %ecx
1744         mov     -8(%edx), %ebx
1745         cmp     %ebx, %ecx
1746         jne     L(find_diff)
1747 L(4bytes):
1748         mov     -4(%eax), %ecx
1749         mov     -4(%edx), %ebx
1750         cmp     %ebx, %ecx
1751         mov     $0, %eax
1752         jne     L(find_diff)
1753         POP (%ebx)
1754         ret
1755         CFI_PUSH (%ebx)
1757         ALIGN (4)
1758 L(45bytes):
1759         mov     -45(%eax), %ecx
1760         mov     -45(%edx), %ebx
1761         cmp     %ebx, %ecx
1762         jne     L(find_diff)
1763 L(41bytes):
1764         mov     -41(%eax), %ecx
1765         mov     -41(%edx), %ebx
1766         cmp     %ebx, %ecx
1767         jne     L(find_diff)
1768 L(37bytes):
1769         mov     -37(%eax), %ecx
1770         mov     -37(%edx), %ebx
1771         cmp     %ebx, %ecx
1772         jne     L(find_diff)
1773 L(33bytes):
1774         mov     -33(%eax), %ecx
1775         mov     -33(%edx), %ebx
1776         cmp     %ebx, %ecx
1777         jne     L(find_diff)
1778 L(29bytes):
1779         mov     -29(%eax), %ecx
1780         mov     -29(%edx), %ebx
1781         cmp     %ebx, %ecx
1782         jne     L(find_diff)
1783 L(25bytes):
1784         mov     -25(%eax), %ecx
1785         mov     -25(%edx), %ebx
1786         cmp     %ebx, %ecx
1787         jne     L(find_diff)
1788 L(21bytes):
1789         mov     -21(%eax), %ecx
1790         mov     -21(%edx), %ebx
1791         cmp     %ebx, %ecx
1792         jne     L(find_diff)
1793 L(17bytes):
1794         mov     -17(%eax), %ecx
1795         mov     -17(%edx), %ebx
1796         cmp     %ebx, %ecx
1797         jne     L(find_diff)
1798 L(13bytes):
1799         mov     -13(%eax), %ecx
1800         mov     -13(%edx), %ebx
1801         cmp     %ebx, %ecx
1802         jne     L(find_diff)
1803 L(9bytes):
1804         mov     -9(%eax), %ecx
1805         mov     -9(%edx), %ebx
1806         cmp     %ebx, %ecx
1807         jne     L(find_diff)
1808 L(5bytes):
1809         mov     -5(%eax), %ecx
1810         mov     -5(%edx), %ebx
1811         cmp     %ebx, %ecx
1812         jne     L(find_diff)
1813         movzbl  -1(%eax), %ecx
1814         cmp     -1(%edx), %cl
1815         mov     $0, %eax
1816         jne     L(end)
1817         POP (%ebx)
1818         ret
1819         CFI_PUSH (%ebx)
1821         ALIGN (4)
1822 L(46bytes):
1823         mov     -46(%eax), %ecx
1824         mov     -46(%edx), %ebx
1825         cmp     %ebx, %ecx
1826         jne     L(find_diff)
1827 L(42bytes):
1828         mov     -42(%eax), %ecx
1829         mov     -42(%edx), %ebx
1830         cmp     %ebx, %ecx
1831         jne     L(find_diff)
1832 L(38bytes):
1833         mov     -38(%eax), %ecx
1834         mov     -38(%edx), %ebx
1835         cmp     %ebx, %ecx
1836         jne     L(find_diff)
1837 L(34bytes):
1838         mov     -34(%eax), %ecx
1839         mov     -34(%edx), %ebx
1840         cmp     %ebx, %ecx
1841         jne     L(find_diff)
1842 L(30bytes):
1843         mov     -30(%eax), %ecx
1844         mov     -30(%edx), %ebx
1845         cmp     %ebx, %ecx
1846         jne     L(find_diff)
1847 L(26bytes):
1848         mov     -26(%eax), %ecx
1849         mov     -26(%edx), %ebx
1850         cmp     %ebx, %ecx
1851         jne     L(find_diff)
1852 L(22bytes):
1853         mov     -22(%eax), %ecx
1854         mov     -22(%edx), %ebx
1855         cmp     %ebx, %ecx
1856         jne     L(find_diff)
1857 L(18bytes):
1858         mov     -18(%eax), %ecx
1859         mov     -18(%edx), %ebx
1860         cmp     %ebx, %ecx
1861         jne     L(find_diff)
1862 L(14bytes):
1863         mov     -14(%eax), %ecx
1864         mov     -14(%edx), %ebx
1865         cmp     %ebx, %ecx
1866         jne     L(find_diff)
1867 L(10bytes):
1868         mov     -10(%eax), %ecx
1869         mov     -10(%edx), %ebx
1870         cmp     %ebx, %ecx
1871         jne     L(find_diff)
1872 L(6bytes):
1873         mov     -6(%eax), %ecx
1874         mov     -6(%edx), %ebx
1875         cmp     %ebx, %ecx
1876         jne     L(find_diff)
1877 L(2bytes):
1878         movzwl  -2(%eax), %ecx
1879         movzwl  -2(%edx), %ebx
1880         cmp     %bl, %cl
1881         jne     L(end)
1882         cmp     %bh, %ch
1883         mov     $0, %eax
1884         jne     L(end)
1885         POP (%ebx)
1886         ret
1887         CFI_PUSH (%ebx)
1889         ALIGN (4)
1890 L(47bytes):
1891         movl    -47(%eax), %ecx
1892         movl    -47(%edx), %ebx
1893         cmp     %ebx, %ecx
1894         jne     L(find_diff)
1895 L(43bytes):
1896         movl    -43(%eax), %ecx
1897         movl    -43(%edx), %ebx
1898         cmp     %ebx, %ecx
1899         jne     L(find_diff)
1900 L(39bytes):
1901         movl    -39(%eax), %ecx
1902         movl    -39(%edx), %ebx
1903         cmp     %ebx, %ecx
1904         jne     L(find_diff)
1905 L(35bytes):
1906         movl    -35(%eax), %ecx
1907         movl    -35(%edx), %ebx
1908         cmp     %ebx, %ecx
1909         jne     L(find_diff)
1910 L(31bytes):
1911         movl    -31(%eax), %ecx
1912         movl    -31(%edx), %ebx
1913         cmp     %ebx, %ecx
1914         jne     L(find_diff)
1915 L(27bytes):
1916         movl    -27(%eax), %ecx
1917         movl    -27(%edx), %ebx
1918         cmp     %ebx, %ecx
1919         jne     L(find_diff)
1920 L(23bytes):
1921         movl    -23(%eax), %ecx
1922         movl    -23(%edx), %ebx
1923         cmp     %ebx, %ecx
1924         jne     L(find_diff)
1925 L(19bytes):
1926         movl    -19(%eax), %ecx
1927         movl    -19(%edx), %ebx
1928         cmp     %ebx, %ecx
1929         jne     L(find_diff)
1930 L(15bytes):
1931         movl    -15(%eax), %ecx
1932         movl    -15(%edx), %ebx
1933         cmp     %ebx, %ecx
1934         jne     L(find_diff)
1935 L(11bytes):
1936         movl    -11(%eax), %ecx
1937         movl    -11(%edx), %ebx
1938         cmp     %ebx, %ecx
1939         jne     L(find_diff)
1940 L(7bytes):
1941         movl    -7(%eax), %ecx
1942         movl    -7(%edx), %ebx
1943         cmp     %ebx, %ecx
1944         jne     L(find_diff)
1945 L(3bytes):
1946         movzwl  -3(%eax), %ecx
1947         movzwl  -3(%edx), %ebx
1948         cmpb    %bl, %cl
1949         jne     L(end)
1950         cmp     %bx, %cx
1951         jne     L(end)
1952         movzbl  -1(%eax), %eax
1953         cmpb    -1(%edx), %al
1954         mov     $0, %eax
1955         jne     L(end)
1956         POP (%ebx)
1957         ret
1958         CFI_PUSH (%ebx)
1960         ALIGN (4)
1961 L(find_diff):
1962         cmpb    %bl, %cl
1963         jne     L(end)
1964         cmp     %bx, %cx
1965         jne     L(end)
1966         shr     $16,%ecx
1967         shr     $16,%ebx
1968         cmp     %bl, %cl
1969         jne     L(end)
1970         cmp     %bx, %cx
1971 L(end):
1972         POP (%ebx)
1973         mov     $1, %eax
1974         ja      L(bigger)
1975         neg     %eax
1976 L(bigger):
1977         ret
1979 END (MEMCMP)
1981 #endif