1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; NOTE: This is a copy of llvm/test/CodeGen/X86/memcmp.ll with more load pairs. Please keep it that way.
3; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=i686-unknown-unknown -mattr=cmov     | FileCheck %s --check-prefixes=X86,X86-NOSSE
4; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=i686-unknown-unknown -mattr=+sse     | FileCheck %s --check-prefixes=X86,X86-SSE1
5; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=i686-unknown-unknown -mattr=+sse2    | FileCheck %s --check-prefixes=X86,X86-SSE2
6; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=i686-unknown-unknown -mattr=+sse4.1  | FileCheck %s --check-prefixes=X86,X86-SSE41
7; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown               | FileCheck %s --check-prefixes=X64,X64-SSE,X64-SSE2
8; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.1 | FileCheck %s --check-prefixes=X64,X64-SSE,X64-SSE41
9; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx    | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX1
10; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx2   | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX2
11; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw,+prefer-256-bit | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX2
12; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw,-prefer-256-bit | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX512,X64-AVX512BW
13; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,+prefer-256-bit,-prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX2
14; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,-prefer-256-bit,-prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX512,X64-AVX512F
15; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,+prefer-256-bit,+prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-MIC-AVX,X64-MIC-AVX2
16; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,-prefer-256-bit,+prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-MIC-AVX,X64-MIC-AVX512F
17
18; This tests codegen time inlining/optimization of memcmp
19; rdar://6480398
20
21@.str = private constant [513 x i8] c"01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901\00", align 1
22
23declare dso_local i32 @memcmp(i8*, i8*, i64)
24
25define i32 @length0(i8* %X, i8* %Y) nounwind {
26; X86-LABEL: length0:
27; X86:       # %bb.0:
28; X86-NEXT:    xorl %eax, %eax
29; X86-NEXT:    retl
30;
31; X64-LABEL: length0:
32; X64:       # %bb.0:
33; X64-NEXT:    xorl %eax, %eax
34; X64-NEXT:    retq
35   %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 0) nounwind
36   ret i32 %m
37 }
38
39define i1 @length0_eq(i8* %X, i8* %Y) nounwind {
40; X86-LABEL: length0_eq:
41; X86:       # %bb.0:
42; X86-NEXT:    movb $1, %al
43; X86-NEXT:    retl
44;
45; X64-LABEL: length0_eq:
46; X64:       # %bb.0:
47; X64-NEXT:    movb $1, %al
48; X64-NEXT:    retq
49  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 0) nounwind
50  %c = icmp eq i32 %m, 0
51  ret i1 %c
52}
53
54define i1 @length0_lt(i8* %X, i8* %Y) nounwind {
55; X86-LABEL: length0_lt:
56; X86:       # %bb.0:
57; X86-NEXT:    xorl %eax, %eax
58; X86-NEXT:    retl
59;
60; X64-LABEL: length0_lt:
61; X64:       # %bb.0:
62; X64-NEXT:    xorl %eax, %eax
63; X64-NEXT:    retq
64  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 0) nounwind
65  %c = icmp slt i32 %m, 0
66  ret i1 %c
67}
68
69define i32 @length2(i8* %X, i8* %Y) nounwind {
70; X86-LABEL: length2:
71; X86:       # %bb.0:
72; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
73; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
74; X86-NEXT:    movzwl (%ecx), %ecx
75; X86-NEXT:    movzwl (%eax), %edx
76; X86-NEXT:    rolw $8, %cx
77; X86-NEXT:    rolw $8, %dx
78; X86-NEXT:    movzwl %cx, %eax
79; X86-NEXT:    movzwl %dx, %ecx
80; X86-NEXT:    subl %ecx, %eax
81; X86-NEXT:    retl
82;
83; X64-LABEL: length2:
84; X64:       # %bb.0:
85; X64-NEXT:    movzwl (%rdi), %eax
86; X64-NEXT:    movzwl (%rsi), %ecx
87; X64-NEXT:    rolw $8, %ax
88; X64-NEXT:    rolw $8, %cx
89; X64-NEXT:    movzwl %ax, %eax
90; X64-NEXT:    movzwl %cx, %ecx
91; X64-NEXT:    subl %ecx, %eax
92; X64-NEXT:    retq
93  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 2) nounwind
94  ret i32 %m
95}
96
97define i1 @length2_eq(i8* %X, i8* %Y) nounwind {
98; X86-LABEL: length2_eq:
99; X86:       # %bb.0:
100; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
101; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
102; X86-NEXT:    movzwl (%ecx), %ecx
103; X86-NEXT:    cmpw (%eax), %cx
104; X86-NEXT:    sete %al
105; X86-NEXT:    retl
106;
107; X64-LABEL: length2_eq:
108; X64:       # %bb.0:
109; X64-NEXT:    movzwl (%rdi), %eax
110; X64-NEXT:    cmpw (%rsi), %ax
111; X64-NEXT:    sete %al
112; X64-NEXT:    retq
113  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 2) nounwind
114  %c = icmp eq i32 %m, 0
115  ret i1 %c
116}
117
118define i1 @length2_lt(i8* %X, i8* %Y) nounwind {
119; X86-LABEL: length2_lt:
120; X86:       # %bb.0:
121; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
122; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
123; X86-NEXT:    movzwl (%ecx), %ecx
124; X86-NEXT:    movzwl (%eax), %edx
125; X86-NEXT:    rolw $8, %cx
126; X86-NEXT:    rolw $8, %dx
127; X86-NEXT:    movzwl %cx, %eax
128; X86-NEXT:    movzwl %dx, %ecx
129; X86-NEXT:    subl %ecx, %eax
130; X86-NEXT:    shrl $31, %eax
131; X86-NEXT:    # kill: def $al killed $al killed $eax
132; X86-NEXT:    retl
133;
134; X64-LABEL: length2_lt:
135; X64:       # %bb.0:
136; X64-NEXT:    movzwl (%rdi), %eax
137; X64-NEXT:    movzwl (%rsi), %ecx
138; X64-NEXT:    rolw $8, %ax
139; X64-NEXT:    rolw $8, %cx
140; X64-NEXT:    movzwl %ax, %eax
141; X64-NEXT:    movzwl %cx, %ecx
142; X64-NEXT:    subl %ecx, %eax
143; X64-NEXT:    shrl $31, %eax
144; X64-NEXT:    # kill: def $al killed $al killed $eax
145; X64-NEXT:    retq
146  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 2) nounwind
147  %c = icmp slt i32 %m, 0
148  ret i1 %c
149}
150
151define i1 @length2_gt(i8* %X, i8* %Y) nounwind {
152; X86-LABEL: length2_gt:
153; X86:       # %bb.0:
154; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
155; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
156; X86-NEXT:    movzwl (%ecx), %ecx
157; X86-NEXT:    movzwl (%eax), %eax
158; X86-NEXT:    rolw $8, %cx
159; X86-NEXT:    rolw $8, %ax
160; X86-NEXT:    movzwl %cx, %ecx
161; X86-NEXT:    movzwl %ax, %eax
162; X86-NEXT:    subl %eax, %ecx
163; X86-NEXT:    testl %ecx, %ecx
164; X86-NEXT:    setg %al
165; X86-NEXT:    retl
166;
167; X64-LABEL: length2_gt:
168; X64:       # %bb.0:
169; X64-NEXT:    movzwl (%rdi), %eax
170; X64-NEXT:    movzwl (%rsi), %ecx
171; X64-NEXT:    rolw $8, %ax
172; X64-NEXT:    rolw $8, %cx
173; X64-NEXT:    movzwl %ax, %eax
174; X64-NEXT:    movzwl %cx, %ecx
175; X64-NEXT:    subl %ecx, %eax
176; X64-NEXT:    testl %eax, %eax
177; X64-NEXT:    setg %al
178; X64-NEXT:    retq
179  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 2) nounwind
180  %c = icmp sgt i32 %m, 0
181  ret i1 %c
182}
183
184define i1 @length2_eq_const(i8* %X) nounwind {
185; X86-LABEL: length2_eq_const:
186; X86:       # %bb.0:
187; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
188; X86-NEXT:    movzwl (%eax), %eax
189; X86-NEXT:    cmpl $12849, %eax # imm = 0x3231
190; X86-NEXT:    setne %al
191; X86-NEXT:    retl
192;
193; X64-LABEL: length2_eq_const:
194; X64:       # %bb.0:
195; X64-NEXT:    movzwl (%rdi), %eax
196; X64-NEXT:    cmpl $12849, %eax # imm = 0x3231
197; X64-NEXT:    setne %al
198; X64-NEXT:    retq
199  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 1), i64 2) nounwind
200  %c = icmp ne i32 %m, 0
201  ret i1 %c
202}
203
204define i1 @length2_eq_nobuiltin_attr(i8* %X, i8* %Y) nounwind {
205; X86-LABEL: length2_eq_nobuiltin_attr:
206; X86:       # %bb.0:
207; X86-NEXT:    pushl $0
208; X86-NEXT:    pushl $2
209; X86-NEXT:    pushl {{[0-9]+}}(%esp)
210; X86-NEXT:    pushl {{[0-9]+}}(%esp)
211; X86-NEXT:    calll memcmp
212; X86-NEXT:    addl $16, %esp
213; X86-NEXT:    testl %eax, %eax
214; X86-NEXT:    sete %al
215; X86-NEXT:    retl
216;
217; X64-LABEL: length2_eq_nobuiltin_attr:
218; X64:       # %bb.0:
219; X64-NEXT:    pushq %rax
220; X64-NEXT:    movl $2, %edx
221; X64-NEXT:    callq memcmp
222; X64-NEXT:    testl %eax, %eax
223; X64-NEXT:    sete %al
224; X64-NEXT:    popq %rcx
225; X64-NEXT:    retq
226  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 2) nounwind nobuiltin
227  %c = icmp eq i32 %m, 0
228  ret i1 %c
229}
230
231define i32 @length3(i8* %X, i8* %Y) nounwind {
232; X86-LABEL: length3:
233; X86:       # %bb.0:
234; X86-NEXT:    pushl %esi
235; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
236; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
237; X86-NEXT:    movzwl (%eax), %edx
238; X86-NEXT:    movzwl (%ecx), %esi
239; X86-NEXT:    rolw $8, %dx
240; X86-NEXT:    rolw $8, %si
241; X86-NEXT:    cmpw %si, %dx
242; X86-NEXT:    jne .LBB9_3
243; X86-NEXT:  # %bb.1: # %loadbb1
244; X86-NEXT:    movzbl 2(%eax), %eax
245; X86-NEXT:    movzbl 2(%ecx), %ecx
246; X86-NEXT:    subl %ecx, %eax
247; X86-NEXT:    popl %esi
248; X86-NEXT:    retl
249; X86-NEXT:  .LBB9_3: # %res_block
250; X86-NEXT:    setae %al
251; X86-NEXT:    movzbl %al, %eax
252; X86-NEXT:    leal -1(%eax,%eax), %eax
253; X86-NEXT:    popl %esi
254; X86-NEXT:    retl
255;
256; X64-LABEL: length3:
257; X64:       # %bb.0:
258; X64-NEXT:    movzwl (%rdi), %eax
259; X64-NEXT:    movzwl (%rsi), %ecx
260; X64-NEXT:    rolw $8, %ax
261; X64-NEXT:    rolw $8, %cx
262; X64-NEXT:    cmpw %cx, %ax
263; X64-NEXT:    jne .LBB9_3
264; X64-NEXT:  # %bb.1: # %loadbb1
265; X64-NEXT:    movzbl 2(%rdi), %eax
266; X64-NEXT:    movzbl 2(%rsi), %ecx
267; X64-NEXT:    subl %ecx, %eax
268; X64-NEXT:    retq
269; X64-NEXT:  .LBB9_3: # %res_block
270; X64-NEXT:    setae %al
271; X64-NEXT:    movzbl %al, %eax
272; X64-NEXT:    leal -1(%rax,%rax), %eax
273; X64-NEXT:    retq
274  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 3) nounwind
275  ret i32 %m
276}
277
278define i1 @length3_eq(i8* %X, i8* %Y) nounwind {
279; X86-LABEL: length3_eq:
280; X86:       # %bb.0:
281; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
282; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
283; X86-NEXT:    movzwl (%ecx), %edx
284; X86-NEXT:    xorw (%eax), %dx
285; X86-NEXT:    movb 2(%ecx), %cl
286; X86-NEXT:    xorb 2(%eax), %cl
287; X86-NEXT:    movzbl %cl, %eax
288; X86-NEXT:    orw %dx, %ax
289; X86-NEXT:    setne %al
290; X86-NEXT:    retl
291;
292; X64-LABEL: length3_eq:
293; X64:       # %bb.0:
294; X64-NEXT:    movzwl (%rdi), %eax
295; X64-NEXT:    xorw (%rsi), %ax
296; X64-NEXT:    movb 2(%rdi), %cl
297; X64-NEXT:    xorb 2(%rsi), %cl
298; X64-NEXT:    movzbl %cl, %ecx
299; X64-NEXT:    orw %ax, %cx
300; X64-NEXT:    setne %al
301; X64-NEXT:    retq
302  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 3) nounwind
303  %c = icmp ne i32 %m, 0
304  ret i1 %c
305}
306
307define i32 @length4(i8* %X, i8* %Y) nounwind {
308; X86-LABEL: length4:
309; X86:       # %bb.0:
310; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
311; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
312; X86-NEXT:    movl (%ecx), %ecx
313; X86-NEXT:    movl (%eax), %edx
314; X86-NEXT:    bswapl %ecx
315; X86-NEXT:    bswapl %edx
316; X86-NEXT:    xorl %eax, %eax
317; X86-NEXT:    cmpl %edx, %ecx
318; X86-NEXT:    seta %al
319; X86-NEXT:    sbbl $0, %eax
320; X86-NEXT:    retl
321;
322; X64-LABEL: length4:
323; X64:       # %bb.0:
324; X64-NEXT:    movl (%rdi), %ecx
325; X64-NEXT:    movl (%rsi), %edx
326; X64-NEXT:    bswapl %ecx
327; X64-NEXT:    bswapl %edx
328; X64-NEXT:    xorl %eax, %eax
329; X64-NEXT:    cmpl %edx, %ecx
330; X64-NEXT:    seta %al
331; X64-NEXT:    sbbl $0, %eax
332; X64-NEXT:    retq
333  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 4) nounwind
334  ret i32 %m
335}
336
337define i1 @length4_eq(i8* %X, i8* %Y) nounwind {
338; X86-LABEL: length4_eq:
339; X86:       # %bb.0:
340; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
341; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
342; X86-NEXT:    movl (%ecx), %ecx
343; X86-NEXT:    cmpl (%eax), %ecx
344; X86-NEXT:    setne %al
345; X86-NEXT:    retl
346;
347; X64-LABEL: length4_eq:
348; X64:       # %bb.0:
349; X64-NEXT:    movl (%rdi), %eax
350; X64-NEXT:    cmpl (%rsi), %eax
351; X64-NEXT:    setne %al
352; X64-NEXT:    retq
353  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 4) nounwind
354  %c = icmp ne i32 %m, 0
355  ret i1 %c
356}
357
358define i1 @length4_lt(i8* %X, i8* %Y) nounwind {
359; X86-LABEL: length4_lt:
360; X86:       # %bb.0:
361; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
362; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
363; X86-NEXT:    movl (%ecx), %ecx
364; X86-NEXT:    movl (%eax), %edx
365; X86-NEXT:    bswapl %ecx
366; X86-NEXT:    bswapl %edx
367; X86-NEXT:    xorl %eax, %eax
368; X86-NEXT:    cmpl %edx, %ecx
369; X86-NEXT:    seta %al
370; X86-NEXT:    sbbl $0, %eax
371; X86-NEXT:    shrl $31, %eax
372; X86-NEXT:    # kill: def $al killed $al killed $eax
373; X86-NEXT:    retl
374;
375; X64-LABEL: length4_lt:
376; X64:       # %bb.0:
377; X64-NEXT:    movl (%rdi), %ecx
378; X64-NEXT:    movl (%rsi), %edx
379; X64-NEXT:    bswapl %ecx
380; X64-NEXT:    bswapl %edx
381; X64-NEXT:    xorl %eax, %eax
382; X64-NEXT:    cmpl %edx, %ecx
383; X64-NEXT:    seta %al
384; X64-NEXT:    sbbl $0, %eax
385; X64-NEXT:    shrl $31, %eax
386; X64-NEXT:    # kill: def $al killed $al killed $eax
387; X64-NEXT:    retq
388  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 4) nounwind
389  %c = icmp slt i32 %m, 0
390  ret i1 %c
391}
392
393define i1 @length4_gt(i8* %X, i8* %Y) nounwind {
394; X86-LABEL: length4_gt:
395; X86:       # %bb.0:
396; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
397; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
398; X86-NEXT:    movl (%ecx), %ecx
399; X86-NEXT:    movl (%eax), %eax
400; X86-NEXT:    bswapl %ecx
401; X86-NEXT:    bswapl %eax
402; X86-NEXT:    xorl %edx, %edx
403; X86-NEXT:    cmpl %eax, %ecx
404; X86-NEXT:    seta %dl
405; X86-NEXT:    sbbl $0, %edx
406; X86-NEXT:    testl %edx, %edx
407; X86-NEXT:    setg %al
408; X86-NEXT:    retl
409;
410; X64-LABEL: length4_gt:
411; X64:       # %bb.0:
412; X64-NEXT:    movl (%rdi), %eax
413; X64-NEXT:    movl (%rsi), %ecx
414; X64-NEXT:    bswapl %eax
415; X64-NEXT:    bswapl %ecx
416; X64-NEXT:    xorl %edx, %edx
417; X64-NEXT:    cmpl %ecx, %eax
418; X64-NEXT:    seta %dl
419; X64-NEXT:    sbbl $0, %edx
420; X64-NEXT:    testl %edx, %edx
421; X64-NEXT:    setg %al
422; X64-NEXT:    retq
423  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 4) nounwind
424  %c = icmp sgt i32 %m, 0
425  ret i1 %c
426}
427
428define i1 @length4_eq_const(i8* %X) nounwind {
429; X86-LABEL: length4_eq_const:
430; X86:       # %bb.0:
431; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
432; X86-NEXT:    cmpl $875770417, (%eax) # imm = 0x34333231
433; X86-NEXT:    sete %al
434; X86-NEXT:    retl
435;
436; X64-LABEL: length4_eq_const:
437; X64:       # %bb.0:
438; X64-NEXT:    cmpl $875770417, (%rdi) # imm = 0x34333231
439; X64-NEXT:    sete %al
440; X64-NEXT:    retq
441  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 1), i64 4) nounwind
442  %c = icmp eq i32 %m, 0
443  ret i1 %c
444}
445
446define i32 @length5(i8* %X, i8* %Y) nounwind {
447; X86-LABEL: length5:
448; X86:       # %bb.0:
449; X86-NEXT:    pushl %esi
450; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
451; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
452; X86-NEXT:    movl (%eax), %edx
453; X86-NEXT:    movl (%ecx), %esi
454; X86-NEXT:    bswapl %edx
455; X86-NEXT:    bswapl %esi
456; X86-NEXT:    cmpl %esi, %edx
457; X86-NEXT:    jne .LBB16_3
458; X86-NEXT:  # %bb.1: # %loadbb1
459; X86-NEXT:    movzbl 4(%eax), %eax
460; X86-NEXT:    movzbl 4(%ecx), %ecx
461; X86-NEXT:    subl %ecx, %eax
462; X86-NEXT:    popl %esi
463; X86-NEXT:    retl
464; X86-NEXT:  .LBB16_3: # %res_block
465; X86-NEXT:    setae %al
466; X86-NEXT:    movzbl %al, %eax
467; X86-NEXT:    leal -1(%eax,%eax), %eax
468; X86-NEXT:    popl %esi
469; X86-NEXT:    retl
470;
471; X64-LABEL: length5:
472; X64:       # %bb.0:
473; X64-NEXT:    movl (%rdi), %eax
474; X64-NEXT:    movl (%rsi), %ecx
475; X64-NEXT:    bswapl %eax
476; X64-NEXT:    bswapl %ecx
477; X64-NEXT:    cmpl %ecx, %eax
478; X64-NEXT:    jne .LBB16_3
479; X64-NEXT:  # %bb.1: # %loadbb1
480; X64-NEXT:    movzbl 4(%rdi), %eax
481; X64-NEXT:    movzbl 4(%rsi), %ecx
482; X64-NEXT:    subl %ecx, %eax
483; X64-NEXT:    retq
484; X64-NEXT:  .LBB16_3: # %res_block
485; X64-NEXT:    setae %al
486; X64-NEXT:    movzbl %al, %eax
487; X64-NEXT:    leal -1(%rax,%rax), %eax
488; X64-NEXT:    retq
489  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 5) nounwind
490  ret i32 %m
491}
492
493define i1 @length5_eq(i8* %X, i8* %Y) nounwind {
494; X86-LABEL: length5_eq:
495; X86:       # %bb.0:
496; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
497; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
498; X86-NEXT:    movl (%ecx), %edx
499; X86-NEXT:    xorl (%eax), %edx
500; X86-NEXT:    movb 4(%ecx), %cl
501; X86-NEXT:    xorb 4(%eax), %cl
502; X86-NEXT:    movzbl %cl, %eax
503; X86-NEXT:    orl %edx, %eax
504; X86-NEXT:    setne %al
505; X86-NEXT:    retl
506;
507; X64-LABEL: length5_eq:
508; X64:       # %bb.0:
509; X64-NEXT:    movl (%rdi), %eax
510; X64-NEXT:    xorl (%rsi), %eax
511; X64-NEXT:    movb 4(%rdi), %cl
512; X64-NEXT:    xorb 4(%rsi), %cl
513; X64-NEXT:    movzbl %cl, %ecx
514; X64-NEXT:    orl %eax, %ecx
515; X64-NEXT:    setne %al
516; X64-NEXT:    retq
517  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 5) nounwind
518  %c = icmp ne i32 %m, 0
519  ret i1 %c
520}
521
522define i1 @length5_lt(i8* %X, i8* %Y) nounwind {
523; X86-LABEL: length5_lt:
524; X86:       # %bb.0:
525; X86-NEXT:    pushl %esi
526; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
527; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
528; X86-NEXT:    movl (%eax), %edx
529; X86-NEXT:    movl (%ecx), %esi
530; X86-NEXT:    bswapl %edx
531; X86-NEXT:    bswapl %esi
532; X86-NEXT:    cmpl %esi, %edx
533; X86-NEXT:    jne .LBB18_3
534; X86-NEXT:  # %bb.1: # %loadbb1
535; X86-NEXT:    movzbl 4(%eax), %eax
536; X86-NEXT:    movzbl 4(%ecx), %ecx
537; X86-NEXT:    subl %ecx, %eax
538; X86-NEXT:    jmp .LBB18_2
539; X86-NEXT:  .LBB18_3: # %res_block
540; X86-NEXT:    setae %al
541; X86-NEXT:    movzbl %al, %eax
542; X86-NEXT:    leal -1(%eax,%eax), %eax
543; X86-NEXT:  .LBB18_2: # %endblock
544; X86-NEXT:    shrl $31, %eax
545; X86-NEXT:    # kill: def $al killed $al killed $eax
546; X86-NEXT:    popl %esi
547; X86-NEXT:    retl
548;
549; X64-LABEL: length5_lt:
550; X64:       # %bb.0:
551; X64-NEXT:    movl (%rdi), %eax
552; X64-NEXT:    movl (%rsi), %ecx
553; X64-NEXT:    bswapl %eax
554; X64-NEXT:    bswapl %ecx
555; X64-NEXT:    cmpl %ecx, %eax
556; X64-NEXT:    jne .LBB18_3
557; X64-NEXT:  # %bb.1: # %loadbb1
558; X64-NEXT:    movzbl 4(%rdi), %eax
559; X64-NEXT:    movzbl 4(%rsi), %ecx
560; X64-NEXT:    subl %ecx, %eax
561; X64-NEXT:    shrl $31, %eax
562; X64-NEXT:    # kill: def $al killed $al killed $eax
563; X64-NEXT:    retq
564; X64-NEXT:  .LBB18_3: # %res_block
565; X64-NEXT:    setae %al
566; X64-NEXT:    movzbl %al, %eax
567; X64-NEXT:    leal -1(%rax,%rax), %eax
568; X64-NEXT:    shrl $31, %eax
569; X64-NEXT:    # kill: def $al killed $al killed $eax
570; X64-NEXT:    retq
571  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 5) nounwind
572  %c = icmp slt i32 %m, 0
573  ret i1 %c
574}
575
576define i32 @length7(i8* %X, i8* %Y) nounwind {
577; X86-LABEL: length7:
578; X86:       # %bb.0:
579; X86-NEXT:    pushl %esi
580; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
581; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
582; X86-NEXT:    movl (%esi), %ecx
583; X86-NEXT:    movl (%eax), %edx
584; X86-NEXT:    bswapl %ecx
585; X86-NEXT:    bswapl %edx
586; X86-NEXT:    cmpl %edx, %ecx
587; X86-NEXT:    jne .LBB19_2
588; X86-NEXT:  # %bb.1: # %loadbb1
589; X86-NEXT:    movl 3(%esi), %ecx
590; X86-NEXT:    movl 3(%eax), %edx
591; X86-NEXT:    bswapl %ecx
592; X86-NEXT:    bswapl %edx
593; X86-NEXT:    xorl %eax, %eax
594; X86-NEXT:    cmpl %edx, %ecx
595; X86-NEXT:    je .LBB19_3
596; X86-NEXT:  .LBB19_2: # %res_block
597; X86-NEXT:    xorl %eax, %eax
598; X86-NEXT:    cmpl %edx, %ecx
599; X86-NEXT:    setae %al
600; X86-NEXT:    leal -1(%eax,%eax), %eax
601; X86-NEXT:  .LBB19_3: # %endblock
602; X86-NEXT:    popl %esi
603; X86-NEXT:    retl
604;
605; X64-LABEL: length7:
606; X64:       # %bb.0:
607; X64-NEXT:    movl (%rdi), %ecx
608; X64-NEXT:    movl (%rsi), %edx
609; X64-NEXT:    bswapl %ecx
610; X64-NEXT:    bswapl %edx
611; X64-NEXT:    cmpl %edx, %ecx
612; X64-NEXT:    jne .LBB19_2
613; X64-NEXT:  # %bb.1: # %loadbb1
614; X64-NEXT:    movl 3(%rdi), %ecx
615; X64-NEXT:    movl 3(%rsi), %edx
616; X64-NEXT:    bswapl %ecx
617; X64-NEXT:    bswapl %edx
618; X64-NEXT:    xorl %eax, %eax
619; X64-NEXT:    cmpl %edx, %ecx
620; X64-NEXT:    je .LBB19_3
621; X64-NEXT:  .LBB19_2: # %res_block
622; X64-NEXT:    xorl %eax, %eax
623; X64-NEXT:    cmpl %edx, %ecx
624; X64-NEXT:    setae %al
625; X64-NEXT:    leal -1(%rax,%rax), %eax
626; X64-NEXT:  .LBB19_3: # %endblock
627; X64-NEXT:    retq
628  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 7) nounwind
629  ret i32 %m
630}
631
632define i1 @length7_eq(i8* %X, i8* %Y) nounwind {
633; X86-LABEL: length7_eq:
634; X86:       # %bb.0:
635; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
636; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
637; X86-NEXT:    movl (%ecx), %edx
638; X86-NEXT:    movl 3(%ecx), %ecx
639; X86-NEXT:    xorl (%eax), %edx
640; X86-NEXT:    xorl 3(%eax), %ecx
641; X86-NEXT:    orl %edx, %ecx
642; X86-NEXT:    setne %al
643; X86-NEXT:    retl
644;
645; X64-LABEL: length7_eq:
646; X64:       # %bb.0:
647; X64-NEXT:    movl (%rdi), %eax
648; X64-NEXT:    movl 3(%rdi), %ecx
649; X64-NEXT:    xorl (%rsi), %eax
650; X64-NEXT:    xorl 3(%rsi), %ecx
651; X64-NEXT:    orl %eax, %ecx
652; X64-NEXT:    setne %al
653; X64-NEXT:    retq
654  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 7) nounwind
655  %c = icmp ne i32 %m, 0
656  ret i1 %c
657}
658
659define i1 @length7_lt(i8* %X, i8* %Y) nounwind {
660; X86-LABEL: length7_lt:
661; X86:       # %bb.0:
662; X86-NEXT:    pushl %esi
663; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
664; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
665; X86-NEXT:    movl (%esi), %ecx
666; X86-NEXT:    movl (%eax), %edx
667; X86-NEXT:    bswapl %ecx
668; X86-NEXT:    bswapl %edx
669; X86-NEXT:    cmpl %edx, %ecx
670; X86-NEXT:    jne .LBB21_2
671; X86-NEXT:  # %bb.1: # %loadbb1
672; X86-NEXT:    movl 3(%esi), %ecx
673; X86-NEXT:    movl 3(%eax), %edx
674; X86-NEXT:    bswapl %ecx
675; X86-NEXT:    bswapl %edx
676; X86-NEXT:    xorl %eax, %eax
677; X86-NEXT:    cmpl %edx, %ecx
678; X86-NEXT:    je .LBB21_3
679; X86-NEXT:  .LBB21_2: # %res_block
680; X86-NEXT:    xorl %eax, %eax
681; X86-NEXT:    cmpl %edx, %ecx
682; X86-NEXT:    setae %al
683; X86-NEXT:    leal -1(%eax,%eax), %eax
684; X86-NEXT:  .LBB21_3: # %endblock
685; X86-NEXT:    shrl $31, %eax
686; X86-NEXT:    # kill: def $al killed $al killed $eax
687; X86-NEXT:    popl %esi
688; X86-NEXT:    retl
689;
690; X64-LABEL: length7_lt:
691; X64:       # %bb.0:
692; X64-NEXT:    movl (%rdi), %ecx
693; X64-NEXT:    movl (%rsi), %edx
694; X64-NEXT:    bswapl %ecx
695; X64-NEXT:    bswapl %edx
696; X64-NEXT:    cmpl %edx, %ecx
697; X64-NEXT:    jne .LBB21_2
698; X64-NEXT:  # %bb.1: # %loadbb1
699; X64-NEXT:    movl 3(%rdi), %ecx
700; X64-NEXT:    movl 3(%rsi), %edx
701; X64-NEXT:    bswapl %ecx
702; X64-NEXT:    bswapl %edx
703; X64-NEXT:    xorl %eax, %eax
704; X64-NEXT:    cmpl %edx, %ecx
705; X64-NEXT:    je .LBB21_3
706; X64-NEXT:  .LBB21_2: # %res_block
707; X64-NEXT:    xorl %eax, %eax
708; X64-NEXT:    cmpl %edx, %ecx
709; X64-NEXT:    setae %al
710; X64-NEXT:    leal -1(%rax,%rax), %eax
711; X64-NEXT:  .LBB21_3: # %endblock
712; X64-NEXT:    shrl $31, %eax
713; X64-NEXT:    # kill: def $al killed $al killed $eax
714; X64-NEXT:    retq
715  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 7) nounwind
716  %c = icmp slt i32 %m, 0
717  ret i1 %c
718}
719
720define i32 @length8(i8* %X, i8* %Y) nounwind {
721; X86-LABEL: length8:
722; X86:       # %bb.0:
723; X86-NEXT:    pushl %esi
724; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
725; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
726; X86-NEXT:    movl (%esi), %ecx
727; X86-NEXT:    movl (%eax), %edx
728; X86-NEXT:    bswapl %ecx
729; X86-NEXT:    bswapl %edx
730; X86-NEXT:    cmpl %edx, %ecx
731; X86-NEXT:    jne .LBB22_2
732; X86-NEXT:  # %bb.1: # %loadbb1
733; X86-NEXT:    movl 4(%esi), %ecx
734; X86-NEXT:    movl 4(%eax), %edx
735; X86-NEXT:    bswapl %ecx
736; X86-NEXT:    bswapl %edx
737; X86-NEXT:    xorl %eax, %eax
738; X86-NEXT:    cmpl %edx, %ecx
739; X86-NEXT:    je .LBB22_3
740; X86-NEXT:  .LBB22_2: # %res_block
741; X86-NEXT:    xorl %eax, %eax
742; X86-NEXT:    cmpl %edx, %ecx
743; X86-NEXT:    setae %al
744; X86-NEXT:    leal -1(%eax,%eax), %eax
745; X86-NEXT:  .LBB22_3: # %endblock
746; X86-NEXT:    popl %esi
747; X86-NEXT:    retl
748;
749; X64-LABEL: length8:
750; X64:       # %bb.0:
751; X64-NEXT:    movq (%rdi), %rcx
752; X64-NEXT:    movq (%rsi), %rdx
753; X64-NEXT:    bswapq %rcx
754; X64-NEXT:    bswapq %rdx
755; X64-NEXT:    xorl %eax, %eax
756; X64-NEXT:    cmpq %rdx, %rcx
757; X64-NEXT:    seta %al
758; X64-NEXT:    sbbl $0, %eax
759; X64-NEXT:    retq
760  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 8) nounwind
761  ret i32 %m
762}
763
764define i1 @length8_eq(i8* %X, i8* %Y) nounwind {
765; X86-LABEL: length8_eq:
766; X86:       # %bb.0:
767; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
768; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
769; X86-NEXT:    movl (%ecx), %edx
770; X86-NEXT:    movl 4(%ecx), %ecx
771; X86-NEXT:    xorl (%eax), %edx
772; X86-NEXT:    xorl 4(%eax), %ecx
773; X86-NEXT:    orl %edx, %ecx
774; X86-NEXT:    sete %al
775; X86-NEXT:    retl
776;
777; X64-LABEL: length8_eq:
778; X64:       # %bb.0:
779; X64-NEXT:    movq (%rdi), %rax
780; X64-NEXT:    cmpq (%rsi), %rax
781; X64-NEXT:    sete %al
782; X64-NEXT:    retq
783  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 8) nounwind
784  %c = icmp eq i32 %m, 0
785  ret i1 %c
786}
787
788define i1 @length8_eq_const(i8* %X) nounwind {
789; X86-LABEL: length8_eq_const:
790; X86:       # %bb.0:
791; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
792; X86-NEXT:    movl $858927408, %ecx # imm = 0x33323130
793; X86-NEXT:    xorl (%eax), %ecx
794; X86-NEXT:    movl $926299444, %edx # imm = 0x37363534
795; X86-NEXT:    xorl 4(%eax), %edx
796; X86-NEXT:    orl %ecx, %edx
797; X86-NEXT:    setne %al
798; X86-NEXT:    retl
799;
800; X64-LABEL: length8_eq_const:
801; X64:       # %bb.0:
802; X64-NEXT:    movabsq $3978425819141910832, %rax # imm = 0x3736353433323130
803; X64-NEXT:    cmpq %rax, (%rdi)
804; X64-NEXT:    setne %al
805; X64-NEXT:    retq
806  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 8) nounwind
807  %c = icmp ne i32 %m, 0
808  ret i1 %c
809}
810
811define i1 @length9_eq(i8* %X, i8* %Y) nounwind {
812; X86-LABEL: length9_eq:
813; X86:       # %bb.0:
814; X86-NEXT:    pushl %esi
815; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
816; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
817; X86-NEXT:    movl (%ecx), %edx
818; X86-NEXT:    movl 4(%ecx), %esi
819; X86-NEXT:    xorl (%eax), %edx
820; X86-NEXT:    xorl 4(%eax), %esi
821; X86-NEXT:    orl %edx, %esi
822; X86-NEXT:    movb 8(%ecx), %cl
823; X86-NEXT:    xorb 8(%eax), %cl
824; X86-NEXT:    movzbl %cl, %eax
825; X86-NEXT:    orl %esi, %eax
826; X86-NEXT:    sete %al
827; X86-NEXT:    popl %esi
828; X86-NEXT:    retl
829;
830; X64-LABEL: length9_eq:
831; X64:       # %bb.0:
832; X64-NEXT:    movq (%rdi), %rax
833; X64-NEXT:    xorq (%rsi), %rax
834; X64-NEXT:    movb 8(%rdi), %cl
835; X64-NEXT:    xorb 8(%rsi), %cl
836; X64-NEXT:    movzbl %cl, %ecx
837; X64-NEXT:    orq %rax, %rcx
838; X64-NEXT:    sete %al
839; X64-NEXT:    retq
840  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 9) nounwind
841  %c = icmp eq i32 %m, 0
842  ret i1 %c
843}
844
845define i1 @length10_eq(i8* %X, i8* %Y) nounwind {
846; X86-LABEL: length10_eq:
847; X86:       # %bb.0:
848; X86-NEXT:    pushl %esi
849; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
850; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
851; X86-NEXT:    movl (%ecx), %edx
852; X86-NEXT:    movl 4(%ecx), %esi
853; X86-NEXT:    xorl (%eax), %edx
854; X86-NEXT:    xorl 4(%eax), %esi
855; X86-NEXT:    orl %edx, %esi
856; X86-NEXT:    movzwl 8(%ecx), %ecx
857; X86-NEXT:    xorw 8(%eax), %cx
858; X86-NEXT:    movzwl %cx, %eax
859; X86-NEXT:    orl %esi, %eax
860; X86-NEXT:    sete %al
861; X86-NEXT:    popl %esi
862; X86-NEXT:    retl
863;
864; X64-LABEL: length10_eq:
865; X64:       # %bb.0:
866; X64-NEXT:    movq (%rdi), %rax
867; X64-NEXT:    xorq (%rsi), %rax
868; X64-NEXT:    movzwl 8(%rdi), %ecx
869; X64-NEXT:    xorw 8(%rsi), %cx
870; X64-NEXT:    movzwl %cx, %ecx
871; X64-NEXT:    orq %rax, %rcx
872; X64-NEXT:    sete %al
873; X64-NEXT:    retq
874  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 10) nounwind
875  %c = icmp eq i32 %m, 0
876  ret i1 %c
877}
878
879define i1 @length11_eq(i8* %X, i8* %Y) nounwind {
880; X86-LABEL: length11_eq:
881; X86:       # %bb.0:
882; X86-NEXT:    pushl %esi
883; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
884; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
885; X86-NEXT:    movl (%ecx), %edx
886; X86-NEXT:    movl 4(%ecx), %esi
887; X86-NEXT:    xorl (%eax), %edx
888; X86-NEXT:    xorl 4(%eax), %esi
889; X86-NEXT:    orl %edx, %esi
890; X86-NEXT:    movl 7(%ecx), %ecx
891; X86-NEXT:    xorl 7(%eax), %ecx
892; X86-NEXT:    orl %esi, %ecx
893; X86-NEXT:    sete %al
894; X86-NEXT:    popl %esi
895; X86-NEXT:    retl
896;
897; X64-LABEL: length11_eq:
898; X64:       # %bb.0:
899; X64-NEXT:    movq (%rdi), %rax
900; X64-NEXT:    movq 3(%rdi), %rcx
901; X64-NEXT:    xorq (%rsi), %rax
902; X64-NEXT:    xorq 3(%rsi), %rcx
903; X64-NEXT:    orq %rax, %rcx
904; X64-NEXT:    sete %al
905; X64-NEXT:    retq
906  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 11) nounwind
907  %c = icmp eq i32 %m, 0
908  ret i1 %c
909}
910
911define i1 @length12_eq(i8* %X, i8* %Y) nounwind {
912; X86-LABEL: length12_eq:
913; X86:       # %bb.0:
914; X86-NEXT:    pushl %esi
915; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
916; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
917; X86-NEXT:    movl (%ecx), %edx
918; X86-NEXT:    movl 4(%ecx), %esi
919; X86-NEXT:    xorl (%eax), %edx
920; X86-NEXT:    xorl 4(%eax), %esi
921; X86-NEXT:    orl %edx, %esi
922; X86-NEXT:    movl 8(%ecx), %ecx
923; X86-NEXT:    xorl 8(%eax), %ecx
924; X86-NEXT:    orl %esi, %ecx
925; X86-NEXT:    setne %al
926; X86-NEXT:    popl %esi
927; X86-NEXT:    retl
928;
929; X64-LABEL: length12_eq:
930; X64:       # %bb.0:
931; X64-NEXT:    movq (%rdi), %rax
932; X64-NEXT:    xorq (%rsi), %rax
933; X64-NEXT:    movl 8(%rdi), %ecx
934; X64-NEXT:    xorl 8(%rsi), %ecx
935; X64-NEXT:    orq %rax, %rcx
936; X64-NEXT:    setne %al
937; X64-NEXT:    retq
938  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 12) nounwind
939  %c = icmp ne i32 %m, 0
940  ret i1 %c
941}
942
943define i32 @length12(i8* %X, i8* %Y) nounwind {
944; X86-LABEL: length12:
945; X86:       # %bb.0:
946; X86-NEXT:    pushl %esi
947; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
948; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
949; X86-NEXT:    movl (%esi), %ecx
950; X86-NEXT:    movl (%eax), %edx
951; X86-NEXT:    bswapl %ecx
952; X86-NEXT:    bswapl %edx
953; X86-NEXT:    cmpl %edx, %ecx
954; X86-NEXT:    jne .LBB29_3
955; X86-NEXT:  # %bb.1: # %loadbb1
956; X86-NEXT:    movl 4(%esi), %ecx
957; X86-NEXT:    movl 4(%eax), %edx
958; X86-NEXT:    bswapl %ecx
959; X86-NEXT:    bswapl %edx
960; X86-NEXT:    cmpl %edx, %ecx
961; X86-NEXT:    jne .LBB29_3
962; X86-NEXT:  # %bb.2: # %loadbb2
963; X86-NEXT:    movl 8(%esi), %ecx
964; X86-NEXT:    movl 8(%eax), %edx
965; X86-NEXT:    bswapl %ecx
966; X86-NEXT:    bswapl %edx
967; X86-NEXT:    xorl %eax, %eax
968; X86-NEXT:    cmpl %edx, %ecx
969; X86-NEXT:    je .LBB29_4
970; X86-NEXT:  .LBB29_3: # %res_block
971; X86-NEXT:    xorl %eax, %eax
972; X86-NEXT:    cmpl %edx, %ecx
973; X86-NEXT:    setae %al
974; X86-NEXT:    leal -1(%eax,%eax), %eax
975; X86-NEXT:  .LBB29_4: # %endblock
976; X86-NEXT:    popl %esi
977; X86-NEXT:    retl
978;
979; X64-LABEL: length12:
980; X64:       # %bb.0:
981; X64-NEXT:    movq (%rdi), %rcx
982; X64-NEXT:    movq (%rsi), %rdx
983; X64-NEXT:    bswapq %rcx
984; X64-NEXT:    bswapq %rdx
985; X64-NEXT:    cmpq %rdx, %rcx
986; X64-NEXT:    jne .LBB29_2
987; X64-NEXT:  # %bb.1: # %loadbb1
988; X64-NEXT:    movl 8(%rdi), %ecx
989; X64-NEXT:    movl 8(%rsi), %edx
990; X64-NEXT:    bswapl %ecx
991; X64-NEXT:    bswapl %edx
992; X64-NEXT:    xorl %eax, %eax
993; X64-NEXT:    cmpq %rdx, %rcx
994; X64-NEXT:    je .LBB29_3
995; X64-NEXT:  .LBB29_2: # %res_block
996; X64-NEXT:    xorl %eax, %eax
997; X64-NEXT:    cmpq %rdx, %rcx
998; X64-NEXT:    setae %al
999; X64-NEXT:    leal -1(%rax,%rax), %eax
1000; X64-NEXT:  .LBB29_3: # %endblock
1001; X64-NEXT:    retq
1002  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 12) nounwind
1003  ret i32 %m
1004}
1005
1006define i1 @length13_eq(i8* %X, i8* %Y) nounwind {
1007; X86-LABEL: length13_eq:
1008; X86:       # %bb.0:
1009; X86-NEXT:    pushl %esi
1010; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1011; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1012; X86-NEXT:    movl (%ecx), %edx
1013; X86-NEXT:    movl 4(%ecx), %esi
1014; X86-NEXT:    xorl (%eax), %edx
1015; X86-NEXT:    xorl 4(%eax), %esi
1016; X86-NEXT:    orl %edx, %esi
1017; X86-NEXT:    movl 8(%ecx), %edx
1018; X86-NEXT:    xorl 8(%eax), %edx
1019; X86-NEXT:    movb 12(%ecx), %cl
1020; X86-NEXT:    xorb 12(%eax), %cl
1021; X86-NEXT:    movzbl %cl, %eax
1022; X86-NEXT:    orl %edx, %eax
1023; X86-NEXT:    orl %esi, %eax
1024; X86-NEXT:    sete %al
1025; X86-NEXT:    popl %esi
1026; X86-NEXT:    retl
1027;
1028; X64-LABEL: length13_eq:
1029; X64:       # %bb.0:
1030; X64-NEXT:    movq (%rdi), %rax
1031; X64-NEXT:    movq 5(%rdi), %rcx
1032; X64-NEXT:    xorq (%rsi), %rax
1033; X64-NEXT:    xorq 5(%rsi), %rcx
1034; X64-NEXT:    orq %rax, %rcx
1035; X64-NEXT:    sete %al
1036; X64-NEXT:    retq
1037  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 13) nounwind
1038  %c = icmp eq i32 %m, 0
1039  ret i1 %c
1040}
1041
1042define i1 @length14_eq(i8* %X, i8* %Y) nounwind {
1043; X86-LABEL: length14_eq:
1044; X86:       # %bb.0:
1045; X86-NEXT:    pushl %esi
1046; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1047; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1048; X86-NEXT:    movl (%ecx), %edx
1049; X86-NEXT:    movl 4(%ecx), %esi
1050; X86-NEXT:    xorl (%eax), %edx
1051; X86-NEXT:    xorl 4(%eax), %esi
1052; X86-NEXT:    orl %edx, %esi
1053; X86-NEXT:    movl 8(%ecx), %edx
1054; X86-NEXT:    xorl 8(%eax), %edx
1055; X86-NEXT:    movzwl 12(%ecx), %ecx
1056; X86-NEXT:    xorw 12(%eax), %cx
1057; X86-NEXT:    movzwl %cx, %eax
1058; X86-NEXT:    orl %edx, %eax
1059; X86-NEXT:    orl %esi, %eax
1060; X86-NEXT:    sete %al
1061; X86-NEXT:    popl %esi
1062; X86-NEXT:    retl
1063;
1064; X64-LABEL: length14_eq:
1065; X64:       # %bb.0:
1066; X64-NEXT:    movq (%rdi), %rax
1067; X64-NEXT:    movq 6(%rdi), %rcx
1068; X64-NEXT:    xorq (%rsi), %rax
1069; X64-NEXT:    xorq 6(%rsi), %rcx
1070; X64-NEXT:    orq %rax, %rcx
1071; X64-NEXT:    sete %al
1072; X64-NEXT:    retq
1073  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 14) nounwind
1074  %c = icmp eq i32 %m, 0
1075  ret i1 %c
1076}
1077
1078define i1 @length15_eq(i8* %X, i8* %Y) nounwind {
1079; X86-LABEL: length15_eq:
1080; X86:       # %bb.0:
1081; X86-NEXT:    pushl %esi
1082; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1083; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1084; X86-NEXT:    movl (%ecx), %edx
1085; X86-NEXT:    movl 4(%ecx), %esi
1086; X86-NEXT:    xorl (%eax), %edx
1087; X86-NEXT:    xorl 4(%eax), %esi
1088; X86-NEXT:    orl %edx, %esi
1089; X86-NEXT:    movl 8(%ecx), %edx
1090; X86-NEXT:    xorl 8(%eax), %edx
1091; X86-NEXT:    movl 11(%ecx), %ecx
1092; X86-NEXT:    xorl 11(%eax), %ecx
1093; X86-NEXT:    orl %edx, %ecx
1094; X86-NEXT:    orl %esi, %ecx
1095; X86-NEXT:    sete %al
1096; X86-NEXT:    popl %esi
1097; X86-NEXT:    retl
1098;
1099; X64-LABEL: length15_eq:
1100; X64:       # %bb.0:
1101; X64-NEXT:    movq (%rdi), %rax
1102; X64-NEXT:    movq 7(%rdi), %rcx
1103; X64-NEXT:    xorq (%rsi), %rax
1104; X64-NEXT:    xorq 7(%rsi), %rcx
1105; X64-NEXT:    orq %rax, %rcx
1106; X64-NEXT:    sete %al
1107; X64-NEXT:    retq
1108  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 15) nounwind
1109  %c = icmp eq i32 %m, 0
1110  ret i1 %c
1111}
1112
1113; PR33329 - https://bugs.llvm.org/show_bug.cgi?id=33329
1114
1115define i32 @length16(i8* %X, i8* %Y) nounwind {
1116; X86-LABEL: length16:
1117; X86:       # %bb.0:
1118; X86-NEXT:    pushl %esi
1119; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1120; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
1121; X86-NEXT:    movl (%esi), %ecx
1122; X86-NEXT:    movl (%eax), %edx
1123; X86-NEXT:    bswapl %ecx
1124; X86-NEXT:    bswapl %edx
1125; X86-NEXT:    cmpl %edx, %ecx
1126; X86-NEXT:    jne .LBB33_4
1127; X86-NEXT:  # %bb.1: # %loadbb1
1128; X86-NEXT:    movl 4(%esi), %ecx
1129; X86-NEXT:    movl 4(%eax), %edx
1130; X86-NEXT:    bswapl %ecx
1131; X86-NEXT:    bswapl %edx
1132; X86-NEXT:    cmpl %edx, %ecx
1133; X86-NEXT:    jne .LBB33_4
1134; X86-NEXT:  # %bb.2: # %loadbb2
1135; X86-NEXT:    movl 8(%esi), %ecx
1136; X86-NEXT:    movl 8(%eax), %edx
1137; X86-NEXT:    bswapl %ecx
1138; X86-NEXT:    bswapl %edx
1139; X86-NEXT:    cmpl %edx, %ecx
1140; X86-NEXT:    jne .LBB33_4
1141; X86-NEXT:  # %bb.3: # %loadbb3
1142; X86-NEXT:    movl 12(%esi), %ecx
1143; X86-NEXT:    movl 12(%eax), %edx
1144; X86-NEXT:    bswapl %ecx
1145; X86-NEXT:    bswapl %edx
1146; X86-NEXT:    xorl %eax, %eax
1147; X86-NEXT:    cmpl %edx, %ecx
1148; X86-NEXT:    je .LBB33_5
1149; X86-NEXT:  .LBB33_4: # %res_block
1150; X86-NEXT:    xorl %eax, %eax
1151; X86-NEXT:    cmpl %edx, %ecx
1152; X86-NEXT:    setae %al
1153; X86-NEXT:    leal -1(%eax,%eax), %eax
1154; X86-NEXT:  .LBB33_5: # %endblock
1155; X86-NEXT:    popl %esi
1156; X86-NEXT:    retl
1157;
1158; X64-LABEL: length16:
1159; X64:       # %bb.0:
1160; X64-NEXT:    movq (%rdi), %rcx
1161; X64-NEXT:    movq (%rsi), %rdx
1162; X64-NEXT:    bswapq %rcx
1163; X64-NEXT:    bswapq %rdx
1164; X64-NEXT:    cmpq %rdx, %rcx
1165; X64-NEXT:    jne .LBB33_2
1166; X64-NEXT:  # %bb.1: # %loadbb1
1167; X64-NEXT:    movq 8(%rdi), %rcx
1168; X64-NEXT:    movq 8(%rsi), %rdx
1169; X64-NEXT:    bswapq %rcx
1170; X64-NEXT:    bswapq %rdx
1171; X64-NEXT:    xorl %eax, %eax
1172; X64-NEXT:    cmpq %rdx, %rcx
1173; X64-NEXT:    je .LBB33_3
1174; X64-NEXT:  .LBB33_2: # %res_block
1175; X64-NEXT:    xorl %eax, %eax
1176; X64-NEXT:    cmpq %rdx, %rcx
1177; X64-NEXT:    setae %al
1178; X64-NEXT:    leal -1(%rax,%rax), %eax
1179; X64-NEXT:  .LBB33_3: # %endblock
1180; X64-NEXT:    retq
1181  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 16) nounwind
1182  ret i32 %m
1183}
1184
1185define i1 @length16_eq(i8* %x, i8* %y) nounwind {
1186; X86-NOSSE-LABEL: length16_eq:
1187; X86-NOSSE:       # %bb.0:
1188; X86-NOSSE-NEXT:    pushl %esi
1189; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
1190; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1191; X86-NOSSE-NEXT:    movl (%ecx), %edx
1192; X86-NOSSE-NEXT:    movl 4(%ecx), %esi
1193; X86-NOSSE-NEXT:    xorl (%eax), %edx
1194; X86-NOSSE-NEXT:    xorl 4(%eax), %esi
1195; X86-NOSSE-NEXT:    orl %edx, %esi
1196; X86-NOSSE-NEXT:    movl 8(%ecx), %edx
1197; X86-NOSSE-NEXT:    xorl 8(%eax), %edx
1198; X86-NOSSE-NEXT:    movl 12(%ecx), %ecx
1199; X86-NOSSE-NEXT:    xorl 12(%eax), %ecx
1200; X86-NOSSE-NEXT:    orl %edx, %ecx
1201; X86-NOSSE-NEXT:    orl %esi, %ecx
1202; X86-NOSSE-NEXT:    setne %al
1203; X86-NOSSE-NEXT:    popl %esi
1204; X86-NOSSE-NEXT:    retl
1205;
1206; X86-SSE1-LABEL: length16_eq:
1207; X86-SSE1:       # %bb.0:
1208; X86-SSE1-NEXT:    pushl %esi
1209; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax
1210; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1211; X86-SSE1-NEXT:    movl (%ecx), %edx
1212; X86-SSE1-NEXT:    movl 4(%ecx), %esi
1213; X86-SSE1-NEXT:    xorl (%eax), %edx
1214; X86-SSE1-NEXT:    xorl 4(%eax), %esi
1215; X86-SSE1-NEXT:    orl %edx, %esi
1216; X86-SSE1-NEXT:    movl 8(%ecx), %edx
1217; X86-SSE1-NEXT:    xorl 8(%eax), %edx
1218; X86-SSE1-NEXT:    movl 12(%ecx), %ecx
1219; X86-SSE1-NEXT:    xorl 12(%eax), %ecx
1220; X86-SSE1-NEXT:    orl %edx, %ecx
1221; X86-SSE1-NEXT:    orl %esi, %ecx
1222; X86-SSE1-NEXT:    setne %al
1223; X86-SSE1-NEXT:    popl %esi
1224; X86-SSE1-NEXT:    retl
1225;
1226; X86-SSE2-LABEL: length16_eq:
1227; X86-SSE2:       # %bb.0:
1228; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1229; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1230; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
1231; X86-SSE2-NEXT:    movdqu (%eax), %xmm1
1232; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm1
1233; X86-SSE2-NEXT:    pmovmskb %xmm1, %eax
1234; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1235; X86-SSE2-NEXT:    setne %al
1236; X86-SSE2-NEXT:    retl
1237;
1238; X86-SSE41-LABEL: length16_eq:
1239; X86-SSE41:       # %bb.0:
1240; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1241; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1242; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
1243; X86-SSE41-NEXT:    movdqu (%eax), %xmm1
1244; X86-SSE41-NEXT:    pxor %xmm0, %xmm1
1245; X86-SSE41-NEXT:    ptest %xmm1, %xmm1
1246; X86-SSE41-NEXT:    setne %al
1247; X86-SSE41-NEXT:    retl
1248;
1249; X64-SSE2-LABEL: length16_eq:
1250; X64-SSE2:       # %bb.0:
1251; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1252; X64-SSE2-NEXT:    movdqu (%rsi), %xmm1
1253; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm1
1254; X64-SSE2-NEXT:    pmovmskb %xmm1, %eax
1255; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1256; X64-SSE2-NEXT:    setne %al
1257; X64-SSE2-NEXT:    retq
1258;
1259; X64-SSE41-LABEL: length16_eq:
1260; X64-SSE41:       # %bb.0:
1261; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1262; X64-SSE41-NEXT:    movdqu (%rsi), %xmm1
1263; X64-SSE41-NEXT:    pxor %xmm0, %xmm1
1264; X64-SSE41-NEXT:    ptest %xmm1, %xmm1
1265; X64-SSE41-NEXT:    setne %al
1266; X64-SSE41-NEXT:    retq
1267;
1268; X64-AVX-LABEL: length16_eq:
1269; X64-AVX:       # %bb.0:
1270; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1271; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0
1272; X64-AVX-NEXT:    vptest %xmm0, %xmm0
1273; X64-AVX-NEXT:    setne %al
1274; X64-AVX-NEXT:    retq
1275;
1276; X64-MIC-AVX-LABEL: length16_eq:
1277; X64-MIC-AVX:       # %bb.0:
1278; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1279; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm1
1280; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
1281; X64-MIC-AVX-NEXT:    kortestw %k0, %k0
1282; X64-MIC-AVX-NEXT:    setne %al
1283; X64-MIC-AVX-NEXT:    vzeroupper
1284; X64-MIC-AVX-NEXT:    retq
1285  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 16) nounwind
1286  %cmp = icmp ne i32 %call, 0
1287  ret i1 %cmp
1288}
1289
1290define i1 @length16_lt(i8* %x, i8* %y) nounwind {
1291; X86-LABEL: length16_lt:
1292; X86:       # %bb.0:
1293; X86-NEXT:    pushl %esi
1294; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1295; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
1296; X86-NEXT:    movl (%esi), %ecx
1297; X86-NEXT:    movl (%eax), %edx
1298; X86-NEXT:    bswapl %ecx
1299; X86-NEXT:    bswapl %edx
1300; X86-NEXT:    cmpl %edx, %ecx
1301; X86-NEXT:    jne .LBB35_4
1302; X86-NEXT:  # %bb.1: # %loadbb1
1303; X86-NEXT:    movl 4(%esi), %ecx
1304; X86-NEXT:    movl 4(%eax), %edx
1305; X86-NEXT:    bswapl %ecx
1306; X86-NEXT:    bswapl %edx
1307; X86-NEXT:    cmpl %edx, %ecx
1308; X86-NEXT:    jne .LBB35_4
1309; X86-NEXT:  # %bb.2: # %loadbb2
1310; X86-NEXT:    movl 8(%esi), %ecx
1311; X86-NEXT:    movl 8(%eax), %edx
1312; X86-NEXT:    bswapl %ecx
1313; X86-NEXT:    bswapl %edx
1314; X86-NEXT:    cmpl %edx, %ecx
1315; X86-NEXT:    jne .LBB35_4
1316; X86-NEXT:  # %bb.3: # %loadbb3
1317; X86-NEXT:    movl 12(%esi), %ecx
1318; X86-NEXT:    movl 12(%eax), %edx
1319; X86-NEXT:    bswapl %ecx
1320; X86-NEXT:    bswapl %edx
1321; X86-NEXT:    xorl %eax, %eax
1322; X86-NEXT:    cmpl %edx, %ecx
1323; X86-NEXT:    je .LBB35_5
1324; X86-NEXT:  .LBB35_4: # %res_block
1325; X86-NEXT:    xorl %eax, %eax
1326; X86-NEXT:    cmpl %edx, %ecx
1327; X86-NEXT:    setae %al
1328; X86-NEXT:    leal -1(%eax,%eax), %eax
1329; X86-NEXT:  .LBB35_5: # %endblock
1330; X86-NEXT:    shrl $31, %eax
1331; X86-NEXT:    # kill: def $al killed $al killed $eax
1332; X86-NEXT:    popl %esi
1333; X86-NEXT:    retl
1334;
1335; X64-LABEL: length16_lt:
1336; X64:       # %bb.0:
1337; X64-NEXT:    movq (%rdi), %rcx
1338; X64-NEXT:    movq (%rsi), %rdx
1339; X64-NEXT:    bswapq %rcx
1340; X64-NEXT:    bswapq %rdx
1341; X64-NEXT:    cmpq %rdx, %rcx
1342; X64-NEXT:    jne .LBB35_2
1343; X64-NEXT:  # %bb.1: # %loadbb1
1344; X64-NEXT:    movq 8(%rdi), %rcx
1345; X64-NEXT:    movq 8(%rsi), %rdx
1346; X64-NEXT:    bswapq %rcx
1347; X64-NEXT:    bswapq %rdx
1348; X64-NEXT:    xorl %eax, %eax
1349; X64-NEXT:    cmpq %rdx, %rcx
1350; X64-NEXT:    je .LBB35_3
1351; X64-NEXT:  .LBB35_2: # %res_block
1352; X64-NEXT:    xorl %eax, %eax
1353; X64-NEXT:    cmpq %rdx, %rcx
1354; X64-NEXT:    setae %al
1355; X64-NEXT:    leal -1(%rax,%rax), %eax
1356; X64-NEXT:  .LBB35_3: # %endblock
1357; X64-NEXT:    shrl $31, %eax
1358; X64-NEXT:    # kill: def $al killed $al killed $eax
1359; X64-NEXT:    retq
1360  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 16) nounwind
1361  %cmp = icmp slt i32 %call, 0
1362  ret i1 %cmp
1363}
1364
1365define i1 @length16_gt(i8* %x, i8* %y) nounwind {
1366; X86-LABEL: length16_gt:
1367; X86:       # %bb.0:
1368; X86-NEXT:    pushl %esi
1369; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
1370; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
1371; X86-NEXT:    movl (%esi), %eax
1372; X86-NEXT:    movl (%edx), %ecx
1373; X86-NEXT:    bswapl %eax
1374; X86-NEXT:    bswapl %ecx
1375; X86-NEXT:    cmpl %ecx, %eax
1376; X86-NEXT:    jne .LBB36_4
1377; X86-NEXT:  # %bb.1: # %loadbb1
1378; X86-NEXT:    movl 4(%esi), %eax
1379; X86-NEXT:    movl 4(%edx), %ecx
1380; X86-NEXT:    bswapl %eax
1381; X86-NEXT:    bswapl %ecx
1382; X86-NEXT:    cmpl %ecx, %eax
1383; X86-NEXT:    jne .LBB36_4
1384; X86-NEXT:  # %bb.2: # %loadbb2
1385; X86-NEXT:    movl 8(%esi), %eax
1386; X86-NEXT:    movl 8(%edx), %ecx
1387; X86-NEXT:    bswapl %eax
1388; X86-NEXT:    bswapl %ecx
1389; X86-NEXT:    cmpl %ecx, %eax
1390; X86-NEXT:    jne .LBB36_4
1391; X86-NEXT:  # %bb.3: # %loadbb3
1392; X86-NEXT:    movl 12(%esi), %eax
1393; X86-NEXT:    movl 12(%edx), %ecx
1394; X86-NEXT:    bswapl %eax
1395; X86-NEXT:    bswapl %ecx
1396; X86-NEXT:    xorl %edx, %edx
1397; X86-NEXT:    cmpl %ecx, %eax
1398; X86-NEXT:    je .LBB36_5
1399; X86-NEXT:  .LBB36_4: # %res_block
1400; X86-NEXT:    xorl %edx, %edx
1401; X86-NEXT:    cmpl %ecx, %eax
1402; X86-NEXT:    setae %dl
1403; X86-NEXT:    leal -1(%edx,%edx), %edx
1404; X86-NEXT:  .LBB36_5: # %endblock
1405; X86-NEXT:    testl %edx, %edx
1406; X86-NEXT:    setg %al
1407; X86-NEXT:    popl %esi
1408; X86-NEXT:    retl
1409;
1410; X64-LABEL: length16_gt:
1411; X64:       # %bb.0:
1412; X64-NEXT:    movq (%rdi), %rax
1413; X64-NEXT:    movq (%rsi), %rcx
1414; X64-NEXT:    bswapq %rax
1415; X64-NEXT:    bswapq %rcx
1416; X64-NEXT:    cmpq %rcx, %rax
1417; X64-NEXT:    jne .LBB36_2
1418; X64-NEXT:  # %bb.1: # %loadbb1
1419; X64-NEXT:    movq 8(%rdi), %rax
1420; X64-NEXT:    movq 8(%rsi), %rcx
1421; X64-NEXT:    bswapq %rax
1422; X64-NEXT:    bswapq %rcx
1423; X64-NEXT:    xorl %edx, %edx
1424; X64-NEXT:    cmpq %rcx, %rax
1425; X64-NEXT:    je .LBB36_3
1426; X64-NEXT:  .LBB36_2: # %res_block
1427; X64-NEXT:    xorl %edx, %edx
1428; X64-NEXT:    cmpq %rcx, %rax
1429; X64-NEXT:    setae %dl
1430; X64-NEXT:    leal -1(%rdx,%rdx), %edx
1431; X64-NEXT:  .LBB36_3: # %endblock
1432; X64-NEXT:    testl %edx, %edx
1433; X64-NEXT:    setg %al
1434; X64-NEXT:    retq
1435  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 16) nounwind
1436  %cmp = icmp sgt i32 %call, 0
1437  ret i1 %cmp
1438}
1439
1440define i1 @length16_eq_const(i8* %X) nounwind {
1441; X86-NOSSE-LABEL: length16_eq_const:
1442; X86-NOSSE:       # %bb.0:
1443; X86-NOSSE-NEXT:    pushl %esi
1444; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
1445; X86-NOSSE-NEXT:    movl $858927408, %ecx # imm = 0x33323130
1446; X86-NOSSE-NEXT:    xorl (%eax), %ecx
1447; X86-NOSSE-NEXT:    movl $926299444, %edx # imm = 0x37363534
1448; X86-NOSSE-NEXT:    xorl 4(%eax), %edx
1449; X86-NOSSE-NEXT:    orl %ecx, %edx
1450; X86-NOSSE-NEXT:    movl $825243960, %ecx # imm = 0x31303938
1451; X86-NOSSE-NEXT:    xorl 8(%eax), %ecx
1452; X86-NOSSE-NEXT:    movl $892613426, %esi # imm = 0x35343332
1453; X86-NOSSE-NEXT:    xorl 12(%eax), %esi
1454; X86-NOSSE-NEXT:    orl %ecx, %esi
1455; X86-NOSSE-NEXT:    orl %edx, %esi
1456; X86-NOSSE-NEXT:    sete %al
1457; X86-NOSSE-NEXT:    popl %esi
1458; X86-NOSSE-NEXT:    retl
1459;
1460; X86-SSE1-LABEL: length16_eq_const:
1461; X86-SSE1:       # %bb.0:
1462; X86-SSE1-NEXT:    pushl %esi
1463; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax
1464; X86-SSE1-NEXT:    movl $858927408, %ecx # imm = 0x33323130
1465; X86-SSE1-NEXT:    xorl (%eax), %ecx
1466; X86-SSE1-NEXT:    movl $926299444, %edx # imm = 0x37363534
1467; X86-SSE1-NEXT:    xorl 4(%eax), %edx
1468; X86-SSE1-NEXT:    orl %ecx, %edx
1469; X86-SSE1-NEXT:    movl $825243960, %ecx # imm = 0x31303938
1470; X86-SSE1-NEXT:    xorl 8(%eax), %ecx
1471; X86-SSE1-NEXT:    movl $892613426, %esi # imm = 0x35343332
1472; X86-SSE1-NEXT:    xorl 12(%eax), %esi
1473; X86-SSE1-NEXT:    orl %ecx, %esi
1474; X86-SSE1-NEXT:    orl %edx, %esi
1475; X86-SSE1-NEXT:    sete %al
1476; X86-SSE1-NEXT:    popl %esi
1477; X86-SSE1-NEXT:    retl
1478;
1479; X86-SSE2-LABEL: length16_eq_const:
1480; X86-SSE2:       # %bb.0:
1481; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1482; X86-SSE2-NEXT:    movdqu (%eax), %xmm0
1483; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1484; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
1485; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1486; X86-SSE2-NEXT:    sete %al
1487; X86-SSE2-NEXT:    retl
1488;
1489; X86-SSE41-LABEL: length16_eq_const:
1490; X86-SSE41:       # %bb.0:
1491; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1492; X86-SSE41-NEXT:    movdqu (%eax), %xmm0
1493; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1494; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
1495; X86-SSE41-NEXT:    sete %al
1496; X86-SSE41-NEXT:    retl
1497;
1498; X64-SSE2-LABEL: length16_eq_const:
1499; X64-SSE2:       # %bb.0:
1500; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1501; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1502; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
1503; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1504; X64-SSE2-NEXT:    sete %al
1505; X64-SSE2-NEXT:    retq
1506;
1507; X64-SSE41-LABEL: length16_eq_const:
1508; X64-SSE41:       # %bb.0:
1509; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1510; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1511; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
1512; X64-SSE41-NEXT:    sete %al
1513; X64-SSE41-NEXT:    retq
1514;
1515; X64-AVX-LABEL: length16_eq_const:
1516; X64-AVX:       # %bb.0:
1517; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1518; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1519; X64-AVX-NEXT:    vptest %xmm0, %xmm0
1520; X64-AVX-NEXT:    sete %al
1521; X64-AVX-NEXT:    retq
1522;
1523; X64-MIC-AVX-LABEL: length16_eq_const:
1524; X64-MIC-AVX:       # %bb.0:
1525; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1526; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426]
1527; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
1528; X64-MIC-AVX-NEXT:    kortestw %k0, %k0
1529; X64-MIC-AVX-NEXT:    sete %al
1530; X64-MIC-AVX-NEXT:    vzeroupper
1531; X64-MIC-AVX-NEXT:    retq
1532  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 16) nounwind
1533  %c = icmp eq i32 %m, 0
1534  ret i1 %c
1535}
1536
1537; PR33914 - https://bugs.llvm.org/show_bug.cgi?id=33914
1538
1539define i32 @length24(i8* %X, i8* %Y) nounwind {
1540; X86-LABEL: length24:
1541; X86:       # %bb.0:
1542; X86-NEXT:    pushl $0
1543; X86-NEXT:    pushl $24
1544; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1545; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1546; X86-NEXT:    calll memcmp
1547; X86-NEXT:    addl $16, %esp
1548; X86-NEXT:    retl
1549;
1550; X64-LABEL: length24:
1551; X64:       # %bb.0:
1552; X64-NEXT:    movq (%rdi), %rcx
1553; X64-NEXT:    movq (%rsi), %rdx
1554; X64-NEXT:    bswapq %rcx
1555; X64-NEXT:    bswapq %rdx
1556; X64-NEXT:    cmpq %rdx, %rcx
1557; X64-NEXT:    jne .LBB38_3
1558; X64-NEXT:  # %bb.1: # %loadbb1
1559; X64-NEXT:    movq 8(%rdi), %rcx
1560; X64-NEXT:    movq 8(%rsi), %rdx
1561; X64-NEXT:    bswapq %rcx
1562; X64-NEXT:    bswapq %rdx
1563; X64-NEXT:    cmpq %rdx, %rcx
1564; X64-NEXT:    jne .LBB38_3
1565; X64-NEXT:  # %bb.2: # %loadbb2
1566; X64-NEXT:    movq 16(%rdi), %rcx
1567; X64-NEXT:    movq 16(%rsi), %rdx
1568; X64-NEXT:    bswapq %rcx
1569; X64-NEXT:    bswapq %rdx
1570; X64-NEXT:    xorl %eax, %eax
1571; X64-NEXT:    cmpq %rdx, %rcx
1572; X64-NEXT:    je .LBB38_4
1573; X64-NEXT:  .LBB38_3: # %res_block
1574; X64-NEXT:    xorl %eax, %eax
1575; X64-NEXT:    cmpq %rdx, %rcx
1576; X64-NEXT:    setae %al
1577; X64-NEXT:    leal -1(%rax,%rax), %eax
1578; X64-NEXT:  .LBB38_4: # %endblock
1579; X64-NEXT:    retq
1580  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 24) nounwind
1581  ret i32 %m
1582}
1583
1584define i1 @length24_eq(i8* %x, i8* %y) nounwind {
1585; X86-NOSSE-LABEL: length24_eq:
1586; X86-NOSSE:       # %bb.0:
1587; X86-NOSSE-NEXT:    pushl $0
1588; X86-NOSSE-NEXT:    pushl $24
1589; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1590; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1591; X86-NOSSE-NEXT:    calll memcmp
1592; X86-NOSSE-NEXT:    addl $16, %esp
1593; X86-NOSSE-NEXT:    testl %eax, %eax
1594; X86-NOSSE-NEXT:    sete %al
1595; X86-NOSSE-NEXT:    retl
1596;
1597; X86-SSE1-LABEL: length24_eq:
1598; X86-SSE1:       # %bb.0:
1599; X86-SSE1-NEXT:    pushl $0
1600; X86-SSE1-NEXT:    pushl $24
1601; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1602; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1603; X86-SSE1-NEXT:    calll memcmp
1604; X86-SSE1-NEXT:    addl $16, %esp
1605; X86-SSE1-NEXT:    testl %eax, %eax
1606; X86-SSE1-NEXT:    sete %al
1607; X86-SSE1-NEXT:    retl
1608;
1609; X86-SSE2-LABEL: length24_eq:
1610; X86-SSE2:       # %bb.0:
1611; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1612; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1613; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
1614; X86-SSE2-NEXT:    movdqu 8(%ecx), %xmm1
1615; X86-SSE2-NEXT:    movdqu (%eax), %xmm2
1616; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1617; X86-SSE2-NEXT:    movdqu 8(%eax), %xmm0
1618; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1619; X86-SSE2-NEXT:    pand %xmm2, %xmm0
1620; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
1621; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1622; X86-SSE2-NEXT:    sete %al
1623; X86-SSE2-NEXT:    retl
1624;
1625; X86-SSE41-LABEL: length24_eq:
1626; X86-SSE41:       # %bb.0:
1627; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1628; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1629; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
1630; X86-SSE41-NEXT:    movdqu 8(%ecx), %xmm1
1631; X86-SSE41-NEXT:    movdqu (%eax), %xmm2
1632; X86-SSE41-NEXT:    pxor %xmm0, %xmm2
1633; X86-SSE41-NEXT:    movdqu 8(%eax), %xmm0
1634; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
1635; X86-SSE41-NEXT:    por %xmm2, %xmm0
1636; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
1637; X86-SSE41-NEXT:    sete %al
1638; X86-SSE41-NEXT:    retl
1639;
1640; X64-SSE2-LABEL: length24_eq:
1641; X64-SSE2:       # %bb.0:
1642; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1643; X64-SSE2-NEXT:    movdqu (%rsi), %xmm1
1644; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm1
1645; X64-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
1646; X64-SSE2-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero
1647; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1648; X64-SSE2-NEXT:    pand %xmm1, %xmm2
1649; X64-SSE2-NEXT:    pmovmskb %xmm2, %eax
1650; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1651; X64-SSE2-NEXT:    sete %al
1652; X64-SSE2-NEXT:    retq
1653;
1654; X64-SSE41-LABEL: length24_eq:
1655; X64-SSE41:       # %bb.0:
1656; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1657; X64-SSE41-NEXT:    movdqu (%rsi), %xmm1
1658; X64-SSE41-NEXT:    pxor %xmm0, %xmm1
1659; X64-SSE41-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
1660; X64-SSE41-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero
1661; X64-SSE41-NEXT:    pxor %xmm0, %xmm2
1662; X64-SSE41-NEXT:    por %xmm1, %xmm2
1663; X64-SSE41-NEXT:    ptest %xmm2, %xmm2
1664; X64-SSE41-NEXT:    sete %al
1665; X64-SSE41-NEXT:    retq
1666;
1667; X64-AVX-LABEL: length24_eq:
1668; X64-AVX:       # %bb.0:
1669; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1670; X64-AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
1671; X64-AVX-NEXT:    vmovq {{.*#+}} xmm2 = mem[0],zero
1672; X64-AVX-NEXT:    vpxor %xmm2, %xmm1, %xmm1
1673; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0
1674; X64-AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0
1675; X64-AVX-NEXT:    vptest %xmm0, %xmm0
1676; X64-AVX-NEXT:    sete %al
1677; X64-AVX-NEXT:    retq
1678;
1679; X64-MIC-AVX-LABEL: length24_eq:
1680; X64-MIC-AVX:       # %bb.0:
1681; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1682; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm1
1683; X64-MIC-AVX-NEXT:    vmovq {{.*#+}} xmm2 = mem[0],zero
1684; X64-MIC-AVX-NEXT:    vmovq {{.*#+}} xmm3 = mem[0],zero
1685; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm2, %k0
1686; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
1687; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
1688; X64-MIC-AVX-NEXT:    sete %al
1689; X64-MIC-AVX-NEXT:    vzeroupper
1690; X64-MIC-AVX-NEXT:    retq
1691  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 24) nounwind
1692  %cmp = icmp eq i32 %call, 0
1693  ret i1 %cmp
1694}
1695
1696define i1 @length24_lt(i8* %x, i8* %y) nounwind {
1697; X86-LABEL: length24_lt:
1698; X86:       # %bb.0:
1699; X86-NEXT:    pushl $0
1700; X86-NEXT:    pushl $24
1701; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1702; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1703; X86-NEXT:    calll memcmp
1704; X86-NEXT:    addl $16, %esp
1705; X86-NEXT:    shrl $31, %eax
1706; X86-NEXT:    # kill: def $al killed $al killed $eax
1707; X86-NEXT:    retl
1708;
1709; X64-LABEL: length24_lt:
1710; X64:       # %bb.0:
1711; X64-NEXT:    movq (%rdi), %rcx
1712; X64-NEXT:    movq (%rsi), %rdx
1713; X64-NEXT:    bswapq %rcx
1714; X64-NEXT:    bswapq %rdx
1715; X64-NEXT:    cmpq %rdx, %rcx
1716; X64-NEXT:    jne .LBB40_3
1717; X64-NEXT:  # %bb.1: # %loadbb1
1718; X64-NEXT:    movq 8(%rdi), %rcx
1719; X64-NEXT:    movq 8(%rsi), %rdx
1720; X64-NEXT:    bswapq %rcx
1721; X64-NEXT:    bswapq %rdx
1722; X64-NEXT:    cmpq %rdx, %rcx
1723; X64-NEXT:    jne .LBB40_3
1724; X64-NEXT:  # %bb.2: # %loadbb2
1725; X64-NEXT:    movq 16(%rdi), %rcx
1726; X64-NEXT:    movq 16(%rsi), %rdx
1727; X64-NEXT:    bswapq %rcx
1728; X64-NEXT:    bswapq %rdx
1729; X64-NEXT:    xorl %eax, %eax
1730; X64-NEXT:    cmpq %rdx, %rcx
1731; X64-NEXT:    je .LBB40_4
1732; X64-NEXT:  .LBB40_3: # %res_block
1733; X64-NEXT:    xorl %eax, %eax
1734; X64-NEXT:    cmpq %rdx, %rcx
1735; X64-NEXT:    setae %al
1736; X64-NEXT:    leal -1(%rax,%rax), %eax
1737; X64-NEXT:  .LBB40_4: # %endblock
1738; X64-NEXT:    shrl $31, %eax
1739; X64-NEXT:    # kill: def $al killed $al killed $eax
1740; X64-NEXT:    retq
1741  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 24) nounwind
1742  %cmp = icmp slt i32 %call, 0
1743  ret i1 %cmp
1744}
1745
1746define i1 @length24_gt(i8* %x, i8* %y) nounwind {
1747; X86-LABEL: length24_gt:
1748; X86:       # %bb.0:
1749; X86-NEXT:    pushl $0
1750; X86-NEXT:    pushl $24
1751; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1752; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1753; X86-NEXT:    calll memcmp
1754; X86-NEXT:    addl $16, %esp
1755; X86-NEXT:    testl %eax, %eax
1756; X86-NEXT:    setg %al
1757; X86-NEXT:    retl
1758;
1759; X64-LABEL: length24_gt:
1760; X64:       # %bb.0:
1761; X64-NEXT:    movq (%rdi), %rax
1762; X64-NEXT:    movq (%rsi), %rcx
1763; X64-NEXT:    bswapq %rax
1764; X64-NEXT:    bswapq %rcx
1765; X64-NEXT:    cmpq %rcx, %rax
1766; X64-NEXT:    jne .LBB41_3
1767; X64-NEXT:  # %bb.1: # %loadbb1
1768; X64-NEXT:    movq 8(%rdi), %rax
1769; X64-NEXT:    movq 8(%rsi), %rcx
1770; X64-NEXT:    bswapq %rax
1771; X64-NEXT:    bswapq %rcx
1772; X64-NEXT:    cmpq %rcx, %rax
1773; X64-NEXT:    jne .LBB41_3
1774; X64-NEXT:  # %bb.2: # %loadbb2
1775; X64-NEXT:    movq 16(%rdi), %rax
1776; X64-NEXT:    movq 16(%rsi), %rcx
1777; X64-NEXT:    bswapq %rax
1778; X64-NEXT:    bswapq %rcx
1779; X64-NEXT:    xorl %edx, %edx
1780; X64-NEXT:    cmpq %rcx, %rax
1781; X64-NEXT:    je .LBB41_4
1782; X64-NEXT:  .LBB41_3: # %res_block
1783; X64-NEXT:    xorl %edx, %edx
1784; X64-NEXT:    cmpq %rcx, %rax
1785; X64-NEXT:    setae %dl
1786; X64-NEXT:    leal -1(%rdx,%rdx), %edx
1787; X64-NEXT:  .LBB41_4: # %endblock
1788; X64-NEXT:    testl %edx, %edx
1789; X64-NEXT:    setg %al
1790; X64-NEXT:    retq
1791  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 24) nounwind
1792  %cmp = icmp sgt i32 %call, 0
1793  ret i1 %cmp
1794}
1795
1796define i1 @length24_eq_const(i8* %X) nounwind {
1797; X86-NOSSE-LABEL: length24_eq_const:
1798; X86-NOSSE:       # %bb.0:
1799; X86-NOSSE-NEXT:    pushl $0
1800; X86-NOSSE-NEXT:    pushl $24
1801; X86-NOSSE-NEXT:    pushl $.L.str
1802; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1803; X86-NOSSE-NEXT:    calll memcmp
1804; X86-NOSSE-NEXT:    addl $16, %esp
1805; X86-NOSSE-NEXT:    testl %eax, %eax
1806; X86-NOSSE-NEXT:    setne %al
1807; X86-NOSSE-NEXT:    retl
1808;
1809; X86-SSE1-LABEL: length24_eq_const:
1810; X86-SSE1:       # %bb.0:
1811; X86-SSE1-NEXT:    pushl $0
1812; X86-SSE1-NEXT:    pushl $24
1813; X86-SSE1-NEXT:    pushl $.L.str
1814; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1815; X86-SSE1-NEXT:    calll memcmp
1816; X86-SSE1-NEXT:    addl $16, %esp
1817; X86-SSE1-NEXT:    testl %eax, %eax
1818; X86-SSE1-NEXT:    setne %al
1819; X86-SSE1-NEXT:    retl
1820;
1821; X86-SSE2-LABEL: length24_eq_const:
1822; X86-SSE2:       # %bb.0:
1823; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1824; X86-SSE2-NEXT:    movdqu (%eax), %xmm0
1825; X86-SSE2-NEXT:    movdqu 8(%eax), %xmm1
1826; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1827; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1828; X86-SSE2-NEXT:    pand %xmm1, %xmm0
1829; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
1830; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1831; X86-SSE2-NEXT:    setne %al
1832; X86-SSE2-NEXT:    retl
1833;
1834; X86-SSE41-LABEL: length24_eq_const:
1835; X86-SSE41:       # %bb.0:
1836; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1837; X86-SSE41-NEXT:    movdqu (%eax), %xmm0
1838; X86-SSE41-NEXT:    movdqu 8(%eax), %xmm1
1839; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1840; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1841; X86-SSE41-NEXT:    por %xmm1, %xmm0
1842; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
1843; X86-SSE41-NEXT:    setne %al
1844; X86-SSE41-NEXT:    retl
1845;
1846; X64-SSE2-LABEL: length24_eq_const:
1847; X64-SSE2:       # %bb.0:
1848; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1849; X64-SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
1850; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1851; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1852; X64-SSE2-NEXT:    pand %xmm1, %xmm0
1853; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
1854; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1855; X64-SSE2-NEXT:    setne %al
1856; X64-SSE2-NEXT:    retq
1857;
1858; X64-SSE41-LABEL: length24_eq_const:
1859; X64-SSE41:       # %bb.0:
1860; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1861; X64-SSE41-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
1862; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1863; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1864; X64-SSE41-NEXT:    por %xmm1, %xmm0
1865; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
1866; X64-SSE41-NEXT:    setne %al
1867; X64-SSE41-NEXT:    retq
1868;
1869; X64-AVX-LABEL: length24_eq_const:
1870; X64-AVX:       # %bb.0:
1871; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1872; X64-AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
1873; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1874; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1875; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1876; X64-AVX-NEXT:    vptest %xmm0, %xmm0
1877; X64-AVX-NEXT:    setne %al
1878; X64-AVX-NEXT:    retq
1879;
1880; X64-MIC-AVX-LABEL: length24_eq_const:
1881; X64-MIC-AVX:       # %bb.0:
1882; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1883; X64-MIC-AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
1884; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [959985462,858927408,0,0]
1885; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm1, %k0
1886; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426]
1887; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
1888; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
1889; X64-MIC-AVX-NEXT:    setne %al
1890; X64-MIC-AVX-NEXT:    vzeroupper
1891; X64-MIC-AVX-NEXT:    retq
1892  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 24) nounwind
1893  %c = icmp ne i32 %m, 0
1894  ret i1 %c
1895}
1896
1897define i32 @length31(i8* %X, i8* %Y) nounwind {
1898; X86-LABEL: length31:
1899; X86:       # %bb.0:
1900; X86-NEXT:    pushl $0
1901; X86-NEXT:    pushl $31
1902; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1903; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1904; X86-NEXT:    calll memcmp
1905; X86-NEXT:    addl $16, %esp
1906; X86-NEXT:    retl
1907;
1908; X64-LABEL: length31:
1909; X64:       # %bb.0:
1910; X64-NEXT:    movq (%rdi), %rcx
1911; X64-NEXT:    movq (%rsi), %rdx
1912; X64-NEXT:    bswapq %rcx
1913; X64-NEXT:    bswapq %rdx
1914; X64-NEXT:    cmpq %rdx, %rcx
1915; X64-NEXT:    jne .LBB43_4
1916; X64-NEXT:  # %bb.1: # %loadbb1
1917; X64-NEXT:    movq 8(%rdi), %rcx
1918; X64-NEXT:    movq 8(%rsi), %rdx
1919; X64-NEXT:    bswapq %rcx
1920; X64-NEXT:    bswapq %rdx
1921; X64-NEXT:    cmpq %rdx, %rcx
1922; X64-NEXT:    jne .LBB43_4
1923; X64-NEXT:  # %bb.2: # %loadbb2
1924; X64-NEXT:    movq 16(%rdi), %rcx
1925; X64-NEXT:    movq 16(%rsi), %rdx
1926; X64-NEXT:    bswapq %rcx
1927; X64-NEXT:    bswapq %rdx
1928; X64-NEXT:    cmpq %rdx, %rcx
1929; X64-NEXT:    jne .LBB43_4
1930; X64-NEXT:  # %bb.3: # %loadbb3
1931; X64-NEXT:    movq 23(%rdi), %rcx
1932; X64-NEXT:    movq 23(%rsi), %rdx
1933; X64-NEXT:    bswapq %rcx
1934; X64-NEXT:    bswapq %rdx
1935; X64-NEXT:    xorl %eax, %eax
1936; X64-NEXT:    cmpq %rdx, %rcx
1937; X64-NEXT:    je .LBB43_5
1938; X64-NEXT:  .LBB43_4: # %res_block
1939; X64-NEXT:    xorl %eax, %eax
1940; X64-NEXT:    cmpq %rdx, %rcx
1941; X64-NEXT:    setae %al
1942; X64-NEXT:    leal -1(%rax,%rax), %eax
1943; X64-NEXT:  .LBB43_5: # %endblock
1944; X64-NEXT:    retq
1945  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 31) nounwind
1946  ret i32 %m
1947}
1948
1949define i1 @length31_eq(i8* %x, i8* %y) nounwind {
1950; X86-NOSSE-LABEL: length31_eq:
1951; X86-NOSSE:       # %bb.0:
1952; X86-NOSSE-NEXT:    pushl $0
1953; X86-NOSSE-NEXT:    pushl $31
1954; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1955; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1956; X86-NOSSE-NEXT:    calll memcmp
1957; X86-NOSSE-NEXT:    addl $16, %esp
1958; X86-NOSSE-NEXT:    testl %eax, %eax
1959; X86-NOSSE-NEXT:    sete %al
1960; X86-NOSSE-NEXT:    retl
1961;
1962; X86-SSE1-LABEL: length31_eq:
1963; X86-SSE1:       # %bb.0:
1964; X86-SSE1-NEXT:    pushl $0
1965; X86-SSE1-NEXT:    pushl $31
1966; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1967; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1968; X86-SSE1-NEXT:    calll memcmp
1969; X86-SSE1-NEXT:    addl $16, %esp
1970; X86-SSE1-NEXT:    testl %eax, %eax
1971; X86-SSE1-NEXT:    sete %al
1972; X86-SSE1-NEXT:    retl
1973;
1974; X86-SSE2-LABEL: length31_eq:
1975; X86-SSE2:       # %bb.0:
1976; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1977; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1978; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
1979; X86-SSE2-NEXT:    movdqu 15(%ecx), %xmm1
1980; X86-SSE2-NEXT:    movdqu (%eax), %xmm2
1981; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1982; X86-SSE2-NEXT:    movdqu 15(%eax), %xmm0
1983; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1984; X86-SSE2-NEXT:    pand %xmm2, %xmm0
1985; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
1986; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1987; X86-SSE2-NEXT:    sete %al
1988; X86-SSE2-NEXT:    retl
1989;
1990; X86-SSE41-LABEL: length31_eq:
1991; X86-SSE41:       # %bb.0:
1992; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1993; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1994; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
1995; X86-SSE41-NEXT:    movdqu 15(%ecx), %xmm1
1996; X86-SSE41-NEXT:    movdqu (%eax), %xmm2
1997; X86-SSE41-NEXT:    pxor %xmm0, %xmm2
1998; X86-SSE41-NEXT:    movdqu 15(%eax), %xmm0
1999; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
2000; X86-SSE41-NEXT:    por %xmm2, %xmm0
2001; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
2002; X86-SSE41-NEXT:    sete %al
2003; X86-SSE41-NEXT:    retl
2004;
2005; X64-SSE2-LABEL: length31_eq:
2006; X64-SSE2:       # %bb.0:
2007; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
2008; X64-SSE2-NEXT:    movdqu 15(%rdi), %xmm1
2009; X64-SSE2-NEXT:    movdqu (%rsi), %xmm2
2010; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
2011; X64-SSE2-NEXT:    movdqu 15(%rsi), %xmm0
2012; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
2013; X64-SSE2-NEXT:    pand %xmm2, %xmm0
2014; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
2015; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2016; X64-SSE2-NEXT:    sete %al
2017; X64-SSE2-NEXT:    retq
2018;
2019; X64-SSE41-LABEL: length31_eq:
2020; X64-SSE41:       # %bb.0:
2021; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
2022; X64-SSE41-NEXT:    movdqu 15(%rdi), %xmm1
2023; X64-SSE41-NEXT:    movdqu (%rsi), %xmm2
2024; X64-SSE41-NEXT:    pxor %xmm0, %xmm2
2025; X64-SSE41-NEXT:    movdqu 15(%rsi), %xmm0
2026; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
2027; X64-SSE41-NEXT:    por %xmm2, %xmm0
2028; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
2029; X64-SSE41-NEXT:    sete %al
2030; X64-SSE41-NEXT:    retq
2031;
2032; X64-AVX-LABEL: length31_eq:
2033; X64-AVX:       # %bb.0:
2034; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
2035; X64-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
2036; X64-AVX-NEXT:    vpxor 15(%rsi), %xmm1, %xmm1
2037; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0
2038; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
2039; X64-AVX-NEXT:    vptest %xmm0, %xmm0
2040; X64-AVX-NEXT:    sete %al
2041; X64-AVX-NEXT:    retq
2042;
2043; X64-MIC-AVX-LABEL: length31_eq:
2044; X64-MIC-AVX:       # %bb.0:
2045; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
2046; X64-MIC-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
2047; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm2
2048; X64-MIC-AVX-NEXT:    vmovdqu 15(%rsi), %xmm3
2049; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm1, %k0
2050; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm0, %k1
2051; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
2052; X64-MIC-AVX-NEXT:    sete %al
2053; X64-MIC-AVX-NEXT:    vzeroupper
2054; X64-MIC-AVX-NEXT:    retq
2055  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 31) nounwind
2056  %cmp = icmp eq i32 %call, 0
2057  ret i1 %cmp
2058}
2059
2060define i1 @length31_lt(i8* %x, i8* %y) nounwind {
2061; X86-LABEL: length31_lt:
2062; X86:       # %bb.0:
2063; X86-NEXT:    pushl $0
2064; X86-NEXT:    pushl $31
2065; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2066; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2067; X86-NEXT:    calll memcmp
2068; X86-NEXT:    addl $16, %esp
2069; X86-NEXT:    shrl $31, %eax
2070; X86-NEXT:    # kill: def $al killed $al killed $eax
2071; X86-NEXT:    retl
2072;
2073; X64-LABEL: length31_lt:
2074; X64:       # %bb.0:
2075; X64-NEXT:    movq (%rdi), %rcx
2076; X64-NEXT:    movq (%rsi), %rdx
2077; X64-NEXT:    bswapq %rcx
2078; X64-NEXT:    bswapq %rdx
2079; X64-NEXT:    cmpq %rdx, %rcx
2080; X64-NEXT:    jne .LBB45_4
2081; X64-NEXT:  # %bb.1: # %loadbb1
2082; X64-NEXT:    movq 8(%rdi), %rcx
2083; X64-NEXT:    movq 8(%rsi), %rdx
2084; X64-NEXT:    bswapq %rcx
2085; X64-NEXT:    bswapq %rdx
2086; X64-NEXT:    cmpq %rdx, %rcx
2087; X64-NEXT:    jne .LBB45_4
2088; X64-NEXT:  # %bb.2: # %loadbb2
2089; X64-NEXT:    movq 16(%rdi), %rcx
2090; X64-NEXT:    movq 16(%rsi), %rdx
2091; X64-NEXT:    bswapq %rcx
2092; X64-NEXT:    bswapq %rdx
2093; X64-NEXT:    cmpq %rdx, %rcx
2094; X64-NEXT:    jne .LBB45_4
2095; X64-NEXT:  # %bb.3: # %loadbb3
2096; X64-NEXT:    movq 23(%rdi), %rcx
2097; X64-NEXT:    movq 23(%rsi), %rdx
2098; X64-NEXT:    bswapq %rcx
2099; X64-NEXT:    bswapq %rdx
2100; X64-NEXT:    xorl %eax, %eax
2101; X64-NEXT:    cmpq %rdx, %rcx
2102; X64-NEXT:    je .LBB45_5
2103; X64-NEXT:  .LBB45_4: # %res_block
2104; X64-NEXT:    xorl %eax, %eax
2105; X64-NEXT:    cmpq %rdx, %rcx
2106; X64-NEXT:    setae %al
2107; X64-NEXT:    leal -1(%rax,%rax), %eax
2108; X64-NEXT:  .LBB45_5: # %endblock
2109; X64-NEXT:    shrl $31, %eax
2110; X64-NEXT:    # kill: def $al killed $al killed $eax
2111; X64-NEXT:    retq
2112  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 31) nounwind
2113  %cmp = icmp slt i32 %call, 0
2114  ret i1 %cmp
2115}
2116
2117define i1 @length31_gt(i8* %x, i8* %y) nounwind {
2118; X86-LABEL: length31_gt:
2119; X86:       # %bb.0:
2120; X86-NEXT:    pushl $0
2121; X86-NEXT:    pushl $31
2122; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2123; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2124; X86-NEXT:    calll memcmp
2125; X86-NEXT:    addl $16, %esp
2126; X86-NEXT:    testl %eax, %eax
2127; X86-NEXT:    setg %al
2128; X86-NEXT:    retl
2129;
2130; X64-LABEL: length31_gt:
2131; X64:       # %bb.0:
2132; X64-NEXT:    movq (%rdi), %rax
2133; X64-NEXT:    movq (%rsi), %rcx
2134; X64-NEXT:    bswapq %rax
2135; X64-NEXT:    bswapq %rcx
2136; X64-NEXT:    cmpq %rcx, %rax
2137; X64-NEXT:    jne .LBB46_4
2138; X64-NEXT:  # %bb.1: # %loadbb1
2139; X64-NEXT:    movq 8(%rdi), %rax
2140; X64-NEXT:    movq 8(%rsi), %rcx
2141; X64-NEXT:    bswapq %rax
2142; X64-NEXT:    bswapq %rcx
2143; X64-NEXT:    cmpq %rcx, %rax
2144; X64-NEXT:    jne .LBB46_4
2145; X64-NEXT:  # %bb.2: # %loadbb2
2146; X64-NEXT:    movq 16(%rdi), %rax
2147; X64-NEXT:    movq 16(%rsi), %rcx
2148; X64-NEXT:    bswapq %rax
2149; X64-NEXT:    bswapq %rcx
2150; X64-NEXT:    cmpq %rcx, %rax
2151; X64-NEXT:    jne .LBB46_4
2152; X64-NEXT:  # %bb.3: # %loadbb3
2153; X64-NEXT:    movq 23(%rdi), %rax
2154; X64-NEXT:    movq 23(%rsi), %rcx
2155; X64-NEXT:    bswapq %rax
2156; X64-NEXT:    bswapq %rcx
2157; X64-NEXT:    xorl %edx, %edx
2158; X64-NEXT:    cmpq %rcx, %rax
2159; X64-NEXT:    je .LBB46_5
2160; X64-NEXT:  .LBB46_4: # %res_block
2161; X64-NEXT:    xorl %edx, %edx
2162; X64-NEXT:    cmpq %rcx, %rax
2163; X64-NEXT:    setae %dl
2164; X64-NEXT:    leal -1(%rdx,%rdx), %edx
2165; X64-NEXT:  .LBB46_5: # %endblock
2166; X64-NEXT:    testl %edx, %edx
2167; X64-NEXT:    setg %al
2168; X64-NEXT:    retq
2169  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 31) nounwind
2170  %cmp = icmp sgt i32 %call, 0
2171  ret i1 %cmp
2172}
2173
2174define i1 @length31_eq_prefer128(i8* %x, i8* %y) nounwind "prefer-vector-width"="128" {
2175; X86-NOSSE-LABEL: length31_eq_prefer128:
2176; X86-NOSSE:       # %bb.0:
2177; X86-NOSSE-NEXT:    pushl $0
2178; X86-NOSSE-NEXT:    pushl $31
2179; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
2180; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
2181; X86-NOSSE-NEXT:    calll memcmp
2182; X86-NOSSE-NEXT:    addl $16, %esp
2183; X86-NOSSE-NEXT:    testl %eax, %eax
2184; X86-NOSSE-NEXT:    sete %al
2185; X86-NOSSE-NEXT:    retl
2186;
2187; X86-SSE1-LABEL: length31_eq_prefer128:
2188; X86-SSE1:       # %bb.0:
2189; X86-SSE1-NEXT:    pushl $0
2190; X86-SSE1-NEXT:    pushl $31
2191; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
2192; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
2193; X86-SSE1-NEXT:    calll memcmp
2194; X86-SSE1-NEXT:    addl $16, %esp
2195; X86-SSE1-NEXT:    testl %eax, %eax
2196; X86-SSE1-NEXT:    sete %al
2197; X86-SSE1-NEXT:    retl
2198;
2199; X86-SSE2-LABEL: length31_eq_prefer128:
2200; X86-SSE2:       # %bb.0:
2201; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2202; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2203; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
2204; X86-SSE2-NEXT:    movdqu 15(%ecx), %xmm1
2205; X86-SSE2-NEXT:    movdqu (%eax), %xmm2
2206; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
2207; X86-SSE2-NEXT:    movdqu 15(%eax), %xmm0
2208; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
2209; X86-SSE2-NEXT:    pand %xmm2, %xmm0
2210; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
2211; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2212; X86-SSE2-NEXT:    sete %al
2213; X86-SSE2-NEXT:    retl
2214;
2215; X86-SSE41-LABEL: length31_eq_prefer128:
2216; X86-SSE41:       # %bb.0:
2217; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2218; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2219; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
2220; X86-SSE41-NEXT:    movdqu 15(%ecx), %xmm1
2221; X86-SSE41-NEXT:    movdqu (%eax), %xmm2
2222; X86-SSE41-NEXT:    pxor %xmm0, %xmm2
2223; X86-SSE41-NEXT:    movdqu 15(%eax), %xmm0
2224; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
2225; X86-SSE41-NEXT:    por %xmm2, %xmm0
2226; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
2227; X86-SSE41-NEXT:    sete %al
2228; X86-SSE41-NEXT:    retl
2229;
2230; X64-SSE2-LABEL: length31_eq_prefer128:
2231; X64-SSE2:       # %bb.0:
2232; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
2233; X64-SSE2-NEXT:    movdqu 15(%rdi), %xmm1
2234; X64-SSE2-NEXT:    movdqu (%rsi), %xmm2
2235; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
2236; X64-SSE2-NEXT:    movdqu 15(%rsi), %xmm0
2237; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
2238; X64-SSE2-NEXT:    pand %xmm2, %xmm0
2239; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
2240; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2241; X64-SSE2-NEXT:    sete %al
2242; X64-SSE2-NEXT:    retq
2243;
2244; X64-SSE41-LABEL: length31_eq_prefer128:
2245; X64-SSE41:       # %bb.0:
2246; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
2247; X64-SSE41-NEXT:    movdqu 15(%rdi), %xmm1
2248; X64-SSE41-NEXT:    movdqu (%rsi), %xmm2
2249; X64-SSE41-NEXT:    pxor %xmm0, %xmm2
2250; X64-SSE41-NEXT:    movdqu 15(%rsi), %xmm0
2251; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
2252; X64-SSE41-NEXT:    por %xmm2, %xmm0
2253; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
2254; X64-SSE41-NEXT:    sete %al
2255; X64-SSE41-NEXT:    retq
2256;
2257; X64-AVX-LABEL: length31_eq_prefer128:
2258; X64-AVX:       # %bb.0:
2259; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
2260; X64-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
2261; X64-AVX-NEXT:    vpxor 15(%rsi), %xmm1, %xmm1
2262; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0
2263; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
2264; X64-AVX-NEXT:    vptest %xmm0, %xmm0
2265; X64-AVX-NEXT:    sete %al
2266; X64-AVX-NEXT:    retq
2267;
2268; X64-MIC-AVX-LABEL: length31_eq_prefer128:
2269; X64-MIC-AVX:       # %bb.0:
2270; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
2271; X64-MIC-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
2272; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm2
2273; X64-MIC-AVX-NEXT:    vmovdqu 15(%rsi), %xmm3
2274; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm1, %k0
2275; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm0, %k1
2276; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
2277; X64-MIC-AVX-NEXT:    sete %al
2278; X64-MIC-AVX-NEXT:    vzeroupper
2279; X64-MIC-AVX-NEXT:    retq
2280  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 31) nounwind
2281  %cmp = icmp eq i32 %call, 0
2282  ret i1 %cmp
2283}
2284
2285define i1 @length31_eq_const(i8* %X) nounwind {
2286; X86-NOSSE-LABEL: length31_eq_const:
2287; X86-NOSSE:       # %bb.0:
2288; X86-NOSSE-NEXT:    pushl $0
2289; X86-NOSSE-NEXT:    pushl $31
2290; X86-NOSSE-NEXT:    pushl $.L.str
2291; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
2292; X86-NOSSE-NEXT:    calll memcmp
2293; X86-NOSSE-NEXT:    addl $16, %esp
2294; X86-NOSSE-NEXT:    testl %eax, %eax
2295; X86-NOSSE-NEXT:    setne %al
2296; X86-NOSSE-NEXT:    retl
2297;
2298; X86-SSE1-LABEL: length31_eq_const:
2299; X86-SSE1:       # %bb.0:
2300; X86-SSE1-NEXT:    pushl $0
2301; X86-SSE1-NEXT:    pushl $31
2302; X86-SSE1-NEXT:    pushl $.L.str
2303; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
2304; X86-SSE1-NEXT:    calll memcmp
2305; X86-SSE1-NEXT:    addl $16, %esp
2306; X86-SSE1-NEXT:    testl %eax, %eax
2307; X86-SSE1-NEXT:    setne %al
2308; X86-SSE1-NEXT:    retl
2309;
2310; X86-SSE2-LABEL: length31_eq_const:
2311; X86-SSE2:       # %bb.0:
2312; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2313; X86-SSE2-NEXT:    movdqu (%eax), %xmm0
2314; X86-SSE2-NEXT:    movdqu 15(%eax), %xmm1
2315; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
2316; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2317; X86-SSE2-NEXT:    pand %xmm1, %xmm0
2318; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
2319; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2320; X86-SSE2-NEXT:    setne %al
2321; X86-SSE2-NEXT:    retl
2322;
2323; X86-SSE41-LABEL: length31_eq_const:
2324; X86-SSE41:       # %bb.0:
2325; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2326; X86-SSE41-NEXT:    movdqu (%eax), %xmm0
2327; X86-SSE41-NEXT:    movdqu 15(%eax), %xmm1
2328; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
2329; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2330; X86-SSE41-NEXT:    por %xmm1, %xmm0
2331; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
2332; X86-SSE41-NEXT:    setne %al
2333; X86-SSE41-NEXT:    retl
2334;
2335; X64-SSE2-LABEL: length31_eq_const:
2336; X64-SSE2:       # %bb.0:
2337; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
2338; X64-SSE2-NEXT:    movdqu 15(%rdi), %xmm1
2339; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2340; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2341; X64-SSE2-NEXT:    pand %xmm1, %xmm0
2342; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
2343; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2344; X64-SSE2-NEXT:    setne %al
2345; X64-SSE2-NEXT:    retq
2346;
2347; X64-SSE41-LABEL: length31_eq_const:
2348; X64-SSE41:       # %bb.0:
2349; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
2350; X64-SSE41-NEXT:    movdqu 15(%rdi), %xmm1
2351; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2352; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2353; X64-SSE41-NEXT:    por %xmm1, %xmm0
2354; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
2355; X64-SSE41-NEXT:    setne %al
2356; X64-SSE41-NEXT:    retq
2357;
2358; X64-AVX-LABEL: length31_eq_const:
2359; X64-AVX:       # %bb.0:
2360; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
2361; X64-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
2362; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2363; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2364; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
2365; X64-AVX-NEXT:    vptest %xmm0, %xmm0
2366; X64-AVX-NEXT:    setne %al
2367; X64-AVX-NEXT:    retq
2368;
2369; X64-MIC-AVX-LABEL: length31_eq_const:
2370; X64-MIC-AVX:       # %bb.0:
2371; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
2372; X64-MIC-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
2373; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [943142453,842084409,909456435,809056311]
2374; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm1, %k0
2375; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426]
2376; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
2377; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
2378; X64-MIC-AVX-NEXT:    setne %al
2379; X64-MIC-AVX-NEXT:    vzeroupper
2380; X64-MIC-AVX-NEXT:    retq
2381  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 31) nounwind
2382  %c = icmp ne i32 %m, 0
2383  ret i1 %c
2384}
2385
2386define i32 @length32(i8* %X, i8* %Y) nounwind {
2387; X86-LABEL: length32:
2388; X86:       # %bb.0:
2389; X86-NEXT:    pushl $0
2390; X86-NEXT:    pushl $32
2391; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2392; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2393; X86-NEXT:    calll memcmp
2394; X86-NEXT:    addl $16, %esp
2395; X86-NEXT:    retl
2396;
2397; X64-LABEL: length32:
2398; X64:       # %bb.0:
2399; X64-NEXT:    movq (%rdi), %rcx
2400; X64-NEXT:    movq (%rsi), %rdx
2401; X64-NEXT:    bswapq %rcx
2402; X64-NEXT:    bswapq %rdx
2403; X64-NEXT:    cmpq %rdx, %rcx
2404; X64-NEXT:    jne .LBB49_4
2405; X64-NEXT:  # %bb.1: # %loadbb1
2406; X64-NEXT:    movq 8(%rdi), %rcx
2407; X64-NEXT:    movq 8(%rsi), %rdx
2408; X64-NEXT:    bswapq %rcx
2409; X64-NEXT:    bswapq %rdx
2410; X64-NEXT:    cmpq %rdx, %rcx
2411; X64-NEXT:    jne .LBB49_4
2412; X64-NEXT:  # %bb.2: # %loadbb2
2413; X64-NEXT:    movq 16(%rdi), %rcx
2414; X64-NEXT:    movq 16(%rsi), %rdx
2415; X64-NEXT:    bswapq %rcx
2416; X64-NEXT:    bswapq %rdx
2417; X64-NEXT:    cmpq %rdx, %rcx
2418; X64-NEXT:    jne .LBB49_4
2419; X64-NEXT:  # %bb.3: # %loadbb3
2420; X64-NEXT:    movq 24(%rdi), %rcx
2421; X64-NEXT:    movq 24(%rsi), %rdx
2422; X64-NEXT:    bswapq %rcx
2423; X64-NEXT:    bswapq %rdx
2424; X64-NEXT:    xorl %eax, %eax
2425; X64-NEXT:    cmpq %rdx, %rcx
2426; X64-NEXT:    je .LBB49_5
2427; X64-NEXT:  .LBB49_4: # %res_block
2428; X64-NEXT:    xorl %eax, %eax
2429; X64-NEXT:    cmpq %rdx, %rcx
2430; X64-NEXT:    setae %al
2431; X64-NEXT:    leal -1(%rax,%rax), %eax
2432; X64-NEXT:  .LBB49_5: # %endblock
2433; X64-NEXT:    retq
2434  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 32) nounwind
2435  ret i32 %m
2436}
2437
2438; PR33325 - https://bugs.llvm.org/show_bug.cgi?id=33325
2439
2440define i1 @length32_eq(i8* %x, i8* %y) nounwind {
2441; X86-NOSSE-LABEL: length32_eq:
2442; X86-NOSSE:       # %bb.0:
2443; X86-NOSSE-NEXT:    pushl $0
2444; X86-NOSSE-NEXT:    pushl $32
2445; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
2446; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
2447; X86-NOSSE-NEXT:    calll memcmp
2448; X86-NOSSE-NEXT:    addl $16, %esp
2449; X86-NOSSE-NEXT:    testl %eax, %eax
2450; X86-NOSSE-NEXT:    sete %al
2451; X86-NOSSE-NEXT:    retl
2452;
2453; X86-SSE1-LABEL: length32_eq:
2454; X86-SSE1:       # %bb.0:
2455; X86-SSE1-NEXT:    pushl $0
2456; X86-SSE1-NEXT:    pushl $32
2457; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
2458; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
2459; X86-SSE1-NEXT:    calll memcmp
2460; X86-SSE1-NEXT:    addl $16, %esp
2461; X86-SSE1-NEXT:    testl %eax, %eax
2462; X86-SSE1-NEXT:    sete %al
2463; X86-SSE1-NEXT:    retl
2464;
2465; X86-SSE2-LABEL: length32_eq:
2466; X86-SSE2:       # %bb.0:
2467; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2468; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2469; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
2470; X86-SSE2-NEXT:    movdqu 16(%ecx), %xmm1
2471; X86-SSE2-NEXT:    movdqu (%eax), %xmm2
2472; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
2473; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm0
2474; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
2475; X86-SSE2-NEXT:    pand %xmm2, %xmm0
2476; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
2477; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2478; X86-SSE2-NEXT:    sete %al
2479; X86-SSE2-NEXT:    retl
2480;
2481; X86-SSE41-LABEL: length32_eq:
2482; X86-SSE41:       # %bb.0:
2483; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2484; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2485; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
2486; X86-SSE41-NEXT:    movdqu 16(%ecx), %xmm1
2487; X86-SSE41-NEXT:    movdqu (%eax), %xmm2
2488; X86-SSE41-NEXT:    pxor %xmm0, %xmm2
2489; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm0
2490; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
2491; X86-SSE41-NEXT:    por %xmm2, %xmm0
2492; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
2493; X86-SSE41-NEXT:    sete %al
2494; X86-SSE41-NEXT:    retl
2495;
2496; X64-SSE2-LABEL: length32_eq:
2497; X64-SSE2:       # %bb.0:
2498; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
2499; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
2500; X64-SSE2-NEXT:    movdqu (%rsi), %xmm2
2501; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
2502; X64-SSE2-NEXT:    movdqu 16(%rsi), %xmm0
2503; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
2504; X64-SSE2-NEXT:    pand %xmm2, %xmm0
2505; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
2506; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2507; X64-SSE2-NEXT:    sete %al
2508; X64-SSE2-NEXT:    retq
2509;
2510; X64-SSE41-LABEL: length32_eq:
2511; X64-SSE41:       # %bb.0:
2512; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
2513; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
2514; X64-SSE41-NEXT:    movdqu (%rsi), %xmm2
2515; X64-SSE41-NEXT:    pxor %xmm0, %xmm2
2516; X64-SSE41-NEXT:    movdqu 16(%rsi), %xmm0
2517; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
2518; X64-SSE41-NEXT:    por %xmm2, %xmm0
2519; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
2520; X64-SSE41-NEXT:    sete %al
2521; X64-SSE41-NEXT:    retq
2522;
2523; X64-AVX1-LABEL: length32_eq:
2524; X64-AVX1:       # %bb.0:
2525; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
2526; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
2527; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
2528; X64-AVX1-NEXT:    sete %al
2529; X64-AVX1-NEXT:    vzeroupper
2530; X64-AVX1-NEXT:    retq
2531;
2532; X64-AVX2-LABEL: length32_eq:
2533; X64-AVX2:       # %bb.0:
2534; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2535; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
2536; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
2537; X64-AVX2-NEXT:    sete %al
2538; X64-AVX2-NEXT:    vzeroupper
2539; X64-AVX2-NEXT:    retq
2540;
2541; X64-AVX512-LABEL: length32_eq:
2542; X64-AVX512:       # %bb.0:
2543; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
2544; X64-AVX512-NEXT:    vpxor (%rsi), %ymm0, %ymm0
2545; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
2546; X64-AVX512-NEXT:    sete %al
2547; X64-AVX512-NEXT:    vzeroupper
2548; X64-AVX512-NEXT:    retq
2549;
2550; X64-MIC-AVX-LABEL: length32_eq:
2551; X64-MIC-AVX:       # %bb.0:
2552; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
2553; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %ymm1
2554; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
2555; X64-MIC-AVX-NEXT:    kortestw %k0, %k0
2556; X64-MIC-AVX-NEXT:    sete %al
2557; X64-MIC-AVX-NEXT:    vzeroupper
2558; X64-MIC-AVX-NEXT:    retq
2559  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 32) nounwind
2560  %cmp = icmp eq i32 %call, 0
2561  ret i1 %cmp
2562}
2563
2564define i1 @length32_lt(i8* %x, i8* %y) nounwind {
2565; X86-LABEL: length32_lt:
2566; X86:       # %bb.0:
2567; X86-NEXT:    pushl $0
2568; X86-NEXT:    pushl $32
2569; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2570; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2571; X86-NEXT:    calll memcmp
2572; X86-NEXT:    addl $16, %esp
2573; X86-NEXT:    shrl $31, %eax
2574; X86-NEXT:    # kill: def $al killed $al killed $eax
2575; X86-NEXT:    retl
2576;
2577; X64-LABEL: length32_lt:
2578; X64:       # %bb.0:
2579; X64-NEXT:    movq (%rdi), %rcx
2580; X64-NEXT:    movq (%rsi), %rdx
2581; X64-NEXT:    bswapq %rcx
2582; X64-NEXT:    bswapq %rdx
2583; X64-NEXT:    cmpq %rdx, %rcx
2584; X64-NEXT:    jne .LBB51_4
2585; X64-NEXT:  # %bb.1: # %loadbb1
2586; X64-NEXT:    movq 8(%rdi), %rcx
2587; X64-NEXT:    movq 8(%rsi), %rdx
2588; X64-NEXT:    bswapq %rcx
2589; X64-NEXT:    bswapq %rdx
2590; X64-NEXT:    cmpq %rdx, %rcx
2591; X64-NEXT:    jne .LBB51_4
2592; X64-NEXT:  # %bb.2: # %loadbb2
2593; X64-NEXT:    movq 16(%rdi), %rcx
2594; X64-NEXT:    movq 16(%rsi), %rdx
2595; X64-NEXT:    bswapq %rcx
2596; X64-NEXT:    bswapq %rdx
2597; X64-NEXT:    cmpq %rdx, %rcx
2598; X64-NEXT:    jne .LBB51_4
2599; X64-NEXT:  # %bb.3: # %loadbb3
2600; X64-NEXT:    movq 24(%rdi), %rcx
2601; X64-NEXT:    movq 24(%rsi), %rdx
2602; X64-NEXT:    bswapq %rcx
2603; X64-NEXT:    bswapq %rdx
2604; X64-NEXT:    xorl %eax, %eax
2605; X64-NEXT:    cmpq %rdx, %rcx
2606; X64-NEXT:    je .LBB51_5
2607; X64-NEXT:  .LBB51_4: # %res_block
2608; X64-NEXT:    xorl %eax, %eax
2609; X64-NEXT:    cmpq %rdx, %rcx
2610; X64-NEXT:    setae %al
2611; X64-NEXT:    leal -1(%rax,%rax), %eax
2612; X64-NEXT:  .LBB51_5: # %endblock
2613; X64-NEXT:    shrl $31, %eax
2614; X64-NEXT:    # kill: def $al killed $al killed $eax
2615; X64-NEXT:    retq
2616  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 32) nounwind
2617  %cmp = icmp slt i32 %call, 0
2618  ret i1 %cmp
2619}
2620
2621define i1 @length32_gt(i8* %x, i8* %y) nounwind {
2622; X86-LABEL: length32_gt:
2623; X86:       # %bb.0:
2624; X86-NEXT:    pushl $0
2625; X86-NEXT:    pushl $32
2626; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2627; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2628; X86-NEXT:    calll memcmp
2629; X86-NEXT:    addl $16, %esp
2630; X86-NEXT:    testl %eax, %eax
2631; X86-NEXT:    setg %al
2632; X86-NEXT:    retl
2633;
2634; X64-LABEL: length32_gt:
2635; X64:       # %bb.0:
2636; X64-NEXT:    movq (%rdi), %rax
2637; X64-NEXT:    movq (%rsi), %rcx
2638; X64-NEXT:    bswapq %rax
2639; X64-NEXT:    bswapq %rcx
2640; X64-NEXT:    cmpq %rcx, %rax
2641; X64-NEXT:    jne .LBB52_4
2642; X64-NEXT:  # %bb.1: # %loadbb1
2643; X64-NEXT:    movq 8(%rdi), %rax
2644; X64-NEXT:    movq 8(%rsi), %rcx
2645; X64-NEXT:    bswapq %rax
2646; X64-NEXT:    bswapq %rcx
2647; X64-NEXT:    cmpq %rcx, %rax
2648; X64-NEXT:    jne .LBB52_4
2649; X64-NEXT:  # %bb.2: # %loadbb2
2650; X64-NEXT:    movq 16(%rdi), %rax
2651; X64-NEXT:    movq 16(%rsi), %rcx
2652; X64-NEXT:    bswapq %rax
2653; X64-NEXT:    bswapq %rcx
2654; X64-NEXT:    cmpq %rcx, %rax
2655; X64-NEXT:    jne .LBB52_4
2656; X64-NEXT:  # %bb.3: # %loadbb3
2657; X64-NEXT:    movq 24(%rdi), %rax
2658; X64-NEXT:    movq 24(%rsi), %rcx
2659; X64-NEXT:    bswapq %rax
2660; X64-NEXT:    bswapq %rcx
2661; X64-NEXT:    xorl %edx, %edx
2662; X64-NEXT:    cmpq %rcx, %rax
2663; X64-NEXT:    je .LBB52_5
2664; X64-NEXT:  .LBB52_4: # %res_block
2665; X64-NEXT:    xorl %edx, %edx
2666; X64-NEXT:    cmpq %rcx, %rax
2667; X64-NEXT:    setae %dl
2668; X64-NEXT:    leal -1(%rdx,%rdx), %edx
2669; X64-NEXT:  .LBB52_5: # %endblock
2670; X64-NEXT:    testl %edx, %edx
2671; X64-NEXT:    setg %al
2672; X64-NEXT:    retq
2673  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 32) nounwind
2674  %cmp = icmp sgt i32 %call, 0
2675  ret i1 %cmp
2676}
2677
2678define i1 @length32_eq_prefer128(i8* %x, i8* %y) nounwind "prefer-vector-width"="128" {
2679; X86-NOSSE-LABEL: length32_eq_prefer128:
2680; X86-NOSSE:       # %bb.0:
2681; X86-NOSSE-NEXT:    pushl $0
2682; X86-NOSSE-NEXT:    pushl $32
2683; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
2684; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
2685; X86-NOSSE-NEXT:    calll memcmp
2686; X86-NOSSE-NEXT:    addl $16, %esp
2687; X86-NOSSE-NEXT:    testl %eax, %eax
2688; X86-NOSSE-NEXT:    sete %al
2689; X86-NOSSE-NEXT:    retl
2690;
2691; X86-SSE1-LABEL: length32_eq_prefer128:
2692; X86-SSE1:       # %bb.0:
2693; X86-SSE1-NEXT:    pushl $0
2694; X86-SSE1-NEXT:    pushl $32
2695; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
2696; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
2697; X86-SSE1-NEXT:    calll memcmp
2698; X86-SSE1-NEXT:    addl $16, %esp
2699; X86-SSE1-NEXT:    testl %eax, %eax
2700; X86-SSE1-NEXT:    sete %al
2701; X86-SSE1-NEXT:    retl
2702;
2703; X86-SSE2-LABEL: length32_eq_prefer128:
2704; X86-SSE2:       # %bb.0:
2705; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2706; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2707; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
2708; X86-SSE2-NEXT:    movdqu 16(%ecx), %xmm1
2709; X86-SSE2-NEXT:    movdqu (%eax), %xmm2
2710; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
2711; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm0
2712; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
2713; X86-SSE2-NEXT:    pand %xmm2, %xmm0
2714; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
2715; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2716; X86-SSE2-NEXT:    sete %al
2717; X86-SSE2-NEXT:    retl
2718;
2719; X86-SSE41-LABEL: length32_eq_prefer128:
2720; X86-SSE41:       # %bb.0:
2721; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2722; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2723; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
2724; X86-SSE41-NEXT:    movdqu 16(%ecx), %xmm1
2725; X86-SSE41-NEXT:    movdqu (%eax), %xmm2
2726; X86-SSE41-NEXT:    pxor %xmm0, %xmm2
2727; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm0
2728; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
2729; X86-SSE41-NEXT:    por %xmm2, %xmm0
2730; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
2731; X86-SSE41-NEXT:    sete %al
2732; X86-SSE41-NEXT:    retl
2733;
2734; X64-SSE2-LABEL: length32_eq_prefer128:
2735; X64-SSE2:       # %bb.0:
2736; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
2737; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
2738; X64-SSE2-NEXT:    movdqu (%rsi), %xmm2
2739; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
2740; X64-SSE2-NEXT:    movdqu 16(%rsi), %xmm0
2741; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
2742; X64-SSE2-NEXT:    pand %xmm2, %xmm0
2743; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
2744; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2745; X64-SSE2-NEXT:    sete %al
2746; X64-SSE2-NEXT:    retq
2747;
2748; X64-SSE41-LABEL: length32_eq_prefer128:
2749; X64-SSE41:       # %bb.0:
2750; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
2751; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
2752; X64-SSE41-NEXT:    movdqu (%rsi), %xmm2
2753; X64-SSE41-NEXT:    pxor %xmm0, %xmm2
2754; X64-SSE41-NEXT:    movdqu 16(%rsi), %xmm0
2755; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
2756; X64-SSE41-NEXT:    por %xmm2, %xmm0
2757; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
2758; X64-SSE41-NEXT:    sete %al
2759; X64-SSE41-NEXT:    retq
2760;
2761; X64-AVX-LABEL: length32_eq_prefer128:
2762; X64-AVX:       # %bb.0:
2763; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
2764; X64-AVX-NEXT:    vmovdqu 16(%rdi), %xmm1
2765; X64-AVX-NEXT:    vpxor 16(%rsi), %xmm1, %xmm1
2766; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0
2767; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
2768; X64-AVX-NEXT:    vptest %xmm0, %xmm0
2769; X64-AVX-NEXT:    sete %al
2770; X64-AVX-NEXT:    retq
2771;
2772; X64-MIC-AVX-LABEL: length32_eq_prefer128:
2773; X64-MIC-AVX:       # %bb.0:
2774; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
2775; X64-MIC-AVX-NEXT:    vmovdqu 16(%rdi), %xmm1
2776; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm2
2777; X64-MIC-AVX-NEXT:    vmovdqu 16(%rsi), %xmm3
2778; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm1, %k0
2779; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm0, %k1
2780; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
2781; X64-MIC-AVX-NEXT:    sete %al
2782; X64-MIC-AVX-NEXT:    vzeroupper
2783; X64-MIC-AVX-NEXT:    retq
2784  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 32) nounwind
2785  %cmp = icmp eq i32 %call, 0
2786  ret i1 %cmp
2787}
2788
2789define i1 @length32_eq_const(i8* %X) nounwind {
2790; X86-NOSSE-LABEL: length32_eq_const:
2791; X86-NOSSE:       # %bb.0:
2792; X86-NOSSE-NEXT:    pushl $0
2793; X86-NOSSE-NEXT:    pushl $32
2794; X86-NOSSE-NEXT:    pushl $.L.str
2795; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
2796; X86-NOSSE-NEXT:    calll memcmp
2797; X86-NOSSE-NEXT:    addl $16, %esp
2798; X86-NOSSE-NEXT:    testl %eax, %eax
2799; X86-NOSSE-NEXT:    setne %al
2800; X86-NOSSE-NEXT:    retl
2801;
2802; X86-SSE1-LABEL: length32_eq_const:
2803; X86-SSE1:       # %bb.0:
2804; X86-SSE1-NEXT:    pushl $0
2805; X86-SSE1-NEXT:    pushl $32
2806; X86-SSE1-NEXT:    pushl $.L.str
2807; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
2808; X86-SSE1-NEXT:    calll memcmp
2809; X86-SSE1-NEXT:    addl $16, %esp
2810; X86-SSE1-NEXT:    testl %eax, %eax
2811; X86-SSE1-NEXT:    setne %al
2812; X86-SSE1-NEXT:    retl
2813;
2814; X86-SSE2-LABEL: length32_eq_const:
2815; X86-SSE2:       # %bb.0:
2816; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2817; X86-SSE2-NEXT:    movdqu (%eax), %xmm0
2818; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm1
2819; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
2820; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2821; X86-SSE2-NEXT:    pand %xmm1, %xmm0
2822; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
2823; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2824; X86-SSE2-NEXT:    setne %al
2825; X86-SSE2-NEXT:    retl
2826;
2827; X86-SSE41-LABEL: length32_eq_const:
2828; X86-SSE41:       # %bb.0:
2829; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2830; X86-SSE41-NEXT:    movdqu (%eax), %xmm0
2831; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm1
2832; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
2833; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2834; X86-SSE41-NEXT:    por %xmm1, %xmm0
2835; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
2836; X86-SSE41-NEXT:    setne %al
2837; X86-SSE41-NEXT:    retl
2838;
2839; X64-SSE2-LABEL: length32_eq_const:
2840; X64-SSE2:       # %bb.0:
2841; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
2842; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
2843; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2844; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2845; X64-SSE2-NEXT:    pand %xmm1, %xmm0
2846; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
2847; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2848; X64-SSE2-NEXT:    setne %al
2849; X64-SSE2-NEXT:    retq
2850;
2851; X64-SSE41-LABEL: length32_eq_const:
2852; X64-SSE41:       # %bb.0:
2853; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
2854; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
2855; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2856; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2857; X64-SSE41-NEXT:    por %xmm1, %xmm0
2858; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
2859; X64-SSE41-NEXT:    setne %al
2860; X64-SSE41-NEXT:    retq
2861;
2862; X64-AVX1-LABEL: length32_eq_const:
2863; X64-AVX1:       # %bb.0:
2864; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
2865; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2866; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
2867; X64-AVX1-NEXT:    setne %al
2868; X64-AVX1-NEXT:    vzeroupper
2869; X64-AVX1-NEXT:    retq
2870;
2871; X64-AVX2-LABEL: length32_eq_const:
2872; X64-AVX2:       # %bb.0:
2873; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2874; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2875; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
2876; X64-AVX2-NEXT:    setne %al
2877; X64-AVX2-NEXT:    vzeroupper
2878; X64-AVX2-NEXT:    retq
2879;
2880; X64-AVX512-LABEL: length32_eq_const:
2881; X64-AVX512:       # %bb.0:
2882; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
2883; X64-AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2884; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
2885; X64-AVX512-NEXT:    setne %al
2886; X64-AVX512-NEXT:    vzeroupper
2887; X64-AVX512-NEXT:    retq
2888;
2889; X64-MIC-AVX-LABEL: length32_eq_const:
2890; X64-MIC-AVX:       # %bb.0:
2891; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
2892; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
2893; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
2894; X64-MIC-AVX-NEXT:    kortestw %k0, %k0
2895; X64-MIC-AVX-NEXT:    setne %al
2896; X64-MIC-AVX-NEXT:    vzeroupper
2897; X64-MIC-AVX-NEXT:    retq
2898  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 32) nounwind
2899  %c = icmp ne i32 %m, 0
2900  ret i1 %c
2901}
2902
2903define i32 @length48(i8* %X, i8* %Y) nounwind {
2904; X86-LABEL: length48:
2905; X86:       # %bb.0:
2906; X86-NEXT:    pushl $0
2907; X86-NEXT:    pushl $48
2908; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2909; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2910; X86-NEXT:    calll memcmp
2911; X86-NEXT:    addl $16, %esp
2912; X86-NEXT:    retl
2913;
2914; X64-LABEL: length48:
2915; X64:       # %bb.0:
2916; X64-NEXT:    movl $48, %edx
2917; X64-NEXT:    jmp memcmp # TAILCALL
2918  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 48) nounwind
2919  ret i32 %m
2920}
2921
2922define i1 @length48_eq(i8* %x, i8* %y) nounwind {
2923; X86-NOSSE-LABEL: length48_eq:
2924; X86-NOSSE:       # %bb.0:
2925; X86-NOSSE-NEXT:    pushl $0
2926; X86-NOSSE-NEXT:    pushl $48
2927; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
2928; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
2929; X86-NOSSE-NEXT:    calll memcmp
2930; X86-NOSSE-NEXT:    addl $16, %esp
2931; X86-NOSSE-NEXT:    testl %eax, %eax
2932; X86-NOSSE-NEXT:    sete %al
2933; X86-NOSSE-NEXT:    retl
2934;
2935; X86-SSE1-LABEL: length48_eq:
2936; X86-SSE1:       # %bb.0:
2937; X86-SSE1-NEXT:    pushl $0
2938; X86-SSE1-NEXT:    pushl $48
2939; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
2940; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
2941; X86-SSE1-NEXT:    calll memcmp
2942; X86-SSE1-NEXT:    addl $16, %esp
2943; X86-SSE1-NEXT:    testl %eax, %eax
2944; X86-SSE1-NEXT:    sete %al
2945; X86-SSE1-NEXT:    retl
2946;
2947; X86-SSE2-LABEL: length48_eq:
2948; X86-SSE2:       # %bb.0:
2949; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2950; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2951; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
2952; X86-SSE2-NEXT:    movdqu 16(%ecx), %xmm1
2953; X86-SSE2-NEXT:    movdqu (%eax), %xmm2
2954; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
2955; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm0
2956; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
2957; X86-SSE2-NEXT:    movdqu 32(%ecx), %xmm1
2958; X86-SSE2-NEXT:    movdqu 32(%eax), %xmm3
2959; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm3
2960; X86-SSE2-NEXT:    pand %xmm0, %xmm3
2961; X86-SSE2-NEXT:    pand %xmm2, %xmm3
2962; X86-SSE2-NEXT:    pmovmskb %xmm3, %eax
2963; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2964; X86-SSE2-NEXT:    sete %al
2965; X86-SSE2-NEXT:    retl
2966;
2967; X86-SSE41-LABEL: length48_eq:
2968; X86-SSE41:       # %bb.0:
2969; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2970; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2971; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
2972; X86-SSE41-NEXT:    movdqu 16(%ecx), %xmm1
2973; X86-SSE41-NEXT:    movdqu (%eax), %xmm2
2974; X86-SSE41-NEXT:    pxor %xmm0, %xmm2
2975; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm0
2976; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
2977; X86-SSE41-NEXT:    movdqu 32(%ecx), %xmm1
2978; X86-SSE41-NEXT:    movdqu 32(%eax), %xmm3
2979; X86-SSE41-NEXT:    pxor %xmm1, %xmm3
2980; X86-SSE41-NEXT:    por %xmm0, %xmm3
2981; X86-SSE41-NEXT:    por %xmm2, %xmm3
2982; X86-SSE41-NEXT:    ptest %xmm3, %xmm3
2983; X86-SSE41-NEXT:    sete %al
2984; X86-SSE41-NEXT:    retl
2985;
2986; X64-SSE2-LABEL: length48_eq:
2987; X64-SSE2:       # %bb.0:
2988; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
2989; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
2990; X64-SSE2-NEXT:    movdqu 32(%rdi), %xmm2
2991; X64-SSE2-NEXT:    movdqu (%rsi), %xmm3
2992; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm3
2993; X64-SSE2-NEXT:    movdqu 16(%rsi), %xmm0
2994; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
2995; X64-SSE2-NEXT:    movdqu 32(%rsi), %xmm1
2996; X64-SSE2-NEXT:    pcmpeqb %xmm2, %xmm1
2997; X64-SSE2-NEXT:    pand %xmm0, %xmm1
2998; X64-SSE2-NEXT:    pand %xmm3, %xmm1
2999; X64-SSE2-NEXT:    pmovmskb %xmm1, %eax
3000; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
3001; X64-SSE2-NEXT:    sete %al
3002; X64-SSE2-NEXT:    retq
3003;
3004; X64-SSE41-LABEL: length48_eq:
3005; X64-SSE41:       # %bb.0:
3006; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
3007; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
3008; X64-SSE41-NEXT:    movdqu 32(%rdi), %xmm2
3009; X64-SSE41-NEXT:    movdqu (%rsi), %xmm3
3010; X64-SSE41-NEXT:    pxor %xmm0, %xmm3
3011; X64-SSE41-NEXT:    movdqu 16(%rsi), %xmm0
3012; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
3013; X64-SSE41-NEXT:    movdqu 32(%rsi), %xmm1
3014; X64-SSE41-NEXT:    pxor %xmm2, %xmm1
3015; X64-SSE41-NEXT:    por %xmm0, %xmm1
3016; X64-SSE41-NEXT:    por %xmm3, %xmm1
3017; X64-SSE41-NEXT:    ptest %xmm1, %xmm1
3018; X64-SSE41-NEXT:    sete %al
3019; X64-SSE41-NEXT:    retq
3020;
3021; X64-AVX1-LABEL: length48_eq:
3022; X64-AVX1:       # %bb.0:
3023; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
3024; X64-AVX1-NEXT:    vmovups 32(%rdi), %xmm1
3025; X64-AVX1-NEXT:    vmovups 32(%rsi), %xmm2
3026; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
3027; X64-AVX1-NEXT:    vxorps %ymm2, %ymm1, %ymm1
3028; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
3029; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
3030; X64-AVX1-NEXT:    sete %al
3031; X64-AVX1-NEXT:    vzeroupper
3032; X64-AVX1-NEXT:    retq
3033;
3034; X64-AVX2-LABEL: length48_eq:
3035; X64-AVX2:       # %bb.0:
3036; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
3037; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %xmm1
3038; X64-AVX2-NEXT:    vmovdqu 32(%rsi), %xmm2
3039; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
3040; X64-AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm1
3041; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
3042; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
3043; X64-AVX2-NEXT:    sete %al
3044; X64-AVX2-NEXT:    vzeroupper
3045; X64-AVX2-NEXT:    retq
3046;
3047; X64-AVX512-LABEL: length48_eq:
3048; X64-AVX512:       # %bb.0:
3049; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
3050; X64-AVX512-NEXT:    vmovdqu 32(%rdi), %xmm1
3051; X64-AVX512-NEXT:    vmovdqu 32(%rsi), %xmm2
3052; X64-AVX512-NEXT:    vpxor (%rsi), %ymm0, %ymm0
3053; X64-AVX512-NEXT:    vpxor %ymm2, %ymm1, %ymm1
3054; X64-AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
3055; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
3056; X64-AVX512-NEXT:    sete %al
3057; X64-AVX512-NEXT:    vzeroupper
3058; X64-AVX512-NEXT:    retq
3059;
3060; X64-MIC-AVX-LABEL: length48_eq:
3061; X64-MIC-AVX:       # %bb.0:
3062; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
3063; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %ymm1
3064; X64-MIC-AVX-NEXT:    vmovdqu 32(%rdi), %xmm2
3065; X64-MIC-AVX-NEXT:    vmovdqu 32(%rsi), %xmm3
3066; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm2, %k0
3067; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
3068; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
3069; X64-MIC-AVX-NEXT:    sete %al
3070; X64-MIC-AVX-NEXT:    vzeroupper
3071; X64-MIC-AVX-NEXT:    retq
3072  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 48) nounwind
3073  %cmp = icmp eq i32 %call, 0
3074  ret i1 %cmp
3075}
3076
3077define i1 @length48_lt(i8* %x, i8* %y) nounwind {
3078; X86-LABEL: length48_lt:
3079; X86:       # %bb.0:
3080; X86-NEXT:    pushl $0
3081; X86-NEXT:    pushl $48
3082; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3083; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3084; X86-NEXT:    calll memcmp
3085; X86-NEXT:    addl $16, %esp
3086; X86-NEXT:    shrl $31, %eax
3087; X86-NEXT:    # kill: def $al killed $al killed $eax
3088; X86-NEXT:    retl
3089;
3090; X64-LABEL: length48_lt:
3091; X64:       # %bb.0:
3092; X64-NEXT:    pushq %rax
3093; X64-NEXT:    movl $48, %edx
3094; X64-NEXT:    callq memcmp
3095; X64-NEXT:    shrl $31, %eax
3096; X64-NEXT:    # kill: def $al killed $al killed $eax
3097; X64-NEXT:    popq %rcx
3098; X64-NEXT:    retq
3099  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 48) nounwind
3100  %cmp = icmp slt i32 %call, 0
3101  ret i1 %cmp
3102}
3103
3104define i1 @length48_gt(i8* %x, i8* %y) nounwind {
3105; X86-LABEL: length48_gt:
3106; X86:       # %bb.0:
3107; X86-NEXT:    pushl $0
3108; X86-NEXT:    pushl $48
3109; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3110; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3111; X86-NEXT:    calll memcmp
3112; X86-NEXT:    addl $16, %esp
3113; X86-NEXT:    testl %eax, %eax
3114; X86-NEXT:    setg %al
3115; X86-NEXT:    retl
3116;
3117; X64-LABEL: length48_gt:
3118; X64:       # %bb.0:
3119; X64-NEXT:    pushq %rax
3120; X64-NEXT:    movl $48, %edx
3121; X64-NEXT:    callq memcmp
3122; X64-NEXT:    testl %eax, %eax
3123; X64-NEXT:    setg %al
3124; X64-NEXT:    popq %rcx
3125; X64-NEXT:    retq
3126  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 48) nounwind
3127  %cmp = icmp sgt i32 %call, 0
3128  ret i1 %cmp
3129}
3130
3131define i1 @length48_eq_prefer128(i8* %x, i8* %y) nounwind "prefer-vector-width"="128" {
3132; X86-NOSSE-LABEL: length48_eq_prefer128:
3133; X86-NOSSE:       # %bb.0:
3134; X86-NOSSE-NEXT:    pushl $0
3135; X86-NOSSE-NEXT:    pushl $48
3136; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
3137; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
3138; X86-NOSSE-NEXT:    calll memcmp
3139; X86-NOSSE-NEXT:    addl $16, %esp
3140; X86-NOSSE-NEXT:    testl %eax, %eax
3141; X86-NOSSE-NEXT:    sete %al
3142; X86-NOSSE-NEXT:    retl
3143;
3144; X86-SSE1-LABEL: length48_eq_prefer128:
3145; X86-SSE1:       # %bb.0:
3146; X86-SSE1-NEXT:    pushl $0
3147; X86-SSE1-NEXT:    pushl $48
3148; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
3149; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
3150; X86-SSE1-NEXT:    calll memcmp
3151; X86-SSE1-NEXT:    addl $16, %esp
3152; X86-SSE1-NEXT:    testl %eax, %eax
3153; X86-SSE1-NEXT:    sete %al
3154; X86-SSE1-NEXT:    retl
3155;
3156; X86-SSE2-LABEL: length48_eq_prefer128:
3157; X86-SSE2:       # %bb.0:
3158; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
3159; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
3160; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
3161; X86-SSE2-NEXT:    movdqu 16(%ecx), %xmm1
3162; X86-SSE2-NEXT:    movdqu (%eax), %xmm2
3163; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
3164; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm0
3165; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
3166; X86-SSE2-NEXT:    movdqu 32(%ecx), %xmm1
3167; X86-SSE2-NEXT:    movdqu 32(%eax), %xmm3
3168; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm3
3169; X86-SSE2-NEXT:    pand %xmm0, %xmm3
3170; X86-SSE2-NEXT:    pand %xmm2, %xmm3
3171; X86-SSE2-NEXT:    pmovmskb %xmm3, %eax
3172; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
3173; X86-SSE2-NEXT:    sete %al
3174; X86-SSE2-NEXT:    retl
3175;
3176; X86-SSE41-LABEL: length48_eq_prefer128:
3177; X86-SSE41:       # %bb.0:
3178; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3179; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
3180; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
3181; X86-SSE41-NEXT:    movdqu 16(%ecx), %xmm1
3182; X86-SSE41-NEXT:    movdqu (%eax), %xmm2
3183; X86-SSE41-NEXT:    pxor %xmm0, %xmm2
3184; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm0
3185; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
3186; X86-SSE41-NEXT:    movdqu 32(%ecx), %xmm1
3187; X86-SSE41-NEXT:    movdqu 32(%eax), %xmm3
3188; X86-SSE41-NEXT:    pxor %xmm1, %xmm3
3189; X86-SSE41-NEXT:    por %xmm0, %xmm3
3190; X86-SSE41-NEXT:    por %xmm2, %xmm3
3191; X86-SSE41-NEXT:    ptest %xmm3, %xmm3
3192; X86-SSE41-NEXT:    sete %al
3193; X86-SSE41-NEXT:    retl
3194;
3195; X64-SSE2-LABEL: length48_eq_prefer128:
3196; X64-SSE2:       # %bb.0:
3197; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
3198; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
3199; X64-SSE2-NEXT:    movdqu 32(%rdi), %xmm2
3200; X64-SSE2-NEXT:    movdqu (%rsi), %xmm3
3201; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm3
3202; X64-SSE2-NEXT:    movdqu 16(%rsi), %xmm0
3203; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
3204; X64-SSE2-NEXT:    movdqu 32(%rsi), %xmm1
3205; X64-SSE2-NEXT:    pcmpeqb %xmm2, %xmm1
3206; X64-SSE2-NEXT:    pand %xmm0, %xmm1
3207; X64-SSE2-NEXT:    pand %xmm3, %xmm1
3208; X64-SSE2-NEXT:    pmovmskb %xmm1, %eax
3209; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
3210; X64-SSE2-NEXT:    sete %al
3211; X64-SSE2-NEXT:    retq
3212;
3213; X64-SSE41-LABEL: length48_eq_prefer128:
3214; X64-SSE41:       # %bb.0:
3215; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
3216; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
3217; X64-SSE41-NEXT:    movdqu 32(%rdi), %xmm2
3218; X64-SSE41-NEXT:    movdqu (%rsi), %xmm3
3219; X64-SSE41-NEXT:    pxor %xmm0, %xmm3
3220; X64-SSE41-NEXT:    movdqu 16(%rsi), %xmm0
3221; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
3222; X64-SSE41-NEXT:    movdqu 32(%rsi), %xmm1
3223; X64-SSE41-NEXT:    pxor %xmm2, %xmm1
3224; X64-SSE41-NEXT:    por %xmm0, %xmm1
3225; X64-SSE41-NEXT:    por %xmm3, %xmm1
3226; X64-SSE41-NEXT:    ptest %xmm1, %xmm1
3227; X64-SSE41-NEXT:    sete %al
3228; X64-SSE41-NEXT:    retq
3229;
3230; X64-AVX-LABEL: length48_eq_prefer128:
3231; X64-AVX:       # %bb.0:
3232; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
3233; X64-AVX-NEXT:    vmovdqu 16(%rdi), %xmm1
3234; X64-AVX-NEXT:    vmovdqu 32(%rdi), %xmm2
3235; X64-AVX-NEXT:    vpxor 16(%rsi), %xmm1, %xmm1
3236; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0
3237; X64-AVX-NEXT:    vpxor 32(%rsi), %xmm2, %xmm2
3238; X64-AVX-NEXT:    vpor %xmm2, %xmm1, %xmm1
3239; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
3240; X64-AVX-NEXT:    vptest %xmm0, %xmm0
3241; X64-AVX-NEXT:    sete %al
3242; X64-AVX-NEXT:    retq
3243;
3244; X64-MIC-AVX-LABEL: length48_eq_prefer128:
3245; X64-MIC-AVX:       # %bb.0:
3246; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
3247; X64-MIC-AVX-NEXT:    vmovdqu 16(%rdi), %xmm1
3248; X64-MIC-AVX-NEXT:    vmovdqu 32(%rdi), %xmm2
3249; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm3
3250; X64-MIC-AVX-NEXT:    vmovdqu 16(%rsi), %xmm4
3251; X64-MIC-AVX-NEXT:    vmovdqu 32(%rsi), %xmm5
3252; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm4, %zmm1, %k0
3253; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm0, %k1
3254; X64-MIC-AVX-NEXT:    korw %k0, %k1, %k0
3255; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm5, %zmm2, %k1
3256; X64-MIC-AVX-NEXT:    kortestw %k1, %k0
3257; X64-MIC-AVX-NEXT:    sete %al
3258; X64-MIC-AVX-NEXT:    vzeroupper
3259; X64-MIC-AVX-NEXT:    retq
3260  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 48) nounwind
3261  %cmp = icmp eq i32 %call, 0
3262  ret i1 %cmp
3263}
3264
3265define i1 @length48_eq_const(i8* %X) nounwind {
3266; X86-NOSSE-LABEL: length48_eq_const:
3267; X86-NOSSE:       # %bb.0:
3268; X86-NOSSE-NEXT:    pushl $0
3269; X86-NOSSE-NEXT:    pushl $48
3270; X86-NOSSE-NEXT:    pushl $.L.str
3271; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
3272; X86-NOSSE-NEXT:    calll memcmp
3273; X86-NOSSE-NEXT:    addl $16, %esp
3274; X86-NOSSE-NEXT:    testl %eax, %eax
3275; X86-NOSSE-NEXT:    setne %al
3276; X86-NOSSE-NEXT:    retl
3277;
3278; X86-SSE1-LABEL: length48_eq_const:
3279; X86-SSE1:       # %bb.0:
3280; X86-SSE1-NEXT:    pushl $0
3281; X86-SSE1-NEXT:    pushl $48
3282; X86-SSE1-NEXT:    pushl $.L.str
3283; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
3284; X86-SSE1-NEXT:    calll memcmp
3285; X86-SSE1-NEXT:    addl $16, %esp
3286; X86-SSE1-NEXT:    testl %eax, %eax
3287; X86-SSE1-NEXT:    setne %al
3288; X86-SSE1-NEXT:    retl
3289;
3290; X86-SSE2-LABEL: length48_eq_const:
3291; X86-SSE2:       # %bb.0:
3292; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
3293; X86-SSE2-NEXT:    movdqu (%eax), %xmm0
3294; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm1
3295; X86-SSE2-NEXT:    movdqu 32(%eax), %xmm2
3296; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
3297; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
3298; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
3299; X86-SSE2-NEXT:    pand %xmm1, %xmm2
3300; X86-SSE2-NEXT:    pand %xmm0, %xmm2
3301; X86-SSE2-NEXT:    pmovmskb %xmm2, %eax
3302; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
3303; X86-SSE2-NEXT:    setne %al
3304; X86-SSE2-NEXT:    retl
3305;
3306; X86-SSE41-LABEL: length48_eq_const:
3307; X86-SSE41:       # %bb.0:
3308; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3309; X86-SSE41-NEXT:    movdqu (%eax), %xmm0
3310; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm1
3311; X86-SSE41-NEXT:    movdqu 32(%eax), %xmm2
3312; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
3313; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
3314; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
3315; X86-SSE41-NEXT:    por %xmm1, %xmm2
3316; X86-SSE41-NEXT:    por %xmm0, %xmm2
3317; X86-SSE41-NEXT:    ptest %xmm2, %xmm2
3318; X86-SSE41-NEXT:    setne %al
3319; X86-SSE41-NEXT:    retl
3320;
3321; X64-SSE2-LABEL: length48_eq_const:
3322; X64-SSE2:       # %bb.0:
3323; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
3324; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
3325; X64-SSE2-NEXT:    movdqu 32(%rdi), %xmm2
3326; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
3327; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3328; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
3329; X64-SSE2-NEXT:    pand %xmm1, %xmm2
3330; X64-SSE2-NEXT:    pand %xmm0, %xmm2
3331; X64-SSE2-NEXT:    pmovmskb %xmm2, %eax
3332; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
3333; X64-SSE2-NEXT:    setne %al
3334; X64-SSE2-NEXT:    retq
3335;
3336; X64-SSE41-LABEL: length48_eq_const:
3337; X64-SSE41:       # %bb.0:
3338; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
3339; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
3340; X64-SSE41-NEXT:    movdqu 32(%rdi), %xmm2
3341; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
3342; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3343; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
3344; X64-SSE41-NEXT:    por %xmm1, %xmm2
3345; X64-SSE41-NEXT:    por %xmm0, %xmm2
3346; X64-SSE41-NEXT:    ptest %xmm2, %xmm2
3347; X64-SSE41-NEXT:    setne %al
3348; X64-SSE41-NEXT:    retq
3349;
3350; X64-AVX1-LABEL: length48_eq_const:
3351; X64-AVX1:       # %bb.0:
3352; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
3353; X64-AVX1-NEXT:    vmovups 32(%rdi), %xmm1
3354; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
3355; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
3356; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
3357; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
3358; X64-AVX1-NEXT:    setne %al
3359; X64-AVX1-NEXT:    vzeroupper
3360; X64-AVX1-NEXT:    retq
3361;
3362; X64-AVX2-LABEL: length48_eq_const:
3363; X64-AVX2:       # %bb.0:
3364; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
3365; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %xmm1
3366; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
3367; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
3368; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
3369; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
3370; X64-AVX2-NEXT:    setne %al
3371; X64-AVX2-NEXT:    vzeroupper
3372; X64-AVX2-NEXT:    retq
3373;
3374; X64-AVX512-LABEL: length48_eq_const:
3375; X64-AVX512:       # %bb.0:
3376; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
3377; X64-AVX512-NEXT:    vmovdqu 32(%rdi), %xmm1
3378; X64-AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
3379; X64-AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
3380; X64-AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
3381; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
3382; X64-AVX512-NEXT:    setne %al
3383; X64-AVX512-NEXT:    vzeroupper
3384; X64-AVX512-NEXT:    retq
3385;
3386; X64-MIC-AVX-LABEL: length48_eq_const:
3387; X64-MIC-AVX:       # %bb.0:
3388; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
3389; X64-MIC-AVX-NEXT:    vmovdqu 32(%rdi), %xmm1
3390; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,0,0,0,0]
3391; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm1, %k0
3392; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
3393; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
3394; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
3395; X64-MIC-AVX-NEXT:    setne %al
3396; X64-MIC-AVX-NEXT:    vzeroupper
3397; X64-MIC-AVX-NEXT:    retq
3398  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 48) nounwind
3399  %c = icmp ne i32 %m, 0
3400  ret i1 %c
3401}
3402
3403define i32 @length63(i8* %X, i8* %Y) nounwind {
3404; X86-LABEL: length63:
3405; X86:       # %bb.0:
3406; X86-NEXT:    pushl $0
3407; X86-NEXT:    pushl $63
3408; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3409; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3410; X86-NEXT:    calll memcmp
3411; X86-NEXT:    addl $16, %esp
3412; X86-NEXT:    retl
3413;
3414; X64-LABEL: length63:
3415; X64:       # %bb.0:
3416; X64-NEXT:    movl $63, %edx
3417; X64-NEXT:    jmp memcmp # TAILCALL
3418  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 63) nounwind
3419  ret i32 %m
3420}
3421
3422define i1 @length63_eq(i8* %x, i8* %y) nounwind {
3423; X86-NOSSE-LABEL: length63_eq:
3424; X86-NOSSE:       # %bb.0:
3425; X86-NOSSE-NEXT:    pushl $0
3426; X86-NOSSE-NEXT:    pushl $63
3427; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
3428; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
3429; X86-NOSSE-NEXT:    calll memcmp
3430; X86-NOSSE-NEXT:    addl $16, %esp
3431; X86-NOSSE-NEXT:    testl %eax, %eax
3432; X86-NOSSE-NEXT:    setne %al
3433; X86-NOSSE-NEXT:    retl
3434;
3435; X86-SSE1-LABEL: length63_eq:
3436; X86-SSE1:       # %bb.0:
3437; X86-SSE1-NEXT:    pushl $0
3438; X86-SSE1-NEXT:    pushl $63
3439; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
3440; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
3441; X86-SSE1-NEXT:    calll memcmp
3442; X86-SSE1-NEXT:    addl $16, %esp
3443; X86-SSE1-NEXT:    testl %eax, %eax
3444; X86-SSE1-NEXT:    setne %al
3445; X86-SSE1-NEXT:    retl
3446;
3447; X86-SSE2-LABEL: length63_eq:
3448; X86-SSE2:       # %bb.0:
3449; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
3450; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
3451; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
3452; X86-SSE2-NEXT:    movdqu 16(%ecx), %xmm1
3453; X86-SSE2-NEXT:    movdqu (%eax), %xmm2
3454; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
3455; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm0
3456; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
3457; X86-SSE2-NEXT:    movdqu 32(%ecx), %xmm1
3458; X86-SSE2-NEXT:    movdqu 32(%eax), %xmm3
3459; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm3
3460; X86-SSE2-NEXT:    movdqu 47(%ecx), %xmm1
3461; X86-SSE2-NEXT:    movdqu 47(%eax), %xmm4
3462; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm4
3463; X86-SSE2-NEXT:    pand %xmm3, %xmm4
3464; X86-SSE2-NEXT:    pand %xmm0, %xmm4
3465; X86-SSE2-NEXT:    pand %xmm2, %xmm4
3466; X86-SSE2-NEXT:    pmovmskb %xmm4, %eax
3467; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
3468; X86-SSE2-NEXT:    setne %al
3469; X86-SSE2-NEXT:    retl
3470;
3471; X86-SSE41-LABEL: length63_eq:
3472; X86-SSE41:       # %bb.0:
3473; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3474; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
3475; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
3476; X86-SSE41-NEXT:    movdqu 16(%ecx), %xmm1
3477; X86-SSE41-NEXT:    movdqu (%eax), %xmm2
3478; X86-SSE41-NEXT:    pxor %xmm0, %xmm2
3479; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm0
3480; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
3481; X86-SSE41-NEXT:    movdqu 32(%ecx), %xmm1
3482; X86-SSE41-NEXT:    movdqu 32(%eax), %xmm3
3483; X86-SSE41-NEXT:    pxor %xmm1, %xmm3
3484; X86-SSE41-NEXT:    movdqu 47(%ecx), %xmm1
3485; X86-SSE41-NEXT:    movdqu 47(%eax), %xmm4
3486; X86-SSE41-NEXT:    pxor %xmm1, %xmm4
3487; X86-SSE41-NEXT:    por %xmm3, %xmm4
3488; X86-SSE41-NEXT:    por %xmm0, %xmm4
3489; X86-SSE41-NEXT:    por %xmm2, %xmm4
3490; X86-SSE41-NEXT:    ptest %xmm4, %xmm4
3491; X86-SSE41-NEXT:    setne %al
3492; X86-SSE41-NEXT:    retl
3493;
3494; X64-SSE2-LABEL: length63_eq:
3495; X64-SSE2:       # %bb.0:
3496; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
3497; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
3498; X64-SSE2-NEXT:    movdqu 32(%rdi), %xmm2
3499; X64-SSE2-NEXT:    movdqu 47(%rdi), %xmm3
3500; X64-SSE2-NEXT:    movdqu (%rsi), %xmm4
3501; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm4
3502; X64-SSE2-NEXT:    movdqu 16(%rsi), %xmm0
3503; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
3504; X64-SSE2-NEXT:    movdqu 32(%rsi), %xmm1
3505; X64-SSE2-NEXT:    pcmpeqb %xmm2, %xmm1
3506; X64-SSE2-NEXT:    movdqu 47(%rsi), %xmm2
3507; X64-SSE2-NEXT:    pcmpeqb %xmm3, %xmm2
3508; X64-SSE2-NEXT:    pand %xmm1, %xmm2
3509; X64-SSE2-NEXT:    pand %xmm0, %xmm2
3510; X64-SSE2-NEXT:    pand %xmm4, %xmm2
3511; X64-SSE2-NEXT:    pmovmskb %xmm2, %eax
3512; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
3513; X64-SSE2-NEXT:    setne %al
3514; X64-SSE2-NEXT:    retq
3515;
3516; X64-SSE41-LABEL: length63_eq:
3517; X64-SSE41:       # %bb.0:
3518; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
3519; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
3520; X64-SSE41-NEXT:    movdqu 32(%rdi), %xmm2
3521; X64-SSE41-NEXT:    movdqu 47(%rdi), %xmm3
3522; X64-SSE41-NEXT:    movdqu (%rsi), %xmm4
3523; X64-SSE41-NEXT:    pxor %xmm0, %xmm4
3524; X64-SSE41-NEXT:    movdqu 16(%rsi), %xmm0
3525; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
3526; X64-SSE41-NEXT:    movdqu 32(%rsi), %xmm1
3527; X64-SSE41-NEXT:    pxor %xmm2, %xmm1
3528; X64-SSE41-NEXT:    movdqu 47(%rsi), %xmm2
3529; X64-SSE41-NEXT:    pxor %xmm3, %xmm2
3530; X64-SSE41-NEXT:    por %xmm1, %xmm2
3531; X64-SSE41-NEXT:    por %xmm0, %xmm2
3532; X64-SSE41-NEXT:    por %xmm4, %xmm2
3533; X64-SSE41-NEXT:    ptest %xmm2, %xmm2
3534; X64-SSE41-NEXT:    setne %al
3535; X64-SSE41-NEXT:    retq
3536;
3537; X64-AVX1-LABEL: length63_eq:
3538; X64-AVX1:       # %bb.0:
3539; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
3540; X64-AVX1-NEXT:    vmovups 31(%rdi), %ymm1
3541; X64-AVX1-NEXT:    vxorps 31(%rsi), %ymm1, %ymm1
3542; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
3543; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
3544; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
3545; X64-AVX1-NEXT:    setne %al
3546; X64-AVX1-NEXT:    vzeroupper
3547; X64-AVX1-NEXT:    retq
3548;
3549; X64-AVX2-LABEL: length63_eq:
3550; X64-AVX2:       # %bb.0:
3551; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
3552; X64-AVX2-NEXT:    vmovdqu 31(%rdi), %ymm1
3553; X64-AVX2-NEXT:    vpxor 31(%rsi), %ymm1, %ymm1
3554; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
3555; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
3556; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
3557; X64-AVX2-NEXT:    setne %al
3558; X64-AVX2-NEXT:    vzeroupper
3559; X64-AVX2-NEXT:    retq
3560;
3561; X64-AVX512-LABEL: length63_eq:
3562; X64-AVX512:       # %bb.0:
3563; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
3564; X64-AVX512-NEXT:    vmovdqu 31(%rdi), %ymm1
3565; X64-AVX512-NEXT:    vpxor 31(%rsi), %ymm1, %ymm1
3566; X64-AVX512-NEXT:    vpxor (%rsi), %ymm0, %ymm0
3567; X64-AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
3568; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
3569; X64-AVX512-NEXT:    setne %al
3570; X64-AVX512-NEXT:    vzeroupper
3571; X64-AVX512-NEXT:    retq
3572;
3573; X64-MIC-AVX-LABEL: length63_eq:
3574; X64-MIC-AVX:       # %bb.0:
3575; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
3576; X64-MIC-AVX-NEXT:    vmovdqu 31(%rdi), %ymm1
3577; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %ymm2
3578; X64-MIC-AVX-NEXT:    vmovdqu 31(%rsi), %ymm3
3579; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm1, %k0
3580; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm0, %k1
3581; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
3582; X64-MIC-AVX-NEXT:    setne %al
3583; X64-MIC-AVX-NEXT:    vzeroupper
3584; X64-MIC-AVX-NEXT:    retq
3585  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 63) nounwind
3586  %cmp = icmp ne i32 %call, 0
3587  ret i1 %cmp
3588}
3589
3590define i1 @length63_lt(i8* %x, i8* %y) nounwind {
3591; X86-LABEL: length63_lt:
3592; X86:       # %bb.0:
3593; X86-NEXT:    pushl $0
3594; X86-NEXT:    pushl $63
3595; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3596; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3597; X86-NEXT:    calll memcmp
3598; X86-NEXT:    addl $16, %esp
3599; X86-NEXT:    shrl $31, %eax
3600; X86-NEXT:    # kill: def $al killed $al killed $eax
3601; X86-NEXT:    retl
3602;
3603; X64-LABEL: length63_lt:
3604; X64:       # %bb.0:
3605; X64-NEXT:    pushq %rax
3606; X64-NEXT:    movl $63, %edx
3607; X64-NEXT:    callq memcmp
3608; X64-NEXT:    shrl $31, %eax
3609; X64-NEXT:    # kill: def $al killed $al killed $eax
3610; X64-NEXT:    popq %rcx
3611; X64-NEXT:    retq
3612  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 63) nounwind
3613  %cmp = icmp slt i32 %call, 0
3614  ret i1 %cmp
3615}
3616
3617define i1 @length63_gt(i8* %x, i8* %y) nounwind {
3618; X86-LABEL: length63_gt:
3619; X86:       # %bb.0:
3620; X86-NEXT:    pushl $0
3621; X86-NEXT:    pushl $63
3622; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3623; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3624; X86-NEXT:    calll memcmp
3625; X86-NEXT:    addl $16, %esp
3626; X86-NEXT:    testl %eax, %eax
3627; X86-NEXT:    setg %al
3628; X86-NEXT:    retl
3629;
3630; X64-LABEL: length63_gt:
3631; X64:       # %bb.0:
3632; X64-NEXT:    pushq %rax
3633; X64-NEXT:    movl $63, %edx
3634; X64-NEXT:    callq memcmp
3635; X64-NEXT:    testl %eax, %eax
3636; X64-NEXT:    setg %al
3637; X64-NEXT:    popq %rcx
3638; X64-NEXT:    retq
3639  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 63) nounwind
3640  %cmp = icmp sgt i32 %call, 0
3641  ret i1 %cmp
3642}
3643
3644define i1 @length63_eq_const(i8* %X) nounwind {
3645; X86-NOSSE-LABEL: length63_eq_const:
3646; X86-NOSSE:       # %bb.0:
3647; X86-NOSSE-NEXT:    pushl $0
3648; X86-NOSSE-NEXT:    pushl $63
3649; X86-NOSSE-NEXT:    pushl $.L.str
3650; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
3651; X86-NOSSE-NEXT:    calll memcmp
3652; X86-NOSSE-NEXT:    addl $16, %esp
3653; X86-NOSSE-NEXT:    testl %eax, %eax
3654; X86-NOSSE-NEXT:    sete %al
3655; X86-NOSSE-NEXT:    retl
3656;
3657; X86-SSE1-LABEL: length63_eq_const:
3658; X86-SSE1:       # %bb.0:
3659; X86-SSE1-NEXT:    pushl $0
3660; X86-SSE1-NEXT:    pushl $63
3661; X86-SSE1-NEXT:    pushl $.L.str
3662; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
3663; X86-SSE1-NEXT:    calll memcmp
3664; X86-SSE1-NEXT:    addl $16, %esp
3665; X86-SSE1-NEXT:    testl %eax, %eax
3666; X86-SSE1-NEXT:    sete %al
3667; X86-SSE1-NEXT:    retl
3668;
3669; X86-SSE2-LABEL: length63_eq_const:
3670; X86-SSE2:       # %bb.0:
3671; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
3672; X86-SSE2-NEXT:    movdqu (%eax), %xmm0
3673; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm1
3674; X86-SSE2-NEXT:    movdqu 32(%eax), %xmm2
3675; X86-SSE2-NEXT:    movdqu 47(%eax), %xmm3
3676; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm3
3677; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
3678; X86-SSE2-NEXT:    pand %xmm3, %xmm2
3679; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
3680; X86-SSE2-NEXT:    pand %xmm2, %xmm1
3681; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
3682; X86-SSE2-NEXT:    pand %xmm1, %xmm0
3683; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
3684; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
3685; X86-SSE2-NEXT:    sete %al
3686; X86-SSE2-NEXT:    retl
3687;
3688; X86-SSE41-LABEL: length63_eq_const:
3689; X86-SSE41:       # %bb.0:
3690; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3691; X86-SSE41-NEXT:    movdqu (%eax), %xmm0
3692; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm1
3693; X86-SSE41-NEXT:    movdqu 32(%eax), %xmm2
3694; X86-SSE41-NEXT:    movdqu 47(%eax), %xmm3
3695; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm3
3696; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
3697; X86-SSE41-NEXT:    por %xmm3, %xmm2
3698; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
3699; X86-SSE41-NEXT:    por %xmm2, %xmm1
3700; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
3701; X86-SSE41-NEXT:    por %xmm1, %xmm0
3702; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
3703; X86-SSE41-NEXT:    sete %al
3704; X86-SSE41-NEXT:    retl
3705;
3706; X64-SSE2-LABEL: length63_eq_const:
3707; X64-SSE2:       # %bb.0:
3708; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
3709; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
3710; X64-SSE2-NEXT:    movdqu 32(%rdi), %xmm2
3711; X64-SSE2-NEXT:    movdqu 47(%rdi), %xmm3
3712; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
3713; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
3714; X64-SSE2-NEXT:    pand %xmm3, %xmm2
3715; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
3716; X64-SSE2-NEXT:    pand %xmm2, %xmm1
3717; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3718; X64-SSE2-NEXT:    pand %xmm1, %xmm0
3719; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
3720; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
3721; X64-SSE2-NEXT:    sete %al
3722; X64-SSE2-NEXT:    retq
3723;
3724; X64-SSE41-LABEL: length63_eq_const:
3725; X64-SSE41:       # %bb.0:
3726; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
3727; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
3728; X64-SSE41-NEXT:    movdqu 32(%rdi), %xmm2
3729; X64-SSE41-NEXT:    movdqu 47(%rdi), %xmm3
3730; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
3731; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
3732; X64-SSE41-NEXT:    por %xmm3, %xmm2
3733; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
3734; X64-SSE41-NEXT:    por %xmm2, %xmm1
3735; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3736; X64-SSE41-NEXT:    por %xmm1, %xmm0
3737; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
3738; X64-SSE41-NEXT:    sete %al
3739; X64-SSE41-NEXT:    retq
3740;
3741; X64-AVX1-LABEL: length63_eq_const:
3742; X64-AVX1:       # %bb.0:
3743; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
3744; X64-AVX1-NEXT:    vmovups 31(%rdi), %ymm1
3745; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
3746; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
3747; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
3748; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
3749; X64-AVX1-NEXT:    sete %al
3750; X64-AVX1-NEXT:    vzeroupper
3751; X64-AVX1-NEXT:    retq
3752;
3753; X64-AVX2-LABEL: length63_eq_const:
3754; X64-AVX2:       # %bb.0:
3755; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
3756; X64-AVX2-NEXT:    vmovdqu 31(%rdi), %ymm1
3757; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
3758; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
3759; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
3760; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
3761; X64-AVX2-NEXT:    sete %al
3762; X64-AVX2-NEXT:    vzeroupper
3763; X64-AVX2-NEXT:    retq
3764;
3765; X64-AVX512-LABEL: length63_eq_const:
3766; X64-AVX512:       # %bb.0:
3767; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
3768; X64-AVX512-NEXT:    vmovdqu 31(%rdi), %ymm1
3769; X64-AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
3770; X64-AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
3771; X64-AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
3772; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
3773; X64-AVX512-NEXT:    sete %al
3774; X64-AVX512-NEXT:    vzeroupper
3775; X64-AVX512-NEXT:    retq
3776;
3777; X64-MIC-AVX-LABEL: length63_eq_const:
3778; X64-MIC-AVX:       # %bb.0:
3779; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
3780; X64-MIC-AVX-NEXT:    vmovdqu 31(%rdi), %ymm1
3781; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm2 = [875770417,943142453,842084409,909456435,809056311,875770417,943142453,842084409]
3782; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm1, %k0
3783; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
3784; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
3785; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
3786; X64-MIC-AVX-NEXT:    sete %al
3787; X64-MIC-AVX-NEXT:    vzeroupper
3788; X64-MIC-AVX-NEXT:    retq
3789  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 63) nounwind
3790  %c = icmp eq i32 %m, 0
3791  ret i1 %c
3792}
3793
3794define i32 @length64(i8* %X, i8* %Y) nounwind {
3795; X86-LABEL: length64:
3796; X86:       # %bb.0:
3797; X86-NEXT:    pushl $0
3798; X86-NEXT:    pushl $64
3799; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3800; X86-NEXT:    pushl {{[0-9]+}}(%esp)
3801; X86-NEXT:    calll memcmp
3802; X86-NEXT:    addl $16, %esp
3803; X86-NEXT:    retl
3804;
3805; X64-LABEL: length64:
3806; X64:       # %bb.0:
3807; X64-NEXT:    movl $64, %edx
3808; X64-NEXT:    jmp memcmp # TAILCALL
3809  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 64) nounwind
3810  ret i32 %m
3811}
3812
3813define i1 @length64_eq(i8* %x, i8* %y) nounwind {
3814; X86-NOSSE-LABEL: length64_eq:
3815; X86-NOSSE:       # %bb.0:
3816; X86-NOSSE-NEXT:    pushl $0
3817; X86-NOSSE-NEXT:    pushl $64
3818; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
3819; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
3820; X86-NOSSE-NEXT:    calll memcmp
3821; X86-NOSSE-NEXT:    addl $16, %esp
3822; X86-NOSSE-NEXT:    testl %eax, %eax
3823; X86-NOSSE-NEXT:    setne %al
3824; X86-NOSSE-NEXT:    retl
3825;
3826; X86-SSE1-LABEL: length64_eq:
3827; X86-SSE1:       # %bb.0:
3828; X86-SSE1-NEXT:    pushl $0
3829; X86-SSE1-NEXT:    pushl $64
3830; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
3831; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
3832; X86-SSE1-NEXT:    calll memcmp
3833; X86-SSE1-NEXT:    addl $16, %esp
3834; X86-SSE1-NEXT:    testl %eax, %eax
3835; X86-SSE1-NEXT:    setne %al
3836; X86-SSE1-NEXT:    retl
3837;
3838; X86-SSE2-LABEL: length64_eq:
3839; X86-SSE2:       # %bb.0:
3840; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
3841; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
3842; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
3843; X86-SSE2-NEXT:    movdqu 16(%ecx), %xmm1
3844; X86-SSE2-NEXT:    movdqu (%eax), %xmm2
3845; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
3846; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm0
3847; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
3848; X86-SSE2-NEXT:    movdqu 32(%ecx), %xmm1
3849; X86-SSE2-NEXT:    movdqu 32(%eax), %xmm3
3850; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm3
3851; X86-SSE2-NEXT:    movdqu 48(%ecx), %xmm1
3852; X86-SSE2-NEXT:    movdqu 48(%eax), %xmm4
3853; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm4
3854; X86-SSE2-NEXT:    pand %xmm3, %xmm4
3855; X86-SSE2-NEXT:    pand %xmm0, %xmm4
3856; X86-SSE2-NEXT:    pand %xmm2, %xmm4
3857; X86-SSE2-NEXT:    pmovmskb %xmm4, %eax
3858; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
3859; X86-SSE2-NEXT:    setne %al
3860; X86-SSE2-NEXT:    retl
3861;
3862; X86-SSE41-LABEL: length64_eq:
3863; X86-SSE41:       # %bb.0:
3864; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3865; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
3866; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
3867; X86-SSE41-NEXT:    movdqu 16(%ecx), %xmm1
3868; X86-SSE41-NEXT:    movdqu (%eax), %xmm2
3869; X86-SSE41-NEXT:    pxor %xmm0, %xmm2
3870; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm0
3871; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
3872; X86-SSE41-NEXT:    movdqu 32(%ecx), %xmm1
3873; X86-SSE41-NEXT:    movdqu 32(%eax), %xmm3
3874; X86-SSE41-NEXT:    pxor %xmm1, %xmm3
3875; X86-SSE41-NEXT:    movdqu 48(%ecx), %xmm1
3876; X86-SSE41-NEXT:    movdqu 48(%eax), %xmm4
3877; X86-SSE41-NEXT:    pxor %xmm1, %xmm4
3878; X86-SSE41-NEXT:    por %xmm3, %xmm4
3879; X86-SSE41-NEXT:    por %xmm0, %xmm4
3880; X86-SSE41-NEXT:    por %xmm2, %xmm4
3881; X86-SSE41-NEXT:    ptest %xmm4, %xmm4
3882; X86-SSE41-NEXT:    setne %al
3883; X86-SSE41-NEXT:    retl
3884;
3885; X64-SSE2-LABEL: length64_eq:
3886; X64-SSE2:       # %bb.0:
3887; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
3888; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
3889; X64-SSE2-NEXT:    movdqu 32(%rdi), %xmm2
3890; X64-SSE2-NEXT:    movdqu 48(%rdi), %xmm3
3891; X64-SSE2-NEXT:    movdqu (%rsi), %xmm4
3892; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm4
3893; X64-SSE2-NEXT:    movdqu 16(%rsi), %xmm0
3894; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
3895; X64-SSE2-NEXT:    movdqu 32(%rsi), %xmm1
3896; X64-SSE2-NEXT:    pcmpeqb %xmm2, %xmm1
3897; X64-SSE2-NEXT:    movdqu 48(%rsi), %xmm2
3898; X64-SSE2-NEXT:    pcmpeqb %xmm3, %xmm2
3899; X64-SSE2-NEXT:    pand %xmm1, %xmm2
3900; X64-SSE2-NEXT:    pand %xmm0, %xmm2
3901; X64-SSE2-NEXT:    pand %xmm4, %xmm2
3902; X64-SSE2-NEXT:    pmovmskb %xmm2, %eax
3903; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
3904; X64-SSE2-NEXT:    setne %al
3905; X64-SSE2-NEXT:    retq
3906;
3907; X64-SSE41-LABEL: length64_eq:
3908; X64-SSE41:       # %bb.0:
3909; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
3910; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
3911; X64-SSE41-NEXT:    movdqu 32(%rdi), %xmm2
3912; X64-SSE41-NEXT:    movdqu 48(%rdi), %xmm3
3913; X64-SSE41-NEXT:    movdqu (%rsi), %xmm4
3914; X64-SSE41-NEXT:    pxor %xmm0, %xmm4
3915; X64-SSE41-NEXT:    movdqu 16(%rsi), %xmm0
3916; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
3917; X64-SSE41-NEXT:    movdqu 32(%rsi), %xmm1
3918; X64-SSE41-NEXT:    pxor %xmm2, %xmm1
3919; X64-SSE41-NEXT:    movdqu 48(%rsi), %xmm2
3920; X64-SSE41-NEXT:    pxor %xmm3, %xmm2
3921; X64-SSE41-NEXT:    por %xmm1, %xmm2
3922; X64-SSE41-NEXT:    por %xmm0, %xmm2
3923; X64-SSE41-NEXT:    por %xmm4, %xmm2
3924; X64-SSE41-NEXT:    ptest %xmm2, %xmm2
3925; X64-SSE41-NEXT:    setne %al
3926; X64-SSE41-NEXT:    retq
3927;
3928; X64-AVX1-LABEL: length64_eq:
3929; X64-AVX1:       # %bb.0:
3930; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
3931; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm1
3932; X64-AVX1-NEXT:    vxorps 32(%rsi), %ymm1, %ymm1
3933; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
3934; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
3935; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
3936; X64-AVX1-NEXT:    setne %al
3937; X64-AVX1-NEXT:    vzeroupper
3938; X64-AVX1-NEXT:    retq
3939;
3940; X64-AVX2-LABEL: length64_eq:
3941; X64-AVX2:       # %bb.0:
3942; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
3943; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
3944; X64-AVX2-NEXT:    vpxor 32(%rsi), %ymm1, %ymm1
3945; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
3946; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
3947; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
3948; X64-AVX2-NEXT:    setne %al
3949; X64-AVX2-NEXT:    vzeroupper
3950; X64-AVX2-NEXT:    retq
3951;
3952; X64-AVX512BW-LABEL: length64_eq:
3953; X64-AVX512BW:       # %bb.0:
3954; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
3955; X64-AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k0
3956; X64-AVX512BW-NEXT:    kortestq %k0, %k0
3957; X64-AVX512BW-NEXT:    setne %al
3958; X64-AVX512BW-NEXT:    vzeroupper
3959; X64-AVX512BW-NEXT:    retq
3960;
3961; X64-AVX512F-LABEL: length64_eq:
3962; X64-AVX512F:       # %bb.0:
3963; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3964; X64-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k0
3965; X64-AVX512F-NEXT:    kortestw %k0, %k0
3966; X64-AVX512F-NEXT:    setne %al
3967; X64-AVX512F-NEXT:    vzeroupper
3968; X64-AVX512F-NEXT:    retq
3969;
3970; X64-MIC-AVX2-LABEL: length64_eq:
3971; X64-MIC-AVX2:       # %bb.0:
3972; X64-MIC-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
3973; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
3974; X64-MIC-AVX2-NEXT:    vmovdqu (%rsi), %ymm2
3975; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rsi), %ymm3
3976; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm3, %zmm1, %k0
3977; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm2, %zmm0, %k1
3978; X64-MIC-AVX2-NEXT:    kortestw %k0, %k1
3979; X64-MIC-AVX2-NEXT:    setne %al
3980; X64-MIC-AVX2-NEXT:    vzeroupper
3981; X64-MIC-AVX2-NEXT:    retq
3982;
3983; X64-MIC-AVX512F-LABEL: length64_eq:
3984; X64-MIC-AVX512F:       # %bb.0:
3985; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3986; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k0
3987; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k0
3988; X64-MIC-AVX512F-NEXT:    setne %al
3989; X64-MIC-AVX512F-NEXT:    vzeroupper
3990; X64-MIC-AVX512F-NEXT:    retq
3991  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 64) nounwind
3992  %cmp = icmp ne i32 %call, 0
3993  ret i1 %cmp
3994}
3995
3996define i1 @length64_lt(i8* %x, i8* %y) nounwind {
3997; X86-LABEL: length64_lt:
3998; X86:       # %bb.0:
3999; X86-NEXT:    pushl $0
4000; X86-NEXT:    pushl $64
4001; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4002; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4003; X86-NEXT:    calll memcmp
4004; X86-NEXT:    addl $16, %esp
4005; X86-NEXT:    shrl $31, %eax
4006; X86-NEXT:    # kill: def $al killed $al killed $eax
4007; X86-NEXT:    retl
4008;
4009; X64-LABEL: length64_lt:
4010; X64:       # %bb.0:
4011; X64-NEXT:    pushq %rax
4012; X64-NEXT:    movl $64, %edx
4013; X64-NEXT:    callq memcmp
4014; X64-NEXT:    shrl $31, %eax
4015; X64-NEXT:    # kill: def $al killed $al killed $eax
4016; X64-NEXT:    popq %rcx
4017; X64-NEXT:    retq
4018  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 64) nounwind
4019  %cmp = icmp slt i32 %call, 0
4020  ret i1 %cmp
4021}
4022
4023define i1 @length64_gt(i8* %x, i8* %y) nounwind {
4024; X86-LABEL: length64_gt:
4025; X86:       # %bb.0:
4026; X86-NEXT:    pushl $0
4027; X86-NEXT:    pushl $64
4028; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4029; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4030; X86-NEXT:    calll memcmp
4031; X86-NEXT:    addl $16, %esp
4032; X86-NEXT:    testl %eax, %eax
4033; X86-NEXT:    setg %al
4034; X86-NEXT:    retl
4035;
4036; X64-LABEL: length64_gt:
4037; X64:       # %bb.0:
4038; X64-NEXT:    pushq %rax
4039; X64-NEXT:    movl $64, %edx
4040; X64-NEXT:    callq memcmp
4041; X64-NEXT:    testl %eax, %eax
4042; X64-NEXT:    setg %al
4043; X64-NEXT:    popq %rcx
4044; X64-NEXT:    retq
4045  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 64) nounwind
4046  %cmp = icmp sgt i32 %call, 0
4047  ret i1 %cmp
4048}
4049
4050define i1 @length64_eq_const(i8* %X) nounwind {
4051; X86-NOSSE-LABEL: length64_eq_const:
4052; X86-NOSSE:       # %bb.0:
4053; X86-NOSSE-NEXT:    pushl $0
4054; X86-NOSSE-NEXT:    pushl $64
4055; X86-NOSSE-NEXT:    pushl $.L.str
4056; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
4057; X86-NOSSE-NEXT:    calll memcmp
4058; X86-NOSSE-NEXT:    addl $16, %esp
4059; X86-NOSSE-NEXT:    testl %eax, %eax
4060; X86-NOSSE-NEXT:    sete %al
4061; X86-NOSSE-NEXT:    retl
4062;
4063; X86-SSE1-LABEL: length64_eq_const:
4064; X86-SSE1:       # %bb.0:
4065; X86-SSE1-NEXT:    pushl $0
4066; X86-SSE1-NEXT:    pushl $64
4067; X86-SSE1-NEXT:    pushl $.L.str
4068; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
4069; X86-SSE1-NEXT:    calll memcmp
4070; X86-SSE1-NEXT:    addl $16, %esp
4071; X86-SSE1-NEXT:    testl %eax, %eax
4072; X86-SSE1-NEXT:    sete %al
4073; X86-SSE1-NEXT:    retl
4074;
4075; X86-SSE2-LABEL: length64_eq_const:
4076; X86-SSE2:       # %bb.0:
4077; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
4078; X86-SSE2-NEXT:    movdqu (%eax), %xmm0
4079; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm1
4080; X86-SSE2-NEXT:    movdqu 32(%eax), %xmm2
4081; X86-SSE2-NEXT:    movdqu 48(%eax), %xmm3
4082; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm3
4083; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
4084; X86-SSE2-NEXT:    pand %xmm3, %xmm2
4085; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
4086; X86-SSE2-NEXT:    pand %xmm2, %xmm1
4087; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
4088; X86-SSE2-NEXT:    pand %xmm1, %xmm0
4089; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
4090; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
4091; X86-SSE2-NEXT:    sete %al
4092; X86-SSE2-NEXT:    retl
4093;
4094; X86-SSE41-LABEL: length64_eq_const:
4095; X86-SSE41:       # %bb.0:
4096; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
4097; X86-SSE41-NEXT:    movdqu (%eax), %xmm0
4098; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm1
4099; X86-SSE41-NEXT:    movdqu 32(%eax), %xmm2
4100; X86-SSE41-NEXT:    movdqu 48(%eax), %xmm3
4101; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm3
4102; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
4103; X86-SSE41-NEXT:    por %xmm3, %xmm2
4104; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
4105; X86-SSE41-NEXT:    por %xmm2, %xmm1
4106; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
4107; X86-SSE41-NEXT:    por %xmm1, %xmm0
4108; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
4109; X86-SSE41-NEXT:    sete %al
4110; X86-SSE41-NEXT:    retl
4111;
4112; X64-SSE2-LABEL: length64_eq_const:
4113; X64-SSE2:       # %bb.0:
4114; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
4115; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
4116; X64-SSE2-NEXT:    movdqu 32(%rdi), %xmm2
4117; X64-SSE2-NEXT:    movdqu 48(%rdi), %xmm3
4118; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
4119; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
4120; X64-SSE2-NEXT:    pand %xmm3, %xmm2
4121; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
4122; X64-SSE2-NEXT:    pand %xmm2, %xmm1
4123; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
4124; X64-SSE2-NEXT:    pand %xmm1, %xmm0
4125; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
4126; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
4127; X64-SSE2-NEXT:    sete %al
4128; X64-SSE2-NEXT:    retq
4129;
4130; X64-SSE41-LABEL: length64_eq_const:
4131; X64-SSE41:       # %bb.0:
4132; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
4133; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
4134; X64-SSE41-NEXT:    movdqu 32(%rdi), %xmm2
4135; X64-SSE41-NEXT:    movdqu 48(%rdi), %xmm3
4136; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
4137; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
4138; X64-SSE41-NEXT:    por %xmm3, %xmm2
4139; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
4140; X64-SSE41-NEXT:    por %xmm2, %xmm1
4141; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
4142; X64-SSE41-NEXT:    por %xmm1, %xmm0
4143; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
4144; X64-SSE41-NEXT:    sete %al
4145; X64-SSE41-NEXT:    retq
4146;
4147; X64-AVX1-LABEL: length64_eq_const:
4148; X64-AVX1:       # %bb.0:
4149; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
4150; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm1
4151; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
4152; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
4153; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
4154; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
4155; X64-AVX1-NEXT:    sete %al
4156; X64-AVX1-NEXT:    vzeroupper
4157; X64-AVX1-NEXT:    retq
4158;
4159; X64-AVX2-LABEL: length64_eq_const:
4160; X64-AVX2:       # %bb.0:
4161; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
4162; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
4163; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
4164; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
4165; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
4166; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
4167; X64-AVX2-NEXT:    sete %al
4168; X64-AVX2-NEXT:    vzeroupper
4169; X64-AVX2-NEXT:    retq
4170;
4171; X64-AVX512BW-LABEL: length64_eq_const:
4172; X64-AVX512BW:       # %bb.0:
4173; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
4174; X64-AVX512BW-NEXT:    vpcmpneqb .L.str(%rip), %zmm0, %k0
4175; X64-AVX512BW-NEXT:    kortestq %k0, %k0
4176; X64-AVX512BW-NEXT:    sete %al
4177; X64-AVX512BW-NEXT:    vzeroupper
4178; X64-AVX512BW-NEXT:    retq
4179;
4180; X64-AVX512F-LABEL: length64_eq_const:
4181; X64-AVX512F:       # %bb.0:
4182; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
4183; X64-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k0
4184; X64-AVX512F-NEXT:    kortestw %k0, %k0
4185; X64-AVX512F-NEXT:    sete %al
4186; X64-AVX512F-NEXT:    vzeroupper
4187; X64-AVX512F-NEXT:    retq
4188;
4189; X64-MIC-AVX2-LABEL: length64_eq_const:
4190; X64-MIC-AVX2:       # %bb.0:
4191; X64-MIC-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
4192; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
4193; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408]
4194; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm2, %zmm1, %k0
4195; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
4196; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
4197; X64-MIC-AVX2-NEXT:    kortestw %k0, %k1
4198; X64-MIC-AVX2-NEXT:    sete %al
4199; X64-MIC-AVX2-NEXT:    vzeroupper
4200; X64-MIC-AVX2-NEXT:    retq
4201;
4202; X64-MIC-AVX512F-LABEL: length64_eq_const:
4203; X64-MIC-AVX512F:       # %bb.0:
4204; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
4205; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k0
4206; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k0
4207; X64-MIC-AVX512F-NEXT:    sete %al
4208; X64-MIC-AVX512F-NEXT:    vzeroupper
4209; X64-MIC-AVX512F-NEXT:    retq
4210  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 64) nounwind
4211  %c = icmp eq i32 %m, 0
4212  ret i1 %c
4213}
4214
4215define i32 @length96(i8* %X, i8* %Y) nounwind {
4216; X86-LABEL: length96:
4217; X86:       # %bb.0:
4218; X86-NEXT:    pushl $0
4219; X86-NEXT:    pushl $96
4220; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4221; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4222; X86-NEXT:    calll memcmp
4223; X86-NEXT:    addl $16, %esp
4224; X86-NEXT:    retl
4225;
4226; X64-LABEL: length96:
4227; X64:       # %bb.0:
4228; X64-NEXT:    movl $96, %edx
4229; X64-NEXT:    jmp memcmp # TAILCALL
4230  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 96) nounwind
4231  ret i32 %m
4232}
4233
4234define i1 @length96_eq(i8* %x, i8* %y) nounwind {
4235; X86-LABEL: length96_eq:
4236; X86:       # %bb.0:
4237; X86-NEXT:    pushl $0
4238; X86-NEXT:    pushl $96
4239; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4240; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4241; X86-NEXT:    calll memcmp
4242; X86-NEXT:    addl $16, %esp
4243; X86-NEXT:    testl %eax, %eax
4244; X86-NEXT:    setne %al
4245; X86-NEXT:    retl
4246;
4247; X64-SSE-LABEL: length96_eq:
4248; X64-SSE:       # %bb.0:
4249; X64-SSE-NEXT:    pushq %rax
4250; X64-SSE-NEXT:    movl $96, %edx
4251; X64-SSE-NEXT:    callq memcmp
4252; X64-SSE-NEXT:    testl %eax, %eax
4253; X64-SSE-NEXT:    setne %al
4254; X64-SSE-NEXT:    popq %rcx
4255; X64-SSE-NEXT:    retq
4256;
4257; X64-AVX1-LABEL: length96_eq:
4258; X64-AVX1:       # %bb.0:
4259; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
4260; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm1
4261; X64-AVX1-NEXT:    vmovups 64(%rdi), %ymm2
4262; X64-AVX1-NEXT:    vxorps 32(%rsi), %ymm1, %ymm1
4263; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
4264; X64-AVX1-NEXT:    vxorps 64(%rsi), %ymm2, %ymm2
4265; X64-AVX1-NEXT:    vorps %ymm2, %ymm1, %ymm1
4266; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
4267; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
4268; X64-AVX1-NEXT:    setne %al
4269; X64-AVX1-NEXT:    vzeroupper
4270; X64-AVX1-NEXT:    retq
4271;
4272; X64-AVX2-LABEL: length96_eq:
4273; X64-AVX2:       # %bb.0:
4274; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
4275; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
4276; X64-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
4277; X64-AVX2-NEXT:    vpxor 32(%rsi), %ymm1, %ymm1
4278; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
4279; X64-AVX2-NEXT:    vpxor 64(%rsi), %ymm2, %ymm2
4280; X64-AVX2-NEXT:    vpor %ymm2, %ymm1, %ymm1
4281; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
4282; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
4283; X64-AVX2-NEXT:    setne %al
4284; X64-AVX2-NEXT:    vzeroupper
4285; X64-AVX2-NEXT:    retq
4286;
4287; X64-AVX512BW-LABEL: length96_eq:
4288; X64-AVX512BW:       # %bb.0:
4289; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
4290; X64-AVX512BW-NEXT:    vmovdqu 64(%rdi), %ymm1
4291; X64-AVX512BW-NEXT:    vmovdqu 64(%rsi), %ymm2
4292; X64-AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k0
4293; X64-AVX512BW-NEXT:    vpcmpneqb %zmm2, %zmm1, %k1
4294; X64-AVX512BW-NEXT:    kortestq %k1, %k0
4295; X64-AVX512BW-NEXT:    setne %al
4296; X64-AVX512BW-NEXT:    vzeroupper
4297; X64-AVX512BW-NEXT:    retq
4298;
4299; X64-AVX512F-LABEL: length96_eq:
4300; X64-AVX512F:       # %bb.0:
4301; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
4302; X64-AVX512F-NEXT:    vmovdqu 64(%rdi), %ymm1
4303; X64-AVX512F-NEXT:    vmovdqu 64(%rsi), %ymm2
4304; X64-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k0
4305; X64-AVX512F-NEXT:    vpcmpneqd %zmm2, %zmm1, %k1
4306; X64-AVX512F-NEXT:    kortestw %k1, %k0
4307; X64-AVX512F-NEXT:    setne %al
4308; X64-AVX512F-NEXT:    vzeroupper
4309; X64-AVX512F-NEXT:    retq
4310;
4311; X64-MIC-AVX2-LABEL: length96_eq:
4312; X64-MIC-AVX2:       # %bb.0:
4313; X64-MIC-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
4314; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
4315; X64-MIC-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
4316; X64-MIC-AVX2-NEXT:    vmovdqu (%rsi), %ymm3
4317; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rsi), %ymm4
4318; X64-MIC-AVX2-NEXT:    vmovdqu 64(%rsi), %ymm5
4319; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm4, %zmm1, %k0
4320; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm3, %zmm0, %k1
4321; X64-MIC-AVX2-NEXT:    korw %k0, %k1, %k0
4322; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm5, %zmm2, %k1
4323; X64-MIC-AVX2-NEXT:    kortestw %k1, %k0
4324; X64-MIC-AVX2-NEXT:    setne %al
4325; X64-MIC-AVX2-NEXT:    vzeroupper
4326; X64-MIC-AVX2-NEXT:    retq
4327;
4328; X64-MIC-AVX512F-LABEL: length96_eq:
4329; X64-MIC-AVX512F:       # %bb.0:
4330; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
4331; X64-MIC-AVX512F-NEXT:    vmovdqu 64(%rdi), %ymm1
4332; X64-MIC-AVX512F-NEXT:    vmovdqu 64(%rsi), %ymm2
4333; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k0
4334; X64-MIC-AVX512F-NEXT:    vpcmpneqd %zmm2, %zmm1, %k1
4335; X64-MIC-AVX512F-NEXT:    kortestw %k1, %k0
4336; X64-MIC-AVX512F-NEXT:    setne %al
4337; X64-MIC-AVX512F-NEXT:    vzeroupper
4338; X64-MIC-AVX512F-NEXT:    retq
4339  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 96) nounwind
4340  %cmp = icmp ne i32 %call, 0
4341  ret i1 %cmp
4342}
4343
4344define i1 @length96_lt(i8* %x, i8* %y) nounwind {
4345; X86-LABEL: length96_lt:
4346; X86:       # %bb.0:
4347; X86-NEXT:    pushl $0
4348; X86-NEXT:    pushl $96
4349; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4350; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4351; X86-NEXT:    calll memcmp
4352; X86-NEXT:    addl $16, %esp
4353; X86-NEXT:    shrl $31, %eax
4354; X86-NEXT:    # kill: def $al killed $al killed $eax
4355; X86-NEXT:    retl
4356;
4357; X64-LABEL: length96_lt:
4358; X64:       # %bb.0:
4359; X64-NEXT:    pushq %rax
4360; X64-NEXT:    movl $96, %edx
4361; X64-NEXT:    callq memcmp
4362; X64-NEXT:    shrl $31, %eax
4363; X64-NEXT:    # kill: def $al killed $al killed $eax
4364; X64-NEXT:    popq %rcx
4365; X64-NEXT:    retq
4366  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 96) nounwind
4367  %cmp = icmp slt i32 %call, 0
4368  ret i1 %cmp
4369}
4370
4371define i1 @length96_gt(i8* %x, i8* %y) nounwind {
4372; X86-LABEL: length96_gt:
4373; X86:       # %bb.0:
4374; X86-NEXT:    pushl $0
4375; X86-NEXT:    pushl $96
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:    setg %al
4382; X86-NEXT:    retl
4383;
4384; X64-LABEL: length96_gt:
4385; X64:       # %bb.0:
4386; X64-NEXT:    pushq %rax
4387; X64-NEXT:    movl $96, %edx
4388; X64-NEXT:    callq memcmp
4389; X64-NEXT:    testl %eax, %eax
4390; X64-NEXT:    setg %al
4391; X64-NEXT:    popq %rcx
4392; X64-NEXT:    retq
4393  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 96) nounwind
4394  %cmp = icmp sgt i32 %call, 0
4395  ret i1 %cmp
4396}
4397
4398define i1 @length96_eq_const(i8* %X) nounwind {
4399; X86-LABEL: length96_eq_const:
4400; X86:       # %bb.0:
4401; X86-NEXT:    pushl $0
4402; X86-NEXT:    pushl $96
4403; X86-NEXT:    pushl $.L.str
4404; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4405; X86-NEXT:    calll memcmp
4406; X86-NEXT:    addl $16, %esp
4407; X86-NEXT:    testl %eax, %eax
4408; X86-NEXT:    sete %al
4409; X86-NEXT:    retl
4410;
4411; X64-SSE-LABEL: length96_eq_const:
4412; X64-SSE:       # %bb.0:
4413; X64-SSE-NEXT:    pushq %rax
4414; X64-SSE-NEXT:    movl $.L.str, %esi
4415; X64-SSE-NEXT:    movl $96, %edx
4416; X64-SSE-NEXT:    callq memcmp
4417; X64-SSE-NEXT:    testl %eax, %eax
4418; X64-SSE-NEXT:    sete %al
4419; X64-SSE-NEXT:    popq %rcx
4420; X64-SSE-NEXT:    retq
4421;
4422; X64-AVX1-LABEL: length96_eq_const:
4423; X64-AVX1:       # %bb.0:
4424; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
4425; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm1
4426; X64-AVX1-NEXT:    vmovups 64(%rdi), %ymm2
4427; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
4428; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
4429; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
4430; X64-AVX1-NEXT:    vorps %ymm2, %ymm1, %ymm1
4431; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
4432; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
4433; X64-AVX1-NEXT:    sete %al
4434; X64-AVX1-NEXT:    vzeroupper
4435; X64-AVX1-NEXT:    retq
4436;
4437; X64-AVX2-LABEL: length96_eq_const:
4438; X64-AVX2:       # %bb.0:
4439; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
4440; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
4441; X64-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
4442; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
4443; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
4444; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
4445; X64-AVX2-NEXT:    vpor %ymm2, %ymm1, %ymm1
4446; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
4447; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
4448; X64-AVX2-NEXT:    sete %al
4449; X64-AVX2-NEXT:    vzeroupper
4450; X64-AVX2-NEXT:    retq
4451;
4452; X64-AVX512BW-LABEL: length96_eq_const:
4453; X64-AVX512BW:       # %bb.0:
4454; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
4455; X64-AVX512BW-NEXT:    vmovdqu 64(%rdi), %ymm1
4456; X64-AVX512BW-NEXT:    vpcmpneqb .L.str(%rip), %zmm0, %k0
4457; X64-AVX512BW-NEXT:    vpcmpneqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k1
4458; X64-AVX512BW-NEXT:    kortestq %k1, %k0
4459; X64-AVX512BW-NEXT:    sete %al
4460; X64-AVX512BW-NEXT:    vzeroupper
4461; X64-AVX512BW-NEXT:    retq
4462;
4463; X64-AVX512F-LABEL: length96_eq_const:
4464; X64-AVX512F:       # %bb.0:
4465; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
4466; X64-AVX512F-NEXT:    vmovdqu 64(%rdi), %ymm1
4467; X64-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k0
4468; X64-AVX512F-NEXT:    vpcmpneqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k1
4469; X64-AVX512F-NEXT:    kortestw %k1, %k0
4470; X64-AVX512F-NEXT:    sete %al
4471; X64-AVX512F-NEXT:    vzeroupper
4472; X64-AVX512F-NEXT:    retq
4473;
4474; X64-MIC-AVX2-LABEL: length96_eq_const:
4475; X64-MIC-AVX2:       # %bb.0:
4476; X64-MIC-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
4477; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
4478; X64-MIC-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
4479; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408]
4480; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm3, %zmm1, %k0
4481; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
4482; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
4483; X64-MIC-AVX2-NEXT:    korw %k0, %k1, %k0
4484; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm0 = [926299444,825243960,892613426,959985462,858927408,926299444,825243960,892613426]
4485; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm0, %zmm2, %k1
4486; X64-MIC-AVX2-NEXT:    kortestw %k1, %k0
4487; X64-MIC-AVX2-NEXT:    sete %al
4488; X64-MIC-AVX2-NEXT:    vzeroupper
4489; X64-MIC-AVX2-NEXT:    retq
4490;
4491; X64-MIC-AVX512F-LABEL: length96_eq_const:
4492; X64-MIC-AVX512F:       # %bb.0:
4493; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
4494; X64-MIC-AVX512F-NEXT:    vmovdqu 64(%rdi), %ymm1
4495; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k0
4496; X64-MIC-AVX512F-NEXT:    vpcmpneqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k1
4497; X64-MIC-AVX512F-NEXT:    kortestw %k1, %k0
4498; X64-MIC-AVX512F-NEXT:    sete %al
4499; X64-MIC-AVX512F-NEXT:    vzeroupper
4500; X64-MIC-AVX512F-NEXT:    retq
4501  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 96) nounwind
4502  %c = icmp eq i32 %m, 0
4503  ret i1 %c
4504}
4505
4506define i32 @length127(i8* %X, i8* %Y) nounwind {
4507; X86-LABEL: length127:
4508; X86:       # %bb.0:
4509; X86-NEXT:    pushl $0
4510; X86-NEXT:    pushl $127
4511; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4512; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4513; X86-NEXT:    calll memcmp
4514; X86-NEXT:    addl $16, %esp
4515; X86-NEXT:    retl
4516;
4517; X64-LABEL: length127:
4518; X64:       # %bb.0:
4519; X64-NEXT:    movl $127, %edx
4520; X64-NEXT:    jmp memcmp # TAILCALL
4521  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 127) nounwind
4522  ret i32 %m
4523}
4524
4525define i1 @length127_eq(i8* %x, i8* %y) nounwind {
4526; X86-LABEL: length127_eq:
4527; X86:       # %bb.0:
4528; X86-NEXT:    pushl $0
4529; X86-NEXT:    pushl $127
4530; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4531; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4532; X86-NEXT:    calll memcmp
4533; X86-NEXT:    addl $16, %esp
4534; X86-NEXT:    testl %eax, %eax
4535; X86-NEXT:    setne %al
4536; X86-NEXT:    retl
4537;
4538; X64-SSE-LABEL: length127_eq:
4539; X64-SSE:       # %bb.0:
4540; X64-SSE-NEXT:    pushq %rax
4541; X64-SSE-NEXT:    movl $127, %edx
4542; X64-SSE-NEXT:    callq memcmp
4543; X64-SSE-NEXT:    testl %eax, %eax
4544; X64-SSE-NEXT:    setne %al
4545; X64-SSE-NEXT:    popq %rcx
4546; X64-SSE-NEXT:    retq
4547;
4548; X64-AVX1-LABEL: length127_eq:
4549; X64-AVX1:       # %bb.0:
4550; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
4551; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm1
4552; X64-AVX1-NEXT:    vmovups 64(%rdi), %ymm2
4553; X64-AVX1-NEXT:    vmovups 95(%rdi), %ymm3
4554; X64-AVX1-NEXT:    vxorps 95(%rsi), %ymm3, %ymm3
4555; X64-AVX1-NEXT:    vxorps 64(%rsi), %ymm2, %ymm2
4556; X64-AVX1-NEXT:    vorps %ymm3, %ymm2, %ymm2
4557; X64-AVX1-NEXT:    vxorps 32(%rsi), %ymm1, %ymm1
4558; X64-AVX1-NEXT:    vorps %ymm2, %ymm1, %ymm1
4559; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
4560; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
4561; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
4562; X64-AVX1-NEXT:    setne %al
4563; X64-AVX1-NEXT:    vzeroupper
4564; X64-AVX1-NEXT:    retq
4565;
4566; X64-AVX2-LABEL: length127_eq:
4567; X64-AVX2:       # %bb.0:
4568; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
4569; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
4570; X64-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
4571; X64-AVX2-NEXT:    vmovdqu 95(%rdi), %ymm3
4572; X64-AVX2-NEXT:    vpxor 95(%rsi), %ymm3, %ymm3
4573; X64-AVX2-NEXT:    vpxor 64(%rsi), %ymm2, %ymm2
4574; X64-AVX2-NEXT:    vpor %ymm3, %ymm2, %ymm2
4575; X64-AVX2-NEXT:    vpxor 32(%rsi), %ymm1, %ymm1
4576; X64-AVX2-NEXT:    vpor %ymm2, %ymm1, %ymm1
4577; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
4578; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
4579; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
4580; X64-AVX2-NEXT:    setne %al
4581; X64-AVX2-NEXT:    vzeroupper
4582; X64-AVX2-NEXT:    retq
4583;
4584; X64-AVX512BW-LABEL: length127_eq:
4585; X64-AVX512BW:       # %bb.0:
4586; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
4587; X64-AVX512BW-NEXT:    vmovdqu64 63(%rdi), %zmm1
4588; X64-AVX512BW-NEXT:    vpcmpneqb 63(%rsi), %zmm1, %k0
4589; X64-AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k1
4590; X64-AVX512BW-NEXT:    kortestq %k0, %k1
4591; X64-AVX512BW-NEXT:    setne %al
4592; X64-AVX512BW-NEXT:    vzeroupper
4593; X64-AVX512BW-NEXT:    retq
4594;
4595; X64-AVX512F-LABEL: length127_eq:
4596; X64-AVX512F:       # %bb.0:
4597; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
4598; X64-AVX512F-NEXT:    vmovdqu64 63(%rdi), %zmm1
4599; X64-AVX512F-NEXT:    vpcmpneqd 63(%rsi), %zmm1, %k0
4600; X64-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k1
4601; X64-AVX512F-NEXT:    kortestw %k0, %k1
4602; X64-AVX512F-NEXT:    setne %al
4603; X64-AVX512F-NEXT:    vzeroupper
4604; X64-AVX512F-NEXT:    retq
4605;
4606; X64-MIC-AVX2-LABEL: length127_eq:
4607; X64-MIC-AVX2:       # %bb.0:
4608; X64-MIC-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
4609; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
4610; X64-MIC-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
4611; X64-MIC-AVX2-NEXT:    vmovdqu 95(%rdi), %ymm3
4612; X64-MIC-AVX2-NEXT:    vmovdqu (%rsi), %ymm4
4613; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rsi), %ymm5
4614; X64-MIC-AVX2-NEXT:    vmovdqu 64(%rsi), %ymm6
4615; X64-MIC-AVX2-NEXT:    vmovdqu 95(%rsi), %ymm7
4616; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm7, %zmm3, %k0
4617; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm6, %zmm2, %k1
4618; X64-MIC-AVX2-NEXT:    korw %k0, %k1, %k0
4619; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm5, %zmm1, %k1
4620; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm4, %zmm0, %k2
4621; X64-MIC-AVX2-NEXT:    korw %k1, %k2, %k1
4622; X64-MIC-AVX2-NEXT:    kortestw %k0, %k1
4623; X64-MIC-AVX2-NEXT:    setne %al
4624; X64-MIC-AVX2-NEXT:    vzeroupper
4625; X64-MIC-AVX2-NEXT:    retq
4626;
4627; X64-MIC-AVX512F-LABEL: length127_eq:
4628; X64-MIC-AVX512F:       # %bb.0:
4629; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
4630; X64-MIC-AVX512F-NEXT:    vmovdqu64 63(%rdi), %zmm1
4631; X64-MIC-AVX512F-NEXT:    vpcmpneqd 63(%rsi), %zmm1, %k0
4632; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k1
4633; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
4634; X64-MIC-AVX512F-NEXT:    setne %al
4635; X64-MIC-AVX512F-NEXT:    vzeroupper
4636; X64-MIC-AVX512F-NEXT:    retq
4637  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 127) nounwind
4638  %cmp = icmp ne i32 %call, 0
4639  ret i1 %cmp
4640}
4641
4642define i1 @length127_lt(i8* %x, i8* %y) nounwind {
4643; X86-LABEL: length127_lt:
4644; X86:       # %bb.0:
4645; X86-NEXT:    pushl $0
4646; X86-NEXT:    pushl $127
4647; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4648; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4649; X86-NEXT:    calll memcmp
4650; X86-NEXT:    addl $16, %esp
4651; X86-NEXT:    shrl $31, %eax
4652; X86-NEXT:    # kill: def $al killed $al killed $eax
4653; X86-NEXT:    retl
4654;
4655; X64-LABEL: length127_lt:
4656; X64:       # %bb.0:
4657; X64-NEXT:    pushq %rax
4658; X64-NEXT:    movl $127, %edx
4659; X64-NEXT:    callq memcmp
4660; X64-NEXT:    shrl $31, %eax
4661; X64-NEXT:    # kill: def $al killed $al killed $eax
4662; X64-NEXT:    popq %rcx
4663; X64-NEXT:    retq
4664  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 127) nounwind
4665  %cmp = icmp slt i32 %call, 0
4666  ret i1 %cmp
4667}
4668
4669define i1 @length127_gt(i8* %x, i8* %y) nounwind {
4670; X86-LABEL: length127_gt:
4671; X86:       # %bb.0:
4672; X86-NEXT:    pushl $0
4673; X86-NEXT:    pushl $127
4674; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4675; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4676; X86-NEXT:    calll memcmp
4677; X86-NEXT:    addl $16, %esp
4678; X86-NEXT:    testl %eax, %eax
4679; X86-NEXT:    setg %al
4680; X86-NEXT:    retl
4681;
4682; X64-LABEL: length127_gt:
4683; X64:       # %bb.0:
4684; X64-NEXT:    pushq %rax
4685; X64-NEXT:    movl $127, %edx
4686; X64-NEXT:    callq memcmp
4687; X64-NEXT:    testl %eax, %eax
4688; X64-NEXT:    setg %al
4689; X64-NEXT:    popq %rcx
4690; X64-NEXT:    retq
4691  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 127) nounwind
4692  %cmp = icmp sgt i32 %call, 0
4693  ret i1 %cmp
4694}
4695
4696define i1 @length127_eq_const(i8* %X) nounwind {
4697; X86-LABEL: length127_eq_const:
4698; X86:       # %bb.0:
4699; X86-NEXT:    pushl $0
4700; X86-NEXT:    pushl $127
4701; X86-NEXT:    pushl $.L.str
4702; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4703; X86-NEXT:    calll memcmp
4704; X86-NEXT:    addl $16, %esp
4705; X86-NEXT:    testl %eax, %eax
4706; X86-NEXT:    sete %al
4707; X86-NEXT:    retl
4708;
4709; X64-SSE-LABEL: length127_eq_const:
4710; X64-SSE:       # %bb.0:
4711; X64-SSE-NEXT:    pushq %rax
4712; X64-SSE-NEXT:    movl $.L.str, %esi
4713; X64-SSE-NEXT:    movl $127, %edx
4714; X64-SSE-NEXT:    callq memcmp
4715; X64-SSE-NEXT:    testl %eax, %eax
4716; X64-SSE-NEXT:    sete %al
4717; X64-SSE-NEXT:    popq %rcx
4718; X64-SSE-NEXT:    retq
4719;
4720; X64-AVX1-LABEL: length127_eq_const:
4721; X64-AVX1:       # %bb.0:
4722; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
4723; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm1
4724; X64-AVX1-NEXT:    vmovups 64(%rdi), %ymm2
4725; X64-AVX1-NEXT:    vmovups 95(%rdi), %ymm3
4726; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
4727; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
4728; X64-AVX1-NEXT:    vorps %ymm3, %ymm2, %ymm2
4729; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
4730; X64-AVX1-NEXT:    vorps %ymm2, %ymm1, %ymm1
4731; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
4732; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
4733; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
4734; X64-AVX1-NEXT:    sete %al
4735; X64-AVX1-NEXT:    vzeroupper
4736; X64-AVX1-NEXT:    retq
4737;
4738; X64-AVX2-LABEL: length127_eq_const:
4739; X64-AVX2:       # %bb.0:
4740; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
4741; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
4742; X64-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
4743; X64-AVX2-NEXT:    vmovdqu 95(%rdi), %ymm3
4744; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
4745; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
4746; X64-AVX2-NEXT:    vpor %ymm3, %ymm2, %ymm2
4747; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
4748; X64-AVX2-NEXT:    vpor %ymm2, %ymm1, %ymm1
4749; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
4750; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
4751; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
4752; X64-AVX2-NEXT:    sete %al
4753; X64-AVX2-NEXT:    vzeroupper
4754; X64-AVX2-NEXT:    retq
4755;
4756; X64-AVX512BW-LABEL: length127_eq_const:
4757; X64-AVX512BW:       # %bb.0:
4758; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
4759; X64-AVX512BW-NEXT:    vmovdqu64 63(%rdi), %zmm1
4760; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+63(%rip), %zmm1, %k0
4761; X64-AVX512BW-NEXT:    vpcmpneqb .L.str(%rip), %zmm0, %k1
4762; X64-AVX512BW-NEXT:    kortestq %k0, %k1
4763; X64-AVX512BW-NEXT:    sete %al
4764; X64-AVX512BW-NEXT:    vzeroupper
4765; X64-AVX512BW-NEXT:    retq
4766;
4767; X64-AVX512F-LABEL: length127_eq_const:
4768; X64-AVX512F:       # %bb.0:
4769; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
4770; X64-AVX512F-NEXT:    vmovdqu64 63(%rdi), %zmm1
4771; X64-AVX512F-NEXT:    vpcmpneqd .L.str+63(%rip), %zmm1, %k0
4772; X64-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k1
4773; X64-AVX512F-NEXT:    kortestw %k0, %k1
4774; X64-AVX512F-NEXT:    sete %al
4775; X64-AVX512F-NEXT:    vzeroupper
4776; X64-AVX512F-NEXT:    retq
4777;
4778; X64-MIC-AVX2-LABEL: length127_eq_const:
4779; X64-MIC-AVX2:       # %bb.0:
4780; X64-MIC-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
4781; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
4782; X64-MIC-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
4783; X64-MIC-AVX2-NEXT:    vmovdqu 95(%rdi), %ymm3
4784; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [943142453,842084409,909456435,809056311,875770417,943142453,842084409,909456435]
4785; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm4, %zmm3, %k0
4786; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [926299444,825243960,892613426,959985462,858927408,926299444,825243960,892613426]
4787; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm3, %zmm2, %k1
4788; X64-MIC-AVX2-NEXT:    korw %k0, %k1, %k0
4789; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408]
4790; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm2, %zmm1, %k1
4791; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
4792; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm1, %zmm0, %k2
4793; X64-MIC-AVX2-NEXT:    korw %k1, %k2, %k1
4794; X64-MIC-AVX2-NEXT:    kortestw %k0, %k1
4795; X64-MIC-AVX2-NEXT:    sete %al
4796; X64-MIC-AVX2-NEXT:    vzeroupper
4797; X64-MIC-AVX2-NEXT:    retq
4798;
4799; X64-MIC-AVX512F-LABEL: length127_eq_const:
4800; X64-MIC-AVX512F:       # %bb.0:
4801; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
4802; X64-MIC-AVX512F-NEXT:    vmovdqu64 63(%rdi), %zmm1
4803; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+63(%rip), %zmm1, %k0
4804; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k1
4805; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
4806; X64-MIC-AVX512F-NEXT:    sete %al
4807; X64-MIC-AVX512F-NEXT:    vzeroupper
4808; X64-MIC-AVX512F-NEXT:    retq
4809  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 127) nounwind
4810  %c = icmp eq i32 %m, 0
4811  ret i1 %c
4812}
4813
4814define i32 @length128(i8* %X, i8* %Y) nounwind {
4815; X86-LABEL: length128:
4816; X86:       # %bb.0:
4817; X86-NEXT:    pushl $0
4818; X86-NEXT:    pushl $128
4819; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4820; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4821; X86-NEXT:    calll memcmp
4822; X86-NEXT:    addl $16, %esp
4823; X86-NEXT:    retl
4824;
4825; X64-LABEL: length128:
4826; X64:       # %bb.0:
4827; X64-NEXT:    movl $128, %edx
4828; X64-NEXT:    jmp memcmp # TAILCALL
4829  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 128) nounwind
4830  ret i32 %m
4831}
4832
4833define i1 @length128_eq(i8* %x, i8* %y) nounwind {
4834; X86-LABEL: length128_eq:
4835; X86:       # %bb.0:
4836; X86-NEXT:    pushl $0
4837; X86-NEXT:    pushl $128
4838; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4839; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4840; X86-NEXT:    calll memcmp
4841; X86-NEXT:    addl $16, %esp
4842; X86-NEXT:    testl %eax, %eax
4843; X86-NEXT:    setne %al
4844; X86-NEXT:    retl
4845;
4846; X64-SSE-LABEL: length128_eq:
4847; X64-SSE:       # %bb.0:
4848; X64-SSE-NEXT:    pushq %rax
4849; X64-SSE-NEXT:    movl $128, %edx
4850; X64-SSE-NEXT:    callq memcmp
4851; X64-SSE-NEXT:    testl %eax, %eax
4852; X64-SSE-NEXT:    setne %al
4853; X64-SSE-NEXT:    popq %rcx
4854; X64-SSE-NEXT:    retq
4855;
4856; X64-AVX1-LABEL: length128_eq:
4857; X64-AVX1:       # %bb.0:
4858; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
4859; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm1
4860; X64-AVX1-NEXT:    vmovups 64(%rdi), %ymm2
4861; X64-AVX1-NEXT:    vmovups 96(%rdi), %ymm3
4862; X64-AVX1-NEXT:    vxorps 96(%rsi), %ymm3, %ymm3
4863; X64-AVX1-NEXT:    vxorps 64(%rsi), %ymm2, %ymm2
4864; X64-AVX1-NEXT:    vorps %ymm3, %ymm2, %ymm2
4865; X64-AVX1-NEXT:    vxorps 32(%rsi), %ymm1, %ymm1
4866; X64-AVX1-NEXT:    vorps %ymm2, %ymm1, %ymm1
4867; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
4868; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
4869; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
4870; X64-AVX1-NEXT:    setne %al
4871; X64-AVX1-NEXT:    vzeroupper
4872; X64-AVX1-NEXT:    retq
4873;
4874; X64-AVX2-LABEL: length128_eq:
4875; X64-AVX2:       # %bb.0:
4876; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
4877; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
4878; X64-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
4879; X64-AVX2-NEXT:    vmovdqu 96(%rdi), %ymm3
4880; X64-AVX2-NEXT:    vpxor 96(%rsi), %ymm3, %ymm3
4881; X64-AVX2-NEXT:    vpxor 64(%rsi), %ymm2, %ymm2
4882; X64-AVX2-NEXT:    vpor %ymm3, %ymm2, %ymm2
4883; X64-AVX2-NEXT:    vpxor 32(%rsi), %ymm1, %ymm1
4884; X64-AVX2-NEXT:    vpor %ymm2, %ymm1, %ymm1
4885; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
4886; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
4887; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
4888; X64-AVX2-NEXT:    setne %al
4889; X64-AVX2-NEXT:    vzeroupper
4890; X64-AVX2-NEXT:    retq
4891;
4892; X64-AVX512BW-LABEL: length128_eq:
4893; X64-AVX512BW:       # %bb.0:
4894; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
4895; X64-AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
4896; X64-AVX512BW-NEXT:    vpcmpneqb 64(%rsi), %zmm1, %k0
4897; X64-AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k1
4898; X64-AVX512BW-NEXT:    kortestq %k0, %k1
4899; X64-AVX512BW-NEXT:    setne %al
4900; X64-AVX512BW-NEXT:    vzeroupper
4901; X64-AVX512BW-NEXT:    retq
4902;
4903; X64-AVX512F-LABEL: length128_eq:
4904; X64-AVX512F:       # %bb.0:
4905; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
4906; X64-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
4907; X64-AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k0
4908; X64-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k1
4909; X64-AVX512F-NEXT:    kortestw %k0, %k1
4910; X64-AVX512F-NEXT:    setne %al
4911; X64-AVX512F-NEXT:    vzeroupper
4912; X64-AVX512F-NEXT:    retq
4913;
4914; X64-MIC-AVX2-LABEL: length128_eq:
4915; X64-MIC-AVX2:       # %bb.0:
4916; X64-MIC-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
4917; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
4918; X64-MIC-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
4919; X64-MIC-AVX2-NEXT:    vmovdqu 96(%rdi), %ymm3
4920; X64-MIC-AVX2-NEXT:    vmovdqu (%rsi), %ymm4
4921; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rsi), %ymm5
4922; X64-MIC-AVX2-NEXT:    vmovdqu 64(%rsi), %ymm6
4923; X64-MIC-AVX2-NEXT:    vmovdqu 96(%rsi), %ymm7
4924; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm7, %zmm3, %k0
4925; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm6, %zmm2, %k1
4926; X64-MIC-AVX2-NEXT:    korw %k0, %k1, %k0
4927; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm5, %zmm1, %k1
4928; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm4, %zmm0, %k2
4929; X64-MIC-AVX2-NEXT:    korw %k1, %k2, %k1
4930; X64-MIC-AVX2-NEXT:    kortestw %k0, %k1
4931; X64-MIC-AVX2-NEXT:    setne %al
4932; X64-MIC-AVX2-NEXT:    vzeroupper
4933; X64-MIC-AVX2-NEXT:    retq
4934;
4935; X64-MIC-AVX512F-LABEL: length128_eq:
4936; X64-MIC-AVX512F:       # %bb.0:
4937; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
4938; X64-MIC-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
4939; X64-MIC-AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k0
4940; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k1
4941; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
4942; X64-MIC-AVX512F-NEXT:    setne %al
4943; X64-MIC-AVX512F-NEXT:    vzeroupper
4944; X64-MIC-AVX512F-NEXT:    retq
4945  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 128) nounwind
4946  %cmp = icmp ne i32 %call, 0
4947  ret i1 %cmp
4948}
4949
4950define i1 @length128_lt(i8* %x, i8* %y) nounwind {
4951; X86-LABEL: length128_lt:
4952; X86:       # %bb.0:
4953; X86-NEXT:    pushl $0
4954; X86-NEXT:    pushl $128
4955; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4956; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4957; X86-NEXT:    calll memcmp
4958; X86-NEXT:    addl $16, %esp
4959; X86-NEXT:    shrl $31, %eax
4960; X86-NEXT:    # kill: def $al killed $al killed $eax
4961; X86-NEXT:    retl
4962;
4963; X64-LABEL: length128_lt:
4964; X64:       # %bb.0:
4965; X64-NEXT:    pushq %rax
4966; X64-NEXT:    movl $128, %edx
4967; X64-NEXT:    callq memcmp
4968; X64-NEXT:    shrl $31, %eax
4969; X64-NEXT:    # kill: def $al killed $al killed $eax
4970; X64-NEXT:    popq %rcx
4971; X64-NEXT:    retq
4972  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 128) nounwind
4973  %cmp = icmp slt i32 %call, 0
4974  ret i1 %cmp
4975}
4976
4977define i1 @length128_gt(i8* %x, i8* %y) nounwind {
4978; X86-LABEL: length128_gt:
4979; X86:       # %bb.0:
4980; X86-NEXT:    pushl $0
4981; X86-NEXT:    pushl $128
4982; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4983; X86-NEXT:    pushl {{[0-9]+}}(%esp)
4984; X86-NEXT:    calll memcmp
4985; X86-NEXT:    addl $16, %esp
4986; X86-NEXT:    testl %eax, %eax
4987; X86-NEXT:    setg %al
4988; X86-NEXT:    retl
4989;
4990; X64-LABEL: length128_gt:
4991; X64:       # %bb.0:
4992; X64-NEXT:    pushq %rax
4993; X64-NEXT:    movl $128, %edx
4994; X64-NEXT:    callq memcmp
4995; X64-NEXT:    testl %eax, %eax
4996; X64-NEXT:    setg %al
4997; X64-NEXT:    popq %rcx
4998; X64-NEXT:    retq
4999  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 128) nounwind
5000  %cmp = icmp sgt i32 %call, 0
5001  ret i1 %cmp
5002}
5003
5004define i1 @length128_eq_const(i8* %X) nounwind {
5005; X86-LABEL: length128_eq_const:
5006; X86:       # %bb.0:
5007; X86-NEXT:    pushl $0
5008; X86-NEXT:    pushl $128
5009; X86-NEXT:    pushl $.L.str
5010; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5011; X86-NEXT:    calll memcmp
5012; X86-NEXT:    addl $16, %esp
5013; X86-NEXT:    testl %eax, %eax
5014; X86-NEXT:    sete %al
5015; X86-NEXT:    retl
5016;
5017; X64-SSE-LABEL: length128_eq_const:
5018; X64-SSE:       # %bb.0:
5019; X64-SSE-NEXT:    pushq %rax
5020; X64-SSE-NEXT:    movl $.L.str, %esi
5021; X64-SSE-NEXT:    movl $128, %edx
5022; X64-SSE-NEXT:    callq memcmp
5023; X64-SSE-NEXT:    testl %eax, %eax
5024; X64-SSE-NEXT:    sete %al
5025; X64-SSE-NEXT:    popq %rcx
5026; X64-SSE-NEXT:    retq
5027;
5028; X64-AVX1-LABEL: length128_eq_const:
5029; X64-AVX1:       # %bb.0:
5030; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
5031; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm1
5032; X64-AVX1-NEXT:    vmovups 64(%rdi), %ymm2
5033; X64-AVX1-NEXT:    vmovups 96(%rdi), %ymm3
5034; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
5035; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
5036; X64-AVX1-NEXT:    vorps %ymm3, %ymm2, %ymm2
5037; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
5038; X64-AVX1-NEXT:    vorps %ymm2, %ymm1, %ymm1
5039; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
5040; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
5041; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
5042; X64-AVX1-NEXT:    sete %al
5043; X64-AVX1-NEXT:    vzeroupper
5044; X64-AVX1-NEXT:    retq
5045;
5046; X64-AVX2-LABEL: length128_eq_const:
5047; X64-AVX2:       # %bb.0:
5048; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
5049; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
5050; X64-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
5051; X64-AVX2-NEXT:    vmovdqu 96(%rdi), %ymm3
5052; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
5053; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
5054; X64-AVX2-NEXT:    vpor %ymm3, %ymm2, %ymm2
5055; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
5056; X64-AVX2-NEXT:    vpor %ymm2, %ymm1, %ymm1
5057; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
5058; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
5059; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
5060; X64-AVX2-NEXT:    sete %al
5061; X64-AVX2-NEXT:    vzeroupper
5062; X64-AVX2-NEXT:    retq
5063;
5064; X64-AVX512BW-LABEL: length128_eq_const:
5065; X64-AVX512BW:       # %bb.0:
5066; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
5067; X64-AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
5068; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+64(%rip), %zmm1, %k0
5069; X64-AVX512BW-NEXT:    vpcmpneqb .L.str(%rip), %zmm0, %k1
5070; X64-AVX512BW-NEXT:    kortestq %k0, %k1
5071; X64-AVX512BW-NEXT:    sete %al
5072; X64-AVX512BW-NEXT:    vzeroupper
5073; X64-AVX512BW-NEXT:    retq
5074;
5075; X64-AVX512F-LABEL: length128_eq_const:
5076; X64-AVX512F:       # %bb.0:
5077; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
5078; X64-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
5079; X64-AVX512F-NEXT:    vpcmpneqd .L.str+64(%rip), %zmm1, %k0
5080; X64-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k1
5081; X64-AVX512F-NEXT:    kortestw %k0, %k1
5082; X64-AVX512F-NEXT:    sete %al
5083; X64-AVX512F-NEXT:    vzeroupper
5084; X64-AVX512F-NEXT:    retq
5085;
5086; X64-MIC-AVX2-LABEL: length128_eq_const:
5087; X64-MIC-AVX2:       # %bb.0:
5088; X64-MIC-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
5089; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
5090; X64-MIC-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
5091; X64-MIC-AVX2-NEXT:    vmovdqu 96(%rdi), %ymm3
5092; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [959985462,858927408,926299444,825243960,892613426,959985462,858927408,926299444]
5093; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm4, %zmm3, %k0
5094; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [926299444,825243960,892613426,959985462,858927408,926299444,825243960,892613426]
5095; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm3, %zmm2, %k1
5096; X64-MIC-AVX2-NEXT:    korw %k0, %k1, %k0
5097; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408]
5098; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm2, %zmm1, %k1
5099; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
5100; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm1, %zmm0, %k2
5101; X64-MIC-AVX2-NEXT:    korw %k1, %k2, %k1
5102; X64-MIC-AVX2-NEXT:    kortestw %k0, %k1
5103; X64-MIC-AVX2-NEXT:    sete %al
5104; X64-MIC-AVX2-NEXT:    vzeroupper
5105; X64-MIC-AVX2-NEXT:    retq
5106;
5107; X64-MIC-AVX512F-LABEL: length128_eq_const:
5108; X64-MIC-AVX512F:       # %bb.0:
5109; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
5110; X64-MIC-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
5111; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+64(%rip), %zmm1, %k0
5112; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k1
5113; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
5114; X64-MIC-AVX512F-NEXT:    sete %al
5115; X64-MIC-AVX512F-NEXT:    vzeroupper
5116; X64-MIC-AVX512F-NEXT:    retq
5117  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 128) nounwind
5118  %c = icmp eq i32 %m, 0
5119  ret i1 %c
5120}
5121
5122define i32 @length192(i8* %X, i8* %Y) nounwind {
5123; X86-LABEL: length192:
5124; X86:       # %bb.0:
5125; X86-NEXT:    pushl $0
5126; X86-NEXT:    pushl $192
5127; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5128; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5129; X86-NEXT:    calll memcmp
5130; X86-NEXT:    addl $16, %esp
5131; X86-NEXT:    retl
5132;
5133; X64-LABEL: length192:
5134; X64:       # %bb.0:
5135; X64-NEXT:    movl $192, %edx
5136; X64-NEXT:    jmp memcmp # TAILCALL
5137  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 192) nounwind
5138  ret i32 %m
5139}
5140
5141define i1 @length192_eq(i8* %x, i8* %y) nounwind {
5142; X86-LABEL: length192_eq:
5143; X86:       # %bb.0:
5144; X86-NEXT:    pushl $0
5145; X86-NEXT:    pushl $192
5146; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5147; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5148; X86-NEXT:    calll memcmp
5149; X86-NEXT:    addl $16, %esp
5150; X86-NEXT:    testl %eax, %eax
5151; X86-NEXT:    setne %al
5152; X86-NEXT:    retl
5153;
5154; X64-SSE-LABEL: length192_eq:
5155; X64-SSE:       # %bb.0:
5156; X64-SSE-NEXT:    pushq %rax
5157; X64-SSE-NEXT:    movl $192, %edx
5158; X64-SSE-NEXT:    callq memcmp
5159; X64-SSE-NEXT:    testl %eax, %eax
5160; X64-SSE-NEXT:    setne %al
5161; X64-SSE-NEXT:    popq %rcx
5162; X64-SSE-NEXT:    retq
5163;
5164; X64-AVX1-LABEL: length192_eq:
5165; X64-AVX1:       # %bb.0:
5166; X64-AVX1-NEXT:    pushq %rax
5167; X64-AVX1-NEXT:    movl $192, %edx
5168; X64-AVX1-NEXT:    callq memcmp
5169; X64-AVX1-NEXT:    testl %eax, %eax
5170; X64-AVX1-NEXT:    setne %al
5171; X64-AVX1-NEXT:    popq %rcx
5172; X64-AVX1-NEXT:    retq
5173;
5174; X64-AVX2-LABEL: length192_eq:
5175; X64-AVX2:       # %bb.0:
5176; X64-AVX2-NEXT:    pushq %rax
5177; X64-AVX2-NEXT:    movl $192, %edx
5178; X64-AVX2-NEXT:    callq memcmp
5179; X64-AVX2-NEXT:    testl %eax, %eax
5180; X64-AVX2-NEXT:    setne %al
5181; X64-AVX2-NEXT:    popq %rcx
5182; X64-AVX2-NEXT:    retq
5183;
5184; X64-AVX512BW-LABEL: length192_eq:
5185; X64-AVX512BW:       # %bb.0:
5186; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
5187; X64-AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
5188; X64-AVX512BW-NEXT:    vmovdqu64 128(%rdi), %zmm2
5189; X64-AVX512BW-NEXT:    vpcmpneqb 64(%rsi), %zmm1, %k0
5190; X64-AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k1
5191; X64-AVX512BW-NEXT:    korq %k0, %k1, %k0
5192; X64-AVX512BW-NEXT:    vpcmpneqb 128(%rsi), %zmm2, %k1
5193; X64-AVX512BW-NEXT:    kortestq %k1, %k0
5194; X64-AVX512BW-NEXT:    setne %al
5195; X64-AVX512BW-NEXT:    vzeroupper
5196; X64-AVX512BW-NEXT:    retq
5197;
5198; X64-AVX512F-LABEL: length192_eq:
5199; X64-AVX512F:       # %bb.0:
5200; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
5201; X64-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
5202; X64-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
5203; X64-AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k0
5204; X64-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k1
5205; X64-AVX512F-NEXT:    korw %k0, %k1, %k0
5206; X64-AVX512F-NEXT:    vpcmpneqd 128(%rsi), %zmm2, %k1
5207; X64-AVX512F-NEXT:    kortestw %k1, %k0
5208; X64-AVX512F-NEXT:    setne %al
5209; X64-AVX512F-NEXT:    vzeroupper
5210; X64-AVX512F-NEXT:    retq
5211;
5212; X64-MIC-AVX2-LABEL: length192_eq:
5213; X64-MIC-AVX2:       # %bb.0:
5214; X64-MIC-AVX2-NEXT:    pushq %rax
5215; X64-MIC-AVX2-NEXT:    movl $192, %edx
5216; X64-MIC-AVX2-NEXT:    callq memcmp
5217; X64-MIC-AVX2-NEXT:    testl %eax, %eax
5218; X64-MIC-AVX2-NEXT:    setne %al
5219; X64-MIC-AVX2-NEXT:    popq %rcx
5220; X64-MIC-AVX2-NEXT:    retq
5221;
5222; X64-MIC-AVX512F-LABEL: length192_eq:
5223; X64-MIC-AVX512F:       # %bb.0:
5224; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
5225; X64-MIC-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
5226; X64-MIC-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
5227; X64-MIC-AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k0
5228; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k1
5229; X64-MIC-AVX512F-NEXT:    korw %k0, %k1, %k0
5230; X64-MIC-AVX512F-NEXT:    vpcmpneqd 128(%rsi), %zmm2, %k1
5231; X64-MIC-AVX512F-NEXT:    kortestw %k1, %k0
5232; X64-MIC-AVX512F-NEXT:    setne %al
5233; X64-MIC-AVX512F-NEXT:    vzeroupper
5234; X64-MIC-AVX512F-NEXT:    retq
5235  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 192) nounwind
5236  %cmp = icmp ne i32 %call, 0
5237  ret i1 %cmp
5238}
5239
5240define i1 @length192_lt(i8* %x, i8* %y) nounwind {
5241; X86-LABEL: length192_lt:
5242; X86:       # %bb.0:
5243; X86-NEXT:    pushl $0
5244; X86-NEXT:    pushl $192
5245; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5246; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5247; X86-NEXT:    calll memcmp
5248; X86-NEXT:    addl $16, %esp
5249; X86-NEXT:    shrl $31, %eax
5250; X86-NEXT:    # kill: def $al killed $al killed $eax
5251; X86-NEXT:    retl
5252;
5253; X64-LABEL: length192_lt:
5254; X64:       # %bb.0:
5255; X64-NEXT:    pushq %rax
5256; X64-NEXT:    movl $192, %edx
5257; X64-NEXT:    callq memcmp
5258; X64-NEXT:    shrl $31, %eax
5259; X64-NEXT:    # kill: def $al killed $al killed $eax
5260; X64-NEXT:    popq %rcx
5261; X64-NEXT:    retq
5262  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 192) nounwind
5263  %cmp = icmp slt i32 %call, 0
5264  ret i1 %cmp
5265}
5266
5267define i1 @length192_gt(i8* %x, i8* %y) nounwind {
5268; X86-LABEL: length192_gt:
5269; X86:       # %bb.0:
5270; X86-NEXT:    pushl $0
5271; X86-NEXT:    pushl $192
5272; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5273; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5274; X86-NEXT:    calll memcmp
5275; X86-NEXT:    addl $16, %esp
5276; X86-NEXT:    testl %eax, %eax
5277; X86-NEXT:    setg %al
5278; X86-NEXT:    retl
5279;
5280; X64-LABEL: length192_gt:
5281; X64:       # %bb.0:
5282; X64-NEXT:    pushq %rax
5283; X64-NEXT:    movl $192, %edx
5284; X64-NEXT:    callq memcmp
5285; X64-NEXT:    testl %eax, %eax
5286; X64-NEXT:    setg %al
5287; X64-NEXT:    popq %rcx
5288; X64-NEXT:    retq
5289  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 192) nounwind
5290  %cmp = icmp sgt i32 %call, 0
5291  ret i1 %cmp
5292}
5293
5294define i1 @length192_eq_const(i8* %X) nounwind {
5295; X86-LABEL: length192_eq_const:
5296; X86:       # %bb.0:
5297; X86-NEXT:    pushl $0
5298; X86-NEXT:    pushl $192
5299; X86-NEXT:    pushl $.L.str
5300; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5301; X86-NEXT:    calll memcmp
5302; X86-NEXT:    addl $16, %esp
5303; X86-NEXT:    testl %eax, %eax
5304; X86-NEXT:    sete %al
5305; X86-NEXT:    retl
5306;
5307; X64-SSE-LABEL: length192_eq_const:
5308; X64-SSE:       # %bb.0:
5309; X64-SSE-NEXT:    pushq %rax
5310; X64-SSE-NEXT:    movl $.L.str, %esi
5311; X64-SSE-NEXT:    movl $192, %edx
5312; X64-SSE-NEXT:    callq memcmp
5313; X64-SSE-NEXT:    testl %eax, %eax
5314; X64-SSE-NEXT:    sete %al
5315; X64-SSE-NEXT:    popq %rcx
5316; X64-SSE-NEXT:    retq
5317;
5318; X64-AVX1-LABEL: length192_eq_const:
5319; X64-AVX1:       # %bb.0:
5320; X64-AVX1-NEXT:    pushq %rax
5321; X64-AVX1-NEXT:    movl $.L.str, %esi
5322; X64-AVX1-NEXT:    movl $192, %edx
5323; X64-AVX1-NEXT:    callq memcmp
5324; X64-AVX1-NEXT:    testl %eax, %eax
5325; X64-AVX1-NEXT:    sete %al
5326; X64-AVX1-NEXT:    popq %rcx
5327; X64-AVX1-NEXT:    retq
5328;
5329; X64-AVX2-LABEL: length192_eq_const:
5330; X64-AVX2:       # %bb.0:
5331; X64-AVX2-NEXT:    pushq %rax
5332; X64-AVX2-NEXT:    movl $.L.str, %esi
5333; X64-AVX2-NEXT:    movl $192, %edx
5334; X64-AVX2-NEXT:    callq memcmp
5335; X64-AVX2-NEXT:    testl %eax, %eax
5336; X64-AVX2-NEXT:    sete %al
5337; X64-AVX2-NEXT:    popq %rcx
5338; X64-AVX2-NEXT:    retq
5339;
5340; X64-AVX512BW-LABEL: length192_eq_const:
5341; X64-AVX512BW:       # %bb.0:
5342; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
5343; X64-AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
5344; X64-AVX512BW-NEXT:    vmovdqu64 128(%rdi), %zmm2
5345; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+64(%rip), %zmm1, %k0
5346; X64-AVX512BW-NEXT:    vpcmpneqb .L.str(%rip), %zmm0, %k1
5347; X64-AVX512BW-NEXT:    korq %k0, %k1, %k0
5348; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+128(%rip), %zmm2, %k1
5349; X64-AVX512BW-NEXT:    kortestq %k1, %k0
5350; X64-AVX512BW-NEXT:    sete %al
5351; X64-AVX512BW-NEXT:    vzeroupper
5352; X64-AVX512BW-NEXT:    retq
5353;
5354; X64-AVX512F-LABEL: length192_eq_const:
5355; X64-AVX512F:       # %bb.0:
5356; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
5357; X64-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
5358; X64-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
5359; X64-AVX512F-NEXT:    vpcmpneqd .L.str+64(%rip), %zmm1, %k0
5360; X64-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k1
5361; X64-AVX512F-NEXT:    korw %k0, %k1, %k0
5362; X64-AVX512F-NEXT:    vpcmpneqd .L.str+128(%rip), %zmm2, %k1
5363; X64-AVX512F-NEXT:    kortestw %k1, %k0
5364; X64-AVX512F-NEXT:    sete %al
5365; X64-AVX512F-NEXT:    vzeroupper
5366; X64-AVX512F-NEXT:    retq
5367;
5368; X64-MIC-AVX2-LABEL: length192_eq_const:
5369; X64-MIC-AVX2:       # %bb.0:
5370; X64-MIC-AVX2-NEXT:    pushq %rax
5371; X64-MIC-AVX2-NEXT:    movl $.L.str, %esi
5372; X64-MIC-AVX2-NEXT:    movl $192, %edx
5373; X64-MIC-AVX2-NEXT:    callq memcmp
5374; X64-MIC-AVX2-NEXT:    testl %eax, %eax
5375; X64-MIC-AVX2-NEXT:    sete %al
5376; X64-MIC-AVX2-NEXT:    popq %rcx
5377; X64-MIC-AVX2-NEXT:    retq
5378;
5379; X64-MIC-AVX512F-LABEL: length192_eq_const:
5380; X64-MIC-AVX512F:       # %bb.0:
5381; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
5382; X64-MIC-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
5383; X64-MIC-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
5384; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+64(%rip), %zmm1, %k0
5385; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k1
5386; X64-MIC-AVX512F-NEXT:    korw %k0, %k1, %k0
5387; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+128(%rip), %zmm2, %k1
5388; X64-MIC-AVX512F-NEXT:    kortestw %k1, %k0
5389; X64-MIC-AVX512F-NEXT:    sete %al
5390; X64-MIC-AVX512F-NEXT:    vzeroupper
5391; X64-MIC-AVX512F-NEXT:    retq
5392  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 192) nounwind
5393  %c = icmp eq i32 %m, 0
5394  ret i1 %c
5395}
5396
5397define i32 @length255(i8* %X, i8* %Y) nounwind {
5398; X86-LABEL: length255:
5399; X86:       # %bb.0:
5400; X86-NEXT:    pushl $0
5401; X86-NEXT:    pushl $255
5402; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5403; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5404; X86-NEXT:    calll memcmp
5405; X86-NEXT:    addl $16, %esp
5406; X86-NEXT:    retl
5407;
5408; X64-LABEL: length255:
5409; X64:       # %bb.0:
5410; X64-NEXT:    movl $255, %edx
5411; X64-NEXT:    jmp memcmp # TAILCALL
5412  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 255) nounwind
5413  ret i32 %m
5414}
5415
5416define i1 @length255_eq(i8* %x, i8* %y) nounwind {
5417; X86-LABEL: length255_eq:
5418; X86:       # %bb.0:
5419; X86-NEXT:    pushl $0
5420; X86-NEXT:    pushl $255
5421; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5422; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5423; X86-NEXT:    calll memcmp
5424; X86-NEXT:    addl $16, %esp
5425; X86-NEXT:    testl %eax, %eax
5426; X86-NEXT:    setne %al
5427; X86-NEXT:    retl
5428;
5429; X64-SSE-LABEL: length255_eq:
5430; X64-SSE:       # %bb.0:
5431; X64-SSE-NEXT:    pushq %rax
5432; X64-SSE-NEXT:    movl $255, %edx
5433; X64-SSE-NEXT:    callq memcmp
5434; X64-SSE-NEXT:    testl %eax, %eax
5435; X64-SSE-NEXT:    setne %al
5436; X64-SSE-NEXT:    popq %rcx
5437; X64-SSE-NEXT:    retq
5438;
5439; X64-AVX1-LABEL: length255_eq:
5440; X64-AVX1:       # %bb.0:
5441; X64-AVX1-NEXT:    pushq %rax
5442; X64-AVX1-NEXT:    movl $255, %edx
5443; X64-AVX1-NEXT:    callq memcmp
5444; X64-AVX1-NEXT:    testl %eax, %eax
5445; X64-AVX1-NEXT:    setne %al
5446; X64-AVX1-NEXT:    popq %rcx
5447; X64-AVX1-NEXT:    retq
5448;
5449; X64-AVX2-LABEL: length255_eq:
5450; X64-AVX2:       # %bb.0:
5451; X64-AVX2-NEXT:    pushq %rax
5452; X64-AVX2-NEXT:    movl $255, %edx
5453; X64-AVX2-NEXT:    callq memcmp
5454; X64-AVX2-NEXT:    testl %eax, %eax
5455; X64-AVX2-NEXT:    setne %al
5456; X64-AVX2-NEXT:    popq %rcx
5457; X64-AVX2-NEXT:    retq
5458;
5459; X64-AVX512BW-LABEL: length255_eq:
5460; X64-AVX512BW:       # %bb.0:
5461; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
5462; X64-AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
5463; X64-AVX512BW-NEXT:    vmovdqu64 128(%rdi), %zmm2
5464; X64-AVX512BW-NEXT:    vmovdqu64 191(%rdi), %zmm3
5465; X64-AVX512BW-NEXT:    vpcmpneqb 191(%rsi), %zmm3, %k0
5466; X64-AVX512BW-NEXT:    vpcmpneqb 128(%rsi), %zmm2, %k1
5467; X64-AVX512BW-NEXT:    korq %k0, %k1, %k0
5468; X64-AVX512BW-NEXT:    vpcmpneqb 64(%rsi), %zmm1, %k1
5469; X64-AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k2
5470; X64-AVX512BW-NEXT:    korq %k1, %k2, %k1
5471; X64-AVX512BW-NEXT:    kortestq %k0, %k1
5472; X64-AVX512BW-NEXT:    setne %al
5473; X64-AVX512BW-NEXT:    vzeroupper
5474; X64-AVX512BW-NEXT:    retq
5475;
5476; X64-AVX512F-LABEL: length255_eq:
5477; X64-AVX512F:       # %bb.0:
5478; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
5479; X64-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
5480; X64-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
5481; X64-AVX512F-NEXT:    vmovdqu64 191(%rdi), %zmm3
5482; X64-AVX512F-NEXT:    vpcmpneqd 191(%rsi), %zmm3, %k0
5483; X64-AVX512F-NEXT:    vpcmpneqd 128(%rsi), %zmm2, %k1
5484; X64-AVX512F-NEXT:    korw %k0, %k1, %k0
5485; X64-AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k1
5486; X64-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k2
5487; X64-AVX512F-NEXT:    korw %k1, %k2, %k1
5488; X64-AVX512F-NEXT:    kortestw %k0, %k1
5489; X64-AVX512F-NEXT:    setne %al
5490; X64-AVX512F-NEXT:    vzeroupper
5491; X64-AVX512F-NEXT:    retq
5492;
5493; X64-MIC-AVX2-LABEL: length255_eq:
5494; X64-MIC-AVX2:       # %bb.0:
5495; X64-MIC-AVX2-NEXT:    pushq %rax
5496; X64-MIC-AVX2-NEXT:    movl $255, %edx
5497; X64-MIC-AVX2-NEXT:    callq memcmp
5498; X64-MIC-AVX2-NEXT:    testl %eax, %eax
5499; X64-MIC-AVX2-NEXT:    setne %al
5500; X64-MIC-AVX2-NEXT:    popq %rcx
5501; X64-MIC-AVX2-NEXT:    retq
5502;
5503; X64-MIC-AVX512F-LABEL: length255_eq:
5504; X64-MIC-AVX512F:       # %bb.0:
5505; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
5506; X64-MIC-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
5507; X64-MIC-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
5508; X64-MIC-AVX512F-NEXT:    vmovdqu64 191(%rdi), %zmm3
5509; X64-MIC-AVX512F-NEXT:    vpcmpneqd 191(%rsi), %zmm3, %k0
5510; X64-MIC-AVX512F-NEXT:    vpcmpneqd 128(%rsi), %zmm2, %k1
5511; X64-MIC-AVX512F-NEXT:    korw %k0, %k1, %k0
5512; X64-MIC-AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k1
5513; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k2
5514; X64-MIC-AVX512F-NEXT:    korw %k1, %k2, %k1
5515; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
5516; X64-MIC-AVX512F-NEXT:    setne %al
5517; X64-MIC-AVX512F-NEXT:    vzeroupper
5518; X64-MIC-AVX512F-NEXT:    retq
5519  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 255) nounwind
5520  %cmp = icmp ne i32 %call, 0
5521  ret i1 %cmp
5522}
5523
5524define i1 @length255_lt(i8* %x, i8* %y) nounwind {
5525; X86-LABEL: length255_lt:
5526; X86:       # %bb.0:
5527; X86-NEXT:    pushl $0
5528; X86-NEXT:    pushl $255
5529; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5530; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5531; X86-NEXT:    calll memcmp
5532; X86-NEXT:    addl $16, %esp
5533; X86-NEXT:    shrl $31, %eax
5534; X86-NEXT:    # kill: def $al killed $al killed $eax
5535; X86-NEXT:    retl
5536;
5537; X64-LABEL: length255_lt:
5538; X64:       # %bb.0:
5539; X64-NEXT:    pushq %rax
5540; X64-NEXT:    movl $255, %edx
5541; X64-NEXT:    callq memcmp
5542; X64-NEXT:    shrl $31, %eax
5543; X64-NEXT:    # kill: def $al killed $al killed $eax
5544; X64-NEXT:    popq %rcx
5545; X64-NEXT:    retq
5546  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 255) nounwind
5547  %cmp = icmp slt i32 %call, 0
5548  ret i1 %cmp
5549}
5550
5551define i1 @length255_gt(i8* %x, i8* %y) nounwind {
5552; X86-LABEL: length255_gt:
5553; X86:       # %bb.0:
5554; X86-NEXT:    pushl $0
5555; X86-NEXT:    pushl $255
5556; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5557; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5558; X86-NEXT:    calll memcmp
5559; X86-NEXT:    addl $16, %esp
5560; X86-NEXT:    testl %eax, %eax
5561; X86-NEXT:    setg %al
5562; X86-NEXT:    retl
5563;
5564; X64-LABEL: length255_gt:
5565; X64:       # %bb.0:
5566; X64-NEXT:    pushq %rax
5567; X64-NEXT:    movl $255, %edx
5568; X64-NEXT:    callq memcmp
5569; X64-NEXT:    testl %eax, %eax
5570; X64-NEXT:    setg %al
5571; X64-NEXT:    popq %rcx
5572; X64-NEXT:    retq
5573  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 255) nounwind
5574  %cmp = icmp sgt i32 %call, 0
5575  ret i1 %cmp
5576}
5577
5578define i1 @length255_eq_const(i8* %X) nounwind {
5579; X86-LABEL: length255_eq_const:
5580; X86:       # %bb.0:
5581; X86-NEXT:    pushl $0
5582; X86-NEXT:    pushl $255
5583; X86-NEXT:    pushl $.L.str
5584; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5585; X86-NEXT:    calll memcmp
5586; X86-NEXT:    addl $16, %esp
5587; X86-NEXT:    testl %eax, %eax
5588; X86-NEXT:    sete %al
5589; X86-NEXT:    retl
5590;
5591; X64-SSE-LABEL: length255_eq_const:
5592; X64-SSE:       # %bb.0:
5593; X64-SSE-NEXT:    pushq %rax
5594; X64-SSE-NEXT:    movl $.L.str, %esi
5595; X64-SSE-NEXT:    movl $255, %edx
5596; X64-SSE-NEXT:    callq memcmp
5597; X64-SSE-NEXT:    testl %eax, %eax
5598; X64-SSE-NEXT:    sete %al
5599; X64-SSE-NEXT:    popq %rcx
5600; X64-SSE-NEXT:    retq
5601;
5602; X64-AVX1-LABEL: length255_eq_const:
5603; X64-AVX1:       # %bb.0:
5604; X64-AVX1-NEXT:    pushq %rax
5605; X64-AVX1-NEXT:    movl $.L.str, %esi
5606; X64-AVX1-NEXT:    movl $255, %edx
5607; X64-AVX1-NEXT:    callq memcmp
5608; X64-AVX1-NEXT:    testl %eax, %eax
5609; X64-AVX1-NEXT:    sete %al
5610; X64-AVX1-NEXT:    popq %rcx
5611; X64-AVX1-NEXT:    retq
5612;
5613; X64-AVX2-LABEL: length255_eq_const:
5614; X64-AVX2:       # %bb.0:
5615; X64-AVX2-NEXT:    pushq %rax
5616; X64-AVX2-NEXT:    movl $.L.str, %esi
5617; X64-AVX2-NEXT:    movl $255, %edx
5618; X64-AVX2-NEXT:    callq memcmp
5619; X64-AVX2-NEXT:    testl %eax, %eax
5620; X64-AVX2-NEXT:    sete %al
5621; X64-AVX2-NEXT:    popq %rcx
5622; X64-AVX2-NEXT:    retq
5623;
5624; X64-AVX512BW-LABEL: length255_eq_const:
5625; X64-AVX512BW:       # %bb.0:
5626; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
5627; X64-AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
5628; X64-AVX512BW-NEXT:    vmovdqu64 128(%rdi), %zmm2
5629; X64-AVX512BW-NEXT:    vmovdqu64 191(%rdi), %zmm3
5630; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+191(%rip), %zmm3, %k0
5631; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+128(%rip), %zmm2, %k1
5632; X64-AVX512BW-NEXT:    korq %k0, %k1, %k0
5633; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+64(%rip), %zmm1, %k1
5634; X64-AVX512BW-NEXT:    vpcmpneqb .L.str(%rip), %zmm0, %k2
5635; X64-AVX512BW-NEXT:    korq %k1, %k2, %k1
5636; X64-AVX512BW-NEXT:    kortestq %k0, %k1
5637; X64-AVX512BW-NEXT:    sete %al
5638; X64-AVX512BW-NEXT:    vzeroupper
5639; X64-AVX512BW-NEXT:    retq
5640;
5641; X64-AVX512F-LABEL: length255_eq_const:
5642; X64-AVX512F:       # %bb.0:
5643; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
5644; X64-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
5645; X64-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
5646; X64-AVX512F-NEXT:    vmovdqu64 191(%rdi), %zmm3
5647; X64-AVX512F-NEXT:    vpcmpneqd .L.str+191(%rip), %zmm3, %k0
5648; X64-AVX512F-NEXT:    vpcmpneqd .L.str+128(%rip), %zmm2, %k1
5649; X64-AVX512F-NEXT:    korw %k0, %k1, %k0
5650; X64-AVX512F-NEXT:    vpcmpneqd .L.str+64(%rip), %zmm1, %k1
5651; X64-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k2
5652; X64-AVX512F-NEXT:    korw %k1, %k2, %k1
5653; X64-AVX512F-NEXT:    kortestw %k0, %k1
5654; X64-AVX512F-NEXT:    sete %al
5655; X64-AVX512F-NEXT:    vzeroupper
5656; X64-AVX512F-NEXT:    retq
5657;
5658; X64-MIC-AVX2-LABEL: length255_eq_const:
5659; X64-MIC-AVX2:       # %bb.0:
5660; X64-MIC-AVX2-NEXT:    pushq %rax
5661; X64-MIC-AVX2-NEXT:    movl $.L.str, %esi
5662; X64-MIC-AVX2-NEXT:    movl $255, %edx
5663; X64-MIC-AVX2-NEXT:    callq memcmp
5664; X64-MIC-AVX2-NEXT:    testl %eax, %eax
5665; X64-MIC-AVX2-NEXT:    sete %al
5666; X64-MIC-AVX2-NEXT:    popq %rcx
5667; X64-MIC-AVX2-NEXT:    retq
5668;
5669; X64-MIC-AVX512F-LABEL: length255_eq_const:
5670; X64-MIC-AVX512F:       # %bb.0:
5671; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
5672; X64-MIC-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
5673; X64-MIC-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
5674; X64-MIC-AVX512F-NEXT:    vmovdqu64 191(%rdi), %zmm3
5675; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+191(%rip), %zmm3, %k0
5676; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+128(%rip), %zmm2, %k1
5677; X64-MIC-AVX512F-NEXT:    korw %k0, %k1, %k0
5678; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+64(%rip), %zmm1, %k1
5679; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k2
5680; X64-MIC-AVX512F-NEXT:    korw %k1, %k2, %k1
5681; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
5682; X64-MIC-AVX512F-NEXT:    sete %al
5683; X64-MIC-AVX512F-NEXT:    vzeroupper
5684; X64-MIC-AVX512F-NEXT:    retq
5685  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 255) nounwind
5686  %c = icmp eq i32 %m, 0
5687  ret i1 %c
5688}
5689
5690define i32 @length256(i8* %X, i8* %Y) nounwind {
5691; X86-LABEL: length256:
5692; X86:       # %bb.0:
5693; X86-NEXT:    pushl $0
5694; X86-NEXT:    pushl $256 # imm = 0x100
5695; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5696; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5697; X86-NEXT:    calll memcmp
5698; X86-NEXT:    addl $16, %esp
5699; X86-NEXT:    retl
5700;
5701; X64-LABEL: length256:
5702; X64:       # %bb.0:
5703; X64-NEXT:    movl $256, %edx # imm = 0x100
5704; X64-NEXT:    jmp memcmp # TAILCALL
5705  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 256) nounwind
5706  ret i32 %m
5707}
5708
5709define i1 @length256_eq(i8* %x, i8* %y) nounwind {
5710; X86-LABEL: length256_eq:
5711; X86:       # %bb.0:
5712; X86-NEXT:    pushl $0
5713; X86-NEXT:    pushl $256 # imm = 0x100
5714; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5715; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5716; X86-NEXT:    calll memcmp
5717; X86-NEXT:    addl $16, %esp
5718; X86-NEXT:    testl %eax, %eax
5719; X86-NEXT:    setne %al
5720; X86-NEXT:    retl
5721;
5722; X64-SSE-LABEL: length256_eq:
5723; X64-SSE:       # %bb.0:
5724; X64-SSE-NEXT:    pushq %rax
5725; X64-SSE-NEXT:    movl $256, %edx # imm = 0x100
5726; X64-SSE-NEXT:    callq memcmp
5727; X64-SSE-NEXT:    testl %eax, %eax
5728; X64-SSE-NEXT:    setne %al
5729; X64-SSE-NEXT:    popq %rcx
5730; X64-SSE-NEXT:    retq
5731;
5732; X64-AVX1-LABEL: length256_eq:
5733; X64-AVX1:       # %bb.0:
5734; X64-AVX1-NEXT:    pushq %rax
5735; X64-AVX1-NEXT:    movl $256, %edx # imm = 0x100
5736; X64-AVX1-NEXT:    callq memcmp
5737; X64-AVX1-NEXT:    testl %eax, %eax
5738; X64-AVX1-NEXT:    setne %al
5739; X64-AVX1-NEXT:    popq %rcx
5740; X64-AVX1-NEXT:    retq
5741;
5742; X64-AVX2-LABEL: length256_eq:
5743; X64-AVX2:       # %bb.0:
5744; X64-AVX2-NEXT:    pushq %rax
5745; X64-AVX2-NEXT:    movl $256, %edx # imm = 0x100
5746; X64-AVX2-NEXT:    callq memcmp
5747; X64-AVX2-NEXT:    testl %eax, %eax
5748; X64-AVX2-NEXT:    setne %al
5749; X64-AVX2-NEXT:    popq %rcx
5750; X64-AVX2-NEXT:    retq
5751;
5752; X64-AVX512BW-LABEL: length256_eq:
5753; X64-AVX512BW:       # %bb.0:
5754; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
5755; X64-AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
5756; X64-AVX512BW-NEXT:    vmovdqu64 128(%rdi), %zmm2
5757; X64-AVX512BW-NEXT:    vmovdqu64 192(%rdi), %zmm3
5758; X64-AVX512BW-NEXT:    vpcmpneqb 192(%rsi), %zmm3, %k0
5759; X64-AVX512BW-NEXT:    vpcmpneqb 128(%rsi), %zmm2, %k1
5760; X64-AVX512BW-NEXT:    korq %k0, %k1, %k0
5761; X64-AVX512BW-NEXT:    vpcmpneqb 64(%rsi), %zmm1, %k1
5762; X64-AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k2
5763; X64-AVX512BW-NEXT:    korq %k1, %k2, %k1
5764; X64-AVX512BW-NEXT:    kortestq %k0, %k1
5765; X64-AVX512BW-NEXT:    setne %al
5766; X64-AVX512BW-NEXT:    vzeroupper
5767; X64-AVX512BW-NEXT:    retq
5768;
5769; X64-AVX512F-LABEL: length256_eq:
5770; X64-AVX512F:       # %bb.0:
5771; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
5772; X64-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
5773; X64-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
5774; X64-AVX512F-NEXT:    vmovdqu64 192(%rdi), %zmm3
5775; X64-AVX512F-NEXT:    vpcmpneqd 192(%rsi), %zmm3, %k0
5776; X64-AVX512F-NEXT:    vpcmpneqd 128(%rsi), %zmm2, %k1
5777; X64-AVX512F-NEXT:    korw %k0, %k1, %k0
5778; X64-AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k1
5779; X64-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k2
5780; X64-AVX512F-NEXT:    korw %k1, %k2, %k1
5781; X64-AVX512F-NEXT:    kortestw %k0, %k1
5782; X64-AVX512F-NEXT:    setne %al
5783; X64-AVX512F-NEXT:    vzeroupper
5784; X64-AVX512F-NEXT:    retq
5785;
5786; X64-MIC-AVX2-LABEL: length256_eq:
5787; X64-MIC-AVX2:       # %bb.0:
5788; X64-MIC-AVX2-NEXT:    pushq %rax
5789; X64-MIC-AVX2-NEXT:    movl $256, %edx # imm = 0x100
5790; X64-MIC-AVX2-NEXT:    callq memcmp
5791; X64-MIC-AVX2-NEXT:    testl %eax, %eax
5792; X64-MIC-AVX2-NEXT:    setne %al
5793; X64-MIC-AVX2-NEXT:    popq %rcx
5794; X64-MIC-AVX2-NEXT:    retq
5795;
5796; X64-MIC-AVX512F-LABEL: length256_eq:
5797; X64-MIC-AVX512F:       # %bb.0:
5798; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
5799; X64-MIC-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
5800; X64-MIC-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
5801; X64-MIC-AVX512F-NEXT:    vmovdqu64 192(%rdi), %zmm3
5802; X64-MIC-AVX512F-NEXT:    vpcmpneqd 192(%rsi), %zmm3, %k0
5803; X64-MIC-AVX512F-NEXT:    vpcmpneqd 128(%rsi), %zmm2, %k1
5804; X64-MIC-AVX512F-NEXT:    korw %k0, %k1, %k0
5805; X64-MIC-AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k1
5806; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k2
5807; X64-MIC-AVX512F-NEXT:    korw %k1, %k2, %k1
5808; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
5809; X64-MIC-AVX512F-NEXT:    setne %al
5810; X64-MIC-AVX512F-NEXT:    vzeroupper
5811; X64-MIC-AVX512F-NEXT:    retq
5812  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 256) nounwind
5813  %cmp = icmp ne i32 %call, 0
5814  ret i1 %cmp
5815}
5816
5817define i1 @length256_lt(i8* %x, i8* %y) nounwind {
5818; X86-LABEL: length256_lt:
5819; X86:       # %bb.0:
5820; X86-NEXT:    pushl $0
5821; X86-NEXT:    pushl $256 # imm = 0x100
5822; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5823; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5824; X86-NEXT:    calll memcmp
5825; X86-NEXT:    addl $16, %esp
5826; X86-NEXT:    shrl $31, %eax
5827; X86-NEXT:    # kill: def $al killed $al killed $eax
5828; X86-NEXT:    retl
5829;
5830; X64-LABEL: length256_lt:
5831; X64:       # %bb.0:
5832; X64-NEXT:    pushq %rax
5833; X64-NEXT:    movl $256, %edx # imm = 0x100
5834; X64-NEXT:    callq memcmp
5835; X64-NEXT:    shrl $31, %eax
5836; X64-NEXT:    # kill: def $al killed $al killed $eax
5837; X64-NEXT:    popq %rcx
5838; X64-NEXT:    retq
5839  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 256) nounwind
5840  %cmp = icmp slt i32 %call, 0
5841  ret i1 %cmp
5842}
5843
5844define i1 @length256_gt(i8* %x, i8* %y) nounwind {
5845; X86-LABEL: length256_gt:
5846; X86:       # %bb.0:
5847; X86-NEXT:    pushl $0
5848; X86-NEXT:    pushl $256 # imm = 0x100
5849; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5850; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5851; X86-NEXT:    calll memcmp
5852; X86-NEXT:    addl $16, %esp
5853; X86-NEXT:    testl %eax, %eax
5854; X86-NEXT:    setg %al
5855; X86-NEXT:    retl
5856;
5857; X64-LABEL: length256_gt:
5858; X64:       # %bb.0:
5859; X64-NEXT:    pushq %rax
5860; X64-NEXT:    movl $256, %edx # imm = 0x100
5861; X64-NEXT:    callq memcmp
5862; X64-NEXT:    testl %eax, %eax
5863; X64-NEXT:    setg %al
5864; X64-NEXT:    popq %rcx
5865; X64-NEXT:    retq
5866  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 256) nounwind
5867  %cmp = icmp sgt i32 %call, 0
5868  ret i1 %cmp
5869}
5870
5871define i1 @length256_eq_const(i8* %X) nounwind {
5872; X86-LABEL: length256_eq_const:
5873; X86:       # %bb.0:
5874; X86-NEXT:    pushl $0
5875; X86-NEXT:    pushl $256 # imm = 0x100
5876; X86-NEXT:    pushl $.L.str
5877; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5878; X86-NEXT:    calll memcmp
5879; X86-NEXT:    addl $16, %esp
5880; X86-NEXT:    testl %eax, %eax
5881; X86-NEXT:    sete %al
5882; X86-NEXT:    retl
5883;
5884; X64-SSE-LABEL: length256_eq_const:
5885; X64-SSE:       # %bb.0:
5886; X64-SSE-NEXT:    pushq %rax
5887; X64-SSE-NEXT:    movl $.L.str, %esi
5888; X64-SSE-NEXT:    movl $256, %edx # imm = 0x100
5889; X64-SSE-NEXT:    callq memcmp
5890; X64-SSE-NEXT:    testl %eax, %eax
5891; X64-SSE-NEXT:    sete %al
5892; X64-SSE-NEXT:    popq %rcx
5893; X64-SSE-NEXT:    retq
5894;
5895; X64-AVX1-LABEL: length256_eq_const:
5896; X64-AVX1:       # %bb.0:
5897; X64-AVX1-NEXT:    pushq %rax
5898; X64-AVX1-NEXT:    movl $.L.str, %esi
5899; X64-AVX1-NEXT:    movl $256, %edx # imm = 0x100
5900; X64-AVX1-NEXT:    callq memcmp
5901; X64-AVX1-NEXT:    testl %eax, %eax
5902; X64-AVX1-NEXT:    sete %al
5903; X64-AVX1-NEXT:    popq %rcx
5904; X64-AVX1-NEXT:    retq
5905;
5906; X64-AVX2-LABEL: length256_eq_const:
5907; X64-AVX2:       # %bb.0:
5908; X64-AVX2-NEXT:    pushq %rax
5909; X64-AVX2-NEXT:    movl $.L.str, %esi
5910; X64-AVX2-NEXT:    movl $256, %edx # imm = 0x100
5911; X64-AVX2-NEXT:    callq memcmp
5912; X64-AVX2-NEXT:    testl %eax, %eax
5913; X64-AVX2-NEXT:    sete %al
5914; X64-AVX2-NEXT:    popq %rcx
5915; X64-AVX2-NEXT:    retq
5916;
5917; X64-AVX512BW-LABEL: length256_eq_const:
5918; X64-AVX512BW:       # %bb.0:
5919; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
5920; X64-AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
5921; X64-AVX512BW-NEXT:    vmovdqu64 128(%rdi), %zmm2
5922; X64-AVX512BW-NEXT:    vmovdqu64 192(%rdi), %zmm3
5923; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+192(%rip), %zmm3, %k0
5924; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+128(%rip), %zmm2, %k1
5925; X64-AVX512BW-NEXT:    korq %k0, %k1, %k0
5926; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+64(%rip), %zmm1, %k1
5927; X64-AVX512BW-NEXT:    vpcmpneqb .L.str(%rip), %zmm0, %k2
5928; X64-AVX512BW-NEXT:    korq %k1, %k2, %k1
5929; X64-AVX512BW-NEXT:    kortestq %k0, %k1
5930; X64-AVX512BW-NEXT:    sete %al
5931; X64-AVX512BW-NEXT:    vzeroupper
5932; X64-AVX512BW-NEXT:    retq
5933;
5934; X64-AVX512F-LABEL: length256_eq_const:
5935; X64-AVX512F:       # %bb.0:
5936; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
5937; X64-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
5938; X64-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
5939; X64-AVX512F-NEXT:    vmovdqu64 192(%rdi), %zmm3
5940; X64-AVX512F-NEXT:    vpcmpneqd .L.str+192(%rip), %zmm3, %k0
5941; X64-AVX512F-NEXT:    vpcmpneqd .L.str+128(%rip), %zmm2, %k1
5942; X64-AVX512F-NEXT:    korw %k0, %k1, %k0
5943; X64-AVX512F-NEXT:    vpcmpneqd .L.str+64(%rip), %zmm1, %k1
5944; X64-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k2
5945; X64-AVX512F-NEXT:    korw %k1, %k2, %k1
5946; X64-AVX512F-NEXT:    kortestw %k0, %k1
5947; X64-AVX512F-NEXT:    sete %al
5948; X64-AVX512F-NEXT:    vzeroupper
5949; X64-AVX512F-NEXT:    retq
5950;
5951; X64-MIC-AVX2-LABEL: length256_eq_const:
5952; X64-MIC-AVX2:       # %bb.0:
5953; X64-MIC-AVX2-NEXT:    pushq %rax
5954; X64-MIC-AVX2-NEXT:    movl $.L.str, %esi
5955; X64-MIC-AVX2-NEXT:    movl $256, %edx # imm = 0x100
5956; X64-MIC-AVX2-NEXT:    callq memcmp
5957; X64-MIC-AVX2-NEXT:    testl %eax, %eax
5958; X64-MIC-AVX2-NEXT:    sete %al
5959; X64-MIC-AVX2-NEXT:    popq %rcx
5960; X64-MIC-AVX2-NEXT:    retq
5961;
5962; X64-MIC-AVX512F-LABEL: length256_eq_const:
5963; X64-MIC-AVX512F:       # %bb.0:
5964; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
5965; X64-MIC-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
5966; X64-MIC-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
5967; X64-MIC-AVX512F-NEXT:    vmovdqu64 192(%rdi), %zmm3
5968; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+192(%rip), %zmm3, %k0
5969; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+128(%rip), %zmm2, %k1
5970; X64-MIC-AVX512F-NEXT:    korw %k0, %k1, %k0
5971; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+64(%rip), %zmm1, %k1
5972; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k2
5973; X64-MIC-AVX512F-NEXT:    korw %k1, %k2, %k1
5974; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
5975; X64-MIC-AVX512F-NEXT:    sete %al
5976; X64-MIC-AVX512F-NEXT:    vzeroupper
5977; X64-MIC-AVX512F-NEXT:    retq
5978  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 256) nounwind
5979  %c = icmp eq i32 %m, 0
5980  ret i1 %c
5981}
5982
5983define i32 @length384(i8* %X, i8* %Y) nounwind {
5984; X86-LABEL: length384:
5985; X86:       # %bb.0:
5986; X86-NEXT:    pushl $0
5987; X86-NEXT:    pushl $384 # imm = 0x180
5988; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5989; X86-NEXT:    pushl {{[0-9]+}}(%esp)
5990; X86-NEXT:    calll memcmp
5991; X86-NEXT:    addl $16, %esp
5992; X86-NEXT:    retl
5993;
5994; X64-LABEL: length384:
5995; X64:       # %bb.0:
5996; X64-NEXT:    movl $384, %edx # imm = 0x180
5997; X64-NEXT:    jmp memcmp # TAILCALL
5998  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 384) nounwind
5999  ret i32 %m
6000}
6001
6002define i1 @length384_eq(i8* %x, i8* %y) nounwind {
6003; X86-LABEL: length384_eq:
6004; X86:       # %bb.0:
6005; X86-NEXT:    pushl $0
6006; X86-NEXT:    pushl $384 # imm = 0x180
6007; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6008; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6009; X86-NEXT:    calll memcmp
6010; X86-NEXT:    addl $16, %esp
6011; X86-NEXT:    testl %eax, %eax
6012; X86-NEXT:    setne %al
6013; X86-NEXT:    retl
6014;
6015; X64-LABEL: length384_eq:
6016; X64:       # %bb.0:
6017; X64-NEXT:    pushq %rax
6018; X64-NEXT:    movl $384, %edx # imm = 0x180
6019; X64-NEXT:    callq memcmp
6020; X64-NEXT:    testl %eax, %eax
6021; X64-NEXT:    setne %al
6022; X64-NEXT:    popq %rcx
6023; X64-NEXT:    retq
6024  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 384) nounwind
6025  %cmp = icmp ne i32 %call, 0
6026  ret i1 %cmp
6027}
6028
6029define i1 @length384_lt(i8* %x, i8* %y) nounwind {
6030; X86-LABEL: length384_lt:
6031; X86:       # %bb.0:
6032; X86-NEXT:    pushl $0
6033; X86-NEXT:    pushl $384 # imm = 0x180
6034; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6035; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6036; X86-NEXT:    calll memcmp
6037; X86-NEXT:    addl $16, %esp
6038; X86-NEXT:    shrl $31, %eax
6039; X86-NEXT:    # kill: def $al killed $al killed $eax
6040; X86-NEXT:    retl
6041;
6042; X64-LABEL: length384_lt:
6043; X64:       # %bb.0:
6044; X64-NEXT:    pushq %rax
6045; X64-NEXT:    movl $384, %edx # imm = 0x180
6046; X64-NEXT:    callq memcmp
6047; X64-NEXT:    shrl $31, %eax
6048; X64-NEXT:    # kill: def $al killed $al killed $eax
6049; X64-NEXT:    popq %rcx
6050; X64-NEXT:    retq
6051  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 384) nounwind
6052  %cmp = icmp slt i32 %call, 0
6053  ret i1 %cmp
6054}
6055
6056define i1 @length384_gt(i8* %x, i8* %y) nounwind {
6057; X86-LABEL: length384_gt:
6058; X86:       # %bb.0:
6059; X86-NEXT:    pushl $0
6060; X86-NEXT:    pushl $384 # imm = 0x180
6061; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6062; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6063; X86-NEXT:    calll memcmp
6064; X86-NEXT:    addl $16, %esp
6065; X86-NEXT:    testl %eax, %eax
6066; X86-NEXT:    setg %al
6067; X86-NEXT:    retl
6068;
6069; X64-LABEL: length384_gt:
6070; X64:       # %bb.0:
6071; X64-NEXT:    pushq %rax
6072; X64-NEXT:    movl $384, %edx # imm = 0x180
6073; X64-NEXT:    callq memcmp
6074; X64-NEXT:    testl %eax, %eax
6075; X64-NEXT:    setg %al
6076; X64-NEXT:    popq %rcx
6077; X64-NEXT:    retq
6078  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 384) nounwind
6079  %cmp = icmp sgt i32 %call, 0
6080  ret i1 %cmp
6081}
6082
6083define i1 @length384_eq_const(i8* %X) nounwind {
6084; X86-LABEL: length384_eq_const:
6085; X86:       # %bb.0:
6086; X86-NEXT:    pushl $0
6087; X86-NEXT:    pushl $384 # imm = 0x180
6088; X86-NEXT:    pushl $.L.str
6089; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6090; X86-NEXT:    calll memcmp
6091; X86-NEXT:    addl $16, %esp
6092; X86-NEXT:    testl %eax, %eax
6093; X86-NEXT:    sete %al
6094; X86-NEXT:    retl
6095;
6096; X64-LABEL: length384_eq_const:
6097; X64:       # %bb.0:
6098; X64-NEXT:    pushq %rax
6099; X64-NEXT:    movl $.L.str, %esi
6100; X64-NEXT:    movl $384, %edx # imm = 0x180
6101; X64-NEXT:    callq memcmp
6102; X64-NEXT:    testl %eax, %eax
6103; X64-NEXT:    sete %al
6104; X64-NEXT:    popq %rcx
6105; X64-NEXT:    retq
6106  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 384) nounwind
6107  %c = icmp eq i32 %m, 0
6108  ret i1 %c
6109}
6110
6111define i32 @length511(i8* %X, i8* %Y) nounwind {
6112; X86-LABEL: length511:
6113; X86:       # %bb.0:
6114; X86-NEXT:    pushl $0
6115; X86-NEXT:    pushl $511 # imm = 0x1FF
6116; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6117; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6118; X86-NEXT:    calll memcmp
6119; X86-NEXT:    addl $16, %esp
6120; X86-NEXT:    retl
6121;
6122; X64-LABEL: length511:
6123; X64:       # %bb.0:
6124; X64-NEXT:    movl $511, %edx # imm = 0x1FF
6125; X64-NEXT:    jmp memcmp # TAILCALL
6126  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 511) nounwind
6127  ret i32 %m
6128}
6129
6130define i1 @length511_eq(i8* %x, i8* %y) nounwind {
6131; X86-LABEL: length511_eq:
6132; X86:       # %bb.0:
6133; X86-NEXT:    pushl $0
6134; X86-NEXT:    pushl $511 # imm = 0x1FF
6135; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6136; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6137; X86-NEXT:    calll memcmp
6138; X86-NEXT:    addl $16, %esp
6139; X86-NEXT:    testl %eax, %eax
6140; X86-NEXT:    setne %al
6141; X86-NEXT:    retl
6142;
6143; X64-LABEL: length511_eq:
6144; X64:       # %bb.0:
6145; X64-NEXT:    pushq %rax
6146; X64-NEXT:    movl $511, %edx # imm = 0x1FF
6147; X64-NEXT:    callq memcmp
6148; X64-NEXT:    testl %eax, %eax
6149; X64-NEXT:    setne %al
6150; X64-NEXT:    popq %rcx
6151; X64-NEXT:    retq
6152  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 511) nounwind
6153  %cmp = icmp ne i32 %call, 0
6154  ret i1 %cmp
6155}
6156
6157define i1 @length511_lt(i8* %x, i8* %y) nounwind {
6158; X86-LABEL: length511_lt:
6159; X86:       # %bb.0:
6160; X86-NEXT:    pushl $0
6161; X86-NEXT:    pushl $511 # imm = 0x1FF
6162; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6163; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6164; X86-NEXT:    calll memcmp
6165; X86-NEXT:    addl $16, %esp
6166; X86-NEXT:    shrl $31, %eax
6167; X86-NEXT:    # kill: def $al killed $al killed $eax
6168; X86-NEXT:    retl
6169;
6170; X64-LABEL: length511_lt:
6171; X64:       # %bb.0:
6172; X64-NEXT:    pushq %rax
6173; X64-NEXT:    movl $511, %edx # imm = 0x1FF
6174; X64-NEXT:    callq memcmp
6175; X64-NEXT:    shrl $31, %eax
6176; X64-NEXT:    # kill: def $al killed $al killed $eax
6177; X64-NEXT:    popq %rcx
6178; X64-NEXT:    retq
6179  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 511) nounwind
6180  %cmp = icmp slt i32 %call, 0
6181  ret i1 %cmp
6182}
6183
6184define i1 @length511_gt(i8* %x, i8* %y) nounwind {
6185; X86-LABEL: length511_gt:
6186; X86:       # %bb.0:
6187; X86-NEXT:    pushl $0
6188; X86-NEXT:    pushl $511 # imm = 0x1FF
6189; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6190; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6191; X86-NEXT:    calll memcmp
6192; X86-NEXT:    addl $16, %esp
6193; X86-NEXT:    testl %eax, %eax
6194; X86-NEXT:    setg %al
6195; X86-NEXT:    retl
6196;
6197; X64-LABEL: length511_gt:
6198; X64:       # %bb.0:
6199; X64-NEXT:    pushq %rax
6200; X64-NEXT:    movl $511, %edx # imm = 0x1FF
6201; X64-NEXT:    callq memcmp
6202; X64-NEXT:    testl %eax, %eax
6203; X64-NEXT:    setg %al
6204; X64-NEXT:    popq %rcx
6205; X64-NEXT:    retq
6206  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 511) nounwind
6207  %cmp = icmp sgt i32 %call, 0
6208  ret i1 %cmp
6209}
6210
6211define i1 @length511_eq_const(i8* %X) nounwind {
6212; X86-LABEL: length511_eq_const:
6213; X86:       # %bb.0:
6214; X86-NEXT:    pushl $0
6215; X86-NEXT:    pushl $511 # imm = 0x1FF
6216; X86-NEXT:    pushl $.L.str
6217; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6218; X86-NEXT:    calll memcmp
6219; X86-NEXT:    addl $16, %esp
6220; X86-NEXT:    testl %eax, %eax
6221; X86-NEXT:    sete %al
6222; X86-NEXT:    retl
6223;
6224; X64-LABEL: length511_eq_const:
6225; X64:       # %bb.0:
6226; X64-NEXT:    pushq %rax
6227; X64-NEXT:    movl $.L.str, %esi
6228; X64-NEXT:    movl $511, %edx # imm = 0x1FF
6229; X64-NEXT:    callq memcmp
6230; X64-NEXT:    testl %eax, %eax
6231; X64-NEXT:    sete %al
6232; X64-NEXT:    popq %rcx
6233; X64-NEXT:    retq
6234  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 511) nounwind
6235  %c = icmp eq i32 %m, 0
6236  ret i1 %c
6237}
6238
6239define i32 @length512(i8* %X, i8* %Y) nounwind {
6240; X86-LABEL: length512:
6241; X86:       # %bb.0:
6242; X86-NEXT:    pushl $0
6243; X86-NEXT:    pushl $512 # imm = 0x200
6244; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6245; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6246; X86-NEXT:    calll memcmp
6247; X86-NEXT:    addl $16, %esp
6248; X86-NEXT:    retl
6249;
6250; X64-LABEL: length512:
6251; X64:       # %bb.0:
6252; X64-NEXT:    movl $512, %edx # imm = 0x200
6253; X64-NEXT:    jmp memcmp # TAILCALL
6254  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 512) nounwind
6255  ret i32 %m
6256}
6257
6258define i1 @length512_eq(i8* %x, i8* %y) nounwind {
6259; X86-LABEL: length512_eq:
6260; X86:       # %bb.0:
6261; X86-NEXT:    pushl $0
6262; X86-NEXT:    pushl $512 # imm = 0x200
6263; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6264; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6265; X86-NEXT:    calll memcmp
6266; X86-NEXT:    addl $16, %esp
6267; X86-NEXT:    testl %eax, %eax
6268; X86-NEXT:    setne %al
6269; X86-NEXT:    retl
6270;
6271; X64-LABEL: length512_eq:
6272; X64:       # %bb.0:
6273; X64-NEXT:    pushq %rax
6274; X64-NEXT:    movl $512, %edx # imm = 0x200
6275; X64-NEXT:    callq memcmp
6276; X64-NEXT:    testl %eax, %eax
6277; X64-NEXT:    setne %al
6278; X64-NEXT:    popq %rcx
6279; X64-NEXT:    retq
6280  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 512) nounwind
6281  %cmp = icmp ne i32 %call, 0
6282  ret i1 %cmp
6283}
6284
6285define i1 @length512_lt(i8* %x, i8* %y) nounwind {
6286; X86-LABEL: length512_lt:
6287; X86:       # %bb.0:
6288; X86-NEXT:    pushl $0
6289; X86-NEXT:    pushl $512 # imm = 0x200
6290; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6291; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6292; X86-NEXT:    calll memcmp
6293; X86-NEXT:    addl $16, %esp
6294; X86-NEXT:    shrl $31, %eax
6295; X86-NEXT:    # kill: def $al killed $al killed $eax
6296; X86-NEXT:    retl
6297;
6298; X64-LABEL: length512_lt:
6299; X64:       # %bb.0:
6300; X64-NEXT:    pushq %rax
6301; X64-NEXT:    movl $512, %edx # imm = 0x200
6302; X64-NEXT:    callq memcmp
6303; X64-NEXT:    shrl $31, %eax
6304; X64-NEXT:    # kill: def $al killed $al killed $eax
6305; X64-NEXT:    popq %rcx
6306; X64-NEXT:    retq
6307  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 512) nounwind
6308  %cmp = icmp slt i32 %call, 0
6309  ret i1 %cmp
6310}
6311
6312define i1 @length512_gt(i8* %x, i8* %y) nounwind {
6313; X86-LABEL: length512_gt:
6314; X86:       # %bb.0:
6315; X86-NEXT:    pushl $0
6316; X86-NEXT:    pushl $512 # imm = 0x200
6317; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6318; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6319; X86-NEXT:    calll memcmp
6320; X86-NEXT:    addl $16, %esp
6321; X86-NEXT:    testl %eax, %eax
6322; X86-NEXT:    setg %al
6323; X86-NEXT:    retl
6324;
6325; X64-LABEL: length512_gt:
6326; X64:       # %bb.0:
6327; X64-NEXT:    pushq %rax
6328; X64-NEXT:    movl $512, %edx # imm = 0x200
6329; X64-NEXT:    callq memcmp
6330; X64-NEXT:    testl %eax, %eax
6331; X64-NEXT:    setg %al
6332; X64-NEXT:    popq %rcx
6333; X64-NEXT:    retq
6334  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 512) nounwind
6335  %cmp = icmp sgt i32 %call, 0
6336  ret i1 %cmp
6337}
6338
6339define i1 @length512_eq_const(i8* %X) nounwind {
6340; X86-LABEL: length512_eq_const:
6341; X86:       # %bb.0:
6342; X86-NEXT:    pushl $0
6343; X86-NEXT:    pushl $512 # imm = 0x200
6344; X86-NEXT:    pushl $.L.str
6345; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6346; X86-NEXT:    calll memcmp
6347; X86-NEXT:    addl $16, %esp
6348; X86-NEXT:    testl %eax, %eax
6349; X86-NEXT:    sete %al
6350; X86-NEXT:    retl
6351;
6352; X64-LABEL: length512_eq_const:
6353; X64:       # %bb.0:
6354; X64-NEXT:    pushq %rax
6355; X64-NEXT:    movl $.L.str, %esi
6356; X64-NEXT:    movl $512, %edx # imm = 0x200
6357; X64-NEXT:    callq memcmp
6358; X64-NEXT:    testl %eax, %eax
6359; X64-NEXT:    sete %al
6360; X64-NEXT:    popq %rcx
6361; X64-NEXT:    retq
6362  %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 512) nounwind
6363  %c = icmp eq i32 %m, 0
6364  ret i1 %c
6365}
6366
6367; This checks that we do not do stupid things with huge sizes.
6368define i32 @huge_length(i8* %X, i8* %Y) nounwind {
6369; X86-LABEL: huge_length:
6370; X86:       # %bb.0:
6371; X86-NEXT:    pushl $2147483647 # imm = 0x7FFFFFFF
6372; X86-NEXT:    pushl $-1
6373; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6374; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6375; X86-NEXT:    calll memcmp
6376; X86-NEXT:    addl $16, %esp
6377; X86-NEXT:    retl
6378;
6379; X64-LABEL: huge_length:
6380; X64:       # %bb.0:
6381; X64-NEXT:    movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF
6382; X64-NEXT:    jmp memcmp # TAILCALL
6383  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 9223372036854775807) nounwind
6384  ret i32 %m
6385}
6386
6387define i1 @huge_length_eq(i8* %X, i8* %Y) nounwind {
6388; X86-LABEL: huge_length_eq:
6389; X86:       # %bb.0:
6390; X86-NEXT:    pushl $2147483647 # imm = 0x7FFFFFFF
6391; X86-NEXT:    pushl $-1
6392; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6393; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6394; X86-NEXT:    calll memcmp
6395; X86-NEXT:    addl $16, %esp
6396; X86-NEXT:    testl %eax, %eax
6397; X86-NEXT:    sete %al
6398; X86-NEXT:    retl
6399;
6400; X64-LABEL: huge_length_eq:
6401; X64:       # %bb.0:
6402; X64-NEXT:    pushq %rax
6403; X64-NEXT:    movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF
6404; X64-NEXT:    callq memcmp
6405; X64-NEXT:    testl %eax, %eax
6406; X64-NEXT:    sete %al
6407; X64-NEXT:    popq %rcx
6408; X64-NEXT:    retq
6409  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 9223372036854775807) nounwind
6410  %c = icmp eq i32 %m, 0
6411  ret i1 %c
6412}
6413
6414; This checks non-constant sizes.
6415define i32 @nonconst_length(i8* %X, i8* %Y, i64 %size) nounwind {
6416; X86-LABEL: nonconst_length:
6417; X86:       # %bb.0:
6418; X86-NEXT:    jmp memcmp # TAILCALL
6419;
6420; X64-LABEL: nonconst_length:
6421; X64:       # %bb.0:
6422; X64-NEXT:    jmp memcmp # TAILCALL
6423  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 %size) nounwind
6424  ret i32 %m
6425}
6426
6427define i1 @nonconst_length_eq(i8* %X, i8* %Y, i64 %size) nounwind {
6428; X86-LABEL: nonconst_length_eq:
6429; X86:       # %bb.0:
6430; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6431; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6432; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6433; X86-NEXT:    pushl {{[0-9]+}}(%esp)
6434; X86-NEXT:    calll memcmp
6435; X86-NEXT:    addl $16, %esp
6436; X86-NEXT:    testl %eax, %eax
6437; X86-NEXT:    sete %al
6438; X86-NEXT:    retl
6439;
6440; X64-LABEL: nonconst_length_eq:
6441; X64:       # %bb.0:
6442; X64-NEXT:    pushq %rax
6443; X64-NEXT:    callq memcmp
6444; X64-NEXT:    testl %eax, %eax
6445; X64-NEXT:    sete %al
6446; X64-NEXT:    popq %rcx
6447; X64-NEXT:    retq
6448  %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 %size) nounwind
6449  %c = icmp eq i32 %m, 0
6450  ret i1 %c
6451}
6452