xref: /llvm-project/llvm/test/CodeGen/X86/memcmp.ll (revision a4e47586b9c0566761b7fb704011da6ded823398)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown               | FileCheck %s --check-prefixes=X64,X64-SSE,X64-SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.1 | FileCheck %s --check-prefixes=X64,X64-SSE,X64-SSE41
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx    | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX1
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx2   | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX2
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw,+prefer-256-bit | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX2
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw,-prefer-256-bit | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX512,X64-AVX512BW
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,+prefer-256-bit,-prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX2
9; RUN: llc < %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
10; RUN: llc < %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
11; RUN: llc < %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
12
13; This tests codegen time inlining/optimization of memcmp
14; rdar://6480398
15
16@.str = private constant [513 x i8] c"01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901\00", align 1
17
18declare dso_local i32 @memcmp(ptr, ptr, i64)
19
20define i32 @length0(ptr %X, ptr %Y) nounwind {
21; X64-LABEL: length0:
22; X64:       # %bb.0:
23; X64-NEXT:    xorl %eax, %eax
24; X64-NEXT:    retq
25   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 0) nounwind
26   ret i32 %m
27 }
28
29define i1 @length0_eq(ptr %X, ptr %Y) nounwind {
30; X64-LABEL: length0_eq:
31; X64:       # %bb.0:
32; X64-NEXT:    movb $1, %al
33; X64-NEXT:    retq
34  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 0) nounwind
35  %c = icmp eq i32 %m, 0
36  ret i1 %c
37}
38
39define i1 @length0_lt(ptr %X, ptr %Y) nounwind {
40; X64-LABEL: length0_lt:
41; X64:       # %bb.0:
42; X64-NEXT:    xorl %eax, %eax
43; X64-NEXT:    retq
44  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 0) nounwind
45  %c = icmp slt i32 %m, 0
46  ret i1 %c
47}
48
49define i32 @length2(ptr %X, ptr %Y) nounwind {
50; X64-LABEL: length2:
51; X64:       # %bb.0:
52; X64-NEXT:    movzwl (%rdi), %eax
53; X64-NEXT:    movzwl (%rsi), %ecx
54; X64-NEXT:    rolw $8, %ax
55; X64-NEXT:    rolw $8, %cx
56; X64-NEXT:    movzwl %ax, %eax
57; X64-NEXT:    movzwl %cx, %ecx
58; X64-NEXT:    subl %ecx, %eax
59; X64-NEXT:    retq
60  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind
61  ret i32 %m
62}
63
64define i32 @length2_const(ptr %X, ptr %Y) nounwind {
65; X64-LABEL: length2_const:
66; X64:       # %bb.0:
67; X64-NEXT:    movzwl (%rdi), %eax
68; X64-NEXT:    rolw $8, %ax
69; X64-NEXT:    movzwl %ax, %eax
70; X64-NEXT:    addl $-12594, %eax # imm = 0xCECE
71; X64-NEXT:    retq
72  %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 2) nounwind
73  ret i32 %m
74}
75
76define i1 @length2_gt_const(ptr %X, ptr %Y) nounwind {
77; X64-LABEL: length2_gt_const:
78; X64:       # %bb.0:
79; X64-NEXT:    movzwl (%rdi), %eax
80; X64-NEXT:    rolw $8, %ax
81; X64-NEXT:    movzwl %ax, %eax
82; X64-NEXT:    addl $-12594, %eax # imm = 0xCECE
83; X64-NEXT:    testl %eax, %eax
84; X64-NEXT:    setg %al
85; X64-NEXT:    retq
86  %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 2) nounwind
87  %c = icmp sgt i32 %m, 0
88  ret i1 %c
89}
90
91define i1 @length2_eq(ptr %X, ptr %Y) nounwind {
92; X64-LABEL: length2_eq:
93; X64:       # %bb.0:
94; X64-NEXT:    movzwl (%rdi), %eax
95; X64-NEXT:    cmpw (%rsi), %ax
96; X64-NEXT:    sete %al
97; X64-NEXT:    retq
98  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind
99  %c = icmp eq i32 %m, 0
100  ret i1 %c
101}
102
103define i1 @length2_lt(ptr %X, ptr %Y) nounwind {
104; X64-LABEL: length2_lt:
105; X64:       # %bb.0:
106; X64-NEXT:    movzwl (%rdi), %eax
107; X64-NEXT:    movzwl (%rsi), %ecx
108; X64-NEXT:    rolw $8, %ax
109; X64-NEXT:    rolw $8, %cx
110; X64-NEXT:    movzwl %ax, %eax
111; X64-NEXT:    movzwl %cx, %ecx
112; X64-NEXT:    subl %ecx, %eax
113; X64-NEXT:    shrl $31, %eax
114; X64-NEXT:    # kill: def $al killed $al killed $eax
115; X64-NEXT:    retq
116  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind
117  %c = icmp slt i32 %m, 0
118  ret i1 %c
119}
120
121define i1 @length2_gt(ptr %X, ptr %Y) nounwind {
122; X64-LABEL: length2_gt:
123; X64:       # %bb.0:
124; X64-NEXT:    movzwl (%rdi), %eax
125; X64-NEXT:    movzwl (%rsi), %ecx
126; X64-NEXT:    rolw $8, %ax
127; X64-NEXT:    rolw $8, %cx
128; X64-NEXT:    movzwl %ax, %eax
129; X64-NEXT:    movzwl %cx, %ecx
130; X64-NEXT:    subl %ecx, %eax
131; X64-NEXT:    testl %eax, %eax
132; X64-NEXT:    setg %al
133; X64-NEXT:    retq
134  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind
135  %c = icmp sgt i32 %m, 0
136  ret i1 %c
137}
138
139define i1 @length2_eq_const(ptr %X) nounwind {
140; X64-LABEL: length2_eq_const:
141; X64:       # %bb.0:
142; X64-NEXT:    cmpw $12849, (%rdi) # imm = 0x3231
143; X64-NEXT:    setne %al
144; X64-NEXT:    retq
145  %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 2) nounwind
146  %c = icmp ne i32 %m, 0
147  ret i1 %c
148}
149
150define i1 @length2_eq_nobuiltin_attr(ptr %X, ptr %Y) nounwind {
151; X64-LABEL: length2_eq_nobuiltin_attr:
152; X64:       # %bb.0:
153; X64-NEXT:    pushq %rax
154; X64-NEXT:    movl $2, %edx
155; X64-NEXT:    callq memcmp
156; X64-NEXT:    testl %eax, %eax
157; X64-NEXT:    sete %al
158; X64-NEXT:    popq %rcx
159; X64-NEXT:    retq
160  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind nobuiltin
161  %c = icmp eq i32 %m, 0
162  ret i1 %c
163}
164
165define i32 @length3(ptr %X, ptr %Y) nounwind {
166; X64-LABEL: length3:
167; X64:       # %bb.0:
168; X64-NEXT:    movzwl (%rdi), %ecx
169; X64-NEXT:    movzwl (%rsi), %edx
170; X64-NEXT:    rolw $8, %cx
171; X64-NEXT:    rolw $8, %dx
172; X64-NEXT:    cmpw %dx, %cx
173; X64-NEXT:    jne .LBB11_3
174; X64-NEXT:  # %bb.1: # %loadbb1
175; X64-NEXT:    movzbl 2(%rdi), %eax
176; X64-NEXT:    movzbl 2(%rsi), %ecx
177; X64-NEXT:    subl %ecx, %eax
178; X64-NEXT:    retq
179; X64-NEXT:  .LBB11_3: # %res_block
180; X64-NEXT:    xorl %eax, %eax
181; X64-NEXT:    cmpw %dx, %cx
182; X64-NEXT:    sbbl %eax, %eax
183; X64-NEXT:    orl $1, %eax
184; X64-NEXT:    retq
185  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind
186  ret i32 %m
187}
188
189define i1 @length3_eq(ptr %X, ptr %Y) nounwind {
190; X64-LABEL: length3_eq:
191; X64:       # %bb.0:
192; X64-NEXT:    movzwl (%rdi), %eax
193; X64-NEXT:    xorw (%rsi), %ax
194; X64-NEXT:    movzbl 2(%rdi), %ecx
195; X64-NEXT:    xorb 2(%rsi), %cl
196; X64-NEXT:    movzbl %cl, %ecx
197; X64-NEXT:    orw %ax, %cx
198; X64-NEXT:    setne %al
199; X64-NEXT:    retq
200  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind
201  %c = icmp ne i32 %m, 0
202  ret i1 %c
203}
204
205define i32 @length4(ptr %X, ptr %Y) nounwind {
206; X64-LABEL: length4:
207; X64:       # %bb.0:
208; X64-NEXT:    movl (%rdi), %eax
209; X64-NEXT:    movl (%rsi), %ecx
210; X64-NEXT:    bswapl %eax
211; X64-NEXT:    bswapl %ecx
212; X64-NEXT:    cmpl %ecx, %eax
213; X64-NEXT:    seta %al
214; X64-NEXT:    sbbb $0, %al
215; X64-NEXT:    movsbl %al, %eax
216; X64-NEXT:    retq
217  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind
218  ret i32 %m
219}
220
221define i1 @length4_eq(ptr %X, ptr %Y) nounwind {
222; X64-LABEL: length4_eq:
223; X64:       # %bb.0:
224; X64-NEXT:    movl (%rdi), %eax
225; X64-NEXT:    cmpl (%rsi), %eax
226; X64-NEXT:    setne %al
227; X64-NEXT:    retq
228  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind
229  %c = icmp ne i32 %m, 0
230  ret i1 %c
231}
232
233define i1 @length4_lt(ptr %X, ptr %Y) nounwind {
234; X64-LABEL: length4_lt:
235; X64:       # %bb.0:
236; X64-NEXT:    movl (%rdi), %eax
237; X64-NEXT:    movl (%rsi), %ecx
238; X64-NEXT:    bswapl %eax
239; X64-NEXT:    bswapl %ecx
240; X64-NEXT:    cmpl %ecx, %eax
241; X64-NEXT:    setb %al
242; X64-NEXT:    retq
243  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind
244  %c = icmp slt i32 %m, 0
245  ret i1 %c
246}
247
248define i1 @length4_gt(ptr %X, ptr %Y) nounwind {
249; X64-LABEL: length4_gt:
250; X64:       # %bb.0:
251; X64-NEXT:    movl (%rdi), %eax
252; X64-NEXT:    movl (%rsi), %ecx
253; X64-NEXT:    bswapl %eax
254; X64-NEXT:    bswapl %ecx
255; X64-NEXT:    cmpl %ecx, %eax
256; X64-NEXT:    seta %al
257; X64-NEXT:    retq
258  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind
259  %c = icmp sgt i32 %m, 0
260  ret i1 %c
261}
262
263define i1 @length4_le(ptr %X, ptr %Y) nounwind {
264; X64-LABEL: length4_le:
265; X64:       # %bb.0:
266; X64-NEXT:    movl (%rdi), %eax
267; X64-NEXT:    movl (%rsi), %ecx
268; X64-NEXT:    bswapl %eax
269; X64-NEXT:    bswapl %ecx
270; X64-NEXT:    cmpl %ecx, %eax
271; X64-NEXT:    setbe %al
272; X64-NEXT:    retq
273  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind
274  %c = icmp slt i32 %m, 1
275  ret i1 %c
276}
277
278define i1 @length4_ge(ptr %X, ptr %Y) nounwind {
279; X64-LABEL: length4_ge:
280; X64:       # %bb.0:
281; X64-NEXT:    movl (%rdi), %eax
282; X64-NEXT:    movl (%rsi), %ecx
283; X64-NEXT:    bswapl %eax
284; X64-NEXT:    bswapl %ecx
285; X64-NEXT:    cmpl %ecx, %eax
286; X64-NEXT:    setae %al
287; X64-NEXT:    retq
288  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind
289  %c = icmp sgt i32 %m, -1
290  ret i1 %c
291}
292
293define i1 @length4_eq_const(ptr %X) nounwind {
294; X64-LABEL: length4_eq_const:
295; X64:       # %bb.0:
296; X64-NEXT:    cmpl $875770417, (%rdi) # imm = 0x34333231
297; X64-NEXT:    sete %al
298; X64-NEXT:    retq
299  %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 4) nounwind
300  %c = icmp eq i32 %m, 0
301  ret i1 %c
302}
303
304define i32 @length5(ptr %X, ptr %Y) nounwind {
305; X64-LABEL: length5:
306; X64:       # %bb.0:
307; X64-NEXT:    movl (%rdi), %ecx
308; X64-NEXT:    movl (%rsi), %edx
309; X64-NEXT:    bswapl %ecx
310; X64-NEXT:    bswapl %edx
311; X64-NEXT:    cmpl %edx, %ecx
312; X64-NEXT:    jne .LBB20_3
313; X64-NEXT:  # %bb.1: # %loadbb1
314; X64-NEXT:    movzbl 4(%rdi), %eax
315; X64-NEXT:    movzbl 4(%rsi), %ecx
316; X64-NEXT:    subl %ecx, %eax
317; X64-NEXT:    retq
318; X64-NEXT:  .LBB20_3: # %res_block
319; X64-NEXT:    xorl %eax, %eax
320; X64-NEXT:    cmpl %edx, %ecx
321; X64-NEXT:    sbbl %eax, %eax
322; X64-NEXT:    orl $1, %eax
323; X64-NEXT:    retq
324  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind
325  ret i32 %m
326}
327
328define i1 @length5_eq(ptr %X, ptr %Y) nounwind {
329; X64-LABEL: length5_eq:
330; X64:       # %bb.0:
331; X64-NEXT:    movl (%rdi), %eax
332; X64-NEXT:    xorl (%rsi), %eax
333; X64-NEXT:    movzbl 4(%rdi), %ecx
334; X64-NEXT:    xorb 4(%rsi), %cl
335; X64-NEXT:    movzbl %cl, %ecx
336; X64-NEXT:    orl %eax, %ecx
337; X64-NEXT:    setne %al
338; X64-NEXT:    retq
339  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind
340  %c = icmp ne i32 %m, 0
341  ret i1 %c
342}
343
344define i1 @length5_lt(ptr %X, ptr %Y) nounwind {
345; X64-LABEL: length5_lt:
346; X64:       # %bb.0:
347; X64-NEXT:    movl (%rdi), %ecx
348; X64-NEXT:    movl (%rsi), %edx
349; X64-NEXT:    bswapl %ecx
350; X64-NEXT:    bswapl %edx
351; X64-NEXT:    cmpl %edx, %ecx
352; X64-NEXT:    jne .LBB22_3
353; X64-NEXT:  # %bb.1: # %loadbb1
354; X64-NEXT:    movzbl 4(%rdi), %eax
355; X64-NEXT:    movzbl 4(%rsi), %ecx
356; X64-NEXT:    subl %ecx, %eax
357; X64-NEXT:    shrl $31, %eax
358; X64-NEXT:    # kill: def $al killed $al killed $eax
359; X64-NEXT:    retq
360; X64-NEXT:  .LBB22_3: # %res_block
361; X64-NEXT:    xorl %eax, %eax
362; X64-NEXT:    cmpl %edx, %ecx
363; X64-NEXT:    sbbl %eax, %eax
364; X64-NEXT:    orl $1, %eax
365; X64-NEXT:    shrl $31, %eax
366; X64-NEXT:    # kill: def $al killed $al killed $eax
367; X64-NEXT:    retq
368  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind
369  %c = icmp slt i32 %m, 0
370  ret i1 %c
371}
372
373define i32 @length7(ptr %X, ptr %Y) nounwind {
374; X64-LABEL: length7:
375; X64:       # %bb.0:
376; X64-NEXT:    movl (%rdi), %ecx
377; X64-NEXT:    movl (%rsi), %edx
378; X64-NEXT:    bswapl %ecx
379; X64-NEXT:    bswapl %edx
380; X64-NEXT:    cmpl %edx, %ecx
381; X64-NEXT:    jne .LBB23_2
382; X64-NEXT:  # %bb.1: # %loadbb1
383; X64-NEXT:    movl 3(%rdi), %ecx
384; X64-NEXT:    movl 3(%rsi), %edx
385; X64-NEXT:    bswapl %ecx
386; X64-NEXT:    bswapl %edx
387; X64-NEXT:    xorl %eax, %eax
388; X64-NEXT:    cmpl %edx, %ecx
389; X64-NEXT:    je .LBB23_3
390; X64-NEXT:  .LBB23_2: # %res_block
391; X64-NEXT:    xorl %eax, %eax
392; X64-NEXT:    cmpl %edx, %ecx
393; X64-NEXT:    sbbl %eax, %eax
394; X64-NEXT:    orl $1, %eax
395; X64-NEXT:  .LBB23_3: # %endblock
396; X64-NEXT:    retq
397  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind
398  ret i32 %m
399}
400
401define i1 @length7_lt(ptr %X, ptr %Y) nounwind {
402; X64-LABEL: length7_lt:
403; X64:       # %bb.0:
404; X64-NEXT:    movl (%rdi), %ecx
405; X64-NEXT:    movl (%rsi), %edx
406; X64-NEXT:    bswapl %ecx
407; X64-NEXT:    bswapl %edx
408; X64-NEXT:    cmpl %edx, %ecx
409; X64-NEXT:    jne .LBB24_2
410; X64-NEXT:  # %bb.1: # %loadbb1
411; X64-NEXT:    movl 3(%rdi), %ecx
412; X64-NEXT:    movl 3(%rsi), %edx
413; X64-NEXT:    bswapl %ecx
414; X64-NEXT:    bswapl %edx
415; X64-NEXT:    xorl %eax, %eax
416; X64-NEXT:    cmpl %edx, %ecx
417; X64-NEXT:    je .LBB24_3
418; X64-NEXT:  .LBB24_2: # %res_block
419; X64-NEXT:    xorl %eax, %eax
420; X64-NEXT:    cmpl %edx, %ecx
421; X64-NEXT:    sbbl %eax, %eax
422; X64-NEXT:    orl $1, %eax
423; X64-NEXT:  .LBB24_3: # %endblock
424; X64-NEXT:    shrl $31, %eax
425; X64-NEXT:    # kill: def $al killed $al killed $eax
426; X64-NEXT:    retq
427  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind
428  %c = icmp slt i32 %m, 0
429  ret i1 %c
430}
431
432define i1 @length7_eq(ptr %X, ptr %Y) nounwind {
433; X64-LABEL: length7_eq:
434; X64:       # %bb.0:
435; X64-NEXT:    movl (%rdi), %eax
436; X64-NEXT:    movl 3(%rdi), %ecx
437; X64-NEXT:    xorl (%rsi), %eax
438; X64-NEXT:    xorl 3(%rsi), %ecx
439; X64-NEXT:    orl %eax, %ecx
440; X64-NEXT:    setne %al
441; X64-NEXT:    retq
442  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind
443  %c = icmp ne i32 %m, 0
444  ret i1 %c
445}
446
447define i32 @length8(ptr %X, ptr %Y) nounwind {
448; X64-LABEL: length8:
449; X64:       # %bb.0:
450; X64-NEXT:    movq (%rdi), %rax
451; X64-NEXT:    movq (%rsi), %rcx
452; X64-NEXT:    bswapq %rax
453; X64-NEXT:    bswapq %rcx
454; X64-NEXT:    cmpq %rcx, %rax
455; X64-NEXT:    seta %al
456; X64-NEXT:    sbbb $0, %al
457; X64-NEXT:    movsbl %al, %eax
458; X64-NEXT:    retq
459  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 8) nounwind
460  ret i32 %m
461}
462
463define i1 @length8_eq(ptr %X, ptr %Y) nounwind {
464; X64-LABEL: length8_eq:
465; X64:       # %bb.0:
466; X64-NEXT:    movq (%rdi), %rax
467; X64-NEXT:    cmpq (%rsi), %rax
468; X64-NEXT:    sete %al
469; X64-NEXT:    retq
470  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 8) nounwind
471  %c = icmp eq i32 %m, 0
472  ret i1 %c
473}
474
475define i1 @length8_eq_const(ptr %X) nounwind {
476; X64-LABEL: length8_eq_const:
477; X64:       # %bb.0:
478; X64-NEXT:    movabsq $3978425819141910832, %rax # imm = 0x3736353433323130
479; X64-NEXT:    cmpq %rax, (%rdi)
480; X64-NEXT:    setne %al
481; X64-NEXT:    retq
482  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 8) nounwind
483  %c = icmp ne i32 %m, 0
484  ret i1 %c
485}
486
487define i1 @length9_eq(ptr %X, ptr %Y) nounwind {
488; X64-LABEL: length9_eq:
489; X64:       # %bb.0:
490; X64-NEXT:    movq (%rdi), %rax
491; X64-NEXT:    xorq (%rsi), %rax
492; X64-NEXT:    movzbl 8(%rdi), %ecx
493; X64-NEXT:    xorb 8(%rsi), %cl
494; X64-NEXT:    movzbl %cl, %ecx
495; X64-NEXT:    orq %rax, %rcx
496; X64-NEXT:    sete %al
497; X64-NEXT:    retq
498  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 9) nounwind
499  %c = icmp eq i32 %m, 0
500  ret i1 %c
501}
502
503define i1 @length10_eq(ptr %X, ptr %Y) nounwind {
504; X64-LABEL: length10_eq:
505; X64:       # %bb.0:
506; X64-NEXT:    movq (%rdi), %rax
507; X64-NEXT:    xorq (%rsi), %rax
508; X64-NEXT:    movzwl 8(%rdi), %ecx
509; X64-NEXT:    xorw 8(%rsi), %cx
510; X64-NEXT:    movzwl %cx, %ecx
511; X64-NEXT:    orq %rax, %rcx
512; X64-NEXT:    sete %al
513; X64-NEXT:    retq
514  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 10) nounwind
515  %c = icmp eq i32 %m, 0
516  ret i1 %c
517}
518
519define i1 @length11_eq(ptr %X, ptr %Y) nounwind {
520; X64-LABEL: length11_eq:
521; X64:       # %bb.0:
522; X64-NEXT:    movq (%rdi), %rax
523; X64-NEXT:    movq 3(%rdi), %rcx
524; X64-NEXT:    xorq (%rsi), %rax
525; X64-NEXT:    xorq 3(%rsi), %rcx
526; X64-NEXT:    orq %rax, %rcx
527; X64-NEXT:    sete %al
528; X64-NEXT:    retq
529  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 11) nounwind
530  %c = icmp eq i32 %m, 0
531  ret i1 %c
532}
533
534define i1 @length12_eq(ptr %X, ptr %Y) nounwind {
535; X64-LABEL: length12_eq:
536; X64:       # %bb.0:
537; X64-NEXT:    movq (%rdi), %rax
538; X64-NEXT:    xorq (%rsi), %rax
539; X64-NEXT:    movl 8(%rdi), %ecx
540; X64-NEXT:    xorl 8(%rsi), %ecx
541; X64-NEXT:    orq %rax, %rcx
542; X64-NEXT:    setne %al
543; X64-NEXT:    retq
544  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind
545  %c = icmp ne i32 %m, 0
546  ret i1 %c
547}
548
549define i32 @length12(ptr %X, ptr %Y) nounwind {
550; X64-LABEL: length12:
551; X64:       # %bb.0:
552; X64-NEXT:    movq (%rdi), %rcx
553; X64-NEXT:    movq (%rsi), %rdx
554; X64-NEXT:    bswapq %rcx
555; X64-NEXT:    bswapq %rdx
556; X64-NEXT:    cmpq %rdx, %rcx
557; X64-NEXT:    jne .LBB33_2
558; X64-NEXT:  # %bb.1: # %loadbb1
559; X64-NEXT:    movl 8(%rdi), %ecx
560; X64-NEXT:    movl 8(%rsi), %edx
561; X64-NEXT:    bswapl %ecx
562; X64-NEXT:    bswapl %edx
563; X64-NEXT:    xorl %eax, %eax
564; X64-NEXT:    cmpq %rdx, %rcx
565; X64-NEXT:    je .LBB33_3
566; X64-NEXT:  .LBB33_2: # %res_block
567; X64-NEXT:    xorl %eax, %eax
568; X64-NEXT:    cmpq %rdx, %rcx
569; X64-NEXT:    sbbl %eax, %eax
570; X64-NEXT:    orl $1, %eax
571; X64-NEXT:  .LBB33_3: # %endblock
572; X64-NEXT:    retq
573  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind
574  ret i32 %m
575}
576
577define i1 @length13_eq(ptr %X, ptr %Y) nounwind {
578; X64-LABEL: length13_eq:
579; X64:       # %bb.0:
580; X64-NEXT:    movq (%rdi), %rax
581; X64-NEXT:    movq 5(%rdi), %rcx
582; X64-NEXT:    xorq (%rsi), %rax
583; X64-NEXT:    xorq 5(%rsi), %rcx
584; X64-NEXT:    orq %rax, %rcx
585; X64-NEXT:    sete %al
586; X64-NEXT:    retq
587  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 13) nounwind
588  %c = icmp eq i32 %m, 0
589  ret i1 %c
590}
591
592define i1 @length14_eq(ptr %X, ptr %Y) nounwind {
593; X64-LABEL: length14_eq:
594; X64:       # %bb.0:
595; X64-NEXT:    movq (%rdi), %rax
596; X64-NEXT:    movq 6(%rdi), %rcx
597; X64-NEXT:    xorq (%rsi), %rax
598; X64-NEXT:    xorq 6(%rsi), %rcx
599; X64-NEXT:    orq %rax, %rcx
600; X64-NEXT:    sete %al
601; X64-NEXT:    retq
602  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 14) nounwind
603  %c = icmp eq i32 %m, 0
604  ret i1 %c
605}
606
607define i32 @length15(ptr %X, ptr %Y) nounwind {
608; X64-LABEL: length15:
609; X64:       # %bb.0:
610; X64-NEXT:    movq (%rdi), %rcx
611; X64-NEXT:    movq (%rsi), %rdx
612; X64-NEXT:    bswapq %rcx
613; X64-NEXT:    bswapq %rdx
614; X64-NEXT:    cmpq %rdx, %rcx
615; X64-NEXT:    jne .LBB36_2
616; X64-NEXT:  # %bb.1: # %loadbb1
617; X64-NEXT:    movq 7(%rdi), %rcx
618; X64-NEXT:    movq 7(%rsi), %rdx
619; X64-NEXT:    bswapq %rcx
620; X64-NEXT:    bswapq %rdx
621; X64-NEXT:    xorl %eax, %eax
622; X64-NEXT:    cmpq %rdx, %rcx
623; X64-NEXT:    je .LBB36_3
624; X64-NEXT:  .LBB36_2: # %res_block
625; X64-NEXT:    xorl %eax, %eax
626; X64-NEXT:    cmpq %rdx, %rcx
627; X64-NEXT:    sbbl %eax, %eax
628; X64-NEXT:    orl $1, %eax
629; X64-NEXT:  .LBB36_3: # %endblock
630; X64-NEXT:    retq
631  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 15) nounwind
632  ret i32 %m
633}
634
635define i1 @length15_lt(ptr %X, ptr %Y) nounwind {
636; X64-LABEL: length15_lt:
637; X64:       # %bb.0:
638; X64-NEXT:    movq (%rdi), %rcx
639; X64-NEXT:    movq (%rsi), %rdx
640; X64-NEXT:    bswapq %rcx
641; X64-NEXT:    bswapq %rdx
642; X64-NEXT:    cmpq %rdx, %rcx
643; X64-NEXT:    jne .LBB37_2
644; X64-NEXT:  # %bb.1: # %loadbb1
645; X64-NEXT:    movq 7(%rdi), %rcx
646; X64-NEXT:    movq 7(%rsi), %rdx
647; X64-NEXT:    bswapq %rcx
648; X64-NEXT:    bswapq %rdx
649; X64-NEXT:    xorl %eax, %eax
650; X64-NEXT:    cmpq %rdx, %rcx
651; X64-NEXT:    je .LBB37_3
652; X64-NEXT:  .LBB37_2: # %res_block
653; X64-NEXT:    xorl %eax, %eax
654; X64-NEXT:    cmpq %rdx, %rcx
655; X64-NEXT:    sbbl %eax, %eax
656; X64-NEXT:    orl $1, %eax
657; X64-NEXT:  .LBB37_3: # %endblock
658; X64-NEXT:    shrl $31, %eax
659; X64-NEXT:    # kill: def $al killed $al killed $eax
660; X64-NEXT:    retq
661  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 15) nounwind
662  %c = icmp slt i32 %m, 0
663  ret i1 %c
664}
665
666define i32 @length15_const(ptr %X, ptr %Y) nounwind {
667; X64-LABEL: length15_const:
668; X64:       # %bb.0:
669; X64-NEXT:    movabsq $3544952156018063160, %rcx # imm = 0x3132333435363738
670; X64-NEXT:    movq (%rdi), %rdx
671; X64-NEXT:    bswapq %rdx
672; X64-NEXT:    cmpq %rcx, %rdx
673; X64-NEXT:    jne .LBB38_2
674; X64-NEXT:  # %bb.1: # %loadbb1
675; X64-NEXT:    movabsq $4051322327650219061, %rcx # imm = 0x3839303132333435
676; X64-NEXT:    movq 7(%rdi), %rdx
677; X64-NEXT:    bswapq %rdx
678; X64-NEXT:    xorl %eax, %eax
679; X64-NEXT:    cmpq %rcx, %rdx
680; X64-NEXT:    je .LBB38_3
681; X64-NEXT:  .LBB38_2: # %res_block
682; X64-NEXT:    xorl %eax, %eax
683; X64-NEXT:    cmpq %rcx, %rdx
684; X64-NEXT:    sbbl %eax, %eax
685; X64-NEXT:    orl $1, %eax
686; X64-NEXT:  .LBB38_3: # %endblock
687; X64-NEXT:    retq
688  %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 15) nounwind
689  ret i32 %m
690}
691
692define i1 @length15_eq(ptr %X, ptr %Y) nounwind {
693; X64-LABEL: length15_eq:
694; X64:       # %bb.0:
695; X64-NEXT:    movq (%rdi), %rax
696; X64-NEXT:    movq 7(%rdi), %rcx
697; X64-NEXT:    xorq (%rsi), %rax
698; X64-NEXT:    xorq 7(%rsi), %rcx
699; X64-NEXT:    orq %rax, %rcx
700; X64-NEXT:    sete %al
701; X64-NEXT:    retq
702  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 15) nounwind
703  %c = icmp eq i32 %m, 0
704  ret i1 %c
705}
706
707define i1 @length15_gt_const(ptr %X, ptr %Y) nounwind {
708; X64-LABEL: length15_gt_const:
709; X64:       # %bb.0:
710; X64-NEXT:    movabsq $3544952156018063160, %rax # imm = 0x3132333435363738
711; X64-NEXT:    movq (%rdi), %rcx
712; X64-NEXT:    bswapq %rcx
713; X64-NEXT:    cmpq %rax, %rcx
714; X64-NEXT:    jne .LBB40_2
715; X64-NEXT:  # %bb.1: # %loadbb1
716; X64-NEXT:    movabsq $4051322327650219061, %rax # imm = 0x3839303132333435
717; X64-NEXT:    movq 7(%rdi), %rcx
718; X64-NEXT:    bswapq %rcx
719; X64-NEXT:    xorl %edx, %edx
720; X64-NEXT:    cmpq %rax, %rcx
721; X64-NEXT:    je .LBB40_3
722; X64-NEXT:  .LBB40_2: # %res_block
723; X64-NEXT:    xorl %edx, %edx
724; X64-NEXT:    cmpq %rax, %rcx
725; X64-NEXT:    sbbl %edx, %edx
726; X64-NEXT:    orl $1, %edx
727; X64-NEXT:  .LBB40_3: # %endblock
728; X64-NEXT:    testl %edx, %edx
729; X64-NEXT:    setg %al
730; X64-NEXT:    retq
731  %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 15) nounwind
732  %c = icmp sgt i32 %m, 0
733  ret i1 %c
734}
735
736; PR33329 - https://bugs.llvm.org/show_bug.cgi?id=33329
737
738define i32 @length16(ptr %X, ptr %Y) nounwind {
739; X64-LABEL: length16:
740; X64:       # %bb.0:
741; X64-NEXT:    movq (%rdi), %rcx
742; X64-NEXT:    movq (%rsi), %rdx
743; X64-NEXT:    bswapq %rcx
744; X64-NEXT:    bswapq %rdx
745; X64-NEXT:    cmpq %rdx, %rcx
746; X64-NEXT:    jne .LBB41_2
747; X64-NEXT:  # %bb.1: # %loadbb1
748; X64-NEXT:    movq 8(%rdi), %rcx
749; X64-NEXT:    movq 8(%rsi), %rdx
750; X64-NEXT:    bswapq %rcx
751; X64-NEXT:    bswapq %rdx
752; X64-NEXT:    xorl %eax, %eax
753; X64-NEXT:    cmpq %rdx, %rcx
754; X64-NEXT:    je .LBB41_3
755; X64-NEXT:  .LBB41_2: # %res_block
756; X64-NEXT:    xorl %eax, %eax
757; X64-NEXT:    cmpq %rdx, %rcx
758; X64-NEXT:    sbbl %eax, %eax
759; X64-NEXT:    orl $1, %eax
760; X64-NEXT:  .LBB41_3: # %endblock
761; X64-NEXT:    retq
762  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 16) nounwind
763  ret i32 %m
764}
765
766define i1 @length16_eq(ptr %x, ptr %y) nounwind {
767; X64-SSE2-LABEL: length16_eq:
768; X64-SSE2:       # %bb.0:
769; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
770; X64-SSE2-NEXT:    movdqu (%rsi), %xmm1
771; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm1
772; X64-SSE2-NEXT:    pmovmskb %xmm1, %eax
773; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
774; X64-SSE2-NEXT:    setne %al
775; X64-SSE2-NEXT:    retq
776;
777; X64-SSE41-LABEL: length16_eq:
778; X64-SSE41:       # %bb.0:
779; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
780; X64-SSE41-NEXT:    movdqu (%rsi), %xmm1
781; X64-SSE41-NEXT:    pxor %xmm0, %xmm1
782; X64-SSE41-NEXT:    ptest %xmm1, %xmm1
783; X64-SSE41-NEXT:    setne %al
784; X64-SSE41-NEXT:    retq
785;
786; X64-AVX-LABEL: length16_eq:
787; X64-AVX:       # %bb.0:
788; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
789; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0
790; X64-AVX-NEXT:    vptest %xmm0, %xmm0
791; X64-AVX-NEXT:    setne %al
792; X64-AVX-NEXT:    retq
793;
794; X64-MIC-AVX-LABEL: length16_eq:
795; X64-MIC-AVX:       # %bb.0:
796; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
797; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm1
798; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
799; X64-MIC-AVX-NEXT:    kortestw %k0, %k0
800; X64-MIC-AVX-NEXT:    setne %al
801; X64-MIC-AVX-NEXT:    vzeroupper
802; X64-MIC-AVX-NEXT:    retq
803  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16) nounwind
804  %cmp = icmp ne i32 %call, 0
805  ret i1 %cmp
806}
807
808define i1 @length16_lt(ptr %x, ptr %y) nounwind {
809; X64-LABEL: length16_lt:
810; X64:       # %bb.0:
811; X64-NEXT:    movq (%rdi), %rcx
812; X64-NEXT:    movq (%rsi), %rdx
813; X64-NEXT:    bswapq %rcx
814; X64-NEXT:    bswapq %rdx
815; X64-NEXT:    cmpq %rdx, %rcx
816; X64-NEXT:    jne .LBB43_2
817; X64-NEXT:  # %bb.1: # %loadbb1
818; X64-NEXT:    movq 8(%rdi), %rcx
819; X64-NEXT:    movq 8(%rsi), %rdx
820; X64-NEXT:    bswapq %rcx
821; X64-NEXT:    bswapq %rdx
822; X64-NEXT:    xorl %eax, %eax
823; X64-NEXT:    cmpq %rdx, %rcx
824; X64-NEXT:    je .LBB43_3
825; X64-NEXT:  .LBB43_2: # %res_block
826; X64-NEXT:    xorl %eax, %eax
827; X64-NEXT:    cmpq %rdx, %rcx
828; X64-NEXT:    sbbl %eax, %eax
829; X64-NEXT:    orl $1, %eax
830; X64-NEXT:  .LBB43_3: # %endblock
831; X64-NEXT:    shrl $31, %eax
832; X64-NEXT:    # kill: def $al killed $al killed $eax
833; X64-NEXT:    retq
834  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16) nounwind
835  %cmp = icmp slt i32 %call, 0
836  ret i1 %cmp
837}
838
839define i1 @length16_gt(ptr %x, ptr %y) nounwind {
840; X64-LABEL: length16_gt:
841; X64:       # %bb.0:
842; X64-NEXT:    movq (%rdi), %rax
843; X64-NEXT:    movq (%rsi), %rcx
844; X64-NEXT:    bswapq %rax
845; X64-NEXT:    bswapq %rcx
846; X64-NEXT:    cmpq %rcx, %rax
847; X64-NEXT:    jne .LBB44_2
848; X64-NEXT:  # %bb.1: # %loadbb1
849; X64-NEXT:    movq 8(%rdi), %rax
850; X64-NEXT:    movq 8(%rsi), %rcx
851; X64-NEXT:    bswapq %rax
852; X64-NEXT:    bswapq %rcx
853; X64-NEXT:    xorl %edx, %edx
854; X64-NEXT:    cmpq %rcx, %rax
855; X64-NEXT:    je .LBB44_3
856; X64-NEXT:  .LBB44_2: # %res_block
857; X64-NEXT:    xorl %edx, %edx
858; X64-NEXT:    cmpq %rcx, %rax
859; X64-NEXT:    sbbl %edx, %edx
860; X64-NEXT:    orl $1, %edx
861; X64-NEXT:  .LBB44_3: # %endblock
862; X64-NEXT:    testl %edx, %edx
863; X64-NEXT:    setg %al
864; X64-NEXT:    retq
865  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16) nounwind
866  %cmp = icmp sgt i32 %call, 0
867  ret i1 %cmp
868}
869
870define i1 @length16_eq_const(ptr %X) nounwind {
871; X64-SSE2-LABEL: length16_eq_const:
872; X64-SSE2:       # %bb.0:
873; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
874; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
875; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
876; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
877; X64-SSE2-NEXT:    sete %al
878; X64-SSE2-NEXT:    retq
879;
880; X64-SSE41-LABEL: length16_eq_const:
881; X64-SSE41:       # %bb.0:
882; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
883; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
884; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
885; X64-SSE41-NEXT:    sete %al
886; X64-SSE41-NEXT:    retq
887;
888; X64-AVX-LABEL: length16_eq_const:
889; X64-AVX:       # %bb.0:
890; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
891; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
892; X64-AVX-NEXT:    vptest %xmm0, %xmm0
893; X64-AVX-NEXT:    sete %al
894; X64-AVX-NEXT:    retq
895;
896; X64-MIC-AVX-LABEL: length16_eq_const:
897; X64-MIC-AVX:       # %bb.0:
898; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
899; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426]
900; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
901; X64-MIC-AVX-NEXT:    kortestw %k0, %k0
902; X64-MIC-AVX-NEXT:    sete %al
903; X64-MIC-AVX-NEXT:    vzeroupper
904; X64-MIC-AVX-NEXT:    retq
905  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 16) nounwind
906  %c = icmp eq i32 %m, 0
907  ret i1 %c
908}
909
910; PR33914 - https://bugs.llvm.org/show_bug.cgi?id=33914
911
912define i32 @length24(ptr %X, ptr %Y) nounwind {
913; X64-LABEL: length24:
914; X64:       # %bb.0:
915; X64-NEXT:    movl $24, %edx
916; X64-NEXT:    jmp memcmp # TAILCALL
917  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 24) nounwind
918  ret i32 %m
919}
920
921define i1 @length24_eq(ptr %x, ptr %y) nounwind {
922; X64-SSE2-LABEL: length24_eq:
923; X64-SSE2:       # %bb.0:
924; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
925; X64-SSE2-NEXT:    movdqu (%rsi), %xmm1
926; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm1
927; X64-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
928; X64-SSE2-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero
929; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
930; X64-SSE2-NEXT:    pand %xmm1, %xmm2
931; X64-SSE2-NEXT:    pmovmskb %xmm2, %eax
932; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
933; X64-SSE2-NEXT:    sete %al
934; X64-SSE2-NEXT:    retq
935;
936; X64-SSE41-LABEL: length24_eq:
937; X64-SSE41:       # %bb.0:
938; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
939; X64-SSE41-NEXT:    movdqu (%rsi), %xmm1
940; X64-SSE41-NEXT:    pxor %xmm0, %xmm1
941; X64-SSE41-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
942; X64-SSE41-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero
943; X64-SSE41-NEXT:    pxor %xmm0, %xmm2
944; X64-SSE41-NEXT:    por %xmm1, %xmm2
945; X64-SSE41-NEXT:    ptest %xmm2, %xmm2
946; X64-SSE41-NEXT:    sete %al
947; X64-SSE41-NEXT:    retq
948;
949; X64-AVX-LABEL: length24_eq:
950; X64-AVX:       # %bb.0:
951; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
952; X64-AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
953; X64-AVX-NEXT:    vmovq {{.*#+}} xmm2 = mem[0],zero
954; X64-AVX-NEXT:    vpxor %xmm2, %xmm1, %xmm1
955; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0
956; X64-AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0
957; X64-AVX-NEXT:    vptest %xmm0, %xmm0
958; X64-AVX-NEXT:    sete %al
959; X64-AVX-NEXT:    retq
960;
961; X64-MIC-AVX-LABEL: length24_eq:
962; X64-MIC-AVX:       # %bb.0:
963; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
964; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm1
965; X64-MIC-AVX-NEXT:    vmovq {{.*#+}} xmm2 = mem[0],zero
966; X64-MIC-AVX-NEXT:    vmovq {{.*#+}} xmm3 = mem[0],zero
967; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm2, %k0
968; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
969; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
970; X64-MIC-AVX-NEXT:    sete %al
971; X64-MIC-AVX-NEXT:    vzeroupper
972; X64-MIC-AVX-NEXT:    retq
973  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 24) nounwind
974  %cmp = icmp eq i32 %call, 0
975  ret i1 %cmp
976}
977
978define i1 @length24_lt(ptr %x, ptr %y) nounwind {
979; X64-LABEL: length24_lt:
980; X64:       # %bb.0:
981; X64-NEXT:    pushq %rax
982; X64-NEXT:    movl $24, %edx
983; X64-NEXT:    callq memcmp
984; X64-NEXT:    shrl $31, %eax
985; X64-NEXT:    # kill: def $al killed $al killed $eax
986; X64-NEXT:    popq %rcx
987; X64-NEXT:    retq
988  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 24) nounwind
989  %cmp = icmp slt i32 %call, 0
990  ret i1 %cmp
991}
992
993define i1 @length24_gt(ptr %x, ptr %y) nounwind {
994; X64-LABEL: length24_gt:
995; X64:       # %bb.0:
996; X64-NEXT:    pushq %rax
997; X64-NEXT:    movl $24, %edx
998; X64-NEXT:    callq memcmp
999; X64-NEXT:    testl %eax, %eax
1000; X64-NEXT:    setg %al
1001; X64-NEXT:    popq %rcx
1002; X64-NEXT:    retq
1003  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 24) nounwind
1004  %cmp = icmp sgt i32 %call, 0
1005  ret i1 %cmp
1006}
1007
1008define i1 @length24_eq_const(ptr %X) nounwind {
1009; X64-SSE2-LABEL: length24_eq_const:
1010; X64-SSE2:       # %bb.0:
1011; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1012; X64-SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
1013; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1014; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1015; X64-SSE2-NEXT:    pand %xmm1, %xmm0
1016; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
1017; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1018; X64-SSE2-NEXT:    setne %al
1019; X64-SSE2-NEXT:    retq
1020;
1021; X64-SSE41-LABEL: length24_eq_const:
1022; X64-SSE41:       # %bb.0:
1023; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1024; X64-SSE41-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
1025; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1026; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1027; X64-SSE41-NEXT:    por %xmm1, %xmm0
1028; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
1029; X64-SSE41-NEXT:    setne %al
1030; X64-SSE41-NEXT:    retq
1031;
1032; X64-AVX-LABEL: length24_eq_const:
1033; X64-AVX:       # %bb.0:
1034; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1035; X64-AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
1036; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1037; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1038; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1039; X64-AVX-NEXT:    vptest %xmm0, %xmm0
1040; X64-AVX-NEXT:    setne %al
1041; X64-AVX-NEXT:    retq
1042;
1043; X64-MIC-AVX-LABEL: length24_eq_const:
1044; X64-MIC-AVX:       # %bb.0:
1045; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1046; X64-MIC-AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
1047; X64-MIC-AVX-NEXT:    vmovq {{.*#+}} xmm2 = [959985462,858927408,0,0]
1048; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm1, %k0
1049; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426]
1050; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
1051; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
1052; X64-MIC-AVX-NEXT:    setne %al
1053; X64-MIC-AVX-NEXT:    vzeroupper
1054; X64-MIC-AVX-NEXT:    retq
1055  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 24) nounwind
1056  %c = icmp ne i32 %m, 0
1057  ret i1 %c
1058}
1059
1060define i32 @length31(ptr %X, ptr %Y) nounwind {
1061; X64-LABEL: length31:
1062; X64:       # %bb.0:
1063; X64-NEXT:    movl $31, %edx
1064; X64-NEXT:    jmp memcmp # TAILCALL
1065  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 31) nounwind
1066  ret i32 %m
1067}
1068
1069define i1 @length31_eq(ptr %x, ptr %y) nounwind {
1070; X64-SSE2-LABEL: length31_eq:
1071; X64-SSE2:       # %bb.0:
1072; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1073; X64-SSE2-NEXT:    movdqu 15(%rdi), %xmm1
1074; X64-SSE2-NEXT:    movdqu (%rsi), %xmm2
1075; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1076; X64-SSE2-NEXT:    movdqu 15(%rsi), %xmm0
1077; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1078; X64-SSE2-NEXT:    pand %xmm2, %xmm0
1079; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
1080; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1081; X64-SSE2-NEXT:    sete %al
1082; X64-SSE2-NEXT:    retq
1083;
1084; X64-SSE41-LABEL: length31_eq:
1085; X64-SSE41:       # %bb.0:
1086; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1087; X64-SSE41-NEXT:    movdqu 15(%rdi), %xmm1
1088; X64-SSE41-NEXT:    movdqu (%rsi), %xmm2
1089; X64-SSE41-NEXT:    pxor %xmm0, %xmm2
1090; X64-SSE41-NEXT:    movdqu 15(%rsi), %xmm0
1091; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
1092; X64-SSE41-NEXT:    por %xmm2, %xmm0
1093; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
1094; X64-SSE41-NEXT:    sete %al
1095; X64-SSE41-NEXT:    retq
1096;
1097; X64-AVX-LABEL: length31_eq:
1098; X64-AVX:       # %bb.0:
1099; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1100; X64-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
1101; X64-AVX-NEXT:    vpxor 15(%rsi), %xmm1, %xmm1
1102; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0
1103; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1104; X64-AVX-NEXT:    vptest %xmm0, %xmm0
1105; X64-AVX-NEXT:    sete %al
1106; X64-AVX-NEXT:    retq
1107;
1108; X64-MIC-AVX-LABEL: length31_eq:
1109; X64-MIC-AVX:       # %bb.0:
1110; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1111; X64-MIC-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
1112; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm2
1113; X64-MIC-AVX-NEXT:    vmovdqu 15(%rsi), %xmm3
1114; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm1, %k0
1115; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm0, %k1
1116; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
1117; X64-MIC-AVX-NEXT:    sete %al
1118; X64-MIC-AVX-NEXT:    vzeroupper
1119; X64-MIC-AVX-NEXT:    retq
1120  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind
1121  %cmp = icmp eq i32 %call, 0
1122  ret i1 %cmp
1123}
1124
1125define i1 @length31_lt(ptr %x, ptr %y) nounwind {
1126; X64-LABEL: length31_lt:
1127; X64:       # %bb.0:
1128; X64-NEXT:    pushq %rax
1129; X64-NEXT:    movl $31, %edx
1130; X64-NEXT:    callq memcmp
1131; X64-NEXT:    shrl $31, %eax
1132; X64-NEXT:    # kill: def $al killed $al killed $eax
1133; X64-NEXT:    popq %rcx
1134; X64-NEXT:    retq
1135  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind
1136  %cmp = icmp slt i32 %call, 0
1137  ret i1 %cmp
1138}
1139
1140define i1 @length31_gt(ptr %x, ptr %y) nounwind {
1141; X64-LABEL: length31_gt:
1142; X64:       # %bb.0:
1143; X64-NEXT:    pushq %rax
1144; X64-NEXT:    movl $31, %edx
1145; X64-NEXT:    callq memcmp
1146; X64-NEXT:    testl %eax, %eax
1147; X64-NEXT:    setg %al
1148; X64-NEXT:    popq %rcx
1149; X64-NEXT:    retq
1150  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind
1151  %cmp = icmp sgt i32 %call, 0
1152  ret i1 %cmp
1153}
1154
1155define i1 @length31_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {
1156; X64-SSE2-LABEL: length31_eq_prefer128:
1157; X64-SSE2:       # %bb.0:
1158; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1159; X64-SSE2-NEXT:    movdqu 15(%rdi), %xmm1
1160; X64-SSE2-NEXT:    movdqu (%rsi), %xmm2
1161; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1162; X64-SSE2-NEXT:    movdqu 15(%rsi), %xmm0
1163; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1164; X64-SSE2-NEXT:    pand %xmm2, %xmm0
1165; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
1166; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1167; X64-SSE2-NEXT:    sete %al
1168; X64-SSE2-NEXT:    retq
1169;
1170; X64-SSE41-LABEL: length31_eq_prefer128:
1171; X64-SSE41:       # %bb.0:
1172; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1173; X64-SSE41-NEXT:    movdqu 15(%rdi), %xmm1
1174; X64-SSE41-NEXT:    movdqu (%rsi), %xmm2
1175; X64-SSE41-NEXT:    pxor %xmm0, %xmm2
1176; X64-SSE41-NEXT:    movdqu 15(%rsi), %xmm0
1177; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
1178; X64-SSE41-NEXT:    por %xmm2, %xmm0
1179; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
1180; X64-SSE41-NEXT:    sete %al
1181; X64-SSE41-NEXT:    retq
1182;
1183; X64-AVX-LABEL: length31_eq_prefer128:
1184; X64-AVX:       # %bb.0:
1185; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1186; X64-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
1187; X64-AVX-NEXT:    vpxor 15(%rsi), %xmm1, %xmm1
1188; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0
1189; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1190; X64-AVX-NEXT:    vptest %xmm0, %xmm0
1191; X64-AVX-NEXT:    sete %al
1192; X64-AVX-NEXT:    retq
1193;
1194; X64-MIC-AVX-LABEL: length31_eq_prefer128:
1195; X64-MIC-AVX:       # %bb.0:
1196; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1197; X64-MIC-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
1198; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm2
1199; X64-MIC-AVX-NEXT:    vmovdqu 15(%rsi), %xmm3
1200; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm1, %k0
1201; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm0, %k1
1202; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
1203; X64-MIC-AVX-NEXT:    sete %al
1204; X64-MIC-AVX-NEXT:    vzeroupper
1205; X64-MIC-AVX-NEXT:    retq
1206  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind
1207  %cmp = icmp eq i32 %call, 0
1208  ret i1 %cmp
1209}
1210
1211define i1 @length31_eq_const(ptr %X) nounwind {
1212; X64-SSE2-LABEL: length31_eq_const:
1213; X64-SSE2:       # %bb.0:
1214; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1215; X64-SSE2-NEXT:    movdqu 15(%rdi), %xmm1
1216; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1217; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1218; X64-SSE2-NEXT:    pand %xmm1, %xmm0
1219; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
1220; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1221; X64-SSE2-NEXT:    setne %al
1222; X64-SSE2-NEXT:    retq
1223;
1224; X64-SSE41-LABEL: length31_eq_const:
1225; X64-SSE41:       # %bb.0:
1226; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1227; X64-SSE41-NEXT:    movdqu 15(%rdi), %xmm1
1228; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1229; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1230; X64-SSE41-NEXT:    por %xmm1, %xmm0
1231; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
1232; X64-SSE41-NEXT:    setne %al
1233; X64-SSE41-NEXT:    retq
1234;
1235; X64-AVX-LABEL: length31_eq_const:
1236; X64-AVX:       # %bb.0:
1237; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1238; X64-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
1239; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1240; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1241; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1242; X64-AVX-NEXT:    vptest %xmm0, %xmm0
1243; X64-AVX-NEXT:    setne %al
1244; X64-AVX-NEXT:    retq
1245;
1246; X64-MIC-AVX-LABEL: length31_eq_const:
1247; X64-MIC-AVX:       # %bb.0:
1248; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1249; X64-MIC-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
1250; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [943142453,842084409,909456435,809056311]
1251; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm1, %k0
1252; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426]
1253; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
1254; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
1255; X64-MIC-AVX-NEXT:    setne %al
1256; X64-MIC-AVX-NEXT:    vzeroupper
1257; X64-MIC-AVX-NEXT:    retq
1258  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 31) nounwind
1259  %c = icmp ne i32 %m, 0
1260  ret i1 %c
1261}
1262
1263define i32 @length32(ptr %X, ptr %Y) nounwind {
1264; X64-LABEL: length32:
1265; X64:       # %bb.0:
1266; X64-NEXT:    movl $32, %edx
1267; X64-NEXT:    jmp memcmp # TAILCALL
1268  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 32) nounwind
1269  ret i32 %m
1270}
1271
1272; PR33325 - https://bugs.llvm.org/show_bug.cgi?id=33325
1273
1274define i1 @length32_eq(ptr %x, ptr %y) nounwind {
1275; X64-SSE2-LABEL: length32_eq:
1276; X64-SSE2:       # %bb.0:
1277; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1278; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
1279; X64-SSE2-NEXT:    movdqu (%rsi), %xmm2
1280; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1281; X64-SSE2-NEXT:    movdqu 16(%rsi), %xmm0
1282; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1283; X64-SSE2-NEXT:    pand %xmm2, %xmm0
1284; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
1285; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1286; X64-SSE2-NEXT:    sete %al
1287; X64-SSE2-NEXT:    retq
1288;
1289; X64-SSE41-LABEL: length32_eq:
1290; X64-SSE41:       # %bb.0:
1291; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1292; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
1293; X64-SSE41-NEXT:    movdqu (%rsi), %xmm2
1294; X64-SSE41-NEXT:    pxor %xmm0, %xmm2
1295; X64-SSE41-NEXT:    movdqu 16(%rsi), %xmm0
1296; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
1297; X64-SSE41-NEXT:    por %xmm2, %xmm0
1298; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
1299; X64-SSE41-NEXT:    sete %al
1300; X64-SSE41-NEXT:    retq
1301;
1302; X64-AVX1-LABEL: length32_eq:
1303; X64-AVX1:       # %bb.0:
1304; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
1305; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
1306; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
1307; X64-AVX1-NEXT:    sete %al
1308; X64-AVX1-NEXT:    vzeroupper
1309; X64-AVX1-NEXT:    retq
1310;
1311; X64-AVX2-LABEL: length32_eq:
1312; X64-AVX2:       # %bb.0:
1313; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
1314; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
1315; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
1316; X64-AVX2-NEXT:    sete %al
1317; X64-AVX2-NEXT:    vzeroupper
1318; X64-AVX2-NEXT:    retq
1319;
1320; X64-AVX512-LABEL: length32_eq:
1321; X64-AVX512:       # %bb.0:
1322; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
1323; X64-AVX512-NEXT:    vpxor (%rsi), %ymm0, %ymm0
1324; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
1325; X64-AVX512-NEXT:    sete %al
1326; X64-AVX512-NEXT:    vzeroupper
1327; X64-AVX512-NEXT:    retq
1328;
1329; X64-MIC-AVX-LABEL: length32_eq:
1330; X64-MIC-AVX:       # %bb.0:
1331; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
1332; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %ymm1
1333; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
1334; X64-MIC-AVX-NEXT:    kortestw %k0, %k0
1335; X64-MIC-AVX-NEXT:    sete %al
1336; X64-MIC-AVX-NEXT:    vzeroupper
1337; X64-MIC-AVX-NEXT:    retq
1338  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind
1339  %cmp = icmp eq i32 %call, 0
1340  ret i1 %cmp
1341}
1342
1343define i1 @length32_lt(ptr %x, ptr %y) nounwind {
1344; X64-LABEL: length32_lt:
1345; X64:       # %bb.0:
1346; X64-NEXT:    pushq %rax
1347; X64-NEXT:    movl $32, %edx
1348; X64-NEXT:    callq memcmp
1349; X64-NEXT:    shrl $31, %eax
1350; X64-NEXT:    # kill: def $al killed $al killed $eax
1351; X64-NEXT:    popq %rcx
1352; X64-NEXT:    retq
1353  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind
1354  %cmp = icmp slt i32 %call, 0
1355  ret i1 %cmp
1356}
1357
1358define i1 @length32_gt(ptr %x, ptr %y) nounwind {
1359; X64-LABEL: length32_gt:
1360; X64:       # %bb.0:
1361; X64-NEXT:    pushq %rax
1362; X64-NEXT:    movl $32, %edx
1363; X64-NEXT:    callq memcmp
1364; X64-NEXT:    testl %eax, %eax
1365; X64-NEXT:    setg %al
1366; X64-NEXT:    popq %rcx
1367; X64-NEXT:    retq
1368  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind
1369  %cmp = icmp sgt i32 %call, 0
1370  ret i1 %cmp
1371}
1372
1373define i1 @length32_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {
1374; X64-SSE2-LABEL: length32_eq_prefer128:
1375; X64-SSE2:       # %bb.0:
1376; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1377; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
1378; X64-SSE2-NEXT:    movdqu (%rsi), %xmm2
1379; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1380; X64-SSE2-NEXT:    movdqu 16(%rsi), %xmm0
1381; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1382; X64-SSE2-NEXT:    pand %xmm2, %xmm0
1383; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
1384; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1385; X64-SSE2-NEXT:    sete %al
1386; X64-SSE2-NEXT:    retq
1387;
1388; X64-SSE41-LABEL: length32_eq_prefer128:
1389; X64-SSE41:       # %bb.0:
1390; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1391; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
1392; X64-SSE41-NEXT:    movdqu (%rsi), %xmm2
1393; X64-SSE41-NEXT:    pxor %xmm0, %xmm2
1394; X64-SSE41-NEXT:    movdqu 16(%rsi), %xmm0
1395; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
1396; X64-SSE41-NEXT:    por %xmm2, %xmm0
1397; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
1398; X64-SSE41-NEXT:    sete %al
1399; X64-SSE41-NEXT:    retq
1400;
1401; X64-AVX-LABEL: length32_eq_prefer128:
1402; X64-AVX:       # %bb.0:
1403; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1404; X64-AVX-NEXT:    vmovdqu 16(%rdi), %xmm1
1405; X64-AVX-NEXT:    vpxor 16(%rsi), %xmm1, %xmm1
1406; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0
1407; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1408; X64-AVX-NEXT:    vptest %xmm0, %xmm0
1409; X64-AVX-NEXT:    sete %al
1410; X64-AVX-NEXT:    retq
1411;
1412; X64-MIC-AVX-LABEL: length32_eq_prefer128:
1413; X64-MIC-AVX:       # %bb.0:
1414; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1415; X64-MIC-AVX-NEXT:    vmovdqu 16(%rdi), %xmm1
1416; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm2
1417; X64-MIC-AVX-NEXT:    vmovdqu 16(%rsi), %xmm3
1418; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm1, %k0
1419; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm0, %k1
1420; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
1421; X64-MIC-AVX-NEXT:    sete %al
1422; X64-MIC-AVX-NEXT:    vzeroupper
1423; X64-MIC-AVX-NEXT:    retq
1424  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind
1425  %cmp = icmp eq i32 %call, 0
1426  ret i1 %cmp
1427}
1428
1429define i1 @length32_eq_const(ptr %X) nounwind {
1430; X64-SSE2-LABEL: length32_eq_const:
1431; X64-SSE2:       # %bb.0:
1432; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1433; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
1434; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1435; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1436; X64-SSE2-NEXT:    pand %xmm1, %xmm0
1437; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
1438; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1439; X64-SSE2-NEXT:    setne %al
1440; X64-SSE2-NEXT:    retq
1441;
1442; X64-SSE41-LABEL: length32_eq_const:
1443; X64-SSE41:       # %bb.0:
1444; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1445; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
1446; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1447; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1448; X64-SSE41-NEXT:    por %xmm1, %xmm0
1449; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
1450; X64-SSE41-NEXT:    setne %al
1451; X64-SSE41-NEXT:    retq
1452;
1453; X64-AVX1-LABEL: length32_eq_const:
1454; X64-AVX1:       # %bb.0:
1455; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
1456; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1457; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
1458; X64-AVX1-NEXT:    setne %al
1459; X64-AVX1-NEXT:    vzeroupper
1460; X64-AVX1-NEXT:    retq
1461;
1462; X64-AVX2-LABEL: length32_eq_const:
1463; X64-AVX2:       # %bb.0:
1464; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
1465; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1466; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
1467; X64-AVX2-NEXT:    setne %al
1468; X64-AVX2-NEXT:    vzeroupper
1469; X64-AVX2-NEXT:    retq
1470;
1471; X64-AVX512-LABEL: length32_eq_const:
1472; X64-AVX512:       # %bb.0:
1473; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
1474; X64-AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1475; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
1476; X64-AVX512-NEXT:    setne %al
1477; X64-AVX512-NEXT:    vzeroupper
1478; X64-AVX512-NEXT:    retq
1479;
1480; X64-MIC-AVX-LABEL: length32_eq_const:
1481; X64-MIC-AVX:       # %bb.0:
1482; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
1483; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
1484; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
1485; X64-MIC-AVX-NEXT:    kortestw %k0, %k0
1486; X64-MIC-AVX-NEXT:    setne %al
1487; X64-MIC-AVX-NEXT:    vzeroupper
1488; X64-MIC-AVX-NEXT:    retq
1489  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 32) nounwind
1490  %c = icmp ne i32 %m, 0
1491  ret i1 %c
1492}
1493
1494define i32 @length48(ptr %X, ptr %Y) nounwind {
1495; X64-LABEL: length48:
1496; X64:       # %bb.0:
1497; X64-NEXT:    movl $48, %edx
1498; X64-NEXT:    jmp memcmp # TAILCALL
1499  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 48) nounwind
1500  ret i32 %m
1501}
1502
1503define i1 @length48_eq(ptr %x, ptr %y) nounwind {
1504; X64-SSE-LABEL: length48_eq:
1505; X64-SSE:       # %bb.0:
1506; X64-SSE-NEXT:    pushq %rax
1507; X64-SSE-NEXT:    movl $48, %edx
1508; X64-SSE-NEXT:    callq memcmp
1509; X64-SSE-NEXT:    testl %eax, %eax
1510; X64-SSE-NEXT:    sete %al
1511; X64-SSE-NEXT:    popq %rcx
1512; X64-SSE-NEXT:    retq
1513;
1514; X64-AVX1-LABEL: length48_eq:
1515; X64-AVX1:       # %bb.0:
1516; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
1517; X64-AVX1-NEXT:    vmovups 32(%rdi), %xmm1
1518; X64-AVX1-NEXT:    vmovups 32(%rsi), %xmm2
1519; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
1520; X64-AVX1-NEXT:    vxorps %ymm2, %ymm1, %ymm1
1521; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1522; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
1523; X64-AVX1-NEXT:    sete %al
1524; X64-AVX1-NEXT:    vzeroupper
1525; X64-AVX1-NEXT:    retq
1526;
1527; X64-AVX2-LABEL: length48_eq:
1528; X64-AVX2:       # %bb.0:
1529; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
1530; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %xmm1
1531; X64-AVX2-NEXT:    vmovdqu 32(%rsi), %xmm2
1532; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
1533; X64-AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm1
1534; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1535; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
1536; X64-AVX2-NEXT:    sete %al
1537; X64-AVX2-NEXT:    vzeroupper
1538; X64-AVX2-NEXT:    retq
1539;
1540; X64-AVX512-LABEL: length48_eq:
1541; X64-AVX512:       # %bb.0:
1542; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
1543; X64-AVX512-NEXT:    vmovdqu 32(%rdi), %xmm1
1544; X64-AVX512-NEXT:    vmovdqu 32(%rsi), %xmm2
1545; X64-AVX512-NEXT:    vpxor (%rsi), %ymm0, %ymm0
1546; X64-AVX512-NEXT:    vpxor %ymm2, %ymm1, %ymm1
1547; X64-AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
1548; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
1549; X64-AVX512-NEXT:    sete %al
1550; X64-AVX512-NEXT:    vzeroupper
1551; X64-AVX512-NEXT:    retq
1552;
1553; X64-MIC-AVX-LABEL: length48_eq:
1554; X64-MIC-AVX:       # %bb.0:
1555; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
1556; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %ymm1
1557; X64-MIC-AVX-NEXT:    vmovdqu 32(%rdi), %xmm2
1558; X64-MIC-AVX-NEXT:    vmovdqu 32(%rsi), %xmm3
1559; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm2, %k0
1560; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
1561; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
1562; X64-MIC-AVX-NEXT:    sete %al
1563; X64-MIC-AVX-NEXT:    vzeroupper
1564; X64-MIC-AVX-NEXT:    retq
1565  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind
1566  %cmp = icmp eq i32 %call, 0
1567  ret i1 %cmp
1568}
1569
1570define i1 @length48_lt(ptr %x, ptr %y) nounwind {
1571; X64-LABEL: length48_lt:
1572; X64:       # %bb.0:
1573; X64-NEXT:    pushq %rax
1574; X64-NEXT:    movl $48, %edx
1575; X64-NEXT:    callq memcmp
1576; X64-NEXT:    shrl $31, %eax
1577; X64-NEXT:    # kill: def $al killed $al killed $eax
1578; X64-NEXT:    popq %rcx
1579; X64-NEXT:    retq
1580  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind
1581  %cmp = icmp slt i32 %call, 0
1582  ret i1 %cmp
1583}
1584
1585define i1 @length48_gt(ptr %x, ptr %y) nounwind {
1586; X64-LABEL: length48_gt:
1587; X64:       # %bb.0:
1588; X64-NEXT:    pushq %rax
1589; X64-NEXT:    movl $48, %edx
1590; X64-NEXT:    callq memcmp
1591; X64-NEXT:    testl %eax, %eax
1592; X64-NEXT:    setg %al
1593; X64-NEXT:    popq %rcx
1594; X64-NEXT:    retq
1595  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind
1596  %cmp = icmp sgt i32 %call, 0
1597  ret i1 %cmp
1598}
1599
1600define i1 @length48_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {
1601; X64-LABEL: length48_eq_prefer128:
1602; X64:       # %bb.0:
1603; X64-NEXT:    pushq %rax
1604; X64-NEXT:    movl $48, %edx
1605; X64-NEXT:    callq memcmp
1606; X64-NEXT:    testl %eax, %eax
1607; X64-NEXT:    sete %al
1608; X64-NEXT:    popq %rcx
1609; X64-NEXT:    retq
1610  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind
1611  %cmp = icmp eq i32 %call, 0
1612  ret i1 %cmp
1613}
1614
1615define i1 @length48_eq_const(ptr %X) nounwind {
1616; X64-SSE-LABEL: length48_eq_const:
1617; X64-SSE:       # %bb.0:
1618; X64-SSE-NEXT:    pushq %rax
1619; X64-SSE-NEXT:    movl $.L.str, %esi
1620; X64-SSE-NEXT:    movl $48, %edx
1621; X64-SSE-NEXT:    callq memcmp
1622; X64-SSE-NEXT:    testl %eax, %eax
1623; X64-SSE-NEXT:    setne %al
1624; X64-SSE-NEXT:    popq %rcx
1625; X64-SSE-NEXT:    retq
1626;
1627; X64-AVX1-LABEL: length48_eq_const:
1628; X64-AVX1:       # %bb.0:
1629; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
1630; X64-AVX1-NEXT:    vmovups 32(%rdi), %xmm1
1631; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1632; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1633; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1634; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
1635; X64-AVX1-NEXT:    setne %al
1636; X64-AVX1-NEXT:    vzeroupper
1637; X64-AVX1-NEXT:    retq
1638;
1639; X64-AVX2-LABEL: length48_eq_const:
1640; X64-AVX2:       # %bb.0:
1641; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
1642; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %xmm1
1643; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1644; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1645; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1646; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
1647; X64-AVX2-NEXT:    setne %al
1648; X64-AVX2-NEXT:    vzeroupper
1649; X64-AVX2-NEXT:    retq
1650;
1651; X64-AVX512-LABEL: length48_eq_const:
1652; X64-AVX512:       # %bb.0:
1653; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
1654; X64-AVX512-NEXT:    vmovdqu 32(%rdi), %xmm1
1655; X64-AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1656; X64-AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1657; X64-AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
1658; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
1659; X64-AVX512-NEXT:    setne %al
1660; X64-AVX512-NEXT:    vzeroupper
1661; X64-AVX512-NEXT:    retq
1662;
1663; X64-MIC-AVX-LABEL: length48_eq_const:
1664; X64-MIC-AVX:       # %bb.0:
1665; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
1666; X64-MIC-AVX-NEXT:    vmovdqu 32(%rdi), %xmm1
1667; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,0,0,0,0]
1668; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm1, %k0
1669; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
1670; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
1671; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
1672; X64-MIC-AVX-NEXT:    setne %al
1673; X64-MIC-AVX-NEXT:    vzeroupper
1674; X64-MIC-AVX-NEXT:    retq
1675  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 48) nounwind
1676  %c = icmp ne i32 %m, 0
1677  ret i1 %c
1678}
1679
1680define i32 @length63(ptr %X, ptr %Y) nounwind {
1681; X64-LABEL: length63:
1682; X64:       # %bb.0:
1683; X64-NEXT:    movl $63, %edx
1684; X64-NEXT:    jmp memcmp # TAILCALL
1685  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 63) nounwind
1686  ret i32 %m
1687}
1688
1689define i1 @length63_eq(ptr %x, ptr %y) nounwind {
1690; X64-SSE-LABEL: length63_eq:
1691; X64-SSE:       # %bb.0:
1692; X64-SSE-NEXT:    pushq %rax
1693; X64-SSE-NEXT:    movl $63, %edx
1694; X64-SSE-NEXT:    callq memcmp
1695; X64-SSE-NEXT:    testl %eax, %eax
1696; X64-SSE-NEXT:    setne %al
1697; X64-SSE-NEXT:    popq %rcx
1698; X64-SSE-NEXT:    retq
1699;
1700; X64-AVX1-LABEL: length63_eq:
1701; X64-AVX1:       # %bb.0:
1702; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
1703; X64-AVX1-NEXT:    vmovups 31(%rdi), %ymm1
1704; X64-AVX1-NEXT:    vxorps 31(%rsi), %ymm1, %ymm1
1705; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
1706; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1707; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
1708; X64-AVX1-NEXT:    setne %al
1709; X64-AVX1-NEXT:    vzeroupper
1710; X64-AVX1-NEXT:    retq
1711;
1712; X64-AVX2-LABEL: length63_eq:
1713; X64-AVX2:       # %bb.0:
1714; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
1715; X64-AVX2-NEXT:    vmovdqu 31(%rdi), %ymm1
1716; X64-AVX2-NEXT:    vpxor 31(%rsi), %ymm1, %ymm1
1717; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
1718; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1719; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
1720; X64-AVX2-NEXT:    setne %al
1721; X64-AVX2-NEXT:    vzeroupper
1722; X64-AVX2-NEXT:    retq
1723;
1724; X64-AVX512-LABEL: length63_eq:
1725; X64-AVX512:       # %bb.0:
1726; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
1727; X64-AVX512-NEXT:    vmovdqu 31(%rdi), %ymm1
1728; X64-AVX512-NEXT:    vpxor 31(%rsi), %ymm1, %ymm1
1729; X64-AVX512-NEXT:    vpxor (%rsi), %ymm0, %ymm0
1730; X64-AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
1731; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
1732; X64-AVX512-NEXT:    setne %al
1733; X64-AVX512-NEXT:    vzeroupper
1734; X64-AVX512-NEXT:    retq
1735;
1736; X64-MIC-AVX-LABEL: length63_eq:
1737; X64-MIC-AVX:       # %bb.0:
1738; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
1739; X64-MIC-AVX-NEXT:    vmovdqu 31(%rdi), %ymm1
1740; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %ymm2
1741; X64-MIC-AVX-NEXT:    vmovdqu 31(%rsi), %ymm3
1742; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm1, %k0
1743; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm0, %k1
1744; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
1745; X64-MIC-AVX-NEXT:    setne %al
1746; X64-MIC-AVX-NEXT:    vzeroupper
1747; X64-MIC-AVX-NEXT:    retq
1748  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 63) nounwind
1749  %cmp = icmp ne i32 %call, 0
1750  ret i1 %cmp
1751}
1752
1753define i1 @length63_lt(ptr %x, ptr %y) nounwind {
1754; X64-LABEL: length63_lt:
1755; X64:       # %bb.0:
1756; X64-NEXT:    pushq %rax
1757; X64-NEXT:    movl $63, %edx
1758; X64-NEXT:    callq memcmp
1759; X64-NEXT:    shrl $31, %eax
1760; X64-NEXT:    # kill: def $al killed $al killed $eax
1761; X64-NEXT:    popq %rcx
1762; X64-NEXT:    retq
1763  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 63) nounwind
1764  %cmp = icmp slt i32 %call, 0
1765  ret i1 %cmp
1766}
1767
1768define i1 @length63_gt(ptr %x, ptr %y) nounwind {
1769; X64-LABEL: length63_gt:
1770; X64:       # %bb.0:
1771; X64-NEXT:    pushq %rax
1772; X64-NEXT:    movl $63, %edx
1773; X64-NEXT:    callq memcmp
1774; X64-NEXT:    testl %eax, %eax
1775; X64-NEXT:    setg %al
1776; X64-NEXT:    popq %rcx
1777; X64-NEXT:    retq
1778  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 63) nounwind
1779  %cmp = icmp sgt i32 %call, 0
1780  ret i1 %cmp
1781}
1782
1783define i1 @length63_eq_const(ptr %X) nounwind {
1784; X64-SSE-LABEL: length63_eq_const:
1785; X64-SSE:       # %bb.0:
1786; X64-SSE-NEXT:    pushq %rax
1787; X64-SSE-NEXT:    movl $.L.str, %esi
1788; X64-SSE-NEXT:    movl $63, %edx
1789; X64-SSE-NEXT:    callq memcmp
1790; X64-SSE-NEXT:    testl %eax, %eax
1791; X64-SSE-NEXT:    sete %al
1792; X64-SSE-NEXT:    popq %rcx
1793; X64-SSE-NEXT:    retq
1794;
1795; X64-AVX1-LABEL: length63_eq_const:
1796; X64-AVX1:       # %bb.0:
1797; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
1798; X64-AVX1-NEXT:    vmovups 31(%rdi), %ymm1
1799; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1800; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1801; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1802; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
1803; X64-AVX1-NEXT:    sete %al
1804; X64-AVX1-NEXT:    vzeroupper
1805; X64-AVX1-NEXT:    retq
1806;
1807; X64-AVX2-LABEL: length63_eq_const:
1808; X64-AVX2:       # %bb.0:
1809; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
1810; X64-AVX2-NEXT:    vmovdqu 31(%rdi), %ymm1
1811; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1812; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1813; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1814; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
1815; X64-AVX2-NEXT:    sete %al
1816; X64-AVX2-NEXT:    vzeroupper
1817; X64-AVX2-NEXT:    retq
1818;
1819; X64-AVX512-LABEL: length63_eq_const:
1820; X64-AVX512:       # %bb.0:
1821; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
1822; X64-AVX512-NEXT:    vmovdqu 31(%rdi), %ymm1
1823; X64-AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1824; X64-AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1825; X64-AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
1826; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
1827; X64-AVX512-NEXT:    sete %al
1828; X64-AVX512-NEXT:    vzeroupper
1829; X64-AVX512-NEXT:    retq
1830;
1831; X64-MIC-AVX-LABEL: length63_eq_const:
1832; X64-MIC-AVX:       # %bb.0:
1833; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
1834; X64-MIC-AVX-NEXT:    vmovdqu 31(%rdi), %ymm1
1835; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm2 = [875770417,943142453,842084409,909456435,809056311,875770417,943142453,842084409]
1836; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm1, %k0
1837; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
1838; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
1839; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
1840; X64-MIC-AVX-NEXT:    sete %al
1841; X64-MIC-AVX-NEXT:    vzeroupper
1842; X64-MIC-AVX-NEXT:    retq
1843  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 63) nounwind
1844  %c = icmp eq i32 %m, 0
1845  ret i1 %c
1846}
1847
1848define i32 @length64(ptr %X, ptr %Y) nounwind {
1849; X64-LABEL: length64:
1850; X64:       # %bb.0:
1851; X64-NEXT:    movl $64, %edx
1852; X64-NEXT:    jmp memcmp # TAILCALL
1853  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 64) nounwind
1854  ret i32 %m
1855}
1856
1857define i1 @length64_eq(ptr %x, ptr %y) nounwind {
1858; X64-SSE-LABEL: length64_eq:
1859; X64-SSE:       # %bb.0:
1860; X64-SSE-NEXT:    pushq %rax
1861; X64-SSE-NEXT:    movl $64, %edx
1862; X64-SSE-NEXT:    callq memcmp
1863; X64-SSE-NEXT:    testl %eax, %eax
1864; X64-SSE-NEXT:    setne %al
1865; X64-SSE-NEXT:    popq %rcx
1866; X64-SSE-NEXT:    retq
1867;
1868; X64-AVX1-LABEL: length64_eq:
1869; X64-AVX1:       # %bb.0:
1870; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
1871; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm1
1872; X64-AVX1-NEXT:    vxorps 32(%rsi), %ymm1, %ymm1
1873; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
1874; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1875; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
1876; X64-AVX1-NEXT:    setne %al
1877; X64-AVX1-NEXT:    vzeroupper
1878; X64-AVX1-NEXT:    retq
1879;
1880; X64-AVX2-LABEL: length64_eq:
1881; X64-AVX2:       # %bb.0:
1882; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
1883; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
1884; X64-AVX2-NEXT:    vpxor 32(%rsi), %ymm1, %ymm1
1885; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
1886; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1887; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
1888; X64-AVX2-NEXT:    setne %al
1889; X64-AVX2-NEXT:    vzeroupper
1890; X64-AVX2-NEXT:    retq
1891;
1892; X64-AVX512-LABEL: length64_eq:
1893; X64-AVX512:       # %bb.0:
1894; X64-AVX512-NEXT:    vmovdqu64 (%rdi), %zmm0
1895; X64-AVX512-NEXT:    vpcmpneqd (%rsi), %zmm0, %k0
1896; X64-AVX512-NEXT:    kortestw %k0, %k0
1897; X64-AVX512-NEXT:    setne %al
1898; X64-AVX512-NEXT:    vzeroupper
1899; X64-AVX512-NEXT:    retq
1900;
1901; X64-MIC-AVX2-LABEL: length64_eq:
1902; X64-MIC-AVX2:       # %bb.0:
1903; X64-MIC-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
1904; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
1905; X64-MIC-AVX2-NEXT:    vmovdqu (%rsi), %ymm2
1906; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rsi), %ymm3
1907; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm3, %zmm1, %k0
1908; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm2, %zmm0, %k1
1909; X64-MIC-AVX2-NEXT:    kortestw %k0, %k1
1910; X64-MIC-AVX2-NEXT:    setne %al
1911; X64-MIC-AVX2-NEXT:    vzeroupper
1912; X64-MIC-AVX2-NEXT:    retq
1913;
1914; X64-MIC-AVX512F-LABEL: length64_eq:
1915; X64-MIC-AVX512F:       # %bb.0:
1916; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
1917; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k0
1918; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k0
1919; X64-MIC-AVX512F-NEXT:    setne %al
1920; X64-MIC-AVX512F-NEXT:    vzeroupper
1921; X64-MIC-AVX512F-NEXT:    retq
1922  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 64) nounwind
1923  %cmp = icmp ne i32 %call, 0
1924  ret i1 %cmp
1925}
1926
1927define i1 @length64_lt(ptr %x, ptr %y) nounwind {
1928; X64-LABEL: length64_lt:
1929; X64:       # %bb.0:
1930; X64-NEXT:    pushq %rax
1931; X64-NEXT:    movl $64, %edx
1932; X64-NEXT:    callq memcmp
1933; X64-NEXT:    shrl $31, %eax
1934; X64-NEXT:    # kill: def $al killed $al killed $eax
1935; X64-NEXT:    popq %rcx
1936; X64-NEXT:    retq
1937  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 64) nounwind
1938  %cmp = icmp slt i32 %call, 0
1939  ret i1 %cmp
1940}
1941
1942define i1 @length64_gt(ptr %x, ptr %y) nounwind {
1943; X64-LABEL: length64_gt:
1944; X64:       # %bb.0:
1945; X64-NEXT:    pushq %rax
1946; X64-NEXT:    movl $64, %edx
1947; X64-NEXT:    callq memcmp
1948; X64-NEXT:    testl %eax, %eax
1949; X64-NEXT:    setg %al
1950; X64-NEXT:    popq %rcx
1951; X64-NEXT:    retq
1952  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 64) nounwind
1953  %cmp = icmp sgt i32 %call, 0
1954  ret i1 %cmp
1955}
1956
1957define i1 @length64_eq_const(ptr %X) nounwind {
1958; X64-SSE-LABEL: length64_eq_const:
1959; X64-SSE:       # %bb.0:
1960; X64-SSE-NEXT:    pushq %rax
1961; X64-SSE-NEXT:    movl $.L.str, %esi
1962; X64-SSE-NEXT:    movl $64, %edx
1963; X64-SSE-NEXT:    callq memcmp
1964; X64-SSE-NEXT:    testl %eax, %eax
1965; X64-SSE-NEXT:    sete %al
1966; X64-SSE-NEXT:    popq %rcx
1967; X64-SSE-NEXT:    retq
1968;
1969; X64-AVX1-LABEL: length64_eq_const:
1970; X64-AVX1:       # %bb.0:
1971; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
1972; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm1
1973; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1974; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1975; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1976; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
1977; X64-AVX1-NEXT:    sete %al
1978; X64-AVX1-NEXT:    vzeroupper
1979; X64-AVX1-NEXT:    retq
1980;
1981; X64-AVX2-LABEL: length64_eq_const:
1982; X64-AVX2:       # %bb.0:
1983; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
1984; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
1985; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1986; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1987; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1988; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
1989; X64-AVX2-NEXT:    sete %al
1990; X64-AVX2-NEXT:    vzeroupper
1991; X64-AVX2-NEXT:    retq
1992;
1993; X64-AVX512-LABEL: length64_eq_const:
1994; X64-AVX512:       # %bb.0:
1995; X64-AVX512-NEXT:    vmovdqu64 (%rdi), %zmm0
1996; X64-AVX512-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k0
1997; X64-AVX512-NEXT:    kortestw %k0, %k0
1998; X64-AVX512-NEXT:    sete %al
1999; X64-AVX512-NEXT:    vzeroupper
2000; X64-AVX512-NEXT:    retq
2001;
2002; X64-MIC-AVX2-LABEL: length64_eq_const:
2003; X64-MIC-AVX2:       # %bb.0:
2004; X64-MIC-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2005; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
2006; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408]
2007; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm2, %zmm1, %k0
2008; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
2009; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
2010; X64-MIC-AVX2-NEXT:    kortestw %k0, %k1
2011; X64-MIC-AVX2-NEXT:    sete %al
2012; X64-MIC-AVX2-NEXT:    vzeroupper
2013; X64-MIC-AVX2-NEXT:    retq
2014;
2015; X64-MIC-AVX512F-LABEL: length64_eq_const:
2016; X64-MIC-AVX512F:       # %bb.0:
2017; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2018; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k0
2019; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k0
2020; X64-MIC-AVX512F-NEXT:    sete %al
2021; X64-MIC-AVX512F-NEXT:    vzeroupper
2022; X64-MIC-AVX512F-NEXT:    retq
2023  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 64) nounwind
2024  %c = icmp eq i32 %m, 0
2025  ret i1 %c
2026}
2027
2028define i32 @length96(ptr %X, ptr %Y) nounwind {
2029; X64-LABEL: length96:
2030; X64:       # %bb.0:
2031; X64-NEXT:    movl $96, %edx
2032; X64-NEXT:    jmp memcmp # TAILCALL
2033  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 96) nounwind
2034  ret i32 %m
2035}
2036
2037define i1 @length96_eq(ptr %x, ptr %y) nounwind {
2038; X64-SSE-LABEL: length96_eq:
2039; X64-SSE:       # %bb.0:
2040; X64-SSE-NEXT:    pushq %rax
2041; X64-SSE-NEXT:    movl $96, %edx
2042; X64-SSE-NEXT:    callq memcmp
2043; X64-SSE-NEXT:    testl %eax, %eax
2044; X64-SSE-NEXT:    setne %al
2045; X64-SSE-NEXT:    popq %rcx
2046; X64-SSE-NEXT:    retq
2047;
2048; X64-AVX1-LABEL: length96_eq:
2049; X64-AVX1:       # %bb.0:
2050; X64-AVX1-NEXT:    pushq %rax
2051; X64-AVX1-NEXT:    movl $96, %edx
2052; X64-AVX1-NEXT:    callq memcmp
2053; X64-AVX1-NEXT:    testl %eax, %eax
2054; X64-AVX1-NEXT:    setne %al
2055; X64-AVX1-NEXT:    popq %rcx
2056; X64-AVX1-NEXT:    retq
2057;
2058; X64-AVX2-LABEL: length96_eq:
2059; X64-AVX2:       # %bb.0:
2060; X64-AVX2-NEXT:    pushq %rax
2061; X64-AVX2-NEXT:    movl $96, %edx
2062; X64-AVX2-NEXT:    callq memcmp
2063; X64-AVX2-NEXT:    testl %eax, %eax
2064; X64-AVX2-NEXT:    setne %al
2065; X64-AVX2-NEXT:    popq %rcx
2066; X64-AVX2-NEXT:    retq
2067;
2068; X64-AVX512BW-LABEL: length96_eq:
2069; X64-AVX512BW:       # %bb.0:
2070; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
2071; X64-AVX512BW-NEXT:    vmovdqu 64(%rdi), %ymm1
2072; X64-AVX512BW-NEXT:    vmovdqu 64(%rsi), %ymm2
2073; X64-AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k0
2074; X64-AVX512BW-NEXT:    vpcmpneqb %zmm2, %zmm1, %k1
2075; X64-AVX512BW-NEXT:    kortestq %k1, %k0
2076; X64-AVX512BW-NEXT:    setne %al
2077; X64-AVX512BW-NEXT:    vzeroupper
2078; X64-AVX512BW-NEXT:    retq
2079;
2080; X64-AVX512F-LABEL: length96_eq:
2081; X64-AVX512F:       # %bb.0:
2082; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2083; X64-AVX512F-NEXT:    vmovdqu 64(%rdi), %ymm1
2084; X64-AVX512F-NEXT:    vmovdqu 64(%rsi), %ymm2
2085; X64-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k0
2086; X64-AVX512F-NEXT:    vpcmpneqd %zmm2, %zmm1, %k1
2087; X64-AVX512F-NEXT:    kortestw %k1, %k0
2088; X64-AVX512F-NEXT:    setne %al
2089; X64-AVX512F-NEXT:    vzeroupper
2090; X64-AVX512F-NEXT:    retq
2091;
2092; X64-MIC-AVX2-LABEL: length96_eq:
2093; X64-MIC-AVX2:       # %bb.0:
2094; X64-MIC-AVX2-NEXT:    pushq %rax
2095; X64-MIC-AVX2-NEXT:    movl $96, %edx
2096; X64-MIC-AVX2-NEXT:    callq memcmp
2097; X64-MIC-AVX2-NEXT:    testl %eax, %eax
2098; X64-MIC-AVX2-NEXT:    setne %al
2099; X64-MIC-AVX2-NEXT:    popq %rcx
2100; X64-MIC-AVX2-NEXT:    retq
2101;
2102; X64-MIC-AVX512F-LABEL: length96_eq:
2103; X64-MIC-AVX512F:       # %bb.0:
2104; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2105; X64-MIC-AVX512F-NEXT:    vmovdqu 64(%rdi), %ymm1
2106; X64-MIC-AVX512F-NEXT:    vmovdqu 64(%rsi), %ymm2
2107; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k0
2108; X64-MIC-AVX512F-NEXT:    vpcmpneqd %zmm2, %zmm1, %k1
2109; X64-MIC-AVX512F-NEXT:    kortestw %k1, %k0
2110; X64-MIC-AVX512F-NEXT:    setne %al
2111; X64-MIC-AVX512F-NEXT:    vzeroupper
2112; X64-MIC-AVX512F-NEXT:    retq
2113  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 96) nounwind
2114  %cmp = icmp ne i32 %call, 0
2115  ret i1 %cmp
2116}
2117
2118define i1 @length96_lt(ptr %x, ptr %y) nounwind {
2119; X64-LABEL: length96_lt:
2120; X64:       # %bb.0:
2121; X64-NEXT:    pushq %rax
2122; X64-NEXT:    movl $96, %edx
2123; X64-NEXT:    callq memcmp
2124; X64-NEXT:    shrl $31, %eax
2125; X64-NEXT:    # kill: def $al killed $al killed $eax
2126; X64-NEXT:    popq %rcx
2127; X64-NEXT:    retq
2128  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 96) nounwind
2129  %cmp = icmp slt i32 %call, 0
2130  ret i1 %cmp
2131}
2132
2133define i1 @length96_gt(ptr %x, ptr %y) nounwind {
2134; X64-LABEL: length96_gt:
2135; X64:       # %bb.0:
2136; X64-NEXT:    pushq %rax
2137; X64-NEXT:    movl $96, %edx
2138; X64-NEXT:    callq memcmp
2139; X64-NEXT:    testl %eax, %eax
2140; X64-NEXT:    setg %al
2141; X64-NEXT:    popq %rcx
2142; X64-NEXT:    retq
2143  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 96) nounwind
2144  %cmp = icmp sgt i32 %call, 0
2145  ret i1 %cmp
2146}
2147
2148define i1 @length96_eq_const(ptr %X) nounwind {
2149; X64-SSE-LABEL: length96_eq_const:
2150; X64-SSE:       # %bb.0:
2151; X64-SSE-NEXT:    pushq %rax
2152; X64-SSE-NEXT:    movl $.L.str, %esi
2153; X64-SSE-NEXT:    movl $96, %edx
2154; X64-SSE-NEXT:    callq memcmp
2155; X64-SSE-NEXT:    testl %eax, %eax
2156; X64-SSE-NEXT:    sete %al
2157; X64-SSE-NEXT:    popq %rcx
2158; X64-SSE-NEXT:    retq
2159;
2160; X64-AVX1-LABEL: length96_eq_const:
2161; X64-AVX1:       # %bb.0:
2162; X64-AVX1-NEXT:    pushq %rax
2163; X64-AVX1-NEXT:    movl $.L.str, %esi
2164; X64-AVX1-NEXT:    movl $96, %edx
2165; X64-AVX1-NEXT:    callq memcmp
2166; X64-AVX1-NEXT:    testl %eax, %eax
2167; X64-AVX1-NEXT:    sete %al
2168; X64-AVX1-NEXT:    popq %rcx
2169; X64-AVX1-NEXT:    retq
2170;
2171; X64-AVX2-LABEL: length96_eq_const:
2172; X64-AVX2:       # %bb.0:
2173; X64-AVX2-NEXT:    pushq %rax
2174; X64-AVX2-NEXT:    movl $.L.str, %esi
2175; X64-AVX2-NEXT:    movl $96, %edx
2176; X64-AVX2-NEXT:    callq memcmp
2177; X64-AVX2-NEXT:    testl %eax, %eax
2178; X64-AVX2-NEXT:    sete %al
2179; X64-AVX2-NEXT:    popq %rcx
2180; X64-AVX2-NEXT:    retq
2181;
2182; X64-AVX512BW-LABEL: length96_eq_const:
2183; X64-AVX512BW:       # %bb.0:
2184; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
2185; X64-AVX512BW-NEXT:    vmovdqu 64(%rdi), %ymm1
2186; X64-AVX512BW-NEXT:    vpcmpneqb .L.str(%rip), %zmm0, %k0
2187; X64-AVX512BW-NEXT:    vpcmpneqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k1
2188; X64-AVX512BW-NEXT:    kortestq %k1, %k0
2189; X64-AVX512BW-NEXT:    sete %al
2190; X64-AVX512BW-NEXT:    vzeroupper
2191; X64-AVX512BW-NEXT:    retq
2192;
2193; X64-AVX512F-LABEL: length96_eq_const:
2194; X64-AVX512F:       # %bb.0:
2195; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2196; X64-AVX512F-NEXT:    vmovdqu 64(%rdi), %ymm1
2197; X64-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k0
2198; X64-AVX512F-NEXT:    vpcmpneqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k1
2199; X64-AVX512F-NEXT:    kortestw %k1, %k0
2200; X64-AVX512F-NEXT:    sete %al
2201; X64-AVX512F-NEXT:    vzeroupper
2202; X64-AVX512F-NEXT:    retq
2203;
2204; X64-MIC-AVX2-LABEL: length96_eq_const:
2205; X64-MIC-AVX2:       # %bb.0:
2206; X64-MIC-AVX2-NEXT:    pushq %rax
2207; X64-MIC-AVX2-NEXT:    movl $.L.str, %esi
2208; X64-MIC-AVX2-NEXT:    movl $96, %edx
2209; X64-MIC-AVX2-NEXT:    callq memcmp
2210; X64-MIC-AVX2-NEXT:    testl %eax, %eax
2211; X64-MIC-AVX2-NEXT:    sete %al
2212; X64-MIC-AVX2-NEXT:    popq %rcx
2213; X64-MIC-AVX2-NEXT:    retq
2214;
2215; X64-MIC-AVX512F-LABEL: length96_eq_const:
2216; X64-MIC-AVX512F:       # %bb.0:
2217; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2218; X64-MIC-AVX512F-NEXT:    vmovdqu 64(%rdi), %ymm1
2219; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k0
2220; X64-MIC-AVX512F-NEXT:    vpcmpneqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k1
2221; X64-MIC-AVX512F-NEXT:    kortestw %k1, %k0
2222; X64-MIC-AVX512F-NEXT:    sete %al
2223; X64-MIC-AVX512F-NEXT:    vzeroupper
2224; X64-MIC-AVX512F-NEXT:    retq
2225  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 96) nounwind
2226  %c = icmp eq i32 %m, 0
2227  ret i1 %c
2228}
2229
2230define i32 @length127(ptr %X, ptr %Y) nounwind {
2231; X64-LABEL: length127:
2232; X64:       # %bb.0:
2233; X64-NEXT:    movl $127, %edx
2234; X64-NEXT:    jmp memcmp # TAILCALL
2235  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 127) nounwind
2236  ret i32 %m
2237}
2238
2239define i1 @length127_eq(ptr %x, ptr %y) nounwind {
2240; X64-SSE-LABEL: length127_eq:
2241; X64-SSE:       # %bb.0:
2242; X64-SSE-NEXT:    pushq %rax
2243; X64-SSE-NEXT:    movl $127, %edx
2244; X64-SSE-NEXT:    callq memcmp
2245; X64-SSE-NEXT:    testl %eax, %eax
2246; X64-SSE-NEXT:    setne %al
2247; X64-SSE-NEXT:    popq %rcx
2248; X64-SSE-NEXT:    retq
2249;
2250; X64-AVX1-LABEL: length127_eq:
2251; X64-AVX1:       # %bb.0:
2252; X64-AVX1-NEXT:    pushq %rax
2253; X64-AVX1-NEXT:    movl $127, %edx
2254; X64-AVX1-NEXT:    callq memcmp
2255; X64-AVX1-NEXT:    testl %eax, %eax
2256; X64-AVX1-NEXT:    setne %al
2257; X64-AVX1-NEXT:    popq %rcx
2258; X64-AVX1-NEXT:    retq
2259;
2260; X64-AVX2-LABEL: length127_eq:
2261; X64-AVX2:       # %bb.0:
2262; X64-AVX2-NEXT:    pushq %rax
2263; X64-AVX2-NEXT:    movl $127, %edx
2264; X64-AVX2-NEXT:    callq memcmp
2265; X64-AVX2-NEXT:    testl %eax, %eax
2266; X64-AVX2-NEXT:    setne %al
2267; X64-AVX2-NEXT:    popq %rcx
2268; X64-AVX2-NEXT:    retq
2269;
2270; X64-AVX512BW-LABEL: length127_eq:
2271; X64-AVX512BW:       # %bb.0:
2272; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
2273; X64-AVX512BW-NEXT:    vmovdqu64 63(%rdi), %zmm1
2274; X64-AVX512BW-NEXT:    vpcmpneqb 63(%rsi), %zmm1, %k0
2275; X64-AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k1
2276; X64-AVX512BW-NEXT:    kortestq %k0, %k1
2277; X64-AVX512BW-NEXT:    setne %al
2278; X64-AVX512BW-NEXT:    vzeroupper
2279; X64-AVX512BW-NEXT:    retq
2280;
2281; X64-AVX512F-LABEL: length127_eq:
2282; X64-AVX512F:       # %bb.0:
2283; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2284; X64-AVX512F-NEXT:    vmovdqu64 63(%rdi), %zmm1
2285; X64-AVX512F-NEXT:    vpcmpneqd 63(%rsi), %zmm1, %k0
2286; X64-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k1
2287; X64-AVX512F-NEXT:    kortestw %k0, %k1
2288; X64-AVX512F-NEXT:    setne %al
2289; X64-AVX512F-NEXT:    vzeroupper
2290; X64-AVX512F-NEXT:    retq
2291;
2292; X64-MIC-AVX2-LABEL: length127_eq:
2293; X64-MIC-AVX2:       # %bb.0:
2294; X64-MIC-AVX2-NEXT:    pushq %rax
2295; X64-MIC-AVX2-NEXT:    movl $127, %edx
2296; X64-MIC-AVX2-NEXT:    callq memcmp
2297; X64-MIC-AVX2-NEXT:    testl %eax, %eax
2298; X64-MIC-AVX2-NEXT:    setne %al
2299; X64-MIC-AVX2-NEXT:    popq %rcx
2300; X64-MIC-AVX2-NEXT:    retq
2301;
2302; X64-MIC-AVX512F-LABEL: length127_eq:
2303; X64-MIC-AVX512F:       # %bb.0:
2304; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2305; X64-MIC-AVX512F-NEXT:    vmovdqu64 63(%rdi), %zmm1
2306; X64-MIC-AVX512F-NEXT:    vpcmpneqd 63(%rsi), %zmm1, %k0
2307; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k1
2308; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
2309; X64-MIC-AVX512F-NEXT:    setne %al
2310; X64-MIC-AVX512F-NEXT:    vzeroupper
2311; X64-MIC-AVX512F-NEXT:    retq
2312  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 127) nounwind
2313  %cmp = icmp ne i32 %call, 0
2314  ret i1 %cmp
2315}
2316
2317define i1 @length127_lt(ptr %x, ptr %y) nounwind {
2318; X64-LABEL: length127_lt:
2319; X64:       # %bb.0:
2320; X64-NEXT:    pushq %rax
2321; X64-NEXT:    movl $127, %edx
2322; X64-NEXT:    callq memcmp
2323; X64-NEXT:    shrl $31, %eax
2324; X64-NEXT:    # kill: def $al killed $al killed $eax
2325; X64-NEXT:    popq %rcx
2326; X64-NEXT:    retq
2327  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 127) nounwind
2328  %cmp = icmp slt i32 %call, 0
2329  ret i1 %cmp
2330}
2331
2332define i1 @length127_gt(ptr %x, ptr %y) nounwind {
2333; X64-LABEL: length127_gt:
2334; X64:       # %bb.0:
2335; X64-NEXT:    pushq %rax
2336; X64-NEXT:    movl $127, %edx
2337; X64-NEXT:    callq memcmp
2338; X64-NEXT:    testl %eax, %eax
2339; X64-NEXT:    setg %al
2340; X64-NEXT:    popq %rcx
2341; X64-NEXT:    retq
2342  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 127) nounwind
2343  %cmp = icmp sgt i32 %call, 0
2344  ret i1 %cmp
2345}
2346
2347define i1 @length127_eq_const(ptr %X) nounwind {
2348; X64-SSE-LABEL: length127_eq_const:
2349; X64-SSE:       # %bb.0:
2350; X64-SSE-NEXT:    pushq %rax
2351; X64-SSE-NEXT:    movl $.L.str, %esi
2352; X64-SSE-NEXT:    movl $127, %edx
2353; X64-SSE-NEXT:    callq memcmp
2354; X64-SSE-NEXT:    testl %eax, %eax
2355; X64-SSE-NEXT:    sete %al
2356; X64-SSE-NEXT:    popq %rcx
2357; X64-SSE-NEXT:    retq
2358;
2359; X64-AVX1-LABEL: length127_eq_const:
2360; X64-AVX1:       # %bb.0:
2361; X64-AVX1-NEXT:    pushq %rax
2362; X64-AVX1-NEXT:    movl $.L.str, %esi
2363; X64-AVX1-NEXT:    movl $127, %edx
2364; X64-AVX1-NEXT:    callq memcmp
2365; X64-AVX1-NEXT:    testl %eax, %eax
2366; X64-AVX1-NEXT:    sete %al
2367; X64-AVX1-NEXT:    popq %rcx
2368; X64-AVX1-NEXT:    retq
2369;
2370; X64-AVX2-LABEL: length127_eq_const:
2371; X64-AVX2:       # %bb.0:
2372; X64-AVX2-NEXT:    pushq %rax
2373; X64-AVX2-NEXT:    movl $.L.str, %esi
2374; X64-AVX2-NEXT:    movl $127, %edx
2375; X64-AVX2-NEXT:    callq memcmp
2376; X64-AVX2-NEXT:    testl %eax, %eax
2377; X64-AVX2-NEXT:    sete %al
2378; X64-AVX2-NEXT:    popq %rcx
2379; X64-AVX2-NEXT:    retq
2380;
2381; X64-AVX512BW-LABEL: length127_eq_const:
2382; X64-AVX512BW:       # %bb.0:
2383; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
2384; X64-AVX512BW-NEXT:    vmovdqu64 63(%rdi), %zmm1
2385; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+63(%rip), %zmm1, %k0
2386; X64-AVX512BW-NEXT:    vpcmpneqb .L.str(%rip), %zmm0, %k1
2387; X64-AVX512BW-NEXT:    kortestq %k0, %k1
2388; X64-AVX512BW-NEXT:    sete %al
2389; X64-AVX512BW-NEXT:    vzeroupper
2390; X64-AVX512BW-NEXT:    retq
2391;
2392; X64-AVX512F-LABEL: length127_eq_const:
2393; X64-AVX512F:       # %bb.0:
2394; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2395; X64-AVX512F-NEXT:    vmovdqu64 63(%rdi), %zmm1
2396; X64-AVX512F-NEXT:    vpcmpneqd .L.str+63(%rip), %zmm1, %k0
2397; X64-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k1
2398; X64-AVX512F-NEXT:    kortestw %k0, %k1
2399; X64-AVX512F-NEXT:    sete %al
2400; X64-AVX512F-NEXT:    vzeroupper
2401; X64-AVX512F-NEXT:    retq
2402;
2403; X64-MIC-AVX2-LABEL: length127_eq_const:
2404; X64-MIC-AVX2:       # %bb.0:
2405; X64-MIC-AVX2-NEXT:    pushq %rax
2406; X64-MIC-AVX2-NEXT:    movl $.L.str, %esi
2407; X64-MIC-AVX2-NEXT:    movl $127, %edx
2408; X64-MIC-AVX2-NEXT:    callq memcmp
2409; X64-MIC-AVX2-NEXT:    testl %eax, %eax
2410; X64-MIC-AVX2-NEXT:    sete %al
2411; X64-MIC-AVX2-NEXT:    popq %rcx
2412; X64-MIC-AVX2-NEXT:    retq
2413;
2414; X64-MIC-AVX512F-LABEL: length127_eq_const:
2415; X64-MIC-AVX512F:       # %bb.0:
2416; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2417; X64-MIC-AVX512F-NEXT:    vmovdqu64 63(%rdi), %zmm1
2418; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+63(%rip), %zmm1, %k0
2419; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k1
2420; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
2421; X64-MIC-AVX512F-NEXT:    sete %al
2422; X64-MIC-AVX512F-NEXT:    vzeroupper
2423; X64-MIC-AVX512F-NEXT:    retq
2424  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 127) nounwind
2425  %c = icmp eq i32 %m, 0
2426  ret i1 %c
2427}
2428
2429define i32 @length128(ptr %X, ptr %Y) nounwind {
2430; X64-LABEL: length128:
2431; X64:       # %bb.0:
2432; X64-NEXT:    movl $128, %edx
2433; X64-NEXT:    jmp memcmp # TAILCALL
2434  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 128) nounwind
2435  ret i32 %m
2436}
2437
2438define i1 @length128_eq(ptr %x, ptr %y) nounwind {
2439; X64-SSE-LABEL: length128_eq:
2440; X64-SSE:       # %bb.0:
2441; X64-SSE-NEXT:    pushq %rax
2442; X64-SSE-NEXT:    movl $128, %edx
2443; X64-SSE-NEXT:    callq memcmp
2444; X64-SSE-NEXT:    testl %eax, %eax
2445; X64-SSE-NEXT:    setne %al
2446; X64-SSE-NEXT:    popq %rcx
2447; X64-SSE-NEXT:    retq
2448;
2449; X64-AVX1-LABEL: length128_eq:
2450; X64-AVX1:       # %bb.0:
2451; X64-AVX1-NEXT:    pushq %rax
2452; X64-AVX1-NEXT:    movl $128, %edx
2453; X64-AVX1-NEXT:    callq memcmp
2454; X64-AVX1-NEXT:    testl %eax, %eax
2455; X64-AVX1-NEXT:    setne %al
2456; X64-AVX1-NEXT:    popq %rcx
2457; X64-AVX1-NEXT:    retq
2458;
2459; X64-AVX2-LABEL: length128_eq:
2460; X64-AVX2:       # %bb.0:
2461; X64-AVX2-NEXT:    pushq %rax
2462; X64-AVX2-NEXT:    movl $128, %edx
2463; X64-AVX2-NEXT:    callq memcmp
2464; X64-AVX2-NEXT:    testl %eax, %eax
2465; X64-AVX2-NEXT:    setne %al
2466; X64-AVX2-NEXT:    popq %rcx
2467; X64-AVX2-NEXT:    retq
2468;
2469; X64-AVX512BW-LABEL: length128_eq:
2470; X64-AVX512BW:       # %bb.0:
2471; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
2472; X64-AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
2473; X64-AVX512BW-NEXT:    vpcmpneqb 64(%rsi), %zmm1, %k0
2474; X64-AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k1
2475; X64-AVX512BW-NEXT:    kortestq %k0, %k1
2476; X64-AVX512BW-NEXT:    setne %al
2477; X64-AVX512BW-NEXT:    vzeroupper
2478; X64-AVX512BW-NEXT:    retq
2479;
2480; X64-AVX512F-LABEL: length128_eq:
2481; X64-AVX512F:       # %bb.0:
2482; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2483; X64-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
2484; X64-AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k0
2485; X64-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k1
2486; X64-AVX512F-NEXT:    kortestw %k0, %k1
2487; X64-AVX512F-NEXT:    setne %al
2488; X64-AVX512F-NEXT:    vzeroupper
2489; X64-AVX512F-NEXT:    retq
2490;
2491; X64-MIC-AVX2-LABEL: length128_eq:
2492; X64-MIC-AVX2:       # %bb.0:
2493; X64-MIC-AVX2-NEXT:    pushq %rax
2494; X64-MIC-AVX2-NEXT:    movl $128, %edx
2495; X64-MIC-AVX2-NEXT:    callq memcmp
2496; X64-MIC-AVX2-NEXT:    testl %eax, %eax
2497; X64-MIC-AVX2-NEXT:    setne %al
2498; X64-MIC-AVX2-NEXT:    popq %rcx
2499; X64-MIC-AVX2-NEXT:    retq
2500;
2501; X64-MIC-AVX512F-LABEL: length128_eq:
2502; X64-MIC-AVX512F:       # %bb.0:
2503; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2504; X64-MIC-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
2505; X64-MIC-AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k0
2506; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k1
2507; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
2508; X64-MIC-AVX512F-NEXT:    setne %al
2509; X64-MIC-AVX512F-NEXT:    vzeroupper
2510; X64-MIC-AVX512F-NEXT:    retq
2511  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 128) nounwind
2512  %cmp = icmp ne i32 %call, 0
2513  ret i1 %cmp
2514}
2515
2516define i1 @length128_lt(ptr %x, ptr %y) nounwind {
2517; X64-LABEL: length128_lt:
2518; X64:       # %bb.0:
2519; X64-NEXT:    pushq %rax
2520; X64-NEXT:    movl $128, %edx
2521; X64-NEXT:    callq memcmp
2522; X64-NEXT:    shrl $31, %eax
2523; X64-NEXT:    # kill: def $al killed $al killed $eax
2524; X64-NEXT:    popq %rcx
2525; X64-NEXT:    retq
2526  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 128) nounwind
2527  %cmp = icmp slt i32 %call, 0
2528  ret i1 %cmp
2529}
2530
2531define i1 @length128_gt(ptr %x, ptr %y) nounwind {
2532; X64-LABEL: length128_gt:
2533; X64:       # %bb.0:
2534; X64-NEXT:    pushq %rax
2535; X64-NEXT:    movl $128, %edx
2536; X64-NEXT:    callq memcmp
2537; X64-NEXT:    testl %eax, %eax
2538; X64-NEXT:    setg %al
2539; X64-NEXT:    popq %rcx
2540; X64-NEXT:    retq
2541  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 128) nounwind
2542  %cmp = icmp sgt i32 %call, 0
2543  ret i1 %cmp
2544}
2545
2546define i1 @length128_eq_const(ptr %X) nounwind {
2547; X64-SSE-LABEL: length128_eq_const:
2548; X64-SSE:       # %bb.0:
2549; X64-SSE-NEXT:    pushq %rax
2550; X64-SSE-NEXT:    movl $.L.str, %esi
2551; X64-SSE-NEXT:    movl $128, %edx
2552; X64-SSE-NEXT:    callq memcmp
2553; X64-SSE-NEXT:    testl %eax, %eax
2554; X64-SSE-NEXT:    sete %al
2555; X64-SSE-NEXT:    popq %rcx
2556; X64-SSE-NEXT:    retq
2557;
2558; X64-AVX1-LABEL: length128_eq_const:
2559; X64-AVX1:       # %bb.0:
2560; X64-AVX1-NEXT:    pushq %rax
2561; X64-AVX1-NEXT:    movl $.L.str, %esi
2562; X64-AVX1-NEXT:    movl $128, %edx
2563; X64-AVX1-NEXT:    callq memcmp
2564; X64-AVX1-NEXT:    testl %eax, %eax
2565; X64-AVX1-NEXT:    sete %al
2566; X64-AVX1-NEXT:    popq %rcx
2567; X64-AVX1-NEXT:    retq
2568;
2569; X64-AVX2-LABEL: length128_eq_const:
2570; X64-AVX2:       # %bb.0:
2571; X64-AVX2-NEXT:    pushq %rax
2572; X64-AVX2-NEXT:    movl $.L.str, %esi
2573; X64-AVX2-NEXT:    movl $128, %edx
2574; X64-AVX2-NEXT:    callq memcmp
2575; X64-AVX2-NEXT:    testl %eax, %eax
2576; X64-AVX2-NEXT:    sete %al
2577; X64-AVX2-NEXT:    popq %rcx
2578; X64-AVX2-NEXT:    retq
2579;
2580; X64-AVX512BW-LABEL: length128_eq_const:
2581; X64-AVX512BW:       # %bb.0:
2582; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
2583; X64-AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
2584; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+64(%rip), %zmm1, %k0
2585; X64-AVX512BW-NEXT:    vpcmpneqb .L.str(%rip), %zmm0, %k1
2586; X64-AVX512BW-NEXT:    kortestq %k0, %k1
2587; X64-AVX512BW-NEXT:    sete %al
2588; X64-AVX512BW-NEXT:    vzeroupper
2589; X64-AVX512BW-NEXT:    retq
2590;
2591; X64-AVX512F-LABEL: length128_eq_const:
2592; X64-AVX512F:       # %bb.0:
2593; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2594; X64-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
2595; X64-AVX512F-NEXT:    vpcmpneqd .L.str+64(%rip), %zmm1, %k0
2596; X64-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k1
2597; X64-AVX512F-NEXT:    kortestw %k0, %k1
2598; X64-AVX512F-NEXT:    sete %al
2599; X64-AVX512F-NEXT:    vzeroupper
2600; X64-AVX512F-NEXT:    retq
2601;
2602; X64-MIC-AVX2-LABEL: length128_eq_const:
2603; X64-MIC-AVX2:       # %bb.0:
2604; X64-MIC-AVX2-NEXT:    pushq %rax
2605; X64-MIC-AVX2-NEXT:    movl $.L.str, %esi
2606; X64-MIC-AVX2-NEXT:    movl $128, %edx
2607; X64-MIC-AVX2-NEXT:    callq memcmp
2608; X64-MIC-AVX2-NEXT:    testl %eax, %eax
2609; X64-MIC-AVX2-NEXT:    sete %al
2610; X64-MIC-AVX2-NEXT:    popq %rcx
2611; X64-MIC-AVX2-NEXT:    retq
2612;
2613; X64-MIC-AVX512F-LABEL: length128_eq_const:
2614; X64-MIC-AVX512F:       # %bb.0:
2615; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2616; X64-MIC-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
2617; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+64(%rip), %zmm1, %k0
2618; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k1
2619; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
2620; X64-MIC-AVX512F-NEXT:    sete %al
2621; X64-MIC-AVX512F-NEXT:    vzeroupper
2622; X64-MIC-AVX512F-NEXT:    retq
2623  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 128) nounwind
2624  %c = icmp eq i32 %m, 0
2625  ret i1 %c
2626}
2627
2628define i32 @length192(ptr %X, ptr %Y) nounwind {
2629; X64-LABEL: length192:
2630; X64:       # %bb.0:
2631; X64-NEXT:    movl $192, %edx
2632; X64-NEXT:    jmp memcmp # TAILCALL
2633  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 192) nounwind
2634  ret i32 %m
2635}
2636
2637define i1 @length192_eq(ptr %x, ptr %y) nounwind {
2638; X64-LABEL: length192_eq:
2639; X64:       # %bb.0:
2640; X64-NEXT:    pushq %rax
2641; X64-NEXT:    movl $192, %edx
2642; X64-NEXT:    callq memcmp
2643; X64-NEXT:    testl %eax, %eax
2644; X64-NEXT:    setne %al
2645; X64-NEXT:    popq %rcx
2646; X64-NEXT:    retq
2647  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 192) nounwind
2648  %cmp = icmp ne i32 %call, 0
2649  ret i1 %cmp
2650}
2651
2652define i1 @length192_lt(ptr %x, ptr %y) nounwind {
2653; X64-LABEL: length192_lt:
2654; X64:       # %bb.0:
2655; X64-NEXT:    pushq %rax
2656; X64-NEXT:    movl $192, %edx
2657; X64-NEXT:    callq memcmp
2658; X64-NEXT:    shrl $31, %eax
2659; X64-NEXT:    # kill: def $al killed $al killed $eax
2660; X64-NEXT:    popq %rcx
2661; X64-NEXT:    retq
2662  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 192) nounwind
2663  %cmp = icmp slt i32 %call, 0
2664  ret i1 %cmp
2665}
2666
2667define i1 @length192_gt(ptr %x, ptr %y) nounwind {
2668; X64-LABEL: length192_gt:
2669; X64:       # %bb.0:
2670; X64-NEXT:    pushq %rax
2671; X64-NEXT:    movl $192, %edx
2672; X64-NEXT:    callq memcmp
2673; X64-NEXT:    testl %eax, %eax
2674; X64-NEXT:    setg %al
2675; X64-NEXT:    popq %rcx
2676; X64-NEXT:    retq
2677  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 192) nounwind
2678  %cmp = icmp sgt i32 %call, 0
2679  ret i1 %cmp
2680}
2681
2682define i1 @length192_eq_const(ptr %X) nounwind {
2683; X64-LABEL: length192_eq_const:
2684; X64:       # %bb.0:
2685; X64-NEXT:    pushq %rax
2686; X64-NEXT:    movl $.L.str, %esi
2687; X64-NEXT:    movl $192, %edx
2688; X64-NEXT:    callq memcmp
2689; X64-NEXT:    testl %eax, %eax
2690; X64-NEXT:    sete %al
2691; X64-NEXT:    popq %rcx
2692; X64-NEXT:    retq
2693  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 192) nounwind
2694  %c = icmp eq i32 %m, 0
2695  ret i1 %c
2696}
2697
2698define i32 @length255(ptr %X, ptr %Y) nounwind {
2699; X64-LABEL: length255:
2700; X64:       # %bb.0:
2701; X64-NEXT:    movl $255, %edx
2702; X64-NEXT:    jmp memcmp # TAILCALL
2703  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 255) nounwind
2704  ret i32 %m
2705}
2706
2707define i1 @length255_eq(ptr %x, ptr %y) nounwind {
2708; X64-LABEL: length255_eq:
2709; X64:       # %bb.0:
2710; X64-NEXT:    pushq %rax
2711; X64-NEXT:    movl $255, %edx
2712; X64-NEXT:    callq memcmp
2713; X64-NEXT:    testl %eax, %eax
2714; X64-NEXT:    setne %al
2715; X64-NEXT:    popq %rcx
2716; X64-NEXT:    retq
2717  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 255) nounwind
2718  %cmp = icmp ne i32 %call, 0
2719  ret i1 %cmp
2720}
2721
2722define i1 @length255_lt(ptr %x, ptr %y) nounwind {
2723; X64-LABEL: length255_lt:
2724; X64:       # %bb.0:
2725; X64-NEXT:    pushq %rax
2726; X64-NEXT:    movl $255, %edx
2727; X64-NEXT:    callq memcmp
2728; X64-NEXT:    shrl $31, %eax
2729; X64-NEXT:    # kill: def $al killed $al killed $eax
2730; X64-NEXT:    popq %rcx
2731; X64-NEXT:    retq
2732  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 255) nounwind
2733  %cmp = icmp slt i32 %call, 0
2734  ret i1 %cmp
2735}
2736
2737define i1 @length255_gt(ptr %x, ptr %y) nounwind {
2738; X64-LABEL: length255_gt:
2739; X64:       # %bb.0:
2740; X64-NEXT:    pushq %rax
2741; X64-NEXT:    movl $255, %edx
2742; X64-NEXT:    callq memcmp
2743; X64-NEXT:    testl %eax, %eax
2744; X64-NEXT:    setg %al
2745; X64-NEXT:    popq %rcx
2746; X64-NEXT:    retq
2747  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 255) nounwind
2748  %cmp = icmp sgt i32 %call, 0
2749  ret i1 %cmp
2750}
2751
2752define i1 @length255_eq_const(ptr %X) nounwind {
2753; X64-LABEL: length255_eq_const:
2754; X64:       # %bb.0:
2755; X64-NEXT:    pushq %rax
2756; X64-NEXT:    movl $.L.str, %esi
2757; X64-NEXT:    movl $255, %edx
2758; X64-NEXT:    callq memcmp
2759; X64-NEXT:    testl %eax, %eax
2760; X64-NEXT:    sete %al
2761; X64-NEXT:    popq %rcx
2762; X64-NEXT:    retq
2763  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 255) nounwind
2764  %c = icmp eq i32 %m, 0
2765  ret i1 %c
2766}
2767
2768define i32 @length256(ptr %X, ptr %Y) nounwind {
2769; X64-LABEL: length256:
2770; X64:       # %bb.0:
2771; X64-NEXT:    movl $256, %edx # imm = 0x100
2772; X64-NEXT:    jmp memcmp # TAILCALL
2773  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 256) nounwind
2774  ret i32 %m
2775}
2776
2777define i1 @length256_eq(ptr %x, ptr %y) nounwind {
2778; X64-LABEL: length256_eq:
2779; X64:       # %bb.0:
2780; X64-NEXT:    pushq %rax
2781; X64-NEXT:    movl $256, %edx # imm = 0x100
2782; X64-NEXT:    callq memcmp
2783; X64-NEXT:    testl %eax, %eax
2784; X64-NEXT:    setne %al
2785; X64-NEXT:    popq %rcx
2786; X64-NEXT:    retq
2787  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 256) nounwind
2788  %cmp = icmp ne i32 %call, 0
2789  ret i1 %cmp
2790}
2791
2792define i1 @length256_lt(ptr %x, ptr %y) nounwind {
2793; X64-LABEL: length256_lt:
2794; X64:       # %bb.0:
2795; X64-NEXT:    pushq %rax
2796; X64-NEXT:    movl $256, %edx # imm = 0x100
2797; X64-NEXT:    callq memcmp
2798; X64-NEXT:    shrl $31, %eax
2799; X64-NEXT:    # kill: def $al killed $al killed $eax
2800; X64-NEXT:    popq %rcx
2801; X64-NEXT:    retq
2802  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 256) nounwind
2803  %cmp = icmp slt i32 %call, 0
2804  ret i1 %cmp
2805}
2806
2807define i1 @length256_gt(ptr %x, ptr %y) nounwind {
2808; X64-LABEL: length256_gt:
2809; X64:       # %bb.0:
2810; X64-NEXT:    pushq %rax
2811; X64-NEXT:    movl $256, %edx # imm = 0x100
2812; X64-NEXT:    callq memcmp
2813; X64-NEXT:    testl %eax, %eax
2814; X64-NEXT:    setg %al
2815; X64-NEXT:    popq %rcx
2816; X64-NEXT:    retq
2817  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 256) nounwind
2818  %cmp = icmp sgt i32 %call, 0
2819  ret i1 %cmp
2820}
2821
2822define i1 @length256_eq_const(ptr %X) nounwind {
2823; X64-LABEL: length256_eq_const:
2824; X64:       # %bb.0:
2825; X64-NEXT:    pushq %rax
2826; X64-NEXT:    movl $.L.str, %esi
2827; X64-NEXT:    movl $256, %edx # imm = 0x100
2828; X64-NEXT:    callq memcmp
2829; X64-NEXT:    testl %eax, %eax
2830; X64-NEXT:    sete %al
2831; X64-NEXT:    popq %rcx
2832; X64-NEXT:    retq
2833  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 256) nounwind
2834  %c = icmp eq i32 %m, 0
2835  ret i1 %c
2836}
2837
2838define i32 @length384(ptr %X, ptr %Y) nounwind {
2839; X64-LABEL: length384:
2840; X64:       # %bb.0:
2841; X64-NEXT:    movl $384, %edx # imm = 0x180
2842; X64-NEXT:    jmp memcmp # TAILCALL
2843  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 384) nounwind
2844  ret i32 %m
2845}
2846
2847define i1 @length384_eq(ptr %x, ptr %y) nounwind {
2848; X64-LABEL: length384_eq:
2849; X64:       # %bb.0:
2850; X64-NEXT:    pushq %rax
2851; X64-NEXT:    movl $384, %edx # imm = 0x180
2852; X64-NEXT:    callq memcmp
2853; X64-NEXT:    testl %eax, %eax
2854; X64-NEXT:    setne %al
2855; X64-NEXT:    popq %rcx
2856; X64-NEXT:    retq
2857  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 384) nounwind
2858  %cmp = icmp ne i32 %call, 0
2859  ret i1 %cmp
2860}
2861
2862define i1 @length384_lt(ptr %x, ptr %y) nounwind {
2863; X64-LABEL: length384_lt:
2864; X64:       # %bb.0:
2865; X64-NEXT:    pushq %rax
2866; X64-NEXT:    movl $384, %edx # imm = 0x180
2867; X64-NEXT:    callq memcmp
2868; X64-NEXT:    shrl $31, %eax
2869; X64-NEXT:    # kill: def $al killed $al killed $eax
2870; X64-NEXT:    popq %rcx
2871; X64-NEXT:    retq
2872  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 384) nounwind
2873  %cmp = icmp slt i32 %call, 0
2874  ret i1 %cmp
2875}
2876
2877define i1 @length384_gt(ptr %x, ptr %y) nounwind {
2878; X64-LABEL: length384_gt:
2879; X64:       # %bb.0:
2880; X64-NEXT:    pushq %rax
2881; X64-NEXT:    movl $384, %edx # imm = 0x180
2882; X64-NEXT:    callq memcmp
2883; X64-NEXT:    testl %eax, %eax
2884; X64-NEXT:    setg %al
2885; X64-NEXT:    popq %rcx
2886; X64-NEXT:    retq
2887  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 384) nounwind
2888  %cmp = icmp sgt i32 %call, 0
2889  ret i1 %cmp
2890}
2891
2892define i1 @length384_eq_const(ptr %X) nounwind {
2893; X64-LABEL: length384_eq_const:
2894; X64:       # %bb.0:
2895; X64-NEXT:    pushq %rax
2896; X64-NEXT:    movl $.L.str, %esi
2897; X64-NEXT:    movl $384, %edx # imm = 0x180
2898; X64-NEXT:    callq memcmp
2899; X64-NEXT:    testl %eax, %eax
2900; X64-NEXT:    sete %al
2901; X64-NEXT:    popq %rcx
2902; X64-NEXT:    retq
2903  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 384) nounwind
2904  %c = icmp eq i32 %m, 0
2905  ret i1 %c
2906}
2907
2908define i32 @length511(ptr %X, ptr %Y) nounwind {
2909; X64-LABEL: length511:
2910; X64:       # %bb.0:
2911; X64-NEXT:    movl $511, %edx # imm = 0x1FF
2912; X64-NEXT:    jmp memcmp # TAILCALL
2913  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 511) nounwind
2914  ret i32 %m
2915}
2916
2917define i1 @length511_eq(ptr %x, ptr %y) nounwind {
2918; X64-LABEL: length511_eq:
2919; X64:       # %bb.0:
2920; X64-NEXT:    pushq %rax
2921; X64-NEXT:    movl $511, %edx # imm = 0x1FF
2922; X64-NEXT:    callq memcmp
2923; X64-NEXT:    testl %eax, %eax
2924; X64-NEXT:    setne %al
2925; X64-NEXT:    popq %rcx
2926; X64-NEXT:    retq
2927  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 511) nounwind
2928  %cmp = icmp ne i32 %call, 0
2929  ret i1 %cmp
2930}
2931
2932define i1 @length511_lt(ptr %x, ptr %y) nounwind {
2933; X64-LABEL: length511_lt:
2934; X64:       # %bb.0:
2935; X64-NEXT:    pushq %rax
2936; X64-NEXT:    movl $511, %edx # imm = 0x1FF
2937; X64-NEXT:    callq memcmp
2938; X64-NEXT:    shrl $31, %eax
2939; X64-NEXT:    # kill: def $al killed $al killed $eax
2940; X64-NEXT:    popq %rcx
2941; X64-NEXT:    retq
2942  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 511) nounwind
2943  %cmp = icmp slt i32 %call, 0
2944  ret i1 %cmp
2945}
2946
2947define i1 @length511_gt(ptr %x, ptr %y) nounwind {
2948; X64-LABEL: length511_gt:
2949; X64:       # %bb.0:
2950; X64-NEXT:    pushq %rax
2951; X64-NEXT:    movl $511, %edx # imm = 0x1FF
2952; X64-NEXT:    callq memcmp
2953; X64-NEXT:    testl %eax, %eax
2954; X64-NEXT:    setg %al
2955; X64-NEXT:    popq %rcx
2956; X64-NEXT:    retq
2957  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 511) nounwind
2958  %cmp = icmp sgt i32 %call, 0
2959  ret i1 %cmp
2960}
2961
2962define i1 @length511_eq_const(ptr %X) nounwind {
2963; X64-LABEL: length511_eq_const:
2964; X64:       # %bb.0:
2965; X64-NEXT:    pushq %rax
2966; X64-NEXT:    movl $.L.str, %esi
2967; X64-NEXT:    movl $511, %edx # imm = 0x1FF
2968; X64-NEXT:    callq memcmp
2969; X64-NEXT:    testl %eax, %eax
2970; X64-NEXT:    sete %al
2971; X64-NEXT:    popq %rcx
2972; X64-NEXT:    retq
2973  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 511) nounwind
2974  %c = icmp eq i32 %m, 0
2975  ret i1 %c
2976}
2977
2978define i32 @length512(ptr %X, ptr %Y) nounwind {
2979; X64-LABEL: length512:
2980; X64:       # %bb.0:
2981; X64-NEXT:    movl $512, %edx # imm = 0x200
2982; X64-NEXT:    jmp memcmp # TAILCALL
2983  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 512) nounwind
2984  ret i32 %m
2985}
2986
2987define i1 @length512_eq(ptr %x, ptr %y) nounwind {
2988; X64-LABEL: length512_eq:
2989; X64:       # %bb.0:
2990; X64-NEXT:    pushq %rax
2991; X64-NEXT:    movl $512, %edx # imm = 0x200
2992; X64-NEXT:    callq memcmp
2993; X64-NEXT:    testl %eax, %eax
2994; X64-NEXT:    setne %al
2995; X64-NEXT:    popq %rcx
2996; X64-NEXT:    retq
2997  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 512) nounwind
2998  %cmp = icmp ne i32 %call, 0
2999  ret i1 %cmp
3000}
3001
3002define i1 @length512_lt(ptr %x, ptr %y) nounwind {
3003; X64-LABEL: length512_lt:
3004; X64:       # %bb.0:
3005; X64-NEXT:    pushq %rax
3006; X64-NEXT:    movl $512, %edx # imm = 0x200
3007; X64-NEXT:    callq memcmp
3008; X64-NEXT:    shrl $31, %eax
3009; X64-NEXT:    # kill: def $al killed $al killed $eax
3010; X64-NEXT:    popq %rcx
3011; X64-NEXT:    retq
3012  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 512) nounwind
3013  %cmp = icmp slt i32 %call, 0
3014  ret i1 %cmp
3015}
3016
3017define i1 @length512_gt(ptr %x, ptr %y) nounwind {
3018; X64-LABEL: length512_gt:
3019; X64:       # %bb.0:
3020; X64-NEXT:    pushq %rax
3021; X64-NEXT:    movl $512, %edx # imm = 0x200
3022; X64-NEXT:    callq memcmp
3023; X64-NEXT:    testl %eax, %eax
3024; X64-NEXT:    setg %al
3025; X64-NEXT:    popq %rcx
3026; X64-NEXT:    retq
3027  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 512) nounwind
3028  %cmp = icmp sgt i32 %call, 0
3029  ret i1 %cmp
3030}
3031
3032define i1 @length512_eq_const(ptr %X) nounwind {
3033; X64-LABEL: length512_eq_const:
3034; X64:       # %bb.0:
3035; X64-NEXT:    pushq %rax
3036; X64-NEXT:    movl $.L.str, %esi
3037; X64-NEXT:    movl $512, %edx # imm = 0x200
3038; X64-NEXT:    callq memcmp
3039; X64-NEXT:    testl %eax, %eax
3040; X64-NEXT:    sete %al
3041; X64-NEXT:    popq %rcx
3042; X64-NEXT:    retq
3043  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 512) nounwind
3044  %c = icmp eq i32 %m, 0
3045  ret i1 %c
3046}
3047
3048; This checks that we do not do stupid things with huge sizes.
3049define i32 @huge_length(ptr %X, ptr %Y) nounwind {
3050; X64-LABEL: huge_length:
3051; X64:       # %bb.0:
3052; X64-NEXT:    movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF
3053; X64-NEXT:    jmp memcmp # TAILCALL
3054  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 9223372036854775807) nounwind
3055  ret i32 %m
3056}
3057
3058define i1 @huge_length_eq(ptr %X, ptr %Y) nounwind {
3059; X64-LABEL: huge_length_eq:
3060; X64:       # %bb.0:
3061; X64-NEXT:    pushq %rax
3062; X64-NEXT:    movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF
3063; X64-NEXT:    callq memcmp
3064; X64-NEXT:    testl %eax, %eax
3065; X64-NEXT:    sete %al
3066; X64-NEXT:    popq %rcx
3067; X64-NEXT:    retq
3068  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 9223372036854775807) nounwind
3069  %c = icmp eq i32 %m, 0
3070  ret i1 %c
3071}
3072
3073; This checks non-constant sizes.
3074define i32 @nonconst_length(ptr %X, ptr %Y, i64 %size) nounwind {
3075; X64-LABEL: nonconst_length:
3076; X64:       # %bb.0:
3077; X64-NEXT:    jmp memcmp # TAILCALL
3078  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 %size) nounwind
3079  ret i32 %m
3080}
3081
3082define i1 @nonconst_length_eq(ptr %X, ptr %Y, i64 %size) nounwind {
3083; X64-LABEL: nonconst_length_eq:
3084; X64:       # %bb.0:
3085; X64-NEXT:    pushq %rax
3086; X64-NEXT:    callq memcmp
3087; X64-NEXT:    testl %eax, %eax
3088; X64-NEXT:    sete %al
3089; X64-NEXT:    popq %rcx
3090; X64-NEXT:    retq
3091  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 %size) nounwind
3092  %c = icmp eq i32 %m, 0
3093  ret i1 %c
3094}
3095