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