Merging r261039:
[oota-llvm.git] / test / CodeGen / X86 / vector-sext.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=SSE --check-prefix=SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
7 ;
8 ; Just one 32-bit run to make sure we do reasonable things there.
9 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=X32-SSE41
10
11 define <8 x i16> @sext_16i8_to_8i16(<16 x i8> %A) nounwind uwtable readnone ssp {
12 ; SSE2-LABEL: sext_16i8_to_8i16:
13 ; SSE2:       # BB#0: # %entry
14 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
15 ; SSE2-NEXT:    psraw $8, %xmm0
16 ; SSE2-NEXT:    retq
17 ;
18 ; SSSE3-LABEL: sext_16i8_to_8i16:
19 ; SSSE3:       # BB#0: # %entry
20 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
21 ; SSSE3-NEXT:    psraw $8, %xmm0
22 ; SSSE3-NEXT:    retq
23 ;
24 ; SSE41-LABEL: sext_16i8_to_8i16:
25 ; SSE41:       # BB#0: # %entry
26 ; SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
27 ; SSE41-NEXT:    retq
28 ;
29 ; AVX-LABEL: sext_16i8_to_8i16:
30 ; AVX:       # BB#0: # %entry
31 ; AVX-NEXT:    vpmovsxbw %xmm0, %xmm0
32 ; AVX-NEXT:    retq
33 ;
34 ; X32-SSE41-LABEL: sext_16i8_to_8i16:
35 ; X32-SSE41:       # BB#0: # %entry
36 ; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
37 ; X32-SSE41-NEXT:    retl
38 entry:
39   %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>
40   %C = sext <8 x i8> %B to <8 x i16>
41   ret <8 x i16> %C
42 }
43
44 define <16 x i16> @sext_16i8_to_16i16(<16 x i8> %A) nounwind uwtable readnone ssp {
45 ; SSE2-LABEL: sext_16i8_to_16i16:
46 ; SSE2:       # BB#0: # %entry
47 ; 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]
48 ; SSE2-NEXT:    psraw $8, %xmm2
49 ; 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]
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:    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]
59 ; SSSE3-NEXT:    psraw $8, %xmm1
60 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
61 ; SSSE3-NEXT:    retq
62 ;
63 ; SSE41-LABEL: sext_16i8_to_16i16:
64 ; SSE41:       # BB#0: # %entry
65 ; SSE41-NEXT:    pmovsxbw %xmm0, %xmm2
66 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
67 ; SSE41-NEXT:    pmovsxbw %xmm0, %xmm1
68 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
69 ; SSE41-NEXT:    retq
70 ;
71 ; AVX1-LABEL: sext_16i8_to_16i16:
72 ; AVX1:       # BB#0: # %entry
73 ; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm1
74 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
75 ; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm0
76 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
77 ; AVX1-NEXT:    retq
78 ;
79 ; AVX2-LABEL: sext_16i8_to_16i16:
80 ; AVX2:       # BB#0: # %entry
81 ; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm0
82 ; AVX2-NEXT:    retq
83 ;
84 ; X32-SSE41-LABEL: sext_16i8_to_16i16:
85 ; X32-SSE41:       # BB#0: # %entry
86 ; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm2
87 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
88 ; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm1
89 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
90 ; X32-SSE41-NEXT:    retl
91 entry:
92   %B = sext <16 x i8> %A to <16 x i16>
93   ret <16 x i16> %B
94 }
95
96 define <4 x i32> @sext_16i8_to_4i32(<16 x i8> %A) nounwind uwtable readnone ssp {
97 ; SSE2-LABEL: sext_16i8_to_4i32:
98 ; SSE2:       # BB#0: # %entry
99 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
100 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
101 ; SSE2-NEXT:    psrad $24, %xmm0
102 ; SSE2-NEXT:    retq
103 ;
104 ; SSSE3-LABEL: sext_16i8_to_4i32:
105 ; SSSE3:       # BB#0: # %entry
106 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
107 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
108 ; SSSE3-NEXT:    psrad $24, %xmm0
109 ; SSSE3-NEXT:    retq
110 ;
111 ; SSE41-LABEL: sext_16i8_to_4i32:
112 ; SSE41:       # BB#0: # %entry
113 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
114 ; SSE41-NEXT:    retq
115 ;
116 ; AVX-LABEL: sext_16i8_to_4i32:
117 ; AVX:       # BB#0: # %entry
118 ; AVX-NEXT:    vpmovsxbd %xmm0, %xmm0
119 ; AVX-NEXT:    retq
120 ;
121 ; X32-SSE41-LABEL: sext_16i8_to_4i32:
122 ; X32-SSE41:       # BB#0: # %entry
123 ; X32-SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
124 ; X32-SSE41-NEXT:    retl
125 entry:
126   %B = shufflevector <16 x i8> %A, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
127   %C = sext <4 x i8> %B to <4 x i32>
128   ret <4 x i32> %C
129 }
130
131 define <8 x i32> @sext_16i8_to_8i32(<16 x i8> %A) nounwind uwtable readnone ssp {
132 ; SSE2-LABEL: sext_16i8_to_8i32:
133 ; SSE2:       # BB#0: # %entry
134 ; 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]
135 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
136 ; SSE2-NEXT:    psrad $24, %xmm2
137 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
138 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
139 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
140 ; SSE2-NEXT:    psrad $24, %xmm1
141 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
142 ; SSE2-NEXT:    retq
143 ;
144 ; SSSE3-LABEL: sext_16i8_to_8i32:
145 ; SSSE3:       # BB#0: # %entry
146 ; 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]
147 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
148 ; SSSE3-NEXT:    psrad $24, %xmm2
149 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
150 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
151 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
152 ; SSSE3-NEXT:    psrad $24, %xmm1
153 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
154 ; SSSE3-NEXT:    retq
155 ;
156 ; SSE41-LABEL: sext_16i8_to_8i32:
157 ; SSE41:       # BB#0: # %entry
158 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm2
159 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
160 ; SSE41-NEXT:    pmovsxbd %xmm0, %xmm1
161 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
162 ; SSE41-NEXT:    retq
163 ;
164 ; AVX1-LABEL: sext_16i8_to_8i32:
165 ; AVX1:       # BB#0: # %entry
166 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm1
167 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
168 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
169 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
170 ; AVX1-NEXT:    retq
171 ;
172 ; AVX2-LABEL: sext_16i8_to_8i32:
173 ; AVX2:       # BB#0: # %entry
174 ; 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
175 ; AVX2-NEXT:    vpslld $24, %ymm0, %ymm0
176 ; AVX2-NEXT:    vpsrad $24, %ymm0, %ymm0
177 ; AVX2-NEXT:    retq
178 ;
179 ; X32-SSE41-LABEL: sext_16i8_to_8i32:
180 ; X32-SSE41:       # BB#0: # %entry
181 ; X32-SSE41-NEXT:    pmovsxbd %xmm0, %xmm2
182 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
183 ; X32-SSE41-NEXT:    pmovsxbd %xmm0, %xmm1
184 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
185 ; X32-SSE41-NEXT:    retl
186 entry:
187   %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>
188   %C = sext <8 x i8> %B to <8 x i32>
189   ret <8 x i32> %C
190 }
191
192 define <2 x i64> @sext_16i8_to_2i64(<16 x i8> %A) nounwind uwtable readnone ssp {
193 ; SSE2-LABEL: sext_16i8_to_2i64:
194 ; SSE2:       # BB#0: # %entry
195 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
196 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
197 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
198 ; SSE2-NEXT:    psrad $31, %xmm1
199 ; SSE2-NEXT:    psrad $24, %xmm0
200 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
201 ; SSE2-NEXT:    retq
202 ;
203 ; SSSE3-LABEL: sext_16i8_to_2i64:
204 ; SSSE3:       # BB#0: # %entry
205 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
206 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
207 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
208 ; SSSE3-NEXT:    psrad $31, %xmm1
209 ; SSSE3-NEXT:    psrad $24, %xmm0
210 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
211 ; SSSE3-NEXT:    retq
212 ;
213 ; SSE41-LABEL: sext_16i8_to_2i64:
214 ; SSE41:       # BB#0: # %entry
215 ; SSE41-NEXT:    pmovsxbq %xmm0, %xmm0
216 ; SSE41-NEXT:    retq
217 ;
218 ; AVX-LABEL: sext_16i8_to_2i64:
219 ; AVX:       # BB#0: # %entry
220 ; AVX-NEXT:    vpmovsxbq %xmm0, %xmm0
221 ; AVX-NEXT:    retq
222 ;
223 ; X32-SSE41-LABEL: sext_16i8_to_2i64:
224 ; X32-SSE41:       # BB#0: # %entry
225 ; X32-SSE41-NEXT:    pmovsxbq %xmm0, %xmm0
226 ; X32-SSE41-NEXT:    retl
227 entry:
228   %B = shufflevector <16 x i8> %A, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
229   %C = sext <2 x i8> %B to <2 x i64>
230   ret <2 x i64> %C
231 }
232
233 define <4 x i64> @sext_16i8_to_4i64(<16 x i8> %A) nounwind uwtable readnone ssp {
234 ; SSE2-LABEL: sext_16i8_to_4i64:
235 ; SSE2:       # BB#0: # %entry
236 ; 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]
237 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
238 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
239 ; SSE2-NEXT:    psrad $31, %xmm1
240 ; SSE2-NEXT:    psrad $24, %xmm2
241 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
242 ; SSE2-NEXT:    psrld $16, %xmm0
243 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
244 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
245 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
246 ; SSE2-NEXT:    psrad $31, %xmm0
247 ; SSE2-NEXT:    psrad $24, %xmm1
248 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
249 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
250 ; SSE2-NEXT:    retq
251 ;
252 ; SSSE3-LABEL: sext_16i8_to_4i64:
253 ; SSSE3:       # BB#0: # %entry
254 ; 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]
255 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
256 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
257 ; SSSE3-NEXT:    psrad $31, %xmm1
258 ; SSSE3-NEXT:    psrad $24, %xmm2
259 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
260 ; SSSE3-NEXT:    psrld $16, %xmm0
261 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
262 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
263 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
264 ; SSSE3-NEXT:    psrad $31, %xmm0
265 ; SSSE3-NEXT:    psrad $24, %xmm1
266 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
267 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
268 ; SSSE3-NEXT:    retq
269 ;
270 ; SSE41-LABEL: sext_16i8_to_4i64:
271 ; SSE41:       # BB#0: # %entry
272 ; SSE41-NEXT:    pmovsxbq %xmm0, %xmm2
273 ; SSE41-NEXT:    psrld $16, %xmm0
274 ; SSE41-NEXT:    pmovsxbq %xmm0, %xmm1
275 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
276 ; SSE41-NEXT:    retq
277 ;
278 ; AVX1-LABEL: sext_16i8_to_4i64:
279 ; AVX1:       # BB#0: # %entry
280 ; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm1
281 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
282 ; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm0
283 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
284 ; AVX1-NEXT:    retq
285 ;
286 ; AVX2-LABEL: sext_16i8_to_4i64:
287 ; AVX2:       # BB#0: # %entry
288 ; AVX2-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
289 ; AVX2-NEXT:    vpslld $24, %xmm0, %xmm0
290 ; AVX2-NEXT:    vpsrad $24, %xmm0, %xmm0
291 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
292 ; AVX2-NEXT:    retq
293 ;
294 ; X32-SSE41-LABEL: sext_16i8_to_4i64:
295 ; X32-SSE41:       # BB#0: # %entry
296 ; X32-SSE41-NEXT:    pmovsxbq %xmm0, %xmm2
297 ; X32-SSE41-NEXT:    psrld $16, %xmm0
298 ; X32-SSE41-NEXT:    pmovsxbq %xmm0, %xmm1
299 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
300 ; X32-SSE41-NEXT:    retl
301 entry:
302   %B = shufflevector <16 x i8> %A, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
303   %C = sext <4 x i8> %B to <4 x i64>
304   ret <4 x i64> %C
305 }
306
307 define <4 x i32> @sext_8i16_to_4i32(<8 x i16> %A) nounwind uwtable readnone ssp {
308 ; SSE2-LABEL: sext_8i16_to_4i32:
309 ; SSE2:       # BB#0: # %entry
310 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
311 ; SSE2-NEXT:    psrad $16, %xmm0
312 ; SSE2-NEXT:    retq
313 ;
314 ; SSSE3-LABEL: sext_8i16_to_4i32:
315 ; SSSE3:       # BB#0: # %entry
316 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
317 ; SSSE3-NEXT:    psrad $16, %xmm0
318 ; SSSE3-NEXT:    retq
319 ;
320 ; SSE41-LABEL: sext_8i16_to_4i32:
321 ; SSE41:       # BB#0: # %entry
322 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm0
323 ; SSE41-NEXT:    retq
324 ;
325 ; AVX-LABEL: sext_8i16_to_4i32:
326 ; AVX:       # BB#0: # %entry
327 ; AVX-NEXT:    vpmovsxwd %xmm0, %xmm0
328 ; AVX-NEXT:    retq
329 ;
330 ; X32-SSE41-LABEL: sext_8i16_to_4i32:
331 ; X32-SSE41:       # BB#0: # %entry
332 ; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm0
333 ; X32-SSE41-NEXT:    retl
334 entry:
335   %B = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
336   %C = sext <4 x i16> %B to <4 x i32>
337   ret <4 x i32> %C
338 }
339
340 define <8 x i32> @sext_8i16_to_8i32(<8 x i16> %A) nounwind uwtable readnone ssp {
341 ; SSE2-LABEL: sext_8i16_to_8i32:
342 ; SSE2:       # BB#0: # %entry
343 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
344 ; SSE2-NEXT:    psrad $16, %xmm2
345 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
346 ; SSE2-NEXT:    psrad $16, %xmm1
347 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
348 ; SSE2-NEXT:    retq
349 ;
350 ; SSSE3-LABEL: sext_8i16_to_8i32:
351 ; SSSE3:       # BB#0: # %entry
352 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
353 ; SSSE3-NEXT:    psrad $16, %xmm2
354 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
355 ; SSSE3-NEXT:    psrad $16, %xmm1
356 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
357 ; SSSE3-NEXT:    retq
358 ;
359 ; SSE41-LABEL: sext_8i16_to_8i32:
360 ; SSE41:       # BB#0: # %entry
361 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm2
362 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
363 ; SSE41-NEXT:    pmovsxwd %xmm0, %xmm1
364 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
365 ; SSE41-NEXT:    retq
366 ;
367 ; AVX1-LABEL: sext_8i16_to_8i32:
368 ; AVX1:       # BB#0: # %entry
369 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
370 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
371 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
372 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
373 ; AVX1-NEXT:    retq
374 ;
375 ; AVX2-LABEL: sext_8i16_to_8i32:
376 ; AVX2:       # BB#0: # %entry
377 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
378 ; AVX2-NEXT:    retq
379 ;
380 ; X32-SSE41-LABEL: sext_8i16_to_8i32:
381 ; X32-SSE41:       # BB#0: # %entry
382 ; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm2
383 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
384 ; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm1
385 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
386 ; X32-SSE41-NEXT:    retl
387 entry:
388   %B = sext <8 x i16> %A to <8 x i32>
389   ret <8 x i32> %B
390 }
391
392 define <2 x i64> @sext_8i16_to_2i64(<8 x i16> %A) nounwind uwtable readnone ssp {
393 ; SSE2-LABEL: sext_8i16_to_2i64:
394 ; SSE2:       # BB#0: # %entry
395 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
396 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
397 ; SSE2-NEXT:    psrad $31, %xmm1
398 ; SSE2-NEXT:    psrad $16, %xmm0
399 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
400 ; SSE2-NEXT:    retq
401 ;
402 ; SSSE3-LABEL: sext_8i16_to_2i64:
403 ; SSSE3:       # BB#0: # %entry
404 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
405 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
406 ; SSSE3-NEXT:    psrad $31, %xmm1
407 ; SSSE3-NEXT:    psrad $16, %xmm0
408 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
409 ; SSSE3-NEXT:    retq
410 ;
411 ; SSE41-LABEL: sext_8i16_to_2i64:
412 ; SSE41:       # BB#0: # %entry
413 ; SSE41-NEXT:    pmovsxwq %xmm0, %xmm0
414 ; SSE41-NEXT:    retq
415 ;
416 ; AVX-LABEL: sext_8i16_to_2i64:
417 ; AVX:       # BB#0: # %entry
418 ; AVX-NEXT:    vpmovsxwq %xmm0, %xmm0
419 ; AVX-NEXT:    retq
420 ;
421 ; X32-SSE41-LABEL: sext_8i16_to_2i64:
422 ; X32-SSE41:       # BB#0: # %entry
423 ; X32-SSE41-NEXT:    pmovsxwq %xmm0, %xmm0
424 ; X32-SSE41-NEXT:    retl
425 entry:
426   %B = shufflevector <8 x i16> %A, <8 x i16> undef, <2 x i32> <i32 0, i32 1>
427   %C = sext <2 x i16> %B to <2 x i64>
428   ret <2 x i64> %C
429 }
430
431 define <4 x i64> @sext_8i16_to_4i64(<8 x i16> %A) nounwind uwtable readnone ssp {
432 ; SSE2-LABEL: sext_8i16_to_4i64:
433 ; SSE2:       # BB#0: # %entry
434 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
435 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
436 ; SSE2-NEXT:    psrad $31, %xmm1
437 ; SSE2-NEXT:    psrad $16, %xmm2
438 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
439 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
440 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
441 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
442 ; SSE2-NEXT:    psrad $31, %xmm0
443 ; SSE2-NEXT:    psrad $16, %xmm1
444 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
445 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
446 ; SSE2-NEXT:    retq
447 ;
448 ; SSSE3-LABEL: sext_8i16_to_4i64:
449 ; SSSE3:       # BB#0: # %entry
450 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
451 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
452 ; SSSE3-NEXT:    psrad $31, %xmm1
453 ; SSSE3-NEXT:    psrad $16, %xmm2
454 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
455 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
456 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
457 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
458 ; SSSE3-NEXT:    psrad $31, %xmm0
459 ; SSSE3-NEXT:    psrad $16, %xmm1
460 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
461 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
462 ; SSSE3-NEXT:    retq
463 ;
464 ; SSE41-LABEL: sext_8i16_to_4i64:
465 ; SSE41:       # BB#0: # %entry
466 ; SSE41-NEXT:    pmovsxwq %xmm0, %xmm2
467 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
468 ; SSE41-NEXT:    pmovsxwq %xmm0, %xmm1
469 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
470 ; SSE41-NEXT:    retq
471 ;
472 ; AVX1-LABEL: sext_8i16_to_4i64:
473 ; AVX1:       # BB#0: # %entry
474 ; AVX1-NEXT:    vpmovsxwq %xmm0, %xmm1
475 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
476 ; AVX1-NEXT:    vpmovsxwq %xmm0, %xmm0
477 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
478 ; AVX1-NEXT:    retq
479 ;
480 ; AVX2-LABEL: sext_8i16_to_4i64:
481 ; AVX2:       # BB#0: # %entry
482 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
483 ; AVX2-NEXT:    vpslld $16, %xmm0, %xmm0
484 ; AVX2-NEXT:    vpsrad $16, %xmm0, %xmm0
485 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
486 ; AVX2-NEXT:    retq
487 ;
488 ; X32-SSE41-LABEL: sext_8i16_to_4i64:
489 ; X32-SSE41:       # BB#0: # %entry
490 ; X32-SSE41-NEXT:    pmovsxwq %xmm0, %xmm2
491 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
492 ; X32-SSE41-NEXT:    pmovsxwq %xmm0, %xmm1
493 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
494 ; X32-SSE41-NEXT:    retl
495 entry:
496   %B = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
497   %C = sext <4 x i16> %B to <4 x i64>
498   ret <4 x i64> %C
499 }
500
501 define <2 x i64> @sext_4i32_to_2i64(<4 x i32> %A) nounwind uwtable readnone ssp {
502 ; SSE2-LABEL: sext_4i32_to_2i64:
503 ; SSE2:       # BB#0: # %entry
504 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
505 ; SSE2-NEXT:    psrad $31, %xmm1
506 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
507 ; SSE2-NEXT:    retq
508 ;
509 ; SSSE3-LABEL: sext_4i32_to_2i64:
510 ; SSSE3:       # BB#0: # %entry
511 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
512 ; SSSE3-NEXT:    psrad $31, %xmm1
513 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
514 ; SSSE3-NEXT:    retq
515 ;
516 ; SSE41-LABEL: sext_4i32_to_2i64:
517 ; SSE41:       # BB#0: # %entry
518 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm0
519 ; SSE41-NEXT:    retq
520 ;
521 ; AVX-LABEL: sext_4i32_to_2i64:
522 ; AVX:       # BB#0: # %entry
523 ; AVX-NEXT:    vpmovsxdq %xmm0, %xmm0
524 ; AVX-NEXT:    retq
525 ;
526 ; X32-SSE41-LABEL: sext_4i32_to_2i64:
527 ; X32-SSE41:       # BB#0: # %entry
528 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm0
529 ; X32-SSE41-NEXT:    retl
530 entry:
531   %B = shufflevector <4 x i32> %A, <4 x i32> undef, <2 x i32> <i32 0, i32 1>
532   %C = sext <2 x i32> %B to <2 x i64>
533   ret <2 x i64> %C
534 }
535
536 define <4 x i64> @sext_4i32_to_4i64(<4 x i32> %A) nounwind uwtable readnone ssp {
537 ; SSE2-LABEL: sext_4i32_to_4i64:
538 ; SSE2:       # BB#0: # %entry
539 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
540 ; SSE2-NEXT:    psrad $31, %xmm2
541 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
542 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
543 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
544 ; SSE2-NEXT:    psrad $31, %xmm2
545 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
546 ; SSE2-NEXT:    retq
547 ;
548 ; SSSE3-LABEL: sext_4i32_to_4i64:
549 ; SSSE3:       # BB#0: # %entry
550 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
551 ; SSSE3-NEXT:    psrad $31, %xmm2
552 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
553 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
554 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
555 ; SSSE3-NEXT:    psrad $31, %xmm2
556 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
557 ; SSSE3-NEXT:    retq
558 ;
559 ; SSE41-LABEL: sext_4i32_to_4i64:
560 ; SSE41:       # BB#0: # %entry
561 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
562 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
563 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
564 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
565 ; SSE41-NEXT:    retq
566 ;
567 ; AVX1-LABEL: sext_4i32_to_4i64:
568 ; AVX1:       # BB#0: # %entry
569 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
570 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
571 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
572 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
573 ; AVX1-NEXT:    retq
574 ;
575 ; AVX2-LABEL: sext_4i32_to_4i64:
576 ; AVX2:       # BB#0: # %entry
577 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
578 ; AVX2-NEXT:    retq
579 ;
580 ; X32-SSE41-LABEL: sext_4i32_to_4i64:
581 ; X32-SSE41:       # BB#0: # %entry
582 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
583 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
584 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
585 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
586 ; X32-SSE41-NEXT:    retl
587 entry:
588   %B = sext <4 x i32> %A to <4 x i64>
589   ret <4 x i64> %B
590 }
591
592 define <2 x i64> @load_sext_2i1_to_2i64(<2 x i1> *%ptr) {
593 ; SSE-LABEL: load_sext_2i1_to_2i64:
594 ; SSE:       # BB#0: # %entry
595 ; SSE-NEXT:    movzbl (%rdi), %eax
596 ; SSE-NEXT:    movq %rax, %rcx
597 ; SSE-NEXT:    shlq $62, %rcx
598 ; SSE-NEXT:    sarq $63, %rcx
599 ; SSE-NEXT:    movd %rcx, %xmm1
600 ; SSE-NEXT:    shlq $63, %rax
601 ; SSE-NEXT:    sarq $63, %rax
602 ; SSE-NEXT:    movd %rax, %xmm0
603 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
604 ; SSE-NEXT:    retq
605 ;
606 ; AVX-LABEL: load_sext_2i1_to_2i64:
607 ; AVX:       # BB#0: # %entry
608 ; AVX-NEXT:    movzbl (%rdi), %eax
609 ; AVX-NEXT:    movq %rax, %rcx
610 ; AVX-NEXT:    shlq $62, %rcx
611 ; AVX-NEXT:    sarq $63, %rcx
612 ; AVX-NEXT:    vmovq %rcx, %xmm0
613 ; AVX-NEXT:    shlq $63, %rax
614 ; AVX-NEXT:    sarq $63, %rax
615 ; AVX-NEXT:    vmovq %rax, %xmm1
616 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
617 ; AVX-NEXT:    retq
618 ;
619 ; X32-SSE41-LABEL: load_sext_2i1_to_2i64:
620 ; X32-SSE41:       # BB#0: # %entry
621 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
622 ; X32-SSE41-NEXT:    movzbl (%eax), %eax
623 ; X32-SSE41-NEXT:    movl %eax, %ecx
624 ; X32-SSE41-NEXT:    shll $31, %ecx
625 ; X32-SSE41-NEXT:    sarl $31, %ecx
626 ; X32-SSE41-NEXT:    movd %ecx, %xmm0
627 ; X32-SSE41-NEXT:    pinsrd $1, %ecx, %xmm0
628 ; X32-SSE41-NEXT:    shll $30, %eax
629 ; X32-SSE41-NEXT:    sarl $31, %eax
630 ; X32-SSE41-NEXT:    pinsrd $2, %eax, %xmm0
631 ; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm0
632 ; X32-SSE41-NEXT:    retl
633 entry:
634  %X = load <2 x i1>, <2 x i1>* %ptr
635  %Y = sext <2 x i1> %X to <2 x i64>
636  ret <2 x i64> %Y
637 }
638
639 define <2 x i64> @load_sext_2i8_to_2i64(<2 x i8> *%ptr) {
640 ; SSE2-LABEL: load_sext_2i8_to_2i64:
641 ; SSE2:       # BB#0: # %entry
642 ; SSE2-NEXT:    movzwl (%rdi), %eax
643 ; SSE2-NEXT:    movd %eax, %xmm0
644 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
645 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
646 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
647 ; SSE2-NEXT:    psrad $31, %xmm1
648 ; SSE2-NEXT:    psrad $24, %xmm0
649 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
650 ; SSE2-NEXT:    retq
651 ;
652 ; SSSE3-LABEL: load_sext_2i8_to_2i64:
653 ; SSSE3:       # BB#0: # %entry
654 ; SSSE3-NEXT:    movzwl (%rdi), %eax
655 ; SSSE3-NEXT:    movd %eax, %xmm0
656 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
657 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
658 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
659 ; SSSE3-NEXT:    psrad $31, %xmm1
660 ; SSSE3-NEXT:    psrad $24, %xmm0
661 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
662 ; SSSE3-NEXT:    retq
663 ;
664 ; SSE41-LABEL: load_sext_2i8_to_2i64:
665 ; SSE41:       # BB#0: # %entry
666 ; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
667 ; SSE41-NEXT:    retq
668 ;
669 ; AVX-LABEL: load_sext_2i8_to_2i64:
670 ; AVX:       # BB#0: # %entry
671 ; AVX-NEXT:    vpmovsxbq (%rdi), %xmm0
672 ; AVX-NEXT:    retq
673 ;
674 ; X32-SSE41-LABEL: load_sext_2i8_to_2i64:
675 ; X32-SSE41:       # BB#0: # %entry
676 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
677 ; X32-SSE41-NEXT:    pmovsxbq (%eax), %xmm0
678 ; X32-SSE41-NEXT:    retl
679 entry:
680  %X = load <2 x i8>, <2 x i8>* %ptr
681  %Y = sext <2 x i8> %X to <2 x i64>
682  ret <2 x i64> %Y
683 }
684
685 define <4 x i32> @load_sext_4i1_to_4i32(<4 x i1> *%ptr) {
686 ; SSE2-LABEL: load_sext_4i1_to_4i32:
687 ; SSE2:       # BB#0: # %entry
688 ; SSE2-NEXT:    movzbl (%rdi), %eax
689 ; SSE2-NEXT:    movq %rax, %rcx
690 ; SSE2-NEXT:    shlq $60, %rcx
691 ; SSE2-NEXT:    sarq $63, %rcx
692 ; SSE2-NEXT:    movd %ecx, %xmm0
693 ; SSE2-NEXT:    movq %rax, %rcx
694 ; SSE2-NEXT:    shlq $62, %rcx
695 ; SSE2-NEXT:    sarq $63, %rcx
696 ; SSE2-NEXT:    movd %ecx, %xmm1
697 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
698 ; SSE2-NEXT:    movq %rax, %rcx
699 ; SSE2-NEXT:    shlq $61, %rcx
700 ; SSE2-NEXT:    sarq $63, %rcx
701 ; SSE2-NEXT:    movd %ecx, %xmm2
702 ; SSE2-NEXT:    shlq $63, %rax
703 ; SSE2-NEXT:    sarq $63, %rax
704 ; SSE2-NEXT:    movd %eax, %xmm0
705 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
706 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
707 ; SSE2-NEXT:    retq
708 ;
709 ; SSSE3-LABEL: load_sext_4i1_to_4i32:
710 ; SSSE3:       # BB#0: # %entry
711 ; SSSE3-NEXT:    movzbl (%rdi), %eax
712 ; SSSE3-NEXT:    movq %rax, %rcx
713 ; SSSE3-NEXT:    shlq $60, %rcx
714 ; SSSE3-NEXT:    sarq $63, %rcx
715 ; SSSE3-NEXT:    movd %ecx, %xmm0
716 ; SSSE3-NEXT:    movq %rax, %rcx
717 ; SSSE3-NEXT:    shlq $62, %rcx
718 ; SSSE3-NEXT:    sarq $63, %rcx
719 ; SSSE3-NEXT:    movd %ecx, %xmm1
720 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
721 ; SSSE3-NEXT:    movq %rax, %rcx
722 ; SSSE3-NEXT:    shlq $61, %rcx
723 ; SSSE3-NEXT:    sarq $63, %rcx
724 ; SSSE3-NEXT:    movd %ecx, %xmm2
725 ; SSSE3-NEXT:    shlq $63, %rax
726 ; SSSE3-NEXT:    sarq $63, %rax
727 ; SSSE3-NEXT:    movd %eax, %xmm0
728 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
729 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
730 ; SSSE3-NEXT:    retq
731 ;
732 ; SSE41-LABEL: load_sext_4i1_to_4i32:
733 ; SSE41:       # BB#0: # %entry
734 ; SSE41-NEXT:    movzbl (%rdi), %eax
735 ; SSE41-NEXT:    movq %rax, %rcx
736 ; SSE41-NEXT:    shlq $62, %rcx
737 ; SSE41-NEXT:    sarq $63, %rcx
738 ; SSE41-NEXT:    movq %rax, %rdx
739 ; SSE41-NEXT:    shlq $63, %rdx
740 ; SSE41-NEXT:    sarq $63, %rdx
741 ; SSE41-NEXT:    movd %edx, %xmm0
742 ; SSE41-NEXT:    pinsrd $1, %ecx, %xmm0
743 ; SSE41-NEXT:    movq %rax, %rcx
744 ; SSE41-NEXT:    shlq $61, %rcx
745 ; SSE41-NEXT:    sarq $63, %rcx
746 ; SSE41-NEXT:    pinsrd $2, %ecx, %xmm0
747 ; SSE41-NEXT:    shlq $60, %rax
748 ; SSE41-NEXT:    sarq $63, %rax
749 ; SSE41-NEXT:    pinsrd $3, %eax, %xmm0
750 ; SSE41-NEXT:    retq
751 ;
752 ; AVX-LABEL: load_sext_4i1_to_4i32:
753 ; AVX:       # BB#0: # %entry
754 ; AVX-NEXT:    movzbl (%rdi), %eax
755 ; AVX-NEXT:    movq %rax, %rcx
756 ; AVX-NEXT:    shlq $62, %rcx
757 ; AVX-NEXT:    sarq $63, %rcx
758 ; AVX-NEXT:    movq %rax, %rdx
759 ; AVX-NEXT:    shlq $63, %rdx
760 ; AVX-NEXT:    sarq $63, %rdx
761 ; AVX-NEXT:    vmovd %edx, %xmm0
762 ; AVX-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
763 ; AVX-NEXT:    movq %rax, %rcx
764 ; AVX-NEXT:    shlq $61, %rcx
765 ; AVX-NEXT:    sarq $63, %rcx
766 ; AVX-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
767 ; AVX-NEXT:    shlq $60, %rax
768 ; AVX-NEXT:    sarq $63, %rax
769 ; AVX-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
770 ; AVX-NEXT:    retq
771 ;
772 ; X32-SSE41-LABEL: load_sext_4i1_to_4i32:
773 ; X32-SSE41:       # BB#0: # %entry
774 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
775 ; X32-SSE41-NEXT:    movl (%eax), %eax
776 ; X32-SSE41-NEXT:    movl %eax, %ecx
777 ; X32-SSE41-NEXT:    shll $30, %ecx
778 ; X32-SSE41-NEXT:    sarl $31, %ecx
779 ; X32-SSE41-NEXT:    movl %eax, %edx
780 ; X32-SSE41-NEXT:    shll $31, %edx
781 ; X32-SSE41-NEXT:    sarl $31, %edx
782 ; X32-SSE41-NEXT:    movd %edx, %xmm0
783 ; X32-SSE41-NEXT:    pinsrd $1, %ecx, %xmm0
784 ; X32-SSE41-NEXT:    movl %eax, %ecx
785 ; X32-SSE41-NEXT:    shll $29, %ecx
786 ; X32-SSE41-NEXT:    sarl $31, %ecx
787 ; X32-SSE41-NEXT:    pinsrd $2, %ecx, %xmm0
788 ; X32-SSE41-NEXT:    shll $28, %eax
789 ; X32-SSE41-NEXT:    sarl $31, %eax
790 ; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm0
791 ; X32-SSE41-NEXT:    retl
792 entry:
793  %X = load <4 x i1>, <4 x i1>* %ptr
794  %Y = sext <4 x i1> %X to <4 x i32>
795  ret <4 x i32> %Y
796 }
797
798 define <4 x i32> @load_sext_4i8_to_4i32(<4 x i8> *%ptr) {
799 ; SSE2-LABEL: load_sext_4i8_to_4i32:
800 ; SSE2:       # BB#0: # %entry
801 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
802 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
803 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
804 ; SSE2-NEXT:    psrad $24, %xmm0
805 ; SSE2-NEXT:    retq
806 ;
807 ; SSSE3-LABEL: load_sext_4i8_to_4i32:
808 ; SSSE3:       # BB#0: # %entry
809 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
810 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
811 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
812 ; SSSE3-NEXT:    psrad $24, %xmm0
813 ; SSSE3-NEXT:    retq
814 ;
815 ; SSE41-LABEL: load_sext_4i8_to_4i32:
816 ; SSE41:       # BB#0: # %entry
817 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
818 ; SSE41-NEXT:    retq
819 ;
820 ; AVX-LABEL: load_sext_4i8_to_4i32:
821 ; AVX:       # BB#0: # %entry
822 ; AVX-NEXT:    vpmovsxbd (%rdi), %xmm0
823 ; AVX-NEXT:    retq
824 ;
825 ; X32-SSE41-LABEL: load_sext_4i8_to_4i32:
826 ; X32-SSE41:       # BB#0: # %entry
827 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
828 ; X32-SSE41-NEXT:    pmovsxbd (%eax), %xmm0
829 ; X32-SSE41-NEXT:    retl
830 entry:
831  %X = load <4 x i8>, <4 x i8>* %ptr
832  %Y = sext <4 x i8> %X to <4 x i32>
833  ret <4 x i32> %Y
834 }
835
836 define <4 x i64> @load_sext_4i1_to_4i64(<4 x i1> *%ptr) {
837 ; SSE2-LABEL: load_sext_4i1_to_4i64:
838 ; SSE2:       # BB#0: # %entry
839 ; SSE2-NEXT:    movzbl (%rdi), %eax
840 ; SSE2-NEXT:    movl %eax, %ecx
841 ; SSE2-NEXT:    shrl $3, %ecx
842 ; SSE2-NEXT:    andl $1, %ecx
843 ; SSE2-NEXT:    movd %ecx, %xmm0
844 ; SSE2-NEXT:    movl %eax, %ecx
845 ; SSE2-NEXT:    shrl %ecx
846 ; SSE2-NEXT:    andl $1, %ecx
847 ; SSE2-NEXT:    movd %ecx, %xmm1
848 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
849 ; SSE2-NEXT:    movl %eax, %ecx
850 ; SSE2-NEXT:    andl $1, %ecx
851 ; SSE2-NEXT:    movd %ecx, %xmm2
852 ; SSE2-NEXT:    shrl $2, %eax
853 ; SSE2-NEXT:    andl $1, %eax
854 ; SSE2-NEXT:    movd %eax, %xmm0
855 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
856 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
857 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,1,1,3]
858 ; SSE2-NEXT:    psllq $63, %xmm0
859 ; SSE2-NEXT:    psrad $31, %xmm0
860 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
861 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,1,3,3]
862 ; SSE2-NEXT:    psllq $63, %xmm1
863 ; SSE2-NEXT:    psrad $31, %xmm1
864 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
865 ; SSE2-NEXT:    retq
866 ;
867 ; SSSE3-LABEL: load_sext_4i1_to_4i64:
868 ; SSSE3:       # BB#0: # %entry
869 ; SSSE3-NEXT:    movzbl (%rdi), %eax
870 ; SSSE3-NEXT:    movl %eax, %ecx
871 ; SSSE3-NEXT:    shrl $3, %ecx
872 ; SSSE3-NEXT:    andl $1, %ecx
873 ; SSSE3-NEXT:    movd %ecx, %xmm0
874 ; SSSE3-NEXT:    movl %eax, %ecx
875 ; SSSE3-NEXT:    shrl %ecx
876 ; SSSE3-NEXT:    andl $1, %ecx
877 ; SSSE3-NEXT:    movd %ecx, %xmm1
878 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
879 ; SSSE3-NEXT:    movl %eax, %ecx
880 ; SSSE3-NEXT:    andl $1, %ecx
881 ; SSSE3-NEXT:    movd %ecx, %xmm2
882 ; SSSE3-NEXT:    shrl $2, %eax
883 ; SSSE3-NEXT:    andl $1, %eax
884 ; SSSE3-NEXT:    movd %eax, %xmm0
885 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
886 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
887 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,1,1,3]
888 ; SSSE3-NEXT:    psllq $63, %xmm0
889 ; SSSE3-NEXT:    psrad $31, %xmm0
890 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
891 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,1,3,3]
892 ; SSSE3-NEXT:    psllq $63, %xmm1
893 ; SSSE3-NEXT:    psrad $31, %xmm1
894 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
895 ; SSSE3-NEXT:    retq
896 ;
897 ; SSE41-LABEL: load_sext_4i1_to_4i64:
898 ; SSE41:       # BB#0: # %entry
899 ; SSE41-NEXT:    movzbl (%rdi), %eax
900 ; SSE41-NEXT:    movl %eax, %ecx
901 ; SSE41-NEXT:    shrl %ecx
902 ; SSE41-NEXT:    andl $1, %ecx
903 ; SSE41-NEXT:    movl %eax, %edx
904 ; SSE41-NEXT:    andl $1, %edx
905 ; SSE41-NEXT:    movd %edx, %xmm1
906 ; SSE41-NEXT:    pinsrd $1, %ecx, %xmm1
907 ; SSE41-NEXT:    movl %eax, %ecx
908 ; SSE41-NEXT:    shrl $2, %ecx
909 ; SSE41-NEXT:    andl $1, %ecx
910 ; SSE41-NEXT:    pinsrd $2, %ecx, %xmm1
911 ; SSE41-NEXT:    shrl $3, %eax
912 ; SSE41-NEXT:    andl $1, %eax
913 ; SSE41-NEXT:    pinsrd $3, %eax, %xmm1
914 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero
915 ; SSE41-NEXT:    psllq $63, %xmm0
916 ; SSE41-NEXT:    psrad $31, %xmm0
917 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
918 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
919 ; SSE41-NEXT:    psllq $63, %xmm1
920 ; SSE41-NEXT:    psrad $31, %xmm1
921 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
922 ; SSE41-NEXT:    retq
923 ;
924 ; AVX1-LABEL: load_sext_4i1_to_4i64:
925 ; AVX1:       # BB#0: # %entry
926 ; AVX1-NEXT:    movzbl (%rdi), %eax
927 ; AVX1-NEXT:    movq %rax, %rcx
928 ; AVX1-NEXT:    shlq $62, %rcx
929 ; AVX1-NEXT:    sarq $63, %rcx
930 ; AVX1-NEXT:    movq %rax, %rdx
931 ; AVX1-NEXT:    shlq $63, %rdx
932 ; AVX1-NEXT:    sarq $63, %rdx
933 ; AVX1-NEXT:    vmovd %edx, %xmm0
934 ; AVX1-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
935 ; AVX1-NEXT:    movq %rax, %rcx
936 ; AVX1-NEXT:    shlq $61, %rcx
937 ; AVX1-NEXT:    sarq $63, %rcx
938 ; AVX1-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
939 ; AVX1-NEXT:    shlq $60, %rax
940 ; AVX1-NEXT:    sarq $63, %rax
941 ; AVX1-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
942 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
943 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
944 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
945 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
946 ; AVX1-NEXT:    retq
947 ;
948 ; AVX2-LABEL: load_sext_4i1_to_4i64:
949 ; AVX2:       # BB#0: # %entry
950 ; AVX2-NEXT:    movzbl (%rdi), %eax
951 ; AVX2-NEXT:    movq %rax, %rcx
952 ; AVX2-NEXT:    shlq $60, %rcx
953 ; AVX2-NEXT:    sarq $63, %rcx
954 ; AVX2-NEXT:    vmovq %rcx, %xmm0
955 ; AVX2-NEXT:    movq %rax, %rcx
956 ; AVX2-NEXT:    shlq $61, %rcx
957 ; AVX2-NEXT:    sarq $63, %rcx
958 ; AVX2-NEXT:    vmovq %rcx, %xmm1
959 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
960 ; AVX2-NEXT:    movq %rax, %rcx
961 ; AVX2-NEXT:    shlq $62, %rcx
962 ; AVX2-NEXT:    sarq $63, %rcx
963 ; AVX2-NEXT:    vmovq %rcx, %xmm1
964 ; AVX2-NEXT:    shlq $63, %rax
965 ; AVX2-NEXT:    sarq $63, %rax
966 ; AVX2-NEXT:    vmovq %rax, %xmm2
967 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
968 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
969 ; AVX2-NEXT:    retq
970 ;
971 ; X32-SSE41-LABEL: load_sext_4i1_to_4i64:
972 ; X32-SSE41:       # BB#0: # %entry
973 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
974 ; X32-SSE41-NEXT:    movzbl (%eax), %eax
975 ; X32-SSE41-NEXT:    movl %eax, %ecx
976 ; X32-SSE41-NEXT:    shrl %ecx
977 ; X32-SSE41-NEXT:    andl $1, %ecx
978 ; X32-SSE41-NEXT:    movl %eax, %edx
979 ; X32-SSE41-NEXT:    andl $1, %edx
980 ; X32-SSE41-NEXT:    movd %edx, %xmm1
981 ; X32-SSE41-NEXT:    pinsrd $1, %ecx, %xmm1
982 ; X32-SSE41-NEXT:    movl %eax, %ecx
983 ; X32-SSE41-NEXT:    shrl $2, %ecx
984 ; X32-SSE41-NEXT:    andl $1, %ecx
985 ; X32-SSE41-NEXT:    pinsrd $2, %ecx, %xmm1
986 ; X32-SSE41-NEXT:    shrl $3, %eax
987 ; X32-SSE41-NEXT:    andl $1, %eax
988 ; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm1
989 ; X32-SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero
990 ; X32-SSE41-NEXT:    psllq $63, %xmm0
991 ; X32-SSE41-NEXT:    psrad $31, %xmm0
992 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
993 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
994 ; X32-SSE41-NEXT:    psllq $63, %xmm1
995 ; X32-SSE41-NEXT:    psrad $31, %xmm1
996 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
997 ; X32-SSE41-NEXT:    retl
998 entry:
999  %X = load <4 x i1>, <4 x i1>* %ptr
1000  %Y = sext <4 x i1> %X to <4 x i64>
1001  ret <4 x i64> %Y
1002 }
1003
1004 define <4 x i64> @load_sext_4i8_to_4i64(<4 x i8> *%ptr) {
1005 ; SSE2-LABEL: load_sext_4i8_to_4i64:
1006 ; SSE2:       # BB#0: # %entry
1007 ; SSE2-NEXT:    movsbq 1(%rdi), %rax
1008 ; SSE2-NEXT:    movd %rax, %xmm1
1009 ; SSE2-NEXT:    movsbq (%rdi), %rax
1010 ; SSE2-NEXT:    movd %rax, %xmm0
1011 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1012 ; SSE2-NEXT:    movsbq 3(%rdi), %rax
1013 ; SSE2-NEXT:    movd %rax, %xmm2
1014 ; SSE2-NEXT:    movsbq 2(%rdi), %rax
1015 ; SSE2-NEXT:    movd %rax, %xmm1
1016 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1017 ; SSE2-NEXT:    retq
1018 ;
1019 ; SSSE3-LABEL: load_sext_4i8_to_4i64:
1020 ; SSSE3:       # BB#0: # %entry
1021 ; SSSE3-NEXT:    movsbq 1(%rdi), %rax
1022 ; SSSE3-NEXT:    movd %rax, %xmm1
1023 ; SSSE3-NEXT:    movsbq (%rdi), %rax
1024 ; SSSE3-NEXT:    movd %rax, %xmm0
1025 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1026 ; SSSE3-NEXT:    movsbq 3(%rdi), %rax
1027 ; SSSE3-NEXT:    movd %rax, %xmm2
1028 ; SSSE3-NEXT:    movsbq 2(%rdi), %rax
1029 ; SSSE3-NEXT:    movd %rax, %xmm1
1030 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1031 ; SSSE3-NEXT:    retq
1032 ;
1033 ; SSE41-LABEL: load_sext_4i8_to_4i64:
1034 ; SSE41:       # BB#0: # %entry
1035 ; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
1036 ; SSE41-NEXT:    pmovsxbq 2(%rdi), %xmm1
1037 ; SSE41-NEXT:    retq
1038 ;
1039 ; AVX1-LABEL: load_sext_4i8_to_4i64:
1040 ; AVX1:       # BB#0: # %entry
1041 ; AVX1-NEXT:    vpmovsxbd (%rdi), %xmm0
1042 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
1043 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1044 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
1045 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1046 ; AVX1-NEXT:    retq
1047 ;
1048 ; AVX2-LABEL: load_sext_4i8_to_4i64:
1049 ; AVX2:       # BB#0: # %entry
1050 ; AVX2-NEXT:    vpmovsxbq (%rdi), %ymm0
1051 ; AVX2-NEXT:    retq
1052 ;
1053 ; X32-SSE41-LABEL: load_sext_4i8_to_4i64:
1054 ; X32-SSE41:       # BB#0: # %entry
1055 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1056 ; X32-SSE41-NEXT:    pmovsxbq (%eax), %xmm0
1057 ; X32-SSE41-NEXT:    pmovsxbq 2(%eax), %xmm1
1058 ; X32-SSE41-NEXT:    retl
1059 entry:
1060  %X = load <4 x i8>, <4 x i8>* %ptr
1061  %Y = sext <4 x i8> %X to <4 x i64>
1062  ret <4 x i64> %Y
1063 }
1064
1065 define <8 x i16> @load_sext_8i1_to_8i16(<8 x i1> *%ptr) {
1066 ; SSE2-LABEL: load_sext_8i1_to_8i16:
1067 ; SSE2:       # BB#0: # %entry
1068 ; SSE2-NEXT:    movsbq (%rdi), %rax
1069 ; SSE2-NEXT:    movq %rax, %rcx
1070 ; SSE2-NEXT:    shrq $7, %rcx
1071 ; SSE2-NEXT:    movd %ecx, %xmm0
1072 ; SSE2-NEXT:    movq %rax, %rcx
1073 ; SSE2-NEXT:    shlq $60, %rcx
1074 ; SSE2-NEXT:    sarq $63, %rcx
1075 ; SSE2-NEXT:    movd %ecx, %xmm2
1076 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1077 ; SSE2-NEXT:    movq %rax, %rcx
1078 ; SSE2-NEXT:    shlq $58, %rcx
1079 ; SSE2-NEXT:    sarq $63, %rcx
1080 ; SSE2-NEXT:    movd %ecx, %xmm0
1081 ; SSE2-NEXT:    movq %rax, %rcx
1082 ; SSE2-NEXT:    shlq $62, %rcx
1083 ; SSE2-NEXT:    sarq $63, %rcx
1084 ; SSE2-NEXT:    movd %ecx, %xmm1
1085 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1086 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1087 ; SSE2-NEXT:    movq %rax, %rcx
1088 ; SSE2-NEXT:    shlq $57, %rcx
1089 ; SSE2-NEXT:    sarq $63, %rcx
1090 ; SSE2-NEXT:    movd %ecx, %xmm0
1091 ; SSE2-NEXT:    movq %rax, %rcx
1092 ; SSE2-NEXT:    shlq $61, %rcx
1093 ; SSE2-NEXT:    sarq $63, %rcx
1094 ; SSE2-NEXT:    movd %ecx, %xmm2
1095 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1096 ; SSE2-NEXT:    movq %rax, %rcx
1097 ; SSE2-NEXT:    shlq $59, %rcx
1098 ; SSE2-NEXT:    sarq $63, %rcx
1099 ; SSE2-NEXT:    movd %ecx, %xmm3
1100 ; SSE2-NEXT:    shlq $63, %rax
1101 ; SSE2-NEXT:    sarq $63, %rax
1102 ; SSE2-NEXT:    movd %eax, %xmm0
1103 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
1104 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1105 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1106 ; SSE2-NEXT:    retq
1107 ;
1108 ; SSSE3-LABEL: load_sext_8i1_to_8i16:
1109 ; SSSE3:       # BB#0: # %entry
1110 ; SSSE3-NEXT:    movsbq (%rdi), %rax
1111 ; SSSE3-NEXT:    movq %rax, %rcx
1112 ; SSSE3-NEXT:    shrq $7, %rcx
1113 ; SSSE3-NEXT:    movd %ecx, %xmm0
1114 ; SSSE3-NEXT:    movq %rax, %rcx
1115 ; SSSE3-NEXT:    shlq $60, %rcx
1116 ; SSSE3-NEXT:    sarq $63, %rcx
1117 ; SSSE3-NEXT:    movd %ecx, %xmm2
1118 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1119 ; SSSE3-NEXT:    movq %rax, %rcx
1120 ; SSSE3-NEXT:    shlq $58, %rcx
1121 ; SSSE3-NEXT:    sarq $63, %rcx
1122 ; SSSE3-NEXT:    movd %ecx, %xmm0
1123 ; SSSE3-NEXT:    movq %rax, %rcx
1124 ; SSSE3-NEXT:    shlq $62, %rcx
1125 ; SSSE3-NEXT:    sarq $63, %rcx
1126 ; SSSE3-NEXT:    movd %ecx, %xmm1
1127 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1128 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1129 ; SSSE3-NEXT:    movq %rax, %rcx
1130 ; SSSE3-NEXT:    shlq $57, %rcx
1131 ; SSSE3-NEXT:    sarq $63, %rcx
1132 ; SSSE3-NEXT:    movd %ecx, %xmm0
1133 ; SSSE3-NEXT:    movq %rax, %rcx
1134 ; SSSE3-NEXT:    shlq $61, %rcx
1135 ; SSSE3-NEXT:    sarq $63, %rcx
1136 ; SSSE3-NEXT:    movd %ecx, %xmm2
1137 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1138 ; SSSE3-NEXT:    movq %rax, %rcx
1139 ; SSSE3-NEXT:    shlq $59, %rcx
1140 ; SSSE3-NEXT:    sarq $63, %rcx
1141 ; SSSE3-NEXT:    movd %ecx, %xmm3
1142 ; SSSE3-NEXT:    shlq $63, %rax
1143 ; SSSE3-NEXT:    sarq $63, %rax
1144 ; SSSE3-NEXT:    movd %eax, %xmm0
1145 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
1146 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1147 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1148 ; SSSE3-NEXT:    retq
1149 ;
1150 ; SSE41-LABEL: load_sext_8i1_to_8i16:
1151 ; SSE41:       # BB#0: # %entry
1152 ; SSE41-NEXT:    movsbq (%rdi), %rax
1153 ; SSE41-NEXT:    movq %rax, %rcx
1154 ; SSE41-NEXT:    shlq $62, %rcx
1155 ; SSE41-NEXT:    sarq $63, %rcx
1156 ; SSE41-NEXT:    movq %rax, %rdx
1157 ; SSE41-NEXT:    shlq $63, %rdx
1158 ; SSE41-NEXT:    sarq $63, %rdx
1159 ; SSE41-NEXT:    movd %edx, %xmm0
1160 ; SSE41-NEXT:    pinsrw $1, %ecx, %xmm0
1161 ; SSE41-NEXT:    movq %rax, %rcx
1162 ; SSE41-NEXT:    shlq $61, %rcx
1163 ; SSE41-NEXT:    sarq $63, %rcx
1164 ; SSE41-NEXT:    pinsrw $2, %ecx, %xmm0
1165 ; SSE41-NEXT:    movq %rax, %rcx
1166 ; SSE41-NEXT:    shlq $60, %rcx
1167 ; SSE41-NEXT:    sarq $63, %rcx
1168 ; SSE41-NEXT:    pinsrw $3, %ecx, %xmm0
1169 ; SSE41-NEXT:    movq %rax, %rcx
1170 ; SSE41-NEXT:    shlq $59, %rcx
1171 ; SSE41-NEXT:    sarq $63, %rcx
1172 ; SSE41-NEXT:    pinsrw $4, %ecx, %xmm0
1173 ; SSE41-NEXT:    movq %rax, %rcx
1174 ; SSE41-NEXT:    shlq $58, %rcx
1175 ; SSE41-NEXT:    sarq $63, %rcx
1176 ; SSE41-NEXT:    pinsrw $5, %ecx, %xmm0
1177 ; SSE41-NEXT:    movq %rax, %rcx
1178 ; SSE41-NEXT:    shlq $57, %rcx
1179 ; SSE41-NEXT:    sarq $63, %rcx
1180 ; SSE41-NEXT:    pinsrw $6, %ecx, %xmm0
1181 ; SSE41-NEXT:    shrq $7, %rax
1182 ; SSE41-NEXT:    pinsrw $7, %eax, %xmm0
1183 ; SSE41-NEXT:    retq
1184 ;
1185 ; AVX-LABEL: load_sext_8i1_to_8i16:
1186 ; AVX:       # BB#0: # %entry
1187 ; AVX-NEXT:    movsbq (%rdi), %rax
1188 ; AVX-NEXT:    movq %rax, %rcx
1189 ; AVX-NEXT:    shlq $62, %rcx
1190 ; AVX-NEXT:    sarq $63, %rcx
1191 ; AVX-NEXT:    movq %rax, %rdx
1192 ; AVX-NEXT:    shlq $63, %rdx
1193 ; AVX-NEXT:    sarq $63, %rdx
1194 ; AVX-NEXT:    vmovd %edx, %xmm0
1195 ; AVX-NEXT:    vpinsrw $1, %ecx, %xmm0, %xmm0
1196 ; AVX-NEXT:    movq %rax, %rcx
1197 ; AVX-NEXT:    shlq $61, %rcx
1198 ; AVX-NEXT:    sarq $63, %rcx
1199 ; AVX-NEXT:    vpinsrw $2, %ecx, %xmm0, %xmm0
1200 ; AVX-NEXT:    movq %rax, %rcx
1201 ; AVX-NEXT:    shlq $60, %rcx
1202 ; AVX-NEXT:    sarq $63, %rcx
1203 ; AVX-NEXT:    vpinsrw $3, %ecx, %xmm0, %xmm0
1204 ; AVX-NEXT:    movq %rax, %rcx
1205 ; AVX-NEXT:    shlq $59, %rcx
1206 ; AVX-NEXT:    sarq $63, %rcx
1207 ; AVX-NEXT:    vpinsrw $4, %ecx, %xmm0, %xmm0
1208 ; AVX-NEXT:    movq %rax, %rcx
1209 ; AVX-NEXT:    shlq $58, %rcx
1210 ; AVX-NEXT:    sarq $63, %rcx
1211 ; AVX-NEXT:    vpinsrw $5, %ecx, %xmm0, %xmm0
1212 ; AVX-NEXT:    movq %rax, %rcx
1213 ; AVX-NEXT:    shlq $57, %rcx
1214 ; AVX-NEXT:    sarq $63, %rcx
1215 ; AVX-NEXT:    vpinsrw $6, %ecx, %xmm0, %xmm0
1216 ; AVX-NEXT:    shrq $7, %rax
1217 ; AVX-NEXT:    vpinsrw $7, %eax, %xmm0, %xmm0
1218 ; AVX-NEXT:    retq
1219 ;
1220 ; X32-SSE41-LABEL: load_sext_8i1_to_8i16:
1221 ; X32-SSE41:       # BB#0: # %entry
1222 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1223 ; X32-SSE41-NEXT:    movsbl (%eax), %eax
1224 ; X32-SSE41-NEXT:    movl %eax, %ecx
1225 ; X32-SSE41-NEXT:    shll $30, %ecx
1226 ; X32-SSE41-NEXT:    sarl $31, %ecx
1227 ; X32-SSE41-NEXT:    movl %eax, %edx
1228 ; X32-SSE41-NEXT:    shll $31, %edx
1229 ; X32-SSE41-NEXT:    sarl $31, %edx
1230 ; X32-SSE41-NEXT:    movd %edx, %xmm0
1231 ; X32-SSE41-NEXT:    pinsrw $1, %ecx, %xmm0
1232 ; X32-SSE41-NEXT:    movl %eax, %ecx
1233 ; X32-SSE41-NEXT:    shll $29, %ecx
1234 ; X32-SSE41-NEXT:    sarl $31, %ecx
1235 ; X32-SSE41-NEXT:    pinsrw $2, %ecx, %xmm0
1236 ; X32-SSE41-NEXT:    movl %eax, %ecx
1237 ; X32-SSE41-NEXT:    shll $28, %ecx
1238 ; X32-SSE41-NEXT:    sarl $31, %ecx
1239 ; X32-SSE41-NEXT:    pinsrw $3, %ecx, %xmm0
1240 ; X32-SSE41-NEXT:    movl %eax, %ecx
1241 ; X32-SSE41-NEXT:    shll $27, %ecx
1242 ; X32-SSE41-NEXT:    sarl $31, %ecx
1243 ; X32-SSE41-NEXT:    pinsrw $4, %ecx, %xmm0
1244 ; X32-SSE41-NEXT:    movl %eax, %ecx
1245 ; X32-SSE41-NEXT:    shll $26, %ecx
1246 ; X32-SSE41-NEXT:    sarl $31, %ecx
1247 ; X32-SSE41-NEXT:    pinsrw $5, %ecx, %xmm0
1248 ; X32-SSE41-NEXT:    movl %eax, %ecx
1249 ; X32-SSE41-NEXT:    shll $25, %ecx
1250 ; X32-SSE41-NEXT:    sarl $31, %ecx
1251 ; X32-SSE41-NEXT:    pinsrw $6, %ecx, %xmm0
1252 ; X32-SSE41-NEXT:    shrl $7, %eax
1253 ; X32-SSE41-NEXT:    pinsrw $7, %eax, %xmm0
1254 ; X32-SSE41-NEXT:    retl
1255 entry:
1256  %X = load <8 x i1>, <8 x i1>* %ptr
1257  %Y = sext <8 x i1> %X to <8 x i16>
1258  ret <8 x i16> %Y
1259 }
1260
1261 define <8 x i16> @load_sext_8i8_to_8i16(<8 x i8> *%ptr) {
1262 ; SSE2-LABEL: load_sext_8i8_to_8i16:
1263 ; SSE2:       # BB#0: # %entry
1264 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
1265 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1266 ; SSE2-NEXT:    psraw $8, %xmm0
1267 ; SSE2-NEXT:    retq
1268 ;
1269 ; SSSE3-LABEL: load_sext_8i8_to_8i16:
1270 ; SSSE3:       # BB#0: # %entry
1271 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
1272 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1273 ; SSSE3-NEXT:    psraw $8, %xmm0
1274 ; SSSE3-NEXT:    retq
1275 ;
1276 ; SSE41-LABEL: load_sext_8i8_to_8i16:
1277 ; SSE41:       # BB#0: # %entry
1278 ; SSE41-NEXT:    pmovsxbw (%rdi), %xmm0
1279 ; SSE41-NEXT:    retq
1280 ;
1281 ; AVX-LABEL: load_sext_8i8_to_8i16:
1282 ; AVX:       # BB#0: # %entry
1283 ; AVX-NEXT:    vpmovsxbw (%rdi), %xmm0
1284 ; AVX-NEXT:    retq
1285 ;
1286 ; X32-SSE41-LABEL: load_sext_8i8_to_8i16:
1287 ; X32-SSE41:       # BB#0: # %entry
1288 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1289 ; X32-SSE41-NEXT:    pmovsxbw (%eax), %xmm0
1290 ; X32-SSE41-NEXT:    retl
1291 entry:
1292  %X = load <8 x i8>, <8 x i8>* %ptr
1293  %Y = sext <8 x i8> %X to <8 x i16>
1294  ret <8 x i16> %Y
1295 }
1296
1297 define <8 x i32> @load_sext_8i1_to_8i32(<8 x i1> *%ptr) {
1298 ; SSE2-LABEL: load_sext_8i1_to_8i32:
1299 ; SSE2:       # BB#0: # %entry
1300 ; SSE2-NEXT:    movzbl (%rdi), %eax
1301 ; SSE2-NEXT:    movl %eax, %ecx
1302 ; SSE2-NEXT:    shrl $6, %ecx
1303 ; SSE2-NEXT:    andl $1, %ecx
1304 ; SSE2-NEXT:    movd %ecx, %xmm0
1305 ; SSE2-NEXT:    movl %eax, %ecx
1306 ; SSE2-NEXT:    shrl $2, %ecx
1307 ; SSE2-NEXT:    andl $1, %ecx
1308 ; SSE2-NEXT:    movd %ecx, %xmm2
1309 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1310 ; SSE2-NEXT:    movl %eax, %ecx
1311 ; SSE2-NEXT:    andl $1, %ecx
1312 ; SSE2-NEXT:    movd %ecx, %xmm1
1313 ; SSE2-NEXT:    movl %eax, %ecx
1314 ; SSE2-NEXT:    shrl $4, %ecx
1315 ; SSE2-NEXT:    andl $1, %ecx
1316 ; SSE2-NEXT:    movd %ecx, %xmm0
1317 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1318 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1319 ; SSE2-NEXT:    movl %eax, %ecx
1320 ; SSE2-NEXT:    shrl $5, %ecx
1321 ; SSE2-NEXT:    andl $1, %ecx
1322 ; SSE2-NEXT:    movd %ecx, %xmm0
1323 ; SSE2-NEXT:    movl %eax, %ecx
1324 ; SSE2-NEXT:    shrl %ecx
1325 ; SSE2-NEXT:    andl $1, %ecx
1326 ; SSE2-NEXT:    movd %ecx, %xmm2
1327 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1328 ; SSE2-NEXT:    movl %eax, %ecx
1329 ; SSE2-NEXT:    shrl $3, %ecx
1330 ; SSE2-NEXT:    andl $1, %ecx
1331 ; SSE2-NEXT:    movd %ecx, %xmm0
1332 ; SSE2-NEXT:    shrl $7, %eax
1333 ; SSE2-NEXT:    movzwl %ax, %eax
1334 ; SSE2-NEXT:    movd %eax, %xmm3
1335 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
1336 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1337 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1338 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1339 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1340 ; SSE2-NEXT:    pslld $31, %xmm0
1341 ; SSE2-NEXT:    psrad $31, %xmm0
1342 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1343 ; SSE2-NEXT:    pslld $31, %xmm1
1344 ; SSE2-NEXT:    psrad $31, %xmm1
1345 ; SSE2-NEXT:    retq
1346 ;
1347 ; SSSE3-LABEL: load_sext_8i1_to_8i32:
1348 ; SSSE3:       # BB#0: # %entry
1349 ; SSSE3-NEXT:    movzbl (%rdi), %eax
1350 ; SSSE3-NEXT:    movl %eax, %ecx
1351 ; SSSE3-NEXT:    shrl $6, %ecx
1352 ; SSSE3-NEXT:    andl $1, %ecx
1353 ; SSSE3-NEXT:    movd %ecx, %xmm0
1354 ; SSSE3-NEXT:    movl %eax, %ecx
1355 ; SSSE3-NEXT:    shrl $2, %ecx
1356 ; SSSE3-NEXT:    andl $1, %ecx
1357 ; SSSE3-NEXT:    movd %ecx, %xmm2
1358 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1359 ; SSSE3-NEXT:    movl %eax, %ecx
1360 ; SSSE3-NEXT:    andl $1, %ecx
1361 ; SSSE3-NEXT:    movd %ecx, %xmm1
1362 ; SSSE3-NEXT:    movl %eax, %ecx
1363 ; SSSE3-NEXT:    shrl $4, %ecx
1364 ; SSSE3-NEXT:    andl $1, %ecx
1365 ; SSSE3-NEXT:    movd %ecx, %xmm0
1366 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1367 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1368 ; SSSE3-NEXT:    movl %eax, %ecx
1369 ; SSSE3-NEXT:    shrl $5, %ecx
1370 ; SSSE3-NEXT:    andl $1, %ecx
1371 ; SSSE3-NEXT:    movd %ecx, %xmm0
1372 ; SSSE3-NEXT:    movl %eax, %ecx
1373 ; SSSE3-NEXT:    shrl %ecx
1374 ; SSSE3-NEXT:    andl $1, %ecx
1375 ; SSSE3-NEXT:    movd %ecx, %xmm2
1376 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1377 ; SSSE3-NEXT:    movl %eax, %ecx
1378 ; SSSE3-NEXT:    shrl $3, %ecx
1379 ; SSSE3-NEXT:    andl $1, %ecx
1380 ; SSSE3-NEXT:    movd %ecx, %xmm0
1381 ; SSSE3-NEXT:    shrl $7, %eax
1382 ; SSSE3-NEXT:    movzwl %ax, %eax
1383 ; SSSE3-NEXT:    movd %eax, %xmm3
1384 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
1385 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1386 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1387 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1388 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1389 ; SSSE3-NEXT:    pslld $31, %xmm0
1390 ; SSSE3-NEXT:    psrad $31, %xmm0
1391 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1392 ; SSSE3-NEXT:    pslld $31, %xmm1
1393 ; SSSE3-NEXT:    psrad $31, %xmm1
1394 ; SSSE3-NEXT:    retq
1395 ;
1396 ; SSE41-LABEL: load_sext_8i1_to_8i32:
1397 ; SSE41:       # BB#0: # %entry
1398 ; SSE41-NEXT:    movzbl (%rdi), %eax
1399 ; SSE41-NEXT:    movl %eax, %ecx
1400 ; SSE41-NEXT:    shrl %ecx
1401 ; SSE41-NEXT:    andl $1, %ecx
1402 ; SSE41-NEXT:    movl %eax, %edx
1403 ; SSE41-NEXT:    andl $1, %edx
1404 ; SSE41-NEXT:    movd %edx, %xmm1
1405 ; SSE41-NEXT:    pinsrw $1, %ecx, %xmm1
1406 ; SSE41-NEXT:    movl %eax, %ecx
1407 ; SSE41-NEXT:    shrl $2, %ecx
1408 ; SSE41-NEXT:    andl $1, %ecx
1409 ; SSE41-NEXT:    pinsrw $2, %ecx, %xmm1
1410 ; SSE41-NEXT:    movl %eax, %ecx
1411 ; SSE41-NEXT:    shrl $3, %ecx
1412 ; SSE41-NEXT:    andl $1, %ecx
1413 ; SSE41-NEXT:    pinsrw $3, %ecx, %xmm1
1414 ; SSE41-NEXT:    movl %eax, %ecx
1415 ; SSE41-NEXT:    shrl $4, %ecx
1416 ; SSE41-NEXT:    andl $1, %ecx
1417 ; SSE41-NEXT:    pinsrw $4, %ecx, %xmm1
1418 ; SSE41-NEXT:    movl %eax, %ecx
1419 ; SSE41-NEXT:    shrl $5, %ecx
1420 ; SSE41-NEXT:    andl $1, %ecx
1421 ; SSE41-NEXT:    pinsrw $5, %ecx, %xmm1
1422 ; SSE41-NEXT:    movl %eax, %ecx
1423 ; SSE41-NEXT:    shrl $6, %ecx
1424 ; SSE41-NEXT:    andl $1, %ecx
1425 ; SSE41-NEXT:    pinsrw $6, %ecx, %xmm1
1426 ; SSE41-NEXT:    shrl $7, %eax
1427 ; SSE41-NEXT:    movzwl %ax, %eax
1428 ; SSE41-NEXT:    pinsrw $7, %eax, %xmm1
1429 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
1430 ; SSE41-NEXT:    pslld $31, %xmm0
1431 ; SSE41-NEXT:    psrad $31, %xmm0
1432 ; SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1433 ; SSE41-NEXT:    pslld $31, %xmm1
1434 ; SSE41-NEXT:    psrad $31, %xmm1
1435 ; SSE41-NEXT:    retq
1436 ;
1437 ; AVX1-LABEL: load_sext_8i1_to_8i32:
1438 ; AVX1:       # BB#0: # %entry
1439 ; AVX1-NEXT:    movsbq (%rdi), %rax
1440 ; AVX1-NEXT:    movq %rax, %rcx
1441 ; AVX1-NEXT:    shlq $58, %rcx
1442 ; AVX1-NEXT:    sarq $63, %rcx
1443 ; AVX1-NEXT:    movq %rax, %rdx
1444 ; AVX1-NEXT:    shlq $59, %rdx
1445 ; AVX1-NEXT:    sarq $63, %rdx
1446 ; AVX1-NEXT:    vmovd %edx, %xmm0
1447 ; AVX1-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
1448 ; AVX1-NEXT:    movq %rax, %rcx
1449 ; AVX1-NEXT:    shlq $57, %rcx
1450 ; AVX1-NEXT:    sarq $63, %rcx
1451 ; AVX1-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
1452 ; AVX1-NEXT:    movq %rax, %rcx
1453 ; AVX1-NEXT:    shrq $7, %rcx
1454 ; AVX1-NEXT:    vpinsrd $3, %ecx, %xmm0, %xmm0
1455 ; AVX1-NEXT:    movq %rax, %rcx
1456 ; AVX1-NEXT:    shlq $62, %rcx
1457 ; AVX1-NEXT:    sarq $63, %rcx
1458 ; AVX1-NEXT:    movq %rax, %rdx
1459 ; AVX1-NEXT:    shlq $63, %rdx
1460 ; AVX1-NEXT:    sarq $63, %rdx
1461 ; AVX1-NEXT:    vmovd %edx, %xmm1
1462 ; AVX1-NEXT:    vpinsrd $1, %ecx, %xmm1, %xmm1
1463 ; AVX1-NEXT:    movq %rax, %rcx
1464 ; AVX1-NEXT:    shlq $61, %rcx
1465 ; AVX1-NEXT:    sarq $63, %rcx
1466 ; AVX1-NEXT:    vpinsrd $2, %ecx, %xmm1, %xmm1
1467 ; AVX1-NEXT:    shlq $60, %rax
1468 ; AVX1-NEXT:    sarq $63, %rax
1469 ; AVX1-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm1
1470 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1471 ; AVX1-NEXT:    retq
1472 ;
1473 ; AVX2-LABEL: load_sext_8i1_to_8i32:
1474 ; AVX2:       # BB#0: # %entry
1475 ; AVX2-NEXT:    movsbq (%rdi), %rax
1476 ; AVX2-NEXT:    movq %rax, %rcx
1477 ; AVX2-NEXT:    shlq $58, %rcx
1478 ; AVX2-NEXT:    sarq $63, %rcx
1479 ; AVX2-NEXT:    movq %rax, %rdx
1480 ; AVX2-NEXT:    shlq $59, %rdx
1481 ; AVX2-NEXT:    sarq $63, %rdx
1482 ; AVX2-NEXT:    vmovd %edx, %xmm0
1483 ; AVX2-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
1484 ; AVX2-NEXT:    movq %rax, %rcx
1485 ; AVX2-NEXT:    shlq $57, %rcx
1486 ; AVX2-NEXT:    sarq $63, %rcx
1487 ; AVX2-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
1488 ; AVX2-NEXT:    movq %rax, %rcx
1489 ; AVX2-NEXT:    shrq $7, %rcx
1490 ; AVX2-NEXT:    vpinsrd $3, %ecx, %xmm0, %xmm0
1491 ; AVX2-NEXT:    movq %rax, %rcx
1492 ; AVX2-NEXT:    shlq $62, %rcx
1493 ; AVX2-NEXT:    sarq $63, %rcx
1494 ; AVX2-NEXT:    movq %rax, %rdx
1495 ; AVX2-NEXT:    shlq $63, %rdx
1496 ; AVX2-NEXT:    sarq $63, %rdx
1497 ; AVX2-NEXT:    vmovd %edx, %xmm1
1498 ; AVX2-NEXT:    vpinsrd $1, %ecx, %xmm1, %xmm1
1499 ; AVX2-NEXT:    movq %rax, %rcx
1500 ; AVX2-NEXT:    shlq $61, %rcx
1501 ; AVX2-NEXT:    sarq $63, %rcx
1502 ; AVX2-NEXT:    vpinsrd $2, %ecx, %xmm1, %xmm1
1503 ; AVX2-NEXT:    shlq $60, %rax
1504 ; AVX2-NEXT:    sarq $63, %rax
1505 ; AVX2-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm1
1506 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1507 ; AVX2-NEXT:    retq
1508 ;
1509 ; X32-SSE41-LABEL: load_sext_8i1_to_8i32:
1510 ; X32-SSE41:       # BB#0: # %entry
1511 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1512 ; X32-SSE41-NEXT:    movzbl (%eax), %eax
1513 ; X32-SSE41-NEXT:    movl %eax, %ecx
1514 ; X32-SSE41-NEXT:    shrl %ecx
1515 ; X32-SSE41-NEXT:    andl $1, %ecx
1516 ; X32-SSE41-NEXT:    movl %eax, %edx
1517 ; X32-SSE41-NEXT:    andl $1, %edx
1518 ; X32-SSE41-NEXT:    movd %edx, %xmm1
1519 ; X32-SSE41-NEXT:    pinsrw $1, %ecx, %xmm1
1520 ; X32-SSE41-NEXT:    movl %eax, %ecx
1521 ; X32-SSE41-NEXT:    shrl $2, %ecx
1522 ; X32-SSE41-NEXT:    andl $1, %ecx
1523 ; X32-SSE41-NEXT:    pinsrw $2, %ecx, %xmm1
1524 ; X32-SSE41-NEXT:    movl %eax, %ecx
1525 ; X32-SSE41-NEXT:    shrl $3, %ecx
1526 ; X32-SSE41-NEXT:    andl $1, %ecx
1527 ; X32-SSE41-NEXT:    pinsrw $3, %ecx, %xmm1
1528 ; X32-SSE41-NEXT:    movl %eax, %ecx
1529 ; X32-SSE41-NEXT:    shrl $4, %ecx
1530 ; X32-SSE41-NEXT:    andl $1, %ecx
1531 ; X32-SSE41-NEXT:    pinsrw $4, %ecx, %xmm1
1532 ; X32-SSE41-NEXT:    movl %eax, %ecx
1533 ; X32-SSE41-NEXT:    shrl $5, %ecx
1534 ; X32-SSE41-NEXT:    andl $1, %ecx
1535 ; X32-SSE41-NEXT:    pinsrw $5, %ecx, %xmm1
1536 ; X32-SSE41-NEXT:    movl %eax, %ecx
1537 ; X32-SSE41-NEXT:    shrl $6, %ecx
1538 ; X32-SSE41-NEXT:    andl $1, %ecx
1539 ; X32-SSE41-NEXT:    pinsrw $6, %ecx, %xmm1
1540 ; X32-SSE41-NEXT:    shrl $7, %eax
1541 ; X32-SSE41-NEXT:    pinsrw $7, %eax, %xmm1
1542 ; X32-SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
1543 ; X32-SSE41-NEXT:    pslld $31, %xmm0
1544 ; X32-SSE41-NEXT:    psrad $31, %xmm0
1545 ; X32-SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1546 ; X32-SSE41-NEXT:    pslld $31, %xmm1
1547 ; X32-SSE41-NEXT:    psrad $31, %xmm1
1548 ; X32-SSE41-NEXT:    retl
1549 entry:
1550  %X = load <8 x i1>, <8 x i1>* %ptr
1551  %Y = sext <8 x i1> %X to <8 x i32>
1552  ret <8 x i32> %Y
1553 }
1554
1555 define <8 x i32> @load_sext_8i8_to_8i32(<8 x i8> *%ptr) {
1556 ; SSE2-LABEL: load_sext_8i8_to_8i32:
1557 ; SSE2:       # BB#0: # %entry
1558 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1559 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1560 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1561 ; SSE2-NEXT:    psrad $24, %xmm0
1562 ; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
1563 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1564 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
1565 ; SSE2-NEXT:    psrad $24, %xmm1
1566 ; SSE2-NEXT:    retq
1567 ;
1568 ; SSSE3-LABEL: load_sext_8i8_to_8i32:
1569 ; SSSE3:       # BB#0: # %entry
1570 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1571 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1572 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1573 ; SSSE3-NEXT:    psrad $24, %xmm0
1574 ; SSSE3-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
1575 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1576 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
1577 ; SSSE3-NEXT:    psrad $24, %xmm1
1578 ; SSSE3-NEXT:    retq
1579 ;
1580 ; SSE41-LABEL: load_sext_8i8_to_8i32:
1581 ; SSE41:       # BB#0: # %entry
1582 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
1583 ; SSE41-NEXT:    pmovsxbd 4(%rdi), %xmm1
1584 ; SSE41-NEXT:    retq
1585 ;
1586 ; AVX1-LABEL: load_sext_8i8_to_8i32:
1587 ; AVX1:       # BB#0: # %entry
1588 ; AVX1-NEXT:    vpmovsxbw (%rdi), %xmm0
1589 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
1590 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1591 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
1592 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1593 ; AVX1-NEXT:    retq
1594 ;
1595 ; AVX2-LABEL: load_sext_8i8_to_8i32:
1596 ; AVX2:       # BB#0: # %entry
1597 ; AVX2-NEXT:    vpmovsxbd (%rdi), %ymm0
1598 ; AVX2-NEXT:    retq
1599 ;
1600 ; X32-SSE41-LABEL: load_sext_8i8_to_8i32:
1601 ; X32-SSE41:       # BB#0: # %entry
1602 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1603 ; X32-SSE41-NEXT:    pmovsxbd (%eax), %xmm0
1604 ; X32-SSE41-NEXT:    pmovsxbd 4(%eax), %xmm1
1605 ; X32-SSE41-NEXT:    retl
1606 entry:
1607  %X = load <8 x i8>, <8 x i8>* %ptr
1608  %Y = sext <8 x i8> %X to <8 x i32>
1609  ret <8 x i32> %Y
1610 }
1611
1612 define <16 x i8> @load_sext_16i1_to_16i8(<16 x i1> *%ptr) nounwind readnone {
1613 ; SSE2-LABEL: load_sext_16i1_to_16i8:
1614 ; SSE2:       # BB#0: # %entry
1615 ; SSE2-NEXT:    pushq %rbp
1616 ; SSE2-NEXT:    pushq %r15
1617 ; SSE2-NEXT:    pushq %r14
1618 ; SSE2-NEXT:    pushq %r13
1619 ; SSE2-NEXT:    pushq %r12
1620 ; SSE2-NEXT:    pushq %rbx
1621 ; SSE2-NEXT:    movswq (%rdi), %rax
1622 ; SSE2-NEXT:    movq %rax, %r8
1623 ; SSE2-NEXT:    movq %rax, %r9
1624 ; SSE2-NEXT:    movq %rax, %r10
1625 ; SSE2-NEXT:    movq %rax, %r11
1626 ; SSE2-NEXT:    movq %rax, %r14
1627 ; SSE2-NEXT:    movq %rax, %r15
1628 ; SSE2-NEXT:    movq %rax, %r12
1629 ; SSE2-NEXT:    movq %rax, %r13
1630 ; SSE2-NEXT:    movq %rax, %rbx
1631 ; SSE2-NEXT:    movq %rax, %rcx
1632 ; SSE2-NEXT:    movq %rax, %rdx
1633 ; SSE2-NEXT:    movq %rax, %rsi
1634 ; SSE2-NEXT:    movq %rax, %rdi
1635 ; SSE2-NEXT:    movq %rax, %rbp
1636 ; SSE2-NEXT:    shlq $49, %rbp
1637 ; SSE2-NEXT:    sarq $63, %rbp
1638 ; SSE2-NEXT:    movd %ebp, %xmm0
1639 ; SSE2-NEXT:    movq %rax, %rbp
1640 ; SSE2-NEXT:    movsbq %al, %rax
1641 ; SSE2-NEXT:    shlq $57, %r8
1642 ; SSE2-NEXT:    sarq $63, %r8
1643 ; SSE2-NEXT:    movd %r8d, %xmm1
1644 ; SSE2-NEXT:    shlq $53, %r9
1645 ; SSE2-NEXT:    sarq $63, %r9
1646 ; SSE2-NEXT:    movd %r9d, %xmm2
1647 ; SSE2-NEXT:    shlq $61, %r10
1648 ; SSE2-NEXT:    sarq $63, %r10
1649 ; SSE2-NEXT:    movd %r10d, %xmm3
1650 ; SSE2-NEXT:    shlq $51, %r11
1651 ; SSE2-NEXT:    sarq $63, %r11
1652 ; SSE2-NEXT:    movd %r11d, %xmm4
1653 ; 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]
1654 ; SSE2-NEXT:    shlq $59, %r14
1655 ; SSE2-NEXT:    sarq $63, %r14
1656 ; SSE2-NEXT:    movd %r14d, %xmm5
1657 ; 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]
1658 ; SSE2-NEXT:    shlq $55, %r15
1659 ; SSE2-NEXT:    sarq $63, %r15
1660 ; SSE2-NEXT:    movd %r15d, %xmm2
1661 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3],xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
1662 ; SSE2-NEXT:    shlq $63, %r12
1663 ; SSE2-NEXT:    sarq $63, %r12
1664 ; SSE2-NEXT:    movd %r12d, %xmm0
1665 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3],xmm5[4],xmm4[4],xmm5[5],xmm4[5],xmm5[6],xmm4[6],xmm5[7],xmm4[7]
1666 ; SSE2-NEXT:    shlq $50, %r13
1667 ; SSE2-NEXT:    sarq $63, %r13
1668 ; SSE2-NEXT:    movd %r13d, %xmm1
1669 ; 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]
1670 ; SSE2-NEXT:    shlq $58, %rbx
1671 ; SSE2-NEXT:    sarq $63, %rbx
1672 ; SSE2-NEXT:    movd %ebx, %xmm2
1673 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1],xmm0[2],xmm5[2],xmm0[3],xmm5[3],xmm0[4],xmm5[4],xmm0[5],xmm5[5],xmm0[6],xmm5[6],xmm0[7],xmm5[7]
1674 ; SSE2-NEXT:    shlq $54, %rcx
1675 ; SSE2-NEXT:    sarq $63, %rcx
1676 ; SSE2-NEXT:    movd %ecx, %xmm4
1677 ; 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]
1678 ; SSE2-NEXT:    shlq $62, %rdx
1679 ; SSE2-NEXT:    sarq $63, %rdx
1680 ; SSE2-NEXT:    movd %edx, %xmm3
1681 ; 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]
1682 ; SSE2-NEXT:    shlq $52, %rsi
1683 ; SSE2-NEXT:    sarq $63, %rsi
1684 ; SSE2-NEXT:    movd %esi, %xmm1
1685 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
1686 ; SSE2-NEXT:    shlq $60, %rdi
1687 ; SSE2-NEXT:    sarq $63, %rdi
1688 ; SSE2-NEXT:    movd %edi, %xmm4
1689 ; 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]
1690 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3],xmm4[4],xmm1[4],xmm4[5],xmm1[5],xmm4[6],xmm1[6],xmm4[7],xmm1[7]
1691 ; SSE2-NEXT:    shrq $15, %rbp
1692 ; SSE2-NEXT:    movd %ebp, %xmm1
1693 ; SSE2-NEXT:    shrq $7, %rax
1694 ; SSE2-NEXT:    movd %eax, %xmm2
1695 ; 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]
1696 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]
1697 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
1698 ; 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]
1699 ; SSE2-NEXT:    popq %rbx
1700 ; SSE2-NEXT:    popq %r12
1701 ; SSE2-NEXT:    popq %r13
1702 ; SSE2-NEXT:    popq %r14
1703 ; SSE2-NEXT:    popq %r15
1704 ; SSE2-NEXT:    popq %rbp
1705 ; SSE2-NEXT:    retq
1706 ;
1707 ; SSSE3-LABEL: load_sext_16i1_to_16i8:
1708 ; SSSE3:       # BB#0: # %entry
1709 ; SSSE3-NEXT:    pushq %rbp
1710 ; SSSE3-NEXT:    pushq %r15
1711 ; SSSE3-NEXT:    pushq %r14
1712 ; SSSE3-NEXT:    pushq %r13
1713 ; SSSE3-NEXT:    pushq %r12
1714 ; SSSE3-NEXT:    pushq %rbx
1715 ; SSSE3-NEXT:    movswq (%rdi), %rax
1716 ; SSSE3-NEXT:    movq %rax, %r8
1717 ; SSSE3-NEXT:    movq %rax, %r9
1718 ; SSSE3-NEXT:    movq %rax, %r10
1719 ; SSSE3-NEXT:    movq %rax, %r11
1720 ; SSSE3-NEXT:    movq %rax, %r14
1721 ; SSSE3-NEXT:    movq %rax, %r15
1722 ; SSSE3-NEXT:    movq %rax, %r12
1723 ; SSSE3-NEXT:    movq %rax, %r13
1724 ; SSSE3-NEXT:    movq %rax, %rbx
1725 ; SSSE3-NEXT:    movq %rax, %rcx
1726 ; SSSE3-NEXT:    movq %rax, %rdx
1727 ; SSSE3-NEXT:    movq %rax, %rsi
1728 ; SSSE3-NEXT:    movq %rax, %rdi
1729 ; SSSE3-NEXT:    movq %rax, %rbp
1730 ; SSSE3-NEXT:    shlq $49, %rbp
1731 ; SSSE3-NEXT:    sarq $63, %rbp
1732 ; SSSE3-NEXT:    movd %ebp, %xmm0
1733 ; SSSE3-NEXT:    movq %rax, %rbp
1734 ; SSSE3-NEXT:    movsbq %al, %rax
1735 ; SSSE3-NEXT:    shlq $57, %r8
1736 ; SSSE3-NEXT:    sarq $63, %r8
1737 ; SSSE3-NEXT:    movd %r8d, %xmm1
1738 ; SSSE3-NEXT:    shlq $53, %r9
1739 ; SSSE3-NEXT:    sarq $63, %r9
1740 ; SSSE3-NEXT:    movd %r9d, %xmm2
1741 ; SSSE3-NEXT:    shlq $61, %r10
1742 ; SSSE3-NEXT:    sarq $63, %r10
1743 ; SSSE3-NEXT:    movd %r10d, %xmm3
1744 ; SSSE3-NEXT:    shlq $51, %r11
1745 ; SSSE3-NEXT:    sarq $63, %r11
1746 ; SSSE3-NEXT:    movd %r11d, %xmm4
1747 ; 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]
1748 ; SSSE3-NEXT:    shlq $59, %r14
1749 ; SSSE3-NEXT:    sarq $63, %r14
1750 ; SSSE3-NEXT:    movd %r14d, %xmm5
1751 ; 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]
1752 ; SSSE3-NEXT:    shlq $55, %r15
1753 ; SSSE3-NEXT:    sarq $63, %r15
1754 ; SSSE3-NEXT:    movd %r15d, %xmm2
1755 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3],xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
1756 ; SSSE3-NEXT:    shlq $63, %r12
1757 ; SSSE3-NEXT:    sarq $63, %r12
1758 ; SSSE3-NEXT:    movd %r12d, %xmm0
1759 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3],xmm5[4],xmm4[4],xmm5[5],xmm4[5],xmm5[6],xmm4[6],xmm5[7],xmm4[7]
1760 ; SSSE3-NEXT:    shlq $50, %r13
1761 ; SSSE3-NEXT:    sarq $63, %r13
1762 ; SSSE3-NEXT:    movd %r13d, %xmm1
1763 ; 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]
1764 ; SSSE3-NEXT:    shlq $58, %rbx
1765 ; SSSE3-NEXT:    sarq $63, %rbx
1766 ; SSSE3-NEXT:    movd %ebx, %xmm2
1767 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1],xmm0[2],xmm5[2],xmm0[3],xmm5[3],xmm0[4],xmm5[4],xmm0[5],xmm5[5],xmm0[6],xmm5[6],xmm0[7],xmm5[7]
1768 ; SSSE3-NEXT:    shlq $54, %rcx
1769 ; SSSE3-NEXT:    sarq $63, %rcx
1770 ; SSSE3-NEXT:    movd %ecx, %xmm4
1771 ; 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]
1772 ; SSSE3-NEXT:    shlq $62, %rdx
1773 ; SSSE3-NEXT:    sarq $63, %rdx
1774 ; SSSE3-NEXT:    movd %edx, %xmm3
1775 ; 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]
1776 ; SSSE3-NEXT:    shlq $52, %rsi
1777 ; SSSE3-NEXT:    sarq $63, %rsi
1778 ; SSSE3-NEXT:    movd %esi, %xmm1
1779 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
1780 ; SSSE3-NEXT:    shlq $60, %rdi
1781 ; SSSE3-NEXT:    sarq $63, %rdi
1782 ; SSSE3-NEXT:    movd %edi, %xmm4
1783 ; 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]
1784 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3],xmm4[4],xmm1[4],xmm4[5],xmm1[5],xmm4[6],xmm1[6],xmm4[7],xmm1[7]
1785 ; SSSE3-NEXT:    shrq $15, %rbp
1786 ; SSSE3-NEXT:    movd %ebp, %xmm1
1787 ; SSSE3-NEXT:    shrq $7, %rax
1788 ; SSSE3-NEXT:    movd %eax, %xmm2
1789 ; 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]
1790 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]
1791 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
1792 ; 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]
1793 ; SSSE3-NEXT:    popq %rbx
1794 ; SSSE3-NEXT:    popq %r12
1795 ; SSSE3-NEXT:    popq %r13
1796 ; SSSE3-NEXT:    popq %r14
1797 ; SSSE3-NEXT:    popq %r15
1798 ; SSSE3-NEXT:    popq %rbp
1799 ; SSSE3-NEXT:    retq
1800 ;
1801 ; SSE41-LABEL: load_sext_16i1_to_16i8:
1802 ; SSE41:       # BB#0: # %entry
1803 ; SSE41-NEXT:    movswq (%rdi), %rax
1804 ; SSE41-NEXT:    movq %rax, %rcx
1805 ; SSE41-NEXT:    shlq $62, %rcx
1806 ; SSE41-NEXT:    sarq $63, %rcx
1807 ; SSE41-NEXT:    movq %rax, %rdx
1808 ; SSE41-NEXT:    shlq $63, %rdx
1809 ; SSE41-NEXT:    sarq $63, %rdx
1810 ; SSE41-NEXT:    movd %edx, %xmm0
1811 ; SSE41-NEXT:    pinsrb $1, %ecx, %xmm0
1812 ; SSE41-NEXT:    movq %rax, %rcx
1813 ; SSE41-NEXT:    shlq $61, %rcx
1814 ; SSE41-NEXT:    sarq $63, %rcx
1815 ; SSE41-NEXT:    pinsrb $2, %ecx, %xmm0
1816 ; SSE41-NEXT:    movq %rax, %rcx
1817 ; SSE41-NEXT:    shlq $60, %rcx
1818 ; SSE41-NEXT:    sarq $63, %rcx
1819 ; SSE41-NEXT:    pinsrb $3, %ecx, %xmm0
1820 ; SSE41-NEXT:    movq %rax, %rcx
1821 ; SSE41-NEXT:    shlq $59, %rcx
1822 ; SSE41-NEXT:    sarq $63, %rcx
1823 ; SSE41-NEXT:    pinsrb $4, %ecx, %xmm0
1824 ; SSE41-NEXT:    movq %rax, %rcx
1825 ; SSE41-NEXT:    shlq $58, %rcx
1826 ; SSE41-NEXT:    sarq $63, %rcx
1827 ; SSE41-NEXT:    pinsrb $5, %ecx, %xmm0
1828 ; SSE41-NEXT:    movq %rax, %rcx
1829 ; SSE41-NEXT:    shlq $57, %rcx
1830 ; SSE41-NEXT:    sarq $63, %rcx
1831 ; SSE41-NEXT:    pinsrb $6, %ecx, %xmm0
1832 ; SSE41-NEXT:    movsbq %al, %rcx
1833 ; SSE41-NEXT:    shrq $7, %rcx
1834 ; SSE41-NEXT:    pinsrb $7, %ecx, %xmm0
1835 ; SSE41-NEXT:    movq %rax, %rcx
1836 ; SSE41-NEXT:    shlq $55, %rcx
1837 ; SSE41-NEXT:    sarq $63, %rcx
1838 ; SSE41-NEXT:    pinsrb $8, %ecx, %xmm0
1839 ; SSE41-NEXT:    movq %rax, %rcx
1840 ; SSE41-NEXT:    shlq $54, %rcx
1841 ; SSE41-NEXT:    sarq $63, %rcx
1842 ; SSE41-NEXT:    pinsrb $9, %ecx, %xmm0
1843 ; SSE41-NEXT:    movq %rax, %rcx
1844 ; SSE41-NEXT:    shlq $53, %rcx
1845 ; SSE41-NEXT:    sarq $63, %rcx
1846 ; SSE41-NEXT:    pinsrb $10, %ecx, %xmm0
1847 ; SSE41-NEXT:    movq %rax, %rcx
1848 ; SSE41-NEXT:    shlq $52, %rcx
1849 ; SSE41-NEXT:    sarq $63, %rcx
1850 ; SSE41-NEXT:    pinsrb $11, %ecx, %xmm0
1851 ; SSE41-NEXT:    movq %rax, %rcx
1852 ; SSE41-NEXT:    shlq $51, %rcx
1853 ; SSE41-NEXT:    sarq $63, %rcx
1854 ; SSE41-NEXT:    pinsrb $12, %ecx, %xmm0
1855 ; SSE41-NEXT:    movq %rax, %rcx
1856 ; SSE41-NEXT:    shlq $50, %rcx
1857 ; SSE41-NEXT:    sarq $63, %rcx
1858 ; SSE41-NEXT:    pinsrb $13, %ecx, %xmm0
1859 ; SSE41-NEXT:    movq %rax, %rcx
1860 ; SSE41-NEXT:    shlq $49, %rcx
1861 ; SSE41-NEXT:    sarq $63, %rcx
1862 ; SSE41-NEXT:    pinsrb $14, %ecx, %xmm0
1863 ; SSE41-NEXT:    shrq $15, %rax
1864 ; SSE41-NEXT:    pinsrb $15, %eax, %xmm0
1865 ; SSE41-NEXT:    retq
1866 ;
1867 ; AVX-LABEL: load_sext_16i1_to_16i8:
1868 ; AVX:       # BB#0: # %entry
1869 ; AVX-NEXT:    movswq (%rdi), %rax
1870 ; AVX-NEXT:    movq %rax, %rcx
1871 ; AVX-NEXT:    shlq $62, %rcx
1872 ; AVX-NEXT:    sarq $63, %rcx
1873 ; AVX-NEXT:    movq %rax, %rdx
1874 ; AVX-NEXT:    shlq $63, %rdx
1875 ; AVX-NEXT:    sarq $63, %rdx
1876 ; AVX-NEXT:    vmovd %edx, %xmm0
1877 ; AVX-NEXT:    vpinsrb $1, %ecx, %xmm0, %xmm0
1878 ; AVX-NEXT:    movq %rax, %rcx
1879 ; AVX-NEXT:    shlq $61, %rcx
1880 ; AVX-NEXT:    sarq $63, %rcx
1881 ; AVX-NEXT:    vpinsrb $2, %ecx, %xmm0, %xmm0
1882 ; AVX-NEXT:    movq %rax, %rcx
1883 ; AVX-NEXT:    shlq $60, %rcx
1884 ; AVX-NEXT:    sarq $63, %rcx
1885 ; AVX-NEXT:    vpinsrb $3, %ecx, %xmm0, %xmm0
1886 ; AVX-NEXT:    movq %rax, %rcx
1887 ; AVX-NEXT:    shlq $59, %rcx
1888 ; AVX-NEXT:    sarq $63, %rcx
1889 ; AVX-NEXT:    vpinsrb $4, %ecx, %xmm0, %xmm0
1890 ; AVX-NEXT:    movq %rax, %rcx
1891 ; AVX-NEXT:    shlq $58, %rcx
1892 ; AVX-NEXT:    sarq $63, %rcx
1893 ; AVX-NEXT:    vpinsrb $5, %ecx, %xmm0, %xmm0
1894 ; AVX-NEXT:    movq %rax, %rcx
1895 ; AVX-NEXT:    shlq $57, %rcx
1896 ; AVX-NEXT:    sarq $63, %rcx
1897 ; AVX-NEXT:    vpinsrb $6, %ecx, %xmm0, %xmm0
1898 ; AVX-NEXT:    movsbq %al, %rcx
1899 ; AVX-NEXT:    shrq $7, %rcx
1900 ; AVX-NEXT:    vpinsrb $7, %ecx, %xmm0, %xmm0
1901 ; AVX-NEXT:    movq %rax, %rcx
1902 ; AVX-NEXT:    shlq $55, %rcx
1903 ; AVX-NEXT:    sarq $63, %rcx
1904 ; AVX-NEXT:    vpinsrb $8, %ecx, %xmm0, %xmm0
1905 ; AVX-NEXT:    movq %rax, %rcx
1906 ; AVX-NEXT:    shlq $54, %rcx
1907 ; AVX-NEXT:    sarq $63, %rcx
1908 ; AVX-NEXT:    vpinsrb $9, %ecx, %xmm0, %xmm0
1909 ; AVX-NEXT:    movq %rax, %rcx
1910 ; AVX-NEXT:    shlq $53, %rcx
1911 ; AVX-NEXT:    sarq $63, %rcx
1912 ; AVX-NEXT:    vpinsrb $10, %ecx, %xmm0, %xmm0
1913 ; AVX-NEXT:    movq %rax, %rcx
1914 ; AVX-NEXT:    shlq $52, %rcx
1915 ; AVX-NEXT:    sarq $63, %rcx
1916 ; AVX-NEXT:    vpinsrb $11, %ecx, %xmm0, %xmm0
1917 ; AVX-NEXT:    movq %rax, %rcx
1918 ; AVX-NEXT:    shlq $51, %rcx
1919 ; AVX-NEXT:    sarq $63, %rcx
1920 ; AVX-NEXT:    vpinsrb $12, %ecx, %xmm0, %xmm0
1921 ; AVX-NEXT:    movq %rax, %rcx
1922 ; AVX-NEXT:    shlq $50, %rcx
1923 ; AVX-NEXT:    sarq $63, %rcx
1924 ; AVX-NEXT:    vpinsrb $13, %ecx, %xmm0, %xmm0
1925 ; AVX-NEXT:    movq %rax, %rcx
1926 ; AVX-NEXT:    shlq $49, %rcx
1927 ; AVX-NEXT:    sarq $63, %rcx
1928 ; AVX-NEXT:    vpinsrb $14, %ecx, %xmm0, %xmm0
1929 ; AVX-NEXT:    shrq $15, %rax
1930 ; AVX-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
1931 ; AVX-NEXT:    retq
1932 ;
1933 ; X32-SSE41-LABEL: load_sext_16i1_to_16i8:
1934 ; X32-SSE41:       # BB#0: # %entry
1935 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1936 ; X32-SSE41-NEXT:    movswl (%eax), %eax
1937 ; X32-SSE41-NEXT:    movl %eax, %ecx
1938 ; X32-SSE41-NEXT:    shll $30, %ecx
1939 ; X32-SSE41-NEXT:    sarl $31, %ecx
1940 ; X32-SSE41-NEXT:    movl %eax, %edx
1941 ; X32-SSE41-NEXT:    shll $31, %edx
1942 ; X32-SSE41-NEXT:    sarl $31, %edx
1943 ; X32-SSE41-NEXT:    movd %edx, %xmm0
1944 ; X32-SSE41-NEXT:    pinsrb $1, %ecx, %xmm0
1945 ; X32-SSE41-NEXT:    movl %eax, %ecx
1946 ; X32-SSE41-NEXT:    shll $29, %ecx
1947 ; X32-SSE41-NEXT:    sarl $31, %ecx
1948 ; X32-SSE41-NEXT:    pinsrb $2, %ecx, %xmm0
1949 ; X32-SSE41-NEXT:    movl %eax, %ecx
1950 ; X32-SSE41-NEXT:    shll $28, %ecx
1951 ; X32-SSE41-NEXT:    sarl $31, %ecx
1952 ; X32-SSE41-NEXT:    pinsrb $3, %ecx, %xmm0
1953 ; X32-SSE41-NEXT:    movl %eax, %ecx
1954 ; X32-SSE41-NEXT:    shll $27, %ecx
1955 ; X32-SSE41-NEXT:    sarl $31, %ecx
1956 ; X32-SSE41-NEXT:    pinsrb $4, %ecx, %xmm0
1957 ; X32-SSE41-NEXT:    movl %eax, %ecx
1958 ; X32-SSE41-NEXT:    shll $26, %ecx
1959 ; X32-SSE41-NEXT:    sarl $31, %ecx
1960 ; X32-SSE41-NEXT:    pinsrb $5, %ecx, %xmm0
1961 ; X32-SSE41-NEXT:    movl %eax, %ecx
1962 ; X32-SSE41-NEXT:    shll $25, %ecx
1963 ; X32-SSE41-NEXT:    sarl $31, %ecx
1964 ; X32-SSE41-NEXT:    pinsrb $6, %ecx, %xmm0
1965 ; X32-SSE41-NEXT:    movsbl %al, %ecx
1966 ; X32-SSE41-NEXT:    shrl $7, %ecx
1967 ; X32-SSE41-NEXT:    pinsrb $7, %ecx, %xmm0
1968 ; X32-SSE41-NEXT:    movl %eax, %ecx
1969 ; X32-SSE41-NEXT:    shll $23, %ecx
1970 ; X32-SSE41-NEXT:    sarl $31, %ecx
1971 ; X32-SSE41-NEXT:    pinsrb $8, %ecx, %xmm0
1972 ; X32-SSE41-NEXT:    movl %eax, %ecx
1973 ; X32-SSE41-NEXT:    shll $22, %ecx
1974 ; X32-SSE41-NEXT:    sarl $31, %ecx
1975 ; X32-SSE41-NEXT:    pinsrb $9, %ecx, %xmm0
1976 ; X32-SSE41-NEXT:    movl %eax, %ecx
1977 ; X32-SSE41-NEXT:    shll $21, %ecx
1978 ; X32-SSE41-NEXT:    sarl $31, %ecx
1979 ; X32-SSE41-NEXT:    pinsrb $10, %ecx, %xmm0
1980 ; X32-SSE41-NEXT:    movl %eax, %ecx
1981 ; X32-SSE41-NEXT:    shll $20, %ecx
1982 ; X32-SSE41-NEXT:    sarl $31, %ecx
1983 ; X32-SSE41-NEXT:    pinsrb $11, %ecx, %xmm0
1984 ; X32-SSE41-NEXT:    movl %eax, %ecx
1985 ; X32-SSE41-NEXT:    shll $19, %ecx
1986 ; X32-SSE41-NEXT:    sarl $31, %ecx
1987 ; X32-SSE41-NEXT:    pinsrb $12, %ecx, %xmm0
1988 ; X32-SSE41-NEXT:    movl %eax, %ecx
1989 ; X32-SSE41-NEXT:    shll $18, %ecx
1990 ; X32-SSE41-NEXT:    sarl $31, %ecx
1991 ; X32-SSE41-NEXT:    pinsrb $13, %ecx, %xmm0
1992 ; X32-SSE41-NEXT:    movl %eax, %ecx
1993 ; X32-SSE41-NEXT:    shll $17, %ecx
1994 ; X32-SSE41-NEXT:    sarl $31, %ecx
1995 ; X32-SSE41-NEXT:    pinsrb $14, %ecx, %xmm0
1996 ; X32-SSE41-NEXT:    shrl $15, %eax
1997 ; X32-SSE41-NEXT:    pinsrb $15, %eax, %xmm0
1998 ; X32-SSE41-NEXT:    retl
1999 entry:
2000  %X = load <16 x i1>, <16 x i1>* %ptr
2001  %Y = sext <16 x i1> %X to <16 x i8>
2002  ret <16 x i8> %Y
2003 }
2004
2005 define <16 x i16> @load_sext_16i1_to_16i16(<16 x i1> *%ptr) {
2006 ; SSE2-LABEL: load_sext_16i1_to_16i16:
2007 ; SSE2:       # BB#0: # %entry
2008 ; SSE2-NEXT:    movzwl (%rdi), %eax
2009 ; SSE2-NEXT:    movl %eax, %ecx
2010 ; SSE2-NEXT:    shrl $14, %ecx
2011 ; SSE2-NEXT:    andl $1, %ecx
2012 ; SSE2-NEXT:    movd %ecx, %xmm0
2013 ; SSE2-NEXT:    movl %eax, %ecx
2014 ; SSE2-NEXT:    shrl $6, %ecx
2015 ; SSE2-NEXT:    andl $1, %ecx
2016 ; SSE2-NEXT:    movd %ecx, %xmm1
2017 ; 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]
2018 ; SSE2-NEXT:    movl %eax, %ecx
2019 ; SSE2-NEXT:    shrl $10, %ecx
2020 ; SSE2-NEXT:    andl $1, %ecx
2021 ; SSE2-NEXT:    movd %ecx, %xmm0
2022 ; SSE2-NEXT:    movl %eax, %ecx
2023 ; SSE2-NEXT:    shrl $2, %ecx
2024 ; SSE2-NEXT:    andl $1, %ecx
2025 ; SSE2-NEXT:    movd %ecx, %xmm2
2026 ; 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]
2027 ; 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]
2028 ; SSE2-NEXT:    movl %eax, %ecx
2029 ; SSE2-NEXT:    shrl $12, %ecx
2030 ; SSE2-NEXT:    andl $1, %ecx
2031 ; SSE2-NEXT:    movd %ecx, %xmm0
2032 ; SSE2-NEXT:    movl %eax, %ecx
2033 ; SSE2-NEXT:    shrl $4, %ecx
2034 ; SSE2-NEXT:    andl $1, %ecx
2035 ; SSE2-NEXT:    movd %ecx, %xmm3
2036 ; 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]
2037 ; SSE2-NEXT:    movl %eax, %ecx
2038 ; SSE2-NEXT:    andl $1, %ecx
2039 ; SSE2-NEXT:    movd %ecx, %xmm1
2040 ; SSE2-NEXT:    movl %eax, %ecx
2041 ; SSE2-NEXT:    shrl $8, %ecx
2042 ; SSE2-NEXT:    andl $1, %ecx
2043 ; SSE2-NEXT:    movd %ecx, %xmm0
2044 ; 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]
2045 ; 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]
2046 ; 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]
2047 ; SSE2-NEXT:    movl %eax, %ecx
2048 ; SSE2-NEXT:    shrl $13, %ecx
2049 ; SSE2-NEXT:    andl $1, %ecx
2050 ; SSE2-NEXT:    movd %ecx, %xmm0
2051 ; SSE2-NEXT:    movl %eax, %ecx
2052 ; SSE2-NEXT:    shrl $5, %ecx
2053 ; SSE2-NEXT:    andl $1, %ecx
2054 ; SSE2-NEXT:    movd %ecx, %xmm2
2055 ; 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]
2056 ; SSE2-NEXT:    movl %eax, %ecx
2057 ; SSE2-NEXT:    shrl $9, %ecx
2058 ; SSE2-NEXT:    andl $1, %ecx
2059 ; SSE2-NEXT:    movd %ecx, %xmm3
2060 ; SSE2-NEXT:    movl %eax, %ecx
2061 ; SSE2-NEXT:    shrl %ecx
2062 ; SSE2-NEXT:    andl $1, %ecx
2063 ; SSE2-NEXT:    movd %ecx, %xmm0
2064 ; 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]
2065 ; 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]
2066 ; SSE2-NEXT:    movl %eax, %ecx
2067 ; SSE2-NEXT:    shrl $11, %ecx
2068 ; SSE2-NEXT:    andl $1, %ecx
2069 ; SSE2-NEXT:    movd %ecx, %xmm2
2070 ; SSE2-NEXT:    movl %eax, %ecx
2071 ; SSE2-NEXT:    shrl $3, %ecx
2072 ; SSE2-NEXT:    andl $1, %ecx
2073 ; SSE2-NEXT:    movd %ecx, %xmm3
2074 ; 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]
2075 ; SSE2-NEXT:    movl %eax, %ecx
2076 ; SSE2-NEXT:    shrl $7, %ecx
2077 ; SSE2-NEXT:    andl $1, %ecx
2078 ; SSE2-NEXT:    movd %ecx, %xmm2
2079 ; SSE2-NEXT:    shrl $15, %eax
2080 ; SSE2-NEXT:    movzwl %ax, %eax
2081 ; SSE2-NEXT:    movd %eax, %xmm4
2082 ; 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]
2083 ; 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]
2084 ; 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]
2085 ; 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]
2086 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
2087 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2088 ; SSE2-NEXT:    psllw $15, %xmm0
2089 ; SSE2-NEXT:    psraw $15, %xmm0
2090 ; 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]
2091 ; SSE2-NEXT:    psllw $15, %xmm1
2092 ; SSE2-NEXT:    psraw $15, %xmm1
2093 ; SSE2-NEXT:    retq
2094 ;
2095 ; SSSE3-LABEL: load_sext_16i1_to_16i16:
2096 ; SSSE3:       # BB#0: # %entry
2097 ; SSSE3-NEXT:    movzwl (%rdi), %eax
2098 ; SSSE3-NEXT:    movl %eax, %ecx
2099 ; SSSE3-NEXT:    shrl $14, %ecx
2100 ; SSSE3-NEXT:    andl $1, %ecx
2101 ; SSSE3-NEXT:    movd %ecx, %xmm0
2102 ; SSSE3-NEXT:    movl %eax, %ecx
2103 ; SSSE3-NEXT:    shrl $6, %ecx
2104 ; SSSE3-NEXT:    andl $1, %ecx
2105 ; SSSE3-NEXT:    movd %ecx, %xmm1
2106 ; 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]
2107 ; SSSE3-NEXT:    movl %eax, %ecx
2108 ; SSSE3-NEXT:    shrl $10, %ecx
2109 ; SSSE3-NEXT:    andl $1, %ecx
2110 ; SSSE3-NEXT:    movd %ecx, %xmm0
2111 ; SSSE3-NEXT:    movl %eax, %ecx
2112 ; SSSE3-NEXT:    shrl $2, %ecx
2113 ; SSSE3-NEXT:    andl $1, %ecx
2114 ; SSSE3-NEXT:    movd %ecx, %xmm2
2115 ; 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]
2116 ; 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]
2117 ; SSSE3-NEXT:    movl %eax, %ecx
2118 ; SSSE3-NEXT:    shrl $12, %ecx
2119 ; SSSE3-NEXT:    andl $1, %ecx
2120 ; SSSE3-NEXT:    movd %ecx, %xmm0
2121 ; SSSE3-NEXT:    movl %eax, %ecx
2122 ; SSSE3-NEXT:    shrl $4, %ecx
2123 ; SSSE3-NEXT:    andl $1, %ecx
2124 ; SSSE3-NEXT:    movd %ecx, %xmm3
2125 ; 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]
2126 ; SSSE3-NEXT:    movl %eax, %ecx
2127 ; SSSE3-NEXT:    andl $1, %ecx
2128 ; SSSE3-NEXT:    movd %ecx, %xmm1
2129 ; SSSE3-NEXT:    movl %eax, %ecx
2130 ; SSSE3-NEXT:    shrl $8, %ecx
2131 ; SSSE3-NEXT:    andl $1, %ecx
2132 ; SSSE3-NEXT:    movd %ecx, %xmm0
2133 ; 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]
2134 ; 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]
2135 ; 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]
2136 ; SSSE3-NEXT:    movl %eax, %ecx
2137 ; SSSE3-NEXT:    shrl $13, %ecx
2138 ; SSSE3-NEXT:    andl $1, %ecx
2139 ; SSSE3-NEXT:    movd %ecx, %xmm0
2140 ; SSSE3-NEXT:    movl %eax, %ecx
2141 ; SSSE3-NEXT:    shrl $5, %ecx
2142 ; SSSE3-NEXT:    andl $1, %ecx
2143 ; SSSE3-NEXT:    movd %ecx, %xmm2
2144 ; 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]
2145 ; SSSE3-NEXT:    movl %eax, %ecx
2146 ; SSSE3-NEXT:    shrl $9, %ecx
2147 ; SSSE3-NEXT:    andl $1, %ecx
2148 ; SSSE3-NEXT:    movd %ecx, %xmm3
2149 ; SSSE3-NEXT:    movl %eax, %ecx
2150 ; SSSE3-NEXT:    shrl %ecx
2151 ; SSSE3-NEXT:    andl $1, %ecx
2152 ; SSSE3-NEXT:    movd %ecx, %xmm0
2153 ; 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]
2154 ; 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]
2155 ; SSSE3-NEXT:    movl %eax, %ecx
2156 ; SSSE3-NEXT:    shrl $11, %ecx
2157 ; SSSE3-NEXT:    andl $1, %ecx
2158 ; SSSE3-NEXT:    movd %ecx, %xmm2
2159 ; SSSE3-NEXT:    movl %eax, %ecx
2160 ; SSSE3-NEXT:    shrl $3, %ecx
2161 ; SSSE3-NEXT:    andl $1, %ecx
2162 ; SSSE3-NEXT:    movd %ecx, %xmm3
2163 ; 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]
2164 ; SSSE3-NEXT:    movl %eax, %ecx
2165 ; SSSE3-NEXT:    shrl $7, %ecx
2166 ; SSSE3-NEXT:    andl $1, %ecx
2167 ; SSSE3-NEXT:    movd %ecx, %xmm2
2168 ; SSSE3-NEXT:    shrl $15, %eax
2169 ; SSSE3-NEXT:    movzwl %ax, %eax
2170 ; SSSE3-NEXT:    movd %eax, %xmm4
2171 ; 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]
2172 ; 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]
2173 ; 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]
2174 ; 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]
2175 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
2176 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2177 ; SSSE3-NEXT:    psllw $15, %xmm0
2178 ; SSSE3-NEXT:    psraw $15, %xmm0
2179 ; 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]
2180 ; SSSE3-NEXT:    psllw $15, %xmm1
2181 ; SSSE3-NEXT:    psraw $15, %xmm1
2182 ; SSSE3-NEXT:    retq
2183 ;
2184 ; SSE41-LABEL: load_sext_16i1_to_16i16:
2185 ; SSE41:       # BB#0: # %entry
2186 ; SSE41-NEXT:    movzwl (%rdi), %eax
2187 ; SSE41-NEXT:    movl %eax, %ecx
2188 ; SSE41-NEXT:    shrl %ecx
2189 ; SSE41-NEXT:    andl $1, %ecx
2190 ; SSE41-NEXT:    movl %eax, %edx
2191 ; SSE41-NEXT:    andl $1, %edx
2192 ; SSE41-NEXT:    movd %edx, %xmm1
2193 ; SSE41-NEXT:    pinsrb $1, %ecx, %xmm1
2194 ; SSE41-NEXT:    movl %eax, %ecx
2195 ; SSE41-NEXT:    shrl $2, %ecx
2196 ; SSE41-NEXT:    andl $1, %ecx
2197 ; SSE41-NEXT:    pinsrb $2, %ecx, %xmm1
2198 ; SSE41-NEXT:    movl %eax, %ecx
2199 ; SSE41-NEXT:    shrl $3, %ecx
2200 ; SSE41-NEXT:    andl $1, %ecx
2201 ; SSE41-NEXT:    pinsrb $3, %ecx, %xmm1
2202 ; SSE41-NEXT:    movl %eax, %ecx
2203 ; SSE41-NEXT:    shrl $4, %ecx
2204 ; SSE41-NEXT:    andl $1, %ecx
2205 ; SSE41-NEXT:    pinsrb $4, %ecx, %xmm1
2206 ; SSE41-NEXT:    movl %eax, %ecx
2207 ; SSE41-NEXT:    shrl $5, %ecx
2208 ; SSE41-NEXT:    andl $1, %ecx
2209 ; SSE41-NEXT:    pinsrb $5, %ecx, %xmm1
2210 ; SSE41-NEXT:    movl %eax, %ecx
2211 ; SSE41-NEXT:    shrl $6, %ecx
2212 ; SSE41-NEXT:    andl $1, %ecx
2213 ; SSE41-NEXT:    pinsrb $6, %ecx, %xmm1
2214 ; SSE41-NEXT:    movl %eax, %ecx
2215 ; SSE41-NEXT:    shrl $7, %ecx
2216 ; SSE41-NEXT:    andl $1, %ecx
2217 ; SSE41-NEXT:    pinsrb $7, %ecx, %xmm1
2218 ; SSE41-NEXT:    movl %eax, %ecx
2219 ; SSE41-NEXT:    shrl $8, %ecx
2220 ; SSE41-NEXT:    andl $1, %ecx
2221 ; SSE41-NEXT:    pinsrb $8, %ecx, %xmm1
2222 ; SSE41-NEXT:    movl %eax, %ecx
2223 ; SSE41-NEXT:    shrl $9, %ecx
2224 ; SSE41-NEXT:    andl $1, %ecx
2225 ; SSE41-NEXT:    pinsrb $9, %ecx, %xmm1
2226 ; SSE41-NEXT:    movl %eax, %ecx
2227 ; SSE41-NEXT:    shrl $10, %ecx
2228 ; SSE41-NEXT:    andl $1, %ecx
2229 ; SSE41-NEXT:    pinsrb $10, %ecx, %xmm1
2230 ; SSE41-NEXT:    movl %eax, %ecx
2231 ; SSE41-NEXT:    shrl $11, %ecx
2232 ; SSE41-NEXT:    andl $1, %ecx
2233 ; SSE41-NEXT:    pinsrb $11, %ecx, %xmm1
2234 ; SSE41-NEXT:    movl %eax, %ecx
2235 ; SSE41-NEXT:    shrl $12, %ecx
2236 ; SSE41-NEXT:    andl $1, %ecx
2237 ; SSE41-NEXT:    pinsrb $12, %ecx, %xmm1
2238 ; SSE41-NEXT:    movl %eax, %ecx
2239 ; SSE41-NEXT:    shrl $13, %ecx
2240 ; SSE41-NEXT:    andl $1, %ecx
2241 ; SSE41-NEXT:    pinsrb $13, %ecx, %xmm1
2242 ; SSE41-NEXT:    movl %eax, %ecx
2243 ; SSE41-NEXT:    shrl $14, %ecx
2244 ; SSE41-NEXT:    andl $1, %ecx
2245 ; SSE41-NEXT:    pinsrb $14, %ecx, %xmm1
2246 ; SSE41-NEXT:    shrl $15, %eax
2247 ; SSE41-NEXT:    movzwl %ax, %eax
2248 ; SSE41-NEXT:    pinsrb $15, %eax, %xmm1
2249 ; 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
2250 ; SSE41-NEXT:    psllw $15, %xmm0
2251 ; SSE41-NEXT:    psraw $15, %xmm0
2252 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2253 ; SSE41-NEXT:    psllw $15, %xmm1
2254 ; SSE41-NEXT:    psraw $15, %xmm1
2255 ; SSE41-NEXT:    retq
2256 ;
2257 ; AVX1-LABEL: load_sext_16i1_to_16i16:
2258 ; AVX1:       # BB#0: # %entry
2259 ; AVX1-NEXT:    pushq %rbp
2260 ; AVX1-NEXT:  .Ltmp0:
2261 ; AVX1-NEXT:    .cfi_def_cfa_offset 16
2262 ; AVX1-NEXT:    pushq %r15
2263 ; AVX1-NEXT:  .Ltmp1:
2264 ; AVX1-NEXT:    .cfi_def_cfa_offset 24
2265 ; AVX1-NEXT:    pushq %r14
2266 ; AVX1-NEXT:  .Ltmp2:
2267 ; AVX1-NEXT:    .cfi_def_cfa_offset 32
2268 ; AVX1-NEXT:    pushq %r13
2269 ; AVX1-NEXT:  .Ltmp3:
2270 ; AVX1-NEXT:    .cfi_def_cfa_offset 40
2271 ; AVX1-NEXT:    pushq %r12
2272 ; AVX1-NEXT:  .Ltmp4:
2273 ; AVX1-NEXT:    .cfi_def_cfa_offset 48
2274 ; AVX1-NEXT:    pushq %rbx
2275 ; AVX1-NEXT:  .Ltmp5:
2276 ; AVX1-NEXT:    .cfi_def_cfa_offset 56
2277 ; AVX1-NEXT:  .Ltmp6:
2278 ; AVX1-NEXT:    .cfi_offset %rbx, -56
2279 ; AVX1-NEXT:  .Ltmp7:
2280 ; AVX1-NEXT:    .cfi_offset %r12, -48
2281 ; AVX1-NEXT:  .Ltmp8:
2282 ; AVX1-NEXT:    .cfi_offset %r13, -40
2283 ; AVX1-NEXT:  .Ltmp9:
2284 ; AVX1-NEXT:    .cfi_offset %r14, -32
2285 ; AVX1-NEXT:  .Ltmp10:
2286 ; AVX1-NEXT:    .cfi_offset %r15, -24
2287 ; AVX1-NEXT:  .Ltmp11:
2288 ; AVX1-NEXT:    .cfi_offset %rbp, -16
2289 ; AVX1-NEXT:    movswq (%rdi), %rax
2290 ; AVX1-NEXT:    movq %rax, %rcx
2291 ; AVX1-NEXT:    shlq $55, %rcx
2292 ; AVX1-NEXT:    sarq $63, %rcx
2293 ; AVX1-NEXT:    vmovd %ecx, %xmm0
2294 ; AVX1-NEXT:    movq %rax, %r8
2295 ; AVX1-NEXT:    movq %rax, %r10
2296 ; AVX1-NEXT:    movq %rax, %r11
2297 ; AVX1-NEXT:    movq %rax, %r14
2298 ; AVX1-NEXT:    movq %rax, %r15
2299 ; AVX1-NEXT:    movq %rax, %r9
2300 ; AVX1-NEXT:    movq %rax, %r12
2301 ; AVX1-NEXT:    movq %rax, %r13
2302 ; AVX1-NEXT:    movq %rax, %rbx
2303 ; AVX1-NEXT:    movq %rax, %rdi
2304 ; AVX1-NEXT:    movq %rax, %rcx
2305 ; AVX1-NEXT:    movq %rax, %rdx
2306 ; AVX1-NEXT:    movq %rax, %rsi
2307 ; AVX1-NEXT:    movsbq %al, %rbp
2308 ; AVX1-NEXT:    shlq $54, %rax
2309 ; AVX1-NEXT:    sarq $63, %rax
2310 ; AVX1-NEXT:    vpinsrw $1, %eax, %xmm0, %xmm0
2311 ; AVX1-NEXT:    shlq $53, %r8
2312 ; AVX1-NEXT:    sarq $63, %r8
2313 ; AVX1-NEXT:    vpinsrw $2, %r8d, %xmm0, %xmm0
2314 ; AVX1-NEXT:    shlq $52, %r10
2315 ; AVX1-NEXT:    sarq $63, %r10
2316 ; AVX1-NEXT:    vpinsrw $3, %r10d, %xmm0, %xmm0
2317 ; AVX1-NEXT:    shlq $51, %r11
2318 ; AVX1-NEXT:    sarq $63, %r11
2319 ; AVX1-NEXT:    vpinsrw $4, %r11d, %xmm0, %xmm0
2320 ; AVX1-NEXT:    shlq $50, %r14
2321 ; AVX1-NEXT:    sarq $63, %r14
2322 ; AVX1-NEXT:    vpinsrw $5, %r14d, %xmm0, %xmm0
2323 ; AVX1-NEXT:    shlq $49, %r15
2324 ; AVX1-NEXT:    sarq $63, %r15
2325 ; AVX1-NEXT:    vpinsrw $6, %r15d, %xmm0, %xmm0
2326 ; AVX1-NEXT:    shrq $15, %r9
2327 ; AVX1-NEXT:    vpinsrw $7, %r9d, %xmm0, %xmm0
2328 ; AVX1-NEXT:    shlq $63, %r13
2329 ; AVX1-NEXT:    sarq $63, %r13
2330 ; AVX1-NEXT:    vmovd %r13d, %xmm1
2331 ; AVX1-NEXT:    shlq $62, %r12
2332 ; AVX1-NEXT:    sarq $63, %r12
2333 ; AVX1-NEXT:    vpinsrw $1, %r12d, %xmm1, %xmm1
2334 ; AVX1-NEXT:    shlq $61, %rbx
2335 ; AVX1-NEXT:    sarq $63, %rbx
2336 ; AVX1-NEXT:    vpinsrw $2, %ebx, %xmm1, %xmm1
2337 ; AVX1-NEXT:    shlq $60, %rdi
2338 ; AVX1-NEXT:    sarq $63, %rdi
2339 ; AVX1-NEXT:    vpinsrw $3, %edi, %xmm1, %xmm1
2340 ; AVX1-NEXT:    shlq $59, %rcx
2341 ; AVX1-NEXT:    sarq $63, %rcx
2342 ; AVX1-NEXT:    vpinsrw $4, %ecx, %xmm1, %xmm1
2343 ; AVX1-NEXT:    shlq $58, %rdx
2344 ; AVX1-NEXT:    sarq $63, %rdx
2345 ; AVX1-NEXT:    vpinsrw $5, %edx, %xmm1, %xmm1
2346 ; AVX1-NEXT:    shlq $57, %rsi
2347 ; AVX1-NEXT:    sarq $63, %rsi
2348 ; AVX1-NEXT:    vpinsrw $6, %esi, %xmm1, %xmm1
2349 ; AVX1-NEXT:    shrq $7, %rbp
2350 ; AVX1-NEXT:    vpinsrw $7, %ebp, %xmm1, %xmm1
2351 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2352 ; AVX1-NEXT:    popq %rbx
2353 ; AVX1-NEXT:    popq %r12
2354 ; AVX1-NEXT:    popq %r13
2355 ; AVX1-NEXT:    popq %r14
2356 ; AVX1-NEXT:    popq %r15
2357 ; AVX1-NEXT:    popq %rbp
2358 ; AVX1-NEXT:    retq
2359 ;
2360 ; AVX2-LABEL: load_sext_16i1_to_16i16:
2361 ; AVX2:       # BB#0: # %entry
2362 ; AVX2-NEXT:    pushq %rbp
2363 ; AVX2-NEXT:  .Ltmp0:
2364 ; AVX2-NEXT:    .cfi_def_cfa_offset 16
2365 ; AVX2-NEXT:    pushq %r15
2366 ; AVX2-NEXT:  .Ltmp1:
2367 ; AVX2-NEXT:    .cfi_def_cfa_offset 24
2368 ; AVX2-NEXT:    pushq %r14
2369 ; AVX2-NEXT:  .Ltmp2:
2370 ; AVX2-NEXT:    .cfi_def_cfa_offset 32
2371 ; AVX2-NEXT:    pushq %r13
2372 ; AVX2-NEXT:  .Ltmp3:
2373 ; AVX2-NEXT:    .cfi_def_cfa_offset 40
2374 ; AVX2-NEXT:    pushq %r12
2375 ; AVX2-NEXT:  .Ltmp4:
2376 ; AVX2-NEXT:    .cfi_def_cfa_offset 48
2377 ; AVX2-NEXT:    pushq %rbx
2378 ; AVX2-NEXT:  .Ltmp5:
2379 ; AVX2-NEXT:    .cfi_def_cfa_offset 56
2380 ; AVX2-NEXT:  .Ltmp6:
2381 ; AVX2-NEXT:    .cfi_offset %rbx, -56
2382 ; AVX2-NEXT:  .Ltmp7:
2383 ; AVX2-NEXT:    .cfi_offset %r12, -48
2384 ; AVX2-NEXT:  .Ltmp8:
2385 ; AVX2-NEXT:    .cfi_offset %r13, -40
2386 ; AVX2-NEXT:  .Ltmp9:
2387 ; AVX2-NEXT:    .cfi_offset %r14, -32
2388 ; AVX2-NEXT:  .Ltmp10:
2389 ; AVX2-NEXT:    .cfi_offset %r15, -24
2390 ; AVX2-NEXT:  .Ltmp11:
2391 ; AVX2-NEXT:    .cfi_offset %rbp, -16
2392 ; AVX2-NEXT:    movswq (%rdi), %rax
2393 ; AVX2-NEXT:    movq %rax, %rcx
2394 ; AVX2-NEXT:    shlq $55, %rcx
2395 ; AVX2-NEXT:    sarq $63, %rcx
2396 ; AVX2-NEXT:    vmovd %ecx, %xmm0
2397 ; AVX2-NEXT:    movq %rax, %r8
2398 ; AVX2-NEXT:    movq %rax, %r10
2399 ; AVX2-NEXT:    movq %rax, %r11
2400 ; AVX2-NEXT:    movq %rax, %r14
2401 ; AVX2-NEXT:    movq %rax, %r15
2402 ; AVX2-NEXT:    movq %rax, %r9
2403 ; AVX2-NEXT:    movq %rax, %r12
2404 ; AVX2-NEXT:    movq %rax, %r13
2405 ; AVX2-NEXT:    movq %rax, %rbx
2406 ; AVX2-NEXT:    movq %rax, %rdi
2407 ; AVX2-NEXT:    movq %rax, %rcx
2408 ; AVX2-NEXT:    movq %rax, %rdx
2409 ; AVX2-NEXT:    movq %rax, %rsi
2410 ; AVX2-NEXT:    movsbq %al, %rbp
2411 ; AVX2-NEXT:    shlq $54, %rax
2412 ; AVX2-NEXT:    sarq $63, %rax
2413 ; AVX2-NEXT:    vpinsrw $1, %eax, %xmm0, %xmm0
2414 ; AVX2-NEXT:    shlq $53, %r8
2415 ; AVX2-NEXT:    sarq $63, %r8
2416 ; AVX2-NEXT:    vpinsrw $2, %r8d, %xmm0, %xmm0
2417 ; AVX2-NEXT:    shlq $52, %r10
2418 ; AVX2-NEXT:    sarq $63, %r10
2419 ; AVX2-NEXT:    vpinsrw $3, %r10d, %xmm0, %xmm0
2420 ; AVX2-NEXT:    shlq $51, %r11
2421 ; AVX2-NEXT:    sarq $63, %r11
2422 ; AVX2-NEXT:    vpinsrw $4, %r11d, %xmm0, %xmm0
2423 ; AVX2-NEXT:    shlq $50, %r14
2424 ; AVX2-NEXT:    sarq $63, %r14
2425 ; AVX2-NEXT:    vpinsrw $5, %r14d, %xmm0, %xmm0
2426 ; AVX2-NEXT:    shlq $49, %r15
2427 ; AVX2-NEXT:    sarq $63, %r15
2428 ; AVX2-NEXT:    vpinsrw $6, %r15d, %xmm0, %xmm0
2429 ; AVX2-NEXT:    shrq $15, %r9
2430 ; AVX2-NEXT:    vpinsrw $7, %r9d, %xmm0, %xmm0
2431 ; AVX2-NEXT:    shlq $63, %r13
2432 ; AVX2-NEXT:    sarq $63, %r13
2433 ; AVX2-NEXT:    vmovd %r13d, %xmm1
2434 ; AVX2-NEXT:    shlq $62, %r12
2435 ; AVX2-NEXT:    sarq $63, %r12
2436 ; AVX2-NEXT:    vpinsrw $1, %r12d, %xmm1, %xmm1
2437 ; AVX2-NEXT:    shlq $61, %rbx
2438 ; AVX2-NEXT:    sarq $63, %rbx
2439 ; AVX2-NEXT:    vpinsrw $2, %ebx, %xmm1, %xmm1
2440 ; AVX2-NEXT:    shlq $60, %rdi
2441 ; AVX2-NEXT:    sarq $63, %rdi
2442 ; AVX2-NEXT:    vpinsrw $3, %edi, %xmm1, %xmm1
2443 ; AVX2-NEXT:    shlq $59, %rcx
2444 ; AVX2-NEXT:    sarq $63, %rcx
2445 ; AVX2-NEXT:    vpinsrw $4, %ecx, %xmm1, %xmm1
2446 ; AVX2-NEXT:    shlq $58, %rdx
2447 ; AVX2-NEXT:    sarq $63, %rdx
2448 ; AVX2-NEXT:    vpinsrw $5, %edx, %xmm1, %xmm1
2449 ; AVX2-NEXT:    shlq $57, %rsi
2450 ; AVX2-NEXT:    sarq $63, %rsi
2451 ; AVX2-NEXT:    vpinsrw $6, %esi, %xmm1, %xmm1
2452 ; AVX2-NEXT:    shrq $7, %rbp
2453 ; AVX2-NEXT:    vpinsrw $7, %ebp, %xmm1, %xmm1
2454 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
2455 ; AVX2-NEXT:    popq %rbx
2456 ; AVX2-NEXT:    popq %r12
2457 ; AVX2-NEXT:    popq %r13
2458 ; AVX2-NEXT:    popq %r14
2459 ; AVX2-NEXT:    popq %r15
2460 ; AVX2-NEXT:    popq %rbp
2461 ; AVX2-NEXT:    retq
2462 ;
2463 ; X32-SSE41-LABEL: load_sext_16i1_to_16i16:
2464 ; X32-SSE41:       # BB#0: # %entry
2465 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2466 ; X32-SSE41-NEXT:    movzwl (%eax), %eax
2467 ; X32-SSE41-NEXT:    movl %eax, %ecx
2468 ; X32-SSE41-NEXT:    shrl %ecx
2469 ; X32-SSE41-NEXT:    andl $1, %ecx
2470 ; X32-SSE41-NEXT:    movl %eax, %edx
2471 ; X32-SSE41-NEXT:    andl $1, %edx
2472 ; X32-SSE41-NEXT:    movd %edx, %xmm1
2473 ; X32-SSE41-NEXT:    pinsrb $1, %ecx, %xmm1
2474 ; X32-SSE41-NEXT:    movl %eax, %ecx
2475 ; X32-SSE41-NEXT:    shrl $2, %ecx
2476 ; X32-SSE41-NEXT:    andl $1, %ecx
2477 ; X32-SSE41-NEXT:    pinsrb $2, %ecx, %xmm1
2478 ; X32-SSE41-NEXT:    movl %eax, %ecx
2479 ; X32-SSE41-NEXT:    shrl $3, %ecx
2480 ; X32-SSE41-NEXT:    andl $1, %ecx
2481 ; X32-SSE41-NEXT:    pinsrb $3, %ecx, %xmm1
2482 ; X32-SSE41-NEXT:    movl %eax, %ecx
2483 ; X32-SSE41-NEXT:    shrl $4, %ecx
2484 ; X32-SSE41-NEXT:    andl $1, %ecx
2485 ; X32-SSE41-NEXT:    pinsrb $4, %ecx, %xmm1
2486 ; X32-SSE41-NEXT:    movl %eax, %ecx
2487 ; X32-SSE41-NEXT:    shrl $5, %ecx
2488 ; X32-SSE41-NEXT:    andl $1, %ecx
2489 ; X32-SSE41-NEXT:    pinsrb $5, %ecx, %xmm1
2490 ; X32-SSE41-NEXT:    movl %eax, %ecx
2491 ; X32-SSE41-NEXT:    shrl $6, %ecx
2492 ; X32-SSE41-NEXT:    andl $1, %ecx
2493 ; X32-SSE41-NEXT:    pinsrb $6, %ecx, %xmm1
2494 ; X32-SSE41-NEXT:    movl %eax, %ecx
2495 ; X32-SSE41-NEXT:    shrl $7, %ecx
2496 ; X32-SSE41-NEXT:    andl $1, %ecx
2497 ; X32-SSE41-NEXT:    pinsrb $7, %ecx, %xmm1
2498 ; X32-SSE41-NEXT:    movl %eax, %ecx
2499 ; X32-SSE41-NEXT:    shrl $8, %ecx
2500 ; X32-SSE41-NEXT:    andl $1, %ecx
2501 ; X32-SSE41-NEXT:    pinsrb $8, %ecx, %xmm1
2502 ; X32-SSE41-NEXT:    movl %eax, %ecx
2503 ; X32-SSE41-NEXT:    shrl $9, %ecx
2504 ; X32-SSE41-NEXT:    andl $1, %ecx
2505 ; X32-SSE41-NEXT:    pinsrb $9, %ecx, %xmm1
2506 ; X32-SSE41-NEXT:    movl %eax, %ecx
2507 ; X32-SSE41-NEXT:    shrl $10, %ecx
2508 ; X32-SSE41-NEXT:    andl $1, %ecx
2509 ; X32-SSE41-NEXT:    pinsrb $10, %ecx, %xmm1
2510 ; X32-SSE41-NEXT:    movl %eax, %ecx
2511 ; X32-SSE41-NEXT:    shrl $11, %ecx
2512 ; X32-SSE41-NEXT:    andl $1, %ecx
2513 ; X32-SSE41-NEXT:    pinsrb $11, %ecx, %xmm1
2514 ; X32-SSE41-NEXT:    movl %eax, %ecx
2515 ; X32-SSE41-NEXT:    shrl $12, %ecx
2516 ; X32-SSE41-NEXT:    andl $1, %ecx
2517 ; X32-SSE41-NEXT:    pinsrb $12, %ecx, %xmm1
2518 ; X32-SSE41-NEXT:    movl %eax, %ecx
2519 ; X32-SSE41-NEXT:    shrl $13, %ecx
2520 ; X32-SSE41-NEXT:    andl $1, %ecx
2521 ; X32-SSE41-NEXT:    pinsrb $13, %ecx, %xmm1
2522 ; X32-SSE41-NEXT:    movl %eax, %ecx
2523 ; X32-SSE41-NEXT:    shrl $14, %ecx
2524 ; X32-SSE41-NEXT:    andl $1, %ecx
2525 ; X32-SSE41-NEXT:    pinsrb $14, %ecx, %xmm1
2526 ; X32-SSE41-NEXT:    shrl $15, %eax
2527 ; X32-SSE41-NEXT:    pinsrb $15, %eax, %xmm1
2528 ; 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
2529 ; X32-SSE41-NEXT:    psllw $15, %xmm0
2530 ; X32-SSE41-NEXT:    psraw $15, %xmm0
2531 ; X32-SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2532 ; X32-SSE41-NEXT:    psllw $15, %xmm1
2533 ; X32-SSE41-NEXT:    psraw $15, %xmm1
2534 ; X32-SSE41-NEXT:    retl
2535 entry:
2536  %X = load <16 x i1>, <16 x i1>* %ptr
2537  %Y = sext <16 x i1> %X to <16 x i16>
2538  ret <16 x i16> %Y
2539 }
2540
2541 define <32 x i8> @load_sext_32i1_to_32i8(<32 x i1> *%ptr) nounwind readnone {
2542 ; SSE2-LABEL: load_sext_32i1_to_32i8:
2543 ; SSE2:       # BB#0: # %entry
2544 ; SSE2-NEXT:    pushq %rbp
2545 ; SSE2-NEXT:    pushq %r15
2546 ; SSE2-NEXT:    pushq %r14
2547 ; SSE2-NEXT:    pushq %r13
2548 ; SSE2-NEXT:    pushq %r12
2549 ; SSE2-NEXT:    pushq %rbx
2550 ; SSE2-NEXT:    movswq (%rdi), %rbx
2551 ; SSE2-NEXT:    movq %rbx, %r10
2552 ; SSE2-NEXT:    movq %rbx, %r8
2553 ; SSE2-NEXT:    movq %rbx, %r9
2554 ; SSE2-NEXT:    movq %rbx, %r11
2555 ; SSE2-NEXT:    movq %rbx, %r14
2556 ; SSE2-NEXT:    movq %rbx, %r15
2557 ; SSE2-NEXT:    movq %rbx, %r12
2558 ; SSE2-NEXT:    movq %rbx, %r13
2559 ; SSE2-NEXT:    movq %rbx, %rdx
2560 ; SSE2-NEXT:    movq %rbx, %rsi
2561 ; SSE2-NEXT:    movq %rbx, %rcx
2562 ; SSE2-NEXT:    movq %rbx, %rbp
2563 ; SSE2-NEXT:    movq %rbx, %rax
2564 ; SSE2-NEXT:    shlq $49, %rax
2565 ; SSE2-NEXT:    sarq $63, %rax
2566 ; SSE2-NEXT:    movd %eax, %xmm0
2567 ; SSE2-NEXT:    movq %rbx, %rax
2568 ; SSE2-NEXT:    shlq $57, %r10
2569 ; SSE2-NEXT:    sarq $63, %r10
2570 ; SSE2-NEXT:    movd %r10d, %xmm15
2571 ; SSE2-NEXT:    movq %rbx, %r10
2572 ; SSE2-NEXT:    movsbq %bl, %rbx
2573 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm15 = xmm15[0],xmm0[0],xmm15[1],xmm0[1],xmm15[2],xmm0[2],xmm15[3],xmm0[3],xmm15[4],xmm0[4],xmm15[5],xmm0[5],xmm15[6],xmm0[6],xmm15[7],xmm0[7]
2574 ; SSE2-NEXT:    shlq $53, %r8
2575 ; SSE2-NEXT:    sarq $63, %r8
2576 ; SSE2-NEXT:    movd %r8d, %xmm8
2577 ; SSE2-NEXT:    shlq $61, %r9
2578 ; SSE2-NEXT:    sarq $63, %r9
2579 ; SSE2-NEXT:    movd %r9d, %xmm2
2580 ; SSE2-NEXT:    shlq $51, %r11
2581 ; SSE2-NEXT:    sarq $63, %r11
2582 ; SSE2-NEXT:    movd %r11d, %xmm9
2583 ; SSE2-NEXT:    shlq $59, %r14
2584 ; SSE2-NEXT:    sarq $63, %r14
2585 ; SSE2-NEXT:    movd %r14d, %xmm5
2586 ; SSE2-NEXT:    shlq $55, %r15
2587 ; SSE2-NEXT:    sarq $63, %r15
2588 ; SSE2-NEXT:    movd %r15d, %xmm10
2589 ; SSE2-NEXT:    shlq $63, %r12
2590 ; SSE2-NEXT:    sarq $63, %r12
2591 ; SSE2-NEXT:    movd %r12d, %xmm0
2592 ; SSE2-NEXT:    shlq $50, %r13
2593 ; SSE2-NEXT:    sarq $63, %r13
2594 ; SSE2-NEXT:    movd %r13d, %xmm11
2595 ; SSE2-NEXT:    shlq $58, %rdx
2596 ; SSE2-NEXT:    sarq $63, %rdx
2597 ; SSE2-NEXT:    movd %edx, %xmm4
2598 ; SSE2-NEXT:    shlq $54, %rsi
2599 ; SSE2-NEXT:    sarq $63, %rsi
2600 ; SSE2-NEXT:    movd %esi, %xmm12
2601 ; SSE2-NEXT:    shlq $62, %rcx
2602 ; SSE2-NEXT:    sarq $63, %rcx
2603 ; SSE2-NEXT:    movd %ecx, %xmm6
2604 ; SSE2-NEXT:    shlq $52, %rbp
2605 ; SSE2-NEXT:    sarq $63, %rbp
2606 ; SSE2-NEXT:    movd %ebp, %xmm13
2607 ; SSE2-NEXT:    shlq $60, %rax
2608 ; SSE2-NEXT:    sarq $63, %rax
2609 ; SSE2-NEXT:    movd %eax, %xmm7
2610 ; SSE2-NEXT:    shrq $15, %r10
2611 ; SSE2-NEXT:    movd %r10d, %xmm14
2612 ; SSE2-NEXT:    shrq $7, %rbx
2613 ; SSE2-NEXT:    movd %ebx, %xmm3
2614 ; SSE2-NEXT:    movswq 2(%rdi), %rdx
2615 ; SSE2-NEXT:    movq %rdx, %r8
2616 ; SSE2-NEXT:    movq %rdx, %r9
2617 ; SSE2-NEXT:    movq %rdx, %r10
2618 ; SSE2-NEXT:    movq %rdx, %r11
2619 ; SSE2-NEXT:    movq %rdx, %r14
2620 ; SSE2-NEXT:    movq %rdx, %r15
2621 ; SSE2-NEXT:    movq %rdx, %r12
2622 ; SSE2-NEXT:    movq %rdx, %r13
2623 ; SSE2-NEXT:    movq %rdx, %rbx
2624 ; SSE2-NEXT:    movq %rdx, %rax
2625 ; SSE2-NEXT:    movq %rdx, %rcx
2626 ; SSE2-NEXT:    movq %rdx, %rsi
2627 ; SSE2-NEXT:    movq %rdx, %rdi
2628 ; SSE2-NEXT:    movq %rdx, %rbp
2629 ; SSE2-NEXT:    shlq $49, %rbp
2630 ; SSE2-NEXT:    sarq $63, %rbp
2631 ; SSE2-NEXT:    movd %ebp, %xmm1
2632 ; SSE2-NEXT:    movq %rdx, %rbp
2633 ; SSE2-NEXT:    movsbq %dl, %rdx
2634 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm8[0],xmm2[1],xmm8[1],xmm2[2],xmm8[2],xmm2[3],xmm8[3],xmm2[4],xmm8[4],xmm2[5],xmm8[5],xmm2[6],xmm8[6],xmm2[7],xmm8[7]
2635 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm15[0],xmm2[1],xmm15[1],xmm2[2],xmm15[2],xmm2[3],xmm15[3],xmm2[4],xmm15[4],xmm2[5],xmm15[5],xmm2[6],xmm15[6],xmm2[7],xmm15[7]
2636 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm9[0],xmm5[1],xmm9[1],xmm5[2],xmm9[2],xmm5[3],xmm9[3],xmm5[4],xmm9[4],xmm5[5],xmm9[5],xmm5[6],xmm9[6],xmm5[7],xmm9[7]
2637 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm10[0],xmm0[1],xmm10[1],xmm0[2],xmm10[2],xmm0[3],xmm10[3],xmm0[4],xmm10[4],xmm0[5],xmm10[5],xmm0[6],xmm10[6],xmm0[7],xmm10[7]
2638 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1],xmm0[2],xmm5[2],xmm0[3],xmm5[3],xmm0[4],xmm5[4],xmm0[5],xmm5[5],xmm0[6],xmm5[6],xmm0[7],xmm5[7]
2639 ; 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]
2640 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm11[0],xmm4[1],xmm11[1],xmm4[2],xmm11[2],xmm4[3],xmm11[3],xmm4[4],xmm11[4],xmm4[5],xmm11[5],xmm4[6],xmm11[6],xmm4[7],xmm11[7]
2641 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm12[0],xmm6[1],xmm12[1],xmm6[2],xmm12[2],xmm6[3],xmm12[3],xmm6[4],xmm12[4],xmm6[5],xmm12[5],xmm6[6],xmm12[6],xmm6[7],xmm12[7]
2642 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm4[0],xmm6[1],xmm4[1],xmm6[2],xmm4[2],xmm6[3],xmm4[3],xmm6[4],xmm4[4],xmm6[5],xmm4[5],xmm6[6],xmm4[6],xmm6[7],xmm4[7]
2643 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm13[0],xmm7[1],xmm13[1],xmm7[2],xmm13[2],xmm7[3],xmm13[3],xmm7[4],xmm13[4],xmm7[5],xmm13[5],xmm7[6],xmm13[6],xmm7[7],xmm13[7]
2644 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm14[0],xmm3[1],xmm14[1],xmm3[2],xmm14[2],xmm3[3],xmm14[3],xmm3[4],xmm14[4],xmm3[5],xmm14[5],xmm3[6],xmm14[6],xmm3[7],xmm14[7]
2645 ; SSE2-NEXT:    shlq $57, %r8
2646 ; SSE2-NEXT:    sarq $63, %r8
2647 ; SSE2-NEXT:    movd %r8d, %xmm2
2648 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm3[0],xmm7[1],xmm3[1],xmm7[2],xmm3[2],xmm7[3],xmm3[3],xmm7[4],xmm3[4],xmm7[5],xmm3[5],xmm7[6],xmm3[6],xmm7[7],xmm3[7]
2649 ; SSE2-NEXT:    shlq $53, %r9
2650 ; SSE2-NEXT:    sarq $63, %r9
2651 ; SSE2-NEXT:    movd %r9d, %xmm3
2652 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm7[0],xmm6[1],xmm7[1],xmm6[2],xmm7[2],xmm6[3],xmm7[3],xmm6[4],xmm7[4],xmm6[5],xmm7[5],xmm6[6],xmm7[6],xmm6[7],xmm7[7]
2653 ; SSE2-NEXT:    shlq $61, %r10
2654 ; SSE2-NEXT:    sarq $63, %r10
2655 ; SSE2-NEXT:    movd %r10d, %xmm4
2656 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm6[0],xmm0[1],xmm6[1],xmm0[2],xmm6[2],xmm0[3],xmm6[3],xmm0[4],xmm6[4],xmm0[5],xmm6[5],xmm0[6],xmm6[6],xmm0[7],xmm6[7]
2657 ; SSE2-NEXT:    shlq $51, %r11
2658 ; SSE2-NEXT:    sarq $63, %r11
2659 ; SSE2-NEXT:    movd %r11d, %xmm5
2660 ; 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]
2661 ; SSE2-NEXT:    shlq $59, %r14
2662 ; SSE2-NEXT:    sarq $63, %r14
2663 ; SSE2-NEXT:    movd %r14d, %xmm6
2664 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]
2665 ; SSE2-NEXT:    shlq $55, %r15
2666 ; SSE2-NEXT:    sarq $63, %r15
2667 ; SSE2-NEXT:    movd %r15d, %xmm3
2668 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]
2669 ; SSE2-NEXT:    shlq $63, %r12
2670 ; SSE2-NEXT:    sarq $63, %r12
2671 ; SSE2-NEXT:    movd %r12d, %xmm1
2672 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1],xmm6[2],xmm5[2],xmm6[3],xmm5[3],xmm6[4],xmm5[4],xmm6[5],xmm5[5],xmm6[6],xmm5[6],xmm6[7],xmm5[7]
2673 ; SSE2-NEXT:    shlq $50, %r13
2674 ; SSE2-NEXT:    sarq $63, %r13
2675 ; SSE2-NEXT:    movd %r13d, %xmm2
2676 ; 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]
2677 ; SSE2-NEXT:    shlq $58, %rbx
2678 ; SSE2-NEXT:    sarq $63, %rbx
2679 ; SSE2-NEXT:    movd %ebx, %xmm3
2680 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm6[0],xmm1[1],xmm6[1],xmm1[2],xmm6[2],xmm1[3],xmm6[3],xmm1[4],xmm6[4],xmm1[5],xmm6[5],xmm1[6],xmm6[6],xmm1[7],xmm6[7]
2681 ; SSE2-NEXT:    shlq $54, %rax
2682 ; SSE2-NEXT:    sarq $63, %rax
2683 ; SSE2-NEXT:    movd %eax, %xmm5
2684 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3],xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7]
2685 ; SSE2-NEXT:    shlq $62, %rcx
2686 ; SSE2-NEXT:    sarq $63, %rcx
2687 ; SSE2-NEXT:    movd %ecx, %xmm4
2688 ; 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]
2689 ; SSE2-NEXT:    shlq $52, %rsi
2690 ; SSE2-NEXT:    sarq $63, %rsi
2691 ; SSE2-NEXT:    movd %esi, %xmm2
2692 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1],xmm4[2],xmm5[2],xmm4[3],xmm5[3],xmm4[4],xmm5[4],xmm4[5],xmm5[5],xmm4[6],xmm5[6],xmm4[7],xmm5[7]
2693 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]
2694 ; SSE2-NEXT:    shlq $60, %rdi
2695 ; SSE2-NEXT:    sarq $63, %rdi
2696 ; SSE2-NEXT:    movd %edi, %xmm3
2697 ; 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]
2698 ; SSE2-NEXT:    shrq $15, %rbp
2699 ; SSE2-NEXT:    movd %ebp, %xmm2
2700 ; SSE2-NEXT:    shrq $7, %rdx
2701 ; SSE2-NEXT:    movd %edx, %xmm5
2702 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1],xmm5[2],xmm2[2],xmm5[3],xmm2[3],xmm5[4],xmm2[4],xmm5[5],xmm2[5],xmm5[6],xmm2[6],xmm5[7],xmm2[7]
2703 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1],xmm3[2],xmm5[2],xmm3[3],xmm5[3],xmm3[4],xmm5[4],xmm3[5],xmm5[5],xmm3[6],xmm5[6],xmm3[7],xmm5[7]
2704 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]
2705 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3],xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7]
2706 ; SSE2-NEXT:    popq %rbx
2707 ; SSE2-NEXT:    popq %r12
2708 ; SSE2-NEXT:    popq %r13
2709 ; SSE2-NEXT:    popq %r14
2710 ; SSE2-NEXT:    popq %r15
2711 ; SSE2-NEXT:    popq %rbp
2712 ; SSE2-NEXT:    retq
2713 ;
2714 ; SSSE3-LABEL: load_sext_32i1_to_32i8:
2715 ; SSSE3:       # BB#0: # %entry
2716 ; SSSE3-NEXT:    pushq %rbp
2717 ; SSSE3-NEXT:    pushq %r15
2718 ; SSSE3-NEXT:    pushq %r14
2719 ; SSSE3-NEXT:    pushq %r13
2720 ; SSSE3-NEXT:    pushq %r12
2721 ; SSSE3-NEXT:    pushq %rbx
2722 ; SSSE3-NEXT:    movswq (%rdi), %rbx
2723 ; SSSE3-NEXT:    movq %rbx, %r10
2724 ; SSSE3-NEXT:    movq %rbx, %r8
2725 ; SSSE3-NEXT:    movq %rbx, %r9
2726 ; SSSE3-NEXT:    movq %rbx, %r11
2727 ; SSSE3-NEXT:    movq %rbx, %r14
2728 ; SSSE3-NEXT:    movq %rbx, %r15
2729 ; SSSE3-NEXT:    movq %rbx, %r12
2730 ; SSSE3-NEXT:    movq %rbx, %r13
2731 ; SSSE3-NEXT:    movq %rbx, %rdx
2732 ; SSSE3-NEXT:    movq %rbx, %rsi
2733 ; SSSE3-NEXT:    movq %rbx, %rcx
2734 ; SSSE3-NEXT:    movq %rbx, %rbp
2735 ; SSSE3-NEXT:    movq %rbx, %rax
2736 ; SSSE3-NEXT:    shlq $49, %rax
2737 ; SSSE3-NEXT:    sarq $63, %rax
2738 ; SSSE3-NEXT:    movd %eax, %xmm0
2739 ; SSSE3-NEXT:    movq %rbx, %rax
2740 ; SSSE3-NEXT:    shlq $57, %r10
2741 ; SSSE3-NEXT:    sarq $63, %r10
2742 ; SSSE3-NEXT:    movd %r10d, %xmm15
2743 ; SSSE3-NEXT:    movq %rbx, %r10
2744 ; SSSE3-NEXT:    movsbq %bl, %rbx
2745 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm15 = xmm15[0],xmm0[0],xmm15[1],xmm0[1],xmm15[2],xmm0[2],xmm15[3],xmm0[3],xmm15[4],xmm0[4],xmm15[5],xmm0[5],xmm15[6],xmm0[6],xmm15[7],xmm0[7]
2746 ; SSSE3-NEXT:    shlq $53, %r8
2747 ; SSSE3-NEXT:    sarq $63, %r8
2748 ; SSSE3-NEXT:    movd %r8d, %xmm8
2749 ; SSSE3-NEXT:    shlq $61, %r9
2750 ; SSSE3-NEXT:    sarq $63, %r9
2751 ; SSSE3-NEXT:    movd %r9d, %xmm2
2752 ; SSSE3-NEXT:    shlq $51, %r11
2753 ; SSSE3-NEXT:    sarq $63, %r11
2754 ; SSSE3-NEXT:    movd %r11d, %xmm9
2755 ; SSSE3-NEXT:    shlq $59, %r14
2756 ; SSSE3-NEXT:    sarq $63, %r14
2757 ; SSSE3-NEXT:    movd %r14d, %xmm5
2758 ; SSSE3-NEXT:    shlq $55, %r15
2759 ; SSSE3-NEXT:    sarq $63, %r15
2760 ; SSSE3-NEXT:    movd %r15d, %xmm10
2761 ; SSSE3-NEXT:    shlq $63, %r12
2762 ; SSSE3-NEXT:    sarq $63, %r12
2763 ; SSSE3-NEXT:    movd %r12d, %xmm0
2764 ; SSSE3-NEXT:    shlq $50, %r13
2765 ; SSSE3-NEXT:    sarq $63, %r13
2766 ; SSSE3-NEXT:    movd %r13d, %xmm11
2767 ; SSSE3-NEXT:    shlq $58, %rdx
2768 ; SSSE3-NEXT:    sarq $63, %rdx
2769 ; SSSE3-NEXT:    movd %edx, %xmm4
2770 ; SSSE3-NEXT:    shlq $54, %rsi
2771 ; SSSE3-NEXT:    sarq $63, %rsi
2772 ; SSSE3-NEXT:    movd %esi, %xmm12
2773 ; SSSE3-NEXT:    shlq $62, %rcx
2774 ; SSSE3-NEXT:    sarq $63, %rcx
2775 ; SSSE3-NEXT:    movd %ecx, %xmm6
2776 ; SSSE3-NEXT:    shlq $52, %rbp
2777 ; SSSE3-NEXT:    sarq $63, %rbp
2778 ; SSSE3-NEXT:    movd %ebp, %xmm13
2779 ; SSSE3-NEXT:    shlq $60, %rax
2780 ; SSSE3-NEXT:    sarq $63, %rax
2781 ; SSSE3-NEXT:    movd %eax, %xmm7
2782 ; SSSE3-NEXT:    shrq $15, %r10
2783 ; SSSE3-NEXT:    movd %r10d, %xmm14
2784 ; SSSE3-NEXT:    shrq $7, %rbx
2785 ; SSSE3-NEXT:    movd %ebx, %xmm3
2786 ; SSSE3-NEXT:    movswq 2(%rdi), %rdx
2787 ; SSSE3-NEXT:    movq %rdx, %r8
2788 ; SSSE3-NEXT:    movq %rdx, %r9
2789 ; SSSE3-NEXT:    movq %rdx, %r10
2790 ; SSSE3-NEXT:    movq %rdx, %r11
2791 ; SSSE3-NEXT:    movq %rdx, %r14
2792 ; SSSE3-NEXT:    movq %rdx, %r15
2793 ; SSSE3-NEXT:    movq %rdx, %r12
2794 ; SSSE3-NEXT:    movq %rdx, %r13
2795 ; SSSE3-NEXT:    movq %rdx, %rbx
2796 ; SSSE3-NEXT:    movq %rdx, %rax
2797 ; SSSE3-NEXT:    movq %rdx, %rcx
2798 ; SSSE3-NEXT:    movq %rdx, %rsi
2799 ; SSSE3-NEXT:    movq %rdx, %rdi
2800 ; SSSE3-NEXT:    movq %rdx, %rbp
2801 ; SSSE3-NEXT:    shlq $49, %rbp
2802 ; SSSE3-NEXT:    sarq $63, %rbp
2803 ; SSSE3-NEXT:    movd %ebp, %xmm1
2804 ; SSSE3-NEXT:    movq %rdx, %rbp
2805 ; SSSE3-NEXT:    movsbq %dl, %rdx
2806 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm8[0],xmm2[1],xmm8[1],xmm2[2],xmm8[2],xmm2[3],xmm8[3],xmm2[4],xmm8[4],xmm2[5],xmm8[5],xmm2[6],xmm8[6],xmm2[7],xmm8[7]
2807 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm15[0],xmm2[1],xmm15[1],xmm2[2],xmm15[2],xmm2[3],xmm15[3],xmm2[4],xmm15[4],xmm2[5],xmm15[5],xmm2[6],xmm15[6],xmm2[7],xmm15[7]
2808 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm9[0],xmm5[1],xmm9[1],xmm5[2],xmm9[2],xmm5[3],xmm9[3],xmm5[4],xmm9[4],xmm5[5],xmm9[5],xmm5[6],xmm9[6],xmm5[7],xmm9[7]
2809 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm10[0],xmm0[1],xmm10[1],xmm0[2],xmm10[2],xmm0[3],xmm10[3],xmm0[4],xmm10[4],xmm0[5],xmm10[5],xmm0[6],xmm10[6],xmm0[7],xmm10[7]
2810 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1],xmm0[2],xmm5[2],xmm0[3],xmm5[3],xmm0[4],xmm5[4],xmm0[5],xmm5[5],xmm0[6],xmm5[6],xmm0[7],xmm5[7]
2811 ; 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]
2812 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm11[0],xmm4[1],xmm11[1],xmm4[2],xmm11[2],xmm4[3],xmm11[3],xmm4[4],xmm11[4],xmm4[5],xmm11[5],xmm4[6],xmm11[6],xmm4[7],xmm11[7]
2813 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm12[0],xmm6[1],xmm12[1],xmm6[2],xmm12[2],xmm6[3],xmm12[3],xmm6[4],xmm12[4],xmm6[5],xmm12[5],xmm6[6],xmm12[6],xmm6[7],xmm12[7]
2814 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm4[0],xmm6[1],xmm4[1],xmm6[2],xmm4[2],xmm6[3],xmm4[3],xmm6[4],xmm4[4],xmm6[5],xmm4[5],xmm6[6],xmm4[6],xmm6[7],xmm4[7]
2815 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm13[0],xmm7[1],xmm13[1],xmm7[2],xmm13[2],xmm7[3],xmm13[3],xmm7[4],xmm13[4],xmm7[5],xmm13[5],xmm7[6],xmm13[6],xmm7[7],xmm13[7]
2816 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm14[0],xmm3[1],xmm14[1],xmm3[2],xmm14[2],xmm3[3],xmm14[3],xmm3[4],xmm14[4],xmm3[5],xmm14[5],xmm3[6],xmm14[6],xmm3[7],xmm14[7]
2817 ; SSSE3-NEXT:    shlq $57, %r8
2818 ; SSSE3-NEXT:    sarq $63, %r8
2819 ; SSSE3-NEXT:    movd %r8d, %xmm2
2820 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm3[0],xmm7[1],xmm3[1],xmm7[2],xmm3[2],xmm7[3],xmm3[3],xmm7[4],xmm3[4],xmm7[5],xmm3[5],xmm7[6],xmm3[6],xmm7[7],xmm3[7]
2821 ; SSSE3-NEXT:    shlq $53, %r9
2822 ; SSSE3-NEXT:    sarq $63, %r9
2823 ; SSSE3-NEXT:    movd %r9d, %xmm3
2824 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm7[0],xmm6[1],xmm7[1],xmm6[2],xmm7[2],xmm6[3],xmm7[3],xmm6[4],xmm7[4],xmm6[5],xmm7[5],xmm6[6],xmm7[6],xmm6[7],xmm7[7]
2825 ; SSSE3-NEXT:    shlq $61, %r10
2826 ; SSSE3-NEXT:    sarq $63, %r10
2827 ; SSSE3-NEXT:    movd %r10d, %xmm4
2828 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm6[0],xmm0[1],xmm6[1],xmm0[2],xmm6[2],xmm0[3],xmm6[3],xmm0[4],xmm6[4],xmm0[5],xmm6[5],xmm0[6],xmm6[6],xmm0[7],xmm6[7]
2829 ; SSSE3-NEXT:    shlq $51, %r11
2830 ; SSSE3-NEXT:    sarq $63, %r11
2831 ; SSSE3-NEXT:    movd %r11d, %xmm5
2832 ; 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]
2833 ; SSSE3-NEXT:    shlq $59, %r14
2834 ; SSSE3-NEXT:    sarq $63, %r14
2835 ; SSSE3-NEXT:    movd %r14d, %xmm6
2836 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]
2837 ; SSSE3-NEXT:    shlq $55, %r15
2838 ; SSSE3-NEXT:    sarq $63, %r15
2839 ; SSSE3-NEXT:    movd %r15d, %xmm3
2840 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]
2841 ; SSSE3-NEXT:    shlq $63, %r12
2842 ; SSSE3-NEXT:    sarq $63, %r12
2843 ; SSSE3-NEXT:    movd %r12d, %xmm1
2844 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1],xmm6[2],xmm5[2],xmm6[3],xmm5[3],xmm6[4],xmm5[4],xmm6[5],xmm5[5],xmm6[6],xmm5[6],xmm6[7],xmm5[7]
2845 ; SSSE3-NEXT:    shlq $50, %r13
2846 ; SSSE3-NEXT:    sarq $63, %r13
2847 ; SSSE3-NEXT:    movd %r13d, %xmm2
2848 ; 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]
2849 ; SSSE3-NEXT:    shlq $58, %rbx
2850 ; SSSE3-NEXT:    sarq $63, %rbx
2851 ; SSSE3-NEXT:    movd %ebx, %xmm3
2852 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm6[0],xmm1[1],xmm6[1],xmm1[2],xmm6[2],xmm1[3],xmm6[3],xmm1[4],xmm6[4],xmm1[5],xmm6[5],xmm1[6],xmm6[6],xmm1[7],xmm6[7]
2853 ; SSSE3-NEXT:    shlq $54, %rax
2854 ; SSSE3-NEXT:    sarq $63, %rax
2855 ; SSSE3-NEXT:    movd %eax, %xmm5
2856 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3],xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7]
2857 ; SSSE3-NEXT:    shlq $62, %rcx
2858 ; SSSE3-NEXT:    sarq $63, %rcx
2859 ; SSSE3-NEXT:    movd %ecx, %xmm4
2860 ; 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]
2861 ; SSSE3-NEXT:    shlq $52, %rsi
2862 ; SSSE3-NEXT:    sarq $63, %rsi
2863 ; SSSE3-NEXT:    movd %esi, %xmm2
2864 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1],xmm4[2],xmm5[2],xmm4[3],xmm5[3],xmm4[4],xmm5[4],xmm4[5],xmm5[5],xmm4[6],xmm5[6],xmm4[7],xmm5[7]
2865 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]
2866 ; SSSE3-NEXT:    shlq $60, %rdi
2867 ; SSSE3-NEXT:    sarq $63, %rdi
2868 ; SSSE3-NEXT:    movd %edi, %xmm3
2869 ; 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]
2870 ; SSSE3-NEXT:    shrq $15, %rbp
2871 ; SSSE3-NEXT:    movd %ebp, %xmm2
2872 ; SSSE3-NEXT:    shrq $7, %rdx
2873 ; SSSE3-NEXT:    movd %edx, %xmm5
2874 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1],xmm5[2],xmm2[2],xmm5[3],xmm2[3],xmm5[4],xmm2[4],xmm5[5],xmm2[5],xmm5[6],xmm2[6],xmm5[7],xmm2[7]
2875 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1],xmm3[2],xmm5[2],xmm3[3],xmm5[3],xmm3[4],xmm5[4],xmm3[5],xmm5[5],xmm3[6],xmm5[6],xmm3[7],xmm5[7]
2876 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]
2877 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3],xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7]
2878 ; SSSE3-NEXT:    popq %rbx
2879 ; SSSE3-NEXT:    popq %r12
2880 ; SSSE3-NEXT:    popq %r13
2881 ; SSSE3-NEXT:    popq %r14
2882 ; SSSE3-NEXT:    popq %r15
2883 ; SSSE3-NEXT:    popq %rbp
2884 ; SSSE3-NEXT:    retq
2885 ;
2886 ; SSE41-LABEL: load_sext_32i1_to_32i8:
2887 ; SSE41:       # BB#0: # %entry
2888 ; SSE41-NEXT:    movswq (%rdi), %rax
2889 ; SSE41-NEXT:    movq %rax, %rcx
2890 ; SSE41-NEXT:    shlq $62, %rcx
2891 ; SSE41-NEXT:    sarq $63, %rcx
2892 ; SSE41-NEXT:    movq %rax, %rdx
2893 ; SSE41-NEXT:    shlq $63, %rdx
2894 ; SSE41-NEXT:    sarq $63, %rdx
2895 ; SSE41-NEXT:    movd %edx, %xmm0
2896 ; SSE41-NEXT:    pinsrb $1, %ecx, %xmm0
2897 ; SSE41-NEXT:    movq %rax, %rcx
2898 ; SSE41-NEXT:    shlq $61, %rcx
2899 ; SSE41-NEXT:    sarq $63, %rcx
2900 ; SSE41-NEXT:    pinsrb $2, %ecx, %xmm0
2901 ; SSE41-NEXT:    movq %rax, %rcx
2902 ; SSE41-NEXT:    shlq $60, %rcx
2903 ; SSE41-NEXT:    sarq $63, %rcx
2904 ; SSE41-NEXT:    pinsrb $3, %ecx, %xmm0
2905 ; SSE41-NEXT:    movq %rax, %rcx
2906 ; SSE41-NEXT:    shlq $59, %rcx
2907 ; SSE41-NEXT:    sarq $63, %rcx
2908 ; SSE41-NEXT:    pinsrb $4, %ecx, %xmm0
2909 ; SSE41-NEXT:    movq %rax, %rcx
2910 ; SSE41-NEXT:    shlq $58, %rcx
2911 ; SSE41-NEXT:    sarq $63, %rcx
2912 ; SSE41-NEXT:    pinsrb $5, %ecx, %xmm0
2913 ; SSE41-NEXT:    movq %rax, %rcx
2914 ; SSE41-NEXT:    shlq $57, %rcx
2915 ; SSE41-NEXT:    sarq $63, %rcx
2916 ; SSE41-NEXT:    pinsrb $6, %ecx, %xmm0
2917 ; SSE41-NEXT:    movsbq %al, %rcx
2918 ; SSE41-NEXT:    shrq $7, %rcx
2919 ; SSE41-NEXT:    pinsrb $7, %ecx, %xmm0
2920 ; SSE41-NEXT:    movq %rax, %rcx
2921 ; SSE41-NEXT:    shlq $55, %rcx
2922 ; SSE41-NEXT:    sarq $63, %rcx
2923 ; SSE41-NEXT:    pinsrb $8, %ecx, %xmm0
2924 ; SSE41-NEXT:    movq %rax, %rcx
2925 ; SSE41-NEXT:    shlq $54, %rcx
2926 ; SSE41-NEXT:    sarq $63, %rcx
2927 ; SSE41-NEXT:    pinsrb $9, %ecx, %xmm0
2928 ; SSE41-NEXT:    movq %rax, %rcx
2929 ; SSE41-NEXT:    shlq $53, %rcx
2930 ; SSE41-NEXT:    sarq $63, %rcx
2931 ; SSE41-NEXT:    pinsrb $10, %ecx, %xmm0
2932 ; SSE41-NEXT:    movq %rax, %rcx
2933 ; SSE41-NEXT:    shlq $52, %rcx
2934 ; SSE41-NEXT:    sarq $63, %rcx
2935 ; SSE41-NEXT:    pinsrb $11, %ecx, %xmm0
2936 ; SSE41-NEXT:    movq %rax, %rcx
2937 ; SSE41-NEXT:    shlq $51, %rcx
2938 ; SSE41-NEXT:    sarq $63, %rcx
2939 ; SSE41-NEXT:    pinsrb $12, %ecx, %xmm0
2940 ; SSE41-NEXT:    movq %rax, %rcx
2941 ; SSE41-NEXT:    shlq $50, %rcx
2942 ; SSE41-NEXT:    sarq $63, %rcx
2943 ; SSE41-NEXT:    pinsrb $13, %ecx, %xmm0
2944 ; SSE41-NEXT:    movq %rax, %rcx
2945 ; SSE41-NEXT:    shlq $49, %rcx
2946 ; SSE41-NEXT:    sarq $63, %rcx
2947 ; SSE41-NEXT:    pinsrb $14, %ecx, %xmm0
2948 ; SSE41-NEXT:    shrq $15, %rax
2949 ; SSE41-NEXT:    pinsrb $15, %eax, %xmm0
2950 ; SSE41-NEXT:    movswq 2(%rdi), %rax
2951 ; SSE41-NEXT:    movq %rax, %rcx
2952 ; SSE41-NEXT:    shlq $62, %rcx
2953 ; SSE41-NEXT:    sarq $63, %rcx
2954 ; SSE41-NEXT:    movq %rax, %rdx
2955 ; SSE41-NEXT:    shlq $63, %rdx
2956 ; SSE41-NEXT:    sarq $63, %rdx
2957 ; SSE41-NEXT:    movd %edx, %xmm1
2958 ; SSE41-NEXT:    pinsrb $1, %ecx, %xmm1
2959 ; SSE41-NEXT:    movq %rax, %rcx
2960 ; SSE41-NEXT:    shlq $61, %rcx
2961 ; SSE41-NEXT:    sarq $63, %rcx
2962 ; SSE41-NEXT:    pinsrb $2, %ecx, %xmm1
2963 ; SSE41-NEXT:    movq %rax, %rcx
2964 ; SSE41-NEXT:    shlq $60, %rcx
2965 ; SSE41-NEXT:    sarq $63, %rcx
2966 ; SSE41-NEXT:    pinsrb $3, %ecx, %xmm1
2967 ; SSE41-NEXT:    movq %rax, %rcx
2968 ; SSE41-NEXT:    shlq $59, %rcx
2969 ; SSE41-NEXT:    sarq $63, %rcx
2970 ; SSE41-NEXT:    pinsrb $4, %ecx, %xmm1
2971 ; SSE41-NEXT:    movq %rax, %rcx
2972 ; SSE41-NEXT:    shlq $58, %rcx
2973 ; SSE41-NEXT:    sarq $63, %rcx
2974 ; SSE41-NEXT:    pinsrb $5, %ecx, %xmm1
2975 ; SSE41-NEXT:    movq %rax, %rcx
2976 ; SSE41-NEXT:    shlq $57, %rcx
2977 ; SSE41-NEXT:    sarq $63, %rcx
2978 ; SSE41-NEXT:    pinsrb $6, %ecx, %xmm1
2979 ; SSE41-NEXT:    movsbq %al, %rcx
2980 ; SSE41-NEXT:    shrq $7, %rcx
2981 ; SSE41-NEXT:    pinsrb $7, %ecx, %xmm1
2982 ; SSE41-NEXT:    movq %rax, %rcx
2983 ; SSE41-NEXT:    shlq $55, %rcx
2984 ; SSE41-NEXT:    sarq $63, %rcx
2985 ; SSE41-NEXT:    pinsrb $8, %ecx, %xmm1
2986 ; SSE41-NEXT:    movq %rax, %rcx
2987 ; SSE41-NEXT:    shlq $54, %rcx
2988 ; SSE41-NEXT:    sarq $63, %rcx
2989 ; SSE41-NEXT:    pinsrb $9, %ecx, %xmm1
2990 ; SSE41-NEXT:    movq %rax, %rcx
2991 ; SSE41-NEXT:    shlq $53, %rcx
2992 ; SSE41-NEXT:    sarq $63, %rcx
2993 ; SSE41-NEXT:    pinsrb $10, %ecx, %xmm1
2994 ; SSE41-NEXT:    movq %rax, %rcx
2995 ; SSE41-NEXT:    shlq $52, %rcx
2996 ; SSE41-NEXT:    sarq $63, %rcx
2997 ; SSE41-NEXT:    pinsrb $11, %ecx, %xmm1
2998 ; SSE41-NEXT:    movq %rax, %rcx
2999 ; SSE41-NEXT:    shlq $51, %rcx
3000 ; SSE41-NEXT:    sarq $63, %rcx
3001 ; SSE41-NEXT:    pinsrb $12, %ecx, %xmm1
3002 ; SSE41-NEXT:    movq %rax, %rcx
3003 ; SSE41-NEXT:    shlq $50, %rcx
3004 ; SSE41-NEXT:    sarq $63, %rcx
3005 ; SSE41-NEXT:    pinsrb $13, %ecx, %xmm1
3006 ; SSE41-NEXT:    movq %rax, %rcx
3007 ; SSE41-NEXT:    shlq $49, %rcx
3008 ; SSE41-NEXT:    sarq $63, %rcx
3009 ; SSE41-NEXT:    pinsrb $14, %ecx, %xmm1
3010 ; SSE41-NEXT:    shrq $15, %rax
3011 ; SSE41-NEXT:    pinsrb $15, %eax, %xmm1
3012 ; SSE41-NEXT:    retq
3013 ;
3014 ; AVX1-LABEL: load_sext_32i1_to_32i8:
3015 ; AVX1:       # BB#0: # %entry
3016 ; AVX1-NEXT:    pushq %rbp
3017 ; AVX1-NEXT:    pushq %r15
3018 ; AVX1-NEXT:    pushq %r14
3019 ; AVX1-NEXT:    pushq %r13
3020 ; AVX1-NEXT:    pushq %r12
3021 ; AVX1-NEXT:    pushq %rbx
3022 ; AVX1-NEXT:    movslq (%rdi), %rax
3023 ; AVX1-NEXT:    movq %rax, %rcx
3024 ; AVX1-NEXT:    shlq $47, %rcx
3025 ; AVX1-NEXT:    sarq $63, %rcx
3026 ; AVX1-NEXT:    vmovd %ecx, %xmm0
3027 ; AVX1-NEXT:    movq %rax, %r8
3028 ; AVX1-NEXT:    movq %rax, %rdx
3029 ; AVX1-NEXT:    movq %rax, %rcx
3030 ; AVX1-NEXT:    movq %rax, %rdi
3031 ; AVX1-NEXT:    movq %rax, %r13
3032 ; AVX1-NEXT:    movq %rax, %rsi
3033 ; AVX1-NEXT:    movq %rax, %r10
3034 ; AVX1-NEXT:    movq %rax, %r11
3035 ; AVX1-NEXT:    movq %rax, %r9
3036 ; AVX1-NEXT:    movq %rax, %rbx
3037 ; AVX1-NEXT:    movq %rax, %r14
3038 ; AVX1-NEXT:    movq %rax, %r15
3039 ; AVX1-NEXT:    movq %rax, %r12
3040 ; AVX1-NEXT:    movq %rax, %rbp
3041 ; AVX1-NEXT:    shlq $46, %rbp
3042 ; AVX1-NEXT:    sarq $63, %rbp
3043 ; AVX1-NEXT:    vpinsrb $1, %ebp, %xmm0, %xmm0
3044 ; AVX1-NEXT:    movq %rax, %rbp
3045 ; AVX1-NEXT:    shlq $45, %r8
3046 ; AVX1-NEXT:    sarq $63, %r8
3047 ; AVX1-NEXT:    vpinsrb $2, %r8d, %xmm0, %xmm0
3048 ; AVX1-NEXT:    movq %rax, %r8
3049 ; AVX1-NEXT:    shlq $44, %rdx
3050 ; AVX1-NEXT:    sarq $63, %rdx
3051 ; AVX1-NEXT:    vpinsrb $3, %edx, %xmm0, %xmm0
3052 ; AVX1-NEXT:    movq %rax, %rdx
3053 ; AVX1-NEXT:    shlq $43, %rcx
3054 ; AVX1-NEXT:    sarq $63, %rcx
3055 ; AVX1-NEXT:    vpinsrb $4, %ecx, %xmm0, %xmm0
3056 ; AVX1-NEXT:    movq %rax, %rcx
3057 ; AVX1-NEXT:    shlq $42, %rdi
3058 ; AVX1-NEXT:    sarq $63, %rdi
3059 ; AVX1-NEXT:    vpinsrb $5, %edi, %xmm0, %xmm0
3060 ; AVX1-NEXT:    movq %rax, %rdi
3061 ; AVX1-NEXT:    shlq $41, %r13
3062 ; AVX1-NEXT:    sarq $63, %r13
3063 ; AVX1-NEXT:    vpinsrb $6, %r13d, %xmm0, %xmm0
3064 ; AVX1-NEXT:    movq %rax, %r13
3065 ; AVX1-NEXT:    shlq $40, %rsi
3066 ; AVX1-NEXT:    sarq $63, %rsi
3067 ; AVX1-NEXT:    vpinsrb $7, %esi, %xmm0, %xmm0
3068 ; AVX1-NEXT:    movq %rax, %rsi
3069 ; AVX1-NEXT:    shlq $39, %r10
3070 ; AVX1-NEXT:    sarq $63, %r10
3071 ; AVX1-NEXT:    vpinsrb $8, %r10d, %xmm0, %xmm0
3072 ; AVX1-NEXT:    movq %rax, %r10
3073 ; AVX1-NEXT:    shlq $38, %r11
3074 ; AVX1-NEXT:    sarq $63, %r11
3075 ; AVX1-NEXT:    vpinsrb $9, %r11d, %xmm0, %xmm0
3076 ; AVX1-NEXT:    movsbq %al, %r11
3077 ; AVX1-NEXT:    shlq $37, %r9
3078 ; AVX1-NEXT:    sarq $63, %r9
3079 ; AVX1-NEXT:    vpinsrb $10, %r9d, %xmm0, %xmm0
3080 ; AVX1-NEXT:    movq %rax, %r9
3081 ; AVX1-NEXT:    shlq $36, %rbx
3082 ; AVX1-NEXT:    sarq $63, %rbx
3083 ; AVX1-NEXT:    vpinsrb $11, %ebx, %xmm0, %xmm0
3084 ; AVX1-NEXT:    movq %rax, %rbx
3085 ; AVX1-NEXT:    shlq $35, %r14
3086 ; AVX1-NEXT:    sarq $63, %r14
3087 ; AVX1-NEXT:    vpinsrb $12, %r14d, %xmm0, %xmm0
3088 ; AVX1-NEXT:    movq %rax, %r14
3089 ; AVX1-NEXT:    shlq $34, %r15
3090 ; AVX1-NEXT:    sarq $63, %r15
3091 ; AVX1-NEXT:    vpinsrb $13, %r15d, %xmm0, %xmm0
3092 ; AVX1-NEXT:    movq %rax, %r15
3093 ; AVX1-NEXT:    shlq $33, %r12
3094 ; AVX1-NEXT:    sarq $63, %r12
3095 ; AVX1-NEXT:    vpinsrb $14, %r12d, %xmm0, %xmm0
3096 ; AVX1-NEXT:    movq %rax, %r12
3097 ; AVX1-NEXT:    shrq $31, %rbp
3098 ; AVX1-NEXT:    vpinsrb $15, %ebp, %xmm0, %xmm0
3099 ; AVX1-NEXT:    movq %rax, %rbp
3100 ; AVX1-NEXT:    shlq $63, %rdx
3101 ; AVX1-NEXT:    sarq $63, %rdx
3102 ; AVX1-NEXT:    vmovd %edx, %xmm1
3103 ; AVX1-NEXT:    movq %rax, %rdx
3104 ; AVX1-NEXT:    movswq %ax, %rax
3105 ; AVX1-NEXT:    shlq $62, %r8
3106 ; AVX1-NEXT:    sarq $63, %r8
3107 ; AVX1-NEXT:    vpinsrb $1, %r8d, %xmm1, %xmm1
3108 ; AVX1-NEXT:    shlq $61, %rcx
3109 ; AVX1-NEXT:    sarq $63, %rcx
3110 ; AVX1-NEXT:    vpinsrb $2, %ecx, %xmm1, %xmm1
3111 ; AVX1-NEXT:    shlq $60, %rdi
3112 ; AVX1-NEXT:    sarq $63, %rdi
3113 ; AVX1-NEXT:    vpinsrb $3, %edi, %xmm1, %xmm1
3114 ; AVX1-NEXT:    shlq $59, %r13
3115 ; AVX1-NEXT:    sarq $63, %r13
3116 ; AVX1-NEXT:    vpinsrb $4, %r13d, %xmm1, %xmm1
3117 ; AVX1-NEXT:    shlq $58, %rsi
3118 ; AVX1-NEXT:    sarq $63, %rsi
3119 ; AVX1-NEXT:    vpinsrb $5, %esi, %xmm1, %xmm1
3120 ; AVX1-NEXT:    shlq $57, %r10
3121 ; AVX1-NEXT:    sarq $63, %r10
3122 ; AVX1-NEXT:    vpinsrb $6, %r10d, %xmm1, %xmm1
3123 ; AVX1-NEXT:    shrq $7, %r11
3124 ; AVX1-NEXT:    vpinsrb $7, %r11d, %xmm1, %xmm1
3125 ; AVX1-NEXT:    shlq $55, %r9
3126 ; AVX1-NEXT:    sarq $63, %r9
3127 ; AVX1-NEXT:    vpinsrb $8, %r9d, %xmm1, %xmm1
3128 ; AVX1-NEXT:    shlq $54, %rbx
3129 ; AVX1-NEXT:    sarq $63, %rbx
3130 ; AVX1-NEXT:    vpinsrb $9, %ebx, %xmm1, %xmm1
3131 ; AVX1-NEXT:    shlq $53, %r14
3132 ; AVX1-NEXT:    sarq $63, %r14
3133 ; AVX1-NEXT:    vpinsrb $10, %r14d, %xmm1, %xmm1
3134 ; AVX1-NEXT:    shlq $52, %r15
3135 ; AVX1-NEXT:    sarq $63, %r15
3136 ; AVX1-NEXT:    vpinsrb $11, %r15d, %xmm1, %xmm1
3137 ; AVX1-NEXT:    shlq $51, %r12
3138 ; AVX1-NEXT:    sarq $63, %r12
3139 ; AVX1-NEXT:    vpinsrb $12, %r12d, %xmm1, %xmm1
3140 ; AVX1-NEXT:    shlq $50, %rbp
3141 ; AVX1-NEXT:    sarq $63, %rbp
3142 ; AVX1-NEXT:    vpinsrb $13, %ebp, %xmm1, %xmm1
3143 ; AVX1-NEXT:    shlq $49, %rdx
3144 ; AVX1-NEXT:    sarq $63, %rdx
3145 ; AVX1-NEXT:    vpinsrb $14, %edx, %xmm1, %xmm1
3146 ; AVX1-NEXT:    shrq $15, %rax
3147 ; AVX1-NEXT:    vpinsrb $15, %eax, %xmm1, %xmm1
3148 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
3149 ; AVX1-NEXT:    popq %rbx
3150 ; AVX1-NEXT:    popq %r12
3151 ; AVX1-NEXT:    popq %r13
3152 ; AVX1-NEXT:    popq %r14
3153 ; AVX1-NEXT:    popq %r15
3154 ; AVX1-NEXT:    popq %rbp
3155 ; AVX1-NEXT:    retq
3156 ;
3157 ; AVX2-LABEL: load_sext_32i1_to_32i8:
3158 ; AVX2:       # BB#0: # %entry
3159 ; AVX2-NEXT:    pushq %rbp
3160 ; AVX2-NEXT:    pushq %r15
3161 ; AVX2-NEXT:    pushq %r14
3162 ; AVX2-NEXT:    pushq %r13
3163 ; AVX2-NEXT:    pushq %r12
3164 ; AVX2-NEXT:    pushq %rbx
3165 ; AVX2-NEXT:    movslq (%rdi), %rax
3166 ; AVX2-NEXT:    movq %rax, %rcx
3167 ; AVX2-NEXT:    shlq $47, %rcx
3168 ; AVX2-NEXT:    sarq $63, %rcx
3169 ; AVX2-NEXT:    vmovd %ecx, %xmm0
3170 ; AVX2-NEXT:    movq %rax, %r8
3171 ; AVX2-NEXT:    movq %rax, %rdx
3172 ; AVX2-NEXT:    movq %rax, %rcx
3173 ; AVX2-NEXT:    movq %rax, %rdi
3174 ; AVX2-NEXT:    movq %rax, %r13
3175 ; AVX2-NEXT:    movq %rax, %rsi
3176 ; AVX2-NEXT:    movq %rax, %r10
3177 ; AVX2-NEXT:    movq %rax, %r11
3178 ; AVX2-NEXT:    movq %rax, %r9
3179 ; AVX2-NEXT:    movq %rax, %rbx
3180 ; AVX2-NEXT:    movq %rax, %r14
3181 ; AVX2-NEXT:    movq %rax, %r15
3182 ; AVX2-NEXT:    movq %rax, %r12
3183 ; AVX2-NEXT:    movq %rax, %rbp
3184 ; AVX2-NEXT:    shlq $46, %rbp
3185 ; AVX2-NEXT:    sarq $63, %rbp
3186 ; AVX2-NEXT:    vpinsrb $1, %ebp, %xmm0, %xmm0
3187 ; AVX2-NEXT:    movq %rax, %rbp
3188 ; AVX2-NEXT:    shlq $45, %r8
3189 ; AVX2-NEXT:    sarq $63, %r8
3190 ; AVX2-NEXT:    vpinsrb $2, %r8d, %xmm0, %xmm0
3191 ; AVX2-NEXT:    movq %rax, %r8
3192 ; AVX2-NEXT:    shlq $44, %rdx
3193 ; AVX2-NEXT:    sarq $63, %rdx
3194 ; AVX2-NEXT:    vpinsrb $3, %edx, %xmm0, %xmm0
3195 ; AVX2-NEXT:    movq %rax, %rdx
3196 ; AVX2-NEXT:    shlq $43, %rcx
3197 ; AVX2-NEXT:    sarq $63, %rcx
3198 ; AVX2-NEXT:    vpinsrb $4, %ecx, %xmm0, %xmm0
3199 ; AVX2-NEXT:    movq %rax, %rcx
3200 ; AVX2-NEXT:    shlq $42, %rdi
3201 ; AVX2-NEXT:    sarq $63, %rdi
3202 ; AVX2-NEXT:    vpinsrb $5, %edi, %xmm0, %xmm0
3203 ; AVX2-NEXT:    movq %rax, %rdi
3204 ; AVX2-NEXT:    shlq $41, %r13
3205 ; AVX2-NEXT:    sarq $63, %r13
3206 ; AVX2-NEXT:    vpinsrb $6, %r13d, %xmm0, %xmm0
3207 ; AVX2-NEXT:    movq %rax, %r13
3208 ; AVX2-NEXT:    shlq $40, %rsi
3209 ; AVX2-NEXT:    sarq $63, %rsi
3210 ; AVX2-NEXT:    vpinsrb $7, %esi, %xmm0, %xmm0
3211 ; AVX2-NEXT:    movq %rax, %rsi
3212 ; AVX2-NEXT:    shlq $39, %r10
3213 ; AVX2-NEXT:    sarq $63, %r10
3214 ; AVX2-NEXT:    vpinsrb $8, %r10d, %xmm0, %xmm0
3215 ; AVX2-NEXT:    movq %rax, %r10
3216 ; AVX2-NEXT:    shlq $38, %r11
3217 ; AVX2-NEXT:    sarq $63, %r11
3218 ; AVX2-NEXT:    vpinsrb $9, %r11d, %xmm0, %xmm0
3219 ; AVX2-NEXT:    movsbq %al, %r11
3220 ; AVX2-NEXT:    shlq $37, %r9
3221 ; AVX2-NEXT:    sarq $63, %r9
3222 ; AVX2-NEXT:    vpinsrb $10, %r9d, %xmm0, %xmm0
3223 ; AVX2-NEXT:    movq %rax, %r9
3224 ; AVX2-NEXT:    shlq $36, %rbx
3225 ; AVX2-NEXT:    sarq $63, %rbx
3226 ; AVX2-NEXT:    vpinsrb $11, %ebx, %xmm0, %xmm0
3227 ; AVX2-NEXT:    movq %rax, %rbx
3228 ; AVX2-NEXT:    shlq $35, %r14
3229 ; AVX2-NEXT:    sarq $63, %r14
3230 ; AVX2-NEXT:    vpinsrb $12, %r14d, %xmm0, %xmm0
3231 ; AVX2-NEXT:    movq %rax, %r14
3232 ; AVX2-NEXT:    shlq $34, %r15
3233 ; AVX2-NEXT:    sarq $63, %r15
3234 ; AVX2-NEXT:    vpinsrb $13, %r15d, %xmm0, %xmm0
3235 ; AVX2-NEXT:    movq %rax, %r15
3236 ; AVX2-NEXT:    shlq $33, %r12
3237 ; AVX2-NEXT:    sarq $63, %r12
3238 ; AVX2-NEXT:    vpinsrb $14, %r12d, %xmm0, %xmm0
3239 ; AVX2-NEXT:    movq %rax, %r12
3240 ; AVX2-NEXT:    shrq $31, %rbp
3241 ; AVX2-NEXT:    vpinsrb $15, %ebp, %xmm0, %xmm0
3242 ; AVX2-NEXT:    movq %rax, %rbp
3243 ; AVX2-NEXT:    shlq $63, %rdx
3244 ; AVX2-NEXT:    sarq $63, %rdx
3245 ; AVX2-NEXT:    vmovd %edx, %xmm1
3246 ; AVX2-NEXT:    movq %rax, %rdx
3247 ; AVX2-NEXT:    movswq %ax, %rax
3248 ; AVX2-NEXT:    shlq $62, %r8
3249 ; AVX2-NEXT:    sarq $63, %r8
3250 ; AVX2-NEXT:    vpinsrb $1, %r8d, %xmm1, %xmm1
3251 ; AVX2-NEXT:    shlq $61, %rcx
3252 ; AVX2-NEXT:    sarq $63, %rcx
3253 ; AVX2-NEXT:    vpinsrb $2, %ecx, %xmm1, %xmm1
3254 ; AVX2-NEXT:    shlq $60, %rdi
3255 ; AVX2-NEXT:    sarq $63, %rdi
3256 ; AVX2-NEXT:    vpinsrb $3, %edi, %xmm1, %xmm1
3257 ; AVX2-NEXT:    shlq $59, %r13
3258 ; AVX2-NEXT:    sarq $63, %r13
3259 ; AVX2-NEXT:    vpinsrb $4, %r13d, %xmm1, %xmm1
3260 ; AVX2-NEXT:    shlq $58, %rsi
3261 ; AVX2-NEXT:    sarq $63, %rsi
3262 ; AVX2-NEXT:    vpinsrb $5, %esi, %xmm1, %xmm1
3263 ; AVX2-NEXT:    shlq $57, %r10
3264 ; AVX2-NEXT:    sarq $63, %r10
3265 ; AVX2-NEXT:    vpinsrb $6, %r10d, %xmm1, %xmm1
3266 ; AVX2-NEXT:    shrq $7, %r11
3267 ; AVX2-NEXT:    vpinsrb $7, %r11d, %xmm1, %xmm1
3268 ; AVX2-NEXT:    shlq $55, %r9
3269 ; AVX2-NEXT:    sarq $63, %r9
3270 ; AVX2-NEXT:    vpinsrb $8, %r9d, %xmm1, %xmm1
3271 ; AVX2-NEXT:    shlq $54, %rbx
3272 ; AVX2-NEXT:    sarq $63, %rbx
3273 ; AVX2-NEXT:    vpinsrb $9, %ebx, %xmm1, %xmm1
3274 ; AVX2-NEXT:    shlq $53, %r14
3275 ; AVX2-NEXT:    sarq $63, %r14
3276 ; AVX2-NEXT:    vpinsrb $10, %r14d, %xmm1, %xmm1
3277 ; AVX2-NEXT:    shlq $52, %r15
3278 ; AVX2-NEXT:    sarq $63, %r15
3279 ; AVX2-NEXT:    vpinsrb $11, %r15d, %xmm1, %xmm1
3280 ; AVX2-NEXT:    shlq $51, %r12
3281 ; AVX2-NEXT:    sarq $63, %r12
3282 ; AVX2-NEXT:    vpinsrb $12, %r12d, %xmm1, %xmm1
3283 ; AVX2-NEXT:    shlq $50, %rbp
3284 ; AVX2-NEXT:    sarq $63, %rbp
3285 ; AVX2-NEXT:    vpinsrb $13, %ebp, %xmm1, %xmm1
3286 ; AVX2-NEXT:    shlq $49, %rdx
3287 ; AVX2-NEXT:    sarq $63, %rdx
3288 ; AVX2-NEXT:    vpinsrb $14, %edx, %xmm1, %xmm1
3289 ; AVX2-NEXT:    shrq $15, %rax
3290 ; AVX2-NEXT:    vpinsrb $15, %eax, %xmm1, %xmm1
3291 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
3292 ; AVX2-NEXT:    popq %rbx
3293 ; AVX2-NEXT:    popq %r12
3294 ; AVX2-NEXT:    popq %r13
3295 ; AVX2-NEXT:    popq %r14
3296 ; AVX2-NEXT:    popq %r15
3297 ; AVX2-NEXT:    popq %rbp
3298 ; AVX2-NEXT:    retq
3299 ;
3300 ; X32-SSE41-LABEL: load_sext_32i1_to_32i8:
3301 ; X32-SSE41:       # BB#0: # %entry
3302 ; X32-SSE41-NEXT:    pushl %esi
3303 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3304 ; X32-SSE41-NEXT:    movswl (%eax), %ecx
3305 ; X32-SSE41-NEXT:    movl %ecx, %edx
3306 ; X32-SSE41-NEXT:    shll $30, %edx
3307 ; X32-SSE41-NEXT:    sarl $31, %edx
3308 ; X32-SSE41-NEXT:    movl %ecx, %esi
3309 ; X32-SSE41-NEXT:    shll $31, %esi
3310 ; X32-SSE41-NEXT:    sarl $31, %esi
3311 ; X32-SSE41-NEXT:    movd %esi, %xmm0
3312 ; X32-SSE41-NEXT:    pinsrb $1, %edx, %xmm0
3313 ; X32-SSE41-NEXT:    movl %ecx, %edx
3314 ; X32-SSE41-NEXT:    shll $29, %edx
3315 ; X32-SSE41-NEXT:    sarl $31, %edx
3316 ; X32-SSE41-NEXT:    pinsrb $2, %edx, %xmm0
3317 ; X32-SSE41-NEXT:    movl %ecx, %edx
3318 ; X32-SSE41-NEXT:    shll $28, %edx
3319 ; X32-SSE41-NEXT:    sarl $31, %edx
3320 ; X32-SSE41-NEXT:    pinsrb $3, %edx, %xmm0
3321 ; X32-SSE41-NEXT:    movl %ecx, %edx
3322 ; X32-SSE41-NEXT:    shll $27, %edx
3323 ; X32-SSE41-NEXT:    sarl $31, %edx
3324 ; X32-SSE41-NEXT:    pinsrb $4, %edx, %xmm0
3325 ; X32-SSE41-NEXT:    movl %ecx, %edx
3326 ; X32-SSE41-NEXT:    shll $26, %edx
3327 ; X32-SSE41-NEXT:    sarl $31, %edx
3328 ; X32-SSE41-NEXT:    pinsrb $5, %edx, %xmm0
3329 ; X32-SSE41-NEXT:    movl %ecx, %edx
3330 ; X32-SSE41-NEXT:    shll $25, %edx
3331 ; X32-SSE41-NEXT:    sarl $31, %edx
3332 ; X32-SSE41-NEXT:    pinsrb $6, %edx, %xmm0
3333 ; X32-SSE41-NEXT:    movsbl %cl, %edx
3334 ; X32-SSE41-NEXT:    shrl $7, %edx
3335 ; X32-SSE41-NEXT:    pinsrb $7, %edx, %xmm0
3336 ; X32-SSE41-NEXT:    movl %ecx, %edx
3337 ; X32-SSE41-NEXT:    shll $23, %edx
3338 ; X32-SSE41-NEXT:    sarl $31, %edx
3339 ; X32-SSE41-NEXT:    pinsrb $8, %edx, %xmm0
3340 ; X32-SSE41-NEXT:    movl %ecx, %edx
3341 ; X32-SSE41-NEXT:    shll $22, %edx
3342 ; X32-SSE41-NEXT:    sarl $31, %edx
3343 ; X32-SSE41-NEXT:    pinsrb $9, %edx, %xmm0
3344 ; X32-SSE41-NEXT:    movl %ecx, %edx
3345 ; X32-SSE41-NEXT:    shll $21, %edx
3346 ; X32-SSE41-NEXT:    sarl $31, %edx
3347 ; X32-SSE41-NEXT:    pinsrb $10, %edx, %xmm0
3348 ; X32-SSE41-NEXT:    movl %ecx, %edx
3349 ; X32-SSE41-NEXT:    shll $20, %edx
3350 ; X32-SSE41-NEXT:    sarl $31, %edx
3351 ; X32-SSE41-NEXT:    pinsrb $11, %edx, %xmm0
3352 ; X32-SSE41-NEXT:    movl %ecx, %edx
3353 ; X32-SSE41-NEXT:    shll $19, %edx
3354 ; X32-SSE41-NEXT:    sarl $31, %edx
3355 ; X32-SSE41-NEXT:    pinsrb $12, %edx, %xmm0
3356 ; X32-SSE41-NEXT:    movl %ecx, %edx
3357 ; X32-SSE41-NEXT:    shll $18, %edx
3358 ; X32-SSE41-NEXT:    sarl $31, %edx
3359 ; X32-SSE41-NEXT:    pinsrb $13, %edx, %xmm0
3360 ; X32-SSE41-NEXT:    movl %ecx, %edx
3361 ; X32-SSE41-NEXT:    shll $17, %edx
3362 ; X32-SSE41-NEXT:    sarl $31, %edx
3363 ; X32-SSE41-NEXT:    pinsrb $14, %edx, %xmm0
3364 ; X32-SSE41-NEXT:    shrl $15, %ecx
3365 ; X32-SSE41-NEXT:    pinsrb $15, %ecx, %xmm0
3366 ; X32-SSE41-NEXT:    movswl 2(%eax), %eax
3367 ; X32-SSE41-NEXT:    movl %eax, %ecx
3368 ; X32-SSE41-NEXT:    shll $30, %ecx
3369 ; X32-SSE41-NEXT:    sarl $31, %ecx
3370 ; X32-SSE41-NEXT:    movl %eax, %edx
3371 ; X32-SSE41-NEXT:    shll $31, %edx
3372 ; X32-SSE41-NEXT:    sarl $31, %edx
3373 ; X32-SSE41-NEXT:    movd %edx, %xmm1
3374 ; X32-SSE41-NEXT:    pinsrb $1, %ecx, %xmm1
3375 ; X32-SSE41-NEXT:    movl %eax, %ecx
3376 ; X32-SSE41-NEXT:    shll $29, %ecx
3377 ; X32-SSE41-NEXT:    sarl $31, %ecx
3378 ; X32-SSE41-NEXT:    pinsrb $2, %ecx, %xmm1
3379 ; X32-SSE41-NEXT:    movl %eax, %ecx
3380 ; X32-SSE41-NEXT:    shll $28, %ecx
3381 ; X32-SSE41-NEXT:    sarl $31, %ecx
3382 ; X32-SSE41-NEXT:    pinsrb $3, %ecx, %xmm1
3383 ; X32-SSE41-NEXT:    movl %eax, %ecx
3384 ; X32-SSE41-NEXT:    shll $27, %ecx
3385 ; X32-SSE41-NEXT:    sarl $31, %ecx
3386 ; X32-SSE41-NEXT:    pinsrb $4, %ecx, %xmm1
3387 ; X32-SSE41-NEXT:    movl %eax, %ecx
3388 ; X32-SSE41-NEXT:    shll $26, %ecx
3389 ; X32-SSE41-NEXT:    sarl $31, %ecx
3390 ; X32-SSE41-NEXT:    pinsrb $5, %ecx, %xmm1
3391 ; X32-SSE41-NEXT:    movl %eax, %ecx
3392 ; X32-SSE41-NEXT:    shll $25, %ecx
3393 ; X32-SSE41-NEXT:    sarl $31, %ecx
3394 ; X32-SSE41-NEXT:    pinsrb $6, %ecx, %xmm1
3395 ; X32-SSE41-NEXT:    movsbl %al, %ecx
3396 ; X32-SSE41-NEXT:    shrl $7, %ecx
3397 ; X32-SSE41-NEXT:    pinsrb $7, %ecx, %xmm1
3398 ; X32-SSE41-NEXT:    movl %eax, %ecx
3399 ; X32-SSE41-NEXT:    shll $23, %ecx
3400 ; X32-SSE41-NEXT:    sarl $31, %ecx
3401 ; X32-SSE41-NEXT:    pinsrb $8, %ecx, %xmm1
3402 ; X32-SSE41-NEXT:    movl %eax, %ecx
3403 ; X32-SSE41-NEXT:    shll $22, %ecx
3404 ; X32-SSE41-NEXT:    sarl $31, %ecx
3405 ; X32-SSE41-NEXT:    pinsrb $9, %ecx, %xmm1
3406 ; X32-SSE41-NEXT:    movl %eax, %ecx
3407 ; X32-SSE41-NEXT:    shll $21, %ecx
3408 ; X32-SSE41-NEXT:    sarl $31, %ecx
3409 ; X32-SSE41-NEXT:    pinsrb $10, %ecx, %xmm1
3410 ; X32-SSE41-NEXT:    movl %eax, %ecx
3411 ; X32-SSE41-NEXT:    shll $20, %ecx
3412 ; X32-SSE41-NEXT:    sarl $31, %ecx
3413 ; X32-SSE41-NEXT:    pinsrb $11, %ecx, %xmm1
3414 ; X32-SSE41-NEXT:    movl %eax, %ecx
3415 ; X32-SSE41-NEXT:    shll $19, %ecx
3416 ; X32-SSE41-NEXT:    sarl $31, %ecx
3417 ; X32-SSE41-NEXT:    pinsrb $12, %ecx, %xmm1
3418 ; X32-SSE41-NEXT:    movl %eax, %ecx
3419 ; X32-SSE41-NEXT:    shll $18, %ecx
3420 ; X32-SSE41-NEXT:    sarl $31, %ecx
3421 ; X32-SSE41-NEXT:    pinsrb $13, %ecx, %xmm1
3422 ; X32-SSE41-NEXT:    movl %eax, %ecx
3423 ; X32-SSE41-NEXT:    shll $17, %ecx
3424 ; X32-SSE41-NEXT:    sarl $31, %ecx
3425 ; X32-SSE41-NEXT:    pinsrb $14, %ecx, %xmm1
3426 ; X32-SSE41-NEXT:    shrl $15, %eax
3427 ; X32-SSE41-NEXT:    pinsrb $15, %eax, %xmm1
3428 ; X32-SSE41-NEXT:    popl %esi
3429 ; X32-SSE41-NEXT:    retl
3430 entry:
3431  %X = load <32 x i1>, <32 x i1>* %ptr
3432  %Y = sext <32 x i1> %X to <32 x i8>
3433  ret <32 x i8> %Y
3434 }
3435
3436 define <16 x i16> @load_sext_16i8_to_16i16(<16 x i8> *%ptr) {
3437 ; SSE2-LABEL: load_sext_16i8_to_16i16:
3438 ; SSE2:       # BB#0: # %entry
3439 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3440 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3441 ; SSE2-NEXT:    psraw $8, %xmm0
3442 ; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
3443 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3444 ; SSE2-NEXT:    psraw $8, %xmm1
3445 ; SSE2-NEXT:    retq
3446 ;
3447 ; SSSE3-LABEL: load_sext_16i8_to_16i16:
3448 ; SSSE3:       # BB#0: # %entry
3449 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3450 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3451 ; SSSE3-NEXT:    psraw $8, %xmm0
3452 ; SSSE3-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
3453 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3454 ; SSSE3-NEXT:    psraw $8, %xmm1
3455 ; SSSE3-NEXT:    retq
3456 ;
3457 ; SSE41-LABEL: load_sext_16i8_to_16i16:
3458 ; SSE41:       # BB#0: # %entry
3459 ; SSE41-NEXT:    pmovsxbw (%rdi), %xmm0
3460 ; SSE41-NEXT:    pmovsxbw 8(%rdi), %xmm1
3461 ; SSE41-NEXT:    retq
3462 ;
3463 ; AVX1-LABEL: load_sext_16i8_to_16i16:
3464 ; AVX1:       # BB#0: # %entry
3465 ; AVX1-NEXT:    vpmovsxbw (%rdi), %xmm0
3466 ; AVX1-NEXT:    vpmovsxbw 8(%rdi), %xmm1
3467 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3468 ; AVX1-NEXT:    retq
3469 ;
3470 ; AVX2-LABEL: load_sext_16i8_to_16i16:
3471 ; AVX2:       # BB#0: # %entry
3472 ; AVX2-NEXT:    vpmovsxbw (%rdi), %ymm0
3473 ; AVX2-NEXT:    retq
3474 ;
3475 ; X32-SSE41-LABEL: load_sext_16i8_to_16i16:
3476 ; X32-SSE41:       # BB#0: # %entry
3477 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3478 ; X32-SSE41-NEXT:    pmovsxbw (%eax), %xmm0
3479 ; X32-SSE41-NEXT:    pmovsxbw 8(%eax), %xmm1
3480 ; X32-SSE41-NEXT:    retl
3481 entry:
3482  %X = load <16 x i8>, <16 x i8>* %ptr
3483  %Y = sext <16 x i8> %X to <16 x i16>
3484  ret <16 x i16> %Y
3485 }
3486
3487 define <2 x i64> @load_sext_2i16_to_2i64(<2 x i16> *%ptr) {
3488 ; SSE2-LABEL: load_sext_2i16_to_2i64:
3489 ; SSE2:       # BB#0: # %entry
3490 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3491 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3492 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
3493 ; SSE2-NEXT:    psrad $31, %xmm1
3494 ; SSE2-NEXT:    psrad $16, %xmm0
3495 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3496 ; SSE2-NEXT:    retq
3497 ;
3498 ; SSSE3-LABEL: load_sext_2i16_to_2i64:
3499 ; SSSE3:       # BB#0: # %entry
3500 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3501 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3502 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
3503 ; SSSE3-NEXT:    psrad $31, %xmm1
3504 ; SSSE3-NEXT:    psrad $16, %xmm0
3505 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3506 ; SSSE3-NEXT:    retq
3507 ;
3508 ; SSE41-LABEL: load_sext_2i16_to_2i64:
3509 ; SSE41:       # BB#0: # %entry
3510 ; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
3511 ; SSE41-NEXT:    retq
3512 ;
3513 ; AVX-LABEL: load_sext_2i16_to_2i64:
3514 ; AVX:       # BB#0: # %entry
3515 ; AVX-NEXT:    vpmovsxwq (%rdi), %xmm0
3516 ; AVX-NEXT:    retq
3517 ;
3518 ; X32-SSE41-LABEL: load_sext_2i16_to_2i64:
3519 ; X32-SSE41:       # BB#0: # %entry
3520 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3521 ; X32-SSE41-NEXT:    pmovsxwq (%eax), %xmm0
3522 ; X32-SSE41-NEXT:    retl
3523 entry:
3524  %X = load <2 x i16>, <2 x i16>* %ptr
3525  %Y = sext <2 x i16> %X to <2 x i64>
3526  ret <2 x i64> %Y
3527 }
3528
3529 define <4 x i32> @load_sext_4i16_to_4i32(<4 x i16> *%ptr) {
3530 ; SSE2-LABEL: load_sext_4i16_to_4i32:
3531 ; SSE2:       # BB#0: # %entry
3532 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3533 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3534 ; SSE2-NEXT:    psrad $16, %xmm0
3535 ; SSE2-NEXT:    retq
3536 ;
3537 ; SSSE3-LABEL: load_sext_4i16_to_4i32:
3538 ; SSSE3:       # BB#0: # %entry
3539 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3540 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3541 ; SSSE3-NEXT:    psrad $16, %xmm0
3542 ; SSSE3-NEXT:    retq
3543 ;
3544 ; SSE41-LABEL: load_sext_4i16_to_4i32:
3545 ; SSE41:       # BB#0: # %entry
3546 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
3547 ; SSE41-NEXT:    retq
3548 ;
3549 ; AVX-LABEL: load_sext_4i16_to_4i32:
3550 ; AVX:       # BB#0: # %entry
3551 ; AVX-NEXT:    vpmovsxwd (%rdi), %xmm0
3552 ; AVX-NEXT:    retq
3553 ;
3554 ; X32-SSE41-LABEL: load_sext_4i16_to_4i32:
3555 ; X32-SSE41:       # BB#0: # %entry
3556 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3557 ; X32-SSE41-NEXT:    pmovsxwd (%eax), %xmm0
3558 ; X32-SSE41-NEXT:    retl
3559 entry:
3560  %X = load <4 x i16>, <4 x i16>* %ptr
3561  %Y = sext <4 x i16> %X to <4 x i32>
3562  ret <4 x i32> %Y
3563 }
3564
3565 define <4 x i64> @load_sext_4i16_to_4i64(<4 x i16> *%ptr) {
3566 ; SSE2-LABEL: load_sext_4i16_to_4i64:
3567 ; SSE2:       # BB#0: # %entry
3568 ; SSE2-NEXT:    movswq 2(%rdi), %rax
3569 ; SSE2-NEXT:    movd %rax, %xmm1
3570 ; SSE2-NEXT:    movswq (%rdi), %rax
3571 ; SSE2-NEXT:    movd %rax, %xmm0
3572 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3573 ; SSE2-NEXT:    movswq 6(%rdi), %rax
3574 ; SSE2-NEXT:    movd %rax, %xmm2
3575 ; SSE2-NEXT:    movswq 4(%rdi), %rax
3576 ; SSE2-NEXT:    movd %rax, %xmm1
3577 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
3578 ; SSE2-NEXT:    retq
3579 ;
3580 ; SSSE3-LABEL: load_sext_4i16_to_4i64:
3581 ; SSSE3:       # BB#0: # %entry
3582 ; SSSE3-NEXT:    movswq 2(%rdi), %rax
3583 ; SSSE3-NEXT:    movd %rax, %xmm1
3584 ; SSSE3-NEXT:    movswq (%rdi), %rax
3585 ; SSSE3-NEXT:    movd %rax, %xmm0
3586 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3587 ; SSSE3-NEXT:    movswq 6(%rdi), %rax
3588 ; SSSE3-NEXT:    movd %rax, %xmm2
3589 ; SSSE3-NEXT:    movswq 4(%rdi), %rax
3590 ; SSSE3-NEXT:    movd %rax, %xmm1
3591 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
3592 ; SSSE3-NEXT:    retq
3593 ;
3594 ; SSE41-LABEL: load_sext_4i16_to_4i64:
3595 ; SSE41:       # BB#0: # %entry
3596 ; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
3597 ; SSE41-NEXT:    pmovsxwq 4(%rdi), %xmm1
3598 ; SSE41-NEXT:    retq
3599 ;
3600 ; AVX1-LABEL: load_sext_4i16_to_4i64:
3601 ; AVX1:       # BB#0: # %entry
3602 ; AVX1-NEXT:    vpmovsxwd (%rdi), %xmm0
3603 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
3604 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3605 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
3606 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
3607 ; AVX1-NEXT:    retq
3608 ;
3609 ; AVX2-LABEL: load_sext_4i16_to_4i64:
3610 ; AVX2:       # BB#0: # %entry
3611 ; AVX2-NEXT:    vpmovsxwq (%rdi), %ymm0
3612 ; AVX2-NEXT:    retq
3613 ;
3614 ; X32-SSE41-LABEL: load_sext_4i16_to_4i64:
3615 ; X32-SSE41:       # BB#0: # %entry
3616 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3617 ; X32-SSE41-NEXT:    pmovsxwq (%eax), %xmm0
3618 ; X32-SSE41-NEXT:    pmovsxwq 4(%eax), %xmm1
3619 ; X32-SSE41-NEXT:    retl
3620 entry:
3621  %X = load <4 x i16>, <4 x i16>* %ptr
3622  %Y = sext <4 x i16> %X to <4 x i64>
3623  ret <4 x i64> %Y
3624 }
3625
3626 define <8 x i32> @load_sext_8i16_to_8i32(<8 x i16> *%ptr) {
3627 ; SSE2-LABEL: load_sext_8i16_to_8i32:
3628 ; SSE2:       # BB#0: # %entry
3629 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3630 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3631 ; SSE2-NEXT:    psrad $16, %xmm0
3632 ; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
3633 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
3634 ; SSE2-NEXT:    psrad $16, %xmm1
3635 ; SSE2-NEXT:    retq
3636 ;
3637 ; SSSE3-LABEL: load_sext_8i16_to_8i32:
3638 ; SSSE3:       # BB#0: # %entry
3639 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3640 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3641 ; SSSE3-NEXT:    psrad $16, %xmm0
3642 ; SSSE3-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
3643 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
3644 ; SSSE3-NEXT:    psrad $16, %xmm1
3645 ; SSSE3-NEXT:    retq
3646 ;
3647 ; SSE41-LABEL: load_sext_8i16_to_8i32:
3648 ; SSE41:       # BB#0: # %entry
3649 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
3650 ; SSE41-NEXT:    pmovsxwd 8(%rdi), %xmm1
3651 ; SSE41-NEXT:    retq
3652 ;
3653 ; AVX1-LABEL: load_sext_8i16_to_8i32:
3654 ; AVX1:       # BB#0: # %entry
3655 ; AVX1-NEXT:    vpmovsxwd (%rdi), %xmm0
3656 ; AVX1-NEXT:    vpmovsxwd 8(%rdi), %xmm1
3657 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3658 ; AVX1-NEXT:    retq
3659 ;
3660 ; AVX2-LABEL: load_sext_8i16_to_8i32:
3661 ; AVX2:       # BB#0: # %entry
3662 ; AVX2-NEXT:    vpmovsxwd (%rdi), %ymm0
3663 ; AVX2-NEXT:    retq
3664 ;
3665 ; X32-SSE41-LABEL: load_sext_8i16_to_8i32:
3666 ; X32-SSE41:       # BB#0: # %entry
3667 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3668 ; X32-SSE41-NEXT:    pmovsxwd (%eax), %xmm0
3669 ; X32-SSE41-NEXT:    pmovsxwd 8(%eax), %xmm1
3670 ; X32-SSE41-NEXT:    retl
3671 entry:
3672  %X = load <8 x i16>, <8 x i16>* %ptr
3673  %Y = sext <8 x i16> %X to <8 x i32>
3674  ret <8 x i32> %Y
3675 }
3676
3677 define <2 x i64> @load_sext_2i32_to_2i64(<2 x i32> *%ptr) {
3678 ; SSE2-LABEL: load_sext_2i32_to_2i64:
3679 ; SSE2:       # BB#0: # %entry
3680 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3681 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
3682 ; SSE2-NEXT:    psrad $31, %xmm1
3683 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3684 ; SSE2-NEXT:    retq
3685 ;
3686 ; SSSE3-LABEL: load_sext_2i32_to_2i64:
3687 ; SSSE3:       # BB#0: # %entry
3688 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3689 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
3690 ; SSSE3-NEXT:    psrad $31, %xmm1
3691 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3692 ; SSSE3-NEXT:    retq
3693 ;
3694 ; SSE41-LABEL: load_sext_2i32_to_2i64:
3695 ; SSE41:       # BB#0: # %entry
3696 ; SSE41-NEXT:    pmovsxdq (%rdi), %xmm0
3697 ; SSE41-NEXT:    retq
3698 ;
3699 ; AVX-LABEL: load_sext_2i32_to_2i64:
3700 ; AVX:       # BB#0: # %entry
3701 ; AVX-NEXT:    vpmovsxdq (%rdi), %xmm0
3702 ; AVX-NEXT:    retq
3703 ;
3704 ; X32-SSE41-LABEL: load_sext_2i32_to_2i64:
3705 ; X32-SSE41:       # BB#0: # %entry
3706 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3707 ; X32-SSE41-NEXT:    pmovsxdq (%eax), %xmm0
3708 ; X32-SSE41-NEXT:    retl
3709 entry:
3710  %X = load <2 x i32>, <2 x i32>* %ptr
3711  %Y = sext <2 x i32> %X to <2 x i64>
3712  ret <2 x i64> %Y
3713 }
3714
3715 define <4 x i64> @load_sext_4i32_to_4i64(<4 x i32> *%ptr) {
3716 ; SSE2-LABEL: load_sext_4i32_to_4i64:
3717 ; SSE2:       # BB#0: # %entry
3718 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
3719 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
3720 ; SSE2-NEXT:    psrad $31, %xmm2
3721 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
3722 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3723 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
3724 ; SSE2-NEXT:    psrad $31, %xmm2
3725 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3726 ; SSE2-NEXT:    retq
3727 ;
3728 ; SSSE3-LABEL: load_sext_4i32_to_4i64:
3729 ; SSSE3:       # BB#0: # %entry
3730 ; SSSE3-NEXT:    movdqa (%rdi), %xmm0
3731 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
3732 ; SSSE3-NEXT:    psrad $31, %xmm2
3733 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
3734 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3735 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
3736 ; SSSE3-NEXT:    psrad $31, %xmm2
3737 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3738 ; SSSE3-NEXT:    retq
3739 ;
3740 ; SSE41-LABEL: load_sext_4i32_to_4i64:
3741 ; SSE41:       # BB#0: # %entry
3742 ; SSE41-NEXT:    pmovsxdq (%rdi), %xmm0
3743 ; SSE41-NEXT:    pmovsxdq 8(%rdi), %xmm1
3744 ; SSE41-NEXT:    retq
3745 ;
3746 ; AVX1-LABEL: load_sext_4i32_to_4i64:
3747 ; AVX1:       # BB#0: # %entry
3748 ; AVX1-NEXT:    vpmovsxdq (%rdi), %xmm0
3749 ; AVX1-NEXT:    vpmovsxdq 8(%rdi), %xmm1
3750 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3751 ; AVX1-NEXT:    retq
3752 ;
3753 ; AVX2-LABEL: load_sext_4i32_to_4i64:
3754 ; AVX2:       # BB#0: # %entry
3755 ; AVX2-NEXT:    vpmovsxdq (%rdi), %ymm0
3756 ; AVX2-NEXT:    retq
3757 ;
3758 ; X32-SSE41-LABEL: load_sext_4i32_to_4i64:
3759 ; X32-SSE41:       # BB#0: # %entry
3760 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3761 ; X32-SSE41-NEXT:    pmovsxdq (%eax), %xmm0
3762 ; X32-SSE41-NEXT:    pmovsxdq 8(%eax), %xmm1
3763 ; X32-SSE41-NEXT:    retl
3764 entry:
3765  %X = load <4 x i32>, <4 x i32>* %ptr
3766  %Y = sext <4 x i32> %X to <4 x i64>
3767  ret <4 x i64> %Y
3768 }
3769
3770 define i32 @sext_2i8_to_i32(<16 x i8> %A) nounwind uwtable readnone ssp {
3771 ; SSE2-LABEL: sext_2i8_to_i32:
3772 ; SSE2:       # BB#0: # %entry
3773 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3774 ; SSE2-NEXT:    psraw $8, %xmm0
3775 ; SSE2-NEXT:    movd %xmm0, %eax
3776 ; SSE2-NEXT:    retq
3777 ;
3778 ; SSSE3-LABEL: sext_2i8_to_i32:
3779 ; SSSE3:       # BB#0: # %entry
3780 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3781 ; SSSE3-NEXT:    psraw $8, %xmm0
3782 ; SSSE3-NEXT:    movd %xmm0, %eax
3783 ; SSSE3-NEXT:    retq
3784 ;
3785 ; SSE41-LABEL: sext_2i8_to_i32:
3786 ; SSE41:       # BB#0: # %entry
3787 ; SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
3788 ; SSE41-NEXT:    movd %xmm0, %eax
3789 ; SSE41-NEXT:    retq
3790 ;
3791 ; AVX-LABEL: sext_2i8_to_i32:
3792 ; AVX:       # BB#0: # %entry
3793 ; AVX-NEXT:    vpmovsxbw %xmm0, %xmm0
3794 ; AVX-NEXT:    vmovd %xmm0, %eax
3795 ; AVX-NEXT:    retq
3796 ;
3797 ; X32-SSE41-LABEL: sext_2i8_to_i32:
3798 ; X32-SSE41:       # BB#0: # %entry
3799 ; X32-SSE41-NEXT:    pushl %eax
3800 ; X32-SSE41-NEXT:  .Ltmp0:
3801 ; X32-SSE41-NEXT:    .cfi_def_cfa_offset 8
3802 ; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
3803 ; X32-SSE41-NEXT:    movd %xmm0, %eax
3804 ; X32-SSE41-NEXT:    popl %ecx
3805 ; X32-SSE41-NEXT:    retl
3806 entry:
3807   %Shuf = shufflevector <16 x i8> %A, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
3808   %Ex = sext <2 x i8> %Shuf to <2 x i16>
3809   %Bc = bitcast <2 x i16> %Ex to i32
3810   ret i32 %Bc
3811 }
3812
3813 define <4 x i64> @sext_4i1_to_4i64(<4 x i1> %mask) {
3814 ; SSE2-LABEL: sext_4i1_to_4i64:
3815 ; SSE2:       # BB#0:
3816 ; SSE2-NEXT:    pslld $31, %xmm0
3817 ; SSE2-NEXT:    psrad $31, %xmm0
3818 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
3819 ; SSE2-NEXT:    psrad $31, %xmm2
3820 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
3821 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3822 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
3823 ; SSE2-NEXT:    psrad $31, %xmm2
3824 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3825 ; SSE2-NEXT:    retq
3826 ;
3827 ; SSSE3-LABEL: sext_4i1_to_4i64:
3828 ; SSSE3:       # BB#0:
3829 ; SSSE3-NEXT:    pslld $31, %xmm0
3830 ; SSSE3-NEXT:    psrad $31, %xmm0
3831 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
3832 ; SSSE3-NEXT:    psrad $31, %xmm2
3833 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
3834 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3835 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
3836 ; SSSE3-NEXT:    psrad $31, %xmm2
3837 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3838 ; SSSE3-NEXT:    retq
3839 ;
3840 ; SSE41-LABEL: sext_4i1_to_4i64:
3841 ; SSE41:       # BB#0:
3842 ; SSE41-NEXT:    pslld $31, %xmm0
3843 ; SSE41-NEXT:    psrad $31, %xmm0
3844 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
3845 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3846 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
3847 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
3848 ; SSE41-NEXT:    retq
3849 ;
3850 ; AVX1-LABEL: sext_4i1_to_4i64:
3851 ; AVX1:       # BB#0:
3852 ; AVX1-NEXT:    vpslld $31, %xmm0, %xmm0
3853 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm0
3854 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
3855 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3856 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
3857 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
3858 ; AVX1-NEXT:    retq
3859 ;
3860 ; AVX2-LABEL: sext_4i1_to_4i64:
3861 ; AVX2:       # BB#0:
3862 ; AVX2-NEXT:    vpslld $31, %xmm0, %xmm0
3863 ; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm0
3864 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
3865 ; AVX2-NEXT:    retq
3866 ;
3867 ; X32-SSE41-LABEL: sext_4i1_to_4i64:
3868 ; X32-SSE41:       # BB#0:
3869 ; X32-SSE41-NEXT:    pslld $31, %xmm0
3870 ; X32-SSE41-NEXT:    psrad $31, %xmm0
3871 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
3872 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3873 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
3874 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
3875 ; X32-SSE41-NEXT:    retl
3876   %extmask = sext <4 x i1> %mask to <4 x i64>
3877   ret <4 x i64> %extmask
3878 }
3879
3880 define <4 x i64> @sext_4i8_to_4i64(<4 x i8> %mask) {
3881 ; SSE2-LABEL: sext_4i8_to_4i64:
3882 ; SSE2:       # BB#0:
3883 ; SSE2-NEXT:    pslld $24, %xmm0
3884 ; SSE2-NEXT:    psrad $24, %xmm0
3885 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
3886 ; SSE2-NEXT:    psrad $31, %xmm2
3887 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
3888 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3889 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
3890 ; SSE2-NEXT:    psrad $31, %xmm2
3891 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3892 ; SSE2-NEXT:    retq
3893 ;
3894 ; SSSE3-LABEL: sext_4i8_to_4i64:
3895 ; SSSE3:       # BB#0:
3896 ; SSSE3-NEXT:    pslld $24, %xmm0
3897 ; SSSE3-NEXT:    psrad $24, %xmm0
3898 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
3899 ; SSSE3-NEXT:    psrad $31, %xmm2
3900 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
3901 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3902 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
3903 ; SSSE3-NEXT:    psrad $31, %xmm2
3904 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3905 ; SSSE3-NEXT:    retq
3906 ;
3907 ; SSE41-LABEL: sext_4i8_to_4i64:
3908 ; SSE41:       # BB#0:
3909 ; SSE41-NEXT:    pslld $24, %xmm0
3910 ; SSE41-NEXT:    psrad $24, %xmm0
3911 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
3912 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3913 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
3914 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
3915 ; SSE41-NEXT:    retq
3916 ;
3917 ; AVX1-LABEL: sext_4i8_to_4i64:
3918 ; AVX1:       # BB#0:
3919 ; AVX1-NEXT:    vpslld $24, %xmm0, %xmm0
3920 ; AVX1-NEXT:    vpsrad $24, %xmm0, %xmm0
3921 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
3922 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3923 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
3924 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
3925 ; AVX1-NEXT:    retq
3926 ;
3927 ; AVX2-LABEL: sext_4i8_to_4i64:
3928 ; AVX2:       # BB#0:
3929 ; AVX2-NEXT:    vpslld $24, %xmm0, %xmm0
3930 ; AVX2-NEXT:    vpsrad $24, %xmm0, %xmm0
3931 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
3932 ; AVX2-NEXT:    retq
3933 ;
3934 ; X32-SSE41-LABEL: sext_4i8_to_4i64:
3935 ; X32-SSE41:       # BB#0:
3936 ; X32-SSE41-NEXT:    pslld $24, %xmm0
3937 ; X32-SSE41-NEXT:    psrad $24, %xmm0
3938 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
3939 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3940 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
3941 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
3942 ; X32-SSE41-NEXT:    retl
3943   %extmask = sext <4 x i8> %mask to <4 x i64>
3944   ret <4 x i64> %extmask
3945 }