xref: /freebsd/contrib/bionic-x86_64-string/sse4-memcmp-slm.S (revision c7046f76c2c027b00c0e6ba57cfd28f1a78f5e23)
1/*
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
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;			\
58name:					\
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
82ENTRY (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)
99L(firstbyte):
100	movzbl	(%rdi), %eax
101	movzbl	(%rsi), %ecx
102	sub	%ecx, %eax
103	ret
104#endif
105
106	ALIGN (4)
107L(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)
125L(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
162L(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
169L(128bytesormore):
170	cmp	$512, %rdx
171	ja	L(512bytesormore)
172	cmp	$256, %rdx
173	ja	L(less512bytes)
174L(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
238L(less32bytesin128):
239	add	%rdx, %rsi
240	add	%rdx, %rdi
241	BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
242
243L(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
349L(less32bytesin256):
350	add	%rdx, %rsi
351	add	%rdx, %rdi
352	BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
353
354	ALIGN (4)
355L(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)
368L(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
397L(L2_L3_cache_unaglined):
398	sub	$64, %rdx
399	ALIGN (4)
400L(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)
435L(2aligned):
436	cmp	$128, %rdx
437	ja	L(128bytesormorein2aligned)
438L(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
475L(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)
483L(128bytesormorein2aligned):
484	cmp	$512, %rdx
485	ja	L(512bytesormorein2aligned)
486	cmp	$256, %rdx
487	ja	L(256bytesormorein2aligned)
488L(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
552L(less32bytesin128in2aligned):
553	add	%rdx, %rsi
554	add	%rdx, %rdi
555	BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
556
557	ALIGN (4)
558L(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
665L(less32bytesin256in2alinged):
666	add	%rdx, %rsi
667	add	%rdx, %rdi
668	BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
669
670	ALIGN (4)
671L(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)
685L(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)
713L(L2_L3_cache_aglined):
714	sub	$64, %rdx
715	ALIGN (4)
716L(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)
749L(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
769L(256bytesin256):
770	add	$256, %rdi
771	add	$256, %rsi
772	jmp	L(16bytes)
773L(240bytesin256):
774	add	$240, %rdi
775	add	$240, %rsi
776	jmp	L(16bytes)
777L(224bytesin256):
778	add	$224, %rdi
779	add	$224, %rsi
780	jmp	L(16bytes)
781L(208bytesin256):
782	add	$208, %rdi
783	add	$208, %rsi
784	jmp	L(16bytes)
785L(192bytesin256):
786	add	$192, %rdi
787	add	$192, %rsi
788	jmp	L(16bytes)
789L(176bytesin256):
790	add	$176, %rdi
791	add	$176, %rsi
792	jmp	L(16bytes)
793L(160bytesin256):
794	add	$160, %rdi
795	add	$160, %rsi
796	jmp	L(16bytes)
797L(144bytesin256):
798	add	$144, %rdi
799	add	$144, %rsi
800	jmp	L(16bytes)
801L(128bytesin256):
802	add	$128, %rdi
803	add	$128, %rsi
804	jmp	L(16bytes)
805L(112bytesin256):
806	add	$112, %rdi
807	add	$112, %rsi
808	jmp	L(16bytes)
809L(96bytesin256):
810	add	$96, %rdi
811	add	$96, %rsi
812	jmp	L(16bytes)
813L(80bytesin256):
814	add	$80, %rdi
815	add	$80, %rsi
816	jmp	L(16bytes)
817L(64bytesin256):
818	add	$64, %rdi
819	add	$64, %rsi
820	jmp	L(16bytes)
821L(48bytesin256):
822	add	$16, %rdi
823	add	$16, %rsi
824L(32bytesin256):
825	add	$16, %rdi
826	add	$16, %rsi
827L(16bytesin256):
828	add	$16, %rdi
829	add	$16, %rsi
830L(16bytes):
831	mov	-16(%rdi), %rax
832	mov	-16(%rsi), %rcx
833	cmp	%rax, %rcx
834	jne	L(diffin8bytes)
835L(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)
844L(12bytes):
845	mov	-12(%rdi), %rax
846	mov	-12(%rsi), %rcx
847	cmp	%rax, %rcx
848	jne	L(diffin8bytes)
849L(4bytes):
850	mov	-4(%rsi), %ecx
851	mov	-4(%rdi), %eax
852	cmp	%eax, %ecx
853	jne	L(diffin4bytes)
854L(0bytes):
855	xor	%eax, %eax
856	ret
857
858#ifndef USE_AS_WMEMCMP
859/* unreal case for wmemcmp */
860	ALIGN (4)
861L(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)
868L(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)
875L(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)
882L(17bytes):
883	mov	-17(%rdi), %rax
884	mov	-17(%rsi), %rcx
885	cmp	%rax, %rcx
886	jne	L(diffin8bytes)
887L(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)
898L(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)
911L(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)
922L(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)
929L(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)
936L(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)
943L(18bytes):
944	mov	-18(%rdi), %rax
945	mov	-18(%rsi), %rcx
946	cmp	%rax, %rcx
947	jne	L(diffin8bytes)
948L(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)
963L(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)
976L(6bytes):
977	mov	-6(%rdi), %eax
978	mov	-6(%rsi), %ecx
979	cmp	%eax, %ecx
980	jne	L(diffin4bytes)
981L(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)
992L(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)
999L(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)
1006L(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)
1013L(19bytes):
1014	mov	-19(%rdi), %rax
1015	mov	-19(%rsi), %rcx
1016	cmp	%rax, %rcx
1017	jne	L(diffin8bytes)
1018L(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)
1031L(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)
1044L(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)
1057L(3bytes):
1058	movzwl	-3(%rdi), %eax
1059	movzwl	-3(%rsi), %ecx
1060	cmp	%eax, %ecx
1061	jne	L(diffin2bytes)
1062L(1bytes):
1063	movzbl	-1(%rdi), %eax
1064	movzbl	-1(%rsi), %ecx
1065	sub	%ecx, %eax
1066	ret
1067#endif
1068
1069	ALIGN (4)
1070L(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)
1077L(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)
1084L(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)
1091L(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)
1108L(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)
1115L(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)
1122L(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)
1129L(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)
1144L(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)
1151L(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)
1158L(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)
1165L(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)
1180L(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)
1187L(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)
1194L(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)
1201L(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)
1217L(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)
1224L(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)
1231L(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)
1238L(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)
1255L(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)
1262L(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)
1269L(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)
1276L(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)
1293L(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)
1300L(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)
1307L(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)
1314L(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)
1330L(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)
1337L(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)
1344L(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)
1351L(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)
1370L(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)
1377L(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)
1384L(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)
1391L(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)
1412L(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)
1419L(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)
1426L(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)
1433L(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)
1454L(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)
1461L(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)
1468L(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)
1475L(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)
1494L(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)
1501L(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)
1508L(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)
1515L(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)
1534L(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)
1541L(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)
1548L(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)
1572L(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
1580L(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
1594L(diffin4bytes):
1595#ifndef USE_AS_WMEMCMP
1596	cmp	%cx, %ax
1597	jne	L(diffin2bytes)
1598	shr	$16, %ecx
1599	shr	$16, %eax
1600L(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)
1616L(nequal_bigger):
1617	ret
1618
1619L(unreal_case):
1620	xor	%eax, %eax
1621	ret
1622#endif
1623
1624	ALIGN (4)
1625L(end):
1626	and	$0xff, %eax
1627	and	$0xff, %ecx
1628	sub	%ecx, %eax
1629	ret
1630
1631END (MEMCMP)
1632
1633	.section .rodata.sse4.1,"a",@progbits
1634	ALIGN (3)
1635#ifndef USE_AS_WMEMCMP
1636L(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
1718L(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
1800