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
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
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],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:
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],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:
36 ; SSE41: # BB#0: # %entry
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:
47 ; AVX1: # BB#0: # %entry
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:
55 ; AVX2: # BB#0: # %entry
56 ; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0
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: 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:
76 ; SSE2: # BB#0: # %entry
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:
99 ; SSSE3: # BB#0: # %entry
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:
122 ; SSE41: # BB#0: # %entry
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:
143 ; AVX1: # BB#0: # %entry
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:
151 ; AVX2: # BB#0: # %entry
152 ; AVX2-NEXT: vpmovsxdq %xmm0, %ymm0
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,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:
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
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
193 ; SSE41-LABEL: load_sext_test1:
194 ; SSE41: # BB#0: # %entry
195 ; SSE41-NEXT: pmovsxwd (%rdi), %xmm0
198 ; AVX-LABEL: load_sext_test1:
199 ; AVX: # BB#0: # %entry
200 ; AVX-NEXT: vpmovsxwd (%rdi), %xmm0
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
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:
216 ; SSE2: # BB#0: # %entry
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:
232 ; SSSE3: # BB#0: # %entry
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:
239 ; SSE41: # BB#0: # %entry
240 ; SSE41-NEXT: pmovsxbd (%rdi), %xmm0
243 ; AVX-LABEL: load_sext_test2:
244 ; AVX: # BB#0: # %entry
245 ; AVX-NEXT: vpmovsxbd (%rdi), %xmm0
248 ; X32-SSE41-LABEL: load_sext_test2:
249 ; X32-SSE41: # BB#0: # %entry
250 ; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
251 ; X32-SSE41-NEXT: pmovsxbd (%eax), %xmm0
252 ; X32-SSE41-NEXT: retl
254 %X = load <4 x i8>* %ptr
255 %Y = sext <4 x i8> %X to <4 x i32>
259 define <2 x i64> @load_sext_test3(<2 x i8> *%ptr) {
260 ; SSE2-LABEL: load_sext_test3:
261 ; SSE2: # BB#0: # %entry
262 ; SSE2-NEXT: movsbq 1(%rdi), %rax
263 ; SSE2-NEXT: movd %rax, %xmm1
264 ; SSE2-NEXT: movsbq (%rdi), %rax
265 ; SSE2-NEXT: movd %rax, %xmm0
266 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
269 ; SSSE3-LABEL: load_sext_test3:
270 ; SSSE3: # BB#0: # %entry
271 ; SSSE3-NEXT: movsbq 1(%rdi), %rax
272 ; SSSE3-NEXT: movd %rax, %xmm1
273 ; SSSE3-NEXT: movsbq (%rdi), %rax
274 ; SSSE3-NEXT: movd %rax, %xmm0
275 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
278 ; SSE41-LABEL: load_sext_test3:
279 ; SSE41: # BB#0: # %entry
280 ; SSE41-NEXT: pmovsxbq (%rdi), %xmm0
283 ; AVX-LABEL: load_sext_test3:
284 ; AVX: # BB#0: # %entry
285 ; AVX-NEXT: vpmovsxbq (%rdi), %xmm0
288 ; X32-SSE41-LABEL: load_sext_test3:
289 ; X32-SSE41: # BB#0: # %entry
290 ; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
291 ; X32-SSE41-NEXT: pmovsxbq (%eax), %xmm0
292 ; X32-SSE41-NEXT: retl
294 %X = load <2 x i8>* %ptr
295 %Y = sext <2 x i8> %X to <2 x i64>
299 define <2 x i64> @load_sext_test4(<2 x i16> *%ptr) {
300 ; SSE2-LABEL: load_sext_test4:
301 ; SSE2: # BB#0: # %entry
302 ; SSE2-NEXT: movswq 2(%rdi), %rax
303 ; SSE2-NEXT: movd %rax, %xmm1
304 ; SSE2-NEXT: movswq (%rdi), %rax
305 ; SSE2-NEXT: movd %rax, %xmm0
306 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
309 ; SSSE3-LABEL: load_sext_test4:
310 ; SSSE3: # BB#0: # %entry
311 ; SSSE3-NEXT: movswq 2(%rdi), %rax
312 ; SSSE3-NEXT: movd %rax, %xmm1
313 ; SSSE3-NEXT: movswq (%rdi), %rax
314 ; SSSE3-NEXT: movd %rax, %xmm0
315 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
318 ; SSE41-LABEL: load_sext_test4:
319 ; SSE41: # BB#0: # %entry
320 ; SSE41-NEXT: pmovsxwq (%rdi), %xmm0
323 ; AVX-LABEL: load_sext_test4:
324 ; AVX: # BB#0: # %entry
325 ; AVX-NEXT: vpmovsxwq (%rdi), %xmm0
328 ; X32-SSE41-LABEL: load_sext_test4:
329 ; X32-SSE41: # BB#0: # %entry
330 ; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
331 ; X32-SSE41-NEXT: pmovsxwq (%eax), %xmm0
332 ; X32-SSE41-NEXT: retl
334 %X = load <2 x i16>* %ptr
335 %Y = sext <2 x i16> %X to <2 x i64>
339 define <2 x i64> @load_sext_test5(<2 x i32> *%ptr) {
340 ; SSE2-LABEL: load_sext_test5:
341 ; SSE2: # BB#0: # %entry
342 ; SSE2-NEXT: movslq 4(%rdi), %rax
343 ; SSE2-NEXT: movd %rax, %xmm1
344 ; SSE2-NEXT: movslq (%rdi), %rax
345 ; SSE2-NEXT: movd %rax, %xmm0
346 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
349 ; SSSE3-LABEL: load_sext_test5:
350 ; SSSE3: # BB#0: # %entry
351 ; SSSE3-NEXT: movslq 4(%rdi), %rax
352 ; SSSE3-NEXT: movd %rax, %xmm1
353 ; SSSE3-NEXT: movslq (%rdi), %rax
354 ; SSSE3-NEXT: movd %rax, %xmm0
355 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
358 ; SSE41-LABEL: load_sext_test5:
359 ; SSE41: # BB#0: # %entry
360 ; SSE41-NEXT: pmovsxdq (%rdi), %xmm0
363 ; AVX-LABEL: load_sext_test5:
364 ; AVX: # BB#0: # %entry
365 ; AVX-NEXT: vpmovsxdq (%rdi), %xmm0
368 ; X32-SSE41-LABEL: load_sext_test5:
369 ; X32-SSE41: # BB#0: # %entry
370 ; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
371 ; X32-SSE41-NEXT: pmovsxdq (%eax), %xmm0
372 ; X32-SSE41-NEXT: retl
374 %X = load <2 x i32>* %ptr
375 %Y = sext <2 x i32> %X to <2 x i64>
379 define <8 x i16> @load_sext_test6(<8 x i8> *%ptr) {
380 ; SSE2-LABEL: load_sext_test6:
381 ; SSE2: # BB#0: # %entry
382 ; SSE2-NEXT: movq (%rdi), %xmm0
383 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
384 ; SSE2-NEXT: psraw $8, %xmm0
387 ; SSSE3-LABEL: load_sext_test6:
388 ; SSSE3: # BB#0: # %entry
389 ; SSSE3-NEXT: movq (%rdi), %xmm0
390 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
391 ; SSSE3-NEXT: psraw $8, %xmm0
394 ; SSE41-LABEL: load_sext_test6:
395 ; SSE41: # BB#0: # %entry
396 ; SSE41-NEXT: pmovsxbw (%rdi), %xmm0
399 ; AVX-LABEL: load_sext_test6:
400 ; AVX: # BB#0: # %entry
401 ; AVX-NEXT: vpmovsxbw (%rdi), %xmm0
404 ; X32-SSE41-LABEL: load_sext_test6:
405 ; X32-SSE41: # BB#0: # %entry
406 ; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
407 ; X32-SSE41-NEXT: pmovsxbw (%eax), %xmm0
408 ; X32-SSE41-NEXT: retl
410 %X = load <8 x i8>* %ptr
411 %Y = sext <8 x i8> %X to <8 x i16>
415 define <4 x i64> @sext_4i1_to_4i64(<4 x i1> %mask) {
416 ; SSE2-LABEL: sext_4i1_to_4i64:
418 ; SSE2-NEXT: pslld $31, %xmm0
419 ; SSE2-NEXT: psrad $31, %xmm0
420 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0]
421 ; SSE2-NEXT: movd %xmm1, %rax
423 ; SSE2-NEXT: movd %rax, %xmm2
424 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
425 ; SSE2-NEXT: movd %xmm1, %rax
427 ; SSE2-NEXT: movd %rax, %xmm1
428 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
429 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
430 ; SSE2-NEXT: movd %xmm0, %rax
432 ; SSE2-NEXT: movd %rax, %xmm1
433 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
434 ; SSE2-NEXT: movd %xmm0, %rax
436 ; SSE2-NEXT: movd %rax, %xmm0
437 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
438 ; SSE2-NEXT: movdqa %xmm2, %xmm0
441 ; SSSE3-LABEL: sext_4i1_to_4i64:
443 ; SSSE3-NEXT: pslld $31, %xmm0
444 ; SSSE3-NEXT: psrad $31, %xmm0
445 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0]
446 ; SSSE3-NEXT: movd %xmm1, %rax
448 ; SSSE3-NEXT: movd %rax, %xmm2
449 ; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
450 ; SSSE3-NEXT: movd %xmm1, %rax
452 ; SSSE3-NEXT: movd %rax, %xmm1
453 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
454 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
455 ; SSSE3-NEXT: movd %xmm0, %rax
457 ; SSSE3-NEXT: movd %rax, %xmm1
458 ; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
459 ; SSSE3-NEXT: movd %xmm0, %rax
461 ; SSSE3-NEXT: movd %rax, %xmm0
462 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
463 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
466 ; SSE41-LABEL: sext_4i1_to_4i64:
468 ; SSE41-NEXT: pslld $31, %xmm0
469 ; SSE41-NEXT: psrad $31, %xmm0
470 ; SSE41-NEXT: pmovzxdq %xmm0, %xmm1
471 ; SSE41-NEXT: pextrq $1, %xmm1, %rax
473 ; SSE41-NEXT: movd %rax, %xmm3
474 ; SSE41-NEXT: movd %xmm1, %rax
476 ; SSE41-NEXT: movd %rax, %xmm2
477 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
478 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
479 ; SSE41-NEXT: pextrq $1, %xmm0, %rax
481 ; SSE41-NEXT: movd %rax, %xmm3
482 ; SSE41-NEXT: movd %xmm0, %rax
484 ; SSE41-NEXT: movd %rax, %xmm1
485 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
486 ; SSE41-NEXT: movdqa %xmm2, %xmm0
489 ; AVX1-LABEL: sext_4i1_to_4i64:
491 ; AVX1-NEXT: vpslld $31, %xmm0, %xmm0
492 ; AVX1-NEXT: vpsrad $31, %xmm0, %xmm0
493 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm1
494 ; AVX1-NEXT: vmovhlps {{.*#+}} xmm0 = xmm0[1,1]
495 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0
496 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
499 ; AVX2-LABEL: sext_4i1_to_4i64:
501 ; AVX2-NEXT: vpslld $31, %xmm0, %xmm0
502 ; AVX2-NEXT: vpsrad $31, %xmm0, %xmm0
503 ; AVX2-NEXT: vpmovsxdq %xmm0, %ymm0
506 ; X32-SSE41-LABEL: sext_4i1_to_4i64:
508 ; X32-SSE41-NEXT: pslld $31, %xmm0
509 ; X32-SSE41-NEXT: psrad $31, %xmm0
510 ; X32-SSE41-NEXT: pmovzxdq %xmm0, %xmm2
511 ; X32-SSE41-NEXT: movd %xmm2, %eax
512 ; X32-SSE41-NEXT: sarl $31, %eax
513 ; X32-SSE41-NEXT: pextrd $2, %xmm2, %ecx
514 ; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm2
515 ; X32-SSE41-NEXT: sarl $31, %ecx
516 ; X32-SSE41-NEXT: pinsrd $3, %ecx, %xmm2
517 ; X32-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,0,3,0]
518 ; X32-SSE41-NEXT: movd %xmm1, %eax
519 ; X32-SSE41-NEXT: sarl $31, %eax
520 ; X32-SSE41-NEXT: pextrd $2, %xmm1, %ecx
521 ; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm1
522 ; X32-SSE41-NEXT: sarl $31, %ecx
523 ; X32-SSE41-NEXT: pinsrd $3, %ecx, %xmm1
524 ; X32-SSE41-NEXT: movdqa %xmm2, %xmm0
525 ; X32-SSE41-NEXT: retl
526 %extmask = sext <4 x i1> %mask to <4 x i64>
527 ret <4 x i64> %extmask
530 define <16 x i16> @sext_16i8_to_16i16(<16 x i8> *%ptr) {
531 ; SSE2-LABEL: sext_16i8_to_16i16:
532 ; SSE2: # BB#0: # %entry
533 ; SSE2-NEXT: movdqa (%rdi), %xmm1
534 ; SSE2-NEXT: movdqa %xmm1, %xmm0
535 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
536 ; SSE2-NEXT: psllw $8, %xmm0
537 ; SSE2-NEXT: psraw $8, %xmm0
538 ; 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]
539 ; SSE2-NEXT: psllw $8, %xmm1
540 ; SSE2-NEXT: psraw $8, %xmm1
543 ; SSSE3-LABEL: sext_16i8_to_16i16:
544 ; SSSE3: # BB#0: # %entry
545 ; SSSE3-NEXT: movdqa (%rdi), %xmm1
546 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
547 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
548 ; SSSE3-NEXT: psllw $8, %xmm0
549 ; SSSE3-NEXT: psraw $8, %xmm0
550 ; 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]
551 ; SSSE3-NEXT: psllw $8, %xmm1
552 ; SSSE3-NEXT: psraw $8, %xmm1
555 ; SSE41-LABEL: sext_16i8_to_16i16:
556 ; SSE41: # BB#0: # %entry
557 ; SSE41-NEXT: movdqa (%rdi), %xmm1
558 ; SSE41-NEXT: pmovzxbw %xmm1, %xmm0
559 ; 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]
560 ; SSE41-NEXT: psllw $8, %xmm1
561 ; SSE41-NEXT: psraw $8, %xmm1
562 ; SSE41-NEXT: psllw $8, %xmm0
563 ; SSE41-NEXT: psraw $8, %xmm0
566 ; AVX1-LABEL: sext_16i8_to_16i16:
567 ; AVX1: # BB#0: # %entry
568 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
569 ; AVX1-NEXT: vpmovsxbw %xmm0, %xmm1
570 ; AVX1-NEXT: vmovhlps {{.*#+}} xmm0 = xmm0[1,1]
571 ; AVX1-NEXT: vpmovsxbw %xmm0, %xmm0
572 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
575 ; AVX2-LABEL: sext_16i8_to_16i16:
576 ; AVX2: # BB#0: # %entry
577 ; AVX2-NEXT: vmovdqa (%rdi), %xmm0
578 ; AVX2-NEXT: vpmovsxbw %xmm0, %ymm0
581 ; X32-SSE41-LABEL: sext_16i8_to_16i16:
582 ; X32-SSE41: # BB#0: # %entry
583 ; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
584 ; X32-SSE41-NEXT: movdqa (%eax), %xmm1
585 ; X32-SSE41-NEXT: pmovzxbw %xmm1, %xmm0
586 ; 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]
587 ; X32-SSE41-NEXT: psllw $8, %xmm1
588 ; X32-SSE41-NEXT: psraw $8, %xmm1
589 ; X32-SSE41-NEXT: psllw $8, %xmm0
590 ; X32-SSE41-NEXT: psraw $8, %xmm0
591 ; X32-SSE41-NEXT: retl
593 %X = load <16 x i8>* %ptr
594 %Y = sext <16 x i8> %X to <16 x i16>
598 define <4 x i64> @sext_4i8_to_4i64(<4 x i8> %mask) {
599 ; SSE2-LABEL: sext_4i8_to_4i64:
601 ; SSE2-NEXT: pslld $24, %xmm0
602 ; SSE2-NEXT: psrad $24, %xmm0
603 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0]
604 ; SSE2-NEXT: movd %xmm1, %rax
606 ; SSE2-NEXT: movd %rax, %xmm2
607 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
608 ; SSE2-NEXT: movd %xmm1, %rax
610 ; SSE2-NEXT: movd %rax, %xmm1
611 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
612 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
613 ; SSE2-NEXT: movd %xmm0, %rax
615 ; SSE2-NEXT: movd %rax, %xmm1
616 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
617 ; SSE2-NEXT: movd %xmm0, %rax
619 ; SSE2-NEXT: movd %rax, %xmm0
620 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
621 ; SSE2-NEXT: movdqa %xmm2, %xmm0
624 ; SSSE3-LABEL: sext_4i8_to_4i64:
626 ; SSSE3-NEXT: pslld $24, %xmm0
627 ; SSSE3-NEXT: psrad $24, %xmm0
628 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0]
629 ; SSSE3-NEXT: movd %xmm1, %rax
631 ; SSSE3-NEXT: movd %rax, %xmm2
632 ; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
633 ; SSSE3-NEXT: movd %xmm1, %rax
635 ; SSSE3-NEXT: movd %rax, %xmm1
636 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
637 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
638 ; SSSE3-NEXT: movd %xmm0, %rax
640 ; SSSE3-NEXT: movd %rax, %xmm1
641 ; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
642 ; SSSE3-NEXT: movd %xmm0, %rax
644 ; SSSE3-NEXT: movd %rax, %xmm0
645 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
646 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
649 ; SSE41-LABEL: sext_4i8_to_4i64:
651 ; SSE41-NEXT: pslld $24, %xmm0
652 ; SSE41-NEXT: psrad $24, %xmm0
653 ; SSE41-NEXT: pmovzxdq %xmm0, %xmm1
654 ; SSE41-NEXT: pextrq $1, %xmm1, %rax
656 ; SSE41-NEXT: movd %rax, %xmm3
657 ; SSE41-NEXT: movd %xmm1, %rax
659 ; SSE41-NEXT: movd %rax, %xmm2
660 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
661 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
662 ; SSE41-NEXT: pextrq $1, %xmm0, %rax
664 ; SSE41-NEXT: movd %rax, %xmm3
665 ; SSE41-NEXT: movd %xmm0, %rax
667 ; SSE41-NEXT: movd %rax, %xmm1
668 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
669 ; SSE41-NEXT: movdqa %xmm2, %xmm0
672 ; AVX1-LABEL: sext_4i8_to_4i64:
674 ; AVX1-NEXT: vpslld $24, %xmm0, %xmm0
675 ; AVX1-NEXT: vpsrad $24, %xmm0, %xmm0
676 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm1
677 ; AVX1-NEXT: vmovhlps {{.*#+}} xmm0 = xmm0[1,1]
678 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0
679 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
682 ; AVX2-LABEL: sext_4i8_to_4i64:
684 ; AVX2-NEXT: vpslld $24, %xmm0, %xmm0
685 ; AVX2-NEXT: vpsrad $24, %xmm0, %xmm0
686 ; AVX2-NEXT: vpmovsxdq %xmm0, %ymm0
689 ; X32-SSE41-LABEL: sext_4i8_to_4i64:
691 ; X32-SSE41-NEXT: pslld $24, %xmm0
692 ; X32-SSE41-NEXT: psrad $24, %xmm0
693 ; X32-SSE41-NEXT: pmovzxdq %xmm0, %xmm2
694 ; X32-SSE41-NEXT: movd %xmm2, %eax
695 ; X32-SSE41-NEXT: sarl $31, %eax
696 ; X32-SSE41-NEXT: pextrd $2, %xmm2, %ecx
697 ; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm2
698 ; X32-SSE41-NEXT: sarl $31, %ecx
699 ; X32-SSE41-NEXT: pinsrd $3, %ecx, %xmm2
700 ; X32-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,0,3,0]
701 ; X32-SSE41-NEXT: movd %xmm1, %eax
702 ; X32-SSE41-NEXT: sarl $31, %eax
703 ; X32-SSE41-NEXT: pextrd $2, %xmm1, %ecx
704 ; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm1
705 ; X32-SSE41-NEXT: sarl $31, %ecx
706 ; X32-SSE41-NEXT: pinsrd $3, %ecx, %xmm1
707 ; X32-SSE41-NEXT: movdqa %xmm2, %xmm0
708 ; X32-SSE41-NEXT: retl
709 %extmask = sext <4 x i8> %mask to <4 x i64>
710 ret <4 x i64> %extmask
713 define <4 x i64> @load_sext_4i8_to_4i64(<4 x i8> *%ptr) {
714 ; SSE2-LABEL: load_sext_4i8_to_4i64:
715 ; SSE2: # BB#0: # %entry
716 ; SSE2-NEXT: movl (%rdi), %eax
717 ; SSE2-NEXT: movd %eax, %xmm1
718 ; SSE2-NEXT: pextrw $1, %xmm1, %ecx
719 ; SSE2-NEXT: pinsrw $0, %eax, %xmm1
720 ; SSE2-NEXT: movzbl %ah, %eax
721 ; SSE2-NEXT: pinsrw $2, %eax, %xmm1
722 ; SSE2-NEXT: pinsrw $4, %ecx, %xmm1
723 ; SSE2-NEXT: shrl $8, %ecx
724 ; SSE2-NEXT: pinsrw $6, %ecx, %xmm1
725 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,1,0]
726 ; SSE2-NEXT: movd %xmm2, %rax
727 ; SSE2-NEXT: movsbq %al, %rax
728 ; SSE2-NEXT: movd %rax, %xmm0
729 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
730 ; SSE2-NEXT: movd %xmm2, %rax
731 ; SSE2-NEXT: movsbq %al, %rax
732 ; SSE2-NEXT: movd %rax, %xmm2
733 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
734 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0]
735 ; SSE2-NEXT: movd %xmm2, %rax
736 ; SSE2-NEXT: movsbq %al, %rax
737 ; SSE2-NEXT: movd %rax, %xmm1
738 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
739 ; SSE2-NEXT: movd %xmm2, %rax
740 ; SSE2-NEXT: movsbq %al, %rax
741 ; SSE2-NEXT: movd %rax, %xmm2
742 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
745 ; SSSE3-LABEL: load_sext_4i8_to_4i64:
746 ; SSSE3: # BB#0: # %entry
747 ; SSSE3-NEXT: movd (%rdi), %xmm1
748 ; SSSE3-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
749 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,1,0]
750 ; SSSE3-NEXT: movd %xmm2, %rax
751 ; SSSE3-NEXT: movsbq %al, %rax
752 ; SSSE3-NEXT: movd %rax, %xmm0
753 ; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
754 ; SSSE3-NEXT: movd %xmm2, %rax
755 ; SSSE3-NEXT: movsbq %al, %rax
756 ; SSSE3-NEXT: movd %rax, %xmm2
757 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
758 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0]
759 ; SSSE3-NEXT: movd %xmm2, %rax
760 ; SSSE3-NEXT: movsbq %al, %rax
761 ; SSSE3-NEXT: movd %rax, %xmm1
762 ; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
763 ; SSSE3-NEXT: movd %xmm2, %rax
764 ; SSSE3-NEXT: movsbq %al, %rax
765 ; SSSE3-NEXT: movd %rax, %xmm2
766 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
769 ; SSE41-LABEL: load_sext_4i8_to_4i64:
770 ; SSE41: # BB#0: # %entry
771 ; SSE41-NEXT: movd (%rdi), %xmm0
772 ; SSE41-NEXT: pmovzxbd %xmm0, %xmm1
773 ; SSE41-NEXT: pmovzxbq %xmm0, %xmm0
774 ; SSE41-NEXT: pextrq $1, %xmm0, %rax
775 ; SSE41-NEXT: movsbq %al, %rax
776 ; SSE41-NEXT: movd %rax, %xmm2
777 ; SSE41-NEXT: movd %xmm0, %rax
778 ; SSE41-NEXT: movsbq %al, %rax
779 ; SSE41-NEXT: movd %rax, %xmm0
780 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
781 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,0,3,0]
782 ; SSE41-NEXT: pextrq $1, %xmm1, %rax
783 ; SSE41-NEXT: movsbq %al, %rax
784 ; SSE41-NEXT: movd %rax, %xmm2
785 ; SSE41-NEXT: movd %xmm1, %rax
786 ; SSE41-NEXT: movsbq %al, %rax
787 ; SSE41-NEXT: movd %rax, %xmm1
788 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
791 ; AVX1-LABEL: load_sext_4i8_to_4i64:
792 ; AVX1: # BB#0: # %entry
793 ; AVX1-NEXT: vpmovsxbd (%rdi), %xmm0
794 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm1
795 ; AVX1-NEXT: vmovhlps {{.*#+}} xmm0 = xmm0[1,1]
796 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0
797 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
800 ; AVX2-LABEL: load_sext_4i8_to_4i64:
801 ; AVX2: # BB#0: # %entry
802 ; AVX2-NEXT: vpmovsxbq (%rdi), %ymm0
805 ; X32-SSE41-LABEL: load_sext_4i8_to_4i64:
806 ; X32-SSE41: # BB#0: # %entry
807 ; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
808 ; X32-SSE41-NEXT: movd (%eax), %xmm0
809 ; X32-SSE41-NEXT: pmovzxbd %xmm0, %xmm1
810 ; X32-SSE41-NEXT: pmovzxbq %xmm0, %xmm2
811 ; X32-SSE41-NEXT: movd %xmm2, %eax
812 ; X32-SSE41-NEXT: movsbl %al, %eax
813 ; X32-SSE41-NEXT: movd %eax, %xmm0
814 ; X32-SSE41-NEXT: sarl $31, %eax
815 ; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm0
816 ; X32-SSE41-NEXT: pextrd $2, %xmm2, %eax
817 ; X32-SSE41-NEXT: movsbl %al, %eax
818 ; X32-SSE41-NEXT: pinsrd $2, %eax, %xmm0
819 ; X32-SSE41-NEXT: sarl $31, %eax
820 ; X32-SSE41-NEXT: pinsrd $3, %eax, %xmm0
821 ; X32-SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0]
822 ; X32-SSE41-NEXT: movd %xmm2, %eax
823 ; X32-SSE41-NEXT: movsbl %al, %eax
824 ; X32-SSE41-NEXT: movd %eax, %xmm1
825 ; X32-SSE41-NEXT: sarl $31, %eax
826 ; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm1
827 ; X32-SSE41-NEXT: pextrd $2, %xmm2, %eax
828 ; X32-SSE41-NEXT: movsbl %al, %eax
829 ; X32-SSE41-NEXT: pinsrd $2, %eax, %xmm1
830 ; X32-SSE41-NEXT: sarl $31, %eax
831 ; X32-SSE41-NEXT: pinsrd $3, %eax, %xmm1
832 ; X32-SSE41-NEXT: retl
834 %X = load <4 x i8>* %ptr
835 %Y = sext <4 x i8> %X to <4 x i64>
839 define <4 x i64> @load_sext_4i16_to_4i64(<4 x i16> *%ptr) {
840 ; SSE2-LABEL: load_sext_4i16_to_4i64:
841 ; SSE2: # BB#0: # %entry
842 ; SSE2-NEXT: movq (%rdi), %xmm1
843 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
844 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,1,0]
845 ; SSE2-NEXT: movd %xmm2, %rax
846 ; SSE2-NEXT: movswq %ax, %rax
847 ; SSE2-NEXT: movd %rax, %xmm0
848 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
849 ; SSE2-NEXT: movd %xmm2, %rax
850 ; SSE2-NEXT: movswq %ax, %rax
851 ; SSE2-NEXT: movd %rax, %xmm2
852 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
853 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0]
854 ; SSE2-NEXT: movd %xmm2, %rax
855 ; SSE2-NEXT: movswq %ax, %rax
856 ; SSE2-NEXT: movd %rax, %xmm1
857 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
858 ; SSE2-NEXT: movd %xmm2, %rax
859 ; SSE2-NEXT: movswq %ax, %rax
860 ; SSE2-NEXT: movd %rax, %xmm2
861 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
864 ; SSSE3-LABEL: load_sext_4i16_to_4i64:
865 ; SSSE3: # BB#0: # %entry
866 ; SSSE3-NEXT: movq (%rdi), %xmm1
867 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
868 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,1,0]
869 ; SSSE3-NEXT: movd %xmm2, %rax
870 ; SSSE3-NEXT: movswq %ax, %rax
871 ; SSSE3-NEXT: movd %rax, %xmm0
872 ; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
873 ; SSSE3-NEXT: movd %xmm2, %rax
874 ; SSSE3-NEXT: movswq %ax, %rax
875 ; SSSE3-NEXT: movd %rax, %xmm2
876 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
877 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0]
878 ; SSSE3-NEXT: movd %xmm2, %rax
879 ; SSSE3-NEXT: movswq %ax, %rax
880 ; SSSE3-NEXT: movd %rax, %xmm1
881 ; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
882 ; SSSE3-NEXT: movd %xmm2, %rax
883 ; SSSE3-NEXT: movswq %ax, %rax
884 ; SSSE3-NEXT: movd %rax, %xmm2
885 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
888 ; SSE41-LABEL: load_sext_4i16_to_4i64:
889 ; SSE41: # BB#0: # %entry
890 ; SSE41-NEXT: movq (%rdi), %xmm0
891 ; SSE41-NEXT: pmovzxwd %xmm0, %xmm1
892 ; SSE41-NEXT: pmovzxwq %xmm0, %xmm0
893 ; SSE41-NEXT: pextrq $1, %xmm0, %rax
894 ; SSE41-NEXT: movswq %ax, %rax
895 ; SSE41-NEXT: movd %rax, %xmm2
896 ; SSE41-NEXT: movd %xmm0, %rax
897 ; SSE41-NEXT: movswq %ax, %rax
898 ; SSE41-NEXT: movd %rax, %xmm0
899 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
900 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,0,3,0]
901 ; SSE41-NEXT: pextrq $1, %xmm1, %rax
902 ; SSE41-NEXT: movswq %ax, %rax
903 ; SSE41-NEXT: movd %rax, %xmm2
904 ; SSE41-NEXT: movd %xmm1, %rax
905 ; SSE41-NEXT: movswq %ax, %rax
906 ; SSE41-NEXT: movd %rax, %xmm1
907 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
910 ; AVX1-LABEL: load_sext_4i16_to_4i64:
911 ; AVX1: # BB#0: # %entry
912 ; AVX1-NEXT: vpmovsxwd (%rdi), %xmm0
913 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm1
914 ; AVX1-NEXT: vmovhlps {{.*#+}} xmm0 = xmm0[1,1]
915 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0
916 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
919 ; AVX2-LABEL: load_sext_4i16_to_4i64:
920 ; AVX2: # BB#0: # %entry
921 ; AVX2-NEXT: vpmovsxwq (%rdi), %ymm0
924 ; X32-SSE41-LABEL: load_sext_4i16_to_4i64:
925 ; X32-SSE41: # BB#0: # %entry
926 ; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
927 ; X32-SSE41-NEXT: movsd (%eax), %xmm0
928 ; X32-SSE41-NEXT: pmovzxwd %xmm0, %xmm1
929 ; X32-SSE41-NEXT: pmovzxwq %xmm0, %xmm2
930 ; X32-SSE41-NEXT: movd %xmm2, %eax
931 ; X32-SSE41-NEXT: cwtl
932 ; X32-SSE41-NEXT: movd %eax, %xmm0
933 ; X32-SSE41-NEXT: sarl $31, %eax
934 ; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm0
935 ; X32-SSE41-NEXT: pextrd $2, %xmm2, %eax
936 ; X32-SSE41-NEXT: cwtl
937 ; X32-SSE41-NEXT: pinsrd $2, %eax, %xmm0
938 ; X32-SSE41-NEXT: sarl $31, %eax
939 ; X32-SSE41-NEXT: pinsrd $3, %eax, %xmm0
940 ; X32-SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0]
941 ; X32-SSE41-NEXT: movd %xmm2, %eax
942 ; X32-SSE41-NEXT: cwtl
943 ; X32-SSE41-NEXT: movd %eax, %xmm1
944 ; X32-SSE41-NEXT: sarl $31, %eax
945 ; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm1
946 ; X32-SSE41-NEXT: pextrd $2, %xmm2, %eax
947 ; X32-SSE41-NEXT: cwtl
948 ; X32-SSE41-NEXT: pinsrd $2, %eax, %xmm1
949 ; X32-SSE41-NEXT: sarl $31, %eax
950 ; X32-SSE41-NEXT: pinsrd $3, %eax, %xmm1
951 ; X32-SSE41-NEXT: retl
953 %X = load <4 x i16>* %ptr
954 %Y = sext <4 x i16> %X to <4 x i64>