Make utils/update_llc_test_checks.py note that the assertions are
[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:    movzbl (%rdi), %eax
1069 ; SSE2-NEXT:    movq %rax, %rcx
1070 ; SSE2-NEXT:    shlq $56, %rcx
1071 ; SSE2-NEXT:    sarq $63, %rcx
1072 ; SSE2-NEXT:    movd %ecx, %xmm0
1073 ; SSE2-NEXT:    movq %rax, %rcx
1074 ; SSE2-NEXT:    shlq $60, %rcx
1075 ; SSE2-NEXT:    sarq $63, %rcx
1076 ; SSE2-NEXT:    movd %ecx, %xmm2
1077 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1078 ; SSE2-NEXT:    movq %rax, %rcx
1079 ; SSE2-NEXT:    shlq $58, %rcx
1080 ; SSE2-NEXT:    sarq $63, %rcx
1081 ; SSE2-NEXT:    movd %ecx, %xmm0
1082 ; SSE2-NEXT:    movq %rax, %rcx
1083 ; SSE2-NEXT:    shlq $62, %rcx
1084 ; SSE2-NEXT:    sarq $63, %rcx
1085 ; SSE2-NEXT:    movd %ecx, %xmm1
1086 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1087 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1088 ; SSE2-NEXT:    movq %rax, %rcx
1089 ; SSE2-NEXT:    shlq $57, %rcx
1090 ; SSE2-NEXT:    sarq $63, %rcx
1091 ; SSE2-NEXT:    movd %ecx, %xmm0
1092 ; SSE2-NEXT:    movq %rax, %rcx
1093 ; SSE2-NEXT:    shlq $61, %rcx
1094 ; SSE2-NEXT:    sarq $63, %rcx
1095 ; SSE2-NEXT:    movd %ecx, %xmm2
1096 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1097 ; SSE2-NEXT:    movq %rax, %rcx
1098 ; SSE2-NEXT:    shlq $59, %rcx
1099 ; SSE2-NEXT:    sarq $63, %rcx
1100 ; SSE2-NEXT:    movd %ecx, %xmm3
1101 ; SSE2-NEXT:    shlq $63, %rax
1102 ; SSE2-NEXT:    sarq $63, %rax
1103 ; SSE2-NEXT:    movd %eax, %xmm0
1104 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
1105 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1106 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1107 ; SSE2-NEXT:    retq
1108 ;
1109 ; SSSE3-LABEL: load_sext_8i1_to_8i16:
1110 ; SSSE3:       # BB#0: # %entry
1111 ; SSSE3-NEXT:    movzbl (%rdi), %eax
1112 ; SSSE3-NEXT:    movq %rax, %rcx
1113 ; SSSE3-NEXT:    shlq $56, %rcx
1114 ; SSSE3-NEXT:    sarq $63, %rcx
1115 ; SSSE3-NEXT:    movd %ecx, %xmm0
1116 ; SSSE3-NEXT:    movq %rax, %rcx
1117 ; SSSE3-NEXT:    shlq $60, %rcx
1118 ; SSSE3-NEXT:    sarq $63, %rcx
1119 ; SSSE3-NEXT:    movd %ecx, %xmm2
1120 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1121 ; SSSE3-NEXT:    movq %rax, %rcx
1122 ; SSSE3-NEXT:    shlq $58, %rcx
1123 ; SSSE3-NEXT:    sarq $63, %rcx
1124 ; SSSE3-NEXT:    movd %ecx, %xmm0
1125 ; SSSE3-NEXT:    movq %rax, %rcx
1126 ; SSSE3-NEXT:    shlq $62, %rcx
1127 ; SSSE3-NEXT:    sarq $63, %rcx
1128 ; SSSE3-NEXT:    movd %ecx, %xmm1
1129 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1130 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1131 ; SSSE3-NEXT:    movq %rax, %rcx
1132 ; SSSE3-NEXT:    shlq $57, %rcx
1133 ; SSSE3-NEXT:    sarq $63, %rcx
1134 ; SSSE3-NEXT:    movd %ecx, %xmm0
1135 ; SSSE3-NEXT:    movq %rax, %rcx
1136 ; SSSE3-NEXT:    shlq $61, %rcx
1137 ; SSSE3-NEXT:    sarq $63, %rcx
1138 ; SSSE3-NEXT:    movd %ecx, %xmm2
1139 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1140 ; SSSE3-NEXT:    movq %rax, %rcx
1141 ; SSSE3-NEXT:    shlq $59, %rcx
1142 ; SSSE3-NEXT:    sarq $63, %rcx
1143 ; SSSE3-NEXT:    movd %ecx, %xmm3
1144 ; SSSE3-NEXT:    shlq $63, %rax
1145 ; SSSE3-NEXT:    sarq $63, %rax
1146 ; SSSE3-NEXT:    movd %eax, %xmm0
1147 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
1148 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1149 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1150 ; SSSE3-NEXT:    retq
1151 ;
1152 ; SSE41-LABEL: load_sext_8i1_to_8i16:
1153 ; SSE41:       # BB#0: # %entry
1154 ; SSE41-NEXT:    movzbl (%rdi), %eax
1155 ; SSE41-NEXT:    movq %rax, %rcx
1156 ; SSE41-NEXT:    shlq $62, %rcx
1157 ; SSE41-NEXT:    sarq $63, %rcx
1158 ; SSE41-NEXT:    movq %rax, %rdx
1159 ; SSE41-NEXT:    shlq $63, %rdx
1160 ; SSE41-NEXT:    sarq $63, %rdx
1161 ; SSE41-NEXT:    movd %edx, %xmm0
1162 ; SSE41-NEXT:    pinsrw $1, %ecx, %xmm0
1163 ; SSE41-NEXT:    movq %rax, %rcx
1164 ; SSE41-NEXT:    shlq $61, %rcx
1165 ; SSE41-NEXT:    sarq $63, %rcx
1166 ; SSE41-NEXT:    pinsrw $2, %ecx, %xmm0
1167 ; SSE41-NEXT:    movq %rax, %rcx
1168 ; SSE41-NEXT:    shlq $60, %rcx
1169 ; SSE41-NEXT:    sarq $63, %rcx
1170 ; SSE41-NEXT:    pinsrw $3, %ecx, %xmm0
1171 ; SSE41-NEXT:    movq %rax, %rcx
1172 ; SSE41-NEXT:    shlq $59, %rcx
1173 ; SSE41-NEXT:    sarq $63, %rcx
1174 ; SSE41-NEXT:    pinsrw $4, %ecx, %xmm0
1175 ; SSE41-NEXT:    movq %rax, %rcx
1176 ; SSE41-NEXT:    shlq $58, %rcx
1177 ; SSE41-NEXT:    sarq $63, %rcx
1178 ; SSE41-NEXT:    pinsrw $5, %ecx, %xmm0
1179 ; SSE41-NEXT:    movq %rax, %rcx
1180 ; SSE41-NEXT:    shlq $57, %rcx
1181 ; SSE41-NEXT:    sarq $63, %rcx
1182 ; SSE41-NEXT:    pinsrw $6, %ecx, %xmm0
1183 ; SSE41-NEXT:    shlq $56, %rax
1184 ; SSE41-NEXT:    sarq $63, %rax
1185 ; SSE41-NEXT:    pinsrw $7, %eax, %xmm0
1186 ; SSE41-NEXT:    retq
1187 ;
1188 ; AVX-LABEL: load_sext_8i1_to_8i16:
1189 ; AVX:       # BB#0: # %entry
1190 ; AVX-NEXT:    movzbl (%rdi), %eax
1191 ; AVX-NEXT:    movq %rax, %rcx
1192 ; AVX-NEXT:    shlq $62, %rcx
1193 ; AVX-NEXT:    sarq $63, %rcx
1194 ; AVX-NEXT:    movq %rax, %rdx
1195 ; AVX-NEXT:    shlq $63, %rdx
1196 ; AVX-NEXT:    sarq $63, %rdx
1197 ; AVX-NEXT:    vmovd %edx, %xmm0
1198 ; AVX-NEXT:    vpinsrw $1, %ecx, %xmm0, %xmm0
1199 ; AVX-NEXT:    movq %rax, %rcx
1200 ; AVX-NEXT:    shlq $61, %rcx
1201 ; AVX-NEXT:    sarq $63, %rcx
1202 ; AVX-NEXT:    vpinsrw $2, %ecx, %xmm0, %xmm0
1203 ; AVX-NEXT:    movq %rax, %rcx
1204 ; AVX-NEXT:    shlq $60, %rcx
1205 ; AVX-NEXT:    sarq $63, %rcx
1206 ; AVX-NEXT:    vpinsrw $3, %ecx, %xmm0, %xmm0
1207 ; AVX-NEXT:    movq %rax, %rcx
1208 ; AVX-NEXT:    shlq $59, %rcx
1209 ; AVX-NEXT:    sarq $63, %rcx
1210 ; AVX-NEXT:    vpinsrw $4, %ecx, %xmm0, %xmm0
1211 ; AVX-NEXT:    movq %rax, %rcx
1212 ; AVX-NEXT:    shlq $58, %rcx
1213 ; AVX-NEXT:    sarq $63, %rcx
1214 ; AVX-NEXT:    vpinsrw $5, %ecx, %xmm0, %xmm0
1215 ; AVX-NEXT:    movq %rax, %rcx
1216 ; AVX-NEXT:    shlq $57, %rcx
1217 ; AVX-NEXT:    sarq $63, %rcx
1218 ; AVX-NEXT:    vpinsrw $6, %ecx, %xmm0, %xmm0
1219 ; AVX-NEXT:    shlq $56, %rax
1220 ; AVX-NEXT:    sarq $63, %rax
1221 ; AVX-NEXT:    vpinsrw $7, %eax, %xmm0, %xmm0
1222 ; AVX-NEXT:    retq
1223 ;
1224 ; X32-SSE41-LABEL: load_sext_8i1_to_8i16:
1225 ; X32-SSE41:       # BB#0: # %entry
1226 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1227 ; X32-SSE41-NEXT:    movl (%eax), %eax
1228 ; X32-SSE41-NEXT:    movl %eax, %ecx
1229 ; X32-SSE41-NEXT:    shll $30, %ecx
1230 ; X32-SSE41-NEXT:    sarl $31, %ecx
1231 ; X32-SSE41-NEXT:    movl %eax, %edx
1232 ; X32-SSE41-NEXT:    shll $31, %edx
1233 ; X32-SSE41-NEXT:    sarl $31, %edx
1234 ; X32-SSE41-NEXT:    movd %edx, %xmm0
1235 ; X32-SSE41-NEXT:    pinsrw $1, %ecx, %xmm0
1236 ; X32-SSE41-NEXT:    movl %eax, %ecx
1237 ; X32-SSE41-NEXT:    shll $29, %ecx
1238 ; X32-SSE41-NEXT:    sarl $31, %ecx
1239 ; X32-SSE41-NEXT:    pinsrw $2, %ecx, %xmm0
1240 ; X32-SSE41-NEXT:    movl %eax, %ecx
1241 ; X32-SSE41-NEXT:    shll $28, %ecx
1242 ; X32-SSE41-NEXT:    sarl $31, %ecx
1243 ; X32-SSE41-NEXT:    pinsrw $3, %ecx, %xmm0
1244 ; X32-SSE41-NEXT:    movl %eax, %ecx
1245 ; X32-SSE41-NEXT:    shll $27, %ecx
1246 ; X32-SSE41-NEXT:    sarl $31, %ecx
1247 ; X32-SSE41-NEXT:    pinsrw $4, %ecx, %xmm0
1248 ; X32-SSE41-NEXT:    movl %eax, %ecx
1249 ; X32-SSE41-NEXT:    shll $26, %ecx
1250 ; X32-SSE41-NEXT:    sarl $31, %ecx
1251 ; X32-SSE41-NEXT:    pinsrw $5, %ecx, %xmm0
1252 ; X32-SSE41-NEXT:    movl %eax, %ecx
1253 ; X32-SSE41-NEXT:    shll $25, %ecx
1254 ; X32-SSE41-NEXT:    sarl $31, %ecx
1255 ; X32-SSE41-NEXT:    pinsrw $6, %ecx, %xmm0
1256 ; X32-SSE41-NEXT:    shll $24, %eax
1257 ; X32-SSE41-NEXT:    sarl $31, %eax
1258 ; X32-SSE41-NEXT:    pinsrw $7, %eax, %xmm0
1259 ; X32-SSE41-NEXT:    retl
1260 entry:
1261  %X = load <8 x i1>, <8 x i1>* %ptr
1262  %Y = sext <8 x i1> %X to <8 x i16>
1263  ret <8 x i16> %Y
1264 }
1265
1266 define <8 x i16> @load_sext_8i8_to_8i16(<8 x i8> *%ptr) {
1267 ; SSE2-LABEL: load_sext_8i8_to_8i16:
1268 ; SSE2:       # BB#0: # %entry
1269 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
1270 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1271 ; SSE2-NEXT:    psraw $8, %xmm0
1272 ; SSE2-NEXT:    retq
1273 ;
1274 ; SSSE3-LABEL: load_sext_8i8_to_8i16:
1275 ; SSSE3:       # BB#0: # %entry
1276 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
1277 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1278 ; SSSE3-NEXT:    psraw $8, %xmm0
1279 ; SSSE3-NEXT:    retq
1280 ;
1281 ; SSE41-LABEL: load_sext_8i8_to_8i16:
1282 ; SSE41:       # BB#0: # %entry
1283 ; SSE41-NEXT:    pmovsxbw (%rdi), %xmm0
1284 ; SSE41-NEXT:    retq
1285 ;
1286 ; AVX-LABEL: load_sext_8i8_to_8i16:
1287 ; AVX:       # BB#0: # %entry
1288 ; AVX-NEXT:    vpmovsxbw (%rdi), %xmm0
1289 ; AVX-NEXT:    retq
1290 ;
1291 ; X32-SSE41-LABEL: load_sext_8i8_to_8i16:
1292 ; X32-SSE41:       # BB#0: # %entry
1293 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1294 ; X32-SSE41-NEXT:    pmovsxbw (%eax), %xmm0
1295 ; X32-SSE41-NEXT:    retl
1296 entry:
1297  %X = load <8 x i8>, <8 x i8>* %ptr
1298  %Y = sext <8 x i8> %X to <8 x i16>
1299  ret <8 x i16> %Y
1300 }
1301
1302 define <8 x i32> @load_sext_8i1_to_8i32(<8 x i1> *%ptr) {
1303 ; SSE2-LABEL: load_sext_8i1_to_8i32:
1304 ; SSE2:       # BB#0: # %entry
1305 ; SSE2-NEXT:    movzbl (%rdi), %eax
1306 ; SSE2-NEXT:    movl %eax, %ecx
1307 ; SSE2-NEXT:    shrl $6, %ecx
1308 ; SSE2-NEXT:    andl $1, %ecx
1309 ; SSE2-NEXT:    movd %ecx, %xmm0
1310 ; SSE2-NEXT:    movl %eax, %ecx
1311 ; SSE2-NEXT:    shrl $2, %ecx
1312 ; SSE2-NEXT:    andl $1, %ecx
1313 ; SSE2-NEXT:    movd %ecx, %xmm2
1314 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1315 ; SSE2-NEXT:    movl %eax, %ecx
1316 ; SSE2-NEXT:    andl $1, %ecx
1317 ; SSE2-NEXT:    movd %ecx, %xmm1
1318 ; SSE2-NEXT:    movl %eax, %ecx
1319 ; SSE2-NEXT:    shrl $4, %ecx
1320 ; SSE2-NEXT:    andl $1, %ecx
1321 ; SSE2-NEXT:    movd %ecx, %xmm0
1322 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1323 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1324 ; SSE2-NEXT:    movl %eax, %ecx
1325 ; SSE2-NEXT:    shrl $5, %ecx
1326 ; SSE2-NEXT:    andl $1, %ecx
1327 ; SSE2-NEXT:    movd %ecx, %xmm0
1328 ; SSE2-NEXT:    movl %eax, %ecx
1329 ; SSE2-NEXT:    shrl %ecx
1330 ; SSE2-NEXT:    andl $1, %ecx
1331 ; SSE2-NEXT:    movd %ecx, %xmm2
1332 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1333 ; SSE2-NEXT:    movl %eax, %ecx
1334 ; SSE2-NEXT:    shrl $3, %ecx
1335 ; SSE2-NEXT:    andl $1, %ecx
1336 ; SSE2-NEXT:    movd %ecx, %xmm0
1337 ; SSE2-NEXT:    shrl $7, %eax
1338 ; SSE2-NEXT:    movzwl %ax, %eax
1339 ; SSE2-NEXT:    movd %eax, %xmm3
1340 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
1341 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1342 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1343 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1344 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1345 ; SSE2-NEXT:    pslld $31, %xmm0
1346 ; SSE2-NEXT:    psrad $31, %xmm0
1347 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1348 ; SSE2-NEXT:    pslld $31, %xmm1
1349 ; SSE2-NEXT:    psrad $31, %xmm1
1350 ; SSE2-NEXT:    retq
1351 ;
1352 ; SSSE3-LABEL: load_sext_8i1_to_8i32:
1353 ; SSSE3:       # BB#0: # %entry
1354 ; SSSE3-NEXT:    movzbl (%rdi), %eax
1355 ; SSSE3-NEXT:    movl %eax, %ecx
1356 ; SSSE3-NEXT:    shrl $6, %ecx
1357 ; SSSE3-NEXT:    andl $1, %ecx
1358 ; SSSE3-NEXT:    movd %ecx, %xmm0
1359 ; SSSE3-NEXT:    movl %eax, %ecx
1360 ; SSSE3-NEXT:    shrl $2, %ecx
1361 ; SSSE3-NEXT:    andl $1, %ecx
1362 ; SSSE3-NEXT:    movd %ecx, %xmm2
1363 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1364 ; SSSE3-NEXT:    movl %eax, %ecx
1365 ; SSSE3-NEXT:    andl $1, %ecx
1366 ; SSSE3-NEXT:    movd %ecx, %xmm1
1367 ; SSSE3-NEXT:    movl %eax, %ecx
1368 ; SSSE3-NEXT:    shrl $4, %ecx
1369 ; SSSE3-NEXT:    andl $1, %ecx
1370 ; SSSE3-NEXT:    movd %ecx, %xmm0
1371 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1372 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1373 ; SSSE3-NEXT:    movl %eax, %ecx
1374 ; SSSE3-NEXT:    shrl $5, %ecx
1375 ; SSSE3-NEXT:    andl $1, %ecx
1376 ; SSSE3-NEXT:    movd %ecx, %xmm0
1377 ; SSSE3-NEXT:    movl %eax, %ecx
1378 ; SSSE3-NEXT:    shrl %ecx
1379 ; SSSE3-NEXT:    andl $1, %ecx
1380 ; SSSE3-NEXT:    movd %ecx, %xmm2
1381 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1382 ; SSSE3-NEXT:    movl %eax, %ecx
1383 ; SSSE3-NEXT:    shrl $3, %ecx
1384 ; SSSE3-NEXT:    andl $1, %ecx
1385 ; SSSE3-NEXT:    movd %ecx, %xmm0
1386 ; SSSE3-NEXT:    shrl $7, %eax
1387 ; SSSE3-NEXT:    movzwl %ax, %eax
1388 ; SSSE3-NEXT:    movd %eax, %xmm3
1389 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
1390 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1391 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1392 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1393 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1394 ; SSSE3-NEXT:    pslld $31, %xmm0
1395 ; SSSE3-NEXT:    psrad $31, %xmm0
1396 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1397 ; SSSE3-NEXT:    pslld $31, %xmm1
1398 ; SSSE3-NEXT:    psrad $31, %xmm1
1399 ; SSSE3-NEXT:    retq
1400 ;
1401 ; SSE41-LABEL: load_sext_8i1_to_8i32:
1402 ; SSE41:       # BB#0: # %entry
1403 ; SSE41-NEXT:    movzbl (%rdi), %eax
1404 ; SSE41-NEXT:    movl %eax, %ecx
1405 ; SSE41-NEXT:    shrl %ecx
1406 ; SSE41-NEXT:    andl $1, %ecx
1407 ; SSE41-NEXT:    movl %eax, %edx
1408 ; SSE41-NEXT:    andl $1, %edx
1409 ; SSE41-NEXT:    movd %edx, %xmm1
1410 ; SSE41-NEXT:    pinsrw $1, %ecx, %xmm1
1411 ; SSE41-NEXT:    movl %eax, %ecx
1412 ; SSE41-NEXT:    shrl $2, %ecx
1413 ; SSE41-NEXT:    andl $1, %ecx
1414 ; SSE41-NEXT:    pinsrw $2, %ecx, %xmm1
1415 ; SSE41-NEXT:    movl %eax, %ecx
1416 ; SSE41-NEXT:    shrl $3, %ecx
1417 ; SSE41-NEXT:    andl $1, %ecx
1418 ; SSE41-NEXT:    pinsrw $3, %ecx, %xmm1
1419 ; SSE41-NEXT:    movl %eax, %ecx
1420 ; SSE41-NEXT:    shrl $4, %ecx
1421 ; SSE41-NEXT:    andl $1, %ecx
1422 ; SSE41-NEXT:    pinsrw $4, %ecx, %xmm1
1423 ; SSE41-NEXT:    movl %eax, %ecx
1424 ; SSE41-NEXT:    shrl $5, %ecx
1425 ; SSE41-NEXT:    andl $1, %ecx
1426 ; SSE41-NEXT:    pinsrw $5, %ecx, %xmm1
1427 ; SSE41-NEXT:    movl %eax, %ecx
1428 ; SSE41-NEXT:    shrl $6, %ecx
1429 ; SSE41-NEXT:    andl $1, %ecx
1430 ; SSE41-NEXT:    pinsrw $6, %ecx, %xmm1
1431 ; SSE41-NEXT:    shrl $7, %eax
1432 ; SSE41-NEXT:    movzwl %ax, %eax
1433 ; SSE41-NEXT:    pinsrw $7, %eax, %xmm1
1434 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
1435 ; SSE41-NEXT:    pslld $31, %xmm0
1436 ; SSE41-NEXT:    psrad $31, %xmm0
1437 ; SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1438 ; SSE41-NEXT:    pslld $31, %xmm1
1439 ; SSE41-NEXT:    psrad $31, %xmm1
1440 ; SSE41-NEXT:    retq
1441 ;
1442 ; AVX1-LABEL: load_sext_8i1_to_8i32:
1443 ; AVX1:       # BB#0: # %entry
1444 ; AVX1-NEXT:    movzbl (%rdi), %eax
1445 ; AVX1-NEXT:    movq %rax, %rcx
1446 ; AVX1-NEXT:    shlq $58, %rcx
1447 ; AVX1-NEXT:    sarq $63, %rcx
1448 ; AVX1-NEXT:    movq %rax, %rdx
1449 ; AVX1-NEXT:    shlq $59, %rdx
1450 ; AVX1-NEXT:    sarq $63, %rdx
1451 ; AVX1-NEXT:    vmovd %edx, %xmm0
1452 ; AVX1-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
1453 ; AVX1-NEXT:    movq %rax, %rcx
1454 ; AVX1-NEXT:    shlq $57, %rcx
1455 ; AVX1-NEXT:    sarq $63, %rcx
1456 ; AVX1-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
1457 ; AVX1-NEXT:    movq %rax, %rcx
1458 ; AVX1-NEXT:    shlq $56, %rcx
1459 ; AVX1-NEXT:    sarq $63, %rcx
1460 ; AVX1-NEXT:    vpinsrd $3, %ecx, %xmm0, %xmm0
1461 ; AVX1-NEXT:    movq %rax, %rcx
1462 ; AVX1-NEXT:    shlq $62, %rcx
1463 ; AVX1-NEXT:    sarq $63, %rcx
1464 ; AVX1-NEXT:    movq %rax, %rdx
1465 ; AVX1-NEXT:    shlq $63, %rdx
1466 ; AVX1-NEXT:    sarq $63, %rdx
1467 ; AVX1-NEXT:    vmovd %edx, %xmm1
1468 ; AVX1-NEXT:    vpinsrd $1, %ecx, %xmm1, %xmm1
1469 ; AVX1-NEXT:    movq %rax, %rcx
1470 ; AVX1-NEXT:    shlq $61, %rcx
1471 ; AVX1-NEXT:    sarq $63, %rcx
1472 ; AVX1-NEXT:    vpinsrd $2, %ecx, %xmm1, %xmm1
1473 ; AVX1-NEXT:    shlq $60, %rax
1474 ; AVX1-NEXT:    sarq $63, %rax
1475 ; AVX1-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm1
1476 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1477 ; AVX1-NEXT:    retq
1478 ;
1479 ; AVX2-LABEL: load_sext_8i1_to_8i32:
1480 ; AVX2:       # BB#0: # %entry
1481 ; AVX2-NEXT:    movzbl (%rdi), %eax
1482 ; AVX2-NEXT:    movq %rax, %rcx
1483 ; AVX2-NEXT:    shlq $58, %rcx
1484 ; AVX2-NEXT:    sarq $63, %rcx
1485 ; AVX2-NEXT:    movq %rax, %rdx
1486 ; AVX2-NEXT:    shlq $59, %rdx
1487 ; AVX2-NEXT:    sarq $63, %rdx
1488 ; AVX2-NEXT:    vmovd %edx, %xmm0
1489 ; AVX2-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
1490 ; AVX2-NEXT:    movq %rax, %rcx
1491 ; AVX2-NEXT:    shlq $57, %rcx
1492 ; AVX2-NEXT:    sarq $63, %rcx
1493 ; AVX2-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
1494 ; AVX2-NEXT:    movq %rax, %rcx
1495 ; AVX2-NEXT:    shlq $56, %rcx
1496 ; AVX2-NEXT:    sarq $63, %rcx
1497 ; AVX2-NEXT:    vpinsrd $3, %ecx, %xmm0, %xmm0
1498 ; AVX2-NEXT:    movq %rax, %rcx
1499 ; AVX2-NEXT:    shlq $62, %rcx
1500 ; AVX2-NEXT:    sarq $63, %rcx
1501 ; AVX2-NEXT:    movq %rax, %rdx
1502 ; AVX2-NEXT:    shlq $63, %rdx
1503 ; AVX2-NEXT:    sarq $63, %rdx
1504 ; AVX2-NEXT:    vmovd %edx, %xmm1
1505 ; AVX2-NEXT:    vpinsrd $1, %ecx, %xmm1, %xmm1
1506 ; AVX2-NEXT:    movq %rax, %rcx
1507 ; AVX2-NEXT:    shlq $61, %rcx
1508 ; AVX2-NEXT:    sarq $63, %rcx
1509 ; AVX2-NEXT:    vpinsrd $2, %ecx, %xmm1, %xmm1
1510 ; AVX2-NEXT:    shlq $60, %rax
1511 ; AVX2-NEXT:    sarq $63, %rax
1512 ; AVX2-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm1
1513 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1514 ; AVX2-NEXT:    retq
1515 ;
1516 ; X32-SSE41-LABEL: load_sext_8i1_to_8i32:
1517 ; X32-SSE41:       # BB#0: # %entry
1518 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1519 ; X32-SSE41-NEXT:    movzbl (%eax), %eax
1520 ; X32-SSE41-NEXT:    movl %eax, %ecx
1521 ; X32-SSE41-NEXT:    shrl %ecx
1522 ; X32-SSE41-NEXT:    andl $1, %ecx
1523 ; X32-SSE41-NEXT:    movl %eax, %edx
1524 ; X32-SSE41-NEXT:    andl $1, %edx
1525 ; X32-SSE41-NEXT:    movd %edx, %xmm1
1526 ; X32-SSE41-NEXT:    pinsrw $1, %ecx, %xmm1
1527 ; X32-SSE41-NEXT:    movl %eax, %ecx
1528 ; X32-SSE41-NEXT:    shrl $2, %ecx
1529 ; X32-SSE41-NEXT:    andl $1, %ecx
1530 ; X32-SSE41-NEXT:    pinsrw $2, %ecx, %xmm1
1531 ; X32-SSE41-NEXT:    movl %eax, %ecx
1532 ; X32-SSE41-NEXT:    shrl $3, %ecx
1533 ; X32-SSE41-NEXT:    andl $1, %ecx
1534 ; X32-SSE41-NEXT:    pinsrw $3, %ecx, %xmm1
1535 ; X32-SSE41-NEXT:    movl %eax, %ecx
1536 ; X32-SSE41-NEXT:    shrl $4, %ecx
1537 ; X32-SSE41-NEXT:    andl $1, %ecx
1538 ; X32-SSE41-NEXT:    pinsrw $4, %ecx, %xmm1
1539 ; X32-SSE41-NEXT:    movl %eax, %ecx
1540 ; X32-SSE41-NEXT:    shrl $5, %ecx
1541 ; X32-SSE41-NEXT:    andl $1, %ecx
1542 ; X32-SSE41-NEXT:    pinsrw $5, %ecx, %xmm1
1543 ; X32-SSE41-NEXT:    movl %eax, %ecx
1544 ; X32-SSE41-NEXT:    shrl $6, %ecx
1545 ; X32-SSE41-NEXT:    andl $1, %ecx
1546 ; X32-SSE41-NEXT:    pinsrw $6, %ecx, %xmm1
1547 ; X32-SSE41-NEXT:    shrl $7, %eax
1548 ; X32-SSE41-NEXT:    pinsrw $7, %eax, %xmm1
1549 ; X32-SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
1550 ; X32-SSE41-NEXT:    pslld $31, %xmm0
1551 ; X32-SSE41-NEXT:    psrad $31, %xmm0
1552 ; X32-SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1553 ; X32-SSE41-NEXT:    pslld $31, %xmm1
1554 ; X32-SSE41-NEXT:    psrad $31, %xmm1
1555 ; X32-SSE41-NEXT:    retl
1556 entry:
1557  %X = load <8 x i1>, <8 x i1>* %ptr
1558  %Y = sext <8 x i1> %X to <8 x i32>
1559  ret <8 x i32> %Y
1560 }
1561
1562 define <8 x i32> @load_sext_8i8_to_8i32(<8 x i8> *%ptr) {
1563 ; SSE2-LABEL: load_sext_8i8_to_8i32:
1564 ; SSE2:       # BB#0: # %entry
1565 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1566 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1567 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1568 ; SSE2-NEXT:    psrad $24, %xmm0
1569 ; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
1570 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1571 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
1572 ; SSE2-NEXT:    psrad $24, %xmm1
1573 ; SSE2-NEXT:    retq
1574 ;
1575 ; SSSE3-LABEL: load_sext_8i8_to_8i32:
1576 ; SSSE3:       # BB#0: # %entry
1577 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1578 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1579 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1580 ; SSSE3-NEXT:    psrad $24, %xmm0
1581 ; SSSE3-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
1582 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1583 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
1584 ; SSSE3-NEXT:    psrad $24, %xmm1
1585 ; SSSE3-NEXT:    retq
1586 ;
1587 ; SSE41-LABEL: load_sext_8i8_to_8i32:
1588 ; SSE41:       # BB#0: # %entry
1589 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
1590 ; SSE41-NEXT:    pmovsxbd 4(%rdi), %xmm1
1591 ; SSE41-NEXT:    retq
1592 ;
1593 ; AVX1-LABEL: load_sext_8i8_to_8i32:
1594 ; AVX1:       # BB#0: # %entry
1595 ; AVX1-NEXT:    vpmovsxbw (%rdi), %xmm0
1596 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
1597 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1598 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
1599 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1600 ; AVX1-NEXT:    retq
1601 ;
1602 ; AVX2-LABEL: load_sext_8i8_to_8i32:
1603 ; AVX2:       # BB#0: # %entry
1604 ; AVX2-NEXT:    vpmovsxbd (%rdi), %ymm0
1605 ; AVX2-NEXT:    retq
1606 ;
1607 ; X32-SSE41-LABEL: load_sext_8i8_to_8i32:
1608 ; X32-SSE41:       # BB#0: # %entry
1609 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1610 ; X32-SSE41-NEXT:    pmovsxbd (%eax), %xmm0
1611 ; X32-SSE41-NEXT:    pmovsxbd 4(%eax), %xmm1
1612 ; X32-SSE41-NEXT:    retl
1613 entry:
1614  %X = load <8 x i8>, <8 x i8>* %ptr
1615  %Y = sext <8 x i8> %X to <8 x i32>
1616  ret <8 x i32> %Y
1617 }
1618
1619 define <16 x i8> @load_sext_16i1_to_16i8(<16 x i1> *%ptr) {
1620 ; SSE2-LABEL: load_sext_16i1_to_16i8:
1621 ; SSE2:       # BB#0: # %entry
1622 ; SSE2-NEXT:    movzwl (%rdi), %eax
1623 ; SSE2-NEXT:    movq %rax, %rcx
1624 ; SSE2-NEXT:    shlq $48, %rcx
1625 ; SSE2-NEXT:    sarq $63, %rcx
1626 ; SSE2-NEXT:    movd %ecx, %xmm0
1627 ; SSE2-NEXT:    movq %rax, %rcx
1628 ; SSE2-NEXT:    shlq $56, %rcx
1629 ; SSE2-NEXT:    sarq $63, %rcx
1630 ; SSE2-NEXT:    movd %ecx, %xmm1
1631 ; 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]
1632 ; SSE2-NEXT:    movq %rax, %rcx
1633 ; SSE2-NEXT:    shlq $52, %rcx
1634 ; SSE2-NEXT:    sarq $63, %rcx
1635 ; SSE2-NEXT:    movd %ecx, %xmm2
1636 ; SSE2-NEXT:    movq %rax, %rcx
1637 ; SSE2-NEXT:    shlq $60, %rcx
1638 ; SSE2-NEXT:    sarq $63, %rcx
1639 ; SSE2-NEXT:    movd %ecx, %xmm0
1640 ; 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]
1641 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1642 ; SSE2-NEXT:    movq %rax, %rcx
1643 ; SSE2-NEXT:    shlq $50, %rcx
1644 ; SSE2-NEXT:    sarq $63, %rcx
1645 ; SSE2-NEXT:    movd %ecx, %xmm1
1646 ; SSE2-NEXT:    movq %rax, %rcx
1647 ; SSE2-NEXT:    shlq $58, %rcx
1648 ; SSE2-NEXT:    sarq $63, %rcx
1649 ; SSE2-NEXT:    movd %ecx, %xmm2
1650 ; 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]
1651 ; SSE2-NEXT:    movq %rax, %rcx
1652 ; SSE2-NEXT:    shlq $54, %rcx
1653 ; SSE2-NEXT:    sarq $63, %rcx
1654 ; SSE2-NEXT:    movd %ecx, %xmm3
1655 ; SSE2-NEXT:    movq %rax, %rcx
1656 ; SSE2-NEXT:    shlq $62, %rcx
1657 ; SSE2-NEXT:    sarq $63, %rcx
1658 ; SSE2-NEXT:    movd %ecx, %xmm1
1659 ; 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]
1660 ; 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]
1661 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1662 ; SSE2-NEXT:    movq %rax, %rcx
1663 ; SSE2-NEXT:    shlq $49, %rcx
1664 ; SSE2-NEXT:    sarq $63, %rcx
1665 ; SSE2-NEXT:    movd %ecx, %xmm0
1666 ; SSE2-NEXT:    movq %rax, %rcx
1667 ; SSE2-NEXT:    shlq $57, %rcx
1668 ; SSE2-NEXT:    sarq $63, %rcx
1669 ; SSE2-NEXT:    movd %ecx, %xmm3
1670 ; 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]
1671 ; SSE2-NEXT:    movq %rax, %rcx
1672 ; SSE2-NEXT:    shlq $53, %rcx
1673 ; SSE2-NEXT:    sarq $63, %rcx
1674 ; SSE2-NEXT:    movd %ecx, %xmm0
1675 ; SSE2-NEXT:    movq %rax, %rcx
1676 ; SSE2-NEXT:    shlq $61, %rcx
1677 ; SSE2-NEXT:    sarq $63, %rcx
1678 ; SSE2-NEXT:    movd %ecx, %xmm2
1679 ; 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]
1680 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
1681 ; SSE2-NEXT:    movq %rax, %rcx
1682 ; SSE2-NEXT:    shlq $51, %rcx
1683 ; SSE2-NEXT:    sarq $63, %rcx
1684 ; SSE2-NEXT:    movd %ecx, %xmm0
1685 ; SSE2-NEXT:    movq %rax, %rcx
1686 ; SSE2-NEXT:    shlq $59, %rcx
1687 ; SSE2-NEXT:    sarq $63, %rcx
1688 ; SSE2-NEXT:    movd %ecx, %xmm3
1689 ; 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]
1690 ; SSE2-NEXT:    movq %rax, %rcx
1691 ; SSE2-NEXT:    shlq $55, %rcx
1692 ; SSE2-NEXT:    sarq $63, %rcx
1693 ; SSE2-NEXT:    movd %ecx, %xmm4
1694 ; SSE2-NEXT:    shlq $63, %rax
1695 ; SSE2-NEXT:    sarq $63, %rax
1696 ; SSE2-NEXT:    movd %eax, %xmm0
1697 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[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:    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]
1700 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1701 ; SSE2-NEXT:    retq
1702 ;
1703 ; SSSE3-LABEL: load_sext_16i1_to_16i8:
1704 ; SSSE3:       # BB#0: # %entry
1705 ; SSSE3-NEXT:    movzwl (%rdi), %eax
1706 ; SSSE3-NEXT:    movq %rax, %rcx
1707 ; SSSE3-NEXT:    shlq $48, %rcx
1708 ; SSSE3-NEXT:    sarq $63, %rcx
1709 ; SSSE3-NEXT:    movd %ecx, %xmm0
1710 ; SSSE3-NEXT:    movq %rax, %rcx
1711 ; SSSE3-NEXT:    shlq $56, %rcx
1712 ; SSSE3-NEXT:    sarq $63, %rcx
1713 ; SSSE3-NEXT:    movd %ecx, %xmm1
1714 ; 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]
1715 ; SSSE3-NEXT:    movq %rax, %rcx
1716 ; SSSE3-NEXT:    shlq $52, %rcx
1717 ; SSSE3-NEXT:    sarq $63, %rcx
1718 ; SSSE3-NEXT:    movd %ecx, %xmm2
1719 ; SSSE3-NEXT:    movq %rax, %rcx
1720 ; SSSE3-NEXT:    shlq $60, %rcx
1721 ; SSSE3-NEXT:    sarq $63, %rcx
1722 ; SSSE3-NEXT:    movd %ecx, %xmm0
1723 ; 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]
1724 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1725 ; SSSE3-NEXT:    movq %rax, %rcx
1726 ; SSSE3-NEXT:    shlq $50, %rcx
1727 ; SSSE3-NEXT:    sarq $63, %rcx
1728 ; SSSE3-NEXT:    movd %ecx, %xmm1
1729 ; SSSE3-NEXT:    movq %rax, %rcx
1730 ; SSSE3-NEXT:    shlq $58, %rcx
1731 ; SSSE3-NEXT:    sarq $63, %rcx
1732 ; SSSE3-NEXT:    movd %ecx, %xmm2
1733 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
1734 ; SSSE3-NEXT:    movq %rax, %rcx
1735 ; SSSE3-NEXT:    shlq $54, %rcx
1736 ; SSSE3-NEXT:    sarq $63, %rcx
1737 ; SSSE3-NEXT:    movd %ecx, %xmm3
1738 ; SSSE3-NEXT:    movq %rax, %rcx
1739 ; SSSE3-NEXT:    shlq $62, %rcx
1740 ; SSSE3-NEXT:    sarq $63, %rcx
1741 ; SSSE3-NEXT:    movd %ecx, %xmm1
1742 ; 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]
1743 ; 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]
1744 ; 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]
1745 ; SSSE3-NEXT:    movq %rax, %rcx
1746 ; SSSE3-NEXT:    shlq $49, %rcx
1747 ; SSSE3-NEXT:    sarq $63, %rcx
1748 ; SSSE3-NEXT:    movd %ecx, %xmm0
1749 ; SSSE3-NEXT:    movq %rax, %rcx
1750 ; SSSE3-NEXT:    shlq $57, %rcx
1751 ; SSSE3-NEXT:    sarq $63, %rcx
1752 ; SSSE3-NEXT:    movd %ecx, %xmm3
1753 ; 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]
1754 ; SSSE3-NEXT:    movq %rax, %rcx
1755 ; SSSE3-NEXT:    shlq $53, %rcx
1756 ; SSSE3-NEXT:    sarq $63, %rcx
1757 ; SSSE3-NEXT:    movd %ecx, %xmm0
1758 ; SSSE3-NEXT:    movq %rax, %rcx
1759 ; SSSE3-NEXT:    shlq $61, %rcx
1760 ; SSSE3-NEXT:    sarq $63, %rcx
1761 ; SSSE3-NEXT:    movd %ecx, %xmm2
1762 ; 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]
1763 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
1764 ; SSSE3-NEXT:    movq %rax, %rcx
1765 ; SSSE3-NEXT:    shlq $51, %rcx
1766 ; SSSE3-NEXT:    sarq $63, %rcx
1767 ; SSSE3-NEXT:    movd %ecx, %xmm0
1768 ; SSSE3-NEXT:    movq %rax, %rcx
1769 ; SSSE3-NEXT:    shlq $59, %rcx
1770 ; SSSE3-NEXT:    sarq $63, %rcx
1771 ; SSSE3-NEXT:    movd %ecx, %xmm3
1772 ; 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]
1773 ; SSSE3-NEXT:    movq %rax, %rcx
1774 ; SSSE3-NEXT:    shlq $55, %rcx
1775 ; SSSE3-NEXT:    sarq $63, %rcx
1776 ; SSSE3-NEXT:    movd %ecx, %xmm4
1777 ; SSSE3-NEXT:    shlq $63, %rax
1778 ; SSSE3-NEXT:    sarq $63, %rax
1779 ; SSSE3-NEXT:    movd %eax, %xmm0
1780 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
1781 ; 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]
1782 ; 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]
1783 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1784 ; SSSE3-NEXT:    retq
1785 ;
1786 ; SSE41-LABEL: load_sext_16i1_to_16i8:
1787 ; SSE41:       # BB#0: # %entry
1788 ; SSE41-NEXT:    movzwl (%rdi), %eax
1789 ; SSE41-NEXT:    movq %rax, %rcx
1790 ; SSE41-NEXT:    shlq $62, %rcx
1791 ; SSE41-NEXT:    sarq $63, %rcx
1792 ; SSE41-NEXT:    movq %rax, %rdx
1793 ; SSE41-NEXT:    shlq $63, %rdx
1794 ; SSE41-NEXT:    sarq $63, %rdx
1795 ; SSE41-NEXT:    movd %edx, %xmm0
1796 ; SSE41-NEXT:    pinsrb $1, %ecx, %xmm0
1797 ; SSE41-NEXT:    movq %rax, %rcx
1798 ; SSE41-NEXT:    shlq $61, %rcx
1799 ; SSE41-NEXT:    sarq $63, %rcx
1800 ; SSE41-NEXT:    pinsrb $2, %ecx, %xmm0
1801 ; SSE41-NEXT:    movq %rax, %rcx
1802 ; SSE41-NEXT:    shlq $60, %rcx
1803 ; SSE41-NEXT:    sarq $63, %rcx
1804 ; SSE41-NEXT:    pinsrb $3, %ecx, %xmm0
1805 ; SSE41-NEXT:    movq %rax, %rcx
1806 ; SSE41-NEXT:    shlq $59, %rcx
1807 ; SSE41-NEXT:    sarq $63, %rcx
1808 ; SSE41-NEXT:    pinsrb $4, %ecx, %xmm0
1809 ; SSE41-NEXT:    movq %rax, %rcx
1810 ; SSE41-NEXT:    shlq $58, %rcx
1811 ; SSE41-NEXT:    sarq $63, %rcx
1812 ; SSE41-NEXT:    pinsrb $5, %ecx, %xmm0
1813 ; SSE41-NEXT:    movq %rax, %rcx
1814 ; SSE41-NEXT:    shlq $57, %rcx
1815 ; SSE41-NEXT:    sarq $63, %rcx
1816 ; SSE41-NEXT:    pinsrb $6, %ecx, %xmm0
1817 ; SSE41-NEXT:    movq %rax, %rcx
1818 ; SSE41-NEXT:    shlq $56, %rcx
1819 ; SSE41-NEXT:    sarq $63, %rcx
1820 ; SSE41-NEXT:    pinsrb $7, %ecx, %xmm0
1821 ; SSE41-NEXT:    movq %rax, %rcx
1822 ; SSE41-NEXT:    shlq $55, %rcx
1823 ; SSE41-NEXT:    sarq $63, %rcx
1824 ; SSE41-NEXT:    pinsrb $8, %ecx, %xmm0
1825 ; SSE41-NEXT:    movq %rax, %rcx
1826 ; SSE41-NEXT:    shlq $54, %rcx
1827 ; SSE41-NEXT:    sarq $63, %rcx
1828 ; SSE41-NEXT:    pinsrb $9, %ecx, %xmm0
1829 ; SSE41-NEXT:    movq %rax, %rcx
1830 ; SSE41-NEXT:    shlq $53, %rcx
1831 ; SSE41-NEXT:    sarq $63, %rcx
1832 ; SSE41-NEXT:    pinsrb $10, %ecx, %xmm0
1833 ; SSE41-NEXT:    movq %rax, %rcx
1834 ; SSE41-NEXT:    shlq $52, %rcx
1835 ; SSE41-NEXT:    sarq $63, %rcx
1836 ; SSE41-NEXT:    pinsrb $11, %ecx, %xmm0
1837 ; SSE41-NEXT:    movq %rax, %rcx
1838 ; SSE41-NEXT:    shlq $51, %rcx
1839 ; SSE41-NEXT:    sarq $63, %rcx
1840 ; SSE41-NEXT:    pinsrb $12, %ecx, %xmm0
1841 ; SSE41-NEXT:    movq %rax, %rcx
1842 ; SSE41-NEXT:    shlq $50, %rcx
1843 ; SSE41-NEXT:    sarq $63, %rcx
1844 ; SSE41-NEXT:    pinsrb $13, %ecx, %xmm0
1845 ; SSE41-NEXT:    movq %rax, %rcx
1846 ; SSE41-NEXT:    shlq $49, %rcx
1847 ; SSE41-NEXT:    sarq $63, %rcx
1848 ; SSE41-NEXT:    pinsrb $14, %ecx, %xmm0
1849 ; SSE41-NEXT:    shlq $48, %rax
1850 ; SSE41-NEXT:    sarq $63, %rax
1851 ; SSE41-NEXT:    pinsrb $15, %eax, %xmm0
1852 ; SSE41-NEXT:    retq
1853 ;
1854 ; AVX-LABEL: load_sext_16i1_to_16i8:
1855 ; AVX:       # BB#0: # %entry
1856 ; AVX-NEXT:    movzwl (%rdi), %eax
1857 ; AVX-NEXT:    movq %rax, %rcx
1858 ; AVX-NEXT:    shlq $62, %rcx
1859 ; AVX-NEXT:    sarq $63, %rcx
1860 ; AVX-NEXT:    movq %rax, %rdx
1861 ; AVX-NEXT:    shlq $63, %rdx
1862 ; AVX-NEXT:    sarq $63, %rdx
1863 ; AVX-NEXT:    vmovd %edx, %xmm0
1864 ; AVX-NEXT:    vpinsrb $1, %ecx, %xmm0, %xmm0
1865 ; AVX-NEXT:    movq %rax, %rcx
1866 ; AVX-NEXT:    shlq $61, %rcx
1867 ; AVX-NEXT:    sarq $63, %rcx
1868 ; AVX-NEXT:    vpinsrb $2, %ecx, %xmm0, %xmm0
1869 ; AVX-NEXT:    movq %rax, %rcx
1870 ; AVX-NEXT:    shlq $60, %rcx
1871 ; AVX-NEXT:    sarq $63, %rcx
1872 ; AVX-NEXT:    vpinsrb $3, %ecx, %xmm0, %xmm0
1873 ; AVX-NEXT:    movq %rax, %rcx
1874 ; AVX-NEXT:    shlq $59, %rcx
1875 ; AVX-NEXT:    sarq $63, %rcx
1876 ; AVX-NEXT:    vpinsrb $4, %ecx, %xmm0, %xmm0
1877 ; AVX-NEXT:    movq %rax, %rcx
1878 ; AVX-NEXT:    shlq $58, %rcx
1879 ; AVX-NEXT:    sarq $63, %rcx
1880 ; AVX-NEXT:    vpinsrb $5, %ecx, %xmm0, %xmm0
1881 ; AVX-NEXT:    movq %rax, %rcx
1882 ; AVX-NEXT:    shlq $57, %rcx
1883 ; AVX-NEXT:    sarq $63, %rcx
1884 ; AVX-NEXT:    vpinsrb $6, %ecx, %xmm0, %xmm0
1885 ; AVX-NEXT:    movq %rax, %rcx
1886 ; AVX-NEXT:    shlq $56, %rcx
1887 ; AVX-NEXT:    sarq $63, %rcx
1888 ; AVX-NEXT:    vpinsrb $7, %ecx, %xmm0, %xmm0
1889 ; AVX-NEXT:    movq %rax, %rcx
1890 ; AVX-NEXT:    shlq $55, %rcx
1891 ; AVX-NEXT:    sarq $63, %rcx
1892 ; AVX-NEXT:    vpinsrb $8, %ecx, %xmm0, %xmm0
1893 ; AVX-NEXT:    movq %rax, %rcx
1894 ; AVX-NEXT:    shlq $54, %rcx
1895 ; AVX-NEXT:    sarq $63, %rcx
1896 ; AVX-NEXT:    vpinsrb $9, %ecx, %xmm0, %xmm0
1897 ; AVX-NEXT:    movq %rax, %rcx
1898 ; AVX-NEXT:    shlq $53, %rcx
1899 ; AVX-NEXT:    sarq $63, %rcx
1900 ; AVX-NEXT:    vpinsrb $10, %ecx, %xmm0, %xmm0
1901 ; AVX-NEXT:    movq %rax, %rcx
1902 ; AVX-NEXT:    shlq $52, %rcx
1903 ; AVX-NEXT:    sarq $63, %rcx
1904 ; AVX-NEXT:    vpinsrb $11, %ecx, %xmm0, %xmm0
1905 ; AVX-NEXT:    movq %rax, %rcx
1906 ; AVX-NEXT:    shlq $51, %rcx
1907 ; AVX-NEXT:    sarq $63, %rcx
1908 ; AVX-NEXT:    vpinsrb $12, %ecx, %xmm0, %xmm0
1909 ; AVX-NEXT:    movq %rax, %rcx
1910 ; AVX-NEXT:    shlq $50, %rcx
1911 ; AVX-NEXT:    sarq $63, %rcx
1912 ; AVX-NEXT:    vpinsrb $13, %ecx, %xmm0, %xmm0
1913 ; AVX-NEXT:    movq %rax, %rcx
1914 ; AVX-NEXT:    shlq $49, %rcx
1915 ; AVX-NEXT:    sarq $63, %rcx
1916 ; AVX-NEXT:    vpinsrb $14, %ecx, %xmm0, %xmm0
1917 ; AVX-NEXT:    shlq $48, %rax
1918 ; AVX-NEXT:    sarq $63, %rax
1919 ; AVX-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
1920 ; AVX-NEXT:    retq
1921 ;
1922 ; X32-SSE41-LABEL: load_sext_16i1_to_16i8:
1923 ; X32-SSE41:       # BB#0: # %entry
1924 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1925 ; X32-SSE41-NEXT:    movl (%eax), %eax
1926 ; X32-SSE41-NEXT:    movl %eax, %ecx
1927 ; X32-SSE41-NEXT:    shll $30, %ecx
1928 ; X32-SSE41-NEXT:    sarl $31, %ecx
1929 ; X32-SSE41-NEXT:    movl %eax, %edx
1930 ; X32-SSE41-NEXT:    shll $31, %edx
1931 ; X32-SSE41-NEXT:    sarl $31, %edx
1932 ; X32-SSE41-NEXT:    movd %edx, %xmm0
1933 ; X32-SSE41-NEXT:    pinsrb $1, %ecx, %xmm0
1934 ; X32-SSE41-NEXT:    movl %eax, %ecx
1935 ; X32-SSE41-NEXT:    shll $29, %ecx
1936 ; X32-SSE41-NEXT:    sarl $31, %ecx
1937 ; X32-SSE41-NEXT:    pinsrb $2, %ecx, %xmm0
1938 ; X32-SSE41-NEXT:    movl %eax, %ecx
1939 ; X32-SSE41-NEXT:    shll $28, %ecx
1940 ; X32-SSE41-NEXT:    sarl $31, %ecx
1941 ; X32-SSE41-NEXT:    pinsrb $3, %ecx, %xmm0
1942 ; X32-SSE41-NEXT:    movl %eax, %ecx
1943 ; X32-SSE41-NEXT:    shll $27, %ecx
1944 ; X32-SSE41-NEXT:    sarl $31, %ecx
1945 ; X32-SSE41-NEXT:    pinsrb $4, %ecx, %xmm0
1946 ; X32-SSE41-NEXT:    movl %eax, %ecx
1947 ; X32-SSE41-NEXT:    shll $26, %ecx
1948 ; X32-SSE41-NEXT:    sarl $31, %ecx
1949 ; X32-SSE41-NEXT:    pinsrb $5, %ecx, %xmm0
1950 ; X32-SSE41-NEXT:    movl %eax, %ecx
1951 ; X32-SSE41-NEXT:    shll $25, %ecx
1952 ; X32-SSE41-NEXT:    sarl $31, %ecx
1953 ; X32-SSE41-NEXT:    pinsrb $6, %ecx, %xmm0
1954 ; X32-SSE41-NEXT:    movl %eax, %ecx
1955 ; X32-SSE41-NEXT:    shll $24, %ecx
1956 ; X32-SSE41-NEXT:    sarl $31, %ecx
1957 ; X32-SSE41-NEXT:    pinsrb $7, %ecx, %xmm0
1958 ; X32-SSE41-NEXT:    movl %eax, %ecx
1959 ; X32-SSE41-NEXT:    shll $23, %ecx
1960 ; X32-SSE41-NEXT:    sarl $31, %ecx
1961 ; X32-SSE41-NEXT:    pinsrb $8, %ecx, %xmm0
1962 ; X32-SSE41-NEXT:    movl %eax, %ecx
1963 ; X32-SSE41-NEXT:    shll $22, %ecx
1964 ; X32-SSE41-NEXT:    sarl $31, %ecx
1965 ; X32-SSE41-NEXT:    pinsrb $9, %ecx, %xmm0
1966 ; X32-SSE41-NEXT:    movl %eax, %ecx
1967 ; X32-SSE41-NEXT:    shll $21, %ecx
1968 ; X32-SSE41-NEXT:    sarl $31, %ecx
1969 ; X32-SSE41-NEXT:    pinsrb $10, %ecx, %xmm0
1970 ; X32-SSE41-NEXT:    movl %eax, %ecx
1971 ; X32-SSE41-NEXT:    shll $20, %ecx
1972 ; X32-SSE41-NEXT:    sarl $31, %ecx
1973 ; X32-SSE41-NEXT:    pinsrb $11, %ecx, %xmm0
1974 ; X32-SSE41-NEXT:    movl %eax, %ecx
1975 ; X32-SSE41-NEXT:    shll $19, %ecx
1976 ; X32-SSE41-NEXT:    sarl $31, %ecx
1977 ; X32-SSE41-NEXT:    pinsrb $12, %ecx, %xmm0
1978 ; X32-SSE41-NEXT:    movl %eax, %ecx
1979 ; X32-SSE41-NEXT:    shll $18, %ecx
1980 ; X32-SSE41-NEXT:    sarl $31, %ecx
1981 ; X32-SSE41-NEXT:    pinsrb $13, %ecx, %xmm0
1982 ; X32-SSE41-NEXT:    movl %eax, %ecx
1983 ; X32-SSE41-NEXT:    shll $17, %ecx
1984 ; X32-SSE41-NEXT:    sarl $31, %ecx
1985 ; X32-SSE41-NEXT:    pinsrb $14, %ecx, %xmm0
1986 ; X32-SSE41-NEXT:    shll $16, %eax
1987 ; X32-SSE41-NEXT:    sarl $31, %eax
1988 ; X32-SSE41-NEXT:    pinsrb $15, %eax, %xmm0
1989 ; X32-SSE41-NEXT:    retl
1990 entry:
1991  %X = load <16 x i1>, <16 x i1>* %ptr
1992  %Y = sext <16 x i1> %X to <16 x i8>
1993  ret <16 x i8> %Y
1994 }
1995
1996 define <16 x i16> @load_sext_16i1_to_16i16(<16 x i1> *%ptr) {
1997 ; SSE2-LABEL: load_sext_16i1_to_16i16:
1998 ; SSE2:       # BB#0: # %entry
1999 ; SSE2-NEXT:    movzwl (%rdi), %eax
2000 ; SSE2-NEXT:    movl %eax, %ecx
2001 ; SSE2-NEXT:    shrl $14, %ecx
2002 ; SSE2-NEXT:    andl $1, %ecx
2003 ; SSE2-NEXT:    movd %ecx, %xmm0
2004 ; SSE2-NEXT:    movl %eax, %ecx
2005 ; SSE2-NEXT:    shrl $6, %ecx
2006 ; SSE2-NEXT:    andl $1, %ecx
2007 ; SSE2-NEXT:    movd %ecx, %xmm1
2008 ; 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]
2009 ; SSE2-NEXT:    movl %eax, %ecx
2010 ; SSE2-NEXT:    shrl $10, %ecx
2011 ; SSE2-NEXT:    andl $1, %ecx
2012 ; SSE2-NEXT:    movd %ecx, %xmm0
2013 ; SSE2-NEXT:    movl %eax, %ecx
2014 ; SSE2-NEXT:    shrl $2, %ecx
2015 ; SSE2-NEXT:    andl $1, %ecx
2016 ; SSE2-NEXT:    movd %ecx, %xmm2
2017 ; 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]
2018 ; 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]
2019 ; SSE2-NEXT:    movl %eax, %ecx
2020 ; SSE2-NEXT:    shrl $12, %ecx
2021 ; SSE2-NEXT:    andl $1, %ecx
2022 ; SSE2-NEXT:    movd %ecx, %xmm0
2023 ; SSE2-NEXT:    movl %eax, %ecx
2024 ; SSE2-NEXT:    shrl $4, %ecx
2025 ; SSE2-NEXT:    andl $1, %ecx
2026 ; SSE2-NEXT:    movd %ecx, %xmm3
2027 ; 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]
2028 ; SSE2-NEXT:    movl %eax, %ecx
2029 ; SSE2-NEXT:    andl $1, %ecx
2030 ; SSE2-NEXT:    movd %ecx, %xmm1
2031 ; SSE2-NEXT:    movl %eax, %ecx
2032 ; SSE2-NEXT:    shrl $8, %ecx
2033 ; SSE2-NEXT:    andl $1, %ecx
2034 ; SSE2-NEXT:    movd %ecx, %xmm0
2035 ; 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]
2036 ; 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]
2037 ; 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]
2038 ; SSE2-NEXT:    movl %eax, %ecx
2039 ; SSE2-NEXT:    shrl $13, %ecx
2040 ; SSE2-NEXT:    andl $1, %ecx
2041 ; SSE2-NEXT:    movd %ecx, %xmm0
2042 ; SSE2-NEXT:    movl %eax, %ecx
2043 ; SSE2-NEXT:    shrl $5, %ecx
2044 ; SSE2-NEXT:    andl $1, %ecx
2045 ; SSE2-NEXT:    movd %ecx, %xmm2
2046 ; 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]
2047 ; SSE2-NEXT:    movl %eax, %ecx
2048 ; SSE2-NEXT:    shrl $9, %ecx
2049 ; SSE2-NEXT:    andl $1, %ecx
2050 ; SSE2-NEXT:    movd %ecx, %xmm3
2051 ; SSE2-NEXT:    movl %eax, %ecx
2052 ; SSE2-NEXT:    shrl %ecx
2053 ; SSE2-NEXT:    andl $1, %ecx
2054 ; SSE2-NEXT:    movd %ecx, %xmm0
2055 ; 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]
2056 ; 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]
2057 ; SSE2-NEXT:    movl %eax, %ecx
2058 ; SSE2-NEXT:    shrl $11, %ecx
2059 ; SSE2-NEXT:    andl $1, %ecx
2060 ; SSE2-NEXT:    movd %ecx, %xmm2
2061 ; SSE2-NEXT:    movl %eax, %ecx
2062 ; SSE2-NEXT:    shrl $3, %ecx
2063 ; SSE2-NEXT:    andl $1, %ecx
2064 ; SSE2-NEXT:    movd %ecx, %xmm3
2065 ; 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]
2066 ; SSE2-NEXT:    movl %eax, %ecx
2067 ; SSE2-NEXT:    shrl $7, %ecx
2068 ; SSE2-NEXT:    andl $1, %ecx
2069 ; SSE2-NEXT:    movd %ecx, %xmm2
2070 ; SSE2-NEXT:    shrl $15, %eax
2071 ; SSE2-NEXT:    movzwl %ax, %eax
2072 ; SSE2-NEXT:    movd %eax, %xmm4
2073 ; 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]
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:    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]
2076 ; 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]
2077 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
2078 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2079 ; SSE2-NEXT:    psllw $15, %xmm0
2080 ; SSE2-NEXT:    psraw $15, %xmm0
2081 ; 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]
2082 ; SSE2-NEXT:    psllw $15, %xmm1
2083 ; SSE2-NEXT:    psraw $15, %xmm1
2084 ; SSE2-NEXT:    retq
2085 ;
2086 ; SSSE3-LABEL: load_sext_16i1_to_16i16:
2087 ; SSSE3:       # BB#0: # %entry
2088 ; SSSE3-NEXT:    movzwl (%rdi), %eax
2089 ; SSSE3-NEXT:    movl %eax, %ecx
2090 ; SSSE3-NEXT:    shrl $14, %ecx
2091 ; SSSE3-NEXT:    andl $1, %ecx
2092 ; SSSE3-NEXT:    movd %ecx, %xmm0
2093 ; SSSE3-NEXT:    movl %eax, %ecx
2094 ; SSSE3-NEXT:    shrl $6, %ecx
2095 ; SSSE3-NEXT:    andl $1, %ecx
2096 ; SSSE3-NEXT:    movd %ecx, %xmm1
2097 ; 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]
2098 ; SSSE3-NEXT:    movl %eax, %ecx
2099 ; SSSE3-NEXT:    shrl $10, %ecx
2100 ; SSSE3-NEXT:    andl $1, %ecx
2101 ; SSSE3-NEXT:    movd %ecx, %xmm0
2102 ; SSSE3-NEXT:    movl %eax, %ecx
2103 ; SSSE3-NEXT:    shrl $2, %ecx
2104 ; SSSE3-NEXT:    andl $1, %ecx
2105 ; SSSE3-NEXT:    movd %ecx, %xmm2
2106 ; 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]
2107 ; 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]
2108 ; SSSE3-NEXT:    movl %eax, %ecx
2109 ; SSSE3-NEXT:    shrl $12, %ecx
2110 ; SSSE3-NEXT:    andl $1, %ecx
2111 ; SSSE3-NEXT:    movd %ecx, %xmm0
2112 ; SSSE3-NEXT:    movl %eax, %ecx
2113 ; SSSE3-NEXT:    shrl $4, %ecx
2114 ; SSSE3-NEXT:    andl $1, %ecx
2115 ; SSSE3-NEXT:    movd %ecx, %xmm3
2116 ; 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]
2117 ; SSSE3-NEXT:    movl %eax, %ecx
2118 ; SSSE3-NEXT:    andl $1, %ecx
2119 ; SSSE3-NEXT:    movd %ecx, %xmm1
2120 ; SSSE3-NEXT:    movl %eax, %ecx
2121 ; SSSE3-NEXT:    shrl $8, %ecx
2122 ; SSSE3-NEXT:    andl $1, %ecx
2123 ; SSSE3-NEXT:    movd %ecx, %xmm0
2124 ; 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]
2125 ; 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]
2126 ; 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]
2127 ; SSSE3-NEXT:    movl %eax, %ecx
2128 ; SSSE3-NEXT:    shrl $13, %ecx
2129 ; SSSE3-NEXT:    andl $1, %ecx
2130 ; SSSE3-NEXT:    movd %ecx, %xmm0
2131 ; SSSE3-NEXT:    movl %eax, %ecx
2132 ; SSSE3-NEXT:    shrl $5, %ecx
2133 ; SSSE3-NEXT:    andl $1, %ecx
2134 ; SSSE3-NEXT:    movd %ecx, %xmm2
2135 ; 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]
2136 ; SSSE3-NEXT:    movl %eax, %ecx
2137 ; SSSE3-NEXT:    shrl $9, %ecx
2138 ; SSSE3-NEXT:    andl $1, %ecx
2139 ; SSSE3-NEXT:    movd %ecx, %xmm3
2140 ; SSSE3-NEXT:    movl %eax, %ecx
2141 ; SSSE3-NEXT:    shrl %ecx
2142 ; SSSE3-NEXT:    andl $1, %ecx
2143 ; SSSE3-NEXT:    movd %ecx, %xmm0
2144 ; 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]
2145 ; 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]
2146 ; SSSE3-NEXT:    movl %eax, %ecx
2147 ; SSSE3-NEXT:    shrl $11, %ecx
2148 ; SSSE3-NEXT:    andl $1, %ecx
2149 ; SSSE3-NEXT:    movd %ecx, %xmm2
2150 ; SSSE3-NEXT:    movl %eax, %ecx
2151 ; SSSE3-NEXT:    shrl $3, %ecx
2152 ; SSSE3-NEXT:    andl $1, %ecx
2153 ; SSSE3-NEXT:    movd %ecx, %xmm3
2154 ; 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]
2155 ; SSSE3-NEXT:    movl %eax, %ecx
2156 ; SSSE3-NEXT:    shrl $7, %ecx
2157 ; SSSE3-NEXT:    andl $1, %ecx
2158 ; SSSE3-NEXT:    movd %ecx, %xmm2
2159 ; SSSE3-NEXT:    shrl $15, %eax
2160 ; SSSE3-NEXT:    movzwl %ax, %eax
2161 ; SSSE3-NEXT:    movd %eax, %xmm4
2162 ; 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]
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:    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]
2165 ; 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]
2166 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
2167 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2168 ; SSSE3-NEXT:    psllw $15, %xmm0
2169 ; SSSE3-NEXT:    psraw $15, %xmm0
2170 ; 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]
2171 ; SSSE3-NEXT:    psllw $15, %xmm1
2172 ; SSSE3-NEXT:    psraw $15, %xmm1
2173 ; SSSE3-NEXT:    retq
2174 ;
2175 ; SSE41-LABEL: load_sext_16i1_to_16i16:
2176 ; SSE41:       # BB#0: # %entry
2177 ; SSE41-NEXT:    movzwl (%rdi), %eax
2178 ; SSE41-NEXT:    movl %eax, %ecx
2179 ; SSE41-NEXT:    shrl %ecx
2180 ; SSE41-NEXT:    andl $1, %ecx
2181 ; SSE41-NEXT:    movl %eax, %edx
2182 ; SSE41-NEXT:    andl $1, %edx
2183 ; SSE41-NEXT:    movd %edx, %xmm1
2184 ; SSE41-NEXT:    pinsrb $1, %ecx, %xmm1
2185 ; SSE41-NEXT:    movl %eax, %ecx
2186 ; SSE41-NEXT:    shrl $2, %ecx
2187 ; SSE41-NEXT:    andl $1, %ecx
2188 ; SSE41-NEXT:    pinsrb $2, %ecx, %xmm1
2189 ; SSE41-NEXT:    movl %eax, %ecx
2190 ; SSE41-NEXT:    shrl $3, %ecx
2191 ; SSE41-NEXT:    andl $1, %ecx
2192 ; SSE41-NEXT:    pinsrb $3, %ecx, %xmm1
2193 ; SSE41-NEXT:    movl %eax, %ecx
2194 ; SSE41-NEXT:    shrl $4, %ecx
2195 ; SSE41-NEXT:    andl $1, %ecx
2196 ; SSE41-NEXT:    pinsrb $4, %ecx, %xmm1
2197 ; SSE41-NEXT:    movl %eax, %ecx
2198 ; SSE41-NEXT:    shrl $5, %ecx
2199 ; SSE41-NEXT:    andl $1, %ecx
2200 ; SSE41-NEXT:    pinsrb $5, %ecx, %xmm1
2201 ; SSE41-NEXT:    movl %eax, %ecx
2202 ; SSE41-NEXT:    shrl $6, %ecx
2203 ; SSE41-NEXT:    andl $1, %ecx
2204 ; SSE41-NEXT:    pinsrb $6, %ecx, %xmm1
2205 ; SSE41-NEXT:    movl %eax, %ecx
2206 ; SSE41-NEXT:    shrl $7, %ecx
2207 ; SSE41-NEXT:    andl $1, %ecx
2208 ; SSE41-NEXT:    pinsrb $7, %ecx, %xmm1
2209 ; SSE41-NEXT:    movl %eax, %ecx
2210 ; SSE41-NEXT:    shrl $8, %ecx
2211 ; SSE41-NEXT:    andl $1, %ecx
2212 ; SSE41-NEXT:    pinsrb $8, %ecx, %xmm1
2213 ; SSE41-NEXT:    movl %eax, %ecx
2214 ; SSE41-NEXT:    shrl $9, %ecx
2215 ; SSE41-NEXT:    andl $1, %ecx
2216 ; SSE41-NEXT:    pinsrb $9, %ecx, %xmm1
2217 ; SSE41-NEXT:    movl %eax, %ecx
2218 ; SSE41-NEXT:    shrl $10, %ecx
2219 ; SSE41-NEXT:    andl $1, %ecx
2220 ; SSE41-NEXT:    pinsrb $10, %ecx, %xmm1
2221 ; SSE41-NEXT:    movl %eax, %ecx
2222 ; SSE41-NEXT:    shrl $11, %ecx
2223 ; SSE41-NEXT:    andl $1, %ecx
2224 ; SSE41-NEXT:    pinsrb $11, %ecx, %xmm1
2225 ; SSE41-NEXT:    movl %eax, %ecx
2226 ; SSE41-NEXT:    shrl $12, %ecx
2227 ; SSE41-NEXT:    andl $1, %ecx
2228 ; SSE41-NEXT:    pinsrb $12, %ecx, %xmm1
2229 ; SSE41-NEXT:    movl %eax, %ecx
2230 ; SSE41-NEXT:    shrl $13, %ecx
2231 ; SSE41-NEXT:    andl $1, %ecx
2232 ; SSE41-NEXT:    pinsrb $13, %ecx, %xmm1
2233 ; SSE41-NEXT:    movl %eax, %ecx
2234 ; SSE41-NEXT:    shrl $14, %ecx
2235 ; SSE41-NEXT:    andl $1, %ecx
2236 ; SSE41-NEXT:    pinsrb $14, %ecx, %xmm1
2237 ; SSE41-NEXT:    shrl $15, %eax
2238 ; SSE41-NEXT:    movzwl %ax, %eax
2239 ; SSE41-NEXT:    pinsrb $15, %eax, %xmm1
2240 ; 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
2241 ; SSE41-NEXT:    psllw $15, %xmm0
2242 ; SSE41-NEXT:    psraw $15, %xmm0
2243 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2244 ; SSE41-NEXT:    psllw $15, %xmm1
2245 ; SSE41-NEXT:    psraw $15, %xmm1
2246 ; SSE41-NEXT:    retq
2247 ;
2248 ; AVX1-LABEL: load_sext_16i1_to_16i16:
2249 ; AVX1:       # BB#0: # %entry
2250 ; AVX1-NEXT:    movzwl (%rdi), %eax
2251 ; AVX1-NEXT:    movq %rax, %rcx
2252 ; AVX1-NEXT:    shlq $54, %rcx
2253 ; AVX1-NEXT:    sarq $63, %rcx
2254 ; AVX1-NEXT:    movq %rax, %rdx
2255 ; AVX1-NEXT:    shlq $55, %rdx
2256 ; AVX1-NEXT:    sarq $63, %rdx
2257 ; AVX1-NEXT:    vmovd %edx, %xmm0
2258 ; AVX1-NEXT:    vpinsrw $1, %ecx, %xmm0, %xmm0
2259 ; AVX1-NEXT:    movq %rax, %rcx
2260 ; AVX1-NEXT:    shlq $53, %rcx
2261 ; AVX1-NEXT:    sarq $63, %rcx
2262 ; AVX1-NEXT:    vpinsrw $2, %ecx, %xmm0, %xmm0
2263 ; AVX1-NEXT:    movq %rax, %rcx
2264 ; AVX1-NEXT:    shlq $52, %rcx
2265 ; AVX1-NEXT:    sarq $63, %rcx
2266 ; AVX1-NEXT:    vpinsrw $3, %ecx, %xmm0, %xmm0
2267 ; AVX1-NEXT:    movq %rax, %rcx
2268 ; AVX1-NEXT:    shlq $51, %rcx
2269 ; AVX1-NEXT:    sarq $63, %rcx
2270 ; AVX1-NEXT:    vpinsrw $4, %ecx, %xmm0, %xmm0
2271 ; AVX1-NEXT:    movq %rax, %rcx
2272 ; AVX1-NEXT:    shlq $50, %rcx
2273 ; AVX1-NEXT:    sarq $63, %rcx
2274 ; AVX1-NEXT:    vpinsrw $5, %ecx, %xmm0, %xmm0
2275 ; AVX1-NEXT:    movq %rax, %rcx
2276 ; AVX1-NEXT:    shlq $49, %rcx
2277 ; AVX1-NEXT:    sarq $63, %rcx
2278 ; AVX1-NEXT:    vpinsrw $6, %ecx, %xmm0, %xmm0
2279 ; AVX1-NEXT:    movq %rax, %rcx
2280 ; AVX1-NEXT:    shlq $48, %rcx
2281 ; AVX1-NEXT:    sarq $63, %rcx
2282 ; AVX1-NEXT:    vpinsrw $7, %ecx, %xmm0, %xmm0
2283 ; AVX1-NEXT:    movq %rax, %rcx
2284 ; AVX1-NEXT:    shlq $62, %rcx
2285 ; AVX1-NEXT:    sarq $63, %rcx
2286 ; AVX1-NEXT:    movq %rax, %rdx
2287 ; AVX1-NEXT:    shlq $63, %rdx
2288 ; AVX1-NEXT:    sarq $63, %rdx
2289 ; AVX1-NEXT:    vmovd %edx, %xmm1
2290 ; AVX1-NEXT:    vpinsrw $1, %ecx, %xmm1, %xmm1
2291 ; AVX1-NEXT:    movq %rax, %rcx
2292 ; AVX1-NEXT:    shlq $61, %rcx
2293 ; AVX1-NEXT:    sarq $63, %rcx
2294 ; AVX1-NEXT:    vpinsrw $2, %ecx, %xmm1, %xmm1
2295 ; AVX1-NEXT:    movq %rax, %rcx
2296 ; AVX1-NEXT:    shlq $60, %rcx
2297 ; AVX1-NEXT:    sarq $63, %rcx
2298 ; AVX1-NEXT:    vpinsrw $3, %ecx, %xmm1, %xmm1
2299 ; AVX1-NEXT:    movq %rax, %rcx
2300 ; AVX1-NEXT:    shlq $59, %rcx
2301 ; AVX1-NEXT:    sarq $63, %rcx
2302 ; AVX1-NEXT:    vpinsrw $4, %ecx, %xmm1, %xmm1
2303 ; AVX1-NEXT:    movq %rax, %rcx
2304 ; AVX1-NEXT:    shlq $58, %rcx
2305 ; AVX1-NEXT:    sarq $63, %rcx
2306 ; AVX1-NEXT:    vpinsrw $5, %ecx, %xmm1, %xmm1
2307 ; AVX1-NEXT:    movq %rax, %rcx
2308 ; AVX1-NEXT:    shlq $57, %rcx
2309 ; AVX1-NEXT:    sarq $63, %rcx
2310 ; AVX1-NEXT:    vpinsrw $6, %ecx, %xmm1, %xmm1
2311 ; AVX1-NEXT:    shlq $56, %rax
2312 ; AVX1-NEXT:    sarq $63, %rax
2313 ; AVX1-NEXT:    vpinsrw $7, %eax, %xmm1, %xmm1
2314 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2315 ; AVX1-NEXT:    retq
2316 ;
2317 ; AVX2-LABEL: load_sext_16i1_to_16i16:
2318 ; AVX2:       # BB#0: # %entry
2319 ; AVX2-NEXT:    movzwl (%rdi), %eax
2320 ; AVX2-NEXT:    movq %rax, %rcx
2321 ; AVX2-NEXT:    shlq $54, %rcx
2322 ; AVX2-NEXT:    sarq $63, %rcx
2323 ; AVX2-NEXT:    movq %rax, %rdx
2324 ; AVX2-NEXT:    shlq $55, %rdx
2325 ; AVX2-NEXT:    sarq $63, %rdx
2326 ; AVX2-NEXT:    vmovd %edx, %xmm0
2327 ; AVX2-NEXT:    vpinsrw $1, %ecx, %xmm0, %xmm0
2328 ; AVX2-NEXT:    movq %rax, %rcx
2329 ; AVX2-NEXT:    shlq $53, %rcx
2330 ; AVX2-NEXT:    sarq $63, %rcx
2331 ; AVX2-NEXT:    vpinsrw $2, %ecx, %xmm0, %xmm0
2332 ; AVX2-NEXT:    movq %rax, %rcx
2333 ; AVX2-NEXT:    shlq $52, %rcx
2334 ; AVX2-NEXT:    sarq $63, %rcx
2335 ; AVX2-NEXT:    vpinsrw $3, %ecx, %xmm0, %xmm0
2336 ; AVX2-NEXT:    movq %rax, %rcx
2337 ; AVX2-NEXT:    shlq $51, %rcx
2338 ; AVX2-NEXT:    sarq $63, %rcx
2339 ; AVX2-NEXT:    vpinsrw $4, %ecx, %xmm0, %xmm0
2340 ; AVX2-NEXT:    movq %rax, %rcx
2341 ; AVX2-NEXT:    shlq $50, %rcx
2342 ; AVX2-NEXT:    sarq $63, %rcx
2343 ; AVX2-NEXT:    vpinsrw $5, %ecx, %xmm0, %xmm0
2344 ; AVX2-NEXT:    movq %rax, %rcx
2345 ; AVX2-NEXT:    shlq $49, %rcx
2346 ; AVX2-NEXT:    sarq $63, %rcx
2347 ; AVX2-NEXT:    vpinsrw $6, %ecx, %xmm0, %xmm0
2348 ; AVX2-NEXT:    movq %rax, %rcx
2349 ; AVX2-NEXT:    shlq $48, %rcx
2350 ; AVX2-NEXT:    sarq $63, %rcx
2351 ; AVX2-NEXT:    vpinsrw $7, %ecx, %xmm0, %xmm0
2352 ; AVX2-NEXT:    movq %rax, %rcx
2353 ; AVX2-NEXT:    shlq $62, %rcx
2354 ; AVX2-NEXT:    sarq $63, %rcx
2355 ; AVX2-NEXT:    movq %rax, %rdx
2356 ; AVX2-NEXT:    shlq $63, %rdx
2357 ; AVX2-NEXT:    sarq $63, %rdx
2358 ; AVX2-NEXT:    vmovd %edx, %xmm1
2359 ; AVX2-NEXT:    vpinsrw $1, %ecx, %xmm1, %xmm1
2360 ; AVX2-NEXT:    movq %rax, %rcx
2361 ; AVX2-NEXT:    shlq $61, %rcx
2362 ; AVX2-NEXT:    sarq $63, %rcx
2363 ; AVX2-NEXT:    vpinsrw $2, %ecx, %xmm1, %xmm1
2364 ; AVX2-NEXT:    movq %rax, %rcx
2365 ; AVX2-NEXT:    shlq $60, %rcx
2366 ; AVX2-NEXT:    sarq $63, %rcx
2367 ; AVX2-NEXT:    vpinsrw $3, %ecx, %xmm1, %xmm1
2368 ; AVX2-NEXT:    movq %rax, %rcx
2369 ; AVX2-NEXT:    shlq $59, %rcx
2370 ; AVX2-NEXT:    sarq $63, %rcx
2371 ; AVX2-NEXT:    vpinsrw $4, %ecx, %xmm1, %xmm1
2372 ; AVX2-NEXT:    movq %rax, %rcx
2373 ; AVX2-NEXT:    shlq $58, %rcx
2374 ; AVX2-NEXT:    sarq $63, %rcx
2375 ; AVX2-NEXT:    vpinsrw $5, %ecx, %xmm1, %xmm1
2376 ; AVX2-NEXT:    movq %rax, %rcx
2377 ; AVX2-NEXT:    shlq $57, %rcx
2378 ; AVX2-NEXT:    sarq $63, %rcx
2379 ; AVX2-NEXT:    vpinsrw $6, %ecx, %xmm1, %xmm1
2380 ; AVX2-NEXT:    shlq $56, %rax
2381 ; AVX2-NEXT:    sarq $63, %rax
2382 ; AVX2-NEXT:    vpinsrw $7, %eax, %xmm1, %xmm1
2383 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
2384 ; AVX2-NEXT:    retq
2385 ;
2386 ; X32-SSE41-LABEL: load_sext_16i1_to_16i16:
2387 ; X32-SSE41:       # BB#0: # %entry
2388 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2389 ; X32-SSE41-NEXT:    movzwl (%eax), %eax
2390 ; X32-SSE41-NEXT:    movl %eax, %ecx
2391 ; X32-SSE41-NEXT:    shrl %ecx
2392 ; X32-SSE41-NEXT:    andl $1, %ecx
2393 ; X32-SSE41-NEXT:    movl %eax, %edx
2394 ; X32-SSE41-NEXT:    andl $1, %edx
2395 ; X32-SSE41-NEXT:    movd %edx, %xmm1
2396 ; X32-SSE41-NEXT:    pinsrb $1, %ecx, %xmm1
2397 ; X32-SSE41-NEXT:    movl %eax, %ecx
2398 ; X32-SSE41-NEXT:    shrl $2, %ecx
2399 ; X32-SSE41-NEXT:    andl $1, %ecx
2400 ; X32-SSE41-NEXT:    pinsrb $2, %ecx, %xmm1
2401 ; X32-SSE41-NEXT:    movl %eax, %ecx
2402 ; X32-SSE41-NEXT:    shrl $3, %ecx
2403 ; X32-SSE41-NEXT:    andl $1, %ecx
2404 ; X32-SSE41-NEXT:    pinsrb $3, %ecx, %xmm1
2405 ; X32-SSE41-NEXT:    movl %eax, %ecx
2406 ; X32-SSE41-NEXT:    shrl $4, %ecx
2407 ; X32-SSE41-NEXT:    andl $1, %ecx
2408 ; X32-SSE41-NEXT:    pinsrb $4, %ecx, %xmm1
2409 ; X32-SSE41-NEXT:    movl %eax, %ecx
2410 ; X32-SSE41-NEXT:    shrl $5, %ecx
2411 ; X32-SSE41-NEXT:    andl $1, %ecx
2412 ; X32-SSE41-NEXT:    pinsrb $5, %ecx, %xmm1
2413 ; X32-SSE41-NEXT:    movl %eax, %ecx
2414 ; X32-SSE41-NEXT:    shrl $6, %ecx
2415 ; X32-SSE41-NEXT:    andl $1, %ecx
2416 ; X32-SSE41-NEXT:    pinsrb $6, %ecx, %xmm1
2417 ; X32-SSE41-NEXT:    movl %eax, %ecx
2418 ; X32-SSE41-NEXT:    shrl $7, %ecx
2419 ; X32-SSE41-NEXT:    andl $1, %ecx
2420 ; X32-SSE41-NEXT:    pinsrb $7, %ecx, %xmm1
2421 ; X32-SSE41-NEXT:    movl %eax, %ecx
2422 ; X32-SSE41-NEXT:    shrl $8, %ecx
2423 ; X32-SSE41-NEXT:    andl $1, %ecx
2424 ; X32-SSE41-NEXT:    pinsrb $8, %ecx, %xmm1
2425 ; X32-SSE41-NEXT:    movl %eax, %ecx
2426 ; X32-SSE41-NEXT:    shrl $9, %ecx
2427 ; X32-SSE41-NEXT:    andl $1, %ecx
2428 ; X32-SSE41-NEXT:    pinsrb $9, %ecx, %xmm1
2429 ; X32-SSE41-NEXT:    movl %eax, %ecx
2430 ; X32-SSE41-NEXT:    shrl $10, %ecx
2431 ; X32-SSE41-NEXT:    andl $1, %ecx
2432 ; X32-SSE41-NEXT:    pinsrb $10, %ecx, %xmm1
2433 ; X32-SSE41-NEXT:    movl %eax, %ecx
2434 ; X32-SSE41-NEXT:    shrl $11, %ecx
2435 ; X32-SSE41-NEXT:    andl $1, %ecx
2436 ; X32-SSE41-NEXT:    pinsrb $11, %ecx, %xmm1
2437 ; X32-SSE41-NEXT:    movl %eax, %ecx
2438 ; X32-SSE41-NEXT:    shrl $12, %ecx
2439 ; X32-SSE41-NEXT:    andl $1, %ecx
2440 ; X32-SSE41-NEXT:    pinsrb $12, %ecx, %xmm1
2441 ; X32-SSE41-NEXT:    movl %eax, %ecx
2442 ; X32-SSE41-NEXT:    shrl $13, %ecx
2443 ; X32-SSE41-NEXT:    andl $1, %ecx
2444 ; X32-SSE41-NEXT:    pinsrb $13, %ecx, %xmm1
2445 ; X32-SSE41-NEXT:    movl %eax, %ecx
2446 ; X32-SSE41-NEXT:    shrl $14, %ecx
2447 ; X32-SSE41-NEXT:    andl $1, %ecx
2448 ; X32-SSE41-NEXT:    pinsrb $14, %ecx, %xmm1
2449 ; X32-SSE41-NEXT:    shrl $15, %eax
2450 ; X32-SSE41-NEXT:    pinsrb $15, %eax, %xmm1
2451 ; 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
2452 ; X32-SSE41-NEXT:    psllw $15, %xmm0
2453 ; X32-SSE41-NEXT:    psraw $15, %xmm0
2454 ; X32-SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2455 ; X32-SSE41-NEXT:    psllw $15, %xmm1
2456 ; X32-SSE41-NEXT:    psraw $15, %xmm1
2457 ; X32-SSE41-NEXT:    retl
2458 entry:
2459  %X = load <16 x i1>, <16 x i1>* %ptr
2460  %Y = sext <16 x i1> %X to <16 x i16>
2461  ret <16 x i16> %Y
2462 }
2463
2464 define <32 x i8> @load_sext_32i1_to_32i8(<32 x i1> *%ptr) {
2465 ; SSE2-LABEL: load_sext_32i1_to_32i8:
2466 ; SSE2:       # BB#0: # %entry
2467 ; SSE2-NEXT:    movzwl (%rdi), %eax
2468 ; SSE2-NEXT:    movq %rax, %rcx
2469 ; SSE2-NEXT:    shlq $48, %rcx
2470 ; SSE2-NEXT:    sarq $63, %rcx
2471 ; SSE2-NEXT:    movd %ecx, %xmm0
2472 ; SSE2-NEXT:    movq %rax, %rcx
2473 ; SSE2-NEXT:    shlq $56, %rcx
2474 ; SSE2-NEXT:    sarq $63, %rcx
2475 ; SSE2-NEXT:    movd %ecx, %xmm1
2476 ; 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]
2477 ; SSE2-NEXT:    movq %rax, %rcx
2478 ; SSE2-NEXT:    shlq $52, %rcx
2479 ; SSE2-NEXT:    sarq $63, %rcx
2480 ; SSE2-NEXT:    movd %ecx, %xmm2
2481 ; SSE2-NEXT:    movq %rax, %rcx
2482 ; SSE2-NEXT:    shlq $60, %rcx
2483 ; SSE2-NEXT:    sarq $63, %rcx
2484 ; SSE2-NEXT:    movd %ecx, %xmm0
2485 ; 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]
2486 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2487 ; SSE2-NEXT:    movq %rax, %rcx
2488 ; SSE2-NEXT:    shlq $50, %rcx
2489 ; SSE2-NEXT:    sarq $63, %rcx
2490 ; SSE2-NEXT:    movd %ecx, %xmm1
2491 ; SSE2-NEXT:    movq %rax, %rcx
2492 ; SSE2-NEXT:    shlq $58, %rcx
2493 ; SSE2-NEXT:    sarq $63, %rcx
2494 ; SSE2-NEXT:    movd %ecx, %xmm2
2495 ; 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]
2496 ; SSE2-NEXT:    movq %rax, %rcx
2497 ; SSE2-NEXT:    shlq $54, %rcx
2498 ; SSE2-NEXT:    sarq $63, %rcx
2499 ; SSE2-NEXT:    movd %ecx, %xmm3
2500 ; SSE2-NEXT:    movq %rax, %rcx
2501 ; SSE2-NEXT:    shlq $62, %rcx
2502 ; SSE2-NEXT:    sarq $63, %rcx
2503 ; SSE2-NEXT:    movd %ecx, %xmm1
2504 ; 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]
2505 ; 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]
2506 ; 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]
2507 ; SSE2-NEXT:    movq %rax, %rcx
2508 ; SSE2-NEXT:    shlq $49, %rcx
2509 ; SSE2-NEXT:    sarq $63, %rcx
2510 ; SSE2-NEXT:    movd %ecx, %xmm0
2511 ; SSE2-NEXT:    movq %rax, %rcx
2512 ; SSE2-NEXT:    shlq $57, %rcx
2513 ; SSE2-NEXT:    sarq $63, %rcx
2514 ; SSE2-NEXT:    movd %ecx, %xmm3
2515 ; 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]
2516 ; SSE2-NEXT:    movq %rax, %rcx
2517 ; SSE2-NEXT:    shlq $53, %rcx
2518 ; SSE2-NEXT:    sarq $63, %rcx
2519 ; SSE2-NEXT:    movd %ecx, %xmm0
2520 ; SSE2-NEXT:    movq %rax, %rcx
2521 ; SSE2-NEXT:    shlq $61, %rcx
2522 ; SSE2-NEXT:    sarq $63, %rcx
2523 ; SSE2-NEXT:    movd %ecx, %xmm2
2524 ; 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]
2525 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
2526 ; SSE2-NEXT:    movq %rax, %rcx
2527 ; SSE2-NEXT:    shlq $51, %rcx
2528 ; SSE2-NEXT:    sarq $63, %rcx
2529 ; SSE2-NEXT:    movd %ecx, %xmm0
2530 ; SSE2-NEXT:    movq %rax, %rcx
2531 ; SSE2-NEXT:    shlq $59, %rcx
2532 ; SSE2-NEXT:    sarq $63, %rcx
2533 ; SSE2-NEXT:    movd %ecx, %xmm3
2534 ; 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]
2535 ; SSE2-NEXT:    movq %rax, %rcx
2536 ; SSE2-NEXT:    shlq $55, %rcx
2537 ; SSE2-NEXT:    sarq $63, %rcx
2538 ; SSE2-NEXT:    movd %ecx, %xmm4
2539 ; SSE2-NEXT:    shlq $63, %rax
2540 ; SSE2-NEXT:    sarq $63, %rax
2541 ; SSE2-NEXT:    movd %eax, %xmm0
2542 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
2543 ; 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]
2544 ; 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]
2545 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2546 ; SSE2-NEXT:    movzwl 2(%rdi), %eax
2547 ; SSE2-NEXT:    movq %rax, %rcx
2548 ; SSE2-NEXT:    shlq $48, %rcx
2549 ; SSE2-NEXT:    sarq $63, %rcx
2550 ; SSE2-NEXT:    movd %ecx, %xmm1
2551 ; SSE2-NEXT:    movq %rax, %rcx
2552 ; SSE2-NEXT:    shlq $56, %rcx
2553 ; SSE2-NEXT:    sarq $63, %rcx
2554 ; SSE2-NEXT:    movd %ecx, %xmm2
2555 ; 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]
2556 ; SSE2-NEXT:    movq %rax, %rcx
2557 ; SSE2-NEXT:    shlq $52, %rcx
2558 ; SSE2-NEXT:    sarq $63, %rcx
2559 ; SSE2-NEXT:    movd %ecx, %xmm3
2560 ; SSE2-NEXT:    movq %rax, %rcx
2561 ; SSE2-NEXT:    shlq $60, %rcx
2562 ; SSE2-NEXT:    sarq $63, %rcx
2563 ; SSE2-NEXT:    movd %ecx, %xmm1
2564 ; 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]
2565 ; 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]
2566 ; SSE2-NEXT:    movq %rax, %rcx
2567 ; SSE2-NEXT:    shlq $50, %rcx
2568 ; SSE2-NEXT:    sarq $63, %rcx
2569 ; SSE2-NEXT:    movd %ecx, %xmm2
2570 ; SSE2-NEXT:    movq %rax, %rcx
2571 ; SSE2-NEXT:    shlq $58, %rcx
2572 ; SSE2-NEXT:    sarq $63, %rcx
2573 ; SSE2-NEXT:    movd %ecx, %xmm3
2574 ; 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]
2575 ; SSE2-NEXT:    movq %rax, %rcx
2576 ; SSE2-NEXT:    shlq $54, %rcx
2577 ; SSE2-NEXT:    sarq $63, %rcx
2578 ; SSE2-NEXT:    movd %ecx, %xmm4
2579 ; SSE2-NEXT:    movq %rax, %rcx
2580 ; SSE2-NEXT:    shlq $62, %rcx
2581 ; SSE2-NEXT:    sarq $63, %rcx
2582 ; SSE2-NEXT:    movd %ecx, %xmm2
2583 ; 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]
2584 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
2585 ; 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]
2586 ; SSE2-NEXT:    movq %rax, %rcx
2587 ; SSE2-NEXT:    shlq $49, %rcx
2588 ; SSE2-NEXT:    sarq $63, %rcx
2589 ; SSE2-NEXT:    movd %ecx, %xmm1
2590 ; SSE2-NEXT:    movq %rax, %rcx
2591 ; SSE2-NEXT:    shlq $57, %rcx
2592 ; SSE2-NEXT:    sarq $63, %rcx
2593 ; SSE2-NEXT:    movd %ecx, %xmm4
2594 ; 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]
2595 ; SSE2-NEXT:    movq %rax, %rcx
2596 ; SSE2-NEXT:    shlq $53, %rcx
2597 ; SSE2-NEXT:    sarq $63, %rcx
2598 ; SSE2-NEXT:    movd %ecx, %xmm1
2599 ; SSE2-NEXT:    movq %rax, %rcx
2600 ; SSE2-NEXT:    shlq $61, %rcx
2601 ; SSE2-NEXT:    sarq $63, %rcx
2602 ; SSE2-NEXT:    movd %ecx, %xmm3
2603 ; 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]
2604 ; 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]
2605 ; SSE2-NEXT:    movq %rax, %rcx
2606 ; SSE2-NEXT:    shlq $51, %rcx
2607 ; SSE2-NEXT:    sarq $63, %rcx
2608 ; SSE2-NEXT:    movd %ecx, %xmm1
2609 ; SSE2-NEXT:    movq %rax, %rcx
2610 ; SSE2-NEXT:    shlq $59, %rcx
2611 ; SSE2-NEXT:    sarq $63, %rcx
2612 ; SSE2-NEXT:    movd %ecx, %xmm4
2613 ; 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]
2614 ; SSE2-NEXT:    movq %rax, %rcx
2615 ; SSE2-NEXT:    shlq $55, %rcx
2616 ; SSE2-NEXT:    sarq $63, %rcx
2617 ; SSE2-NEXT:    movd %ecx, %xmm5
2618 ; SSE2-NEXT:    shlq $63, %rax
2619 ; SSE2-NEXT:    sarq $63, %rax
2620 ; SSE2-NEXT:    movd %eax, %xmm1
2621 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm5[0],xmm1[1],xmm5[1],xmm1[2],xmm5[2],xmm1[3],xmm5[3],xmm1[4],xmm5[4],xmm1[5],xmm5[5],xmm1[6],xmm5[6],xmm1[7],xmm5[7]
2622 ; 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]
2623 ; 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]
2624 ; 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]
2625 ; SSE2-NEXT:    retq
2626 ;
2627 ; SSSE3-LABEL: load_sext_32i1_to_32i8:
2628 ; SSSE3:       # BB#0: # %entry
2629 ; SSSE3-NEXT:    movzwl (%rdi), %eax
2630 ; SSSE3-NEXT:    movq %rax, %rcx
2631 ; SSSE3-NEXT:    shlq $48, %rcx
2632 ; SSSE3-NEXT:    sarq $63, %rcx
2633 ; SSSE3-NEXT:    movd %ecx, %xmm0
2634 ; SSSE3-NEXT:    movq %rax, %rcx
2635 ; SSSE3-NEXT:    shlq $56, %rcx
2636 ; SSSE3-NEXT:    sarq $63, %rcx
2637 ; SSSE3-NEXT:    movd %ecx, %xmm1
2638 ; 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]
2639 ; SSSE3-NEXT:    movq %rax, %rcx
2640 ; SSSE3-NEXT:    shlq $52, %rcx
2641 ; SSSE3-NEXT:    sarq $63, %rcx
2642 ; SSSE3-NEXT:    movd %ecx, %xmm2
2643 ; SSSE3-NEXT:    movq %rax, %rcx
2644 ; SSSE3-NEXT:    shlq $60, %rcx
2645 ; SSSE3-NEXT:    sarq $63, %rcx
2646 ; SSSE3-NEXT:    movd %ecx, %xmm0
2647 ; 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]
2648 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2649 ; SSSE3-NEXT:    movq %rax, %rcx
2650 ; SSSE3-NEXT:    shlq $50, %rcx
2651 ; SSSE3-NEXT:    sarq $63, %rcx
2652 ; SSSE3-NEXT:    movd %ecx, %xmm1
2653 ; SSSE3-NEXT:    movq %rax, %rcx
2654 ; SSSE3-NEXT:    shlq $58, %rcx
2655 ; SSSE3-NEXT:    sarq $63, %rcx
2656 ; SSSE3-NEXT:    movd %ecx, %xmm2
2657 ; 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]
2658 ; SSSE3-NEXT:    movq %rax, %rcx
2659 ; SSSE3-NEXT:    shlq $54, %rcx
2660 ; SSSE3-NEXT:    sarq $63, %rcx
2661 ; SSSE3-NEXT:    movd %ecx, %xmm3
2662 ; SSSE3-NEXT:    movq %rax, %rcx
2663 ; SSSE3-NEXT:    shlq $62, %rcx
2664 ; SSSE3-NEXT:    sarq $63, %rcx
2665 ; SSSE3-NEXT:    movd %ecx, %xmm1
2666 ; 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]
2667 ; 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]
2668 ; 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]
2669 ; SSSE3-NEXT:    movq %rax, %rcx
2670 ; SSSE3-NEXT:    shlq $49, %rcx
2671 ; SSSE3-NEXT:    sarq $63, %rcx
2672 ; SSSE3-NEXT:    movd %ecx, %xmm0
2673 ; SSSE3-NEXT:    movq %rax, %rcx
2674 ; SSSE3-NEXT:    shlq $57, %rcx
2675 ; SSSE3-NEXT:    sarq $63, %rcx
2676 ; SSSE3-NEXT:    movd %ecx, %xmm3
2677 ; 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]
2678 ; SSSE3-NEXT:    movq %rax, %rcx
2679 ; SSSE3-NEXT:    shlq $53, %rcx
2680 ; SSSE3-NEXT:    sarq $63, %rcx
2681 ; SSSE3-NEXT:    movd %ecx, %xmm0
2682 ; SSSE3-NEXT:    movq %rax, %rcx
2683 ; SSSE3-NEXT:    shlq $61, %rcx
2684 ; SSSE3-NEXT:    sarq $63, %rcx
2685 ; SSSE3-NEXT:    movd %ecx, %xmm2
2686 ; 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]
2687 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
2688 ; SSSE3-NEXT:    movq %rax, %rcx
2689 ; SSSE3-NEXT:    shlq $51, %rcx
2690 ; SSSE3-NEXT:    sarq $63, %rcx
2691 ; SSSE3-NEXT:    movd %ecx, %xmm0
2692 ; SSSE3-NEXT:    movq %rax, %rcx
2693 ; SSSE3-NEXT:    shlq $59, %rcx
2694 ; SSSE3-NEXT:    sarq $63, %rcx
2695 ; SSSE3-NEXT:    movd %ecx, %xmm3
2696 ; 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]
2697 ; SSSE3-NEXT:    movq %rax, %rcx
2698 ; SSSE3-NEXT:    shlq $55, %rcx
2699 ; SSSE3-NEXT:    sarq $63, %rcx
2700 ; SSSE3-NEXT:    movd %ecx, %xmm4
2701 ; SSSE3-NEXT:    shlq $63, %rax
2702 ; SSSE3-NEXT:    sarq $63, %rax
2703 ; SSSE3-NEXT:    movd %eax, %xmm0
2704 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
2705 ; 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]
2706 ; 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]
2707 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2708 ; SSSE3-NEXT:    movzwl 2(%rdi), %eax
2709 ; SSSE3-NEXT:    movq %rax, %rcx
2710 ; SSSE3-NEXT:    shlq $48, %rcx
2711 ; SSSE3-NEXT:    sarq $63, %rcx
2712 ; SSSE3-NEXT:    movd %ecx, %xmm1
2713 ; SSSE3-NEXT:    movq %rax, %rcx
2714 ; SSSE3-NEXT:    shlq $56, %rcx
2715 ; SSSE3-NEXT:    sarq $63, %rcx
2716 ; SSSE3-NEXT:    movd %ecx, %xmm2
2717 ; 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]
2718 ; SSSE3-NEXT:    movq %rax, %rcx
2719 ; SSSE3-NEXT:    shlq $52, %rcx
2720 ; SSSE3-NEXT:    sarq $63, %rcx
2721 ; SSSE3-NEXT:    movd %ecx, %xmm3
2722 ; SSSE3-NEXT:    movq %rax, %rcx
2723 ; SSSE3-NEXT:    shlq $60, %rcx
2724 ; SSSE3-NEXT:    sarq $63, %rcx
2725 ; SSSE3-NEXT:    movd %ecx, %xmm1
2726 ; 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]
2727 ; 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]
2728 ; SSSE3-NEXT:    movq %rax, %rcx
2729 ; SSSE3-NEXT:    shlq $50, %rcx
2730 ; SSSE3-NEXT:    sarq $63, %rcx
2731 ; SSSE3-NEXT:    movd %ecx, %xmm2
2732 ; SSSE3-NEXT:    movq %rax, %rcx
2733 ; SSSE3-NEXT:    shlq $58, %rcx
2734 ; SSSE3-NEXT:    sarq $63, %rcx
2735 ; SSSE3-NEXT:    movd %ecx, %xmm3
2736 ; 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]
2737 ; SSSE3-NEXT:    movq %rax, %rcx
2738 ; SSSE3-NEXT:    shlq $54, %rcx
2739 ; SSSE3-NEXT:    sarq $63, %rcx
2740 ; SSSE3-NEXT:    movd %ecx, %xmm4
2741 ; SSSE3-NEXT:    movq %rax, %rcx
2742 ; SSSE3-NEXT:    shlq $62, %rcx
2743 ; SSSE3-NEXT:    sarq $63, %rcx
2744 ; SSSE3-NEXT:    movd %ecx, %xmm2
2745 ; 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]
2746 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
2747 ; 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]
2748 ; SSSE3-NEXT:    movq %rax, %rcx
2749 ; SSSE3-NEXT:    shlq $49, %rcx
2750 ; SSSE3-NEXT:    sarq $63, %rcx
2751 ; SSSE3-NEXT:    movd %ecx, %xmm1
2752 ; SSSE3-NEXT:    movq %rax, %rcx
2753 ; SSSE3-NEXT:    shlq $57, %rcx
2754 ; SSSE3-NEXT:    sarq $63, %rcx
2755 ; SSSE3-NEXT:    movd %ecx, %xmm4
2756 ; 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]
2757 ; SSSE3-NEXT:    movq %rax, %rcx
2758 ; SSSE3-NEXT:    shlq $53, %rcx
2759 ; SSSE3-NEXT:    sarq $63, %rcx
2760 ; SSSE3-NEXT:    movd %ecx, %xmm1
2761 ; SSSE3-NEXT:    movq %rax, %rcx
2762 ; SSSE3-NEXT:    shlq $61, %rcx
2763 ; SSSE3-NEXT:    sarq $63, %rcx
2764 ; SSSE3-NEXT:    movd %ecx, %xmm3
2765 ; 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]
2766 ; 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]
2767 ; SSSE3-NEXT:    movq %rax, %rcx
2768 ; SSSE3-NEXT:    shlq $51, %rcx
2769 ; SSSE3-NEXT:    sarq $63, %rcx
2770 ; SSSE3-NEXT:    movd %ecx, %xmm1
2771 ; SSSE3-NEXT:    movq %rax, %rcx
2772 ; SSSE3-NEXT:    shlq $59, %rcx
2773 ; SSSE3-NEXT:    sarq $63, %rcx
2774 ; SSSE3-NEXT:    movd %ecx, %xmm4
2775 ; 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]
2776 ; SSSE3-NEXT:    movq %rax, %rcx
2777 ; SSSE3-NEXT:    shlq $55, %rcx
2778 ; SSSE3-NEXT:    sarq $63, %rcx
2779 ; SSSE3-NEXT:    movd %ecx, %xmm5
2780 ; SSSE3-NEXT:    shlq $63, %rax
2781 ; SSSE3-NEXT:    sarq $63, %rax
2782 ; SSSE3-NEXT:    movd %eax, %xmm1
2783 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm5[0],xmm1[1],xmm5[1],xmm1[2],xmm5[2],xmm1[3],xmm5[3],xmm1[4],xmm5[4],xmm1[5],xmm5[5],xmm1[6],xmm5[6],xmm1[7],xmm5[7]
2784 ; 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]
2785 ; 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]
2786 ; 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]
2787 ; SSSE3-NEXT:    retq
2788 ;
2789 ; SSE41-LABEL: load_sext_32i1_to_32i8:
2790 ; SSE41:       # BB#0: # %entry
2791 ; SSE41-NEXT:    movzwl (%rdi), %eax
2792 ; SSE41-NEXT:    movq %rax, %rcx
2793 ; SSE41-NEXT:    shlq $62, %rcx
2794 ; SSE41-NEXT:    sarq $63, %rcx
2795 ; SSE41-NEXT:    movq %rax, %rdx
2796 ; SSE41-NEXT:    shlq $63, %rdx
2797 ; SSE41-NEXT:    sarq $63, %rdx
2798 ; SSE41-NEXT:    movd %edx, %xmm0
2799 ; SSE41-NEXT:    pinsrb $1, %ecx, %xmm0
2800 ; SSE41-NEXT:    movq %rax, %rcx
2801 ; SSE41-NEXT:    shlq $61, %rcx
2802 ; SSE41-NEXT:    sarq $63, %rcx
2803 ; SSE41-NEXT:    pinsrb $2, %ecx, %xmm0
2804 ; SSE41-NEXT:    movq %rax, %rcx
2805 ; SSE41-NEXT:    shlq $60, %rcx
2806 ; SSE41-NEXT:    sarq $63, %rcx
2807 ; SSE41-NEXT:    pinsrb $3, %ecx, %xmm0
2808 ; SSE41-NEXT:    movq %rax, %rcx
2809 ; SSE41-NEXT:    shlq $59, %rcx
2810 ; SSE41-NEXT:    sarq $63, %rcx
2811 ; SSE41-NEXT:    pinsrb $4, %ecx, %xmm0
2812 ; SSE41-NEXT:    movq %rax, %rcx
2813 ; SSE41-NEXT:    shlq $58, %rcx
2814 ; SSE41-NEXT:    sarq $63, %rcx
2815 ; SSE41-NEXT:    pinsrb $5, %ecx, %xmm0
2816 ; SSE41-NEXT:    movq %rax, %rcx
2817 ; SSE41-NEXT:    shlq $57, %rcx
2818 ; SSE41-NEXT:    sarq $63, %rcx
2819 ; SSE41-NEXT:    pinsrb $6, %ecx, %xmm0
2820 ; SSE41-NEXT:    movq %rax, %rcx
2821 ; SSE41-NEXT:    shlq $56, %rcx
2822 ; SSE41-NEXT:    sarq $63, %rcx
2823 ; SSE41-NEXT:    pinsrb $7, %ecx, %xmm0
2824 ; SSE41-NEXT:    movq %rax, %rcx
2825 ; SSE41-NEXT:    shlq $55, %rcx
2826 ; SSE41-NEXT:    sarq $63, %rcx
2827 ; SSE41-NEXT:    pinsrb $8, %ecx, %xmm0
2828 ; SSE41-NEXT:    movq %rax, %rcx
2829 ; SSE41-NEXT:    shlq $54, %rcx
2830 ; SSE41-NEXT:    sarq $63, %rcx
2831 ; SSE41-NEXT:    pinsrb $9, %ecx, %xmm0
2832 ; SSE41-NEXT:    movq %rax, %rcx
2833 ; SSE41-NEXT:    shlq $53, %rcx
2834 ; SSE41-NEXT:    sarq $63, %rcx
2835 ; SSE41-NEXT:    pinsrb $10, %ecx, %xmm0
2836 ; SSE41-NEXT:    movq %rax, %rcx
2837 ; SSE41-NEXT:    shlq $52, %rcx
2838 ; SSE41-NEXT:    sarq $63, %rcx
2839 ; SSE41-NEXT:    pinsrb $11, %ecx, %xmm0
2840 ; SSE41-NEXT:    movq %rax, %rcx
2841 ; SSE41-NEXT:    shlq $51, %rcx
2842 ; SSE41-NEXT:    sarq $63, %rcx
2843 ; SSE41-NEXT:    pinsrb $12, %ecx, %xmm0
2844 ; SSE41-NEXT:    movq %rax, %rcx
2845 ; SSE41-NEXT:    shlq $50, %rcx
2846 ; SSE41-NEXT:    sarq $63, %rcx
2847 ; SSE41-NEXT:    pinsrb $13, %ecx, %xmm0
2848 ; SSE41-NEXT:    movq %rax, %rcx
2849 ; SSE41-NEXT:    shlq $49, %rcx
2850 ; SSE41-NEXT:    sarq $63, %rcx
2851 ; SSE41-NEXT:    pinsrb $14, %ecx, %xmm0
2852 ; SSE41-NEXT:    shlq $48, %rax
2853 ; SSE41-NEXT:    sarq $63, %rax
2854 ; SSE41-NEXT:    pinsrb $15, %eax, %xmm0
2855 ; SSE41-NEXT:    movzwl 2(%rdi), %eax
2856 ; SSE41-NEXT:    movq %rax, %rcx
2857 ; SSE41-NEXT:    shlq $62, %rcx
2858 ; SSE41-NEXT:    sarq $63, %rcx
2859 ; SSE41-NEXT:    movq %rax, %rdx
2860 ; SSE41-NEXT:    shlq $63, %rdx
2861 ; SSE41-NEXT:    sarq $63, %rdx
2862 ; SSE41-NEXT:    movd %edx, %xmm1
2863 ; SSE41-NEXT:    pinsrb $1, %ecx, %xmm1
2864 ; SSE41-NEXT:    movq %rax, %rcx
2865 ; SSE41-NEXT:    shlq $61, %rcx
2866 ; SSE41-NEXT:    sarq $63, %rcx
2867 ; SSE41-NEXT:    pinsrb $2, %ecx, %xmm1
2868 ; SSE41-NEXT:    movq %rax, %rcx
2869 ; SSE41-NEXT:    shlq $60, %rcx
2870 ; SSE41-NEXT:    sarq $63, %rcx
2871 ; SSE41-NEXT:    pinsrb $3, %ecx, %xmm1
2872 ; SSE41-NEXT:    movq %rax, %rcx
2873 ; SSE41-NEXT:    shlq $59, %rcx
2874 ; SSE41-NEXT:    sarq $63, %rcx
2875 ; SSE41-NEXT:    pinsrb $4, %ecx, %xmm1
2876 ; SSE41-NEXT:    movq %rax, %rcx
2877 ; SSE41-NEXT:    shlq $58, %rcx
2878 ; SSE41-NEXT:    sarq $63, %rcx
2879 ; SSE41-NEXT:    pinsrb $5, %ecx, %xmm1
2880 ; SSE41-NEXT:    movq %rax, %rcx
2881 ; SSE41-NEXT:    shlq $57, %rcx
2882 ; SSE41-NEXT:    sarq $63, %rcx
2883 ; SSE41-NEXT:    pinsrb $6, %ecx, %xmm1
2884 ; SSE41-NEXT:    movq %rax, %rcx
2885 ; SSE41-NEXT:    shlq $56, %rcx
2886 ; SSE41-NEXT:    sarq $63, %rcx
2887 ; SSE41-NEXT:    pinsrb $7, %ecx, %xmm1
2888 ; SSE41-NEXT:    movq %rax, %rcx
2889 ; SSE41-NEXT:    shlq $55, %rcx
2890 ; SSE41-NEXT:    sarq $63, %rcx
2891 ; SSE41-NEXT:    pinsrb $8, %ecx, %xmm1
2892 ; SSE41-NEXT:    movq %rax, %rcx
2893 ; SSE41-NEXT:    shlq $54, %rcx
2894 ; SSE41-NEXT:    sarq $63, %rcx
2895 ; SSE41-NEXT:    pinsrb $9, %ecx, %xmm1
2896 ; SSE41-NEXT:    movq %rax, %rcx
2897 ; SSE41-NEXT:    shlq $53, %rcx
2898 ; SSE41-NEXT:    sarq $63, %rcx
2899 ; SSE41-NEXT:    pinsrb $10, %ecx, %xmm1
2900 ; SSE41-NEXT:    movq %rax, %rcx
2901 ; SSE41-NEXT:    shlq $52, %rcx
2902 ; SSE41-NEXT:    sarq $63, %rcx
2903 ; SSE41-NEXT:    pinsrb $11, %ecx, %xmm1
2904 ; SSE41-NEXT:    movq %rax, %rcx
2905 ; SSE41-NEXT:    shlq $51, %rcx
2906 ; SSE41-NEXT:    sarq $63, %rcx
2907 ; SSE41-NEXT:    pinsrb $12, %ecx, %xmm1
2908 ; SSE41-NEXT:    movq %rax, %rcx
2909 ; SSE41-NEXT:    shlq $50, %rcx
2910 ; SSE41-NEXT:    sarq $63, %rcx
2911 ; SSE41-NEXT:    pinsrb $13, %ecx, %xmm1
2912 ; SSE41-NEXT:    movq %rax, %rcx
2913 ; SSE41-NEXT:    shlq $49, %rcx
2914 ; SSE41-NEXT:    sarq $63, %rcx
2915 ; SSE41-NEXT:    pinsrb $14, %ecx, %xmm1
2916 ; SSE41-NEXT:    shlq $48, %rax
2917 ; SSE41-NEXT:    sarq $63, %rax
2918 ; SSE41-NEXT:    pinsrb $15, %eax, %xmm1
2919 ; SSE41-NEXT:    retq
2920 ;
2921 ; AVX1-LABEL: load_sext_32i1_to_32i8:
2922 ; AVX1:       # BB#0: # %entry
2923 ; AVX1-NEXT:    movl (%rdi), %eax
2924 ; AVX1-NEXT:    movq %rax, %rcx
2925 ; AVX1-NEXT:    shlq $46, %rcx
2926 ; AVX1-NEXT:    sarq $63, %rcx
2927 ; AVX1-NEXT:    movq %rax, %rdx
2928 ; AVX1-NEXT:    shlq $47, %rdx
2929 ; AVX1-NEXT:    sarq $63, %rdx
2930 ; AVX1-NEXT:    vmovd %edx, %xmm0
2931 ; AVX1-NEXT:    vpinsrb $1, %ecx, %xmm0, %xmm0
2932 ; AVX1-NEXT:    movq %rax, %rcx
2933 ; AVX1-NEXT:    shlq $45, %rcx
2934 ; AVX1-NEXT:    sarq $63, %rcx
2935 ; AVX1-NEXT:    vpinsrb $2, %ecx, %xmm0, %xmm0
2936 ; AVX1-NEXT:    movq %rax, %rcx
2937 ; AVX1-NEXT:    shlq $44, %rcx
2938 ; AVX1-NEXT:    sarq $63, %rcx
2939 ; AVX1-NEXT:    vpinsrb $3, %ecx, %xmm0, %xmm0
2940 ; AVX1-NEXT:    movq %rax, %rcx
2941 ; AVX1-NEXT:    shlq $43, %rcx
2942 ; AVX1-NEXT:    sarq $63, %rcx
2943 ; AVX1-NEXT:    vpinsrb $4, %ecx, %xmm0, %xmm0
2944 ; AVX1-NEXT:    movq %rax, %rcx
2945 ; AVX1-NEXT:    shlq $42, %rcx
2946 ; AVX1-NEXT:    sarq $63, %rcx
2947 ; AVX1-NEXT:    vpinsrb $5, %ecx, %xmm0, %xmm0
2948 ; AVX1-NEXT:    movq %rax, %rcx
2949 ; AVX1-NEXT:    shlq $41, %rcx
2950 ; AVX1-NEXT:    sarq $63, %rcx
2951 ; AVX1-NEXT:    vpinsrb $6, %ecx, %xmm0, %xmm0
2952 ; AVX1-NEXT:    movq %rax, %rcx
2953 ; AVX1-NEXT:    shlq $40, %rcx
2954 ; AVX1-NEXT:    sarq $63, %rcx
2955 ; AVX1-NEXT:    vpinsrb $7, %ecx, %xmm0, %xmm0
2956 ; AVX1-NEXT:    movq %rax, %rcx
2957 ; AVX1-NEXT:    shlq $39, %rcx
2958 ; AVX1-NEXT:    sarq $63, %rcx
2959 ; AVX1-NEXT:    vpinsrb $8, %ecx, %xmm0, %xmm0
2960 ; AVX1-NEXT:    movq %rax, %rcx
2961 ; AVX1-NEXT:    shlq $38, %rcx
2962 ; AVX1-NEXT:    sarq $63, %rcx
2963 ; AVX1-NEXT:    vpinsrb $9, %ecx, %xmm0, %xmm0
2964 ; AVX1-NEXT:    movq %rax, %rcx
2965 ; AVX1-NEXT:    shlq $37, %rcx
2966 ; AVX1-NEXT:    sarq $63, %rcx
2967 ; AVX1-NEXT:    vpinsrb $10, %ecx, %xmm0, %xmm0
2968 ; AVX1-NEXT:    movq %rax, %rcx
2969 ; AVX1-NEXT:    shlq $36, %rcx
2970 ; AVX1-NEXT:    sarq $63, %rcx
2971 ; AVX1-NEXT:    vpinsrb $11, %ecx, %xmm0, %xmm0
2972 ; AVX1-NEXT:    movq %rax, %rcx
2973 ; AVX1-NEXT:    shlq $35, %rcx
2974 ; AVX1-NEXT:    sarq $63, %rcx
2975 ; AVX1-NEXT:    vpinsrb $12, %ecx, %xmm0, %xmm0
2976 ; AVX1-NEXT:    movq %rax, %rcx
2977 ; AVX1-NEXT:    shlq $34, %rcx
2978 ; AVX1-NEXT:    sarq $63, %rcx
2979 ; AVX1-NEXT:    vpinsrb $13, %ecx, %xmm0, %xmm0
2980 ; AVX1-NEXT:    movq %rax, %rcx
2981 ; AVX1-NEXT:    shlq $33, %rcx
2982 ; AVX1-NEXT:    sarq $63, %rcx
2983 ; AVX1-NEXT:    vpinsrb $14, %ecx, %xmm0, %xmm0
2984 ; AVX1-NEXT:    movq %rax, %rcx
2985 ; AVX1-NEXT:    shlq $32, %rcx
2986 ; AVX1-NEXT:    sarq $63, %rcx
2987 ; AVX1-NEXT:    vpinsrb $15, %ecx, %xmm0, %xmm0
2988 ; AVX1-NEXT:    movq %rax, %rcx
2989 ; AVX1-NEXT:    shlq $62, %rcx
2990 ; AVX1-NEXT:    sarq $63, %rcx
2991 ; AVX1-NEXT:    movq %rax, %rdx
2992 ; AVX1-NEXT:    shlq $63, %rdx
2993 ; AVX1-NEXT:    sarq $63, %rdx
2994 ; AVX1-NEXT:    vmovd %edx, %xmm1
2995 ; AVX1-NEXT:    vpinsrb $1, %ecx, %xmm1, %xmm1
2996 ; AVX1-NEXT:    movq %rax, %rcx
2997 ; AVX1-NEXT:    shlq $61, %rcx
2998 ; AVX1-NEXT:    sarq $63, %rcx
2999 ; AVX1-NEXT:    vpinsrb $2, %ecx, %xmm1, %xmm1
3000 ; AVX1-NEXT:    movq %rax, %rcx
3001 ; AVX1-NEXT:    shlq $60, %rcx
3002 ; AVX1-NEXT:    sarq $63, %rcx
3003 ; AVX1-NEXT:    vpinsrb $3, %ecx, %xmm1, %xmm1
3004 ; AVX1-NEXT:    movq %rax, %rcx
3005 ; AVX1-NEXT:    shlq $59, %rcx
3006 ; AVX1-NEXT:    sarq $63, %rcx
3007 ; AVX1-NEXT:    vpinsrb $4, %ecx, %xmm1, %xmm1
3008 ; AVX1-NEXT:    movq %rax, %rcx
3009 ; AVX1-NEXT:    shlq $58, %rcx
3010 ; AVX1-NEXT:    sarq $63, %rcx
3011 ; AVX1-NEXT:    vpinsrb $5, %ecx, %xmm1, %xmm1
3012 ; AVX1-NEXT:    movq %rax, %rcx
3013 ; AVX1-NEXT:    shlq $57, %rcx
3014 ; AVX1-NEXT:    sarq $63, %rcx
3015 ; AVX1-NEXT:    vpinsrb $6, %ecx, %xmm1, %xmm1
3016 ; AVX1-NEXT:    movq %rax, %rcx
3017 ; AVX1-NEXT:    shlq $56, %rcx
3018 ; AVX1-NEXT:    sarq $63, %rcx
3019 ; AVX1-NEXT:    vpinsrb $7, %ecx, %xmm1, %xmm1
3020 ; AVX1-NEXT:    movq %rax, %rcx
3021 ; AVX1-NEXT:    shlq $55, %rcx
3022 ; AVX1-NEXT:    sarq $63, %rcx
3023 ; AVX1-NEXT:    vpinsrb $8, %ecx, %xmm1, %xmm1
3024 ; AVX1-NEXT:    movq %rax, %rcx
3025 ; AVX1-NEXT:    shlq $54, %rcx
3026 ; AVX1-NEXT:    sarq $63, %rcx
3027 ; AVX1-NEXT:    vpinsrb $9, %ecx, %xmm1, %xmm1
3028 ; AVX1-NEXT:    movq %rax, %rcx
3029 ; AVX1-NEXT:    shlq $53, %rcx
3030 ; AVX1-NEXT:    sarq $63, %rcx
3031 ; AVX1-NEXT:    vpinsrb $10, %ecx, %xmm1, %xmm1
3032 ; AVX1-NEXT:    movq %rax, %rcx
3033 ; AVX1-NEXT:    shlq $52, %rcx
3034 ; AVX1-NEXT:    sarq $63, %rcx
3035 ; AVX1-NEXT:    vpinsrb $11, %ecx, %xmm1, %xmm1
3036 ; AVX1-NEXT:    movq %rax, %rcx
3037 ; AVX1-NEXT:    shlq $51, %rcx
3038 ; AVX1-NEXT:    sarq $63, %rcx
3039 ; AVX1-NEXT:    vpinsrb $12, %ecx, %xmm1, %xmm1
3040 ; AVX1-NEXT:    movq %rax, %rcx
3041 ; AVX1-NEXT:    shlq $50, %rcx
3042 ; AVX1-NEXT:    sarq $63, %rcx
3043 ; AVX1-NEXT:    vpinsrb $13, %ecx, %xmm1, %xmm1
3044 ; AVX1-NEXT:    movq %rax, %rcx
3045 ; AVX1-NEXT:    shlq $49, %rcx
3046 ; AVX1-NEXT:    sarq $63, %rcx
3047 ; AVX1-NEXT:    vpinsrb $14, %ecx, %xmm1, %xmm1
3048 ; AVX1-NEXT:    shlq $48, %rax
3049 ; AVX1-NEXT:    sarq $63, %rax
3050 ; AVX1-NEXT:    vpinsrb $15, %eax, %xmm1, %xmm1
3051 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
3052 ; AVX1-NEXT:    retq
3053 ;
3054 ; AVX2-LABEL: load_sext_32i1_to_32i8:
3055 ; AVX2:       # BB#0: # %entry
3056 ; AVX2-NEXT:    movl (%rdi), %eax
3057 ; AVX2-NEXT:    movq %rax, %rcx
3058 ; AVX2-NEXT:    shlq $46, %rcx
3059 ; AVX2-NEXT:    sarq $63, %rcx
3060 ; AVX2-NEXT:    movq %rax, %rdx
3061 ; AVX2-NEXT:    shlq $47, %rdx
3062 ; AVX2-NEXT:    sarq $63, %rdx
3063 ; AVX2-NEXT:    vmovd %edx, %xmm0
3064 ; AVX2-NEXT:    vpinsrb $1, %ecx, %xmm0, %xmm0
3065 ; AVX2-NEXT:    movq %rax, %rcx
3066 ; AVX2-NEXT:    shlq $45, %rcx
3067 ; AVX2-NEXT:    sarq $63, %rcx
3068 ; AVX2-NEXT:    vpinsrb $2, %ecx, %xmm0, %xmm0
3069 ; AVX2-NEXT:    movq %rax, %rcx
3070 ; AVX2-NEXT:    shlq $44, %rcx
3071 ; AVX2-NEXT:    sarq $63, %rcx
3072 ; AVX2-NEXT:    vpinsrb $3, %ecx, %xmm0, %xmm0
3073 ; AVX2-NEXT:    movq %rax, %rcx
3074 ; AVX2-NEXT:    shlq $43, %rcx
3075 ; AVX2-NEXT:    sarq $63, %rcx
3076 ; AVX2-NEXT:    vpinsrb $4, %ecx, %xmm0, %xmm0
3077 ; AVX2-NEXT:    movq %rax, %rcx
3078 ; AVX2-NEXT:    shlq $42, %rcx
3079 ; AVX2-NEXT:    sarq $63, %rcx
3080 ; AVX2-NEXT:    vpinsrb $5, %ecx, %xmm0, %xmm0
3081 ; AVX2-NEXT:    movq %rax, %rcx
3082 ; AVX2-NEXT:    shlq $41, %rcx
3083 ; AVX2-NEXT:    sarq $63, %rcx
3084 ; AVX2-NEXT:    vpinsrb $6, %ecx, %xmm0, %xmm0
3085 ; AVX2-NEXT:    movq %rax, %rcx
3086 ; AVX2-NEXT:    shlq $40, %rcx
3087 ; AVX2-NEXT:    sarq $63, %rcx
3088 ; AVX2-NEXT:    vpinsrb $7, %ecx, %xmm0, %xmm0
3089 ; AVX2-NEXT:    movq %rax, %rcx
3090 ; AVX2-NEXT:    shlq $39, %rcx
3091 ; AVX2-NEXT:    sarq $63, %rcx
3092 ; AVX2-NEXT:    vpinsrb $8, %ecx, %xmm0, %xmm0
3093 ; AVX2-NEXT:    movq %rax, %rcx
3094 ; AVX2-NEXT:    shlq $38, %rcx
3095 ; AVX2-NEXT:    sarq $63, %rcx
3096 ; AVX2-NEXT:    vpinsrb $9, %ecx, %xmm0, %xmm0
3097 ; AVX2-NEXT:    movq %rax, %rcx
3098 ; AVX2-NEXT:    shlq $37, %rcx
3099 ; AVX2-NEXT:    sarq $63, %rcx
3100 ; AVX2-NEXT:    vpinsrb $10, %ecx, %xmm0, %xmm0
3101 ; AVX2-NEXT:    movq %rax, %rcx
3102 ; AVX2-NEXT:    shlq $36, %rcx
3103 ; AVX2-NEXT:    sarq $63, %rcx
3104 ; AVX2-NEXT:    vpinsrb $11, %ecx, %xmm0, %xmm0
3105 ; AVX2-NEXT:    movq %rax, %rcx
3106 ; AVX2-NEXT:    shlq $35, %rcx
3107 ; AVX2-NEXT:    sarq $63, %rcx
3108 ; AVX2-NEXT:    vpinsrb $12, %ecx, %xmm0, %xmm0
3109 ; AVX2-NEXT:    movq %rax, %rcx
3110 ; AVX2-NEXT:    shlq $34, %rcx
3111 ; AVX2-NEXT:    sarq $63, %rcx
3112 ; AVX2-NEXT:    vpinsrb $13, %ecx, %xmm0, %xmm0
3113 ; AVX2-NEXT:    movq %rax, %rcx
3114 ; AVX2-NEXT:    shlq $33, %rcx
3115 ; AVX2-NEXT:    sarq $63, %rcx
3116 ; AVX2-NEXT:    vpinsrb $14, %ecx, %xmm0, %xmm0
3117 ; AVX2-NEXT:    movq %rax, %rcx
3118 ; AVX2-NEXT:    shlq $32, %rcx
3119 ; AVX2-NEXT:    sarq $63, %rcx
3120 ; AVX2-NEXT:    vpinsrb $15, %ecx, %xmm0, %xmm0
3121 ; AVX2-NEXT:    movq %rax, %rcx
3122 ; AVX2-NEXT:    shlq $62, %rcx
3123 ; AVX2-NEXT:    sarq $63, %rcx
3124 ; AVX2-NEXT:    movq %rax, %rdx
3125 ; AVX2-NEXT:    shlq $63, %rdx
3126 ; AVX2-NEXT:    sarq $63, %rdx
3127 ; AVX2-NEXT:    vmovd %edx, %xmm1
3128 ; AVX2-NEXT:    vpinsrb $1, %ecx, %xmm1, %xmm1
3129 ; AVX2-NEXT:    movq %rax, %rcx
3130 ; AVX2-NEXT:    shlq $61, %rcx
3131 ; AVX2-NEXT:    sarq $63, %rcx
3132 ; AVX2-NEXT:    vpinsrb $2, %ecx, %xmm1, %xmm1
3133 ; AVX2-NEXT:    movq %rax, %rcx
3134 ; AVX2-NEXT:    shlq $60, %rcx
3135 ; AVX2-NEXT:    sarq $63, %rcx
3136 ; AVX2-NEXT:    vpinsrb $3, %ecx, %xmm1, %xmm1
3137 ; AVX2-NEXT:    movq %rax, %rcx
3138 ; AVX2-NEXT:    shlq $59, %rcx
3139 ; AVX2-NEXT:    sarq $63, %rcx
3140 ; AVX2-NEXT:    vpinsrb $4, %ecx, %xmm1, %xmm1
3141 ; AVX2-NEXT:    movq %rax, %rcx
3142 ; AVX2-NEXT:    shlq $58, %rcx
3143 ; AVX2-NEXT:    sarq $63, %rcx
3144 ; AVX2-NEXT:    vpinsrb $5, %ecx, %xmm1, %xmm1
3145 ; AVX2-NEXT:    movq %rax, %rcx
3146 ; AVX2-NEXT:    shlq $57, %rcx
3147 ; AVX2-NEXT:    sarq $63, %rcx
3148 ; AVX2-NEXT:    vpinsrb $6, %ecx, %xmm1, %xmm1
3149 ; AVX2-NEXT:    movq %rax, %rcx
3150 ; AVX2-NEXT:    shlq $56, %rcx
3151 ; AVX2-NEXT:    sarq $63, %rcx
3152 ; AVX2-NEXT:    vpinsrb $7, %ecx, %xmm1, %xmm1
3153 ; AVX2-NEXT:    movq %rax, %rcx
3154 ; AVX2-NEXT:    shlq $55, %rcx
3155 ; AVX2-NEXT:    sarq $63, %rcx
3156 ; AVX2-NEXT:    vpinsrb $8, %ecx, %xmm1, %xmm1
3157 ; AVX2-NEXT:    movq %rax, %rcx
3158 ; AVX2-NEXT:    shlq $54, %rcx
3159 ; AVX2-NEXT:    sarq $63, %rcx
3160 ; AVX2-NEXT:    vpinsrb $9, %ecx, %xmm1, %xmm1
3161 ; AVX2-NEXT:    movq %rax, %rcx
3162 ; AVX2-NEXT:    shlq $53, %rcx
3163 ; AVX2-NEXT:    sarq $63, %rcx
3164 ; AVX2-NEXT:    vpinsrb $10, %ecx, %xmm1, %xmm1
3165 ; AVX2-NEXT:    movq %rax, %rcx
3166 ; AVX2-NEXT:    shlq $52, %rcx
3167 ; AVX2-NEXT:    sarq $63, %rcx
3168 ; AVX2-NEXT:    vpinsrb $11, %ecx, %xmm1, %xmm1
3169 ; AVX2-NEXT:    movq %rax, %rcx
3170 ; AVX2-NEXT:    shlq $51, %rcx
3171 ; AVX2-NEXT:    sarq $63, %rcx
3172 ; AVX2-NEXT:    vpinsrb $12, %ecx, %xmm1, %xmm1
3173 ; AVX2-NEXT:    movq %rax, %rcx
3174 ; AVX2-NEXT:    shlq $50, %rcx
3175 ; AVX2-NEXT:    sarq $63, %rcx
3176 ; AVX2-NEXT:    vpinsrb $13, %ecx, %xmm1, %xmm1
3177 ; AVX2-NEXT:    movq %rax, %rcx
3178 ; AVX2-NEXT:    shlq $49, %rcx
3179 ; AVX2-NEXT:    sarq $63, %rcx
3180 ; AVX2-NEXT:    vpinsrb $14, %ecx, %xmm1, %xmm1
3181 ; AVX2-NEXT:    shlq $48, %rax
3182 ; AVX2-NEXT:    sarq $63, %rax
3183 ; AVX2-NEXT:    vpinsrb $15, %eax, %xmm1, %xmm1
3184 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
3185 ; AVX2-NEXT:    retq
3186 ;
3187 ; X32-SSE41-LABEL: load_sext_32i1_to_32i8:
3188 ; X32-SSE41:       # BB#0: # %entry
3189 ; X32-SSE41-NEXT:    pushl %esi
3190 ; X32-SSE41-NEXT:  .Ltmp0:
3191 ; X32-SSE41-NEXT:    .cfi_def_cfa_offset 8
3192 ; X32-SSE41-NEXT:  .Ltmp1:
3193 ; X32-SSE41-NEXT:    .cfi_offset %esi, -8
3194 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3195 ; X32-SSE41-NEXT:    movl (%eax), %ecx
3196 ; X32-SSE41-NEXT:    movl %ecx, %edx
3197 ; X32-SSE41-NEXT:    shll $30, %edx
3198 ; X32-SSE41-NEXT:    sarl $31, %edx
3199 ; X32-SSE41-NEXT:    movl %ecx, %esi
3200 ; X32-SSE41-NEXT:    shll $31, %esi
3201 ; X32-SSE41-NEXT:    sarl $31, %esi
3202 ; X32-SSE41-NEXT:    movd %esi, %xmm0
3203 ; X32-SSE41-NEXT:    pinsrb $1, %edx, %xmm0
3204 ; X32-SSE41-NEXT:    movl %ecx, %edx
3205 ; X32-SSE41-NEXT:    shll $29, %edx
3206 ; X32-SSE41-NEXT:    sarl $31, %edx
3207 ; X32-SSE41-NEXT:    pinsrb $2, %edx, %xmm0
3208 ; X32-SSE41-NEXT:    movl %ecx, %edx
3209 ; X32-SSE41-NEXT:    shll $28, %edx
3210 ; X32-SSE41-NEXT:    sarl $31, %edx
3211 ; X32-SSE41-NEXT:    pinsrb $3, %edx, %xmm0
3212 ; X32-SSE41-NEXT:    movl %ecx, %edx
3213 ; X32-SSE41-NEXT:    shll $27, %edx
3214 ; X32-SSE41-NEXT:    sarl $31, %edx
3215 ; X32-SSE41-NEXT:    pinsrb $4, %edx, %xmm0
3216 ; X32-SSE41-NEXT:    movl %ecx, %edx
3217 ; X32-SSE41-NEXT:    shll $26, %edx
3218 ; X32-SSE41-NEXT:    sarl $31, %edx
3219 ; X32-SSE41-NEXT:    pinsrb $5, %edx, %xmm0
3220 ; X32-SSE41-NEXT:    movl %ecx, %edx
3221 ; X32-SSE41-NEXT:    shll $25, %edx
3222 ; X32-SSE41-NEXT:    sarl $31, %edx
3223 ; X32-SSE41-NEXT:    pinsrb $6, %edx, %xmm0
3224 ; X32-SSE41-NEXT:    movl %ecx, %edx
3225 ; X32-SSE41-NEXT:    shll $24, %edx
3226 ; X32-SSE41-NEXT:    sarl $31, %edx
3227 ; X32-SSE41-NEXT:    pinsrb $7, %edx, %xmm0
3228 ; X32-SSE41-NEXT:    movl %ecx, %edx
3229 ; X32-SSE41-NEXT:    shll $23, %edx
3230 ; X32-SSE41-NEXT:    sarl $31, %edx
3231 ; X32-SSE41-NEXT:    pinsrb $8, %edx, %xmm0
3232 ; X32-SSE41-NEXT:    movl %ecx, %edx
3233 ; X32-SSE41-NEXT:    shll $22, %edx
3234 ; X32-SSE41-NEXT:    sarl $31, %edx
3235 ; X32-SSE41-NEXT:    pinsrb $9, %edx, %xmm0
3236 ; X32-SSE41-NEXT:    movl %ecx, %edx
3237 ; X32-SSE41-NEXT:    shll $21, %edx
3238 ; X32-SSE41-NEXT:    sarl $31, %edx
3239 ; X32-SSE41-NEXT:    pinsrb $10, %edx, %xmm0
3240 ; X32-SSE41-NEXT:    movl %ecx, %edx
3241 ; X32-SSE41-NEXT:    shll $20, %edx
3242 ; X32-SSE41-NEXT:    sarl $31, %edx
3243 ; X32-SSE41-NEXT:    pinsrb $11, %edx, %xmm0
3244 ; X32-SSE41-NEXT:    movl %ecx, %edx
3245 ; X32-SSE41-NEXT:    shll $19, %edx
3246 ; X32-SSE41-NEXT:    sarl $31, %edx
3247 ; X32-SSE41-NEXT:    pinsrb $12, %edx, %xmm0
3248 ; X32-SSE41-NEXT:    movl %ecx, %edx
3249 ; X32-SSE41-NEXT:    shll $18, %edx
3250 ; X32-SSE41-NEXT:    sarl $31, %edx
3251 ; X32-SSE41-NEXT:    pinsrb $13, %edx, %xmm0
3252 ; X32-SSE41-NEXT:    movl %ecx, %edx
3253 ; X32-SSE41-NEXT:    shll $17, %edx
3254 ; X32-SSE41-NEXT:    sarl $31, %edx
3255 ; X32-SSE41-NEXT:    pinsrb $14, %edx, %xmm0
3256 ; X32-SSE41-NEXT:    shll $16, %ecx
3257 ; X32-SSE41-NEXT:    sarl $31, %ecx
3258 ; X32-SSE41-NEXT:    pinsrb $15, %ecx, %xmm0
3259 ; X32-SSE41-NEXT:    movzwl 2(%eax), %eax
3260 ; X32-SSE41-NEXT:    movl %eax, %ecx
3261 ; X32-SSE41-NEXT:    shll $30, %ecx
3262 ; X32-SSE41-NEXT:    sarl $31, %ecx
3263 ; X32-SSE41-NEXT:    movl %eax, %edx
3264 ; X32-SSE41-NEXT:    shll $31, %edx
3265 ; X32-SSE41-NEXT:    sarl $31, %edx
3266 ; X32-SSE41-NEXT:    movd %edx, %xmm1
3267 ; X32-SSE41-NEXT:    pinsrb $1, %ecx, %xmm1
3268 ; X32-SSE41-NEXT:    movl %eax, %ecx
3269 ; X32-SSE41-NEXT:    shll $29, %ecx
3270 ; X32-SSE41-NEXT:    sarl $31, %ecx
3271 ; X32-SSE41-NEXT:    pinsrb $2, %ecx, %xmm1
3272 ; X32-SSE41-NEXT:    movl %eax, %ecx
3273 ; X32-SSE41-NEXT:    shll $28, %ecx
3274 ; X32-SSE41-NEXT:    sarl $31, %ecx
3275 ; X32-SSE41-NEXT:    pinsrb $3, %ecx, %xmm1
3276 ; X32-SSE41-NEXT:    movl %eax, %ecx
3277 ; X32-SSE41-NEXT:    shll $27, %ecx
3278 ; X32-SSE41-NEXT:    sarl $31, %ecx
3279 ; X32-SSE41-NEXT:    pinsrb $4, %ecx, %xmm1
3280 ; X32-SSE41-NEXT:    movl %eax, %ecx
3281 ; X32-SSE41-NEXT:    shll $26, %ecx
3282 ; X32-SSE41-NEXT:    sarl $31, %ecx
3283 ; X32-SSE41-NEXT:    pinsrb $5, %ecx, %xmm1
3284 ; X32-SSE41-NEXT:    movl %eax, %ecx
3285 ; X32-SSE41-NEXT:    shll $25, %ecx
3286 ; X32-SSE41-NEXT:    sarl $31, %ecx
3287 ; X32-SSE41-NEXT:    pinsrb $6, %ecx, %xmm1
3288 ; X32-SSE41-NEXT:    movl %eax, %ecx
3289 ; X32-SSE41-NEXT:    shll $24, %ecx
3290 ; X32-SSE41-NEXT:    sarl $31, %ecx
3291 ; X32-SSE41-NEXT:    pinsrb $7, %ecx, %xmm1
3292 ; X32-SSE41-NEXT:    movl %eax, %ecx
3293 ; X32-SSE41-NEXT:    shll $23, %ecx
3294 ; X32-SSE41-NEXT:    sarl $31, %ecx
3295 ; X32-SSE41-NEXT:    pinsrb $8, %ecx, %xmm1
3296 ; X32-SSE41-NEXT:    movl %eax, %ecx
3297 ; X32-SSE41-NEXT:    shll $22, %ecx
3298 ; X32-SSE41-NEXT:    sarl $31, %ecx
3299 ; X32-SSE41-NEXT:    pinsrb $9, %ecx, %xmm1
3300 ; X32-SSE41-NEXT:    movl %eax, %ecx
3301 ; X32-SSE41-NEXT:    shll $21, %ecx
3302 ; X32-SSE41-NEXT:    sarl $31, %ecx
3303 ; X32-SSE41-NEXT:    pinsrb $10, %ecx, %xmm1
3304 ; X32-SSE41-NEXT:    movl %eax, %ecx
3305 ; X32-SSE41-NEXT:    shll $20, %ecx
3306 ; X32-SSE41-NEXT:    sarl $31, %ecx
3307 ; X32-SSE41-NEXT:    pinsrb $11, %ecx, %xmm1
3308 ; X32-SSE41-NEXT:    movl %eax, %ecx
3309 ; X32-SSE41-NEXT:    shll $19, %ecx
3310 ; X32-SSE41-NEXT:    sarl $31, %ecx
3311 ; X32-SSE41-NEXT:    pinsrb $12, %ecx, %xmm1
3312 ; X32-SSE41-NEXT:    movl %eax, %ecx
3313 ; X32-SSE41-NEXT:    shll $18, %ecx
3314 ; X32-SSE41-NEXT:    sarl $31, %ecx
3315 ; X32-SSE41-NEXT:    pinsrb $13, %ecx, %xmm1
3316 ; X32-SSE41-NEXT:    movl %eax, %ecx
3317 ; X32-SSE41-NEXT:    shll $17, %ecx
3318 ; X32-SSE41-NEXT:    sarl $31, %ecx
3319 ; X32-SSE41-NEXT:    pinsrb $14, %ecx, %xmm1
3320 ; X32-SSE41-NEXT:    shll $16, %eax
3321 ; X32-SSE41-NEXT:    sarl $31, %eax
3322 ; X32-SSE41-NEXT:    pinsrb $15, %eax, %xmm1
3323 ; X32-SSE41-NEXT:    popl %esi
3324 ; X32-SSE41-NEXT:    retl
3325 entry:
3326  %X = load <32 x i1>, <32 x i1>* %ptr
3327  %Y = sext <32 x i1> %X to <32 x i8>
3328  ret <32 x i8> %Y
3329 }
3330
3331 define <16 x i16> @load_sext_16i8_to_16i16(<16 x i8> *%ptr) {
3332 ; SSE2-LABEL: load_sext_16i8_to_16i16:
3333 ; SSE2:       # BB#0: # %entry
3334 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3335 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3336 ; SSE2-NEXT:    psraw $8, %xmm0
3337 ; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
3338 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3339 ; SSE2-NEXT:    psraw $8, %xmm1
3340 ; SSE2-NEXT:    retq
3341 ;
3342 ; SSSE3-LABEL: load_sext_16i8_to_16i16:
3343 ; SSSE3:       # BB#0: # %entry
3344 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3345 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3346 ; SSSE3-NEXT:    psraw $8, %xmm0
3347 ; SSSE3-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
3348 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3349 ; SSSE3-NEXT:    psraw $8, %xmm1
3350 ; SSSE3-NEXT:    retq
3351 ;
3352 ; SSE41-LABEL: load_sext_16i8_to_16i16:
3353 ; SSE41:       # BB#0: # %entry
3354 ; SSE41-NEXT:    pmovsxbw (%rdi), %xmm0
3355 ; SSE41-NEXT:    pmovsxbw 8(%rdi), %xmm1
3356 ; SSE41-NEXT:    retq
3357 ;
3358 ; AVX1-LABEL: load_sext_16i8_to_16i16:
3359 ; AVX1:       # BB#0: # %entry
3360 ; AVX1-NEXT:    vpmovsxbw (%rdi), %xmm0
3361 ; AVX1-NEXT:    vpmovsxbw 8(%rdi), %xmm1
3362 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3363 ; AVX1-NEXT:    retq
3364 ;
3365 ; AVX2-LABEL: load_sext_16i8_to_16i16:
3366 ; AVX2:       # BB#0: # %entry
3367 ; AVX2-NEXT:    vpmovsxbw (%rdi), %ymm0
3368 ; AVX2-NEXT:    retq
3369 ;
3370 ; X32-SSE41-LABEL: load_sext_16i8_to_16i16:
3371 ; X32-SSE41:       # BB#0: # %entry
3372 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3373 ; X32-SSE41-NEXT:    pmovsxbw (%eax), %xmm0
3374 ; X32-SSE41-NEXT:    pmovsxbw 8(%eax), %xmm1
3375 ; X32-SSE41-NEXT:    retl
3376 entry:
3377  %X = load <16 x i8>, <16 x i8>* %ptr
3378  %Y = sext <16 x i8> %X to <16 x i16>
3379  ret <16 x i16> %Y
3380 }
3381
3382 define <2 x i64> @load_sext_2i16_to_2i64(<2 x i16> *%ptr) {
3383 ; SSE2-LABEL: load_sext_2i16_to_2i64:
3384 ; SSE2:       # BB#0: # %entry
3385 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3386 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3387 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
3388 ; SSE2-NEXT:    psrad $31, %xmm1
3389 ; SSE2-NEXT:    psrad $16, %xmm0
3390 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3391 ; SSE2-NEXT:    retq
3392 ;
3393 ; SSSE3-LABEL: load_sext_2i16_to_2i64:
3394 ; SSSE3:       # BB#0: # %entry
3395 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
3396 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3397 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
3398 ; SSSE3-NEXT:    psrad $31, %xmm1
3399 ; SSSE3-NEXT:    psrad $16, %xmm0
3400 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3401 ; SSSE3-NEXT:    retq
3402 ;
3403 ; SSE41-LABEL: load_sext_2i16_to_2i64:
3404 ; SSE41:       # BB#0: # %entry
3405 ; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
3406 ; SSE41-NEXT:    retq
3407 ;
3408 ; AVX-LABEL: load_sext_2i16_to_2i64:
3409 ; AVX:       # BB#0: # %entry
3410 ; AVX-NEXT:    vpmovsxwq (%rdi), %xmm0
3411 ; AVX-NEXT:    retq
3412 ;
3413 ; X32-SSE41-LABEL: load_sext_2i16_to_2i64:
3414 ; X32-SSE41:       # BB#0: # %entry
3415 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3416 ; X32-SSE41-NEXT:    pmovsxwq (%eax), %xmm0
3417 ; X32-SSE41-NEXT:    retl
3418 entry:
3419  %X = load <2 x i16>, <2 x i16>* %ptr
3420  %Y = sext <2 x i16> %X to <2 x i64>
3421  ret <2 x i64> %Y
3422 }
3423
3424 define <4 x i32> @load_sext_4i16_to_4i32(<4 x i16> *%ptr) {
3425 ; SSE2-LABEL: load_sext_4i16_to_4i32:
3426 ; SSE2:       # BB#0: # %entry
3427 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3428 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3429 ; SSE2-NEXT:    psrad $16, %xmm0
3430 ; SSE2-NEXT:    retq
3431 ;
3432 ; SSSE3-LABEL: load_sext_4i16_to_4i32:
3433 ; SSSE3:       # BB#0: # %entry
3434 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3435 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3436 ; SSSE3-NEXT:    psrad $16, %xmm0
3437 ; SSSE3-NEXT:    retq
3438 ;
3439 ; SSE41-LABEL: load_sext_4i16_to_4i32:
3440 ; SSE41:       # BB#0: # %entry
3441 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
3442 ; SSE41-NEXT:    retq
3443 ;
3444 ; AVX-LABEL: load_sext_4i16_to_4i32:
3445 ; AVX:       # BB#0: # %entry
3446 ; AVX-NEXT:    vpmovsxwd (%rdi), %xmm0
3447 ; AVX-NEXT:    retq
3448 ;
3449 ; X32-SSE41-LABEL: load_sext_4i16_to_4i32:
3450 ; X32-SSE41:       # BB#0: # %entry
3451 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3452 ; X32-SSE41-NEXT:    pmovsxwd (%eax), %xmm0
3453 ; X32-SSE41-NEXT:    retl
3454 entry:
3455  %X = load <4 x i16>, <4 x i16>* %ptr
3456  %Y = sext <4 x i16> %X to <4 x i32>
3457  ret <4 x i32> %Y
3458 }
3459
3460 define <4 x i64> @load_sext_4i16_to_4i64(<4 x i16> *%ptr) {
3461 ; SSE2-LABEL: load_sext_4i16_to_4i64:
3462 ; SSE2:       # BB#0: # %entry
3463 ; SSE2-NEXT:    movswq 2(%rdi), %rax
3464 ; SSE2-NEXT:    movd %rax, %xmm1
3465 ; SSE2-NEXT:    movswq (%rdi), %rax
3466 ; SSE2-NEXT:    movd %rax, %xmm0
3467 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3468 ; SSE2-NEXT:    movswq 6(%rdi), %rax
3469 ; SSE2-NEXT:    movd %rax, %xmm2
3470 ; SSE2-NEXT:    movswq 4(%rdi), %rax
3471 ; SSE2-NEXT:    movd %rax, %xmm1
3472 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
3473 ; SSE2-NEXT:    retq
3474 ;
3475 ; SSSE3-LABEL: load_sext_4i16_to_4i64:
3476 ; SSSE3:       # BB#0: # %entry
3477 ; SSSE3-NEXT:    movswq 2(%rdi), %rax
3478 ; SSSE3-NEXT:    movd %rax, %xmm1
3479 ; SSSE3-NEXT:    movswq (%rdi), %rax
3480 ; SSSE3-NEXT:    movd %rax, %xmm0
3481 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3482 ; SSSE3-NEXT:    movswq 6(%rdi), %rax
3483 ; SSSE3-NEXT:    movd %rax, %xmm2
3484 ; SSSE3-NEXT:    movswq 4(%rdi), %rax
3485 ; SSSE3-NEXT:    movd %rax, %xmm1
3486 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
3487 ; SSSE3-NEXT:    retq
3488 ;
3489 ; SSE41-LABEL: load_sext_4i16_to_4i64:
3490 ; SSE41:       # BB#0: # %entry
3491 ; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
3492 ; SSE41-NEXT:    pmovsxwq 4(%rdi), %xmm1
3493 ; SSE41-NEXT:    retq
3494 ;
3495 ; AVX1-LABEL: load_sext_4i16_to_4i64:
3496 ; AVX1:       # BB#0: # %entry
3497 ; AVX1-NEXT:    vpmovsxwd (%rdi), %xmm0
3498 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
3499 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3500 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
3501 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
3502 ; AVX1-NEXT:    retq
3503 ;
3504 ; AVX2-LABEL: load_sext_4i16_to_4i64:
3505 ; AVX2:       # BB#0: # %entry
3506 ; AVX2-NEXT:    vpmovsxwq (%rdi), %ymm0
3507 ; AVX2-NEXT:    retq
3508 ;
3509 ; X32-SSE41-LABEL: load_sext_4i16_to_4i64:
3510 ; X32-SSE41:       # BB#0: # %entry
3511 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3512 ; X32-SSE41-NEXT:    pmovsxwq (%eax), %xmm0
3513 ; X32-SSE41-NEXT:    pmovsxwq 4(%eax), %xmm1
3514 ; X32-SSE41-NEXT:    retl
3515 entry:
3516  %X = load <4 x i16>, <4 x i16>* %ptr
3517  %Y = sext <4 x i16> %X to <4 x i64>
3518  ret <4 x i64> %Y
3519 }
3520
3521 define <8 x i32> @load_sext_8i16_to_8i32(<8 x i16> *%ptr) {
3522 ; SSE2-LABEL: load_sext_8i16_to_8i32:
3523 ; SSE2:       # BB#0: # %entry
3524 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3525 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3526 ; SSE2-NEXT:    psrad $16, %xmm0
3527 ; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
3528 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
3529 ; SSE2-NEXT:    psrad $16, %xmm1
3530 ; SSE2-NEXT:    retq
3531 ;
3532 ; SSSE3-LABEL: load_sext_8i16_to_8i32:
3533 ; SSSE3:       # BB#0: # %entry
3534 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3535 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3536 ; SSSE3-NEXT:    psrad $16, %xmm0
3537 ; SSSE3-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
3538 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
3539 ; SSSE3-NEXT:    psrad $16, %xmm1
3540 ; SSSE3-NEXT:    retq
3541 ;
3542 ; SSE41-LABEL: load_sext_8i16_to_8i32:
3543 ; SSE41:       # BB#0: # %entry
3544 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
3545 ; SSE41-NEXT:    pmovsxwd 8(%rdi), %xmm1
3546 ; SSE41-NEXT:    retq
3547 ;
3548 ; AVX1-LABEL: load_sext_8i16_to_8i32:
3549 ; AVX1:       # BB#0: # %entry
3550 ; AVX1-NEXT:    vpmovsxwd (%rdi), %xmm0
3551 ; AVX1-NEXT:    vpmovsxwd 8(%rdi), %xmm1
3552 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3553 ; AVX1-NEXT:    retq
3554 ;
3555 ; AVX2-LABEL: load_sext_8i16_to_8i32:
3556 ; AVX2:       # BB#0: # %entry
3557 ; AVX2-NEXT:    vpmovsxwd (%rdi), %ymm0
3558 ; AVX2-NEXT:    retq
3559 ;
3560 ; X32-SSE41-LABEL: load_sext_8i16_to_8i32:
3561 ; X32-SSE41:       # BB#0: # %entry
3562 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3563 ; X32-SSE41-NEXT:    pmovsxwd (%eax), %xmm0
3564 ; X32-SSE41-NEXT:    pmovsxwd 8(%eax), %xmm1
3565 ; X32-SSE41-NEXT:    retl
3566 entry:
3567  %X = load <8 x i16>, <8 x i16>* %ptr
3568  %Y = sext <8 x i16> %X to <8 x i32>
3569  ret <8 x i32> %Y
3570 }
3571
3572 define <2 x i64> @load_sext_2i32_to_2i64(<2 x i32> *%ptr) {
3573 ; SSE2-LABEL: load_sext_2i32_to_2i64:
3574 ; SSE2:       # BB#0: # %entry
3575 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3576 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
3577 ; SSE2-NEXT:    psrad $31, %xmm1
3578 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3579 ; SSE2-NEXT:    retq
3580 ;
3581 ; SSSE3-LABEL: load_sext_2i32_to_2i64:
3582 ; SSSE3:       # BB#0: # %entry
3583 ; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
3584 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
3585 ; SSSE3-NEXT:    psrad $31, %xmm1
3586 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3587 ; SSSE3-NEXT:    retq
3588 ;
3589 ; SSE41-LABEL: load_sext_2i32_to_2i64:
3590 ; SSE41:       # BB#0: # %entry
3591 ; SSE41-NEXT:    pmovsxdq (%rdi), %xmm0
3592 ; SSE41-NEXT:    retq
3593 ;
3594 ; AVX-LABEL: load_sext_2i32_to_2i64:
3595 ; AVX:       # BB#0: # %entry
3596 ; AVX-NEXT:    vpmovsxdq (%rdi), %xmm0
3597 ; AVX-NEXT:    retq
3598 ;
3599 ; X32-SSE41-LABEL: load_sext_2i32_to_2i64:
3600 ; X32-SSE41:       # BB#0: # %entry
3601 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3602 ; X32-SSE41-NEXT:    pmovsxdq (%eax), %xmm0
3603 ; X32-SSE41-NEXT:    retl
3604 entry:
3605  %X = load <2 x i32>, <2 x i32>* %ptr
3606  %Y = sext <2 x i32> %X to <2 x i64>
3607  ret <2 x i64> %Y
3608 }
3609
3610 define <4 x i64> @load_sext_4i32_to_4i64(<4 x i32> *%ptr) {
3611 ; SSE2-LABEL: load_sext_4i32_to_4i64:
3612 ; SSE2:       # BB#0: # %entry
3613 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
3614 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
3615 ; SSE2-NEXT:    psrad $31, %xmm2
3616 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
3617 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3618 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
3619 ; SSE2-NEXT:    psrad $31, %xmm2
3620 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3621 ; SSE2-NEXT:    retq
3622 ;
3623 ; SSSE3-LABEL: load_sext_4i32_to_4i64:
3624 ; SSSE3:       # BB#0: # %entry
3625 ; SSSE3-NEXT:    movdqa (%rdi), %xmm0
3626 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
3627 ; SSSE3-NEXT:    psrad $31, %xmm2
3628 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
3629 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3630 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
3631 ; SSSE3-NEXT:    psrad $31, %xmm2
3632 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3633 ; SSSE3-NEXT:    retq
3634 ;
3635 ; SSE41-LABEL: load_sext_4i32_to_4i64:
3636 ; SSE41:       # BB#0: # %entry
3637 ; SSE41-NEXT:    pmovsxdq (%rdi), %xmm0
3638 ; SSE41-NEXT:    pmovsxdq 8(%rdi), %xmm1
3639 ; SSE41-NEXT:    retq
3640 ;
3641 ; AVX1-LABEL: load_sext_4i32_to_4i64:
3642 ; AVX1:       # BB#0: # %entry
3643 ; AVX1-NEXT:    vpmovsxdq (%rdi), %xmm0
3644 ; AVX1-NEXT:    vpmovsxdq 8(%rdi), %xmm1
3645 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3646 ; AVX1-NEXT:    retq
3647 ;
3648 ; AVX2-LABEL: load_sext_4i32_to_4i64:
3649 ; AVX2:       # BB#0: # %entry
3650 ; AVX2-NEXT:    vpmovsxdq (%rdi), %ymm0
3651 ; AVX2-NEXT:    retq
3652 ;
3653 ; X32-SSE41-LABEL: load_sext_4i32_to_4i64:
3654 ; X32-SSE41:       # BB#0: # %entry
3655 ; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3656 ; X32-SSE41-NEXT:    pmovsxdq (%eax), %xmm0
3657 ; X32-SSE41-NEXT:    pmovsxdq 8(%eax), %xmm1
3658 ; X32-SSE41-NEXT:    retl
3659 entry:
3660  %X = load <4 x i32>, <4 x i32>* %ptr
3661  %Y = sext <4 x i32> %X to <4 x i64>
3662  ret <4 x i64> %Y
3663 }
3664
3665 define i32 @sext_2i8_to_i32(<16 x i8> %A) nounwind uwtable readnone ssp {
3666 ; SSE2-LABEL: sext_2i8_to_i32:
3667 ; SSE2:       # BB#0: # %entry
3668 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3669 ; SSE2-NEXT:    psraw $8, %xmm0
3670 ; SSE2-NEXT:    movd %xmm0, %eax
3671 ; SSE2-NEXT:    retq
3672 ;
3673 ; SSSE3-LABEL: sext_2i8_to_i32:
3674 ; SSSE3:       # BB#0: # %entry
3675 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3676 ; SSSE3-NEXT:    psraw $8, %xmm0
3677 ; SSSE3-NEXT:    movd %xmm0, %eax
3678 ; SSSE3-NEXT:    retq
3679 ;
3680 ; SSE41-LABEL: sext_2i8_to_i32:
3681 ; SSE41:       # BB#0: # %entry
3682 ; SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
3683 ; SSE41-NEXT:    movd %xmm0, %eax
3684 ; SSE41-NEXT:    retq
3685 ;
3686 ; AVX-LABEL: sext_2i8_to_i32:
3687 ; AVX:       # BB#0: # %entry
3688 ; AVX-NEXT:    vpmovsxbw %xmm0, %xmm0
3689 ; AVX-NEXT:    vmovd %xmm0, %eax
3690 ; AVX-NEXT:    retq
3691 ;
3692 ; X32-SSE41-LABEL: sext_2i8_to_i32:
3693 ; X32-SSE41:       # BB#0: # %entry
3694 ; X32-SSE41-NEXT:    pushl %eax
3695 ; X32-SSE41-NEXT:  .Ltmp2:
3696 ; X32-SSE41-NEXT:    .cfi_def_cfa_offset 8
3697 ; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
3698 ; X32-SSE41-NEXT:    movd %xmm0, %eax
3699 ; X32-SSE41-NEXT:    popl %edx
3700 ; X32-SSE41-NEXT:    retl
3701 entry:
3702   %Shuf = shufflevector <16 x i8> %A, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
3703   %Ex = sext <2 x i8> %Shuf to <2 x i16>
3704   %Bc = bitcast <2 x i16> %Ex to i32
3705   ret i32 %Bc
3706 }
3707
3708 define <4 x i64> @sext_4i1_to_4i64(<4 x i1> %mask) {
3709 ; SSE2-LABEL: sext_4i1_to_4i64:
3710 ; SSE2:       # BB#0:
3711 ; SSE2-NEXT:    pslld $31, %xmm0
3712 ; SSE2-NEXT:    psrad $31, %xmm0
3713 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
3714 ; SSE2-NEXT:    psrad $31, %xmm2
3715 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
3716 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3717 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
3718 ; SSE2-NEXT:    psrad $31, %xmm2
3719 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3720 ; SSE2-NEXT:    retq
3721 ;
3722 ; SSSE3-LABEL: sext_4i1_to_4i64:
3723 ; SSSE3:       # BB#0:
3724 ; SSSE3-NEXT:    pslld $31, %xmm0
3725 ; SSSE3-NEXT:    psrad $31, %xmm0
3726 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
3727 ; SSSE3-NEXT:    psrad $31, %xmm2
3728 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
3729 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3730 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
3731 ; SSSE3-NEXT:    psrad $31, %xmm2
3732 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3733 ; SSSE3-NEXT:    retq
3734 ;
3735 ; SSE41-LABEL: sext_4i1_to_4i64:
3736 ; SSE41:       # BB#0:
3737 ; SSE41-NEXT:    pslld $31, %xmm0
3738 ; SSE41-NEXT:    psrad $31, %xmm0
3739 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
3740 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3741 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
3742 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
3743 ; SSE41-NEXT:    retq
3744 ;
3745 ; AVX1-LABEL: sext_4i1_to_4i64:
3746 ; AVX1:       # BB#0:
3747 ; AVX1-NEXT:    vpslld $31, %xmm0, %xmm0
3748 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm0
3749 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
3750 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3751 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
3752 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
3753 ; AVX1-NEXT:    retq
3754 ;
3755 ; AVX2-LABEL: sext_4i1_to_4i64:
3756 ; AVX2:       # BB#0:
3757 ; AVX2-NEXT:    vpslld $31, %xmm0, %xmm0
3758 ; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm0
3759 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
3760 ; AVX2-NEXT:    retq
3761 ;
3762 ; X32-SSE41-LABEL: sext_4i1_to_4i64:
3763 ; X32-SSE41:       # BB#0:
3764 ; X32-SSE41-NEXT:    pslld $31, %xmm0
3765 ; X32-SSE41-NEXT:    psrad $31, %xmm0
3766 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
3767 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3768 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
3769 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
3770 ; X32-SSE41-NEXT:    retl
3771   %extmask = sext <4 x i1> %mask to <4 x i64>
3772   ret <4 x i64> %extmask
3773 }
3774
3775 define <4 x i64> @sext_4i8_to_4i64(<4 x i8> %mask) {
3776 ; SSE2-LABEL: sext_4i8_to_4i64:
3777 ; SSE2:       # BB#0:
3778 ; SSE2-NEXT:    pslld $24, %xmm0
3779 ; SSE2-NEXT:    psrad $24, %xmm0
3780 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
3781 ; SSE2-NEXT:    psrad $31, %xmm2
3782 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
3783 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3784 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
3785 ; SSE2-NEXT:    psrad $31, %xmm2
3786 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3787 ; SSE2-NEXT:    retq
3788 ;
3789 ; SSSE3-LABEL: sext_4i8_to_4i64:
3790 ; SSSE3:       # BB#0:
3791 ; SSSE3-NEXT:    pslld $24, %xmm0
3792 ; SSSE3-NEXT:    psrad $24, %xmm0
3793 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
3794 ; SSSE3-NEXT:    psrad $31, %xmm2
3795 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
3796 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3797 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
3798 ; SSSE3-NEXT:    psrad $31, %xmm2
3799 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3800 ; SSSE3-NEXT:    retq
3801 ;
3802 ; SSE41-LABEL: sext_4i8_to_4i64:
3803 ; SSE41:       # BB#0:
3804 ; SSE41-NEXT:    pslld $24, %xmm0
3805 ; SSE41-NEXT:    psrad $24, %xmm0
3806 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
3807 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3808 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
3809 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
3810 ; SSE41-NEXT:    retq
3811 ;
3812 ; AVX1-LABEL: sext_4i8_to_4i64:
3813 ; AVX1:       # BB#0:
3814 ; AVX1-NEXT:    vpslld $24, %xmm0, %xmm0
3815 ; AVX1-NEXT:    vpsrad $24, %xmm0, %xmm0
3816 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
3817 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3818 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
3819 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
3820 ; AVX1-NEXT:    retq
3821 ;
3822 ; AVX2-LABEL: sext_4i8_to_4i64:
3823 ; AVX2:       # BB#0:
3824 ; AVX2-NEXT:    vpslld $24, %xmm0, %xmm0
3825 ; AVX2-NEXT:    vpsrad $24, %xmm0, %xmm0
3826 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
3827 ; AVX2-NEXT:    retq
3828 ;
3829 ; X32-SSE41-LABEL: sext_4i8_to_4i64:
3830 ; X32-SSE41:       # BB#0:
3831 ; X32-SSE41-NEXT:    pslld $24, %xmm0
3832 ; X32-SSE41-NEXT:    psrad $24, %xmm0
3833 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
3834 ; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3835 ; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
3836 ; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
3837 ; X32-SSE41-NEXT:    retl
3838   %extmask = sext <4 x i8> %mask to <4 x i64>
3839   ret <4 x i64> %extmask
3840 }