blob: 60f4940e2faefaaa5532276859e2c32a9faf6338 [file] [log] [blame]
Simon Pilgrim46a804c2017-10-03 16:56:57 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
Simon Pilgrim261a6c22017-10-03 17:04:36 +00002; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=-sse2 | FileCheck %s --check-prefix=X32
3; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X32-SSE2
4; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=X32-AVX2
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=-sse2 | FileCheck %s --check-prefix=X64
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X64-SSE2
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=X64-AVX2
Simon Pilgrim46a804c2017-10-03 16:56:57 +00008
9define i32 @PR15215_bad(<4 x i32> %input) {
Simon Pilgrim261a6c22017-10-03 17:04:36 +000010; X32-LABEL: PR15215_bad:
11; X32: # BB#0: # %entry
12; X32-NEXT: movb {{[0-9]+}}(%esp), %al
13; X32-NEXT: movb {{[0-9]+}}(%esp), %cl
14; X32-NEXT: movb {{[0-9]+}}(%esp), %dl
15; X32-NEXT: movb {{[0-9]+}}(%esp), %ah
16; X32-NEXT: addb %ah, %ah
17; X32-NEXT: andb $1, %dl
18; X32-NEXT: orb %ah, %dl
19; X32-NEXT: shlb $2, %dl
20; X32-NEXT: addb %cl, %cl
21; X32-NEXT: andb $1, %al
22; X32-NEXT: orb %cl, %al
23; X32-NEXT: andb $3, %al
24; X32-NEXT: orb %dl, %al
25; X32-NEXT: movzbl %al, %eax
26; X32-NEXT: andl $15, %eax
27; X32-NEXT: retl
28;
Simon Pilgrim46a804c2017-10-03 16:56:57 +000029; X32-SSE2-LABEL: PR15215_bad:
30; X32-SSE2: # BB#0: # %entry
31; X32-SSE2-NEXT: pslld $31, %xmm0
32; X32-SSE2-NEXT: psrad $31, %xmm0
33; X32-SSE2-NEXT: movmskps %xmm0, %eax
34; X32-SSE2-NEXT: retl
35;
36; X32-AVX2-LABEL: PR15215_bad:
37; X32-AVX2: # BB#0: # %entry
38; X32-AVX2-NEXT: vpslld $31, %xmm0, %xmm0
39; X32-AVX2-NEXT: vpsrad $31, %xmm0, %xmm0
40; X32-AVX2-NEXT: vmovmskps %xmm0, %eax
41; X32-AVX2-NEXT: retl
42;
Simon Pilgrim261a6c22017-10-03 17:04:36 +000043; X64-LABEL: PR15215_bad:
44; X64: # BB#0: # %entry
45; X64-NEXT: addb %cl, %cl
46; X64-NEXT: andb $1, %dl
47; X64-NEXT: orb %cl, %dl
48; X64-NEXT: shlb $2, %dl
49; X64-NEXT: addb %sil, %sil
50; X64-NEXT: andb $1, %dil
51; X64-NEXT: orb %sil, %dil
52; X64-NEXT: andb $3, %dil
53; X64-NEXT: orb %dl, %dil
54; X64-NEXT: movzbl %dil, %eax
55; X64-NEXT: andl $15, %eax
56; X64-NEXT: retq
57;
Simon Pilgrim46a804c2017-10-03 16:56:57 +000058; X64-SSE2-LABEL: PR15215_bad:
59; X64-SSE2: # BB#0: # %entry
60; X64-SSE2-NEXT: pslld $31, %xmm0
61; X64-SSE2-NEXT: psrad $31, %xmm0
62; X64-SSE2-NEXT: movmskps %xmm0, %eax
63; X64-SSE2-NEXT: retq
64;
65; X64-AVX2-LABEL: PR15215_bad:
66; X64-AVX2: # BB#0: # %entry
67; X64-AVX2-NEXT: vpslld $31, %xmm0, %xmm0
68; X64-AVX2-NEXT: vpsrad $31, %xmm0, %xmm0
69; X64-AVX2-NEXT: vmovmskps %xmm0, %eax
70; X64-AVX2-NEXT: retq
71entry:
72 %0 = trunc <4 x i32> %input to <4 x i1>
73 %1 = bitcast <4 x i1> %0 to i4
74 %2 = zext i4 %1 to i32
75 ret i32 %2
76}
77
78define i32 @PR15215_good(<4 x i32> %input) {
Simon Pilgrim261a6c22017-10-03 17:04:36 +000079; X32-LABEL: PR15215_good:
80; X32: # BB#0: # %entry
81; X32-NEXT: pushl %esi
82; X32-NEXT: .Lcfi0:
83; X32-NEXT: .cfi_def_cfa_offset 8
84; X32-NEXT: .Lcfi1:
85; X32-NEXT: .cfi_offset %esi, -8
86; X32-NEXT: movzbl {{[0-9]+}}(%esp), %eax
87; X32-NEXT: andl $1, %eax
88; X32-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
89; X32-NEXT: andl $1, %ecx
90; X32-NEXT: movzbl {{[0-9]+}}(%esp), %edx
91; X32-NEXT: andl $1, %edx
92; X32-NEXT: movzbl {{[0-9]+}}(%esp), %esi
93; X32-NEXT: andl $1, %esi
94; X32-NEXT: leal (%eax,%ecx,2), %eax
95; X32-NEXT: leal (%eax,%edx,4), %eax
96; X32-NEXT: leal (%eax,%esi,8), %eax
97; X32-NEXT: popl %esi
98; X32-NEXT: retl
99;
Simon Pilgrim46a804c2017-10-03 16:56:57 +0000100; X32-SSE2-LABEL: PR15215_good:
101; X32-SSE2: # BB#0: # %entry
102; X32-SSE2-NEXT: pushl %esi
103; X32-SSE2-NEXT: .Lcfi0:
104; X32-SSE2-NEXT: .cfi_def_cfa_offset 8
105; X32-SSE2-NEXT: .Lcfi1:
106; X32-SSE2-NEXT: .cfi_offset %esi, -8
107; X32-SSE2-NEXT: movd %xmm0, %eax
108; X32-SSE2-NEXT: andl $1, %eax
109; X32-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
110; X32-SSE2-NEXT: movd %xmm1, %ecx
111; X32-SSE2-NEXT: andl $1, %ecx
112; X32-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
113; X32-SSE2-NEXT: movd %xmm1, %edx
114; X32-SSE2-NEXT: andl $1, %edx
115; X32-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
116; X32-SSE2-NEXT: movd %xmm0, %esi
117; X32-SSE2-NEXT: andl $1, %esi
118; X32-SSE2-NEXT: leal (%eax,%ecx,2), %eax
119; X32-SSE2-NEXT: leal (%eax,%edx,4), %eax
120; X32-SSE2-NEXT: leal (%eax,%esi,8), %eax
121; X32-SSE2-NEXT: popl %esi
122; X32-SSE2-NEXT: retl
123;
124; X32-AVX2-LABEL: PR15215_good:
125; X32-AVX2: # BB#0: # %entry
126; X32-AVX2-NEXT: pushl %esi
127; X32-AVX2-NEXT: .Lcfi0:
128; X32-AVX2-NEXT: .cfi_def_cfa_offset 8
129; X32-AVX2-NEXT: .Lcfi1:
130; X32-AVX2-NEXT: .cfi_offset %esi, -8
131; X32-AVX2-NEXT: vmovd %xmm0, %eax
132; X32-AVX2-NEXT: andl $1, %eax
133; X32-AVX2-NEXT: vpextrd $1, %xmm0, %ecx
134; X32-AVX2-NEXT: andl $1, %ecx
135; X32-AVX2-NEXT: vpextrd $2, %xmm0, %edx
136; X32-AVX2-NEXT: andl $1, %edx
137; X32-AVX2-NEXT: vpextrd $3, %xmm0, %esi
138; X32-AVX2-NEXT: andl $1, %esi
139; X32-AVX2-NEXT: leal (%eax,%ecx,2), %eax
140; X32-AVX2-NEXT: leal (%eax,%edx,4), %eax
141; X32-AVX2-NEXT: leal (%eax,%esi,8), %eax
142; X32-AVX2-NEXT: popl %esi
143; X32-AVX2-NEXT: retl
144;
Simon Pilgrim261a6c22017-10-03 17:04:36 +0000145; X64-LABEL: PR15215_good:
146; X64: # BB#0: # %entry
147; X64-NEXT: # kill: %ECX<def> %ECX<kill> %RCX<def>
148; X64-NEXT: # kill: %EDX<def> %EDX<kill> %RDX<def>
149; X64-NEXT: # kill: %ESI<def> %ESI<kill> %RSI<def>
150; X64-NEXT: # kill: %EDI<def> %EDI<kill> %RDI<def>
151; X64-NEXT: andl $1, %edi
152; X64-NEXT: andl $1, %esi
153; X64-NEXT: andl $1, %edx
154; X64-NEXT: andl $1, %ecx
155; X64-NEXT: leal (%rdi,%rsi,2), %eax
156; X64-NEXT: leal (%rax,%rdx,4), %eax
157; X64-NEXT: leal (%rax,%rcx,8), %eax
158; X64-NEXT: retq
159;
Simon Pilgrim46a804c2017-10-03 16:56:57 +0000160; X64-SSE2-LABEL: PR15215_good:
161; X64-SSE2: # BB#0: # %entry
162; X64-SSE2-NEXT: movd %xmm0, %eax
163; X64-SSE2-NEXT: andl $1, %eax
164; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
165; X64-SSE2-NEXT: movd %xmm1, %ecx
166; X64-SSE2-NEXT: andl $1, %ecx
167; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
168; X64-SSE2-NEXT: movd %xmm1, %edx
169; X64-SSE2-NEXT: andl $1, %edx
170; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
171; X64-SSE2-NEXT: movd %xmm0, %esi
172; X64-SSE2-NEXT: andl $1, %esi
173; X64-SSE2-NEXT: leal (%rax,%rcx,2), %eax
174; X64-SSE2-NEXT: leal (%rax,%rdx,4), %eax
175; X64-SSE2-NEXT: leal (%rax,%rsi,8), %eax
176; X64-SSE2-NEXT: retq
177;
178; X64-AVX2-LABEL: PR15215_good:
179; X64-AVX2: # BB#0: # %entry
180; X64-AVX2-NEXT: vmovd %xmm0, %eax
181; X64-AVX2-NEXT: andl $1, %eax
182; X64-AVX2-NEXT: vpextrd $1, %xmm0, %ecx
183; X64-AVX2-NEXT: andl $1, %ecx
184; X64-AVX2-NEXT: vpextrd $2, %xmm0, %edx
185; X64-AVX2-NEXT: andl $1, %edx
186; X64-AVX2-NEXT: vpextrd $3, %xmm0, %esi
187; X64-AVX2-NEXT: andl $1, %esi
188; X64-AVX2-NEXT: leal (%rax,%rcx,2), %eax
189; X64-AVX2-NEXT: leal (%rax,%rdx,4), %eax
190; X64-AVX2-NEXT: leal (%rax,%rsi,8), %eax
191; X64-AVX2-NEXT: retq
192entry:
193 %0 = trunc <4 x i32> %input to <4 x i1>
194 %1 = extractelement <4 x i1> %0, i32 0
195 %e1 = select i1 %1, i32 1, i32 0
196 %2 = extractelement <4 x i1> %0, i32 1
197 %e2 = select i1 %2, i32 2, i32 0
198 %3 = extractelement <4 x i1> %0, i32 2
199 %e3 = select i1 %3, i32 4, i32 0
200 %4 = extractelement <4 x i1> %0, i32 3
201 %e4 = select i1 %4, i32 8, i32 0
202 %5 = or i32 %e1, %e2
203 %6 = or i32 %5, %e3
204 %7 = or i32 %6, %e4
205 ret i32 %7
206}