ee4313c179b4390e023a2c8ce0a4d6e16dc73a53
[oota-llvm.git] / test / CodeGen / X86 / vector-sext.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+ssse3 | FileCheck %s --check-prefix=SSE --check-prefix=SSSE3
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
6 ;
7 ; Just one 32-bit run to make sure we do reasonable things there.
8 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mcpu=i686 -mattr=+sse4.1 | FileCheck %s --check-prefix=X32-SSE41
9
10 define <8 x i32> @sext_8i16_to_8i32(<8 x i16> %A) nounwind uwtable readnone ssp {
11 ; SSE2-LABEL: sext_8i16_to_8i32:
12 ; SSE2:       # BB#0: # %entry
13 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
14 ; SSE2-NEXT:      # kill: XMM0<def> XMM1<kill>
15 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
16 ; SSE2-NEXT:    pslld $16, %xmm0
17 ; SSE2-NEXT:    psrad $16, %xmm0
18 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],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: # %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
33 ; SSSE3-NEXT:    retq
34 ;
35 ; SSE41-LABEL: sext_8i16_to_8i32:
36 ; SSE41:       # BB#0: # %entry
37 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
38 ; SSE41-NEXT:    pmovzxwd %xmm1, %xmm0
39 ; SSE41-NEXT:    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: # %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
52 ; AVX1-NEXT:    retq
53 ;
54 ; AVX2-LABEL: sext_8i16_to_8i32:
55 ; AVX2:       # BB#0: # %entry
56 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
57 ; AVX2-NEXT:    retq
58 ;
59 ; X32-SSE41-LABEL: sext_8i16_to_8i32:
60 ; X32-SSE41:       # BB#0: # %entry
61 ; X32-SSE41-NEXT:    movdqa %xmm0, %xmm1
62 ; X32-SSE41-NEXT:    pmovzxwd %xmm1, %xmm0
63 ; X32-SSE41-NEXT:    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 entry:
70   %B = sext <8 x i16> %A to <8 x i32>
71   ret <8 x i32>%B
72 }
73
74 define <4 x i64> @sext_4i32_to_4i64(<4 x i32> %A) nounwind uwtable readnone ssp {
75 ; SSE2-LABEL: sext_4i32_to_4i64:
76 ; SSE2:       # BB#0: # %entry
77 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,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: # %entry
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: # %entry
123 ; SSE41-NEXT:    pmovzxdq %xmm0, %xmm1
124 ; SSE41-NEXT:    pextrq $1, %xmm1, %rax
125 ; SSE41-NEXT:    cltq
126 ; SSE41-NEXT:    movd %rax, %xmm3
127 ; SSE41-NEXT:    movd %xmm1, %rax
128 ; SSE41-NEXT:    cltq
129 ; SSE41-NEXT:    movd %rax, %xmm2
130 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
131 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,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: # %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
148 ; AVX1-NEXT:    retq
149 ;
150 ; AVX2-LABEL: sext_4i32_to_4i64:
151 ; AVX2:       # BB#0: # %entry
152 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
153 ; AVX2-NEXT:    retq
154 ;
155 ; X32-SSE41-LABEL: sext_4i32_to_4i64:
156 ; X32-SSE41:       # BB#0: # %entry
157 ; X32-SSE41-NEXT:    pmovzxdq %xmm0, %xmm2
158 ; X32-SSE41-NEXT:    movd %xmm2, %eax
159 ; X32-SSE41-NEXT:    sarl $31, %eax
160 ; X32-SSE41-NEXT:    pextrd $2, %xmm2, %ecx
161 ; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm2
162 ; X32-SSE41-NEXT:    sarl $31, %ecx
163 ; X32-SSE41-NEXT:    pinsrd $3, %ecx, %xmm2
164 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,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 entry:
174   %B = sext <4 x i32> %A to <4 x i64>
175   ret <4 x i64>%B
176 }
177
178 define <4 x i32> @load_sext_test1(<4 x i16> *%ptr) {
179 ; SSE2-LABEL: load_sext_test1:
180 ; SSE2:       # BB#0: # %entry
181 ; SSE2-NEXT:    movq (%rdi), %xmm0
182 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
183 ; SSE2-NEXT:    psrad $16, %xmm0
184 ; SSE2-NEXT:    retq
185 ;
186 ; SSSE3-LABEL: load_sext_test1:
187 ; SSSE3:       # BB#0: # %entry
188 ; SSSE3-NEXT:    movq (%rdi), %xmm0
189 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
190 ; SSSE3-NEXT:    psrad $16, %xmm0
191 ; SSSE3-NEXT:    retq
192 ;
193 ; SSE41-LABEL: load_sext_test1:
194 ; SSE41:       # BB#0: # %entry
195 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
196 ; SSE41-NEXT:    retq
197 ;
198 ; AVX-LABEL: load_sext_test1:
199 ; AVX:       # BB#0: # %entry
200 ; AVX-NEXT:    vpmovsxwd (%rdi), %xmm0
201 ; AVX-NEXT:    retq
202 ;
203 ; X32-SSE41-LABEL: load_sext_test1:
204 ; X32-SSE41:       # BB#0: # %entry
205 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
206 ; X32-SSE41-NEXT:    pmovsxwd (%eax), %xmm0
207 ; X32-SSE41-NEXT:    retl
208 entry:
209  %X = load <4 x i16>* %ptr
210  %Y = sext <4 x i16> %X to <4 x i32>
211  ret <4 x i32>%Y
212 }
213
214 define <4 x i32> @load_sext_test2(<4 x i8> *%ptr) {
215 ; SSE2-LABEL: load_sext_test2:
216 ; SSE2:       # BB#0: # %entry
217 ; SSE2-NEXT:    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: # %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
236 ; SSSE3-NEXT:    retq
237 ;
238 ; SSE41-LABEL: load_sext_test2:
239 ; SSE41:       # BB#0: # %entry
240 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
241 ; SSE41-NEXT:    retq
242 ;
243 ; AVX-LABEL: load_sext_test2:
244 ; AVX:       # BB#0: # %entry
245 ; AVX-NEXT:    vpmovsxbd (%rdi), %xmm0
246 ; AVX-NEXT:    retq
247 ;
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
253 entry:
254  %X = load <4 x i8>* %ptr
255  %Y = sext <4 x i8> %X to <4 x i32>
256  ret <4 x i32>%Y
257 }
258
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]
267 ; SSE2-NEXT:    retq
268 ;
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]
276 ; SSSE3-NEXT:    retq
277 ;
278 ; SSE41-LABEL: load_sext_test3:
279 ; SSE41:       # BB#0: # %entry
280 ; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
281 ; SSE41-NEXT:    retq
282 ;
283 ; AVX-LABEL: load_sext_test3:
284 ; AVX:       # BB#0: # %entry
285 ; AVX-NEXT:    vpmovsxbq (%rdi), %xmm0
286 ; AVX-NEXT:    retq
287 ;
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
293 entry:
294  %X = load <2 x i8>* %ptr
295  %Y = sext <2 x i8> %X to <2 x i64>
296  ret <2 x i64>%Y
297 }
298
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]
307 ; SSE2-NEXT:    retq
308 ;
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]
316 ; SSSE3-NEXT:    retq
317 ;
318 ; SSE41-LABEL: load_sext_test4:
319 ; SSE41:       # BB#0: # %entry
320 ; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
321 ; SSE41-NEXT:    retq
322 ;
323 ; AVX-LABEL: load_sext_test4:
324 ; AVX:       # BB#0: # %entry
325 ; AVX-NEXT:    vpmovsxwq (%rdi), %xmm0
326 ; AVX-NEXT:    retq
327 ;
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
333 entry:
334  %X = load <2 x i16>* %ptr
335  %Y = sext <2 x i16> %X to <2 x i64>
336  ret <2 x i64>%Y
337 }
338
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]
347 ; SSE2-NEXT:    retq
348 ;
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]
356 ; SSSE3-NEXT:    retq
357 ;
358 ; SSE41-LABEL: load_sext_test5:
359 ; SSE41:       # BB#0: # %entry
360 ; SSE41-NEXT:    pmovsxdq (%rdi), %xmm0
361 ; SSE41-NEXT:    retq
362 ;
363 ; AVX-LABEL: load_sext_test5:
364 ; AVX:       # BB#0: # %entry
365 ; AVX-NEXT:    vpmovsxdq (%rdi), %xmm0
366 ; AVX-NEXT:    retq
367 ;
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
373 entry:
374  %X = load <2 x i32>* %ptr
375  %Y = sext <2 x i32> %X to <2 x i64>
376  ret <2 x i64>%Y
377 }
378
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
385 ; SSE2-NEXT:    retq
386 ;
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
392 ; SSSE3-NEXT:    retq
393 ;
394 ; SSE41-LABEL: load_sext_test6:
395 ; SSE41:       # BB#0: # %entry
396 ; SSE41-NEXT:    pmovsxbw (%rdi), %xmm0
397 ; SSE41-NEXT:    retq
398 ;
399 ; AVX-LABEL: load_sext_test6:
400 ; AVX:       # BB#0: # %entry
401 ; AVX-NEXT:    vpmovsxbw (%rdi), %xmm0
402 ; AVX-NEXT:    retq
403 ;
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
409 entry:
410  %X = load <8 x i8>* %ptr
411  %Y = sext <8 x i8> %X to <8 x i16>
412  ret <8 x i16>%Y
413 }
414
415 define <4 x i64> @sext_4i1_to_4i64(<4 x i1> %mask) {
416 ; SSE2-LABEL: sext_4i1_to_4i64:
417 ; SSE2:       # BB#0:
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
422 ; SSE2-NEXT:    cltq
423 ; SSE2-NEXT:    movd %rax, %xmm2
424 ; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
425 ; SSE2-NEXT:    movd %xmm1, %rax
426 ; SSE2-NEXT:    cltq
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
431 ; SSE2-NEXT:    cltq
432 ; SSE2-NEXT:    movd %rax, %xmm1
433 ; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
434 ; SSE2-NEXT:    movd %xmm0, %rax
435 ; SSE2-NEXT:    cltq
436 ; SSE2-NEXT:    movd %rax, %xmm0
437 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
438 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
439 ; SSE2-NEXT:    retq
440 ;
441 ; SSSE3-LABEL: sext_4i1_to_4i64:
442 ; SSSE3:       # BB#0:
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
447 ; SSSE3-NEXT:    cltq
448 ; SSSE3-NEXT:    movd %rax, %xmm2
449 ; SSSE3-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
450 ; SSSE3-NEXT:    movd %xmm1, %rax
451 ; SSSE3-NEXT:    cltq
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
456 ; SSSE3-NEXT:    cltq
457 ; SSSE3-NEXT:    movd %rax, %xmm1
458 ; SSSE3-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
459 ; SSSE3-NEXT:    movd %xmm0, %rax
460 ; SSSE3-NEXT:    cltq
461 ; SSSE3-NEXT:    movd %rax, %xmm0
462 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
463 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
464 ; SSSE3-NEXT:    retq
465 ;
466 ; SSE41-LABEL: sext_4i1_to_4i64:
467 ; SSE41:       # BB#0:
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
472 ; SSE41-NEXT:    cltq
473 ; SSE41-NEXT:    movd %rax, %xmm3
474 ; SSE41-NEXT:    movd %xmm1, %rax
475 ; SSE41-NEXT:    cltq
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
480 ; SSE41-NEXT:    cltq
481 ; SSE41-NEXT:    movd %rax, %xmm3
482 ; SSE41-NEXT:    movd %xmm0, %rax
483 ; SSE41-NEXT:    cltq
484 ; SSE41-NEXT:    movd %rax, %xmm1
485 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
486 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
487 ; SSE41-NEXT:    retq
488 ;
489 ; AVX1-LABEL: sext_4i1_to_4i64:
490 ; AVX1:       # BB#0:
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
497 ; AVX1-NEXT:    retq
498 ;
499 ; AVX2-LABEL: sext_4i1_to_4i64:
500 ; AVX2:       # BB#0:
501 ; AVX2-NEXT:    vpslld $31, %xmm0, %xmm0
502 ; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm0
503 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
504 ; AVX2-NEXT:    retq
505 ;
506 ; X32-SSE41-LABEL: sext_4i1_to_4i64:
507 ; X32-SSE41:       # BB#0:
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
528 }
529
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
541 ; SSE2-NEXT:    retq
542 ;
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
553 ; SSSE3-NEXT:    retq
554 ;
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
564 ; SSE41-NEXT:    retq
565 ;
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
573 ; AVX1-NEXT:    retq
574 ;
575 ; AVX2-LABEL: sext_16i8_to_16i16:
576 ; AVX2:       # BB#0: # %entry
577 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
578 ; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm0
579 ; AVX2-NEXT:    retq
580 ;
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
592 entry:
593  %X = load <16 x i8>* %ptr
594  %Y = sext <16 x i8> %X to <16 x i16>
595  ret <16 x i16> %Y
596 }
597
598 define <4 x i64> @sext_4i8_to_4i64(<4 x i8> %mask) {
599 ; SSE2-LABEL: sext_4i8_to_4i64:
600 ; SSE2:       # BB#0:
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
605 ; SSE2-NEXT:    cltq
606 ; SSE2-NEXT:    movd %rax, %xmm2
607 ; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
608 ; SSE2-NEXT:    movd %xmm1, %rax
609 ; SSE2-NEXT:    cltq
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
614 ; SSE2-NEXT:    cltq
615 ; SSE2-NEXT:    movd %rax, %xmm1
616 ; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
617 ; SSE2-NEXT:    movd %xmm0, %rax
618 ; SSE2-NEXT:    cltq
619 ; SSE2-NEXT:    movd %rax, %xmm0
620 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
621 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
622 ; SSE2-NEXT:    retq
623 ;
624 ; SSSE3-LABEL: sext_4i8_to_4i64:
625 ; SSSE3:       # BB#0:
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
630 ; SSSE3-NEXT:    cltq
631 ; SSSE3-NEXT:    movd %rax, %xmm2
632 ; SSSE3-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
633 ; SSSE3-NEXT:    movd %xmm1, %rax
634 ; SSSE3-NEXT:    cltq
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
639 ; SSSE3-NEXT:    cltq
640 ; SSSE3-NEXT:    movd %rax, %xmm1
641 ; SSSE3-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
642 ; SSSE3-NEXT:    movd %xmm0, %rax
643 ; SSSE3-NEXT:    cltq
644 ; SSSE3-NEXT:    movd %rax, %xmm0
645 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
646 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
647 ; SSSE3-NEXT:    retq
648 ;
649 ; SSE41-LABEL: sext_4i8_to_4i64:
650 ; SSE41:       # BB#0:
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
655 ; SSE41-NEXT:    cltq
656 ; SSE41-NEXT:    movd %rax, %xmm3
657 ; SSE41-NEXT:    movd %xmm1, %rax
658 ; SSE41-NEXT:    cltq
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
663 ; SSE41-NEXT:    cltq
664 ; SSE41-NEXT:    movd %rax, %xmm3
665 ; SSE41-NEXT:    movd %xmm0, %rax
666 ; SSE41-NEXT:    cltq
667 ; SSE41-NEXT:    movd %rax, %xmm1
668 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
669 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
670 ; SSE41-NEXT:    retq
671 ;
672 ; AVX1-LABEL: sext_4i8_to_4i64:
673 ; AVX1:       # BB#0:
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
680 ; AVX1-NEXT:    retq
681 ;
682 ; AVX2-LABEL: sext_4i8_to_4i64:
683 ; AVX2:       # BB#0:
684 ; AVX2-NEXT:    vpslld $24, %xmm0, %xmm0
685 ; AVX2-NEXT:    vpsrad $24, %xmm0, %xmm0
686 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
687 ; AVX2-NEXT:    retq
688 ;
689 ; X32-SSE41-LABEL: sext_4i8_to_4i64:
690 ; X32-SSE41:       # BB#0:
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
711 }
712
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]
743 ; SSE2-NEXT:    retq
744 ;
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]
767 ; SSSE3-NEXT:    retq
768 ;
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]
789 ; SSE41-NEXT:    retq
790 ;
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
798 ; AVX1-NEXT:    retq
799 ;
800 ; AVX2-LABEL: load_sext_4i8_to_4i64:
801 ; AVX2:       # BB#0: # %entry
802 ; AVX2-NEXT:    vpmovsxbq (%rdi), %ymm0
803 ; AVX2-NEXT:    retq
804 ;
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
833 entry:
834  %X = load <4 x i8>* %ptr
835  %Y = sext <4 x i8> %X to <4 x i64>
836  ret <4 x i64>%Y
837 }
838
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]
862 ; SSE2-NEXT:    retq
863 ;
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]
886 ; SSSE3-NEXT:    retq
887 ;
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]
908 ; SSE41-NEXT:    retq
909 ;
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
917 ; AVX1-NEXT:    retq
918 ;
919 ; AVX2-LABEL: load_sext_4i16_to_4i64:
920 ; AVX2:       # BB#0: # %entry
921 ; AVX2-NEXT:    vpmovsxwq (%rdi), %ymm0
922 ; AVX2-NEXT:    retq
923 ;
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
952 entry:
953  %X = load <4 x i16>* %ptr
954  %Y = sext <4 x i16> %X to <4 x i64>
955  ret <4 x i64>%Y
956 }