[x86] Clean up a few test cases with the update script. NFC
[oota-llvm.git] / test / CodeGen / X86 / vector-trunc.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+ssse3 | FileCheck %s --check-prefix=SSE --check-prefix=SSSE3
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
5
6 define <4 x i32> @trunc2x2i64(<2 x i64> %a, <2 x i64> %b) {
7 ; SSE-LABEL: trunc2x2i64:
8 ; SSE:       # BB#0: # %entry
9 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
10 ; SSE-NEXT:    retq
11 ;
12 ; AVX-LABEL: trunc2x2i64:
13 ; AVX:       # BB#0: # %entry
14 ; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
15 ; AVX-NEXT:    retq
16
17
18 entry:
19   %0 = trunc <2 x i64> %a to <2 x i32>
20   %1 = trunc <2 x i64> %b to <2 x i32>
21   %2 = shufflevector <2 x i32> %0, <2 x i32> %1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
22   ret <4 x i32> %2
23 }
24
25 define i64 @trunc2i64(<2 x i64> %inval) {
26 ; SSE-LABEL: trunc2i64:
27 ; SSE:       # BB#0: # %entry
28 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
29 ; SSE-NEXT:    movd %xmm0, %rax
30 ; SSE-NEXT:    retq
31 ;
32 ; AVX-LABEL: trunc2i64:
33 ; AVX:       # BB#0: # %entry
34 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
35 ; AVX-NEXT:    vmovq %xmm0, %rax
36 ; AVX-NEXT:    retq
37
38
39 entry:
40   %0 = trunc <2 x i64> %inval to <2 x i32>
41   %1 = bitcast <2 x i32> %0 to i64
42   ret i64 %1
43 }
44
45 define <8 x i16> @trunc2x4i32(<4 x i32> %a, <4 x i32> %b) {
46 ; SSE2-LABEL: trunc2x4i32:
47 ; SSE2:       # BB#0: # %entry
48 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
49 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,6,6,7]
50 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
51 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
52 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
53 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
54 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
55 ; SSE2-NEXT:    retq
56 ;
57 ; SSSE3-LABEL: trunc2x4i32:
58 ; SSSE3:       # BB#0: # %entry
59 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
60 ; SSSE3-NEXT:    pshufb %xmm2, %xmm1
61 ; SSSE3-NEXT:    pshufb %xmm2, %xmm0
62 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
63 ; SSSE3-NEXT:    retq
64 ;
65 ; SSE41-LABEL: trunc2x4i32:
66 ; SSE41:       # BB#0: # %entry
67 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
68 ; SSE41-NEXT:    pshufb %xmm2, %xmm1
69 ; SSE41-NEXT:    pshufb %xmm2, %xmm0
70 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
71 ; SSE41-NEXT:    retq
72 ;
73 ; AVX-LABEL: trunc2x4i32:
74 ; AVX:       # BB#0: # %entry
75 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
76 ; AVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
77 ; AVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
78 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
79 ; AVX-NEXT:    retq
80
81
82
83
84 entry:
85   %0 = trunc <4 x i32> %a to <4 x i16>
86   %1 = trunc <4 x i32> %b to <4 x i16>
87   %2 = shufflevector <4 x i16> %0, <4 x i16> %1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
88   ret <8 x i16> %2
89 }
90
91 ; PR15524 http://llvm.org/bugs/show_bug.cgi?id=15524
92 define i64 @trunc4i32(<4 x i32> %inval) {
93 ; SSE2-LABEL: trunc4i32:
94 ; SSE2:       # BB#0: # %entry
95 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
96 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
97 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
98 ; SSE2-NEXT:    movd %xmm0, %rax
99 ; SSE2-NEXT:    retq
100 ;
101 ; SSSE3-LABEL: trunc4i32:
102 ; SSSE3:       # BB#0: # %entry
103 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
104 ; SSSE3-NEXT:    movd %xmm0, %rax
105 ; SSSE3-NEXT:    retq
106 ;
107 ; SSE41-LABEL: trunc4i32:
108 ; SSE41:       # BB#0: # %entry
109 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
110 ; SSE41-NEXT:    movd %xmm0, %rax
111 ; SSE41-NEXT:    retq
112 ;
113 ; AVX-LABEL: trunc4i32:
114 ; AVX:       # BB#0: # %entry
115 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
116 ; AVX-NEXT:    vmovq %xmm0, %rax
117 ; AVX-NEXT:    retq
118
119
120
121
122 entry:
123   %0 = trunc <4 x i32> %inval to <4 x i16>
124   %1 = bitcast <4 x i16> %0 to i64
125   ret i64 %1
126 }
127
128 define <16 x i8> @trunc2x8i16(<8 x i16> %a, <8 x i16> %b) {
129 ; SSE2-LABEL: trunc2x8i16:
130 ; SSE2:       # BB#0: # %entry
131 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
132 ; SSE2-NEXT:    pand %xmm2, %xmm1
133 ; SSE2-NEXT:    pand %xmm2, %xmm0
134 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
135 ; SSE2-NEXT:    retq
136 ;
137 ; SSSE3-LABEL: trunc2x8i16:
138 ; SSSE3:       # BB#0: # %entry
139 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,2,4,6,8,10,12,14]
140 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
141 ; SSSE3-NEXT:    por %xmm1, %xmm0
142 ; SSSE3-NEXT:    retq
143 ;
144 ; SSE41-LABEL: trunc2x8i16:
145 ; SSE41:       # BB#0: # %entry
146 ; SSE41-NEXT:    pshufb {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,2,4,6,8,10,12,14]
147 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
148 ; SSE41-NEXT:    por %xmm1, %xmm0
149 ; SSE41-NEXT:    retq
150 ;
151 ; AVX-LABEL: trunc2x8i16:
152 ; AVX:       # BB#0: # %entry
153 ; AVX-NEXT:    vpshufb {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,2,4,6,8,10,12,14]
154 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
155 ; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
156 ; AVX-NEXT:    retq
157
158
159
160
161 entry:
162   %0 = trunc <8 x i16> %a to <8 x i8>
163   %1 = trunc <8 x i16> %b to <8 x i8>
164   %2 = shufflevector <8 x i8> %0, <8 x i8> %1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
165   ret <16 x i8> %2
166 }
167
168 ; PR15524 http://llvm.org/bugs/show_bug.cgi?id=15524
169 define i64 @trunc8i16(<8 x i16> %inval) {
170 ; SSE2-LABEL: trunc8i16:
171 ; SSE2:       # BB#0: # %entry
172 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
173 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
174 ; SSE2-NEXT:    movd %xmm0, %rax
175 ; SSE2-NEXT:    retq
176 ;
177 ; SSSE3-LABEL: trunc8i16:
178 ; SSSE3:       # BB#0: # %entry
179 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
180 ; SSSE3-NEXT:    movd %xmm0, %rax
181 ; SSSE3-NEXT:    retq
182 ;
183 ; SSE41-LABEL: trunc8i16:
184 ; SSE41:       # BB#0: # %entry
185 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
186 ; SSE41-NEXT:    movd %xmm0, %rax
187 ; SSE41-NEXT:    retq
188 ;
189 ; AVX-LABEL: trunc8i16:
190 ; AVX:       # BB#0: # %entry
191 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
192 ; AVX-NEXT:    vmovq %xmm0, %rax
193 ; AVX-NEXT:    retq
194
195
196
197
198 entry:
199   %0 = trunc <8 x i16> %inval to <8 x i8>
200   %1 = bitcast <8 x i8> %0 to i64
201   ret i64 %1
202 }