b7faafdb503f09d8144fdda0efae12fb0b55a37c
[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 i16> @sext_16i8_to_8i16(<16 x i8> %A) nounwind uwtable readnone ssp {
11 ; SSE2-LABEL: sext_16i8_to_8i16:
12 ; SSE2:       # BB#0: # %entry
13 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
14 ; SSE2-NEXT:    psraw $8, %xmm0
15 ; SSE2-NEXT:    retq
16 ;
17 ; SSSE3-LABEL: sext_16i8_to_8i16:
18 ; SSSE3:       # BB#0: # %entry
19 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
20 ; SSSE3-NEXT:    psraw $8, %xmm0
21 ; SSSE3-NEXT:    retq
22 ;
23 ; SSE41-LABEL: sext_16i8_to_8i16:
24 ; SSE41:       # BB#0: # %entry
25 ; SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
26 ; SSE41-NEXT:    retq
27 ;
28 ; AVX-LABEL: sext_16i8_to_8i16:
29 ; AVX:       # BB#0: # %entry
30 ; AVX-NEXT:    vpmovsxbw %xmm0, %xmm0
31 ; AVX-NEXT:    retq
32 ;
33 ; X32-SSE41-LABEL: sext_16i8_to_8i16:
34 ; X32-SSE41:       # BB#0: # %entry
35 ; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
36 ; X32-SSE41-NEXT:    retl
37 entry:
38   %B = shufflevector <16 x i8> %A, <16 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
39   %C = sext <8 x i8> %B to <8 x i16>
40   ret <8 x i16> %C
41 }
42
43 define <16 x i16> @sext_16i8_to_16i16(<16 x i8> %A) nounwind uwtable readnone ssp {
44 ; SSE2-LABEL: sext_16i8_to_16i16:
45 ; SSE2:       # BB#0: # %entry
46 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
47 ; SSE2-NEXT:    psraw $8, %xmm2
48 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
49 ; 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]
50 ; SSE2-NEXT:    psraw $8, %xmm1
51 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
52 ; SSE2-NEXT:    retq
53 ;
54 ; SSSE3-LABEL: sext_16i8_to_16i16:
55 ; SSSE3:       # BB#0: # %entry
56 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
57 ; SSSE3-NEXT:    psraw $8, %xmm2
58 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
59 ; 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]
60 ; SSSE3-NEXT:    psraw $8, %xmm1
61 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
62 ; SSSE3-NEXT:    retq
63 ;
64 ; SSE41-LABEL: sext_16i8_to_16i16:
65 ; SSE41:       # BB#0: # %entry
66 ; SSE41-NEXT:    pmovsxbw %xmm0, %xmm2
67 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
68 ; SSE41-NEXT:    pmovsxbw %xmm0, %xmm1
69 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
70 ; SSE41-NEXT:    retq
71 ;
72 ; AVX1-LABEL: sext_16i8_to_16i16:
73 ; AVX1:       # BB#0: # %entry
74 ; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm1
75 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
76 ; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm0
77 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
78 ; AVX1-NEXT:    retq
79 ;
80 ; AVX2-LABEL: sext_16i8_to_16i16:
81 ; AVX2:       # BB#0: # %entry
82 ; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm0
83 ; AVX2-NEXT:    retq
84 ;
85 ; X32-SSE41-LABEL: sext_16i8_to_16i16:
86 ; X32-SSE41:       # BB#0: # %entry
87 ; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm2
88 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
89 ; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm1
90 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
91 ; X32-SSE41-NEXT:    retl
92 entry:
93   %B = sext <16 x i8> %A to <16 x i16>
94   ret <16 x i16> %B
95 }
96
97 define <4 x i32> @sext_16i8_to_4i32(<16 x i8> %A) nounwind uwtable readnone ssp {
98 ; SSE2-LABEL: sext_16i8_to_4i32:
99 ; SSE2:       # BB#0: # %entry
100 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
101 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
102 ; SSE2-NEXT:    psrad $24, %xmm0
103 ; SSE2-NEXT:    retq
104 ;
105 ; SSSE3-LABEL: sext_16i8_to_4i32:
106 ; SSSE3:       # BB#0: # %entry
107 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
108 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
109 ; SSSE3-NEXT:    psrad $24, %xmm0
110 ; SSSE3-NEXT:    retq
111 ;
112 ; SSE41-LABEL: sext_16i8_to_4i32:
113 ; SSE41:       # BB#0: # %entry
114 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
115 ; SSE41-NEXT:    retq
116 ;
117 ; AVX-LABEL: sext_16i8_to_4i32:
118 ; AVX:       # BB#0: # %entry
119 ; AVX-NEXT:    vpmovsxbd %xmm0, %xmm0
120 ; AVX-NEXT:    retq
121 ;
122 ; X32-SSE41-LABEL: sext_16i8_to_4i32:
123 ; X32-SSE41:       # BB#0: # %entry
124 ; X32-SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
125 ; X32-SSE41-NEXT:    retl
126 entry:
127   %B = shufflevector <16 x i8> %A, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
128   %C = sext <4 x i8> %B to <4 x i32>
129   ret <4 x i32> %C
130 }
131
132 define <8 x i32> @sext_16i8_to_8i32(<16 x i8> %A) nounwind uwtable readnone ssp {
133 ; SSE2-LABEL: sext_16i8_to_8i32:
134 ; SSE2:       # BB#0: # %entry
135 ; 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]
136 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
137 ; SSE2-NEXT:    psrad $24, %xmm2
138 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
139 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
140 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
141 ; SSE2-NEXT:    psrad $24, %xmm1
142 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
143 ; SSE2-NEXT:    retq
144 ;
145 ; SSSE3-LABEL: sext_16i8_to_8i32:
146 ; SSSE3:       # BB#0: # %entry
147 ; 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]
148 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
149 ; SSSE3-NEXT:    psrad $24, %xmm2
150 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
151 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
152 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
153 ; SSSE3-NEXT:    psrad $24, %xmm1
154 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
155 ; SSSE3-NEXT:    retq
156 ;
157 ; SSE41-LABEL: sext_16i8_to_8i32:
158 ; SSE41:       # BB#0: # %entry
159 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm2
160 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
161 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm1
162 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
163 ; SSE41-NEXT:    retq
164 ;
165 ; AVX1-LABEL: sext_16i8_to_8i32:
166 ; AVX1:       # BB#0: # %entry
167 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm1
168 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
169 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
170 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
171 ; AVX1-NEXT:    retq
172 ;
173 ; AVX2-LABEL: sext_16i8_to_8i32:
174 ; AVX2:       # BB#0: # %entry
175 ; AVX2-NEXT:    vpmovzxbd {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
176 ; AVX2-NEXT:    vpslld $24, %ymm0, %ymm0
177 ; AVX2-NEXT:    vpsrad $24, %ymm0, %ymm0
178 ; AVX2-NEXT:    retq
179 ;
180 ; X32-SSE41-LABEL: sext_16i8_to_8i32:
181 ; X32-SSE41:       # BB#0: # %entry
182 ; X32-SSE41-NEXT:    pmovsxbd %xmm0, %xmm2
183 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
184 ; X32-SSE41-NEXT:    pmovsxbd %xmm0, %xmm1
185 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
186 ; X32-SSE41-NEXT:    retl
187 entry:
188   %B = shufflevector <16 x i8> %A, <16 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
189   %C = sext <8 x i8> %B to <8 x i32>
190   ret <8 x i32> %C
191 }
192
193 define <2 x i64> @sext_16i8_to_2i64(<16 x i8> %A) nounwind uwtable readnone ssp {
194 ; SSE2-LABEL: sext_16i8_to_2i64:
195 ; SSE2:       # BB#0: # %entry
196 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
197 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
198 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
199 ; SSE2-NEXT:    psrad $31, %xmm1
200 ; SSE2-NEXT:    psrad $24, %xmm0
201 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
202 ; SSE2-NEXT:    retq
203 ;
204 ; SSSE3-LABEL: sext_16i8_to_2i64:
205 ; SSSE3:       # BB#0: # %entry
206 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
207 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
208 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
209 ; SSSE3-NEXT:    psrad $31, %xmm1
210 ; SSSE3-NEXT:    psrad $24, %xmm0
211 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
212 ; SSSE3-NEXT:    retq
213 ;
214 ; SSE41-LABEL: sext_16i8_to_2i64:
215 ; SSE41:       # BB#0: # %entry
216 ; SSE41-NEXT:    pmovsxbq %xmm0, %xmm0
217 ; SSE41-NEXT:    retq
218 ;
219 ; AVX-LABEL: sext_16i8_to_2i64:
220 ; AVX:       # BB#0: # %entry
221 ; AVX-NEXT:    vpmovsxbq %xmm0, %xmm0
222 ; AVX-NEXT:    retq
223 ;
224 ; X32-SSE41-LABEL: sext_16i8_to_2i64:
225 ; X32-SSE41:       # BB#0: # %entry
226 ; X32-SSE41-NEXT:    pmovsxbq %xmm0, %xmm0
227 ; X32-SSE41-NEXT:    retl
228 entry:
229   %B = shufflevector <16 x i8> %A, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
230   %C = sext <2 x i8> %B to <2 x i64>
231   ret <2 x i64> %C
232 }
233
234 define <4 x i64> @sext_16i8_to_4i64(<16 x i8> %A) nounwind uwtable readnone ssp {
235 ; SSE2-LABEL: sext_16i8_to_4i64:
236 ; SSE2:       # BB#0: # %entry
237 ; 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]
238 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
239 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
240 ; SSE2-NEXT:    psrad $31, %xmm1
241 ; SSE2-NEXT:    psrad $24, %xmm2
242 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
243 ; SSE2-NEXT:    psrld $16, %xmm0
244 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
245 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
246 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
247 ; SSE2-NEXT:    psrad $31, %xmm0
248 ; SSE2-NEXT:    psrad $24, %xmm1
249 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
250 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
251 ; SSE2-NEXT:    retq
252 ;
253 ; SSSE3-LABEL: sext_16i8_to_4i64:
254 ; SSSE3:       # BB#0: # %entry
255 ; 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]
256 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
257 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
258 ; SSSE3-NEXT:    psrad $31, %xmm1
259 ; SSSE3-NEXT:    psrad $24, %xmm2
260 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
261 ; SSSE3-NEXT:    psrld $16, %xmm0
262 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
263 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
264 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
265 ; SSSE3-NEXT:    psrad $31, %xmm0
266 ; SSSE3-NEXT:    psrad $24, %xmm1
267 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
268 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
269 ; SSSE3-NEXT:    retq
270 ;
271 ; SSE41-LABEL: sext_16i8_to_4i64:
272 ; SSE41:       # BB#0: # %entry
273 ; SSE41-NEXT:    pmovsxbq %xmm0, %xmm2
274 ; SSE41-NEXT:    psrld $16, %xmm0
275 ; SSE41-NEXT:    pmovsxbq %xmm0, %xmm1
276 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
277 ; SSE41-NEXT:    retq
278 ;
279 ; AVX1-LABEL: sext_16i8_to_4i64:
280 ; AVX1:       # BB#0: # %entry
281 ; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm1
282 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
283 ; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm0
284 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
285 ; AVX1-NEXT:    retq
286 ;
287 ; AVX2-LABEL: sext_16i8_to_4i64:
288 ; AVX2:       # BB#0: # %entry
289 ; AVX2-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
290 ; AVX2-NEXT:    vpslld $24, %xmm0, %xmm0
291 ; AVX2-NEXT:    vpsrad $24, %xmm0, %xmm0
292 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
293 ; AVX2-NEXT:    retq
294 ;
295 ; X32-SSE41-LABEL: sext_16i8_to_4i64:
296 ; X32-SSE41:       # BB#0: # %entry
297 ; X32-SSE41-NEXT:    pmovsxbq %xmm0, %xmm2
298 ; X32-SSE41-NEXT:    psrld $16, %xmm0
299 ; X32-SSE41-NEXT:    pmovsxbq %xmm0, %xmm1
300 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
301 ; X32-SSE41-NEXT:    retl
302 entry:
303   %B = shufflevector <16 x i8> %A, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
304   %C = sext <4 x i8> %B to <4 x i64>
305   ret <4 x i64> %C
306 }
307
308 define <4 x i32> @sext_8i16_to_4i32(<8 x i16> %A) nounwind uwtable readnone ssp {
309 ; SSE2-LABEL: sext_8i16_to_4i32:
310 ; SSE2:       # BB#0: # %entry
311 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
312 ; SSE2-NEXT:    psrad $16, %xmm0
313 ; SSE2-NEXT:    retq
314 ;
315 ; SSSE3-LABEL: sext_8i16_to_4i32:
316 ; SSSE3:       # BB#0: # %entry
317 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
318 ; SSSE3-NEXT:    psrad $16, %xmm0
319 ; SSSE3-NEXT:    retq
320 ;
321 ; SSE41-LABEL: sext_8i16_to_4i32:
322 ; SSE41:       # BB#0: # %entry
323 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm0
324 ; SSE41-NEXT:    retq
325 ;
326 ; AVX-LABEL: sext_8i16_to_4i32:
327 ; AVX:       # BB#0: # %entry
328 ; AVX-NEXT:    vpmovsxwd %xmm0, %xmm0
329 ; AVX-NEXT:    retq
330 ;
331 ; X32-SSE41-LABEL: sext_8i16_to_4i32:
332 ; X32-SSE41:       # BB#0: # %entry
333 ; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm0
334 ; X32-SSE41-NEXT:    retl
335 entry:
336   %B = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
337   %C = sext <4 x i16> %B to <4 x i32>
338   ret <4 x i32> %C
339 }
340
341 define <8 x i32> @sext_8i16_to_8i32(<8 x i16> %A) nounwind uwtable readnone ssp {
342 ; SSE2-LABEL: sext_8i16_to_8i32:
343 ; SSE2:       # BB#0: # %entry
344 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
345 ; SSE2-NEXT:    psrad $16, %xmm2
346 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
347 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
348 ; SSE2-NEXT:    psrad $16, %xmm1
349 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
350 ; SSE2-NEXT:    retq
351 ;
352 ; SSSE3-LABEL: sext_8i16_to_8i32:
353 ; SSSE3:       # BB#0: # %entry
354 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
355 ; SSSE3-NEXT:    psrad $16, %xmm2
356 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
357 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
358 ; SSSE3-NEXT:    psrad $16, %xmm1
359 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
360 ; SSSE3-NEXT:    retq
361 ;
362 ; SSE41-LABEL: sext_8i16_to_8i32:
363 ; SSE41:       # BB#0: # %entry
364 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm2
365 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
366 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm1
367 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
368 ; SSE41-NEXT:    retq
369 ;
370 ; AVX1-LABEL: sext_8i16_to_8i32:
371 ; AVX1:       # BB#0: # %entry
372 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
373 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
374 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
375 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
376 ; AVX1-NEXT:    retq
377 ;
378 ; AVX2-LABEL: sext_8i16_to_8i32:
379 ; AVX2:       # BB#0: # %entry
380 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
381 ; AVX2-NEXT:    retq
382 ;
383 ; X32-SSE41-LABEL: sext_8i16_to_8i32:
384 ; X32-SSE41:       # BB#0: # %entry
385 ; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm2
386 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
387 ; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm1
388 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
389 ; X32-SSE41-NEXT:    retl
390 entry:
391   %B = sext <8 x i16> %A to <8 x i32>
392   ret <8 x i32> %B
393 }
394
395 define <2 x i64> @sext_8i16_to_2i64(<8 x i16> %A) nounwind uwtable readnone ssp {
396 ; SSE2-LABEL: sext_8i16_to_2i64:
397 ; SSE2:       # BB#0: # %entry
398 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
399 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
400 ; SSE2-NEXT:    psrad $31, %xmm1
401 ; SSE2-NEXT:    psrad $16, %xmm0
402 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
403 ; SSE2-NEXT:    retq
404 ;
405 ; SSSE3-LABEL: sext_8i16_to_2i64:
406 ; SSSE3:       # BB#0: # %entry
407 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
408 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
409 ; SSSE3-NEXT:    psrad $31, %xmm1
410 ; SSSE3-NEXT:    psrad $16, %xmm0
411 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
412 ; SSSE3-NEXT:    retq
413 ;
414 ; SSE41-LABEL: sext_8i16_to_2i64:
415 ; SSE41:       # BB#0: # %entry
416 ; SSE41-NEXT:    pmovsxwq %xmm0, %xmm0
417 ; SSE41-NEXT:    retq
418 ;
419 ; AVX-LABEL: sext_8i16_to_2i64:
420 ; AVX:       # BB#0: # %entry
421 ; AVX-NEXT:    vpmovsxwq %xmm0, %xmm0
422 ; AVX-NEXT:    retq
423 ;
424 ; X32-SSE41-LABEL: sext_8i16_to_2i64:
425 ; X32-SSE41:       # BB#0: # %entry
426 ; X32-SSE41-NEXT:    pmovsxwq %xmm0, %xmm0
427 ; X32-SSE41-NEXT:    retl
428 entry:
429   %B = shufflevector <8 x i16> %A, <8 x i16> undef, <2 x i32> <i32 0, i32 1>
430   %C = sext <2 x i16> %B to <2 x i64>
431   ret <2 x i64> %C
432 }
433
434 define <4 x i64> @sext_8i16_to_4i64(<8 x i16> %A) nounwind uwtable readnone ssp {
435 ; SSE2-LABEL: sext_8i16_to_4i64:
436 ; SSE2:       # BB#0: # %entry
437 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
438 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
439 ; SSE2-NEXT:    psrad $31, %xmm1
440 ; SSE2-NEXT:    psrad $16, %xmm2
441 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
442 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
443 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
444 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
445 ; SSE2-NEXT:    psrad $31, %xmm0
446 ; SSE2-NEXT:    psrad $16, %xmm1
447 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
448 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
449 ; SSE2-NEXT:    retq
450 ;
451 ; SSSE3-LABEL: sext_8i16_to_4i64:
452 ; SSSE3:       # BB#0: # %entry
453 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
454 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
455 ; SSSE3-NEXT:    psrad $31, %xmm1
456 ; SSSE3-NEXT:    psrad $16, %xmm2
457 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
458 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
459 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
460 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
461 ; SSSE3-NEXT:    psrad $31, %xmm0
462 ; SSSE3-NEXT:    psrad $16, %xmm1
463 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
464 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
465 ; SSSE3-NEXT:    retq
466 ;
467 ; SSE41-LABEL: sext_8i16_to_4i64:
468 ; SSE41:       # BB#0: # %entry
469 ; SSE41-NEXT:    pmovsxwq %xmm0, %xmm2
470 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
471 ; SSE41-NEXT:    pmovsxwq %xmm0, %xmm1
472 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
473 ; SSE41-NEXT:    retq
474 ;
475 ; AVX1-LABEL: sext_8i16_to_4i64:
476 ; AVX1:       # BB#0: # %entry
477 ; AVX1-NEXT:    vpmovsxwq %xmm0, %xmm1
478 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
479 ; AVX1-NEXT:    vpmovsxwq %xmm0, %xmm0
480 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
481 ; AVX1-NEXT:    retq
482 ;
483 ; AVX2-LABEL: sext_8i16_to_4i64:
484 ; AVX2:       # BB#0: # %entry
485 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
486 ; AVX2-NEXT:    vpslld $16, %xmm0, %xmm0
487 ; AVX2-NEXT:    vpsrad $16, %xmm0, %xmm0
488 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
489 ; AVX2-NEXT:    retq
490 ;
491 ; X32-SSE41-LABEL: sext_8i16_to_4i64:
492 ; X32-SSE41:       # BB#0: # %entry
493 ; X32-SSE41-NEXT:    pmovsxwq %xmm0, %xmm2
494 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
495 ; X32-SSE41-NEXT:    pmovsxwq %xmm0, %xmm1
496 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
497 ; X32-SSE41-NEXT:    retl
498 entry:
499   %B = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
500   %C = sext <4 x i16> %B to <4 x i64>
501   ret <4 x i64> %C
502 }
503
504 define <2 x i64> @sext_4i32_to_2i64(<4 x i32> %A) nounwind uwtable readnone ssp {
505 ; SSE2-LABEL: sext_4i32_to_2i64:
506 ; SSE2:       # BB#0: # %entry
507 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
508 ; SSE2-NEXT:    psrad $31, %xmm1
509 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
510 ; SSE2-NEXT:    retq
511 ;
512 ; SSSE3-LABEL: sext_4i32_to_2i64:
513 ; SSSE3:       # BB#0: # %entry
514 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
515 ; SSSE3-NEXT:    psrad $31, %xmm1
516 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
517 ; SSSE3-NEXT:    retq
518 ;
519 ; SSE41-LABEL: sext_4i32_to_2i64:
520 ; SSE41:       # BB#0: # %entry
521 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm0
522 ; SSE41-NEXT:    retq
523 ;
524 ; AVX-LABEL: sext_4i32_to_2i64:
525 ; AVX:       # BB#0: # %entry
526 ; AVX-NEXT:    vpmovsxdq %xmm0, %xmm0
527 ; AVX-NEXT:    retq
528 ;
529 ; X32-SSE41-LABEL: sext_4i32_to_2i64:
530 ; X32-SSE41:       # BB#0: # %entry
531 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm0
532 ; X32-SSE41-NEXT:    retl
533 entry:
534   %B = shufflevector <4 x i32> %A, <4 x i32> undef, <2 x i32> <i32 0, i32 1>
535   %C = sext <2 x i32> %B to <2 x i64>
536   ret <2 x i64> %C
537 }
538
539 define <4 x i64> @sext_4i32_to_4i64(<4 x i32> %A) nounwind uwtable readnone ssp {
540 ; SSE2-LABEL: sext_4i32_to_4i64:
541 ; SSE2:       # BB#0: # %entry
542 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
543 ; SSE2-NEXT:    psrad $31, %xmm2
544 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
545 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
546 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
547 ; SSE2-NEXT:    psrad $31, %xmm2
548 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
549 ; SSE2-NEXT:    retq
550 ;
551 ; SSSE3-LABEL: sext_4i32_to_4i64:
552 ; SSSE3:       # BB#0: # %entry
553 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
554 ; SSSE3-NEXT:    psrad $31, %xmm2
555 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
556 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
557 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
558 ; SSSE3-NEXT:    psrad $31, %xmm2
559 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
560 ; SSSE3-NEXT:    retq
561 ;
562 ; SSE41-LABEL: sext_4i32_to_4i64:
563 ; SSE41:       # BB#0: # %entry
564 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
565 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
566 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
567 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
568 ; SSE41-NEXT:    retq
569 ;
570 ; AVX1-LABEL: sext_4i32_to_4i64:
571 ; AVX1:       # BB#0: # %entry
572 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
573 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
574 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
575 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
576 ; AVX1-NEXT:    retq
577 ;
578 ; AVX2-LABEL: sext_4i32_to_4i64:
579 ; AVX2:       # BB#0: # %entry
580 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
581 ; AVX2-NEXT:    retq
582 ;
583 ; X32-SSE41-LABEL: sext_4i32_to_4i64:
584 ; X32-SSE41:       # BB#0: # %entry
585 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
586 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
587 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
588 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
589 ; X32-SSE41-NEXT:    retl
590 entry:
591   %B = sext <4 x i32> %A to <4 x i64>
592   ret <4 x i64> %B
593 }
594
595 define <2 x i64> @load_sext_2i1_to_2i64(<2 x i1> *%ptr) {
596 ; SSE-LABEL: load_sext_2i1_to_2i64:
597 ; SSE:       # BB#0: # %entry
598 ; SSE-NEXT:    movzbl (%rdi), %eax
599 ; SSE-NEXT:    movq %rax, %rcx
600 ; SSE-NEXT:    shlq $62, %rcx
601 ; SSE-NEXT:    sarq $63, %rcx
602 ; SSE-NEXT:    movd %rcx, %xmm1
603 ; SSE-NEXT:    shlq $63, %rax
604 ; SSE-NEXT:    sarq $63, %rax
605 ; SSE-NEXT:    movd %rax, %xmm0
606 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
607 ; SSE-NEXT:    retq
608 ;
609 ; AVX-LABEL: load_sext_2i1_to_2i64:
610 ; AVX:       # BB#0: # %entry
611 ; AVX-NEXT:    movzbl (%rdi), %eax
612 ; AVX-NEXT:    movq %rax, %rcx
613 ; AVX-NEXT:    shlq $62, %rcx
614 ; AVX-NEXT:    sarq $63, %rcx
615 ; AVX-NEXT:    vmovq %rcx, %xmm0
616 ; AVX-NEXT:    shlq $63, %rax
617 ; AVX-NEXT:    sarq $63, %rax
618 ; AVX-NEXT:    vmovq %rax, %xmm1
619 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
620 ; AVX-NEXT:    retq
621 ;
622 ; X32-SSE41-LABEL: load_sext_2i1_to_2i64:
623 ; X32-SSE41:       # BB#0: # %entry
624 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
625 ; X32-SSE41-NEXT:    movzbl (%eax), %eax
626 ; X32-SSE41-NEXT:    movl %eax, %ecx
627 ; X32-SSE41-NEXT:    shll $31, %ecx
628 ; X32-SSE41-NEXT:    sarl $31, %ecx
629 ; X32-SSE41-NEXT:    movd %ecx, %xmm0
630 ; X32-SSE41-NEXT:    pinsrd $1, %ecx, %xmm0
631 ; X32-SSE41-NEXT:    shll $30, %eax
632 ; X32-SSE41-NEXT:    sarl $31, %eax
633 ; X32-SSE41-NEXT:    pinsrd $2, %eax, %xmm0
634 ; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm0
635 ; X32-SSE41-NEXT:    retl
636 entry:
637  %X = load <2 x i1>, <2 x i1>* %ptr
638  %Y = sext <2 x i1> %X to <2 x i64>
639  ret <2 x i64> %Y
640 }
641
642 define <2 x i64> @load_sext_2i8_to_2i64(<2 x i8> *%ptr) {
643 ; SSE2-LABEL: load_sext_2i8_to_2i64:
644 ; SSE2:       # BB#0: # %entry
645 ; SSE2-NEXT:    movzwl (%rdi), %eax
646 ; SSE2-NEXT:    movd %eax, %xmm0
647 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
648 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
649 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
650 ; SSE2-NEXT:    psrad $31, %xmm1
651 ; SSE2-NEXT:    psrad $24, %xmm0
652 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
653 ; SSE2-NEXT:    retq
654 ;
655 ; SSSE3-LABEL: load_sext_2i8_to_2i64:
656 ; SSSE3:       # BB#0: # %entry
657 ; SSSE3-NEXT:    movzwl (%rdi), %eax
658 ; SSSE3-NEXT:    movd %eax, %xmm0
659 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
660 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
661 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
662 ; SSSE3-NEXT:    psrad $31, %xmm1
663 ; SSSE3-NEXT:    psrad $24, %xmm0
664 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
665 ; SSSE3-NEXT:    retq
666 ;
667 ; SSE41-LABEL: load_sext_2i8_to_2i64:
668 ; SSE41:       # BB#0: # %entry
669 ; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
670 ; SSE41-NEXT:    retq
671 ;
672 ; AVX-LABEL: load_sext_2i8_to_2i64:
673 ; AVX:       # BB#0: # %entry
674 ; AVX-NEXT:    vpmovsxbq (%rdi), %xmm0
675 ; AVX-NEXT:    retq
676 ;
677 ; X32-SSE41-LABEL: load_sext_2i8_to_2i64:
678 ; X32-SSE41:       # BB#0: # %entry
679 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
680 ; X32-SSE41-NEXT:    pmovsxbq (%eax), %xmm0
681 ; X32-SSE41-NEXT:    retl
682 entry:
683  %X = load <2 x i8>, <2 x i8>* %ptr
684  %Y = sext <2 x i8> %X to <2 x i64>
685  ret <2 x i64> %Y
686 }
687
688 define <4 x i32> @load_sext_4i1_to_4i32(<4 x i1> *%ptr) {
689 ; SSE2-LABEL: load_sext_4i1_to_4i32:
690 ; SSE2:       # BB#0: # %entry
691 ; SSE2-NEXT:    movzbl (%rdi), %eax
692 ; SSE2-NEXT:    movq %rax, %rcx
693 ; SSE2-NEXT:    shlq $60, %rcx
694 ; SSE2-NEXT:    sarq $63, %rcx
695 ; SSE2-NEXT:    movd %ecx, %xmm0
696 ; SSE2-NEXT:    movq %rax, %rcx
697 ; SSE2-NEXT:    shlq $62, %rcx
698 ; SSE2-NEXT:    sarq $63, %rcx
699 ; SSE2-NEXT:    movd %ecx, %xmm1
700 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
701 ; SSE2-NEXT:    movq %rax, %rcx
702 ; SSE2-NEXT:    shlq $61, %rcx
703 ; SSE2-NEXT:    sarq $63, %rcx
704 ; SSE2-NEXT:    movd %ecx, %xmm2
705 ; SSE2-NEXT:    shlq $63, %rax
706 ; SSE2-NEXT:    sarq $63, %rax
707 ; SSE2-NEXT:    movd %eax, %xmm0
708 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
709 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
710 ; SSE2-NEXT:    retq
711 ;
712 ; SSSE3-LABEL: load_sext_4i1_to_4i32:
713 ; SSSE3:       # BB#0: # %entry
714 ; SSSE3-NEXT:    movzbl (%rdi), %eax
715 ; SSSE3-NEXT:    movq %rax, %rcx
716 ; SSSE3-NEXT:    shlq $60, %rcx
717 ; SSSE3-NEXT:    sarq $63, %rcx
718 ; SSSE3-NEXT:    movd %ecx, %xmm0
719 ; SSSE3-NEXT:    movq %rax, %rcx
720 ; SSSE3-NEXT:    shlq $62, %rcx
721 ; SSSE3-NEXT:    sarq $63, %rcx
722 ; SSSE3-NEXT:    movd %ecx, %xmm1
723 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
724 ; SSSE3-NEXT:    movq %rax, %rcx
725 ; SSSE3-NEXT:    shlq $61, %rcx
726 ; SSSE3-NEXT:    sarq $63, %rcx
727 ; SSSE3-NEXT:    movd %ecx, %xmm2
728 ; SSSE3-NEXT:    shlq $63, %rax
729 ; SSSE3-NEXT:    sarq $63, %rax
730 ; SSSE3-NEXT:    movd %eax, %xmm0
731 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
732 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
733 ; SSSE3-NEXT:    retq
734 ;
735 ; SSE41-LABEL: load_sext_4i1_to_4i32:
736 ; SSE41:       # BB#0: # %entry
737 ; SSE41-NEXT:    movzbl (%rdi), %eax
738 ; SSE41-NEXT:    movq %rax, %rcx
739 ; SSE41-NEXT:    shlq $62, %rcx
740 ; SSE41-NEXT:    sarq $63, %rcx
741 ; SSE41-NEXT:    movq %rax, %rdx
742 ; SSE41-NEXT:    shlq $63, %rdx
743 ; SSE41-NEXT:    sarq $63, %rdx
744 ; SSE41-NEXT:    movd %edx, %xmm0
745 ; SSE41-NEXT:    pinsrd $1, %ecx, %xmm0
746 ; SSE41-NEXT:    movq %rax, %rcx
747 ; SSE41-NEXT:    shlq $61, %rcx
748 ; SSE41-NEXT:    sarq $63, %rcx
749 ; SSE41-NEXT:    pinsrd $2, %ecx, %xmm0
750 ; SSE41-NEXT:    shlq $60, %rax
751 ; SSE41-NEXT:    sarq $63, %rax
752 ; SSE41-NEXT:    pinsrd $3, %eax, %xmm0
753 ; SSE41-NEXT:    retq
754 ;
755 ; AVX-LABEL: load_sext_4i1_to_4i32:
756 ; AVX:       # BB#0: # %entry
757 ; AVX-NEXT:    movzbl (%rdi), %eax
758 ; AVX-NEXT:    movq %rax, %rcx
759 ; AVX-NEXT:    shlq $62, %rcx
760 ; AVX-NEXT:    sarq $63, %rcx
761 ; AVX-NEXT:    movq %rax, %rdx
762 ; AVX-NEXT:    shlq $63, %rdx
763 ; AVX-NEXT:    sarq $63, %rdx
764 ; AVX-NEXT:    vmovd %edx, %xmm0
765 ; AVX-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
766 ; AVX-NEXT:    movq %rax, %rcx
767 ; AVX-NEXT:    shlq $61, %rcx
768 ; AVX-NEXT:    sarq $63, %rcx
769 ; AVX-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
770 ; AVX-NEXT:    shlq $60, %rax
771 ; AVX-NEXT:    sarq $63, %rax
772 ; AVX-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
773 ; AVX-NEXT:    retq
774 ;
775 ; X32-SSE41-LABEL: load_sext_4i1_to_4i32:
776 ; X32-SSE41:       # BB#0: # %entry
777 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
778 ; X32-SSE41-NEXT:    movl (%eax), %eax
779 ; X32-SSE41-NEXT:    movl %eax, %ecx
780 ; X32-SSE41-NEXT:    shll $30, %ecx
781 ; X32-SSE41-NEXT:    sarl $31, %ecx
782 ; X32-SSE41-NEXT:    movl %eax, %edx
783 ; X32-SSE41-NEXT:    shll $31, %edx
784 ; X32-SSE41-NEXT:    sarl $31, %edx
785 ; X32-SSE41-NEXT:    movd %edx, %xmm0
786 ; X32-SSE41-NEXT:    pinsrd $1, %ecx, %xmm0
787 ; X32-SSE41-NEXT:    movl %eax, %ecx
788 ; X32-SSE41-NEXT:    shll $29, %ecx
789 ; X32-SSE41-NEXT:    sarl $31, %ecx
790 ; X32-SSE41-NEXT:    pinsrd $2, %ecx, %xmm0
791 ; X32-SSE41-NEXT:    shll $28, %eax
792 ; X32-SSE41-NEXT:    sarl $31, %eax
793 ; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm0
794 ; X32-SSE41-NEXT:    retl
795 entry:
796  %X = load <4 x i1>, <4 x i1>* %ptr
797  %Y = sext <4 x i1> %X to <4 x i32>
798  ret <4 x i32> %Y
799 }
800
801 define <4 x i32> @load_sext_4i8_to_4i32(<4 x i8> *%ptr) {
802 ; SSE2-LABEL: load_sext_4i8_to_4i32:
803 ; SSE2:       # BB#0: # %entry
804 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
805 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
806 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
807 ; SSE2-NEXT:    psrad $24, %xmm0
808 ; SSE2-NEXT:    retq
809 ;
810 ; SSSE3-LABEL: load_sext_4i8_to_4i32:
811 ; SSSE3:       # BB#0: # %entry
812 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
813 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
814 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
815 ; SSSE3-NEXT:    psrad $24, %xmm0
816 ; SSSE3-NEXT:    retq
817 ;
818 ; SSE41-LABEL: load_sext_4i8_to_4i32:
819 ; SSE41:       # BB#0: # %entry
820 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
821 ; SSE41-NEXT:    retq
822 ;
823 ; AVX-LABEL: load_sext_4i8_to_4i32:
824 ; AVX:       # BB#0: # %entry
825 ; AVX-NEXT:    vpmovsxbd (%rdi), %xmm0
826 ; AVX-NEXT:    retq
827 ;
828 ; X32-SSE41-LABEL: load_sext_4i8_to_4i32:
829 ; X32-SSE41:       # BB#0: # %entry
830 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
831 ; X32-SSE41-NEXT:    pmovsxbd (%eax), %xmm0
832 ; X32-SSE41-NEXT:    retl
833 entry:
834  %X = load <4 x i8>, <4 x i8>* %ptr
835  %Y = sext <4 x i8> %X to <4 x i32>
836  ret <4 x i32> %Y
837 }
838
839 define <4 x i64> @load_sext_4i1_to_4i64(<4 x i1> *%ptr) {
840 ; SSE2-LABEL: load_sext_4i1_to_4i64:
841 ; SSE2:       # BB#0: # %entry
842 ; SSE2-NEXT:    movzbl (%rdi), %eax
843 ; SSE2-NEXT:    movl %eax, %ecx
844 ; SSE2-NEXT:    shrl $3, %ecx
845 ; SSE2-NEXT:    andl $1, %ecx
846 ; SSE2-NEXT:    movd %ecx, %xmm0
847 ; SSE2-NEXT:    movl %eax, %ecx
848 ; SSE2-NEXT:    shrl %ecx
849 ; SSE2-NEXT:    andl $1, %ecx
850 ; SSE2-NEXT:    movd %ecx, %xmm1
851 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
852 ; SSE2-NEXT:    movl %eax, %ecx
853 ; SSE2-NEXT:    andl $1, %ecx
854 ; SSE2-NEXT:    movd %ecx, %xmm2
855 ; SSE2-NEXT:    shrl $2, %eax
856 ; SSE2-NEXT:    andl $1, %eax
857 ; SSE2-NEXT:    movd %eax, %xmm0
858 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
859 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
860 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,1,1,3]
861 ; SSE2-NEXT:    psllq $63, %xmm0
862 ; SSE2-NEXT:    psrad $31, %xmm0
863 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
864 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,1,3,3]
865 ; SSE2-NEXT:    psllq $63, %xmm1
866 ; SSE2-NEXT:    psrad $31, %xmm1
867 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
868 ; SSE2-NEXT:    retq
869 ;
870 ; SSSE3-LABEL: load_sext_4i1_to_4i64:
871 ; SSSE3:       # BB#0: # %entry
872 ; SSSE3-NEXT:    movzbl (%rdi), %eax
873 ; SSSE3-NEXT:    movl %eax, %ecx
874 ; SSSE3-NEXT:    shrl $3, %ecx
875 ; SSSE3-NEXT:    andl $1, %ecx
876 ; SSSE3-NEXT:    movd %ecx, %xmm0
877 ; SSSE3-NEXT:    movl %eax, %ecx
878 ; SSSE3-NEXT:    shrl %ecx
879 ; SSSE3-NEXT:    andl $1, %ecx
880 ; SSSE3-NEXT:    movd %ecx, %xmm1
881 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
882 ; SSSE3-NEXT:    movl %eax, %ecx
883 ; SSSE3-NEXT:    andl $1, %ecx
884 ; SSSE3-NEXT:    movd %ecx, %xmm2
885 ; SSSE3-NEXT:    shrl $2, %eax
886 ; SSSE3-NEXT:    andl $1, %eax
887 ; SSSE3-NEXT:    movd %eax, %xmm0
888 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
889 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
890 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,1,1,3]
891 ; SSSE3-NEXT:    psllq $63, %xmm0
892 ; SSSE3-NEXT:    psrad $31, %xmm0
893 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
894 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,1,3,3]
895 ; SSSE3-NEXT:    psllq $63, %xmm1
896 ; SSSE3-NEXT:    psrad $31, %xmm1
897 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
898 ; SSSE3-NEXT:    retq
899 ;
900 ; SSE41-LABEL: load_sext_4i1_to_4i64:
901 ; SSE41:       # BB#0: # %entry
902 ; SSE41-NEXT:    movzbl (%rdi), %eax
903 ; SSE41-NEXT:    movl %eax, %ecx
904 ; SSE41-NEXT:    shrl %ecx
905 ; SSE41-NEXT:    andl $1, %ecx
906 ; SSE41-NEXT:    movl %eax, %edx
907 ; SSE41-NEXT:    andl $1, %edx
908 ; SSE41-NEXT:    movd %edx, %xmm1
909 ; SSE41-NEXT:    pinsrd $1, %ecx, %xmm1
910 ; SSE41-NEXT:    movl %eax, %ecx
911 ; SSE41-NEXT:    shrl $2, %ecx
912 ; SSE41-NEXT:    andl $1, %ecx
913 ; SSE41-NEXT:    pinsrd $2, %ecx, %xmm1
914 ; SSE41-NEXT:    shrl $3, %eax
915 ; SSE41-NEXT:    andl $1, %eax
916 ; SSE41-NEXT:    pinsrd $3, %eax, %xmm1
917 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero
918 ; SSE41-NEXT:    psllq $63, %xmm0
919 ; SSE41-NEXT:    psrad $31, %xmm0
920 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
921 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
922 ; SSE41-NEXT:    psllq $63, %xmm1
923 ; SSE41-NEXT:    psrad $31, %xmm1
924 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
925 ; SSE41-NEXT:    retq
926 ;
927 ; AVX1-LABEL: load_sext_4i1_to_4i64:
928 ; AVX1:       # BB#0: # %entry
929 ; AVX1-NEXT:    movzbl (%rdi), %eax
930 ; AVX1-NEXT:    movq %rax, %rcx
931 ; AVX1-NEXT:    shlq $62, %rcx
932 ; AVX1-NEXT:    sarq $63, %rcx
933 ; AVX1-NEXT:    movq %rax, %rdx
934 ; AVX1-NEXT:    shlq $63, %rdx
935 ; AVX1-NEXT:    sarq $63, %rdx
936 ; AVX1-NEXT:    vmovd %edx, %xmm0
937 ; AVX1-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
938 ; AVX1-NEXT:    movq %rax, %rcx
939 ; AVX1-NEXT:    shlq $61, %rcx
940 ; AVX1-NEXT:    sarq $63, %rcx
941 ; AVX1-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
942 ; AVX1-NEXT:    shlq $60, %rax
943 ; AVX1-NEXT:    sarq $63, %rax
944 ; AVX1-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
945 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
946 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
947 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
948 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
949 ; AVX1-NEXT:    retq
950 ;
951 ; AVX2-LABEL: load_sext_4i1_to_4i64:
952 ; AVX2:       # BB#0: # %entry
953 ; AVX2-NEXT:    movzbl (%rdi), %eax
954 ; AVX2-NEXT:    movq %rax, %rcx
955 ; AVX2-NEXT:    shlq $60, %rcx
956 ; AVX2-NEXT:    sarq $63, %rcx
957 ; AVX2-NEXT:    vmovq %rcx, %xmm0
958 ; AVX2-NEXT:    movq %rax, %rcx
959 ; AVX2-NEXT:    shlq $61, %rcx
960 ; AVX2-NEXT:    sarq $63, %rcx
961 ; AVX2-NEXT:    vmovq %rcx, %xmm1
962 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
963 ; AVX2-NEXT:    movq %rax, %rcx
964 ; AVX2-NEXT:    shlq $62, %rcx
965 ; AVX2-NEXT:    sarq $63, %rcx
966 ; AVX2-NEXT:    vmovq %rcx, %xmm1
967 ; AVX2-NEXT:    shlq $63, %rax
968 ; AVX2-NEXT:    sarq $63, %rax
969 ; AVX2-NEXT:    vmovq %rax, %xmm2
970 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
971 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
972 ; AVX2-NEXT:    retq
973 ;
974 ; X32-SSE41-LABEL: load_sext_4i1_to_4i64:
975 ; X32-SSE41:       # BB#0: # %entry
976 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
977 ; X32-SSE41-NEXT:    movzbl (%eax), %eax
978 ; X32-SSE41-NEXT:    movl %eax, %ecx
979 ; X32-SSE41-NEXT:    shrl %ecx
980 ; X32-SSE41-NEXT:    andl $1, %ecx
981 ; X32-SSE41-NEXT:    movl %eax, %edx
982 ; X32-SSE41-NEXT:    andl $1, %edx
983 ; X32-SSE41-NEXT:    movd %edx, %xmm1
984 ; X32-SSE41-NEXT:    pinsrd $1, %ecx, %xmm1
985 ; X32-SSE41-NEXT:    movl %eax, %ecx
986 ; X32-SSE41-NEXT:    shrl $2, %ecx
987 ; X32-SSE41-NEXT:    andl $1, %ecx
988 ; X32-SSE41-NEXT:    pinsrd $2, %ecx, %xmm1
989 ; X32-SSE41-NEXT:    shrl $3, %eax
990 ; X32-SSE41-NEXT:    andl $1, %eax
991 ; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm1
992 ; X32-SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero
993 ; X32-SSE41-NEXT:    psllq $63, %xmm0
994 ; X32-SSE41-NEXT:    psrad $31, %xmm0
995 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
996 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
997 ; X32-SSE41-NEXT:    psllq $63, %xmm1
998 ; X32-SSE41-NEXT:    psrad $31, %xmm1
999 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1000 ; X32-SSE41-NEXT:    retl
1001 entry:
1002  %X = load <4 x i1>, <4 x i1>* %ptr
1003  %Y = sext <4 x i1> %X to <4 x i64>
1004  ret <4 x i64> %Y
1005 }
1006
1007 define <4 x i64> @load_sext_4i8_to_4i64(<4 x i8> *%ptr) {
1008 ; SSE2-LABEL: load_sext_4i8_to_4i64:
1009 ; SSE2:       # BB#0: # %entry
1010 ; SSE2-NEXT:    movsbq 1(%rdi), %rax
1011 ; SSE2-NEXT:    movd %rax, %xmm1
1012 ; SSE2-NEXT:    movsbq (%rdi), %rax
1013 ; SSE2-NEXT:    movd %rax, %xmm0
1014 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1015 ; SSE2-NEXT:    movsbq 3(%rdi), %rax
1016 ; SSE2-NEXT:    movd %rax, %xmm2
1017 ; SSE2-NEXT:    movsbq 2(%rdi), %rax
1018 ; SSE2-NEXT:    movd %rax, %xmm1
1019 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1020 ; SSE2-NEXT:    retq
1021 ;
1022 ; SSSE3-LABEL: load_sext_4i8_to_4i64:
1023 ; SSSE3:       # BB#0: # %entry
1024 ; SSSE3-NEXT:    movsbq 1(%rdi), %rax
1025 ; SSSE3-NEXT:    movd %rax, %xmm1
1026 ; SSSE3-NEXT:    movsbq (%rdi), %rax
1027 ; SSSE3-NEXT:    movd %rax, %xmm0
1028 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1029 ; SSSE3-NEXT:    movsbq 3(%rdi), %rax
1030 ; SSSE3-NEXT:    movd %rax, %xmm2
1031 ; SSSE3-NEXT:    movsbq 2(%rdi), %rax
1032 ; SSSE3-NEXT:    movd %rax, %xmm1
1033 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1034 ; SSSE3-NEXT:    retq
1035 ;
1036 ; SSE41-LABEL: load_sext_4i8_to_4i64:
1037 ; SSE41:       # BB#0: # %entry
1038 ; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
1039 ; SSE41-NEXT:    pmovsxbq 2(%rdi), %xmm1
1040 ; SSE41-NEXT:    retq
1041 ;
1042 ; AVX1-LABEL: load_sext_4i8_to_4i64:
1043 ; AVX1:       # BB#0: # %entry
1044 ; AVX1-NEXT:    vpmovsxbd (%rdi), %xmm0
1045 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
1046 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1047 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
1048 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1049 ; AVX1-NEXT:    retq
1050 ;
1051 ; AVX2-LABEL: load_sext_4i8_to_4i64:
1052 ; AVX2:       # BB#0: # %entry
1053 ; AVX2-NEXT:    vpmovsxbq (%rdi), %ymm0
1054 ; AVX2-NEXT:    retq
1055 ;
1056 ; X32-SSE41-LABEL: load_sext_4i8_to_4i64:
1057 ; X32-SSE41:       # BB#0: # %entry
1058 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1059 ; X32-SSE41-NEXT:    pmovsxbq (%eax), %xmm0
1060 ; X32-SSE41-NEXT:    pmovsxbq 2(%eax), %xmm1
1061 ; X32-SSE41-NEXT:    retl
1062 entry:
1063  %X = load <4 x i8>, <4 x i8>* %ptr
1064  %Y = sext <4 x i8> %X to <4 x i64>
1065  ret <4 x i64> %Y
1066 }
1067
1068 define <8 x i16> @load_sext_8i1_to_8i16(<8 x i1> *%ptr) {
1069 ; SSE2-LABEL: load_sext_8i1_to_8i16:
1070 ; SSE2:       # BB#0: # %entry
1071 ; SSE2-NEXT:    movzbl (%rdi), %eax
1072 ; SSE2-NEXT:    movq %rax, %rcx
1073 ; SSE2-NEXT:    shlq $56, %rcx
1074 ; SSE2-NEXT:    sarq $63, %rcx
1075 ; SSE2-NEXT:    movd %ecx, %xmm0
1076 ; SSE2-NEXT:    movq %rax, %rcx
1077 ; SSE2-NEXT:    shlq $60, %rcx
1078 ; SSE2-NEXT:    sarq $63, %rcx
1079 ; SSE2-NEXT:    movd %ecx, %xmm2
1080 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1081 ; SSE2-NEXT:    movq %rax, %rcx
1082 ; SSE2-NEXT:    shlq $58, %rcx
1083 ; SSE2-NEXT:    sarq $63, %rcx
1084 ; SSE2-NEXT:    movd %ecx, %xmm0
1085 ; SSE2-NEXT:    movq %rax, %rcx
1086 ; SSE2-NEXT:    shlq $62, %rcx
1087 ; SSE2-NEXT:    sarq $63, %rcx
1088 ; SSE2-NEXT:    movd %ecx, %xmm1
1089 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1090 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1091 ; SSE2-NEXT:    movq %rax, %rcx
1092 ; SSE2-NEXT:    shlq $57, %rcx
1093 ; SSE2-NEXT:    sarq $63, %rcx
1094 ; SSE2-NEXT:    movd %ecx, %xmm0
1095 ; SSE2-NEXT:    movq %rax, %rcx
1096 ; SSE2-NEXT:    shlq $61, %rcx
1097 ; SSE2-NEXT:    sarq $63, %rcx
1098 ; SSE2-NEXT:    movd %ecx, %xmm2
1099 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1100 ; SSE2-NEXT:    movq %rax, %rcx
1101 ; SSE2-NEXT:    shlq $59, %rcx
1102 ; SSE2-NEXT:    sarq $63, %rcx
1103 ; SSE2-NEXT:    movd %ecx, %xmm3
1104 ; SSE2-NEXT:    shlq $63, %rax
1105 ; SSE2-NEXT:    sarq $63, %rax
1106 ; SSE2-NEXT:    movd %eax, %xmm0
1107 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
1108 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1109 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1110 ; SSE2-NEXT:    retq
1111 ;
1112 ; SSSE3-LABEL: load_sext_8i1_to_8i16:
1113 ; SSSE3:       # BB#0: # %entry
1114 ; SSSE3-NEXT:    movzbl (%rdi), %eax
1115 ; SSSE3-NEXT:    movq %rax, %rcx
1116 ; SSSE3-NEXT:    shlq $56, %rcx
1117 ; SSSE3-NEXT:    sarq $63, %rcx
1118 ; SSSE3-NEXT:    movd %ecx, %xmm0
1119 ; SSSE3-NEXT:    movq %rax, %rcx
1120 ; SSSE3-NEXT:    shlq $60, %rcx
1121 ; SSSE3-NEXT:    sarq $63, %rcx
1122 ; SSSE3-NEXT:    movd %ecx, %xmm2
1123 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1124 ; SSSE3-NEXT:    movq %rax, %rcx
1125 ; SSSE3-NEXT:    shlq $58, %rcx
1126 ; SSSE3-NEXT:    sarq $63, %rcx
1127 ; SSSE3-NEXT:    movd %ecx, %xmm0
1128 ; SSSE3-NEXT:    movq %rax, %rcx
1129 ; SSSE3-NEXT:    shlq $62, %rcx
1130 ; SSSE3-NEXT:    sarq $63, %rcx
1131 ; SSSE3-NEXT:    movd %ecx, %xmm1
1132 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1133 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1134 ; SSSE3-NEXT:    movq %rax, %rcx
1135 ; SSSE3-NEXT:    shlq $57, %rcx
1136 ; SSSE3-NEXT:    sarq $63, %rcx
1137 ; SSSE3-NEXT:    movd %ecx, %xmm0
1138 ; SSSE3-NEXT:    movq %rax, %rcx
1139 ; SSSE3-NEXT:    shlq $61, %rcx
1140 ; SSSE3-NEXT:    sarq $63, %rcx
1141 ; SSSE3-NEXT:    movd %ecx, %xmm2
1142 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1143 ; SSSE3-NEXT:    movq %rax, %rcx
1144 ; SSSE3-NEXT:    shlq $59, %rcx
1145 ; SSSE3-NEXT:    sarq $63, %rcx
1146 ; SSSE3-NEXT:    movd %ecx, %xmm3
1147 ; SSSE3-NEXT:    shlq $63, %rax
1148 ; SSSE3-NEXT:    sarq $63, %rax
1149 ; SSSE3-NEXT:    movd %eax, %xmm0
1150 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
1151 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1152 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1153 ; SSSE3-NEXT:    retq
1154 ;
1155 ; SSE41-LABEL: load_sext_8i1_to_8i16:
1156 ; SSE41:       # BB#0: # %entry
1157 ; SSE41-NEXT:    movzbl (%rdi), %eax
1158 ; SSE41-NEXT:    movq %rax, %rcx
1159 ; SSE41-NEXT:    shlq $62, %rcx
1160 ; SSE41-NEXT:    sarq $63, %rcx
1161 ; SSE41-NEXT:    movq %rax, %rdx
1162 ; SSE41-NEXT:    shlq $63, %rdx
1163 ; SSE41-NEXT:    sarq $63, %rdx
1164 ; SSE41-NEXT:    movd %edx, %xmm0
1165 ; SSE41-NEXT:    pinsrw $1, %ecx, %xmm0
1166 ; SSE41-NEXT:    movq %rax, %rcx
1167 ; SSE41-NEXT:    shlq $61, %rcx
1168 ; SSE41-NEXT:    sarq $63, %rcx
1169 ; SSE41-NEXT:    pinsrw $2, %ecx, %xmm0
1170 ; SSE41-NEXT:    movq %rax, %rcx
1171 ; SSE41-NEXT:    shlq $60, %rcx
1172 ; SSE41-NEXT:    sarq $63, %rcx
1173 ; SSE41-NEXT:    pinsrw $3, %ecx, %xmm0
1174 ; SSE41-NEXT:    movq %rax, %rcx
1175 ; SSE41-NEXT:    shlq $59, %rcx
1176 ; SSE41-NEXT:    sarq $63, %rcx
1177 ; SSE41-NEXT:    pinsrw $4, %ecx, %xmm0
1178 ; SSE41-NEXT:    movq %rax, %rcx
1179 ; SSE41-NEXT:    shlq $58, %rcx
1180 ; SSE41-NEXT:    sarq $63, %rcx
1181 ; SSE41-NEXT:    pinsrw $5, %ecx, %xmm0
1182 ; SSE41-NEXT:    movq %rax, %rcx
1183 ; SSE41-NEXT:    shlq $57, %rcx
1184 ; SSE41-NEXT:    sarq $63, %rcx
1185 ; SSE41-NEXT:    pinsrw $6, %ecx, %xmm0
1186 ; SSE41-NEXT:    shlq $56, %rax
1187 ; SSE41-NEXT:    sarq $63, %rax
1188 ; SSE41-NEXT:    pinsrw $7, %eax, %xmm0
1189 ; SSE41-NEXT:    retq
1190 ;
1191 ; AVX-LABEL: load_sext_8i1_to_8i16:
1192 ; AVX:       # BB#0: # %entry
1193 ; AVX-NEXT:    movzbl (%rdi), %eax
1194 ; AVX-NEXT:    movq %rax, %rcx
1195 ; AVX-NEXT:    shlq $62, %rcx
1196 ; AVX-NEXT:    sarq $63, %rcx
1197 ; AVX-NEXT:    movq %rax, %rdx
1198 ; AVX-NEXT:    shlq $63, %rdx
1199 ; AVX-NEXT:    sarq $63, %rdx
1200 ; AVX-NEXT:    vmovd %edx, %xmm0
1201 ; AVX-NEXT:    vpinsrw $1, %ecx, %xmm0, %xmm0
1202 ; AVX-NEXT:    movq %rax, %rcx
1203 ; AVX-NEXT:    shlq $61, %rcx
1204 ; AVX-NEXT:    sarq $63, %rcx
1205 ; AVX-NEXT:    vpinsrw $2, %ecx, %xmm0, %xmm0
1206 ; AVX-NEXT:    movq %rax, %rcx
1207 ; AVX-NEXT:    shlq $60, %rcx
1208 ; AVX-NEXT:    sarq $63, %rcx
1209 ; AVX-NEXT:    vpinsrw $3, %ecx, %xmm0, %xmm0
1210 ; AVX-NEXT:    movq %rax, %rcx
1211 ; AVX-NEXT:    shlq $59, %rcx
1212 ; AVX-NEXT:    sarq $63, %rcx
1213 ; AVX-NEXT:    vpinsrw $4, %ecx, %xmm0, %xmm0
1214 ; AVX-NEXT:    movq %rax, %rcx
1215 ; AVX-NEXT:    shlq $58, %rcx
1216 ; AVX-NEXT:    sarq $63, %rcx
1217 ; AVX-NEXT:    vpinsrw $5, %ecx, %xmm0, %xmm0
1218 ; AVX-NEXT:    movq %rax, %rcx
1219 ; AVX-NEXT:    shlq $57, %rcx
1220 ; AVX-NEXT:    sarq $63, %rcx
1221 ; AVX-NEXT:    vpinsrw $6, %ecx, %xmm0, %xmm0
1222 ; AVX-NEXT:    shlq $56, %rax
1223 ; AVX-NEXT:    sarq $63, %rax
1224 ; AVX-NEXT:    vpinsrw $7, %eax, %xmm0, %xmm0
1225 ; AVX-NEXT:    retq
1226 ;
1227 ; X32-SSE41-LABEL: load_sext_8i1_to_8i16:
1228 ; X32-SSE41:       # BB#0: # %entry
1229 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1230 ; X32-SSE41-NEXT:    movl (%eax), %eax
1231 ; X32-SSE41-NEXT:    movl %eax, %ecx
1232 ; X32-SSE41-NEXT:    shll $30, %ecx
1233 ; X32-SSE41-NEXT:    sarl $31, %ecx
1234 ; X32-SSE41-NEXT:    movl %eax, %edx
1235 ; X32-SSE41-NEXT:    shll $31, %edx
1236 ; X32-SSE41-NEXT:    sarl $31, %edx
1237 ; X32-SSE41-NEXT:    movd %edx, %xmm0
1238 ; X32-SSE41-NEXT:    pinsrw $1, %ecx, %xmm0
1239 ; X32-SSE41-NEXT:    movl %eax, %ecx
1240 ; X32-SSE41-NEXT:    shll $29, %ecx
1241 ; X32-SSE41-NEXT:    sarl $31, %ecx
1242 ; X32-SSE41-NEXT:    pinsrw $2, %ecx, %xmm0
1243 ; X32-SSE41-NEXT:    movl %eax, %ecx
1244 ; X32-SSE41-NEXT:    shll $28, %ecx
1245 ; X32-SSE41-NEXT:    sarl $31, %ecx
1246 ; X32-SSE41-NEXT:    pinsrw $3, %ecx, %xmm0
1247 ; X32-SSE41-NEXT:    movl %eax, %ecx
1248 ; X32-SSE41-NEXT:    shll $27, %ecx
1249 ; X32-SSE41-NEXT:    sarl $31, %ecx
1250 ; X32-SSE41-NEXT:    pinsrw $4, %ecx, %xmm0
1251 ; X32-SSE41-NEXT:    movl %eax, %ecx
1252 ; X32-SSE41-NEXT:    shll $26, %ecx
1253 ; X32-SSE41-NEXT:    sarl $31, %ecx
1254 ; X32-SSE41-NEXT:    pinsrw $5, %ecx, %xmm0
1255 ; X32-SSE41-NEXT:    movl %eax, %ecx
1256 ; X32-SSE41-NEXT:    shll $25, %ecx
1257 ; X32-SSE41-NEXT:    sarl $31, %ecx
1258 ; X32-SSE41-NEXT:    pinsrw $6, %ecx, %xmm0
1259 ; X32-SSE41-NEXT:    shll $24, %eax
1260 ; X32-SSE41-NEXT:    sarl $31, %eax
1261 ; X32-SSE41-NEXT:    pinsrw $7, %eax, %xmm0
1262 ; X32-SSE41-NEXT:    retl
1263 entry:
1264  %X = load <8 x i1>, <8 x i1>* %ptr
1265  %Y = sext <8 x i1> %X to <8 x i16>
1266  ret <8 x i16> %Y
1267 }
1268
1269 define <8 x i16> @load_sext_8i8_to_8i16(<8 x i8> *%ptr) {
1270 ; SSE2-LABEL: load_sext_8i8_to_8i16:
1271 ; SSE2:       # BB#0: # %entry
1272 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
1273 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1274 ; SSE2-NEXT:    psraw $8, %xmm0
1275 ; SSE2-NEXT:    retq
1276 ;
1277 ; SSSE3-LABEL: load_sext_8i8_to_8i16:
1278 ; SSSE3:       # BB#0: # %entry
1279 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
1280 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1281 ; SSSE3-NEXT:    psraw $8, %xmm0
1282 ; SSSE3-NEXT:    retq
1283 ;
1284 ; SSE41-LABEL: load_sext_8i8_to_8i16:
1285 ; SSE41:       # BB#0: # %entry
1286 ; SSE41-NEXT:    pmovsxbw (%rdi), %xmm0
1287 ; SSE41-NEXT:    retq
1288 ;
1289 ; AVX-LABEL: load_sext_8i8_to_8i16:
1290 ; AVX:       # BB#0: # %entry
1291 ; AVX-NEXT:    vpmovsxbw (%rdi), %xmm0
1292 ; AVX-NEXT:    retq
1293 ;
1294 ; X32-SSE41-LABEL: load_sext_8i8_to_8i16:
1295 ; X32-SSE41:       # BB#0: # %entry
1296 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1297 ; X32-SSE41-NEXT:    pmovsxbw (%eax), %xmm0
1298 ; X32-SSE41-NEXT:    retl
1299 entry:
1300  %X = load <8 x i8>, <8 x i8>* %ptr
1301  %Y = sext <8 x i8> %X to <8 x i16>
1302  ret <8 x i16> %Y
1303 }
1304
1305 define <8 x i32> @load_sext_8i1_to_8i32(<8 x i1> *%ptr) {
1306 ; SSE2-LABEL: load_sext_8i1_to_8i32:
1307 ; SSE2:       # BB#0: # %entry
1308 ; SSE2-NEXT:    movzbl (%rdi), %eax
1309 ; SSE2-NEXT:    movl %eax, %ecx
1310 ; SSE2-NEXT:    shrl $6, %ecx
1311 ; SSE2-NEXT:    andl $1, %ecx
1312 ; SSE2-NEXT:    movd %ecx, %xmm0
1313 ; SSE2-NEXT:    movl %eax, %ecx
1314 ; SSE2-NEXT:    shrl $2, %ecx
1315 ; SSE2-NEXT:    andl $1, %ecx
1316 ; SSE2-NEXT:    movd %ecx, %xmm2
1317 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1318 ; SSE2-NEXT:    movl %eax, %ecx
1319 ; SSE2-NEXT:    andl $1, %ecx
1320 ; SSE2-NEXT:    movd %ecx, %xmm1
1321 ; SSE2-NEXT:    movl %eax, %ecx
1322 ; SSE2-NEXT:    shrl $4, %ecx
1323 ; SSE2-NEXT:    andl $1, %ecx
1324 ; SSE2-NEXT:    movd %ecx, %xmm0
1325 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1326 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1327 ; SSE2-NEXT:    movl %eax, %ecx
1328 ; SSE2-NEXT:    shrl $5, %ecx
1329 ; SSE2-NEXT:    andl $1, %ecx
1330 ; SSE2-NEXT:    movd %ecx, %xmm0
1331 ; SSE2-NEXT:    movl %eax, %ecx
1332 ; SSE2-NEXT:    shrl %ecx
1333 ; SSE2-NEXT:    andl $1, %ecx
1334 ; SSE2-NEXT:    movd %ecx, %xmm2
1335 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1336 ; SSE2-NEXT:    movl %eax, %ecx
1337 ; SSE2-NEXT:    shrl $3, %ecx
1338 ; SSE2-NEXT:    andl $1, %ecx
1339 ; SSE2-NEXT:    movd %ecx, %xmm0
1340 ; SSE2-NEXT:    shrl $7, %eax
1341 ; SSE2-NEXT:    movzwl %ax, %eax
1342 ; SSE2-NEXT:    movd %eax, %xmm3
1343 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
1344 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1345 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1346 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1347 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1348 ; SSE2-NEXT:    pslld $31, %xmm0
1349 ; SSE2-NEXT:    psrad $31, %xmm0
1350 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1351 ; SSE2-NEXT:    pslld $31, %xmm1
1352 ; SSE2-NEXT:    psrad $31, %xmm1
1353 ; SSE2-NEXT:    retq
1354 ;
1355 ; SSSE3-LABEL: load_sext_8i1_to_8i32:
1356 ; SSSE3:       # BB#0: # %entry
1357 ; SSSE3-NEXT:    movzbl (%rdi), %eax
1358 ; SSSE3-NEXT:    movl %eax, %ecx
1359 ; SSSE3-NEXT:    shrl $6, %ecx
1360 ; SSSE3-NEXT:    andl $1, %ecx
1361 ; SSSE3-NEXT:    movd %ecx, %xmm0
1362 ; SSSE3-NEXT:    movl %eax, %ecx
1363 ; SSSE3-NEXT:    shrl $2, %ecx
1364 ; SSSE3-NEXT:    andl $1, %ecx
1365 ; SSSE3-NEXT:    movd %ecx, %xmm2
1366 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1367 ; SSSE3-NEXT:    movl %eax, %ecx
1368 ; SSSE3-NEXT:    andl $1, %ecx
1369 ; SSSE3-NEXT:    movd %ecx, %xmm1
1370 ; SSSE3-NEXT:    movl %eax, %ecx
1371 ; SSSE3-NEXT:    shrl $4, %ecx
1372 ; SSSE3-NEXT:    andl $1, %ecx
1373 ; SSSE3-NEXT:    movd %ecx, %xmm0
1374 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1375 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1376 ; SSSE3-NEXT:    movl %eax, %ecx
1377 ; SSSE3-NEXT:    shrl $5, %ecx
1378 ; SSSE3-NEXT:    andl $1, %ecx
1379 ; SSSE3-NEXT:    movd %ecx, %xmm0
1380 ; SSSE3-NEXT:    movl %eax, %ecx
1381 ; SSSE3-NEXT:    shrl %ecx
1382 ; SSSE3-NEXT:    andl $1, %ecx
1383 ; SSSE3-NEXT:    movd %ecx, %xmm2
1384 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1385 ; SSSE3-NEXT:    movl %eax, %ecx
1386 ; SSSE3-NEXT:    shrl $3, %ecx
1387 ; SSSE3-NEXT:    andl $1, %ecx
1388 ; SSSE3-NEXT:    movd %ecx, %xmm0
1389 ; SSSE3-NEXT:    shrl $7, %eax
1390 ; SSSE3-NEXT:    movzwl %ax, %eax
1391 ; SSSE3-NEXT:    movd %eax, %xmm3
1392 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
1393 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1394 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1395 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1396 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1397 ; SSSE3-NEXT:    pslld $31, %xmm0
1398 ; SSSE3-NEXT:    psrad $31, %xmm0
1399 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1400 ; SSSE3-NEXT:    pslld $31, %xmm1
1401 ; SSSE3-NEXT:    psrad $31, %xmm1
1402 ; SSSE3-NEXT:    retq
1403 ;
1404 ; SSE41-LABEL: load_sext_8i1_to_8i32:
1405 ; SSE41:       # BB#0: # %entry
1406 ; SSE41-NEXT:    movzbl (%rdi), %eax
1407 ; SSE41-NEXT:    movl %eax, %ecx
1408 ; SSE41-NEXT:    shrl %ecx
1409 ; SSE41-NEXT:    andl $1, %ecx
1410 ; SSE41-NEXT:    movl %eax, %edx
1411 ; SSE41-NEXT:    andl $1, %edx
1412 ; SSE41-NEXT:    movd %edx, %xmm1
1413 ; SSE41-NEXT:    pinsrw $1, %ecx, %xmm1
1414 ; SSE41-NEXT:    movl %eax, %ecx
1415 ; SSE41-NEXT:    shrl $2, %ecx
1416 ; SSE41-NEXT:    andl $1, %ecx
1417 ; SSE41-NEXT:    pinsrw $2, %ecx, %xmm1
1418 ; SSE41-NEXT:    movl %eax, %ecx
1419 ; SSE41-NEXT:    shrl $3, %ecx
1420 ; SSE41-NEXT:    andl $1, %ecx
1421 ; SSE41-NEXT:    pinsrw $3, %ecx, %xmm1
1422 ; SSE41-NEXT:    movl %eax, %ecx
1423 ; SSE41-NEXT:    shrl $4, %ecx
1424 ; SSE41-NEXT:    andl $1, %ecx
1425 ; SSE41-NEXT:    pinsrw $4, %ecx, %xmm1
1426 ; SSE41-NEXT:    movl %eax, %ecx
1427 ; SSE41-NEXT:    shrl $5, %ecx
1428 ; SSE41-NEXT:    andl $1, %ecx
1429 ; SSE41-NEXT:    pinsrw $5, %ecx, %xmm1
1430 ; SSE41-NEXT:    movl %eax, %ecx
1431 ; SSE41-NEXT:    shrl $6, %ecx
1432 ; SSE41-NEXT:    andl $1, %ecx
1433 ; SSE41-NEXT:    pinsrw $6, %ecx, %xmm1
1434 ; SSE41-NEXT:    shrl $7, %eax
1435 ; SSE41-NEXT:    movzwl %ax, %eax
1436 ; SSE41-NEXT:    pinsrw $7, %eax, %xmm1
1437 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
1438 ; SSE41-NEXT:    pslld $31, %xmm0
1439 ; SSE41-NEXT:    psrad $31, %xmm0
1440 ; SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1441 ; SSE41-NEXT:    pslld $31, %xmm1
1442 ; SSE41-NEXT:    psrad $31, %xmm1
1443 ; SSE41-NEXT:    retq
1444 ;
1445 ; AVX1-LABEL: load_sext_8i1_to_8i32:
1446 ; AVX1:       # BB#0: # %entry
1447 ; AVX1-NEXT:    movzbl (%rdi), %eax
1448 ; AVX1-NEXT:    movq %rax, %rcx
1449 ; AVX1-NEXT:    shlq $58, %rcx
1450 ; AVX1-NEXT:    sarq $63, %rcx
1451 ; AVX1-NEXT:    movq %rax, %rdx
1452 ; AVX1-NEXT:    shlq $59, %rdx
1453 ; AVX1-NEXT:    sarq $63, %rdx
1454 ; AVX1-NEXT:    vmovd %edx, %xmm0
1455 ; AVX1-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
1456 ; AVX1-NEXT:    movq %rax, %rcx
1457 ; AVX1-NEXT:    shlq $57, %rcx
1458 ; AVX1-NEXT:    sarq $63, %rcx
1459 ; AVX1-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
1460 ; AVX1-NEXT:    movq %rax, %rcx
1461 ; AVX1-NEXT:    shlq $56, %rcx
1462 ; AVX1-NEXT:    sarq $63, %rcx
1463 ; AVX1-NEXT:    vpinsrd $3, %ecx, %xmm0, %xmm0
1464 ; AVX1-NEXT:    movq %rax, %rcx
1465 ; AVX1-NEXT:    shlq $62, %rcx
1466 ; AVX1-NEXT:    sarq $63, %rcx
1467 ; AVX1-NEXT:    movq %rax, %rdx
1468 ; AVX1-NEXT:    shlq $63, %rdx
1469 ; AVX1-NEXT:    sarq $63, %rdx
1470 ; AVX1-NEXT:    vmovd %edx, %xmm1
1471 ; AVX1-NEXT:    vpinsrd $1, %ecx, %xmm1, %xmm1
1472 ; AVX1-NEXT:    movq %rax, %rcx
1473 ; AVX1-NEXT:    shlq $61, %rcx
1474 ; AVX1-NEXT:    sarq $63, %rcx
1475 ; AVX1-NEXT:    vpinsrd $2, %ecx, %xmm1, %xmm1
1476 ; AVX1-NEXT:    shlq $60, %rax
1477 ; AVX1-NEXT:    sarq $63, %rax
1478 ; AVX1-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm1
1479 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1480 ; AVX1-NEXT:    retq
1481 ;
1482 ; AVX2-LABEL: load_sext_8i1_to_8i32:
1483 ; AVX2:       # BB#0: # %entry
1484 ; AVX2-NEXT:    movzbl (%rdi), %eax
1485 ; AVX2-NEXT:    movq %rax, %rcx
1486 ; AVX2-NEXT:    shlq $58, %rcx
1487 ; AVX2-NEXT:    sarq $63, %rcx
1488 ; AVX2-NEXT:    movq %rax, %rdx
1489 ; AVX2-NEXT:    shlq $59, %rdx
1490 ; AVX2-NEXT:    sarq $63, %rdx
1491 ; AVX2-NEXT:    vmovd %edx, %xmm0
1492 ; AVX2-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
1493 ; AVX2-NEXT:    movq %rax, %rcx
1494 ; AVX2-NEXT:    shlq $57, %rcx
1495 ; AVX2-NEXT:    sarq $63, %rcx
1496 ; AVX2-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
1497 ; AVX2-NEXT:    movq %rax, %rcx
1498 ; AVX2-NEXT:    shlq $56, %rcx
1499 ; AVX2-NEXT:    sarq $63, %rcx
1500 ; AVX2-NEXT:    vpinsrd $3, %ecx, %xmm0, %xmm0
1501 ; AVX2-NEXT:    movq %rax, %rcx
1502 ; AVX2-NEXT:    shlq $62, %rcx
1503 ; AVX2-NEXT:    sarq $63, %rcx
1504 ; AVX2-NEXT:    movq %rax, %rdx
1505 ; AVX2-NEXT:    shlq $63, %rdx
1506 ; AVX2-NEXT:    sarq $63, %rdx
1507 ; AVX2-NEXT:    vmovd %edx, %xmm1
1508 ; AVX2-NEXT:    vpinsrd $1, %ecx, %xmm1, %xmm1
1509 ; AVX2-NEXT:    movq %rax, %rcx
1510 ; AVX2-NEXT:    shlq $61, %rcx
1511 ; AVX2-NEXT:    sarq $63, %rcx
1512 ; AVX2-NEXT:    vpinsrd $2, %ecx, %xmm1, %xmm1
1513 ; AVX2-NEXT:    shlq $60, %rax
1514 ; AVX2-NEXT:    sarq $63, %rax
1515 ; AVX2-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm1
1516 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1517 ; AVX2-NEXT:    retq
1518 ;
1519 ; X32-SSE41-LABEL: load_sext_8i1_to_8i32:
1520 ; X32-SSE41:       # BB#0: # %entry
1521 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1522 ; X32-SSE41-NEXT:    movzbl (%eax), %eax
1523 ; X32-SSE41-NEXT:    movl %eax, %ecx
1524 ; X32-SSE41-NEXT:    shrl %ecx
1525 ; X32-SSE41-NEXT:    andl $1, %ecx
1526 ; X32-SSE41-NEXT:    movl %eax, %edx
1527 ; X32-SSE41-NEXT:    andl $1, %edx
1528 ; X32-SSE41-NEXT:    movd %edx, %xmm1
1529 ; X32-SSE41-NEXT:    pinsrw $1, %ecx, %xmm1
1530 ; X32-SSE41-NEXT:    movl %eax, %ecx
1531 ; X32-SSE41-NEXT:    shrl $2, %ecx
1532 ; X32-SSE41-NEXT:    andl $1, %ecx
1533 ; X32-SSE41-NEXT:    pinsrw $2, %ecx, %xmm1
1534 ; X32-SSE41-NEXT:    movl %eax, %ecx
1535 ; X32-SSE41-NEXT:    shrl $3, %ecx
1536 ; X32-SSE41-NEXT:    andl $1, %ecx
1537 ; X32-SSE41-NEXT:    pinsrw $3, %ecx, %xmm1
1538 ; X32-SSE41-NEXT:    movl %eax, %ecx
1539 ; X32-SSE41-NEXT:    shrl $4, %ecx
1540 ; X32-SSE41-NEXT:    andl $1, %ecx
1541 ; X32-SSE41-NEXT:    pinsrw $4, %ecx, %xmm1
1542 ; X32-SSE41-NEXT:    movl %eax, %ecx
1543 ; X32-SSE41-NEXT:    shrl $5, %ecx
1544 ; X32-SSE41-NEXT:    andl $1, %ecx
1545 ; X32-SSE41-NEXT:    pinsrw $5, %ecx, %xmm1
1546 ; X32-SSE41-NEXT:    movl %eax, %ecx
1547 ; X32-SSE41-NEXT:    shrl $6, %ecx
1548 ; X32-SSE41-NEXT:    andl $1, %ecx
1549 ; X32-SSE41-NEXT:    pinsrw $6, %ecx, %xmm1
1550 ; X32-SSE41-NEXT:    shrl $7, %eax
1551 ; X32-SSE41-NEXT:    pinsrw $7, %eax, %xmm1
1552 ; X32-SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
1553 ; X32-SSE41-NEXT:    pslld $31, %xmm0
1554 ; X32-SSE41-NEXT:    psrad $31, %xmm0
1555 ; X32-SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1556 ; X32-SSE41-NEXT:    pslld $31, %xmm1
1557 ; X32-SSE41-NEXT:    psrad $31, %xmm1
1558 ; X32-SSE41-NEXT:    retl
1559 entry:
1560  %X = load <8 x i1>, <8 x i1>* %ptr
1561  %Y = sext <8 x i1> %X to <8 x i32>
1562  ret <8 x i32> %Y
1563 }
1564
1565 define <8 x i32> @load_sext_8i8_to_8i32(<8 x i8> *%ptr) {
1566 ; SSE2-LABEL: load_sext_8i8_to_8i32:
1567 ; SSE2:       # BB#0: # %entry
1568 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1569 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1570 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1571 ; SSE2-NEXT:    psrad $24, %xmm0
1572 ; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
1573 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1574 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
1575 ; SSE2-NEXT:    psrad $24, %xmm1
1576 ; SSE2-NEXT:    retq
1577 ;
1578 ; SSSE3-LABEL: load_sext_8i8_to_8i32:
1579 ; SSSE3:       # BB#0: # %entry
1580 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1581 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1582 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1583 ; SSSE3-NEXT:    psrad $24, %xmm0
1584 ; SSSE3-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
1585 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1586 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
1587 ; SSSE3-NEXT:    psrad $24, %xmm1
1588 ; SSSE3-NEXT:    retq
1589 ;
1590 ; SSE41-LABEL: load_sext_8i8_to_8i32:
1591 ; SSE41:       # BB#0: # %entry
1592 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
1593 ; SSE41-NEXT:    pmovsxbd 4(%rdi), %xmm1
1594 ; SSE41-NEXT:    retq
1595 ;
1596 ; AVX1-LABEL: load_sext_8i8_to_8i32:
1597 ; AVX1:       # BB#0: # %entry
1598 ; AVX1-NEXT:    vpmovsxbw (%rdi), %xmm0
1599 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
1600 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1601 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
1602 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1603 ; AVX1-NEXT:    retq
1604 ;
1605 ; AVX2-LABEL: load_sext_8i8_to_8i32:
1606 ; AVX2:       # BB#0: # %entry
1607 ; AVX2-NEXT:    vpmovsxbd (%rdi), %ymm0
1608 ; AVX2-NEXT:    retq
1609 ;
1610 ; X32-SSE41-LABEL: load_sext_8i8_to_8i32:
1611 ; X32-SSE41:       # BB#0: # %entry
1612 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1613 ; X32-SSE41-NEXT:    pmovsxbd (%eax), %xmm0
1614 ; X32-SSE41-NEXT:    pmovsxbd 4(%eax), %xmm1
1615 ; X32-SSE41-NEXT:    retl
1616 entry:
1617  %X = load <8 x i8>, <8 x i8>* %ptr
1618  %Y = sext <8 x i8> %X to <8 x i32>
1619  ret <8 x i32> %Y
1620 }
1621
1622 define <16 x i16> @load_sext_16i1_to_16i16(<16 x i1> *%ptr) {
1623 ; SSE2-LABEL: load_sext_16i1_to_16i16:
1624 ; SSE2:       # BB#0: # %entry
1625 ; SSE2-NEXT:    movzwl (%rdi), %eax
1626 ; SSE2-NEXT:    movl %eax, %ecx
1627 ; SSE2-NEXT:    shrl $14, %ecx
1628 ; SSE2-NEXT:    andl $1, %ecx
1629 ; SSE2-NEXT:    movd %ecx, %xmm0
1630 ; SSE2-NEXT:    movl %eax, %ecx
1631 ; SSE2-NEXT:    shrl $6, %ecx
1632 ; SSE2-NEXT:    andl $1, %ecx
1633 ; SSE2-NEXT:    movd %ecx, %xmm1
1634 ; 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]
1635 ; SSE2-NEXT:    movl %eax, %ecx
1636 ; SSE2-NEXT:    shrl $10, %ecx
1637 ; SSE2-NEXT:    andl $1, %ecx
1638 ; SSE2-NEXT:    movd %ecx, %xmm0
1639 ; SSE2-NEXT:    movl %eax, %ecx
1640 ; SSE2-NEXT:    shrl $2, %ecx
1641 ; SSE2-NEXT:    andl $1, %ecx
1642 ; SSE2-NEXT:    movd %ecx, %xmm2
1643 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
1644 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
1645 ; SSE2-NEXT:    movl %eax, %ecx
1646 ; SSE2-NEXT:    shrl $12, %ecx
1647 ; SSE2-NEXT:    andl $1, %ecx
1648 ; SSE2-NEXT:    movd %ecx, %xmm0
1649 ; SSE2-NEXT:    movl %eax, %ecx
1650 ; SSE2-NEXT:    shrl $4, %ecx
1651 ; SSE2-NEXT:    andl $1, %ecx
1652 ; SSE2-NEXT:    movd %ecx, %xmm3
1653 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1654 ; SSE2-NEXT:    movl %eax, %ecx
1655 ; SSE2-NEXT:    andl $1, %ecx
1656 ; SSE2-NEXT:    movd %ecx, %xmm1
1657 ; SSE2-NEXT:    movl %eax, %ecx
1658 ; SSE2-NEXT:    shrl $8, %ecx
1659 ; SSE2-NEXT:    andl $1, %ecx
1660 ; SSE2-NEXT:    movd %ecx, %xmm0
1661 ; 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]
1662 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
1663 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1664 ; SSE2-NEXT:    movl %eax, %ecx
1665 ; SSE2-NEXT:    shrl $13, %ecx
1666 ; SSE2-NEXT:    andl $1, %ecx
1667 ; SSE2-NEXT:    movd %ecx, %xmm0
1668 ; SSE2-NEXT:    movl %eax, %ecx
1669 ; SSE2-NEXT:    shrl $5, %ecx
1670 ; SSE2-NEXT:    andl $1, %ecx
1671 ; SSE2-NEXT:    movd %ecx, %xmm2
1672 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
1673 ; SSE2-NEXT:    movl %eax, %ecx
1674 ; SSE2-NEXT:    shrl $9, %ecx
1675 ; SSE2-NEXT:    andl $1, %ecx
1676 ; SSE2-NEXT:    movd %ecx, %xmm3
1677 ; SSE2-NEXT:    movl %eax, %ecx
1678 ; SSE2-NEXT:    shrl %ecx
1679 ; SSE2-NEXT:    andl $1, %ecx
1680 ; SSE2-NEXT:    movd %ecx, %xmm0
1681 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
1682 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
1683 ; SSE2-NEXT:    movl %eax, %ecx
1684 ; SSE2-NEXT:    shrl $11, %ecx
1685 ; SSE2-NEXT:    andl $1, %ecx
1686 ; SSE2-NEXT:    movd %ecx, %xmm2
1687 ; SSE2-NEXT:    movl %eax, %ecx
1688 ; SSE2-NEXT:    shrl $3, %ecx
1689 ; SSE2-NEXT:    andl $1, %ecx
1690 ; SSE2-NEXT:    movd %ecx, %xmm3
1691 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
1692 ; SSE2-NEXT:    movl %eax, %ecx
1693 ; SSE2-NEXT:    shrl $7, %ecx
1694 ; SSE2-NEXT:    andl $1, %ecx
1695 ; SSE2-NEXT:    movd %ecx, %xmm2
1696 ; SSE2-NEXT:    shrl $15, %eax
1697 ; SSE2-NEXT:    movzwl %ax, %eax
1698 ; SSE2-NEXT:    movd %eax, %xmm4
1699 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3],xmm2[4],xmm4[4],xmm2[5],xmm4[5],xmm2[6],xmm4[6],xmm2[7],xmm4[7]
1700 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
1701 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
1702 ; 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]
1703 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1704 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1705 ; SSE2-NEXT:    psllw $15, %xmm0
1706 ; SSE2-NEXT:    psraw $15, %xmm0
1707 ; 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]
1708 ; SSE2-NEXT:    psllw $15, %xmm1
1709 ; SSE2-NEXT:    psraw $15, %xmm1
1710 ; SSE2-NEXT:    retq
1711 ;
1712 ; SSSE3-LABEL: load_sext_16i1_to_16i16:
1713 ; SSSE3:       # BB#0: # %entry
1714 ; SSSE3-NEXT:    movzwl (%rdi), %eax
1715 ; SSSE3-NEXT:    movl %eax, %ecx
1716 ; SSSE3-NEXT:    shrl $14, %ecx
1717 ; SSSE3-NEXT:    andl $1, %ecx
1718 ; SSSE3-NEXT:    movd %ecx, %xmm0
1719 ; SSSE3-NEXT:    movl %eax, %ecx
1720 ; SSSE3-NEXT:    shrl $6, %ecx
1721 ; SSSE3-NEXT:    andl $1, %ecx
1722 ; SSSE3-NEXT:    movd %ecx, %xmm1
1723 ; 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]
1724 ; SSSE3-NEXT:    movl %eax, %ecx
1725 ; SSSE3-NEXT:    shrl $10, %ecx
1726 ; SSSE3-NEXT:    andl $1, %ecx
1727 ; SSSE3-NEXT:    movd %ecx, %xmm0
1728 ; SSSE3-NEXT:    movl %eax, %ecx
1729 ; SSSE3-NEXT:    shrl $2, %ecx
1730 ; SSSE3-NEXT:    andl $1, %ecx
1731 ; SSSE3-NEXT:    movd %ecx, %xmm2
1732 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
1733 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
1734 ; SSSE3-NEXT:    movl %eax, %ecx
1735 ; SSSE3-NEXT:    shrl $12, %ecx
1736 ; SSSE3-NEXT:    andl $1, %ecx
1737 ; SSSE3-NEXT:    movd %ecx, %xmm0
1738 ; SSSE3-NEXT:    movl %eax, %ecx
1739 ; SSSE3-NEXT:    shrl $4, %ecx
1740 ; SSSE3-NEXT:    andl $1, %ecx
1741 ; SSSE3-NEXT:    movd %ecx, %xmm3
1742 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1743 ; SSSE3-NEXT:    movl %eax, %ecx
1744 ; SSSE3-NEXT:    andl $1, %ecx
1745 ; SSSE3-NEXT:    movd %ecx, %xmm1
1746 ; SSSE3-NEXT:    movl %eax, %ecx
1747 ; SSSE3-NEXT:    shrl $8, %ecx
1748 ; SSSE3-NEXT:    andl $1, %ecx
1749 ; SSSE3-NEXT:    movd %ecx, %xmm0
1750 ; 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]
1751 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
1752 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1753 ; SSSE3-NEXT:    movl %eax, %ecx
1754 ; SSSE3-NEXT:    shrl $13, %ecx
1755 ; SSSE3-NEXT:    andl $1, %ecx
1756 ; SSSE3-NEXT:    movd %ecx, %xmm0
1757 ; SSSE3-NEXT:    movl %eax, %ecx
1758 ; SSSE3-NEXT:    shrl $5, %ecx
1759 ; SSSE3-NEXT:    andl $1, %ecx
1760 ; SSSE3-NEXT:    movd %ecx, %xmm2
1761 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
1762 ; SSSE3-NEXT:    movl %eax, %ecx
1763 ; SSSE3-NEXT:    shrl $9, %ecx
1764 ; SSSE3-NEXT:    andl $1, %ecx
1765 ; SSSE3-NEXT:    movd %ecx, %xmm3
1766 ; SSSE3-NEXT:    movl %eax, %ecx
1767 ; SSSE3-NEXT:    shrl %ecx
1768 ; SSSE3-NEXT:    andl $1, %ecx
1769 ; SSSE3-NEXT:    movd %ecx, %xmm0
1770 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
1771 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
1772 ; SSSE3-NEXT:    movl %eax, %ecx
1773 ; SSSE3-NEXT:    shrl $11, %ecx
1774 ; SSSE3-NEXT:    andl $1, %ecx
1775 ; SSSE3-NEXT:    movd %ecx, %xmm2
1776 ; SSSE3-NEXT:    movl %eax, %ecx
1777 ; SSSE3-NEXT:    shrl $3, %ecx
1778 ; SSSE3-NEXT:    andl $1, %ecx
1779 ; SSSE3-NEXT:    movd %ecx, %xmm3
1780 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
1781 ; SSSE3-NEXT:    movl %eax, %ecx
1782 ; SSSE3-NEXT:    shrl $7, %ecx
1783 ; SSSE3-NEXT:    andl $1, %ecx
1784 ; SSSE3-NEXT:    movd %ecx, %xmm2
1785 ; SSSE3-NEXT:    shrl $15, %eax
1786 ; SSSE3-NEXT:    movzwl %ax, %eax
1787 ; SSSE3-NEXT:    movd %eax, %xmm4
1788 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3],xmm2[4],xmm4[4],xmm2[5],xmm4[5],xmm2[6],xmm4[6],xmm2[7],xmm4[7]
1789 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
1790 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
1791 ; 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]
1792 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1793 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1794 ; SSSE3-NEXT:    psllw $15, %xmm0
1795 ; SSSE3-NEXT:    psraw $15, %xmm0
1796 ; 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]
1797 ; SSSE3-NEXT:    psllw $15, %xmm1
1798 ; SSSE3-NEXT:    psraw $15, %xmm1
1799 ; SSSE3-NEXT:    retq
1800 ;
1801 ; SSE41-LABEL: load_sext_16i1_to_16i16:
1802 ; SSE41:       # BB#0: # %entry
1803 ; SSE41-NEXT:    movzwl (%rdi), %eax
1804 ; SSE41-NEXT:    movl %eax, %ecx
1805 ; SSE41-NEXT:    shrl %ecx
1806 ; SSE41-NEXT:    andl $1, %ecx
1807 ; SSE41-NEXT:    movl %eax, %edx
1808 ; SSE41-NEXT:    andl $1, %edx
1809 ; SSE41-NEXT:    movd %edx, %xmm1
1810 ; SSE41-NEXT:    pinsrb $1, %ecx, %xmm1
1811 ; SSE41-NEXT:    movl %eax, %ecx
1812 ; SSE41-NEXT:    shrl $2, %ecx
1813 ; SSE41-NEXT:    andl $1, %ecx
1814 ; SSE41-NEXT:    pinsrb $2, %ecx, %xmm1
1815 ; SSE41-NEXT:    movl %eax, %ecx
1816 ; SSE41-NEXT:    shrl $3, %ecx
1817 ; SSE41-NEXT:    andl $1, %ecx
1818 ; SSE41-NEXT:    pinsrb $3, %ecx, %xmm1
1819 ; SSE41-NEXT:    movl %eax, %ecx
1820 ; SSE41-NEXT:    shrl $4, %ecx
1821 ; SSE41-NEXT:    andl $1, %ecx
1822 ; SSE41-NEXT:    pinsrb $4, %ecx, %xmm1
1823 ; SSE41-NEXT:    movl %eax, %ecx
1824 ; SSE41-NEXT:    shrl $5, %ecx
1825 ; SSE41-NEXT:    andl $1, %ecx
1826 ; SSE41-NEXT:    pinsrb $5, %ecx, %xmm1
1827 ; SSE41-NEXT:    movl %eax, %ecx
1828 ; SSE41-NEXT:    shrl $6, %ecx
1829 ; SSE41-NEXT:    andl $1, %ecx
1830 ; SSE41-NEXT:    pinsrb $6, %ecx, %xmm1
1831 ; SSE41-NEXT:    movl %eax, %ecx
1832 ; SSE41-NEXT:    shrl $7, %ecx
1833 ; SSE41-NEXT:    andl $1, %ecx
1834 ; SSE41-NEXT:    pinsrb $7, %ecx, %xmm1
1835 ; SSE41-NEXT:    movl %eax, %ecx
1836 ; SSE41-NEXT:    shrl $8, %ecx
1837 ; SSE41-NEXT:    andl $1, %ecx
1838 ; SSE41-NEXT:    pinsrb $8, %ecx, %xmm1
1839 ; SSE41-NEXT:    movl %eax, %ecx
1840 ; SSE41-NEXT:    shrl $9, %ecx
1841 ; SSE41-NEXT:    andl $1, %ecx
1842 ; SSE41-NEXT:    pinsrb $9, %ecx, %xmm1
1843 ; SSE41-NEXT:    movl %eax, %ecx
1844 ; SSE41-NEXT:    shrl $10, %ecx
1845 ; SSE41-NEXT:    andl $1, %ecx
1846 ; SSE41-NEXT:    pinsrb $10, %ecx, %xmm1
1847 ; SSE41-NEXT:    movl %eax, %ecx
1848 ; SSE41-NEXT:    shrl $11, %ecx
1849 ; SSE41-NEXT:    andl $1, %ecx
1850 ; SSE41-NEXT:    pinsrb $11, %ecx, %xmm1
1851 ; SSE41-NEXT:    movl %eax, %ecx
1852 ; SSE41-NEXT:    shrl $12, %ecx
1853 ; SSE41-NEXT:    andl $1, %ecx
1854 ; SSE41-NEXT:    pinsrb $12, %ecx, %xmm1
1855 ; SSE41-NEXT:    movl %eax, %ecx
1856 ; SSE41-NEXT:    shrl $13, %ecx
1857 ; SSE41-NEXT:    andl $1, %ecx
1858 ; SSE41-NEXT:    pinsrb $13, %ecx, %xmm1
1859 ; SSE41-NEXT:    movl %eax, %ecx
1860 ; SSE41-NEXT:    shrl $14, %ecx
1861 ; SSE41-NEXT:    andl $1, %ecx
1862 ; SSE41-NEXT:    pinsrb $14, %ecx, %xmm1
1863 ; SSE41-NEXT:    shrl $15, %eax
1864 ; SSE41-NEXT:    movzwl %ax, %eax
1865 ; SSE41-NEXT:    pinsrb $15, %eax, %xmm1
1866 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
1867 ; SSE41-NEXT:    psllw $15, %xmm0
1868 ; SSE41-NEXT:    psraw $15, %xmm0
1869 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1870 ; SSE41-NEXT:    psllw $15, %xmm1
1871 ; SSE41-NEXT:    psraw $15, %xmm1
1872 ; SSE41-NEXT:    retq
1873 ;
1874 ; AVX1-LABEL: load_sext_16i1_to_16i16:
1875 ; AVX1:       # BB#0: # %entry
1876 ; AVX1-NEXT:    movzwl (%rdi), %eax
1877 ; AVX1-NEXT:    movq %rax, %rcx
1878 ; AVX1-NEXT:    shlq $54, %rcx
1879 ; AVX1-NEXT:    sarq $63, %rcx
1880 ; AVX1-NEXT:    movq %rax, %rdx
1881 ; AVX1-NEXT:    shlq $55, %rdx
1882 ; AVX1-NEXT:    sarq $63, %rdx
1883 ; AVX1-NEXT:    vmovd %edx, %xmm0
1884 ; AVX1-NEXT:    vpinsrw $1, %ecx, %xmm0, %xmm0
1885 ; AVX1-NEXT:    movq %rax, %rcx
1886 ; AVX1-NEXT:    shlq $53, %rcx
1887 ; AVX1-NEXT:    sarq $63, %rcx
1888 ; AVX1-NEXT:    vpinsrw $2, %ecx, %xmm0, %xmm0
1889 ; AVX1-NEXT:    movq %rax, %rcx
1890 ; AVX1-NEXT:    shlq $52, %rcx
1891 ; AVX1-NEXT:    sarq $63, %rcx
1892 ; AVX1-NEXT:    vpinsrw $3, %ecx, %xmm0, %xmm0
1893 ; AVX1-NEXT:    movq %rax, %rcx
1894 ; AVX1-NEXT:    shlq $51, %rcx
1895 ; AVX1-NEXT:    sarq $63, %rcx
1896 ; AVX1-NEXT:    vpinsrw $4, %ecx, %xmm0, %xmm0
1897 ; AVX1-NEXT:    movq %rax, %rcx
1898 ; AVX1-NEXT:    shlq $50, %rcx
1899 ; AVX1-NEXT:    sarq $63, %rcx
1900 ; AVX1-NEXT:    vpinsrw $5, %ecx, %xmm0, %xmm0
1901 ; AVX1-NEXT:    movq %rax, %rcx
1902 ; AVX1-NEXT:    shlq $49, %rcx
1903 ; AVX1-NEXT:    sarq $63, %rcx
1904 ; AVX1-NEXT:    vpinsrw $6, %ecx, %xmm0, %xmm0
1905 ; AVX1-NEXT:    movq %rax, %rcx
1906 ; AVX1-NEXT:    shlq $48, %rcx
1907 ; AVX1-NEXT:    sarq $63, %rcx
1908 ; AVX1-NEXT:    vpinsrw $7, %ecx, %xmm0, %xmm0
1909 ; AVX1-NEXT:    movq %rax, %rcx
1910 ; AVX1-NEXT:    shlq $62, %rcx
1911 ; AVX1-NEXT:    sarq $63, %rcx
1912 ; AVX1-NEXT:    movq %rax, %rdx
1913 ; AVX1-NEXT:    shlq $63, %rdx
1914 ; AVX1-NEXT:    sarq $63, %rdx
1915 ; AVX1-NEXT:    vmovd %edx, %xmm1
1916 ; AVX1-NEXT:    vpinsrw $1, %ecx, %xmm1, %xmm1
1917 ; AVX1-NEXT:    movq %rax, %rcx
1918 ; AVX1-NEXT:    shlq $61, %rcx
1919 ; AVX1-NEXT:    sarq $63, %rcx
1920 ; AVX1-NEXT:    vpinsrw $2, %ecx, %xmm1, %xmm1
1921 ; AVX1-NEXT:    movq %rax, %rcx
1922 ; AVX1-NEXT:    shlq $60, %rcx
1923 ; AVX1-NEXT:    sarq $63, %rcx
1924 ; AVX1-NEXT:    vpinsrw $3, %ecx, %xmm1, %xmm1
1925 ; AVX1-NEXT:    movq %rax, %rcx
1926 ; AVX1-NEXT:    shlq $59, %rcx
1927 ; AVX1-NEXT:    sarq $63, %rcx
1928 ; AVX1-NEXT:    vpinsrw $4, %ecx, %xmm1, %xmm1
1929 ; AVX1-NEXT:    movq %rax, %rcx
1930 ; AVX1-NEXT:    shlq $58, %rcx
1931 ; AVX1-NEXT:    sarq $63, %rcx
1932 ; AVX1-NEXT:    vpinsrw $5, %ecx, %xmm1, %xmm1
1933 ; AVX1-NEXT:    movq %rax, %rcx
1934 ; AVX1-NEXT:    shlq $57, %rcx
1935 ; AVX1-NEXT:    sarq $63, %rcx
1936 ; AVX1-NEXT:    vpinsrw $6, %ecx, %xmm1, %xmm1
1937 ; AVX1-NEXT:    shlq $56, %rax
1938 ; AVX1-NEXT:    sarq $63, %rax
1939 ; AVX1-NEXT:    vpinsrw $7, %eax, %xmm1, %xmm1
1940 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1941 ; AVX1-NEXT:    retq
1942 ;
1943 ; AVX2-LABEL: load_sext_16i1_to_16i16:
1944 ; AVX2:       # BB#0: # %entry
1945 ; AVX2-NEXT:    movzwl (%rdi), %eax
1946 ; AVX2-NEXT:    movq %rax, %rcx
1947 ; AVX2-NEXT:    shlq $54, %rcx
1948 ; AVX2-NEXT:    sarq $63, %rcx
1949 ; AVX2-NEXT:    movq %rax, %rdx
1950 ; AVX2-NEXT:    shlq $55, %rdx
1951 ; AVX2-NEXT:    sarq $63, %rdx
1952 ; AVX2-NEXT:    vmovd %edx, %xmm0
1953 ; AVX2-NEXT:    vpinsrw $1, %ecx, %xmm0, %xmm0
1954 ; AVX2-NEXT:    movq %rax, %rcx
1955 ; AVX2-NEXT:    shlq $53, %rcx
1956 ; AVX2-NEXT:    sarq $63, %rcx
1957 ; AVX2-NEXT:    vpinsrw $2, %ecx, %xmm0, %xmm0
1958 ; AVX2-NEXT:    movq %rax, %rcx
1959 ; AVX2-NEXT:    shlq $52, %rcx
1960 ; AVX2-NEXT:    sarq $63, %rcx
1961 ; AVX2-NEXT:    vpinsrw $3, %ecx, %xmm0, %xmm0
1962 ; AVX2-NEXT:    movq %rax, %rcx
1963 ; AVX2-NEXT:    shlq $51, %rcx
1964 ; AVX2-NEXT:    sarq $63, %rcx
1965 ; AVX2-NEXT:    vpinsrw $4, %ecx, %xmm0, %xmm0
1966 ; AVX2-NEXT:    movq %rax, %rcx
1967 ; AVX2-NEXT:    shlq $50, %rcx
1968 ; AVX2-NEXT:    sarq $63, %rcx
1969 ; AVX2-NEXT:    vpinsrw $5, %ecx, %xmm0, %xmm0
1970 ; AVX2-NEXT:    movq %rax, %rcx
1971 ; AVX2-NEXT:    shlq $49, %rcx
1972 ; AVX2-NEXT:    sarq $63, %rcx
1973 ; AVX2-NEXT:    vpinsrw $6, %ecx, %xmm0, %xmm0
1974 ; AVX2-NEXT:    movq %rax, %rcx
1975 ; AVX2-NEXT:    shlq $48, %rcx
1976 ; AVX2-NEXT:    sarq $63, %rcx
1977 ; AVX2-NEXT:    vpinsrw $7, %ecx, %xmm0, %xmm0
1978 ; AVX2-NEXT:    movq %rax, %rcx
1979 ; AVX2-NEXT:    shlq $62, %rcx
1980 ; AVX2-NEXT:    sarq $63, %rcx
1981 ; AVX2-NEXT:    movq %rax, %rdx
1982 ; AVX2-NEXT:    shlq $63, %rdx
1983 ; AVX2-NEXT:    sarq $63, %rdx
1984 ; AVX2-NEXT:    vmovd %edx, %xmm1
1985 ; AVX2-NEXT:    vpinsrw $1, %ecx, %xmm1, %xmm1
1986 ; AVX2-NEXT:    movq %rax, %rcx
1987 ; AVX2-NEXT:    shlq $61, %rcx
1988 ; AVX2-NEXT:    sarq $63, %rcx
1989 ; AVX2-NEXT:    vpinsrw $2, %ecx, %xmm1, %xmm1
1990 ; AVX2-NEXT:    movq %rax, %rcx
1991 ; AVX2-NEXT:    shlq $60, %rcx
1992 ; AVX2-NEXT:    sarq $63, %rcx
1993 ; AVX2-NEXT:    vpinsrw $3, %ecx, %xmm1, %xmm1
1994 ; AVX2-NEXT:    movq %rax, %rcx
1995 ; AVX2-NEXT:    shlq $59, %rcx
1996 ; AVX2-NEXT:    sarq $63, %rcx
1997 ; AVX2-NEXT:    vpinsrw $4, %ecx, %xmm1, %xmm1
1998 ; AVX2-NEXT:    movq %rax, %rcx
1999 ; AVX2-NEXT:    shlq $58, %rcx
2000 ; AVX2-NEXT:    sarq $63, %rcx
2001 ; AVX2-NEXT:    vpinsrw $5, %ecx, %xmm1, %xmm1
2002 ; AVX2-NEXT:    movq %rax, %rcx
2003 ; AVX2-NEXT:    shlq $57, %rcx
2004 ; AVX2-NEXT:    sarq $63, %rcx
2005 ; AVX2-NEXT:    vpinsrw $6, %ecx, %xmm1, %xmm1
2006 ; AVX2-NEXT:    shlq $56, %rax
2007 ; AVX2-NEXT:    sarq $63, %rax
2008 ; AVX2-NEXT:    vpinsrw $7, %eax, %xmm1, %xmm1
2009 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
2010 ; AVX2-NEXT:    retq
2011 ;
2012 ; X32-SSE41-LABEL: load_sext_16i1_to_16i16:
2013 ; X32-SSE41:       # BB#0: # %entry
2014 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2015 ; X32-SSE41-NEXT:    movzwl (%eax), %eax
2016 ; X32-SSE41-NEXT:    movl %eax, %ecx
2017 ; X32-SSE41-NEXT:    shrl %ecx
2018 ; X32-SSE41-NEXT:    andl $1, %ecx
2019 ; X32-SSE41-NEXT:    movl %eax, %edx
2020 ; X32-SSE41-NEXT:    andl $1, %edx
2021 ; X32-SSE41-NEXT:    movd %edx, %xmm1
2022 ; X32-SSE41-NEXT:    pinsrb $1, %ecx, %xmm1
2023 ; X32-SSE41-NEXT:    movl %eax, %ecx
2024 ; X32-SSE41-NEXT:    shrl $2, %ecx
2025 ; X32-SSE41-NEXT:    andl $1, %ecx
2026 ; X32-SSE41-NEXT:    pinsrb $2, %ecx, %xmm1
2027 ; X32-SSE41-NEXT:    movl %eax, %ecx
2028 ; X32-SSE41-NEXT:    shrl $3, %ecx
2029 ; X32-SSE41-NEXT:    andl $1, %ecx
2030 ; X32-SSE41-NEXT:    pinsrb $3, %ecx, %xmm1
2031 ; X32-SSE41-NEXT:    movl %eax, %ecx
2032 ; X32-SSE41-NEXT:    shrl $4, %ecx
2033 ; X32-SSE41-NEXT:    andl $1, %ecx
2034 ; X32-SSE41-NEXT:    pinsrb $4, %ecx, %xmm1
2035 ; X32-SSE41-NEXT:    movl %eax, %ecx
2036 ; X32-SSE41-NEXT:    shrl $5, %ecx
2037 ; X32-SSE41-NEXT:    andl $1, %ecx
2038 ; X32-SSE41-NEXT:    pinsrb $5, %ecx, %xmm1
2039 ; X32-SSE41-NEXT:    movl %eax, %ecx
2040 ; X32-SSE41-NEXT:    shrl $6, %ecx
2041 ; X32-SSE41-NEXT:    andl $1, %ecx
2042 ; X32-SSE41-NEXT:    pinsrb $6, %ecx, %xmm1
2043 ; X32-SSE41-NEXT:    movl %eax, %ecx
2044 ; X32-SSE41-NEXT:    shrl $7, %ecx
2045 ; X32-SSE41-NEXT:    andl $1, %ecx
2046 ; X32-SSE41-NEXT:    pinsrb $7, %ecx, %xmm1
2047 ; X32-SSE41-NEXT:    movl %eax, %ecx
2048 ; X32-SSE41-NEXT:    shrl $8, %ecx
2049 ; X32-SSE41-NEXT:    andl $1, %ecx
2050 ; X32-SSE41-NEXT:    pinsrb $8, %ecx, %xmm1
2051 ; X32-SSE41-NEXT:    movl %eax, %ecx
2052 ; X32-SSE41-NEXT:    shrl $9, %ecx
2053 ; X32-SSE41-NEXT:    andl $1, %ecx
2054 ; X32-SSE41-NEXT:    pinsrb $9, %ecx, %xmm1
2055 ; X32-SSE41-NEXT:    movl %eax, %ecx
2056 ; X32-SSE41-NEXT:    shrl $10, %ecx
2057 ; X32-SSE41-NEXT:    andl $1, %ecx
2058 ; X32-SSE41-NEXT:    pinsrb $10, %ecx, %xmm1
2059 ; X32-SSE41-NEXT:    movl %eax, %ecx
2060 ; X32-SSE41-NEXT:    shrl $11, %ecx
2061 ; X32-SSE41-NEXT:    andl $1, %ecx
2062 ; X32-SSE41-NEXT:    pinsrb $11, %ecx, %xmm1
2063 ; X32-SSE41-NEXT:    movl %eax, %ecx
2064 ; X32-SSE41-NEXT:    shrl $12, %ecx
2065 ; X32-SSE41-NEXT:    andl $1, %ecx
2066 ; X32-SSE41-NEXT:    pinsrb $12, %ecx, %xmm1
2067 ; X32-SSE41-NEXT:    movl %eax, %ecx
2068 ; X32-SSE41-NEXT:    shrl $13, %ecx
2069 ; X32-SSE41-NEXT:    andl $1, %ecx
2070 ; X32-SSE41-NEXT:    pinsrb $13, %ecx, %xmm1
2071 ; X32-SSE41-NEXT:    movl %eax, %ecx
2072 ; X32-SSE41-NEXT:    shrl $14, %ecx
2073 ; X32-SSE41-NEXT:    andl $1, %ecx
2074 ; X32-SSE41-NEXT:    pinsrb $14, %ecx, %xmm1
2075 ; X32-SSE41-NEXT:    shrl $15, %eax
2076 ; X32-SSE41-NEXT:    pinsrb $15, %eax, %xmm1
2077 ; X32-SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2078 ; X32-SSE41-NEXT:    psllw $15, %xmm0
2079 ; X32-SSE41-NEXT:    psraw $15, %xmm0
2080 ; X32-SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2081 ; X32-SSE41-NEXT:    psllw $15, %xmm1
2082 ; X32-SSE41-NEXT:    psraw $15, %xmm1
2083 ; X32-SSE41-NEXT:    retl
2084 entry:
2085  %X = load <16 x i1>, <16 x i1>* %ptr
2086  %Y = sext <16 x i1> %X to <16 x i16>
2087  ret <16 x i16> %Y
2088 }
2089
2090 define <16 x i16> @load_sext_16i8_to_16i16(<16 x i8> *%ptr) {
2091 ; SSE2-LABEL: load_sext_16i8_to_16i16:
2092 ; SSE2:       # BB#0: # %entry
2093 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2094 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2095 ; SSE2-NEXT:    psraw $8, %xmm0
2096 ; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
2097 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2098 ; SSE2-NEXT:    psraw $8, %xmm1
2099 ; SSE2-NEXT:    retq
2100 ;
2101 ; SSSE3-LABEL: load_sext_16i8_to_16i16:
2102 ; SSSE3:       # BB#0: # %entry
2103 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2104 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2105 ; SSSE3-NEXT:    psraw $8, %xmm0
2106 ; SSSE3-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
2107 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2108 ; SSSE3-NEXT:    psraw $8, %xmm1
2109 ; SSSE3-NEXT:    retq
2110 ;
2111 ; SSE41-LABEL: load_sext_16i8_to_16i16:
2112 ; SSE41:       # BB#0: # %entry
2113 ; SSE41-NEXT:    pmovsxbw (%rdi), %xmm0
2114 ; SSE41-NEXT:    pmovsxbw 8(%rdi), %xmm1
2115 ; SSE41-NEXT:    retq
2116 ;
2117 ; AVX1-LABEL: load_sext_16i8_to_16i16:
2118 ; AVX1:       # BB#0: # %entry
2119 ; AVX1-NEXT:    vpmovsxbw (%rdi), %xmm0
2120 ; AVX1-NEXT:    vpmovsxbw 8(%rdi), %xmm1
2121 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2122 ; AVX1-NEXT:    retq
2123 ;
2124 ; AVX2-LABEL: load_sext_16i8_to_16i16:
2125 ; AVX2:       # BB#0: # %entry
2126 ; AVX2-NEXT:    vpmovsxbw (%rdi), %ymm0
2127 ; AVX2-NEXT:    retq
2128 ;
2129 ; X32-SSE41-LABEL: load_sext_16i8_to_16i16:
2130 ; X32-SSE41:       # BB#0: # %entry
2131 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2132 ; X32-SSE41-NEXT:    pmovsxbw (%eax), %xmm0
2133 ; X32-SSE41-NEXT:    pmovsxbw 8(%eax), %xmm1
2134 ; X32-SSE41-NEXT:    retl
2135 entry:
2136  %X = load <16 x i8>, <16 x i8>* %ptr
2137  %Y = sext <16 x i8> %X to <16 x i16>
2138  ret <16 x i16> %Y
2139 }
2140
2141 define <2 x i64> @load_sext_2i16_to_2i64(<2 x i16> *%ptr) {
2142 ; SSE2-LABEL: load_sext_2i16_to_2i64:
2143 ; SSE2:       # BB#0: # %entry
2144 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2145 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2146 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
2147 ; SSE2-NEXT:    psrad $31, %xmm1
2148 ; SSE2-NEXT:    psrad $16, %xmm0
2149 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2150 ; SSE2-NEXT:    retq
2151 ;
2152 ; SSSE3-LABEL: load_sext_2i16_to_2i64:
2153 ; SSSE3:       # BB#0: # %entry
2154 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2155 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2156 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
2157 ; SSSE3-NEXT:    psrad $31, %xmm1
2158 ; SSSE3-NEXT:    psrad $16, %xmm0
2159 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2160 ; SSSE3-NEXT:    retq
2161 ;
2162 ; SSE41-LABEL: load_sext_2i16_to_2i64:
2163 ; SSE41:       # BB#0: # %entry
2164 ; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
2165 ; SSE41-NEXT:    retq
2166 ;
2167 ; AVX-LABEL: load_sext_2i16_to_2i64:
2168 ; AVX:       # BB#0: # %entry
2169 ; AVX-NEXT:    vpmovsxwq (%rdi), %xmm0
2170 ; AVX-NEXT:    retq
2171 ;
2172 ; X32-SSE41-LABEL: load_sext_2i16_to_2i64:
2173 ; X32-SSE41:       # BB#0: # %entry
2174 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2175 ; X32-SSE41-NEXT:    pmovsxwq (%eax), %xmm0
2176 ; X32-SSE41-NEXT:    retl
2177 entry:
2178  %X = load <2 x i16>, <2 x i16>* %ptr
2179  %Y = sext <2 x i16> %X to <2 x i64>
2180  ret <2 x i64> %Y
2181 }
2182
2183 define <4 x i32> @load_sext_4i16_to_4i32(<4 x i16> *%ptr) {
2184 ; SSE2-LABEL: load_sext_4i16_to_4i32:
2185 ; SSE2:       # BB#0: # %entry
2186 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2187 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2188 ; SSE2-NEXT:    psrad $16, %xmm0
2189 ; SSE2-NEXT:    retq
2190 ;
2191 ; SSSE3-LABEL: load_sext_4i16_to_4i32:
2192 ; SSSE3:       # BB#0: # %entry
2193 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2194 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2195 ; SSSE3-NEXT:    psrad $16, %xmm0
2196 ; SSSE3-NEXT:    retq
2197 ;
2198 ; SSE41-LABEL: load_sext_4i16_to_4i32:
2199 ; SSE41:       # BB#0: # %entry
2200 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
2201 ; SSE41-NEXT:    retq
2202 ;
2203 ; AVX-LABEL: load_sext_4i16_to_4i32:
2204 ; AVX:       # BB#0: # %entry
2205 ; AVX-NEXT:    vpmovsxwd (%rdi), %xmm0
2206 ; AVX-NEXT:    retq
2207 ;
2208 ; X32-SSE41-LABEL: load_sext_4i16_to_4i32:
2209 ; X32-SSE41:       # BB#0: # %entry
2210 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2211 ; X32-SSE41-NEXT:    pmovsxwd (%eax), %xmm0
2212 ; X32-SSE41-NEXT:    retl
2213 entry:
2214  %X = load <4 x i16>, <4 x i16>* %ptr
2215  %Y = sext <4 x i16> %X to <4 x i32>
2216  ret <4 x i32> %Y
2217 }
2218
2219 define <4 x i64> @load_sext_4i16_to_4i64(<4 x i16> *%ptr) {
2220 ; SSE2-LABEL: load_sext_4i16_to_4i64:
2221 ; SSE2:       # BB#0: # %entry
2222 ; SSE2-NEXT:    movswq 2(%rdi), %rax
2223 ; SSE2-NEXT:    movd %rax, %xmm1
2224 ; SSE2-NEXT:    movswq (%rdi), %rax
2225 ; SSE2-NEXT:    movd %rax, %xmm0
2226 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2227 ; SSE2-NEXT:    movswq 6(%rdi), %rax
2228 ; SSE2-NEXT:    movd %rax, %xmm2
2229 ; SSE2-NEXT:    movswq 4(%rdi), %rax
2230 ; SSE2-NEXT:    movd %rax, %xmm1
2231 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
2232 ; SSE2-NEXT:    retq
2233 ;
2234 ; SSSE3-LABEL: load_sext_4i16_to_4i64:
2235 ; SSSE3:       # BB#0: # %entry
2236 ; SSSE3-NEXT:    movswq 2(%rdi), %rax
2237 ; SSSE3-NEXT:    movd %rax, %xmm1
2238 ; SSSE3-NEXT:    movswq (%rdi), %rax
2239 ; SSSE3-NEXT:    movd %rax, %xmm0
2240 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2241 ; SSSE3-NEXT:    movswq 6(%rdi), %rax
2242 ; SSSE3-NEXT:    movd %rax, %xmm2
2243 ; SSSE3-NEXT:    movswq 4(%rdi), %rax
2244 ; SSSE3-NEXT:    movd %rax, %xmm1
2245 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
2246 ; SSSE3-NEXT:    retq
2247 ;
2248 ; SSE41-LABEL: load_sext_4i16_to_4i64:
2249 ; SSE41:       # BB#0: # %entry
2250 ; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
2251 ; SSE41-NEXT:    pmovsxwq 4(%rdi), %xmm1
2252 ; SSE41-NEXT:    retq
2253 ;
2254 ; AVX1-LABEL: load_sext_4i16_to_4i64:
2255 ; AVX1:       # BB#0: # %entry
2256 ; AVX1-NEXT:    vpmovsxwd (%rdi), %xmm0
2257 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
2258 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
2259 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
2260 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2261 ; AVX1-NEXT:    retq
2262 ;
2263 ; AVX2-LABEL: load_sext_4i16_to_4i64:
2264 ; AVX2:       # BB#0: # %entry
2265 ; AVX2-NEXT:    vpmovsxwq (%rdi), %ymm0
2266 ; AVX2-NEXT:    retq
2267 ;
2268 ; X32-SSE41-LABEL: load_sext_4i16_to_4i64:
2269 ; X32-SSE41:       # BB#0: # %entry
2270 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2271 ; X32-SSE41-NEXT:    pmovsxwq (%eax), %xmm0
2272 ; X32-SSE41-NEXT:    pmovsxwq 4(%eax), %xmm1
2273 ; X32-SSE41-NEXT:    retl
2274 entry:
2275  %X = load <4 x i16>, <4 x i16>* %ptr
2276  %Y = sext <4 x i16> %X to <4 x i64>
2277  ret <4 x i64> %Y
2278 }
2279
2280 define <8 x i32> @load_sext_8i16_to_8i32(<8 x i16> *%ptr) {
2281 ; SSE2-LABEL: load_sext_8i16_to_8i32:
2282 ; SSE2:       # BB#0: # %entry
2283 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2284 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2285 ; SSE2-NEXT:    psrad $16, %xmm0
2286 ; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
2287 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
2288 ; SSE2-NEXT:    psrad $16, %xmm1
2289 ; SSE2-NEXT:    retq
2290 ;
2291 ; SSSE3-LABEL: load_sext_8i16_to_8i32:
2292 ; SSSE3:       # BB#0: # %entry
2293 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2294 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2295 ; SSSE3-NEXT:    psrad $16, %xmm0
2296 ; SSSE3-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
2297 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
2298 ; SSSE3-NEXT:    psrad $16, %xmm1
2299 ; SSSE3-NEXT:    retq
2300 ;
2301 ; SSE41-LABEL: load_sext_8i16_to_8i32:
2302 ; SSE41:       # BB#0: # %entry
2303 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
2304 ; SSE41-NEXT:    pmovsxwd 8(%rdi), %xmm1
2305 ; SSE41-NEXT:    retq
2306 ;
2307 ; AVX1-LABEL: load_sext_8i16_to_8i32:
2308 ; AVX1:       # BB#0: # %entry
2309 ; AVX1-NEXT:    vpmovsxwd (%rdi), %xmm0
2310 ; AVX1-NEXT:    vpmovsxwd 8(%rdi), %xmm1
2311 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2312 ; AVX1-NEXT:    retq
2313 ;
2314 ; AVX2-LABEL: load_sext_8i16_to_8i32:
2315 ; AVX2:       # BB#0: # %entry
2316 ; AVX2-NEXT:    vpmovsxwd (%rdi), %ymm0
2317 ; AVX2-NEXT:    retq
2318 ;
2319 ; X32-SSE41-LABEL: load_sext_8i16_to_8i32:
2320 ; X32-SSE41:       # BB#0: # %entry
2321 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2322 ; X32-SSE41-NEXT:    pmovsxwd (%eax), %xmm0
2323 ; X32-SSE41-NEXT:    pmovsxwd 8(%eax), %xmm1
2324 ; X32-SSE41-NEXT:    retl
2325 entry:
2326  %X = load <8 x i16>, <8 x i16>* %ptr
2327  %Y = sext <8 x i16> %X to <8 x i32>
2328  ret <8 x i32> %Y
2329 }
2330
2331 define <2 x i64> @load_sext_2i32_to_2i64(<2 x i32> *%ptr) {
2332 ; SSE2-LABEL: load_sext_2i32_to_2i64:
2333 ; SSE2:       # BB#0: # %entry
2334 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2335 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
2336 ; SSE2-NEXT:    psrad $31, %xmm1
2337 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2338 ; SSE2-NEXT:    retq
2339 ;
2340 ; SSSE3-LABEL: load_sext_2i32_to_2i64:
2341 ; SSSE3:       # BB#0: # %entry
2342 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2343 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
2344 ; SSSE3-NEXT:    psrad $31, %xmm1
2345 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2346 ; SSSE3-NEXT:    retq
2347 ;
2348 ; SSE41-LABEL: load_sext_2i32_to_2i64:
2349 ; SSE41:       # BB#0: # %entry
2350 ; SSE41-NEXT:    pmovsxdq (%rdi), %xmm0
2351 ; SSE41-NEXT:    retq
2352 ;
2353 ; AVX-LABEL: load_sext_2i32_to_2i64:
2354 ; AVX:       # BB#0: # %entry
2355 ; AVX-NEXT:    vpmovsxdq (%rdi), %xmm0
2356 ; AVX-NEXT:    retq
2357 ;
2358 ; X32-SSE41-LABEL: load_sext_2i32_to_2i64:
2359 ; X32-SSE41:       # BB#0: # %entry
2360 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2361 ; X32-SSE41-NEXT:    pmovsxdq (%eax), %xmm0
2362 ; X32-SSE41-NEXT:    retl
2363 entry:
2364  %X = load <2 x i32>, <2 x i32>* %ptr
2365  %Y = sext <2 x i32> %X to <2 x i64>
2366  ret <2 x i64> %Y
2367 }
2368
2369 define <4 x i64> @load_sext_4i32_to_4i64(<4 x i32> *%ptr) {
2370 ; SSE2-LABEL: load_sext_4i32_to_4i64:
2371 ; SSE2:       # BB#0: # %entry
2372 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
2373 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
2374 ; SSE2-NEXT:    psrad $31, %xmm2
2375 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
2376 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2377 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
2378 ; SSE2-NEXT:    psrad $31, %xmm2
2379 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
2380 ; SSE2-NEXT:    retq
2381 ;
2382 ; SSSE3-LABEL: load_sext_4i32_to_4i64:
2383 ; SSSE3:       # BB#0: # %entry
2384 ; SSSE3-NEXT:    movdqa (%rdi), %xmm0
2385 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
2386 ; SSSE3-NEXT:    psrad $31, %xmm2
2387 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
2388 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2389 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
2390 ; SSSE3-NEXT:    psrad $31, %xmm2
2391 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
2392 ; SSSE3-NEXT:    retq
2393 ;
2394 ; SSE41-LABEL: load_sext_4i32_to_4i64:
2395 ; SSE41:       # BB#0: # %entry
2396 ; SSE41-NEXT:    pmovsxdq (%rdi), %xmm0
2397 ; SSE41-NEXT:    pmovsxdq 8(%rdi), %xmm1
2398 ; SSE41-NEXT:    retq
2399 ;
2400 ; AVX1-LABEL: load_sext_4i32_to_4i64:
2401 ; AVX1:       # BB#0: # %entry
2402 ; AVX1-NEXT:    vpmovsxdq (%rdi), %xmm0
2403 ; AVX1-NEXT:    vpmovsxdq 8(%rdi), %xmm1
2404 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2405 ; AVX1-NEXT:    retq
2406 ;
2407 ; AVX2-LABEL: load_sext_4i32_to_4i64:
2408 ; AVX2:       # BB#0: # %entry
2409 ; AVX2-NEXT:    vpmovsxdq (%rdi), %ymm0
2410 ; AVX2-NEXT:    retq
2411 ;
2412 ; X32-SSE41-LABEL: load_sext_4i32_to_4i64:
2413 ; X32-SSE41:       # BB#0: # %entry
2414 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2415 ; X32-SSE41-NEXT:    pmovsxdq (%eax), %xmm0
2416 ; X32-SSE41-NEXT:    pmovsxdq 8(%eax), %xmm1
2417 ; X32-SSE41-NEXT:    retl
2418 entry:
2419  %X = load <4 x i32>, <4 x i32>* %ptr
2420  %Y = sext <4 x i32> %X to <4 x i64>
2421  ret <4 x i64> %Y
2422 }
2423
2424 define i32 @sext_2i8_to_i32(<16 x i8> %A) nounwind uwtable readnone ssp {
2425 ; SSE2-LABEL: sext_2i8_to_i32:
2426 ; SSE2:       # BB#0: # %entry
2427 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2428 ; SSE2-NEXT:    psraw $8, %xmm0
2429 ; SSE2-NEXT:    movd %xmm0, %eax
2430 ; SSE2-NEXT:    retq
2431 ;
2432 ; SSSE3-LABEL: sext_2i8_to_i32:
2433 ; SSSE3:       # BB#0: # %entry
2434 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2435 ; SSSE3-NEXT:    psraw $8, %xmm0
2436 ; SSSE3-NEXT:    movd %xmm0, %eax
2437 ; SSSE3-NEXT:    retq
2438 ;
2439 ; SSE41-LABEL: sext_2i8_to_i32:
2440 ; SSE41:       # BB#0: # %entry
2441 ; SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
2442 ; SSE41-NEXT:    movd %xmm0, %eax
2443 ; SSE41-NEXT:    retq
2444 ;
2445 ; AVX-LABEL: sext_2i8_to_i32:
2446 ; AVX:       # BB#0: # %entry
2447 ; AVX-NEXT:    vpmovsxbw %xmm0, %xmm0
2448 ; AVX-NEXT:    vmovd %xmm0, %eax
2449 ; AVX-NEXT:    retq
2450 ;
2451 ; X32-SSE41-LABEL: sext_2i8_to_i32:
2452 ; X32-SSE41:       # BB#0: # %entry
2453 ; X32-SSE41-NEXT:    pushl %eax
2454 ; X32-SSE41-NEXT:  .Ltmp0:
2455 ; X32-SSE41-NEXT:    .cfi_def_cfa_offset 8
2456 ; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
2457 ; X32-SSE41-NEXT:    movd %xmm0, %eax
2458 ; X32-SSE41-NEXT:    popl %edx
2459 ; X32-SSE41-NEXT:    retl
2460 entry:
2461   %Shuf = shufflevector <16 x i8> %A, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
2462   %Ex = sext <2 x i8> %Shuf to <2 x i16>
2463   %Bc = bitcast <2 x i16> %Ex to i32
2464   ret i32 %Bc
2465 }
2466
2467 define <4 x i64> @sext_4i1_to_4i64(<4 x i1> %mask) {
2468 ; SSE2-LABEL: sext_4i1_to_4i64:
2469 ; SSE2:       # BB#0:
2470 ; SSE2-NEXT:    pslld $31, %xmm0
2471 ; SSE2-NEXT:    psrad $31, %xmm0
2472 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
2473 ; SSE2-NEXT:    psrad $31, %xmm2
2474 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
2475 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2476 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
2477 ; SSE2-NEXT:    psrad $31, %xmm2
2478 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
2479 ; SSE2-NEXT:    retq
2480 ;
2481 ; SSSE3-LABEL: sext_4i1_to_4i64:
2482 ; SSSE3:       # BB#0:
2483 ; SSSE3-NEXT:    pslld $31, %xmm0
2484 ; SSSE3-NEXT:    psrad $31, %xmm0
2485 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
2486 ; SSSE3-NEXT:    psrad $31, %xmm2
2487 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
2488 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2489 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
2490 ; SSSE3-NEXT:    psrad $31, %xmm2
2491 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
2492 ; SSSE3-NEXT:    retq
2493 ;
2494 ; SSE41-LABEL: sext_4i1_to_4i64:
2495 ; SSE41:       # BB#0:
2496 ; SSE41-NEXT:    pslld $31, %xmm0
2497 ; SSE41-NEXT:    psrad $31, %xmm0
2498 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
2499 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
2500 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
2501 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
2502 ; SSE41-NEXT:    retq
2503 ;
2504 ; AVX1-LABEL: sext_4i1_to_4i64:
2505 ; AVX1:       # BB#0:
2506 ; AVX1-NEXT:    vpslld $31, %xmm0, %xmm0
2507 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm0
2508 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
2509 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
2510 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
2511 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2512 ; AVX1-NEXT:    retq
2513 ;
2514 ; AVX2-LABEL: sext_4i1_to_4i64:
2515 ; AVX2:       # BB#0:
2516 ; AVX2-NEXT:    vpslld $31, %xmm0, %xmm0
2517 ; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm0
2518 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
2519 ; AVX2-NEXT:    retq
2520 ;
2521 ; X32-SSE41-LABEL: sext_4i1_to_4i64:
2522 ; X32-SSE41:       # BB#0:
2523 ; X32-SSE41-NEXT:    pslld $31, %xmm0
2524 ; X32-SSE41-NEXT:    psrad $31, %xmm0
2525 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
2526 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
2527 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
2528 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
2529 ; X32-SSE41-NEXT:    retl
2530   %extmask = sext <4 x i1> %mask to <4 x i64>
2531   ret <4 x i64> %extmask
2532 }
2533
2534 define <4 x i64> @sext_4i8_to_4i64(<4 x i8> %mask) {
2535 ; SSE2-LABEL: sext_4i8_to_4i64:
2536 ; SSE2:       # BB#0:
2537 ; SSE2-NEXT:    pslld $24, %xmm0
2538 ; SSE2-NEXT:    psrad $24, %xmm0
2539 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
2540 ; SSE2-NEXT:    psrad $31, %xmm2
2541 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
2542 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2543 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
2544 ; SSE2-NEXT:    psrad $31, %xmm2
2545 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
2546 ; SSE2-NEXT:    retq
2547 ;
2548 ; SSSE3-LABEL: sext_4i8_to_4i64:
2549 ; SSSE3:       # BB#0:
2550 ; SSSE3-NEXT:    pslld $24, %xmm0
2551 ; SSSE3-NEXT:    psrad $24, %xmm0
2552 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
2553 ; SSSE3-NEXT:    psrad $31, %xmm2
2554 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
2555 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2556 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
2557 ; SSSE3-NEXT:    psrad $31, %xmm2
2558 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
2559 ; SSSE3-NEXT:    retq
2560 ;
2561 ; SSE41-LABEL: sext_4i8_to_4i64:
2562 ; SSE41:       # BB#0:
2563 ; SSE41-NEXT:    pslld $24, %xmm0
2564 ; SSE41-NEXT:    psrad $24, %xmm0
2565 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
2566 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
2567 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
2568 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
2569 ; SSE41-NEXT:    retq
2570 ;
2571 ; AVX1-LABEL: sext_4i8_to_4i64:
2572 ; AVX1:       # BB#0:
2573 ; AVX1-NEXT:    vpslld $24, %xmm0, %xmm0
2574 ; AVX1-NEXT:    vpsrad $24, %xmm0, %xmm0
2575 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
2576 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
2577 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
2578 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2579 ; AVX1-NEXT:    retq
2580 ;
2581 ; AVX2-LABEL: sext_4i8_to_4i64:
2582 ; AVX2:       # BB#0:
2583 ; AVX2-NEXT:    vpslld $24, %xmm0, %xmm0
2584 ; AVX2-NEXT:    vpsrad $24, %xmm0, %xmm0
2585 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
2586 ; AVX2-NEXT:    retq
2587 ;
2588 ; X32-SSE41-LABEL: sext_4i8_to_4i64:
2589 ; X32-SSE41:       # BB#0:
2590 ; X32-SSE41-NEXT:    pslld $24, %xmm0
2591 ; X32-SSE41-NEXT:    psrad $24, %xmm0
2592 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
2593 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
2594 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
2595 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
2596 ; X32-SSE41-NEXT:    retl
2597   %extmask = sext <4 x i8> %mask to <4 x i64>
2598   ret <4 x i64> %extmask
2599 }