]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/bionic-x86_64-string/sse4-memcmp-slm.S
Merge LUA 5.4.6
[FreeBSD/FreeBSD.git] / contrib / bionic-x86_64-string / sse4-memcmp-slm.S
1 /*
2 Copyright (c) 2014, Intel Corporation
3 All rights reserved.
4
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are met:
7
8     * Redistributions of source code must retain the above copyright notice,
9     * this list of conditions and the following disclaimer.
10
11     * Redistributions in binary form must reproduce the above copyright notice,
12     * this list of conditions and the following disclaimer in the documentation
13     * and/or other materials provided with the distribution.
14
15     * Neither the name of Intel Corporation nor the names of its contributors
16     * may be used to endorse or promote products derived from this software
17     * without specific prior written permission.
18
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
23 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 #include "cache.h"
32
33 #ifndef MEMCMP
34 # define MEMCMP         memcmp
35 #endif
36
37 #ifndef L
38 # define L(label)       .L##label
39 #endif
40
41 #ifndef ALIGN
42 # define ALIGN(n)       .p2align n
43 #endif
44
45 #ifndef cfi_startproc
46 # define cfi_startproc                  .cfi_startproc
47 #endif
48
49 #ifndef cfi_endproc
50 # define cfi_endproc                    .cfi_endproc
51 #endif
52
53 #ifndef ENTRY
54 # define ENTRY(name)                    \
55         .type name,  @function;         \
56         .globl name;                    \
57         .p2align 4;                     \
58 name:                                   \
59         cfi_startproc
60 #endif
61
62 #ifndef END
63 # define END(name)                      \
64         cfi_endproc;                    \
65         .size name, .-name
66 #endif
67
68 #ifndef ALIGN
69 # define ALIGN(n)       .p2align n
70 #endif
71
72 #define JMPTBL(I, B)    (I - B)
73
74 #define BRANCH_TO_JMPTBL_ENTRY(TABLE, INDEX, SCALE)             \
75   lea           TABLE(%rip), %r11;                              \
76   movslq        (%r11, INDEX, SCALE), %rcx;                     \
77   add           %r11, %rcx;                                     \
78   jmp           *%rcx;                                          \
79   ud2
80
81         .section .text.sse4.1,"ax",@progbits
82 ENTRY (MEMCMP)
83 #ifdef USE_AS_WMEMCMP
84         shl     $2, %rdx
85 #endif
86         pxor    %xmm0, %xmm0
87         cmp     $79, %rdx
88         ja      L(79bytesormore)
89 #ifndef USE_AS_WMEMCMP
90         cmp     $1, %rdx
91         je      L(firstbyte)
92 #endif
93         add     %rdx, %rsi
94         add     %rdx, %rdi
95         BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
96
97 #ifndef USE_AS_WMEMCMP
98         ALIGN (4)
99 L(firstbyte):
100         movzbl  (%rdi), %eax
101         movzbl  (%rsi), %ecx
102         sub     %ecx, %eax
103         ret
104 #endif
105
106         ALIGN (4)
107 L(79bytesormore):
108         movdqu  (%rsi), %xmm1
109         movdqu  (%rdi), %xmm2
110         pxor    %xmm1, %xmm2
111         ptest   %xmm2, %xmm0
112         jnc     L(16bytesin256)
113         mov     %rsi, %rcx
114         and     $-16, %rsi
115         add     $16, %rsi
116         sub     %rsi, %rcx
117
118         sub     %rcx, %rdi
119         add     %rcx, %rdx
120         test    $0xf, %rdi
121         jz      L(2aligned)
122
123         cmp     $128, %rdx
124         ja      L(128bytesormore)
125 L(less128bytes):
126         sub     $64, %rdx
127
128         movdqu  (%rdi), %xmm2
129         pxor    (%rsi), %xmm2
130         ptest   %xmm2, %xmm0
131         jnc     L(16bytesin256)
132
133         movdqu  16(%rdi), %xmm2
134         pxor    16(%rsi), %xmm2
135         ptest   %xmm2, %xmm0
136         jnc     L(32bytesin256)
137
138         movdqu  32(%rdi), %xmm2
139         pxor    32(%rsi), %xmm2
140         ptest   %xmm2, %xmm0
141         jnc     L(48bytesin256)
142
143         movdqu  48(%rdi), %xmm2
144         pxor    48(%rsi), %xmm2
145         ptest   %xmm2, %xmm0
146         jnc     L(64bytesin256)
147         cmp     $32, %rdx
148         jb      L(less32bytesin64)
149
150         movdqu  64(%rdi), %xmm2
151         pxor    64(%rsi), %xmm2
152         ptest   %xmm2, %xmm0
153         jnc     L(80bytesin256)
154
155         movdqu  80(%rdi), %xmm2
156         pxor    80(%rsi), %xmm2
157         ptest   %xmm2, %xmm0
158         jnc     L(96bytesin256)
159         sub     $32, %rdx
160         add     $32, %rdi
161         add     $32, %rsi
162 L(less32bytesin64):
163         add     $64, %rdi
164         add     $64, %rsi
165         add     %rdx, %rsi
166         add     %rdx, %rdi
167         BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
168
169 L(128bytesormore):
170         cmp     $512, %rdx
171         ja      L(512bytesormore)
172         cmp     $256, %rdx
173         ja      L(less512bytes)
174 L(less256bytes):
175         sub     $128, %rdx
176
177         movdqu  (%rdi), %xmm2
178         pxor    (%rsi), %xmm2
179         ptest   %xmm2, %xmm0
180         jnc     L(16bytesin256)
181
182         movdqu  16(%rdi), %xmm2
183         pxor    16(%rsi), %xmm2
184         ptest   %xmm2, %xmm0
185         jnc     L(32bytesin256)
186
187         movdqu  32(%rdi), %xmm2
188         pxor    32(%rsi), %xmm2
189         ptest   %xmm2, %xmm0
190         jnc     L(48bytesin256)
191
192         movdqu  48(%rdi), %xmm2
193         pxor    48(%rsi), %xmm2
194         ptest   %xmm2, %xmm0
195         jnc     L(64bytesin256)
196
197         movdqu  64(%rdi), %xmm2
198         pxor    64(%rsi), %xmm2
199         ptest   %xmm2, %xmm0
200         jnc     L(80bytesin256)
201
202         movdqu  80(%rdi), %xmm2
203         pxor    80(%rsi), %xmm2
204         ptest   %xmm2, %xmm0
205         jnc     L(96bytesin256)
206
207         movdqu  96(%rdi), %xmm2
208         pxor    96(%rsi), %xmm2
209         ptest   %xmm2, %xmm0
210         jnc     L(112bytesin256)
211
212         movdqu  112(%rdi), %xmm2
213         pxor    112(%rsi), %xmm2
214         ptest   %xmm2, %xmm0
215         jnc     L(128bytesin256)
216
217         add     $128, %rsi
218         add     $128, %rdi
219
220         cmp     $64, %rdx
221         jae     L(less128bytes)
222
223         cmp     $32, %rdx
224         jb      L(less32bytesin128)
225
226         movdqu  (%rdi), %xmm2
227         pxor    (%rsi), %xmm2
228         ptest   %xmm2, %xmm0
229         jnc     L(16bytesin256)
230
231         movdqu  16(%rdi), %xmm2
232         pxor    16(%rsi), %xmm2
233         ptest   %xmm2, %xmm0
234         jnc     L(32bytesin256)
235         sub     $32, %rdx
236         add     $32, %rdi
237         add     $32, %rsi
238 L(less32bytesin128):
239         add     %rdx, %rsi
240         add     %rdx, %rdi
241         BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
242
243 L(less512bytes):
244         sub     $256, %rdx
245         movdqu  (%rdi), %xmm2
246         pxor    (%rsi), %xmm2
247         ptest   %xmm2, %xmm0
248         jnc     L(16bytesin256)
249
250         movdqu  16(%rdi), %xmm2
251         pxor    16(%rsi), %xmm2
252         ptest   %xmm2, %xmm0
253         jnc     L(32bytesin256)
254
255         movdqu  32(%rdi), %xmm2
256         pxor    32(%rsi), %xmm2
257         ptest   %xmm2, %xmm0
258         jnc     L(48bytesin256)
259
260         movdqu  48(%rdi), %xmm2
261         pxor    48(%rsi), %xmm2
262         ptest   %xmm2, %xmm0
263         jnc     L(64bytesin256)
264
265         movdqu  64(%rdi), %xmm2
266         pxor    64(%rsi), %xmm2
267         ptest   %xmm2, %xmm0
268         jnc     L(80bytesin256)
269
270         movdqu  80(%rdi), %xmm2
271         pxor    80(%rsi), %xmm2
272         ptest   %xmm2, %xmm0
273         jnc     L(96bytesin256)
274
275         movdqu  96(%rdi), %xmm2
276         pxor    96(%rsi), %xmm2
277         ptest   %xmm2, %xmm0
278         jnc     L(112bytesin256)
279
280         movdqu  112(%rdi), %xmm2
281         pxor    112(%rsi), %xmm2
282         ptest   %xmm2, %xmm0
283         jnc     L(128bytesin256)
284
285         movdqu  128(%rdi), %xmm2
286         pxor    128(%rsi), %xmm2
287         ptest   %xmm2, %xmm0
288         jnc     L(144bytesin256)
289
290         movdqu  144(%rdi), %xmm2
291         pxor    144(%rsi), %xmm2
292         ptest   %xmm2, %xmm0
293         jnc     L(160bytesin256)
294
295         movdqu  160(%rdi), %xmm2
296         pxor    160(%rsi), %xmm2
297         ptest   %xmm2, %xmm0
298         jnc     L(176bytesin256)
299
300         movdqu  176(%rdi), %xmm2
301         pxor    176(%rsi), %xmm2
302         ptest   %xmm2, %xmm0
303         jnc     L(192bytesin256)
304
305         movdqu  192(%rdi), %xmm2
306         pxor    192(%rsi), %xmm2
307         ptest   %xmm2, %xmm0
308         jnc     L(208bytesin256)
309
310         movdqu  208(%rdi), %xmm2
311         pxor    208(%rsi), %xmm2
312         ptest   %xmm2, %xmm0
313         jnc     L(224bytesin256)
314
315         movdqu  224(%rdi), %xmm2
316         pxor    224(%rsi), %xmm2
317         ptest   %xmm2, %xmm0
318         jnc     L(240bytesin256)
319
320         movdqu  240(%rdi), %xmm2
321         pxor    240(%rsi), %xmm2
322         ptest   %xmm2, %xmm0
323         jnc     L(256bytesin256)
324
325         add     $256, %rsi
326         add     $256, %rdi
327
328         cmp     $128, %rdx
329         jae     L(less256bytes)
330
331         cmp     $64, %rdx
332         jae     L(less128bytes)
333
334         cmp     $32, %rdx
335         jb      L(less32bytesin256)
336
337         movdqu  (%rdi), %xmm2
338         pxor    (%rsi), %xmm2
339         ptest   %xmm2, %xmm0
340         jnc     L(16bytesin256)
341
342         movdqu  16(%rdi), %xmm2
343         pxor    16(%rsi), %xmm2
344         ptest   %xmm2, %xmm0
345         jnc     L(32bytesin256)
346         sub     $32, %rdx
347         add     $32, %rdi
348         add     $32, %rsi
349 L(less32bytesin256):
350         add     %rdx, %rsi
351         add     %rdx, %rdi
352         BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
353
354         ALIGN (4)
355 L(512bytesormore):
356 #ifdef DATA_CACHE_SIZE_HALF
357         mov     $DATA_CACHE_SIZE_HALF, %r8
358 #else
359         mov     __x86_64_data_cache_size_half(%rip), %r8
360 #endif
361         mov     %r8, %r9
362         shr     $1, %r8
363         add     %r9, %r8
364         cmp     %r8, %rdx
365         ja      L(L2_L3_cache_unaglined)
366         sub     $64, %rdx
367         ALIGN (4)
368 L(64bytesormore_loop):
369         movdqu  (%rdi), %xmm2
370         pxor    (%rsi), %xmm2
371         movdqa  %xmm2, %xmm1
372
373         movdqu  16(%rdi), %xmm3
374         pxor    16(%rsi), %xmm3
375         por     %xmm3, %xmm1
376
377         movdqu  32(%rdi), %xmm4
378         pxor    32(%rsi), %xmm4
379         por     %xmm4, %xmm1
380
381         movdqu  48(%rdi), %xmm5
382         pxor    48(%rsi), %xmm5
383         por     %xmm5, %xmm1
384
385         ptest   %xmm1, %xmm0
386         jnc     L(64bytesormore_loop_end)
387         add     $64, %rsi
388         add     $64, %rdi
389         sub     $64, %rdx
390         jae     L(64bytesormore_loop)
391
392         add     $64, %rdx
393         add     %rdx, %rsi
394         add     %rdx, %rdi
395         BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
396
397 L(L2_L3_cache_unaglined):
398         sub     $64, %rdx
399         ALIGN (4)
400 L(L2_L3_unaligned_128bytes_loop):
401         prefetchnta 0x1c0(%rdi)
402         prefetchnta 0x1c0(%rsi)
403         movdqu  (%rdi), %xmm2
404         pxor    (%rsi), %xmm2
405         movdqa  %xmm2, %xmm1
406
407         movdqu  16(%rdi), %xmm3
408         pxor    16(%rsi), %xmm3
409         por     %xmm3, %xmm1
410
411         movdqu  32(%rdi), %xmm4
412         pxor    32(%rsi), %xmm4
413         por     %xmm4, %xmm1
414
415         movdqu  48(%rdi), %xmm5
416         pxor    48(%rsi), %xmm5
417         por     %xmm5, %xmm1
418
419         ptest   %xmm1, %xmm0
420         jnc     L(64bytesormore_loop_end)
421         add     $64, %rsi
422         add     $64, %rdi
423         sub     $64, %rdx
424         jae     L(L2_L3_unaligned_128bytes_loop)
425
426         add     $64, %rdx
427         add     %rdx, %rsi
428         add     %rdx, %rdi
429         BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
430
431 /*
432  * This case is for machines which are sensitive for unaligned instructions.
433  */
434         ALIGN (4)
435 L(2aligned):
436         cmp     $128, %rdx
437         ja      L(128bytesormorein2aligned)
438 L(less128bytesin2aligned):
439         sub     $64, %rdx
440
441         movdqa  (%rdi), %xmm2
442         pxor    (%rsi), %xmm2
443         ptest   %xmm2, %xmm0
444         jnc     L(16bytesin256)
445
446         movdqa  16(%rdi), %xmm2
447         pxor    16(%rsi), %xmm2
448         ptest   %xmm2, %xmm0
449         jnc     L(32bytesin256)
450
451         movdqa  32(%rdi), %xmm2
452         pxor    32(%rsi), %xmm2
453         ptest   %xmm2, %xmm0
454         jnc     L(48bytesin256)
455
456         movdqa  48(%rdi), %xmm2
457         pxor    48(%rsi), %xmm2
458         ptest   %xmm2, %xmm0
459         jnc     L(64bytesin256)
460         cmp     $32, %rdx
461         jb      L(less32bytesin64in2alinged)
462
463         movdqa  64(%rdi), %xmm2
464         pxor    64(%rsi), %xmm2
465         ptest   %xmm2, %xmm0
466         jnc     L(80bytesin256)
467
468         movdqa  80(%rdi), %xmm2
469         pxor    80(%rsi), %xmm2
470         ptest   %xmm2, %xmm0
471         jnc     L(96bytesin256)
472         sub     $32, %rdx
473         add     $32, %rdi
474         add     $32, %rsi
475 L(less32bytesin64in2alinged):
476         add     $64, %rdi
477         add     $64, %rsi
478         add     %rdx, %rsi
479         add     %rdx, %rdi
480         BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
481
482         ALIGN (4)
483 L(128bytesormorein2aligned):
484         cmp     $512, %rdx
485         ja      L(512bytesormorein2aligned)
486         cmp     $256, %rdx
487         ja      L(256bytesormorein2aligned)
488 L(less256bytesin2alinged):
489         sub     $128, %rdx
490
491         movdqa  (%rdi), %xmm2
492         pxor    (%rsi), %xmm2
493         ptest   %xmm2, %xmm0
494         jnc     L(16bytesin256)
495
496         movdqa  16(%rdi), %xmm2
497         pxor    16(%rsi), %xmm2
498         ptest   %xmm2, %xmm0
499         jnc     L(32bytesin256)
500
501         movdqa  32(%rdi), %xmm2
502         pxor    32(%rsi), %xmm2
503         ptest   %xmm2, %xmm0
504         jnc     L(48bytesin256)
505
506         movdqa  48(%rdi), %xmm2
507         pxor    48(%rsi), %xmm2
508         ptest   %xmm2, %xmm0
509         jnc     L(64bytesin256)
510
511         movdqa  64(%rdi), %xmm2
512         pxor    64(%rsi), %xmm2
513         ptest   %xmm2, %xmm0
514         jnc     L(80bytesin256)
515
516         movdqa  80(%rdi), %xmm2
517         pxor    80(%rsi), %xmm2
518         ptest   %xmm2, %xmm0
519         jnc     L(96bytesin256)
520
521         movdqa  96(%rdi), %xmm2
522         pxor    96(%rsi), %xmm2
523         ptest   %xmm2, %xmm0
524         jnc     L(112bytesin256)
525
526         movdqa  112(%rdi), %xmm2
527         pxor    112(%rsi), %xmm2
528         ptest   %xmm2, %xmm0
529         jnc     L(128bytesin256)
530
531         add     $128, %rsi
532         add     $128, %rdi
533
534         cmp     $64, %rdx
535         jae     L(less128bytesin2aligned)
536
537         cmp     $32, %rdx
538         jb      L(less32bytesin128in2aligned)
539
540         movdqu  (%rdi), %xmm2
541         pxor    (%rsi), %xmm2
542         ptest   %xmm2, %xmm0
543         jnc     L(16bytesin256)
544
545         movdqu  16(%rdi), %xmm2
546         pxor    16(%rsi), %xmm2
547         ptest   %xmm2, %xmm0
548         jnc     L(32bytesin256)
549         sub     $32, %rdx
550         add     $32, %rdi
551         add     $32, %rsi
552 L(less32bytesin128in2aligned):
553         add     %rdx, %rsi
554         add     %rdx, %rdi
555         BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
556
557         ALIGN (4)
558 L(256bytesormorein2aligned):
559
560         sub     $256, %rdx
561         movdqa  (%rdi), %xmm2
562         pxor    (%rsi), %xmm2
563         ptest   %xmm2, %xmm0
564         jnc     L(16bytesin256)
565
566         movdqa  16(%rdi), %xmm2
567         pxor    16(%rsi), %xmm2
568         ptest   %xmm2, %xmm0
569         jnc     L(32bytesin256)
570
571         movdqa  32(%rdi), %xmm2
572         pxor    32(%rsi), %xmm2
573         ptest   %xmm2, %xmm0
574         jnc     L(48bytesin256)
575
576         movdqa  48(%rdi), %xmm2
577         pxor    48(%rsi), %xmm2
578         ptest   %xmm2, %xmm0
579         jnc     L(64bytesin256)
580
581         movdqa  64(%rdi), %xmm2
582         pxor    64(%rsi), %xmm2
583         ptest   %xmm2, %xmm0
584         jnc     L(80bytesin256)
585
586         movdqa  80(%rdi), %xmm2
587         pxor    80(%rsi), %xmm2
588         ptest   %xmm2, %xmm0
589         jnc     L(96bytesin256)
590
591         movdqa  96(%rdi), %xmm2
592         pxor    96(%rsi), %xmm2
593         ptest   %xmm2, %xmm0
594         jnc     L(112bytesin256)
595
596         movdqa  112(%rdi), %xmm2
597         pxor    112(%rsi), %xmm2
598         ptest   %xmm2, %xmm0
599         jnc     L(128bytesin256)
600
601         movdqa  128(%rdi), %xmm2
602         pxor    128(%rsi), %xmm2
603         ptest   %xmm2, %xmm0
604         jnc     L(144bytesin256)
605
606         movdqa  144(%rdi), %xmm2
607         pxor    144(%rsi), %xmm2
608         ptest   %xmm2, %xmm0
609         jnc     L(160bytesin256)
610
611         movdqa  160(%rdi), %xmm2
612         pxor    160(%rsi), %xmm2
613         ptest   %xmm2, %xmm0
614         jnc     L(176bytesin256)
615
616         movdqa  176(%rdi), %xmm2
617         pxor    176(%rsi), %xmm2
618         ptest   %xmm2, %xmm0
619         jnc     L(192bytesin256)
620
621         movdqa  192(%rdi), %xmm2
622         pxor    192(%rsi), %xmm2
623         ptest   %xmm2, %xmm0
624         jnc     L(208bytesin256)
625
626         movdqa  208(%rdi), %xmm2
627         pxor    208(%rsi), %xmm2
628         ptest   %xmm2, %xmm0
629         jnc     L(224bytesin256)
630
631         movdqa  224(%rdi), %xmm2
632         pxor    224(%rsi), %xmm2
633         ptest   %xmm2, %xmm0
634         jnc     L(240bytesin256)
635
636         movdqa  240(%rdi), %xmm2
637         pxor    240(%rsi), %xmm2
638         ptest   %xmm2, %xmm0
639         jnc     L(256bytesin256)
640
641         add     $256, %rsi
642         add     $256, %rdi
643
644         cmp     $128, %rdx
645         jae     L(less256bytesin2alinged)
646
647         cmp     $64, %rdx
648         jae     L(less128bytesin2aligned)
649
650         cmp     $32, %rdx
651         jb      L(less32bytesin256in2alinged)
652
653         movdqa  (%rdi), %xmm2
654         pxor    (%rsi), %xmm2
655         ptest   %xmm2, %xmm0
656         jnc     L(16bytesin256)
657
658         movdqa  16(%rdi), %xmm2
659         pxor    16(%rsi), %xmm2
660         ptest   %xmm2, %xmm0
661         jnc     L(32bytesin256)
662         sub     $32, %rdx
663         add     $32, %rdi
664         add     $32, %rsi
665 L(less32bytesin256in2alinged):
666         add     %rdx, %rsi
667         add     %rdx, %rdi
668         BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
669
670         ALIGN (4)
671 L(512bytesormorein2aligned):
672 #ifdef DATA_CACHE_SIZE_HALF
673         mov     $DATA_CACHE_SIZE_HALF, %r8
674 #else
675         mov     __x86_64_data_cache_size_half(%rip), %r8
676 #endif
677         mov     %r8, %r9
678         shr     $1, %r8
679         add     %r9, %r8
680         cmp     %r8, %rdx
681         ja      L(L2_L3_cache_aglined)
682
683         sub     $64, %rdx
684         ALIGN (4)
685 L(64bytesormore_loopin2aligned):
686         movdqa  (%rdi), %xmm2
687         pxor    (%rsi), %xmm2
688         movdqa  %xmm2, %xmm1
689
690         movdqa  16(%rdi), %xmm3
691         pxor    16(%rsi), %xmm3
692         por     %xmm3, %xmm1
693
694         movdqa  32(%rdi), %xmm4
695         pxor    32(%rsi), %xmm4
696         por     %xmm4, %xmm1
697
698         movdqa  48(%rdi), %xmm5
699         pxor    48(%rsi), %xmm5
700         por     %xmm5, %xmm1
701
702         ptest   %xmm1, %xmm0
703         jnc     L(64bytesormore_loop_end)
704         add     $64, %rsi
705         add     $64, %rdi
706         sub     $64, %rdx
707         jae     L(64bytesormore_loopin2aligned)
708
709         add     $64, %rdx
710         add     %rdx, %rsi
711         add     %rdx, %rdi
712         BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
713 L(L2_L3_cache_aglined):
714         sub     $64, %rdx
715         ALIGN (4)
716 L(L2_L3_aligned_128bytes_loop):
717         prefetchnta 0x1c0(%rdi)
718         prefetchnta 0x1c0(%rsi)
719         movdqa  (%rdi), %xmm2
720         pxor    (%rsi), %xmm2
721         movdqa  %xmm2, %xmm1
722
723         movdqa  16(%rdi), %xmm3
724         pxor    16(%rsi), %xmm3
725         por     %xmm3, %xmm1
726
727         movdqa  32(%rdi), %xmm4
728         pxor    32(%rsi), %xmm4
729         por     %xmm4, %xmm1
730
731         movdqa  48(%rdi), %xmm5
732         pxor    48(%rsi), %xmm5
733         por     %xmm5, %xmm1
734
735         ptest   %xmm1, %xmm0
736         jnc     L(64bytesormore_loop_end)
737         add     $64, %rsi
738         add     $64, %rdi
739         sub     $64, %rdx
740         jae     L(L2_L3_aligned_128bytes_loop)
741
742         add     $64, %rdx
743         add     %rdx, %rsi
744         add     %rdx, %rdi
745         BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
746
747
748         ALIGN (4)
749 L(64bytesormore_loop_end):
750         add     $16, %rdi
751         add     $16, %rsi
752         ptest   %xmm2, %xmm0
753         jnc     L(16bytes)
754
755         add     $16, %rdi
756         add     $16, %rsi
757         ptest   %xmm3, %xmm0
758         jnc     L(16bytes)
759
760         add     $16, %rdi
761         add     $16, %rsi
762         ptest   %xmm4, %xmm0
763         jnc     L(16bytes)
764
765         add     $16, %rdi
766         add     $16, %rsi
767         jmp     L(16bytes)
768
769 L(256bytesin256):
770         add     $256, %rdi
771         add     $256, %rsi
772         jmp     L(16bytes)
773 L(240bytesin256):
774         add     $240, %rdi
775         add     $240, %rsi
776         jmp     L(16bytes)
777 L(224bytesin256):
778         add     $224, %rdi
779         add     $224, %rsi
780         jmp     L(16bytes)
781 L(208bytesin256):
782         add     $208, %rdi
783         add     $208, %rsi
784         jmp     L(16bytes)
785 L(192bytesin256):
786         add     $192, %rdi
787         add     $192, %rsi
788         jmp     L(16bytes)
789 L(176bytesin256):
790         add     $176, %rdi
791         add     $176, %rsi
792         jmp     L(16bytes)
793 L(160bytesin256):
794         add     $160, %rdi
795         add     $160, %rsi
796         jmp     L(16bytes)
797 L(144bytesin256):
798         add     $144, %rdi
799         add     $144, %rsi
800         jmp     L(16bytes)
801 L(128bytesin256):
802         add     $128, %rdi
803         add     $128, %rsi
804         jmp     L(16bytes)
805 L(112bytesin256):
806         add     $112, %rdi
807         add     $112, %rsi
808         jmp     L(16bytes)
809 L(96bytesin256):
810         add     $96, %rdi
811         add     $96, %rsi
812         jmp     L(16bytes)
813 L(80bytesin256):
814         add     $80, %rdi
815         add     $80, %rsi
816         jmp     L(16bytes)
817 L(64bytesin256):
818         add     $64, %rdi
819         add     $64, %rsi
820         jmp     L(16bytes)
821 L(48bytesin256):
822         add     $16, %rdi
823         add     $16, %rsi
824 L(32bytesin256):
825         add     $16, %rdi
826         add     $16, %rsi
827 L(16bytesin256):
828         add     $16, %rdi
829         add     $16, %rsi
830 L(16bytes):
831         mov     -16(%rdi), %rax
832         mov     -16(%rsi), %rcx
833         cmp     %rax, %rcx
834         jne     L(diffin8bytes)
835 L(8bytes):
836         mov     -8(%rdi), %rax
837         mov     -8(%rsi), %rcx
838         cmp     %rax, %rcx
839         jne     L(diffin8bytes)
840         xor     %eax, %eax
841         ret
842
843         ALIGN (4)
844 L(12bytes):
845         mov     -12(%rdi), %rax
846         mov     -12(%rsi), %rcx
847         cmp     %rax, %rcx
848         jne     L(diffin8bytes)
849 L(4bytes):
850         mov     -4(%rsi), %ecx
851         mov     -4(%rdi), %eax
852         cmp     %eax, %ecx
853         jne     L(diffin4bytes)
854 L(0bytes):
855         xor     %eax, %eax
856         ret
857
858 #ifndef USE_AS_WMEMCMP
859 /* unreal case for wmemcmp */
860         ALIGN (4)
861 L(65bytes):
862         movdqu  -65(%rdi), %xmm1
863         movdqu  -65(%rsi), %xmm2
864         mov     $-65, %dl
865         pxor    %xmm1, %xmm2
866         ptest   %xmm2, %xmm0
867         jnc     L(less16bytes)
868 L(49bytes):
869         movdqu  -49(%rdi), %xmm1
870         movdqu  -49(%rsi), %xmm2
871         mov     $-49, %dl
872         pxor    %xmm1, %xmm2
873         ptest   %xmm2, %xmm0
874         jnc     L(less16bytes)
875 L(33bytes):
876         movdqu  -33(%rdi), %xmm1
877         movdqu  -33(%rsi), %xmm2
878         mov     $-33, %dl
879         pxor    %xmm1, %xmm2
880         ptest   %xmm2, %xmm0
881         jnc     L(less16bytes)
882 L(17bytes):
883         mov     -17(%rdi), %rax
884         mov     -17(%rsi), %rcx
885         cmp     %rax, %rcx
886         jne     L(diffin8bytes)
887 L(9bytes):
888         mov     -9(%rdi), %rax
889         mov     -9(%rsi), %rcx
890         cmp     %rax, %rcx
891         jne     L(diffin8bytes)
892         movzbl  -1(%rdi), %eax
893         movzbl  -1(%rsi), %edx
894         sub     %edx, %eax
895         ret
896
897         ALIGN (4)
898 L(13bytes):
899         mov     -13(%rdi), %rax
900         mov     -13(%rsi), %rcx
901         cmp     %rax, %rcx
902         jne     L(diffin8bytes)
903         mov     -8(%rdi), %rax
904         mov     -8(%rsi), %rcx
905         cmp     %rax, %rcx
906         jne     L(diffin8bytes)
907         xor     %eax, %eax
908         ret
909
910         ALIGN (4)
911 L(5bytes):
912         mov     -5(%rdi), %eax
913         mov     -5(%rsi), %ecx
914         cmp     %eax, %ecx
915         jne     L(diffin4bytes)
916         movzbl  -1(%rdi), %eax
917         movzbl  -1(%rsi), %edx
918         sub     %edx, %eax
919         ret
920
921         ALIGN (4)
922 L(66bytes):
923         movdqu  -66(%rdi), %xmm1
924         movdqu  -66(%rsi), %xmm2
925         mov     $-66, %dl
926         pxor    %xmm1, %xmm2
927         ptest   %xmm2, %xmm0
928         jnc     L(less16bytes)
929 L(50bytes):
930         movdqu  -50(%rdi), %xmm1
931         movdqu  -50(%rsi), %xmm2
932         mov     $-50, %dl
933         pxor    %xmm1, %xmm2
934         ptest   %xmm2, %xmm0
935         jnc     L(less16bytes)
936 L(34bytes):
937         movdqu  -34(%rdi), %xmm1
938         movdqu  -34(%rsi), %xmm2
939         mov     $-34, %dl
940         pxor    %xmm1, %xmm2
941         ptest   %xmm2, %xmm0
942         jnc     L(less16bytes)
943 L(18bytes):
944         mov     -18(%rdi), %rax
945         mov     -18(%rsi), %rcx
946         cmp     %rax, %rcx
947         jne     L(diffin8bytes)
948 L(10bytes):
949         mov     -10(%rdi), %rax
950         mov     -10(%rsi), %rcx
951         cmp     %rax, %rcx
952         jne     L(diffin8bytes)
953         movzwl  -2(%rdi), %eax
954         movzwl  -2(%rsi), %ecx
955         cmp     %cl, %al
956         jne     L(end)
957         and     $0xffff, %eax
958         and     $0xffff, %ecx
959         sub     %ecx, %eax
960         ret
961
962         ALIGN (4)
963 L(14bytes):
964         mov     -14(%rdi), %rax
965         mov     -14(%rsi), %rcx
966         cmp     %rax, %rcx
967         jne     L(diffin8bytes)
968         mov     -8(%rdi), %rax
969         mov     -8(%rsi), %rcx
970         cmp     %rax, %rcx
971         jne     L(diffin8bytes)
972         xor     %eax, %eax
973         ret
974
975         ALIGN (4)
976 L(6bytes):
977         mov     -6(%rdi), %eax
978         mov     -6(%rsi), %ecx
979         cmp     %eax, %ecx
980         jne     L(diffin4bytes)
981 L(2bytes):
982         movzwl  -2(%rsi), %ecx
983         movzwl  -2(%rdi), %eax
984         cmp     %cl, %al
985         jne     L(end)
986         and     $0xffff, %eax
987         and     $0xffff, %ecx
988         sub     %ecx, %eax
989         ret
990
991         ALIGN (4)
992 L(67bytes):
993         movdqu  -67(%rdi), %xmm2
994         movdqu  -67(%rsi), %xmm1
995         mov     $-67, %dl
996         pxor    %xmm1, %xmm2
997         ptest   %xmm2, %xmm0
998         jnc     L(less16bytes)
999 L(51bytes):
1000         movdqu  -51(%rdi), %xmm2
1001         movdqu  -51(%rsi), %xmm1
1002         mov     $-51, %dl
1003         pxor    %xmm1, %xmm2
1004         ptest   %xmm2, %xmm0
1005         jnc     L(less16bytes)
1006 L(35bytes):
1007         movdqu  -35(%rsi), %xmm1
1008         movdqu  -35(%rdi), %xmm2
1009         mov     $-35, %dl
1010         pxor    %xmm1, %xmm2
1011         ptest   %xmm2, %xmm0
1012         jnc     L(less16bytes)
1013 L(19bytes):
1014         mov     -19(%rdi), %rax
1015         mov     -19(%rsi), %rcx
1016         cmp     %rax, %rcx
1017         jne     L(diffin8bytes)
1018 L(11bytes):
1019         mov     -11(%rdi), %rax
1020         mov     -11(%rsi), %rcx
1021         cmp     %rax, %rcx
1022         jne     L(diffin8bytes)
1023         mov     -4(%rdi), %eax
1024         mov     -4(%rsi), %ecx
1025         cmp     %eax, %ecx
1026         jne     L(diffin4bytes)
1027         xor     %eax, %eax
1028         ret
1029
1030         ALIGN (4)
1031 L(15bytes):
1032         mov     -15(%rdi), %rax
1033         mov     -15(%rsi), %rcx
1034         cmp     %rax, %rcx
1035         jne     L(diffin8bytes)
1036         mov     -8(%rdi), %rax
1037         mov     -8(%rsi), %rcx
1038         cmp     %rax, %rcx
1039         jne     L(diffin8bytes)
1040         xor     %eax, %eax
1041         ret
1042
1043         ALIGN (4)
1044 L(7bytes):
1045         mov     -7(%rdi), %eax
1046         mov     -7(%rsi), %ecx
1047         cmp     %eax, %ecx
1048         jne     L(diffin4bytes)
1049         mov     -4(%rdi), %eax
1050         mov     -4(%rsi), %ecx
1051         cmp     %eax, %ecx
1052         jne     L(diffin4bytes)
1053         xor     %eax, %eax
1054         ret
1055
1056         ALIGN (4)
1057 L(3bytes):
1058         movzwl  -3(%rdi), %eax
1059         movzwl  -3(%rsi), %ecx
1060         cmp     %eax, %ecx
1061         jne     L(diffin2bytes)
1062 L(1bytes):
1063         movzbl  -1(%rdi), %eax
1064         movzbl  -1(%rsi), %ecx
1065         sub     %ecx, %eax
1066         ret
1067 #endif
1068
1069         ALIGN (4)
1070 L(68bytes):
1071         movdqu  -68(%rdi), %xmm2
1072         movdqu  -68(%rsi), %xmm1
1073         mov     $-68, %dl
1074         pxor    %xmm1, %xmm2
1075         ptest   %xmm2, %xmm0
1076         jnc     L(less16bytes)
1077 L(52bytes):
1078         movdqu  -52(%rdi), %xmm2
1079         movdqu  -52(%rsi), %xmm1
1080         mov     $-52, %dl
1081         pxor    %xmm1, %xmm2
1082         ptest   %xmm2, %xmm0
1083         jnc     L(less16bytes)
1084 L(36bytes):
1085         movdqu  -36(%rdi), %xmm2
1086         movdqu  -36(%rsi), %xmm1
1087         mov     $-36, %dl
1088         pxor    %xmm1, %xmm2
1089         ptest   %xmm2, %xmm0
1090         jnc     L(less16bytes)
1091 L(20bytes):
1092         movdqu  -20(%rdi), %xmm2
1093         movdqu  -20(%rsi), %xmm1
1094         mov     $-20, %dl
1095         pxor    %xmm1, %xmm2
1096         ptest   %xmm2, %xmm0
1097         jnc     L(less16bytes)
1098         mov     -4(%rdi), %eax
1099         mov     -4(%rsi), %ecx
1100         cmp     %eax, %ecx
1101         jne     L(diffin4bytes)
1102         xor     %eax, %eax
1103         ret
1104
1105 #ifndef USE_AS_WMEMCMP
1106 /* unreal cases for wmemcmp */
1107         ALIGN (4)
1108 L(69bytes):
1109         movdqu  -69(%rsi), %xmm1
1110         movdqu  -69(%rdi), %xmm2
1111         mov     $-69, %dl
1112         pxor    %xmm1, %xmm2
1113         ptest   %xmm2, %xmm0
1114         jnc     L(less16bytes)
1115 L(53bytes):
1116         movdqu  -53(%rsi), %xmm1
1117         movdqu  -53(%rdi), %xmm2
1118         mov     $-53, %dl
1119         pxor    %xmm1, %xmm2
1120         ptest   %xmm2, %xmm0
1121         jnc     L(less16bytes)
1122 L(37bytes):
1123         movdqu  -37(%rsi), %xmm1
1124         movdqu  -37(%rdi), %xmm2
1125         mov     $-37, %dl
1126         pxor    %xmm1, %xmm2
1127         ptest   %xmm2, %xmm0
1128         jnc     L(less16bytes)
1129 L(21bytes):
1130         movdqu  -21(%rsi), %xmm1
1131         movdqu  -21(%rdi), %xmm2
1132         mov     $-21, %dl
1133         pxor    %xmm1, %xmm2
1134         ptest   %xmm2, %xmm0
1135         jnc     L(less16bytes)
1136         mov     -8(%rdi), %rax
1137         mov     -8(%rsi), %rcx
1138         cmp     %rax, %rcx
1139         jne     L(diffin8bytes)
1140         xor     %eax, %eax
1141         ret
1142
1143         ALIGN (4)
1144 L(70bytes):
1145         movdqu  -70(%rsi), %xmm1
1146         movdqu  -70(%rdi), %xmm2
1147         mov     $-70, %dl
1148         pxor    %xmm1, %xmm2
1149         ptest   %xmm2, %xmm0
1150         jnc     L(less16bytes)
1151 L(54bytes):
1152         movdqu  -54(%rsi), %xmm1
1153         movdqu  -54(%rdi), %xmm2
1154         mov     $-54, %dl
1155         pxor    %xmm1, %xmm2
1156         ptest   %xmm2, %xmm0
1157         jnc     L(less16bytes)
1158 L(38bytes):
1159         movdqu  -38(%rsi), %xmm1
1160         movdqu  -38(%rdi), %xmm2
1161         mov     $-38, %dl
1162         pxor    %xmm1, %xmm2
1163         ptest   %xmm2, %xmm0
1164         jnc     L(less16bytes)
1165 L(22bytes):
1166         movdqu  -22(%rsi), %xmm1
1167         movdqu  -22(%rdi), %xmm2
1168         mov     $-22, %dl
1169         pxor    %xmm1, %xmm2
1170         ptest   %xmm2, %xmm0
1171         jnc     L(less16bytes)
1172         mov     -8(%rdi), %rax
1173         mov     -8(%rsi), %rcx
1174         cmp     %rax, %rcx
1175         jne     L(diffin8bytes)
1176         xor     %eax, %eax
1177         ret
1178
1179         ALIGN (4)
1180 L(71bytes):
1181         movdqu  -71(%rsi), %xmm1
1182         movdqu  -71(%rdi), %xmm2
1183         mov     $-71, %dl
1184         pxor    %xmm1, %xmm2
1185         ptest   %xmm2, %xmm0
1186         jnc     L(less16bytes)
1187 L(55bytes):
1188         movdqu  -55(%rdi), %xmm2
1189         movdqu  -55(%rsi), %xmm1
1190         mov     $-55, %dl
1191         pxor    %xmm1, %xmm2
1192         ptest   %xmm2, %xmm0
1193         jnc     L(less16bytes)
1194 L(39bytes):
1195         movdqu  -39(%rdi), %xmm2
1196         movdqu  -39(%rsi), %xmm1
1197         mov     $-39, %dl
1198         pxor    %xmm1, %xmm2
1199         ptest   %xmm2, %xmm0
1200         jnc     L(less16bytes)
1201 L(23bytes):
1202         movdqu  -23(%rdi), %xmm2
1203         movdqu  -23(%rsi), %xmm1
1204         mov     $-23, %dl
1205         pxor    %xmm1, %xmm2
1206         ptest   %xmm2, %xmm0
1207         jnc     L(less16bytes)
1208         mov     -8(%rdi), %rax
1209         mov     -8(%rsi), %rcx
1210         cmp     %rax, %rcx
1211         jne     L(diffin8bytes)
1212         xor     %eax, %eax
1213         ret
1214 #endif
1215
1216         ALIGN (4)
1217 L(72bytes):
1218         movdqu  -72(%rsi), %xmm1
1219         movdqu  -72(%rdi), %xmm2
1220         mov     $-72, %dl
1221         pxor    %xmm1, %xmm2
1222         ptest   %xmm2, %xmm0
1223         jnc     L(less16bytes)
1224 L(56bytes):
1225         movdqu  -56(%rdi), %xmm2
1226         movdqu  -56(%rsi), %xmm1
1227         mov     $-56, %dl
1228         pxor    %xmm1, %xmm2
1229         ptest   %xmm2, %xmm0
1230         jnc     L(less16bytes)
1231 L(40bytes):
1232         movdqu  -40(%rdi), %xmm2
1233         movdqu  -40(%rsi), %xmm1
1234         mov     $-40, %dl
1235         pxor    %xmm1, %xmm2
1236         ptest   %xmm2, %xmm0
1237         jnc     L(less16bytes)
1238 L(24bytes):
1239         movdqu  -24(%rdi), %xmm2
1240         movdqu  -24(%rsi), %xmm1
1241         mov     $-24, %dl
1242         pxor    %xmm1, %xmm2
1243         ptest   %xmm2, %xmm0
1244         jnc     L(less16bytes)
1245         mov     -8(%rdi), %rax
1246         mov     -8(%rsi), %rcx
1247         cmp     %rax, %rcx
1248         jne     L(diffin8bytes)
1249         xor     %eax, %eax
1250         ret
1251
1252 #ifndef USE_AS_WMEMCMP
1253 /* unreal cases for wmemcmp */
1254         ALIGN (4)
1255 L(73bytes):
1256         movdqu  -73(%rsi), %xmm1
1257         movdqu  -73(%rdi), %xmm2
1258         mov     $-73, %dl
1259         pxor    %xmm1, %xmm2
1260         ptest   %xmm2, %xmm0
1261         jnc     L(less16bytes)
1262 L(57bytes):
1263         movdqu  -57(%rdi), %xmm2
1264         movdqu  -57(%rsi), %xmm1
1265         mov     $-57, %dl
1266         pxor    %xmm1, %xmm2
1267         ptest   %xmm2, %xmm0
1268         jnc     L(less16bytes)
1269 L(41bytes):
1270         movdqu  -41(%rdi), %xmm2
1271         movdqu  -41(%rsi), %xmm1
1272         mov     $-41, %dl
1273         pxor    %xmm1, %xmm2
1274         ptest   %xmm2, %xmm0
1275         jnc     L(less16bytes)
1276 L(25bytes):
1277         movdqu  -25(%rdi), %xmm2
1278         movdqu  -25(%rsi), %xmm1
1279         mov     $-25, %dl
1280         pxor    %xmm1, %xmm2
1281         ptest   %xmm2, %xmm0
1282         jnc     L(less16bytes)
1283         mov     -9(%rdi), %rax
1284         mov     -9(%rsi), %rcx
1285         cmp     %rax, %rcx
1286         jne     L(diffin8bytes)
1287         movzbl  -1(%rdi), %eax
1288         movzbl  -1(%rsi), %ecx
1289         sub     %ecx, %eax
1290         ret
1291
1292         ALIGN (4)
1293 L(74bytes):
1294         movdqu  -74(%rsi), %xmm1
1295         movdqu  -74(%rdi), %xmm2
1296         mov     $-74, %dl
1297         pxor    %xmm1, %xmm2
1298         ptest   %xmm2, %xmm0
1299         jnc     L(less16bytes)
1300 L(58bytes):
1301         movdqu  -58(%rdi), %xmm2
1302         movdqu  -58(%rsi), %xmm1
1303         mov     $-58, %dl
1304         pxor    %xmm1, %xmm2
1305         ptest   %xmm2, %xmm0
1306         jnc     L(less16bytes)
1307 L(42bytes):
1308         movdqu  -42(%rdi), %xmm2
1309         movdqu  -42(%rsi), %xmm1
1310         mov     $-42, %dl
1311         pxor    %xmm1, %xmm2
1312         ptest   %xmm2, %xmm0
1313         jnc     L(less16bytes)
1314 L(26bytes):
1315         movdqu  -26(%rdi), %xmm2
1316         movdqu  -26(%rsi), %xmm1
1317         mov     $-26, %dl
1318         pxor    %xmm1, %xmm2
1319         ptest   %xmm2, %xmm0
1320         jnc     L(less16bytes)
1321         mov     -10(%rdi), %rax
1322         mov     -10(%rsi), %rcx
1323         cmp     %rax, %rcx
1324         jne     L(diffin8bytes)
1325         movzwl  -2(%rdi), %eax
1326         movzwl  -2(%rsi), %ecx
1327         jmp     L(diffin2bytes)
1328
1329         ALIGN (4)
1330 L(75bytes):
1331         movdqu  -75(%rsi), %xmm1
1332         movdqu  -75(%rdi), %xmm2
1333         mov     $-75, %dl
1334         pxor    %xmm1, %xmm2
1335         ptest   %xmm2, %xmm0
1336         jnc     L(less16bytes)
1337 L(59bytes):
1338         movdqu  -59(%rdi), %xmm2
1339         movdqu  -59(%rsi), %xmm1
1340         mov     $-59, %dl
1341         pxor    %xmm1, %xmm2
1342         ptest   %xmm2, %xmm0
1343         jnc     L(less16bytes)
1344 L(43bytes):
1345         movdqu  -43(%rdi), %xmm2
1346         movdqu  -43(%rsi), %xmm1
1347         mov     $-43, %dl
1348         pxor    %xmm1, %xmm2
1349         ptest   %xmm2, %xmm0
1350         jnc     L(less16bytes)
1351 L(27bytes):
1352         movdqu  -27(%rdi), %xmm2
1353         movdqu  -27(%rsi), %xmm1
1354         mov     $-27, %dl
1355         pxor    %xmm1, %xmm2
1356         ptest   %xmm2, %xmm0
1357         jnc     L(less16bytes)
1358         mov     -11(%rdi), %rax
1359         mov     -11(%rsi), %rcx
1360         cmp     %rax, %rcx
1361         jne     L(diffin8bytes)
1362         mov     -4(%rdi), %eax
1363         mov     -4(%rsi), %ecx
1364         cmp     %eax, %ecx
1365         jne     L(diffin4bytes)
1366         xor     %eax, %eax
1367         ret
1368 #endif
1369         ALIGN (4)
1370 L(76bytes):
1371         movdqu  -76(%rsi), %xmm1
1372         movdqu  -76(%rdi), %xmm2
1373         mov     $-76, %dl
1374         pxor    %xmm1, %xmm2
1375         ptest   %xmm2, %xmm0
1376         jnc     L(less16bytes)
1377 L(60bytes):
1378         movdqu  -60(%rdi), %xmm2
1379         movdqu  -60(%rsi), %xmm1
1380         mov     $-60, %dl
1381         pxor    %xmm1, %xmm2
1382         ptest   %xmm2, %xmm0
1383         jnc     L(less16bytes)
1384 L(44bytes):
1385         movdqu  -44(%rdi), %xmm2
1386         movdqu  -44(%rsi), %xmm1
1387         mov     $-44, %dl
1388         pxor    %xmm1, %xmm2
1389         ptest   %xmm2, %xmm0
1390         jnc     L(less16bytes)
1391 L(28bytes):
1392         movdqu  -28(%rdi), %xmm2
1393         movdqu  -28(%rsi), %xmm1
1394         mov     $-28, %dl
1395         pxor    %xmm1, %xmm2
1396         ptest   %xmm2, %xmm0
1397         jnc     L(less16bytes)
1398         mov     -12(%rdi), %rax
1399         mov     -12(%rsi), %rcx
1400         cmp     %rax, %rcx
1401         jne     L(diffin8bytes)
1402         mov     -4(%rdi), %eax
1403         mov     -4(%rsi), %ecx
1404         cmp     %eax, %ecx
1405         jne     L(diffin4bytes)
1406         xor     %eax, %eax
1407         ret
1408
1409 #ifndef USE_AS_WMEMCMP
1410 /* unreal cases for wmemcmp */
1411         ALIGN (4)
1412 L(77bytes):
1413         movdqu  -77(%rsi), %xmm1
1414         movdqu  -77(%rdi), %xmm2
1415         mov     $-77, %dl
1416         pxor    %xmm1, %xmm2
1417         ptest   %xmm2, %xmm0
1418         jnc     L(less16bytes)
1419 L(61bytes):
1420         movdqu  -61(%rdi), %xmm2
1421         movdqu  -61(%rsi), %xmm1
1422         mov     $-61, %dl
1423         pxor    %xmm1, %xmm2
1424         ptest   %xmm2, %xmm0
1425         jnc     L(less16bytes)
1426 L(45bytes):
1427         movdqu  -45(%rdi), %xmm2
1428         movdqu  -45(%rsi), %xmm1
1429         mov     $-45, %dl
1430         pxor    %xmm1, %xmm2
1431         ptest   %xmm2, %xmm0
1432         jnc     L(less16bytes)
1433 L(29bytes):
1434         movdqu  -29(%rdi), %xmm2
1435         movdqu  -29(%rsi), %xmm1
1436         mov     $-29, %dl
1437         pxor    %xmm1, %xmm2
1438         ptest   %xmm2, %xmm0
1439         jnc     L(less16bytes)
1440
1441         mov     -13(%rdi), %rax
1442         mov     -13(%rsi), %rcx
1443         cmp     %rax, %rcx
1444         jne     L(diffin8bytes)
1445
1446         mov     -8(%rdi), %rax
1447         mov     -8(%rsi), %rcx
1448         cmp     %rax, %rcx
1449         jne     L(diffin8bytes)
1450         xor     %eax, %eax
1451         ret
1452
1453         ALIGN (4)
1454 L(78bytes):
1455         movdqu  -78(%rsi), %xmm1
1456         movdqu  -78(%rdi), %xmm2
1457         mov     $-78, %dl
1458         pxor    %xmm1, %xmm2
1459         ptest   %xmm2, %xmm0
1460         jnc     L(less16bytes)
1461 L(62bytes):
1462         movdqu  -62(%rdi), %xmm2
1463         movdqu  -62(%rsi), %xmm1
1464         mov     $-62, %dl
1465         pxor    %xmm1, %xmm2
1466         ptest   %xmm2, %xmm0
1467         jnc     L(less16bytes)
1468 L(46bytes):
1469         movdqu  -46(%rdi), %xmm2
1470         movdqu  -46(%rsi), %xmm1
1471         mov     $-46, %dl
1472         pxor    %xmm1, %xmm2
1473         ptest   %xmm2, %xmm0
1474         jnc     L(less16bytes)
1475 L(30bytes):
1476         movdqu  -30(%rdi), %xmm2
1477         movdqu  -30(%rsi), %xmm1
1478         mov     $-30, %dl
1479         pxor    %xmm1, %xmm2
1480         ptest   %xmm2, %xmm0
1481         jnc     L(less16bytes)
1482         mov     -14(%rdi), %rax
1483         mov     -14(%rsi), %rcx
1484         cmp     %rax, %rcx
1485         jne     L(diffin8bytes)
1486         mov     -8(%rdi), %rax
1487         mov     -8(%rsi), %rcx
1488         cmp     %rax, %rcx
1489         jne     L(diffin8bytes)
1490         xor     %eax, %eax
1491         ret
1492
1493         ALIGN (4)
1494 L(79bytes):
1495         movdqu  -79(%rsi), %xmm1
1496         movdqu  -79(%rdi), %xmm2
1497         mov     $-79, %dl
1498         pxor    %xmm1, %xmm2
1499         ptest   %xmm2, %xmm0
1500         jnc     L(less16bytes)
1501 L(63bytes):
1502         movdqu  -63(%rdi), %xmm2
1503         movdqu  -63(%rsi), %xmm1
1504         mov     $-63, %dl
1505         pxor    %xmm1, %xmm2
1506         ptest   %xmm2, %xmm0
1507         jnc     L(less16bytes)
1508 L(47bytes):
1509         movdqu  -47(%rdi), %xmm2
1510         movdqu  -47(%rsi), %xmm1
1511         mov     $-47, %dl
1512         pxor    %xmm1, %xmm2
1513         ptest   %xmm2, %xmm0
1514         jnc     L(less16bytes)
1515 L(31bytes):
1516         movdqu  -31(%rdi), %xmm2
1517         movdqu  -31(%rsi), %xmm1
1518         mov     $-31, %dl
1519         pxor    %xmm1, %xmm2
1520         ptest   %xmm2, %xmm0
1521         jnc     L(less16bytes)
1522         mov     -15(%rdi), %rax
1523         mov     -15(%rsi), %rcx
1524         cmp     %rax, %rcx
1525         jne     L(diffin8bytes)
1526         mov     -8(%rdi), %rax
1527         mov     -8(%rsi), %rcx
1528         cmp     %rax, %rcx
1529         jne     L(diffin8bytes)
1530         xor     %eax, %eax
1531         ret
1532 #endif
1533         ALIGN (4)
1534 L(64bytes):
1535         movdqu  -64(%rdi), %xmm2
1536         movdqu  -64(%rsi), %xmm1
1537         mov     $-64, %dl
1538         pxor    %xmm1, %xmm2
1539         ptest   %xmm2, %xmm0
1540         jnc     L(less16bytes)
1541 L(48bytes):
1542         movdqu  -48(%rdi), %xmm2
1543         movdqu  -48(%rsi), %xmm1
1544         mov     $-48, %dl
1545         pxor    %xmm1, %xmm2
1546         ptest   %xmm2, %xmm0
1547         jnc     L(less16bytes)
1548 L(32bytes):
1549         movdqu  -32(%rdi), %xmm2
1550         movdqu  -32(%rsi), %xmm1
1551         mov     $-32, %dl
1552         pxor    %xmm1, %xmm2
1553         ptest   %xmm2, %xmm0
1554         jnc     L(less16bytes)
1555
1556         mov     -16(%rdi), %rax
1557         mov     -16(%rsi), %rcx
1558         cmp     %rax, %rcx
1559         jne     L(diffin8bytes)
1560
1561         mov     -8(%rdi), %rax
1562         mov     -8(%rsi), %rcx
1563         cmp     %rax, %rcx
1564         jne     L(diffin8bytes)
1565         xor     %eax, %eax
1566         ret
1567
1568 /*
1569  * Aligned 8 bytes to avoid 2 branch "taken" in one 16 alinged code block.
1570  */
1571         ALIGN (3)
1572 L(less16bytes):
1573         movsbq  %dl, %rdx
1574         mov     (%rsi, %rdx), %rcx
1575         mov     (%rdi, %rdx), %rax
1576         cmp     %rax, %rcx
1577         jne     L(diffin8bytes)
1578         mov     8(%rsi, %rdx), %rcx
1579         mov     8(%rdi, %rdx), %rax
1580 L(diffin8bytes):
1581         cmp     %eax, %ecx
1582         jne     L(diffin4bytes)
1583         shr     $32, %rcx
1584         shr     $32, %rax
1585
1586 #ifdef USE_AS_WMEMCMP
1587 /* for wmemcmp */
1588         cmp     %eax, %ecx
1589         jne     L(diffin4bytes)
1590         xor     %eax, %eax
1591         ret
1592 #endif
1593
1594 L(diffin4bytes):
1595 #ifndef USE_AS_WMEMCMP
1596         cmp     %cx, %ax
1597         jne     L(diffin2bytes)
1598         shr     $16, %ecx
1599         shr     $16, %eax
1600 L(diffin2bytes):
1601         cmp     %cl, %al
1602         jne     L(end)
1603         and     $0xffff, %eax
1604         and     $0xffff, %ecx
1605         sub     %ecx, %eax
1606         ret
1607 #else
1608
1609 /* for wmemcmp */
1610         mov     $1, %eax
1611         jl      L(nequal_bigger)
1612         neg     %eax
1613         ret
1614
1615         ALIGN (4)
1616 L(nequal_bigger):
1617         ret
1618
1619 L(unreal_case):
1620         xor     %eax, %eax
1621         ret
1622 #endif
1623
1624         ALIGN (4)
1625 L(end):
1626         and     $0xff, %eax
1627         and     $0xff, %ecx
1628         sub     %ecx, %eax
1629         ret
1630
1631 END (MEMCMP)
1632
1633         .section .rodata.sse4.1,"a",@progbits
1634         ALIGN (3)
1635 #ifndef USE_AS_WMEMCMP
1636 L(table_64bytes):
1637         .int    JMPTBL (L(0bytes), L(table_64bytes))
1638         .int    JMPTBL (L(1bytes), L(table_64bytes))
1639         .int    JMPTBL (L(2bytes), L(table_64bytes))
1640         .int    JMPTBL (L(3bytes), L(table_64bytes))
1641         .int    JMPTBL (L(4bytes), L(table_64bytes))
1642         .int    JMPTBL (L(5bytes), L(table_64bytes))
1643         .int    JMPTBL (L(6bytes), L(table_64bytes))
1644         .int    JMPTBL (L(7bytes), L(table_64bytes))
1645         .int    JMPTBL (L(8bytes), L(table_64bytes))
1646         .int    JMPTBL (L(9bytes), L(table_64bytes))
1647         .int    JMPTBL (L(10bytes), L(table_64bytes))
1648         .int    JMPTBL (L(11bytes), L(table_64bytes))
1649         .int    JMPTBL (L(12bytes), L(table_64bytes))
1650         .int    JMPTBL (L(13bytes), L(table_64bytes))
1651         .int    JMPTBL (L(14bytes), L(table_64bytes))
1652         .int    JMPTBL (L(15bytes), L(table_64bytes))
1653         .int    JMPTBL (L(16bytes), L(table_64bytes))
1654         .int    JMPTBL (L(17bytes), L(table_64bytes))
1655         .int    JMPTBL (L(18bytes), L(table_64bytes))
1656         .int    JMPTBL (L(19bytes), L(table_64bytes))
1657         .int    JMPTBL (L(20bytes), L(table_64bytes))
1658         .int    JMPTBL (L(21bytes), L(table_64bytes))
1659         .int    JMPTBL (L(22bytes), L(table_64bytes))
1660         .int    JMPTBL (L(23bytes), L(table_64bytes))
1661         .int    JMPTBL (L(24bytes), L(table_64bytes))
1662         .int    JMPTBL (L(25bytes), L(table_64bytes))
1663         .int    JMPTBL (L(26bytes), L(table_64bytes))
1664         .int    JMPTBL (L(27bytes), L(table_64bytes))
1665         .int    JMPTBL (L(28bytes), L(table_64bytes))
1666         .int    JMPTBL (L(29bytes), L(table_64bytes))
1667         .int    JMPTBL (L(30bytes), L(table_64bytes))
1668         .int    JMPTBL (L(31bytes), L(table_64bytes))
1669         .int    JMPTBL (L(32bytes), L(table_64bytes))
1670         .int    JMPTBL (L(33bytes), L(table_64bytes))
1671         .int    JMPTBL (L(34bytes), L(table_64bytes))
1672         .int    JMPTBL (L(35bytes), L(table_64bytes))
1673         .int    JMPTBL (L(36bytes), L(table_64bytes))
1674         .int    JMPTBL (L(37bytes), L(table_64bytes))
1675         .int    JMPTBL (L(38bytes), L(table_64bytes))
1676         .int    JMPTBL (L(39bytes), L(table_64bytes))
1677         .int    JMPTBL (L(40bytes), L(table_64bytes))
1678         .int    JMPTBL (L(41bytes), L(table_64bytes))
1679         .int    JMPTBL (L(42bytes), L(table_64bytes))
1680         .int    JMPTBL (L(43bytes), L(table_64bytes))
1681         .int    JMPTBL (L(44bytes), L(table_64bytes))
1682         .int    JMPTBL (L(45bytes), L(table_64bytes))
1683         .int    JMPTBL (L(46bytes), L(table_64bytes))
1684         .int    JMPTBL (L(47bytes), L(table_64bytes))
1685         .int    JMPTBL (L(48bytes), L(table_64bytes))
1686         .int    JMPTBL (L(49bytes), L(table_64bytes))
1687         .int    JMPTBL (L(50bytes), L(table_64bytes))
1688         .int    JMPTBL (L(51bytes), L(table_64bytes))
1689         .int    JMPTBL (L(52bytes), L(table_64bytes))
1690         .int    JMPTBL (L(53bytes), L(table_64bytes))
1691         .int    JMPTBL (L(54bytes), L(table_64bytes))
1692         .int    JMPTBL (L(55bytes), L(table_64bytes))
1693         .int    JMPTBL (L(56bytes), L(table_64bytes))
1694         .int    JMPTBL (L(57bytes), L(table_64bytes))
1695         .int    JMPTBL (L(58bytes), L(table_64bytes))
1696         .int    JMPTBL (L(59bytes), L(table_64bytes))
1697         .int    JMPTBL (L(60bytes), L(table_64bytes))
1698         .int    JMPTBL (L(61bytes), L(table_64bytes))
1699         .int    JMPTBL (L(62bytes), L(table_64bytes))
1700         .int    JMPTBL (L(63bytes), L(table_64bytes))
1701         .int    JMPTBL (L(64bytes), L(table_64bytes))
1702         .int    JMPTBL (L(65bytes), L(table_64bytes))
1703         .int    JMPTBL (L(66bytes), L(table_64bytes))
1704         .int    JMPTBL (L(67bytes), L(table_64bytes))
1705         .int    JMPTBL (L(68bytes), L(table_64bytes))
1706         .int    JMPTBL (L(69bytes), L(table_64bytes))
1707         .int    JMPTBL (L(70bytes), L(table_64bytes))
1708         .int    JMPTBL (L(71bytes), L(table_64bytes))
1709         .int    JMPTBL (L(72bytes), L(table_64bytes))
1710         .int    JMPTBL (L(73bytes), L(table_64bytes))
1711         .int    JMPTBL (L(74bytes), L(table_64bytes))
1712         .int    JMPTBL (L(75bytes), L(table_64bytes))
1713         .int    JMPTBL (L(76bytes), L(table_64bytes))
1714         .int    JMPTBL (L(77bytes), L(table_64bytes))
1715         .int    JMPTBL (L(78bytes), L(table_64bytes))
1716         .int    JMPTBL (L(79bytes), L(table_64bytes))
1717 #else
1718 L(table_64bytes):
1719         .int    JMPTBL (L(0bytes), L(table_64bytes))
1720         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1721         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1722         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1723         .int    JMPTBL (L(4bytes), L(table_64bytes))
1724         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1725         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1726         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1727         .int    JMPTBL (L(8bytes), L(table_64bytes))
1728         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1729         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1730         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1731         .int    JMPTBL (L(12bytes), L(table_64bytes))
1732         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1733         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1734         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1735         .int    JMPTBL (L(16bytes), L(table_64bytes))
1736         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1737         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1738         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1739         .int    JMPTBL (L(20bytes), L(table_64bytes))
1740         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1741         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1742         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1743         .int    JMPTBL (L(24bytes), L(table_64bytes))
1744         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1745         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1746         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1747         .int    JMPTBL (L(28bytes), L(table_64bytes))
1748         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1749         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1750         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1751         .int    JMPTBL (L(32bytes), L(table_64bytes))
1752         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1753         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1754         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1755         .int    JMPTBL (L(36bytes), L(table_64bytes))
1756         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1757         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1758         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1759         .int    JMPTBL (L(40bytes), L(table_64bytes))
1760         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1761         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1762         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1763         .int    JMPTBL (L(44bytes), L(table_64bytes))
1764         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1765         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1766         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1767         .int    JMPTBL (L(48bytes), L(table_64bytes))
1768         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1769         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1770         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1771         .int    JMPTBL (L(52bytes), L(table_64bytes))
1772         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1773         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1774         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1775         .int    JMPTBL (L(56bytes), L(table_64bytes))
1776         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1777         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1778         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1779         .int    JMPTBL (L(60bytes), L(table_64bytes))
1780         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1781         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1782         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1783         .int    JMPTBL (L(64bytes), L(table_64bytes))
1784         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1785         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1786         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1787         .int    JMPTBL (L(68bytes), L(table_64bytes))
1788         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1789         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1790         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1791         .int    JMPTBL (L(72bytes), L(table_64bytes))
1792         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1793         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1794         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1795         .int    JMPTBL (L(76bytes), L(table_64bytes))
1796         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1797         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1798         .int    JMPTBL (L(unreal_case), L(table_64bytes))
1799 #endif