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