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