eae5b29765553e3863f7240efd2951ce48a8095c
[oota-llvm.git] / test / CodeGen / X86 / vector-sext.ll
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
6 ;
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
9
10 define <8 x i32> @sext_8i16_to_8i32(<8 x i16> %A) nounwind uwtable readnone ssp {
11 ; SSE2-LABEL: sext_8i16_to_8i32:
12 ; SSE2:       ## BB#0:
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
21 ; SSE2-NEXT:    retq
22 ;
23 ; SSSE3-LABEL: sext_8i16_to_8i32:
24 ; SSSE3:       ## BB#0:
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
33 ; SSSE3-NEXT:    retq
34 ;
35 ; SSE41-LABEL: sext_8i16_to_8i32:
36 ; SSE41:       ## BB#0:
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
44 ; SSE41-NEXT:    retq
45 ;
46 ; AVX1-LABEL: sext_8i16_to_8i32:
47 ; AVX1:       ## BB#0:
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
52 ; AVX1-NEXT:    retq
53 ;
54 ; AVX2-LABEL: sext_8i16_to_8i32:
55 ; AVX2:       ## BB#0:
56 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
57 ; AVX2-NEXT:    retq
58 ;
59 ; X32-SSE41-LABEL: sext_8i16_to_8i32:
60 ; X32-SSE41:       ## BB#0:
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
69
70   %B = sext <8 x i16> %A to <8 x i32>
71   ret <8 x i32>%B
72 }
73
74 define <4 x i64> @sext_4i32_to_4i64(<4 x i32> %A) nounwind uwtable readnone ssp {
75 ; SSE2-LABEL: sext_4i32_to_4i64:
76 ; SSE2:       ## BB#0:
77 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0]
78 ; SSE2-NEXT:    movd %xmm1, %rax
79 ; SSE2-NEXT:    cltq
80 ; SSE2-NEXT:    movd %rax, %xmm2
81 ; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
82 ; SSE2-NEXT:    movd %xmm1, %rax
83 ; SSE2-NEXT:    cltq
84 ; SSE2-NEXT:    movd %rax, %xmm1
85 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
86 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
87 ; SSE2-NEXT:    movd %xmm0, %rax
88 ; SSE2-NEXT:    cltq
89 ; SSE2-NEXT:    movd %rax, %xmm1
90 ; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
91 ; SSE2-NEXT:    movd %xmm0, %rax
92 ; SSE2-NEXT:    cltq
93 ; SSE2-NEXT:    movd %rax, %xmm0
94 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
95 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
96 ; SSE2-NEXT:    retq
97 ;
98 ; SSSE3-LABEL: sext_4i32_to_4i64:
99 ; SSSE3:       ## BB#0:
100 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0]
101 ; SSSE3-NEXT:    movd %xmm1, %rax
102 ; SSSE3-NEXT:    cltq
103 ; SSSE3-NEXT:    movd %rax, %xmm2
104 ; SSSE3-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
105 ; SSSE3-NEXT:    movd %xmm1, %rax
106 ; SSSE3-NEXT:    cltq
107 ; SSSE3-NEXT:    movd %rax, %xmm1
108 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
109 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
110 ; SSSE3-NEXT:    movd %xmm0, %rax
111 ; SSSE3-NEXT:    cltq
112 ; SSSE3-NEXT:    movd %rax, %xmm1
113 ; SSSE3-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
114 ; SSSE3-NEXT:    movd %xmm0, %rax
115 ; SSSE3-NEXT:    cltq
116 ; SSSE3-NEXT:    movd %rax, %xmm0
117 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
118 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
119 ; SSSE3-NEXT:    retq
120 ;
121 ; SSE41-LABEL: sext_4i32_to_4i64:
122 ; SSE41:       ## BB#0:
123 ; SSE41-NEXT:    pmovzxdq %xmm0, %xmm1
124 ; SSE41-NEXT:    pextrq $1, %xmm1, %rax
125 ; SSE41-NEXT:    cltq
126 ; SSE41-NEXT:    movd %rax, %xmm3
127 ; SSE41-NEXT:    movd %xmm1, %rax
128 ; SSE41-NEXT:    cltq
129 ; SSE41-NEXT:    movd %rax, %xmm2
130 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
131 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
132 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
133 ; SSE41-NEXT:    cltq
134 ; SSE41-NEXT:    movd %rax, %xmm3
135 ; SSE41-NEXT:    movd %xmm0, %rax
136 ; SSE41-NEXT:    cltq
137 ; SSE41-NEXT:    movd %rax, %xmm1
138 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
139 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
140 ; SSE41-NEXT:    retq
141 ;
142 ; AVX1-LABEL: sext_4i32_to_4i64:
143 ; AVX1:       ## BB#0:
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
148 ; AVX1-NEXT:    retq
149 ;
150 ; AVX2-LABEL: sext_4i32_to_4i64:
151 ; AVX2:       ## BB#0:
152 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
153 ; AVX2-NEXT:    retq
154 ;
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
173
174   %B = sext <4 x i32> %A to <4 x i64>
175   ret <4 x i64>%B
176 }
177
178 define <4 x i32> @load_sext_test1(<4 x i16> *%ptr) {
179 ; SSE2-LABEL: load_sext_test1:
180 ; SSE2:       ## BB#0:
181 ; SSE2-NEXT:    movq (%rdi), %xmm0
182 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
183 ; SSE2-NEXT:    psrad $16, %xmm0
184 ; SSE2-NEXT:    retq
185 ;
186 ; SSSE3-LABEL: load_sext_test1:
187 ; SSSE3:       ## BB#0:
188 ; SSSE3-NEXT:    movq (%rdi), %xmm0
189 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
190 ; SSSE3-NEXT:    psrad $16, %xmm0
191 ; SSSE3-NEXT:    retq
192 ;
193 ; SSE41-LABEL: load_sext_test1:
194 ; SSE41:       ## BB#0:
195 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
196 ; SSE41-NEXT:    retq
197 ;
198 ; AVX-LABEL: load_sext_test1:
199 ; AVX:       ## BB#0:
200 ; AVX-NEXT:    vpmovsxwd (%rdi), %xmm0
201 ; AVX-NEXT:    retq
202 ;
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
208
209  %X = load <4 x i16>* %ptr
210  %Y = sext <4 x i16> %X to <4 x i32>
211  ret <4 x i32>%Y
212 }
213
214 define <4 x i32> @load_sext_test2(<4 x i8> *%ptr) {
215 ; SSE2-LABEL: load_sext_test2:
216 ; SSE2:       ## BB#0:
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
229 ; SSE2-NEXT:    retq
230 ;
231 ; SSSE3-LABEL: load_sext_test2:
232 ; SSSE3:       ## BB#0:
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
236 ; SSSE3-NEXT:    retq
237 ;
238 ; SSE41-LABEL: load_sext_test2:
239 ; SSE41:       ## BB#0:
240 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
241 ; SSE41-NEXT:    retq
242 ;
243 ; AVX-LABEL: load_sext_test2:
244 ; AVX:       ## BB#0:
245 ; AVX-NEXT:    vpmovsxbd (%rdi), %xmm0
246 ; AVX-NEXT:    retq
247 ;
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>
255  ret <4 x i32>%Y
256 }
257
258 define <2 x i64> @load_sext_test3(<2 x i8> *%ptr) {
259 ; SSE2-LABEL: load_sext_test3:
260 ; SSE2:       ## BB#0:
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]
266 ; SSE2-NEXT:    retq
267 ;
268 ; SSSE3-LABEL: load_sext_test3:
269 ; SSSE3:       ## BB#0:
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]
275 ; SSSE3-NEXT:    retq
276 ;
277 ; SSE41-LABEL: load_sext_test3:
278 ; SSE41:       ## BB#0:
279 ; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
280 ; SSE41-NEXT:    retq
281 ;
282 ; AVX-LABEL: load_sext_test3:
283 ; AVX:       ## BB#0:
284 ; AVX-NEXT:    vpmovsxbq (%rdi), %xmm0
285 ; AVX-NEXT:    retq
286 ;
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>
294  ret <2 x i64>%Y
295 }
296
297 define <2 x i64> @load_sext_test4(<2 x i16> *%ptr) {
298 ; SSE2-LABEL: load_sext_test4:
299 ; SSE2:       ## BB#0:
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]
305 ; SSE2-NEXT:    retq
306 ;
307 ; SSSE3-LABEL: load_sext_test4:
308 ; SSSE3:       ## BB#0:
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]
314 ; SSSE3-NEXT:    retq
315 ;
316 ; SSE41-LABEL: load_sext_test4:
317 ; SSE41:       ## BB#0:
318 ; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
319 ; SSE41-NEXT:    retq
320 ;
321 ; AVX-LABEL: load_sext_test4:
322 ; AVX:       ## BB#0:
323 ; AVX-NEXT:    vpmovsxwq (%rdi), %xmm0
324 ; AVX-NEXT:    retq
325 ;
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>
333  ret <2 x i64>%Y
334 }
335
336 define <2 x i64> @load_sext_test5(<2 x i32> *%ptr) {
337 ; SSE2-LABEL: load_sext_test5:
338 ; SSE2:       ## BB#0:
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]
344 ; SSE2-NEXT:    retq
345 ;
346 ; SSSE3-LABEL: load_sext_test5:
347 ; SSSE3:       ## BB#0:
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]
353 ; SSSE3-NEXT:    retq
354 ;
355 ; SSE41-LABEL: load_sext_test5:
356 ; SSE41:       ## BB#0:
357 ; SSE41-NEXT:    pmovsxdq (%rdi), %xmm0
358 ; SSE41-NEXT:    retq
359 ;
360 ; AVX-LABEL: load_sext_test5:
361 ; AVX:       ## BB#0:
362 ; AVX-NEXT:    vpmovsxdq (%rdi), %xmm0
363 ; AVX-NEXT:    retq
364 ;
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>
372  ret <2 x i64>%Y
373 }
374
375 define <8 x i16> @load_sext_test6(<8 x i8> *%ptr) {
376 ; SSE2-LABEL: load_sext_test6:
377 ; SSE2:       ## BB#0:
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
381 ; SSE2-NEXT:    retq
382 ;
383 ; SSSE3-LABEL: load_sext_test6:
384 ; SSSE3:       ## BB#0:
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
388 ; SSSE3-NEXT:    retq
389 ;
390 ; SSE41-LABEL: load_sext_test6:
391 ; SSE41:       ## BB#0:
392 ; SSE41-NEXT:    pmovsxbw (%rdi), %xmm0
393 ; SSE41-NEXT:    retq
394 ;
395 ; AVX-LABEL: load_sext_test6:
396 ; AVX:       ## BB#0:
397 ; AVX-NEXT:    vpmovsxbw (%rdi), %xmm0
398 ; AVX-NEXT:    retq
399 ;
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>
407  ret <8 x i16>%Y
408 }
409
410 define <4 x i64> @sext_4i1_to_4i64(<4 x i1> %mask) {
411 ; SSE2-LABEL: sext_4i1_to_4i64:
412 ; SSE2:       ## BB#0:
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
417 ; SSE2-NEXT:    cltq
418 ; SSE2-NEXT:    movd %rax, %xmm2
419 ; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
420 ; SSE2-NEXT:    movd %xmm1, %rax
421 ; SSE2-NEXT:    cltq
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
426 ; SSE2-NEXT:    cltq
427 ; SSE2-NEXT:    movd %rax, %xmm1
428 ; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
429 ; SSE2-NEXT:    movd %xmm0, %rax
430 ; SSE2-NEXT:    cltq
431 ; SSE2-NEXT:    movd %rax, %xmm0
432 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
433 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
434 ; SSE2-NEXT:    retq
435 ;
436 ; SSSE3-LABEL: sext_4i1_to_4i64:
437 ; SSSE3:       ## BB#0:
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
442 ; SSSE3-NEXT:    cltq
443 ; SSSE3-NEXT:    movd %rax, %xmm2
444 ; SSSE3-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
445 ; SSSE3-NEXT:    movd %xmm1, %rax
446 ; SSSE3-NEXT:    cltq
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
451 ; SSSE3-NEXT:    cltq
452 ; SSSE3-NEXT:    movd %rax, %xmm1
453 ; SSSE3-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
454 ; SSSE3-NEXT:    movd %xmm0, %rax
455 ; SSSE3-NEXT:    cltq
456 ; SSSE3-NEXT:    movd %rax, %xmm0
457 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
458 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
459 ; SSSE3-NEXT:    retq
460 ;
461 ; SSE41-LABEL: sext_4i1_to_4i64:
462 ; SSE41:       ## BB#0:
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
467 ; SSE41-NEXT:    cltq
468 ; SSE41-NEXT:    movd %rax, %xmm3
469 ; SSE41-NEXT:    movd %xmm1, %rax
470 ; SSE41-NEXT:    cltq
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
475 ; SSE41-NEXT:    cltq
476 ; SSE41-NEXT:    movd %rax, %xmm3
477 ; SSE41-NEXT:    movd %xmm0, %rax
478 ; SSE41-NEXT:    cltq
479 ; SSE41-NEXT:    movd %rax, %xmm1
480 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
481 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
482 ; SSE41-NEXT:    retq
483 ;
484 ; AVX1-LABEL: sext_4i1_to_4i64:
485 ; AVX1:       ## BB#0:
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
492 ; AVX1-NEXT:    retq
493 ;
494 ; AVX2-LABEL: sext_4i1_to_4i64:
495 ; AVX2:       ## BB#0:
496 ; AVX2-NEXT:    vpslld $31, %xmm0, %xmm0
497 ; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm0
498 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
499 ; AVX2-NEXT:    retq
500 ;
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
523 }
524
525 define <16 x i16> @sext_16i8_to_16i16(<16 x i8> *%ptr) {
526 ; SSE2-LABEL: sext_16i8_to_16i16:
527 ; SSE2:       ## BB#0:
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
536 ; SSE2-NEXT:    retq
537 ;
538 ; SSSE3-LABEL: sext_16i8_to_16i16:
539 ; SSSE3:       ## BB#0:
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
548 ; SSSE3-NEXT:    retq
549 ;
550 ; SSE41-LABEL: sext_16i8_to_16i16:
551 ; SSE41:       ## BB#0:
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
559 ; SSE41-NEXT:    retq
560 ;
561 ; AVX1-LABEL: sext_16i8_to_16i16:
562 ; AVX1:       ## BB#0:
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
568 ; AVX1-NEXT:    retq
569 ;
570 ; AVX2-LABEL: sext_16i8_to_16i16:
571 ; AVX2:       ## BB#0:
572 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
573 ; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm0
574 ; AVX2-NEXT:    retq
575 ;
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>
589  ret <16 x i16> %Y
590 }
591
592 define <4 x i64> @sext_4i8_to_4i64(<4 x i8> %mask) {
593 ; SSE2-LABEL: sext_4i8_to_4i64:
594 ; SSE2:       ## BB#0:
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
599 ; SSE2-NEXT:    cltq
600 ; SSE2-NEXT:    movd %rax, %xmm2
601 ; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
602 ; SSE2-NEXT:    movd %xmm1, %rax
603 ; SSE2-NEXT:    cltq
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
608 ; SSE2-NEXT:    cltq
609 ; SSE2-NEXT:    movd %rax, %xmm1
610 ; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
611 ; SSE2-NEXT:    movd %xmm0, %rax
612 ; SSE2-NEXT:    cltq
613 ; SSE2-NEXT:    movd %rax, %xmm0
614 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
615 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
616 ; SSE2-NEXT:    retq
617 ;
618 ; SSSE3-LABEL: sext_4i8_to_4i64:
619 ; SSSE3:       ## BB#0:
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
624 ; SSSE3-NEXT:    cltq
625 ; SSSE3-NEXT:    movd %rax, %xmm2
626 ; SSSE3-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
627 ; SSSE3-NEXT:    movd %xmm1, %rax
628 ; SSSE3-NEXT:    cltq
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
633 ; SSSE3-NEXT:    cltq
634 ; SSSE3-NEXT:    movd %rax, %xmm1
635 ; SSSE3-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
636 ; SSSE3-NEXT:    movd %xmm0, %rax
637 ; SSSE3-NEXT:    cltq
638 ; SSSE3-NEXT:    movd %rax, %xmm0
639 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
640 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
641 ; SSSE3-NEXT:    retq
642 ;
643 ; SSE41-LABEL: sext_4i8_to_4i64:
644 ; SSE41:       ## BB#0:
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
649 ; SSE41-NEXT:    cltq
650 ; SSE41-NEXT:    movd %rax, %xmm3
651 ; SSE41-NEXT:    movd %xmm1, %rax
652 ; SSE41-NEXT:    cltq
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
657 ; SSE41-NEXT:    cltq
658 ; SSE41-NEXT:    movd %rax, %xmm3
659 ; SSE41-NEXT:    movd %xmm0, %rax
660 ; SSE41-NEXT:    cltq
661 ; SSE41-NEXT:    movd %rax, %xmm1
662 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
663 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
664 ; SSE41-NEXT:    retq
665 ;
666 ; AVX1-LABEL: sext_4i8_to_4i64:
667 ; AVX1:       ## BB#0:
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
674 ; AVX1-NEXT:    retq
675 ;
676 ; AVX2-LABEL: sext_4i8_to_4i64:
677 ; AVX2:       ## BB#0:
678 ; AVX2-NEXT:    vpslld $24, %xmm0, %xmm0
679 ; AVX2-NEXT:    vpsrad $24, %xmm0, %xmm0
680 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
681 ; AVX2-NEXT:    retq
682 ;
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
705 }
706
707 define <4 x i64> @load_sext_4i8_to_4i64(<4 x i8> *%ptr) {
708 ; SSE2-LABEL: load_sext_4i8_to_4i64:
709 ; SSE2:       ## BB#0:
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]
737 ; SSE2-NEXT:    retq
738 ;
739 ; SSSE3-LABEL: load_sext_4i8_to_4i64:
740 ; SSSE3:       ## BB#0:
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]
761 ; SSSE3-NEXT:    retq
762 ;
763 ; SSE41-LABEL: load_sext_4i8_to_4i64:
764 ; SSE41:       ## BB#0:
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]
783 ; SSE41-NEXT:    retq
784 ;
785 ; AVX1-LABEL: load_sext_4i8_to_4i64:
786 ; AVX1:       ## BB#0:
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
792 ; AVX1-NEXT:    retq
793 ;
794 ; AVX2-LABEL: load_sext_4i8_to_4i64:
795 ; AVX2:       ## BB#0:
796 ; AVX2-NEXT:    vpmovsxbq (%rdi), %ymm0
797 ; AVX2-NEXT:    retq
798 ;
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>
829  ret <4 x i64>%Y
830 }
831
832 define <4 x i64> @load_sext_4i16_to_4i64(<4 x i16> *%ptr) {
833 ; SSE2-LABEL: load_sext_4i16_to_4i64:
834 ; SSE2:       ## BB#0:
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]
855 ; SSE2-NEXT:    retq
856 ;
857 ; SSSE3-LABEL: load_sext_4i16_to_4i64:
858 ; SSSE3:       ## BB#0:
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]
879 ; SSSE3-NEXT:    retq
880 ;
881 ; SSE41-LABEL: load_sext_4i16_to_4i64:
882 ; SSE41:       ## BB#0:
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]
901 ; SSE41-NEXT:    retq
902 ;
903 ; AVX1-LABEL: load_sext_4i16_to_4i64:
904 ; AVX1:       ## BB#0:
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
910 ; AVX1-NEXT:    retq
911 ;
912 ; AVX2-LABEL: load_sext_4i16_to_4i64:
913 ; AVX2:       ## BB#0:
914 ; AVX2-NEXT:    vpmovsxwq (%rdi), %ymm0
915 ; AVX2-NEXT:    retq
916 ;
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>
947  ret <4 x i64>%Y
948 }