[X86] Refactor PMOV[SZ]Xrm to add missing AVX2 patterns.
[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:    vpmovsxbw (%rdi), %ymm0
571 ; AVX2-NEXT:    retq
572 ;
573 ; X32-SSE41-LABEL: sext_16i8_to_16i16:
574 ; X32-SSE41:       # BB#0: # %entry
575 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
576 ; X32-SSE41-NEXT:    movdqa (%eax), %xmm1
577 ; X32-SSE41-NEXT:    pmovzxbw %xmm1, %xmm0
578 ; X32-SSE41-NEXT:    psllw $8, %xmm0
579 ; X32-SSE41-NEXT:    psraw $8, %xmm0
580 ; X32-SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
581 ; X32-SSE41-NEXT:    psllw $8, %xmm1
582 ; X32-SSE41-NEXT:    psraw $8, %xmm1
583 ; X32-SSE41-NEXT:    retl
584 entry:
585  %X = load <16 x i8>* %ptr
586  %Y = sext <16 x i8> %X to <16 x i16>
587  ret <16 x i16> %Y
588 }
589
590 define <4 x i64> @sext_4i8_to_4i64(<4 x i8> %mask) {
591 ; SSE2-LABEL: sext_4i8_to_4i64:
592 ; SSE2:       # BB#0:
593 ; SSE2-NEXT:    pslld $24, %xmm0
594 ; SSE2-NEXT:    psrad $24, %xmm0
595 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,1,1,3]
596 ; SSE2-NEXT:    movd %xmm1, %rax
597 ; SSE2-NEXT:    cltq
598 ; SSE2-NEXT:    movd %rax, %xmm2
599 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
600 ; SSE2-NEXT:    movd %xmm1, %rax
601 ; SSE2-NEXT:    cltq
602 ; SSE2-NEXT:    movd %rax, %xmm1
603 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
604 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
605 ; SSE2-NEXT:    movd %xmm0, %rax
606 ; SSE2-NEXT:    cltq
607 ; SSE2-NEXT:    movd %rax, %xmm1
608 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
609 ; SSE2-NEXT:    movd %xmm0, %rax
610 ; SSE2-NEXT:    cltq
611 ; SSE2-NEXT:    movd %rax, %xmm0
612 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
613 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
614 ; SSE2-NEXT:    retq
615 ;
616 ; SSSE3-LABEL: sext_4i8_to_4i64:
617 ; SSSE3:       # BB#0:
618 ; SSSE3-NEXT:    pslld $24, %xmm0
619 ; SSSE3-NEXT:    psrad $24, %xmm0
620 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,1,1,3]
621 ; SSSE3-NEXT:    movd %xmm1, %rax
622 ; SSSE3-NEXT:    cltq
623 ; SSSE3-NEXT:    movd %rax, %xmm2
624 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
625 ; SSSE3-NEXT:    movd %xmm1, %rax
626 ; SSSE3-NEXT:    cltq
627 ; SSSE3-NEXT:    movd %rax, %xmm1
628 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
629 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
630 ; SSSE3-NEXT:    movd %xmm0, %rax
631 ; SSSE3-NEXT:    cltq
632 ; SSSE3-NEXT:    movd %rax, %xmm1
633 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
634 ; SSSE3-NEXT:    movd %xmm0, %rax
635 ; SSSE3-NEXT:    cltq
636 ; SSSE3-NEXT:    movd %rax, %xmm0
637 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
638 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
639 ; SSSE3-NEXT:    retq
640 ;
641 ; SSE41-LABEL: sext_4i8_to_4i64:
642 ; SSE41:       # BB#0:
643 ; SSE41-NEXT:    pslld $24, %xmm0
644 ; SSE41-NEXT:    psrad $24, %xmm0
645 ; SSE41-NEXT:    pmovzxdq %xmm0, %xmm1
646 ; SSE41-NEXT:    pextrq $1, %xmm1, %rax
647 ; SSE41-NEXT:    cltq
648 ; SSE41-NEXT:    movd %rax, %xmm3
649 ; SSE41-NEXT:    movd %xmm1, %rax
650 ; SSE41-NEXT:    cltq
651 ; SSE41-NEXT:    movd %rax, %xmm2
652 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
653 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
654 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
655 ; SSE41-NEXT:    cltq
656 ; SSE41-NEXT:    movd %rax, %xmm3
657 ; SSE41-NEXT:    movd %xmm0, %rax
658 ; SSE41-NEXT:    cltq
659 ; SSE41-NEXT:    movd %rax, %xmm1
660 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
661 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
662 ; SSE41-NEXT:    retq
663 ;
664 ; AVX1-LABEL: sext_4i8_to_4i64:
665 ; AVX1:       # BB#0:
666 ; AVX1-NEXT:    vpslld $24, %xmm0, %xmm0
667 ; AVX1-NEXT:    vpsrad $24, %xmm0, %xmm0
668 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
669 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
670 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
671 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
672 ; AVX1-NEXT:    retq
673 ;
674 ; AVX2-LABEL: sext_4i8_to_4i64:
675 ; AVX2:       # BB#0:
676 ; AVX2-NEXT:    vpslld $24, %xmm0, %xmm0
677 ; AVX2-NEXT:    vpsrad $24, %xmm0, %xmm0
678 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
679 ; AVX2-NEXT:    retq
680 ;
681 ; X32-SSE41-LABEL: sext_4i8_to_4i64:
682 ; X32-SSE41:       # BB#0:
683 ; X32-SSE41-NEXT:    pslld $24, %xmm0
684 ; X32-SSE41-NEXT:    psrad $24, %xmm0
685 ; X32-SSE41-NEXT:    pmovzxdq %xmm0, %xmm2
686 ; X32-SSE41-NEXT:    movd %xmm2, %eax
687 ; X32-SSE41-NEXT:    sarl $31, %eax
688 ; X32-SSE41-NEXT:    pextrd $2, %xmm2, %ecx
689 ; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm2
690 ; X32-SSE41-NEXT:    sarl $31, %ecx
691 ; X32-SSE41-NEXT:    pinsrd $3, %ecx, %xmm2
692 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
693 ; X32-SSE41-NEXT:    movd %xmm1, %eax
694 ; X32-SSE41-NEXT:    sarl $31, %eax
695 ; X32-SSE41-NEXT:    pextrd $2, %xmm1, %ecx
696 ; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm1
697 ; X32-SSE41-NEXT:    sarl $31, %ecx
698 ; X32-SSE41-NEXT:    pinsrd $3, %ecx, %xmm1
699 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
700 ; X32-SSE41-NEXT:    retl
701   %extmask = sext <4 x i8> %mask to <4 x i64>
702   ret <4 x i64> %extmask
703 }
704
705 define <4 x i64> @load_sext_4i8_to_4i64(<4 x i8> *%ptr) {
706 ; SSE2-LABEL: load_sext_4i8_to_4i64:
707 ; SSE2:       # BB#0: # %entry
708 ; SSE2-NEXT:    movd (%rdi), %xmm1
709 ; 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]
710 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
711 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,1,1,3]
712 ; SSE2-NEXT:    movd %xmm2, %rax
713 ; SSE2-NEXT:    movsbq %al, %rax
714 ; SSE2-NEXT:    movd %rax, %xmm0
715 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
716 ; SSE2-NEXT:    movd %xmm2, %rax
717 ; SSE2-NEXT:    movsbq %al, %rax
718 ; SSE2-NEXT:    movd %rax, %xmm2
719 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
720 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,2,3,3]
721 ; SSE2-NEXT:    movd %xmm2, %rax
722 ; SSE2-NEXT:    movsbq %al, %rax
723 ; SSE2-NEXT:    movd %rax, %xmm1
724 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
725 ; SSE2-NEXT:    movd %xmm2, %rax
726 ; SSE2-NEXT:    movsbq %al, %rax
727 ; SSE2-NEXT:    movd %rax, %xmm2
728 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
729 ; SSE2-NEXT:    retq
730 ;
731 ; SSSE3-LABEL: load_sext_4i8_to_4i64:
732 ; SSSE3:       # BB#0: # %entry
733 ; SSSE3-NEXT:    movd (%rdi), %xmm1
734 ; 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]
735 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
736 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,1,1,3]
737 ; SSSE3-NEXT:    movd %xmm2, %rax
738 ; SSSE3-NEXT:    movsbq %al, %rax
739 ; SSSE3-NEXT:    movd %rax, %xmm0
740 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
741 ; SSSE3-NEXT:    movd %xmm2, %rax
742 ; SSSE3-NEXT:    movsbq %al, %rax
743 ; SSSE3-NEXT:    movd %rax, %xmm2
744 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
745 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,2,3,3]
746 ; SSSE3-NEXT:    movd %xmm2, %rax
747 ; SSSE3-NEXT:    movsbq %al, %rax
748 ; SSSE3-NEXT:    movd %rax, %xmm1
749 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
750 ; SSSE3-NEXT:    movd %xmm2, %rax
751 ; SSSE3-NEXT:    movsbq %al, %rax
752 ; SSSE3-NEXT:    movd %rax, %xmm2
753 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
754 ; SSSE3-NEXT:    retq
755 ;
756 ; SSE41-LABEL: load_sext_4i8_to_4i64:
757 ; SSE41:       # BB#0: # %entry
758 ; SSE41-NEXT:    pmovzxbd (%rdi), %xmm1
759 ; SSE41-NEXT:    pmovzxdq %xmm1, %xmm0
760 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
761 ; SSE41-NEXT:    movsbq %al, %rax
762 ; SSE41-NEXT:    movd %rax, %xmm2
763 ; SSE41-NEXT:    movd %xmm0, %rax
764 ; SSE41-NEXT:    movsbq %al, %rax
765 ; SSE41-NEXT:    movd %rax, %xmm0
766 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
767 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
768 ; SSE41-NEXT:    pextrq $1, %xmm1, %rax
769 ; SSE41-NEXT:    movsbq %al, %rax
770 ; SSE41-NEXT:    movd %rax, %xmm2
771 ; SSE41-NEXT:    movd %xmm1, %rax
772 ; SSE41-NEXT:    movsbq %al, %rax
773 ; SSE41-NEXT:    movd %rax, %xmm1
774 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
775 ; SSE41-NEXT:    retq
776 ;
777 ; AVX1-LABEL: load_sext_4i8_to_4i64:
778 ; AVX1:       # BB#0: # %entry
779 ; AVX1-NEXT:    vpmovsxbd (%rdi), %xmm0
780 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
781 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
782 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
783 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
784 ; AVX1-NEXT:    retq
785 ;
786 ; AVX2-LABEL: load_sext_4i8_to_4i64:
787 ; AVX2:       # BB#0: # %entry
788 ; AVX2-NEXT:    vpmovsxbq (%rdi), %ymm0
789 ; AVX2-NEXT:    retq
790 ;
791 ; X32-SSE41-LABEL: load_sext_4i8_to_4i64:
792 ; X32-SSE41:       # BB#0: # %entry
793 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
794 ; X32-SSE41-NEXT:    movd (%eax), %xmm0
795 ; X32-SSE41-NEXT:    pmovzxbd %xmm0, %xmm1
796 ; X32-SSE41-NEXT:    pmovzxbq %xmm0, %xmm2
797 ; X32-SSE41-NEXT:    movd %xmm2, %eax
798 ; X32-SSE41-NEXT:    movsbl %al, %eax
799 ; X32-SSE41-NEXT:    movd %eax, %xmm0
800 ; X32-SSE41-NEXT:    sarl $31, %eax
801 ; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm0
802 ; X32-SSE41-NEXT:    pextrd $2, %xmm2, %eax
803 ; X32-SSE41-NEXT:    movsbl %al, %eax
804 ; X32-SSE41-NEXT:    pinsrd $2, %eax, %xmm0
805 ; X32-SSE41-NEXT:    sarl $31, %eax
806 ; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm0
807 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,2,3,3]
808 ; X32-SSE41-NEXT:    movd %xmm2, %eax
809 ; X32-SSE41-NEXT:    movsbl %al, %eax
810 ; X32-SSE41-NEXT:    movd %eax, %xmm1
811 ; X32-SSE41-NEXT:    sarl $31, %eax
812 ; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm1
813 ; X32-SSE41-NEXT:    pextrd $2, %xmm2, %eax
814 ; X32-SSE41-NEXT:    movsbl %al, %eax
815 ; X32-SSE41-NEXT:    pinsrd $2, %eax, %xmm1
816 ; X32-SSE41-NEXT:    sarl $31, %eax
817 ; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm1
818 ; X32-SSE41-NEXT:    retl
819 entry:
820  %X = load <4 x i8>* %ptr
821  %Y = sext <4 x i8> %X to <4 x i64>
822  ret <4 x i64>%Y
823 }
824
825 define <4 x i64> @load_sext_4i16_to_4i64(<4 x i16> *%ptr) {
826 ; SSE2-LABEL: load_sext_4i16_to_4i64:
827 ; SSE2:       # BB#0: # %entry
828 ; SSE2-NEXT:    movq (%rdi), %xmm1
829 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
830 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,1,1,3]
831 ; SSE2-NEXT:    movd %xmm2, %rax
832 ; SSE2-NEXT:    movswq %ax, %rax
833 ; SSE2-NEXT:    movd %rax, %xmm0
834 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
835 ; SSE2-NEXT:    movd %xmm2, %rax
836 ; SSE2-NEXT:    movswq %ax, %rax
837 ; SSE2-NEXT:    movd %rax, %xmm2
838 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
839 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,2,3,3]
840 ; SSE2-NEXT:    movd %xmm2, %rax
841 ; SSE2-NEXT:    movswq %ax, %rax
842 ; SSE2-NEXT:    movd %rax, %xmm1
843 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
844 ; SSE2-NEXT:    movd %xmm2, %rax
845 ; SSE2-NEXT:    movswq %ax, %rax
846 ; SSE2-NEXT:    movd %rax, %xmm2
847 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
848 ; SSE2-NEXT:    retq
849 ;
850 ; SSSE3-LABEL: load_sext_4i16_to_4i64:
851 ; SSSE3:       # BB#0: # %entry
852 ; SSSE3-NEXT:    movq (%rdi), %xmm1
853 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
854 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,1,1,3]
855 ; SSSE3-NEXT:    movd %xmm2, %rax
856 ; SSSE3-NEXT:    movswq %ax, %rax
857 ; SSSE3-NEXT:    movd %rax, %xmm0
858 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
859 ; SSSE3-NEXT:    movd %xmm2, %rax
860 ; SSSE3-NEXT:    movswq %ax, %rax
861 ; SSSE3-NEXT:    movd %rax, %xmm2
862 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
863 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,2,3,3]
864 ; SSSE3-NEXT:    movd %xmm2, %rax
865 ; SSSE3-NEXT:    movswq %ax, %rax
866 ; SSSE3-NEXT:    movd %rax, %xmm1
867 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
868 ; SSSE3-NEXT:    movd %xmm2, %rax
869 ; SSSE3-NEXT:    movswq %ax, %rax
870 ; SSSE3-NEXT:    movd %rax, %xmm2
871 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
872 ; SSSE3-NEXT:    retq
873 ;
874 ; SSE41-LABEL: load_sext_4i16_to_4i64:
875 ; SSE41:       # BB#0: # %entry
876 ; SSE41-NEXT:    movq (%rdi), %xmm0
877 ; SSE41-NEXT:    pmovzxwd %xmm0, %xmm1
878 ; SSE41-NEXT:    pmovzxwq %xmm0, %xmm0
879 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
880 ; SSE41-NEXT:    movswq %ax, %rax
881 ; SSE41-NEXT:    movd %rax, %xmm2
882 ; SSE41-NEXT:    movd %xmm0, %rax
883 ; SSE41-NEXT:    movswq %ax, %rax
884 ; SSE41-NEXT:    movd %rax, %xmm0
885 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
886 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
887 ; SSE41-NEXT:    pextrq $1, %xmm1, %rax
888 ; SSE41-NEXT:    movswq %ax, %rax
889 ; SSE41-NEXT:    movd %rax, %xmm2
890 ; SSE41-NEXT:    movd %xmm1, %rax
891 ; SSE41-NEXT:    movswq %ax, %rax
892 ; SSE41-NEXT:    movd %rax, %xmm1
893 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
894 ; SSE41-NEXT:    retq
895 ;
896 ; AVX1-LABEL: load_sext_4i16_to_4i64:
897 ; AVX1:       # BB#0: # %entry
898 ; AVX1-NEXT:    vpmovsxwd (%rdi), %xmm0
899 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
900 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
901 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
902 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
903 ; AVX1-NEXT:    retq
904 ;
905 ; AVX2-LABEL: load_sext_4i16_to_4i64:
906 ; AVX2:       # BB#0: # %entry
907 ; AVX2-NEXT:    vpmovsxwq (%rdi), %ymm0
908 ; AVX2-NEXT:    retq
909 ;
910 ; X32-SSE41-LABEL: load_sext_4i16_to_4i64:
911 ; X32-SSE41:       # BB#0: # %entry
912 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
913 ; X32-SSE41-NEXT:    movsd (%eax), %xmm0
914 ; X32-SSE41-NEXT:    pmovzxwd %xmm0, %xmm1
915 ; X32-SSE41-NEXT:    pmovzxwq %xmm0, %xmm2
916 ; X32-SSE41-NEXT:    movd %xmm2, %eax
917 ; X32-SSE41-NEXT:    cwtl
918 ; X32-SSE41-NEXT:    movd %eax, %xmm0
919 ; X32-SSE41-NEXT:    sarl $31, %eax
920 ; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm0
921 ; X32-SSE41-NEXT:    pextrd $2, %xmm2, %eax
922 ; X32-SSE41-NEXT:    cwtl
923 ; X32-SSE41-NEXT:    pinsrd $2, %eax, %xmm0
924 ; X32-SSE41-NEXT:    sarl $31, %eax
925 ; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm0
926 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,2,3,3]
927 ; X32-SSE41-NEXT:    movd %xmm2, %eax
928 ; X32-SSE41-NEXT:    cwtl
929 ; X32-SSE41-NEXT:    movd %eax, %xmm1
930 ; X32-SSE41-NEXT:    sarl $31, %eax
931 ; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm1
932 ; X32-SSE41-NEXT:    pextrd $2, %xmm2, %eax
933 ; X32-SSE41-NEXT:    cwtl
934 ; X32-SSE41-NEXT:    pinsrd $2, %eax, %xmm1
935 ; X32-SSE41-NEXT:    sarl $31, %eax
936 ; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm1
937 ; X32-SSE41-NEXT:    retl
938 entry:
939  %X = load <4 x i16>* %ptr
940  %Y = sext <4 x i16> %X to <4 x i64>
941  ret <4 x i64>%Y
942 }