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