1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=x86-64 -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=x86-64 -mattr=+ssse3 | FileCheck %s --check-prefix=SSE --check-prefix=SSSE3
3 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=x86-64 -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
4 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=x86-64 -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
5 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=x86-64 -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
7 ; Just one 32-bit run to make sure we do reasonable things there.
8 ; RUN: llc < %s -mtriple=i686-apple-darwin -mcpu=i686 -mattr=+sse4.1 | FileCheck %s --check-prefix=X32-SSE41
10 define <8 x i32> @sext_8i16_to_8i32(<8 x i16> %A) nounwind uwtable readnone ssp {
11 ; SSE2-LABEL: sext_8i16_to_8i32:
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],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
19 ; SSE2-NEXT: pslld $16, %xmm1
20 ; SSE2-NEXT: psrad $16, %xmm1
23 ; SSSE3-LABEL: sext_8i16_to_8i32:
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],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
31 ; SSSE3-NEXT: pslld $16, %xmm1
32 ; SSSE3-NEXT: psrad $16, %xmm1
35 ; SSE41-LABEL: sext_8i16_to_8i32:
37 ; SSE41-NEXT: movdqa %xmm0, %xmm1
38 ; SSE41-NEXT: pmovzxwd %xmm1, %xmm0
39 ; SSE41-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
40 ; SSE41-NEXT: pslld $16, %xmm1
41 ; SSE41-NEXT: psrad $16, %xmm1
42 ; SSE41-NEXT: pslld $16, %xmm0
43 ; SSE41-NEXT: psrad $16, %xmm0
46 ; AVX1-LABEL: sext_8i16_to_8i32:
48 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm1
49 ; AVX1-NEXT: vmovhlps {{.*#+}} xmm0 = xmm0[1,1]
50 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm0
51 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
54 ; AVX2-LABEL: sext_8i16_to_8i32:
56 ; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0
59 ; X32-SSE41-LABEL: sext_8i16_to_8i32:
61 ; X32-SSE41-NEXT: movdqa %xmm0, %xmm1
62 ; X32-SSE41-NEXT: pmovzxwd %xmm1, %xmm0
63 ; X32-SSE41-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
64 ; X32-SSE41-NEXT: pslld $16, %xmm1
65 ; X32-SSE41-NEXT: psrad $16, %xmm1
66 ; X32-SSE41-NEXT: pslld $16, %xmm0
67 ; X32-SSE41-NEXT: psrad $16, %xmm0
68 ; X32-SSE41-NEXT: retl
70 %B = sext <8 x i16> %A to <8 x i32>
74 define <4 x i64> @sext_4i32_to_4i64(<4 x i32> %A) nounwind uwtable readnone ssp {
75 ; SSE2-LABEL: sext_4i32_to_4i64:
77 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0]
78 ; SSE2-NEXT: movd %xmm1, %rax
80 ; SSE2-NEXT: movd %rax, %xmm2
81 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
82 ; SSE2-NEXT: movd %xmm1, %rax
84 ; SSE2-NEXT: movd %rax, %xmm1
85 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
86 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
87 ; SSE2-NEXT: movd %xmm0, %rax
89 ; SSE2-NEXT: movd %rax, %xmm1
90 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
91 ; SSE2-NEXT: movd %xmm0, %rax
93 ; SSE2-NEXT: movd %rax, %xmm0
94 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
95 ; SSE2-NEXT: movdqa %xmm2, %xmm0
98 ; SSSE3-LABEL: sext_4i32_to_4i64:
100 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0]
101 ; SSSE3-NEXT: movd %xmm1, %rax
103 ; SSSE3-NEXT: movd %rax, %xmm2
104 ; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
105 ; SSSE3-NEXT: movd %xmm1, %rax
107 ; SSSE3-NEXT: movd %rax, %xmm1
108 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
109 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
110 ; SSSE3-NEXT: movd %xmm0, %rax
112 ; SSSE3-NEXT: movd %rax, %xmm1
113 ; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
114 ; SSSE3-NEXT: movd %xmm0, %rax
116 ; SSSE3-NEXT: movd %rax, %xmm0
117 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
118 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
121 ; SSE41-LABEL: sext_4i32_to_4i64:
123 ; SSE41-NEXT: pmovzxdq %xmm0, %xmm1
124 ; SSE41-NEXT: pextrq $1, %xmm1, %rax
126 ; SSE41-NEXT: movd %rax, %xmm3
127 ; SSE41-NEXT: movd %xmm1, %rax
129 ; SSE41-NEXT: movd %rax, %xmm2
130 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
131 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
132 ; SSE41-NEXT: pextrq $1, %xmm0, %rax
134 ; SSE41-NEXT: movd %rax, %xmm3
135 ; SSE41-NEXT: movd %xmm0, %rax
137 ; SSE41-NEXT: movd %rax, %xmm1
138 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
139 ; SSE41-NEXT: movdqa %xmm2, %xmm0
142 ; AVX1-LABEL: sext_4i32_to_4i64:
144 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm1
145 ; AVX1-NEXT: vmovhlps {{.*#+}} xmm0 = xmm0[1,1]
146 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0
147 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
150 ; AVX2-LABEL: sext_4i32_to_4i64:
152 ; AVX2-NEXT: vpmovsxdq %xmm0, %ymm0
155 ; X32-SSE41-LABEL: sext_4i32_to_4i64:
156 ; X32-SSE41: ## BB#0:
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,0,3,0]
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
174 %B = sext <4 x i32> %A to <4 x i64>
178 define <4 x i32> @load_sext_test1(<4 x i16> *%ptr) {
179 ; SSE2-LABEL: load_sext_test1:
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
186 ; SSSE3-LABEL: load_sext_test1:
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
193 ; SSE41-LABEL: load_sext_test1:
195 ; SSE41-NEXT: pmovsxwd (%rdi), %xmm0
198 ; AVX-LABEL: load_sext_test1:
200 ; AVX-NEXT: vpmovsxwd (%rdi), %xmm0
203 ; X32-SSE41-LABEL: load_sext_test1:
204 ; X32-SSE41: ## BB#0:
205 ; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
206 ; X32-SSE41-NEXT: pmovsxwd (%eax), %xmm0
207 ; X32-SSE41-NEXT: retl
209 %X = load <4 x i16>* %ptr
210 %Y = sext <4 x i16> %X to <4 x i32>
214 define <4 x i32> @load_sext_test2(<4 x i8> *%ptr) {
215 ; SSE2-LABEL: load_sext_test2:
217 ; SSE2-NEXT: movl (%rdi), %eax
218 ; SSE2-NEXT: movl %eax, %ecx
219 ; SSE2-NEXT: shll $8, %ecx
220 ; SSE2-NEXT: movd %eax, %xmm0
221 ; SSE2-NEXT: pextrw $1, %xmm0, %edx
222 ; SSE2-NEXT: pinsrw $1, %ecx, %xmm0
223 ; SSE2-NEXT: pinsrw $3, %eax, %xmm0
224 ; SSE2-NEXT: movl %edx, %eax
225 ; SSE2-NEXT: shll $8, %eax
226 ; SSE2-NEXT: pinsrw $5, %eax, %xmm0
227 ; SSE2-NEXT: pinsrw $7, %edx, %xmm0
228 ; SSE2-NEXT: psrad $24, %xmm0
231 ; SSSE3-LABEL: load_sext_test2:
233 ; SSSE3-NEXT: movd (%rdi), %xmm0
234 ; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = zero,zero,zero,xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3]
235 ; SSSE3-NEXT: psrad $24, %xmm0
238 ; SSE41-LABEL: load_sext_test2:
240 ; SSE41-NEXT: pmovsxbd (%rdi), %xmm0
243 ; AVX-LABEL: load_sext_test2:
245 ; AVX-NEXT: vpmovsxbd (%rdi), %xmm0
248 ; X32-SSE41-LABEL: load_sext_test2:
249 ; X32-SSE41: ## BB#0:
250 ; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
251 ; X32-SSE41-NEXT: pmovsxbd (%eax), %xmm0
252 ; X32-SSE41-NEXT: retl
253 %X = load <4 x i8>* %ptr
254 %Y = sext <4 x i8> %X to <4 x i32>
258 define <2 x i64> @load_sext_test3(<2 x i8> *%ptr) {
259 ; SSE2-LABEL: load_sext_test3:
261 ; SSE2-NEXT: movsbq 1(%rdi), %rax
262 ; SSE2-NEXT: movd %rax, %xmm1
263 ; SSE2-NEXT: movsbq (%rdi), %rax
264 ; SSE2-NEXT: movd %rax, %xmm0
265 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
268 ; SSSE3-LABEL: load_sext_test3:
270 ; SSSE3-NEXT: movsbq 1(%rdi), %rax
271 ; SSSE3-NEXT: movd %rax, %xmm1
272 ; SSSE3-NEXT: movsbq (%rdi), %rax
273 ; SSSE3-NEXT: movd %rax, %xmm0
274 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
277 ; SSE41-LABEL: load_sext_test3:
279 ; SSE41-NEXT: pmovsxbq (%rdi), %xmm0
282 ; AVX-LABEL: load_sext_test3:
284 ; AVX-NEXT: vpmovsxbq (%rdi), %xmm0
287 ; X32-SSE41-LABEL: load_sext_test3:
288 ; X32-SSE41: ## BB#0:
289 ; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
290 ; X32-SSE41-NEXT: pmovsxbq (%eax), %xmm0
291 ; X32-SSE41-NEXT: retl
292 %X = load <2 x i8>* %ptr
293 %Y = sext <2 x i8> %X to <2 x i64>
297 define <2 x i64> @load_sext_test4(<2 x i16> *%ptr) {
298 ; SSE2-LABEL: load_sext_test4:
300 ; SSE2-NEXT: movswq 2(%rdi), %rax
301 ; SSE2-NEXT: movd %rax, %xmm1
302 ; SSE2-NEXT: movswq (%rdi), %rax
303 ; SSE2-NEXT: movd %rax, %xmm0
304 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
307 ; SSSE3-LABEL: load_sext_test4:
309 ; SSSE3-NEXT: movswq 2(%rdi), %rax
310 ; SSSE3-NEXT: movd %rax, %xmm1
311 ; SSSE3-NEXT: movswq (%rdi), %rax
312 ; SSSE3-NEXT: movd %rax, %xmm0
313 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
316 ; SSE41-LABEL: load_sext_test4:
318 ; SSE41-NEXT: pmovsxwq (%rdi), %xmm0
321 ; AVX-LABEL: load_sext_test4:
323 ; AVX-NEXT: vpmovsxwq (%rdi), %xmm0
326 ; X32-SSE41-LABEL: load_sext_test4:
327 ; X32-SSE41: ## BB#0:
328 ; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
329 ; X32-SSE41-NEXT: pmovsxwq (%eax), %xmm0
330 ; X32-SSE41-NEXT: retl
331 %X = load <2 x i16>* %ptr
332 %Y = sext <2 x i16> %X to <2 x i64>
336 define <2 x i64> @load_sext_test5(<2 x i32> *%ptr) {
337 ; SSE2-LABEL: load_sext_test5:
339 ; SSE2-NEXT: movslq 4(%rdi), %rax
340 ; SSE2-NEXT: movd %rax, %xmm1
341 ; SSE2-NEXT: movslq (%rdi), %rax
342 ; SSE2-NEXT: movd %rax, %xmm0
343 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
346 ; SSSE3-LABEL: load_sext_test5:
348 ; SSSE3-NEXT: movslq 4(%rdi), %rax
349 ; SSSE3-NEXT: movd %rax, %xmm1
350 ; SSSE3-NEXT: movslq (%rdi), %rax
351 ; SSSE3-NEXT: movd %rax, %xmm0
352 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
355 ; SSE41-LABEL: load_sext_test5:
357 ; SSE41-NEXT: pmovsxdq (%rdi), %xmm0
360 ; AVX-LABEL: load_sext_test5:
362 ; AVX-NEXT: vpmovsxdq (%rdi), %xmm0
365 ; X32-SSE41-LABEL: load_sext_test5:
366 ; X32-SSE41: ## BB#0:
367 ; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
368 ; X32-SSE41-NEXT: pmovsxdq (%eax), %xmm0
369 ; X32-SSE41-NEXT: retl
370 %X = load <2 x i32>* %ptr
371 %Y = sext <2 x i32> %X to <2 x i64>
375 define <8 x i16> @load_sext_test6(<8 x i8> *%ptr) {
376 ; SSE2-LABEL: load_sext_test6:
378 ; SSE2-NEXT: movq (%rdi), %xmm0
379 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
380 ; SSE2-NEXT: psraw $8, %xmm0
383 ; SSSE3-LABEL: load_sext_test6:
385 ; SSSE3-NEXT: movq (%rdi), %xmm0
386 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
387 ; SSSE3-NEXT: psraw $8, %xmm0
390 ; SSE41-LABEL: load_sext_test6:
392 ; SSE41-NEXT: pmovsxbw (%rdi), %xmm0
395 ; AVX-LABEL: load_sext_test6:
397 ; AVX-NEXT: vpmovsxbw (%rdi), %xmm0
400 ; X32-SSE41-LABEL: load_sext_test6:
401 ; X32-SSE41: ## BB#0:
402 ; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
403 ; X32-SSE41-NEXT: pmovsxbw (%eax), %xmm0
404 ; X32-SSE41-NEXT: retl
405 %X = load <8 x i8>* %ptr
406 %Y = sext <8 x i8> %X to <8 x i16>
410 define <4 x i64> @sext_4i1_to_4i64(<4 x i1> %mask) {
411 ; SSE2-LABEL: sext_4i1_to_4i64:
413 ; SSE2-NEXT: pslld $31, %xmm0
414 ; SSE2-NEXT: psrad $31, %xmm0
415 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0]
416 ; SSE2-NEXT: movd %xmm1, %rax
418 ; SSE2-NEXT: movd %rax, %xmm2
419 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
420 ; SSE2-NEXT: movd %xmm1, %rax
422 ; SSE2-NEXT: movd %rax, %xmm1
423 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
424 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
425 ; SSE2-NEXT: movd %xmm0, %rax
427 ; SSE2-NEXT: movd %rax, %xmm1
428 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
429 ; SSE2-NEXT: movd %xmm0, %rax
431 ; SSE2-NEXT: movd %rax, %xmm0
432 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
433 ; SSE2-NEXT: movdqa %xmm2, %xmm0
436 ; SSSE3-LABEL: sext_4i1_to_4i64:
438 ; SSSE3-NEXT: pslld $31, %xmm0
439 ; SSSE3-NEXT: psrad $31, %xmm0
440 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0]
441 ; SSSE3-NEXT: movd %xmm1, %rax
443 ; SSSE3-NEXT: movd %rax, %xmm2
444 ; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
445 ; SSSE3-NEXT: movd %xmm1, %rax
447 ; SSSE3-NEXT: movd %rax, %xmm1
448 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
449 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
450 ; SSSE3-NEXT: movd %xmm0, %rax
452 ; SSSE3-NEXT: movd %rax, %xmm1
453 ; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
454 ; SSSE3-NEXT: movd %xmm0, %rax
456 ; SSSE3-NEXT: movd %rax, %xmm0
457 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
458 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
461 ; SSE41-LABEL: sext_4i1_to_4i64:
463 ; SSE41-NEXT: pslld $31, %xmm0
464 ; SSE41-NEXT: psrad $31, %xmm0
465 ; SSE41-NEXT: pmovzxdq %xmm0, %xmm1
466 ; SSE41-NEXT: pextrq $1, %xmm1, %rax
468 ; SSE41-NEXT: movd %rax, %xmm3
469 ; SSE41-NEXT: movd %xmm1, %rax
471 ; SSE41-NEXT: movd %rax, %xmm2
472 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
473 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
474 ; SSE41-NEXT: pextrq $1, %xmm0, %rax
476 ; SSE41-NEXT: movd %rax, %xmm3
477 ; SSE41-NEXT: movd %xmm0, %rax
479 ; SSE41-NEXT: movd %rax, %xmm1
480 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
481 ; SSE41-NEXT: movdqa %xmm2, %xmm0
484 ; AVX1-LABEL: sext_4i1_to_4i64:
486 ; AVX1-NEXT: vpslld $31, %xmm0, %xmm0
487 ; AVX1-NEXT: vpsrad $31, %xmm0, %xmm0
488 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm1
489 ; AVX1-NEXT: vmovhlps {{.*#+}} xmm0 = xmm0[1,1]
490 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0
491 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
494 ; AVX2-LABEL: sext_4i1_to_4i64:
496 ; AVX2-NEXT: vpslld $31, %xmm0, %xmm0
497 ; AVX2-NEXT: vpsrad $31, %xmm0, %xmm0
498 ; AVX2-NEXT: vpmovsxdq %xmm0, %ymm0
501 ; X32-SSE41-LABEL: sext_4i1_to_4i64:
502 ; X32-SSE41: ## BB#0:
503 ; X32-SSE41-NEXT: pslld $31, %xmm0
504 ; X32-SSE41-NEXT: psrad $31, %xmm0
505 ; X32-SSE41-NEXT: pmovzxdq %xmm0, %xmm2
506 ; X32-SSE41-NEXT: movd %xmm2, %eax
507 ; X32-SSE41-NEXT: sarl $31, %eax
508 ; X32-SSE41-NEXT: pextrd $2, %xmm2, %ecx
509 ; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm2
510 ; X32-SSE41-NEXT: sarl $31, %ecx
511 ; X32-SSE41-NEXT: pinsrd $3, %ecx, %xmm2
512 ; X32-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,0,3,0]
513 ; X32-SSE41-NEXT: movd %xmm1, %eax
514 ; X32-SSE41-NEXT: sarl $31, %eax
515 ; X32-SSE41-NEXT: pextrd $2, %xmm1, %ecx
516 ; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm1
517 ; X32-SSE41-NEXT: sarl $31, %ecx
518 ; X32-SSE41-NEXT: pinsrd $3, %ecx, %xmm1
519 ; X32-SSE41-NEXT: movdqa %xmm2, %xmm0
520 ; X32-SSE41-NEXT: retl
521 %extmask = sext <4 x i1> %mask to <4 x i64>
522 ret <4 x i64> %extmask
525 define <16 x i16> @sext_16i8_to_16i16(<16 x i8> *%ptr) {
526 ; SSE2-LABEL: sext_16i8_to_16i16:
528 ; SSE2-NEXT: movdqa (%rdi), %xmm1
529 ; SSE2-NEXT: movdqa %xmm1, %xmm0
530 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
531 ; SSE2-NEXT: psllw $8, %xmm0
532 ; SSE2-NEXT: psraw $8, %xmm0
533 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
534 ; SSE2-NEXT: psllw $8, %xmm1
535 ; SSE2-NEXT: psraw $8, %xmm1
538 ; SSSE3-LABEL: sext_16i8_to_16i16:
540 ; SSSE3-NEXT: movdqa (%rdi), %xmm1
541 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
542 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
543 ; SSSE3-NEXT: psllw $8, %xmm0
544 ; SSSE3-NEXT: psraw $8, %xmm0
545 ; SSSE3-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
546 ; SSSE3-NEXT: psllw $8, %xmm1
547 ; SSSE3-NEXT: psraw $8, %xmm1
550 ; SSE41-LABEL: sext_16i8_to_16i16:
552 ; SSE41-NEXT: movdqa (%rdi), %xmm1
553 ; SSE41-NEXT: pmovzxbw %xmm1, %xmm0
554 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
555 ; SSE41-NEXT: psllw $8, %xmm1
556 ; SSE41-NEXT: psraw $8, %xmm1
557 ; SSE41-NEXT: psllw $8, %xmm0
558 ; SSE41-NEXT: psraw $8, %xmm0
561 ; AVX1-LABEL: sext_16i8_to_16i16:
563 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
564 ; AVX1-NEXT: vpmovsxbw %xmm0, %xmm1
565 ; AVX1-NEXT: vmovhlps {{.*#+}} xmm0 = xmm0[1,1]
566 ; AVX1-NEXT: vpmovsxbw %xmm0, %xmm0
567 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
570 ; AVX2-LABEL: sext_16i8_to_16i16:
572 ; AVX2-NEXT: vmovdqa (%rdi), %xmm0
573 ; AVX2-NEXT: vpmovsxbw %xmm0, %ymm0
576 ; X32-SSE41-LABEL: sext_16i8_to_16i16:
577 ; X32-SSE41: ## BB#0:
578 ; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
579 ; X32-SSE41-NEXT: movdqa (%eax), %xmm1
580 ; X32-SSE41-NEXT: pmovzxbw %xmm1, %xmm0
581 ; X32-SSE41-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
582 ; X32-SSE41-NEXT: psllw $8, %xmm1
583 ; X32-SSE41-NEXT: psraw $8, %xmm1
584 ; X32-SSE41-NEXT: psllw $8, %xmm0
585 ; X32-SSE41-NEXT: psraw $8, %xmm0
586 ; X32-SSE41-NEXT: retl
587 %X = load <16 x i8>* %ptr
588 %Y = sext <16 x i8> %X to <16 x i16>
592 define <4 x i64> @sext_4i8_to_4i64(<4 x i8> %mask) {
593 ; SSE2-LABEL: sext_4i8_to_4i64:
595 ; SSE2-NEXT: pslld $24, %xmm0
596 ; SSE2-NEXT: psrad $24, %xmm0
597 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0]
598 ; SSE2-NEXT: movd %xmm1, %rax
600 ; SSE2-NEXT: movd %rax, %xmm2
601 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
602 ; SSE2-NEXT: movd %xmm1, %rax
604 ; SSE2-NEXT: movd %rax, %xmm1
605 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
606 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
607 ; SSE2-NEXT: movd %xmm0, %rax
609 ; SSE2-NEXT: movd %rax, %xmm1
610 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
611 ; SSE2-NEXT: movd %xmm0, %rax
613 ; SSE2-NEXT: movd %rax, %xmm0
614 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
615 ; SSE2-NEXT: movdqa %xmm2, %xmm0
618 ; SSSE3-LABEL: sext_4i8_to_4i64:
620 ; SSSE3-NEXT: pslld $24, %xmm0
621 ; SSSE3-NEXT: psrad $24, %xmm0
622 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0]
623 ; SSSE3-NEXT: movd %xmm1, %rax
625 ; SSSE3-NEXT: movd %rax, %xmm2
626 ; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
627 ; SSSE3-NEXT: movd %xmm1, %rax
629 ; SSSE3-NEXT: movd %rax, %xmm1
630 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
631 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
632 ; SSSE3-NEXT: movd %xmm0, %rax
634 ; SSSE3-NEXT: movd %rax, %xmm1
635 ; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
636 ; SSSE3-NEXT: movd %xmm0, %rax
638 ; SSSE3-NEXT: movd %rax, %xmm0
639 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
640 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
643 ; SSE41-LABEL: sext_4i8_to_4i64:
645 ; SSE41-NEXT: pslld $24, %xmm0
646 ; SSE41-NEXT: psrad $24, %xmm0
647 ; SSE41-NEXT: pmovzxdq %xmm0, %xmm1
648 ; SSE41-NEXT: pextrq $1, %xmm1, %rax
650 ; SSE41-NEXT: movd %rax, %xmm3
651 ; SSE41-NEXT: movd %xmm1, %rax
653 ; SSE41-NEXT: movd %rax, %xmm2
654 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
655 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
656 ; SSE41-NEXT: pextrq $1, %xmm0, %rax
658 ; SSE41-NEXT: movd %rax, %xmm3
659 ; SSE41-NEXT: movd %xmm0, %rax
661 ; SSE41-NEXT: movd %rax, %xmm1
662 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
663 ; SSE41-NEXT: movdqa %xmm2, %xmm0
666 ; AVX1-LABEL: sext_4i8_to_4i64:
668 ; AVX1-NEXT: vpslld $24, %xmm0, %xmm0
669 ; AVX1-NEXT: vpsrad $24, %xmm0, %xmm0
670 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm1
671 ; AVX1-NEXT: vmovhlps {{.*#+}} xmm0 = xmm0[1,1]
672 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0
673 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
676 ; AVX2-LABEL: sext_4i8_to_4i64:
678 ; AVX2-NEXT: vpslld $24, %xmm0, %xmm0
679 ; AVX2-NEXT: vpsrad $24, %xmm0, %xmm0
680 ; AVX2-NEXT: vpmovsxdq %xmm0, %ymm0
683 ; X32-SSE41-LABEL: sext_4i8_to_4i64:
684 ; X32-SSE41: ## BB#0:
685 ; X32-SSE41-NEXT: pslld $24, %xmm0
686 ; X32-SSE41-NEXT: psrad $24, %xmm0
687 ; X32-SSE41-NEXT: pmovzxdq %xmm0, %xmm2
688 ; X32-SSE41-NEXT: movd %xmm2, %eax
689 ; X32-SSE41-NEXT: sarl $31, %eax
690 ; X32-SSE41-NEXT: pextrd $2, %xmm2, %ecx
691 ; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm2
692 ; X32-SSE41-NEXT: sarl $31, %ecx
693 ; X32-SSE41-NEXT: pinsrd $3, %ecx, %xmm2
694 ; X32-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,0,3,0]
695 ; X32-SSE41-NEXT: movd %xmm1, %eax
696 ; X32-SSE41-NEXT: sarl $31, %eax
697 ; X32-SSE41-NEXT: pextrd $2, %xmm1, %ecx
698 ; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm1
699 ; X32-SSE41-NEXT: sarl $31, %ecx
700 ; X32-SSE41-NEXT: pinsrd $3, %ecx, %xmm1
701 ; X32-SSE41-NEXT: movdqa %xmm2, %xmm0
702 ; X32-SSE41-NEXT: retl
703 %extmask = sext <4 x i8> %mask to <4 x i64>
704 ret <4 x i64> %extmask
707 define <4 x i64> @load_sext_4i8_to_4i64(<4 x i8> *%ptr) {
708 ; SSE2-LABEL: load_sext_4i8_to_4i64:
710 ; SSE2-NEXT: movl (%rdi), %eax
711 ; SSE2-NEXT: movd %eax, %xmm1
712 ; SSE2-NEXT: pextrw $1, %xmm1, %ecx
713 ; SSE2-NEXT: pinsrw $0, %eax, %xmm1
714 ; SSE2-NEXT: movzbl %ah, %eax
715 ; SSE2-NEXT: pinsrw $2, %eax, %xmm1
716 ; SSE2-NEXT: pinsrw $4, %ecx, %xmm1
717 ; SSE2-NEXT: shrl $8, %ecx
718 ; SSE2-NEXT: pinsrw $6, %ecx, %xmm1
719 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,1,0]
720 ; SSE2-NEXT: movd %xmm2, %rax
721 ; SSE2-NEXT: movsbq %al, %rax
722 ; SSE2-NEXT: movd %rax, %xmm0
723 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
724 ; SSE2-NEXT: movd %xmm2, %rax
725 ; SSE2-NEXT: movsbq %al, %rax
726 ; SSE2-NEXT: movd %rax, %xmm2
727 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
728 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0]
729 ; SSE2-NEXT: movd %xmm2, %rax
730 ; SSE2-NEXT: movsbq %al, %rax
731 ; SSE2-NEXT: movd %rax, %xmm1
732 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
733 ; SSE2-NEXT: movd %xmm2, %rax
734 ; SSE2-NEXT: movsbq %al, %rax
735 ; SSE2-NEXT: movd %rax, %xmm2
736 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
739 ; SSSE3-LABEL: load_sext_4i8_to_4i64:
741 ; SSSE3-NEXT: movd (%rdi), %xmm1
742 ; SSSE3-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
743 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,1,0]
744 ; SSSE3-NEXT: movd %xmm2, %rax
745 ; SSSE3-NEXT: movsbq %al, %rax
746 ; SSSE3-NEXT: movd %rax, %xmm0
747 ; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
748 ; SSSE3-NEXT: movd %xmm2, %rax
749 ; SSSE3-NEXT: movsbq %al, %rax
750 ; SSSE3-NEXT: movd %rax, %xmm2
751 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
752 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0]
753 ; SSSE3-NEXT: movd %xmm2, %rax
754 ; SSSE3-NEXT: movsbq %al, %rax
755 ; SSSE3-NEXT: movd %rax, %xmm1
756 ; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
757 ; SSSE3-NEXT: movd %xmm2, %rax
758 ; SSSE3-NEXT: movsbq %al, %rax
759 ; SSSE3-NEXT: movd %rax, %xmm2
760 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
763 ; SSE41-LABEL: load_sext_4i8_to_4i64:
765 ; SSE41-NEXT: movd (%rdi), %xmm0
766 ; SSE41-NEXT: pmovzxbd %xmm0, %xmm1
767 ; SSE41-NEXT: pmovzxbq %xmm0, %xmm0
768 ; SSE41-NEXT: pextrq $1, %xmm0, %rax
769 ; SSE41-NEXT: movsbq %al, %rax
770 ; SSE41-NEXT: movd %rax, %xmm2
771 ; SSE41-NEXT: movd %xmm0, %rax
772 ; SSE41-NEXT: movsbq %al, %rax
773 ; SSE41-NEXT: movd %rax, %xmm0
774 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
775 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,0,3,0]
776 ; SSE41-NEXT: pextrq $1, %xmm1, %rax
777 ; SSE41-NEXT: movsbq %al, %rax
778 ; SSE41-NEXT: movd %rax, %xmm2
779 ; SSE41-NEXT: movd %xmm1, %rax
780 ; SSE41-NEXT: movsbq %al, %rax
781 ; SSE41-NEXT: movd %rax, %xmm1
782 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
785 ; AVX1-LABEL: load_sext_4i8_to_4i64:
787 ; AVX1-NEXT: vpmovsxbd (%rdi), %xmm0
788 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm1
789 ; AVX1-NEXT: vmovhlps {{.*#+}} xmm0 = xmm0[1,1]
790 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0
791 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
794 ; AVX2-LABEL: load_sext_4i8_to_4i64:
796 ; AVX2-NEXT: vpmovsxbq (%rdi), %ymm0
799 ; X32-SSE41-LABEL: load_sext_4i8_to_4i64:
800 ; X32-SSE41: ## BB#0:
801 ; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
802 ; X32-SSE41-NEXT: movd (%eax), %xmm0
803 ; X32-SSE41-NEXT: pmovzxbd %xmm0, %xmm1
804 ; X32-SSE41-NEXT: pmovzxbq %xmm0, %xmm2
805 ; X32-SSE41-NEXT: movd %xmm2, %eax
806 ; X32-SSE41-NEXT: movsbl %al, %eax
807 ; X32-SSE41-NEXT: movd %eax, %xmm0
808 ; X32-SSE41-NEXT: sarl $31, %eax
809 ; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm0
810 ; X32-SSE41-NEXT: pextrd $2, %xmm2, %eax
811 ; X32-SSE41-NEXT: movsbl %al, %eax
812 ; X32-SSE41-NEXT: pinsrd $2, %eax, %xmm0
813 ; X32-SSE41-NEXT: sarl $31, %eax
814 ; X32-SSE41-NEXT: pinsrd $3, %eax, %xmm0
815 ; X32-SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0]
816 ; X32-SSE41-NEXT: movd %xmm2, %eax
817 ; X32-SSE41-NEXT: movsbl %al, %eax
818 ; X32-SSE41-NEXT: movd %eax, %xmm1
819 ; X32-SSE41-NEXT: sarl $31, %eax
820 ; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm1
821 ; X32-SSE41-NEXT: pextrd $2, %xmm2, %eax
822 ; X32-SSE41-NEXT: movsbl %al, %eax
823 ; X32-SSE41-NEXT: pinsrd $2, %eax, %xmm1
824 ; X32-SSE41-NEXT: sarl $31, %eax
825 ; X32-SSE41-NEXT: pinsrd $3, %eax, %xmm1
826 ; X32-SSE41-NEXT: retl
827 %X = load <4 x i8>* %ptr
828 %Y = sext <4 x i8> %X to <4 x i64>
832 define <4 x i64> @load_sext_4i16_to_4i64(<4 x i16> *%ptr) {
833 ; SSE2-LABEL: load_sext_4i16_to_4i64:
835 ; SSE2-NEXT: movq (%rdi), %xmm1
836 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
837 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,1,0]
838 ; SSE2-NEXT: movd %xmm2, %rax
839 ; SSE2-NEXT: movswq %ax, %rax
840 ; SSE2-NEXT: movd %rax, %xmm0
841 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
842 ; SSE2-NEXT: movd %xmm2, %rax
843 ; SSE2-NEXT: movswq %ax, %rax
844 ; SSE2-NEXT: movd %rax, %xmm2
845 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
846 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0]
847 ; SSE2-NEXT: movd %xmm2, %rax
848 ; SSE2-NEXT: movswq %ax, %rax
849 ; SSE2-NEXT: movd %rax, %xmm1
850 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
851 ; SSE2-NEXT: movd %xmm2, %rax
852 ; SSE2-NEXT: movswq %ax, %rax
853 ; SSE2-NEXT: movd %rax, %xmm2
854 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
857 ; SSSE3-LABEL: load_sext_4i16_to_4i64:
859 ; SSSE3-NEXT: movq (%rdi), %xmm1
860 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
861 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,1,0]
862 ; SSSE3-NEXT: movd %xmm2, %rax
863 ; SSSE3-NEXT: movswq %ax, %rax
864 ; SSSE3-NEXT: movd %rax, %xmm0
865 ; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
866 ; SSSE3-NEXT: movd %xmm2, %rax
867 ; SSSE3-NEXT: movswq %ax, %rax
868 ; SSSE3-NEXT: movd %rax, %xmm2
869 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
870 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0]
871 ; SSSE3-NEXT: movd %xmm2, %rax
872 ; SSSE3-NEXT: movswq %ax, %rax
873 ; SSSE3-NEXT: movd %rax, %xmm1
874 ; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
875 ; SSSE3-NEXT: movd %xmm2, %rax
876 ; SSSE3-NEXT: movswq %ax, %rax
877 ; SSSE3-NEXT: movd %rax, %xmm2
878 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
881 ; SSE41-LABEL: load_sext_4i16_to_4i64:
883 ; SSE41-NEXT: movq (%rdi), %xmm0
884 ; SSE41-NEXT: pmovzxwd %xmm0, %xmm1
885 ; SSE41-NEXT: pmovzxwq %xmm0, %xmm0
886 ; SSE41-NEXT: pextrq $1, %xmm0, %rax
887 ; SSE41-NEXT: movswq %ax, %rax
888 ; SSE41-NEXT: movd %rax, %xmm2
889 ; SSE41-NEXT: movd %xmm0, %rax
890 ; SSE41-NEXT: movswq %ax, %rax
891 ; SSE41-NEXT: movd %rax, %xmm0
892 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
893 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,0,3,0]
894 ; SSE41-NEXT: pextrq $1, %xmm1, %rax
895 ; SSE41-NEXT: movswq %ax, %rax
896 ; SSE41-NEXT: movd %rax, %xmm2
897 ; SSE41-NEXT: movd %xmm1, %rax
898 ; SSE41-NEXT: movswq %ax, %rax
899 ; SSE41-NEXT: movd %rax, %xmm1
900 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
903 ; AVX1-LABEL: load_sext_4i16_to_4i64:
905 ; AVX1-NEXT: vpmovsxwd (%rdi), %xmm0
906 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm1
907 ; AVX1-NEXT: vmovhlps {{.*#+}} xmm0 = xmm0[1,1]
908 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0
909 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
912 ; AVX2-LABEL: load_sext_4i16_to_4i64:
914 ; AVX2-NEXT: vpmovsxwq (%rdi), %ymm0
917 ; X32-SSE41-LABEL: load_sext_4i16_to_4i64:
918 ; X32-SSE41: ## BB#0:
919 ; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
920 ; X32-SSE41-NEXT: movsd (%eax), %xmm0
921 ; X32-SSE41-NEXT: pmovzxwd %xmm0, %xmm1
922 ; X32-SSE41-NEXT: pmovzxwq %xmm0, %xmm2
923 ; X32-SSE41-NEXT: movd %xmm2, %eax
924 ; X32-SSE41-NEXT: cwtl
925 ; X32-SSE41-NEXT: movd %eax, %xmm0
926 ; X32-SSE41-NEXT: sarl $31, %eax
927 ; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm0
928 ; X32-SSE41-NEXT: pextrd $2, %xmm2, %eax
929 ; X32-SSE41-NEXT: cwtl
930 ; X32-SSE41-NEXT: pinsrd $2, %eax, %xmm0
931 ; X32-SSE41-NEXT: sarl $31, %eax
932 ; X32-SSE41-NEXT: pinsrd $3, %eax, %xmm0
933 ; X32-SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0]
934 ; X32-SSE41-NEXT: movd %xmm2, %eax
935 ; X32-SSE41-NEXT: cwtl
936 ; X32-SSE41-NEXT: movd %eax, %xmm1
937 ; X32-SSE41-NEXT: sarl $31, %eax
938 ; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm1
939 ; X32-SSE41-NEXT: pextrd $2, %xmm2, %eax
940 ; X32-SSE41-NEXT: cwtl
941 ; X32-SSE41-NEXT: pinsrd $2, %eax, %xmm1
942 ; X32-SSE41-NEXT: sarl $31, %eax
943 ; X32-SSE41-NEXT: pinsrd $3, %eax, %xmm1
944 ; X32-SSE41-NEXT: retl
945 %X = load <4 x i16>* %ptr
946 %Y = sext <4 x i16> %X to <4 x i64>