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