32bit memcmp/strcmp/strncmp optimized for SSSE3/SSS4.2
[glibc.git] / sysdeps / i386 / i686 / multiarch / memcmp-ssse3.S
blobbfcf6607297d8c4d4de610e0f08b96044f8f7f89
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_PUSH (%ebx); CFI_PUSH (%edi); \
47                         CFI_PUSH (%esi)
49         .section .text.ssse3,"ax",@progbits
50 ENTRY (MEMCMP)
51         movl    LEN(%esp), %ecx
52         movl    BLK1(%esp), %eax
53         cmp     $48, %ecx
54         movl    BLK2(%esp), %edx
55         jae     L(48bytesormore)
56         cmp     $1, %ecx
57         jbe     L(less1bytes)
58         PUSH (%ebx)
59         add     %ecx, %edx
60         add     %ecx, %eax
61         jmp     L(less48bytes)
63         ALIGN (4)
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
79         
80         ALIGN (4)
81 L(48bytesormore):
82         PUSH (%ebx)
83         PUSH (%esi)
84         PUSH (%edi)
85         movdqu    (%eax), %xmm3
86         movdqu    (%edx), %xmm0
87         movl    %eax, %edi
88         movl    %edx, %esi
89         pcmpeqb   %xmm0, %xmm3
90         pmovmskb  %xmm3, %edx
91         lea     16(%edi), %edi
93         sub      $0xffff, %edx
94         lea     16(%esi), %esi
95         jnz       L(less16bytes)
96         mov     %edi, %edx
97         and     $0xf, %edx
98         xor     %edx, %edi
99         sub     %edx, %esi
100         add     %edx, %ecx
101         mov     %esi, %edx
102         and     $0xf, %edx
103         jz      L(shr_0)
104         xor     %edx, %esi
106         cmp     $8, %edx
107         jae     L(next_unaligned_table)
108         cmp     $0, %edx
109         je      L(shr_0)
110         cmp     $1, %edx
111         je      L(shr_1)
112         cmp     $2, %edx
113         je      L(shr_2)
114         cmp     $3, %edx
115         je      L(shr_3)
116         cmp     $4, %edx
117         je      L(shr_4)
118         cmp     $5, %edx
119         je      L(shr_5)
120         cmp     $6, %edx
121         je      L(shr_6)
122         jmp     L(shr_7)
124         ALIGN (4)
125 L(next_unaligned_table):
126         cmp     $8, %edx
127         je      L(shr_8)
128         cmp     $9, %edx
129         je      L(shr_9)
130         cmp     $10, %edx
131         je      L(shr_10)
132         cmp     $11, %edx
133         je      L(shr_11)
134         cmp     $12, %edx
135         je      L(shr_12)
136         cmp     $13, %edx
137         je      L(shr_13)
138         cmp     $14, %edx
139         je      L(shr_14)
140         jmp     L(shr_15)
142         ALIGN (4)
143 L(shr_0):
144         cmp     $80, %ecx
145         jae     L(shr_0_gobble)
146         lea     -48(%ecx), %ecx
147         xor     %eax, %eax
148         movaps  (%esi), %xmm1
149         pcmpeqb (%edi), %xmm1
150         movaps  16(%esi), %xmm2
151         pcmpeqb 16(%edi), %xmm2
152         pand    %xmm1, %xmm2
153         pmovmskb %xmm2, %edx
154         add     $32, %edi
155         add     $32, %esi
156         sub     $0xffff, %edx
157         jnz     L(exit)
158         
160         lea     (%ecx, %edi,1), %eax
161         lea     (%ecx, %esi,1), %edx
162         POP (%edi)
163         POP (%esi)
164         jmp     L(less48bytes)
166         ALIGN (4)
167 L(shr_0_gobble):
168         lea     -48(%ecx), %ecx
169         movdqa  (%esi), %xmm0
170         xor     %eax, %eax
171         pcmpeqb (%edi), %xmm0
172         sub     $32, %ecx
173         movdqa  16(%esi), %xmm2
174         pcmpeqb 16(%edi), %xmm2
175 L(shr_0_gobble_loop):
176         pand    %xmm0, %xmm2
177         sub     $32, %ecx
178         pmovmskb %xmm2, %edx
179         movdqa  %xmm0, %xmm1
180         movdqa  32(%esi), %xmm0
181         movdqa  48(%esi), %xmm2
182         sbb     $0xffff, %edx
183         pcmpeqb 32(%edi), %xmm0
184         pcmpeqb 48(%edi), %xmm2
185         lea     32(%edi), %edi
186         lea     32(%esi), %esi
187         jz      L(shr_0_gobble_loop)
189         pand    %xmm0, %xmm2
190         cmp     $0, %ecx
191         jge     L(shr_0_gobble_loop_next)
192         inc     %edx
193         add     $32, %ecx
194 L(shr_0_gobble_loop_next):
195         test    %edx, %edx
196         jnz     L(exit)
198         pmovmskb %xmm2, %edx
199         movdqa  %xmm0, %xmm1
200         lea     32(%edi), %edi
201         lea     32(%esi), %esi
202         sub     $0xffff, %edx
203         jnz     L(exit)
204         lea     (%ecx, %edi,1), %eax
205         lea     (%ecx, %esi,1), %edx
206         POP (%edi)
207         POP (%esi)
208         jmp     L(less48bytes)
210         ALIGN (4)
211 L(shr_1):
212         cmp     $80, %ecx
213         lea     -48(%ecx), %ecx
214         mov     %edx, %eax
215         jae     L(shr_1_gobble)
217         movdqa  16(%esi), %xmm1
218         movdqa  %xmm1, %xmm2
219         palignr $1,(%esi), %xmm1
220         pcmpeqb (%edi), %xmm1
222         movdqa  32(%esi), %xmm3
223         palignr $1,%xmm2, %xmm3
224         pcmpeqb 16(%edi), %xmm3
226         pand    %xmm1, %xmm3
227         pmovmskb %xmm3, %edx
228         lea     32(%edi), %edi
229         lea     32(%esi), %esi
230         sub     $0xffff, %edx
231         jnz     L(exit)
232         lea     (%ecx, %edi,1), %eax
233         lea     1(%ecx, %esi,1), %edx
234         POP (%edi)
235         POP (%esi)
236         jmp     L(less48bytes)
238         ALIGN (4)
239 L(shr_1_gobble):
240         sub     $32, %ecx
241         movdqa  16(%esi), %xmm0
242         palignr $1,(%esi), %xmm0
243         pcmpeqb (%edi), %xmm0
245         movdqa  32(%esi), %xmm3
246         palignr $1,16(%esi), %xmm3
247         pcmpeqb 16(%edi), %xmm3
249 L(shr_1_gobble_loop):
250         pand    %xmm0, %xmm3
251         sub     $32, %ecx
252         pmovmskb %xmm3, %edx
253         movdqa  %xmm0, %xmm1
255         movdqa  64(%esi), %xmm3
256         palignr $1,48(%esi), %xmm3
257         sbb     $0xffff, %edx
258         movdqa  48(%esi), %xmm0
259         palignr $1,32(%esi), %xmm0
260         pcmpeqb 32(%edi), %xmm0
261         lea     32(%esi), %esi
262         pcmpeqb 48(%edi), %xmm3
264         lea     32(%edi), %edi
265         jz      L(shr_1_gobble_loop)
267         cmp     $0, %ecx
268         jge     L(shr_1_gobble_next)
269         inc     %edx
270         add     $32, %ecx
271 L(shr_1_gobble_next):
272         test    %edx, %edx
273         jnz     L(exit)
275         pmovmskb %xmm3, %edx
276         movdqa  %xmm0, %xmm1
277         lea     32(%edi), %edi
278         lea     32(%esi), %esi
279         sub     $0xffff, %edx
280         jnz     L(exit)
282         lea     (%ecx, %edi,1), %eax
283         lea     1(%ecx, %esi,1), %edx
284         POP (%edi)
285         POP (%esi)
286         jmp     L(less48bytes)
289         ALIGN (4)
290 L(shr_2):
291         cmp     $80, %ecx
292         lea     -48(%ecx), %ecx
293         mov     %edx, %eax
294         jae     L(shr_2_gobble)
296         movdqa  16(%esi), %xmm1
297         movdqa  %xmm1, %xmm2
298         palignr $2,(%esi), %xmm1
299         pcmpeqb (%edi), %xmm1
301         movdqa  32(%esi), %xmm3
302         palignr $2,%xmm2, %xmm3
303         pcmpeqb 16(%edi), %xmm3
305         pand    %xmm1, %xmm3
306         pmovmskb %xmm3, %edx
307         lea     32(%edi), %edi
308         lea     32(%esi), %esi
309         sub     $0xffff, %edx
310         jnz     L(exit)
311         lea     (%ecx, %edi,1), %eax
312         lea     2(%ecx, %esi,1), %edx
313         POP (%edi)
314         POP (%esi)
315         jmp     L(less48bytes)
317         ALIGN (4)
318 L(shr_2_gobble):
319         sub     $32, %ecx
320         movdqa  16(%esi), %xmm0
321         palignr $2,(%esi), %xmm0
322         pcmpeqb (%edi), %xmm0
324         movdqa  32(%esi), %xmm3
325         palignr $2,16(%esi), %xmm3
326         pcmpeqb 16(%edi), %xmm3
328 L(shr_2_gobble_loop):
329         pand    %xmm0, %xmm3
330         sub     $32, %ecx
331         pmovmskb %xmm3, %edx
332         movdqa  %xmm0, %xmm1
334         movdqa  64(%esi), %xmm3
335         palignr $2,48(%esi), %xmm3
336         sbb     $0xffff, %edx
337         movdqa  48(%esi), %xmm0
338         palignr $2,32(%esi), %xmm0
339         pcmpeqb 32(%edi), %xmm0
340         lea     32(%esi), %esi
341         pcmpeqb 48(%edi), %xmm3
343         lea     32(%edi), %edi
344         jz      L(shr_2_gobble_loop)
346         cmp     $0, %ecx
347         jge     L(shr_2_gobble_next)
348         inc     %edx
349         add     $32, %ecx
350 L(shr_2_gobble_next):
351         test    %edx, %edx
352         jnz     L(exit)
354         pmovmskb %xmm3, %edx
355         movdqa  %xmm0, %xmm1
356         lea     32(%edi), %edi
357         lea     32(%esi), %esi
358         sub     $0xffff, %edx
359         jnz     L(exit)
361         lea     (%ecx, %edi,1), %eax
362         lea     2(%ecx, %esi,1), %edx
363         POP (%edi)
364         POP (%esi)
365         jmp     L(less48bytes)
367         ALIGN (4)
368 L(shr_3):
369         cmp     $80, %ecx
370         lea     -48(%ecx), %ecx
371         mov     %edx, %eax
372         jae     L(shr_3_gobble)
374         movdqa  16(%esi), %xmm1
375         movdqa  %xmm1, %xmm2
376         palignr $3,(%esi), %xmm1
377         pcmpeqb (%edi), %xmm1
379         movdqa  32(%esi), %xmm3
380         palignr $3,%xmm2, %xmm3
381         pcmpeqb 16(%edi), %xmm3
383         pand    %xmm1, %xmm3
384         pmovmskb %xmm3, %edx
385         lea     32(%edi), %edi
386         lea     32(%esi), %esi
387         sub     $0xffff, %edx
388         jnz     L(exit)
389         lea     (%ecx, %edi,1), %eax
390         lea     3(%ecx, %esi,1), %edx
391         POP (%edi)
392         POP (%esi)
393         jmp     L(less48bytes)
395         ALIGN (4)
396 L(shr_3_gobble):
397         sub     $32, %ecx
398         movdqa  16(%esi), %xmm0
399         palignr $3,(%esi), %xmm0
400         pcmpeqb (%edi), %xmm0
402         movdqa  32(%esi), %xmm3
403         palignr $3,16(%esi), %xmm3
404         pcmpeqb 16(%edi), %xmm3
406 L(shr_3_gobble_loop):
407         pand    %xmm0, %xmm3
408         sub     $32, %ecx
409         pmovmskb %xmm3, %edx
410         movdqa  %xmm0, %xmm1
412         movdqa  64(%esi), %xmm3
413         palignr $3,48(%esi), %xmm3
414         sbb     $0xffff, %edx
415         movdqa  48(%esi), %xmm0
416         palignr $3,32(%esi), %xmm0
417         pcmpeqb 32(%edi), %xmm0
418         lea     32(%esi), %esi
419         pcmpeqb 48(%edi), %xmm3
421         lea     32(%edi), %edi
422         jz      L(shr_3_gobble_loop)
424         cmp     $0, %ecx
425         jge     L(shr_3_gobble_next)
426         inc     %edx
427         add     $32, %ecx
428 L(shr_3_gobble_next):
429         test    %edx, %edx
430         jnz     L(exit)
432         pmovmskb %xmm3, %edx
433         movdqa  %xmm0, %xmm1
434         lea     32(%edi), %edi
435         lea     32(%esi), %esi
436         sub     $0xffff, %edx
437         jnz     L(exit)
439         lea     (%ecx, %edi,1), %eax
440         lea     3(%ecx, %esi,1), %edx
441         POP (%edi)
442         POP (%esi)
443         jmp     L(less48bytes)
445         ALIGN (4)
446 L(shr_4):
447         cmp     $80, %ecx
448         lea     -48(%ecx), %ecx
449         mov     %edx, %eax
450         jae     L(shr_4_gobble)
452         movdqa  16(%esi), %xmm1
453         movdqa  %xmm1, %xmm2
454         palignr $4,(%esi), %xmm1
455         pcmpeqb (%edi), %xmm1
457         movdqa  32(%esi), %xmm3
458         palignr $4,%xmm2, %xmm3
459         pcmpeqb 16(%edi), %xmm3
461         pand    %xmm1, %xmm3
462         pmovmskb %xmm3, %edx
463         lea     32(%edi), %edi
464         lea     32(%esi), %esi
465         sub     $0xffff, %edx
466         jnz     L(exit)
467         lea     (%ecx, %edi,1), %eax
468         lea     4(%ecx, %esi,1), %edx
469         POP (%edi)
470         POP (%esi)
471         jmp     L(less48bytes)
473         ALIGN (4)
474 L(shr_4_gobble):
475         sub     $32, %ecx
476         movdqa  16(%esi), %xmm0
477         palignr $4,(%esi), %xmm0
478         pcmpeqb (%edi), %xmm0
480         movdqa  32(%esi), %xmm3
481         palignr $4,16(%esi), %xmm3
482         pcmpeqb 16(%edi), %xmm3
484 L(shr_4_gobble_loop):
485         pand    %xmm0, %xmm3
486         sub     $32, %ecx
487         pmovmskb %xmm3, %edx
488         movdqa  %xmm0, %xmm1
490         movdqa  64(%esi), %xmm3
491         palignr $4,48(%esi), %xmm3
492         sbb     $0xffff, %edx
493         movdqa  48(%esi), %xmm0
494         palignr $4,32(%esi), %xmm0
495         pcmpeqb 32(%edi), %xmm0
496         lea     32(%esi), %esi
497         pcmpeqb 48(%edi), %xmm3
499         lea     32(%edi), %edi
500         jz      L(shr_4_gobble_loop)
502         cmp     $0, %ecx
503         jge     L(shr_4_gobble_next)
504         inc     %edx
505         add     $32, %ecx
506 L(shr_4_gobble_next):
507         test    %edx, %edx
508         jnz     L(exit)
510         pmovmskb %xmm3, %edx
511         movdqa  %xmm0, %xmm1
512         lea     32(%edi), %edi
513         lea     32(%esi), %esi
514         sub     $0xffff, %edx
515         jnz     L(exit)
517         lea     (%ecx, %edi,1), %eax
518         lea     4(%ecx, %esi,1), %edx
519         POP (%edi)
520         POP (%esi)
521         jmp     L(less48bytes)
523         ALIGN (4)
524 L(shr_5):
525         cmp     $80, %ecx
526         lea     -48(%ecx), %ecx
527         mov     %edx, %eax
528         jae     L(shr_5_gobble)
530         movdqa  16(%esi), %xmm1
531         movdqa  %xmm1, %xmm2
532         palignr $5,(%esi), %xmm1
533         pcmpeqb (%edi), %xmm1
535         movdqa  32(%esi), %xmm3
536         palignr $5,%xmm2, %xmm3
537         pcmpeqb 16(%edi), %xmm3
539         pand    %xmm1, %xmm3
540         pmovmskb %xmm3, %edx
541         lea     32(%edi), %edi
542         lea     32(%esi), %esi
543         sub     $0xffff, %edx
544         jnz     L(exit)
545         lea     (%ecx, %edi,1), %eax
546         lea     5(%ecx, %esi,1), %edx
547         POP (%edi)
548         POP (%esi)
549         jmp     L(less48bytes)
551         ALIGN (4)
552 L(shr_5_gobble):
553         sub     $32, %ecx
554         movdqa  16(%esi), %xmm0
555         palignr $5,(%esi), %xmm0
556         pcmpeqb (%edi), %xmm0
558         movdqa  32(%esi), %xmm3
559         palignr $5,16(%esi), %xmm3
560         pcmpeqb 16(%edi), %xmm3
562 L(shr_5_gobble_loop):
563         pand    %xmm0, %xmm3
564         sub     $32, %ecx
565         pmovmskb %xmm3, %edx
566         movdqa  %xmm0, %xmm1
568         movdqa  64(%esi), %xmm3
569         palignr $5,48(%esi), %xmm3
570         sbb     $0xffff, %edx
571         movdqa  48(%esi), %xmm0
572         palignr $5,32(%esi), %xmm0
573         pcmpeqb 32(%edi), %xmm0
574         lea     32(%esi), %esi
575         pcmpeqb 48(%edi), %xmm3
577         lea     32(%edi), %edi
578         jz      L(shr_5_gobble_loop)
580         cmp     $0, %ecx
581         jge     L(shr_5_gobble_next)
582         inc     %edx
583         add     $32, %ecx
584 L(shr_5_gobble_next):
585         test    %edx, %edx
586         jnz     L(exit)
588         pmovmskb %xmm3, %edx
589         movdqa  %xmm0, %xmm1
590         lea     32(%edi), %edi
591         lea     32(%esi), %esi
592         sub     $0xffff, %edx
593         jnz     L(exit)
595         lea     (%ecx, %edi,1), %eax
596         lea     5(%ecx, %esi,1), %edx
597         POP (%edi)
598         POP (%esi)
599         jmp     L(less48bytes)
601         ALIGN (4)
602 L(shr_6):
603         cmp     $80, %ecx
604         lea     -48(%ecx), %ecx
605         mov     %edx, %eax
606         jae     L(shr_6_gobble)
608         movdqa  16(%esi), %xmm1
609         movdqa  %xmm1, %xmm2
610         palignr $6,(%esi), %xmm1
611         pcmpeqb (%edi), %xmm1
613         movdqa  32(%esi), %xmm3
614         palignr $6,%xmm2, %xmm3
615         pcmpeqb 16(%edi), %xmm3
617         pand    %xmm1, %xmm3
618         pmovmskb %xmm3, %edx
619         lea     32(%edi), %edi
620         lea     32(%esi), %esi
621         sub     $0xffff, %edx
622         jnz     L(exit)
623         lea     (%ecx, %edi,1), %eax
624         lea     6(%ecx, %esi,1), %edx
625         POP (%edi)
626         POP (%esi)
627         jmp     L(less48bytes)
629         ALIGN (4)
630 L(shr_6_gobble):
631         sub     $32, %ecx
632         movdqa  16(%esi), %xmm0
633         palignr $6,(%esi), %xmm0
634         pcmpeqb (%edi), %xmm0
636         movdqa  32(%esi), %xmm3
637         palignr $6,16(%esi), %xmm3
638         pcmpeqb 16(%edi), %xmm3
640 L(shr_6_gobble_loop):
641         pand    %xmm0, %xmm3
642         sub     $32, %ecx
643         pmovmskb %xmm3, %edx
644         movdqa  %xmm0, %xmm1
646         movdqa  64(%esi), %xmm3
647         palignr $6,48(%esi), %xmm3
648         sbb     $0xffff, %edx
649         movdqa  48(%esi), %xmm0
650         palignr $6,32(%esi), %xmm0
651         pcmpeqb 32(%edi), %xmm0
652         lea     32(%esi), %esi
653         pcmpeqb 48(%edi), %xmm3
655         lea     32(%edi), %edi
656         jz      L(shr_6_gobble_loop)
658         cmp     $0, %ecx
659         jge     L(shr_6_gobble_next)
660         inc     %edx
661         add     $32, %ecx
662 L(shr_6_gobble_next):
663         test    %edx, %edx
664         jnz     L(exit)
666         pmovmskb %xmm3, %edx
667         movdqa  %xmm0, %xmm1
668         lea     32(%edi), %edi
669         lea     32(%esi), %esi
670         sub     $0xffff, %edx
671         jnz     L(exit)
673         lea     (%ecx, %edi,1), %eax
674         lea     6(%ecx, %esi,1), %edx
675         POP (%edi)
676         POP (%esi)
677         jmp     L(less48bytes)
679         ALIGN (4)
680 L(shr_7):
681         cmp     $80, %ecx
682         lea     -48(%ecx), %ecx
683         mov     %edx, %eax
684         jae     L(shr_7_gobble)
686         movdqa  16(%esi), %xmm1
687         movdqa  %xmm1, %xmm2
688         palignr $7,(%esi), %xmm1
689         pcmpeqb (%edi), %xmm1
691         movdqa  32(%esi), %xmm3
692         palignr $7,%xmm2, %xmm3
693         pcmpeqb 16(%edi), %xmm3
695         pand    %xmm1, %xmm3
696         pmovmskb %xmm3, %edx
697         lea     32(%edi), %edi
698         lea     32(%esi), %esi
699         sub     $0xffff, %edx
700         jnz     L(exit)
701         lea     (%ecx, %edi,1), %eax
702         lea     7(%ecx, %esi,1), %edx
703         POP (%edi)
704         POP (%esi)
705         jmp     L(less48bytes)
707         ALIGN (4)
708 L(shr_7_gobble):
709         sub     $32, %ecx
710         movdqa  16(%esi), %xmm0
711         palignr $7,(%esi), %xmm0
712         pcmpeqb (%edi), %xmm0
714         movdqa  32(%esi), %xmm3
715         palignr $7,16(%esi), %xmm3
716         pcmpeqb 16(%edi), %xmm3
718 L(shr_7_gobble_loop):
719         pand    %xmm0, %xmm3
720         sub     $32, %ecx
721         pmovmskb %xmm3, %edx
722         movdqa  %xmm0, %xmm1
724         movdqa  64(%esi), %xmm3
725         palignr $7,48(%esi), %xmm3
726         sbb     $0xffff, %edx
727         movdqa  48(%esi), %xmm0
728         palignr $7,32(%esi), %xmm0
729         pcmpeqb 32(%edi), %xmm0
730         lea     32(%esi), %esi
731         pcmpeqb 48(%edi), %xmm3
733         lea     32(%edi), %edi
734         jz      L(shr_7_gobble_loop)
736         cmp     $0, %ecx
737         jge     L(shr_7_gobble_next)
738         inc     %edx
739         add     $32, %ecx
740 L(shr_7_gobble_next):
741         test    %edx, %edx
742         jnz     L(exit)
744         pmovmskb %xmm3, %edx
745         movdqa  %xmm0, %xmm1
746         lea     32(%edi), %edi
747         lea     32(%esi), %esi
748         sub     $0xffff, %edx
749         jnz     L(exit)
751         lea     (%ecx, %edi,1), %eax
752         lea     7(%ecx, %esi,1), %edx
753         POP (%edi)
754         POP (%esi)
755         jmp     L(less48bytes)
757         ALIGN (4)
758 L(shr_8):
759         cmp     $80, %ecx
760         lea     -48(%ecx), %ecx
761         mov     %edx, %eax
762         jae     L(shr_8_gobble)
764         movdqa  16(%esi), %xmm1
765         movdqa  %xmm1, %xmm2
766         palignr $8,(%esi), %xmm1
767         pcmpeqb (%edi), %xmm1
769         movdqa  32(%esi), %xmm3
770         palignr $8,%xmm2, %xmm3
771         pcmpeqb 16(%edi), %xmm3
773         pand    %xmm1, %xmm3
774         pmovmskb %xmm3, %edx
775         lea     32(%edi), %edi
776         lea     32(%esi), %esi
777         sub     $0xffff, %edx
778         jnz     L(exit)
779         lea     (%ecx, %edi,1), %eax
780         lea     8(%ecx, %esi,1), %edx
781         POP (%edi)
782         POP (%esi)
783         jmp     L(less48bytes)
785         ALIGN (4)
786 L(shr_8_gobble):
787         sub     $32, %ecx
788         movdqa  16(%esi), %xmm0
789         palignr $8,(%esi), %xmm0
790         pcmpeqb (%edi), %xmm0
792         movdqa  32(%esi), %xmm3
793         palignr $8,16(%esi), %xmm3
794         pcmpeqb 16(%edi), %xmm3
796 L(shr_8_gobble_loop):
797         pand    %xmm0, %xmm3
798         sub     $32, %ecx
799         pmovmskb %xmm3, %edx
800         movdqa  %xmm0, %xmm1
802         movdqa  64(%esi), %xmm3
803         palignr $8,48(%esi), %xmm3
804         sbb     $0xffff, %edx
805         movdqa  48(%esi), %xmm0
806         palignr $8,32(%esi), %xmm0
807         pcmpeqb 32(%edi), %xmm0
808         lea     32(%esi), %esi
809         pcmpeqb 48(%edi), %xmm3
811         lea     32(%edi), %edi
812         jz      L(shr_8_gobble_loop)
814         cmp     $0, %ecx
815         jge     L(shr_8_gobble_next)
816         inc     %edx
817         add     $32, %ecx
818 L(shr_8_gobble_next):
819         test    %edx, %edx
820         jnz     L(exit)
822         pmovmskb %xmm3, %edx
823         movdqa  %xmm0, %xmm1
824         lea     32(%edi), %edi
825         lea     32(%esi), %esi
826         sub     $0xffff, %edx
827         jnz     L(exit)
829         lea     (%ecx, %edi,1), %eax
830         lea     8(%ecx, %esi,1), %edx
831         POP (%edi)
832         POP (%esi)
833         jmp     L(less48bytes)
835         ALIGN (4)
836 L(shr_9):
837         cmp     $80, %ecx
838         lea     -48(%ecx), %ecx
839         mov     %edx, %eax
840         jae     L(shr_9_gobble)
842         movdqa  16(%esi), %xmm1
843         movdqa  %xmm1, %xmm2
844         palignr $9,(%esi), %xmm1
845         pcmpeqb (%edi), %xmm1
847         movdqa  32(%esi), %xmm3
848         palignr $9,%xmm2, %xmm3
849         pcmpeqb 16(%edi), %xmm3
851         pand    %xmm1, %xmm3
852         pmovmskb %xmm3, %edx
853         lea     32(%edi), %edi
854         lea     32(%esi), %esi
855         sub     $0xffff, %edx
856         jnz     L(exit)
857         lea     (%ecx, %edi,1), %eax
858         lea     9(%ecx, %esi,1), %edx
859         POP (%edi)
860         POP (%esi)
861         jmp     L(less48bytes)
863         ALIGN (4)
864 L(shr_9_gobble):
865         sub     $32, %ecx
866         movdqa  16(%esi), %xmm0
867         palignr $9,(%esi), %xmm0
868         pcmpeqb (%edi), %xmm0
870         movdqa  32(%esi), %xmm3
871         palignr $9,16(%esi), %xmm3
872         pcmpeqb 16(%edi), %xmm3
874 L(shr_9_gobble_loop):
875         pand    %xmm0, %xmm3
876         sub     $32, %ecx
877         pmovmskb %xmm3, %edx
878         movdqa  %xmm0, %xmm1
880         movdqa  64(%esi), %xmm3
881         palignr $9,48(%esi), %xmm3
882         sbb     $0xffff, %edx
883         movdqa  48(%esi), %xmm0
884         palignr $9,32(%esi), %xmm0
885         pcmpeqb 32(%edi), %xmm0
886         lea     32(%esi), %esi
887         pcmpeqb 48(%edi), %xmm3
889         lea     32(%edi), %edi
890         jz      L(shr_9_gobble_loop)
892         cmp     $0, %ecx
893         jge     L(shr_9_gobble_next)
894         inc     %edx
895         add     $32, %ecx
896 L(shr_9_gobble_next):
897         test    %edx, %edx
898         jnz     L(exit)
900         pmovmskb %xmm3, %edx
901         movdqa  %xmm0, %xmm1
902         lea     32(%edi), %edi
903         lea     32(%esi), %esi
904         sub     $0xffff, %edx
905         jnz     L(exit)
907         lea     (%ecx, %edi,1), %eax
908         lea     9(%ecx, %esi,1), %edx
909         POP (%edi)
910         POP (%esi)
911         jmp     L(less48bytes)
913         ALIGN (4)
914 L(shr_10):
915         cmp     $80, %ecx
916         lea     -48(%ecx), %ecx
917         mov     %edx, %eax
918         jae     L(shr_10_gobble)
920         movdqa  16(%esi), %xmm1
921         movdqa  %xmm1, %xmm2
922         palignr $10, (%esi), %xmm1
923         pcmpeqb (%edi), %xmm1
925         movdqa  32(%esi), %xmm3
926         palignr $10,%xmm2, %xmm3
927         pcmpeqb 16(%edi), %xmm3
929         pand    %xmm1, %xmm3
930         pmovmskb %xmm3, %edx
931         lea     32(%edi), %edi
932         lea     32(%esi), %esi
933         sub     $0xffff, %edx
934         jnz     L(exit)
935         lea     (%ecx, %edi,1), %eax
936         lea     10(%ecx, %esi,1), %edx
937         POP (%edi)
938         POP (%esi)
939         jmp     L(less48bytes)
941         ALIGN (4)
942 L(shr_10_gobble):
943         sub     $32, %ecx
944         movdqa  16(%esi), %xmm0
945         palignr $10, (%esi), %xmm0
946         pcmpeqb (%edi), %xmm0
948         movdqa  32(%esi), %xmm3
949         palignr $10, 16(%esi), %xmm3
950         pcmpeqb 16(%edi), %xmm3
952 L(shr_10_gobble_loop):
953         pand    %xmm0, %xmm3
954         sub     $32, %ecx
955         pmovmskb %xmm3, %edx
956         movdqa  %xmm0, %xmm1
958         movdqa  64(%esi), %xmm3
959         palignr $10,48(%esi), %xmm3
960         sbb     $0xffff, %edx
961         movdqa  48(%esi), %xmm0
962         palignr $10,32(%esi), %xmm0
963         pcmpeqb 32(%edi), %xmm0
964         lea     32(%esi), %esi
965         pcmpeqb 48(%edi), %xmm3
967         lea     32(%edi), %edi
968         jz      L(shr_10_gobble_loop)
970         cmp     $0, %ecx
971         jge     L(shr_10_gobble_next)
972         inc     %edx
973         add     $32, %ecx
974 L(shr_10_gobble_next):
975         test    %edx, %edx
976         jnz     L(exit)
978         pmovmskb %xmm3, %edx
979         movdqa  %xmm0, %xmm1
980         lea     32(%edi), %edi
981         lea     32(%esi), %esi
982         sub     $0xffff, %edx
983         jnz     L(exit)
985         lea     (%ecx, %edi,1), %eax
986         lea     10(%ecx, %esi,1), %edx
987         POP (%edi)
988         POP (%esi)
989         jmp     L(less48bytes)
991         ALIGN (4)
992 L(shr_11):
993         cmp     $80, %ecx
994         lea     -48(%ecx), %ecx
995         mov     %edx, %eax
996         jae     L(shr_11_gobble)
998         movdqa  16(%esi), %xmm1
999         movdqa  %xmm1, %xmm2
1000         palignr $11, (%esi), %xmm1
1001         pcmpeqb (%edi), %xmm1
1003         movdqa  32(%esi), %xmm3
1004         palignr $11, %xmm2, %xmm3
1005         pcmpeqb 16(%edi), %xmm3
1007         pand    %xmm1, %xmm3
1008         pmovmskb %xmm3, %edx
1009         lea     32(%edi), %edi
1010         lea     32(%esi), %esi
1011         sub     $0xffff, %edx
1012         jnz     L(exit)
1013         lea     (%ecx, %edi,1), %eax
1014         lea     11(%ecx, %esi,1), %edx
1015         POP (%edi)
1016         POP (%esi)
1017         jmp     L(less48bytes)
1019         ALIGN (4)
1020 L(shr_11_gobble):
1021         sub     $32, %ecx
1022         movdqa  16(%esi), %xmm0
1023         palignr $11, (%esi), %xmm0
1024         pcmpeqb (%edi), %xmm0
1026         movdqa  32(%esi), %xmm3
1027         palignr $11, 16(%esi), %xmm3
1028         pcmpeqb 16(%edi), %xmm3
1030 L(shr_11_gobble_loop):
1031         pand    %xmm0, %xmm3
1032         sub     $32, %ecx
1033         pmovmskb %xmm3, %edx
1034         movdqa  %xmm0, %xmm1
1036         movdqa  64(%esi), %xmm3
1037         palignr $11,48(%esi), %xmm3
1038         sbb     $0xffff, %edx
1039         movdqa  48(%esi), %xmm0
1040         palignr $11,32(%esi), %xmm0
1041         pcmpeqb 32(%edi), %xmm0
1042         lea     32(%esi), %esi
1043         pcmpeqb 48(%edi), %xmm3
1045         lea     32(%edi), %edi
1046         jz      L(shr_11_gobble_loop)
1048         cmp     $0, %ecx
1049         jge     L(shr_11_gobble_next)
1050         inc     %edx
1051         add     $32, %ecx
1052 L(shr_11_gobble_next):
1053         test    %edx, %edx
1054         jnz     L(exit)
1056         pmovmskb %xmm3, %edx
1057         movdqa  %xmm0, %xmm1
1058         lea     32(%edi), %edi
1059         lea     32(%esi), %esi
1060         sub     $0xffff, %edx
1061         jnz     L(exit)
1063         lea     (%ecx, %edi,1), %eax
1064         lea     11(%ecx, %esi,1), %edx
1065         POP (%edi)
1066         POP (%esi)
1067         jmp     L(less48bytes)
1069         ALIGN (4)
1070 L(shr_12):
1071         cmp     $80, %ecx
1072         lea     -48(%ecx), %ecx
1073         mov     %edx, %eax
1074         jae     L(shr_12_gobble)
1076         movdqa  16(%esi), %xmm1
1077         movdqa  %xmm1, %xmm2
1078         palignr $12, (%esi), %xmm1
1079         pcmpeqb (%edi), %xmm1
1081         movdqa  32(%esi), %xmm3
1082         palignr $12, %xmm2, %xmm3
1083         pcmpeqb 16(%edi), %xmm3
1085         pand    %xmm1, %xmm3
1086         pmovmskb %xmm3, %edx
1087         lea     32(%edi), %edi
1088         lea     32(%esi), %esi
1089         sub     $0xffff, %edx
1090         jnz     L(exit)
1091         lea     (%ecx, %edi,1), %eax
1092         lea     12(%ecx, %esi,1), %edx
1093         POP (%edi)
1094         POP (%esi)
1095         jmp     L(less48bytes)
1097         ALIGN (4)
1098 L(shr_12_gobble):
1099         sub     $32, %ecx
1100         movdqa  16(%esi), %xmm0
1101         palignr $12, (%esi), %xmm0
1102         pcmpeqb (%edi), %xmm0
1104         movdqa  32(%esi), %xmm3
1105         palignr $12, 16(%esi), %xmm3
1106         pcmpeqb 16(%edi), %xmm3
1108 L(shr_12_gobble_loop):
1109         pand    %xmm0, %xmm3
1110         sub     $32, %ecx
1111         pmovmskb %xmm3, %edx
1112         movdqa  %xmm0, %xmm1
1114         movdqa  64(%esi), %xmm3
1115         palignr $12,48(%esi), %xmm3
1116         sbb     $0xffff, %edx
1117         movdqa  48(%esi), %xmm0
1118         palignr $12,32(%esi), %xmm0
1119         pcmpeqb 32(%edi), %xmm0
1120         lea     32(%esi), %esi
1121         pcmpeqb 48(%edi), %xmm3
1123         lea     32(%edi), %edi
1124         jz      L(shr_12_gobble_loop)
1126         cmp     $0, %ecx
1127         jge     L(shr_12_gobble_next)
1128         inc     %edx
1129         add     $32, %ecx
1130 L(shr_12_gobble_next):
1131         test    %edx, %edx
1132         jnz     L(exit)
1134         pmovmskb %xmm3, %edx
1135         movdqa  %xmm0, %xmm1
1136         lea     32(%edi), %edi
1137         lea     32(%esi), %esi
1138         sub     $0xffff, %edx
1139         jnz     L(exit)
1141         lea     (%ecx, %edi,1), %eax
1142         lea     12(%ecx, %esi,1), %edx
1143         POP (%edi)
1144         POP (%esi)
1145         jmp     L(less48bytes)
1147         ALIGN (4)
1148 L(shr_13):
1149         cmp     $80, %ecx
1150         lea     -48(%ecx), %ecx
1151         mov     %edx, %eax
1152         jae     L(shr_13_gobble)
1154         movdqa  16(%esi), %xmm1
1155         movdqa  %xmm1, %xmm2
1156         palignr $13, (%esi), %xmm1
1157         pcmpeqb (%edi), %xmm1
1159         movdqa  32(%esi), %xmm3
1160         palignr $13, %xmm2, %xmm3
1161         pcmpeqb 16(%edi), %xmm3
1163         pand    %xmm1, %xmm3
1164         pmovmskb %xmm3, %edx
1165         lea     32(%edi), %edi
1166         lea     32(%esi), %esi
1167         sub     $0xffff, %edx
1168         jnz     L(exit)
1169         lea     (%ecx, %edi,1), %eax
1170         lea     13(%ecx, %esi,1), %edx
1171         POP (%edi)
1172         POP (%esi)
1173         jmp     L(less48bytes)
1175         ALIGN (4)
1176 L(shr_13_gobble):
1177         sub     $32, %ecx
1178         movdqa  16(%esi), %xmm0
1179         palignr $13, (%esi), %xmm0
1180         pcmpeqb (%edi), %xmm0
1182         movdqa  32(%esi), %xmm3
1183         palignr $13, 16(%esi), %xmm3
1184         pcmpeqb 16(%edi), %xmm3
1186 L(shr_13_gobble_loop):
1187         pand    %xmm0, %xmm3
1188         sub     $32, %ecx
1189         pmovmskb %xmm3, %edx
1190         movdqa  %xmm0, %xmm1
1192         movdqa  64(%esi), %xmm3
1193         palignr $13,48(%esi), %xmm3
1194         sbb     $0xffff, %edx
1195         movdqa  48(%esi), %xmm0
1196         palignr $13,32(%esi), %xmm0
1197         pcmpeqb 32(%edi), %xmm0
1198         lea     32(%esi), %esi
1199         pcmpeqb 48(%edi), %xmm3
1201         lea     32(%edi), %edi
1202         jz      L(shr_13_gobble_loop)
1204         cmp     $0, %ecx
1205         jge     L(shr_13_gobble_next)
1206         inc     %edx
1207         add     $32, %ecx
1208 L(shr_13_gobble_next):
1209         test    %edx, %edx
1210         jnz     L(exit)
1212         pmovmskb %xmm3, %edx
1213         movdqa  %xmm0, %xmm1
1214         lea     32(%edi), %edi
1215         lea     32(%esi), %esi
1216         sub     $0xffff, %edx
1217         jnz     L(exit)
1219         lea     (%ecx, %edi,1), %eax
1220         lea     13(%ecx, %esi,1), %edx
1221         POP (%edi)
1222         POP (%esi)
1223         jmp     L(less48bytes)
1225         ALIGN (4)
1226 L(shr_14):
1227         cmp     $80, %ecx
1228         lea     -48(%ecx), %ecx
1229         mov     %edx, %eax
1230         jae     L(shr_14_gobble)
1232         movdqa  16(%esi), %xmm1
1233         movdqa  %xmm1, %xmm2
1234         palignr $14, (%esi), %xmm1
1235         pcmpeqb (%edi), %xmm1
1237         movdqa  32(%esi), %xmm3
1238         palignr $14, %xmm2, %xmm3
1239         pcmpeqb 16(%edi), %xmm3
1241         pand    %xmm1, %xmm3
1242         pmovmskb %xmm3, %edx
1243         lea     32(%edi), %edi
1244         lea     32(%esi), %esi
1245         sub     $0xffff, %edx
1246         jnz     L(exit)
1247         lea     (%ecx, %edi,1), %eax
1248         lea     14(%ecx, %esi,1), %edx
1249         POP (%edi)
1250         POP (%esi)
1251         jmp     L(less48bytes)
1253         ALIGN (4)
1254 L(shr_14_gobble):
1255         sub     $32, %ecx
1256         movdqa  16(%esi), %xmm0
1257         palignr $14, (%esi), %xmm0
1258         pcmpeqb (%edi), %xmm0
1260         movdqa  32(%esi), %xmm3
1261         palignr $14, 16(%esi), %xmm3
1262         pcmpeqb 16(%edi), %xmm3
1264 L(shr_14_gobble_loop):
1265         pand    %xmm0, %xmm3
1266         sub     $32, %ecx
1267         pmovmskb %xmm3, %edx
1268         movdqa  %xmm0, %xmm1
1270         movdqa  64(%esi), %xmm3
1271         palignr $14,48(%esi), %xmm3
1272         sbb     $0xffff, %edx
1273         movdqa  48(%esi), %xmm0
1274         palignr $14,32(%esi), %xmm0
1275         pcmpeqb 32(%edi), %xmm0
1276         lea     32(%esi), %esi
1277         pcmpeqb 48(%edi), %xmm3
1279         lea     32(%edi), %edi
1280         jz      L(shr_14_gobble_loop)
1282         cmp     $0, %ecx
1283         jge     L(shr_14_gobble_next)
1284         inc     %edx
1285         add     $32, %ecx
1286 L(shr_14_gobble_next):
1287         test    %edx, %edx
1288         jnz     L(exit)
1290         pmovmskb %xmm3, %edx
1291         movdqa  %xmm0, %xmm1
1292         lea     32(%edi), %edi
1293         lea     32(%esi), %esi
1294         sub     $0xffff, %edx
1295         jnz     L(exit)
1297         lea     (%ecx, %edi,1), %eax
1298         lea     14(%ecx, %esi,1), %edx
1299         POP (%edi)
1300         POP (%esi)
1301         jmp     L(less48bytes)
1303         ALIGN (4)
1304 L(shr_15):
1305         cmp     $80, %ecx
1306         lea     -48(%ecx), %ecx
1307         mov     %edx, %eax
1308         jae     L(shr_15_gobble)
1310         movdqa  16(%esi), %xmm1
1311         movdqa  %xmm1, %xmm2
1312         palignr $15, (%esi), %xmm1
1313         pcmpeqb (%edi), %xmm1
1315         movdqa  32(%esi), %xmm3
1316         palignr $15, %xmm2, %xmm3
1317         pcmpeqb 16(%edi), %xmm3
1319         pand    %xmm1, %xmm3
1320         pmovmskb %xmm3, %edx
1321         lea     32(%edi), %edi
1322         lea     32(%esi), %esi
1323         sub     $0xffff, %edx
1324         jnz     L(exit)
1325         lea     (%ecx, %edi,1), %eax
1326         lea     15(%ecx, %esi,1), %edx
1327         POP (%edi)
1328         POP (%esi)
1329         jmp     L(less48bytes)
1331         ALIGN (4)
1332 L(shr_15_gobble):
1333         sub     $32, %ecx
1334         movdqa  16(%esi), %xmm0
1335         palignr $15, (%esi), %xmm0
1336         pcmpeqb (%edi), %xmm0
1338         movdqa  32(%esi), %xmm3
1339         palignr $15, 16(%esi), %xmm3
1340         pcmpeqb 16(%edi), %xmm3
1342 L(shr_15_gobble_loop):
1343         pand    %xmm0, %xmm3
1344         sub     $32, %ecx
1345         pmovmskb %xmm3, %edx
1346         movdqa  %xmm0, %xmm1
1348         movdqa  64(%esi), %xmm3
1349         palignr $15,48(%esi), %xmm3
1350         sbb     $0xffff, %edx
1351         movdqa  48(%esi), %xmm0
1352         palignr $15,32(%esi), %xmm0
1353         pcmpeqb 32(%edi), %xmm0
1354         lea     32(%esi), %esi
1355         pcmpeqb 48(%edi), %xmm3
1357         lea     32(%edi), %edi
1358         jz      L(shr_15_gobble_loop)
1360         cmp     $0, %ecx
1361         jge     L(shr_15_gobble_next)
1362         inc     %edx
1363         add     $32, %ecx
1364 L(shr_15_gobble_next):
1365         test    %edx, %edx
1366         jnz     L(exit)
1368         pmovmskb %xmm3, %edx
1369         movdqa  %xmm0, %xmm1
1370         lea     32(%edi), %edi
1371         lea     32(%esi), %esi
1372         sub     $0xffff, %edx
1373         jnz     L(exit)
1375         lea     (%ecx, %edi,1), %eax
1376         lea     15(%ecx, %esi,1), %edx
1377         POP (%edi)
1378         POP (%esi)
1379         jmp     L(less48bytes)
1381         ALIGN (4)
1382 L(exit):
1383         pmovmskb %xmm1, %ebx
1384         sub     $0xffff, %ebx
1385         jz      L(first16bytes)
1386         lea     -16(%esi), %esi
1387         lea     -16(%edi), %edi
1388         mov     %ebx, %edx
1389 L(first16bytes):
1390         add     %eax, %esi
1391 L(less16bytes):
1392         test    %dl, %dl
1393         jz      L(next_24_bytes)
1395         test    $0x01, %dl
1396         jnz     L(Byte16)
1398         test    $0x02, %dl
1399         jnz     L(Byte17)
1401         test    $0x04, %dl
1402         jnz     L(Byte18)
1404         test    $0x08, %dl
1405         jnz     L(Byte19)
1407         test    $0x10, %dl
1408         jnz     L(Byte20)
1410         test    $0x20, %dl
1411         jnz     L(Byte21)
1413         test    $0x40, %dl
1414         jnz     L(Byte22)
1415 L(Byte23):
1416         movzbl   -9(%edi), %eax
1417         movzbl   -9(%esi), %edx
1418         sub     %edx, %eax
1419         RETURN
1421         ALIGN (4)
1422 L(Byte16):
1423         movzbl   -16(%edi), %eax
1424         movzbl   -16(%esi), %edx
1425         sub     %edx, %eax
1426         RETURN
1428         ALIGN (4)
1429 L(Byte17):
1430         movzbl   -15(%edi), %eax
1431         movzbl   -15(%esi), %edx
1432         sub     %edx, %eax
1433         RETURN
1435         ALIGN (4)
1436 L(Byte18):
1437         movzbl   -14(%edi), %eax
1438         movzbl   -14(%esi), %edx
1439         sub     %edx, %eax
1440         RETURN
1442         ALIGN (4)
1443 L(Byte19):
1444         movzbl   -13(%edi), %eax
1445         movzbl   -13(%esi), %edx
1446         sub     %edx, %eax
1447         RETURN
1449         ALIGN (4)
1450 L(Byte20):
1451         movzbl   -12(%edi), %eax
1452         movzbl   -12(%esi), %edx
1453         sub     %edx, %eax
1454         RETURN
1456         ALIGN (4)
1457 L(Byte21):
1458         movzbl   -11(%edi), %eax
1459         movzbl   -11(%esi), %edx
1460         sub     %edx, %eax
1461         RETURN
1463         ALIGN (4)
1464 L(Byte22):
1465         movzbl   -10(%edi), %eax
1466         movzbl   -10(%esi), %edx
1467         sub     %edx, %eax
1468         RETURN
1470         ALIGN (4)
1471 L(next_24_bytes):
1472         lea     8(%edi), %edi
1473         lea     8(%esi), %esi
1474         test    $0x01, %dh
1475         jnz     L(Byte16)
1477         test    $0x02, %dh
1478         jnz     L(Byte17)
1480         test    $0x04, %dh
1481         jnz     L(Byte18)
1483         test    $0x08, %dh
1484         jnz     L(Byte19)
1486         test    $0x10, %dh
1487         jnz     L(Byte20)
1489         test    $0x20, %dh
1490         jnz     L(Byte21)
1492         test    $0x40, %dh
1493         jnz     L(Byte22)
1495         ALIGN (4)
1496 L(Byte31):
1497         movzbl   -9(%edi), %eax
1498         movzbl   -9(%esi), %edx
1499         sub     %edx, %eax
1500         RETURN
1502         ALIGN (4)
1503 L(more8bytes):
1504         cmp     $16, %ecx
1505         jae     L(more16bytes)
1506         cmp     $8, %ecx
1507         je      L(8bytes)
1508         cmp     $9, %ecx
1509         je      L(9bytes)
1510         cmp     $10, %ecx
1511         je      L(10bytes)
1512         cmp     $11, %ecx
1513         je      L(11bytes)
1514         cmp     $12, %ecx
1515         je      L(12bytes)
1516         cmp     $13, %ecx
1517         je      L(13bytes)
1518         cmp     $14, %ecx
1519         je      L(14bytes)
1520         jmp     L(15bytes)
1522         ALIGN (4)
1523 L(more16bytes):
1524         cmp     $24, %ecx
1525         jae     L(more24bytes)
1526         cmp     $16, %ecx
1527         je      L(16bytes)
1528         cmp     $17, %ecx
1529         je      L(17bytes)
1530         cmp     $18, %ecx
1531         je      L(18bytes)
1532         cmp     $19, %ecx
1533         je      L(19bytes)
1534         cmp     $20, %ecx
1535         je      L(20bytes)
1536         cmp     $21, %ecx
1537         je      L(21bytes)
1538         cmp     $22, %ecx
1539         je      L(22bytes)
1540         jmp     L(23bytes)
1542         ALIGN (4)
1543 L(more24bytes):
1544         cmp     $32, %ecx
1545         jae     L(more32bytes)
1546         cmp     $24, %ecx
1547         je      L(24bytes)
1548         cmp     $25, %ecx
1549         je      L(25bytes)
1550         cmp     $26, %ecx
1551         je      L(26bytes)
1552         cmp     $27, %ecx
1553         je      L(27bytes)
1554         cmp     $28, %ecx
1555         je      L(28bytes)
1556         cmp     $29, %ecx
1557         je      L(29bytes)
1558         cmp     $30, %ecx
1559         je      L(30bytes)
1560         jmp     L(31bytes)
1562         ALIGN (4)
1563 L(more32bytes):
1564         cmp     $40, %ecx
1565         jae     L(more40bytes)
1566         cmp     $32, %ecx
1567         je      L(32bytes)
1568         cmp     $33, %ecx
1569         je      L(33bytes)
1570         cmp     $34, %ecx
1571         je      L(34bytes)
1572         cmp     $35, %ecx
1573         je      L(35bytes)
1574         cmp     $36, %ecx
1575         je      L(36bytes)
1576         cmp     $37, %ecx
1577         je      L(37bytes)
1578         cmp     $38, %ecx
1579         je      L(38bytes)
1580         jmp     L(39bytes)
1582         ALIGN (4)
1583 L(more40bytes):
1584         cmp     $40, %ecx
1585         je      L(40bytes)
1586         cmp     $41, %ecx
1587         je      L(41bytes)
1588         cmp     $42, %ecx
1589         je      L(42bytes)
1590         cmp     $43, %ecx
1591         je      L(43bytes)
1592         cmp     $44, %ecx
1593         je      L(44bytes)
1594         cmp     $45, %ecx
1595         je      L(45bytes)
1596         cmp     $46, %ecx
1597         je      L(46bytes)
1598         jmp     L(47bytes)
1601         ALIGN (4)
1602 L(less48bytes):
1603         cmp     $8, %ecx
1604         jae     L(more8bytes)
1605         cmp     $2, %ecx
1606         je      L(2bytes)
1607         cmp     $3, %ecx
1608         je      L(3bytes)
1609         cmp     $4, %ecx
1610         je      L(4bytes)
1611         cmp     $5, %ecx
1612         je      L(5bytes)
1613         cmp     $6, %ecx
1614         je      L(6bytes)
1615         jmp     L(7bytes)
1620         ALIGN (4)
1621 L(44bytes):
1622         mov     -44(%eax), %ecx
1623         mov     -44(%edx), %ebx
1624         cmp     %ebx, %ecx
1625         jne     L(find_diff)
1626 L(40bytes):
1627         mov     -40(%eax), %ecx
1628         mov     -40(%edx), %ebx
1629         cmp     %ebx, %ecx
1630         jne     L(find_diff)
1631 L(36bytes):
1632         mov     -36(%eax), %ecx
1633         mov     -36(%edx), %ebx
1634         cmp     %ebx, %ecx
1635         jne     L(find_diff)
1636 L(32bytes):
1637         mov     -32(%eax), %ecx
1638         mov     -32(%edx), %ebx
1639         cmp     %ebx, %ecx
1640         jne     L(find_diff)
1641 L(28bytes):
1642         mov     -28(%eax), %ecx
1643         mov     -28(%edx), %ebx
1644         cmp     %ebx, %ecx
1645         jne     L(find_diff)
1646 L(24bytes):
1647         mov     -24(%eax), %ecx
1648         mov     -24(%edx), %ebx
1649         cmp     %ebx, %ecx
1650         jne     L(find_diff)
1651 L(20bytes):
1652         mov     -20(%eax), %ecx
1653         mov     -20(%edx), %ebx
1654         cmp     %ebx, %ecx
1655         jne     L(find_diff)
1656 L(16bytes):
1657         mov     -16(%eax), %ecx
1658         mov     -16(%edx), %ebx
1659         cmp     %ebx, %ecx
1660         jne     L(find_diff)
1661 L(12bytes):
1662         mov     -12(%eax), %ecx
1663         mov     -12(%edx), %ebx
1664         cmp     %ebx, %ecx
1665         jne     L(find_diff)
1666 L(8bytes):
1667         mov     -8(%eax), %ecx
1668         mov     -8(%edx), %ebx
1669         cmp     %ebx, %ecx
1670         jne     L(find_diff)
1671 L(4bytes):
1672         mov     -4(%eax), %ecx
1673         mov     -4(%edx), %ebx
1674         cmp     %ebx, %ecx
1675         mov     $0, %eax
1676         jne     L(find_diff)
1677         POP (%ebx)
1678         ret
1679         CFI_PUSH (%ebx)
1681         ALIGN (4)
1682 L(45bytes):
1683         mov     -45(%eax), %ecx
1684         mov     -45(%edx), %ebx
1685         cmp     %ebx, %ecx
1686         jne     L(find_diff)
1687 L(41bytes):
1688         mov     -41(%eax), %ecx
1689         mov     -41(%edx), %ebx
1690         cmp     %ebx, %ecx
1691         jne     L(find_diff)
1692 L(37bytes):
1693         mov     -37(%eax), %ecx
1694         mov     -37(%edx), %ebx
1695         cmp     %ebx, %ecx
1696         jne     L(find_diff)
1697 L(33bytes):
1698         mov     -33(%eax), %ecx
1699         mov     -33(%edx), %ebx
1700         cmp     %ebx, %ecx
1701         jne     L(find_diff)
1702 L(29bytes):
1703         mov     -29(%eax), %ecx
1704         mov     -29(%edx), %ebx
1705         cmp     %ebx, %ecx
1706         jne     L(find_diff)
1707 L(25bytes):
1708         mov     -25(%eax), %ecx
1709         mov     -25(%edx), %ebx
1710         cmp     %ebx, %ecx
1711         jne     L(find_diff)
1712 L(21bytes):
1713         mov     -21(%eax), %ecx
1714         mov     -21(%edx), %ebx
1715         cmp     %ebx, %ecx
1716         jne     L(find_diff)
1717 L(17bytes):
1718         mov     -17(%eax), %ecx
1719         mov     -17(%edx), %ebx
1720         cmp     %ebx, %ecx
1721         jne     L(find_diff)
1722 L(13bytes):
1723         mov     -13(%eax), %ecx
1724         mov     -13(%edx), %ebx
1725         cmp     %ebx, %ecx
1726         jne     L(find_diff)
1727 L(9bytes):
1728         mov     -9(%eax), %ecx
1729         mov     -9(%edx), %ebx
1730         cmp     %ebx, %ecx
1731         jne     L(find_diff)
1732 L(5bytes):
1733         mov     -5(%eax), %ecx
1734         mov     -5(%edx), %ebx
1735         cmp     %ebx, %ecx
1736         jne     L(find_diff)
1737         movzbl  -1(%eax), %ecx
1738         cmp     -1(%edx), %cl
1739         mov     $0, %eax
1740         jne     L(end)
1741         POP (%ebx)
1742         ret
1743         CFI_PUSH (%ebx)
1745         ALIGN (4)
1746 L(46bytes):
1747         mov     -46(%eax), %ecx
1748         mov     -46(%edx), %ebx
1749         cmp     %ebx, %ecx
1750         jne     L(find_diff)
1751 L(42bytes):
1752         mov     -42(%eax), %ecx
1753         mov     -42(%edx), %ebx
1754         cmp     %ebx, %ecx
1755         jne     L(find_diff)
1756 L(38bytes):
1757         mov     -38(%eax), %ecx
1758         mov     -38(%edx), %ebx
1759         cmp     %ebx, %ecx
1760         jne     L(find_diff)
1761 L(34bytes):
1762         mov     -34(%eax), %ecx
1763         mov     -34(%edx), %ebx
1764         cmp     %ebx, %ecx
1765         jne     L(find_diff)
1766 L(30bytes):
1767         mov     -30(%eax), %ecx
1768         mov     -30(%edx), %ebx
1769         cmp     %ebx, %ecx
1770         jne     L(find_diff)
1771 L(26bytes):
1772         mov     -26(%eax), %ecx
1773         mov     -26(%edx), %ebx
1774         cmp     %ebx, %ecx
1775         jne     L(find_diff)
1776 L(22bytes):
1777         mov     -22(%eax), %ecx
1778         mov     -22(%edx), %ebx
1779         cmp     %ebx, %ecx
1780         jne     L(find_diff)
1781 L(18bytes):
1782         mov     -18(%eax), %ecx
1783         mov     -18(%edx), %ebx
1784         cmp     %ebx, %ecx
1785         jne     L(find_diff)
1786 L(14bytes):
1787         mov     -14(%eax), %ecx
1788         mov     -14(%edx), %ebx
1789         cmp     %ebx, %ecx
1790         jne     L(find_diff)
1791 L(10bytes):
1792         mov     -10(%eax), %ecx
1793         mov     -10(%edx), %ebx
1794         cmp     %ebx, %ecx
1795         jne     L(find_diff)
1796 L(6bytes):
1797         mov     -6(%eax), %ecx
1798         mov     -6(%edx), %ebx
1799         cmp     %ebx, %ecx
1800         jne     L(find_diff)
1801 L(2bytes):
1802         movzwl  -2(%eax), %ecx
1803         movzwl  -2(%edx), %ebx
1804         cmp     %bl, %cl
1805         jne     L(end)
1806         cmp     %bh, %ch
1807         mov     $0, %eax
1808         jne     L(end)
1809         POP (%ebx)
1810         ret
1811         CFI_PUSH (%ebx)
1813         ALIGN (4)
1814 L(47bytes):
1815         movl    -47(%eax), %ecx
1816         movl    -47(%edx), %ebx
1817         cmp     %ebx, %ecx
1818         jne     L(find_diff)
1819 L(43bytes):
1820         movl    -43(%eax), %ecx
1821         movl    -43(%edx), %ebx
1822         cmp     %ebx, %ecx
1823         jne     L(find_diff)
1824 L(39bytes):
1825         movl    -39(%eax), %ecx
1826         movl    -39(%edx), %ebx
1827         cmp     %ebx, %ecx
1828         jne     L(find_diff)
1829 L(35bytes):
1830         movl    -35(%eax), %ecx
1831         movl    -35(%edx), %ebx
1832         cmp     %ebx, %ecx
1833         jne     L(find_diff)
1834 L(31bytes):
1835         movl    -31(%eax), %ecx
1836         movl    -31(%edx), %ebx
1837         cmp     %ebx, %ecx
1838         jne     L(find_diff)
1839 L(27bytes):
1840         movl    -27(%eax), %ecx
1841         movl    -27(%edx), %ebx
1842         cmp     %ebx, %ecx
1843         jne     L(find_diff)
1844 L(23bytes):
1845         movl    -23(%eax), %ecx
1846         movl    -23(%edx), %ebx
1847         cmp     %ebx, %ecx
1848         jne     L(find_diff)
1849 L(19bytes):
1850         movl    -19(%eax), %ecx
1851         movl    -19(%edx), %ebx
1852         cmp     %ebx, %ecx
1853         jne     L(find_diff)
1854 L(15bytes):
1855         movl    -15(%eax), %ecx
1856         movl    -15(%edx), %ebx
1857         cmp     %ebx, %ecx
1858         jne     L(find_diff)
1859 L(11bytes):
1860         movl    -11(%eax), %ecx
1861         movl    -11(%edx), %ebx
1862         cmp     %ebx, %ecx
1863         jne     L(find_diff)
1864 L(7bytes):
1865         movl    -7(%eax), %ecx
1866         movl    -7(%edx), %ebx
1867         cmp     %ebx, %ecx
1868         jne     L(find_diff)
1869 L(3bytes):
1870         movzwl  -3(%eax), %ecx
1871         movzwl  -3(%edx), %ebx
1872         cmpb    %bl, %cl
1873         jne     L(end)
1874         cmp     %bx, %cx
1875         jne     L(end)
1876         movzbl  -1(%eax), %eax
1877         cmpb    -1(%edx), %al
1878         mov     $0, %eax
1879         jne     L(end)
1880         POP (%ebx)
1881         ret
1882         CFI_PUSH (%ebx)
1884         ALIGN (4)
1885 L(find_diff):
1886         cmpb    %bl, %cl
1887         jne     L(end)
1888         cmp     %bx, %cx
1889         jne     L(end)
1890         shr     $16,%ecx
1891         shr     $16,%ebx
1892         cmp     %bl, %cl
1893         jne     L(end)
1894         cmp     %bx, %cx
1895 L(end):
1896         POP (%ebx)
1897         mov     $1, %eax
1898         ja      L(bigger)
1899         neg     %eax
1900 L(bigger):
1901         ret
1903 END (MEMCMP)
1905 #endif