Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/bionic-x86_64-string/sse4-memcmp-slm.S
39475 views
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
1800
1801