1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=cmov     | FileCheck %s --check-prefixes=X86,X86-NOSSE
3; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse     | FileCheck %s --check-prefixes=X86,X86-SSE,X86-SSE1
4; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2    | FileCheck %s --check-prefixes=X86,X86-SSE,X86-SSE2
5; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse4.1  | FileCheck %s --check-prefixes=X86,X86-SSE,X86-SSE41
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown               | FileCheck %s --check-prefixes=X64,X64-SSE,X64-SSE2
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.1 | FileCheck %s --check-prefixes=X64,X64-SSE,X64-SSE41
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx    | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX1
9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx2   | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX2
10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw,+prefer-256-bit | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX2
11; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw,-prefer-256-bit | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX512,X64-AVX512BW
12; 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
13; 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
14; 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
15; 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
16
17; This tests codegen time inlining/optimization of memcmp
18; rdar://6480398
19
20@.str = private constant [513 x i8] c"01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901\00", align 1
21
22declare i32 @memcmp(i8*, i8*, i64)
23
24define i32 @length0(i8* %X, i8* %Y) nounwind {
25; X86-LABEL: length0:
26; X86:       # %bb.0:
27; X86-NEXT:    xorl %eax, %eax
28; X86-NEXT:    retl
29;
30; X64-LABEL: length0:
31; X64:       # %bb.0:
32; X64-NEXT:    xorl %eax, %eax
33; X64-NEXT:    retq
34   %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 0) nounwind
35   ret i32 %m
36 }
37
38define i1 @length0_eq(i8* %X, i8* %Y) nounwind {
39; X86-LABEL: length0_eq:
40; X86:       # %bb.0:
41; X86-NEXT:    movb $1, %al
42; X86-NEXT:    retl
43;
44; X64-LABEL: length0_eq:
45; X64:       # %bb.0:
46; X64-NEXT:    movb $1, %al
47; X64-NEXT:    retq
48  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 0) nounwind
49  %c = icmp eq i32 %m, 0
50  ret i1 %c
51}
52
53define i1 @length0_lt(i8* %X, i8* %Y) nounwind {
54; X86-LABEL: length0_lt:
55; X86:       # %bb.0:
56; X86-NEXT:    xorl %eax, %eax
57; X86-NEXT:    retl
58;
59; X64-LABEL: length0_lt:
60; X64:       # %bb.0:
61; X64-NEXT:    xorl %eax, %eax
62; X64-NEXT:    retq
63  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 0) nounwind
64  %c = icmp slt i32 %m, 0
65  ret i1 %c
66}
67
68define i32 @length2(i8* %X, i8* %Y) nounwind {
69; X86-LABEL: length2:
70; X86:       # %bb.0:
71; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
72; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
73; X86-NEXT:    movzwl (%ecx), %ecx
74; X86-NEXT:    movzwl (%eax), %edx
75; X86-NEXT:    rolw $8, %cx
76; X86-NEXT:    rolw $8, %dx
77; X86-NEXT:    movzwl %cx, %eax
78; X86-NEXT:    movzwl %dx, %ecx
79; X86-NEXT:    subl %ecx, %eax
80; X86-NEXT:    retl
81;
82; X64-LABEL: length2:
83; X64:       # %bb.0:
84; X64-NEXT:    movzwl (%rdi), %eax
85; X64-NEXT:    movzwl (%rsi), %ecx
86; X64-NEXT:    rolw $8, %ax
87; X64-NEXT:    rolw $8, %cx
88; X64-NEXT:    movzwl %ax, %eax
89; X64-NEXT:    movzwl %cx, %ecx
90; X64-NEXT:    subl %ecx, %eax
91; X64-NEXT:    retq
92  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 2) nounwind
93  ret i32 %m
94}
95
96define i32 @length2_const(i8* %X, i8* %Y) nounwind {
97; X86-LABEL: length2_const:
98; X86:       # %bb.0:
99; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
100; X86-NEXT:    movzwl (%eax), %eax
101; X86-NEXT:    rolw $8, %ax
102; X86-NEXT:    movzwl %ax, %eax
103; X86-NEXT:    addl $-12594, %eax # imm = 0xCECE
104; X86-NEXT:    retl
105;
106; X64-LABEL: length2_const:
107; X64:       # %bb.0:
108; X64-NEXT:    movzwl (%rdi), %eax
109; X64-NEXT:    rolw $8, %ax
110; X64-NEXT:    movzwl %ax, %eax
111; X64-NEXT:    addl $-12594, %eax # imm = 0xCECE
112; X64-NEXT:    retq
113  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 1), i64 2) nounwind
114  ret i32 %m
115}
116
117define i1 @length2_gt_const(i8* %X, i8* %Y) nounwind {
118; X86-LABEL: length2_gt_const:
119; X86:       # %bb.0:
120; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
121; X86-NEXT:    movzwl (%eax), %eax
122; X86-NEXT:    rolw $8, %ax
123; X86-NEXT:    movzwl %ax, %eax
124; X86-NEXT:    addl $-12594, %eax # imm = 0xCECE
125; X86-NEXT:    testl %eax, %eax
126; X86-NEXT:    setg %al
127; X86-NEXT:    retl
128;
129; X64-LABEL: length2_gt_const:
130; X64:       # %bb.0:
131; X64-NEXT:    movzwl (%rdi), %eax
132; X64-NEXT:    rolw $8, %ax
133; X64-NEXT:    movzwl %ax, %eax
134; X64-NEXT:    addl $-12594, %eax # imm = 0xCECE
135; X64-NEXT:    testl %eax, %eax
136; X64-NEXT:    setg %al
137; X64-NEXT:    retq
138  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 1), i64 2) nounwind
139  %c = icmp sgt i32 %m, 0
140  ret i1 %c
141}
142
143define i1 @length2_eq(i8* %X, i8* %Y) nounwind {
144; X86-LABEL: length2_eq:
145; X86:       # %bb.0:
146; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
147; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
148; X86-NEXT:    movzwl (%ecx), %ecx
149; X86-NEXT:    cmpw (%eax), %cx
150; X86-NEXT:    sete %al
151; X86-NEXT:    retl
152;
153; X64-LABEL: length2_eq:
154; X64:       # %bb.0:
155; X64-NEXT:    movzwl (%rdi), %eax
156; X64-NEXT:    cmpw (%rsi), %ax
157; X64-NEXT:    sete %al
158; X64-NEXT:    retq
159  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 2) nounwind
160  %c = icmp eq i32 %m, 0
161  ret i1 %c
162}
163
164define i1 @length2_lt(i8* %X, i8* %Y) nounwind {
165; X86-LABEL: length2_lt:
166; X86:       # %bb.0:
167; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
168; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
169; X86-NEXT:    movzwl (%ecx), %ecx
170; X86-NEXT:    movzwl (%eax), %edx
171; X86-NEXT:    rolw $8, %cx
172; X86-NEXT:    rolw $8, %dx
173; X86-NEXT:    movzwl %cx, %eax
174; X86-NEXT:    movzwl %dx, %ecx
175; X86-NEXT:    subl %ecx, %eax
176; X86-NEXT:    shrl $31, %eax
177; X86-NEXT:    # kill: def $al killed $al killed $eax
178; X86-NEXT:    retl
179;
180; X64-LABEL: length2_lt:
181; X64:       # %bb.0:
182; X64-NEXT:    movzwl (%rdi), %eax
183; X64-NEXT:    movzwl (%rsi), %ecx
184; X64-NEXT:    rolw $8, %ax
185; X64-NEXT:    rolw $8, %cx
186; X64-NEXT:    movzwl %ax, %eax
187; X64-NEXT:    movzwl %cx, %ecx
188; X64-NEXT:    subl %ecx, %eax
189; X64-NEXT:    shrl $31, %eax
190; X64-NEXT:    # kill: def $al killed $al killed $eax
191; X64-NEXT:    retq
192  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 2) nounwind
193  %c = icmp slt i32 %m, 0
194  ret i1 %c
195}
196
197define i1 @length2_gt(i8* %X, i8* %Y) nounwind {
198; X86-LABEL: length2_gt:
199; X86:       # %bb.0:
200; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
201; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
202; X86-NEXT:    movzwl (%ecx), %ecx
203; X86-NEXT:    movzwl (%eax), %eax
204; X86-NEXT:    rolw $8, %cx
205; X86-NEXT:    rolw $8, %ax
206; X86-NEXT:    movzwl %cx, %ecx
207; X86-NEXT:    movzwl %ax, %eax
208; X86-NEXT:    subl %eax, %ecx
209; X86-NEXT:    testl %ecx, %ecx
210; X86-NEXT:    setg %al
211; X86-NEXT:    retl
212;
213; X64-LABEL: length2_gt:
214; X64:       # %bb.0:
215; X64-NEXT:    movzwl (%rdi), %eax
216; X64-NEXT:    movzwl (%rsi), %ecx
217; X64-NEXT:    rolw $8, %ax
218; X64-NEXT:    rolw $8, %cx
219; X64-NEXT:    movzwl %ax, %eax
220; X64-NEXT:    movzwl %cx, %ecx
221; X64-NEXT:    subl %ecx, %eax
222; X64-NEXT:    testl %eax, %eax
223; X64-NEXT:    setg %al
224; X64-NEXT:    retq
225  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 2) nounwind
226  %c = icmp sgt i32 %m, 0
227  ret i1 %c
228}
229
230define i1 @length2_eq_const(i8* %X) nounwind {
231; X86-LABEL: length2_eq_const:
232; X86:       # %bb.0:
233; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
234; X86-NEXT:    movzwl (%eax), %eax
235; X86-NEXT:    cmpl $12849, %eax # imm = 0x3231
236; X86-NEXT:    setne %al
237; X86-NEXT:    retl
238;
239; X64-LABEL: length2_eq_const:
240; X64:       # %bb.0:
241; X64-NEXT:    movzwl (%rdi), %eax
242; X64-NEXT:    cmpl $12849, %eax # imm = 0x3231
243; X64-NEXT:    setne %al
244; X64-NEXT:    retq
245  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 1), i64 2) nounwind
246  %c = icmp ne i32 %m, 0
247  ret i1 %c
248}
249
250define i1 @length2_eq_nobuiltin_attr(i8* %X, i8* %Y) nounwind {
251; X86-LABEL: length2_eq_nobuiltin_attr:
252; X86:       # %bb.0:
253; X86-NEXT:    pushl $0
254; X86-NEXT:    pushl $2
255; X86-NEXT:    pushl {{[0-9]+}}(%esp)
256; X86-NEXT:    pushl {{[0-9]+}}(%esp)
257; X86-NEXT:    calll memcmp
258; X86-NEXT:    addl $16, %esp
259; X86-NEXT:    testl %eax, %eax
260; X86-NEXT:    sete %al
261; X86-NEXT:    retl
262;
263; X64-LABEL: length2_eq_nobuiltin_attr:
264; X64:       # %bb.0:
265; X64-NEXT:    pushq %rax
266; X64-NEXT:    movl $2, %edx
267; X64-NEXT:    callq memcmp
268; X64-NEXT:    testl %eax, %eax
269; X64-NEXT:    sete %al
270; X64-NEXT:    popq %rcx
271; X64-NEXT:    retq
272  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 2) nounwind nobuiltin
273  %c = icmp eq i32 %m, 0
274  ret i1 %c
275}
276
277define i32 @length3(i8* %X, i8* %Y) nounwind {
278; X86-LABEL: length3:
279; X86:       # %bb.0:
280; X86-NEXT:    pushl %esi
281; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
282; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
283; X86-NEXT:    movzwl (%eax), %edx
284; X86-NEXT:    movzwl (%ecx), %esi
285; X86-NEXT:    rolw $8, %dx
286; X86-NEXT:    rolw $8, %si
287; X86-NEXT:    cmpw %si, %dx
288; X86-NEXT:    jne .LBB11_3
289; X86-NEXT:  # %bb.1: # %loadbb1
290; X86-NEXT:    movzbl 2(%eax), %eax
291; X86-NEXT:    movzbl 2(%ecx), %ecx
292; X86-NEXT:    subl %ecx, %eax
293; X86-NEXT:    popl %esi
294; X86-NEXT:    retl
295; X86-NEXT:  .LBB11_3: # %res_block
296; X86-NEXT:    setae %al
297; X86-NEXT:    movzbl %al, %eax
298; X86-NEXT:    leal -1(%eax,%eax), %eax
299; X86-NEXT:    popl %esi
300; X86-NEXT:    retl
301;
302; X64-LABEL: length3:
303; X64:       # %bb.0:
304; X64-NEXT:    movzwl (%rdi), %eax
305; X64-NEXT:    movzwl (%rsi), %ecx
306; X64-NEXT:    rolw $8, %ax
307; X64-NEXT:    rolw $8, %cx
308; X64-NEXT:    cmpw %cx, %ax
309; X64-NEXT:    jne .LBB11_3
310; X64-NEXT:  # %bb.1: # %loadbb1
311; X64-NEXT:    movzbl 2(%rdi), %eax
312; X64-NEXT:    movzbl 2(%rsi), %ecx
313; X64-NEXT:    subl %ecx, %eax
314; X64-NEXT:    retq
315; X64-NEXT:  .LBB11_3: # %res_block
316; X64-NEXT:    setae %al
317; X64-NEXT:    movzbl %al, %eax
318; X64-NEXT:    leal -1(%rax,%rax), %eax
319; X64-NEXT:    retq
320  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 3) nounwind
321  ret i32 %m
322}
323
324define i1 @length3_eq(i8* %X, i8* %Y) nounwind {
325; X86-LABEL: length3_eq:
326; X86:       # %bb.0:
327; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
328; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
329; X86-NEXT:    movzwl (%ecx), %edx
330; X86-NEXT:    xorw (%eax), %dx
331; X86-NEXT:    movb 2(%ecx), %cl
332; X86-NEXT:    xorb 2(%eax), %cl
333; X86-NEXT:    movzbl %cl, %eax
334; X86-NEXT:    orw %dx, %ax
335; X86-NEXT:    setne %al
336; X86-NEXT:    retl
337;
338; X64-LABEL: length3_eq:
339; X64:       # %bb.0:
340; X64-NEXT:    movzwl (%rdi), %eax
341; X64-NEXT:    xorw (%rsi), %ax
342; X64-NEXT:    movb 2(%rdi), %cl
343; X64-NEXT:    xorb 2(%rsi), %cl
344; X64-NEXT:    movzbl %cl, %ecx
345; X64-NEXT:    orw %ax, %cx
346; X64-NEXT:    setne %al
347; X64-NEXT:    retq
348  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 3) nounwind
349  %c = icmp ne i32 %m, 0
350  ret i1 %c
351}
352
353define i32 @length4(i8* %X, i8* %Y) nounwind {
354; X86-LABEL: length4:
355; X86:       # %bb.0:
356; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
357; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
358; X86-NEXT:    movl (%ecx), %ecx
359; X86-NEXT:    movl (%eax), %edx
360; X86-NEXT:    bswapl %ecx
361; X86-NEXT:    bswapl %edx
362; X86-NEXT:    xorl %eax, %eax
363; X86-NEXT:    cmpl %edx, %ecx
364; X86-NEXT:    seta %al
365; X86-NEXT:    sbbl $0, %eax
366; X86-NEXT:    retl
367;
368; X64-LABEL: length4:
369; X64:       # %bb.0:
370; X64-NEXT:    movl (%rdi), %ecx
371; X64-NEXT:    movl (%rsi), %edx
372; X64-NEXT:    bswapl %ecx
373; X64-NEXT:    bswapl %edx
374; X64-NEXT:    xorl %eax, %eax
375; X64-NEXT:    cmpl %edx, %ecx
376; X64-NEXT:    seta %al
377; X64-NEXT:    sbbl $0, %eax
378; X64-NEXT:    retq
379  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 4) nounwind
380  ret i32 %m
381}
382
383define i1 @length4_eq(i8* %X, i8* %Y) nounwind {
384; X86-LABEL: length4_eq:
385; X86:       # %bb.0:
386; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
387; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
388; X86-NEXT:    movl (%ecx), %ecx
389; X86-NEXT:    cmpl (%eax), %ecx
390; X86-NEXT:    setne %al
391; X86-NEXT:    retl
392;
393; X64-LABEL: length4_eq:
394; X64:       # %bb.0:
395; X64-NEXT:    movl (%rdi), %eax
396; X64-NEXT:    cmpl (%rsi), %eax
397; X64-NEXT:    setne %al
398; X64-NEXT:    retq
399  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 4) nounwind
400  %c = icmp ne i32 %m, 0
401  ret i1 %c
402}
403
404define i1 @length4_lt(i8* %X, i8* %Y) nounwind {
405; X86-LABEL: length4_lt:
406; X86:       # %bb.0:
407; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
408; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
409; X86-NEXT:    movl (%ecx), %ecx
410; X86-NEXT:    movl (%eax), %edx
411; X86-NEXT:    bswapl %ecx
412; X86-NEXT:    bswapl %edx
413; X86-NEXT:    xorl %eax, %eax
414; X86-NEXT:    cmpl %edx, %ecx
415; X86-NEXT:    seta %al
416; X86-NEXT:    sbbl $0, %eax
417; X86-NEXT:    shrl $31, %eax
418; X86-NEXT:    # kill: def $al killed $al killed $eax
419; X86-NEXT:    retl
420;
421; X64-LABEL: length4_lt:
422; X64:       # %bb.0:
423; X64-NEXT:    movl (%rdi), %ecx
424; X64-NEXT:    movl (%rsi), %edx
425; X64-NEXT:    bswapl %ecx
426; X64-NEXT:    bswapl %edx
427; X64-NEXT:    xorl %eax, %eax
428; X64-NEXT:    cmpl %edx, %ecx
429; X64-NEXT:    seta %al
430; X64-NEXT:    sbbl $0, %eax
431; X64-NEXT:    shrl $31, %eax
432; X64-NEXT:    # kill: def $al killed $al killed $eax
433; X64-NEXT:    retq
434  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 4) nounwind
435  %c = icmp slt i32 %m, 0
436  ret i1 %c
437}
438
439define i1 @length4_gt(i8* %X, i8* %Y) nounwind {
440; X86-LABEL: length4_gt:
441; X86:       # %bb.0:
442; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
443; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
444; X86-NEXT:    movl (%ecx), %ecx
445; X86-NEXT:    movl (%eax), %eax
446; X86-NEXT:    bswapl %ecx
447; X86-NEXT:    bswapl %eax
448; X86-NEXT:    xorl %edx, %edx
449; X86-NEXT:    cmpl %eax, %ecx
450; X86-NEXT:    seta %dl
451; X86-NEXT:    sbbl $0, %edx
452; X86-NEXT:    testl %edx, %edx
453; X86-NEXT:    setg %al
454; X86-NEXT:    retl
455;
456; X64-LABEL: length4_gt:
457; X64:       # %bb.0:
458; X64-NEXT:    movl (%rdi), %eax
459; X64-NEXT:    movl (%rsi), %ecx
460; X64-NEXT:    bswapl %eax
461; X64-NEXT:    bswapl %ecx
462; X64-NEXT:    xorl %edx, %edx
463; X64-NEXT:    cmpl %ecx, %eax
464; X64-NEXT:    seta %dl
465; X64-NEXT:    sbbl $0, %edx
466; X64-NEXT:    testl %edx, %edx
467; X64-NEXT:    setg %al
468; X64-NEXT:    retq
469  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 4) nounwind
470  %c = icmp sgt i32 %m, 0
471  ret i1 %c
472}
473
474define i1 @length4_eq_const(i8* %X) nounwind {
475; X86-LABEL: length4_eq_const:
476; X86:       # %bb.0:
477; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
478; X86-NEXT:    cmpl $875770417, (%eax) # imm = 0x34333231
479; X86-NEXT:    sete %al
480; X86-NEXT:    retl
481;
482; X64-LABEL: length4_eq_const:
483; X64:       # %bb.0:
484; X64-NEXT:    cmpl $875770417, (%rdi) # imm = 0x34333231
485; X64-NEXT:    sete %al
486; X64-NEXT:    retq
487  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 1), i64 4) nounwind
488  %c = icmp eq i32 %m, 0
489  ret i1 %c
490}
491
492define i32 @length5(i8* %X, i8* %Y) nounwind {
493; X86-LABEL: length5:
494; X86:       # %bb.0:
495; X86-NEXT:    pushl %esi
496; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
497; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
498; X86-NEXT:    movl (%eax), %edx
499; X86-NEXT:    movl (%ecx), %esi
500; X86-NEXT:    bswapl %edx
501; X86-NEXT:    bswapl %esi
502; X86-NEXT:    cmpl %esi, %edx
503; X86-NEXT:    jne .LBB18_3
504; X86-NEXT:  # %bb.1: # %loadbb1
505; X86-NEXT:    movzbl 4(%eax), %eax
506; X86-NEXT:    movzbl 4(%ecx), %ecx
507; X86-NEXT:    subl %ecx, %eax
508; X86-NEXT:    popl %esi
509; X86-NEXT:    retl
510; X86-NEXT:  .LBB18_3: # %res_block
511; X86-NEXT:    setae %al
512; X86-NEXT:    movzbl %al, %eax
513; X86-NEXT:    leal -1(%eax,%eax), %eax
514; X86-NEXT:    popl %esi
515; X86-NEXT:    retl
516;
517; X64-LABEL: length5:
518; X64:       # %bb.0:
519; X64-NEXT:    movl (%rdi), %eax
520; X64-NEXT:    movl (%rsi), %ecx
521; X64-NEXT:    bswapl %eax
522; X64-NEXT:    bswapl %ecx
523; X64-NEXT:    cmpl %ecx, %eax
524; X64-NEXT:    jne .LBB18_3
525; X64-NEXT:  # %bb.1: # %loadbb1
526; X64-NEXT:    movzbl 4(%rdi), %eax
527; X64-NEXT:    movzbl 4(%rsi), %ecx
528; X64-NEXT:    subl %ecx, %eax
529; X64-NEXT:    retq
530; X64-NEXT:  .LBB18_3: # %res_block
531; X64-NEXT:    setae %al
532; X64-NEXT:    movzbl %al, %eax
533; X64-NEXT:    leal -1(%rax,%rax), %eax
534; X64-NEXT:    retq
535  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 5) nounwind
536  ret i32 %m
537}
538
539define i1 @length5_eq(i8* %X, i8* %Y) nounwind {
540; X86-LABEL: length5_eq:
541; X86:       # %bb.0:
542; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
543; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
544; X86-NEXT:    movl (%ecx), %edx
545; X86-NEXT:    xorl (%eax), %edx
546; X86-NEXT:    movb 4(%ecx), %cl
547; X86-NEXT:    xorb 4(%eax), %cl
548; X86-NEXT:    movzbl %cl, %eax
549; X86-NEXT:    orl %edx, %eax
550; X86-NEXT:    setne %al
551; X86-NEXT:    retl
552;
553; X64-LABEL: length5_eq:
554; X64:       # %bb.0:
555; X64-NEXT:    movl (%rdi), %eax
556; X64-NEXT:    xorl (%rsi), %eax
557; X64-NEXT:    movb 4(%rdi), %cl
558; X64-NEXT:    xorb 4(%rsi), %cl
559; X64-NEXT:    movzbl %cl, %ecx
560; X64-NEXT:    orl %eax, %ecx
561; X64-NEXT:    setne %al
562; X64-NEXT:    retq
563  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 5) nounwind
564  %c = icmp ne i32 %m, 0
565  ret i1 %c
566}
567
568define i1 @length5_lt(i8* %X, i8* %Y) nounwind {
569; X86-LABEL: length5_lt:
570; X86:       # %bb.0:
571; X86-NEXT:    pushl %esi
572; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
573; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
574; X86-NEXT:    movl (%eax), %edx
575; X86-NEXT:    movl (%ecx), %esi
576; X86-NEXT:    bswapl %edx
577; X86-NEXT:    bswapl %esi
578; X86-NEXT:    cmpl %esi, %edx
579; X86-NEXT:    jne .LBB20_3
580; X86-NEXT:  # %bb.1: # %loadbb1
581; X86-NEXT:    movzbl 4(%eax), %eax
582; X86-NEXT:    movzbl 4(%ecx), %ecx
583; X86-NEXT:    subl %ecx, %eax
584; X86-NEXT:    jmp .LBB20_2
585; X86-NEXT:  .LBB20_3: # %res_block
586; X86-NEXT:    setae %al
587; X86-NEXT:    movzbl %al, %eax
588; X86-NEXT:    leal -1(%eax,%eax), %eax
589; X86-NEXT:  .LBB20_2: # %endblock
590; X86-NEXT:    shrl $31, %eax
591; X86-NEXT:    # kill: def $al killed $al killed $eax
592; X86-NEXT:    popl %esi
593; X86-NEXT:    retl
594;
595; X64-LABEL: length5_lt:
596; X64:       # %bb.0:
597; X64-NEXT:    movl (%rdi), %eax
598; X64-NEXT:    movl (%rsi), %ecx
599; X64-NEXT:    bswapl %eax
600; X64-NEXT:    bswapl %ecx
601; X64-NEXT:    cmpl %ecx, %eax
602; X64-NEXT:    jne .LBB20_3
603; X64-NEXT:  # %bb.1: # %loadbb1
604; X64-NEXT:    movzbl 4(%rdi), %eax
605; X64-NEXT:    movzbl 4(%rsi), %ecx
606; X64-NEXT:    subl %ecx, %eax
607; X64-NEXT:    shrl $31, %eax
608; X64-NEXT:    # kill: def $al killed $al killed $eax
609; X64-NEXT:    retq
610; X64-NEXT:  .LBB20_3: # %res_block
611; X64-NEXT:    setae %al
612; X64-NEXT:    movzbl %al, %eax
613; X64-NEXT:    leal -1(%rax,%rax), %eax
614; X64-NEXT:    shrl $31, %eax
615; X64-NEXT:    # kill: def $al killed $al killed $eax
616; X64-NEXT:    retq
617  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 5) nounwind
618  %c = icmp slt i32 %m, 0
619  ret i1 %c
620}
621
622define i32 @length7(i8* %X, i8* %Y) nounwind {
623; X86-LABEL: length7:
624; X86:       # %bb.0:
625; X86-NEXT:    pushl %esi
626; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
627; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
628; X86-NEXT:    movl (%esi), %ecx
629; X86-NEXT:    movl (%eax), %edx
630; X86-NEXT:    bswapl %ecx
631; X86-NEXT:    bswapl %edx
632; X86-NEXT:    cmpl %edx, %ecx
633; X86-NEXT:    jne .LBB21_2
634; X86-NEXT:  # %bb.1: # %loadbb1
635; X86-NEXT:    movl 3(%esi), %ecx
636; X86-NEXT:    movl 3(%eax), %edx
637; X86-NEXT:    bswapl %ecx
638; X86-NEXT:    bswapl %edx
639; X86-NEXT:    xorl %eax, %eax
640; X86-NEXT:    cmpl %edx, %ecx
641; X86-NEXT:    je .LBB21_3
642; X86-NEXT:  .LBB21_2: # %res_block
643; X86-NEXT:    xorl %eax, %eax
644; X86-NEXT:    cmpl %edx, %ecx
645; X86-NEXT:    setae %al
646; X86-NEXT:    leal -1(%eax,%eax), %eax
647; X86-NEXT:  .LBB21_3: # %endblock
648; X86-NEXT:    popl %esi
649; X86-NEXT:    retl
650;
651; X64-LABEL: length7:
652; X64:       # %bb.0:
653; X64-NEXT:    movl (%rdi), %ecx
654; X64-NEXT:    movl (%rsi), %edx
655; X64-NEXT:    bswapl %ecx
656; X64-NEXT:    bswapl %edx
657; X64-NEXT:    cmpl %edx, %ecx
658; X64-NEXT:    jne .LBB21_2
659; X64-NEXT:  # %bb.1: # %loadbb1
660; X64-NEXT:    movl 3(%rdi), %ecx
661; X64-NEXT:    movl 3(%rsi), %edx
662; X64-NEXT:    bswapl %ecx
663; X64-NEXT:    bswapl %edx
664; X64-NEXT:    xorl %eax, %eax
665; X64-NEXT:    cmpl %edx, %ecx
666; X64-NEXT:    je .LBB21_3
667; X64-NEXT:  .LBB21_2: # %res_block
668; X64-NEXT:    xorl %eax, %eax
669; X64-NEXT:    cmpl %edx, %ecx
670; X64-NEXT:    setae %al
671; X64-NEXT:    leal -1(%rax,%rax), %eax
672; X64-NEXT:  .LBB21_3: # %endblock
673; X64-NEXT:    retq
674  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 7) nounwind
675  ret i32 %m
676}
677
678define i1 @length7_lt(i8* %X, i8* %Y) nounwind {
679; X86-LABEL: length7_lt:
680; X86:       # %bb.0:
681; X86-NEXT:    pushl %esi
682; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
683; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
684; X86-NEXT:    movl (%esi), %ecx
685; X86-NEXT:    movl (%eax), %edx
686; X86-NEXT:    bswapl %ecx
687; X86-NEXT:    bswapl %edx
688; X86-NEXT:    cmpl %edx, %ecx
689; X86-NEXT:    jne .LBB22_2
690; X86-NEXT:  # %bb.1: # %loadbb1
691; X86-NEXT:    movl 3(%esi), %ecx
692; X86-NEXT:    movl 3(%eax), %edx
693; X86-NEXT:    bswapl %ecx
694; X86-NEXT:    bswapl %edx
695; X86-NEXT:    xorl %eax, %eax
696; X86-NEXT:    cmpl %edx, %ecx
697; X86-NEXT:    je .LBB22_3
698; X86-NEXT:  .LBB22_2: # %res_block
699; X86-NEXT:    xorl %eax, %eax
700; X86-NEXT:    cmpl %edx, %ecx
701; X86-NEXT:    setae %al
702; X86-NEXT:    leal -1(%eax,%eax), %eax
703; X86-NEXT:  .LBB22_3: # %endblock
704; X86-NEXT:    shrl $31, %eax
705; X86-NEXT:    # kill: def $al killed $al killed $eax
706; X86-NEXT:    popl %esi
707; X86-NEXT:    retl
708;
709; X64-LABEL: length7_lt:
710; X64:       # %bb.0:
711; X64-NEXT:    movl (%rdi), %ecx
712; X64-NEXT:    movl (%rsi), %edx
713; X64-NEXT:    bswapl %ecx
714; X64-NEXT:    bswapl %edx
715; X64-NEXT:    cmpl %edx, %ecx
716; X64-NEXT:    jne .LBB22_2
717; X64-NEXT:  # %bb.1: # %loadbb1
718; X64-NEXT:    movl 3(%rdi), %ecx
719; X64-NEXT:    movl 3(%rsi), %edx
720; X64-NEXT:    bswapl %ecx
721; X64-NEXT:    bswapl %edx
722; X64-NEXT:    xorl %eax, %eax
723; X64-NEXT:    cmpl %edx, %ecx
724; X64-NEXT:    je .LBB22_3
725; X64-NEXT:  .LBB22_2: # %res_block
726; X64-NEXT:    xorl %eax, %eax
727; X64-NEXT:    cmpl %edx, %ecx
728; X64-NEXT:    setae %al
729; X64-NEXT:    leal -1(%rax,%rax), %eax
730; X64-NEXT:  .LBB22_3: # %endblock
731; X64-NEXT:    shrl $31, %eax
732; X64-NEXT:    # kill: def $al killed $al killed $eax
733; X64-NEXT:    retq
734  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 7) nounwind
735  %c = icmp slt i32 %m, 0
736  ret i1 %c
737}
738
739define i1 @length7_eq(i8* %X, i8* %Y) nounwind {
740; X86-LABEL: length7_eq:
741; X86:       # %bb.0:
742; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
743; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
744; X86-NEXT:    movl (%ecx), %edx
745; X86-NEXT:    movl 3(%ecx), %ecx
746; X86-NEXT:    xorl (%eax), %edx
747; X86-NEXT:    xorl 3(%eax), %ecx
748; X86-NEXT:    orl %edx, %ecx
749; X86-NEXT:    setne %al
750; X86-NEXT:    retl
751;
752; X64-LABEL: length7_eq:
753; X64:       # %bb.0:
754; X64-NEXT:    movl (%rdi), %eax
755; X64-NEXT:    movl 3(%rdi), %ecx
756; X64-NEXT:    xorl (%rsi), %eax
757; X64-NEXT:    xorl 3(%rsi), %ecx
758; X64-NEXT:    orl %eax, %ecx
759; X64-NEXT:    setne %al
760; X64-NEXT:    retq
761  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 7) nounwind
762  %c = icmp ne i32 %m, 0
763  ret i1 %c
764}
765
766define i32 @length8(i8* %X, i8* %Y) nounwind {
767; X86-LABEL: length8:
768; X86:       # %bb.0:
769; X86-NEXT:    pushl %esi
770; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
771; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
772; X86-NEXT:    movl (%esi), %ecx
773; X86-NEXT:    movl (%eax), %edx
774; X86-NEXT:    bswapl %ecx
775; X86-NEXT:    bswapl %edx
776; X86-NEXT:    cmpl %edx, %ecx
777; X86-NEXT:    jne .LBB24_2
778; X86-NEXT:  # %bb.1: # %loadbb1
779; X86-NEXT:    movl 4(%esi), %ecx
780; X86-NEXT:    movl 4(%eax), %edx
781; X86-NEXT:    bswapl %ecx
782; X86-NEXT:    bswapl %edx
783; X86-NEXT:    xorl %eax, %eax
784; X86-NEXT:    cmpl %edx, %ecx
785; X86-NEXT:    je .LBB24_3
786; X86-NEXT:  .LBB24_2: # %res_block
787; X86-NEXT:    xorl %eax, %eax
788; X86-NEXT:    cmpl %edx, %ecx
789; X86-NEXT:    setae %al
790; X86-NEXT:    leal -1(%eax,%eax), %eax
791; X86-NEXT:  .LBB24_3: # %endblock
792; X86-NEXT:    popl %esi
793; X86-NEXT:    retl
794;
795; X64-LABEL: length8:
796; X64:       # %bb.0:
797; X64-NEXT:    movq (%rdi), %rcx
798; X64-NEXT:    movq (%rsi), %rdx
799; X64-NEXT:    bswapq %rcx
800; X64-NEXT:    bswapq %rdx
801; X64-NEXT:    xorl %eax, %eax
802; X64-NEXT:    cmpq %rdx, %rcx
803; X64-NEXT:    seta %al
804; X64-NEXT:    sbbl $0, %eax
805; X64-NEXT:    retq
806  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 8) nounwind
807  ret i32 %m
808}
809
810define i1 @length8_eq(i8* %X, i8* %Y) nounwind {
811; X86-LABEL: length8_eq:
812; X86:       # %bb.0:
813; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
814; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
815; X86-NEXT:    movl (%ecx), %edx
816; X86-NEXT:    movl 4(%ecx), %ecx
817; X86-NEXT:    xorl (%eax), %edx
818; X86-NEXT:    xorl 4(%eax), %ecx
819; X86-NEXT:    orl %edx, %ecx
820; X86-NEXT:    sete %al
821; X86-NEXT:    retl
822;
823; X64-LABEL: length8_eq:
824; X64:       # %bb.0:
825; X64-NEXT:    movq (%rdi), %rax
826; X64-NEXT:    cmpq (%rsi), %rax
827; X64-NEXT:    sete %al
828; X64-NEXT:    retq
829  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 8) nounwind
830  %c = icmp eq i32 %m, 0
831  ret i1 %c
832}
833
834define i1 @length8_eq_const(i8* %X) nounwind {
835; X86-LABEL: length8_eq_const:
836; X86:       # %bb.0:
837; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
838; X86-NEXT:    movl $858927408, %ecx # imm = 0x33323130
839; X86-NEXT:    xorl (%eax), %ecx
840; X86-NEXT:    movl $926299444, %edx # imm = 0x37363534
841; X86-NEXT:    xorl 4(%eax), %edx
842; X86-NEXT:    orl %ecx, %edx
843; X86-NEXT:    setne %al
844; X86-NEXT:    retl
845;
846; X64-LABEL: length8_eq_const:
847; X64:       # %bb.0:
848; X64-NEXT:    movabsq $3978425819141910832, %rax # imm = 0x3736353433323130
849; X64-NEXT:    cmpq %rax, (%rdi)
850; X64-NEXT:    setne %al
851; X64-NEXT:    retq
852  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 8) nounwind
853  %c = icmp ne i32 %m, 0
854  ret i1 %c
855}
856
857define i1 @length9_eq(i8* %X, i8* %Y) nounwind {
858; X86-LABEL: length9_eq:
859; X86:       # %bb.0:
860; X86-NEXT:    pushl $0
861; X86-NEXT:    pushl $9
862; X86-NEXT:    pushl {{[0-9]+}}(%esp)
863; X86-NEXT:    pushl {{[0-9]+}}(%esp)
864; X86-NEXT:    calll memcmp
865; X86-NEXT:    addl $16, %esp
866; X86-NEXT:    testl %eax, %eax
867; X86-NEXT:    sete %al
868; X86-NEXT:    retl
869;
870; X64-LABEL: length9_eq:
871; X64:       # %bb.0:
872; X64-NEXT:    movq (%rdi), %rax
873; X64-NEXT:    xorq (%rsi), %rax
874; X64-NEXT:    movb 8(%rdi), %cl
875; X64-NEXT:    xorb 8(%rsi), %cl
876; X64-NEXT:    movzbl %cl, %ecx
877; X64-NEXT:    orq %rax, %rcx
878; X64-NEXT:    sete %al
879; X64-NEXT:    retq
880  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 9) nounwind
881  %c = icmp eq i32 %m, 0
882  ret i1 %c
883}
884
885define i1 @length10_eq(i8* %X, i8* %Y) nounwind {
886; X86-LABEL: length10_eq:
887; X86:       # %bb.0:
888; X86-NEXT:    pushl $0
889; X86-NEXT:    pushl $10
890; X86-NEXT:    pushl {{[0-9]+}}(%esp)
891; X86-NEXT:    pushl {{[0-9]+}}(%esp)
892; X86-NEXT:    calll memcmp
893; X86-NEXT:    addl $16, %esp
894; X86-NEXT:    testl %eax, %eax
895; X86-NEXT:    sete %al
896; X86-NEXT:    retl
897;
898; X64-LABEL: length10_eq:
899; X64:       # %bb.0:
900; X64-NEXT:    movq (%rdi), %rax
901; X64-NEXT:    xorq (%rsi), %rax
902; X64-NEXT:    movzwl 8(%rdi), %ecx
903; X64-NEXT:    xorw 8(%rsi), %cx
904; X64-NEXT:    movzwl %cx, %ecx
905; X64-NEXT:    orq %rax, %rcx
906; X64-NEXT:    sete %al
907; X64-NEXT:    retq
908  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 10) nounwind
909  %c = icmp eq i32 %m, 0
910  ret i1 %c
911}
912
913define i1 @length11_eq(i8* %X, i8* %Y) nounwind {
914; X86-LABEL: length11_eq:
915; X86:       # %bb.0:
916; X86-NEXT:    pushl $0
917; X86-NEXT:    pushl $11
918; X86-NEXT:    pushl {{[0-9]+}}(%esp)
919; X86-NEXT:    pushl {{[0-9]+}}(%esp)
920; X86-NEXT:    calll memcmp
921; X86-NEXT:    addl $16, %esp
922; X86-NEXT:    testl %eax, %eax
923; X86-NEXT:    sete %al
924; X86-NEXT:    retl
925;
926; X64-LABEL: length11_eq:
927; X64:       # %bb.0:
928; X64-NEXT:    movq (%rdi), %rax
929; X64-NEXT:    movq 3(%rdi), %rcx
930; X64-NEXT:    xorq (%rsi), %rax
931; X64-NEXT:    xorq 3(%rsi), %rcx
932; X64-NEXT:    orq %rax, %rcx
933; X64-NEXT:    sete %al
934; X64-NEXT:    retq
935  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 11) nounwind
936  %c = icmp eq i32 %m, 0
937  ret i1 %c
938}
939
940define i1 @length12_eq(i8* %X, i8* %Y) nounwind {
941; X86-LABEL: length12_eq:
942; X86:       # %bb.0:
943; X86-NEXT:    pushl $0
944; X86-NEXT:    pushl $12
945; X86-NEXT:    pushl {{[0-9]+}}(%esp)
946; X86-NEXT:    pushl {{[0-9]+}}(%esp)
947; X86-NEXT:    calll memcmp
948; X86-NEXT:    addl $16, %esp
949; X86-NEXT:    testl %eax, %eax
950; X86-NEXT:    setne %al
951; X86-NEXT:    retl
952;
953; X64-LABEL: length12_eq:
954; X64:       # %bb.0:
955; X64-NEXT:    movq (%rdi), %rax
956; X64-NEXT:    xorq (%rsi), %rax
957; X64-NEXT:    movl 8(%rdi), %ecx
958; X64-NEXT:    xorl 8(%rsi), %ecx
959; X64-NEXT:    orq %rax, %rcx
960; X64-NEXT:    setne %al
961; X64-NEXT:    retq
962  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 12) nounwind
963  %c = icmp ne i32 %m, 0
964  ret i1 %c
965}
966
967define i32 @length12(i8* %X, i8* %Y) nounwind {
968; X86-LABEL: length12:
969; X86:       # %bb.0:
970; X86-NEXT:    pushl $0
971; X86-NEXT:    pushl $12
972; X86-NEXT:    pushl {{[0-9]+}}(%esp)
973; X86-NEXT:    pushl {{[0-9]+}}(%esp)
974; X86-NEXT:    calll memcmp
975; X86-NEXT:    addl $16, %esp
976; X86-NEXT:    retl
977;
978; X64-LABEL: length12:
979; X64:       # %bb.0:
980; X64-NEXT:    movq (%rdi), %rcx
981; X64-NEXT:    movq (%rsi), %rdx
982; X64-NEXT:    bswapq %rcx
983; X64-NEXT:    bswapq %rdx
984; X64-NEXT:    cmpq %rdx, %rcx
985; X64-NEXT:    jne .LBB31_2
986; X64-NEXT:  # %bb.1: # %loadbb1
987; X64-NEXT:    movl 8(%rdi), %ecx
988; X64-NEXT:    movl 8(%rsi), %edx
989; X64-NEXT:    bswapl %ecx
990; X64-NEXT:    bswapl %edx
991; X64-NEXT:    xorl %eax, %eax
992; X64-NEXT:    cmpq %rdx, %rcx
993; X64-NEXT:    je .LBB31_3
994; X64-NEXT:  .LBB31_2: # %res_block
995; X64-NEXT:    xorl %eax, %eax
996; X64-NEXT:    cmpq %rdx, %rcx
997; X64-NEXT:    setae %al
998; X64-NEXT:    leal -1(%rax,%rax), %eax
999; X64-NEXT:  .LBB31_3: # %endblock
1000; X64-NEXT:    retq
1001  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 12) nounwind
1002  ret i32 %m
1003}
1004
1005define i1 @length13_eq(i8* %X, i8* %Y) nounwind {
1006; X86-LABEL: length13_eq:
1007; X86:       # %bb.0:
1008; X86-NEXT:    pushl $0
1009; X86-NEXT:    pushl $13
1010; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1011; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1012; X86-NEXT:    calll memcmp
1013; X86-NEXT:    addl $16, %esp
1014; X86-NEXT:    testl %eax, %eax
1015; X86-NEXT:    sete %al
1016; X86-NEXT:    retl
1017;
1018; X64-LABEL: length13_eq:
1019; X64:       # %bb.0:
1020; X64-NEXT:    movq (%rdi), %rax
1021; X64-NEXT:    movq 5(%rdi), %rcx
1022; X64-NEXT:    xorq (%rsi), %rax
1023; X64-NEXT:    xorq 5(%rsi), %rcx
1024; X64-NEXT:    orq %rax, %rcx
1025; X64-NEXT:    sete %al
1026; X64-NEXT:    retq
1027  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 13) nounwind
1028  %c = icmp eq i32 %m, 0
1029  ret i1 %c
1030}
1031
1032define i1 @length14_eq(i8* %X, i8* %Y) nounwind {
1033; X86-LABEL: length14_eq:
1034; X86:       # %bb.0:
1035; X86-NEXT:    pushl $0
1036; X86-NEXT:    pushl $14
1037; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1038; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1039; X86-NEXT:    calll memcmp
1040; X86-NEXT:    addl $16, %esp
1041; X86-NEXT:    testl %eax, %eax
1042; X86-NEXT:    sete %al
1043; X86-NEXT:    retl
1044;
1045; X64-LABEL: length14_eq:
1046; X64:       # %bb.0:
1047; X64-NEXT:    movq (%rdi), %rax
1048; X64-NEXT:    movq 6(%rdi), %rcx
1049; X64-NEXT:    xorq (%rsi), %rax
1050; X64-NEXT:    xorq 6(%rsi), %rcx
1051; X64-NEXT:    orq %rax, %rcx
1052; X64-NEXT:    sete %al
1053; X64-NEXT:    retq
1054  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 14) nounwind
1055  %c = icmp eq i32 %m, 0
1056  ret i1 %c
1057}
1058
1059define i32 @length15(i8* %X, i8* %Y) nounwind {
1060; X86-LABEL: length15:
1061; X86:       # %bb.0:
1062; X86-NEXT:    pushl $0
1063; X86-NEXT:    pushl $15
1064; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1065; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1066; X86-NEXT:    calll memcmp
1067; X86-NEXT:    addl $16, %esp
1068; X86-NEXT:    retl
1069;
1070; X64-LABEL: length15:
1071; X64:       # %bb.0:
1072; X64-NEXT:    movq (%rdi), %rcx
1073; X64-NEXT:    movq (%rsi), %rdx
1074; X64-NEXT:    bswapq %rcx
1075; X64-NEXT:    bswapq %rdx
1076; X64-NEXT:    cmpq %rdx, %rcx
1077; X64-NEXT:    jne .LBB34_2
1078; X64-NEXT:  # %bb.1: # %loadbb1
1079; X64-NEXT:    movq 7(%rdi), %rcx
1080; X64-NEXT:    movq 7(%rsi), %rdx
1081; X64-NEXT:    bswapq %rcx
1082; X64-NEXT:    bswapq %rdx
1083; X64-NEXT:    xorl %eax, %eax
1084; X64-NEXT:    cmpq %rdx, %rcx
1085; X64-NEXT:    je .LBB34_3
1086; X64-NEXT:  .LBB34_2: # %res_block
1087; X64-NEXT:    xorl %eax, %eax
1088; X64-NEXT:    cmpq %rdx, %rcx
1089; X64-NEXT:    setae %al
1090; X64-NEXT:    leal -1(%rax,%rax), %eax
1091; X64-NEXT:  .LBB34_3: # %endblock
1092; X64-NEXT:    retq
1093  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 15) nounwind
1094  ret i32 %m
1095}
1096
1097define i1 @length15_lt(i8* %X, i8* %Y) nounwind {
1098; X86-LABEL: length15_lt:
1099; X86:       # %bb.0:
1100; X86-NEXT:    pushl $0
1101; X86-NEXT:    pushl $15
1102; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1103; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1104; X86-NEXT:    calll memcmp
1105; X86-NEXT:    addl $16, %esp
1106; X86-NEXT:    shrl $31, %eax
1107; X86-NEXT:    # kill: def $al killed $al killed $eax
1108; X86-NEXT:    retl
1109;
1110; X64-LABEL: length15_lt:
1111; X64:       # %bb.0:
1112; X64-NEXT:    movq (%rdi), %rcx
1113; X64-NEXT:    movq (%rsi), %rdx
1114; X64-NEXT:    bswapq %rcx
1115; X64-NEXT:    bswapq %rdx
1116; X64-NEXT:    cmpq %rdx, %rcx
1117; X64-NEXT:    jne .LBB35_2
1118; X64-NEXT:  # %bb.1: # %loadbb1
1119; X64-NEXT:    movq 7(%rdi), %rcx
1120; X64-NEXT:    movq 7(%rsi), %rdx
1121; X64-NEXT:    bswapq %rcx
1122; X64-NEXT:    bswapq %rdx
1123; X64-NEXT:    xorl %eax, %eax
1124; X64-NEXT:    cmpq %rdx, %rcx
1125; X64-NEXT:    je .LBB35_3
1126; X64-NEXT:  .LBB35_2: # %res_block
1127; X64-NEXT:    xorl %eax, %eax
1128; X64-NEXT:    cmpq %rdx, %rcx
1129; X64-NEXT:    setae %al
1130; X64-NEXT:    leal -1(%rax,%rax), %eax
1131; X64-NEXT:  .LBB35_3: # %endblock
1132; X64-NEXT:    shrl $31, %eax
1133; X64-NEXT:    # kill: def $al killed $al killed $eax
1134; X64-NEXT:    retq
1135  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 15) nounwind
1136  %c = icmp slt i32 %m, 0
1137  ret i1 %c
1138}
1139
1140define i32 @length15_const(i8* %X, i8* %Y) nounwind {
1141; X86-LABEL: length15_const:
1142; X86:       # %bb.0:
1143; X86-NEXT:    pushl $0
1144; X86-NEXT:    pushl $15
1145; X86-NEXT:    pushl $.L.str+1
1146; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1147; X86-NEXT:    calll memcmp
1148; X86-NEXT:    addl $16, %esp
1149; X86-NEXT:    retl
1150;
1151; X64-LABEL: length15_const:
1152; X64:       # %bb.0:
1153; X64-NEXT:    movabsq $3544952156018063160, %rcx # imm = 0x3132333435363738
1154; X64-NEXT:    movq (%rdi), %rdx
1155; X64-NEXT:    bswapq %rdx
1156; X64-NEXT:    cmpq %rcx, %rdx
1157; X64-NEXT:    jne .LBB36_2
1158; X64-NEXT:  # %bb.1: # %loadbb1
1159; X64-NEXT:    movabsq $4051322327650219061, %rcx # imm = 0x3839303132333435
1160; X64-NEXT:    movq 7(%rdi), %rdx
1161; X64-NEXT:    bswapq %rdx
1162; X64-NEXT:    xorl %eax, %eax
1163; X64-NEXT:    cmpq %rcx, %rdx
1164; X64-NEXT:    je .LBB36_3
1165; X64-NEXT:  .LBB36_2: # %res_block
1166; X64-NEXT:    xorl %eax, %eax
1167; X64-NEXT:    cmpq %rcx, %rdx
1168; X64-NEXT:    setae %al
1169; X64-NEXT:    leal -1(%rax,%rax), %eax
1170; X64-NEXT:  .LBB36_3: # %endblock
1171; X64-NEXT:    retq
1172  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 1), i64 15) nounwind
1173  ret i32 %m
1174}
1175
1176define i1 @length15_eq(i8* %X, i8* %Y) nounwind {
1177; X86-LABEL: length15_eq:
1178; X86:       # %bb.0:
1179; X86-NEXT:    pushl $0
1180; X86-NEXT:    pushl $15
1181; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1182; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1183; X86-NEXT:    calll memcmp
1184; X86-NEXT:    addl $16, %esp
1185; X86-NEXT:    testl %eax, %eax
1186; X86-NEXT:    sete %al
1187; X86-NEXT:    retl
1188;
1189; X64-LABEL: length15_eq:
1190; X64:       # %bb.0:
1191; X64-NEXT:    movq (%rdi), %rax
1192; X64-NEXT:    movq 7(%rdi), %rcx
1193; X64-NEXT:    xorq (%rsi), %rax
1194; X64-NEXT:    xorq 7(%rsi), %rcx
1195; X64-NEXT:    orq %rax, %rcx
1196; X64-NEXT:    sete %al
1197; X64-NEXT:    retq
1198  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 15) nounwind
1199  %c = icmp eq i32 %m, 0
1200  ret i1 %c
1201}
1202
1203define i1 @length15_gt_const(i8* %X, i8* %Y) nounwind {
1204; X86-LABEL: length15_gt_const:
1205; X86:       # %bb.0:
1206; X86-NEXT:    pushl $0
1207; X86-NEXT:    pushl $15
1208; X86-NEXT:    pushl $.L.str+1
1209; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1210; X86-NEXT:    calll memcmp
1211; X86-NEXT:    addl $16, %esp
1212; X86-NEXT:    testl %eax, %eax
1213; X86-NEXT:    setg %al
1214; X86-NEXT:    retl
1215;
1216; X64-LABEL: length15_gt_const:
1217; X64:       # %bb.0:
1218; X64-NEXT:    movabsq $3544952156018063160, %rax # imm = 0x3132333435363738
1219; X64-NEXT:    movq (%rdi), %rcx
1220; X64-NEXT:    bswapq %rcx
1221; X64-NEXT:    cmpq %rax, %rcx
1222; X64-NEXT:    jne .LBB38_2
1223; X64-NEXT:  # %bb.1: # %loadbb1
1224; X64-NEXT:    movabsq $4051322327650219061, %rax # imm = 0x3839303132333435
1225; X64-NEXT:    movq 7(%rdi), %rcx
1226; X64-NEXT:    bswapq %rcx
1227; X64-NEXT:    xorl %edx, %edx
1228; X64-NEXT:    cmpq %rax, %rcx
1229; X64-NEXT:    je .LBB38_3
1230; X64-NEXT:  .LBB38_2: # %res_block
1231; X64-NEXT:    xorl %edx, %edx
1232; X64-NEXT:    cmpq %rax, %rcx
1233; X64-NEXT:    setae %dl
1234; X64-NEXT:    leal -1(%rdx,%rdx), %edx
1235; X64-NEXT:  .LBB38_3: # %endblock
1236; X64-NEXT:    testl %edx, %edx
1237; X64-NEXT:    setg %al
1238; X64-NEXT:    retq
1239  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 1), i64 15) nounwind
1240  %c = icmp sgt i32 %m, 0
1241  ret i1 %c
1242}
1243
1244; PR33329 - https://bugs.llvm.org/show_bug.cgi?id=33329
1245
1246define i32 @length16(i8* %X, i8* %Y) nounwind {
1247; X86-LABEL: length16:
1248; X86:       # %bb.0:
1249; X86-NEXT:    pushl $0
1250; X86-NEXT:    pushl $16
1251; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1252; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1253; X86-NEXT:    calll memcmp
1254; X86-NEXT:    addl $16, %esp
1255; X86-NEXT:    retl
1256;
1257; X64-LABEL: length16:
1258; X64:       # %bb.0:
1259; X64-NEXT:    movq (%rdi), %rcx
1260; X64-NEXT:    movq (%rsi), %rdx
1261; X64-NEXT:    bswapq %rcx
1262; X64-NEXT:    bswapq %rdx
1263; X64-NEXT:    cmpq %rdx, %rcx
1264; X64-NEXT:    jne .LBB39_2
1265; X64-NEXT:  # %bb.1: # %loadbb1
1266; X64-NEXT:    movq 8(%rdi), %rcx
1267; X64-NEXT:    movq 8(%rsi), %rdx
1268; X64-NEXT:    bswapq %rcx
1269; X64-NEXT:    bswapq %rdx
1270; X64-NEXT:    xorl %eax, %eax
1271; X64-NEXT:    cmpq %rdx, %rcx
1272; X64-NEXT:    je .LBB39_3
1273; X64-NEXT:  .LBB39_2: # %res_block
1274; X64-NEXT:    xorl %eax, %eax
1275; X64-NEXT:    cmpq %rdx, %rcx
1276; X64-NEXT:    setae %al
1277; X64-NEXT:    leal -1(%rax,%rax), %eax
1278; X64-NEXT:  .LBB39_3: # %endblock
1279; X64-NEXT:    retq
1280  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 16) nounwind
1281  ret i32 %m
1282}
1283
1284define i1 @length16_eq(i8* %x, i8* %y) nounwind {
1285; X86-NOSSE-LABEL: length16_eq:
1286; X86-NOSSE:       # %bb.0:
1287; X86-NOSSE-NEXT:    pushl $0
1288; X86-NOSSE-NEXT:    pushl $16
1289; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1290; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1291; X86-NOSSE-NEXT:    calll memcmp
1292; X86-NOSSE-NEXT:    addl $16, %esp
1293; X86-NOSSE-NEXT:    testl %eax, %eax
1294; X86-NOSSE-NEXT:    setne %al
1295; X86-NOSSE-NEXT:    retl
1296;
1297; X86-SSE1-LABEL: length16_eq:
1298; X86-SSE1:       # %bb.0:
1299; X86-SSE1-NEXT:    pushl $0
1300; X86-SSE1-NEXT:    pushl $16
1301; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1302; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1303; X86-SSE1-NEXT:    calll memcmp
1304; X86-SSE1-NEXT:    addl $16, %esp
1305; X86-SSE1-NEXT:    testl %eax, %eax
1306; X86-SSE1-NEXT:    setne %al
1307; X86-SSE1-NEXT:    retl
1308;
1309; X86-SSE2-LABEL: length16_eq:
1310; X86-SSE2:       # %bb.0:
1311; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1312; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1313; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
1314; X86-SSE2-NEXT:    movdqu (%eax), %xmm1
1315; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm1
1316; X86-SSE2-NEXT:    pmovmskb %xmm1, %eax
1317; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1318; X86-SSE2-NEXT:    setne %al
1319; X86-SSE2-NEXT:    retl
1320;
1321; X86-SSE41-LABEL: length16_eq:
1322; X86-SSE41:       # %bb.0:
1323; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1324; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1325; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
1326; X86-SSE41-NEXT:    movdqu (%eax), %xmm1
1327; X86-SSE41-NEXT:    pxor %xmm0, %xmm1
1328; X86-SSE41-NEXT:    ptest %xmm1, %xmm1
1329; X86-SSE41-NEXT:    setne %al
1330; X86-SSE41-NEXT:    retl
1331;
1332; X64-SSE2-LABEL: length16_eq:
1333; X64-SSE2:       # %bb.0:
1334; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1335; X64-SSE2-NEXT:    movdqu (%rsi), %xmm1
1336; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm1
1337; X64-SSE2-NEXT:    pmovmskb %xmm1, %eax
1338; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1339; X64-SSE2-NEXT:    setne %al
1340; X64-SSE2-NEXT:    retq
1341;
1342; X64-SSE41-LABEL: length16_eq:
1343; X64-SSE41:       # %bb.0:
1344; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1345; X64-SSE41-NEXT:    movdqu (%rsi), %xmm1
1346; X64-SSE41-NEXT:    pxor %xmm0, %xmm1
1347; X64-SSE41-NEXT:    ptest %xmm1, %xmm1
1348; X64-SSE41-NEXT:    setne %al
1349; X64-SSE41-NEXT:    retq
1350;
1351; X64-AVX-LABEL: length16_eq:
1352; X64-AVX:       # %bb.0:
1353; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1354; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0
1355; X64-AVX-NEXT:    vptest %xmm0, %xmm0
1356; X64-AVX-NEXT:    setne %al
1357; X64-AVX-NEXT:    retq
1358;
1359; X64-MIC-AVX-LABEL: length16_eq:
1360; X64-MIC-AVX:       # %bb.0:
1361; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1362; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm1
1363; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
1364; X64-MIC-AVX-NEXT:    kortestw %k0, %k0
1365; X64-MIC-AVX-NEXT:    setne %al
1366; X64-MIC-AVX-NEXT:    vzeroupper
1367; X64-MIC-AVX-NEXT:    retq
1368  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 16) nounwind
1369  %cmp = icmp ne i32 %call, 0
1370  ret i1 %cmp
1371}
1372
1373define i1 @length16_lt(i8* %x, i8* %y) nounwind {
1374; X86-LABEL: length16_lt:
1375; X86:       # %bb.0:
1376; X86-NEXT:    pushl $0
1377; X86-NEXT:    pushl $16
1378; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1379; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1380; X86-NEXT:    calll memcmp
1381; X86-NEXT:    addl $16, %esp
1382; X86-NEXT:    shrl $31, %eax
1383; X86-NEXT:    # kill: def $al killed $al killed $eax
1384; X86-NEXT:    retl
1385;
1386; X64-LABEL: length16_lt:
1387; X64:       # %bb.0:
1388; X64-NEXT:    movq (%rdi), %rcx
1389; X64-NEXT:    movq (%rsi), %rdx
1390; X64-NEXT:    bswapq %rcx
1391; X64-NEXT:    bswapq %rdx
1392; X64-NEXT:    cmpq %rdx, %rcx
1393; X64-NEXT:    jne .LBB41_2
1394; X64-NEXT:  # %bb.1: # %loadbb1
1395; X64-NEXT:    movq 8(%rdi), %rcx
1396; X64-NEXT:    movq 8(%rsi), %rdx
1397; X64-NEXT:    bswapq %rcx
1398; X64-NEXT:    bswapq %rdx
1399; X64-NEXT:    xorl %eax, %eax
1400; X64-NEXT:    cmpq %rdx, %rcx
1401; X64-NEXT:    je .LBB41_3
1402; X64-NEXT:  .LBB41_2: # %res_block
1403; X64-NEXT:    xorl %eax, %eax
1404; X64-NEXT:    cmpq %rdx, %rcx
1405; X64-NEXT:    setae %al
1406; X64-NEXT:    leal -1(%rax,%rax), %eax
1407; X64-NEXT:  .LBB41_3: # %endblock
1408; X64-NEXT:    shrl $31, %eax
1409; X64-NEXT:    # kill: def $al killed $al killed $eax
1410; X64-NEXT:    retq
1411  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 16) nounwind
1412  %cmp = icmp slt i32 %call, 0
1413  ret i1 %cmp
1414}
1415
1416define i1 @length16_gt(i8* %x, i8* %y) nounwind {
1417; X86-LABEL: length16_gt:
1418; X86:       # %bb.0:
1419; X86-NEXT:    pushl $0
1420; X86-NEXT:    pushl $16
1421; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1422; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1423; X86-NEXT:    calll memcmp
1424; X86-NEXT:    addl $16, %esp
1425; X86-NEXT:    testl %eax, %eax
1426; X86-NEXT:    setg %al
1427; X86-NEXT:    retl
1428;
1429; X64-LABEL: length16_gt:
1430; X64:       # %bb.0:
1431; X64-NEXT:    movq (%rdi), %rax
1432; X64-NEXT:    movq (%rsi), %rcx
1433; X64-NEXT:    bswapq %rax
1434; X64-NEXT:    bswapq %rcx
1435; X64-NEXT:    cmpq %rcx, %rax
1436; X64-NEXT:    jne .LBB42_2
1437; X64-NEXT:  # %bb.1: # %loadbb1
1438; X64-NEXT:    movq 8(%rdi), %rax
1439; X64-NEXT:    movq 8(%rsi), %rcx
1440; X64-NEXT:    bswapq %rax
1441; X64-NEXT:    bswapq %rcx
1442; X64-NEXT:    xorl %edx, %edx
1443; X64-NEXT:    cmpq %rcx, %rax
1444; X64-NEXT:    je .LBB42_3
1445; X64-NEXT:  .LBB42_2: # %res_block
1446; X64-NEXT:    xorl %edx, %edx
1447; X64-NEXT:    cmpq %rcx, %rax
1448; X64-NEXT:    setae %dl
1449; X64-NEXT:    leal -1(%rdx,%rdx), %edx
1450; X64-NEXT:  .LBB42_3: # %endblock
1451; X64-NEXT:    testl %edx, %edx
1452; X64-NEXT:    setg %al
1453; X64-NEXT:    retq
1454  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 16) nounwind
1455  %cmp = icmp sgt i32 %call, 0
1456  ret i1 %cmp
1457}
1458
1459define i1 @length16_eq_const(i8* %X) nounwind {
1460; X86-NOSSE-LABEL: length16_eq_const:
1461; X86-NOSSE:       # %bb.0:
1462; X86-NOSSE-NEXT:    pushl $0
1463; X86-NOSSE-NEXT:    pushl $16
1464; X86-NOSSE-NEXT:    pushl $.L.str
1465; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1466; X86-NOSSE-NEXT:    calll memcmp
1467; X86-NOSSE-NEXT:    addl $16, %esp
1468; X86-NOSSE-NEXT:    testl %eax, %eax
1469; X86-NOSSE-NEXT:    sete %al
1470; X86-NOSSE-NEXT:    retl
1471;
1472; X86-SSE1-LABEL: length16_eq_const:
1473; X86-SSE1:       # %bb.0:
1474; X86-SSE1-NEXT:    pushl $0
1475; X86-SSE1-NEXT:    pushl $16
1476; X86-SSE1-NEXT:    pushl $.L.str
1477; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1478; X86-SSE1-NEXT:    calll memcmp
1479; X86-SSE1-NEXT:    addl $16, %esp
1480; X86-SSE1-NEXT:    testl %eax, %eax
1481; X86-SSE1-NEXT:    sete %al
1482; X86-SSE1-NEXT:    retl
1483;
1484; X86-SSE2-LABEL: length16_eq_const:
1485; X86-SSE2:       # %bb.0:
1486; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1487; X86-SSE2-NEXT:    movdqu (%eax), %xmm0
1488; X86-SSE2-NEXT:    pcmpeqb {{\.LCPI.*}}, %xmm0
1489; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
1490; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1491; X86-SSE2-NEXT:    sete %al
1492; X86-SSE2-NEXT:    retl
1493;
1494; X86-SSE41-LABEL: length16_eq_const:
1495; X86-SSE41:       # %bb.0:
1496; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1497; X86-SSE41-NEXT:    movdqu (%eax), %xmm0
1498; X86-SSE41-NEXT:    pxor {{\.LCPI.*}}, %xmm0
1499; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
1500; X86-SSE41-NEXT:    sete %al
1501; X86-SSE41-NEXT:    retl
1502;
1503; X64-SSE2-LABEL: length16_eq_const:
1504; X64-SSE2:       # %bb.0:
1505; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1506; X64-SSE2-NEXT:    pcmpeqb {{.*}}(%rip), %xmm0
1507; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
1508; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1509; X64-SSE2-NEXT:    sete %al
1510; X64-SSE2-NEXT:    retq
1511;
1512; X64-SSE41-LABEL: length16_eq_const:
1513; X64-SSE41:       # %bb.0:
1514; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1515; X64-SSE41-NEXT:    pxor {{.*}}(%rip), %xmm0
1516; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
1517; X64-SSE41-NEXT:    sete %al
1518; X64-SSE41-NEXT:    retq
1519;
1520; X64-AVX-LABEL: length16_eq_const:
1521; X64-AVX:       # %bb.0:
1522; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1523; X64-AVX-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1524; X64-AVX-NEXT:    vptest %xmm0, %xmm0
1525; X64-AVX-NEXT:    sete %al
1526; X64-AVX-NEXT:    retq
1527;
1528; X64-MIC-AVX-LABEL: length16_eq_const:
1529; X64-MIC-AVX:       # %bb.0:
1530; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1531; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426]
1532; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
1533; X64-MIC-AVX-NEXT:    kortestw %k0, %k0
1534; X64-MIC-AVX-NEXT:    sete %al
1535; X64-MIC-AVX-NEXT:    vzeroupper
1536; X64-MIC-AVX-NEXT:    retq
1537  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 16) nounwind
1538  %c = icmp eq i32 %m, 0
1539  ret i1 %c
1540}
1541
1542; PR33914 - https://bugs.llvm.org/show_bug.cgi?id=33914
1543
1544define i32 @length24(i8* %X, i8* %Y) nounwind {
1545; X86-LABEL: length24:
1546; X86:       # %bb.0:
1547; X86-NEXT:    pushl $0
1548; X86-NEXT:    pushl $24
1549; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1550; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1551; X86-NEXT:    calll memcmp
1552; X86-NEXT:    addl $16, %esp
1553; X86-NEXT:    retl
1554;
1555; X64-LABEL: length24:
1556; X64:       # %bb.0:
1557; X64-NEXT:    movl $24, %edx
1558; X64-NEXT:    jmp memcmp # TAILCALL
1559  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 24) nounwind
1560  ret i32 %m
1561}
1562
1563define i1 @length24_eq(i8* %x, i8* %y) nounwind {
1564; X86-NOSSE-LABEL: length24_eq:
1565; X86-NOSSE:       # %bb.0:
1566; X86-NOSSE-NEXT:    pushl $0
1567; X86-NOSSE-NEXT:    pushl $24
1568; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1569; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1570; X86-NOSSE-NEXT:    calll memcmp
1571; X86-NOSSE-NEXT:    addl $16, %esp
1572; X86-NOSSE-NEXT:    testl %eax, %eax
1573; X86-NOSSE-NEXT:    sete %al
1574; X86-NOSSE-NEXT:    retl
1575;
1576; X86-SSE1-LABEL: length24_eq:
1577; X86-SSE1:       # %bb.0:
1578; X86-SSE1-NEXT:    pushl $0
1579; X86-SSE1-NEXT:    pushl $24
1580; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1581; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1582; X86-SSE1-NEXT:    calll memcmp
1583; X86-SSE1-NEXT:    addl $16, %esp
1584; X86-SSE1-NEXT:    testl %eax, %eax
1585; X86-SSE1-NEXT:    sete %al
1586; X86-SSE1-NEXT:    retl
1587;
1588; X86-SSE2-LABEL: length24_eq:
1589; X86-SSE2:       # %bb.0:
1590; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1591; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1592; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
1593; X86-SSE2-NEXT:    movdqu 8(%ecx), %xmm1
1594; X86-SSE2-NEXT:    movdqu (%eax), %xmm2
1595; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1596; X86-SSE2-NEXT:    movdqu 8(%eax), %xmm0
1597; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1598; X86-SSE2-NEXT:    pand %xmm2, %xmm0
1599; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
1600; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1601; X86-SSE2-NEXT:    sete %al
1602; X86-SSE2-NEXT:    retl
1603;
1604; X86-SSE41-LABEL: length24_eq:
1605; X86-SSE41:       # %bb.0:
1606; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1607; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1608; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
1609; X86-SSE41-NEXT:    movdqu 8(%ecx), %xmm1
1610; X86-SSE41-NEXT:    movdqu (%eax), %xmm2
1611; X86-SSE41-NEXT:    pxor %xmm0, %xmm2
1612; X86-SSE41-NEXT:    movdqu 8(%eax), %xmm0
1613; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
1614; X86-SSE41-NEXT:    por %xmm2, %xmm0
1615; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
1616; X86-SSE41-NEXT:    sete %al
1617; X86-SSE41-NEXT:    retl
1618;
1619; X64-SSE2-LABEL: length24_eq:
1620; X64-SSE2:       # %bb.0:
1621; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1622; X64-SSE2-NEXT:    movdqu (%rsi), %xmm1
1623; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm1
1624; X64-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
1625; X64-SSE2-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero
1626; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1627; X64-SSE2-NEXT:    pand %xmm1, %xmm2
1628; X64-SSE2-NEXT:    pmovmskb %xmm2, %eax
1629; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1630; X64-SSE2-NEXT:    sete %al
1631; X64-SSE2-NEXT:    retq
1632;
1633; X64-SSE41-LABEL: length24_eq:
1634; X64-SSE41:       # %bb.0:
1635; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1636; X64-SSE41-NEXT:    movdqu (%rsi), %xmm1
1637; X64-SSE41-NEXT:    pxor %xmm0, %xmm1
1638; X64-SSE41-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
1639; X64-SSE41-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero
1640; X64-SSE41-NEXT:    pxor %xmm0, %xmm2
1641; X64-SSE41-NEXT:    por %xmm1, %xmm2
1642; X64-SSE41-NEXT:    ptest %xmm2, %xmm2
1643; X64-SSE41-NEXT:    sete %al
1644; X64-SSE41-NEXT:    retq
1645;
1646; X64-AVX-LABEL: length24_eq:
1647; X64-AVX:       # %bb.0:
1648; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1649; X64-AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
1650; X64-AVX-NEXT:    vmovq {{.*#+}} xmm2 = mem[0],zero
1651; X64-AVX-NEXT:    vpxor %xmm2, %xmm1, %xmm1
1652; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0
1653; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1654; X64-AVX-NEXT:    vptest %xmm0, %xmm0
1655; X64-AVX-NEXT:    sete %al
1656; X64-AVX-NEXT:    retq
1657;
1658; X64-MIC-AVX-LABEL: length24_eq:
1659; X64-MIC-AVX:       # %bb.0:
1660; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1661; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm1
1662; X64-MIC-AVX-NEXT:    vmovq {{.*#+}} xmm2 = mem[0],zero
1663; X64-MIC-AVX-NEXT:    vmovq {{.*#+}} xmm3 = mem[0],zero
1664; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm2, %k0
1665; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
1666; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
1667; X64-MIC-AVX-NEXT:    sete %al
1668; X64-MIC-AVX-NEXT:    vzeroupper
1669; X64-MIC-AVX-NEXT:    retq
1670  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 24) nounwind
1671  %cmp = icmp eq i32 %call, 0
1672  ret i1 %cmp
1673}
1674
1675define i1 @length24_lt(i8* %x, i8* %y) nounwind {
1676; X86-LABEL: length24_lt:
1677; X86:       # %bb.0:
1678; X86-NEXT:    pushl $0
1679; X86-NEXT:    pushl $24
1680; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1681; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1682; X86-NEXT:    calll memcmp
1683; X86-NEXT:    addl $16, %esp
1684; X86-NEXT:    shrl $31, %eax
1685; X86-NEXT:    # kill: def $al killed $al killed $eax
1686; X86-NEXT:    retl
1687;
1688; X64-LABEL: length24_lt:
1689; X64:       # %bb.0:
1690; X64-NEXT:    pushq %rax
1691; X64-NEXT:    movl $24, %edx
1692; X64-NEXT:    callq memcmp
1693; X64-NEXT:    shrl $31, %eax
1694; X64-NEXT:    # kill: def $al killed $al killed $eax
1695; X64-NEXT:    popq %rcx
1696; X64-NEXT:    retq
1697  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 24) nounwind
1698  %cmp = icmp slt i32 %call, 0
1699  ret i1 %cmp
1700}
1701
1702define i1 @length24_gt(i8* %x, i8* %y) nounwind {
1703; X86-LABEL: length24_gt:
1704; X86:       # %bb.0:
1705; X86-NEXT:    pushl $0
1706; X86-NEXT:    pushl $24
1707; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1708; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1709; X86-NEXT:    calll memcmp
1710; X86-NEXT:    addl $16, %esp
1711; X86-NEXT:    testl %eax, %eax
1712; X86-NEXT:    setg %al
1713; X86-NEXT:    retl
1714;
1715; X64-LABEL: length24_gt:
1716; X64:       # %bb.0:
1717; X64-NEXT:    pushq %rax
1718; X64-NEXT:    movl $24, %edx
1719; X64-NEXT:    callq memcmp
1720; X64-NEXT:    testl %eax, %eax
1721; X64-NEXT:    setg %al
1722; X64-NEXT:    popq %rcx
1723; X64-NEXT:    retq
1724  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 24) nounwind
1725  %cmp = icmp sgt i32 %call, 0
1726  ret i1 %cmp
1727}
1728
1729define i1 @length24_eq_const(i8* %X) nounwind {
1730; X86-NOSSE-LABEL: length24_eq_const:
1731; X86-NOSSE:       # %bb.0:
1732; X86-NOSSE-NEXT:    pushl $0
1733; X86-NOSSE-NEXT:    pushl $24
1734; X86-NOSSE-NEXT:    pushl $.L.str
1735; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1736; X86-NOSSE-NEXT:    calll memcmp
1737; X86-NOSSE-NEXT:    addl $16, %esp
1738; X86-NOSSE-NEXT:    testl %eax, %eax
1739; X86-NOSSE-NEXT:    setne %al
1740; X86-NOSSE-NEXT:    retl
1741;
1742; X86-SSE1-LABEL: length24_eq_const:
1743; X86-SSE1:       # %bb.0:
1744; X86-SSE1-NEXT:    pushl $0
1745; X86-SSE1-NEXT:    pushl $24
1746; X86-SSE1-NEXT:    pushl $.L.str
1747; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1748; X86-SSE1-NEXT:    calll memcmp
1749; X86-SSE1-NEXT:    addl $16, %esp
1750; X86-SSE1-NEXT:    testl %eax, %eax
1751; X86-SSE1-NEXT:    setne %al
1752; X86-SSE1-NEXT:    retl
1753;
1754; X86-SSE2-LABEL: length24_eq_const:
1755; X86-SSE2:       # %bb.0:
1756; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1757; X86-SSE2-NEXT:    movdqu (%eax), %xmm0
1758; X86-SSE2-NEXT:    movdqu 8(%eax), %xmm1
1759; X86-SSE2-NEXT:    pcmpeqb {{\.LCPI.*}}, %xmm1
1760; X86-SSE2-NEXT:    pcmpeqb {{\.LCPI.*}}, %xmm0
1761; X86-SSE2-NEXT:    pand %xmm1, %xmm0
1762; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
1763; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1764; X86-SSE2-NEXT:    setne %al
1765; X86-SSE2-NEXT:    retl
1766;
1767; X86-SSE41-LABEL: length24_eq_const:
1768; X86-SSE41:       # %bb.0:
1769; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1770; X86-SSE41-NEXT:    movdqu (%eax), %xmm0
1771; X86-SSE41-NEXT:    movdqu 8(%eax), %xmm1
1772; X86-SSE41-NEXT:    pxor {{\.LCPI.*}}, %xmm1
1773; X86-SSE41-NEXT:    pxor {{\.LCPI.*}}, %xmm0
1774; X86-SSE41-NEXT:    por %xmm1, %xmm0
1775; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
1776; X86-SSE41-NEXT:    setne %al
1777; X86-SSE41-NEXT:    retl
1778;
1779; X64-SSE2-LABEL: length24_eq_const:
1780; X64-SSE2:       # %bb.0:
1781; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1782; X64-SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
1783; X64-SSE2-NEXT:    pcmpeqb {{.*}}(%rip), %xmm1
1784; X64-SSE2-NEXT:    pcmpeqb {{.*}}(%rip), %xmm0
1785; X64-SSE2-NEXT:    pand %xmm1, %xmm0
1786; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
1787; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1788; X64-SSE2-NEXT:    setne %al
1789; X64-SSE2-NEXT:    retq
1790;
1791; X64-SSE41-LABEL: length24_eq_const:
1792; X64-SSE41:       # %bb.0:
1793; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1794; X64-SSE41-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
1795; X64-SSE41-NEXT:    pxor {{.*}}(%rip), %xmm1
1796; X64-SSE41-NEXT:    pxor {{.*}}(%rip), %xmm0
1797; X64-SSE41-NEXT:    por %xmm1, %xmm0
1798; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
1799; X64-SSE41-NEXT:    setne %al
1800; X64-SSE41-NEXT:    retq
1801;
1802; X64-AVX-LABEL: length24_eq_const:
1803; X64-AVX:       # %bb.0:
1804; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1805; X64-AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
1806; X64-AVX-NEXT:    vpxor {{.*}}(%rip), %xmm1, %xmm1
1807; X64-AVX-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1808; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1809; X64-AVX-NEXT:    vptest %xmm0, %xmm0
1810; X64-AVX-NEXT:    setne %al
1811; X64-AVX-NEXT:    retq
1812;
1813; X64-MIC-AVX-LABEL: length24_eq_const:
1814; X64-MIC-AVX:       # %bb.0:
1815; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1816; X64-MIC-AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
1817; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [959985462,858927408,0,0]
1818; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm1, %k0
1819; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426]
1820; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
1821; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
1822; X64-MIC-AVX-NEXT:    setne %al
1823; X64-MIC-AVX-NEXT:    vzeroupper
1824; X64-MIC-AVX-NEXT:    retq
1825  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 24) nounwind
1826  %c = icmp ne i32 %m, 0
1827  ret i1 %c
1828}
1829
1830define i32 @length31(i8* %X, i8* %Y) nounwind {
1831; X86-LABEL: length31:
1832; X86:       # %bb.0:
1833; X86-NEXT:    pushl $0
1834; X86-NEXT:    pushl $31
1835; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1836; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1837; X86-NEXT:    calll memcmp
1838; X86-NEXT:    addl $16, %esp
1839; X86-NEXT:    retl
1840;
1841; X64-LABEL: length31:
1842; X64:       # %bb.0:
1843; X64-NEXT:    movl $31, %edx
1844; X64-NEXT:    jmp memcmp # TAILCALL
1845  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 31) nounwind
1846  ret i32 %m
1847}
1848
1849define i1 @length31_eq(i8* %x, i8* %y) nounwind {
1850; X86-NOSSE-LABEL: length31_eq:
1851; X86-NOSSE:       # %bb.0:
1852; X86-NOSSE-NEXT:    pushl $0
1853; X86-NOSSE-NEXT:    pushl $31
1854; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1855; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1856; X86-NOSSE-NEXT:    calll memcmp
1857; X86-NOSSE-NEXT:    addl $16, %esp
1858; X86-NOSSE-NEXT:    testl %eax, %eax
1859; X86-NOSSE-NEXT:    sete %al
1860; X86-NOSSE-NEXT:    retl
1861;
1862; X86-SSE1-LABEL: length31_eq:
1863; X86-SSE1:       # %bb.0:
1864; X86-SSE1-NEXT:    pushl $0
1865; X86-SSE1-NEXT:    pushl $31
1866; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1867; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1868; X86-SSE1-NEXT:    calll memcmp
1869; X86-SSE1-NEXT:    addl $16, %esp
1870; X86-SSE1-NEXT:    testl %eax, %eax
1871; X86-SSE1-NEXT:    sete %al
1872; X86-SSE1-NEXT:    retl
1873;
1874; X86-SSE2-LABEL: length31_eq:
1875; X86-SSE2:       # %bb.0:
1876; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1877; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1878; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
1879; X86-SSE2-NEXT:    movdqu 15(%ecx), %xmm1
1880; X86-SSE2-NEXT:    movdqu (%eax), %xmm2
1881; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1882; X86-SSE2-NEXT:    movdqu 15(%eax), %xmm0
1883; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1884; X86-SSE2-NEXT:    pand %xmm2, %xmm0
1885; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
1886; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1887; X86-SSE2-NEXT:    sete %al
1888; X86-SSE2-NEXT:    retl
1889;
1890; X86-SSE41-LABEL: length31_eq:
1891; X86-SSE41:       # %bb.0:
1892; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1893; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1894; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
1895; X86-SSE41-NEXT:    movdqu 15(%ecx), %xmm1
1896; X86-SSE41-NEXT:    movdqu (%eax), %xmm2
1897; X86-SSE41-NEXT:    pxor %xmm0, %xmm2
1898; X86-SSE41-NEXT:    movdqu 15(%eax), %xmm0
1899; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
1900; X86-SSE41-NEXT:    por %xmm2, %xmm0
1901; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
1902; X86-SSE41-NEXT:    sete %al
1903; X86-SSE41-NEXT:    retl
1904;
1905; X64-SSE2-LABEL: length31_eq:
1906; X64-SSE2:       # %bb.0:
1907; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1908; X64-SSE2-NEXT:    movdqu 15(%rdi), %xmm1
1909; X64-SSE2-NEXT:    movdqu (%rsi), %xmm2
1910; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1911; X64-SSE2-NEXT:    movdqu 15(%rsi), %xmm0
1912; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1913; X64-SSE2-NEXT:    pand %xmm2, %xmm0
1914; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
1915; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1916; X64-SSE2-NEXT:    sete %al
1917; X64-SSE2-NEXT:    retq
1918;
1919; X64-SSE41-LABEL: length31_eq:
1920; X64-SSE41:       # %bb.0:
1921; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1922; X64-SSE41-NEXT:    movdqu 15(%rdi), %xmm1
1923; X64-SSE41-NEXT:    movdqu (%rsi), %xmm2
1924; X64-SSE41-NEXT:    pxor %xmm0, %xmm2
1925; X64-SSE41-NEXT:    movdqu 15(%rsi), %xmm0
1926; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
1927; X64-SSE41-NEXT:    por %xmm2, %xmm0
1928; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
1929; X64-SSE41-NEXT:    sete %al
1930; X64-SSE41-NEXT:    retq
1931;
1932; X64-AVX-LABEL: length31_eq:
1933; X64-AVX:       # %bb.0:
1934; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1935; X64-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
1936; X64-AVX-NEXT:    vpxor 15(%rsi), %xmm1, %xmm1
1937; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0
1938; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1939; X64-AVX-NEXT:    vptest %xmm0, %xmm0
1940; X64-AVX-NEXT:    sete %al
1941; X64-AVX-NEXT:    retq
1942;
1943; X64-MIC-AVX-LABEL: length31_eq:
1944; X64-MIC-AVX:       # %bb.0:
1945; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1946; X64-MIC-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
1947; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm2
1948; X64-MIC-AVX-NEXT:    vmovdqu 15(%rsi), %xmm3
1949; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm1, %k0
1950; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm0, %k1
1951; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
1952; X64-MIC-AVX-NEXT:    sete %al
1953; X64-MIC-AVX-NEXT:    vzeroupper
1954; X64-MIC-AVX-NEXT:    retq
1955  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 31) nounwind
1956  %cmp = icmp eq i32 %call, 0
1957  ret i1 %cmp
1958}
1959
1960define i1 @length31_lt(i8* %x, i8* %y) nounwind {
1961; X86-LABEL: length31_lt:
1962; X86:       # %bb.0:
1963; X86-NEXT:    pushl $0
1964; X86-NEXT:    pushl $31
1965; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1966; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1967; X86-NEXT:    calll memcmp
1968; X86-NEXT:    addl $16, %esp
1969; X86-NEXT:    shrl $31, %eax
1970; X86-NEXT:    # kill: def $al killed $al killed $eax
1971; X86-NEXT:    retl
1972;
1973; X64-LABEL: length31_lt:
1974; X64:       # %bb.0:
1975; X64-NEXT:    pushq %rax
1976; X64-NEXT:    movl $31, %edx
1977; X64-NEXT:    callq memcmp
1978; X64-NEXT:    shrl $31, %eax
1979; X64-NEXT:    # kill: def $al killed $al killed $eax
1980; X64-NEXT:    popq %rcx
1981; X64-NEXT:    retq
1982  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 31) nounwind
1983  %cmp = icmp slt i32 %call, 0
1984  ret i1 %cmp
1985}
1986
1987define i1 @length31_gt(i8* %x, i8* %y) nounwind {
1988; X86-LABEL: length31_gt:
1989; X86:       # %bb.0:
1990; X86-NEXT:    pushl $0
1991; X86-NEXT:    pushl $31
1992; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1993; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1994; X86-NEXT:    calll memcmp
1995; X86-NEXT:    addl $16, %esp
1996; X86-NEXT:    testl %eax, %eax
1997; X86-NEXT:    setg %al
1998; X86-NEXT:    retl
1999;
2000; X64-LABEL: length31_gt:
2001; X64:       # %bb.0:
2002; X64-NEXT:    pushq %rax
2003; X64-NEXT:    movl $31, %edx
2004; X64-NEXT:    callq memcmp
2005; X64-NEXT:    testl %eax, %eax
2006; X64-NEXT:    setg %al
2007; X64-NEXT:    popq %rcx
2008; X64-NEXT:    retq
2009  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 31) nounwind
2010  %cmp = icmp sgt i32 %call, 0
2011  ret i1 %cmp
2012}
2013
2014define i1 @length31_eq_prefer128(i8* %x, i8* %y) nounwind "prefer-vector-width"="128" {
2015; X86-NOSSE-LABEL: length31_eq_prefer128:
2016; X86-NOSSE:       # %bb.0:
2017; X86-NOSSE-NEXT:    pushl $0
2018; X86-NOSSE-NEXT:    pushl $31
2019; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
2020; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
2021; X86-NOSSE-NEXT:    calll memcmp
2022; X86-NOSSE-NEXT:    addl $16, %esp
2023; X86-NOSSE-NEXT:    testl %eax, %eax
2024; X86-NOSSE-NEXT:    sete %al
2025; X86-NOSSE-NEXT:    retl
2026;
2027; X86-SSE1-LABEL: length31_eq_prefer128:
2028; X86-SSE1:       # %bb.0:
2029; X86-SSE1-NEXT:    pushl $0
2030; X86-SSE1-NEXT:    pushl $31
2031; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
2032; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
2033; X86-SSE1-NEXT:    calll memcmp
2034; X86-SSE1-NEXT:    addl $16, %esp
2035; X86-SSE1-NEXT:    testl %eax, %eax
2036; X86-SSE1-NEXT:    sete %al
2037; X86-SSE1-NEXT:    retl
2038;
2039; X86-SSE2-LABEL: length31_eq_prefer128:
2040; X86-SSE2:       # %bb.0:
2041; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2042; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2043; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
2044; X86-SSE2-NEXT:    movdqu 15(%ecx), %xmm1
2045; X86-SSE2-NEXT:    movdqu (%eax), %xmm2
2046; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
2047; X86-SSE2-NEXT:    movdqu 15(%eax), %xmm0
2048; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
2049; X86-SSE2-NEXT:    pand %xmm2, %xmm0
2050; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
2051; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2052; X86-SSE2-NEXT:    sete %al
2053; X86-SSE2-NEXT:    retl
2054;
2055; X86-SSE41-LABEL: length31_eq_prefer128:
2056; X86-SSE41:       # %bb.0:
2057; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2058; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2059; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
2060; X86-SSE41-NEXT:    movdqu 15(%ecx), %xmm1
2061; X86-SSE41-NEXT:    movdqu (%eax), %xmm2
2062; X86-SSE41-NEXT:    pxor %xmm0, %xmm2
2063; X86-SSE41-NEXT:    movdqu 15(%eax), %xmm0
2064; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
2065; X86-SSE41-NEXT:    por %xmm2, %xmm0
2066; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
2067; X86-SSE41-NEXT:    sete %al
2068; X86-SSE41-NEXT:    retl
2069;
2070; X64-SSE2-LABEL: length31_eq_prefer128:
2071; X64-SSE2:       # %bb.0:
2072; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
2073; X64-SSE2-NEXT:    movdqu 15(%rdi), %xmm1
2074; X64-SSE2-NEXT:    movdqu (%rsi), %xmm2
2075; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
2076; X64-SSE2-NEXT:    movdqu 15(%rsi), %xmm0
2077; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
2078; X64-SSE2-NEXT:    pand %xmm2, %xmm0
2079; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
2080; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2081; X64-SSE2-NEXT:    sete %al
2082; X64-SSE2-NEXT:    retq
2083;
2084; X64-SSE41-LABEL: length31_eq_prefer128:
2085; X64-SSE41:       # %bb.0:
2086; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
2087; X64-SSE41-NEXT:    movdqu 15(%rdi), %xmm1
2088; X64-SSE41-NEXT:    movdqu (%rsi), %xmm2
2089; X64-SSE41-NEXT:    pxor %xmm0, %xmm2
2090; X64-SSE41-NEXT:    movdqu 15(%rsi), %xmm0
2091; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
2092; X64-SSE41-NEXT:    por %xmm2, %xmm0
2093; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
2094; X64-SSE41-NEXT:    sete %al
2095; X64-SSE41-NEXT:    retq
2096;
2097; X64-AVX-LABEL: length31_eq_prefer128:
2098; X64-AVX:       # %bb.0:
2099; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
2100; X64-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
2101; X64-AVX-NEXT:    vpxor 15(%rsi), %xmm1, %xmm1
2102; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0
2103; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
2104; X64-AVX-NEXT:    vptest %xmm0, %xmm0
2105; X64-AVX-NEXT:    sete %al
2106; X64-AVX-NEXT:    retq
2107;
2108; X64-MIC-AVX-LABEL: length31_eq_prefer128:
2109; X64-MIC-AVX:       # %bb.0:
2110; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
2111; X64-MIC-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
2112; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm2
2113; X64-MIC-AVX-NEXT:    vmovdqu 15(%rsi), %xmm3
2114; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm1, %k0
2115; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm0, %k1
2116; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
2117; X64-MIC-AVX-NEXT:    sete %al
2118; X64-MIC-AVX-NEXT:    vzeroupper
2119; X64-MIC-AVX-NEXT:    retq
2120  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 31) nounwind
2121  %cmp = icmp eq i32 %call, 0
2122  ret i1 %cmp
2123}
2124
2125define i1 @length31_eq_const(i8* %X) nounwind {
2126; X86-NOSSE-LABEL: length31_eq_const:
2127; X86-NOSSE:       # %bb.0:
2128; X86-NOSSE-NEXT:    pushl $0
2129; X86-NOSSE-NEXT:    pushl $31
2130; X86-NOSSE-NEXT:    pushl $.L.str
2131; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
2132; X86-NOSSE-NEXT:    calll memcmp
2133; X86-NOSSE-NEXT:    addl $16, %esp
2134; X86-NOSSE-NEXT:    testl %eax, %eax
2135; X86-NOSSE-NEXT:    setne %al
2136; X86-NOSSE-NEXT:    retl
2137;
2138; X86-SSE1-LABEL: length31_eq_const:
2139; X86-SSE1:       # %bb.0:
2140; X86-SSE1-NEXT:    pushl $0
2141; X86-SSE1-NEXT:    pushl $31
2142; X86-SSE1-NEXT:    pushl $.L.str
2143; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
2144; X86-SSE1-NEXT:    calll memcmp
2145; X86-SSE1-NEXT:    addl $16, %esp
2146; X86-SSE1-NEXT:    testl %eax, %eax
2147; X86-SSE1-NEXT:    setne %al
2148; X86-SSE1-NEXT:    retl
2149;
2150; X86-SSE2-LABEL: length31_eq_const:
2151; X86-SSE2:       # %bb.0:
2152; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2153; X86-SSE2-NEXT:    movdqu (%eax), %xmm0
2154; X86-SSE2-NEXT:    movdqu 15(%eax), %xmm1
2155; X86-SSE2-NEXT:    pcmpeqb {{\.LCPI.*}}, %xmm1
2156; X86-SSE2-NEXT:    pcmpeqb {{\.LCPI.*}}, %xmm0
2157; X86-SSE2-NEXT:    pand %xmm1, %xmm0
2158; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
2159; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2160; X86-SSE2-NEXT:    setne %al
2161; X86-SSE2-NEXT:    retl
2162;
2163; X86-SSE41-LABEL: length31_eq_const:
2164; X86-SSE41:       # %bb.0:
2165; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2166; X86-SSE41-NEXT:    movdqu (%eax), %xmm0
2167; X86-SSE41-NEXT:    movdqu 15(%eax), %xmm1
2168; X86-SSE41-NEXT:    pxor {{\.LCPI.*}}, %xmm1
2169; X86-SSE41-NEXT:    pxor {{\.LCPI.*}}, %xmm0
2170; X86-SSE41-NEXT:    por %xmm1, %xmm0
2171; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
2172; X86-SSE41-NEXT:    setne %al
2173; X86-SSE41-NEXT:    retl
2174;
2175; X64-SSE2-LABEL: length31_eq_const:
2176; X64-SSE2:       # %bb.0:
2177; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
2178; X64-SSE2-NEXT:    movdqu 15(%rdi), %xmm1
2179; X64-SSE2-NEXT:    pcmpeqb {{.*}}(%rip), %xmm1
2180; X64-SSE2-NEXT:    pcmpeqb {{.*}}(%rip), %xmm0
2181; X64-SSE2-NEXT:    pand %xmm1, %xmm0
2182; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
2183; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2184; X64-SSE2-NEXT:    setne %al
2185; X64-SSE2-NEXT:    retq
2186;
2187; X64-SSE41-LABEL: length31_eq_const:
2188; X64-SSE41:       # %bb.0:
2189; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
2190; X64-SSE41-NEXT:    movdqu 15(%rdi), %xmm1
2191; X64-SSE41-NEXT:    pxor {{.*}}(%rip), %xmm1
2192; X64-SSE41-NEXT:    pxor {{.*}}(%rip), %xmm0
2193; X64-SSE41-NEXT:    por %xmm1, %xmm0
2194; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
2195; X64-SSE41-NEXT:    setne %al
2196; X64-SSE41-NEXT:    retq
2197;
2198; X64-AVX-LABEL: length31_eq_const:
2199; X64-AVX:       # %bb.0:
2200; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
2201; X64-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
2202; X64-AVX-NEXT:    vpxor {{.*}}(%rip), %xmm1, %xmm1
2203; X64-AVX-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
2204; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
2205; X64-AVX-NEXT:    vptest %xmm0, %xmm0
2206; X64-AVX-NEXT:    setne %al
2207; X64-AVX-NEXT:    retq
2208;
2209; X64-MIC-AVX-LABEL: length31_eq_const:
2210; X64-MIC-AVX:       # %bb.0:
2211; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
2212; X64-MIC-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
2213; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [943142453,842084409,909456435,809056311]
2214; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm1, %k0
2215; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426]
2216; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
2217; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
2218; X64-MIC-AVX-NEXT:    setne %al
2219; X64-MIC-AVX-NEXT:    vzeroupper
2220; X64-MIC-AVX-NEXT:    retq
2221  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 31) nounwind
2222  %c = icmp ne i32 %m, 0
2223  ret i1 %c
2224}
2225
2226define i32 @length32(i8* %X, i8* %Y) nounwind {
2227; X86-LABEL: length32:
2228; X86:       # %bb.0:
2229; X86-NEXT:    pushl $0
2230; X86-NEXT:    pushl $32
2231; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2232; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2233; X86-NEXT:    calll memcmp
2234; X86-NEXT:    addl $16, %esp
2235; X86-NEXT:    retl
2236;
2237; X64-LABEL: length32:
2238; X64:       # %bb.0:
2239; X64-NEXT:    movl $32, %edx
2240; X64-NEXT:    jmp memcmp # TAILCALL
2241  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 32) nounwind
2242  ret i32 %m
2243}
2244
2245; PR33325 - https://bugs.llvm.org/show_bug.cgi?id=33325
2246
2247define i1 @length32_eq(i8* %x, i8* %y) nounwind {
2248; X86-NOSSE-LABEL: length32_eq:
2249; X86-NOSSE:       # %bb.0:
2250; X86-NOSSE-NEXT:    pushl $0
2251; X86-NOSSE-NEXT:    pushl $32
2252; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
2253; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
2254; X86-NOSSE-NEXT:    calll memcmp
2255; X86-NOSSE-NEXT:    addl $16, %esp
2256; X86-NOSSE-NEXT:    testl %eax, %eax
2257; X86-NOSSE-NEXT:    sete %al
2258; X86-NOSSE-NEXT:    retl
2259;
2260; X86-SSE1-LABEL: length32_eq:
2261; X86-SSE1:       # %bb.0:
2262; X86-SSE1-NEXT:    pushl $0
2263; X86-SSE1-NEXT:    pushl $32
2264; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
2265; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
2266; X86-SSE1-NEXT:    calll memcmp
2267; X86-SSE1-NEXT:    addl $16, %esp
2268; X86-SSE1-NEXT:    testl %eax, %eax
2269; X86-SSE1-NEXT:    sete %al
2270; X86-SSE1-NEXT:    retl
2271;
2272; X86-SSE2-LABEL: length32_eq:
2273; X86-SSE2:       # %bb.0:
2274; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2275; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2276; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
2277; X86-SSE2-NEXT:    movdqu 16(%ecx), %xmm1
2278; X86-SSE2-NEXT:    movdqu (%eax), %xmm2
2279; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
2280; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm0
2281; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
2282; X86-SSE2-NEXT:    pand %xmm2, %xmm0
2283; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
2284; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2285; X86-SSE2-NEXT:    sete %al
2286; X86-SSE2-NEXT:    retl
2287;
2288; X86-SSE41-LABEL: length32_eq:
2289; X86-SSE41:       # %bb.0:
2290; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2291; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2292; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
2293; X86-SSE41-NEXT:    movdqu 16(%ecx), %xmm1
2294; X86-SSE41-NEXT:    movdqu (%eax), %xmm2
2295; X86-SSE41-NEXT:    pxor %xmm0, %xmm2
2296; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm0
2297; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
2298; X86-SSE41-NEXT:    por %xmm2, %xmm0
2299; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
2300; X86-SSE41-NEXT:    sete %al
2301; X86-SSE41-NEXT:    retl
2302;
2303; X64-SSE2-LABEL: length32_eq:
2304; X64-SSE2:       # %bb.0:
2305; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
2306; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
2307; X64-SSE2-NEXT:    movdqu (%rsi), %xmm2
2308; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
2309; X64-SSE2-NEXT:    movdqu 16(%rsi), %xmm0
2310; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
2311; X64-SSE2-NEXT:    pand %xmm2, %xmm0
2312; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
2313; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2314; X64-SSE2-NEXT:    sete %al
2315; X64-SSE2-NEXT:    retq
2316;
2317; X64-SSE41-LABEL: length32_eq:
2318; X64-SSE41:       # %bb.0:
2319; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
2320; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
2321; X64-SSE41-NEXT:    movdqu (%rsi), %xmm2
2322; X64-SSE41-NEXT:    pxor %xmm0, %xmm2
2323; X64-SSE41-NEXT:    movdqu 16(%rsi), %xmm0
2324; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
2325; X64-SSE41-NEXT:    por %xmm2, %xmm0
2326; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
2327; X64-SSE41-NEXT:    sete %al
2328; X64-SSE41-NEXT:    retq
2329;
2330; X64-AVX1-LABEL: length32_eq:
2331; X64-AVX1:       # %bb.0:
2332; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
2333; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
2334; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
2335; X64-AVX1-NEXT:    sete %al
2336; X64-AVX1-NEXT:    vzeroupper
2337; X64-AVX1-NEXT:    retq
2338;
2339; X64-AVX2-LABEL: length32_eq:
2340; X64-AVX2:       # %bb.0:
2341; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2342; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
2343; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
2344; X64-AVX2-NEXT:    sete %al
2345; X64-AVX2-NEXT:    vzeroupper
2346; X64-AVX2-NEXT:    retq
2347;
2348; X64-AVX512-LABEL: length32_eq:
2349; X64-AVX512:       # %bb.0:
2350; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
2351; X64-AVX512-NEXT:    vpxor (%rsi), %ymm0, %ymm0
2352; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
2353; X64-AVX512-NEXT:    sete %al
2354; X64-AVX512-NEXT:    vzeroupper
2355; X64-AVX512-NEXT:    retq
2356;
2357; X64-MIC-AVX-LABEL: length32_eq:
2358; X64-MIC-AVX:       # %bb.0:
2359; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
2360; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %ymm1
2361; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
2362; X64-MIC-AVX-NEXT:    kortestw %k0, %k0
2363; X64-MIC-AVX-NEXT:    sete %al
2364; X64-MIC-AVX-NEXT:    vzeroupper
2365; X64-MIC-AVX-NEXT:    retq
2366  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 32) nounwind
2367  %cmp = icmp eq i32 %call, 0
2368  ret i1 %cmp
2369}
2370
2371define i1 @length32_lt(i8* %x, i8* %y) nounwind {
2372; X86-LABEL: length32_lt:
2373; X86:       # %bb.0:
2374; X86-NEXT:    pushl $0
2375; X86-NEXT:    pushl $32
2376; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2377; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2378; X86-NEXT:    calll memcmp
2379; X86-NEXT:    addl $16, %esp
2380; X86-NEXT:    shrl $31, %eax
2381; X86-NEXT:    # kill: def $al killed $al killed $eax
2382; X86-NEXT:    retl
2383;
2384; X64-LABEL: length32_lt:
2385; X64:       # %bb.0:
2386; X64-NEXT:    pushq %rax
2387; X64-NEXT:    movl $32, %edx
2388; X64-NEXT:    callq memcmp
2389; X64-NEXT:    shrl $31, %eax
2390; X64-NEXT:    # kill: def $al killed $al killed $eax
2391; X64-NEXT:    popq %rcx
2392; X64-NEXT:    retq
2393  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 32) nounwind
2394  %cmp = icmp slt i32 %call, 0
2395  ret i1 %cmp
2396}
2397
2398define i1 @length32_gt(i8* %x, i8* %y) nounwind {
2399; X86-LABEL: length32_gt:
2400; X86:       # %bb.0:
2401; X86-NEXT:    pushl $0
2402; X86-NEXT:    pushl $32
2403; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2404; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2405; X86-NEXT:    calll memcmp
2406; X86-NEXT:    addl $16, %esp
2407; X86-NEXT:    testl %eax, %eax
2408; X86-NEXT:    setg %al
2409; X86-NEXT:    retl
2410;
2411; X64-LABEL: length32_gt:
2412; X64:       # %bb.0:
2413; X64-NEXT:    pushq %rax
2414; X64-NEXT:    movl $32, %edx
2415; X64-NEXT:    callq memcmp
2416; X64-NEXT:    testl %eax, %eax
2417; X64-NEXT:    setg %al
2418; X64-NEXT:    popq %rcx
2419; X64-NEXT:    retq
2420  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 32) nounwind
2421  %cmp = icmp sgt i32 %call, 0
2422  ret i1 %cmp
2423}
2424
2425define i1 @length32_eq_prefer128(i8* %x, i8* %y) nounwind "prefer-vector-width"="128" {
2426; X86-NOSSE-LABEL: length32_eq_prefer128:
2427; X86-NOSSE:       # %bb.0:
2428; X86-NOSSE-NEXT:    pushl $0
2429; X86-NOSSE-NEXT:    pushl $32
2430; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
2431; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
2432; X86-NOSSE-NEXT:    calll memcmp
2433; X86-NOSSE-NEXT:    addl $16, %esp
2434; X86-NOSSE-NEXT:    testl %eax, %eax
2435; X86-NOSSE-NEXT:    sete %al
2436; X86-NOSSE-NEXT:    retl
2437;
2438; X86-SSE1-LABEL: length32_eq_prefer128:
2439; X86-SSE1:       # %bb.0:
2440; X86-SSE1-NEXT:    pushl $0
2441; X86-SSE1-NEXT:    pushl $32
2442; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
2443; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
2444; X86-SSE1-NEXT:    calll memcmp
2445; X86-SSE1-NEXT:    addl $16, %esp
2446; X86-SSE1-NEXT:    testl %eax, %eax
2447; X86-SSE1-NEXT:    sete %al
2448; X86-SSE1-NEXT:    retl
2449;
2450; X86-SSE2-LABEL: length32_eq_prefer128:
2451; X86-SSE2:       # %bb.0:
2452; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2453; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2454; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
2455; X86-SSE2-NEXT:    movdqu 16(%ecx), %xmm1
2456; X86-SSE2-NEXT:    movdqu (%eax), %xmm2
2457; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
2458; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm0
2459; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
2460; X86-SSE2-NEXT:    pand %xmm2, %xmm0
2461; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
2462; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2463; X86-SSE2-NEXT:    sete %al
2464; X86-SSE2-NEXT:    retl
2465;
2466; X86-SSE41-LABEL: length32_eq_prefer128:
2467; X86-SSE41:       # %bb.0:
2468; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2469; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2470; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
2471; X86-SSE41-NEXT:    movdqu 16(%ecx), %xmm1
2472; X86-SSE41-NEXT:    movdqu (%eax), %xmm2
2473; X86-SSE41-NEXT:    pxor %xmm0, %xmm2
2474; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm0
2475; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
2476; X86-SSE41-NEXT:    por %xmm2, %xmm0
2477; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
2478; X86-SSE41-NEXT:    sete %al
2479; X86-SSE41-NEXT:    retl
2480;
2481; X64-SSE2-LABEL: length32_eq_prefer128:
2482; X64-SSE2:       # %bb.0:
2483; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
2484; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
2485; X64-SSE2-NEXT:    movdqu (%rsi), %xmm2
2486; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
2487; X64-SSE2-NEXT:    movdqu 16(%rsi), %xmm0
2488; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
2489; X64-SSE2-NEXT:    pand %xmm2, %xmm0
2490; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
2491; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2492; X64-SSE2-NEXT:    sete %al
2493; X64-SSE2-NEXT:    retq
2494;
2495; X64-SSE41-LABEL: length32_eq_prefer128:
2496; X64-SSE41:       # %bb.0:
2497; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
2498; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
2499; X64-SSE41-NEXT:    movdqu (%rsi), %xmm2
2500; X64-SSE41-NEXT:    pxor %xmm0, %xmm2
2501; X64-SSE41-NEXT:    movdqu 16(%rsi), %xmm0
2502; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
2503; X64-SSE41-NEXT:    por %xmm2, %xmm0
2504; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
2505; X64-SSE41-NEXT:    sete %al
2506; X64-SSE41-NEXT:    retq
2507;
2508; X64-AVX-LABEL: length32_eq_prefer128:
2509; X64-AVX:       # %bb.0:
2510; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
2511; X64-AVX-NEXT:    vmovdqu 16(%rdi), %xmm1
2512; X64-AVX-NEXT:    vpxor 16(%rsi), %xmm1, %xmm1
2513; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0
2514; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
2515; X64-AVX-NEXT:    vptest %xmm0, %xmm0
2516; X64-AVX-NEXT:    sete %al
2517; X64-AVX-NEXT:    retq
2518;
2519; X64-MIC-AVX-LABEL: length32_eq_prefer128:
2520; X64-MIC-AVX:       # %bb.0:
2521; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
2522; X64-MIC-AVX-NEXT:    vmovdqu 16(%rdi), %xmm1
2523; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm2
2524; X64-MIC-AVX-NEXT:    vmovdqu 16(%rsi), %xmm3
2525; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm1, %k0
2526; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm0, %k1
2527; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
2528; X64-MIC-AVX-NEXT:    sete %al
2529; X64-MIC-AVX-NEXT:    vzeroupper
2530; X64-MIC-AVX-NEXT:    retq
2531  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 32) nounwind
2532  %cmp = icmp eq i32 %call, 0
2533  ret i1 %cmp
2534}
2535
2536define i1 @length32_eq_const(i8* %X) nounwind {
2537; X86-NOSSE-LABEL: length32_eq_const:
2538; X86-NOSSE:       # %bb.0:
2539; X86-NOSSE-NEXT:    pushl $0
2540; X86-NOSSE-NEXT:    pushl $32
2541; X86-NOSSE-NEXT:    pushl $.L.str
2542; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
2543; X86-NOSSE-NEXT:    calll memcmp
2544; X86-NOSSE-NEXT:    addl $16, %esp
2545; X86-NOSSE-NEXT:    testl %eax, %eax
2546; X86-NOSSE-NEXT:    setne %al
2547; X86-NOSSE-NEXT:    retl
2548;
2549; X86-SSE1-LABEL: length32_eq_const:
2550; X86-SSE1:       # %bb.0:
2551; X86-SSE1-NEXT:    pushl $0
2552; X86-SSE1-NEXT:    pushl $32
2553; X86-SSE1-NEXT:    pushl $.L.str
2554; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
2555; X86-SSE1-NEXT:    calll memcmp
2556; X86-SSE1-NEXT:    addl $16, %esp
2557; X86-SSE1-NEXT:    testl %eax, %eax
2558; X86-SSE1-NEXT:    setne %al
2559; X86-SSE1-NEXT:    retl
2560;
2561; X86-SSE2-LABEL: length32_eq_const:
2562; X86-SSE2:       # %bb.0:
2563; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2564; X86-SSE2-NEXT:    movdqu (%eax), %xmm0
2565; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm1
2566; X86-SSE2-NEXT:    pcmpeqb {{\.LCPI.*}}, %xmm1
2567; X86-SSE2-NEXT:    pcmpeqb {{\.LCPI.*}}, %xmm0
2568; X86-SSE2-NEXT:    pand %xmm1, %xmm0
2569; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
2570; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2571; X86-SSE2-NEXT:    setne %al
2572; X86-SSE2-NEXT:    retl
2573;
2574; X86-SSE41-LABEL: length32_eq_const:
2575; X86-SSE41:       # %bb.0:
2576; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2577; X86-SSE41-NEXT:    movdqu (%eax), %xmm0
2578; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm1
2579; X86-SSE41-NEXT:    pxor {{\.LCPI.*}}, %xmm1
2580; X86-SSE41-NEXT:    pxor {{\.LCPI.*}}, %xmm0
2581; X86-SSE41-NEXT:    por %xmm1, %xmm0
2582; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
2583; X86-SSE41-NEXT:    setne %al
2584; X86-SSE41-NEXT:    retl
2585;
2586; X64-SSE2-LABEL: length32_eq_const:
2587; X64-SSE2:       # %bb.0:
2588; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
2589; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
2590; X64-SSE2-NEXT:    pcmpeqb {{.*}}(%rip), %xmm1
2591; X64-SSE2-NEXT:    pcmpeqb {{.*}}(%rip), %xmm0
2592; X64-SSE2-NEXT:    pand %xmm1, %xmm0
2593; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
2594; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2595; X64-SSE2-NEXT:    setne %al
2596; X64-SSE2-NEXT:    retq
2597;
2598; X64-SSE41-LABEL: length32_eq_const:
2599; X64-SSE41:       # %bb.0:
2600; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
2601; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
2602; X64-SSE41-NEXT:    pxor {{.*}}(%rip), %xmm1
2603; X64-SSE41-NEXT:    pxor {{.*}}(%rip), %xmm0
2604; X64-SSE41-NEXT:    por %xmm1, %xmm0
2605; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
2606; X64-SSE41-NEXT:    setne %al
2607; X64-SSE41-NEXT:    retq
2608;
2609; X64-AVX1-LABEL: length32_eq_const:
2610; X64-AVX1:       # %bb.0:
2611; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
2612; X64-AVX1-NEXT:    vxorps {{.*}}(%rip), %ymm0, %ymm0
2613; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
2614; X64-AVX1-NEXT:    setne %al
2615; X64-AVX1-NEXT:    vzeroupper
2616; X64-AVX1-NEXT:    retq
2617;
2618; X64-AVX2-LABEL: length32_eq_const:
2619; X64-AVX2:       # %bb.0:
2620; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2621; X64-AVX2-NEXT:    vpxor {{.*}}(%rip), %ymm0, %ymm0
2622; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
2623; X64-AVX2-NEXT:    setne %al
2624; X64-AVX2-NEXT:    vzeroupper
2625; X64-AVX2-NEXT:    retq
2626;
2627; X64-AVX512-LABEL: length32_eq_const:
2628; X64-AVX512:       # %bb.0:
2629; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
2630; X64-AVX512-NEXT:    vpxor {{.*}}(%rip), %ymm0, %ymm0
2631; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
2632; X64-AVX512-NEXT:    setne %al
2633; X64-AVX512-NEXT:    vzeroupper
2634; X64-AVX512-NEXT:    retq
2635;
2636; X64-MIC-AVX-LABEL: length32_eq_const:
2637; X64-MIC-AVX:       # %bb.0:
2638; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
2639; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
2640; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
2641; X64-MIC-AVX-NEXT:    kortestw %k0, %k0
2642; X64-MIC-AVX-NEXT:    setne %al
2643; X64-MIC-AVX-NEXT:    vzeroupper
2644; X64-MIC-AVX-NEXT:    retq
2645  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 32) nounwind
2646  %c = icmp ne i32 %m, 0
2647  ret i1 %c
2648}
2649
2650define i32 @length48(i8* %X, i8* %Y) nounwind {
2651; X86-LABEL: length48:
2652; X86:       # %bb.0:
2653; X86-NEXT:    pushl $0
2654; X86-NEXT:    pushl $48
2655; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2656; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2657; X86-NEXT:    calll memcmp
2658; X86-NEXT:    addl $16, %esp
2659; X86-NEXT:    retl
2660;
2661; X64-LABEL: length48:
2662; X64:       # %bb.0:
2663; X64-NEXT:    movl $48, %edx
2664; X64-NEXT:    jmp memcmp # TAILCALL
2665  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 48) nounwind
2666  ret i32 %m
2667}
2668
2669define i1 @length48_eq(i8* %x, i8* %y) nounwind {
2670; X86-LABEL: length48_eq:
2671; X86:       # %bb.0:
2672; X86-NEXT:    pushl $0
2673; X86-NEXT:    pushl $48
2674; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2675; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2676; X86-NEXT:    calll memcmp
2677; X86-NEXT:    addl $16, %esp
2678; X86-NEXT:    testl %eax, %eax
2679; X86-NEXT:    sete %al
2680; X86-NEXT:    retl
2681;
2682; X64-SSE-LABEL: length48_eq:
2683; X64-SSE:       # %bb.0:
2684; X64-SSE-NEXT:    pushq %rax
2685; X64-SSE-NEXT:    movl $48, %edx
2686; X64-SSE-NEXT:    callq memcmp
2687; X64-SSE-NEXT:    testl %eax, %eax
2688; X64-SSE-NEXT:    sete %al
2689; X64-SSE-NEXT:    popq %rcx
2690; X64-SSE-NEXT:    retq
2691;
2692; X64-AVX1-LABEL: length48_eq:
2693; X64-AVX1:       # %bb.0:
2694; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
2695; X64-AVX1-NEXT:    vmovups 32(%rdi), %xmm1
2696; X64-AVX1-NEXT:    vmovups 32(%rsi), %xmm2
2697; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
2698; X64-AVX1-NEXT:    vxorps %ymm2, %ymm1, %ymm1
2699; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2700; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
2701; X64-AVX1-NEXT:    sete %al
2702; X64-AVX1-NEXT:    vzeroupper
2703; X64-AVX1-NEXT:    retq
2704;
2705; X64-AVX2-LABEL: length48_eq:
2706; X64-AVX2:       # %bb.0:
2707; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2708; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %xmm1
2709; X64-AVX2-NEXT:    vmovdqu 32(%rsi), %xmm2
2710; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
2711; X64-AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm1
2712; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2713; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
2714; X64-AVX2-NEXT:    sete %al
2715; X64-AVX2-NEXT:    vzeroupper
2716; X64-AVX2-NEXT:    retq
2717;
2718; X64-AVX512-LABEL: length48_eq:
2719; X64-AVX512:       # %bb.0:
2720; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
2721; X64-AVX512-NEXT:    vmovdqu 32(%rdi), %xmm1
2722; X64-AVX512-NEXT:    vmovdqu 32(%rsi), %xmm2
2723; X64-AVX512-NEXT:    vpxor (%rsi), %ymm0, %ymm0
2724; X64-AVX512-NEXT:    vpxor %ymm2, %ymm1, %ymm1
2725; X64-AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
2726; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
2727; X64-AVX512-NEXT:    sete %al
2728; X64-AVX512-NEXT:    vzeroupper
2729; X64-AVX512-NEXT:    retq
2730;
2731; X64-MIC-AVX-LABEL: length48_eq:
2732; X64-MIC-AVX:       # %bb.0:
2733; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
2734; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %ymm1
2735; X64-MIC-AVX-NEXT:    vmovdqu 32(%rdi), %xmm2
2736; X64-MIC-AVX-NEXT:    vmovdqu 32(%rsi), %xmm3
2737; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm2, %k0
2738; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
2739; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
2740; X64-MIC-AVX-NEXT:    sete %al
2741; X64-MIC-AVX-NEXT:    vzeroupper
2742; X64-MIC-AVX-NEXT:    retq
2743  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 48) nounwind
2744  %cmp = icmp eq i32 %call, 0
2745  ret i1 %cmp
2746}
2747
2748define i1 @length48_lt(i8* %x, i8* %y) nounwind {
2749; X86-LABEL: length48_lt:
2750; X86:       # %bb.0:
2751; X86-NEXT:    pushl $0
2752; X86-NEXT:    pushl $48
2753; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2754; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2755; X86-NEXT:    calll memcmp
2756; X86-NEXT:    addl $16, %esp
2757; X86-NEXT:    shrl $31, %eax
2758; X86-NEXT:    # kill: def $al killed $al killed $eax
2759; X86-NEXT:    retl
2760;
2761; X64-LABEL: length48_lt:
2762; X64:       # %bb.0:
2763; X64-NEXT:    pushq %rax
2764; X64-NEXT:    movl $48, %edx
2765; X64-NEXT:    callq memcmp
2766; X64-NEXT:    shrl $31, %eax
2767; X64-NEXT:    # kill: def $al killed $al killed $eax
2768; X64-NEXT:    popq %rcx
2769; X64-NEXT:    retq
2770  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 48) nounwind
2771  %cmp = icmp slt i32 %call, 0
2772  ret i1 %cmp
2773}
2774
2775define i1 @length48_gt(i8* %x, i8* %y) nounwind {
2776; X86-LABEL: length48_gt:
2777; X86:       # %bb.0:
2778; X86-NEXT:    pushl $0
2779; X86-NEXT:    pushl $48
2780; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2781; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2782; X86-NEXT:    calll memcmp
2783; X86-NEXT:    addl $16, %esp
2784; X86-NEXT:    testl %eax, %eax
2785; X86-NEXT:    setg %al
2786; X86-NEXT:    retl
2787;
2788; X64-LABEL: length48_gt:
2789; X64:       # %bb.0:
2790; X64-NEXT:    pushq %rax
2791; X64-NEXT:    movl $48, %edx
2792; X64-NEXT:    callq memcmp
2793; X64-NEXT:    testl %eax, %eax
2794; X64-NEXT:    setg %al
2795; X64-NEXT:    popq %rcx
2796; X64-NEXT:    retq
2797  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 48) nounwind
2798  %cmp = icmp sgt i32 %call, 0
2799  ret i1 %cmp
2800}
2801
2802define i1 @length48_eq_prefer128(i8* %x, i8* %y) nounwind "prefer-vector-width"="128" {
2803; X86-LABEL: length48_eq_prefer128:
2804; X86:       # %bb.0:
2805; X86-NEXT:    pushl $0
2806; X86-NEXT:    pushl $48
2807; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2808; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2809; X86-NEXT:    calll memcmp
2810; X86-NEXT:    addl $16, %esp
2811; X86-NEXT:    testl %eax, %eax
2812; X86-NEXT:    sete %al
2813; X86-NEXT:    retl
2814;
2815; X64-LABEL: length48_eq_prefer128:
2816; X64:       # %bb.0:
2817; X64-NEXT:    pushq %rax
2818; X64-NEXT:    movl $48, %edx
2819; X64-NEXT:    callq memcmp
2820; X64-NEXT:    testl %eax, %eax
2821; X64-NEXT:    sete %al
2822; X64-NEXT:    popq %rcx
2823; X64-NEXT:    retq
2824  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 48) nounwind
2825  %cmp = icmp eq i32 %call, 0
2826  ret i1 %cmp
2827}
2828
2829define i1 @length48_eq_const(i8* %X) nounwind {
2830; X86-LABEL: length48_eq_const:
2831; X86:       # %bb.0:
2832; X86-NEXT:    pushl $0
2833; X86-NEXT:    pushl $48
2834; X86-NEXT:    pushl $.L.str
2835; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2836; X86-NEXT:    calll memcmp
2837; X86-NEXT:    addl $16, %esp
2838; X86-NEXT:    testl %eax, %eax
2839; X86-NEXT:    setne %al
2840; X86-NEXT:    retl
2841;
2842; X64-SSE-LABEL: length48_eq_const:
2843; X64-SSE:       # %bb.0:
2844; X64-SSE-NEXT:    pushq %rax
2845; X64-SSE-NEXT:    movl $.L.str, %esi
2846; X64-SSE-NEXT:    movl $48, %edx
2847; X64-SSE-NEXT:    callq memcmp
2848; X64-SSE-NEXT:    testl %eax, %eax
2849; X64-SSE-NEXT:    setne %al
2850; X64-SSE-NEXT:    popq %rcx
2851; X64-SSE-NEXT:    retq
2852;
2853; X64-AVX1-LABEL: length48_eq_const:
2854; X64-AVX1:       # %bb.0:
2855; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
2856; X64-AVX1-NEXT:    vmovups 32(%rdi), %xmm1
2857; X64-AVX1-NEXT:    vxorps {{.*}}(%rip), %ymm0, %ymm0
2858; X64-AVX1-NEXT:    vxorps {{.*}}(%rip), %ymm1, %ymm1
2859; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2860; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
2861; X64-AVX1-NEXT:    setne %al
2862; X64-AVX1-NEXT:    vzeroupper
2863; X64-AVX1-NEXT:    retq
2864;
2865; X64-AVX2-LABEL: length48_eq_const:
2866; X64-AVX2:       # %bb.0:
2867; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2868; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %xmm1
2869; X64-AVX2-NEXT:    vpxor {{.*}}(%rip), %ymm0, %ymm0
2870; X64-AVX2-NEXT:    vpxor {{.*}}(%rip), %ymm1, %ymm1
2871; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2872; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
2873; X64-AVX2-NEXT:    setne %al
2874; X64-AVX2-NEXT:    vzeroupper
2875; X64-AVX2-NEXT:    retq
2876;
2877; X64-AVX512-LABEL: length48_eq_const:
2878; X64-AVX512:       # %bb.0:
2879; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
2880; X64-AVX512-NEXT:    vmovdqu 32(%rdi), %xmm1
2881; X64-AVX512-NEXT:    vpxor {{.*}}(%rip), %ymm0, %ymm0
2882; X64-AVX512-NEXT:    vpxor {{.*}}(%rip), %ymm1, %ymm1
2883; X64-AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
2884; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
2885; X64-AVX512-NEXT:    setne %al
2886; X64-AVX512-NEXT:    vzeroupper
2887; X64-AVX512-NEXT:    retq
2888;
2889; X64-MIC-AVX-LABEL: length48_eq_const:
2890; X64-MIC-AVX:       # %bb.0:
2891; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
2892; X64-MIC-AVX-NEXT:    vmovdqu 32(%rdi), %xmm1
2893; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,0,0,0,0]
2894; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm1, %k0
2895; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
2896; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
2897; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
2898; X64-MIC-AVX-NEXT:    setne %al
2899; X64-MIC-AVX-NEXT:    vzeroupper
2900; X64-MIC-AVX-NEXT:    retq
2901  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 48) nounwind
2902  %c = icmp ne i32 %m, 0
2903  ret i1 %c
2904}
2905
2906define i32 @length63(i8* %X, i8* %Y) nounwind {
2907; X86-LABEL: length63:
2908; X86:       # %bb.0:
2909; X86-NEXT:    pushl $0
2910; X86-NEXT:    pushl $63
2911; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2912; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2913; X86-NEXT:    calll memcmp
2914; X86-NEXT:    addl $16, %esp
2915; X86-NEXT:    retl
2916;
2917; X64-LABEL: length63:
2918; X64:       # %bb.0:
2919; X64-NEXT:    movl $63, %edx
2920; X64-NEXT:    jmp memcmp # TAILCALL
2921  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 63) nounwind
2922  ret i32 %m
2923}
2924
2925define i1 @length63_eq(i8* %x, i8* %y) nounwind {
2926; X86-LABEL: length63_eq:
2927; X86:       # %bb.0:
2928; X86-NEXT:    pushl $0
2929; X86-NEXT:    pushl $63
2930; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2931; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2932; X86-NEXT:    calll memcmp
2933; X86-NEXT:    addl $16, %esp
2934; X86-NEXT:    testl %eax, %eax
2935; X86-NEXT:    setne %al
2936; X86-NEXT:    retl
2937;
2938; X64-SSE-LABEL: length63_eq:
2939; X64-SSE:       # %bb.0:
2940; X64-SSE-NEXT:    pushq %rax
2941; X64-SSE-NEXT:    movl $63, %edx
2942; X64-SSE-NEXT:    callq memcmp
2943; X64-SSE-NEXT:    testl %eax, %eax
2944; X64-SSE-NEXT:    setne %al
2945; X64-SSE-NEXT:    popq %rcx
2946; X64-SSE-NEXT:    retq
2947;
2948; X64-AVX1-LABEL: length63_eq:
2949; X64-AVX1:       # %bb.0:
2950; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
2951; X64-AVX1-NEXT:    vmovups 31(%rdi), %ymm1
2952; X64-AVX1-NEXT:    vxorps 31(%rsi), %ymm1, %ymm1
2953; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
2954; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2955; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
2956; X64-AVX1-NEXT:    setne %al
2957; X64-AVX1-NEXT:    vzeroupper
2958; X64-AVX1-NEXT:    retq
2959;
2960; X64-AVX2-LABEL: length63_eq:
2961; X64-AVX2:       # %bb.0:
2962; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2963; X64-AVX2-NEXT:    vmovdqu 31(%rdi), %ymm1
2964; X64-AVX2-NEXT:    vpxor 31(%rsi), %ymm1, %ymm1
2965; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
2966; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2967; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
2968; X64-AVX2-NEXT:    setne %al
2969; X64-AVX2-NEXT:    vzeroupper
2970; X64-AVX2-NEXT:    retq
2971;
2972; X64-AVX512-LABEL: length63_eq:
2973; X64-AVX512:       # %bb.0:
2974; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
2975; X64-AVX512-NEXT:    vmovdqu 31(%rdi), %ymm1
2976; X64-AVX512-NEXT:    vpxor 31(%rsi), %ymm1, %ymm1
2977; X64-AVX512-NEXT:    vpxor (%rsi), %ymm0, %ymm0
2978; X64-AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
2979; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
2980; X64-AVX512-NEXT:    setne %al
2981; X64-AVX512-NEXT:    vzeroupper
2982; X64-AVX512-NEXT:    retq
2983;
2984; X64-MIC-AVX-LABEL: length63_eq:
2985; X64-MIC-AVX:       # %bb.0:
2986; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
2987; X64-MIC-AVX-NEXT:    vmovdqu 31(%rdi), %ymm1
2988; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %ymm2
2989; X64-MIC-AVX-NEXT:    vmovdqu 31(%rsi), %ymm3
2990; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm1, %k0
2991; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm0, %k1
2992; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
2993; X64-MIC-AVX-NEXT:    setne %al
2994; X64-MIC-AVX-NEXT:    vzeroupper
2995; X64-MIC-AVX-NEXT:    retq
2996  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 63) nounwind
2997  %cmp = icmp ne i32 %call, 0
2998  ret i1 %cmp
2999}
3000
3001define i1 @length63_lt(i8* %x, i8* %y) nounwind {
3002; X86-LABEL: length63_lt:
3003; X86:       # %bb.0:
3004; X86-NEXT:    pushl $0
3005; X86-NEXT:    pushl $63
3006; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3007; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3008; X86-NEXT:    calll memcmp
3009; X86-NEXT:    addl $16, %esp
3010; X86-NEXT:    shrl $31, %eax
3011; X86-NEXT:    # kill: def $al killed $al killed $eax
3012; X86-NEXT:    retl
3013;
3014; X64-LABEL: length63_lt:
3015; X64:       # %bb.0:
3016; X64-NEXT:    pushq %rax
3017; X64-NEXT:    movl $63, %edx
3018; X64-NEXT:    callq memcmp
3019; X64-NEXT:    shrl $31, %eax
3020; X64-NEXT:    # kill: def $al killed $al killed $eax
3021; X64-NEXT:    popq %rcx
3022; X64-NEXT:    retq
3023  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 63) nounwind
3024  %cmp = icmp slt i32 %call, 0
3025  ret i1 %cmp
3026}
3027
3028define i1 @length63_gt(i8* %x, i8* %y) nounwind {
3029; X86-LABEL: length63_gt:
3030; X86:       # %bb.0:
3031; X86-NEXT:    pushl $0
3032; X86-NEXT:    pushl $63
3033; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3034; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3035; X86-NEXT:    calll memcmp
3036; X86-NEXT:    addl $16, %esp
3037; X86-NEXT:    testl %eax, %eax
3038; X86-NEXT:    setg %al
3039; X86-NEXT:    retl
3040;
3041; X64-LABEL: length63_gt:
3042; X64:       # %bb.0:
3043; X64-NEXT:    pushq %rax
3044; X64-NEXT:    movl $63, %edx
3045; X64-NEXT:    callq memcmp
3046; X64-NEXT:    testl %eax, %eax
3047; X64-NEXT:    setg %al
3048; X64-NEXT:    popq %rcx
3049; X64-NEXT:    retq
3050  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 63) nounwind
3051  %cmp = icmp sgt i32 %call, 0
3052  ret i1 %cmp
3053}
3054
3055define i1 @length63_eq_const(i8* %X) nounwind {
3056; X86-LABEL: length63_eq_const:
3057; X86:       # %bb.0:
3058; X86-NEXT:    pushl $0
3059; X86-NEXT:    pushl $63
3060; X86-NEXT:    pushl $.L.str
3061; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3062; X86-NEXT:    calll memcmp
3063; X86-NEXT:    addl $16, %esp
3064; X86-NEXT:    testl %eax, %eax
3065; X86-NEXT:    sete %al
3066; X86-NEXT:    retl
3067;
3068; X64-SSE-LABEL: length63_eq_const:
3069; X64-SSE:       # %bb.0:
3070; X64-SSE-NEXT:    pushq %rax
3071; X64-SSE-NEXT:    movl $.L.str, %esi
3072; X64-SSE-NEXT:    movl $63, %edx
3073; X64-SSE-NEXT:    callq memcmp
3074; X64-SSE-NEXT:    testl %eax, %eax
3075; X64-SSE-NEXT:    sete %al
3076; X64-SSE-NEXT:    popq %rcx
3077; X64-SSE-NEXT:    retq
3078;
3079; X64-AVX1-LABEL: length63_eq_const:
3080; X64-AVX1:       # %bb.0:
3081; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
3082; X64-AVX1-NEXT:    vmovups 31(%rdi), %ymm1
3083; X64-AVX1-NEXT:    vxorps {{.*}}(%rip), %ymm1, %ymm1
3084; X64-AVX1-NEXT:    vxorps {{.*}}(%rip), %ymm0, %ymm0
3085; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
3086; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
3087; X64-AVX1-NEXT:    sete %al
3088; X64-AVX1-NEXT:    vzeroupper
3089; X64-AVX1-NEXT:    retq
3090;
3091; X64-AVX2-LABEL: length63_eq_const:
3092; X64-AVX2:       # %bb.0:
3093; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
3094; X64-AVX2-NEXT:    vmovdqu 31(%rdi), %ymm1
3095; X64-AVX2-NEXT:    vpxor {{.*}}(%rip), %ymm1, %ymm1
3096; X64-AVX2-NEXT:    vpxor {{.*}}(%rip), %ymm0, %ymm0
3097; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
3098; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
3099; X64-AVX2-NEXT:    sete %al
3100; X64-AVX2-NEXT:    vzeroupper
3101; X64-AVX2-NEXT:    retq
3102;
3103; X64-AVX512-LABEL: length63_eq_const:
3104; X64-AVX512:       # %bb.0:
3105; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
3106; X64-AVX512-NEXT:    vmovdqu 31(%rdi), %ymm1
3107; X64-AVX512-NEXT:    vpxor {{.*}}(%rip), %ymm1, %ymm1
3108; X64-AVX512-NEXT:    vpxor {{.*}}(%rip), %ymm0, %ymm0
3109; X64-AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
3110; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
3111; X64-AVX512-NEXT:    sete %al
3112; X64-AVX512-NEXT:    vzeroupper
3113; X64-AVX512-NEXT:    retq
3114;
3115; X64-MIC-AVX-LABEL: length63_eq_const:
3116; X64-MIC-AVX:       # %bb.0:
3117; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
3118; X64-MIC-AVX-NEXT:    vmovdqu 31(%rdi), %ymm1
3119; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm2 = [875770417,943142453,842084409,909456435,809056311,875770417,943142453,842084409]
3120; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm1, %k0
3121; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
3122; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
3123; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
3124; X64-MIC-AVX-NEXT:    sete %al
3125; X64-MIC-AVX-NEXT:    vzeroupper
3126; X64-MIC-AVX-NEXT:    retq
3127  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 63) nounwind
3128  %c = icmp eq i32 %m, 0
3129  ret i1 %c
3130}
3131
3132define i32 @length64(i8* %X, i8* %Y) nounwind {
3133; X86-LABEL: length64:
3134; X86:       # %bb.0:
3135; X86-NEXT:    pushl $0
3136; X86-NEXT:    pushl $64
3137; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3138; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3139; X86-NEXT:    calll memcmp
3140; X86-NEXT:    addl $16, %esp
3141; X86-NEXT:    retl
3142;
3143; X64-LABEL: length64:
3144; X64:       # %bb.0:
3145; X64-NEXT:    movl $64, %edx
3146; X64-NEXT:    jmp memcmp # TAILCALL
3147  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 64) nounwind
3148  ret i32 %m
3149}
3150
3151define i1 @length64_eq(i8* %x, i8* %y) nounwind {
3152; X86-LABEL: length64_eq:
3153; X86:       # %bb.0:
3154; X86-NEXT:    pushl $0
3155; X86-NEXT:    pushl $64
3156; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3157; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3158; X86-NEXT:    calll memcmp
3159; X86-NEXT:    addl $16, %esp
3160; X86-NEXT:    testl %eax, %eax
3161; X86-NEXT:    setne %al
3162; X86-NEXT:    retl
3163;
3164; X64-SSE-LABEL: length64_eq:
3165; X64-SSE:       # %bb.0:
3166; X64-SSE-NEXT:    pushq %rax
3167; X64-SSE-NEXT:    movl $64, %edx
3168; X64-SSE-NEXT:    callq memcmp
3169; X64-SSE-NEXT:    testl %eax, %eax
3170; X64-SSE-NEXT:    setne %al
3171; X64-SSE-NEXT:    popq %rcx
3172; X64-SSE-NEXT:    retq
3173;
3174; X64-AVX1-LABEL: length64_eq:
3175; X64-AVX1:       # %bb.0:
3176; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
3177; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm1
3178; X64-AVX1-NEXT:    vxorps 32(%rsi), %ymm1, %ymm1
3179; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
3180; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
3181; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
3182; X64-AVX1-NEXT:    setne %al
3183; X64-AVX1-NEXT:    vzeroupper
3184; X64-AVX1-NEXT:    retq
3185;
3186; X64-AVX2-LABEL: length64_eq:
3187; X64-AVX2:       # %bb.0:
3188; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
3189; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
3190; X64-AVX2-NEXT:    vpxor 32(%rsi), %ymm1, %ymm1
3191; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
3192; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
3193; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
3194; X64-AVX2-NEXT:    setne %al
3195; X64-AVX2-NEXT:    vzeroupper
3196; X64-AVX2-NEXT:    retq
3197;
3198; X64-AVX512BW-LABEL: length64_eq:
3199; X64-AVX512BW:       # %bb.0:
3200; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
3201; X64-AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k0
3202; X64-AVX512BW-NEXT:    kortestq %k0, %k0
3203; X64-AVX512BW-NEXT:    setne %al
3204; X64-AVX512BW-NEXT:    vzeroupper
3205; X64-AVX512BW-NEXT:    retq
3206;
3207; X64-AVX512F-LABEL: length64_eq:
3208; X64-AVX512F:       # %bb.0:
3209; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3210; X64-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k0
3211; X64-AVX512F-NEXT:    kortestw %k0, %k0
3212; X64-AVX512F-NEXT:    setne %al
3213; X64-AVX512F-NEXT:    vzeroupper
3214; X64-AVX512F-NEXT:    retq
3215;
3216; X64-MIC-AVX2-LABEL: length64_eq:
3217; X64-MIC-AVX2:       # %bb.0:
3218; X64-MIC-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
3219; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
3220; X64-MIC-AVX2-NEXT:    vmovdqu (%rsi), %ymm2
3221; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rsi), %ymm3
3222; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm3, %zmm1, %k0
3223; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm2, %zmm0, %k1
3224; X64-MIC-AVX2-NEXT:    kortestw %k0, %k1
3225; X64-MIC-AVX2-NEXT:    setne %al
3226; X64-MIC-AVX2-NEXT:    vzeroupper
3227; X64-MIC-AVX2-NEXT:    retq
3228;
3229; X64-MIC-AVX512F-LABEL: length64_eq:
3230; X64-MIC-AVX512F:       # %bb.0:
3231; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3232; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k0
3233; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k0
3234; X64-MIC-AVX512F-NEXT:    setne %al
3235; X64-MIC-AVX512F-NEXT:    vzeroupper
3236; X64-MIC-AVX512F-NEXT:    retq
3237  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 64) nounwind
3238  %cmp = icmp ne i32 %call, 0
3239  ret i1 %cmp
3240}
3241
3242define i1 @length64_lt(i8* %x, i8* %y) nounwind {
3243; X86-LABEL: length64_lt:
3244; X86:       # %bb.0:
3245; X86-NEXT:    pushl $0
3246; X86-NEXT:    pushl $64
3247; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3248; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3249; X86-NEXT:    calll memcmp
3250; X86-NEXT:    addl $16, %esp
3251; X86-NEXT:    shrl $31, %eax
3252; X86-NEXT:    # kill: def $al killed $al killed $eax
3253; X86-NEXT:    retl
3254;
3255; X64-LABEL: length64_lt:
3256; X64:       # %bb.0:
3257; X64-NEXT:    pushq %rax
3258; X64-NEXT:    movl $64, %edx
3259; X64-NEXT:    callq memcmp
3260; X64-NEXT:    shrl $31, %eax
3261; X64-NEXT:    # kill: def $al killed $al killed $eax
3262; X64-NEXT:    popq %rcx
3263; X64-NEXT:    retq
3264  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 64) nounwind
3265  %cmp = icmp slt i32 %call, 0
3266  ret i1 %cmp
3267}
3268
3269define i1 @length64_gt(i8* %x, i8* %y) nounwind {
3270; X86-LABEL: length64_gt:
3271; X86:       # %bb.0:
3272; X86-NEXT:    pushl $0
3273; X86-NEXT:    pushl $64
3274; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3275; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3276; X86-NEXT:    calll memcmp
3277; X86-NEXT:    addl $16, %esp
3278; X86-NEXT:    testl %eax, %eax
3279; X86-NEXT:    setg %al
3280; X86-NEXT:    retl
3281;
3282; X64-LABEL: length64_gt:
3283; X64:       # %bb.0:
3284; X64-NEXT:    pushq %rax
3285; X64-NEXT:    movl $64, %edx
3286; X64-NEXT:    callq memcmp
3287; X64-NEXT:    testl %eax, %eax
3288; X64-NEXT:    setg %al
3289; X64-NEXT:    popq %rcx
3290; X64-NEXT:    retq
3291  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 64) nounwind
3292  %cmp = icmp sgt i32 %call, 0
3293  ret i1 %cmp
3294}
3295
3296define i1 @length64_eq_const(i8* %X) nounwind {
3297; X86-LABEL: length64_eq_const:
3298; X86:       # %bb.0:
3299; X86-NEXT:    pushl $0
3300; X86-NEXT:    pushl $64
3301; X86-NEXT:    pushl $.L.str
3302; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3303; X86-NEXT:    calll memcmp
3304; X86-NEXT:    addl $16, %esp
3305; X86-NEXT:    testl %eax, %eax
3306; X86-NEXT:    sete %al
3307; X86-NEXT:    retl
3308;
3309; X64-SSE-LABEL: length64_eq_const:
3310; X64-SSE:       # %bb.0:
3311; X64-SSE-NEXT:    pushq %rax
3312; X64-SSE-NEXT:    movl $.L.str, %esi
3313; X64-SSE-NEXT:    movl $64, %edx
3314; X64-SSE-NEXT:    callq memcmp
3315; X64-SSE-NEXT:    testl %eax, %eax
3316; X64-SSE-NEXT:    sete %al
3317; X64-SSE-NEXT:    popq %rcx
3318; X64-SSE-NEXT:    retq
3319;
3320; X64-AVX1-LABEL: length64_eq_const:
3321; X64-AVX1:       # %bb.0:
3322; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
3323; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm1
3324; X64-AVX1-NEXT:    vxorps {{.*}}(%rip), %ymm1, %ymm1
3325; X64-AVX1-NEXT:    vxorps {{.*}}(%rip), %ymm0, %ymm0
3326; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
3327; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
3328; X64-AVX1-NEXT:    sete %al
3329; X64-AVX1-NEXT:    vzeroupper
3330; X64-AVX1-NEXT:    retq
3331;
3332; X64-AVX2-LABEL: length64_eq_const:
3333; X64-AVX2:       # %bb.0:
3334; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
3335; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
3336; X64-AVX2-NEXT:    vpxor {{.*}}(%rip), %ymm1, %ymm1
3337; X64-AVX2-NEXT:    vpxor {{.*}}(%rip), %ymm0, %ymm0
3338; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
3339; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
3340; X64-AVX2-NEXT:    sete %al
3341; X64-AVX2-NEXT:    vzeroupper
3342; X64-AVX2-NEXT:    retq
3343;
3344; X64-AVX512BW-LABEL: length64_eq_const:
3345; X64-AVX512BW:       # %bb.0:
3346; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
3347; X64-AVX512BW-NEXT:    vpcmpneqb {{.*}}(%rip), %zmm0, %k0
3348; X64-AVX512BW-NEXT:    kortestq %k0, %k0
3349; X64-AVX512BW-NEXT:    sete %al
3350; X64-AVX512BW-NEXT:    vzeroupper
3351; X64-AVX512BW-NEXT:    retq
3352;
3353; X64-AVX512F-LABEL: length64_eq_const:
3354; X64-AVX512F:       # %bb.0:
3355; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3356; X64-AVX512F-NEXT:    vpcmpneqd {{.*}}(%rip), %zmm0, %k0
3357; X64-AVX512F-NEXT:    kortestw %k0, %k0
3358; X64-AVX512F-NEXT:    sete %al
3359; X64-AVX512F-NEXT:    vzeroupper
3360; X64-AVX512F-NEXT:    retq
3361;
3362; X64-MIC-AVX2-LABEL: length64_eq_const:
3363; X64-MIC-AVX2:       # %bb.0:
3364; X64-MIC-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
3365; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
3366; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408]
3367; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm2, %zmm1, %k0
3368; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
3369; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
3370; X64-MIC-AVX2-NEXT:    kortestw %k0, %k1
3371; X64-MIC-AVX2-NEXT:    sete %al
3372; X64-MIC-AVX2-NEXT:    vzeroupper
3373; X64-MIC-AVX2-NEXT:    retq
3374;
3375; X64-MIC-AVX512F-LABEL: length64_eq_const:
3376; X64-MIC-AVX512F:       # %bb.0:
3377; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3378; X64-MIC-AVX512F-NEXT:    vpcmpneqd {{.*}}(%rip), %zmm0, %k0
3379; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k0
3380; X64-MIC-AVX512F-NEXT:    sete %al
3381; X64-MIC-AVX512F-NEXT:    vzeroupper
3382; X64-MIC-AVX512F-NEXT:    retq
3383  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 64) nounwind
3384  %c = icmp eq i32 %m, 0
3385  ret i1 %c
3386}
3387
3388define i32 @length96(i8* %X, i8* %Y) nounwind {
3389; X86-LABEL: length96:
3390; X86:       # %bb.0:
3391; X86-NEXT:    pushl $0
3392; X86-NEXT:    pushl $96
3393; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3394; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3395; X86-NEXT:    calll memcmp
3396; X86-NEXT:    addl $16, %esp
3397; X86-NEXT:    retl
3398;
3399; X64-LABEL: length96:
3400; X64:       # %bb.0:
3401; X64-NEXT:    movl $96, %edx
3402; X64-NEXT:    jmp memcmp # TAILCALL
3403  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 96) nounwind
3404  ret i32 %m
3405}
3406
3407define i1 @length96_eq(i8* %x, i8* %y) nounwind {
3408; X86-LABEL: length96_eq:
3409; X86:       # %bb.0:
3410; X86-NEXT:    pushl $0
3411; X86-NEXT:    pushl $96
3412; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3413; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3414; X86-NEXT:    calll memcmp
3415; X86-NEXT:    addl $16, %esp
3416; X86-NEXT:    testl %eax, %eax
3417; X86-NEXT:    setne %al
3418; X86-NEXT:    retl
3419;
3420; X64-SSE-LABEL: length96_eq:
3421; X64-SSE:       # %bb.0:
3422; X64-SSE-NEXT:    pushq %rax
3423; X64-SSE-NEXT:    movl $96, %edx
3424; X64-SSE-NEXT:    callq memcmp
3425; X64-SSE-NEXT:    testl %eax, %eax
3426; X64-SSE-NEXT:    setne %al
3427; X64-SSE-NEXT:    popq %rcx
3428; X64-SSE-NEXT:    retq
3429;
3430; X64-AVX1-LABEL: length96_eq:
3431; X64-AVX1:       # %bb.0:
3432; X64-AVX1-NEXT:    pushq %rax
3433; X64-AVX1-NEXT:    movl $96, %edx
3434; X64-AVX1-NEXT:    callq memcmp
3435; X64-AVX1-NEXT:    testl %eax, %eax
3436; X64-AVX1-NEXT:    setne %al
3437; X64-AVX1-NEXT:    popq %rcx
3438; X64-AVX1-NEXT:    retq
3439;
3440; X64-AVX2-LABEL: length96_eq:
3441; X64-AVX2:       # %bb.0:
3442; X64-AVX2-NEXT:    pushq %rax
3443; X64-AVX2-NEXT:    movl $96, %edx
3444; X64-AVX2-NEXT:    callq memcmp
3445; X64-AVX2-NEXT:    testl %eax, %eax
3446; X64-AVX2-NEXT:    setne %al
3447; X64-AVX2-NEXT:    popq %rcx
3448; X64-AVX2-NEXT:    retq
3449;
3450; X64-AVX512BW-LABEL: length96_eq:
3451; X64-AVX512BW:       # %bb.0:
3452; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
3453; X64-AVX512BW-NEXT:    vmovdqu 64(%rdi), %ymm1
3454; X64-AVX512BW-NEXT:    vmovdqu 64(%rsi), %ymm2
3455; X64-AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k0
3456; X64-AVX512BW-NEXT:    vpcmpneqb %zmm2, %zmm1, %k1
3457; X64-AVX512BW-NEXT:    kortestq %k1, %k0
3458; X64-AVX512BW-NEXT:    setne %al
3459; X64-AVX512BW-NEXT:    vzeroupper
3460; X64-AVX512BW-NEXT:    retq
3461;
3462; X64-AVX512F-LABEL: length96_eq:
3463; X64-AVX512F:       # %bb.0:
3464; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3465; X64-AVX512F-NEXT:    vmovdqu 64(%rdi), %ymm1
3466; X64-AVX512F-NEXT:    vmovdqu 64(%rsi), %ymm2
3467; X64-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k0
3468; X64-AVX512F-NEXT:    vpcmpneqd %zmm2, %zmm1, %k1
3469; X64-AVX512F-NEXT:    kortestw %k1, %k0
3470; X64-AVX512F-NEXT:    setne %al
3471; X64-AVX512F-NEXT:    vzeroupper
3472; X64-AVX512F-NEXT:    retq
3473;
3474; X64-MIC-AVX2-LABEL: length96_eq:
3475; X64-MIC-AVX2:       # %bb.0:
3476; X64-MIC-AVX2-NEXT:    pushq %rax
3477; X64-MIC-AVX2-NEXT:    movl $96, %edx
3478; X64-MIC-AVX2-NEXT:    callq memcmp
3479; X64-MIC-AVX2-NEXT:    testl %eax, %eax
3480; X64-MIC-AVX2-NEXT:    setne %al
3481; X64-MIC-AVX2-NEXT:    popq %rcx
3482; X64-MIC-AVX2-NEXT:    retq
3483;
3484; X64-MIC-AVX512F-LABEL: length96_eq:
3485; X64-MIC-AVX512F:       # %bb.0:
3486; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3487; X64-MIC-AVX512F-NEXT:    vmovdqu 64(%rdi), %ymm1
3488; X64-MIC-AVX512F-NEXT:    vmovdqu 64(%rsi), %ymm2
3489; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k0
3490; X64-MIC-AVX512F-NEXT:    vpcmpneqd %zmm2, %zmm1, %k1
3491; X64-MIC-AVX512F-NEXT:    kortestw %k1, %k0
3492; X64-MIC-AVX512F-NEXT:    setne %al
3493; X64-MIC-AVX512F-NEXT:    vzeroupper
3494; X64-MIC-AVX512F-NEXT:    retq
3495  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 96) nounwind
3496  %cmp = icmp ne i32 %call, 0
3497  ret i1 %cmp
3498}
3499
3500define i1 @length96_lt(i8* %x, i8* %y) nounwind {
3501; X86-LABEL: length96_lt:
3502; X86:       # %bb.0:
3503; X86-NEXT:    pushl $0
3504; X86-NEXT:    pushl $96
3505; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3506; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3507; X86-NEXT:    calll memcmp
3508; X86-NEXT:    addl $16, %esp
3509; X86-NEXT:    shrl $31, %eax
3510; X86-NEXT:    # kill: def $al killed $al killed $eax
3511; X86-NEXT:    retl
3512;
3513; X64-LABEL: length96_lt:
3514; X64:       # %bb.0:
3515; X64-NEXT:    pushq %rax
3516; X64-NEXT:    movl $96, %edx
3517; X64-NEXT:    callq memcmp
3518; X64-NEXT:    shrl $31, %eax
3519; X64-NEXT:    # kill: def $al killed $al killed $eax
3520; X64-NEXT:    popq %rcx
3521; X64-NEXT:    retq
3522  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 96) nounwind
3523  %cmp = icmp slt i32 %call, 0
3524  ret i1 %cmp
3525}
3526
3527define i1 @length96_gt(i8* %x, i8* %y) nounwind {
3528; X86-LABEL: length96_gt:
3529; X86:       # %bb.0:
3530; X86-NEXT:    pushl $0
3531; X86-NEXT:    pushl $96
3532; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3533; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3534; X86-NEXT:    calll memcmp
3535; X86-NEXT:    addl $16, %esp
3536; X86-NEXT:    testl %eax, %eax
3537; X86-NEXT:    setg %al
3538; X86-NEXT:    retl
3539;
3540; X64-LABEL: length96_gt:
3541; X64:       # %bb.0:
3542; X64-NEXT:    pushq %rax
3543; X64-NEXT:    movl $96, %edx
3544; X64-NEXT:    callq memcmp
3545; X64-NEXT:    testl %eax, %eax
3546; X64-NEXT:    setg %al
3547; X64-NEXT:    popq %rcx
3548; X64-NEXT:    retq
3549  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 96) nounwind
3550  %cmp = icmp sgt i32 %call, 0
3551  ret i1 %cmp
3552}
3553
3554define i1 @length96_eq_const(i8* %X) nounwind {
3555; X86-LABEL: length96_eq_const:
3556; X86:       # %bb.0:
3557; X86-NEXT:    pushl $0
3558; X86-NEXT:    pushl $96
3559; X86-NEXT:    pushl $.L.str
3560; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3561; X86-NEXT:    calll memcmp
3562; X86-NEXT:    addl $16, %esp
3563; X86-NEXT:    testl %eax, %eax
3564; X86-NEXT:    sete %al
3565; X86-NEXT:    retl
3566;
3567; X64-SSE-LABEL: length96_eq_const:
3568; X64-SSE:       # %bb.0:
3569; X64-SSE-NEXT:    pushq %rax
3570; X64-SSE-NEXT:    movl $.L.str, %esi
3571; X64-SSE-NEXT:    movl $96, %edx
3572; X64-SSE-NEXT:    callq memcmp
3573; X64-SSE-NEXT:    testl %eax, %eax
3574; X64-SSE-NEXT:    sete %al
3575; X64-SSE-NEXT:    popq %rcx
3576; X64-SSE-NEXT:    retq
3577;
3578; X64-AVX1-LABEL: length96_eq_const:
3579; X64-AVX1:       # %bb.0:
3580; X64-AVX1-NEXT:    pushq %rax
3581; X64-AVX1-NEXT:    movl $.L.str, %esi
3582; X64-AVX1-NEXT:    movl $96, %edx
3583; X64-AVX1-NEXT:    callq memcmp
3584; X64-AVX1-NEXT:    testl %eax, %eax
3585; X64-AVX1-NEXT:    sete %al
3586; X64-AVX1-NEXT:    popq %rcx
3587; X64-AVX1-NEXT:    retq
3588;
3589; X64-AVX2-LABEL: length96_eq_const:
3590; X64-AVX2:       # %bb.0:
3591; X64-AVX2-NEXT:    pushq %rax
3592; X64-AVX2-NEXT:    movl $.L.str, %esi
3593; X64-AVX2-NEXT:    movl $96, %edx
3594; X64-AVX2-NEXT:    callq memcmp
3595; X64-AVX2-NEXT:    testl %eax, %eax
3596; X64-AVX2-NEXT:    sete %al
3597; X64-AVX2-NEXT:    popq %rcx
3598; X64-AVX2-NEXT:    retq
3599;
3600; X64-AVX512BW-LABEL: length96_eq_const:
3601; X64-AVX512BW:       # %bb.0:
3602; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
3603; X64-AVX512BW-NEXT:    vmovdqu 64(%rdi), %ymm1
3604; X64-AVX512BW-NEXT:    vpcmpneqb {{.*}}(%rip), %zmm0, %k0
3605; X64-AVX512BW-NEXT:    vpcmpneqb {{.*}}(%rip), %zmm1, %k1
3606; X64-AVX512BW-NEXT:    kortestq %k1, %k0
3607; X64-AVX512BW-NEXT:    sete %al
3608; X64-AVX512BW-NEXT:    vzeroupper
3609; X64-AVX512BW-NEXT:    retq
3610;
3611; X64-AVX512F-LABEL: length96_eq_const:
3612; X64-AVX512F:       # %bb.0:
3613; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3614; X64-AVX512F-NEXT:    vmovdqu 64(%rdi), %ymm1
3615; X64-AVX512F-NEXT:    vpcmpneqd {{.*}}(%rip), %zmm0, %k0
3616; X64-AVX512F-NEXT:    vpcmpneqd {{.*}}(%rip), %zmm1, %k1
3617; X64-AVX512F-NEXT:    kortestw %k1, %k0
3618; X64-AVX512F-NEXT:    sete %al
3619; X64-AVX512F-NEXT:    vzeroupper
3620; X64-AVX512F-NEXT:    retq
3621;
3622; X64-MIC-AVX2-LABEL: length96_eq_const:
3623; X64-MIC-AVX2:       # %bb.0:
3624; X64-MIC-AVX2-NEXT:    pushq %rax
3625; X64-MIC-AVX2-NEXT:    movl $.L.str, %esi
3626; X64-MIC-AVX2-NEXT:    movl $96, %edx
3627; X64-MIC-AVX2-NEXT:    callq memcmp
3628; X64-MIC-AVX2-NEXT:    testl %eax, %eax
3629; X64-MIC-AVX2-NEXT:    sete %al
3630; X64-MIC-AVX2-NEXT:    popq %rcx
3631; X64-MIC-AVX2-NEXT:    retq
3632;
3633; X64-MIC-AVX512F-LABEL: length96_eq_const:
3634; X64-MIC-AVX512F:       # %bb.0:
3635; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3636; X64-MIC-AVX512F-NEXT:    vmovdqu 64(%rdi), %ymm1
3637; X64-MIC-AVX512F-NEXT:    vpcmpneqd {{.*}}(%rip), %zmm0, %k0
3638; X64-MIC-AVX512F-NEXT:    vpcmpneqd {{.*}}(%rip), %zmm1, %k1
3639; X64-MIC-AVX512F-NEXT:    kortestw %k1, %k0
3640; X64-MIC-AVX512F-NEXT:    sete %al
3641; X64-MIC-AVX512F-NEXT:    vzeroupper
3642; X64-MIC-AVX512F-NEXT:    retq
3643  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 96) nounwind
3644  %c = icmp eq i32 %m, 0
3645  ret i1 %c
3646}
3647
3648define i32 @length127(i8* %X, i8* %Y) nounwind {
3649; X86-LABEL: length127:
3650; X86:       # %bb.0:
3651; X86-NEXT:    pushl $0
3652; X86-NEXT:    pushl $127
3653; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3654; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3655; X86-NEXT:    calll memcmp
3656; X86-NEXT:    addl $16, %esp
3657; X86-NEXT:    retl
3658;
3659; X64-LABEL: length127:
3660; X64:       # %bb.0:
3661; X64-NEXT:    movl $127, %edx
3662; X64-NEXT:    jmp memcmp # TAILCALL
3663  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 127) nounwind
3664  ret i32 %m
3665}
3666
3667define i1 @length127_eq(i8* %x, i8* %y) nounwind {
3668; X86-LABEL: length127_eq:
3669; X86:       # %bb.0:
3670; X86-NEXT:    pushl $0
3671; X86-NEXT:    pushl $127
3672; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3673; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3674; X86-NEXT:    calll memcmp
3675; X86-NEXT:    addl $16, %esp
3676; X86-NEXT:    testl %eax, %eax
3677; X86-NEXT:    setne %al
3678; X86-NEXT:    retl
3679;
3680; X64-SSE-LABEL: length127_eq:
3681; X64-SSE:       # %bb.0:
3682; X64-SSE-NEXT:    pushq %rax
3683; X64-SSE-NEXT:    movl $127, %edx
3684; X64-SSE-NEXT:    callq memcmp
3685; X64-SSE-NEXT:    testl %eax, %eax
3686; X64-SSE-NEXT:    setne %al
3687; X64-SSE-NEXT:    popq %rcx
3688; X64-SSE-NEXT:    retq
3689;
3690; X64-AVX1-LABEL: length127_eq:
3691; X64-AVX1:       # %bb.0:
3692; X64-AVX1-NEXT:    pushq %rax
3693; X64-AVX1-NEXT:    movl $127, %edx
3694; X64-AVX1-NEXT:    callq memcmp
3695; X64-AVX1-NEXT:    testl %eax, %eax
3696; X64-AVX1-NEXT:    setne %al
3697; X64-AVX1-NEXT:    popq %rcx
3698; X64-AVX1-NEXT:    retq
3699;
3700; X64-AVX2-LABEL: length127_eq:
3701; X64-AVX2:       # %bb.0:
3702; X64-AVX2-NEXT:    pushq %rax
3703; X64-AVX2-NEXT:    movl $127, %edx
3704; X64-AVX2-NEXT:    callq memcmp
3705; X64-AVX2-NEXT:    testl %eax, %eax
3706; X64-AVX2-NEXT:    setne %al
3707; X64-AVX2-NEXT:    popq %rcx
3708; X64-AVX2-NEXT:    retq
3709;
3710; X64-AVX512BW-LABEL: length127_eq:
3711; X64-AVX512BW:       # %bb.0:
3712; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
3713; X64-AVX512BW-NEXT:    vmovdqu64 63(%rdi), %zmm1
3714; X64-AVX512BW-NEXT:    vpcmpneqb 63(%rsi), %zmm1, %k0
3715; X64-AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k1
3716; X64-AVX512BW-NEXT:    kortestq %k0, %k1
3717; X64-AVX512BW-NEXT:    setne %al
3718; X64-AVX512BW-NEXT:    vzeroupper
3719; X64-AVX512BW-NEXT:    retq
3720;
3721; X64-AVX512F-LABEL: length127_eq:
3722; X64-AVX512F:       # %bb.0:
3723; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3724; X64-AVX512F-NEXT:    vmovdqu64 63(%rdi), %zmm1
3725; X64-AVX512F-NEXT:    vpcmpneqd 63(%rsi), %zmm1, %k0
3726; X64-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k1
3727; X64-AVX512F-NEXT:    kortestw %k0, %k1
3728; X64-AVX512F-NEXT:    setne %al
3729; X64-AVX512F-NEXT:    vzeroupper
3730; X64-AVX512F-NEXT:    retq
3731;
3732; X64-MIC-AVX2-LABEL: length127_eq:
3733; X64-MIC-AVX2:       # %bb.0:
3734; X64-MIC-AVX2-NEXT:    pushq %rax
3735; X64-MIC-AVX2-NEXT:    movl $127, %edx
3736; X64-MIC-AVX2-NEXT:    callq memcmp
3737; X64-MIC-AVX2-NEXT:    testl %eax, %eax
3738; X64-MIC-AVX2-NEXT:    setne %al
3739; X64-MIC-AVX2-NEXT:    popq %rcx
3740; X64-MIC-AVX2-NEXT:    retq
3741;
3742; X64-MIC-AVX512F-LABEL: length127_eq:
3743; X64-MIC-AVX512F:       # %bb.0:
3744; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3745; X64-MIC-AVX512F-NEXT:    vmovdqu64 63(%rdi), %zmm1
3746; X64-MIC-AVX512F-NEXT:    vpcmpneqd 63(%rsi), %zmm1, %k0
3747; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k1
3748; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
3749; X64-MIC-AVX512F-NEXT:    setne %al
3750; X64-MIC-AVX512F-NEXT:    vzeroupper
3751; X64-MIC-AVX512F-NEXT:    retq
3752  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 127) nounwind
3753  %cmp = icmp ne i32 %call, 0
3754  ret i1 %cmp
3755}
3756
3757define i1 @length127_lt(i8* %x, i8* %y) nounwind {
3758; X86-LABEL: length127_lt:
3759; X86:       # %bb.0:
3760; X86-NEXT:    pushl $0
3761; X86-NEXT:    pushl $127
3762; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3763; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3764; X86-NEXT:    calll memcmp
3765; X86-NEXT:    addl $16, %esp
3766; X86-NEXT:    shrl $31, %eax
3767; X86-NEXT:    # kill: def $al killed $al killed $eax
3768; X86-NEXT:    retl
3769;
3770; X64-LABEL: length127_lt:
3771; X64:       # %bb.0:
3772; X64-NEXT:    pushq %rax
3773; X64-NEXT:    movl $127, %edx
3774; X64-NEXT:    callq memcmp
3775; X64-NEXT:    shrl $31, %eax
3776; X64-NEXT:    # kill: def $al killed $al killed $eax
3777; X64-NEXT:    popq %rcx
3778; X64-NEXT:    retq
3779  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 127) nounwind
3780  %cmp = icmp slt i32 %call, 0
3781  ret i1 %cmp
3782}
3783
3784define i1 @length127_gt(i8* %x, i8* %y) nounwind {
3785; X86-LABEL: length127_gt:
3786; X86:       # %bb.0:
3787; X86-NEXT:    pushl $0
3788; X86-NEXT:    pushl $127
3789; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3790; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3791; X86-NEXT:    calll memcmp
3792; X86-NEXT:    addl $16, %esp
3793; X86-NEXT:    testl %eax, %eax
3794; X86-NEXT:    setg %al
3795; X86-NEXT:    retl
3796;
3797; X64-LABEL: length127_gt:
3798; X64:       # %bb.0:
3799; X64-NEXT:    pushq %rax
3800; X64-NEXT:    movl $127, %edx
3801; X64-NEXT:    callq memcmp
3802; X64-NEXT:    testl %eax, %eax
3803; X64-NEXT:    setg %al
3804; X64-NEXT:    popq %rcx
3805; X64-NEXT:    retq
3806  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 127) nounwind
3807  %cmp = icmp sgt i32 %call, 0
3808  ret i1 %cmp
3809}
3810
3811define i1 @length127_eq_const(i8* %X) nounwind {
3812; X86-LABEL: length127_eq_const:
3813; X86:       # %bb.0:
3814; X86-NEXT:    pushl $0
3815; X86-NEXT:    pushl $127
3816; X86-NEXT:    pushl $.L.str
3817; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3818; X86-NEXT:    calll memcmp
3819; X86-NEXT:    addl $16, %esp
3820; X86-NEXT:    testl %eax, %eax
3821; X86-NEXT:    sete %al
3822; X86-NEXT:    retl
3823;
3824; X64-SSE-LABEL: length127_eq_const:
3825; X64-SSE:       # %bb.0:
3826; X64-SSE-NEXT:    pushq %rax
3827; X64-SSE-NEXT:    movl $.L.str, %esi
3828; X64-SSE-NEXT:    movl $127, %edx
3829; X64-SSE-NEXT:    callq memcmp
3830; X64-SSE-NEXT:    testl %eax, %eax
3831; X64-SSE-NEXT:    sete %al
3832; X64-SSE-NEXT:    popq %rcx
3833; X64-SSE-NEXT:    retq
3834;
3835; X64-AVX1-LABEL: length127_eq_const:
3836; X64-AVX1:       # %bb.0:
3837; X64-AVX1-NEXT:    pushq %rax
3838; X64-AVX1-NEXT:    movl $.L.str, %esi
3839; X64-AVX1-NEXT:    movl $127, %edx
3840; X64-AVX1-NEXT:    callq memcmp
3841; X64-AVX1-NEXT:    testl %eax, %eax
3842; X64-AVX1-NEXT:    sete %al
3843; X64-AVX1-NEXT:    popq %rcx
3844; X64-AVX1-NEXT:    retq
3845;
3846; X64-AVX2-LABEL: length127_eq_const:
3847; X64-AVX2:       # %bb.0:
3848; X64-AVX2-NEXT:    pushq %rax
3849; X64-AVX2-NEXT:    movl $.L.str, %esi
3850; X64-AVX2-NEXT:    movl $127, %edx
3851; X64-AVX2-NEXT:    callq memcmp
3852; X64-AVX2-NEXT:    testl %eax, %eax
3853; X64-AVX2-NEXT:    sete %al
3854; X64-AVX2-NEXT:    popq %rcx
3855; X64-AVX2-NEXT:    retq
3856;
3857; X64-AVX512BW-LABEL: length127_eq_const:
3858; X64-AVX512BW:       # %bb.0:
3859; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
3860; X64-AVX512BW-NEXT:    vmovdqu64 63(%rdi), %zmm1
3861; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+{{.*}}(%rip), %zmm1, %k0
3862; X64-AVX512BW-NEXT:    vpcmpneqb {{.*}}(%rip), %zmm0, %k1
3863; X64-AVX512BW-NEXT:    kortestq %k0, %k1
3864; X64-AVX512BW-NEXT:    sete %al
3865; X64-AVX512BW-NEXT:    vzeroupper
3866; X64-AVX512BW-NEXT:    retq
3867;
3868; X64-AVX512F-LABEL: length127_eq_const:
3869; X64-AVX512F:       # %bb.0:
3870; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3871; X64-AVX512F-NEXT:    vmovdqu64 63(%rdi), %zmm1
3872; X64-AVX512F-NEXT:    vpcmpneqd .L.str+{{.*}}(%rip), %zmm1, %k0
3873; X64-AVX512F-NEXT:    vpcmpneqd {{.*}}(%rip), %zmm0, %k1
3874; X64-AVX512F-NEXT:    kortestw %k0, %k1
3875; X64-AVX512F-NEXT:    sete %al
3876; X64-AVX512F-NEXT:    vzeroupper
3877; X64-AVX512F-NEXT:    retq
3878;
3879; X64-MIC-AVX2-LABEL: length127_eq_const:
3880; X64-MIC-AVX2:       # %bb.0:
3881; X64-MIC-AVX2-NEXT:    pushq %rax
3882; X64-MIC-AVX2-NEXT:    movl $.L.str, %esi
3883; X64-MIC-AVX2-NEXT:    movl $127, %edx
3884; X64-MIC-AVX2-NEXT:    callq memcmp
3885; X64-MIC-AVX2-NEXT:    testl %eax, %eax
3886; X64-MIC-AVX2-NEXT:    sete %al
3887; X64-MIC-AVX2-NEXT:    popq %rcx
3888; X64-MIC-AVX2-NEXT:    retq
3889;
3890; X64-MIC-AVX512F-LABEL: length127_eq_const:
3891; X64-MIC-AVX512F:       # %bb.0:
3892; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3893; X64-MIC-AVX512F-NEXT:    vmovdqu64 63(%rdi), %zmm1
3894; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+{{.*}}(%rip), %zmm1, %k0
3895; X64-MIC-AVX512F-NEXT:    vpcmpneqd {{.*}}(%rip), %zmm0, %k1
3896; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
3897; X64-MIC-AVX512F-NEXT:    sete %al
3898; X64-MIC-AVX512F-NEXT:    vzeroupper
3899; X64-MIC-AVX512F-NEXT:    retq
3900  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 127) nounwind
3901  %c = icmp eq i32 %m, 0
3902  ret i1 %c
3903}
3904
3905define i32 @length128(i8* %X, i8* %Y) nounwind {
3906; X86-LABEL: length128:
3907; X86:       # %bb.0:
3908; X86-NEXT:    pushl $0
3909; X86-NEXT:    pushl $128
3910; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3911; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3912; X86-NEXT:    calll memcmp
3913; X86-NEXT:    addl $16, %esp
3914; X86-NEXT:    retl
3915;
3916; X64-LABEL: length128:
3917; X64:       # %bb.0:
3918; X64-NEXT:    movl $128, %edx
3919; X64-NEXT:    jmp memcmp # TAILCALL
3920  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 128) nounwind
3921  ret i32 %m
3922}
3923
3924define i1 @length128_eq(i8* %x, i8* %y) nounwind {
3925; X86-LABEL: length128_eq:
3926; X86:       # %bb.0:
3927; X86-NEXT:    pushl $0
3928; X86-NEXT:    pushl $128
3929; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3930; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3931; X86-NEXT:    calll memcmp
3932; X86-NEXT:    addl $16, %esp
3933; X86-NEXT:    testl %eax, %eax
3934; X86-NEXT:    setne %al
3935; X86-NEXT:    retl
3936;
3937; X64-SSE-LABEL: length128_eq:
3938; X64-SSE:       # %bb.0:
3939; X64-SSE-NEXT:    pushq %rax
3940; X64-SSE-NEXT:    movl $128, %edx
3941; X64-SSE-NEXT:    callq memcmp
3942; X64-SSE-NEXT:    testl %eax, %eax
3943; X64-SSE-NEXT:    setne %al
3944; X64-SSE-NEXT:    popq %rcx
3945; X64-SSE-NEXT:    retq
3946;
3947; X64-AVX1-LABEL: length128_eq:
3948; X64-AVX1:       # %bb.0:
3949; X64-AVX1-NEXT:    pushq %rax
3950; X64-AVX1-NEXT:    movl $128, %edx
3951; X64-AVX1-NEXT:    callq memcmp
3952; X64-AVX1-NEXT:    testl %eax, %eax
3953; X64-AVX1-NEXT:    setne %al
3954; X64-AVX1-NEXT:    popq %rcx
3955; X64-AVX1-NEXT:    retq
3956;
3957; X64-AVX2-LABEL: length128_eq:
3958; X64-AVX2:       # %bb.0:
3959; X64-AVX2-NEXT:    pushq %rax
3960; X64-AVX2-NEXT:    movl $128, %edx
3961; X64-AVX2-NEXT:    callq memcmp
3962; X64-AVX2-NEXT:    testl %eax, %eax
3963; X64-AVX2-NEXT:    setne %al
3964; X64-AVX2-NEXT:    popq %rcx
3965; X64-AVX2-NEXT:    retq
3966;
3967; X64-AVX512BW-LABEL: length128_eq:
3968; X64-AVX512BW:       # %bb.0:
3969; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
3970; X64-AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
3971; X64-AVX512BW-NEXT:    vpcmpneqb 64(%rsi), %zmm1, %k0
3972; X64-AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k1
3973; X64-AVX512BW-NEXT:    kortestq %k0, %k1
3974; X64-AVX512BW-NEXT:    setne %al
3975; X64-AVX512BW-NEXT:    vzeroupper
3976; X64-AVX512BW-NEXT:    retq
3977;
3978; X64-AVX512F-LABEL: length128_eq:
3979; X64-AVX512F:       # %bb.0:
3980; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3981; X64-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
3982; X64-AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k0
3983; X64-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k1
3984; X64-AVX512F-NEXT:    kortestw %k0, %k1
3985; X64-AVX512F-NEXT:    setne %al
3986; X64-AVX512F-NEXT:    vzeroupper
3987; X64-AVX512F-NEXT:    retq
3988;
3989; X64-MIC-AVX2-LABEL: length128_eq:
3990; X64-MIC-AVX2:       # %bb.0:
3991; X64-MIC-AVX2-NEXT:    pushq %rax
3992; X64-MIC-AVX2-NEXT:    movl $128, %edx
3993; X64-MIC-AVX2-NEXT:    callq memcmp
3994; X64-MIC-AVX2-NEXT:    testl %eax, %eax
3995; X64-MIC-AVX2-NEXT:    setne %al
3996; X64-MIC-AVX2-NEXT:    popq %rcx
3997; X64-MIC-AVX2-NEXT:    retq
3998;
3999; X64-MIC-AVX512F-LABEL: length128_eq:
4000; X64-MIC-AVX512F:       # %bb.0:
4001; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
4002; X64-MIC-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
4003; X64-MIC-AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k0
4004; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k1
4005; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
4006; X64-MIC-AVX512F-NEXT:    setne %al
4007; X64-MIC-AVX512F-NEXT:    vzeroupper
4008; X64-MIC-AVX512F-NEXT:    retq
4009  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 128) nounwind
4010  %cmp = icmp ne i32 %call, 0
4011  ret i1 %cmp
4012}
4013
4014define i1 @length128_lt(i8* %x, i8* %y) nounwind {
4015; X86-LABEL: length128_lt:
4016; X86:       # %bb.0:
4017; X86-NEXT:    pushl $0
4018; X86-NEXT:    pushl $128
4019; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4020; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4021; X86-NEXT:    calll memcmp
4022; X86-NEXT:    addl $16, %esp
4023; X86-NEXT:    shrl $31, %eax
4024; X86-NEXT:    # kill: def $al killed $al killed $eax
4025; X86-NEXT:    retl
4026;
4027; X64-LABEL: length128_lt:
4028; X64:       # %bb.0:
4029; X64-NEXT:    pushq %rax
4030; X64-NEXT:    movl $128, %edx
4031; X64-NEXT:    callq memcmp
4032; X64-NEXT:    shrl $31, %eax
4033; X64-NEXT:    # kill: def $al killed $al killed $eax
4034; X64-NEXT:    popq %rcx
4035; X64-NEXT:    retq
4036  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 128) nounwind
4037  %cmp = icmp slt i32 %call, 0
4038  ret i1 %cmp
4039}
4040
4041define i1 @length128_gt(i8* %x, i8* %y) nounwind {
4042; X86-LABEL: length128_gt:
4043; X86:       # %bb.0:
4044; X86-NEXT:    pushl $0
4045; X86-NEXT:    pushl $128
4046; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4047; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4048; X86-NEXT:    calll memcmp
4049; X86-NEXT:    addl $16, %esp
4050; X86-NEXT:    testl %eax, %eax
4051; X86-NEXT:    setg %al
4052; X86-NEXT:    retl
4053;
4054; X64-LABEL: length128_gt:
4055; X64:       # %bb.0:
4056; X64-NEXT:    pushq %rax
4057; X64-NEXT:    movl $128, %edx
4058; X64-NEXT:    callq memcmp
4059; X64-NEXT:    testl %eax, %eax
4060; X64-NEXT:    setg %al
4061; X64-NEXT:    popq %rcx
4062; X64-NEXT:    retq
4063  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 128) nounwind
4064  %cmp = icmp sgt i32 %call, 0
4065  ret i1 %cmp
4066}
4067
4068define i1 @length128_eq_const(i8* %X) nounwind {
4069; X86-LABEL: length128_eq_const:
4070; X86:       # %bb.0:
4071; X86-NEXT:    pushl $0
4072; X86-NEXT:    pushl $128
4073; X86-NEXT:    pushl $.L.str
4074; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4075; X86-NEXT:    calll memcmp
4076; X86-NEXT:    addl $16, %esp
4077; X86-NEXT:    testl %eax, %eax
4078; X86-NEXT:    sete %al
4079; X86-NEXT:    retl
4080;
4081; X64-SSE-LABEL: length128_eq_const:
4082; X64-SSE:       # %bb.0:
4083; X64-SSE-NEXT:    pushq %rax
4084; X64-SSE-NEXT:    movl $.L.str, %esi
4085; X64-SSE-NEXT:    movl $128, %edx
4086; X64-SSE-NEXT:    callq memcmp
4087; X64-SSE-NEXT:    testl %eax, %eax
4088; X64-SSE-NEXT:    sete %al
4089; X64-SSE-NEXT:    popq %rcx
4090; X64-SSE-NEXT:    retq
4091;
4092; X64-AVX1-LABEL: length128_eq_const:
4093; X64-AVX1:       # %bb.0:
4094; X64-AVX1-NEXT:    pushq %rax
4095; X64-AVX1-NEXT:    movl $.L.str, %esi
4096; X64-AVX1-NEXT:    movl $128, %edx
4097; X64-AVX1-NEXT:    callq memcmp
4098; X64-AVX1-NEXT:    testl %eax, %eax
4099; X64-AVX1-NEXT:    sete %al
4100; X64-AVX1-NEXT:    popq %rcx
4101; X64-AVX1-NEXT:    retq
4102;
4103; X64-AVX2-LABEL: length128_eq_const:
4104; X64-AVX2:       # %bb.0:
4105; X64-AVX2-NEXT:    pushq %rax
4106; X64-AVX2-NEXT:    movl $.L.str, %esi
4107; X64-AVX2-NEXT:    movl $128, %edx
4108; X64-AVX2-NEXT:    callq memcmp
4109; X64-AVX2-NEXT:    testl %eax, %eax
4110; X64-AVX2-NEXT:    sete %al
4111; X64-AVX2-NEXT:    popq %rcx
4112; X64-AVX2-NEXT:    retq
4113;
4114; X64-AVX512BW-LABEL: length128_eq_const:
4115; X64-AVX512BW:       # %bb.0:
4116; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
4117; X64-AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
4118; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+{{.*}}(%rip), %zmm1, %k0
4119; X64-AVX512BW-NEXT:    vpcmpneqb {{.*}}(%rip), %zmm0, %k1
4120; X64-AVX512BW-NEXT:    kortestq %k0, %k1
4121; X64-AVX512BW-NEXT:    sete %al
4122; X64-AVX512BW-NEXT:    vzeroupper
4123; X64-AVX512BW-NEXT:    retq
4124;
4125; X64-AVX512F-LABEL: length128_eq_const:
4126; X64-AVX512F:       # %bb.0:
4127; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
4128; X64-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
4129; X64-AVX512F-NEXT:    vpcmpneqd .L.str+{{.*}}(%rip), %zmm1, %k0
4130; X64-AVX512F-NEXT:    vpcmpneqd {{.*}}(%rip), %zmm0, %k1
4131; X64-AVX512F-NEXT:    kortestw %k0, %k1
4132; X64-AVX512F-NEXT:    sete %al
4133; X64-AVX512F-NEXT:    vzeroupper
4134; X64-AVX512F-NEXT:    retq
4135;
4136; X64-MIC-AVX2-LABEL: length128_eq_const:
4137; X64-MIC-AVX2:       # %bb.0:
4138; X64-MIC-AVX2-NEXT:    pushq %rax
4139; X64-MIC-AVX2-NEXT:    movl $.L.str, %esi
4140; X64-MIC-AVX2-NEXT:    movl $128, %edx
4141; X64-MIC-AVX2-NEXT:    callq memcmp
4142; X64-MIC-AVX2-NEXT:    testl %eax, %eax
4143; X64-MIC-AVX2-NEXT:    sete %al
4144; X64-MIC-AVX2-NEXT:    popq %rcx
4145; X64-MIC-AVX2-NEXT:    retq
4146;
4147; X64-MIC-AVX512F-LABEL: length128_eq_const:
4148; X64-MIC-AVX512F:       # %bb.0:
4149; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
4150; X64-MIC-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
4151; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+{{.*}}(%rip), %zmm1, %k0
4152; X64-MIC-AVX512F-NEXT:    vpcmpneqd {{.*}}(%rip), %zmm0, %k1
4153; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
4154; X64-MIC-AVX512F-NEXT:    sete %al
4155; X64-MIC-AVX512F-NEXT:    vzeroupper
4156; X64-MIC-AVX512F-NEXT:    retq
4157  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 128) nounwind
4158  %c = icmp eq i32 %m, 0
4159  ret i1 %c
4160}
4161
4162define i32 @length192(i8* %X, i8* %Y) nounwind {
4163; X86-LABEL: length192:
4164; X86:       # %bb.0:
4165; X86-NEXT:    pushl $0
4166; X86-NEXT:    pushl $192
4167; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4168; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4169; X86-NEXT:    calll memcmp
4170; X86-NEXT:    addl $16, %esp
4171; X86-NEXT:    retl
4172;
4173; X64-LABEL: length192:
4174; X64:       # %bb.0:
4175; X64-NEXT:    movl $192, %edx
4176; X64-NEXT:    jmp memcmp # TAILCALL
4177  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 192) nounwind
4178  ret i32 %m
4179}
4180
4181define i1 @length192_eq(i8* %x, i8* %y) nounwind {
4182; X86-LABEL: length192_eq:
4183; X86:       # %bb.0:
4184; X86-NEXT:    pushl $0
4185; X86-NEXT:    pushl $192
4186; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4187; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4188; X86-NEXT:    calll memcmp
4189; X86-NEXT:    addl $16, %esp
4190; X86-NEXT:    testl %eax, %eax
4191; X86-NEXT:    setne %al
4192; X86-NEXT:    retl
4193;
4194; X64-LABEL: length192_eq:
4195; X64:       # %bb.0:
4196; X64-NEXT:    pushq %rax
4197; X64-NEXT:    movl $192, %edx
4198; X64-NEXT:    callq memcmp
4199; X64-NEXT:    testl %eax, %eax
4200; X64-NEXT:    setne %al
4201; X64-NEXT:    popq %rcx
4202; X64-NEXT:    retq
4203  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 192) nounwind
4204  %cmp = icmp ne i32 %call, 0
4205  ret i1 %cmp
4206}
4207
4208define i1 @length192_lt(i8* %x, i8* %y) nounwind {
4209; X86-LABEL: length192_lt:
4210; X86:       # %bb.0:
4211; X86-NEXT:    pushl $0
4212; X86-NEXT:    pushl $192
4213; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4214; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4215; X86-NEXT:    calll memcmp
4216; X86-NEXT:    addl $16, %esp
4217; X86-NEXT:    shrl $31, %eax
4218; X86-NEXT:    # kill: def $al killed $al killed $eax
4219; X86-NEXT:    retl
4220;
4221; X64-LABEL: length192_lt:
4222; X64:       # %bb.0:
4223; X64-NEXT:    pushq %rax
4224; X64-NEXT:    movl $192, %edx
4225; X64-NEXT:    callq memcmp
4226; X64-NEXT:    shrl $31, %eax
4227; X64-NEXT:    # kill: def $al killed $al killed $eax
4228; X64-NEXT:    popq %rcx
4229; X64-NEXT:    retq
4230  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 192) nounwind
4231  %cmp = icmp slt i32 %call, 0
4232  ret i1 %cmp
4233}
4234
4235define i1 @length192_gt(i8* %x, i8* %y) nounwind {
4236; X86-LABEL: length192_gt:
4237; X86:       # %bb.0:
4238; X86-NEXT:    pushl $0
4239; X86-NEXT:    pushl $192
4240; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4241; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4242; X86-NEXT:    calll memcmp
4243; X86-NEXT:    addl $16, %esp
4244; X86-NEXT:    testl %eax, %eax
4245; X86-NEXT:    setg %al
4246; X86-NEXT:    retl
4247;
4248; X64-LABEL: length192_gt:
4249; X64:       # %bb.0:
4250; X64-NEXT:    pushq %rax
4251; X64-NEXT:    movl $192, %edx
4252; X64-NEXT:    callq memcmp
4253; X64-NEXT:    testl %eax, %eax
4254; X64-NEXT:    setg %al
4255; X64-NEXT:    popq %rcx
4256; X64-NEXT:    retq
4257  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 192) nounwind
4258  %cmp = icmp sgt i32 %call, 0
4259  ret i1 %cmp
4260}
4261
4262define i1 @length192_eq_const(i8* %X) nounwind {
4263; X86-LABEL: length192_eq_const:
4264; X86:       # %bb.0:
4265; X86-NEXT:    pushl $0
4266; X86-NEXT:    pushl $192
4267; X86-NEXT:    pushl $.L.str
4268; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4269; X86-NEXT:    calll memcmp
4270; X86-NEXT:    addl $16, %esp
4271; X86-NEXT:    testl %eax, %eax
4272; X86-NEXT:    sete %al
4273; X86-NEXT:    retl
4274;
4275; X64-LABEL: length192_eq_const:
4276; X64:       # %bb.0:
4277; X64-NEXT:    pushq %rax
4278; X64-NEXT:    movl $.L.str, %esi
4279; X64-NEXT:    movl $192, %edx
4280; X64-NEXT:    callq memcmp
4281; X64-NEXT:    testl %eax, %eax
4282; X64-NEXT:    sete %al
4283; X64-NEXT:    popq %rcx
4284; X64-NEXT:    retq
4285  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 192) nounwind
4286  %c = icmp eq i32 %m, 0
4287  ret i1 %c
4288}
4289
4290define i32 @length255(i8* %X, i8* %Y) nounwind {
4291; X86-LABEL: length255:
4292; X86:       # %bb.0:
4293; X86-NEXT:    pushl $0
4294; X86-NEXT:    pushl $255
4295; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4296; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4297; X86-NEXT:    calll memcmp
4298; X86-NEXT:    addl $16, %esp
4299; X86-NEXT:    retl
4300;
4301; X64-LABEL: length255:
4302; X64:       # %bb.0:
4303; X64-NEXT:    movl $255, %edx
4304; X64-NEXT:    jmp memcmp # TAILCALL
4305  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 255) nounwind
4306  ret i32 %m
4307}
4308
4309define i1 @length255_eq(i8* %x, i8* %y) nounwind {
4310; X86-LABEL: length255_eq:
4311; X86:       # %bb.0:
4312; X86-NEXT:    pushl $0
4313; X86-NEXT:    pushl $255
4314; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4315; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4316; X86-NEXT:    calll memcmp
4317; X86-NEXT:    addl $16, %esp
4318; X86-NEXT:    testl %eax, %eax
4319; X86-NEXT:    setne %al
4320; X86-NEXT:    retl
4321;
4322; X64-LABEL: length255_eq:
4323; X64:       # %bb.0:
4324; X64-NEXT:    pushq %rax
4325; X64-NEXT:    movl $255, %edx
4326; X64-NEXT:    callq memcmp
4327; X64-NEXT:    testl %eax, %eax
4328; X64-NEXT:    setne %al
4329; X64-NEXT:    popq %rcx
4330; X64-NEXT:    retq
4331  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 255) nounwind
4332  %cmp = icmp ne i32 %call, 0
4333  ret i1 %cmp
4334}
4335
4336define i1 @length255_lt(i8* %x, i8* %y) nounwind {
4337; X86-LABEL: length255_lt:
4338; X86:       # %bb.0:
4339; X86-NEXT:    pushl $0
4340; X86-NEXT:    pushl $255
4341; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4342; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4343; X86-NEXT:    calll memcmp
4344; X86-NEXT:    addl $16, %esp
4345; X86-NEXT:    shrl $31, %eax
4346; X86-NEXT:    # kill: def $al killed $al killed $eax
4347; X86-NEXT:    retl
4348;
4349; X64-LABEL: length255_lt:
4350; X64:       # %bb.0:
4351; X64-NEXT:    pushq %rax
4352; X64-NEXT:    movl $255, %edx
4353; X64-NEXT:    callq memcmp
4354; X64-NEXT:    shrl $31, %eax
4355; X64-NEXT:    # kill: def $al killed $al killed $eax
4356; X64-NEXT:    popq %rcx
4357; X64-NEXT:    retq
4358  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 255) nounwind
4359  %cmp = icmp slt i32 %call, 0
4360  ret i1 %cmp
4361}
4362
4363define i1 @length255_gt(i8* %x, i8* %y) nounwind {
4364; X86-LABEL: length255_gt:
4365; X86:       # %bb.0:
4366; X86-NEXT:    pushl $0
4367; X86-NEXT:    pushl $255
4368; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4369; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4370; X86-NEXT:    calll memcmp
4371; X86-NEXT:    addl $16, %esp
4372; X86-NEXT:    testl %eax, %eax
4373; X86-NEXT:    setg %al
4374; X86-NEXT:    retl
4375;
4376; X64-LABEL: length255_gt:
4377; X64:       # %bb.0:
4378; X64-NEXT:    pushq %rax
4379; X64-NEXT:    movl $255, %edx
4380; X64-NEXT:    callq memcmp
4381; X64-NEXT:    testl %eax, %eax
4382; X64-NEXT:    setg %al
4383; X64-NEXT:    popq %rcx
4384; X64-NEXT:    retq
4385  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 255) nounwind
4386  %cmp = icmp sgt i32 %call, 0
4387  ret i1 %cmp
4388}
4389
4390define i1 @length255_eq_const(i8* %X) nounwind {
4391; X86-LABEL: length255_eq_const:
4392; X86:       # %bb.0:
4393; X86-NEXT:    pushl $0
4394; X86-NEXT:    pushl $255
4395; X86-NEXT:    pushl $.L.str
4396; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4397; X86-NEXT:    calll memcmp
4398; X86-NEXT:    addl $16, %esp
4399; X86-NEXT:    testl %eax, %eax
4400; X86-NEXT:    sete %al
4401; X86-NEXT:    retl
4402;
4403; X64-LABEL: length255_eq_const:
4404; X64:       # %bb.0:
4405; X64-NEXT:    pushq %rax
4406; X64-NEXT:    movl $.L.str, %esi
4407; X64-NEXT:    movl $255, %edx
4408; X64-NEXT:    callq memcmp
4409; X64-NEXT:    testl %eax, %eax
4410; X64-NEXT:    sete %al
4411; X64-NEXT:    popq %rcx
4412; X64-NEXT:    retq
4413  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 255) nounwind
4414  %c = icmp eq i32 %m, 0
4415  ret i1 %c
4416}
4417
4418define i32 @length256(i8* %X, i8* %Y) nounwind {
4419; X86-LABEL: length256:
4420; X86:       # %bb.0:
4421; X86-NEXT:    pushl $0
4422; X86-NEXT:    pushl $256 # imm = 0x100
4423; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4424; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4425; X86-NEXT:    calll memcmp
4426; X86-NEXT:    addl $16, %esp
4427; X86-NEXT:    retl
4428;
4429; X64-LABEL: length256:
4430; X64:       # %bb.0:
4431; X64-NEXT:    movl $256, %edx # imm = 0x100
4432; X64-NEXT:    jmp memcmp # TAILCALL
4433  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 256) nounwind
4434  ret i32 %m
4435}
4436
4437define i1 @length256_eq(i8* %x, i8* %y) nounwind {
4438; X86-LABEL: length256_eq:
4439; X86:       # %bb.0:
4440; X86-NEXT:    pushl $0
4441; X86-NEXT:    pushl $256 # imm = 0x100
4442; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4443; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4444; X86-NEXT:    calll memcmp
4445; X86-NEXT:    addl $16, %esp
4446; X86-NEXT:    testl %eax, %eax
4447; X86-NEXT:    setne %al
4448; X86-NEXT:    retl
4449;
4450; X64-LABEL: length256_eq:
4451; X64:       # %bb.0:
4452; X64-NEXT:    pushq %rax
4453; X64-NEXT:    movl $256, %edx # imm = 0x100
4454; X64-NEXT:    callq memcmp
4455; X64-NEXT:    testl %eax, %eax
4456; X64-NEXT:    setne %al
4457; X64-NEXT:    popq %rcx
4458; X64-NEXT:    retq
4459  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 256) nounwind
4460  %cmp = icmp ne i32 %call, 0
4461  ret i1 %cmp
4462}
4463
4464define i1 @length256_lt(i8* %x, i8* %y) nounwind {
4465; X86-LABEL: length256_lt:
4466; X86:       # %bb.0:
4467; X86-NEXT:    pushl $0
4468; X86-NEXT:    pushl $256 # imm = 0x100
4469; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4470; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4471; X86-NEXT:    calll memcmp
4472; X86-NEXT:    addl $16, %esp
4473; X86-NEXT:    shrl $31, %eax
4474; X86-NEXT:    # kill: def $al killed $al killed $eax
4475; X86-NEXT:    retl
4476;
4477; X64-LABEL: length256_lt:
4478; X64:       # %bb.0:
4479; X64-NEXT:    pushq %rax
4480; X64-NEXT:    movl $256, %edx # imm = 0x100
4481; X64-NEXT:    callq memcmp
4482; X64-NEXT:    shrl $31, %eax
4483; X64-NEXT:    # kill: def $al killed $al killed $eax
4484; X64-NEXT:    popq %rcx
4485; X64-NEXT:    retq
4486  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 256) nounwind
4487  %cmp = icmp slt i32 %call, 0
4488  ret i1 %cmp
4489}
4490
4491define i1 @length256_gt(i8* %x, i8* %y) nounwind {
4492; X86-LABEL: length256_gt:
4493; X86:       # %bb.0:
4494; X86-NEXT:    pushl $0
4495; X86-NEXT:    pushl $256 # imm = 0x100
4496; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4497; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4498; X86-NEXT:    calll memcmp
4499; X86-NEXT:    addl $16, %esp
4500; X86-NEXT:    testl %eax, %eax
4501; X86-NEXT:    setg %al
4502; X86-NEXT:    retl
4503;
4504; X64-LABEL: length256_gt:
4505; X64:       # %bb.0:
4506; X64-NEXT:    pushq %rax
4507; X64-NEXT:    movl $256, %edx # imm = 0x100
4508; X64-NEXT:    callq memcmp
4509; X64-NEXT:    testl %eax, %eax
4510; X64-NEXT:    setg %al
4511; X64-NEXT:    popq %rcx
4512; X64-NEXT:    retq
4513  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 256) nounwind
4514  %cmp = icmp sgt i32 %call, 0
4515  ret i1 %cmp
4516}
4517
4518define i1 @length256_eq_const(i8* %X) nounwind {
4519; X86-LABEL: length256_eq_const:
4520; X86:       # %bb.0:
4521; X86-NEXT:    pushl $0
4522; X86-NEXT:    pushl $256 # imm = 0x100
4523; X86-NEXT:    pushl $.L.str
4524; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4525; X86-NEXT:    calll memcmp
4526; X86-NEXT:    addl $16, %esp
4527; X86-NEXT:    testl %eax, %eax
4528; X86-NEXT:    sete %al
4529; X86-NEXT:    retl
4530;
4531; X64-LABEL: length256_eq_const:
4532; X64:       # %bb.0:
4533; X64-NEXT:    pushq %rax
4534; X64-NEXT:    movl $.L.str, %esi
4535; X64-NEXT:    movl $256, %edx # imm = 0x100
4536; X64-NEXT:    callq memcmp
4537; X64-NEXT:    testl %eax, %eax
4538; X64-NEXT:    sete %al
4539; X64-NEXT:    popq %rcx
4540; X64-NEXT:    retq
4541  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 256) nounwind
4542  %c = icmp eq i32 %m, 0
4543  ret i1 %c
4544}
4545
4546define i32 @length384(i8* %X, i8* %Y) nounwind {
4547; X86-LABEL: length384:
4548; X86:       # %bb.0:
4549; X86-NEXT:    pushl $0
4550; X86-NEXT:    pushl $384 # imm = 0x180
4551; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4552; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4553; X86-NEXT:    calll memcmp
4554; X86-NEXT:    addl $16, %esp
4555; X86-NEXT:    retl
4556;
4557; X64-LABEL: length384:
4558; X64:       # %bb.0:
4559; X64-NEXT:    movl $384, %edx # imm = 0x180
4560; X64-NEXT:    jmp memcmp # TAILCALL
4561  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 384) nounwind
4562  ret i32 %m
4563}
4564
4565define i1 @length384_eq(i8* %x, i8* %y) nounwind {
4566; X86-LABEL: length384_eq:
4567; X86:       # %bb.0:
4568; X86-NEXT:    pushl $0
4569; X86-NEXT:    pushl $384 # imm = 0x180
4570; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4571; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4572; X86-NEXT:    calll memcmp
4573; X86-NEXT:    addl $16, %esp
4574; X86-NEXT:    testl %eax, %eax
4575; X86-NEXT:    setne %al
4576; X86-NEXT:    retl
4577;
4578; X64-LABEL: length384_eq:
4579; X64:       # %bb.0:
4580; X64-NEXT:    pushq %rax
4581; X64-NEXT:    movl $384, %edx # imm = 0x180
4582; X64-NEXT:    callq memcmp
4583; X64-NEXT:    testl %eax, %eax
4584; X64-NEXT:    setne %al
4585; X64-NEXT:    popq %rcx
4586; X64-NEXT:    retq
4587  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 384) nounwind
4588  %cmp = icmp ne i32 %call, 0
4589  ret i1 %cmp
4590}
4591
4592define i1 @length384_lt(i8* %x, i8* %y) nounwind {
4593; X86-LABEL: length384_lt:
4594; X86:       # %bb.0:
4595; X86-NEXT:    pushl $0
4596; X86-NEXT:    pushl $384 # imm = 0x180
4597; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4598; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4599; X86-NEXT:    calll memcmp
4600; X86-NEXT:    addl $16, %esp
4601; X86-NEXT:    shrl $31, %eax
4602; X86-NEXT:    # kill: def $al killed $al killed $eax
4603; X86-NEXT:    retl
4604;
4605; X64-LABEL: length384_lt:
4606; X64:       # %bb.0:
4607; X64-NEXT:    pushq %rax
4608; X64-NEXT:    movl $384, %edx # imm = 0x180
4609; X64-NEXT:    callq memcmp
4610; X64-NEXT:    shrl $31, %eax
4611; X64-NEXT:    # kill: def $al killed $al killed $eax
4612; X64-NEXT:    popq %rcx
4613; X64-NEXT:    retq
4614  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 384) nounwind
4615  %cmp = icmp slt i32 %call, 0
4616  ret i1 %cmp
4617}
4618
4619define i1 @length384_gt(i8* %x, i8* %y) nounwind {
4620; X86-LABEL: length384_gt:
4621; X86:       # %bb.0:
4622; X86-NEXT:    pushl $0
4623; X86-NEXT:    pushl $384 # imm = 0x180
4624; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4625; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4626; X86-NEXT:    calll memcmp
4627; X86-NEXT:    addl $16, %esp
4628; X86-NEXT:    testl %eax, %eax
4629; X86-NEXT:    setg %al
4630; X86-NEXT:    retl
4631;
4632; X64-LABEL: length384_gt:
4633; X64:       # %bb.0:
4634; X64-NEXT:    pushq %rax
4635; X64-NEXT:    movl $384, %edx # imm = 0x180
4636; X64-NEXT:    callq memcmp
4637; X64-NEXT:    testl %eax, %eax
4638; X64-NEXT:    setg %al
4639; X64-NEXT:    popq %rcx
4640; X64-NEXT:    retq
4641  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 384) nounwind
4642  %cmp = icmp sgt i32 %call, 0
4643  ret i1 %cmp
4644}
4645
4646define i1 @length384_eq_const(i8* %X) nounwind {
4647; X86-LABEL: length384_eq_const:
4648; X86:       # %bb.0:
4649; X86-NEXT:    pushl $0
4650; X86-NEXT:    pushl $384 # imm = 0x180
4651; X86-NEXT:    pushl $.L.str
4652; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4653; X86-NEXT:    calll memcmp
4654; X86-NEXT:    addl $16, %esp
4655; X86-NEXT:    testl %eax, %eax
4656; X86-NEXT:    sete %al
4657; X86-NEXT:    retl
4658;
4659; X64-LABEL: length384_eq_const:
4660; X64:       # %bb.0:
4661; X64-NEXT:    pushq %rax
4662; X64-NEXT:    movl $.L.str, %esi
4663; X64-NEXT:    movl $384, %edx # imm = 0x180
4664; X64-NEXT:    callq memcmp
4665; X64-NEXT:    testl %eax, %eax
4666; X64-NEXT:    sete %al
4667; X64-NEXT:    popq %rcx
4668; X64-NEXT:    retq
4669  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 384) nounwind
4670  %c = icmp eq i32 %m, 0
4671  ret i1 %c
4672}
4673
4674define i32 @length511(i8* %X, i8* %Y) nounwind {
4675; X86-LABEL: length511:
4676; X86:       # %bb.0:
4677; X86-NEXT:    pushl $0
4678; X86-NEXT:    pushl $511 # imm = 0x1FF
4679; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4680; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4681; X86-NEXT:    calll memcmp
4682; X86-NEXT:    addl $16, %esp
4683; X86-NEXT:    retl
4684;
4685; X64-LABEL: length511:
4686; X64:       # %bb.0:
4687; X64-NEXT:    movl $511, %edx # imm = 0x1FF
4688; X64-NEXT:    jmp memcmp # TAILCALL
4689  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 511) nounwind
4690  ret i32 %m
4691}
4692
4693define i1 @length511_eq(i8* %x, i8* %y) nounwind {
4694; X86-LABEL: length511_eq:
4695; X86:       # %bb.0:
4696; X86-NEXT:    pushl $0
4697; X86-NEXT:    pushl $511 # imm = 0x1FF
4698; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4699; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4700; X86-NEXT:    calll memcmp
4701; X86-NEXT:    addl $16, %esp
4702; X86-NEXT:    testl %eax, %eax
4703; X86-NEXT:    setne %al
4704; X86-NEXT:    retl
4705;
4706; X64-LABEL: length511_eq:
4707; X64:       # %bb.0:
4708; X64-NEXT:    pushq %rax
4709; X64-NEXT:    movl $511, %edx # imm = 0x1FF
4710; X64-NEXT:    callq memcmp
4711; X64-NEXT:    testl %eax, %eax
4712; X64-NEXT:    setne %al
4713; X64-NEXT:    popq %rcx
4714; X64-NEXT:    retq
4715  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 511) nounwind
4716  %cmp = icmp ne i32 %call, 0
4717  ret i1 %cmp
4718}
4719
4720define i1 @length511_lt(i8* %x, i8* %y) nounwind {
4721; X86-LABEL: length511_lt:
4722; X86:       # %bb.0:
4723; X86-NEXT:    pushl $0
4724; X86-NEXT:    pushl $511 # imm = 0x1FF
4725; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4726; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4727; X86-NEXT:    calll memcmp
4728; X86-NEXT:    addl $16, %esp
4729; X86-NEXT:    shrl $31, %eax
4730; X86-NEXT:    # kill: def $al killed $al killed $eax
4731; X86-NEXT:    retl
4732;
4733; X64-LABEL: length511_lt:
4734; X64:       # %bb.0:
4735; X64-NEXT:    pushq %rax
4736; X64-NEXT:    movl $511, %edx # imm = 0x1FF
4737; X64-NEXT:    callq memcmp
4738; X64-NEXT:    shrl $31, %eax
4739; X64-NEXT:    # kill: def $al killed $al killed $eax
4740; X64-NEXT:    popq %rcx
4741; X64-NEXT:    retq
4742  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 511) nounwind
4743  %cmp = icmp slt i32 %call, 0
4744  ret i1 %cmp
4745}
4746
4747define i1 @length511_gt(i8* %x, i8* %y) nounwind {
4748; X86-LABEL: length511_gt:
4749; X86:       # %bb.0:
4750; X86-NEXT:    pushl $0
4751; X86-NEXT:    pushl $511 # imm = 0x1FF
4752; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4753; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4754; X86-NEXT:    calll memcmp
4755; X86-NEXT:    addl $16, %esp
4756; X86-NEXT:    testl %eax, %eax
4757; X86-NEXT:    setg %al
4758; X86-NEXT:    retl
4759;
4760; X64-LABEL: length511_gt:
4761; X64:       # %bb.0:
4762; X64-NEXT:    pushq %rax
4763; X64-NEXT:    movl $511, %edx # imm = 0x1FF
4764; X64-NEXT:    callq memcmp
4765; X64-NEXT:    testl %eax, %eax
4766; X64-NEXT:    setg %al
4767; X64-NEXT:    popq %rcx
4768; X64-NEXT:    retq
4769  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 511) nounwind
4770  %cmp = icmp sgt i32 %call, 0
4771  ret i1 %cmp
4772}
4773
4774define i1 @length511_eq_const(i8* %X) nounwind {
4775; X86-LABEL: length511_eq_const:
4776; X86:       # %bb.0:
4777; X86-NEXT:    pushl $0
4778; X86-NEXT:    pushl $511 # imm = 0x1FF
4779; X86-NEXT:    pushl $.L.str
4780; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4781; X86-NEXT:    calll memcmp
4782; X86-NEXT:    addl $16, %esp
4783; X86-NEXT:    testl %eax, %eax
4784; X86-NEXT:    sete %al
4785; X86-NEXT:    retl
4786;
4787; X64-LABEL: length511_eq_const:
4788; X64:       # %bb.0:
4789; X64-NEXT:    pushq %rax
4790; X64-NEXT:    movl $.L.str, %esi
4791; X64-NEXT:    movl $511, %edx # imm = 0x1FF
4792; X64-NEXT:    callq memcmp
4793; X64-NEXT:    testl %eax, %eax
4794; X64-NEXT:    sete %al
4795; X64-NEXT:    popq %rcx
4796; X64-NEXT:    retq
4797  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 511) nounwind
4798  %c = icmp eq i32 %m, 0
4799  ret i1 %c
4800}
4801
4802define i32 @length512(i8* %X, i8* %Y) nounwind {
4803; X86-LABEL: length512:
4804; X86:       # %bb.0:
4805; X86-NEXT:    pushl $0
4806; X86-NEXT:    pushl $512 # imm = 0x200
4807; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4808; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4809; X86-NEXT:    calll memcmp
4810; X86-NEXT:    addl $16, %esp
4811; X86-NEXT:    retl
4812;
4813; X64-LABEL: length512:
4814; X64:       # %bb.0:
4815; X64-NEXT:    movl $512, %edx # imm = 0x200
4816; X64-NEXT:    jmp memcmp # TAILCALL
4817  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 512) nounwind
4818  ret i32 %m
4819}
4820
4821define i1 @length512_eq(i8* %x, i8* %y) nounwind {
4822; X86-LABEL: length512_eq:
4823; X86:       # %bb.0:
4824; X86-NEXT:    pushl $0
4825; X86-NEXT:    pushl $512 # imm = 0x200
4826; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4827; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4828; X86-NEXT:    calll memcmp
4829; X86-NEXT:    addl $16, %esp
4830; X86-NEXT:    testl %eax, %eax
4831; X86-NEXT:    setne %al
4832; X86-NEXT:    retl
4833;
4834; X64-LABEL: length512_eq:
4835; X64:       # %bb.0:
4836; X64-NEXT:    pushq %rax
4837; X64-NEXT:    movl $512, %edx # imm = 0x200
4838; X64-NEXT:    callq memcmp
4839; X64-NEXT:    testl %eax, %eax
4840; X64-NEXT:    setne %al
4841; X64-NEXT:    popq %rcx
4842; X64-NEXT:    retq
4843  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 512) nounwind
4844  %cmp = icmp ne i32 %call, 0
4845  ret i1 %cmp
4846}
4847
4848define i1 @length512_lt(i8* %x, i8* %y) nounwind {
4849; X86-LABEL: length512_lt:
4850; X86:       # %bb.0:
4851; X86-NEXT:    pushl $0
4852; X86-NEXT:    pushl $512 # imm = 0x200
4853; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4854; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4855; X86-NEXT:    calll memcmp
4856; X86-NEXT:    addl $16, %esp
4857; X86-NEXT:    shrl $31, %eax
4858; X86-NEXT:    # kill: def $al killed $al killed $eax
4859; X86-NEXT:    retl
4860;
4861; X64-LABEL: length512_lt:
4862; X64:       # %bb.0:
4863; X64-NEXT:    pushq %rax
4864; X64-NEXT:    movl $512, %edx # imm = 0x200
4865; X64-NEXT:    callq memcmp
4866; X64-NEXT:    shrl $31, %eax
4867; X64-NEXT:    # kill: def $al killed $al killed $eax
4868; X64-NEXT:    popq %rcx
4869; X64-NEXT:    retq
4870  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 512) nounwind
4871  %cmp = icmp slt i32 %call, 0
4872  ret i1 %cmp
4873}
4874
4875define i1 @length512_gt(i8* %x, i8* %y) nounwind {
4876; X86-LABEL: length512_gt:
4877; X86:       # %bb.0:
4878; X86-NEXT:    pushl $0
4879; X86-NEXT:    pushl $512 # imm = 0x200
4880; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4881; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4882; X86-NEXT:    calll memcmp
4883; X86-NEXT:    addl $16, %esp
4884; X86-NEXT:    testl %eax, %eax
4885; X86-NEXT:    setg %al
4886; X86-NEXT:    retl
4887;
4888; X64-LABEL: length512_gt:
4889; X64:       # %bb.0:
4890; X64-NEXT:    pushq %rax
4891; X64-NEXT:    movl $512, %edx # imm = 0x200
4892; X64-NEXT:    callq memcmp
4893; X64-NEXT:    testl %eax, %eax
4894; X64-NEXT:    setg %al
4895; X64-NEXT:    popq %rcx
4896; X64-NEXT:    retq
4897  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 512) nounwind
4898  %cmp = icmp sgt i32 %call, 0
4899  ret i1 %cmp
4900}
4901
4902define i1 @length512_eq_const(i8* %X) nounwind {
4903; X86-LABEL: length512_eq_const:
4904; X86:       # %bb.0:
4905; X86-NEXT:    pushl $0
4906; X86-NEXT:    pushl $512 # imm = 0x200
4907; X86-NEXT:    pushl $.L.str
4908; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4909; X86-NEXT:    calll memcmp
4910; X86-NEXT:    addl $16, %esp
4911; X86-NEXT:    testl %eax, %eax
4912; X86-NEXT:    sete %al
4913; X86-NEXT:    retl
4914;
4915; X64-LABEL: length512_eq_const:
4916; X64:       # %bb.0:
4917; X64-NEXT:    pushq %rax
4918; X64-NEXT:    movl $.L.str, %esi
4919; X64-NEXT:    movl $512, %edx # imm = 0x200
4920; X64-NEXT:    callq memcmp
4921; X64-NEXT:    testl %eax, %eax
4922; X64-NEXT:    sete %al
4923; X64-NEXT:    popq %rcx
4924; X64-NEXT:    retq
4925  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 512) nounwind
4926  %c = icmp eq i32 %m, 0
4927  ret i1 %c
4928}
4929
4930; This checks that we do not do stupid things with huge sizes.
4931define i32 @huge_length(i8* %X, i8* %Y) nounwind {
4932; X86-LABEL: huge_length:
4933; X86:       # %bb.0:
4934; X86-NEXT:    pushl $2147483647 # imm = 0x7FFFFFFF
4935; X86-NEXT:    pushl $-1
4936; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4937; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4938; X86-NEXT:    calll memcmp
4939; X86-NEXT:    addl $16, %esp
4940; X86-NEXT:    retl
4941;
4942; X64-LABEL: huge_length:
4943; X64:       # %bb.0:
4944; X64-NEXT:    movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF
4945; X64-NEXT:    jmp memcmp # TAILCALL
4946  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 9223372036854775807) nounwind
4947  ret i32 %m
4948}
4949
4950define i1 @huge_length_eq(i8* %X, i8* %Y) nounwind {
4951; X86-LABEL: huge_length_eq:
4952; X86:       # %bb.0:
4953; X86-NEXT:    pushl $2147483647 # imm = 0x7FFFFFFF
4954; X86-NEXT:    pushl $-1
4955; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4956; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4957; X86-NEXT:    calll memcmp
4958; X86-NEXT:    addl $16, %esp
4959; X86-NEXT:    testl %eax, %eax
4960; X86-NEXT:    sete %al
4961; X86-NEXT:    retl
4962;
4963; X64-LABEL: huge_length_eq:
4964; X64:       # %bb.0:
4965; X64-NEXT:    pushq %rax
4966; X64-NEXT:    movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF
4967; X64-NEXT:    callq memcmp
4968; X64-NEXT:    testl %eax, %eax
4969; X64-NEXT:    sete %al
4970; X64-NEXT:    popq %rcx
4971; X64-NEXT:    retq
4972  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 9223372036854775807) nounwind
4973  %c = icmp eq i32 %m, 0
4974  ret i1 %c
4975}
4976
4977; This checks non-constant sizes.
4978define i32 @nonconst_length(i8* %X, i8* %Y, i64 %size) nounwind {
4979; X86-LABEL: nonconst_length:
4980; X86:       # %bb.0:
4981; X86-NEXT:    jmp memcmp # TAILCALL
4982;
4983; X64-LABEL: nonconst_length:
4984; X64:       # %bb.0:
4985; X64-NEXT:    jmp memcmp # TAILCALL
4986  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 %size) nounwind
4987  ret i32 %m
4988}
4989
4990define i1 @nonconst_length_eq(i8* %X, i8* %Y, i64 %size) nounwind {
4991; X86-LABEL: nonconst_length_eq:
4992; X86:       # %bb.0:
4993; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4994; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4995; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4996; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4997; X86-NEXT:    calll memcmp
4998; X86-NEXT:    addl $16, %esp
4999; X86-NEXT:    testl %eax, %eax
5000; X86-NEXT:    sete %al
5001; X86-NEXT:    retl
5002;
5003; X64-LABEL: nonconst_length_eq:
5004; X64:       # %bb.0:
5005; X64-NEXT:    pushq %rax
5006; X64-NEXT:    callq memcmp
5007; X64-NEXT:    testl %eax, %eax
5008; X64-NEXT:    sete %al
5009; X64-NEXT:    popq %rcx
5010; X64-NEXT:    retq
5011  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 %size) nounwind
5012  %c = icmp eq i32 %m, 0
5013  ret i1 %c
5014}
5015