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