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,4,5,5,6,6,7,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,4,5,5,6,6,7,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: 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
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
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: 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
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,1,1,3]
78 ; SSE2-NEXT: movd %xmm1, %rax
80 ; SSE2-NEXT: movd %rax, %xmm2
81 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,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,2,3,3]
87 ; SSE2-NEXT: movd %xmm0, %rax
89 ; SSE2-NEXT: movd %rax, %xmm1
90 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,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,1,1,3]
101 ; SSSE3-NEXT: movd %xmm1, %rax
103 ; SSSE3-NEXT: movd %rax, %xmm2
104 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,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,2,3,3]
110 ; SSSE3-NEXT: movd %xmm0, %rax
112 ; SSSE3-NEXT: movd %rax, %xmm1
113 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,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,2,3,3]
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: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,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,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
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: 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
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
231 ; SSE41-LABEL: load_sext_test2:
232 ; SSE41: # BB#0: # %entry
233 ; SSE41-NEXT: pmovsxbd (%rdi), %xmm0
236 ; AVX-LABEL: load_sext_test2:
237 ; AVX: # BB#0: # %entry
238 ; AVX-NEXT: vpmovsxbd (%rdi), %xmm0
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
247 %X = load <4 x i8>* %ptr
248 %Y = sext <4 x i8> %X to <4 x i32>
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]
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]
271 ; SSE41-LABEL: load_sext_test3:
272 ; SSE41: # BB#0: # %entry
273 ; SSE41-NEXT: pmovsxbq (%rdi), %xmm0
276 ; AVX-LABEL: load_sext_test3:
277 ; AVX: # BB#0: # %entry
278 ; AVX-NEXT: vpmovsxbq (%rdi), %xmm0
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
287 %X = load <2 x i8>* %ptr
288 %Y = sext <2 x i8> %X to <2 x i64>
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]
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]
311 ; SSE41-LABEL: load_sext_test4:
312 ; SSE41: # BB#0: # %entry
313 ; SSE41-NEXT: pmovsxwq (%rdi), %xmm0
316 ; AVX-LABEL: load_sext_test4:
317 ; AVX: # BB#0: # %entry
318 ; AVX-NEXT: vpmovsxwq (%rdi), %xmm0
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
327 %X = load <2 x i16>* %ptr
328 %Y = sext <2 x i16> %X to <2 x i64>
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]
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]
351 ; SSE41-LABEL: load_sext_test5:
352 ; SSE41: # BB#0: # %entry
353 ; SSE41-NEXT: pmovsxdq (%rdi), %xmm0
356 ; AVX-LABEL: load_sext_test5:
357 ; AVX: # BB#0: # %entry
358 ; AVX-NEXT: vpmovsxdq (%rdi), %xmm0
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
367 %X = load <2 x i32>* %ptr
368 %Y = sext <2 x i32> %X to <2 x i64>
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
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
387 ; SSE41-LABEL: load_sext_test6:
388 ; SSE41: # BB#0: # %entry
389 ; SSE41-NEXT: pmovsxbw (%rdi), %xmm0
392 ; AVX-LABEL: load_sext_test6:
393 ; AVX: # BB#0: # %entry
394 ; AVX-NEXT: vpmovsxbw (%rdi), %xmm0
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
403 %X = load <8 x i8>* %ptr
404 %Y = sext <8 x i8> %X to <8 x i16>
408 define <4 x i64> @sext_4i1_to_4i64(<4 x i1> %mask) {
409 ; SSE2-LABEL: sext_4i1_to_4i64:
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
416 ; SSE2-NEXT: movd %rax, %xmm2
417 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
418 ; SSE2-NEXT: movd %xmm1, %rax
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
425 ; SSE2-NEXT: movd %rax, %xmm1
426 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
427 ; SSE2-NEXT: movd %xmm0, %rax
429 ; SSE2-NEXT: movd %rax, %xmm0
430 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
431 ; SSE2-NEXT: movdqa %xmm2, %xmm0
434 ; SSSE3-LABEL: sext_4i1_to_4i64:
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
441 ; SSSE3-NEXT: movd %rax, %xmm2
442 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
443 ; SSSE3-NEXT: movd %xmm1, %rax
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
450 ; SSSE3-NEXT: movd %rax, %xmm1
451 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
452 ; SSSE3-NEXT: movd %xmm0, %rax
454 ; SSSE3-NEXT: movd %rax, %xmm0
455 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
456 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
459 ; SSE41-LABEL: sext_4i1_to_4i64:
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
466 ; SSE41-NEXT: movd %rax, %xmm3
467 ; SSE41-NEXT: movd %xmm1, %rax
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
474 ; SSE41-NEXT: movd %rax, %xmm3
475 ; SSE41-NEXT: movd %xmm0, %rax
477 ; SSE41-NEXT: movd %rax, %xmm1
478 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
479 ; SSE41-NEXT: movdqa %xmm2, %xmm0
482 ; AVX1-LABEL: sext_4i1_to_4i64:
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
492 ; AVX2-LABEL: sext_4i1_to_4i64:
494 ; AVX2-NEXT: vpslld $31, %xmm0, %xmm0
495 ; AVX2-NEXT: vpsrad $31, %xmm0, %xmm0
496 ; AVX2-NEXT: vpmovsxdq %xmm0, %ymm0
499 ; X32-SSE41-LABEL: sext_4i1_to_4i64:
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
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
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
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
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
568 ; AVX2-LABEL: sext_16i8_to_16i16:
569 ; AVX2: # BB#0: # %entry
570 ; AVX2-NEXT: vmovdqa (%rdi), %xmm0
571 ; AVX2-NEXT: vpmovsxbw %xmm0, %ymm0
574 ; X32-SSE41-LABEL: sext_16i8_to_16i16:
575 ; X32-SSE41: # BB#0: # %entry
576 ; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
577 ; X32-SSE41-NEXT: movdqa (%eax), %xmm1
578 ; X32-SSE41-NEXT: pmovzxbw %xmm1, %xmm0
579 ; X32-SSE41-NEXT: psllw $8, %xmm0
580 ; X32-SSE41-NEXT: psraw $8, %xmm0
581 ; X32-SSE41-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
582 ; X32-SSE41-NEXT: psllw $8, %xmm1
583 ; X32-SSE41-NEXT: psraw $8, %xmm1
584 ; X32-SSE41-NEXT: retl
586 %X = load <16 x i8>* %ptr
587 %Y = sext <16 x i8> %X to <16 x i16>
591 define <4 x i64> @sext_4i8_to_4i64(<4 x i8> %mask) {
592 ; SSE2-LABEL: sext_4i8_to_4i64:
594 ; SSE2-NEXT: pslld $24, %xmm0
595 ; SSE2-NEXT: psrad $24, %xmm0
596 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,1,3]
597 ; SSE2-NEXT: movd %xmm1, %rax
599 ; SSE2-NEXT: movd %rax, %xmm2
600 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
601 ; SSE2-NEXT: movd %xmm1, %rax
603 ; SSE2-NEXT: movd %rax, %xmm1
604 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
605 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
606 ; SSE2-NEXT: movd %xmm0, %rax
608 ; SSE2-NEXT: movd %rax, %xmm1
609 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
610 ; SSE2-NEXT: movd %xmm0, %rax
612 ; SSE2-NEXT: movd %rax, %xmm0
613 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
614 ; SSE2-NEXT: movdqa %xmm2, %xmm0
617 ; SSSE3-LABEL: sext_4i8_to_4i64:
619 ; SSSE3-NEXT: pslld $24, %xmm0
620 ; SSSE3-NEXT: psrad $24, %xmm0
621 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,1,3]
622 ; SSSE3-NEXT: movd %xmm1, %rax
624 ; SSSE3-NEXT: movd %rax, %xmm2
625 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
626 ; SSSE3-NEXT: movd %xmm1, %rax
628 ; SSSE3-NEXT: movd %rax, %xmm1
629 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
630 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
631 ; SSSE3-NEXT: movd %xmm0, %rax
633 ; SSSE3-NEXT: movd %rax, %xmm1
634 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
635 ; SSSE3-NEXT: movd %xmm0, %rax
637 ; SSSE3-NEXT: movd %rax, %xmm0
638 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
639 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
642 ; SSE41-LABEL: sext_4i8_to_4i64:
644 ; SSE41-NEXT: pslld $24, %xmm0
645 ; SSE41-NEXT: psrad $24, %xmm0
646 ; SSE41-NEXT: pmovzxdq %xmm0, %xmm1
647 ; SSE41-NEXT: pextrq $1, %xmm1, %rax
649 ; SSE41-NEXT: movd %rax, %xmm3
650 ; SSE41-NEXT: movd %xmm1, %rax
652 ; SSE41-NEXT: movd %rax, %xmm2
653 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
654 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
655 ; SSE41-NEXT: pextrq $1, %xmm0, %rax
657 ; SSE41-NEXT: movd %rax, %xmm3
658 ; SSE41-NEXT: movd %xmm0, %rax
660 ; SSE41-NEXT: movd %rax, %xmm1
661 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
662 ; SSE41-NEXT: movdqa %xmm2, %xmm0
665 ; AVX1-LABEL: sext_4i8_to_4i64:
667 ; AVX1-NEXT: vpslld $24, %xmm0, %xmm0
668 ; AVX1-NEXT: vpsrad $24, %xmm0, %xmm0
669 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm1
670 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
671 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0
672 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
675 ; AVX2-LABEL: sext_4i8_to_4i64:
677 ; AVX2-NEXT: vpslld $24, %xmm0, %xmm0
678 ; AVX2-NEXT: vpsrad $24, %xmm0, %xmm0
679 ; AVX2-NEXT: vpmovsxdq %xmm0, %ymm0
682 ; X32-SSE41-LABEL: sext_4i8_to_4i64:
684 ; X32-SSE41-NEXT: pslld $24, %xmm0
685 ; X32-SSE41-NEXT: psrad $24, %xmm0
686 ; X32-SSE41-NEXT: pmovzxdq %xmm0, %xmm2
687 ; X32-SSE41-NEXT: movd %xmm2, %eax
688 ; X32-SSE41-NEXT: sarl $31, %eax
689 ; X32-SSE41-NEXT: pextrd $2, %xmm2, %ecx
690 ; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm2
691 ; X32-SSE41-NEXT: sarl $31, %ecx
692 ; X32-SSE41-NEXT: pinsrd $3, %ecx, %xmm2
693 ; X32-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
694 ; X32-SSE41-NEXT: movd %xmm1, %eax
695 ; X32-SSE41-NEXT: sarl $31, %eax
696 ; X32-SSE41-NEXT: pextrd $2, %xmm1, %ecx
697 ; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm1
698 ; X32-SSE41-NEXT: sarl $31, %ecx
699 ; X32-SSE41-NEXT: pinsrd $3, %ecx, %xmm1
700 ; X32-SSE41-NEXT: movdqa %xmm2, %xmm0
701 ; X32-SSE41-NEXT: retl
702 %extmask = sext <4 x i8> %mask to <4 x i64>
703 ret <4 x i64> %extmask
706 define <4 x i64> @load_sext_4i8_to_4i64(<4 x i8> *%ptr) {
707 ; SSE2-LABEL: load_sext_4i8_to_4i64:
708 ; SSE2: # BB#0: # %entry
709 ; SSE2-NEXT: movd (%rdi), %xmm1
710 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
711 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
712 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,1,1,3]
713 ; SSE2-NEXT: movd %xmm2, %rax
714 ; SSE2-NEXT: movsbq %al, %rax
715 ; SSE2-NEXT: movd %rax, %xmm0
716 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
717 ; SSE2-NEXT: movd %xmm2, %rax
718 ; SSE2-NEXT: movsbq %al, %rax
719 ; SSE2-NEXT: movd %rax, %xmm2
720 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
721 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,2,3,3]
722 ; SSE2-NEXT: movd %xmm2, %rax
723 ; SSE2-NEXT: movsbq %al, %rax
724 ; SSE2-NEXT: movd %rax, %xmm1
725 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
726 ; SSE2-NEXT: movd %xmm2, %rax
727 ; SSE2-NEXT: movsbq %al, %rax
728 ; SSE2-NEXT: movd %rax, %xmm2
729 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
732 ; SSSE3-LABEL: load_sext_4i8_to_4i64:
733 ; SSSE3: # BB#0: # %entry
734 ; SSSE3-NEXT: movd (%rdi), %xmm1
735 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
736 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
737 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,1,1,3]
738 ; SSSE3-NEXT: movd %xmm2, %rax
739 ; SSSE3-NEXT: movsbq %al, %rax
740 ; SSSE3-NEXT: movd %rax, %xmm0
741 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
742 ; SSSE3-NEXT: movd %xmm2, %rax
743 ; SSSE3-NEXT: movsbq %al, %rax
744 ; SSSE3-NEXT: movd %rax, %xmm2
745 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
746 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,2,3,3]
747 ; SSSE3-NEXT: movd %xmm2, %rax
748 ; SSSE3-NEXT: movsbq %al, %rax
749 ; SSSE3-NEXT: movd %rax, %xmm1
750 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
751 ; SSSE3-NEXT: movd %xmm2, %rax
752 ; SSSE3-NEXT: movsbq %al, %rax
753 ; SSSE3-NEXT: movd %rax, %xmm2
754 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
757 ; SSE41-LABEL: load_sext_4i8_to_4i64:
758 ; SSE41: # BB#0: # %entry
759 ; SSE41-NEXT: pmovzxbd (%rdi), %xmm1
760 ; SSE41-NEXT: pmovzxdq %xmm1, %xmm0
761 ; SSE41-NEXT: pextrq $1, %xmm0, %rax
762 ; SSE41-NEXT: movsbq %al, %rax
763 ; SSE41-NEXT: movd %rax, %xmm2
764 ; SSE41-NEXT: movd %xmm0, %rax
765 ; SSE41-NEXT: movsbq %al, %rax
766 ; SSE41-NEXT: movd %rax, %xmm0
767 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
768 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
769 ; SSE41-NEXT: pextrq $1, %xmm1, %rax
770 ; SSE41-NEXT: movsbq %al, %rax
771 ; SSE41-NEXT: movd %rax, %xmm2
772 ; SSE41-NEXT: movd %xmm1, %rax
773 ; SSE41-NEXT: movsbq %al, %rax
774 ; SSE41-NEXT: movd %rax, %xmm1
775 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
778 ; AVX1-LABEL: load_sext_4i8_to_4i64:
779 ; AVX1: # BB#0: # %entry
780 ; AVX1-NEXT: vpmovsxbd (%rdi), %xmm0
781 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm1
782 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
783 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0
784 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
787 ; AVX2-LABEL: load_sext_4i8_to_4i64:
788 ; AVX2: # BB#0: # %entry
789 ; AVX2-NEXT: vpmovsxbq (%rdi), %ymm0
792 ; X32-SSE41-LABEL: load_sext_4i8_to_4i64:
793 ; X32-SSE41: # BB#0: # %entry
794 ; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
795 ; X32-SSE41-NEXT: movd (%eax), %xmm0
796 ; X32-SSE41-NEXT: pmovzxbd %xmm0, %xmm1
797 ; X32-SSE41-NEXT: pmovzxbq %xmm0, %xmm2
798 ; X32-SSE41-NEXT: movd %xmm2, %eax
799 ; X32-SSE41-NEXT: movsbl %al, %eax
800 ; X32-SSE41-NEXT: movd %eax, %xmm0
801 ; X32-SSE41-NEXT: sarl $31, %eax
802 ; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm0
803 ; X32-SSE41-NEXT: pextrd $2, %xmm2, %eax
804 ; X32-SSE41-NEXT: movsbl %al, %eax
805 ; X32-SSE41-NEXT: pinsrd $2, %eax, %xmm0
806 ; X32-SSE41-NEXT: sarl $31, %eax
807 ; X32-SSE41-NEXT: pinsrd $3, %eax, %xmm0
808 ; X32-SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,2,3,3]
809 ; X32-SSE41-NEXT: movd %xmm2, %eax
810 ; X32-SSE41-NEXT: movsbl %al, %eax
811 ; X32-SSE41-NEXT: movd %eax, %xmm1
812 ; X32-SSE41-NEXT: sarl $31, %eax
813 ; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm1
814 ; X32-SSE41-NEXT: pextrd $2, %xmm2, %eax
815 ; X32-SSE41-NEXT: movsbl %al, %eax
816 ; X32-SSE41-NEXT: pinsrd $2, %eax, %xmm1
817 ; X32-SSE41-NEXT: sarl $31, %eax
818 ; X32-SSE41-NEXT: pinsrd $3, %eax, %xmm1
819 ; X32-SSE41-NEXT: retl
821 %X = load <4 x i8>* %ptr
822 %Y = sext <4 x i8> %X to <4 x i64>
826 define <4 x i64> @load_sext_4i16_to_4i64(<4 x i16> *%ptr) {
827 ; SSE2-LABEL: load_sext_4i16_to_4i64:
828 ; SSE2: # BB#0: # %entry
829 ; SSE2-NEXT: movq (%rdi), %xmm1
830 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
831 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,1,1,3]
832 ; SSE2-NEXT: movd %xmm2, %rax
833 ; SSE2-NEXT: movswq %ax, %rax
834 ; SSE2-NEXT: movd %rax, %xmm0
835 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
836 ; SSE2-NEXT: movd %xmm2, %rax
837 ; SSE2-NEXT: movswq %ax, %rax
838 ; SSE2-NEXT: movd %rax, %xmm2
839 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
840 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,2,3,3]
841 ; SSE2-NEXT: movd %xmm2, %rax
842 ; SSE2-NEXT: movswq %ax, %rax
843 ; SSE2-NEXT: movd %rax, %xmm1
844 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
845 ; SSE2-NEXT: movd %xmm2, %rax
846 ; SSE2-NEXT: movswq %ax, %rax
847 ; SSE2-NEXT: movd %rax, %xmm2
848 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
851 ; SSSE3-LABEL: load_sext_4i16_to_4i64:
852 ; SSSE3: # BB#0: # %entry
853 ; SSSE3-NEXT: movq (%rdi), %xmm1
854 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
855 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,1,1,3]
856 ; SSSE3-NEXT: movd %xmm2, %rax
857 ; SSSE3-NEXT: movswq %ax, %rax
858 ; SSSE3-NEXT: movd %rax, %xmm0
859 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
860 ; SSSE3-NEXT: movd %xmm2, %rax
861 ; SSSE3-NEXT: movswq %ax, %rax
862 ; SSSE3-NEXT: movd %rax, %xmm2
863 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
864 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,2,3,3]
865 ; SSSE3-NEXT: movd %xmm2, %rax
866 ; SSSE3-NEXT: movswq %ax, %rax
867 ; SSSE3-NEXT: movd %rax, %xmm1
868 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
869 ; SSSE3-NEXT: movd %xmm2, %rax
870 ; SSSE3-NEXT: movswq %ax, %rax
871 ; SSSE3-NEXT: movd %rax, %xmm2
872 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
875 ; SSE41-LABEL: load_sext_4i16_to_4i64:
876 ; SSE41: # BB#0: # %entry
877 ; SSE41-NEXT: movq (%rdi), %xmm0
878 ; SSE41-NEXT: pmovzxwd %xmm0, %xmm1
879 ; SSE41-NEXT: pmovzxwq %xmm0, %xmm0
880 ; SSE41-NEXT: pextrq $1, %xmm0, %rax
881 ; SSE41-NEXT: movswq %ax, %rax
882 ; SSE41-NEXT: movd %rax, %xmm2
883 ; SSE41-NEXT: movd %xmm0, %rax
884 ; SSE41-NEXT: movswq %ax, %rax
885 ; SSE41-NEXT: movd %rax, %xmm0
886 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
887 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
888 ; SSE41-NEXT: pextrq $1, %xmm1, %rax
889 ; SSE41-NEXT: movswq %ax, %rax
890 ; SSE41-NEXT: movd %rax, %xmm2
891 ; SSE41-NEXT: movd %xmm1, %rax
892 ; SSE41-NEXT: movswq %ax, %rax
893 ; SSE41-NEXT: movd %rax, %xmm1
894 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
897 ; AVX1-LABEL: load_sext_4i16_to_4i64:
898 ; AVX1: # BB#0: # %entry
899 ; AVX1-NEXT: vpmovsxwd (%rdi), %xmm0
900 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm1
901 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
902 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0
903 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
906 ; AVX2-LABEL: load_sext_4i16_to_4i64:
907 ; AVX2: # BB#0: # %entry
908 ; AVX2-NEXT: vpmovsxwq (%rdi), %ymm0
911 ; X32-SSE41-LABEL: load_sext_4i16_to_4i64:
912 ; X32-SSE41: # BB#0: # %entry
913 ; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
914 ; X32-SSE41-NEXT: movsd (%eax), %xmm0
915 ; X32-SSE41-NEXT: pmovzxwd %xmm0, %xmm1
916 ; X32-SSE41-NEXT: pmovzxwq %xmm0, %xmm2
917 ; X32-SSE41-NEXT: movd %xmm2, %eax
918 ; X32-SSE41-NEXT: cwtl
919 ; X32-SSE41-NEXT: movd %eax, %xmm0
920 ; X32-SSE41-NEXT: sarl $31, %eax
921 ; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm0
922 ; X32-SSE41-NEXT: pextrd $2, %xmm2, %eax
923 ; X32-SSE41-NEXT: cwtl
924 ; X32-SSE41-NEXT: pinsrd $2, %eax, %xmm0
925 ; X32-SSE41-NEXT: sarl $31, %eax
926 ; X32-SSE41-NEXT: pinsrd $3, %eax, %xmm0
927 ; X32-SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,2,3,3]
928 ; X32-SSE41-NEXT: movd %xmm2, %eax
929 ; X32-SSE41-NEXT: cwtl
930 ; X32-SSE41-NEXT: movd %eax, %xmm1
931 ; X32-SSE41-NEXT: sarl $31, %eax
932 ; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm1
933 ; X32-SSE41-NEXT: pextrd $2, %xmm2, %eax
934 ; X32-SSE41-NEXT: cwtl
935 ; X32-SSE41-NEXT: pinsrd $2, %eax, %xmm1
936 ; X32-SSE41-NEXT: sarl $31, %eax
937 ; X32-SSE41-NEXT: pinsrd $3, %eax, %xmm1
938 ; X32-SSE41-NEXT: retl
940 %X = load <4 x i16>* %ptr
941 %Y = sext <4 x i16> %X to <4 x i64>