blob: 7683d1a4b311441043a7c754401c75575ffc7963 [file] [log] [blame]
Simon Pilgrimc2cbb522017-07-18 14:26:07 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=cmov | FileCheck %s --check-prefix=X86 --check-prefix=X86-NOSSE
3; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X86 --check-prefix=X86-SSE2
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=X64 --check-prefix=X64-SSE2
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx2 | FileCheck %s --check-prefix=X64 --check-prefix=X64-AVX2
6
7; This tests codegen time inlining/optimization of memcmp
8; rdar://6480398
9
10@.str = private constant [65 x i8] c"0123456789012345678901234567890123456789012345678901234567890123\00", align 1
11
12declare i32 @memcmp(i8*, i8*, i64)
13
14define i32 @length2(i8* %X, i8* %Y) nounwind optsize {
15; X86-LABEL: length2:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000016; X86: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +000017; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
18; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
19; X86-NEXT: movzwl (%ecx), %ecx
20; X86-NEXT: movzwl (%eax), %edx
21; X86-NEXT: rolw $8, %cx
22; X86-NEXT: rolw $8, %dx
Sanjay Patelfea731a2017-07-31 18:08:24 +000023; X86-NEXT: movzwl %cx, %eax
24; X86-NEXT: movzwl %dx, %ecx
25; X86-NEXT: subl %ecx, %eax
Simon Pilgrimc2cbb522017-07-18 14:26:07 +000026; X86-NEXT: retl
27;
28; X64-LABEL: length2:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000029; X64: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +000030; X64-NEXT: movzwl (%rdi), %eax
31; X64-NEXT: movzwl (%rsi), %ecx
32; X64-NEXT: rolw $8, %ax
33; X64-NEXT: rolw $8, %cx
Sanjay Patelfea731a2017-07-31 18:08:24 +000034; X64-NEXT: movzwl %ax, %eax
35; X64-NEXT: movzwl %cx, %ecx
36; X64-NEXT: subl %ecx, %eax
Simon Pilgrimc2cbb522017-07-18 14:26:07 +000037; X64-NEXT: retq
38 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 2) nounwind
39 ret i32 %m
40}
41
42define i1 @length2_eq(i8* %X, i8* %Y) nounwind optsize {
43; X86-LABEL: length2_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000044; X86: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +000045; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
46; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
47; X86-NEXT: movzwl (%ecx), %ecx
48; X86-NEXT: cmpw (%eax), %cx
49; X86-NEXT: sete %al
50; X86-NEXT: retl
51;
52; X64-LABEL: length2_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000053; X64: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +000054; X64-NEXT: movzwl (%rdi), %eax
55; X64-NEXT: cmpw (%rsi), %ax
56; X64-NEXT: sete %al
57; X64-NEXT: retq
58 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 2) nounwind
59 %c = icmp eq i32 %m, 0
60 ret i1 %c
61}
62
63define i1 @length2_eq_const(i8* %X) nounwind optsize {
64; X86-LABEL: length2_eq_const:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000065; X86: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +000066; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
67; X86-NEXT: movzwl (%eax), %eax
68; X86-NEXT: cmpl $12849, %eax # imm = 0x3231
69; X86-NEXT: setne %al
70; X86-NEXT: retl
71;
72; X64-LABEL: length2_eq_const:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000073; X64: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +000074; X64-NEXT: movzwl (%rdi), %eax
75; X64-NEXT: cmpl $12849, %eax # imm = 0x3231
76; X64-NEXT: setne %al
77; X64-NEXT: retq
78 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str, i32 0, i32 1), i64 2) nounwind
79 %c = icmp ne i32 %m, 0
80 ret i1 %c
81}
82
83define i1 @length2_eq_nobuiltin_attr(i8* %X, i8* %Y) nounwind optsize {
84; X86-LABEL: length2_eq_nobuiltin_attr:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000085; X86: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +000086; X86-NEXT: pushl $0
87; X86-NEXT: pushl $2
88; X86-NEXT: pushl {{[0-9]+}}(%esp)
89; X86-NEXT: pushl {{[0-9]+}}(%esp)
90; X86-NEXT: calll memcmp
91; X86-NEXT: addl $16, %esp
92; X86-NEXT: testl %eax, %eax
93; X86-NEXT: sete %al
94; X86-NEXT: retl
95;
96; X64-LABEL: length2_eq_nobuiltin_attr:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000097; X64: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +000098; X64-NEXT: pushq %rax
99; X64-NEXT: movl $2, %edx
100; X64-NEXT: callq memcmp
101; X64-NEXT: testl %eax, %eax
102; X64-NEXT: sete %al
103; X64-NEXT: popq %rcx
104; X64-NEXT: retq
105 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 2) nounwind nobuiltin
106 %c = icmp eq i32 %m, 0
107 ret i1 %c
108}
109
110define i32 @length3(i8* %X, i8* %Y) nounwind optsize {
111; X86-LABEL: length3:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000112; X86: # %bb.0: # %loadbb
Simon Pilgrim483927a2017-07-18 15:55:30 +0000113; X86-NEXT: pushl %esi
114; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
115; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
116; X86-NEXT: movzwl (%eax), %edx
117; X86-NEXT: movzwl (%ecx), %esi
118; X86-NEXT: rolw $8, %dx
119; X86-NEXT: rolw $8, %si
Sanjay Patel4dbdd472017-08-01 17:24:54 +0000120; X86-NEXT: cmpw %si, %dx
Simon Pilgrim483927a2017-07-18 15:55:30 +0000121; X86-NEXT: jne .LBB4_1
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000122; X86-NEXT: # %bb.2: # %loadbb1
Simon Pilgrim483927a2017-07-18 15:55:30 +0000123; X86-NEXT: movzbl 2(%eax), %eax
124; X86-NEXT: movzbl 2(%ecx), %ecx
125; X86-NEXT: subl %ecx, %eax
126; X86-NEXT: jmp .LBB4_3
127; X86-NEXT: .LBB4_1: # %res_block
Sanjay Patel169dae72017-08-11 15:44:14 +0000128; X86-NEXT: setae %al
129; X86-NEXT: movzbl %al, %eax
130; X86-NEXT: leal -1(%eax,%eax), %eax
Simon Pilgrim483927a2017-07-18 15:55:30 +0000131; X86-NEXT: .LBB4_3: # %endblock
132; X86-NEXT: popl %esi
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000133; X86-NEXT: retl
134;
135; X64-LABEL: length3:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000136; X64: # %bb.0: # %loadbb
Simon Pilgrim483927a2017-07-18 15:55:30 +0000137; X64-NEXT: movzwl (%rdi), %eax
138; X64-NEXT: movzwl (%rsi), %ecx
139; X64-NEXT: rolw $8, %ax
140; X64-NEXT: rolw $8, %cx
Sanjay Patel4dbdd472017-08-01 17:24:54 +0000141; X64-NEXT: cmpw %cx, %ax
Simon Pilgrim483927a2017-07-18 15:55:30 +0000142; X64-NEXT: jne .LBB4_1
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000143; X64-NEXT: # %bb.2: # %loadbb1
Simon Pilgrim483927a2017-07-18 15:55:30 +0000144; X64-NEXT: movzbl 2(%rdi), %eax
145; X64-NEXT: movzbl 2(%rsi), %ecx
146; X64-NEXT: subl %ecx, %eax
147; X64-NEXT: retq
148; X64-NEXT: .LBB4_1: # %res_block
Sanjay Patel169dae72017-08-11 15:44:14 +0000149; X64-NEXT: setae %al
150; X64-NEXT: movzbl %al, %eax
151; X64-NEXT: leal -1(%rax,%rax), %eax
Simon Pilgrim483927a2017-07-18 15:55:30 +0000152; X64-NEXT: retq
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000153 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 3) nounwind
154 ret i32 %m
155}
156
157define i1 @length3_eq(i8* %X, i8* %Y) nounwind optsize {
158; X86-LABEL: length3_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000159; X86: # %bb.0:
Clement Courbet82bade62017-11-02 15:53:10 +0000160; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
Clement Courbet063bed92017-11-03 12:12:27 +0000161; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
162; X86-NEXT: movzwl (%ecx), %edx
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000163; X86-NEXT: xorw (%eax), %dx
164; X86-NEXT: movb 2(%ecx), %cl
165; X86-NEXT: xorb 2(%eax), %cl
166; X86-NEXT: movzbl %cl, %eax
167; X86-NEXT: orw %dx, %ax
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000168; X86-NEXT: setne %al
169; X86-NEXT: retl
170;
171; X64-LABEL: length3_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000172; X64: # %bb.0:
Simon Pilgrim483927a2017-07-18 15:55:30 +0000173; X64-NEXT: movzwl (%rdi), %eax
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000174; X64-NEXT: xorw (%rsi), %ax
Simon Pilgrim483927a2017-07-18 15:55:30 +0000175; X64-NEXT: movb 2(%rdi), %cl
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000176; X64-NEXT: xorb 2(%rsi), %cl
177; X64-NEXT: movzbl %cl, %ecx
178; X64-NEXT: orw %ax, %cx
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000179; X64-NEXT: setne %al
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000180; X64-NEXT: retq
181 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 3) nounwind
182 %c = icmp ne i32 %m, 0
183 ret i1 %c
184}
185
186define i32 @length4(i8* %X, i8* %Y) nounwind optsize {
187; X86-LABEL: length4:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000188; X86: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000189; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
190; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
191; X86-NEXT: movl (%ecx), %ecx
192; X86-NEXT: movl (%eax), %edx
193; X86-NEXT: bswapl %ecx
194; X86-NEXT: bswapl %edx
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000195; X86-NEXT: xorl %eax, %eax
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000196; X86-NEXT: cmpl %edx, %ecx
Sanjay Patelfea731a2017-07-31 18:08:24 +0000197; X86-NEXT: seta %al
198; X86-NEXT: sbbl $0, %eax
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000199; X86-NEXT: retl
200;
201; X64-LABEL: length4:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000202; X64: # %bb.0:
Sanjay Patelfea731a2017-07-31 18:08:24 +0000203; X64-NEXT: movl (%rdi), %ecx
204; X64-NEXT: movl (%rsi), %edx
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000205; X64-NEXT: bswapl %ecx
Sanjay Patelfea731a2017-07-31 18:08:24 +0000206; X64-NEXT: bswapl %edx
207; X64-NEXT: xorl %eax, %eax
208; X64-NEXT: cmpl %edx, %ecx
209; X64-NEXT: seta %al
210; X64-NEXT: sbbl $0, %eax
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000211; X64-NEXT: retq
212 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 4) nounwind
213 ret i32 %m
214}
215
216define i1 @length4_eq(i8* %X, i8* %Y) nounwind optsize {
217; X86-LABEL: length4_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000218; X86: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000219; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
220; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
221; X86-NEXT: movl (%ecx), %ecx
222; X86-NEXT: cmpl (%eax), %ecx
223; X86-NEXT: setne %al
224; X86-NEXT: retl
225;
226; X64-LABEL: length4_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000227; X64: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000228; X64-NEXT: movl (%rdi), %eax
229; X64-NEXT: cmpl (%rsi), %eax
230; X64-NEXT: setne %al
231; X64-NEXT: retq
232 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 4) nounwind
233 %c = icmp ne i32 %m, 0
234 ret i1 %c
235}
236
237define i1 @length4_eq_const(i8* %X) nounwind optsize {
238; X86-LABEL: length4_eq_const:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000239; X86: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000240; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
241; X86-NEXT: cmpl $875770417, (%eax) # imm = 0x34333231
242; X86-NEXT: sete %al
243; X86-NEXT: retl
244;
245; X64-LABEL: length4_eq_const:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000246; X64: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000247; X64-NEXT: cmpl $875770417, (%rdi) # imm = 0x34333231
248; X64-NEXT: sete %al
249; X64-NEXT: retq
250 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str, i32 0, i32 1), i64 4) nounwind
251 %c = icmp eq i32 %m, 0
252 ret i1 %c
253}
254
255define i32 @length5(i8* %X, i8* %Y) nounwind optsize {
256; X86-LABEL: length5:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000257; X86: # %bb.0: # %loadbb
Simon Pilgrim483927a2017-07-18 15:55:30 +0000258; X86-NEXT: pushl %esi
259; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
260; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
261; X86-NEXT: movl (%eax), %edx
262; X86-NEXT: movl (%ecx), %esi
263; X86-NEXT: bswapl %edx
264; X86-NEXT: bswapl %esi
265; X86-NEXT: cmpl %esi, %edx
266; X86-NEXT: jne .LBB9_1
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000267; X86-NEXT: # %bb.2: # %loadbb1
Simon Pilgrim483927a2017-07-18 15:55:30 +0000268; X86-NEXT: movzbl 4(%eax), %eax
269; X86-NEXT: movzbl 4(%ecx), %ecx
270; X86-NEXT: subl %ecx, %eax
271; X86-NEXT: jmp .LBB9_3
272; X86-NEXT: .LBB9_1: # %res_block
Sanjay Patel169dae72017-08-11 15:44:14 +0000273; X86-NEXT: setae %al
274; X86-NEXT: movzbl %al, %eax
275; X86-NEXT: leal -1(%eax,%eax), %eax
Simon Pilgrim483927a2017-07-18 15:55:30 +0000276; X86-NEXT: .LBB9_3: # %endblock
277; X86-NEXT: popl %esi
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000278; X86-NEXT: retl
279;
280; X64-LABEL: length5:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000281; X64: # %bb.0: # %loadbb
Simon Pilgrim483927a2017-07-18 15:55:30 +0000282; X64-NEXT: movl (%rdi), %eax
283; X64-NEXT: movl (%rsi), %ecx
284; X64-NEXT: bswapl %eax
285; X64-NEXT: bswapl %ecx
Sanjay Patel4dbdd472017-08-01 17:24:54 +0000286; X64-NEXT: cmpl %ecx, %eax
Simon Pilgrim483927a2017-07-18 15:55:30 +0000287; X64-NEXT: jne .LBB9_1
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000288; X64-NEXT: # %bb.2: # %loadbb1
Simon Pilgrim483927a2017-07-18 15:55:30 +0000289; X64-NEXT: movzbl 4(%rdi), %eax
290; X64-NEXT: movzbl 4(%rsi), %ecx
291; X64-NEXT: subl %ecx, %eax
292; X64-NEXT: retq
293; X64-NEXT: .LBB9_1: # %res_block
Sanjay Patel169dae72017-08-11 15:44:14 +0000294; X64-NEXT: setae %al
295; X64-NEXT: movzbl %al, %eax
296; X64-NEXT: leal -1(%rax,%rax), %eax
Simon Pilgrim483927a2017-07-18 15:55:30 +0000297; X64-NEXT: retq
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000298 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 5) nounwind
299 ret i32 %m
300}
301
302define i1 @length5_eq(i8* %X, i8* %Y) nounwind optsize {
303; X86-LABEL: length5_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000304; X86: # %bb.0:
Clement Courbet82bade62017-11-02 15:53:10 +0000305; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
Clement Courbet063bed92017-11-03 12:12:27 +0000306; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
307; X86-NEXT: movl (%ecx), %edx
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000308; X86-NEXT: xorl (%eax), %edx
309; X86-NEXT: movb 4(%ecx), %cl
310; X86-NEXT: xorb 4(%eax), %cl
311; X86-NEXT: movzbl %cl, %eax
312; X86-NEXT: orl %edx, %eax
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000313; X86-NEXT: setne %al
314; X86-NEXT: retl
315;
316; X64-LABEL: length5_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000317; X64: # %bb.0:
Simon Pilgrim483927a2017-07-18 15:55:30 +0000318; X64-NEXT: movl (%rdi), %eax
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000319; X64-NEXT: xorl (%rsi), %eax
Simon Pilgrim483927a2017-07-18 15:55:30 +0000320; X64-NEXT: movb 4(%rdi), %cl
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000321; X64-NEXT: xorb 4(%rsi), %cl
322; X64-NEXT: movzbl %cl, %ecx
323; X64-NEXT: orl %eax, %ecx
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000324; X64-NEXT: setne %al
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000325; X64-NEXT: retq
326 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 5) nounwind
327 %c = icmp ne i32 %m, 0
328 ret i1 %c
329}
330
331define i32 @length8(i8* %X, i8* %Y) nounwind optsize {
332; X86-LABEL: length8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000333; X86: # %bb.0:
Simon Pilgrim483927a2017-07-18 15:55:30 +0000334; X86-NEXT: pushl %esi
335; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
336; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
337; X86-NEXT: movl (%esi), %ecx
338; X86-NEXT: movl (%eax), %edx
339; X86-NEXT: bswapl %ecx
340; X86-NEXT: bswapl %edx
341; X86-NEXT: cmpl %edx, %ecx
Clement Courbet063bed92017-11-03 12:12:27 +0000342; X86-NEXT: jne .LBB11_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000343; X86-NEXT: # %bb.1: # %loadbb1
Simon Pilgrim483927a2017-07-18 15:55:30 +0000344; X86-NEXT: movl 4(%esi), %ecx
345; X86-NEXT: movl 4(%eax), %edx
346; X86-NEXT: bswapl %ecx
347; X86-NEXT: bswapl %edx
348; X86-NEXT: xorl %eax, %eax
349; X86-NEXT: cmpl %edx, %ecx
350; X86-NEXT: je .LBB11_3
Clement Courbet063bed92017-11-03 12:12:27 +0000351; X86-NEXT: .LBB11_2: # %res_block
Simon Pilgrim483927a2017-07-18 15:55:30 +0000352; X86-NEXT: xorl %eax, %eax
Simon Pilgrim483927a2017-07-18 15:55:30 +0000353; X86-NEXT: cmpl %edx, %ecx
Sanjay Patel169dae72017-08-11 15:44:14 +0000354; X86-NEXT: setae %al
355; X86-NEXT: leal -1(%eax,%eax), %eax
Simon Pilgrim483927a2017-07-18 15:55:30 +0000356; X86-NEXT: .LBB11_3: # %endblock
357; X86-NEXT: popl %esi
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000358; X86-NEXT: retl
359;
360; X64-LABEL: length8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000361; X64: # %bb.0:
Sanjay Patelfea731a2017-07-31 18:08:24 +0000362; X64-NEXT: movq (%rdi), %rcx
363; X64-NEXT: movq (%rsi), %rdx
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000364; X64-NEXT: bswapq %rcx
Sanjay Patelfea731a2017-07-31 18:08:24 +0000365; X64-NEXT: bswapq %rdx
366; X64-NEXT: xorl %eax, %eax
367; X64-NEXT: cmpq %rdx, %rcx
368; X64-NEXT: seta %al
369; X64-NEXT: sbbl $0, %eax
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000370; X64-NEXT: retq
371 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 8) nounwind
372 ret i32 %m
373}
374
375define i1 @length8_eq(i8* %X, i8* %Y) nounwind optsize {
376; X86-LABEL: length8_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000377; X86: # %bb.0:
Clement Courbet82bade62017-11-02 15:53:10 +0000378; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
Clement Courbet063bed92017-11-03 12:12:27 +0000379; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
380; X86-NEXT: movl (%ecx), %edx
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000381; X86-NEXT: movl 4(%ecx), %ecx
382; X86-NEXT: xorl (%eax), %edx
383; X86-NEXT: xorl 4(%eax), %ecx
384; X86-NEXT: orl %edx, %ecx
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000385; X86-NEXT: sete %al
386; X86-NEXT: retl
387;
388; X64-LABEL: length8_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000389; X64: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000390; X64-NEXT: movq (%rdi), %rax
391; X64-NEXT: cmpq (%rsi), %rax
392; X64-NEXT: sete %al
393; X64-NEXT: retq
394 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 8) nounwind
395 %c = icmp eq i32 %m, 0
396 ret i1 %c
397}
398
399define i1 @length8_eq_const(i8* %X) nounwind optsize {
400; X86-LABEL: length8_eq_const:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000401; X86: # %bb.0:
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000402; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
403; X86-NEXT: movl $858927408, %ecx # imm = 0x33323130
404; X86-NEXT: xorl (%eax), %ecx
405; X86-NEXT: movl $926299444, %edx # imm = 0x37363534
406; X86-NEXT: xorl 4(%eax), %edx
407; X86-NEXT: orl %ecx, %edx
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000408; X86-NEXT: setne %al
409; X86-NEXT: retl
410;
411; X64-LABEL: length8_eq_const:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000412; X64: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000413; X64-NEXT: movabsq $3978425819141910832, %rax # imm = 0x3736353433323130
414; X64-NEXT: cmpq %rax, (%rdi)
415; X64-NEXT: setne %al
416; X64-NEXT: retq
417 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str, i32 0, i32 0), i64 8) nounwind
418 %c = icmp ne i32 %m, 0
419 ret i1 %c
420}
421
422define i1 @length12_eq(i8* %X, i8* %Y) nounwind optsize {
423; X86-LABEL: length12_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000424; X86: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000425; X86-NEXT: pushl $0
426; X86-NEXT: pushl $12
427; X86-NEXT: pushl {{[0-9]+}}(%esp)
428; X86-NEXT: pushl {{[0-9]+}}(%esp)
429; X86-NEXT: calll memcmp
430; X86-NEXT: addl $16, %esp
431; X86-NEXT: testl %eax, %eax
432; X86-NEXT: setne %al
433; X86-NEXT: retl
434;
435; X64-LABEL: length12_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000436; X64: # %bb.0:
Simon Pilgrim483927a2017-07-18 15:55:30 +0000437; X64-NEXT: movq (%rdi), %rax
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000438; X64-NEXT: xorq (%rsi), %rax
Simon Pilgrim483927a2017-07-18 15:55:30 +0000439; X64-NEXT: movl 8(%rdi), %ecx
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000440; X64-NEXT: xorl 8(%rsi), %ecx
441; X64-NEXT: orq %rax, %rcx
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000442; X64-NEXT: setne %al
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000443; X64-NEXT: retq
444 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 12) nounwind
445 %c = icmp ne i32 %m, 0
446 ret i1 %c
447}
448
449define i32 @length12(i8* %X, i8* %Y) nounwind optsize {
450; X86-LABEL: length12:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000451; X86: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000452; X86-NEXT: pushl $0
453; X86-NEXT: pushl $12
454; X86-NEXT: pushl {{[0-9]+}}(%esp)
455; X86-NEXT: pushl {{[0-9]+}}(%esp)
456; X86-NEXT: calll memcmp
457; X86-NEXT: addl $16, %esp
458; X86-NEXT: retl
459;
460; X64-LABEL: length12:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000461; X64: # %bb.0:
Simon Pilgrim483927a2017-07-18 15:55:30 +0000462; X64-NEXT: movq (%rdi), %rcx
463; X64-NEXT: movq (%rsi), %rdx
464; X64-NEXT: bswapq %rcx
465; X64-NEXT: bswapq %rdx
466; X64-NEXT: cmpq %rdx, %rcx
Clement Courbet063bed92017-11-03 12:12:27 +0000467; X64-NEXT: jne .LBB15_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000468; X64-NEXT: # %bb.1: # %loadbb1
Simon Pilgrim483927a2017-07-18 15:55:30 +0000469; X64-NEXT: movl 8(%rdi), %ecx
470; X64-NEXT: movl 8(%rsi), %edx
471; X64-NEXT: bswapl %ecx
472; X64-NEXT: bswapl %edx
473; X64-NEXT: xorl %eax, %eax
474; X64-NEXT: cmpq %rdx, %rcx
Clement Courbet063bed92017-11-03 12:12:27 +0000475; X64-NEXT: je .LBB15_3
476; X64-NEXT: .LBB15_2: # %res_block
Sanjay Patel169dae72017-08-11 15:44:14 +0000477; X64-NEXT: xorl %eax, %eax
Simon Pilgrim483927a2017-07-18 15:55:30 +0000478; X64-NEXT: cmpq %rdx, %rcx
Sanjay Patel169dae72017-08-11 15:44:14 +0000479; X64-NEXT: setae %al
480; X64-NEXT: leal -1(%rax,%rax), %eax
Clement Courbet063bed92017-11-03 12:12:27 +0000481; X64-NEXT: .LBB15_3: # %endblock
Simon Pilgrim483927a2017-07-18 15:55:30 +0000482; X64-NEXT: retq
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000483 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 12) nounwind
484 ret i32 %m
485}
486
487; PR33329 - https://bugs.llvm.org/show_bug.cgi?id=33329
488
489define i32 @length16(i8* %X, i8* %Y) nounwind optsize {
490; X86-LABEL: length16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000491; X86: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000492; X86-NEXT: pushl $0
493; X86-NEXT: pushl $16
494; X86-NEXT: pushl {{[0-9]+}}(%esp)
495; X86-NEXT: pushl {{[0-9]+}}(%esp)
496; X86-NEXT: calll memcmp
497; X86-NEXT: addl $16, %esp
498; X86-NEXT: retl
499;
500; X64-LABEL: length16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000501; X64: # %bb.0:
Simon Pilgrim483927a2017-07-18 15:55:30 +0000502; X64-NEXT: movq (%rdi), %rcx
503; X64-NEXT: movq (%rsi), %rdx
504; X64-NEXT: bswapq %rcx
505; X64-NEXT: bswapq %rdx
506; X64-NEXT: cmpq %rdx, %rcx
Clement Courbet063bed92017-11-03 12:12:27 +0000507; X64-NEXT: jne .LBB16_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000508; X64-NEXT: # %bb.1: # %loadbb1
Simon Pilgrim483927a2017-07-18 15:55:30 +0000509; X64-NEXT: movq 8(%rdi), %rcx
510; X64-NEXT: movq 8(%rsi), %rdx
511; X64-NEXT: bswapq %rcx
512; X64-NEXT: bswapq %rdx
513; X64-NEXT: xorl %eax, %eax
514; X64-NEXT: cmpq %rdx, %rcx
Clement Courbet063bed92017-11-03 12:12:27 +0000515; X64-NEXT: je .LBB16_3
516; X64-NEXT: .LBB16_2: # %res_block
Sanjay Patel169dae72017-08-11 15:44:14 +0000517; X64-NEXT: xorl %eax, %eax
Simon Pilgrim483927a2017-07-18 15:55:30 +0000518; X64-NEXT: cmpq %rdx, %rcx
Sanjay Patel169dae72017-08-11 15:44:14 +0000519; X64-NEXT: setae %al
520; X64-NEXT: leal -1(%rax,%rax), %eax
Clement Courbet063bed92017-11-03 12:12:27 +0000521; X64-NEXT: .LBB16_3: # %endblock
Simon Pilgrim483927a2017-07-18 15:55:30 +0000522; X64-NEXT: retq
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000523 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 16) nounwind
524 ret i32 %m
525}
526
527define i1 @length16_eq(i8* %x, i8* %y) nounwind optsize {
528; X86-NOSSE-LABEL: length16_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000529; X86-NOSSE: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000530; X86-NOSSE-NEXT: pushl $0
531; X86-NOSSE-NEXT: pushl $16
532; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
533; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
534; X86-NOSSE-NEXT: calll memcmp
535; X86-NOSSE-NEXT: addl $16, %esp
536; X86-NOSSE-NEXT: testl %eax, %eax
537; X86-NOSSE-NEXT: setne %al
538; X86-NOSSE-NEXT: retl
539;
540; X86-SSE2-LABEL: length16_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000541; X86-SSE2: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000542; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
543; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
544; X86-SSE2-NEXT: movdqu (%ecx), %xmm0
545; X86-SSE2-NEXT: movdqu (%eax), %xmm1
546; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
547; X86-SSE2-NEXT: pmovmskb %xmm1, %eax
548; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
549; X86-SSE2-NEXT: setne %al
550; X86-SSE2-NEXT: retl
551;
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000552; X64-SSE2-LABEL: length16_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000553; X64-SSE2: # %bb.0:
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000554; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
555; X64-SSE2-NEXT: movdqu (%rsi), %xmm1
556; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
557; X64-SSE2-NEXT: pmovmskb %xmm1, %eax
558; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
559; X64-SSE2-NEXT: setne %al
560; X64-SSE2-NEXT: retq
561;
562; X64-AVX2-LABEL: length16_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000563; X64-AVX2: # %bb.0:
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000564; X64-AVX2-NEXT: vmovdqu (%rdi), %xmm0
565; X64-AVX2-NEXT: vpcmpeqb (%rsi), %xmm0, %xmm0
566; X64-AVX2-NEXT: vpmovmskb %xmm0, %eax
567; X64-AVX2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
568; X64-AVX2-NEXT: setne %al
569; X64-AVX2-NEXT: retq
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000570 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 16) nounwind
571 %cmp = icmp ne i32 %call, 0
572 ret i1 %cmp
573}
574
575define i1 @length16_eq_const(i8* %X) nounwind optsize {
576; X86-NOSSE-LABEL: length16_eq_const:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000577; X86-NOSSE: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000578; X86-NOSSE-NEXT: pushl $0
579; X86-NOSSE-NEXT: pushl $16
580; X86-NOSSE-NEXT: pushl $.L.str
581; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
582; X86-NOSSE-NEXT: calll memcmp
583; X86-NOSSE-NEXT: addl $16, %esp
584; X86-NOSSE-NEXT: testl %eax, %eax
585; X86-NOSSE-NEXT: sete %al
586; X86-NOSSE-NEXT: retl
587;
588; X86-SSE2-LABEL: length16_eq_const:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000589; X86-SSE2: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000590; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
591; X86-SSE2-NEXT: movdqu (%eax), %xmm0
592; X86-SSE2-NEXT: pcmpeqb {{\.LCPI.*}}, %xmm0
593; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
594; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
595; X86-SSE2-NEXT: sete %al
596; X86-SSE2-NEXT: retl
597;
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000598; X64-SSE2-LABEL: length16_eq_const:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000599; X64-SSE2: # %bb.0:
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000600; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
601; X64-SSE2-NEXT: pcmpeqb {{.*}}(%rip), %xmm0
602; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
603; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
604; X64-SSE2-NEXT: sete %al
605; X64-SSE2-NEXT: retq
606;
607; X64-AVX2-LABEL: length16_eq_const:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000608; X64-AVX2: # %bb.0:
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000609; X64-AVX2-NEXT: vmovdqu (%rdi), %xmm0
610; X64-AVX2-NEXT: vpcmpeqb {{.*}}(%rip), %xmm0, %xmm0
611; X64-AVX2-NEXT: vpmovmskb %xmm0, %eax
612; X64-AVX2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
613; X64-AVX2-NEXT: sete %al
614; X64-AVX2-NEXT: retq
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000615 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str, i32 0, i32 0), i64 16) nounwind
616 %c = icmp eq i32 %m, 0
617 ret i1 %c
618}
619
Simon Pilgrim3459f102017-07-25 10:33:36 +0000620; PR33914 - https://bugs.llvm.org/show_bug.cgi?id=33914
621
622define i32 @length24(i8* %X, i8* %Y) nounwind optsize {
623; X86-LABEL: length24:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000624; X86: # %bb.0:
Simon Pilgrim3459f102017-07-25 10:33:36 +0000625; X86-NEXT: pushl $0
626; X86-NEXT: pushl $24
627; X86-NEXT: pushl {{[0-9]+}}(%esp)
628; X86-NEXT: pushl {{[0-9]+}}(%esp)
629; X86-NEXT: calll memcmp
630; X86-NEXT: addl $16, %esp
631; X86-NEXT: retl
632;
633; X64-LABEL: length24:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000634; X64: # %bb.0:
Simon Pilgrim3459f102017-07-25 10:33:36 +0000635; X64-NEXT: movl $24, %edx
636; X64-NEXT: jmp memcmp # TAILCALL
637 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 24) nounwind
638 ret i32 %m
639}
640
641define i1 @length24_eq(i8* %x, i8* %y) nounwind optsize {
642; X86-LABEL: length24_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000643; X86: # %bb.0:
Simon Pilgrim3459f102017-07-25 10:33:36 +0000644; X86-NEXT: pushl $0
645; X86-NEXT: pushl $24
646; X86-NEXT: pushl {{[0-9]+}}(%esp)
647; X86-NEXT: pushl {{[0-9]+}}(%esp)
648; X86-NEXT: calll memcmp
649; X86-NEXT: addl $16, %esp
650; X86-NEXT: testl %eax, %eax
651; X86-NEXT: sete %al
652; X86-NEXT: retl
653;
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000654; X64-SSE2-LABEL: length24_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000655; X64-SSE2: # %bb.0:
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000656; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
657; X64-SSE2-NEXT: movdqu (%rsi), %xmm1
658; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000659; X64-SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
660; X64-SSE2-NEXT: movq {{.*#+}} xmm2 = mem[0],zero
661; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm2
662; X64-SSE2-NEXT: pand %xmm1, %xmm2
663; X64-SSE2-NEXT: pmovmskb %xmm2, %eax
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000664; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000665; X64-SSE2-NEXT: sete %al
666; X64-SSE2-NEXT: retq
667;
668; X64-AVX2-LABEL: length24_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000669; X64-AVX2: # %bb.0:
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000670; X64-AVX2-NEXT: vmovdqu (%rdi), %xmm0
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000671; X64-AVX2-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
672; X64-AVX2-NEXT: vmovq {{.*#+}} xmm2 = mem[0],zero
673; X64-AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000674; X64-AVX2-NEXT: vpcmpeqb (%rsi), %xmm0, %xmm0
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000675; X64-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000676; X64-AVX2-NEXT: vpmovmskb %xmm0, %eax
677; X64-AVX2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000678; X64-AVX2-NEXT: sete %al
679; X64-AVX2-NEXT: retq
Simon Pilgrim3459f102017-07-25 10:33:36 +0000680 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 24) nounwind
681 %cmp = icmp eq i32 %call, 0
682 ret i1 %cmp
683}
684
685define i1 @length24_eq_const(i8* %X) nounwind optsize {
686; X86-LABEL: length24_eq_const:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000687; X86: # %bb.0:
Simon Pilgrim3459f102017-07-25 10:33:36 +0000688; X86-NEXT: pushl $0
689; X86-NEXT: pushl $24
690; X86-NEXT: pushl $.L.str
691; X86-NEXT: pushl {{[0-9]+}}(%esp)
692; X86-NEXT: calll memcmp
693; X86-NEXT: addl $16, %esp
694; X86-NEXT: testl %eax, %eax
695; X86-NEXT: setne %al
696; X86-NEXT: retl
697;
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000698; X64-SSE2-LABEL: length24_eq_const:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000699; X64-SSE2: # %bb.0:
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000700; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000701; X64-SSE2-NEXT: movq {{.*#+}} xmm1 = mem[0],zero
702; X64-SSE2-NEXT: movabsq $3689065127958034230, %rax # imm = 0x3332313039383736
703; X64-SSE2-NEXT: movq %rax, %xmm2
704; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm2
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000705; X64-SSE2-NEXT: pcmpeqb {{.*}}(%rip), %xmm0
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000706; X64-SSE2-NEXT: pand %xmm2, %xmm0
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000707; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
708; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000709; X64-SSE2-NEXT: setne %al
710; X64-SSE2-NEXT: retq
711;
712; X64-AVX2-LABEL: length24_eq_const:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000713; X64-AVX2: # %bb.0:
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000714; X64-AVX2-NEXT: vmovdqu (%rdi), %xmm0
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000715; X64-AVX2-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
716; X64-AVX2-NEXT: movabsq $3689065127958034230, %rax # imm = 0x3332313039383736
717; X64-AVX2-NEXT: vmovq %rax, %xmm2
718; X64-AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000719; X64-AVX2-NEXT: vpcmpeqb {{.*}}(%rip), %xmm0, %xmm0
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000720; X64-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000721; X64-AVX2-NEXT: vpmovmskb %xmm0, %eax
722; X64-AVX2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000723; X64-AVX2-NEXT: setne %al
724; X64-AVX2-NEXT: retq
Simon Pilgrim3459f102017-07-25 10:33:36 +0000725 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str, i32 0, i32 0), i64 24) nounwind
726 %c = icmp ne i32 %m, 0
727 ret i1 %c
728}
729
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000730define i32 @length32(i8* %X, i8* %Y) nounwind optsize {
731; X86-LABEL: length32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000732; X86: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000733; X86-NEXT: pushl $0
734; X86-NEXT: pushl $32
735; X86-NEXT: pushl {{[0-9]+}}(%esp)
736; X86-NEXT: pushl {{[0-9]+}}(%esp)
737; X86-NEXT: calll memcmp
738; X86-NEXT: addl $16, %esp
739; X86-NEXT: retl
740;
741; X64-LABEL: length32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000742; X64: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000743; X64-NEXT: movl $32, %edx
744; X64-NEXT: jmp memcmp # TAILCALL
745 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 32) nounwind
746 ret i32 %m
747}
748
749; PR33325 - https://bugs.llvm.org/show_bug.cgi?id=33325
750
751define i1 @length32_eq(i8* %x, i8* %y) nounwind optsize {
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000752; X86-NOSSE-LABEL: length32_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000753; X86-NOSSE: # %bb.0:
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000754; X86-NOSSE-NEXT: pushl $0
755; X86-NOSSE-NEXT: pushl $32
756; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
757; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
758; X86-NOSSE-NEXT: calll memcmp
759; X86-NOSSE-NEXT: addl $16, %esp
760; X86-NOSSE-NEXT: testl %eax, %eax
761; X86-NOSSE-NEXT: sete %al
762; X86-NOSSE-NEXT: retl
763;
764; X86-SSE2-LABEL: length32_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000765; X86-SSE2: # %bb.0:
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000766; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
767; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
768; X86-SSE2-NEXT: movdqu (%ecx), %xmm0
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000769; X86-SSE2-NEXT: movdqu 16(%ecx), %xmm1
770; X86-SSE2-NEXT: movdqu (%eax), %xmm2
771; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2
772; X86-SSE2-NEXT: movdqu 16(%eax), %xmm0
773; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
774; X86-SSE2-NEXT: pand %xmm2, %xmm0
775; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
776; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000777; X86-SSE2-NEXT: sete %al
778; X86-SSE2-NEXT: retl
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000779;
780; X64-SSE2-LABEL: length32_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000781; X64-SSE2: # %bb.0:
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000782; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000783; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1
784; X64-SSE2-NEXT: movdqu (%rsi), %xmm2
785; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm2
786; X64-SSE2-NEXT: movdqu 16(%rsi), %xmm0
787; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
788; X64-SSE2-NEXT: pand %xmm2, %xmm0
789; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000790; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000791; X64-SSE2-NEXT: sete %al
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000792; X64-SSE2-NEXT: retq
793;
794; X64-AVX2-LABEL: length32_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000795; X64-AVX2: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000796; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
797; X64-AVX2-NEXT: vpcmpeqb (%rsi), %ymm0, %ymm0
798; X64-AVX2-NEXT: vpmovmskb %ymm0, %eax
799; X64-AVX2-NEXT: cmpl $-1, %eax
800; X64-AVX2-NEXT: sete %al
801; X64-AVX2-NEXT: vzeroupper
802; X64-AVX2-NEXT: retq
803 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 32) nounwind
804 %cmp = icmp eq i32 %call, 0
805 ret i1 %cmp
806}
807
808define i1 @length32_eq_const(i8* %X) nounwind optsize {
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000809; X86-NOSSE-LABEL: length32_eq_const:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000810; X86-NOSSE: # %bb.0:
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000811; X86-NOSSE-NEXT: pushl $0
812; X86-NOSSE-NEXT: pushl $32
813; X86-NOSSE-NEXT: pushl $.L.str
814; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
815; X86-NOSSE-NEXT: calll memcmp
816; X86-NOSSE-NEXT: addl $16, %esp
817; X86-NOSSE-NEXT: testl %eax, %eax
818; X86-NOSSE-NEXT: setne %al
819; X86-NOSSE-NEXT: retl
820;
821; X86-SSE2-LABEL: length32_eq_const:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000822; X86-SSE2: # %bb.0:
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000823; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
824; X86-SSE2-NEXT: movdqu (%eax), %xmm0
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000825; X86-SSE2-NEXT: movdqu 16(%eax), %xmm1
826; X86-SSE2-NEXT: pcmpeqb {{\.LCPI.*}}, %xmm1
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000827; X86-SSE2-NEXT: pcmpeqb {{\.LCPI.*}}, %xmm0
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000828; X86-SSE2-NEXT: pand %xmm1, %xmm0
829; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
830; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000831; X86-SSE2-NEXT: setne %al
832; X86-SSE2-NEXT: retl
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000833;
834; X64-SSE2-LABEL: length32_eq_const:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000835; X64-SSE2: # %bb.0:
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000836; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000837; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1
838; X64-SSE2-NEXT: pcmpeqb {{.*}}(%rip), %xmm1
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000839; X64-SSE2-NEXT: pcmpeqb {{.*}}(%rip), %xmm0
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000840; X64-SSE2-NEXT: pand %xmm1, %xmm0
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000841; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
842; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000843; X64-SSE2-NEXT: setne %al
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000844; X64-SSE2-NEXT: retq
845;
846; X64-AVX2-LABEL: length32_eq_const:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000847; X64-AVX2: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000848; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
849; X64-AVX2-NEXT: vpcmpeqb {{.*}}(%rip), %ymm0, %ymm0
850; X64-AVX2-NEXT: vpmovmskb %ymm0, %eax
851; X64-AVX2-NEXT: cmpl $-1, %eax
852; X64-AVX2-NEXT: setne %al
853; X64-AVX2-NEXT: vzeroupper
854; X64-AVX2-NEXT: retq
855 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str, i32 0, i32 0), i64 32) nounwind
856 %c = icmp ne i32 %m, 0
857 ret i1 %c
858}
859
860define i32 @length64(i8* %X, i8* %Y) nounwind optsize {
861; X86-LABEL: length64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000862; X86: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000863; X86-NEXT: pushl $0
864; X86-NEXT: pushl $64
865; X86-NEXT: pushl {{[0-9]+}}(%esp)
866; X86-NEXT: pushl {{[0-9]+}}(%esp)
867; X86-NEXT: calll memcmp
868; X86-NEXT: addl $16, %esp
869; X86-NEXT: retl
870;
871; X64-LABEL: length64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000872; X64: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000873; X64-NEXT: movl $64, %edx
874; X64-NEXT: jmp memcmp # TAILCALL
875 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 64) nounwind
876 ret i32 %m
877}
878
879define i1 @length64_eq(i8* %x, i8* %y) nounwind optsize {
880; X86-LABEL: length64_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000881; X86: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000882; X86-NEXT: pushl $0
883; X86-NEXT: pushl $64
884; X86-NEXT: pushl {{[0-9]+}}(%esp)
885; X86-NEXT: pushl {{[0-9]+}}(%esp)
886; X86-NEXT: calll memcmp
887; X86-NEXT: addl $16, %esp
888; X86-NEXT: testl %eax, %eax
889; X86-NEXT: setne %al
890; X86-NEXT: retl
891;
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000892; X64-SSE2-LABEL: length64_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000893; X64-SSE2: # %bb.0:
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000894; X64-SSE2-NEXT: pushq %rax
895; X64-SSE2-NEXT: movl $64, %edx
896; X64-SSE2-NEXT: callq memcmp
897; X64-SSE2-NEXT: testl %eax, %eax
898; X64-SSE2-NEXT: setne %al
899; X64-SSE2-NEXT: popq %rcx
900; X64-SSE2-NEXT: retq
901;
902; X64-AVX2-LABEL: length64_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000903; X64-AVX2: # %bb.0:
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000904; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000905; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
906; X64-AVX2-NEXT: vpcmpeqb 32(%rsi), %ymm1, %ymm1
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000907; X64-AVX2-NEXT: vpcmpeqb (%rsi), %ymm0, %ymm0
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000908; X64-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000909; X64-AVX2-NEXT: vpmovmskb %ymm0, %eax
910; X64-AVX2-NEXT: cmpl $-1, %eax
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000911; X64-AVX2-NEXT: setne %al
912; X64-AVX2-NEXT: vzeroupper
913; X64-AVX2-NEXT: retq
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000914 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 64) nounwind
915 %cmp = icmp ne i32 %call, 0
916 ret i1 %cmp
917}
918
919define i1 @length64_eq_const(i8* %X) nounwind optsize {
920; X86-LABEL: length64_eq_const:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000921; X86: # %bb.0:
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000922; X86-NEXT: pushl $0
923; X86-NEXT: pushl $64
924; X86-NEXT: pushl $.L.str
925; X86-NEXT: pushl {{[0-9]+}}(%esp)
926; X86-NEXT: calll memcmp
927; X86-NEXT: addl $16, %esp
928; X86-NEXT: testl %eax, %eax
929; X86-NEXT: sete %al
930; X86-NEXT: retl
931;
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000932; X64-SSE2-LABEL: length64_eq_const:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000933; X64-SSE2: # %bb.0:
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000934; X64-SSE2-NEXT: pushq %rax
935; X64-SSE2-NEXT: movl $.L.str, %esi
936; X64-SSE2-NEXT: movl $64, %edx
937; X64-SSE2-NEXT: callq memcmp
938; X64-SSE2-NEXT: testl %eax, %eax
939; X64-SSE2-NEXT: sete %al
940; X64-SSE2-NEXT: popq %rcx
941; X64-SSE2-NEXT: retq
942;
943; X64-AVX2-LABEL: length64_eq_const:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000944; X64-AVX2: # %bb.0:
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000945; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000946; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
947; X64-AVX2-NEXT: vpcmpeqb {{.*}}(%rip), %ymm1, %ymm1
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000948; X64-AVX2-NEXT: vpcmpeqb {{.*}}(%rip), %ymm0, %ymm0
Sanjay Patel5a48aef2018-01-06 16:16:04 +0000949; X64-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000950; X64-AVX2-NEXT: vpmovmskb %ymm0, %eax
951; X64-AVX2-NEXT: cmpl $-1, %eax
Clement Courbetb2c3eb82017-10-30 14:19:33 +0000952; X64-AVX2-NEXT: sete %al
953; X64-AVX2-NEXT: vzeroupper
954; X64-AVX2-NEXT: retq
Simon Pilgrimc2cbb522017-07-18 14:26:07 +0000955 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str, i32 0, i32 0), i64 64) nounwind
956 %c = icmp eq i32 %m, 0
957 ret i1 %c
958}
959