1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; NOTE: This is a copy of llvm/test/CodeGen/X86/memcmp.ll with more load pairs. Please keep it that way.
3 ; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=X64,X64-SSE,X64-SSE2
4 ; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.1 | FileCheck %s --check-prefixes=X64,X64-SSE,X64-SSE41
5 ; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX1
6 ; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx2 | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX2
7 ; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw,+prefer-256-bit | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX2
8 ; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw,-prefer-256-bit | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX512,X64-AVX512BW
9 ; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,+prefer-256-bit,-prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX2
10 ; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,-prefer-256-bit,-prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX512,X64-AVX512F
11 ; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,+prefer-256-bit,+prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-MIC-AVX,X64-MIC-AVX2
12 ; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,-prefer-256-bit,+prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-MIC-AVX,X64-MIC-AVX512F
14 ; This tests codegen time inlining/optimization of memcmp
17 @.str = private constant [513 x i8] c"01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901\00", align 1
19 declare dso_local i32 @memcmp(ptr, ptr, i64)
21 define i32 @length0(ptr %X, ptr %Y) nounwind {
24 ; X64-NEXT: xorl %eax, %eax
26 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 0) nounwind
30 define i1 @length0_eq(ptr %X, ptr %Y) nounwind {
31 ; X64-LABEL: length0_eq:
33 ; X64-NEXT: movb $1, %al
35 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 0) nounwind
36 %c = icmp eq i32 %m, 0
40 define i1 @length0_lt(ptr %X, ptr %Y) nounwind {
41 ; X64-LABEL: length0_lt:
43 ; X64-NEXT: xorl %eax, %eax
45 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 0) nounwind
46 %c = icmp slt i32 %m, 0
50 define i32 @length2(ptr %X, ptr %Y) nounwind {
53 ; X64-NEXT: movzwl (%rdi), %eax
54 ; X64-NEXT: movzwl (%rsi), %ecx
55 ; X64-NEXT: rolw $8, %ax
56 ; X64-NEXT: rolw $8, %cx
57 ; X64-NEXT: movzwl %ax, %eax
58 ; X64-NEXT: movzwl %cx, %ecx
59 ; X64-NEXT: subl %ecx, %eax
61 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind
65 define i1 @length2_eq(ptr %X, ptr %Y) nounwind {
66 ; X64-LABEL: length2_eq:
68 ; X64-NEXT: movzwl (%rdi), %eax
69 ; X64-NEXT: cmpw (%rsi), %ax
72 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind
73 %c = icmp eq i32 %m, 0
77 define i1 @length2_lt(ptr %X, ptr %Y) nounwind {
78 ; X64-LABEL: length2_lt:
80 ; X64-NEXT: movzwl (%rdi), %eax
81 ; X64-NEXT: movzwl (%rsi), %ecx
82 ; X64-NEXT: rolw $8, %ax
83 ; X64-NEXT: rolw $8, %cx
84 ; X64-NEXT: movzwl %ax, %eax
85 ; X64-NEXT: movzwl %cx, %ecx
86 ; X64-NEXT: subl %ecx, %eax
87 ; X64-NEXT: shrl $31, %eax
88 ; X64-NEXT: # kill: def $al killed $al killed $eax
90 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind
91 %c = icmp slt i32 %m, 0
95 define i1 @length2_gt(ptr %X, ptr %Y) nounwind {
96 ; X64-LABEL: length2_gt:
98 ; X64-NEXT: movzwl (%rdi), %eax
99 ; X64-NEXT: movzwl (%rsi), %ecx
100 ; X64-NEXT: rolw $8, %ax
101 ; X64-NEXT: rolw $8, %cx
102 ; X64-NEXT: movzwl %ax, %eax
103 ; X64-NEXT: movzwl %cx, %ecx
104 ; X64-NEXT: subl %ecx, %eax
105 ; X64-NEXT: testl %eax, %eax
108 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind
109 %c = icmp sgt i32 %m, 0
113 define i1 @length2_eq_const(ptr %X) nounwind {
114 ; X64-LABEL: length2_eq_const:
116 ; X64-NEXT: movzwl (%rdi), %eax
117 ; X64-NEXT: cmpl $12849, %eax # imm = 0x3231
118 ; X64-NEXT: setne %al
120 %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 2) nounwind
121 %c = icmp ne i32 %m, 0
125 define i1 @length2_eq_nobuiltin_attr(ptr %X, ptr %Y) nounwind {
126 ; X64-LABEL: length2_eq_nobuiltin_attr:
128 ; X64-NEXT: pushq %rax
129 ; X64-NEXT: movl $2, %edx
130 ; X64-NEXT: callq memcmp
131 ; X64-NEXT: testl %eax, %eax
133 ; X64-NEXT: popq %rcx
135 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind nobuiltin
136 %c = icmp eq i32 %m, 0
140 define i32 @length3(ptr %X, ptr %Y) nounwind {
141 ; X64-LABEL: length3:
143 ; X64-NEXT: movzwl (%rdi), %ecx
144 ; X64-NEXT: movzwl (%rsi), %edx
145 ; X64-NEXT: rolw $8, %cx
146 ; X64-NEXT: rolw $8, %dx
147 ; X64-NEXT: cmpw %dx, %cx
148 ; X64-NEXT: jne .LBB9_3
149 ; X64-NEXT: # %bb.1: # %loadbb1
150 ; X64-NEXT: movzbl 2(%rdi), %eax
151 ; X64-NEXT: movzbl 2(%rsi), %ecx
152 ; X64-NEXT: subl %ecx, %eax
154 ; X64-NEXT: .LBB9_3: # %res_block
155 ; X64-NEXT: xorl %eax, %eax
156 ; X64-NEXT: cmpw %dx, %cx
157 ; X64-NEXT: sbbl %eax, %eax
158 ; X64-NEXT: orl $1, %eax
160 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind
164 define i1 @length3_eq(ptr %X, ptr %Y) nounwind {
165 ; X64-LABEL: length3_eq:
167 ; X64-NEXT: movzwl (%rdi), %eax
168 ; X64-NEXT: xorw (%rsi), %ax
169 ; X64-NEXT: movzbl 2(%rdi), %ecx
170 ; X64-NEXT: xorb 2(%rsi), %cl
171 ; X64-NEXT: movzbl %cl, %ecx
172 ; X64-NEXT: orw %ax, %cx
173 ; X64-NEXT: setne %al
175 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind
176 %c = icmp ne i32 %m, 0
180 define i32 @length4(ptr %X, ptr %Y) nounwind {
181 ; X64-LABEL: length4:
183 ; X64-NEXT: movl (%rdi), %ecx
184 ; X64-NEXT: movl (%rsi), %edx
185 ; X64-NEXT: bswapl %ecx
186 ; X64-NEXT: bswapl %edx
187 ; X64-NEXT: xorl %eax, %eax
188 ; X64-NEXT: cmpl %edx, %ecx
190 ; X64-NEXT: sbbl $0, %eax
192 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind
196 define i1 @length4_eq(ptr %X, ptr %Y) nounwind {
197 ; X64-LABEL: length4_eq:
199 ; X64-NEXT: movl (%rdi), %eax
200 ; X64-NEXT: cmpl (%rsi), %eax
201 ; X64-NEXT: setne %al
203 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind
204 %c = icmp ne i32 %m, 0
208 define i1 @length4_lt(ptr %X, ptr %Y) nounwind {
209 ; X64-LABEL: length4_lt:
211 ; X64-NEXT: movl (%rdi), %ecx
212 ; X64-NEXT: movl (%rsi), %edx
213 ; X64-NEXT: bswapl %ecx
214 ; X64-NEXT: bswapl %edx
215 ; X64-NEXT: xorl %eax, %eax
216 ; X64-NEXT: cmpl %edx, %ecx
218 ; X64-NEXT: sbbl $0, %eax
219 ; X64-NEXT: shrl $31, %eax
220 ; X64-NEXT: # kill: def $al killed $al killed $eax
222 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind
223 %c = icmp slt i32 %m, 0
227 define i1 @length4_gt(ptr %X, ptr %Y) nounwind {
228 ; X64-LABEL: length4_gt:
230 ; X64-NEXT: movl (%rdi), %eax
231 ; X64-NEXT: movl (%rsi), %ecx
232 ; X64-NEXT: bswapl %eax
233 ; X64-NEXT: bswapl %ecx
234 ; X64-NEXT: xorl %edx, %edx
235 ; X64-NEXT: cmpl %ecx, %eax
237 ; X64-NEXT: sbbl $0, %edx
238 ; X64-NEXT: testl %edx, %edx
241 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind
242 %c = icmp sgt i32 %m, 0
246 define i1 @length4_eq_const(ptr %X) nounwind {
247 ; X64-LABEL: length4_eq_const:
249 ; X64-NEXT: cmpl $875770417, (%rdi) # imm = 0x34333231
252 %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 4) nounwind
253 %c = icmp eq i32 %m, 0
257 define i32 @length5(ptr %X, ptr %Y) nounwind {
258 ; X64-LABEL: length5:
260 ; X64-NEXT: movl (%rdi), %ecx
261 ; X64-NEXT: movl (%rsi), %edx
262 ; X64-NEXT: bswapl %ecx
263 ; X64-NEXT: bswapl %edx
264 ; X64-NEXT: cmpl %edx, %ecx
265 ; X64-NEXT: jne .LBB16_3
266 ; X64-NEXT: # %bb.1: # %loadbb1
267 ; X64-NEXT: movzbl 4(%rdi), %eax
268 ; X64-NEXT: movzbl 4(%rsi), %ecx
269 ; X64-NEXT: subl %ecx, %eax
271 ; X64-NEXT: .LBB16_3: # %res_block
272 ; X64-NEXT: xorl %eax, %eax
273 ; X64-NEXT: cmpl %edx, %ecx
274 ; X64-NEXT: sbbl %eax, %eax
275 ; X64-NEXT: orl $1, %eax
277 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind
281 define i1 @length5_eq(ptr %X, ptr %Y) nounwind {
282 ; X64-LABEL: length5_eq:
284 ; X64-NEXT: movl (%rdi), %eax
285 ; X64-NEXT: xorl (%rsi), %eax
286 ; X64-NEXT: movzbl 4(%rdi), %ecx
287 ; X64-NEXT: xorb 4(%rsi), %cl
288 ; X64-NEXT: movzbl %cl, %ecx
289 ; X64-NEXT: orl %eax, %ecx
290 ; X64-NEXT: setne %al
292 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind
293 %c = icmp ne i32 %m, 0
297 define i1 @length5_lt(ptr %X, ptr %Y) nounwind {
298 ; X64-LABEL: length5_lt:
300 ; X64-NEXT: movl (%rdi), %ecx
301 ; X64-NEXT: movl (%rsi), %edx
302 ; X64-NEXT: bswapl %ecx
303 ; X64-NEXT: bswapl %edx
304 ; X64-NEXT: cmpl %edx, %ecx
305 ; X64-NEXT: jne .LBB18_3
306 ; X64-NEXT: # %bb.1: # %loadbb1
307 ; X64-NEXT: movzbl 4(%rdi), %eax
308 ; X64-NEXT: movzbl 4(%rsi), %ecx
309 ; X64-NEXT: subl %ecx, %eax
310 ; X64-NEXT: shrl $31, %eax
311 ; X64-NEXT: # kill: def $al killed $al killed $eax
313 ; X64-NEXT: .LBB18_3: # %res_block
314 ; X64-NEXT: xorl %eax, %eax
315 ; X64-NEXT: cmpl %edx, %ecx
316 ; X64-NEXT: sbbl %eax, %eax
317 ; X64-NEXT: orl $1, %eax
318 ; X64-NEXT: shrl $31, %eax
319 ; X64-NEXT: # kill: def $al killed $al killed $eax
321 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind
322 %c = icmp slt i32 %m, 0
326 define i32 @length7(ptr %X, ptr %Y) nounwind {
327 ; X64-LABEL: length7:
329 ; X64-NEXT: movl (%rdi), %ecx
330 ; X64-NEXT: movl (%rsi), %edx
331 ; X64-NEXT: bswapl %ecx
332 ; X64-NEXT: bswapl %edx
333 ; X64-NEXT: cmpl %edx, %ecx
334 ; X64-NEXT: jne .LBB19_2
335 ; X64-NEXT: # %bb.1: # %loadbb1
336 ; X64-NEXT: movl 3(%rdi), %ecx
337 ; X64-NEXT: movl 3(%rsi), %edx
338 ; X64-NEXT: bswapl %ecx
339 ; X64-NEXT: bswapl %edx
340 ; X64-NEXT: xorl %eax, %eax
341 ; X64-NEXT: cmpl %edx, %ecx
342 ; X64-NEXT: je .LBB19_3
343 ; X64-NEXT: .LBB19_2: # %res_block
344 ; X64-NEXT: xorl %eax, %eax
345 ; X64-NEXT: cmpl %edx, %ecx
346 ; X64-NEXT: sbbl %eax, %eax
347 ; X64-NEXT: orl $1, %eax
348 ; X64-NEXT: .LBB19_3: # %endblock
350 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind
354 define i1 @length7_eq(ptr %X, ptr %Y) nounwind {
355 ; X64-LABEL: length7_eq:
357 ; X64-NEXT: movl (%rdi), %eax
358 ; X64-NEXT: movl 3(%rdi), %ecx
359 ; X64-NEXT: xorl (%rsi), %eax
360 ; X64-NEXT: xorl 3(%rsi), %ecx
361 ; X64-NEXT: orl %eax, %ecx
362 ; X64-NEXT: setne %al
364 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind
365 %c = icmp ne i32 %m, 0
369 define i1 @length7_lt(ptr %X, ptr %Y) nounwind {
370 ; X64-LABEL: length7_lt:
372 ; X64-NEXT: movl (%rdi), %ecx
373 ; X64-NEXT: movl (%rsi), %edx
374 ; X64-NEXT: bswapl %ecx
375 ; X64-NEXT: bswapl %edx
376 ; X64-NEXT: cmpl %edx, %ecx
377 ; X64-NEXT: jne .LBB21_2
378 ; X64-NEXT: # %bb.1: # %loadbb1
379 ; X64-NEXT: movl 3(%rdi), %ecx
380 ; X64-NEXT: movl 3(%rsi), %edx
381 ; X64-NEXT: bswapl %ecx
382 ; X64-NEXT: bswapl %edx
383 ; X64-NEXT: xorl %eax, %eax
384 ; X64-NEXT: cmpl %edx, %ecx
385 ; X64-NEXT: je .LBB21_3
386 ; X64-NEXT: .LBB21_2: # %res_block
387 ; X64-NEXT: xorl %eax, %eax
388 ; X64-NEXT: cmpl %edx, %ecx
389 ; X64-NEXT: sbbl %eax, %eax
390 ; X64-NEXT: orl $1, %eax
391 ; X64-NEXT: .LBB21_3: # %endblock
392 ; X64-NEXT: shrl $31, %eax
393 ; X64-NEXT: # kill: def $al killed $al killed $eax
395 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind
396 %c = icmp slt i32 %m, 0
400 define i32 @length8(ptr %X, ptr %Y) nounwind {
401 ; X64-LABEL: length8:
403 ; X64-NEXT: movq (%rdi), %rcx
404 ; X64-NEXT: movq (%rsi), %rdx
405 ; X64-NEXT: bswapq %rcx
406 ; X64-NEXT: bswapq %rdx
407 ; X64-NEXT: xorl %eax, %eax
408 ; X64-NEXT: cmpq %rdx, %rcx
410 ; X64-NEXT: sbbl $0, %eax
412 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 8) nounwind
416 define i1 @length8_eq(ptr %X, ptr %Y) nounwind {
417 ; X64-LABEL: length8_eq:
419 ; X64-NEXT: movq (%rdi), %rax
420 ; X64-NEXT: cmpq (%rsi), %rax
423 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 8) nounwind
424 %c = icmp eq i32 %m, 0
428 define i1 @length8_eq_const(ptr %X) nounwind {
429 ; X64-LABEL: length8_eq_const:
431 ; X64-NEXT: movabsq $3978425819141910832, %rax # imm = 0x3736353433323130
432 ; X64-NEXT: cmpq %rax, (%rdi)
433 ; X64-NEXT: setne %al
435 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 8) nounwind
436 %c = icmp ne i32 %m, 0
440 define i1 @length9_eq(ptr %X, ptr %Y) nounwind {
441 ; X64-LABEL: length9_eq:
443 ; X64-NEXT: movq (%rdi), %rax
444 ; X64-NEXT: xorq (%rsi), %rax
445 ; X64-NEXT: movzbl 8(%rdi), %ecx
446 ; X64-NEXT: xorb 8(%rsi), %cl
447 ; X64-NEXT: movzbl %cl, %ecx
448 ; X64-NEXT: orq %rax, %rcx
451 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 9) nounwind
452 %c = icmp eq i32 %m, 0
456 define i1 @length10_eq(ptr %X, ptr %Y) nounwind {
457 ; X64-LABEL: length10_eq:
459 ; X64-NEXT: movq (%rdi), %rax
460 ; X64-NEXT: xorq (%rsi), %rax
461 ; X64-NEXT: movzwl 8(%rdi), %ecx
462 ; X64-NEXT: xorw 8(%rsi), %cx
463 ; X64-NEXT: movzwl %cx, %ecx
464 ; X64-NEXT: orq %rax, %rcx
467 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 10) nounwind
468 %c = icmp eq i32 %m, 0
472 define i1 @length11_eq(ptr %X, ptr %Y) nounwind {
473 ; X64-LABEL: length11_eq:
475 ; X64-NEXT: movq (%rdi), %rax
476 ; X64-NEXT: movq 3(%rdi), %rcx
477 ; X64-NEXT: xorq (%rsi), %rax
478 ; X64-NEXT: xorq 3(%rsi), %rcx
479 ; X64-NEXT: orq %rax, %rcx
482 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 11) nounwind
483 %c = icmp eq i32 %m, 0
487 define i1 @length12_eq(ptr %X, ptr %Y) nounwind {
488 ; X64-LABEL: length12_eq:
490 ; X64-NEXT: movq (%rdi), %rax
491 ; X64-NEXT: xorq (%rsi), %rax
492 ; X64-NEXT: movl 8(%rdi), %ecx
493 ; X64-NEXT: xorl 8(%rsi), %ecx
494 ; X64-NEXT: orq %rax, %rcx
495 ; X64-NEXT: setne %al
497 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind
498 %c = icmp ne i32 %m, 0
502 define i32 @length12(ptr %X, ptr %Y) nounwind {
503 ; X64-LABEL: length12:
505 ; X64-NEXT: movq (%rdi), %rcx
506 ; X64-NEXT: movq (%rsi), %rdx
507 ; X64-NEXT: bswapq %rcx
508 ; X64-NEXT: bswapq %rdx
509 ; X64-NEXT: cmpq %rdx, %rcx
510 ; X64-NEXT: jne .LBB29_2
511 ; X64-NEXT: # %bb.1: # %loadbb1
512 ; X64-NEXT: movl 8(%rdi), %ecx
513 ; X64-NEXT: movl 8(%rsi), %edx
514 ; X64-NEXT: bswapl %ecx
515 ; X64-NEXT: bswapl %edx
516 ; X64-NEXT: xorl %eax, %eax
517 ; X64-NEXT: cmpq %rdx, %rcx
518 ; X64-NEXT: je .LBB29_3
519 ; X64-NEXT: .LBB29_2: # %res_block
520 ; X64-NEXT: xorl %eax, %eax
521 ; X64-NEXT: cmpq %rdx, %rcx
522 ; X64-NEXT: sbbl %eax, %eax
523 ; X64-NEXT: orl $1, %eax
524 ; X64-NEXT: .LBB29_3: # %endblock
526 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind
530 define i1 @length13_eq(ptr %X, ptr %Y) nounwind {
531 ; X64-LABEL: length13_eq:
533 ; X64-NEXT: movq (%rdi), %rax
534 ; X64-NEXT: movq 5(%rdi), %rcx
535 ; X64-NEXT: xorq (%rsi), %rax
536 ; X64-NEXT: xorq 5(%rsi), %rcx
537 ; X64-NEXT: orq %rax, %rcx
540 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 13) nounwind
541 %c = icmp eq i32 %m, 0
545 define i1 @length14_eq(ptr %X, ptr %Y) nounwind {
546 ; X64-LABEL: length14_eq:
548 ; X64-NEXT: movq (%rdi), %rax
549 ; X64-NEXT: movq 6(%rdi), %rcx
550 ; X64-NEXT: xorq (%rsi), %rax
551 ; X64-NEXT: xorq 6(%rsi), %rcx
552 ; X64-NEXT: orq %rax, %rcx
555 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 14) nounwind
556 %c = icmp eq i32 %m, 0
560 define i1 @length15_eq(ptr %X, ptr %Y) nounwind {
561 ; X64-LABEL: length15_eq:
563 ; X64-NEXT: movq (%rdi), %rax
564 ; X64-NEXT: movq 7(%rdi), %rcx
565 ; X64-NEXT: xorq (%rsi), %rax
566 ; X64-NEXT: xorq 7(%rsi), %rcx
567 ; X64-NEXT: orq %rax, %rcx
570 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 15) nounwind
571 %c = icmp eq i32 %m, 0
575 ; PR33329 - https://bugs.llvm.org/show_bug.cgi?id=33329
577 define i32 @length16(ptr %X, ptr %Y) nounwind {
578 ; X64-LABEL: length16:
580 ; X64-NEXT: movq (%rdi), %rcx
581 ; X64-NEXT: movq (%rsi), %rdx
582 ; X64-NEXT: bswapq %rcx
583 ; X64-NEXT: bswapq %rdx
584 ; X64-NEXT: cmpq %rdx, %rcx
585 ; X64-NEXT: jne .LBB33_2
586 ; X64-NEXT: # %bb.1: # %loadbb1
587 ; X64-NEXT: movq 8(%rdi), %rcx
588 ; X64-NEXT: movq 8(%rsi), %rdx
589 ; X64-NEXT: bswapq %rcx
590 ; X64-NEXT: bswapq %rdx
591 ; X64-NEXT: xorl %eax, %eax
592 ; X64-NEXT: cmpq %rdx, %rcx
593 ; X64-NEXT: je .LBB33_3
594 ; X64-NEXT: .LBB33_2: # %res_block
595 ; X64-NEXT: xorl %eax, %eax
596 ; X64-NEXT: cmpq %rdx, %rcx
597 ; X64-NEXT: sbbl %eax, %eax
598 ; X64-NEXT: orl $1, %eax
599 ; X64-NEXT: .LBB33_3: # %endblock
601 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 16) nounwind
605 define i1 @length16_eq(ptr %x, ptr %y) nounwind {
606 ; X64-SSE2-LABEL: length16_eq:
608 ; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
609 ; X64-SSE2-NEXT: movdqu (%rsi), %xmm1
610 ; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
611 ; X64-SSE2-NEXT: pmovmskb %xmm1, %eax
612 ; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
613 ; X64-SSE2-NEXT: setne %al
614 ; X64-SSE2-NEXT: retq
616 ; X64-SSE41-LABEL: length16_eq:
617 ; X64-SSE41: # %bb.0:
618 ; X64-SSE41-NEXT: movdqu (%rdi), %xmm0
619 ; X64-SSE41-NEXT: movdqu (%rsi), %xmm1
620 ; X64-SSE41-NEXT: pxor %xmm0, %xmm1
621 ; X64-SSE41-NEXT: ptest %xmm1, %xmm1
622 ; X64-SSE41-NEXT: setne %al
623 ; X64-SSE41-NEXT: retq
625 ; X64-AVX-LABEL: length16_eq:
627 ; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0
628 ; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0
629 ; X64-AVX-NEXT: vptest %xmm0, %xmm0
630 ; X64-AVX-NEXT: setne %al
633 ; X64-MIC-AVX-LABEL: length16_eq:
634 ; X64-MIC-AVX: # %bb.0:
635 ; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0
636 ; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm1
637 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
638 ; X64-MIC-AVX-NEXT: kortestw %k0, %k0
639 ; X64-MIC-AVX-NEXT: setne %al
640 ; X64-MIC-AVX-NEXT: vzeroupper
641 ; X64-MIC-AVX-NEXT: retq
642 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16) nounwind
643 %cmp = icmp ne i32 %call, 0
647 define i1 @length16_lt(ptr %x, ptr %y) nounwind {
648 ; X64-LABEL: length16_lt:
650 ; X64-NEXT: movq (%rdi), %rcx
651 ; X64-NEXT: movq (%rsi), %rdx
652 ; X64-NEXT: bswapq %rcx
653 ; X64-NEXT: bswapq %rdx
654 ; X64-NEXT: cmpq %rdx, %rcx
655 ; X64-NEXT: jne .LBB35_2
656 ; X64-NEXT: # %bb.1: # %loadbb1
657 ; X64-NEXT: movq 8(%rdi), %rcx
658 ; X64-NEXT: movq 8(%rsi), %rdx
659 ; X64-NEXT: bswapq %rcx
660 ; X64-NEXT: bswapq %rdx
661 ; X64-NEXT: xorl %eax, %eax
662 ; X64-NEXT: cmpq %rdx, %rcx
663 ; X64-NEXT: je .LBB35_3
664 ; X64-NEXT: .LBB35_2: # %res_block
665 ; X64-NEXT: xorl %eax, %eax
666 ; X64-NEXT: cmpq %rdx, %rcx
667 ; X64-NEXT: sbbl %eax, %eax
668 ; X64-NEXT: orl $1, %eax
669 ; X64-NEXT: .LBB35_3: # %endblock
670 ; X64-NEXT: shrl $31, %eax
671 ; X64-NEXT: # kill: def $al killed $al killed $eax
673 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16) nounwind
674 %cmp = icmp slt i32 %call, 0
678 define i1 @length16_gt(ptr %x, ptr %y) nounwind {
679 ; X64-LABEL: length16_gt:
681 ; X64-NEXT: movq (%rdi), %rax
682 ; X64-NEXT: movq (%rsi), %rcx
683 ; X64-NEXT: bswapq %rax
684 ; X64-NEXT: bswapq %rcx
685 ; X64-NEXT: cmpq %rcx, %rax
686 ; X64-NEXT: jne .LBB36_2
687 ; X64-NEXT: # %bb.1: # %loadbb1
688 ; X64-NEXT: movq 8(%rdi), %rax
689 ; X64-NEXT: movq 8(%rsi), %rcx
690 ; X64-NEXT: bswapq %rax
691 ; X64-NEXT: bswapq %rcx
692 ; X64-NEXT: xorl %edx, %edx
693 ; X64-NEXT: cmpq %rcx, %rax
694 ; X64-NEXT: je .LBB36_3
695 ; X64-NEXT: .LBB36_2: # %res_block
696 ; X64-NEXT: xorl %edx, %edx
697 ; X64-NEXT: cmpq %rcx, %rax
698 ; X64-NEXT: sbbl %edx, %edx
699 ; X64-NEXT: orl $1, %edx
700 ; X64-NEXT: .LBB36_3: # %endblock
701 ; X64-NEXT: testl %edx, %edx
704 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16) nounwind
705 %cmp = icmp sgt i32 %call, 0
709 define i1 @length16_eq_const(ptr %X) nounwind {
710 ; X64-SSE2-LABEL: length16_eq_const:
712 ; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
713 ; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
714 ; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
715 ; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
716 ; X64-SSE2-NEXT: sete %al
717 ; X64-SSE2-NEXT: retq
719 ; X64-SSE41-LABEL: length16_eq_const:
720 ; X64-SSE41: # %bb.0:
721 ; X64-SSE41-NEXT: movdqu (%rdi), %xmm0
722 ; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
723 ; X64-SSE41-NEXT: ptest %xmm0, %xmm0
724 ; X64-SSE41-NEXT: sete %al
725 ; X64-SSE41-NEXT: retq
727 ; X64-AVX-LABEL: length16_eq_const:
729 ; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0
730 ; X64-AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
731 ; X64-AVX-NEXT: vptest %xmm0, %xmm0
732 ; X64-AVX-NEXT: sete %al
735 ; X64-MIC-AVX-LABEL: length16_eq_const:
736 ; X64-MIC-AVX: # %bb.0:
737 ; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0
738 ; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426]
739 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
740 ; X64-MIC-AVX-NEXT: kortestw %k0, %k0
741 ; X64-MIC-AVX-NEXT: sete %al
742 ; X64-MIC-AVX-NEXT: vzeroupper
743 ; X64-MIC-AVX-NEXT: retq
744 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 16) nounwind
745 %c = icmp eq i32 %m, 0
749 ; PR33914 - https://bugs.llvm.org/show_bug.cgi?id=33914
751 define i32 @length24(ptr %X, ptr %Y) nounwind {
752 ; X64-LABEL: length24:
754 ; X64-NEXT: movq (%rdi), %rcx
755 ; X64-NEXT: movq (%rsi), %rdx
756 ; X64-NEXT: bswapq %rcx
757 ; X64-NEXT: bswapq %rdx
758 ; X64-NEXT: cmpq %rdx, %rcx
759 ; X64-NEXT: jne .LBB38_3
760 ; X64-NEXT: # %bb.1: # %loadbb1
761 ; X64-NEXT: movq 8(%rdi), %rcx
762 ; X64-NEXT: movq 8(%rsi), %rdx
763 ; X64-NEXT: bswapq %rcx
764 ; X64-NEXT: bswapq %rdx
765 ; X64-NEXT: cmpq %rdx, %rcx
766 ; X64-NEXT: jne .LBB38_3
767 ; X64-NEXT: # %bb.2: # %loadbb2
768 ; X64-NEXT: movq 16(%rdi), %rcx
769 ; X64-NEXT: movq 16(%rsi), %rdx
770 ; X64-NEXT: bswapq %rcx
771 ; X64-NEXT: bswapq %rdx
772 ; X64-NEXT: xorl %eax, %eax
773 ; X64-NEXT: cmpq %rdx, %rcx
774 ; X64-NEXT: je .LBB38_4
775 ; X64-NEXT: .LBB38_3: # %res_block
776 ; X64-NEXT: xorl %eax, %eax
777 ; X64-NEXT: cmpq %rdx, %rcx
778 ; X64-NEXT: sbbl %eax, %eax
779 ; X64-NEXT: orl $1, %eax
780 ; X64-NEXT: .LBB38_4: # %endblock
782 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 24) nounwind
786 define i1 @length24_eq(ptr %x, ptr %y) nounwind {
787 ; X64-SSE2-LABEL: length24_eq:
789 ; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
790 ; X64-SSE2-NEXT: movdqu (%rsi), %xmm1
791 ; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
792 ; X64-SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
793 ; X64-SSE2-NEXT: movq {{.*#+}} xmm2 = mem[0],zero
794 ; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm2
795 ; X64-SSE2-NEXT: pand %xmm1, %xmm2
796 ; X64-SSE2-NEXT: pmovmskb %xmm2, %eax
797 ; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
798 ; X64-SSE2-NEXT: sete %al
799 ; X64-SSE2-NEXT: retq
801 ; X64-SSE41-LABEL: length24_eq:
802 ; X64-SSE41: # %bb.0:
803 ; X64-SSE41-NEXT: movdqu (%rdi), %xmm0
804 ; X64-SSE41-NEXT: movdqu (%rsi), %xmm1
805 ; X64-SSE41-NEXT: pxor %xmm0, %xmm1
806 ; X64-SSE41-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
807 ; X64-SSE41-NEXT: movq {{.*#+}} xmm2 = mem[0],zero
808 ; X64-SSE41-NEXT: pxor %xmm0, %xmm2
809 ; X64-SSE41-NEXT: por %xmm1, %xmm2
810 ; X64-SSE41-NEXT: ptest %xmm2, %xmm2
811 ; X64-SSE41-NEXT: sete %al
812 ; X64-SSE41-NEXT: retq
814 ; X64-AVX-LABEL: length24_eq:
816 ; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0
817 ; X64-AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
818 ; X64-AVX-NEXT: vmovq {{.*#+}} xmm2 = mem[0],zero
819 ; X64-AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1
820 ; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0
821 ; X64-AVX-NEXT: vpor %xmm0, %xmm1, %xmm0
822 ; X64-AVX-NEXT: vptest %xmm0, %xmm0
823 ; X64-AVX-NEXT: sete %al
826 ; X64-MIC-AVX-LABEL: length24_eq:
827 ; X64-MIC-AVX: # %bb.0:
828 ; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0
829 ; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm1
830 ; X64-MIC-AVX-NEXT: vmovq {{.*#+}} xmm2 = mem[0],zero
831 ; X64-MIC-AVX-NEXT: vmovq {{.*#+}} xmm3 = mem[0],zero
832 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm2, %k0
833 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1
834 ; X64-MIC-AVX-NEXT: kortestw %k0, %k1
835 ; X64-MIC-AVX-NEXT: sete %al
836 ; X64-MIC-AVX-NEXT: vzeroupper
837 ; X64-MIC-AVX-NEXT: retq
838 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 24) nounwind
839 %cmp = icmp eq i32 %call, 0
843 define i1 @length24_lt(ptr %x, ptr %y) nounwind {
844 ; X64-LABEL: length24_lt:
846 ; X64-NEXT: movq (%rdi), %rcx
847 ; X64-NEXT: movq (%rsi), %rdx
848 ; X64-NEXT: bswapq %rcx
849 ; X64-NEXT: bswapq %rdx
850 ; X64-NEXT: cmpq %rdx, %rcx
851 ; X64-NEXT: jne .LBB40_3
852 ; X64-NEXT: # %bb.1: # %loadbb1
853 ; X64-NEXT: movq 8(%rdi), %rcx
854 ; X64-NEXT: movq 8(%rsi), %rdx
855 ; X64-NEXT: bswapq %rcx
856 ; X64-NEXT: bswapq %rdx
857 ; X64-NEXT: cmpq %rdx, %rcx
858 ; X64-NEXT: jne .LBB40_3
859 ; X64-NEXT: # %bb.2: # %loadbb2
860 ; X64-NEXT: movq 16(%rdi), %rcx
861 ; X64-NEXT: movq 16(%rsi), %rdx
862 ; X64-NEXT: bswapq %rcx
863 ; X64-NEXT: bswapq %rdx
864 ; X64-NEXT: xorl %eax, %eax
865 ; X64-NEXT: cmpq %rdx, %rcx
866 ; X64-NEXT: je .LBB40_4
867 ; X64-NEXT: .LBB40_3: # %res_block
868 ; X64-NEXT: xorl %eax, %eax
869 ; X64-NEXT: cmpq %rdx, %rcx
870 ; X64-NEXT: sbbl %eax, %eax
871 ; X64-NEXT: orl $1, %eax
872 ; X64-NEXT: .LBB40_4: # %endblock
873 ; X64-NEXT: shrl $31, %eax
874 ; X64-NEXT: # kill: def $al killed $al killed $eax
876 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 24) nounwind
877 %cmp = icmp slt i32 %call, 0
881 define i1 @length24_gt(ptr %x, ptr %y) nounwind {
882 ; X64-LABEL: length24_gt:
884 ; X64-NEXT: movq (%rdi), %rax
885 ; X64-NEXT: movq (%rsi), %rcx
886 ; X64-NEXT: bswapq %rax
887 ; X64-NEXT: bswapq %rcx
888 ; X64-NEXT: cmpq %rcx, %rax
889 ; X64-NEXT: jne .LBB41_3
890 ; X64-NEXT: # %bb.1: # %loadbb1
891 ; X64-NEXT: movq 8(%rdi), %rax
892 ; X64-NEXT: movq 8(%rsi), %rcx
893 ; X64-NEXT: bswapq %rax
894 ; X64-NEXT: bswapq %rcx
895 ; X64-NEXT: cmpq %rcx, %rax
896 ; X64-NEXT: jne .LBB41_3
897 ; X64-NEXT: # %bb.2: # %loadbb2
898 ; X64-NEXT: movq 16(%rdi), %rax
899 ; X64-NEXT: movq 16(%rsi), %rcx
900 ; X64-NEXT: bswapq %rax
901 ; X64-NEXT: bswapq %rcx
902 ; X64-NEXT: xorl %edx, %edx
903 ; X64-NEXT: cmpq %rcx, %rax
904 ; X64-NEXT: je .LBB41_4
905 ; X64-NEXT: .LBB41_3: # %res_block
906 ; X64-NEXT: xorl %edx, %edx
907 ; X64-NEXT: cmpq %rcx, %rax
908 ; X64-NEXT: sbbl %edx, %edx
909 ; X64-NEXT: orl $1, %edx
910 ; X64-NEXT: .LBB41_4: # %endblock
911 ; X64-NEXT: testl %edx, %edx
914 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 24) nounwind
915 %cmp = icmp sgt i32 %call, 0
919 define i1 @length24_eq_const(ptr %X) nounwind {
920 ; X64-SSE2-LABEL: length24_eq_const:
922 ; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
923 ; X64-SSE2-NEXT: movq {{.*#+}} xmm1 = mem[0],zero
924 ; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
925 ; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
926 ; X64-SSE2-NEXT: pand %xmm1, %xmm0
927 ; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
928 ; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
929 ; X64-SSE2-NEXT: setne %al
930 ; X64-SSE2-NEXT: retq
932 ; X64-SSE41-LABEL: length24_eq_const:
933 ; X64-SSE41: # %bb.0:
934 ; X64-SSE41-NEXT: movdqu (%rdi), %xmm0
935 ; X64-SSE41-NEXT: movq {{.*#+}} xmm1 = mem[0],zero
936 ; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
937 ; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
938 ; X64-SSE41-NEXT: por %xmm1, %xmm0
939 ; X64-SSE41-NEXT: ptest %xmm0, %xmm0
940 ; X64-SSE41-NEXT: setne %al
941 ; X64-SSE41-NEXT: retq
943 ; X64-AVX-LABEL: length24_eq_const:
945 ; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0
946 ; X64-AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
947 ; X64-AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
948 ; X64-AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
949 ; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
950 ; X64-AVX-NEXT: vptest %xmm0, %xmm0
951 ; X64-AVX-NEXT: setne %al
954 ; X64-MIC-AVX-LABEL: length24_eq_const:
955 ; X64-MIC-AVX: # %bb.0:
956 ; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0
957 ; X64-MIC-AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
958 ; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [959985462,858927408,0,0]
959 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm1, %k0
960 ; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426]
961 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1
962 ; X64-MIC-AVX-NEXT: kortestw %k0, %k1
963 ; X64-MIC-AVX-NEXT: setne %al
964 ; X64-MIC-AVX-NEXT: vzeroupper
965 ; X64-MIC-AVX-NEXT: retq
966 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 24) nounwind
967 %c = icmp ne i32 %m, 0
971 define i32 @length31(ptr %X, ptr %Y) nounwind {
972 ; X64-LABEL: length31:
974 ; X64-NEXT: movq (%rdi), %rcx
975 ; X64-NEXT: movq (%rsi), %rdx
976 ; X64-NEXT: bswapq %rcx
977 ; X64-NEXT: bswapq %rdx
978 ; X64-NEXT: cmpq %rdx, %rcx
979 ; X64-NEXT: jne .LBB43_4
980 ; X64-NEXT: # %bb.1: # %loadbb1
981 ; X64-NEXT: movq 8(%rdi), %rcx
982 ; X64-NEXT: movq 8(%rsi), %rdx
983 ; X64-NEXT: bswapq %rcx
984 ; X64-NEXT: bswapq %rdx
985 ; X64-NEXT: cmpq %rdx, %rcx
986 ; X64-NEXT: jne .LBB43_4
987 ; X64-NEXT: # %bb.2: # %loadbb2
988 ; X64-NEXT: movq 16(%rdi), %rcx
989 ; X64-NEXT: movq 16(%rsi), %rdx
990 ; X64-NEXT: bswapq %rcx
991 ; X64-NEXT: bswapq %rdx
992 ; X64-NEXT: cmpq %rdx, %rcx
993 ; X64-NEXT: jne .LBB43_4
994 ; X64-NEXT: # %bb.3: # %loadbb3
995 ; X64-NEXT: movq 23(%rdi), %rcx
996 ; X64-NEXT: movq 23(%rsi), %rdx
997 ; X64-NEXT: bswapq %rcx
998 ; X64-NEXT: bswapq %rdx
999 ; X64-NEXT: xorl %eax, %eax
1000 ; X64-NEXT: cmpq %rdx, %rcx
1001 ; X64-NEXT: je .LBB43_5
1002 ; X64-NEXT: .LBB43_4: # %res_block
1003 ; X64-NEXT: xorl %eax, %eax
1004 ; X64-NEXT: cmpq %rdx, %rcx
1005 ; X64-NEXT: sbbl %eax, %eax
1006 ; X64-NEXT: orl $1, %eax
1007 ; X64-NEXT: .LBB43_5: # %endblock
1009 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 31) nounwind
1013 define i1 @length31_eq(ptr %x, ptr %y) nounwind {
1014 ; X64-SSE2-LABEL: length31_eq:
1015 ; X64-SSE2: # %bb.0:
1016 ; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
1017 ; X64-SSE2-NEXT: movdqu 15(%rdi), %xmm1
1018 ; X64-SSE2-NEXT: movdqu (%rsi), %xmm2
1019 ; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm2
1020 ; X64-SSE2-NEXT: movdqu 15(%rsi), %xmm0
1021 ; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
1022 ; X64-SSE2-NEXT: pand %xmm2, %xmm0
1023 ; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
1024 ; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1025 ; X64-SSE2-NEXT: sete %al
1026 ; X64-SSE2-NEXT: retq
1028 ; X64-SSE41-LABEL: length31_eq:
1029 ; X64-SSE41: # %bb.0:
1030 ; X64-SSE41-NEXT: movdqu (%rdi), %xmm0
1031 ; X64-SSE41-NEXT: movdqu 15(%rdi), %xmm1
1032 ; X64-SSE41-NEXT: movdqu (%rsi), %xmm2
1033 ; X64-SSE41-NEXT: pxor %xmm0, %xmm2
1034 ; X64-SSE41-NEXT: movdqu 15(%rsi), %xmm0
1035 ; X64-SSE41-NEXT: pxor %xmm1, %xmm0
1036 ; X64-SSE41-NEXT: por %xmm2, %xmm0
1037 ; X64-SSE41-NEXT: ptest %xmm0, %xmm0
1038 ; X64-SSE41-NEXT: sete %al
1039 ; X64-SSE41-NEXT: retq
1041 ; X64-AVX-LABEL: length31_eq:
1043 ; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0
1044 ; X64-AVX-NEXT: vmovdqu 15(%rdi), %xmm1
1045 ; X64-AVX-NEXT: vpxor 15(%rsi), %xmm1, %xmm1
1046 ; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0
1047 ; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
1048 ; X64-AVX-NEXT: vptest %xmm0, %xmm0
1049 ; X64-AVX-NEXT: sete %al
1050 ; X64-AVX-NEXT: retq
1052 ; X64-MIC-AVX-LABEL: length31_eq:
1053 ; X64-MIC-AVX: # %bb.0:
1054 ; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0
1055 ; X64-MIC-AVX-NEXT: vmovdqu 15(%rdi), %xmm1
1056 ; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm2
1057 ; X64-MIC-AVX-NEXT: vmovdqu 15(%rsi), %xmm3
1058 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm1, %k0
1059 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm0, %k1
1060 ; X64-MIC-AVX-NEXT: kortestw %k0, %k1
1061 ; X64-MIC-AVX-NEXT: sete %al
1062 ; X64-MIC-AVX-NEXT: vzeroupper
1063 ; X64-MIC-AVX-NEXT: retq
1064 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind
1065 %cmp = icmp eq i32 %call, 0
1069 define i1 @length31_lt(ptr %x, ptr %y) nounwind {
1070 ; X64-LABEL: length31_lt:
1072 ; X64-NEXT: movq (%rdi), %rcx
1073 ; X64-NEXT: movq (%rsi), %rdx
1074 ; X64-NEXT: bswapq %rcx
1075 ; X64-NEXT: bswapq %rdx
1076 ; X64-NEXT: cmpq %rdx, %rcx
1077 ; X64-NEXT: jne .LBB45_4
1078 ; X64-NEXT: # %bb.1: # %loadbb1
1079 ; X64-NEXT: movq 8(%rdi), %rcx
1080 ; X64-NEXT: movq 8(%rsi), %rdx
1081 ; X64-NEXT: bswapq %rcx
1082 ; X64-NEXT: bswapq %rdx
1083 ; X64-NEXT: cmpq %rdx, %rcx
1084 ; X64-NEXT: jne .LBB45_4
1085 ; X64-NEXT: # %bb.2: # %loadbb2
1086 ; X64-NEXT: movq 16(%rdi), %rcx
1087 ; X64-NEXT: movq 16(%rsi), %rdx
1088 ; X64-NEXT: bswapq %rcx
1089 ; X64-NEXT: bswapq %rdx
1090 ; X64-NEXT: cmpq %rdx, %rcx
1091 ; X64-NEXT: jne .LBB45_4
1092 ; X64-NEXT: # %bb.3: # %loadbb3
1093 ; X64-NEXT: movq 23(%rdi), %rcx
1094 ; X64-NEXT: movq 23(%rsi), %rdx
1095 ; X64-NEXT: bswapq %rcx
1096 ; X64-NEXT: bswapq %rdx
1097 ; X64-NEXT: xorl %eax, %eax
1098 ; X64-NEXT: cmpq %rdx, %rcx
1099 ; X64-NEXT: je .LBB45_5
1100 ; X64-NEXT: .LBB45_4: # %res_block
1101 ; X64-NEXT: xorl %eax, %eax
1102 ; X64-NEXT: cmpq %rdx, %rcx
1103 ; X64-NEXT: sbbl %eax, %eax
1104 ; X64-NEXT: orl $1, %eax
1105 ; X64-NEXT: .LBB45_5: # %endblock
1106 ; X64-NEXT: shrl $31, %eax
1107 ; X64-NEXT: # kill: def $al killed $al killed $eax
1109 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind
1110 %cmp = icmp slt i32 %call, 0
1114 define i1 @length31_gt(ptr %x, ptr %y) nounwind {
1115 ; X64-LABEL: length31_gt:
1117 ; X64-NEXT: movq (%rdi), %rax
1118 ; X64-NEXT: movq (%rsi), %rcx
1119 ; X64-NEXT: bswapq %rax
1120 ; X64-NEXT: bswapq %rcx
1121 ; X64-NEXT: cmpq %rcx, %rax
1122 ; X64-NEXT: jne .LBB46_4
1123 ; X64-NEXT: # %bb.1: # %loadbb1
1124 ; X64-NEXT: movq 8(%rdi), %rax
1125 ; X64-NEXT: movq 8(%rsi), %rcx
1126 ; X64-NEXT: bswapq %rax
1127 ; X64-NEXT: bswapq %rcx
1128 ; X64-NEXT: cmpq %rcx, %rax
1129 ; X64-NEXT: jne .LBB46_4
1130 ; X64-NEXT: # %bb.2: # %loadbb2
1131 ; X64-NEXT: movq 16(%rdi), %rax
1132 ; X64-NEXT: movq 16(%rsi), %rcx
1133 ; X64-NEXT: bswapq %rax
1134 ; X64-NEXT: bswapq %rcx
1135 ; X64-NEXT: cmpq %rcx, %rax
1136 ; X64-NEXT: jne .LBB46_4
1137 ; X64-NEXT: # %bb.3: # %loadbb3
1138 ; X64-NEXT: movq 23(%rdi), %rax
1139 ; X64-NEXT: movq 23(%rsi), %rcx
1140 ; X64-NEXT: bswapq %rax
1141 ; X64-NEXT: bswapq %rcx
1142 ; X64-NEXT: xorl %edx, %edx
1143 ; X64-NEXT: cmpq %rcx, %rax
1144 ; X64-NEXT: je .LBB46_5
1145 ; X64-NEXT: .LBB46_4: # %res_block
1146 ; X64-NEXT: xorl %edx, %edx
1147 ; X64-NEXT: cmpq %rcx, %rax
1148 ; X64-NEXT: sbbl %edx, %edx
1149 ; X64-NEXT: orl $1, %edx
1150 ; X64-NEXT: .LBB46_5: # %endblock
1151 ; X64-NEXT: testl %edx, %edx
1152 ; X64-NEXT: setg %al
1154 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind
1155 %cmp = icmp sgt i32 %call, 0
1159 define i1 @length31_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {
1160 ; X64-SSE2-LABEL: length31_eq_prefer128:
1161 ; X64-SSE2: # %bb.0:
1162 ; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
1163 ; X64-SSE2-NEXT: movdqu 15(%rdi), %xmm1
1164 ; X64-SSE2-NEXT: movdqu (%rsi), %xmm2
1165 ; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm2
1166 ; X64-SSE2-NEXT: movdqu 15(%rsi), %xmm0
1167 ; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
1168 ; X64-SSE2-NEXT: pand %xmm2, %xmm0
1169 ; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
1170 ; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1171 ; X64-SSE2-NEXT: sete %al
1172 ; X64-SSE2-NEXT: retq
1174 ; X64-SSE41-LABEL: length31_eq_prefer128:
1175 ; X64-SSE41: # %bb.0:
1176 ; X64-SSE41-NEXT: movdqu (%rdi), %xmm0
1177 ; X64-SSE41-NEXT: movdqu 15(%rdi), %xmm1
1178 ; X64-SSE41-NEXT: movdqu (%rsi), %xmm2
1179 ; X64-SSE41-NEXT: pxor %xmm0, %xmm2
1180 ; X64-SSE41-NEXT: movdqu 15(%rsi), %xmm0
1181 ; X64-SSE41-NEXT: pxor %xmm1, %xmm0
1182 ; X64-SSE41-NEXT: por %xmm2, %xmm0
1183 ; X64-SSE41-NEXT: ptest %xmm0, %xmm0
1184 ; X64-SSE41-NEXT: sete %al
1185 ; X64-SSE41-NEXT: retq
1187 ; X64-AVX-LABEL: length31_eq_prefer128:
1189 ; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0
1190 ; X64-AVX-NEXT: vmovdqu 15(%rdi), %xmm1
1191 ; X64-AVX-NEXT: vpxor 15(%rsi), %xmm1, %xmm1
1192 ; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0
1193 ; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
1194 ; X64-AVX-NEXT: vptest %xmm0, %xmm0
1195 ; X64-AVX-NEXT: sete %al
1196 ; X64-AVX-NEXT: retq
1198 ; X64-MIC-AVX-LABEL: length31_eq_prefer128:
1199 ; X64-MIC-AVX: # %bb.0:
1200 ; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0
1201 ; X64-MIC-AVX-NEXT: vmovdqu 15(%rdi), %xmm1
1202 ; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm2
1203 ; X64-MIC-AVX-NEXT: vmovdqu 15(%rsi), %xmm3
1204 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm1, %k0
1205 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm0, %k1
1206 ; X64-MIC-AVX-NEXT: kortestw %k0, %k1
1207 ; X64-MIC-AVX-NEXT: sete %al
1208 ; X64-MIC-AVX-NEXT: vzeroupper
1209 ; X64-MIC-AVX-NEXT: retq
1210 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind
1211 %cmp = icmp eq i32 %call, 0
1215 define i1 @length31_eq_const(ptr %X) nounwind {
1216 ; X64-SSE2-LABEL: length31_eq_const:
1217 ; X64-SSE2: # %bb.0:
1218 ; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
1219 ; X64-SSE2-NEXT: movdqu 15(%rdi), %xmm1
1220 ; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1221 ; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1222 ; X64-SSE2-NEXT: pand %xmm1, %xmm0
1223 ; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
1224 ; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1225 ; X64-SSE2-NEXT: setne %al
1226 ; X64-SSE2-NEXT: retq
1228 ; X64-SSE41-LABEL: length31_eq_const:
1229 ; X64-SSE41: # %bb.0:
1230 ; X64-SSE41-NEXT: movdqu (%rdi), %xmm0
1231 ; X64-SSE41-NEXT: movdqu 15(%rdi), %xmm1
1232 ; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1233 ; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1234 ; X64-SSE41-NEXT: por %xmm1, %xmm0
1235 ; X64-SSE41-NEXT: ptest %xmm0, %xmm0
1236 ; X64-SSE41-NEXT: setne %al
1237 ; X64-SSE41-NEXT: retq
1239 ; X64-AVX-LABEL: length31_eq_const:
1241 ; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0
1242 ; X64-AVX-NEXT: vmovdqu 15(%rdi), %xmm1
1243 ; X64-AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1244 ; X64-AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1245 ; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
1246 ; X64-AVX-NEXT: vptest %xmm0, %xmm0
1247 ; X64-AVX-NEXT: setne %al
1248 ; X64-AVX-NEXT: retq
1250 ; X64-MIC-AVX-LABEL: length31_eq_const:
1251 ; X64-MIC-AVX: # %bb.0:
1252 ; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0
1253 ; X64-MIC-AVX-NEXT: vmovdqu 15(%rdi), %xmm1
1254 ; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [943142453,842084409,909456435,809056311]
1255 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm1, %k0
1256 ; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426]
1257 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1
1258 ; X64-MIC-AVX-NEXT: kortestw %k0, %k1
1259 ; X64-MIC-AVX-NEXT: setne %al
1260 ; X64-MIC-AVX-NEXT: vzeroupper
1261 ; X64-MIC-AVX-NEXT: retq
1262 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 31) nounwind
1263 %c = icmp ne i32 %m, 0
1267 define i32 @length32(ptr %X, ptr %Y) nounwind {
1268 ; X64-LABEL: length32:
1270 ; X64-NEXT: movq (%rdi), %rcx
1271 ; X64-NEXT: movq (%rsi), %rdx
1272 ; X64-NEXT: bswapq %rcx
1273 ; X64-NEXT: bswapq %rdx
1274 ; X64-NEXT: cmpq %rdx, %rcx
1275 ; X64-NEXT: jne .LBB49_4
1276 ; X64-NEXT: # %bb.1: # %loadbb1
1277 ; X64-NEXT: movq 8(%rdi), %rcx
1278 ; X64-NEXT: movq 8(%rsi), %rdx
1279 ; X64-NEXT: bswapq %rcx
1280 ; X64-NEXT: bswapq %rdx
1281 ; X64-NEXT: cmpq %rdx, %rcx
1282 ; X64-NEXT: jne .LBB49_4
1283 ; X64-NEXT: # %bb.2: # %loadbb2
1284 ; X64-NEXT: movq 16(%rdi), %rcx
1285 ; X64-NEXT: movq 16(%rsi), %rdx
1286 ; X64-NEXT: bswapq %rcx
1287 ; X64-NEXT: bswapq %rdx
1288 ; X64-NEXT: cmpq %rdx, %rcx
1289 ; X64-NEXT: jne .LBB49_4
1290 ; X64-NEXT: # %bb.3: # %loadbb3
1291 ; X64-NEXT: movq 24(%rdi), %rcx
1292 ; X64-NEXT: movq 24(%rsi), %rdx
1293 ; X64-NEXT: bswapq %rcx
1294 ; X64-NEXT: bswapq %rdx
1295 ; X64-NEXT: xorl %eax, %eax
1296 ; X64-NEXT: cmpq %rdx, %rcx
1297 ; X64-NEXT: je .LBB49_5
1298 ; X64-NEXT: .LBB49_4: # %res_block
1299 ; X64-NEXT: xorl %eax, %eax
1300 ; X64-NEXT: cmpq %rdx, %rcx
1301 ; X64-NEXT: sbbl %eax, %eax
1302 ; X64-NEXT: orl $1, %eax
1303 ; X64-NEXT: .LBB49_5: # %endblock
1305 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 32) nounwind
1309 ; PR33325 - https://bugs.llvm.org/show_bug.cgi?id=33325
1311 define i1 @length32_eq(ptr %x, ptr %y) nounwind {
1312 ; X64-SSE2-LABEL: length32_eq:
1313 ; X64-SSE2: # %bb.0:
1314 ; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
1315 ; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1
1316 ; X64-SSE2-NEXT: movdqu (%rsi), %xmm2
1317 ; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm2
1318 ; X64-SSE2-NEXT: movdqu 16(%rsi), %xmm0
1319 ; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
1320 ; X64-SSE2-NEXT: pand %xmm2, %xmm0
1321 ; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
1322 ; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1323 ; X64-SSE2-NEXT: sete %al
1324 ; X64-SSE2-NEXT: retq
1326 ; X64-SSE41-LABEL: length32_eq:
1327 ; X64-SSE41: # %bb.0:
1328 ; X64-SSE41-NEXT: movdqu (%rdi), %xmm0
1329 ; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1
1330 ; X64-SSE41-NEXT: movdqu (%rsi), %xmm2
1331 ; X64-SSE41-NEXT: pxor %xmm0, %xmm2
1332 ; X64-SSE41-NEXT: movdqu 16(%rsi), %xmm0
1333 ; X64-SSE41-NEXT: pxor %xmm1, %xmm0
1334 ; X64-SSE41-NEXT: por %xmm2, %xmm0
1335 ; X64-SSE41-NEXT: ptest %xmm0, %xmm0
1336 ; X64-SSE41-NEXT: sete %al
1337 ; X64-SSE41-NEXT: retq
1339 ; X64-AVX1-LABEL: length32_eq:
1340 ; X64-AVX1: # %bb.0:
1341 ; X64-AVX1-NEXT: vmovups (%rdi), %ymm0
1342 ; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0
1343 ; X64-AVX1-NEXT: vptest %ymm0, %ymm0
1344 ; X64-AVX1-NEXT: sete %al
1345 ; X64-AVX1-NEXT: vzeroupper
1346 ; X64-AVX1-NEXT: retq
1348 ; X64-AVX2-LABEL: length32_eq:
1349 ; X64-AVX2: # %bb.0:
1350 ; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
1351 ; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0
1352 ; X64-AVX2-NEXT: vptest %ymm0, %ymm0
1353 ; X64-AVX2-NEXT: sete %al
1354 ; X64-AVX2-NEXT: vzeroupper
1355 ; X64-AVX2-NEXT: retq
1357 ; X64-AVX512-LABEL: length32_eq:
1358 ; X64-AVX512: # %bb.0:
1359 ; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0
1360 ; X64-AVX512-NEXT: vpxor (%rsi), %ymm0, %ymm0
1361 ; X64-AVX512-NEXT: vptest %ymm0, %ymm0
1362 ; X64-AVX512-NEXT: sete %al
1363 ; X64-AVX512-NEXT: vzeroupper
1364 ; X64-AVX512-NEXT: retq
1366 ; X64-MIC-AVX-LABEL: length32_eq:
1367 ; X64-MIC-AVX: # %bb.0:
1368 ; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0
1369 ; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %ymm1
1370 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
1371 ; X64-MIC-AVX-NEXT: kortestw %k0, %k0
1372 ; X64-MIC-AVX-NEXT: sete %al
1373 ; X64-MIC-AVX-NEXT: vzeroupper
1374 ; X64-MIC-AVX-NEXT: retq
1375 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind
1376 %cmp = icmp eq i32 %call, 0
1380 define i1 @length32_lt(ptr %x, ptr %y) nounwind {
1381 ; X64-LABEL: length32_lt:
1383 ; X64-NEXT: movq (%rdi), %rcx
1384 ; X64-NEXT: movq (%rsi), %rdx
1385 ; X64-NEXT: bswapq %rcx
1386 ; X64-NEXT: bswapq %rdx
1387 ; X64-NEXT: cmpq %rdx, %rcx
1388 ; X64-NEXT: jne .LBB51_4
1389 ; X64-NEXT: # %bb.1: # %loadbb1
1390 ; X64-NEXT: movq 8(%rdi), %rcx
1391 ; X64-NEXT: movq 8(%rsi), %rdx
1392 ; X64-NEXT: bswapq %rcx
1393 ; X64-NEXT: bswapq %rdx
1394 ; X64-NEXT: cmpq %rdx, %rcx
1395 ; X64-NEXT: jne .LBB51_4
1396 ; X64-NEXT: # %bb.2: # %loadbb2
1397 ; X64-NEXT: movq 16(%rdi), %rcx
1398 ; X64-NEXT: movq 16(%rsi), %rdx
1399 ; X64-NEXT: bswapq %rcx
1400 ; X64-NEXT: bswapq %rdx
1401 ; X64-NEXT: cmpq %rdx, %rcx
1402 ; X64-NEXT: jne .LBB51_4
1403 ; X64-NEXT: # %bb.3: # %loadbb3
1404 ; X64-NEXT: movq 24(%rdi), %rcx
1405 ; X64-NEXT: movq 24(%rsi), %rdx
1406 ; X64-NEXT: bswapq %rcx
1407 ; X64-NEXT: bswapq %rdx
1408 ; X64-NEXT: xorl %eax, %eax
1409 ; X64-NEXT: cmpq %rdx, %rcx
1410 ; X64-NEXT: je .LBB51_5
1411 ; X64-NEXT: .LBB51_4: # %res_block
1412 ; X64-NEXT: xorl %eax, %eax
1413 ; X64-NEXT: cmpq %rdx, %rcx
1414 ; X64-NEXT: sbbl %eax, %eax
1415 ; X64-NEXT: orl $1, %eax
1416 ; X64-NEXT: .LBB51_5: # %endblock
1417 ; X64-NEXT: shrl $31, %eax
1418 ; X64-NEXT: # kill: def $al killed $al killed $eax
1420 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind
1421 %cmp = icmp slt i32 %call, 0
1425 define i1 @length32_gt(ptr %x, ptr %y) nounwind {
1426 ; X64-LABEL: length32_gt:
1428 ; X64-NEXT: movq (%rdi), %rax
1429 ; X64-NEXT: movq (%rsi), %rcx
1430 ; X64-NEXT: bswapq %rax
1431 ; X64-NEXT: bswapq %rcx
1432 ; X64-NEXT: cmpq %rcx, %rax
1433 ; X64-NEXT: jne .LBB52_4
1434 ; X64-NEXT: # %bb.1: # %loadbb1
1435 ; X64-NEXT: movq 8(%rdi), %rax
1436 ; X64-NEXT: movq 8(%rsi), %rcx
1437 ; X64-NEXT: bswapq %rax
1438 ; X64-NEXT: bswapq %rcx
1439 ; X64-NEXT: cmpq %rcx, %rax
1440 ; X64-NEXT: jne .LBB52_4
1441 ; X64-NEXT: # %bb.2: # %loadbb2
1442 ; X64-NEXT: movq 16(%rdi), %rax
1443 ; X64-NEXT: movq 16(%rsi), %rcx
1444 ; X64-NEXT: bswapq %rax
1445 ; X64-NEXT: bswapq %rcx
1446 ; X64-NEXT: cmpq %rcx, %rax
1447 ; X64-NEXT: jne .LBB52_4
1448 ; X64-NEXT: # %bb.3: # %loadbb3
1449 ; X64-NEXT: movq 24(%rdi), %rax
1450 ; X64-NEXT: movq 24(%rsi), %rcx
1451 ; X64-NEXT: bswapq %rax
1452 ; X64-NEXT: bswapq %rcx
1453 ; X64-NEXT: xorl %edx, %edx
1454 ; X64-NEXT: cmpq %rcx, %rax
1455 ; X64-NEXT: je .LBB52_5
1456 ; X64-NEXT: .LBB52_4: # %res_block
1457 ; X64-NEXT: xorl %edx, %edx
1458 ; X64-NEXT: cmpq %rcx, %rax
1459 ; X64-NEXT: sbbl %edx, %edx
1460 ; X64-NEXT: orl $1, %edx
1461 ; X64-NEXT: .LBB52_5: # %endblock
1462 ; X64-NEXT: testl %edx, %edx
1463 ; X64-NEXT: setg %al
1465 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind
1466 %cmp = icmp sgt i32 %call, 0
1470 define i1 @length32_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {
1471 ; X64-SSE2-LABEL: length32_eq_prefer128:
1472 ; X64-SSE2: # %bb.0:
1473 ; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
1474 ; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1
1475 ; X64-SSE2-NEXT: movdqu (%rsi), %xmm2
1476 ; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm2
1477 ; X64-SSE2-NEXT: movdqu 16(%rsi), %xmm0
1478 ; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
1479 ; X64-SSE2-NEXT: pand %xmm2, %xmm0
1480 ; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
1481 ; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1482 ; X64-SSE2-NEXT: sete %al
1483 ; X64-SSE2-NEXT: retq
1485 ; X64-SSE41-LABEL: length32_eq_prefer128:
1486 ; X64-SSE41: # %bb.0:
1487 ; X64-SSE41-NEXT: movdqu (%rdi), %xmm0
1488 ; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1
1489 ; X64-SSE41-NEXT: movdqu (%rsi), %xmm2
1490 ; X64-SSE41-NEXT: pxor %xmm0, %xmm2
1491 ; X64-SSE41-NEXT: movdqu 16(%rsi), %xmm0
1492 ; X64-SSE41-NEXT: pxor %xmm1, %xmm0
1493 ; X64-SSE41-NEXT: por %xmm2, %xmm0
1494 ; X64-SSE41-NEXT: ptest %xmm0, %xmm0
1495 ; X64-SSE41-NEXT: sete %al
1496 ; X64-SSE41-NEXT: retq
1498 ; X64-AVX-LABEL: length32_eq_prefer128:
1500 ; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0
1501 ; X64-AVX-NEXT: vmovdqu 16(%rdi), %xmm1
1502 ; X64-AVX-NEXT: vpxor 16(%rsi), %xmm1, %xmm1
1503 ; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0
1504 ; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
1505 ; X64-AVX-NEXT: vptest %xmm0, %xmm0
1506 ; X64-AVX-NEXT: sete %al
1507 ; X64-AVX-NEXT: retq
1509 ; X64-MIC-AVX-LABEL: length32_eq_prefer128:
1510 ; X64-MIC-AVX: # %bb.0:
1511 ; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0
1512 ; X64-MIC-AVX-NEXT: vmovdqu 16(%rdi), %xmm1
1513 ; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm2
1514 ; X64-MIC-AVX-NEXT: vmovdqu 16(%rsi), %xmm3
1515 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm1, %k0
1516 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm0, %k1
1517 ; X64-MIC-AVX-NEXT: kortestw %k0, %k1
1518 ; X64-MIC-AVX-NEXT: sete %al
1519 ; X64-MIC-AVX-NEXT: vzeroupper
1520 ; X64-MIC-AVX-NEXT: retq
1521 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind
1522 %cmp = icmp eq i32 %call, 0
1526 define i1 @length32_eq_const(ptr %X) nounwind {
1527 ; X64-SSE2-LABEL: length32_eq_const:
1528 ; X64-SSE2: # %bb.0:
1529 ; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
1530 ; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1
1531 ; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1532 ; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1533 ; X64-SSE2-NEXT: pand %xmm1, %xmm0
1534 ; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
1535 ; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1536 ; X64-SSE2-NEXT: setne %al
1537 ; X64-SSE2-NEXT: retq
1539 ; X64-SSE41-LABEL: length32_eq_const:
1540 ; X64-SSE41: # %bb.0:
1541 ; X64-SSE41-NEXT: movdqu (%rdi), %xmm0
1542 ; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1
1543 ; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1544 ; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1545 ; X64-SSE41-NEXT: por %xmm1, %xmm0
1546 ; X64-SSE41-NEXT: ptest %xmm0, %xmm0
1547 ; X64-SSE41-NEXT: setne %al
1548 ; X64-SSE41-NEXT: retq
1550 ; X64-AVX1-LABEL: length32_eq_const:
1551 ; X64-AVX1: # %bb.0:
1552 ; X64-AVX1-NEXT: vmovups (%rdi), %ymm0
1553 ; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1554 ; X64-AVX1-NEXT: vptest %ymm0, %ymm0
1555 ; X64-AVX1-NEXT: setne %al
1556 ; X64-AVX1-NEXT: vzeroupper
1557 ; X64-AVX1-NEXT: retq
1559 ; X64-AVX2-LABEL: length32_eq_const:
1560 ; X64-AVX2: # %bb.0:
1561 ; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
1562 ; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1563 ; X64-AVX2-NEXT: vptest %ymm0, %ymm0
1564 ; X64-AVX2-NEXT: setne %al
1565 ; X64-AVX2-NEXT: vzeroupper
1566 ; X64-AVX2-NEXT: retq
1568 ; X64-AVX512-LABEL: length32_eq_const:
1569 ; X64-AVX512: # %bb.0:
1570 ; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0
1571 ; X64-AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1572 ; X64-AVX512-NEXT: vptest %ymm0, %ymm0
1573 ; X64-AVX512-NEXT: setne %al
1574 ; X64-AVX512-NEXT: vzeroupper
1575 ; X64-AVX512-NEXT: retq
1577 ; X64-MIC-AVX-LABEL: length32_eq_const:
1578 ; X64-MIC-AVX: # %bb.0:
1579 ; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0
1580 ; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
1581 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
1582 ; X64-MIC-AVX-NEXT: kortestw %k0, %k0
1583 ; X64-MIC-AVX-NEXT: setne %al
1584 ; X64-MIC-AVX-NEXT: vzeroupper
1585 ; X64-MIC-AVX-NEXT: retq
1586 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 32) nounwind
1587 %c = icmp ne i32 %m, 0
1591 define i32 @length48(ptr %X, ptr %Y) nounwind {
1592 ; X64-LABEL: length48:
1594 ; X64-NEXT: movl $48, %edx
1595 ; X64-NEXT: jmp memcmp # TAILCALL
1596 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 48) nounwind
1600 define i1 @length48_eq(ptr %x, ptr %y) nounwind {
1601 ; X64-SSE2-LABEL: length48_eq:
1602 ; X64-SSE2: # %bb.0:
1603 ; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
1604 ; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1
1605 ; X64-SSE2-NEXT: movdqu 32(%rdi), %xmm2
1606 ; X64-SSE2-NEXT: movdqu (%rsi), %xmm3
1607 ; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm3
1608 ; X64-SSE2-NEXT: movdqu 16(%rsi), %xmm0
1609 ; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
1610 ; X64-SSE2-NEXT: pand %xmm3, %xmm0
1611 ; X64-SSE2-NEXT: movdqu 32(%rsi), %xmm1
1612 ; X64-SSE2-NEXT: pcmpeqb %xmm2, %xmm1
1613 ; X64-SSE2-NEXT: pand %xmm0, %xmm1
1614 ; X64-SSE2-NEXT: pmovmskb %xmm1, %eax
1615 ; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1616 ; X64-SSE2-NEXT: sete %al
1617 ; X64-SSE2-NEXT: retq
1619 ; X64-SSE41-LABEL: length48_eq:
1620 ; X64-SSE41: # %bb.0:
1621 ; X64-SSE41-NEXT: movdqu (%rdi), %xmm0
1622 ; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1
1623 ; X64-SSE41-NEXT: movdqu 32(%rdi), %xmm2
1624 ; X64-SSE41-NEXT: movdqu (%rsi), %xmm3
1625 ; X64-SSE41-NEXT: pxor %xmm0, %xmm3
1626 ; X64-SSE41-NEXT: movdqu 16(%rsi), %xmm0
1627 ; X64-SSE41-NEXT: pxor %xmm1, %xmm0
1628 ; X64-SSE41-NEXT: por %xmm3, %xmm0
1629 ; X64-SSE41-NEXT: movdqu 32(%rsi), %xmm1
1630 ; X64-SSE41-NEXT: pxor %xmm2, %xmm1
1631 ; X64-SSE41-NEXT: por %xmm0, %xmm1
1632 ; X64-SSE41-NEXT: ptest %xmm1, %xmm1
1633 ; X64-SSE41-NEXT: sete %al
1634 ; X64-SSE41-NEXT: retq
1636 ; X64-AVX1-LABEL: length48_eq:
1637 ; X64-AVX1: # %bb.0:
1638 ; X64-AVX1-NEXT: vmovups (%rdi), %ymm0
1639 ; X64-AVX1-NEXT: vmovups 32(%rdi), %xmm1
1640 ; X64-AVX1-NEXT: vmovups 32(%rsi), %xmm2
1641 ; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0
1642 ; X64-AVX1-NEXT: vxorps %ymm2, %ymm1, %ymm1
1643 ; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
1644 ; X64-AVX1-NEXT: vptest %ymm0, %ymm0
1645 ; X64-AVX1-NEXT: sete %al
1646 ; X64-AVX1-NEXT: vzeroupper
1647 ; X64-AVX1-NEXT: retq
1649 ; X64-AVX2-LABEL: length48_eq:
1650 ; X64-AVX2: # %bb.0:
1651 ; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
1652 ; X64-AVX2-NEXT: vmovdqu 32(%rdi), %xmm1
1653 ; X64-AVX2-NEXT: vmovdqu 32(%rsi), %xmm2
1654 ; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0
1655 ; X64-AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1
1656 ; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1657 ; X64-AVX2-NEXT: vptest %ymm0, %ymm0
1658 ; X64-AVX2-NEXT: sete %al
1659 ; X64-AVX2-NEXT: vzeroupper
1660 ; X64-AVX2-NEXT: retq
1662 ; X64-AVX512-LABEL: length48_eq:
1663 ; X64-AVX512: # %bb.0:
1664 ; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0
1665 ; X64-AVX512-NEXT: vmovdqu 32(%rdi), %xmm1
1666 ; X64-AVX512-NEXT: vmovdqu 32(%rsi), %xmm2
1667 ; X64-AVX512-NEXT: vpxor (%rsi), %ymm0, %ymm0
1668 ; X64-AVX512-NEXT: vpxor %ymm2, %ymm1, %ymm1
1669 ; X64-AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0
1670 ; X64-AVX512-NEXT: vptest %ymm0, %ymm0
1671 ; X64-AVX512-NEXT: sete %al
1672 ; X64-AVX512-NEXT: vzeroupper
1673 ; X64-AVX512-NEXT: retq
1675 ; X64-MIC-AVX-LABEL: length48_eq:
1676 ; X64-MIC-AVX: # %bb.0:
1677 ; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0
1678 ; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %ymm1
1679 ; X64-MIC-AVX-NEXT: vmovdqu 32(%rdi), %xmm2
1680 ; X64-MIC-AVX-NEXT: vmovdqu 32(%rsi), %xmm3
1681 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm2, %k0
1682 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1
1683 ; X64-MIC-AVX-NEXT: kortestw %k0, %k1
1684 ; X64-MIC-AVX-NEXT: sete %al
1685 ; X64-MIC-AVX-NEXT: vzeroupper
1686 ; X64-MIC-AVX-NEXT: retq
1687 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind
1688 %cmp = icmp eq i32 %call, 0
1692 define i1 @length48_lt(ptr %x, ptr %y) nounwind {
1693 ; X64-LABEL: length48_lt:
1695 ; X64-NEXT: pushq %rax
1696 ; X64-NEXT: movl $48, %edx
1697 ; X64-NEXT: callq memcmp
1698 ; X64-NEXT: shrl $31, %eax
1699 ; X64-NEXT: # kill: def $al killed $al killed $eax
1700 ; X64-NEXT: popq %rcx
1702 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind
1703 %cmp = icmp slt i32 %call, 0
1707 define i1 @length48_gt(ptr %x, ptr %y) nounwind {
1708 ; X64-LABEL: length48_gt:
1710 ; X64-NEXT: pushq %rax
1711 ; X64-NEXT: movl $48, %edx
1712 ; X64-NEXT: callq memcmp
1713 ; X64-NEXT: testl %eax, %eax
1714 ; X64-NEXT: setg %al
1715 ; X64-NEXT: popq %rcx
1717 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind
1718 %cmp = icmp sgt i32 %call, 0
1722 define i1 @length48_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {
1723 ; X64-SSE2-LABEL: length48_eq_prefer128:
1724 ; X64-SSE2: # %bb.0:
1725 ; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
1726 ; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1
1727 ; X64-SSE2-NEXT: movdqu 32(%rdi), %xmm2
1728 ; X64-SSE2-NEXT: movdqu (%rsi), %xmm3
1729 ; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm3
1730 ; X64-SSE2-NEXT: movdqu 16(%rsi), %xmm0
1731 ; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
1732 ; X64-SSE2-NEXT: pand %xmm3, %xmm0
1733 ; X64-SSE2-NEXT: movdqu 32(%rsi), %xmm1
1734 ; X64-SSE2-NEXT: pcmpeqb %xmm2, %xmm1
1735 ; X64-SSE2-NEXT: pand %xmm0, %xmm1
1736 ; X64-SSE2-NEXT: pmovmskb %xmm1, %eax
1737 ; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1738 ; X64-SSE2-NEXT: sete %al
1739 ; X64-SSE2-NEXT: retq
1741 ; X64-SSE41-LABEL: length48_eq_prefer128:
1742 ; X64-SSE41: # %bb.0:
1743 ; X64-SSE41-NEXT: movdqu (%rdi), %xmm0
1744 ; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1
1745 ; X64-SSE41-NEXT: movdqu 32(%rdi), %xmm2
1746 ; X64-SSE41-NEXT: movdqu (%rsi), %xmm3
1747 ; X64-SSE41-NEXT: pxor %xmm0, %xmm3
1748 ; X64-SSE41-NEXT: movdqu 16(%rsi), %xmm0
1749 ; X64-SSE41-NEXT: pxor %xmm1, %xmm0
1750 ; X64-SSE41-NEXT: por %xmm3, %xmm0
1751 ; X64-SSE41-NEXT: movdqu 32(%rsi), %xmm1
1752 ; X64-SSE41-NEXT: pxor %xmm2, %xmm1
1753 ; X64-SSE41-NEXT: por %xmm0, %xmm1
1754 ; X64-SSE41-NEXT: ptest %xmm1, %xmm1
1755 ; X64-SSE41-NEXT: sete %al
1756 ; X64-SSE41-NEXT: retq
1758 ; X64-AVX-LABEL: length48_eq_prefer128:
1760 ; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0
1761 ; X64-AVX-NEXT: vmovdqu 16(%rdi), %xmm1
1762 ; X64-AVX-NEXT: vmovdqu 32(%rdi), %xmm2
1763 ; X64-AVX-NEXT: vpxor 16(%rsi), %xmm1, %xmm1
1764 ; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0
1765 ; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
1766 ; X64-AVX-NEXT: vpxor 32(%rsi), %xmm2, %xmm1
1767 ; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
1768 ; X64-AVX-NEXT: vptest %xmm0, %xmm0
1769 ; X64-AVX-NEXT: sete %al
1770 ; X64-AVX-NEXT: retq
1772 ; X64-MIC-AVX-LABEL: length48_eq_prefer128:
1773 ; X64-MIC-AVX: # %bb.0:
1774 ; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0
1775 ; X64-MIC-AVX-NEXT: vmovdqu 16(%rdi), %xmm1
1776 ; X64-MIC-AVX-NEXT: vmovdqu 32(%rdi), %xmm2
1777 ; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm3
1778 ; X64-MIC-AVX-NEXT: vmovdqu 16(%rsi), %xmm4
1779 ; X64-MIC-AVX-NEXT: vmovdqu 32(%rsi), %xmm5
1780 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm4, %zmm1, %k0
1781 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm0, %k1
1782 ; X64-MIC-AVX-NEXT: korw %k0, %k1, %k0
1783 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm5, %zmm2, %k1
1784 ; X64-MIC-AVX-NEXT: kortestw %k1, %k0
1785 ; X64-MIC-AVX-NEXT: sete %al
1786 ; X64-MIC-AVX-NEXT: vzeroupper
1787 ; X64-MIC-AVX-NEXT: retq
1788 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind
1789 %cmp = icmp eq i32 %call, 0
1793 define i1 @length48_eq_const(ptr %X) nounwind {
1794 ; X64-SSE2-LABEL: length48_eq_const:
1795 ; X64-SSE2: # %bb.0:
1796 ; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
1797 ; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1
1798 ; X64-SSE2-NEXT: movdqu 32(%rdi), %xmm2
1799 ; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1800 ; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1801 ; X64-SSE2-NEXT: pand %xmm1, %xmm0
1802 ; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
1803 ; X64-SSE2-NEXT: pand %xmm0, %xmm2
1804 ; X64-SSE2-NEXT: pmovmskb %xmm2, %eax
1805 ; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1806 ; X64-SSE2-NEXT: setne %al
1807 ; X64-SSE2-NEXT: retq
1809 ; X64-SSE41-LABEL: length48_eq_const:
1810 ; X64-SSE41: # %bb.0:
1811 ; X64-SSE41-NEXT: movdqu (%rdi), %xmm0
1812 ; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1
1813 ; X64-SSE41-NEXT: movdqu 32(%rdi), %xmm2
1814 ; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1815 ; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1816 ; X64-SSE41-NEXT: por %xmm1, %xmm0
1817 ; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
1818 ; X64-SSE41-NEXT: por %xmm0, %xmm2
1819 ; X64-SSE41-NEXT: ptest %xmm2, %xmm2
1820 ; X64-SSE41-NEXT: setne %al
1821 ; X64-SSE41-NEXT: retq
1823 ; X64-AVX1-LABEL: length48_eq_const:
1824 ; X64-AVX1: # %bb.0:
1825 ; X64-AVX1-NEXT: vmovups (%rdi), %ymm0
1826 ; X64-AVX1-NEXT: vmovups 32(%rdi), %xmm1
1827 ; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1828 ; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1829 ; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
1830 ; X64-AVX1-NEXT: vptest %ymm0, %ymm0
1831 ; X64-AVX1-NEXT: setne %al
1832 ; X64-AVX1-NEXT: vzeroupper
1833 ; X64-AVX1-NEXT: retq
1835 ; X64-AVX2-LABEL: length48_eq_const:
1836 ; X64-AVX2: # %bb.0:
1837 ; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
1838 ; X64-AVX2-NEXT: vmovdqu 32(%rdi), %xmm1
1839 ; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1840 ; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1841 ; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1842 ; X64-AVX2-NEXT: vptest %ymm0, %ymm0
1843 ; X64-AVX2-NEXT: setne %al
1844 ; X64-AVX2-NEXT: vzeroupper
1845 ; X64-AVX2-NEXT: retq
1847 ; X64-AVX512-LABEL: length48_eq_const:
1848 ; X64-AVX512: # %bb.0:
1849 ; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0
1850 ; X64-AVX512-NEXT: vmovdqu 32(%rdi), %xmm1
1851 ; X64-AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1852 ; X64-AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1853 ; X64-AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0
1854 ; X64-AVX512-NEXT: vptest %ymm0, %ymm0
1855 ; X64-AVX512-NEXT: setne %al
1856 ; X64-AVX512-NEXT: vzeroupper
1857 ; X64-AVX512-NEXT: retq
1859 ; X64-MIC-AVX-LABEL: length48_eq_const:
1860 ; X64-MIC-AVX: # %bb.0:
1861 ; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0
1862 ; X64-MIC-AVX-NEXT: vmovdqu 32(%rdi), %xmm1
1863 ; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,0,0,0,0]
1864 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm1, %k0
1865 ; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
1866 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1
1867 ; X64-MIC-AVX-NEXT: kortestw %k0, %k1
1868 ; X64-MIC-AVX-NEXT: setne %al
1869 ; X64-MIC-AVX-NEXT: vzeroupper
1870 ; X64-MIC-AVX-NEXT: retq
1871 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 48) nounwind
1872 %c = icmp ne i32 %m, 0
1876 define i32 @length63(ptr %X, ptr %Y) nounwind {
1877 ; X64-LABEL: length63:
1879 ; X64-NEXT: movl $63, %edx
1880 ; X64-NEXT: jmp memcmp # TAILCALL
1881 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 63) nounwind
1885 define i1 @length63_eq(ptr %x, ptr %y) nounwind {
1886 ; X64-SSE2-LABEL: length63_eq:
1887 ; X64-SSE2: # %bb.0:
1888 ; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
1889 ; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1
1890 ; X64-SSE2-NEXT: movdqu 32(%rdi), %xmm2
1891 ; X64-SSE2-NEXT: movdqu 47(%rdi), %xmm3
1892 ; X64-SSE2-NEXT: movdqu (%rsi), %xmm4
1893 ; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm4
1894 ; X64-SSE2-NEXT: movdqu 16(%rsi), %xmm0
1895 ; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
1896 ; X64-SSE2-NEXT: pand %xmm4, %xmm0
1897 ; X64-SSE2-NEXT: movdqu 32(%rsi), %xmm1
1898 ; X64-SSE2-NEXT: pcmpeqb %xmm2, %xmm1
1899 ; X64-SSE2-NEXT: movdqu 47(%rsi), %xmm2
1900 ; X64-SSE2-NEXT: pcmpeqb %xmm3, %xmm2
1901 ; X64-SSE2-NEXT: pand %xmm1, %xmm2
1902 ; X64-SSE2-NEXT: pand %xmm0, %xmm2
1903 ; X64-SSE2-NEXT: pmovmskb %xmm2, %eax
1904 ; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1905 ; X64-SSE2-NEXT: setne %al
1906 ; X64-SSE2-NEXT: retq
1908 ; X64-SSE41-LABEL: length63_eq:
1909 ; X64-SSE41: # %bb.0:
1910 ; X64-SSE41-NEXT: movdqu (%rdi), %xmm0
1911 ; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1
1912 ; X64-SSE41-NEXT: movdqu 32(%rdi), %xmm2
1913 ; X64-SSE41-NEXT: movdqu 47(%rdi), %xmm3
1914 ; X64-SSE41-NEXT: movdqu (%rsi), %xmm4
1915 ; X64-SSE41-NEXT: pxor %xmm0, %xmm4
1916 ; X64-SSE41-NEXT: movdqu 16(%rsi), %xmm0
1917 ; X64-SSE41-NEXT: pxor %xmm1, %xmm0
1918 ; X64-SSE41-NEXT: por %xmm4, %xmm0
1919 ; X64-SSE41-NEXT: movdqu 32(%rsi), %xmm1
1920 ; X64-SSE41-NEXT: pxor %xmm2, %xmm1
1921 ; X64-SSE41-NEXT: movdqu 47(%rsi), %xmm2
1922 ; X64-SSE41-NEXT: pxor %xmm3, %xmm2
1923 ; X64-SSE41-NEXT: por %xmm1, %xmm2
1924 ; X64-SSE41-NEXT: por %xmm0, %xmm2
1925 ; X64-SSE41-NEXT: ptest %xmm2, %xmm2
1926 ; X64-SSE41-NEXT: setne %al
1927 ; X64-SSE41-NEXT: retq
1929 ; X64-AVX1-LABEL: length63_eq:
1930 ; X64-AVX1: # %bb.0:
1931 ; X64-AVX1-NEXT: vmovups (%rdi), %ymm0
1932 ; X64-AVX1-NEXT: vmovups 31(%rdi), %ymm1
1933 ; X64-AVX1-NEXT: vxorps 31(%rsi), %ymm1, %ymm1
1934 ; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0
1935 ; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
1936 ; X64-AVX1-NEXT: vptest %ymm0, %ymm0
1937 ; X64-AVX1-NEXT: setne %al
1938 ; X64-AVX1-NEXT: vzeroupper
1939 ; X64-AVX1-NEXT: retq
1941 ; X64-AVX2-LABEL: length63_eq:
1942 ; X64-AVX2: # %bb.0:
1943 ; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
1944 ; X64-AVX2-NEXT: vmovdqu 31(%rdi), %ymm1
1945 ; X64-AVX2-NEXT: vpxor 31(%rsi), %ymm1, %ymm1
1946 ; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0
1947 ; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1948 ; X64-AVX2-NEXT: vptest %ymm0, %ymm0
1949 ; X64-AVX2-NEXT: setne %al
1950 ; X64-AVX2-NEXT: vzeroupper
1951 ; X64-AVX2-NEXT: retq
1953 ; X64-AVX512-LABEL: length63_eq:
1954 ; X64-AVX512: # %bb.0:
1955 ; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0
1956 ; X64-AVX512-NEXT: vmovdqu 31(%rdi), %ymm1
1957 ; X64-AVX512-NEXT: vpxor 31(%rsi), %ymm1, %ymm1
1958 ; X64-AVX512-NEXT: vpxor (%rsi), %ymm0, %ymm0
1959 ; X64-AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0
1960 ; X64-AVX512-NEXT: vptest %ymm0, %ymm0
1961 ; X64-AVX512-NEXT: setne %al
1962 ; X64-AVX512-NEXT: vzeroupper
1963 ; X64-AVX512-NEXT: retq
1965 ; X64-MIC-AVX-LABEL: length63_eq:
1966 ; X64-MIC-AVX: # %bb.0:
1967 ; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0
1968 ; X64-MIC-AVX-NEXT: vmovdqu 31(%rdi), %ymm1
1969 ; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %ymm2
1970 ; X64-MIC-AVX-NEXT: vmovdqu 31(%rsi), %ymm3
1971 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm1, %k0
1972 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm0, %k1
1973 ; X64-MIC-AVX-NEXT: kortestw %k0, %k1
1974 ; X64-MIC-AVX-NEXT: setne %al
1975 ; X64-MIC-AVX-NEXT: vzeroupper
1976 ; X64-MIC-AVX-NEXT: retq
1977 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 63) nounwind
1978 %cmp = icmp ne i32 %call, 0
1982 define i1 @length63_lt(ptr %x, ptr %y) nounwind {
1983 ; X64-LABEL: length63_lt:
1985 ; X64-NEXT: pushq %rax
1986 ; X64-NEXT: movl $63, %edx
1987 ; X64-NEXT: callq memcmp
1988 ; X64-NEXT: shrl $31, %eax
1989 ; X64-NEXT: # kill: def $al killed $al killed $eax
1990 ; X64-NEXT: popq %rcx
1992 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 63) nounwind
1993 %cmp = icmp slt i32 %call, 0
1997 define i1 @length63_gt(ptr %x, ptr %y) nounwind {
1998 ; X64-LABEL: length63_gt:
2000 ; X64-NEXT: pushq %rax
2001 ; X64-NEXT: movl $63, %edx
2002 ; X64-NEXT: callq memcmp
2003 ; X64-NEXT: testl %eax, %eax
2004 ; X64-NEXT: setg %al
2005 ; X64-NEXT: popq %rcx
2007 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 63) nounwind
2008 %cmp = icmp sgt i32 %call, 0
2012 define i1 @length63_eq_const(ptr %X) nounwind {
2013 ; X64-SSE2-LABEL: length63_eq_const:
2014 ; X64-SSE2: # %bb.0:
2015 ; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
2016 ; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1
2017 ; X64-SSE2-NEXT: movdqu 32(%rdi), %xmm2
2018 ; X64-SSE2-NEXT: movdqu 47(%rdi), %xmm3
2019 ; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2020 ; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
2021 ; X64-SSE2-NEXT: pand %xmm3, %xmm2
2022 ; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2023 ; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2024 ; X64-SSE2-NEXT: pand %xmm1, %xmm0
2025 ; X64-SSE2-NEXT: pand %xmm2, %xmm0
2026 ; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
2027 ; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
2028 ; X64-SSE2-NEXT: sete %al
2029 ; X64-SSE2-NEXT: retq
2031 ; X64-SSE41-LABEL: length63_eq_const:
2032 ; X64-SSE41: # %bb.0:
2033 ; X64-SSE41-NEXT: movdqu (%rdi), %xmm0
2034 ; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1
2035 ; X64-SSE41-NEXT: movdqu 32(%rdi), %xmm2
2036 ; X64-SSE41-NEXT: movdqu 47(%rdi), %xmm3
2037 ; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2038 ; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
2039 ; X64-SSE41-NEXT: por %xmm3, %xmm2
2040 ; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2041 ; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2042 ; X64-SSE41-NEXT: por %xmm1, %xmm0
2043 ; X64-SSE41-NEXT: por %xmm2, %xmm0
2044 ; X64-SSE41-NEXT: ptest %xmm0, %xmm0
2045 ; X64-SSE41-NEXT: sete %al
2046 ; X64-SSE41-NEXT: retq
2048 ; X64-AVX1-LABEL: length63_eq_const:
2049 ; X64-AVX1: # %bb.0:
2050 ; X64-AVX1-NEXT: vmovups (%rdi), %ymm0
2051 ; X64-AVX1-NEXT: vmovups 31(%rdi), %ymm1
2052 ; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2053 ; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2054 ; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
2055 ; X64-AVX1-NEXT: vptest %ymm0, %ymm0
2056 ; X64-AVX1-NEXT: sete %al
2057 ; X64-AVX1-NEXT: vzeroupper
2058 ; X64-AVX1-NEXT: retq
2060 ; X64-AVX2-LABEL: length63_eq_const:
2061 ; X64-AVX2: # %bb.0:
2062 ; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
2063 ; X64-AVX2-NEXT: vmovdqu 31(%rdi), %ymm1
2064 ; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2065 ; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2066 ; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
2067 ; X64-AVX2-NEXT: vptest %ymm0, %ymm0
2068 ; X64-AVX2-NEXT: sete %al
2069 ; X64-AVX2-NEXT: vzeroupper
2070 ; X64-AVX2-NEXT: retq
2072 ; X64-AVX512-LABEL: length63_eq_const:
2073 ; X64-AVX512: # %bb.0:
2074 ; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0
2075 ; X64-AVX512-NEXT: vmovdqu 31(%rdi), %ymm1
2076 ; X64-AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2077 ; X64-AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2078 ; X64-AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0
2079 ; X64-AVX512-NEXT: vptest %ymm0, %ymm0
2080 ; X64-AVX512-NEXT: sete %al
2081 ; X64-AVX512-NEXT: vzeroupper
2082 ; X64-AVX512-NEXT: retq
2084 ; X64-MIC-AVX-LABEL: length63_eq_const:
2085 ; X64-MIC-AVX: # %bb.0:
2086 ; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0
2087 ; X64-MIC-AVX-NEXT: vmovdqu 31(%rdi), %ymm1
2088 ; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm2 = [875770417,943142453,842084409,909456435,809056311,875770417,943142453,842084409]
2089 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm1, %k0
2090 ; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
2091 ; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1
2092 ; X64-MIC-AVX-NEXT: kortestw %k0, %k1
2093 ; X64-MIC-AVX-NEXT: sete %al
2094 ; X64-MIC-AVX-NEXT: vzeroupper
2095 ; X64-MIC-AVX-NEXT: retq
2096 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 63) nounwind
2097 %c = icmp eq i32 %m, 0
2101 define i32 @length64(ptr %X, ptr %Y) nounwind {
2102 ; X64-LABEL: length64:
2104 ; X64-NEXT: movl $64, %edx
2105 ; X64-NEXT: jmp memcmp # TAILCALL
2106 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 64) nounwind
2110 define i1 @length64_eq(ptr %x, ptr %y) nounwind {
2111 ; X64-SSE2-LABEL: length64_eq:
2112 ; X64-SSE2: # %bb.0:
2113 ; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
2114 ; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1
2115 ; X64-SSE2-NEXT: movdqu 32(%rdi), %xmm2
2116 ; X64-SSE2-NEXT: movdqu 48(%rdi), %xmm3
2117 ; X64-SSE2-NEXT: movdqu (%rsi), %xmm4
2118 ; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm4
2119 ; X64-SSE2-NEXT: movdqu 16(%rsi), %xmm0
2120 ; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
2121 ; X64-SSE2-NEXT: pand %xmm4, %xmm0
2122 ; X64-SSE2-NEXT: movdqu 32(%rsi), %xmm1
2123 ; X64-SSE2-NEXT: pcmpeqb %xmm2, %xmm1
2124 ; X64-SSE2-NEXT: movdqu 48(%rsi), %xmm2
2125 ; X64-SSE2-NEXT: pcmpeqb %xmm3, %xmm2
2126 ; X64-SSE2-NEXT: pand %xmm1, %xmm2
2127 ; X64-SSE2-NEXT: pand %xmm0, %xmm2
2128 ; X64-SSE2-NEXT: pmovmskb %xmm2, %eax
2129 ; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
2130 ; X64-SSE2-NEXT: setne %al
2131 ; X64-SSE2-NEXT: retq
2133 ; X64-SSE41-LABEL: length64_eq:
2134 ; X64-SSE41: # %bb.0:
2135 ; X64-SSE41-NEXT: movdqu (%rdi), %xmm0
2136 ; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1
2137 ; X64-SSE41-NEXT: movdqu 32(%rdi), %xmm2
2138 ; X64-SSE41-NEXT: movdqu 48(%rdi), %xmm3
2139 ; X64-SSE41-NEXT: movdqu (%rsi), %xmm4
2140 ; X64-SSE41-NEXT: pxor %xmm0, %xmm4
2141 ; X64-SSE41-NEXT: movdqu 16(%rsi), %xmm0
2142 ; X64-SSE41-NEXT: pxor %xmm1, %xmm0
2143 ; X64-SSE41-NEXT: por %xmm4, %xmm0
2144 ; X64-SSE41-NEXT: movdqu 32(%rsi), %xmm1
2145 ; X64-SSE41-NEXT: pxor %xmm2, %xmm1
2146 ; X64-SSE41-NEXT: movdqu 48(%rsi), %xmm2
2147 ; X64-SSE41-NEXT: pxor %xmm3, %xmm2
2148 ; X64-SSE41-NEXT: por %xmm1, %xmm2
2149 ; X64-SSE41-NEXT: por %xmm0, %xmm2
2150 ; X64-SSE41-NEXT: ptest %xmm2, %xmm2
2151 ; X64-SSE41-NEXT: setne %al
2152 ; X64-SSE41-NEXT: retq
2154 ; X64-AVX1-LABEL: length64_eq:
2155 ; X64-AVX1: # %bb.0:
2156 ; X64-AVX1-NEXT: vmovups (%rdi), %ymm0
2157 ; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm1
2158 ; X64-AVX1-NEXT: vxorps 32(%rsi), %ymm1, %ymm1
2159 ; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0
2160 ; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
2161 ; X64-AVX1-NEXT: vptest %ymm0, %ymm0
2162 ; X64-AVX1-NEXT: setne %al
2163 ; X64-AVX1-NEXT: vzeroupper
2164 ; X64-AVX1-NEXT: retq
2166 ; X64-AVX2-LABEL: length64_eq:
2167 ; X64-AVX2: # %bb.0:
2168 ; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
2169 ; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
2170 ; X64-AVX2-NEXT: vpxor 32(%rsi), %ymm1, %ymm1
2171 ; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0
2172 ; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
2173 ; X64-AVX2-NEXT: vptest %ymm0, %ymm0
2174 ; X64-AVX2-NEXT: setne %al
2175 ; X64-AVX2-NEXT: vzeroupper
2176 ; X64-AVX2-NEXT: retq
2178 ; X64-AVX512-LABEL: length64_eq:
2179 ; X64-AVX512: # %bb.0:
2180 ; X64-AVX512-NEXT: vmovdqu64 (%rdi), %zmm0
2181 ; X64-AVX512-NEXT: vpcmpneqd (%rsi), %zmm0, %k0
2182 ; X64-AVX512-NEXT: kortestw %k0, %k0
2183 ; X64-AVX512-NEXT: setne %al
2184 ; X64-AVX512-NEXT: vzeroupper
2185 ; X64-AVX512-NEXT: retq
2187 ; X64-MIC-AVX2-LABEL: length64_eq:
2188 ; X64-MIC-AVX2: # %bb.0:
2189 ; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm0
2190 ; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
2191 ; X64-MIC-AVX2-NEXT: vmovdqu (%rsi), %ymm2
2192 ; X64-MIC-AVX2-NEXT: vmovdqu 32(%rsi), %ymm3
2193 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm3, %zmm1, %k0
2194 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm2, %zmm0, %k1
2195 ; X64-MIC-AVX2-NEXT: kortestw %k0, %k1
2196 ; X64-MIC-AVX2-NEXT: setne %al
2197 ; X64-MIC-AVX2-NEXT: vzeroupper
2198 ; X64-MIC-AVX2-NEXT: retq
2200 ; X64-MIC-AVX512F-LABEL: length64_eq:
2201 ; X64-MIC-AVX512F: # %bb.0:
2202 ; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
2203 ; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k0
2204 ; X64-MIC-AVX512F-NEXT: kortestw %k0, %k0
2205 ; X64-MIC-AVX512F-NEXT: setne %al
2206 ; X64-MIC-AVX512F-NEXT: vzeroupper
2207 ; X64-MIC-AVX512F-NEXT: retq
2208 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 64) nounwind
2209 %cmp = icmp ne i32 %call, 0
2213 define i1 @length64_lt(ptr %x, ptr %y) nounwind {
2214 ; X64-LABEL: length64_lt:
2216 ; X64-NEXT: pushq %rax
2217 ; X64-NEXT: movl $64, %edx
2218 ; X64-NEXT: callq memcmp
2219 ; X64-NEXT: shrl $31, %eax
2220 ; X64-NEXT: # kill: def $al killed $al killed $eax
2221 ; X64-NEXT: popq %rcx
2223 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 64) nounwind
2224 %cmp = icmp slt i32 %call, 0
2228 define i1 @length64_gt(ptr %x, ptr %y) nounwind {
2229 ; X64-LABEL: length64_gt:
2231 ; X64-NEXT: pushq %rax
2232 ; X64-NEXT: movl $64, %edx
2233 ; X64-NEXT: callq memcmp
2234 ; X64-NEXT: testl %eax, %eax
2235 ; X64-NEXT: setg %al
2236 ; X64-NEXT: popq %rcx
2238 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 64) nounwind
2239 %cmp = icmp sgt i32 %call, 0
2243 define i1 @length64_eq_const(ptr %X) nounwind {
2244 ; X64-SSE2-LABEL: length64_eq_const:
2245 ; X64-SSE2: # %bb.0:
2246 ; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
2247 ; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1
2248 ; X64-SSE2-NEXT: movdqu 32(%rdi), %xmm2
2249 ; X64-SSE2-NEXT: movdqu 48(%rdi), %xmm3
2250 ; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2251 ; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
2252 ; X64-SSE2-NEXT: pand %xmm3, %xmm2
2253 ; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2254 ; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2255 ; X64-SSE2-NEXT: pand %xmm1, %xmm0
2256 ; X64-SSE2-NEXT: pand %xmm2, %xmm0
2257 ; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
2258 ; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
2259 ; X64-SSE2-NEXT: sete %al
2260 ; X64-SSE2-NEXT: retq
2262 ; X64-SSE41-LABEL: length64_eq_const:
2263 ; X64-SSE41: # %bb.0:
2264 ; X64-SSE41-NEXT: movdqu (%rdi), %xmm0
2265 ; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1
2266 ; X64-SSE41-NEXT: movdqu 32(%rdi), %xmm2
2267 ; X64-SSE41-NEXT: movdqu 48(%rdi), %xmm3
2268 ; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2269 ; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
2270 ; X64-SSE41-NEXT: por %xmm3, %xmm2
2271 ; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2272 ; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2273 ; X64-SSE41-NEXT: por %xmm1, %xmm0
2274 ; X64-SSE41-NEXT: por %xmm2, %xmm0
2275 ; X64-SSE41-NEXT: ptest %xmm0, %xmm0
2276 ; X64-SSE41-NEXT: sete %al
2277 ; X64-SSE41-NEXT: retq
2279 ; X64-AVX1-LABEL: length64_eq_const:
2280 ; X64-AVX1: # %bb.0:
2281 ; X64-AVX1-NEXT: vmovups (%rdi), %ymm0
2282 ; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm1
2283 ; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2284 ; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2285 ; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
2286 ; X64-AVX1-NEXT: vptest %ymm0, %ymm0
2287 ; X64-AVX1-NEXT: sete %al
2288 ; X64-AVX1-NEXT: vzeroupper
2289 ; X64-AVX1-NEXT: retq
2291 ; X64-AVX2-LABEL: length64_eq_const:
2292 ; X64-AVX2: # %bb.0:
2293 ; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
2294 ; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
2295 ; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2296 ; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2297 ; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
2298 ; X64-AVX2-NEXT: vptest %ymm0, %ymm0
2299 ; X64-AVX2-NEXT: sete %al
2300 ; X64-AVX2-NEXT: vzeroupper
2301 ; X64-AVX2-NEXT: retq
2303 ; X64-AVX512-LABEL: length64_eq_const:
2304 ; X64-AVX512: # %bb.0:
2305 ; X64-AVX512-NEXT: vmovdqu64 (%rdi), %zmm0
2306 ; X64-AVX512-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k0
2307 ; X64-AVX512-NEXT: kortestw %k0, %k0
2308 ; X64-AVX512-NEXT: sete %al
2309 ; X64-AVX512-NEXT: vzeroupper
2310 ; X64-AVX512-NEXT: retq
2312 ; X64-MIC-AVX2-LABEL: length64_eq_const:
2313 ; X64-MIC-AVX2: # %bb.0:
2314 ; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm0
2315 ; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
2316 ; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408]
2317 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm2, %zmm1, %k0
2318 ; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
2319 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm1, %zmm0, %k1
2320 ; X64-MIC-AVX2-NEXT: kortestw %k0, %k1
2321 ; X64-MIC-AVX2-NEXT: sete %al
2322 ; X64-MIC-AVX2-NEXT: vzeroupper
2323 ; X64-MIC-AVX2-NEXT: retq
2325 ; X64-MIC-AVX512F-LABEL: length64_eq_const:
2326 ; X64-MIC-AVX512F: # %bb.0:
2327 ; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
2328 ; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k0
2329 ; X64-MIC-AVX512F-NEXT: kortestw %k0, %k0
2330 ; X64-MIC-AVX512F-NEXT: sete %al
2331 ; X64-MIC-AVX512F-NEXT: vzeroupper
2332 ; X64-MIC-AVX512F-NEXT: retq
2333 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 64) nounwind
2334 %c = icmp eq i32 %m, 0
2338 define i32 @length96(ptr %X, ptr %Y) nounwind {
2339 ; X64-LABEL: length96:
2341 ; X64-NEXT: movl $96, %edx
2342 ; X64-NEXT: jmp memcmp # TAILCALL
2343 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 96) nounwind
2347 define i1 @length96_eq(ptr %x, ptr %y) nounwind {
2348 ; X64-SSE-LABEL: length96_eq:
2350 ; X64-SSE-NEXT: pushq %rax
2351 ; X64-SSE-NEXT: movl $96, %edx
2352 ; X64-SSE-NEXT: callq memcmp
2353 ; X64-SSE-NEXT: testl %eax, %eax
2354 ; X64-SSE-NEXT: setne %al
2355 ; X64-SSE-NEXT: popq %rcx
2356 ; X64-SSE-NEXT: retq
2358 ; X64-AVX1-LABEL: length96_eq:
2359 ; X64-AVX1: # %bb.0:
2360 ; X64-AVX1-NEXT: vmovups (%rdi), %ymm0
2361 ; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm1
2362 ; X64-AVX1-NEXT: vmovups 64(%rdi), %ymm2
2363 ; X64-AVX1-NEXT: vxorps 32(%rsi), %ymm1, %ymm1
2364 ; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0
2365 ; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
2366 ; X64-AVX1-NEXT: vxorps 64(%rsi), %ymm2, %ymm1
2367 ; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
2368 ; X64-AVX1-NEXT: vptest %ymm0, %ymm0
2369 ; X64-AVX1-NEXT: setne %al
2370 ; X64-AVX1-NEXT: vzeroupper
2371 ; X64-AVX1-NEXT: retq
2373 ; X64-AVX2-LABEL: length96_eq:
2374 ; X64-AVX2: # %bb.0:
2375 ; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
2376 ; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
2377 ; X64-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2
2378 ; X64-AVX2-NEXT: vpxor 32(%rsi), %ymm1, %ymm1
2379 ; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0
2380 ; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
2381 ; X64-AVX2-NEXT: vpxor 64(%rsi), %ymm2, %ymm1
2382 ; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
2383 ; X64-AVX2-NEXT: vptest %ymm0, %ymm0
2384 ; X64-AVX2-NEXT: setne %al
2385 ; X64-AVX2-NEXT: vzeroupper
2386 ; X64-AVX2-NEXT: retq
2388 ; X64-AVX512BW-LABEL: length96_eq:
2389 ; X64-AVX512BW: # %bb.0:
2390 ; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0
2391 ; X64-AVX512BW-NEXT: vmovdqu 64(%rdi), %ymm1
2392 ; X64-AVX512BW-NEXT: vmovdqu 64(%rsi), %ymm2
2393 ; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k0
2394 ; X64-AVX512BW-NEXT: vpcmpneqb %zmm2, %zmm1, %k1
2395 ; X64-AVX512BW-NEXT: kortestq %k1, %k0
2396 ; X64-AVX512BW-NEXT: setne %al
2397 ; X64-AVX512BW-NEXT: vzeroupper
2398 ; X64-AVX512BW-NEXT: retq
2400 ; X64-AVX512F-LABEL: length96_eq:
2401 ; X64-AVX512F: # %bb.0:
2402 ; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
2403 ; X64-AVX512F-NEXT: vmovdqu 64(%rdi), %ymm1
2404 ; X64-AVX512F-NEXT: vmovdqu 64(%rsi), %ymm2
2405 ; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k0
2406 ; X64-AVX512F-NEXT: vpcmpneqd %zmm2, %zmm1, %k1
2407 ; X64-AVX512F-NEXT: kortestw %k1, %k0
2408 ; X64-AVX512F-NEXT: setne %al
2409 ; X64-AVX512F-NEXT: vzeroupper
2410 ; X64-AVX512F-NEXT: retq
2412 ; X64-MIC-AVX2-LABEL: length96_eq:
2413 ; X64-MIC-AVX2: # %bb.0:
2414 ; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm0
2415 ; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
2416 ; X64-MIC-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2
2417 ; X64-MIC-AVX2-NEXT: vmovdqu (%rsi), %ymm3
2418 ; X64-MIC-AVX2-NEXT: vmovdqu 32(%rsi), %ymm4
2419 ; X64-MIC-AVX2-NEXT: vmovdqu 64(%rsi), %ymm5
2420 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm4, %zmm1, %k0
2421 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm3, %zmm0, %k1
2422 ; X64-MIC-AVX2-NEXT: korw %k0, %k1, %k0
2423 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm5, %zmm2, %k1
2424 ; X64-MIC-AVX2-NEXT: kortestw %k1, %k0
2425 ; X64-MIC-AVX2-NEXT: setne %al
2426 ; X64-MIC-AVX2-NEXT: vzeroupper
2427 ; X64-MIC-AVX2-NEXT: retq
2429 ; X64-MIC-AVX512F-LABEL: length96_eq:
2430 ; X64-MIC-AVX512F: # %bb.0:
2431 ; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
2432 ; X64-MIC-AVX512F-NEXT: vmovdqu 64(%rdi), %ymm1
2433 ; X64-MIC-AVX512F-NEXT: vmovdqu 64(%rsi), %ymm2
2434 ; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k0
2435 ; X64-MIC-AVX512F-NEXT: vpcmpneqd %zmm2, %zmm1, %k1
2436 ; X64-MIC-AVX512F-NEXT: kortestw %k1, %k0
2437 ; X64-MIC-AVX512F-NEXT: setne %al
2438 ; X64-MIC-AVX512F-NEXT: vzeroupper
2439 ; X64-MIC-AVX512F-NEXT: retq
2440 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 96) nounwind
2441 %cmp = icmp ne i32 %call, 0
2445 define i1 @length96_lt(ptr %x, ptr %y) nounwind {
2446 ; X64-LABEL: length96_lt:
2448 ; X64-NEXT: pushq %rax
2449 ; X64-NEXT: movl $96, %edx
2450 ; X64-NEXT: callq memcmp
2451 ; X64-NEXT: shrl $31, %eax
2452 ; X64-NEXT: # kill: def $al killed $al killed $eax
2453 ; X64-NEXT: popq %rcx
2455 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 96) nounwind
2456 %cmp = icmp slt i32 %call, 0
2460 define i1 @length96_gt(ptr %x, ptr %y) nounwind {
2461 ; X64-LABEL: length96_gt:
2463 ; X64-NEXT: pushq %rax
2464 ; X64-NEXT: movl $96, %edx
2465 ; X64-NEXT: callq memcmp
2466 ; X64-NEXT: testl %eax, %eax
2467 ; X64-NEXT: setg %al
2468 ; X64-NEXT: popq %rcx
2470 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 96) nounwind
2471 %cmp = icmp sgt i32 %call, 0
2475 define i1 @length96_eq_const(ptr %X) nounwind {
2476 ; X64-SSE-LABEL: length96_eq_const:
2478 ; X64-SSE-NEXT: pushq %rax
2479 ; X64-SSE-NEXT: movl $.L.str, %esi
2480 ; X64-SSE-NEXT: movl $96, %edx
2481 ; X64-SSE-NEXT: callq memcmp
2482 ; X64-SSE-NEXT: testl %eax, %eax
2483 ; X64-SSE-NEXT: sete %al
2484 ; X64-SSE-NEXT: popq %rcx
2485 ; X64-SSE-NEXT: retq
2487 ; X64-AVX1-LABEL: length96_eq_const:
2488 ; X64-AVX1: # %bb.0:
2489 ; X64-AVX1-NEXT: vmovups (%rdi), %ymm0
2490 ; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm1
2491 ; X64-AVX1-NEXT: vmovups 64(%rdi), %ymm2
2492 ; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2493 ; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2494 ; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
2495 ; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm1
2496 ; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
2497 ; X64-AVX1-NEXT: vptest %ymm0, %ymm0
2498 ; X64-AVX1-NEXT: sete %al
2499 ; X64-AVX1-NEXT: vzeroupper
2500 ; X64-AVX1-NEXT: retq
2502 ; X64-AVX2-LABEL: length96_eq_const:
2503 ; X64-AVX2: # %bb.0:
2504 ; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
2505 ; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
2506 ; X64-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2
2507 ; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2508 ; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2509 ; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
2510 ; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm1
2511 ; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
2512 ; X64-AVX2-NEXT: vptest %ymm0, %ymm0
2513 ; X64-AVX2-NEXT: sete %al
2514 ; X64-AVX2-NEXT: vzeroupper
2515 ; X64-AVX2-NEXT: retq
2517 ; X64-AVX512BW-LABEL: length96_eq_const:
2518 ; X64-AVX512BW: # %bb.0:
2519 ; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0
2520 ; X64-AVX512BW-NEXT: vmovdqu 64(%rdi), %ymm1
2521 ; X64-AVX512BW-NEXT: vpcmpneqb .L.str(%rip), %zmm0, %k0
2522 ; X64-AVX512BW-NEXT: vpcmpneqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k1
2523 ; X64-AVX512BW-NEXT: kortestq %k1, %k0
2524 ; X64-AVX512BW-NEXT: sete %al
2525 ; X64-AVX512BW-NEXT: vzeroupper
2526 ; X64-AVX512BW-NEXT: retq
2528 ; X64-AVX512F-LABEL: length96_eq_const:
2529 ; X64-AVX512F: # %bb.0:
2530 ; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
2531 ; X64-AVX512F-NEXT: vmovdqu 64(%rdi), %ymm1
2532 ; X64-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k0
2533 ; X64-AVX512F-NEXT: vpcmpneqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k1
2534 ; X64-AVX512F-NEXT: kortestw %k1, %k0
2535 ; X64-AVX512F-NEXT: sete %al
2536 ; X64-AVX512F-NEXT: vzeroupper
2537 ; X64-AVX512F-NEXT: retq
2539 ; X64-MIC-AVX2-LABEL: length96_eq_const:
2540 ; X64-MIC-AVX2: # %bb.0:
2541 ; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm0
2542 ; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
2543 ; X64-MIC-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2
2544 ; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408]
2545 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm3, %zmm1, %k0
2546 ; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
2547 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm1, %zmm0, %k1
2548 ; X64-MIC-AVX2-NEXT: korw %k0, %k1, %k0
2549 ; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm0 = [926299444,825243960,892613426,959985462,858927408,926299444,825243960,892613426]
2550 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm0, %zmm2, %k1
2551 ; X64-MIC-AVX2-NEXT: kortestw %k1, %k0
2552 ; X64-MIC-AVX2-NEXT: sete %al
2553 ; X64-MIC-AVX2-NEXT: vzeroupper
2554 ; X64-MIC-AVX2-NEXT: retq
2556 ; X64-MIC-AVX512F-LABEL: length96_eq_const:
2557 ; X64-MIC-AVX512F: # %bb.0:
2558 ; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
2559 ; X64-MIC-AVX512F-NEXT: vmovdqu 64(%rdi), %ymm1
2560 ; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k0
2561 ; X64-MIC-AVX512F-NEXT: vpcmpneqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k1
2562 ; X64-MIC-AVX512F-NEXT: kortestw %k1, %k0
2563 ; X64-MIC-AVX512F-NEXT: sete %al
2564 ; X64-MIC-AVX512F-NEXT: vzeroupper
2565 ; X64-MIC-AVX512F-NEXT: retq
2566 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 96) nounwind
2567 %c = icmp eq i32 %m, 0
2571 define i32 @length127(ptr %X, ptr %Y) nounwind {
2572 ; X64-LABEL: length127:
2574 ; X64-NEXT: movl $127, %edx
2575 ; X64-NEXT: jmp memcmp # TAILCALL
2576 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 127) nounwind
2580 define i1 @length127_eq(ptr %x, ptr %y) nounwind {
2581 ; X64-SSE-LABEL: length127_eq:
2583 ; X64-SSE-NEXT: pushq %rax
2584 ; X64-SSE-NEXT: movl $127, %edx
2585 ; X64-SSE-NEXT: callq memcmp
2586 ; X64-SSE-NEXT: testl %eax, %eax
2587 ; X64-SSE-NEXT: setne %al
2588 ; X64-SSE-NEXT: popq %rcx
2589 ; X64-SSE-NEXT: retq
2591 ; X64-AVX1-LABEL: length127_eq:
2592 ; X64-AVX1: # %bb.0:
2593 ; X64-AVX1-NEXT: vmovups (%rdi), %ymm0
2594 ; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm1
2595 ; X64-AVX1-NEXT: vmovups 64(%rdi), %ymm2
2596 ; X64-AVX1-NEXT: vmovups 95(%rdi), %ymm3
2597 ; X64-AVX1-NEXT: vxorps 95(%rsi), %ymm3, %ymm3
2598 ; X64-AVX1-NEXT: vxorps 64(%rsi), %ymm2, %ymm2
2599 ; X64-AVX1-NEXT: vorps %ymm3, %ymm2, %ymm2
2600 ; X64-AVX1-NEXT: vxorps 32(%rsi), %ymm1, %ymm1
2601 ; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0
2602 ; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
2603 ; X64-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
2604 ; X64-AVX1-NEXT: vptest %ymm0, %ymm0
2605 ; X64-AVX1-NEXT: setne %al
2606 ; X64-AVX1-NEXT: vzeroupper
2607 ; X64-AVX1-NEXT: retq
2609 ; X64-AVX2-LABEL: length127_eq:
2610 ; X64-AVX2: # %bb.0:
2611 ; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
2612 ; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
2613 ; X64-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2
2614 ; X64-AVX2-NEXT: vmovdqu 95(%rdi), %ymm3
2615 ; X64-AVX2-NEXT: vpxor 95(%rsi), %ymm3, %ymm3
2616 ; X64-AVX2-NEXT: vpxor 64(%rsi), %ymm2, %ymm2
2617 ; X64-AVX2-NEXT: vpor %ymm3, %ymm2, %ymm2
2618 ; X64-AVX2-NEXT: vpxor 32(%rsi), %ymm1, %ymm1
2619 ; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0
2620 ; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
2621 ; X64-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
2622 ; X64-AVX2-NEXT: vptest %ymm0, %ymm0
2623 ; X64-AVX2-NEXT: setne %al
2624 ; X64-AVX2-NEXT: vzeroupper
2625 ; X64-AVX2-NEXT: retq
2627 ; X64-AVX512BW-LABEL: length127_eq:
2628 ; X64-AVX512BW: # %bb.0:
2629 ; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0
2630 ; X64-AVX512BW-NEXT: vmovdqu64 63(%rdi), %zmm1
2631 ; X64-AVX512BW-NEXT: vpcmpneqb 63(%rsi), %zmm1, %k0
2632 ; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k1
2633 ; X64-AVX512BW-NEXT: kortestq %k0, %k1
2634 ; X64-AVX512BW-NEXT: setne %al
2635 ; X64-AVX512BW-NEXT: vzeroupper
2636 ; X64-AVX512BW-NEXT: retq
2638 ; X64-AVX512F-LABEL: length127_eq:
2639 ; X64-AVX512F: # %bb.0:
2640 ; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
2641 ; X64-AVX512F-NEXT: vmovdqu64 63(%rdi), %zmm1
2642 ; X64-AVX512F-NEXT: vpcmpneqd 63(%rsi), %zmm1, %k0
2643 ; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1
2644 ; X64-AVX512F-NEXT: kortestw %k0, %k1
2645 ; X64-AVX512F-NEXT: setne %al
2646 ; X64-AVX512F-NEXT: vzeroupper
2647 ; X64-AVX512F-NEXT: retq
2649 ; X64-MIC-AVX2-LABEL: length127_eq:
2650 ; X64-MIC-AVX2: # %bb.0:
2651 ; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm0
2652 ; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
2653 ; X64-MIC-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2
2654 ; X64-MIC-AVX2-NEXT: vmovdqu 95(%rdi), %ymm3
2655 ; X64-MIC-AVX2-NEXT: vmovdqu (%rsi), %ymm4
2656 ; X64-MIC-AVX2-NEXT: vmovdqu 32(%rsi), %ymm5
2657 ; X64-MIC-AVX2-NEXT: vmovdqu 64(%rsi), %ymm6
2658 ; X64-MIC-AVX2-NEXT: vmovdqu 95(%rsi), %ymm7
2659 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm7, %zmm3, %k0
2660 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm6, %zmm2, %k1
2661 ; X64-MIC-AVX2-NEXT: korw %k0, %k1, %k0
2662 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm5, %zmm1, %k1
2663 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm4, %zmm0, %k2
2664 ; X64-MIC-AVX2-NEXT: korw %k1, %k2, %k1
2665 ; X64-MIC-AVX2-NEXT: kortestw %k0, %k1
2666 ; X64-MIC-AVX2-NEXT: setne %al
2667 ; X64-MIC-AVX2-NEXT: vzeroupper
2668 ; X64-MIC-AVX2-NEXT: retq
2670 ; X64-MIC-AVX512F-LABEL: length127_eq:
2671 ; X64-MIC-AVX512F: # %bb.0:
2672 ; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
2673 ; X64-MIC-AVX512F-NEXT: vmovdqu64 63(%rdi), %zmm1
2674 ; X64-MIC-AVX512F-NEXT: vpcmpneqd 63(%rsi), %zmm1, %k0
2675 ; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1
2676 ; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1
2677 ; X64-MIC-AVX512F-NEXT: setne %al
2678 ; X64-MIC-AVX512F-NEXT: vzeroupper
2679 ; X64-MIC-AVX512F-NEXT: retq
2680 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 127) nounwind
2681 %cmp = icmp ne i32 %call, 0
2685 define i1 @length127_lt(ptr %x, ptr %y) nounwind {
2686 ; X64-LABEL: length127_lt:
2688 ; X64-NEXT: pushq %rax
2689 ; X64-NEXT: movl $127, %edx
2690 ; X64-NEXT: callq memcmp
2691 ; X64-NEXT: shrl $31, %eax
2692 ; X64-NEXT: # kill: def $al killed $al killed $eax
2693 ; X64-NEXT: popq %rcx
2695 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 127) nounwind
2696 %cmp = icmp slt i32 %call, 0
2700 define i1 @length127_gt(ptr %x, ptr %y) nounwind {
2701 ; X64-LABEL: length127_gt:
2703 ; X64-NEXT: pushq %rax
2704 ; X64-NEXT: movl $127, %edx
2705 ; X64-NEXT: callq memcmp
2706 ; X64-NEXT: testl %eax, %eax
2707 ; X64-NEXT: setg %al
2708 ; X64-NEXT: popq %rcx
2710 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 127) nounwind
2711 %cmp = icmp sgt i32 %call, 0
2715 define i1 @length127_eq_const(ptr %X) nounwind {
2716 ; X64-SSE-LABEL: length127_eq_const:
2718 ; X64-SSE-NEXT: pushq %rax
2719 ; X64-SSE-NEXT: movl $.L.str, %esi
2720 ; X64-SSE-NEXT: movl $127, %edx
2721 ; X64-SSE-NEXT: callq memcmp
2722 ; X64-SSE-NEXT: testl %eax, %eax
2723 ; X64-SSE-NEXT: sete %al
2724 ; X64-SSE-NEXT: popq %rcx
2725 ; X64-SSE-NEXT: retq
2727 ; X64-AVX1-LABEL: length127_eq_const:
2728 ; X64-AVX1: # %bb.0:
2729 ; X64-AVX1-NEXT: vmovups (%rdi), %ymm0
2730 ; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm1
2731 ; X64-AVX1-NEXT: vmovups 64(%rdi), %ymm2
2732 ; X64-AVX1-NEXT: vmovups 95(%rdi), %ymm3
2733 ; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
2734 ; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
2735 ; X64-AVX1-NEXT: vorps %ymm3, %ymm2, %ymm2
2736 ; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2737 ; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2738 ; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
2739 ; X64-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
2740 ; X64-AVX1-NEXT: vptest %ymm0, %ymm0
2741 ; X64-AVX1-NEXT: sete %al
2742 ; X64-AVX1-NEXT: vzeroupper
2743 ; X64-AVX1-NEXT: retq
2745 ; X64-AVX2-LABEL: length127_eq_const:
2746 ; X64-AVX2: # %bb.0:
2747 ; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
2748 ; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
2749 ; X64-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2
2750 ; X64-AVX2-NEXT: vmovdqu 95(%rdi), %ymm3
2751 ; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
2752 ; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
2753 ; X64-AVX2-NEXT: vpor %ymm3, %ymm2, %ymm2
2754 ; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2755 ; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2756 ; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
2757 ; X64-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
2758 ; X64-AVX2-NEXT: vptest %ymm0, %ymm0
2759 ; X64-AVX2-NEXT: sete %al
2760 ; X64-AVX2-NEXT: vzeroupper
2761 ; X64-AVX2-NEXT: retq
2763 ; X64-AVX512BW-LABEL: length127_eq_const:
2764 ; X64-AVX512BW: # %bb.0:
2765 ; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0
2766 ; X64-AVX512BW-NEXT: vmovdqu64 63(%rdi), %zmm1
2767 ; X64-AVX512BW-NEXT: vpcmpneqb .L.str+63(%rip), %zmm1, %k0
2768 ; X64-AVX512BW-NEXT: vpcmpneqb .L.str(%rip), %zmm0, %k1
2769 ; X64-AVX512BW-NEXT: kortestq %k0, %k1
2770 ; X64-AVX512BW-NEXT: sete %al
2771 ; X64-AVX512BW-NEXT: vzeroupper
2772 ; X64-AVX512BW-NEXT: retq
2774 ; X64-AVX512F-LABEL: length127_eq_const:
2775 ; X64-AVX512F: # %bb.0:
2776 ; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
2777 ; X64-AVX512F-NEXT: vmovdqu64 63(%rdi), %zmm1
2778 ; X64-AVX512F-NEXT: vpcmpneqd .L.str+63(%rip), %zmm1, %k0
2779 ; X64-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k1
2780 ; X64-AVX512F-NEXT: kortestw %k0, %k1
2781 ; X64-AVX512F-NEXT: sete %al
2782 ; X64-AVX512F-NEXT: vzeroupper
2783 ; X64-AVX512F-NEXT: retq
2785 ; X64-MIC-AVX2-LABEL: length127_eq_const:
2786 ; X64-MIC-AVX2: # %bb.0:
2787 ; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm0
2788 ; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
2789 ; X64-MIC-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2
2790 ; X64-MIC-AVX2-NEXT: vmovdqu 95(%rdi), %ymm3
2791 ; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm4 = [943142453,842084409,909456435,809056311,875770417,943142453,842084409,909456435]
2792 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm4, %zmm3, %k0
2793 ; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [926299444,825243960,892613426,959985462,858927408,926299444,825243960,892613426]
2794 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm3, %zmm2, %k1
2795 ; X64-MIC-AVX2-NEXT: korw %k0, %k1, %k0
2796 ; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408]
2797 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm2, %zmm1, %k1
2798 ; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
2799 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm1, %zmm0, %k2
2800 ; X64-MIC-AVX2-NEXT: korw %k1, %k2, %k1
2801 ; X64-MIC-AVX2-NEXT: kortestw %k0, %k1
2802 ; X64-MIC-AVX2-NEXT: sete %al
2803 ; X64-MIC-AVX2-NEXT: vzeroupper
2804 ; X64-MIC-AVX2-NEXT: retq
2806 ; X64-MIC-AVX512F-LABEL: length127_eq_const:
2807 ; X64-MIC-AVX512F: # %bb.0:
2808 ; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
2809 ; X64-MIC-AVX512F-NEXT: vmovdqu64 63(%rdi), %zmm1
2810 ; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+63(%rip), %zmm1, %k0
2811 ; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k1
2812 ; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1
2813 ; X64-MIC-AVX512F-NEXT: sete %al
2814 ; X64-MIC-AVX512F-NEXT: vzeroupper
2815 ; X64-MIC-AVX512F-NEXT: retq
2816 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 127) nounwind
2817 %c = icmp eq i32 %m, 0
2821 define i32 @length128(ptr %X, ptr %Y) nounwind {
2822 ; X64-LABEL: length128:
2824 ; X64-NEXT: movl $128, %edx
2825 ; X64-NEXT: jmp memcmp # TAILCALL
2826 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 128) nounwind
2830 define i1 @length128_eq(ptr %x, ptr %y) nounwind {
2831 ; X64-SSE-LABEL: length128_eq:
2833 ; X64-SSE-NEXT: pushq %rax
2834 ; X64-SSE-NEXT: movl $128, %edx
2835 ; X64-SSE-NEXT: callq memcmp
2836 ; X64-SSE-NEXT: testl %eax, %eax
2837 ; X64-SSE-NEXT: setne %al
2838 ; X64-SSE-NEXT: popq %rcx
2839 ; X64-SSE-NEXT: retq
2841 ; X64-AVX1-LABEL: length128_eq:
2842 ; X64-AVX1: # %bb.0:
2843 ; X64-AVX1-NEXT: vmovups (%rdi), %ymm0
2844 ; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm1
2845 ; X64-AVX1-NEXT: vmovups 64(%rdi), %ymm2
2846 ; X64-AVX1-NEXT: vmovups 96(%rdi), %ymm3
2847 ; X64-AVX1-NEXT: vxorps 96(%rsi), %ymm3, %ymm3
2848 ; X64-AVX1-NEXT: vxorps 64(%rsi), %ymm2, %ymm2
2849 ; X64-AVX1-NEXT: vorps %ymm3, %ymm2, %ymm2
2850 ; X64-AVX1-NEXT: vxorps 32(%rsi), %ymm1, %ymm1
2851 ; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0
2852 ; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
2853 ; X64-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
2854 ; X64-AVX1-NEXT: vptest %ymm0, %ymm0
2855 ; X64-AVX1-NEXT: setne %al
2856 ; X64-AVX1-NEXT: vzeroupper
2857 ; X64-AVX1-NEXT: retq
2859 ; X64-AVX2-LABEL: length128_eq:
2860 ; X64-AVX2: # %bb.0:
2861 ; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
2862 ; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
2863 ; X64-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2
2864 ; X64-AVX2-NEXT: vmovdqu 96(%rdi), %ymm3
2865 ; X64-AVX2-NEXT: vpxor 96(%rsi), %ymm3, %ymm3
2866 ; X64-AVX2-NEXT: vpxor 64(%rsi), %ymm2, %ymm2
2867 ; X64-AVX2-NEXT: vpor %ymm3, %ymm2, %ymm2
2868 ; X64-AVX2-NEXT: vpxor 32(%rsi), %ymm1, %ymm1
2869 ; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0
2870 ; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
2871 ; X64-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
2872 ; X64-AVX2-NEXT: vptest %ymm0, %ymm0
2873 ; X64-AVX2-NEXT: setne %al
2874 ; X64-AVX2-NEXT: vzeroupper
2875 ; X64-AVX2-NEXT: retq
2877 ; X64-AVX512BW-LABEL: length128_eq:
2878 ; X64-AVX512BW: # %bb.0:
2879 ; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0
2880 ; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1
2881 ; X64-AVX512BW-NEXT: vpcmpneqb 64(%rsi), %zmm1, %k0
2882 ; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k1
2883 ; X64-AVX512BW-NEXT: kortestq %k0, %k1
2884 ; X64-AVX512BW-NEXT: setne %al
2885 ; X64-AVX512BW-NEXT: vzeroupper
2886 ; X64-AVX512BW-NEXT: retq
2888 ; X64-AVX512F-LABEL: length128_eq:
2889 ; X64-AVX512F: # %bb.0:
2890 ; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
2891 ; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1
2892 ; X64-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k0
2893 ; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1
2894 ; X64-AVX512F-NEXT: kortestw %k0, %k1
2895 ; X64-AVX512F-NEXT: setne %al
2896 ; X64-AVX512F-NEXT: vzeroupper
2897 ; X64-AVX512F-NEXT: retq
2899 ; X64-MIC-AVX2-LABEL: length128_eq:
2900 ; X64-MIC-AVX2: # %bb.0:
2901 ; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm0
2902 ; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
2903 ; X64-MIC-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2
2904 ; X64-MIC-AVX2-NEXT: vmovdqu 96(%rdi), %ymm3
2905 ; X64-MIC-AVX2-NEXT: vmovdqu (%rsi), %ymm4
2906 ; X64-MIC-AVX2-NEXT: vmovdqu 32(%rsi), %ymm5
2907 ; X64-MIC-AVX2-NEXT: vmovdqu 64(%rsi), %ymm6
2908 ; X64-MIC-AVX2-NEXT: vmovdqu 96(%rsi), %ymm7
2909 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm7, %zmm3, %k0
2910 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm6, %zmm2, %k1
2911 ; X64-MIC-AVX2-NEXT: korw %k0, %k1, %k0
2912 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm5, %zmm1, %k1
2913 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm4, %zmm0, %k2
2914 ; X64-MIC-AVX2-NEXT: korw %k1, %k2, %k1
2915 ; X64-MIC-AVX2-NEXT: kortestw %k0, %k1
2916 ; X64-MIC-AVX2-NEXT: setne %al
2917 ; X64-MIC-AVX2-NEXT: vzeroupper
2918 ; X64-MIC-AVX2-NEXT: retq
2920 ; X64-MIC-AVX512F-LABEL: length128_eq:
2921 ; X64-MIC-AVX512F: # %bb.0:
2922 ; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
2923 ; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1
2924 ; X64-MIC-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k0
2925 ; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1
2926 ; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1
2927 ; X64-MIC-AVX512F-NEXT: setne %al
2928 ; X64-MIC-AVX512F-NEXT: vzeroupper
2929 ; X64-MIC-AVX512F-NEXT: retq
2930 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 128) nounwind
2931 %cmp = icmp ne i32 %call, 0
2935 define i1 @length128_lt(ptr %x, ptr %y) nounwind {
2936 ; X64-LABEL: length128_lt:
2938 ; X64-NEXT: pushq %rax
2939 ; X64-NEXT: movl $128, %edx
2940 ; X64-NEXT: callq memcmp
2941 ; X64-NEXT: shrl $31, %eax
2942 ; X64-NEXT: # kill: def $al killed $al killed $eax
2943 ; X64-NEXT: popq %rcx
2945 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 128) nounwind
2946 %cmp = icmp slt i32 %call, 0
2950 define i1 @length128_gt(ptr %x, ptr %y) nounwind {
2951 ; X64-LABEL: length128_gt:
2953 ; X64-NEXT: pushq %rax
2954 ; X64-NEXT: movl $128, %edx
2955 ; X64-NEXT: callq memcmp
2956 ; X64-NEXT: testl %eax, %eax
2957 ; X64-NEXT: setg %al
2958 ; X64-NEXT: popq %rcx
2960 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 128) nounwind
2961 %cmp = icmp sgt i32 %call, 0
2965 define i1 @length128_eq_const(ptr %X) nounwind {
2966 ; X64-SSE-LABEL: length128_eq_const:
2968 ; X64-SSE-NEXT: pushq %rax
2969 ; X64-SSE-NEXT: movl $.L.str, %esi
2970 ; X64-SSE-NEXT: movl $128, %edx
2971 ; X64-SSE-NEXT: callq memcmp
2972 ; X64-SSE-NEXT: testl %eax, %eax
2973 ; X64-SSE-NEXT: sete %al
2974 ; X64-SSE-NEXT: popq %rcx
2975 ; X64-SSE-NEXT: retq
2977 ; X64-AVX1-LABEL: length128_eq_const:
2978 ; X64-AVX1: # %bb.0:
2979 ; X64-AVX1-NEXT: vmovups (%rdi), %ymm0
2980 ; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm1
2981 ; X64-AVX1-NEXT: vmovups 64(%rdi), %ymm2
2982 ; X64-AVX1-NEXT: vmovups 96(%rdi), %ymm3
2983 ; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
2984 ; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
2985 ; X64-AVX1-NEXT: vorps %ymm3, %ymm2, %ymm2
2986 ; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2987 ; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2988 ; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
2989 ; X64-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
2990 ; X64-AVX1-NEXT: vptest %ymm0, %ymm0
2991 ; X64-AVX1-NEXT: sete %al
2992 ; X64-AVX1-NEXT: vzeroupper
2993 ; X64-AVX1-NEXT: retq
2995 ; X64-AVX2-LABEL: length128_eq_const:
2996 ; X64-AVX2: # %bb.0:
2997 ; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
2998 ; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
2999 ; X64-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2
3000 ; X64-AVX2-NEXT: vmovdqu 96(%rdi), %ymm3
3001 ; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
3002 ; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
3003 ; X64-AVX2-NEXT: vpor %ymm3, %ymm2, %ymm2
3004 ; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
3005 ; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
3006 ; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
3007 ; X64-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
3008 ; X64-AVX2-NEXT: vptest %ymm0, %ymm0
3009 ; X64-AVX2-NEXT: sete %al
3010 ; X64-AVX2-NEXT: vzeroupper
3011 ; X64-AVX2-NEXT: retq
3013 ; X64-AVX512BW-LABEL: length128_eq_const:
3014 ; X64-AVX512BW: # %bb.0:
3015 ; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0
3016 ; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1
3017 ; X64-AVX512BW-NEXT: vpcmpneqb .L.str+64(%rip), %zmm1, %k0
3018 ; X64-AVX512BW-NEXT: vpcmpneqb .L.str(%rip), %zmm0, %k1
3019 ; X64-AVX512BW-NEXT: kortestq %k0, %k1
3020 ; X64-AVX512BW-NEXT: sete %al
3021 ; X64-AVX512BW-NEXT: vzeroupper
3022 ; X64-AVX512BW-NEXT: retq
3024 ; X64-AVX512F-LABEL: length128_eq_const:
3025 ; X64-AVX512F: # %bb.0:
3026 ; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
3027 ; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1
3028 ; X64-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k0
3029 ; X64-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k1
3030 ; X64-AVX512F-NEXT: kortestw %k0, %k1
3031 ; X64-AVX512F-NEXT: sete %al
3032 ; X64-AVX512F-NEXT: vzeroupper
3033 ; X64-AVX512F-NEXT: retq
3035 ; X64-MIC-AVX2-LABEL: length128_eq_const:
3036 ; X64-MIC-AVX2: # %bb.0:
3037 ; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm0
3038 ; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
3039 ; X64-MIC-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2
3040 ; X64-MIC-AVX2-NEXT: vmovdqu 96(%rdi), %ymm3
3041 ; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm4 = [959985462,858927408,926299444,825243960,892613426,959985462,858927408,926299444]
3042 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm4, %zmm3, %k0
3043 ; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [926299444,825243960,892613426,959985462,858927408,926299444,825243960,892613426]
3044 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm3, %zmm2, %k1
3045 ; X64-MIC-AVX2-NEXT: korw %k0, %k1, %k0
3046 ; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408]
3047 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm2, %zmm1, %k1
3048 ; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
3049 ; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm1, %zmm0, %k2
3050 ; X64-MIC-AVX2-NEXT: korw %k1, %k2, %k1
3051 ; X64-MIC-AVX2-NEXT: kortestw %k0, %k1
3052 ; X64-MIC-AVX2-NEXT: sete %al
3053 ; X64-MIC-AVX2-NEXT: vzeroupper
3054 ; X64-MIC-AVX2-NEXT: retq
3056 ; X64-MIC-AVX512F-LABEL: length128_eq_const:
3057 ; X64-MIC-AVX512F: # %bb.0:
3058 ; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
3059 ; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1
3060 ; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k0
3061 ; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k1
3062 ; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1
3063 ; X64-MIC-AVX512F-NEXT: sete %al
3064 ; X64-MIC-AVX512F-NEXT: vzeroupper
3065 ; X64-MIC-AVX512F-NEXT: retq
3066 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 128) nounwind
3067 %c = icmp eq i32 %m, 0
3071 define i32 @length192(ptr %X, ptr %Y) nounwind {
3072 ; X64-LABEL: length192:
3074 ; X64-NEXT: movl $192, %edx
3075 ; X64-NEXT: jmp memcmp # TAILCALL
3076 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 192) nounwind
3080 define i1 @length192_eq(ptr %x, ptr %y) nounwind {
3081 ; X64-SSE-LABEL: length192_eq:
3083 ; X64-SSE-NEXT: pushq %rax
3084 ; X64-SSE-NEXT: movl $192, %edx
3085 ; X64-SSE-NEXT: callq memcmp
3086 ; X64-SSE-NEXT: testl %eax, %eax
3087 ; X64-SSE-NEXT: setne %al
3088 ; X64-SSE-NEXT: popq %rcx
3089 ; X64-SSE-NEXT: retq
3091 ; X64-AVX1-LABEL: length192_eq:
3092 ; X64-AVX1: # %bb.0:
3093 ; X64-AVX1-NEXT: pushq %rax
3094 ; X64-AVX1-NEXT: movl $192, %edx
3095 ; X64-AVX1-NEXT: callq memcmp
3096 ; X64-AVX1-NEXT: testl %eax, %eax
3097 ; X64-AVX1-NEXT: setne %al
3098 ; X64-AVX1-NEXT: popq %rcx
3099 ; X64-AVX1-NEXT: retq
3101 ; X64-AVX2-LABEL: length192_eq:
3102 ; X64-AVX2: # %bb.0:
3103 ; X64-AVX2-NEXT: pushq %rax
3104 ; X64-AVX2-NEXT: movl $192, %edx
3105 ; X64-AVX2-NEXT: callq memcmp
3106 ; X64-AVX2-NEXT: testl %eax, %eax
3107 ; X64-AVX2-NEXT: setne %al
3108 ; X64-AVX2-NEXT: popq %rcx
3109 ; X64-AVX2-NEXT: retq
3111 ; X64-AVX512BW-LABEL: length192_eq:
3112 ; X64-AVX512BW: # %bb.0:
3113 ; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0
3114 ; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1
3115 ; X64-AVX512BW-NEXT: vmovdqu64 128(%rdi), %zmm2
3116 ; X64-AVX512BW-NEXT: vpcmpneqb 64(%rsi), %zmm1, %k0
3117 ; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k1
3118 ; X64-AVX512BW-NEXT: korq %k0, %k1, %k0
3119 ; X64-AVX512BW-NEXT: vpcmpneqb 128(%rsi), %zmm2, %k1
3120 ; X64-AVX512BW-NEXT: kortestq %k1, %k0
3121 ; X64-AVX512BW-NEXT: setne %al
3122 ; X64-AVX512BW-NEXT: vzeroupper
3123 ; X64-AVX512BW-NEXT: retq
3125 ; X64-AVX512F-LABEL: length192_eq:
3126 ; X64-AVX512F: # %bb.0:
3127 ; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
3128 ; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1
3129 ; X64-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2
3130 ; X64-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k0
3131 ; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1
3132 ; X64-AVX512F-NEXT: korw %k0, %k1, %k0
3133 ; X64-AVX512F-NEXT: vpcmpneqd 128(%rsi), %zmm2, %k1
3134 ; X64-AVX512F-NEXT: kortestw %k1, %k0
3135 ; X64-AVX512F-NEXT: setne %al
3136 ; X64-AVX512F-NEXT: vzeroupper
3137 ; X64-AVX512F-NEXT: retq
3139 ; X64-MIC-AVX2-LABEL: length192_eq:
3140 ; X64-MIC-AVX2: # %bb.0:
3141 ; X64-MIC-AVX2-NEXT: pushq %rax
3142 ; X64-MIC-AVX2-NEXT: movl $192, %edx
3143 ; X64-MIC-AVX2-NEXT: callq memcmp
3144 ; X64-MIC-AVX2-NEXT: testl %eax, %eax
3145 ; X64-MIC-AVX2-NEXT: setne %al
3146 ; X64-MIC-AVX2-NEXT: popq %rcx
3147 ; X64-MIC-AVX2-NEXT: retq
3149 ; X64-MIC-AVX512F-LABEL: length192_eq:
3150 ; X64-MIC-AVX512F: # %bb.0:
3151 ; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
3152 ; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1
3153 ; X64-MIC-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2
3154 ; X64-MIC-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k0
3155 ; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1
3156 ; X64-MIC-AVX512F-NEXT: korw %k0, %k1, %k0
3157 ; X64-MIC-AVX512F-NEXT: vpcmpneqd 128(%rsi), %zmm2, %k1
3158 ; X64-MIC-AVX512F-NEXT: kortestw %k1, %k0
3159 ; X64-MIC-AVX512F-NEXT: setne %al
3160 ; X64-MIC-AVX512F-NEXT: vzeroupper
3161 ; X64-MIC-AVX512F-NEXT: retq
3162 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 192) nounwind
3163 %cmp = icmp ne i32 %call, 0
3167 define i1 @length192_lt(ptr %x, ptr %y) nounwind {
3168 ; X64-LABEL: length192_lt:
3170 ; X64-NEXT: pushq %rax
3171 ; X64-NEXT: movl $192, %edx
3172 ; X64-NEXT: callq memcmp
3173 ; X64-NEXT: shrl $31, %eax
3174 ; X64-NEXT: # kill: def $al killed $al killed $eax
3175 ; X64-NEXT: popq %rcx
3177 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 192) nounwind
3178 %cmp = icmp slt i32 %call, 0
3182 define i1 @length192_gt(ptr %x, ptr %y) nounwind {
3183 ; X64-LABEL: length192_gt:
3185 ; X64-NEXT: pushq %rax
3186 ; X64-NEXT: movl $192, %edx
3187 ; X64-NEXT: callq memcmp
3188 ; X64-NEXT: testl %eax, %eax
3189 ; X64-NEXT: setg %al
3190 ; X64-NEXT: popq %rcx
3192 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 192) nounwind
3193 %cmp = icmp sgt i32 %call, 0
3197 define i1 @length192_eq_const(ptr %X) nounwind {
3198 ; X64-SSE-LABEL: length192_eq_const:
3200 ; X64-SSE-NEXT: pushq %rax
3201 ; X64-SSE-NEXT: movl $.L.str, %esi
3202 ; X64-SSE-NEXT: movl $192, %edx
3203 ; X64-SSE-NEXT: callq memcmp
3204 ; X64-SSE-NEXT: testl %eax, %eax
3205 ; X64-SSE-NEXT: sete %al
3206 ; X64-SSE-NEXT: popq %rcx
3207 ; X64-SSE-NEXT: retq
3209 ; X64-AVX1-LABEL: length192_eq_const:
3210 ; X64-AVX1: # %bb.0:
3211 ; X64-AVX1-NEXT: pushq %rax
3212 ; X64-AVX1-NEXT: movl $.L.str, %esi
3213 ; X64-AVX1-NEXT: movl $192, %edx
3214 ; X64-AVX1-NEXT: callq memcmp
3215 ; X64-AVX1-NEXT: testl %eax, %eax
3216 ; X64-AVX1-NEXT: sete %al
3217 ; X64-AVX1-NEXT: popq %rcx
3218 ; X64-AVX1-NEXT: retq
3220 ; X64-AVX2-LABEL: length192_eq_const:
3221 ; X64-AVX2: # %bb.0:
3222 ; X64-AVX2-NEXT: pushq %rax
3223 ; X64-AVX2-NEXT: movl $.L.str, %esi
3224 ; X64-AVX2-NEXT: movl $192, %edx
3225 ; X64-AVX2-NEXT: callq memcmp
3226 ; X64-AVX2-NEXT: testl %eax, %eax
3227 ; X64-AVX2-NEXT: sete %al
3228 ; X64-AVX2-NEXT: popq %rcx
3229 ; X64-AVX2-NEXT: retq
3231 ; X64-AVX512BW-LABEL: length192_eq_const:
3232 ; X64-AVX512BW: # %bb.0:
3233 ; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0
3234 ; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1
3235 ; X64-AVX512BW-NEXT: vmovdqu64 128(%rdi), %zmm2
3236 ; X64-AVX512BW-NEXT: vpcmpneqb .L.str+64(%rip), %zmm1, %k0
3237 ; X64-AVX512BW-NEXT: vpcmpneqb .L.str(%rip), %zmm0, %k1
3238 ; X64-AVX512BW-NEXT: korq %k0, %k1, %k0
3239 ; X64-AVX512BW-NEXT: vpcmpneqb .L.str+128(%rip), %zmm2, %k1
3240 ; X64-AVX512BW-NEXT: kortestq %k1, %k0
3241 ; X64-AVX512BW-NEXT: sete %al
3242 ; X64-AVX512BW-NEXT: vzeroupper
3243 ; X64-AVX512BW-NEXT: retq
3245 ; X64-AVX512F-LABEL: length192_eq_const:
3246 ; X64-AVX512F: # %bb.0:
3247 ; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
3248 ; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1
3249 ; X64-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2
3250 ; X64-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k0
3251 ; X64-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k1
3252 ; X64-AVX512F-NEXT: korw %k0, %k1, %k0
3253 ; X64-AVX512F-NEXT: vpcmpneqd .L.str+128(%rip), %zmm2, %k1
3254 ; X64-AVX512F-NEXT: kortestw %k1, %k0
3255 ; X64-AVX512F-NEXT: sete %al
3256 ; X64-AVX512F-NEXT: vzeroupper
3257 ; X64-AVX512F-NEXT: retq
3259 ; X64-MIC-AVX2-LABEL: length192_eq_const:
3260 ; X64-MIC-AVX2: # %bb.0:
3261 ; X64-MIC-AVX2-NEXT: pushq %rax
3262 ; X64-MIC-AVX2-NEXT: movl $.L.str, %esi
3263 ; X64-MIC-AVX2-NEXT: movl $192, %edx
3264 ; X64-MIC-AVX2-NEXT: callq memcmp
3265 ; X64-MIC-AVX2-NEXT: testl %eax, %eax
3266 ; X64-MIC-AVX2-NEXT: sete %al
3267 ; X64-MIC-AVX2-NEXT: popq %rcx
3268 ; X64-MIC-AVX2-NEXT: retq
3270 ; X64-MIC-AVX512F-LABEL: length192_eq_const:
3271 ; X64-MIC-AVX512F: # %bb.0:
3272 ; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
3273 ; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1
3274 ; X64-MIC-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2
3275 ; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k0
3276 ; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k1
3277 ; X64-MIC-AVX512F-NEXT: korw %k0, %k1, %k0
3278 ; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+128(%rip), %zmm2, %k1
3279 ; X64-MIC-AVX512F-NEXT: kortestw %k1, %k0
3280 ; X64-MIC-AVX512F-NEXT: sete %al
3281 ; X64-MIC-AVX512F-NEXT: vzeroupper
3282 ; X64-MIC-AVX512F-NEXT: retq
3283 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 192) nounwind
3284 %c = icmp eq i32 %m, 0
3288 define i32 @length255(ptr %X, ptr %Y) nounwind {
3289 ; X64-LABEL: length255:
3291 ; X64-NEXT: movl $255, %edx
3292 ; X64-NEXT: jmp memcmp # TAILCALL
3293 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 255) nounwind
3297 define i1 @length255_eq(ptr %x, ptr %y) nounwind {
3298 ; X64-SSE-LABEL: length255_eq:
3300 ; X64-SSE-NEXT: pushq %rax
3301 ; X64-SSE-NEXT: movl $255, %edx
3302 ; X64-SSE-NEXT: callq memcmp
3303 ; X64-SSE-NEXT: testl %eax, %eax
3304 ; X64-SSE-NEXT: setne %al
3305 ; X64-SSE-NEXT: popq %rcx
3306 ; X64-SSE-NEXT: retq
3308 ; X64-AVX1-LABEL: length255_eq:
3309 ; X64-AVX1: # %bb.0:
3310 ; X64-AVX1-NEXT: pushq %rax
3311 ; X64-AVX1-NEXT: movl $255, %edx
3312 ; X64-AVX1-NEXT: callq memcmp
3313 ; X64-AVX1-NEXT: testl %eax, %eax
3314 ; X64-AVX1-NEXT: setne %al
3315 ; X64-AVX1-NEXT: popq %rcx
3316 ; X64-AVX1-NEXT: retq
3318 ; X64-AVX2-LABEL: length255_eq:
3319 ; X64-AVX2: # %bb.0:
3320 ; X64-AVX2-NEXT: pushq %rax
3321 ; X64-AVX2-NEXT: movl $255, %edx
3322 ; X64-AVX2-NEXT: callq memcmp
3323 ; X64-AVX2-NEXT: testl %eax, %eax
3324 ; X64-AVX2-NEXT: setne %al
3325 ; X64-AVX2-NEXT: popq %rcx
3326 ; X64-AVX2-NEXT: retq
3328 ; X64-AVX512BW-LABEL: length255_eq:
3329 ; X64-AVX512BW: # %bb.0:
3330 ; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0
3331 ; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1
3332 ; X64-AVX512BW-NEXT: vmovdqu64 128(%rdi), %zmm2
3333 ; X64-AVX512BW-NEXT: vmovdqu64 191(%rdi), %zmm3
3334 ; X64-AVX512BW-NEXT: vpcmpneqb 191(%rsi), %zmm3, %k0
3335 ; X64-AVX512BW-NEXT: vpcmpneqb 128(%rsi), %zmm2, %k1
3336 ; X64-AVX512BW-NEXT: korq %k0, %k1, %k0
3337 ; X64-AVX512BW-NEXT: vpcmpneqb 64(%rsi), %zmm1, %k1
3338 ; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k2
3339 ; X64-AVX512BW-NEXT: korq %k1, %k2, %k1
3340 ; X64-AVX512BW-NEXT: kortestq %k0, %k1
3341 ; X64-AVX512BW-NEXT: setne %al
3342 ; X64-AVX512BW-NEXT: vzeroupper
3343 ; X64-AVX512BW-NEXT: retq
3345 ; X64-AVX512F-LABEL: length255_eq:
3346 ; X64-AVX512F: # %bb.0:
3347 ; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
3348 ; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1
3349 ; X64-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2
3350 ; X64-AVX512F-NEXT: vmovdqu64 191(%rdi), %zmm3
3351 ; X64-AVX512F-NEXT: vpcmpneqd 191(%rsi), %zmm3, %k0
3352 ; X64-AVX512F-NEXT: vpcmpneqd 128(%rsi), %zmm2, %k1
3353 ; X64-AVX512F-NEXT: korw %k0, %k1, %k0
3354 ; X64-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k1
3355 ; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k2
3356 ; X64-AVX512F-NEXT: korw %k1, %k2, %k1
3357 ; X64-AVX512F-NEXT: kortestw %k0, %k1
3358 ; X64-AVX512F-NEXT: setne %al
3359 ; X64-AVX512F-NEXT: vzeroupper
3360 ; X64-AVX512F-NEXT: retq
3362 ; X64-MIC-AVX2-LABEL: length255_eq:
3363 ; X64-MIC-AVX2: # %bb.0:
3364 ; X64-MIC-AVX2-NEXT: pushq %rax
3365 ; X64-MIC-AVX2-NEXT: movl $255, %edx
3366 ; X64-MIC-AVX2-NEXT: callq memcmp
3367 ; X64-MIC-AVX2-NEXT: testl %eax, %eax
3368 ; X64-MIC-AVX2-NEXT: setne %al
3369 ; X64-MIC-AVX2-NEXT: popq %rcx
3370 ; X64-MIC-AVX2-NEXT: retq
3372 ; X64-MIC-AVX512F-LABEL: length255_eq:
3373 ; X64-MIC-AVX512F: # %bb.0:
3374 ; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
3375 ; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1
3376 ; X64-MIC-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2
3377 ; X64-MIC-AVX512F-NEXT: vmovdqu64 191(%rdi), %zmm3
3378 ; X64-MIC-AVX512F-NEXT: vpcmpneqd 191(%rsi), %zmm3, %k0
3379 ; X64-MIC-AVX512F-NEXT: vpcmpneqd 128(%rsi), %zmm2, %k1
3380 ; X64-MIC-AVX512F-NEXT: korw %k0, %k1, %k0
3381 ; X64-MIC-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k1
3382 ; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k2
3383 ; X64-MIC-AVX512F-NEXT: korw %k1, %k2, %k1
3384 ; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1
3385 ; X64-MIC-AVX512F-NEXT: setne %al
3386 ; X64-MIC-AVX512F-NEXT: vzeroupper
3387 ; X64-MIC-AVX512F-NEXT: retq
3388 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 255) nounwind
3389 %cmp = icmp ne i32 %call, 0
3393 define i1 @length255_lt(ptr %x, ptr %y) nounwind {
3394 ; X64-LABEL: length255_lt:
3396 ; X64-NEXT: pushq %rax
3397 ; X64-NEXT: movl $255, %edx
3398 ; X64-NEXT: callq memcmp
3399 ; X64-NEXT: shrl $31, %eax
3400 ; X64-NEXT: # kill: def $al killed $al killed $eax
3401 ; X64-NEXT: popq %rcx
3403 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 255) nounwind
3404 %cmp = icmp slt i32 %call, 0
3408 define i1 @length255_gt(ptr %x, ptr %y) nounwind {
3409 ; X64-LABEL: length255_gt:
3411 ; X64-NEXT: pushq %rax
3412 ; X64-NEXT: movl $255, %edx
3413 ; X64-NEXT: callq memcmp
3414 ; X64-NEXT: testl %eax, %eax
3415 ; X64-NEXT: setg %al
3416 ; X64-NEXT: popq %rcx
3418 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 255) nounwind
3419 %cmp = icmp sgt i32 %call, 0
3423 define i1 @length255_eq_const(ptr %X) nounwind {
3424 ; X64-SSE-LABEL: length255_eq_const:
3426 ; X64-SSE-NEXT: pushq %rax
3427 ; X64-SSE-NEXT: movl $.L.str, %esi
3428 ; X64-SSE-NEXT: movl $255, %edx
3429 ; X64-SSE-NEXT: callq memcmp
3430 ; X64-SSE-NEXT: testl %eax, %eax
3431 ; X64-SSE-NEXT: sete %al
3432 ; X64-SSE-NEXT: popq %rcx
3433 ; X64-SSE-NEXT: retq
3435 ; X64-AVX1-LABEL: length255_eq_const:
3436 ; X64-AVX1: # %bb.0:
3437 ; X64-AVX1-NEXT: pushq %rax
3438 ; X64-AVX1-NEXT: movl $.L.str, %esi
3439 ; X64-AVX1-NEXT: movl $255, %edx
3440 ; X64-AVX1-NEXT: callq memcmp
3441 ; X64-AVX1-NEXT: testl %eax, %eax
3442 ; X64-AVX1-NEXT: sete %al
3443 ; X64-AVX1-NEXT: popq %rcx
3444 ; X64-AVX1-NEXT: retq
3446 ; X64-AVX2-LABEL: length255_eq_const:
3447 ; X64-AVX2: # %bb.0:
3448 ; X64-AVX2-NEXT: pushq %rax
3449 ; X64-AVX2-NEXT: movl $.L.str, %esi
3450 ; X64-AVX2-NEXT: movl $255, %edx
3451 ; X64-AVX2-NEXT: callq memcmp
3452 ; X64-AVX2-NEXT: testl %eax, %eax
3453 ; X64-AVX2-NEXT: sete %al
3454 ; X64-AVX2-NEXT: popq %rcx
3455 ; X64-AVX2-NEXT: retq
3457 ; X64-AVX512BW-LABEL: length255_eq_const:
3458 ; X64-AVX512BW: # %bb.0:
3459 ; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0
3460 ; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1
3461 ; X64-AVX512BW-NEXT: vmovdqu64 128(%rdi), %zmm2
3462 ; X64-AVX512BW-NEXT: vmovdqu64 191(%rdi), %zmm3
3463 ; X64-AVX512BW-NEXT: vpcmpneqb .L.str+191(%rip), %zmm3, %k0
3464 ; X64-AVX512BW-NEXT: vpcmpneqb .L.str+128(%rip), %zmm2, %k1
3465 ; X64-AVX512BW-NEXT: korq %k0, %k1, %k0
3466 ; X64-AVX512BW-NEXT: vpcmpneqb .L.str+64(%rip), %zmm1, %k1
3467 ; X64-AVX512BW-NEXT: vpcmpneqb .L.str(%rip), %zmm0, %k2
3468 ; X64-AVX512BW-NEXT: korq %k1, %k2, %k1
3469 ; X64-AVX512BW-NEXT: kortestq %k0, %k1
3470 ; X64-AVX512BW-NEXT: sete %al
3471 ; X64-AVX512BW-NEXT: vzeroupper
3472 ; X64-AVX512BW-NEXT: retq
3474 ; X64-AVX512F-LABEL: length255_eq_const:
3475 ; X64-AVX512F: # %bb.0:
3476 ; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
3477 ; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1
3478 ; X64-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2
3479 ; X64-AVX512F-NEXT: vmovdqu64 191(%rdi), %zmm3
3480 ; X64-AVX512F-NEXT: vpcmpneqd .L.str+191(%rip), %zmm3, %k0
3481 ; X64-AVX512F-NEXT: vpcmpneqd .L.str+128(%rip), %zmm2, %k1
3482 ; X64-AVX512F-NEXT: korw %k0, %k1, %k0
3483 ; X64-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k1
3484 ; X64-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k2
3485 ; X64-AVX512F-NEXT: korw %k1, %k2, %k1
3486 ; X64-AVX512F-NEXT: kortestw %k0, %k1
3487 ; X64-AVX512F-NEXT: sete %al
3488 ; X64-AVX512F-NEXT: vzeroupper
3489 ; X64-AVX512F-NEXT: retq
3491 ; X64-MIC-AVX2-LABEL: length255_eq_const:
3492 ; X64-MIC-AVX2: # %bb.0:
3493 ; X64-MIC-AVX2-NEXT: pushq %rax
3494 ; X64-MIC-AVX2-NEXT: movl $.L.str, %esi
3495 ; X64-MIC-AVX2-NEXT: movl $255, %edx
3496 ; X64-MIC-AVX2-NEXT: callq memcmp
3497 ; X64-MIC-AVX2-NEXT: testl %eax, %eax
3498 ; X64-MIC-AVX2-NEXT: sete %al
3499 ; X64-MIC-AVX2-NEXT: popq %rcx
3500 ; X64-MIC-AVX2-NEXT: retq
3502 ; X64-MIC-AVX512F-LABEL: length255_eq_const:
3503 ; X64-MIC-AVX512F: # %bb.0:
3504 ; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
3505 ; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1
3506 ; X64-MIC-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2
3507 ; X64-MIC-AVX512F-NEXT: vmovdqu64 191(%rdi), %zmm3
3508 ; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+191(%rip), %zmm3, %k0
3509 ; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+128(%rip), %zmm2, %k1
3510 ; X64-MIC-AVX512F-NEXT: korw %k0, %k1, %k0
3511 ; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k1
3512 ; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k2
3513 ; X64-MIC-AVX512F-NEXT: korw %k1, %k2, %k1
3514 ; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1
3515 ; X64-MIC-AVX512F-NEXT: sete %al
3516 ; X64-MIC-AVX512F-NEXT: vzeroupper
3517 ; X64-MIC-AVX512F-NEXT: retq
3518 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 255) nounwind
3519 %c = icmp eq i32 %m, 0
3523 define i32 @length256(ptr %X, ptr %Y) nounwind {
3524 ; X64-LABEL: length256:
3526 ; X64-NEXT: movl $256, %edx # imm = 0x100
3527 ; X64-NEXT: jmp memcmp # TAILCALL
3528 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 256) nounwind
3532 define i1 @length256_eq(ptr %x, ptr %y) nounwind {
3533 ; X64-SSE-LABEL: length256_eq:
3535 ; X64-SSE-NEXT: pushq %rax
3536 ; X64-SSE-NEXT: movl $256, %edx # imm = 0x100
3537 ; X64-SSE-NEXT: callq memcmp
3538 ; X64-SSE-NEXT: testl %eax, %eax
3539 ; X64-SSE-NEXT: setne %al
3540 ; X64-SSE-NEXT: popq %rcx
3541 ; X64-SSE-NEXT: retq
3543 ; X64-AVX1-LABEL: length256_eq:
3544 ; X64-AVX1: # %bb.0:
3545 ; X64-AVX1-NEXT: pushq %rax
3546 ; X64-AVX1-NEXT: movl $256, %edx # imm = 0x100
3547 ; X64-AVX1-NEXT: callq memcmp
3548 ; X64-AVX1-NEXT: testl %eax, %eax
3549 ; X64-AVX1-NEXT: setne %al
3550 ; X64-AVX1-NEXT: popq %rcx
3551 ; X64-AVX1-NEXT: retq
3553 ; X64-AVX2-LABEL: length256_eq:
3554 ; X64-AVX2: # %bb.0:
3555 ; X64-AVX2-NEXT: pushq %rax
3556 ; X64-AVX2-NEXT: movl $256, %edx # imm = 0x100
3557 ; X64-AVX2-NEXT: callq memcmp
3558 ; X64-AVX2-NEXT: testl %eax, %eax
3559 ; X64-AVX2-NEXT: setne %al
3560 ; X64-AVX2-NEXT: popq %rcx
3561 ; X64-AVX2-NEXT: retq
3563 ; X64-AVX512BW-LABEL: length256_eq:
3564 ; X64-AVX512BW: # %bb.0:
3565 ; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0
3566 ; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1
3567 ; X64-AVX512BW-NEXT: vmovdqu64 128(%rdi), %zmm2
3568 ; X64-AVX512BW-NEXT: vmovdqu64 192(%rdi), %zmm3
3569 ; X64-AVX512BW-NEXT: vpcmpneqb 192(%rsi), %zmm3, %k0
3570 ; X64-AVX512BW-NEXT: vpcmpneqb 128(%rsi), %zmm2, %k1
3571 ; X64-AVX512BW-NEXT: korq %k0, %k1, %k0
3572 ; X64-AVX512BW-NEXT: vpcmpneqb 64(%rsi), %zmm1, %k1
3573 ; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k2
3574 ; X64-AVX512BW-NEXT: korq %k1, %k2, %k1
3575 ; X64-AVX512BW-NEXT: kortestq %k0, %k1
3576 ; X64-AVX512BW-NEXT: setne %al
3577 ; X64-AVX512BW-NEXT: vzeroupper
3578 ; X64-AVX512BW-NEXT: retq
3580 ; X64-AVX512F-LABEL: length256_eq:
3581 ; X64-AVX512F: # %bb.0:
3582 ; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
3583 ; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1
3584 ; X64-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2
3585 ; X64-AVX512F-NEXT: vmovdqu64 192(%rdi), %zmm3
3586 ; X64-AVX512F-NEXT: vpcmpneqd 192(%rsi), %zmm3, %k0
3587 ; X64-AVX512F-NEXT: vpcmpneqd 128(%rsi), %zmm2, %k1
3588 ; X64-AVX512F-NEXT: korw %k0, %k1, %k0
3589 ; X64-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k1
3590 ; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k2
3591 ; X64-AVX512F-NEXT: korw %k1, %k2, %k1
3592 ; X64-AVX512F-NEXT: kortestw %k0, %k1
3593 ; X64-AVX512F-NEXT: setne %al
3594 ; X64-AVX512F-NEXT: vzeroupper
3595 ; X64-AVX512F-NEXT: retq
3597 ; X64-MIC-AVX2-LABEL: length256_eq:
3598 ; X64-MIC-AVX2: # %bb.0:
3599 ; X64-MIC-AVX2-NEXT: pushq %rax
3600 ; X64-MIC-AVX2-NEXT: movl $256, %edx # imm = 0x100
3601 ; X64-MIC-AVX2-NEXT: callq memcmp
3602 ; X64-MIC-AVX2-NEXT: testl %eax, %eax
3603 ; X64-MIC-AVX2-NEXT: setne %al
3604 ; X64-MIC-AVX2-NEXT: popq %rcx
3605 ; X64-MIC-AVX2-NEXT: retq
3607 ; X64-MIC-AVX512F-LABEL: length256_eq:
3608 ; X64-MIC-AVX512F: # %bb.0:
3609 ; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
3610 ; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1
3611 ; X64-MIC-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2
3612 ; X64-MIC-AVX512F-NEXT: vmovdqu64 192(%rdi), %zmm3
3613 ; X64-MIC-AVX512F-NEXT: vpcmpneqd 192(%rsi), %zmm3, %k0
3614 ; X64-MIC-AVX512F-NEXT: vpcmpneqd 128(%rsi), %zmm2, %k1
3615 ; X64-MIC-AVX512F-NEXT: korw %k0, %k1, %k0
3616 ; X64-MIC-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k1
3617 ; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k2
3618 ; X64-MIC-AVX512F-NEXT: korw %k1, %k2, %k1
3619 ; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1
3620 ; X64-MIC-AVX512F-NEXT: setne %al
3621 ; X64-MIC-AVX512F-NEXT: vzeroupper
3622 ; X64-MIC-AVX512F-NEXT: retq
3623 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 256) nounwind
3624 %cmp = icmp ne i32 %call, 0
3628 define i1 @length256_lt(ptr %x, ptr %y) nounwind {
3629 ; X64-LABEL: length256_lt:
3631 ; X64-NEXT: pushq %rax
3632 ; X64-NEXT: movl $256, %edx # imm = 0x100
3633 ; X64-NEXT: callq memcmp
3634 ; X64-NEXT: shrl $31, %eax
3635 ; X64-NEXT: # kill: def $al killed $al killed $eax
3636 ; X64-NEXT: popq %rcx
3638 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 256) nounwind
3639 %cmp = icmp slt i32 %call, 0
3643 define i1 @length256_gt(ptr %x, ptr %y) nounwind {
3644 ; X64-LABEL: length256_gt:
3646 ; X64-NEXT: pushq %rax
3647 ; X64-NEXT: movl $256, %edx # imm = 0x100
3648 ; X64-NEXT: callq memcmp
3649 ; X64-NEXT: testl %eax, %eax
3650 ; X64-NEXT: setg %al
3651 ; X64-NEXT: popq %rcx
3653 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 256) nounwind
3654 %cmp = icmp sgt i32 %call, 0
3658 define i1 @length256_eq_const(ptr %X) nounwind {
3659 ; X64-SSE-LABEL: length256_eq_const:
3661 ; X64-SSE-NEXT: pushq %rax
3662 ; X64-SSE-NEXT: movl $.L.str, %esi
3663 ; X64-SSE-NEXT: movl $256, %edx # imm = 0x100
3664 ; X64-SSE-NEXT: callq memcmp
3665 ; X64-SSE-NEXT: testl %eax, %eax
3666 ; X64-SSE-NEXT: sete %al
3667 ; X64-SSE-NEXT: popq %rcx
3668 ; X64-SSE-NEXT: retq
3670 ; X64-AVX1-LABEL: length256_eq_const:
3671 ; X64-AVX1: # %bb.0:
3672 ; X64-AVX1-NEXT: pushq %rax
3673 ; X64-AVX1-NEXT: movl $.L.str, %esi
3674 ; X64-AVX1-NEXT: movl $256, %edx # imm = 0x100
3675 ; X64-AVX1-NEXT: callq memcmp
3676 ; X64-AVX1-NEXT: testl %eax, %eax
3677 ; X64-AVX1-NEXT: sete %al
3678 ; X64-AVX1-NEXT: popq %rcx
3679 ; X64-AVX1-NEXT: retq
3681 ; X64-AVX2-LABEL: length256_eq_const:
3682 ; X64-AVX2: # %bb.0:
3683 ; X64-AVX2-NEXT: pushq %rax
3684 ; X64-AVX2-NEXT: movl $.L.str, %esi
3685 ; X64-AVX2-NEXT: movl $256, %edx # imm = 0x100
3686 ; X64-AVX2-NEXT: callq memcmp
3687 ; X64-AVX2-NEXT: testl %eax, %eax
3688 ; X64-AVX2-NEXT: sete %al
3689 ; X64-AVX2-NEXT: popq %rcx
3690 ; X64-AVX2-NEXT: retq
3692 ; X64-AVX512BW-LABEL: length256_eq_const:
3693 ; X64-AVX512BW: # %bb.0:
3694 ; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0
3695 ; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1
3696 ; X64-AVX512BW-NEXT: vmovdqu64 128(%rdi), %zmm2
3697 ; X64-AVX512BW-NEXT: vmovdqu64 192(%rdi), %zmm3
3698 ; X64-AVX512BW-NEXT: vpcmpneqb .L.str+192(%rip), %zmm3, %k0
3699 ; X64-AVX512BW-NEXT: vpcmpneqb .L.str+128(%rip), %zmm2, %k1
3700 ; X64-AVX512BW-NEXT: korq %k0, %k1, %k0
3701 ; X64-AVX512BW-NEXT: vpcmpneqb .L.str+64(%rip), %zmm1, %k1
3702 ; X64-AVX512BW-NEXT: vpcmpneqb .L.str(%rip), %zmm0, %k2
3703 ; X64-AVX512BW-NEXT: korq %k1, %k2, %k1
3704 ; X64-AVX512BW-NEXT: kortestq %k0, %k1
3705 ; X64-AVX512BW-NEXT: sete %al
3706 ; X64-AVX512BW-NEXT: vzeroupper
3707 ; X64-AVX512BW-NEXT: retq
3709 ; X64-AVX512F-LABEL: length256_eq_const:
3710 ; X64-AVX512F: # %bb.0:
3711 ; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
3712 ; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1
3713 ; X64-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2
3714 ; X64-AVX512F-NEXT: vmovdqu64 192(%rdi), %zmm3
3715 ; X64-AVX512F-NEXT: vpcmpneqd .L.str+192(%rip), %zmm3, %k0
3716 ; X64-AVX512F-NEXT: vpcmpneqd .L.str+128(%rip), %zmm2, %k1
3717 ; X64-AVX512F-NEXT: korw %k0, %k1, %k0
3718 ; X64-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k1
3719 ; X64-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k2
3720 ; X64-AVX512F-NEXT: korw %k1, %k2, %k1
3721 ; X64-AVX512F-NEXT: kortestw %k0, %k1
3722 ; X64-AVX512F-NEXT: sete %al
3723 ; X64-AVX512F-NEXT: vzeroupper
3724 ; X64-AVX512F-NEXT: retq
3726 ; X64-MIC-AVX2-LABEL: length256_eq_const:
3727 ; X64-MIC-AVX2: # %bb.0:
3728 ; X64-MIC-AVX2-NEXT: pushq %rax
3729 ; X64-MIC-AVX2-NEXT: movl $.L.str, %esi
3730 ; X64-MIC-AVX2-NEXT: movl $256, %edx # imm = 0x100
3731 ; X64-MIC-AVX2-NEXT: callq memcmp
3732 ; X64-MIC-AVX2-NEXT: testl %eax, %eax
3733 ; X64-MIC-AVX2-NEXT: sete %al
3734 ; X64-MIC-AVX2-NEXT: popq %rcx
3735 ; X64-MIC-AVX2-NEXT: retq
3737 ; X64-MIC-AVX512F-LABEL: length256_eq_const:
3738 ; X64-MIC-AVX512F: # %bb.0:
3739 ; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
3740 ; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1
3741 ; X64-MIC-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2
3742 ; X64-MIC-AVX512F-NEXT: vmovdqu64 192(%rdi), %zmm3
3743 ; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+192(%rip), %zmm3, %k0
3744 ; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+128(%rip), %zmm2, %k1
3745 ; X64-MIC-AVX512F-NEXT: korw %k0, %k1, %k0
3746 ; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k1
3747 ; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k2
3748 ; X64-MIC-AVX512F-NEXT: korw %k1, %k2, %k1
3749 ; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1
3750 ; X64-MIC-AVX512F-NEXT: sete %al
3751 ; X64-MIC-AVX512F-NEXT: vzeroupper
3752 ; X64-MIC-AVX512F-NEXT: retq
3753 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 256) nounwind
3754 %c = icmp eq i32 %m, 0
3758 define i32 @length384(ptr %X, ptr %Y) nounwind {
3759 ; X64-LABEL: length384:
3761 ; X64-NEXT: movl $384, %edx # imm = 0x180
3762 ; X64-NEXT: jmp memcmp # TAILCALL
3763 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 384) nounwind
3767 define i1 @length384_eq(ptr %x, ptr %y) nounwind {
3768 ; X64-LABEL: length384_eq:
3770 ; X64-NEXT: pushq %rax
3771 ; X64-NEXT: movl $384, %edx # imm = 0x180
3772 ; X64-NEXT: callq memcmp
3773 ; X64-NEXT: testl %eax, %eax
3774 ; X64-NEXT: setne %al
3775 ; X64-NEXT: popq %rcx
3777 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 384) nounwind
3778 %cmp = icmp ne i32 %call, 0
3782 define i1 @length384_lt(ptr %x, ptr %y) nounwind {
3783 ; X64-LABEL: length384_lt:
3785 ; X64-NEXT: pushq %rax
3786 ; X64-NEXT: movl $384, %edx # imm = 0x180
3787 ; X64-NEXT: callq memcmp
3788 ; X64-NEXT: shrl $31, %eax
3789 ; X64-NEXT: # kill: def $al killed $al killed $eax
3790 ; X64-NEXT: popq %rcx
3792 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 384) nounwind
3793 %cmp = icmp slt i32 %call, 0
3797 define i1 @length384_gt(ptr %x, ptr %y) nounwind {
3798 ; X64-LABEL: length384_gt:
3800 ; X64-NEXT: pushq %rax
3801 ; X64-NEXT: movl $384, %edx # imm = 0x180
3802 ; X64-NEXT: callq memcmp
3803 ; X64-NEXT: testl %eax, %eax
3804 ; X64-NEXT: setg %al
3805 ; X64-NEXT: popq %rcx
3807 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 384) nounwind
3808 %cmp = icmp sgt i32 %call, 0
3812 define i1 @length384_eq_const(ptr %X) nounwind {
3813 ; X64-LABEL: length384_eq_const:
3815 ; X64-NEXT: pushq %rax
3816 ; X64-NEXT: movl $.L.str, %esi
3817 ; X64-NEXT: movl $384, %edx # imm = 0x180
3818 ; X64-NEXT: callq memcmp
3819 ; X64-NEXT: testl %eax, %eax
3820 ; X64-NEXT: sete %al
3821 ; X64-NEXT: popq %rcx
3823 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 384) nounwind
3824 %c = icmp eq i32 %m, 0
3828 define i32 @length511(ptr %X, ptr %Y) nounwind {
3829 ; X64-LABEL: length511:
3831 ; X64-NEXT: movl $511, %edx # imm = 0x1FF
3832 ; X64-NEXT: jmp memcmp # TAILCALL
3833 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 511) nounwind
3837 define i1 @length511_eq(ptr %x, ptr %y) nounwind {
3838 ; X64-LABEL: length511_eq:
3840 ; X64-NEXT: pushq %rax
3841 ; X64-NEXT: movl $511, %edx # imm = 0x1FF
3842 ; X64-NEXT: callq memcmp
3843 ; X64-NEXT: testl %eax, %eax
3844 ; X64-NEXT: setne %al
3845 ; X64-NEXT: popq %rcx
3847 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 511) nounwind
3848 %cmp = icmp ne i32 %call, 0
3852 define i1 @length511_lt(ptr %x, ptr %y) nounwind {
3853 ; X64-LABEL: length511_lt:
3855 ; X64-NEXT: pushq %rax
3856 ; X64-NEXT: movl $511, %edx # imm = 0x1FF
3857 ; X64-NEXT: callq memcmp
3858 ; X64-NEXT: shrl $31, %eax
3859 ; X64-NEXT: # kill: def $al killed $al killed $eax
3860 ; X64-NEXT: popq %rcx
3862 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 511) nounwind
3863 %cmp = icmp slt i32 %call, 0
3867 define i1 @length511_gt(ptr %x, ptr %y) nounwind {
3868 ; X64-LABEL: length511_gt:
3870 ; X64-NEXT: pushq %rax
3871 ; X64-NEXT: movl $511, %edx # imm = 0x1FF
3872 ; X64-NEXT: callq memcmp
3873 ; X64-NEXT: testl %eax, %eax
3874 ; X64-NEXT: setg %al
3875 ; X64-NEXT: popq %rcx
3877 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 511) nounwind
3878 %cmp = icmp sgt i32 %call, 0
3882 define i1 @length511_eq_const(ptr %X) nounwind {
3883 ; X64-LABEL: length511_eq_const:
3885 ; X64-NEXT: pushq %rax
3886 ; X64-NEXT: movl $.L.str, %esi
3887 ; X64-NEXT: movl $511, %edx # imm = 0x1FF
3888 ; X64-NEXT: callq memcmp
3889 ; X64-NEXT: testl %eax, %eax
3890 ; X64-NEXT: sete %al
3891 ; X64-NEXT: popq %rcx
3893 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 511) nounwind
3894 %c = icmp eq i32 %m, 0
3898 define i32 @length512(ptr %X, ptr %Y) nounwind {
3899 ; X64-LABEL: length512:
3901 ; X64-NEXT: movl $512, %edx # imm = 0x200
3902 ; X64-NEXT: jmp memcmp # TAILCALL
3903 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 512) nounwind
3907 define i1 @length512_eq(ptr %x, ptr %y) nounwind {
3908 ; X64-LABEL: length512_eq:
3910 ; X64-NEXT: pushq %rax
3911 ; X64-NEXT: movl $512, %edx # imm = 0x200
3912 ; X64-NEXT: callq memcmp
3913 ; X64-NEXT: testl %eax, %eax
3914 ; X64-NEXT: setne %al
3915 ; X64-NEXT: popq %rcx
3917 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 512) nounwind
3918 %cmp = icmp ne i32 %call, 0
3922 define i1 @length512_lt(ptr %x, ptr %y) nounwind {
3923 ; X64-LABEL: length512_lt:
3925 ; X64-NEXT: pushq %rax
3926 ; X64-NEXT: movl $512, %edx # imm = 0x200
3927 ; X64-NEXT: callq memcmp
3928 ; X64-NEXT: shrl $31, %eax
3929 ; X64-NEXT: # kill: def $al killed $al killed $eax
3930 ; X64-NEXT: popq %rcx
3932 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 512) nounwind
3933 %cmp = icmp slt i32 %call, 0
3937 define i1 @length512_gt(ptr %x, ptr %y) nounwind {
3938 ; X64-LABEL: length512_gt:
3940 ; X64-NEXT: pushq %rax
3941 ; X64-NEXT: movl $512, %edx # imm = 0x200
3942 ; X64-NEXT: callq memcmp
3943 ; X64-NEXT: testl %eax, %eax
3944 ; X64-NEXT: setg %al
3945 ; X64-NEXT: popq %rcx
3947 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 512) nounwind
3948 %cmp = icmp sgt i32 %call, 0
3952 define i1 @length512_eq_const(ptr %X) nounwind {
3953 ; X64-LABEL: length512_eq_const:
3955 ; X64-NEXT: pushq %rax
3956 ; X64-NEXT: movl $.L.str, %esi
3957 ; X64-NEXT: movl $512, %edx # imm = 0x200
3958 ; X64-NEXT: callq memcmp
3959 ; X64-NEXT: testl %eax, %eax
3960 ; X64-NEXT: sete %al
3961 ; X64-NEXT: popq %rcx
3963 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 512) nounwind
3964 %c = icmp eq i32 %m, 0
3968 ; This checks that we do not do stupid things with huge sizes.
3969 define i32 @huge_length(ptr %X, ptr %Y) nounwind {
3970 ; X64-LABEL: huge_length:
3972 ; X64-NEXT: movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF
3973 ; X64-NEXT: jmp memcmp # TAILCALL
3974 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 9223372036854775807) nounwind
3978 define i1 @huge_length_eq(ptr %X, ptr %Y) nounwind {
3979 ; X64-LABEL: huge_length_eq:
3981 ; X64-NEXT: pushq %rax
3982 ; X64-NEXT: movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF
3983 ; X64-NEXT: callq memcmp
3984 ; X64-NEXT: testl %eax, %eax
3985 ; X64-NEXT: sete %al
3986 ; X64-NEXT: popq %rcx
3988 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 9223372036854775807) nounwind
3989 %c = icmp eq i32 %m, 0
3993 ; This checks non-constant sizes.
3994 define i32 @nonconst_length(ptr %X, ptr %Y, i64 %size) nounwind {
3995 ; X64-LABEL: nonconst_length:
3997 ; X64-NEXT: jmp memcmp # TAILCALL
3998 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 %size) nounwind
4002 define i1 @nonconst_length_eq(ptr %X, ptr %Y, i64 %size) nounwind {
4003 ; X64-LABEL: nonconst_length_eq:
4005 ; X64-NEXT: pushq %rax
4006 ; X64-NEXT: callq memcmp
4007 ; X64-NEXT: testl %eax, %eax
4008 ; X64-NEXT: sete %al
4009 ; X64-NEXT: popq %rcx
4011 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 %size) nounwind
4012 %c = icmp eq i32 %m, 0