[x86] Enable the new vector shuffle lowering by default.
[oota-llvm.git] / test / CodeGen / X86 / vector-sext.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 ; Just one 32-bit run to make sure we do reasonable things there.
8 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mcpu=i686 -mattr=+sse4.1 | FileCheck %s --check-prefix=X32-SSE41
9
10 define <8 x i32> @sext_8i16_to_8i32(<8 x i16> %A) nounwind uwtable readnone ssp {
11 ; SSE2-LABEL: sext_8i16_to_8i32:
12 ; SSE2:       # BB#0: # %entry
13 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
14 ; SSE2-NEXT:   # kill: XMM0<def> XMM1<kill>
15 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
16 ; SSE2-NEXT:    pslld $16, %xmm0
17 ; SSE2-NEXT:    psrad $16, %xmm0
18 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
19 ; SSE2-NEXT:    pslld $16, %xmm1
20 ; SSE2-NEXT:    psrad $16, %xmm1
21 ; SSE2-NEXT:    retq
22 ;
23 ; SSSE3-LABEL: sext_8i16_to_8i32:
24 ; SSSE3:       # BB#0: # %entry
25 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
26 ; SSSE3-NEXT:   # kill: XMM0<def> XMM1<kill>
27 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
28 ; SSSE3-NEXT:    pslld $16, %xmm0
29 ; SSSE3-NEXT:    psrad $16, %xmm0
30 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
31 ; SSSE3-NEXT:    pslld $16, %xmm1
32 ; SSSE3-NEXT:    psrad $16, %xmm1
33 ; SSSE3-NEXT:    retq
34 ;
35 ; SSE41-LABEL: sext_8i16_to_8i32:
36 ; SSE41:       # BB#0: # %entry
37 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
38 ; SSE41-NEXT:    pmovzxwd %xmm1, %xmm0
39 ; SSE41-NEXT:    pslld $16, %xmm0
40 ; SSE41-NEXT:    psrad $16, %xmm0
41 ; SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
42 ; SSE41-NEXT:    pslld $16, %xmm1
43 ; SSE41-NEXT:    psrad $16, %xmm1
44 ; SSE41-NEXT:    retq
45 ;
46 ; AVX1-LABEL: sext_8i16_to_8i32:
47 ; AVX1:       # BB#0: # %entry
48 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
49 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
50 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
51 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
52 ; AVX1-NEXT:    retq
53 ;
54 ; AVX2-LABEL: sext_8i16_to_8i32:
55 ; AVX2:       # BB#0: # %entry
56 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
57 ; AVX2-NEXT:    retq
58 ;
59 ; X32-SSE41-LABEL: sext_8i16_to_8i32:
60 ; X32-SSE41:       # BB#0: # %entry
61 ; X32-SSE41-NEXT:    movdqa %xmm0, %xmm1
62 ; X32-SSE41-NEXT:    pmovzxwd %xmm1, %xmm0
63 ; X32-SSE41-NEXT:    pslld $16, %xmm0
64 ; X32-SSE41-NEXT:    psrad $16, %xmm0
65 ; X32-SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
66 ; X32-SSE41-NEXT:    pslld $16, %xmm1
67 ; X32-SSE41-NEXT:    psrad $16, %xmm1
68 ; X32-SSE41-NEXT:    retl
69 entry:
70   %B = sext <8 x i16> %A to <8 x i32>
71   ret <8 x i32>%B
72 }
73
74 define <4 x i64> @sext_4i32_to_4i64(<4 x i32> %A) nounwind uwtable readnone ssp {
75 ; SSE2-LABEL: sext_4i32_to_4i64:
76 ; SSE2:       # BB#0: # %entry
77 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,1,1,3]
78 ; SSE2-NEXT:    movd %xmm1, %rax
79 ; SSE2-NEXT:    cltq
80 ; SSE2-NEXT:    movd %rax, %xmm2
81 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
82 ; SSE2-NEXT:    movd %xmm1, %rax
83 ; SSE2-NEXT:    cltq
84 ; SSE2-NEXT:    movd %rax, %xmm1
85 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
86 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
87 ; SSE2-NEXT:    movd %xmm0, %rax
88 ; SSE2-NEXT:    cltq
89 ; SSE2-NEXT:    movd %rax, %xmm1
90 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
91 ; SSE2-NEXT:    movd %xmm0, %rax
92 ; SSE2-NEXT:    cltq
93 ; SSE2-NEXT:    movd %rax, %xmm0
94 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
95 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
96 ; SSE2-NEXT:    retq
97 ;
98 ; SSSE3-LABEL: sext_4i32_to_4i64:
99 ; SSSE3:       # BB#0: # %entry
100 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,1,1,3]
101 ; SSSE3-NEXT:    movd %xmm1, %rax
102 ; SSSE3-NEXT:    cltq
103 ; SSSE3-NEXT:    movd %rax, %xmm2
104 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
105 ; SSSE3-NEXT:    movd %xmm1, %rax
106 ; SSSE3-NEXT:    cltq
107 ; SSSE3-NEXT:    movd %rax, %xmm1
108 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
109 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
110 ; SSSE3-NEXT:    movd %xmm0, %rax
111 ; SSSE3-NEXT:    cltq
112 ; SSSE3-NEXT:    movd %rax, %xmm1
113 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
114 ; SSSE3-NEXT:    movd %xmm0, %rax
115 ; SSSE3-NEXT:    cltq
116 ; SSSE3-NEXT:    movd %rax, %xmm0
117 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
118 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
119 ; SSSE3-NEXT:    retq
120 ;
121 ; SSE41-LABEL: sext_4i32_to_4i64:
122 ; SSE41:       # BB#0: # %entry
123 ; SSE41-NEXT:    pmovzxdq %xmm0, %xmm1
124 ; SSE41-NEXT:    pextrq $1, %xmm1, %rax
125 ; SSE41-NEXT:    cltq
126 ; SSE41-NEXT:    movd %rax, %xmm3
127 ; SSE41-NEXT:    movd %xmm1, %rax
128 ; SSE41-NEXT:    cltq
129 ; SSE41-NEXT:    movd %rax, %xmm2
130 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
131 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
132 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
133 ; SSE41-NEXT:    cltq
134 ; SSE41-NEXT:    movd %rax, %xmm3
135 ; SSE41-NEXT:    movd %xmm0, %rax
136 ; SSE41-NEXT:    cltq
137 ; SSE41-NEXT:    movd %rax, %xmm1
138 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
139 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
140 ; SSE41-NEXT:    retq
141 ;
142 ; AVX1-LABEL: sext_4i32_to_4i64:
143 ; AVX1:       # BB#0: # %entry
144 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
145 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
146 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
147 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
148 ; AVX1-NEXT:    retq
149 ;
150 ; AVX2-LABEL: sext_4i32_to_4i64:
151 ; AVX2:       # BB#0: # %entry
152 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
153 ; AVX2-NEXT:    retq
154 ;
155 ; X32-SSE41-LABEL: sext_4i32_to_4i64:
156 ; X32-SSE41:       # BB#0: # %entry
157 ; X32-SSE41-NEXT:    pmovzxdq %xmm0, %xmm2
158 ; X32-SSE41-NEXT:    movd %xmm2, %eax
159 ; X32-SSE41-NEXT:    sarl $31, %eax
160 ; X32-SSE41-NEXT:    pextrd $2, %xmm2, %ecx
161 ; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm2
162 ; X32-SSE41-NEXT:    sarl $31, %ecx
163 ; X32-SSE41-NEXT:    pinsrd $3, %ecx, %xmm2
164 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
165 ; X32-SSE41-NEXT:    movd %xmm1, %eax
166 ; X32-SSE41-NEXT:    sarl $31, %eax
167 ; X32-SSE41-NEXT:    pextrd $2, %xmm1, %ecx
168 ; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm1
169 ; X32-SSE41-NEXT:    sarl $31, %ecx
170 ; X32-SSE41-NEXT:    pinsrd $3, %ecx, %xmm1
171 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
172 ; X32-SSE41-NEXT:    retl
173 entry:
174   %B = sext <4 x i32> %A to <4 x i64>
175   ret <4 x i64>%B
176 }
177
178 define <4 x i32> @load_sext_test1(<4 x i16> *%ptr) {
179 ; SSE2-LABEL: load_sext_test1:
180 ; SSE2:       # BB#0: # %entry
181 ; SSE2-NEXT:    movq (%rdi), %xmm0
182 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
183 ; SSE2-NEXT:    psrad $16, %xmm0
184 ; SSE2-NEXT:    retq
185 ;
186 ; SSSE3-LABEL: load_sext_test1:
187 ; SSSE3:       # BB#0: # %entry
188 ; SSSE3-NEXT:    movq (%rdi), %xmm0
189 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
190 ; SSSE3-NEXT:    psrad $16, %xmm0
191 ; SSSE3-NEXT:    retq
192 ;
193 ; SSE41-LABEL: load_sext_test1:
194 ; SSE41:       # BB#0: # %entry
195 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
196 ; SSE41-NEXT:    retq
197 ;
198 ; AVX-LABEL: load_sext_test1:
199 ; AVX:       # BB#0: # %entry
200 ; AVX-NEXT:    vpmovsxwd (%rdi), %xmm0
201 ; AVX-NEXT:    retq
202 ;
203 ; X32-SSE41-LABEL: load_sext_test1:
204 ; X32-SSE41:       # BB#0: # %entry
205 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
206 ; X32-SSE41-NEXT:    pmovsxwd (%eax), %xmm0
207 ; X32-SSE41-NEXT:    retl
208 entry:
209  %X = load <4 x i16>* %ptr
210  %Y = sext <4 x i16> %X to <4 x i32>
211  ret <4 x i32>%Y
212 }
213
214 define <4 x i32> @load_sext_test2(<4 x i8> *%ptr) {
215 ; SSE2-LABEL: load_sext_test2:
216 ; SSE2:       # BB#0: # %entry
217 ; SSE2-NEXT:    movd (%rdi), %xmm0
218 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
219 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
220 ; SSE2-NEXT:    psrad $24, %xmm0
221 ; SSE2-NEXT:    retq
222 ;
223 ; SSSE3-LABEL: load_sext_test2:
224 ; SSSE3:       # BB#0: # %entry
225 ; SSSE3-NEXT:    movd (%rdi), %xmm0
226 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
227 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
228 ; SSSE3-NEXT:    psrad $24, %xmm0
229 ; SSSE3-NEXT:    retq
230 ;
231 ; SSE41-LABEL: load_sext_test2:
232 ; SSE41:       # BB#0: # %entry
233 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
234 ; SSE41-NEXT:    retq
235 ;
236 ; AVX-LABEL: load_sext_test2:
237 ; AVX:       # BB#0: # %entry
238 ; AVX-NEXT:    vpmovsxbd (%rdi), %xmm0
239 ; AVX-NEXT:    retq
240 ;
241 ; X32-SSE41-LABEL: load_sext_test2:
242 ; X32-SSE41:       # BB#0: # %entry
243 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
244 ; X32-SSE41-NEXT:    pmovsxbd (%eax), %xmm0
245 ; X32-SSE41-NEXT:    retl
246 entry:
247  %X = load <4 x i8>* %ptr
248  %Y = sext <4 x i8> %X to <4 x i32>
249  ret <4 x i32>%Y
250 }
251
252 define <2 x i64> @load_sext_test3(<2 x i8> *%ptr) {
253 ; SSE2-LABEL: load_sext_test3:
254 ; SSE2:       # BB#0: # %entry
255 ; SSE2-NEXT:    movsbq 1(%rdi), %rax
256 ; SSE2-NEXT:    movd %rax, %xmm1
257 ; SSE2-NEXT:    movsbq (%rdi), %rax
258 ; SSE2-NEXT:    movd %rax, %xmm0
259 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
260 ; SSE2-NEXT:    retq
261 ;
262 ; SSSE3-LABEL: load_sext_test3:
263 ; SSSE3:       # BB#0: # %entry
264 ; SSSE3-NEXT:    movsbq 1(%rdi), %rax
265 ; SSSE3-NEXT:    movd %rax, %xmm1
266 ; SSSE3-NEXT:    movsbq (%rdi), %rax
267 ; SSSE3-NEXT:    movd %rax, %xmm0
268 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
269 ; SSSE3-NEXT:    retq
270 ;
271 ; SSE41-LABEL: load_sext_test3:
272 ; SSE41:       # BB#0: # %entry
273 ; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
274 ; SSE41-NEXT:    retq
275 ;
276 ; AVX-LABEL: load_sext_test3:
277 ; AVX:       # BB#0: # %entry
278 ; AVX-NEXT:    vpmovsxbq (%rdi), %xmm0
279 ; AVX-NEXT:    retq
280 ;
281 ; X32-SSE41-LABEL: load_sext_test3:
282 ; X32-SSE41:       # BB#0: # %entry
283 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
284 ; X32-SSE41-NEXT:    pmovsxbq (%eax), %xmm0
285 ; X32-SSE41-NEXT:    retl
286 entry:
287  %X = load <2 x i8>* %ptr
288  %Y = sext <2 x i8> %X to <2 x i64>
289  ret <2 x i64>%Y
290 }
291
292 define <2 x i64> @load_sext_test4(<2 x i16> *%ptr) {
293 ; SSE2-LABEL: load_sext_test4:
294 ; SSE2:       # BB#0: # %entry
295 ; SSE2-NEXT:    movswq 2(%rdi), %rax
296 ; SSE2-NEXT:    movd %rax, %xmm1
297 ; SSE2-NEXT:    movswq (%rdi), %rax
298 ; SSE2-NEXT:    movd %rax, %xmm0
299 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
300 ; SSE2-NEXT:    retq
301 ;
302 ; SSSE3-LABEL: load_sext_test4:
303 ; SSSE3:       # BB#0: # %entry
304 ; SSSE3-NEXT:    movswq 2(%rdi), %rax
305 ; SSSE3-NEXT:    movd %rax, %xmm1
306 ; SSSE3-NEXT:    movswq (%rdi), %rax
307 ; SSSE3-NEXT:    movd %rax, %xmm0
308 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
309 ; SSSE3-NEXT:    retq
310 ;
311 ; SSE41-LABEL: load_sext_test4:
312 ; SSE41:       # BB#0: # %entry
313 ; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
314 ; SSE41-NEXT:    retq
315 ;
316 ; AVX-LABEL: load_sext_test4:
317 ; AVX:       # BB#0: # %entry
318 ; AVX-NEXT:    vpmovsxwq (%rdi), %xmm0
319 ; AVX-NEXT:    retq
320 ;
321 ; X32-SSE41-LABEL: load_sext_test4:
322 ; X32-SSE41:       # BB#0: # %entry
323 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
324 ; X32-SSE41-NEXT:    pmovsxwq (%eax), %xmm0
325 ; X32-SSE41-NEXT:    retl
326 entry:
327  %X = load <2 x i16>* %ptr
328  %Y = sext <2 x i16> %X to <2 x i64>
329  ret <2 x i64>%Y
330 }
331
332 define <2 x i64> @load_sext_test5(<2 x i32> *%ptr) {
333 ; SSE2-LABEL: load_sext_test5:
334 ; SSE2:       # BB#0: # %entry
335 ; SSE2-NEXT:    movslq 4(%rdi), %rax
336 ; SSE2-NEXT:    movd %rax, %xmm1
337 ; SSE2-NEXT:    movslq (%rdi), %rax
338 ; SSE2-NEXT:    movd %rax, %xmm0
339 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
340 ; SSE2-NEXT:    retq
341 ;
342 ; SSSE3-LABEL: load_sext_test5:
343 ; SSSE3:       # BB#0: # %entry
344 ; SSSE3-NEXT:    movslq 4(%rdi), %rax
345 ; SSSE3-NEXT:    movd %rax, %xmm1
346 ; SSSE3-NEXT:    movslq (%rdi), %rax
347 ; SSSE3-NEXT:    movd %rax, %xmm0
348 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
349 ; SSSE3-NEXT:    retq
350 ;
351 ; SSE41-LABEL: load_sext_test5:
352 ; SSE41:       # BB#0: # %entry
353 ; SSE41-NEXT:    pmovsxdq (%rdi), %xmm0
354 ; SSE41-NEXT:    retq
355 ;
356 ; AVX-LABEL: load_sext_test5:
357 ; AVX:       # BB#0: # %entry
358 ; AVX-NEXT:    vpmovsxdq (%rdi), %xmm0
359 ; AVX-NEXT:    retq
360 ;
361 ; X32-SSE41-LABEL: load_sext_test5:
362 ; X32-SSE41:       # BB#0: # %entry
363 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
364 ; X32-SSE41-NEXT:    pmovsxdq (%eax), %xmm0
365 ; X32-SSE41-NEXT:    retl
366 entry:
367  %X = load <2 x i32>* %ptr
368  %Y = sext <2 x i32> %X to <2 x i64>
369  ret <2 x i64>%Y
370 }
371
372 define <8 x i16> @load_sext_test6(<8 x i8> *%ptr) {
373 ; SSE2-LABEL: load_sext_test6:
374 ; SSE2:       # BB#0: # %entry
375 ; SSE2-NEXT:    movq (%rdi), %xmm0
376 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
377 ; SSE2-NEXT:    psraw $8, %xmm0
378 ; SSE2-NEXT:    retq
379 ;
380 ; SSSE3-LABEL: load_sext_test6:
381 ; SSSE3:       # BB#0: # %entry
382 ; SSSE3-NEXT:    movq (%rdi), %xmm0
383 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
384 ; SSSE3-NEXT:    psraw $8, %xmm0
385 ; SSSE3-NEXT:    retq
386 ;
387 ; SSE41-LABEL: load_sext_test6:
388 ; SSE41:       # BB#0: # %entry
389 ; SSE41-NEXT:    pmovsxbw (%rdi), %xmm0
390 ; SSE41-NEXT:    retq
391 ;
392 ; AVX-LABEL: load_sext_test6:
393 ; AVX:       # BB#0: # %entry
394 ; AVX-NEXT:    vpmovsxbw (%rdi), %xmm0
395 ; AVX-NEXT:    retq
396 ;
397 ; X32-SSE41-LABEL: load_sext_test6:
398 ; X32-SSE41:       # BB#0: # %entry
399 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
400 ; X32-SSE41-NEXT:    pmovsxbw (%eax), %xmm0
401 ; X32-SSE41-NEXT:    retl
402 entry:
403  %X = load <8 x i8>* %ptr
404  %Y = sext <8 x i8> %X to <8 x i16>
405  ret <8 x i16>%Y
406 }
407
408 define <4 x i64> @sext_4i1_to_4i64(<4 x i1> %mask) {
409 ; SSE2-LABEL: sext_4i1_to_4i64:
410 ; SSE2:       # BB#0:
411 ; SSE2-NEXT:    pslld $31, %xmm0
412 ; SSE2-NEXT:    psrad $31, %xmm0
413 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,1,1,3]
414 ; SSE2-NEXT:    movd %xmm1, %rax
415 ; SSE2-NEXT:    cltq
416 ; SSE2-NEXT:    movd %rax, %xmm2
417 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
418 ; SSE2-NEXT:    movd %xmm1, %rax
419 ; SSE2-NEXT:    cltq
420 ; SSE2-NEXT:    movd %rax, %xmm1
421 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
422 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
423 ; SSE2-NEXT:    movd %xmm0, %rax
424 ; SSE2-NEXT:    cltq
425 ; SSE2-NEXT:    movd %rax, %xmm1
426 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
427 ; SSE2-NEXT:    movd %xmm0, %rax
428 ; SSE2-NEXT:    cltq
429 ; SSE2-NEXT:    movd %rax, %xmm0
430 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
431 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
432 ; SSE2-NEXT:    retq
433 ;
434 ; SSSE3-LABEL: sext_4i1_to_4i64:
435 ; SSSE3:       # BB#0:
436 ; SSSE3-NEXT:    pslld $31, %xmm0
437 ; SSSE3-NEXT:    psrad $31, %xmm0
438 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,1,1,3]
439 ; SSSE3-NEXT:    movd %xmm1, %rax
440 ; SSSE3-NEXT:    cltq
441 ; SSSE3-NEXT:    movd %rax, %xmm2
442 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
443 ; SSSE3-NEXT:    movd %xmm1, %rax
444 ; SSSE3-NEXT:    cltq
445 ; SSSE3-NEXT:    movd %rax, %xmm1
446 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
447 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
448 ; SSSE3-NEXT:    movd %xmm0, %rax
449 ; SSSE3-NEXT:    cltq
450 ; SSSE3-NEXT:    movd %rax, %xmm1
451 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
452 ; SSSE3-NEXT:    movd %xmm0, %rax
453 ; SSSE3-NEXT:    cltq
454 ; SSSE3-NEXT:    movd %rax, %xmm0
455 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
456 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
457 ; SSSE3-NEXT:    retq
458 ;
459 ; SSE41-LABEL: sext_4i1_to_4i64:
460 ; SSE41:       # BB#0:
461 ; SSE41-NEXT:    pslld $31, %xmm0
462 ; SSE41-NEXT:    psrad $31, %xmm0
463 ; SSE41-NEXT:    pmovzxdq %xmm0, %xmm1
464 ; SSE41-NEXT:    pextrq $1, %xmm1, %rax
465 ; SSE41-NEXT:    cltq
466 ; SSE41-NEXT:    movd %rax, %xmm3
467 ; SSE41-NEXT:    movd %xmm1, %rax
468 ; SSE41-NEXT:    cltq
469 ; SSE41-NEXT:    movd %rax, %xmm2
470 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
471 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
472 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
473 ; SSE41-NEXT:    cltq
474 ; SSE41-NEXT:    movd %rax, %xmm3
475 ; SSE41-NEXT:    movd %xmm0, %rax
476 ; SSE41-NEXT:    cltq
477 ; SSE41-NEXT:    movd %rax, %xmm1
478 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
479 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
480 ; SSE41-NEXT:    retq
481 ;
482 ; AVX1-LABEL: sext_4i1_to_4i64:
483 ; AVX1:       # BB#0:
484 ; AVX1-NEXT:    vpslld $31, %xmm0, %xmm0
485 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm0
486 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
487 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
488 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
489 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
490 ; AVX1-NEXT:    retq
491 ;
492 ; AVX2-LABEL: sext_4i1_to_4i64:
493 ; AVX2:       # BB#0:
494 ; AVX2-NEXT:    vpslld $31, %xmm0, %xmm0
495 ; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm0
496 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
497 ; AVX2-NEXT:    retq
498 ;
499 ; X32-SSE41-LABEL: sext_4i1_to_4i64:
500 ; X32-SSE41:       # BB#0:
501 ; X32-SSE41-NEXT:    pslld $31, %xmm0
502 ; X32-SSE41-NEXT:    psrad $31, %xmm0
503 ; X32-SSE41-NEXT:    pmovzxdq %xmm0, %xmm2
504 ; X32-SSE41-NEXT:    movd %xmm2, %eax
505 ; X32-SSE41-NEXT:    sarl $31, %eax
506 ; X32-SSE41-NEXT:    pextrd $2, %xmm2, %ecx
507 ; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm2
508 ; X32-SSE41-NEXT:    sarl $31, %ecx
509 ; X32-SSE41-NEXT:    pinsrd $3, %ecx, %xmm2
510 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
511 ; X32-SSE41-NEXT:    movd %xmm1, %eax
512 ; X32-SSE41-NEXT:    sarl $31, %eax
513 ; X32-SSE41-NEXT:    pextrd $2, %xmm1, %ecx
514 ; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm1
515 ; X32-SSE41-NEXT:    sarl $31, %ecx
516 ; X32-SSE41-NEXT:    pinsrd $3, %ecx, %xmm1
517 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
518 ; X32-SSE41-NEXT:    retl
519   %extmask = sext <4 x i1> %mask to <4 x i64>
520   ret <4 x i64> %extmask
521 }
522
523 define <16 x i16> @sext_16i8_to_16i16(<16 x i8> *%ptr) {
524 ; SSE2-LABEL: sext_16i8_to_16i16:
525 ; SSE2:       # BB#0: # %entry
526 ; SSE2-NEXT:    movdqa (%rdi), %xmm1
527 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
528 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
529 ; SSE2-NEXT:    psllw $8, %xmm0
530 ; SSE2-NEXT:    psraw $8, %xmm0
531 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
532 ; SSE2-NEXT:    psllw $8, %xmm1
533 ; SSE2-NEXT:    psraw $8, %xmm1
534 ; SSE2-NEXT:    retq
535 ;
536 ; SSSE3-LABEL: sext_16i8_to_16i16:
537 ; SSSE3:       # BB#0: # %entry
538 ; SSSE3-NEXT:    movdqa (%rdi), %xmm1
539 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
540 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
541 ; SSSE3-NEXT:    psllw $8, %xmm0
542 ; SSSE3-NEXT:    psraw $8, %xmm0
543 ; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
544 ; SSSE3-NEXT:    psllw $8, %xmm1
545 ; SSSE3-NEXT:    psraw $8, %xmm1
546 ; SSSE3-NEXT:    retq
547 ;
548 ; SSE41-LABEL: sext_16i8_to_16i16:
549 ; SSE41:       # BB#0: # %entry
550 ; SSE41-NEXT:    movdqa (%rdi), %xmm1
551 ; SSE41-NEXT:    pmovzxbw %xmm1, %xmm0
552 ; SSE41-NEXT:    psllw $8, %xmm0
553 ; SSE41-NEXT:    psraw $8, %xmm0
554 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
555 ; SSE41-NEXT:    psllw $8, %xmm1
556 ; SSE41-NEXT:    psraw $8, %xmm1
557 ; SSE41-NEXT:    retq
558 ;
559 ; AVX1-LABEL: sext_16i8_to_16i16:
560 ; AVX1:       # BB#0: # %entry
561 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
562 ; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm1
563 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
564 ; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm0
565 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
566 ; AVX1-NEXT:    retq
567 ;
568 ; AVX2-LABEL: sext_16i8_to_16i16:
569 ; AVX2:       # BB#0: # %entry
570 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
571 ; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm0
572 ; AVX2-NEXT:    retq
573 ;
574 ; X32-SSE41-LABEL: sext_16i8_to_16i16:
575 ; X32-SSE41:       # BB#0: # %entry
576 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
577 ; X32-SSE41-NEXT:    movdqa (%eax), %xmm1
578 ; X32-SSE41-NEXT:    pmovzxbw %xmm1, %xmm0
579 ; X32-SSE41-NEXT:    psllw $8, %xmm0
580 ; X32-SSE41-NEXT:    psraw $8, %xmm0
581 ; X32-SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
582 ; X32-SSE41-NEXT:    psllw $8, %xmm1
583 ; X32-SSE41-NEXT:    psraw $8, %xmm1
584 ; X32-SSE41-NEXT:    retl
585 entry:
586  %X = load <16 x i8>* %ptr
587  %Y = sext <16 x i8> %X to <16 x i16>
588  ret <16 x i16> %Y
589 }
590
591 define <4 x i64> @sext_4i8_to_4i64(<4 x i8> %mask) {
592 ; SSE2-LABEL: sext_4i8_to_4i64:
593 ; SSE2:       # BB#0:
594 ; SSE2-NEXT:    pslld $24, %xmm0
595 ; SSE2-NEXT:    psrad $24, %xmm0
596 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,1,1,3]
597 ; SSE2-NEXT:    movd %xmm1, %rax
598 ; SSE2-NEXT:    cltq
599 ; SSE2-NEXT:    movd %rax, %xmm2
600 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
601 ; SSE2-NEXT:    movd %xmm1, %rax
602 ; SSE2-NEXT:    cltq
603 ; SSE2-NEXT:    movd %rax, %xmm1
604 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
605 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
606 ; SSE2-NEXT:    movd %xmm0, %rax
607 ; SSE2-NEXT:    cltq
608 ; SSE2-NEXT:    movd %rax, %xmm1
609 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
610 ; SSE2-NEXT:    movd %xmm0, %rax
611 ; SSE2-NEXT:    cltq
612 ; SSE2-NEXT:    movd %rax, %xmm0
613 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
614 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
615 ; SSE2-NEXT:    retq
616 ;
617 ; SSSE3-LABEL: sext_4i8_to_4i64:
618 ; SSSE3:       # BB#0:
619 ; SSSE3-NEXT:    pslld $24, %xmm0
620 ; SSSE3-NEXT:    psrad $24, %xmm0
621 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,1,1,3]
622 ; SSSE3-NEXT:    movd %xmm1, %rax
623 ; SSSE3-NEXT:    cltq
624 ; SSSE3-NEXT:    movd %rax, %xmm2
625 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
626 ; SSSE3-NEXT:    movd %xmm1, %rax
627 ; SSSE3-NEXT:    cltq
628 ; SSSE3-NEXT:    movd %rax, %xmm1
629 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
630 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
631 ; SSSE3-NEXT:    movd %xmm0, %rax
632 ; SSSE3-NEXT:    cltq
633 ; SSSE3-NEXT:    movd %rax, %xmm1
634 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
635 ; SSSE3-NEXT:    movd %xmm0, %rax
636 ; SSSE3-NEXT:    cltq
637 ; SSSE3-NEXT:    movd %rax, %xmm0
638 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
639 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
640 ; SSSE3-NEXT:    retq
641 ;
642 ; SSE41-LABEL: sext_4i8_to_4i64:
643 ; SSE41:       # BB#0:
644 ; SSE41-NEXT:    pslld $24, %xmm0
645 ; SSE41-NEXT:    psrad $24, %xmm0
646 ; SSE41-NEXT:    pmovzxdq %xmm0, %xmm1
647 ; SSE41-NEXT:    pextrq $1, %xmm1, %rax
648 ; SSE41-NEXT:    cltq
649 ; SSE41-NEXT:    movd %rax, %xmm3
650 ; SSE41-NEXT:    movd %xmm1, %rax
651 ; SSE41-NEXT:    cltq
652 ; SSE41-NEXT:    movd %rax, %xmm2
653 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
654 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
655 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
656 ; SSE41-NEXT:    cltq
657 ; SSE41-NEXT:    movd %rax, %xmm3
658 ; SSE41-NEXT:    movd %xmm0, %rax
659 ; SSE41-NEXT:    cltq
660 ; SSE41-NEXT:    movd %rax, %xmm1
661 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
662 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
663 ; SSE41-NEXT:    retq
664 ;
665 ; AVX1-LABEL: sext_4i8_to_4i64:
666 ; AVX1:       # BB#0:
667 ; AVX1-NEXT:    vpslld $24, %xmm0, %xmm0
668 ; AVX1-NEXT:    vpsrad $24, %xmm0, %xmm0
669 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
670 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
671 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
672 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
673 ; AVX1-NEXT:    retq
674 ;
675 ; AVX2-LABEL: sext_4i8_to_4i64:
676 ; AVX2:       # BB#0:
677 ; AVX2-NEXT:    vpslld $24, %xmm0, %xmm0
678 ; AVX2-NEXT:    vpsrad $24, %xmm0, %xmm0
679 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
680 ; AVX2-NEXT:    retq
681 ;
682 ; X32-SSE41-LABEL: sext_4i8_to_4i64:
683 ; X32-SSE41:       # BB#0:
684 ; X32-SSE41-NEXT:    pslld $24, %xmm0
685 ; X32-SSE41-NEXT:    psrad $24, %xmm0
686 ; X32-SSE41-NEXT:    pmovzxdq %xmm0, %xmm2
687 ; X32-SSE41-NEXT:    movd %xmm2, %eax
688 ; X32-SSE41-NEXT:    sarl $31, %eax
689 ; X32-SSE41-NEXT:    pextrd $2, %xmm2, %ecx
690 ; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm2
691 ; X32-SSE41-NEXT:    sarl $31, %ecx
692 ; X32-SSE41-NEXT:    pinsrd $3, %ecx, %xmm2
693 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
694 ; X32-SSE41-NEXT:    movd %xmm1, %eax
695 ; X32-SSE41-NEXT:    sarl $31, %eax
696 ; X32-SSE41-NEXT:    pextrd $2, %xmm1, %ecx
697 ; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm1
698 ; X32-SSE41-NEXT:    sarl $31, %ecx
699 ; X32-SSE41-NEXT:    pinsrd $3, %ecx, %xmm1
700 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
701 ; X32-SSE41-NEXT:    retl
702   %extmask = sext <4 x i8> %mask to <4 x i64>
703   ret <4 x i64> %extmask
704 }
705
706 define <4 x i64> @load_sext_4i8_to_4i64(<4 x i8> *%ptr) {
707 ; SSE2-LABEL: load_sext_4i8_to_4i64:
708 ; SSE2:       # BB#0: # %entry
709 ; SSE2-NEXT:    movd (%rdi), %xmm1
710 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
711 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
712 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,1,1,3]
713 ; SSE2-NEXT:    movd %xmm2, %rax
714 ; SSE2-NEXT:    movsbq %al, %rax
715 ; SSE2-NEXT:    movd %rax, %xmm0
716 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
717 ; SSE2-NEXT:    movd %xmm2, %rax
718 ; SSE2-NEXT:    movsbq %al, %rax
719 ; SSE2-NEXT:    movd %rax, %xmm2
720 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
721 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,2,3,3]
722 ; SSE2-NEXT:    movd %xmm2, %rax
723 ; SSE2-NEXT:    movsbq %al, %rax
724 ; SSE2-NEXT:    movd %rax, %xmm1
725 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
726 ; SSE2-NEXT:    movd %xmm2, %rax
727 ; SSE2-NEXT:    movsbq %al, %rax
728 ; SSE2-NEXT:    movd %rax, %xmm2
729 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
730 ; SSE2-NEXT:    retq
731 ;
732 ; SSSE3-LABEL: load_sext_4i8_to_4i64:
733 ; SSSE3:       # BB#0: # %entry
734 ; SSSE3-NEXT:    movd (%rdi), %xmm1
735 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
736 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
737 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,1,1,3]
738 ; SSSE3-NEXT:    movd %xmm2, %rax
739 ; SSSE3-NEXT:    movsbq %al, %rax
740 ; SSSE3-NEXT:    movd %rax, %xmm0
741 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
742 ; SSSE3-NEXT:    movd %xmm2, %rax
743 ; SSSE3-NEXT:    movsbq %al, %rax
744 ; SSSE3-NEXT:    movd %rax, %xmm2
745 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
746 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,2,3,3]
747 ; SSSE3-NEXT:    movd %xmm2, %rax
748 ; SSSE3-NEXT:    movsbq %al, %rax
749 ; SSSE3-NEXT:    movd %rax, %xmm1
750 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
751 ; SSSE3-NEXT:    movd %xmm2, %rax
752 ; SSSE3-NEXT:    movsbq %al, %rax
753 ; SSSE3-NEXT:    movd %rax, %xmm2
754 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
755 ; SSSE3-NEXT:    retq
756 ;
757 ; SSE41-LABEL: load_sext_4i8_to_4i64:
758 ; SSE41:       # BB#0: # %entry
759 ; SSE41-NEXT:    pmovzxbd (%rdi), %xmm1
760 ; SSE41-NEXT:    pmovzxdq %xmm1, %xmm0
761 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
762 ; SSE41-NEXT:    movsbq %al, %rax
763 ; SSE41-NEXT:    movd %rax, %xmm2
764 ; SSE41-NEXT:    movd %xmm0, %rax
765 ; SSE41-NEXT:    movsbq %al, %rax
766 ; SSE41-NEXT:    movd %rax, %xmm0
767 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
768 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
769 ; SSE41-NEXT:    pextrq $1, %xmm1, %rax
770 ; SSE41-NEXT:    movsbq %al, %rax
771 ; SSE41-NEXT:    movd %rax, %xmm2
772 ; SSE41-NEXT:    movd %xmm1, %rax
773 ; SSE41-NEXT:    movsbq %al, %rax
774 ; SSE41-NEXT:    movd %rax, %xmm1
775 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
776 ; SSE41-NEXT:    retq
777 ;
778 ; AVX1-LABEL: load_sext_4i8_to_4i64:
779 ; AVX1:       # BB#0: # %entry
780 ; AVX1-NEXT:    vpmovsxbd (%rdi), %xmm0
781 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
782 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
783 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
784 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
785 ; AVX1-NEXT:    retq
786 ;
787 ; AVX2-LABEL: load_sext_4i8_to_4i64:
788 ; AVX2:       # BB#0: # %entry
789 ; AVX2-NEXT:    vpmovsxbq (%rdi), %ymm0
790 ; AVX2-NEXT:    retq
791 ;
792 ; X32-SSE41-LABEL: load_sext_4i8_to_4i64:
793 ; X32-SSE41:       # BB#0: # %entry
794 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
795 ; X32-SSE41-NEXT:    movd (%eax), %xmm0
796 ; X32-SSE41-NEXT:    pmovzxbd %xmm0, %xmm1
797 ; X32-SSE41-NEXT:    pmovzxbq %xmm0, %xmm2
798 ; X32-SSE41-NEXT:    movd %xmm2, %eax
799 ; X32-SSE41-NEXT:    movsbl %al, %eax
800 ; X32-SSE41-NEXT:    movd %eax, %xmm0
801 ; X32-SSE41-NEXT:    sarl $31, %eax
802 ; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm0
803 ; X32-SSE41-NEXT:    pextrd $2, %xmm2, %eax
804 ; X32-SSE41-NEXT:    movsbl %al, %eax
805 ; X32-SSE41-NEXT:    pinsrd $2, %eax, %xmm0
806 ; X32-SSE41-NEXT:    sarl $31, %eax
807 ; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm0
808 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,2,3,3]
809 ; X32-SSE41-NEXT:    movd %xmm2, %eax
810 ; X32-SSE41-NEXT:    movsbl %al, %eax
811 ; X32-SSE41-NEXT:    movd %eax, %xmm1
812 ; X32-SSE41-NEXT:    sarl $31, %eax
813 ; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm1
814 ; X32-SSE41-NEXT:    pextrd $2, %xmm2, %eax
815 ; X32-SSE41-NEXT:    movsbl %al, %eax
816 ; X32-SSE41-NEXT:    pinsrd $2, %eax, %xmm1
817 ; X32-SSE41-NEXT:    sarl $31, %eax
818 ; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm1
819 ; X32-SSE41-NEXT:    retl
820 entry:
821  %X = load <4 x i8>* %ptr
822  %Y = sext <4 x i8> %X to <4 x i64>
823  ret <4 x i64>%Y
824 }
825
826 define <4 x i64> @load_sext_4i16_to_4i64(<4 x i16> *%ptr) {
827 ; SSE2-LABEL: load_sext_4i16_to_4i64:
828 ; SSE2:       # BB#0: # %entry
829 ; SSE2-NEXT:    movq (%rdi), %xmm1
830 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
831 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,1,1,3]
832 ; SSE2-NEXT:    movd %xmm2, %rax
833 ; SSE2-NEXT:    movswq %ax, %rax
834 ; SSE2-NEXT:    movd %rax, %xmm0
835 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
836 ; SSE2-NEXT:    movd %xmm2, %rax
837 ; SSE2-NEXT:    movswq %ax, %rax
838 ; SSE2-NEXT:    movd %rax, %xmm2
839 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
840 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,2,3,3]
841 ; SSE2-NEXT:    movd %xmm2, %rax
842 ; SSE2-NEXT:    movswq %ax, %rax
843 ; SSE2-NEXT:    movd %rax, %xmm1
844 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
845 ; SSE2-NEXT:    movd %xmm2, %rax
846 ; SSE2-NEXT:    movswq %ax, %rax
847 ; SSE2-NEXT:    movd %rax, %xmm2
848 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
849 ; SSE2-NEXT:    retq
850 ;
851 ; SSSE3-LABEL: load_sext_4i16_to_4i64:
852 ; SSSE3:       # BB#0: # %entry
853 ; SSSE3-NEXT:    movq (%rdi), %xmm1
854 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
855 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,1,1,3]
856 ; SSSE3-NEXT:    movd %xmm2, %rax
857 ; SSSE3-NEXT:    movswq %ax, %rax
858 ; SSSE3-NEXT:    movd %rax, %xmm0
859 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
860 ; SSSE3-NEXT:    movd %xmm2, %rax
861 ; SSSE3-NEXT:    movswq %ax, %rax
862 ; SSSE3-NEXT:    movd %rax, %xmm2
863 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
864 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,2,3,3]
865 ; SSSE3-NEXT:    movd %xmm2, %rax
866 ; SSSE3-NEXT:    movswq %ax, %rax
867 ; SSSE3-NEXT:    movd %rax, %xmm1
868 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
869 ; SSSE3-NEXT:    movd %xmm2, %rax
870 ; SSSE3-NEXT:    movswq %ax, %rax
871 ; SSSE3-NEXT:    movd %rax, %xmm2
872 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
873 ; SSSE3-NEXT:    retq
874 ;
875 ; SSE41-LABEL: load_sext_4i16_to_4i64:
876 ; SSE41:       # BB#0: # %entry
877 ; SSE41-NEXT:    movq (%rdi), %xmm0
878 ; SSE41-NEXT:    pmovzxwd %xmm0, %xmm1
879 ; SSE41-NEXT:    pmovzxwq %xmm0, %xmm0
880 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
881 ; SSE41-NEXT:    movswq %ax, %rax
882 ; SSE41-NEXT:    movd %rax, %xmm2
883 ; SSE41-NEXT:    movd %xmm0, %rax
884 ; SSE41-NEXT:    movswq %ax, %rax
885 ; SSE41-NEXT:    movd %rax, %xmm0
886 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
887 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
888 ; SSE41-NEXT:    pextrq $1, %xmm1, %rax
889 ; SSE41-NEXT:    movswq %ax, %rax
890 ; SSE41-NEXT:    movd %rax, %xmm2
891 ; SSE41-NEXT:    movd %xmm1, %rax
892 ; SSE41-NEXT:    movswq %ax, %rax
893 ; SSE41-NEXT:    movd %rax, %xmm1
894 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
895 ; SSE41-NEXT:    retq
896 ;
897 ; AVX1-LABEL: load_sext_4i16_to_4i64:
898 ; AVX1:       # BB#0: # %entry
899 ; AVX1-NEXT:    vpmovsxwd (%rdi), %xmm0
900 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
901 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
902 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
903 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
904 ; AVX1-NEXT:    retq
905 ;
906 ; AVX2-LABEL: load_sext_4i16_to_4i64:
907 ; AVX2:       # BB#0: # %entry
908 ; AVX2-NEXT:    vpmovsxwq (%rdi), %ymm0
909 ; AVX2-NEXT:    retq
910 ;
911 ; X32-SSE41-LABEL: load_sext_4i16_to_4i64:
912 ; X32-SSE41:       # BB#0: # %entry
913 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
914 ; X32-SSE41-NEXT:    movsd (%eax), %xmm0
915 ; X32-SSE41-NEXT:    pmovzxwd %xmm0, %xmm1
916 ; X32-SSE41-NEXT:    pmovzxwq %xmm0, %xmm2
917 ; X32-SSE41-NEXT:    movd %xmm2, %eax
918 ; X32-SSE41-NEXT:    cwtl
919 ; X32-SSE41-NEXT:    movd %eax, %xmm0
920 ; X32-SSE41-NEXT:    sarl $31, %eax
921 ; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm0
922 ; X32-SSE41-NEXT:    pextrd $2, %xmm2, %eax
923 ; X32-SSE41-NEXT:    cwtl
924 ; X32-SSE41-NEXT:    pinsrd $2, %eax, %xmm0
925 ; X32-SSE41-NEXT:    sarl $31, %eax
926 ; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm0
927 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,2,3,3]
928 ; X32-SSE41-NEXT:    movd %xmm2, %eax
929 ; X32-SSE41-NEXT:    cwtl
930 ; X32-SSE41-NEXT:    movd %eax, %xmm1
931 ; X32-SSE41-NEXT:    sarl $31, %eax
932 ; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm1
933 ; X32-SSE41-NEXT:    pextrd $2, %xmm2, %eax
934 ; X32-SSE41-NEXT:    cwtl
935 ; X32-SSE41-NEXT:    pinsrd $2, %eax, %xmm1
936 ; X32-SSE41-NEXT:    sarl $31, %eax
937 ; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm1
938 ; X32-SSE41-NEXT:    retl
939 entry:
940  %X = load <4 x i16>* %ptr
941  %Y = sext <4 x i16> %X to <4 x i64>
942  ret <4 x i64>%Y
943 }