MachineCopyPropagation: Remove the copies instead of using KILL instructions.
[oota-llvm.git] / test / CodeGen / X86 / vector-zext.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 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
6
7 define <8 x i32> @zext_8i16_to_8i32(<8 x i16> %A) nounwind uwtable readnone ssp {
8 ; SSE2-LABEL: zext_8i16_to_8i32:
9 ; SSE2:       # BB#0: # %entry
10 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
11 ; SSE2-NEXT:    pxor %xmm2, %xmm2
12 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
13 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
14 ; SSE2-NEXT:    pand .LCPI0_0(%rip), %xmm1
15 ; SSE2-NEXT:    retq
16 ;
17 ; SSSE3-LABEL: zext_8i16_to_8i32:
18 ; SSSE3:       # BB#0: # %entry
19 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
20 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
21 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
22 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
23 ; SSSE3-NEXT:    pand .LCPI0_0(%rip), %xmm1
24 ; SSSE3-NEXT:    retq
25 ;
26 ; SSE41-LABEL: zext_8i16_to_8i32:
27 ; SSE41:       # BB#0: # %entry
28 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
29 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
30 ; SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
31 ; SSE41-NEXT:    pand .LCPI0_0(%rip), %xmm1
32 ; SSE41-NEXT:    retq
33 ;
34 ; AVX1-LABEL: zext_8i16_to_8i32:
35 ; AVX1:       # BB#0: # %entry
36 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
37 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm1 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
38 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
39 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
40 ; AVX1-NEXT:    retq
41 ;
42 ; AVX2-LABEL: zext_8i16_to_8i32:
43 ; AVX2:       # BB#0: # %entry
44 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
45 ; AVX2-NEXT:    retq
46 entry:
47   %B = zext <8 x i16> %A to <8 x i32>
48   ret <8 x i32>%B
49 }
50
51 define <4 x i64> @zext_4i32_to_4i64(<4 x i32> %A) nounwind uwtable readnone ssp {
52 ; SSE2-LABEL: zext_4i32_to_4i64:
53 ; SSE2:       # BB#0: # %entry
54 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,1,1,3]
55 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [4294967295,4294967295]
56 ; SSE2-NEXT:    pand %xmm3, %xmm2
57 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
58 ; SSE2-NEXT:    pand %xmm3, %xmm1
59 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
60 ; SSE2-NEXT:    retq
61 ;
62 ; SSSE3-LABEL: zext_4i32_to_4i64:
63 ; SSSE3:       # BB#0: # %entry
64 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,1,1,3]
65 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [4294967295,4294967295]
66 ; SSSE3-NEXT:    pand %xmm3, %xmm2
67 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
68 ; SSSE3-NEXT:    pand %xmm3, %xmm1
69 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
70 ; SSSE3-NEXT:    retq
71 ;
72 ; SSE41-LABEL: zext_4i32_to_4i64:
73 ; SSE41:       # BB#0: # %entry
74 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero
75 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [4294967295,4294967295]
76 ; SSE41-NEXT:    pand %xmm3, %xmm2
77 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
78 ; SSE41-NEXT:    pand %xmm3, %xmm1
79 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
80 ; SSE41-NEXT:    retq
81 ;
82 ; AVX1-LABEL: zext_4i32_to_4i64:
83 ; AVX1:       # BB#0: # %entry
84 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
85 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm1 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
86 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
87 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
88 ; AVX1-NEXT:    retq
89 ;
90 ; AVX2-LABEL: zext_4i32_to_4i64:
91 ; AVX2:       # BB#0: # %entry
92 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
93 ; AVX2-NEXT:    retq
94 entry:
95   %B = zext <4 x i32> %A to <4 x i64>
96   ret <4 x i64>%B
97 }
98
99 define <8 x i32> @zext_8i8_to_8i32(<8 x i8> %z) {
100 ; SSE2-LABEL: zext_8i8_to_8i32:
101 ; SSE2:       # BB#0: # %entry
102 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
103 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
104 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,255,255]
105 ; SSE2-NEXT:    pand %xmm1, %xmm2
106 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
107 ; SSE2-NEXT:    pand %xmm0, %xmm1
108 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
109 ; SSE2-NEXT:    retq
110 ;
111 ; SSSE3-LABEL: zext_8i8_to_8i32:
112 ; SSSE3:       # BB#0: # %entry
113 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
114 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
115 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,255,255]
116 ; SSSE3-NEXT:    pand %xmm1, %xmm2
117 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
118 ; SSSE3-NEXT:    pand %xmm0, %xmm1
119 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
120 ; SSSE3-NEXT:    retq
121 ;
122 ; SSE41-LABEL: zext_8i8_to_8i32:
123 ; SSE41:       # BB#0: # %entry
124 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
125 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,255,255]
126 ; SSE41-NEXT:    pand %xmm1, %xmm2
127 ; SSE41-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
128 ; SSE41-NEXT:    pand %xmm0, %xmm1
129 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
130 ; SSE41-NEXT:    retq
131 ;
132 ; AVX1-LABEL: zext_8i8_to_8i32:
133 ; AVX1:       # BB#0: # %entry
134 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
135 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
136 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
137 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
138 ; AVX1-NEXT:    retq
139 ;
140 ; AVX2-LABEL: zext_8i8_to_8i32:
141 ; AVX2:       # BB#0: # %entry
142 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
143 ; AVX2-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm1
144 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
145 ; AVX2-NEXT:    retq
146 entry:
147   %t = zext <8 x i8> %z to <8 x i32>
148   ret <8 x i32> %t
149 }
150
151 ; PR17654
152 define <16 x i16> @zext_16i8_to_16i16(<16 x i8> %z) {
153 ; SSE2-LABEL: zext_16i8_to_16i16:
154 ; SSE2:       # BB#0: # %entry
155 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
156 ; SSE2-NEXT:    pxor %xmm2, %xmm2
157 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
158 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
159 ; SSE2-NEXT:    pand .LCPI3_0(%rip), %xmm1
160 ; SSE2-NEXT:    retq
161 ;
162 ; SSSE3-LABEL: zext_16i8_to_16i16:
163 ; SSSE3:       # BB#0: # %entry
164 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
165 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
166 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
167 ; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
168 ; SSSE3-NEXT:    pand .LCPI3_0(%rip), %xmm1
169 ; SSSE3-NEXT:    retq
170 ;
171 ; SSE41-LABEL: zext_16i8_to_16i16:
172 ; SSE41:       # BB#0: # %entry
173 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
174 ; SSE41-NEXT:    pmovzxbw %xmm1, %xmm0 {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
175 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
176 ; SSE41-NEXT:    pand .LCPI3_0(%rip), %xmm1
177 ; SSE41-NEXT:    retq
178 ;
179 ; AVX1-LABEL: zext_16i8_to_16i16:
180 ; AVX1:       # BB#0: # %entry
181 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
182 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
183 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
184 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
185 ; AVX1-NEXT:    retq
186 ;
187 ; AVX2-LABEL: zext_16i8_to_16i16:
188 ; AVX2:       # BB#0: # %entry
189 ; AVX2-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
190 ; AVX2-NEXT:    retq
191 entry:
192   %t = zext <16 x i8> %z to <16 x i16>
193   ret <16 x i16> %t
194 }
195
196 define <16 x i16> @load_zext_16i8_to_16i16(<16 x i8> *%ptr) {
197 ; SSE2-LABEL: load_zext_16i8_to_16i16:
198 ; SSE2:        # BB#0: # %entry
199 ; SSE2-NEXT:   movdqa (%rdi), %xmm1
200 ; SSE2-NEXT:   pxor %xmm2, %xmm2
201 ; SSE2-NEXT:   movdqa %xmm1, %xmm0
202 ; SSE2-NEXT:   punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
203 ; SSE2-NEXT:   punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
204 ; SSE2-NEXT:   pand .LCPI4_0(%rip), %xmm1
205 ; SSE2-NEXT:   retq
206 ;
207 ; SSSE3-LABEL: load_zext_16i8_to_16i16:
208 ; SSSE3:        # BB#0: # %entry
209 ; SSSE3-NEXT:   movdqa (%rdi), %xmm1
210 ; SSSE3-NEXT:   pxor %xmm2, %xmm2
211 ; SSSE3-NEXT:   movdqa %xmm1, %xmm0
212 ; SSSE3-NEXT:   punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
213 ; SSSE3-NEXT:   punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
214 ; SSSE3-NEXT:   pand .LCPI4_0(%rip), %xmm1
215 ; SSSE3-NEXT:   retq
216 ;
217 ; SSE41-LABEL: load_zext_16i8_to_16i16:
218 ; SSE41:       # BB#0: # %entry
219 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
220 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
221 ; SSE41-NEXT:    retq
222 ;
223 ; AVX1-LABEL: load_zext_16i8_to_16i16:
224 ; AVX1:       # BB#0: # %entry
225 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
226 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
227 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
228 ; AVX1-NEXT:    retq
229 ;
230 ; AVX2-LABEL: load_zext_16i8_to_16i16:
231 ; AVX2:       # BB#0: # %entry
232 ; AVX2-NEXT:    vpmovzxbw {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero,mem[8],zero,mem[9],zero,mem[10],zero,mem[11],zero,mem[12],zero,mem[13],zero,mem[14],zero,mem[15],zero
233 ; AVX2-NEXT:    retq
234 entry:
235  %X = load <16 x i8>, <16 x i8>* %ptr
236  %Y = zext <16 x i8> %X to <16 x i16>
237  ret <16 x i16> %Y
238 }
239
240 define <8 x i32> @load_zext_8i16_to_8i32(<8 x i16> *%ptr) {
241 ; SSE2-LABEL: load_zext_8i16_to_8i32:
242 ; SSE2:          # BB#0: # %entry
243 ; SSE2-NEXT:   movdqa (%rdi), %xmm1
244 ; SSE2-NEXT:   pxor %xmm2, %xmm2
245 ; SSE2-NEXT:   movdqa %xmm1, %xmm0
246 ; SSE2-NEXT:   punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
247 ; SSE2-NEXT:   punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
248 ; SSE2-NEXT:   pand .LCPI5_0(%rip), %xmm1
249 ; SSE2-NEXT:   retq
250 ;
251 ; SSSE3-LABEL: load_zext_8i16_to_8i32:
252 ; SSSE3:        # BB#0: # %entry
253 ; SSSE3-NEXT:   movdqa (%rdi), %xmm1
254 ; SSSE3-NEXT:   pxor %xmm2, %xmm2
255 ; SSSE3-NEXT:   movdqa %xmm1, %xmm0
256 ; SSSE3-NEXT:   punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
257 ; SSSE3-NEXT:   punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
258 ; SSSE3-NEXT:   pand .LCPI5_0(%rip), %xmm1
259 ; SSSE3-NEXT:   retq
260 ;
261 ; SSE41-LABEL: load_zext_8i16_to_8i32:
262 ; SSE41:       # BB#0: # %entry
263 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
264 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
265 ; SSE41-NEXT:    retq
266 ;
267 ; AVX1-LABEL: load_zext_8i16_to_8i32:
268 ; AVX1:       # BB#0: # %entry
269 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
270 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
271 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
272 ; AVX1-NEXT:    retq
273 ;
274 ; AVX2-LABEL: load_zext_8i16_to_8i32:
275 ; AVX2:       # BB#0: # %entry
276 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
277 ; AVX2-NEXT:    retq
278 entry:
279  %X = load <8 x i16>, <8 x i16>* %ptr
280  %Y = zext <8 x i16> %X to <8 x i32>
281  ret <8 x i32>%Y
282 }
283
284 define <4 x i64> @load_zext_4i32_to_4i64(<4 x i32> *%ptr) {
285 ; SSE2-LABEL: load_zext_4i32_to_4i64:
286 ; SSE2:       # BB#0: # %entry
287 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
288 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,1,1,3]
289 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [4294967295,4294967295]
290 ; SSE2-NEXT:    pand %xmm2, %xmm0
291 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
292 ; SSE2-NEXT:    pand %xmm2, %xmm1
293 ; SSE2-NEXT:    retq
294 ;
295 ; SSSE3-LABEL: load_zext_4i32_to_4i64:
296 ; SSSE3:       # BB#0: # %entry
297 ; SSSE3-NEXT:    movdqa (%rdi), %xmm1
298 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,1,1,3]
299 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [4294967295,4294967295]
300 ; SSSE3-NEXT:    pand %xmm2, %xmm0
301 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
302 ; SSSE3-NEXT:    pand %xmm2, %xmm1
303 ; SSSE3-NEXT:    retq
304 ;
305 ; SSE41-LABEL: load_zext_4i32_to_4i64:
306 ; SSE41:       # BB#0: # %entry
307 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
308 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm1 = mem[0],zero,mem[1],zero
309 ; SSE41-NEXT:    retq
310 ;
311 ; AVX1-LABEL: load_zext_4i32_to_4i64:
312 ; AVX1:       # BB#0: # %entry
313 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
314 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = mem[0],zero,mem[1],zero
315 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
316 ; AVX1-NEXT:    retq
317 ;
318 ; AVX2-LABEL: load_zext_4i32_to_4i64:
319 ; AVX2:       # BB#0: # %entry
320 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
321 ; AVX2-NEXT:    retq
322 entry:
323  %X = load <4 x i32>, <4 x i32>* %ptr
324  %Y = zext <4 x i32> %X to <4 x i64>
325  ret <4 x i64>%Y
326 }
327
328 define <8 x i32> @shuf_zext_8i16_to_8i32(<8 x i16> %A) nounwind uwtable readnone ssp {
329 ; SSE2-LABEL: shuf_zext_8i16_to_8i32:
330 ; SSE2:       # BB#0: # %entry
331 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
332 ; SSE2-NEXT:    pxor %xmm2, %xmm2
333 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
334 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
335 ; SSE2-NEXT:    retq
336 ;
337 ; SSSE3-LABEL: shuf_zext_8i16_to_8i32:
338 ; SSSE3:       # BB#0: # %entry
339 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
340 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
341 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
342 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
343 ; SSSE3-NEXT:    retq
344 ;
345 ; SSE41-LABEL: shuf_zext_8i16_to_8i32:
346 ; SSE41:       # BB#0: # %entry
347 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
348 ; SSE41-NEXT:    pxor %xmm2, %xmm2
349 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
350 ; SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
351 ; SSE41-NEXT:    retq
352 ;
353 ; AVX1-LABEL: shuf_zext_8i16_to_8i32:
354 ; AVX1:       # BB#0: # %entry
355 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
356 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm1 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
357 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
358 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
359 ; AVX1-NEXT:    retq
360 ;
361 ; AVX2-LABEL: shuf_zext_8i16_to_8i32:
362 ; AVX2:       # BB#0: # %entry
363 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
364 ; AVX2-NEXT:    retq
365 entry:
366   %B = shufflevector <8 x i16> %A, <8 x i16> zeroinitializer, <16 x i32> <i32 0, i32 8, i32 1, i32 8, i32 2, i32 8, i32 3, i32 8, i32 4, i32 8, i32 5, i32 8, i32 6, i32 8, i32 7, i32 8>
367   %Z = bitcast <16 x i16> %B to <8 x i32>
368   ret <8 x i32> %Z
369 }
370
371 define <4 x i64> @shuf_zext_4i32_to_4i64(<4 x i32> %A) nounwind uwtable readnone ssp {
372 ; SSE2-LABEL: shuf_zext_4i32_to_4i64:
373 ; SSE2:       # BB#0: # %entry
374 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
375 ; SSE2-NEXT:    pxor %xmm2, %xmm2
376 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
377 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
378 ; SSE2-NEXT:    retq
379 ;
380 ; SSSE3-LABEL: shuf_zext_4i32_to_4i64:
381 ; SSSE3:       # BB#0: # %entry
382 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
383 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
384 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
385 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
386 ; SSSE3-NEXT:    retq
387 ;
388 ; SSE41-LABEL: shuf_zext_4i32_to_4i64:
389 ; SSE41:       # BB#0: # %entry
390 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
391 ; SSE41-NEXT:    pxor %xmm2, %xmm2
392 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero
393 ; SSE41-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
394 ; SSE41-NEXT:    retq
395 ;
396 ; AVX1-LABEL: shuf_zext_4i32_to_4i64:
397 ; AVX1:       # BB#0: # %entry
398 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero
399 ; AVX1-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
400 ; AVX1-NEXT:    vblendpd {{.*#+}} xmm0 = xmm2[0],xmm0[1]
401 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[2,0,3,0]
402 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
403 ; AVX1-NEXT:    retq
404 ;
405 ; AVX2-LABEL: shuf_zext_4i32_to_4i64:
406 ; AVX2:       # BB#0: # %entry
407 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
408 ; AVX2-NEXT:    retq
409 entry:
410   %B = shufflevector <4 x i32> %A, <4 x i32> zeroinitializer, <8 x i32> <i32 0, i32 4, i32 1, i32 4, i32 2, i32 4, i32 3, i32 4>
411   %Z = bitcast <8 x i32> %B to <4 x i64>
412   ret <4 x i64> %Z
413 }
414
415 define <8 x i32> @shuf_zext_8i8_to_8i32(<8 x i8> %A) {
416 ; SSE2-LABEL: shuf_zext_8i8_to_8i32:
417 ; SSE2:       # BB#0: # %entry
418 ; SSE2-NEXT:    pand .LCPI9_0(%rip), %xmm0
419 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
420 ; SSE2-NEXT:    pxor %xmm1, %xmm1
421 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
422 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
423 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
424 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
425 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
426 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255]
427 ; SSE2-NEXT:    pandn %xmm0, %xmm1
428 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
429 ; SSE2-NEXT:    retq
430 ;
431 ; SSSE3-LABEL: shuf_zext_8i8_to_8i32:
432 ; SSSE3:       # BB#0: # %entry
433 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
434 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
435 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
436 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
437 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
438 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
439 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero
440 ; SSSE3-NEXT:    retq
441 ;
442 ; SSE41-LABEL: shuf_zext_8i8_to_8i32:
443 ; SSE41:       # BB#0: # %entry
444 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
445 ; SSE41-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
446 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
447 ; SSE41-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero
448 ; SSE41-NEXT:    retq
449 ;
450 ; AVX1-LABEL: shuf_zext_8i8_to_8i32:
451 ; AVX1:       # BB#0: # %entry
452 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
453 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
454 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
455 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
456 ; AVX1-NEXT:    retq
457 ;
458 ; AVX2-LABEL: shuf_zext_8i8_to_8i32:
459 ; AVX2:       # BB#0: # %entry
460 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
461 ; AVX2-NEXT:    vpmovzxbd {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
462 ; AVX2-NEXT:    retq
463 entry:
464   %B = shufflevector <8 x i8> %A, <8 x i8> zeroinitializer, <32 x i32> <i32 0, i32 8, i32 8, i32 8, i32 1, i32 8, i32 8, i32 8, i32 2, i32 8, i32 8, i32 8, i32 3, i32 8, i32 8, i32 8, i32 4, i32 8, i32 8, i32 8, i32 5, i32 8, i32 8, i32 8, i32 6, i32 8, i32 8, i32 8, i32 7, i32 8, i32 8, i32 8>
465   %Z = bitcast <32 x i8> %B to <8 x i32>
466   ret <8 x i32> %Z
467 }