1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=SSE --check-prefix=SSSE3
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512BW
9;
10; Just one 32-bit run to make sure we do reasonable things there.
11; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=X32-SSE41
12
13define <8 x i16> @sext_16i8_to_8i16(<16 x i8> %A) nounwind uwtable readnone ssp {
14; SSE2-LABEL: sext_16i8_to_8i16:
15; SSE2:       # BB#0: # %entry
16; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
17; SSE2-NEXT:    psraw $8, %xmm0
18; SSE2-NEXT:    retq
19;
20; SSSE3-LABEL: sext_16i8_to_8i16:
21; SSSE3:       # BB#0: # %entry
22; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
23; SSSE3-NEXT:    psraw $8, %xmm0
24; SSSE3-NEXT:    retq
25;
26; SSE41-LABEL: sext_16i8_to_8i16:
27; SSE41:       # BB#0: # %entry
28; SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
29; SSE41-NEXT:    retq
30;
31; AVX-LABEL: sext_16i8_to_8i16:
32; AVX:       # BB#0: # %entry
33; AVX-NEXT:    vpmovsxbw %xmm0, %xmm0
34; AVX-NEXT:    retq
35;
36; X32-SSE41-LABEL: sext_16i8_to_8i16:
37; X32-SSE41:       # BB#0: # %entry
38; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
39; X32-SSE41-NEXT:    retl
40entry:
41  %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>
42  %C = sext <8 x i8> %B to <8 x i16>
43  ret <8 x i16> %C
44}
45
46define <16 x i16> @sext_16i8_to_16i16(<16 x i8> %A) nounwind uwtable readnone ssp {
47; SSE2-LABEL: sext_16i8_to_16i16:
48; SSE2:       # BB#0: # %entry
49; 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]
50; SSE2-NEXT:    psraw $8, %xmm2
51; 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]
52; SSE2-NEXT:    psraw $8, %xmm1
53; SSE2-NEXT:    movdqa %xmm2, %xmm0
54; SSE2-NEXT:    retq
55;
56; SSSE3-LABEL: sext_16i8_to_16i16:
57; SSSE3:       # BB#0: # %entry
58; 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]
59; SSSE3-NEXT:    psraw $8, %xmm2
60; 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]
61; SSSE3-NEXT:    psraw $8, %xmm1
62; SSSE3-NEXT:    movdqa %xmm2, %xmm0
63; SSSE3-NEXT:    retq
64;
65; SSE41-LABEL: sext_16i8_to_16i16:
66; SSE41:       # BB#0: # %entry
67; SSE41-NEXT:    pmovsxbw %xmm0, %xmm2
68; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
69; SSE41-NEXT:    pmovsxbw %xmm0, %xmm1
70; SSE41-NEXT:    movdqa %xmm2, %xmm0
71; SSE41-NEXT:    retq
72;
73; AVX1-LABEL: sext_16i8_to_16i16:
74; AVX1:       # BB#0: # %entry
75; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm1
76; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
77; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm0
78; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
79; AVX1-NEXT:    retq
80;
81; AVX2-LABEL: sext_16i8_to_16i16:
82; AVX2:       # BB#0: # %entry
83; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm0
84; AVX2-NEXT:    retq
85;
86; AVX512-LABEL: sext_16i8_to_16i16:
87; AVX512:       # BB#0: # %entry
88; AVX512-NEXT:    vpmovsxbw %xmm0, %ymm0
89; AVX512-NEXT:    retq
90;
91; X32-SSE41-LABEL: sext_16i8_to_16i16:
92; X32-SSE41:       # BB#0: # %entry
93; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm2
94; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
95; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm1
96; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
97; X32-SSE41-NEXT:    retl
98entry:
99  %B = sext <16 x i8> %A to <16 x i16>
100  ret <16 x i16> %B
101}
102
103define <32 x i16> @sext_32i8_to_32i16(<32 x i8> %A) nounwind uwtable readnone ssp {
104; SSE2-LABEL: sext_32i8_to_32i16:
105; SSE2:       # BB#0: # %entry
106; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]
107; SSE2-NEXT:    psraw $8, %xmm4
108; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
109; SSE2-NEXT:    psraw $8, %xmm5
110; 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]
111; SSE2-NEXT:    psraw $8, %xmm2
112; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]
113; SSE2-NEXT:    psraw $8, %xmm3
114; SSE2-NEXT:    movdqa %xmm4, %xmm0
115; SSE2-NEXT:    movdqa %xmm5, %xmm1
116; SSE2-NEXT:    retq
117;
118; SSSE3-LABEL: sext_32i8_to_32i16:
119; SSSE3:       # BB#0: # %entry
120; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]
121; SSSE3-NEXT:    psraw $8, %xmm4
122; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
123; SSSE3-NEXT:    psraw $8, %xmm5
124; 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]
125; SSSE3-NEXT:    psraw $8, %xmm2
126; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]
127; SSSE3-NEXT:    psraw $8, %xmm3
128; SSSE3-NEXT:    movdqa %xmm4, %xmm0
129; SSSE3-NEXT:    movdqa %xmm5, %xmm1
130; SSSE3-NEXT:    retq
131;
132; SSE41-LABEL: sext_32i8_to_32i16:
133; SSE41:       # BB#0: # %entry
134; SSE41-NEXT:    pmovsxbw %xmm0, %xmm5
135; SSE41-NEXT:    pmovsxbw %xmm1, %xmm2
136; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
137; SSE41-NEXT:    pmovsxbw %xmm0, %xmm4
138; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
139; SSE41-NEXT:    pmovsxbw %xmm0, %xmm3
140; SSE41-NEXT:    movdqa %xmm5, %xmm0
141; SSE41-NEXT:    movdqa %xmm4, %xmm1
142; SSE41-NEXT:    retq
143;
144; AVX1-LABEL: sext_32i8_to_32i16:
145; AVX1:       # BB#0: # %entry
146; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm1
147; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
148; AVX1-NEXT:    vpmovsxbw %xmm2, %xmm2
149; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm2
150; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
151; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm1
152; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
153; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm0
154; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm1
155; AVX1-NEXT:    vmovaps %ymm2, %ymm0
156; AVX1-NEXT:    retq
157;
158; AVX2-LABEL: sext_32i8_to_32i16:
159; AVX2:       # BB#0: # %entry
160; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm2
161; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
162; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm1
163; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
164; AVX2-NEXT:    retq
165;
166; AVX512F-LABEL: sext_32i8_to_32i16:
167; AVX512F:       # BB#0: # %entry
168; AVX512F-NEXT:    vpmovsxbw %xmm0, %ymm2
169; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm0
170; AVX512F-NEXT:    vpmovsxbw %xmm0, %ymm1
171; AVX512F-NEXT:    vmovdqa %ymm2, %ymm0
172; AVX512F-NEXT:    retq
173;
174; AVX512BW-LABEL: sext_32i8_to_32i16:
175; AVX512BW:       # BB#0: # %entry
176; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm0
177; AVX512BW-NEXT:    retq
178;
179; X32-SSE41-LABEL: sext_32i8_to_32i16:
180; X32-SSE41:       # BB#0: # %entry
181; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm5
182; X32-SSE41-NEXT:    pmovsxbw %xmm1, %xmm2
183; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
184; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm4
185; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
186; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm3
187; X32-SSE41-NEXT:    movdqa %xmm5, %xmm0
188; X32-SSE41-NEXT:    movdqa %xmm4, %xmm1
189; X32-SSE41-NEXT:    retl
190entry:
191  %B = sext <32 x i8> %A to <32 x i16>
192  ret <32 x i16> %B
193}
194
195define <4 x i32> @sext_16i8_to_4i32(<16 x i8> %A) nounwind uwtable readnone ssp {
196; SSE2-LABEL: sext_16i8_to_4i32:
197; SSE2:       # BB#0: # %entry
198; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
199; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
200; SSE2-NEXT:    psrad $24, %xmm0
201; SSE2-NEXT:    retq
202;
203; SSSE3-LABEL: sext_16i8_to_4i32:
204; SSSE3:       # BB#0: # %entry
205; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
206; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
207; SSSE3-NEXT:    psrad $24, %xmm0
208; SSSE3-NEXT:    retq
209;
210; SSE41-LABEL: sext_16i8_to_4i32:
211; SSE41:       # BB#0: # %entry
212; SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
213; SSE41-NEXT:    retq
214;
215; AVX-LABEL: sext_16i8_to_4i32:
216; AVX:       # BB#0: # %entry
217; AVX-NEXT:    vpmovsxbd %xmm0, %xmm0
218; AVX-NEXT:    retq
219;
220; X32-SSE41-LABEL: sext_16i8_to_4i32:
221; X32-SSE41:       # BB#0: # %entry
222; X32-SSE41-NEXT:    pmovsxbd %xmm0, %xmm0
223; X32-SSE41-NEXT:    retl
224entry:
225  %B = shufflevector <16 x i8> %A, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
226  %C = sext <4 x i8> %B to <4 x i32>
227  ret <4 x i32> %C
228}
229
230define <8 x i32> @sext_16i8_to_8i32(<16 x i8> %A) nounwind uwtable readnone ssp {
231; SSE2-LABEL: sext_16i8_to_8i32:
232; SSE2:       # BB#0: # %entry
233; 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]
234; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
235; SSE2-NEXT:    psrad $24, %xmm2
236; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
237; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
238; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
239; SSE2-NEXT:    psrad $24, %xmm1
240; SSE2-NEXT:    movdqa %xmm2, %xmm0
241; SSE2-NEXT:    retq
242;
243; SSSE3-LABEL: sext_16i8_to_8i32:
244; SSSE3:       # BB#0: # %entry
245; SSSE3-NEXT:    movdqa %xmm0, %xmm1
246; 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]
247; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
248; SSSE3-NEXT:    psrad $24, %xmm0
249; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[u,u,u,4,u,u,u,5,u,u,u,6,u,u,u,7]
250; SSSE3-NEXT:    psrad $24, %xmm1
251; SSSE3-NEXT:    retq
252;
253; SSE41-LABEL: sext_16i8_to_8i32:
254; SSE41:       # BB#0: # %entry
255; SSE41-NEXT:    pmovsxbd %xmm0, %xmm2
256; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
257; SSE41-NEXT:    pmovsxbd %xmm0, %xmm1
258; SSE41-NEXT:    movdqa %xmm2, %xmm0
259; SSE41-NEXT:    retq
260;
261; AVX1-LABEL: sext_16i8_to_8i32:
262; AVX1:       # BB#0: # %entry
263; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm1
264; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
265; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
266; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
267; AVX1-NEXT:    retq
268;
269; AVX2-LABEL: sext_16i8_to_8i32:
270; AVX2:       # BB#0: # %entry
271; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm0
272; AVX2-NEXT:    retq
273;
274; AVX512-LABEL: sext_16i8_to_8i32:
275; AVX512:       # BB#0: # %entry
276; AVX512-NEXT:    vpmovsxbd %xmm0, %ymm0
277; AVX512-NEXT:    retq
278;
279; X32-SSE41-LABEL: sext_16i8_to_8i32:
280; X32-SSE41:       # BB#0: # %entry
281; X32-SSE41-NEXT:    pmovsxbd %xmm0, %xmm2
282; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
283; X32-SSE41-NEXT:    pmovsxbd %xmm0, %xmm1
284; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
285; X32-SSE41-NEXT:    retl
286entry:
287  %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>
288  %C = sext <8 x i8> %B to <8 x i32>
289  ret <8 x i32> %C
290}
291
292define <16 x i32> @sext_16i8_to_16i32(<16 x i8> %A) nounwind uwtable readnone ssp {
293; SSE2-LABEL: sext_16i8_to_16i32:
294; SSE2:       # BB#0: # %entry
295; 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]
296; SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3]
297; SSE2-NEXT:    psrad $24, %xmm4
298; 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]
299; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
300; SSE2-NEXT:    psrad $24, %xmm2
301; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
302; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
303; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
304; SSE2-NEXT:    psrad $24, %xmm1
305; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
306; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
307; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3]
308; SSE2-NEXT:    psrad $24, %xmm3
309; SSE2-NEXT:    movdqa %xmm4, %xmm0
310; SSE2-NEXT:    retq
311;
312; SSSE3-LABEL: sext_16i8_to_16i32:
313; SSSE3:       # BB#0: # %entry
314; SSSE3-NEXT:    movdqa %xmm0, %xmm3
315; 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]
316; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
317; SSSE3-NEXT:    psrad $24, %xmm0
318; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm3[8],xmm1[9],xmm3[9],xmm1[10],xmm3[10],xmm1[11],xmm3[11],xmm1[12],xmm3[12],xmm1[13],xmm3[13],xmm1[14],xmm3[14],xmm1[15],xmm3[15]
319; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
320; SSSE3-NEXT:    psrad $24, %xmm2
321; SSSE3-NEXT:    movdqa %xmm3, %xmm1
322; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[u,u,u,4,u,u,u,5,u,u,u,6,u,u,u,7]
323; SSSE3-NEXT:    psrad $24, %xmm1
324; SSSE3-NEXT:    pshufb {{.*#+}} xmm3 = xmm3[u,u,u,12,u,u,u,13,u,u,u,14,u,u,u,15]
325; SSSE3-NEXT:    psrad $24, %xmm3
326; SSSE3-NEXT:    retq
327;
328; SSE41-LABEL: sext_16i8_to_16i32:
329; SSE41:       # BB#0: # %entry
330; SSE41-NEXT:    pmovsxbd %xmm0, %xmm4
331; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
332; SSE41-NEXT:    pmovsxbd %xmm1, %xmm1
333; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
334; SSE41-NEXT:    pmovsxbd %xmm2, %xmm2
335; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
336; SSE41-NEXT:    pmovsxbd %xmm0, %xmm3
337; SSE41-NEXT:    movdqa %xmm4, %xmm0
338; SSE41-NEXT:    retq
339;
340; AVX1-LABEL: sext_16i8_to_16i32:
341; AVX1:       # BB#0: # %entry
342; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm1
343; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
344; AVX1-NEXT:    vpmovsxbd %xmm2, %xmm2
345; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm2
346; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
347; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1
348; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
349; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
350; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm1
351; AVX1-NEXT:    vmovaps %ymm2, %ymm0
352; AVX1-NEXT:    retq
353;
354; AVX2-LABEL: sext_16i8_to_16i32:
355; AVX2:       # BB#0: # %entry
356; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm2
357; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
358; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm1
359; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
360; AVX2-NEXT:    retq
361;
362; AVX512-LABEL: sext_16i8_to_16i32:
363; AVX512:       # BB#0: # %entry
364; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
365; AVX512-NEXT:    retq
366;
367; X32-SSE41-LABEL: sext_16i8_to_16i32:
368; X32-SSE41:       # BB#0: # %entry
369; X32-SSE41-NEXT:    pmovsxbd %xmm0, %xmm4
370; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
371; X32-SSE41-NEXT:    pmovsxbd %xmm1, %xmm1
372; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
373; X32-SSE41-NEXT:    pmovsxbd %xmm2, %xmm2
374; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
375; X32-SSE41-NEXT:    pmovsxbd %xmm0, %xmm3
376; X32-SSE41-NEXT:    movdqa %xmm4, %xmm0
377; X32-SSE41-NEXT:    retl
378entry:
379  %B = sext <16 x i8> %A to <16 x i32>
380  ret <16 x i32> %B
381}
382
383define <2 x i64> @sext_16i8_to_2i64(<16 x i8> %A) nounwind uwtable readnone ssp {
384; SSE2-LABEL: sext_16i8_to_2i64:
385; SSE2:       # BB#0: # %entry
386; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
387; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
388; SSE2-NEXT:    movdqa %xmm0, %xmm1
389; SSE2-NEXT:    psrad $31, %xmm1
390; SSE2-NEXT:    psrad $24, %xmm0
391; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
392; SSE2-NEXT:    retq
393;
394; SSSE3-LABEL: sext_16i8_to_2i64:
395; SSSE3:       # BB#0: # %entry
396; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
397; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
398; SSSE3-NEXT:    movdqa %xmm0, %xmm1
399; SSSE3-NEXT:    psrad $31, %xmm1
400; SSSE3-NEXT:    psrad $24, %xmm0
401; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
402; SSSE3-NEXT:    retq
403;
404; SSE41-LABEL: sext_16i8_to_2i64:
405; SSE41:       # BB#0: # %entry
406; SSE41-NEXT:    pmovsxbq %xmm0, %xmm0
407; SSE41-NEXT:    retq
408;
409; AVX-LABEL: sext_16i8_to_2i64:
410; AVX:       # BB#0: # %entry
411; AVX-NEXT:    vpmovsxbq %xmm0, %xmm0
412; AVX-NEXT:    retq
413;
414; X32-SSE41-LABEL: sext_16i8_to_2i64:
415; X32-SSE41:       # BB#0: # %entry
416; X32-SSE41-NEXT:    pmovsxbq %xmm0, %xmm0
417; X32-SSE41-NEXT:    retl
418entry:
419  %B = shufflevector <16 x i8> %A, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
420  %C = sext <2 x i8> %B to <2 x i64>
421  ret <2 x i64> %C
422}
423
424define <4 x i64> @sext_16i8_to_4i64(<16 x i8> %A) nounwind uwtable readnone ssp {
425; SSE2-LABEL: sext_16i8_to_4i64:
426; SSE2:       # BB#0: # %entry
427; 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]
428; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
429; SSE2-NEXT:    movdqa %xmm2, %xmm1
430; SSE2-NEXT:    psrad $31, %xmm1
431; SSE2-NEXT:    psrad $24, %xmm2
432; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
433; SSE2-NEXT:    psrld $16, %xmm0
434; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
435; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
436; SSE2-NEXT:    movdqa %xmm1, %xmm0
437; SSE2-NEXT:    psrad $31, %xmm0
438; SSE2-NEXT:    psrad $24, %xmm1
439; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
440; SSE2-NEXT:    movdqa %xmm2, %xmm0
441; SSE2-NEXT:    retq
442;
443; SSSE3-LABEL: sext_16i8_to_4i64:
444; SSSE3:       # BB#0: # %entry
445; SSSE3-NEXT:    movdqa %xmm0, %xmm1
446; 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]
447; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
448; SSSE3-NEXT:    movdqa %xmm0, %xmm2
449; SSSE3-NEXT:    psrad $31, %xmm2
450; SSSE3-NEXT:    psrad $24, %xmm0
451; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
452; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[u,u,u,2,u,u,u,3,u,u,u],zero,xmm1[u,u,u],zero
453; SSSE3-NEXT:    movdqa %xmm1, %xmm2
454; SSSE3-NEXT:    psrad $31, %xmm2
455; SSSE3-NEXT:    psrad $24, %xmm1
456; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
457; SSSE3-NEXT:    retq
458;
459; SSE41-LABEL: sext_16i8_to_4i64:
460; SSE41:       # BB#0: # %entry
461; SSE41-NEXT:    pmovsxbq %xmm0, %xmm2
462; SSE41-NEXT:    psrld $16, %xmm0
463; SSE41-NEXT:    pmovsxbq %xmm0, %xmm1
464; SSE41-NEXT:    movdqa %xmm2, %xmm0
465; SSE41-NEXT:    retq
466;
467; AVX1-LABEL: sext_16i8_to_4i64:
468; AVX1:       # BB#0: # %entry
469; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm1
470; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
471; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm0
472; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
473; AVX1-NEXT:    retq
474;
475; AVX2-LABEL: sext_16i8_to_4i64:
476; AVX2:       # BB#0: # %entry
477; AVX2-NEXT:    vpmovsxbq %xmm0, %ymm0
478; AVX2-NEXT:    retq
479;
480; AVX512-LABEL: sext_16i8_to_4i64:
481; AVX512:       # BB#0: # %entry
482; AVX512-NEXT:    vpmovsxbq %xmm0, %ymm0
483; AVX512-NEXT:    retq
484;
485; X32-SSE41-LABEL: sext_16i8_to_4i64:
486; X32-SSE41:       # BB#0: # %entry
487; X32-SSE41-NEXT:    pmovsxbq %xmm0, %xmm2
488; X32-SSE41-NEXT:    psrld $16, %xmm0
489; X32-SSE41-NEXT:    pmovsxbq %xmm0, %xmm1
490; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
491; X32-SSE41-NEXT:    retl
492entry:
493  %B = shufflevector <16 x i8> %A, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
494  %C = sext <4 x i8> %B to <4 x i64>
495  ret <4 x i64> %C
496}
497
498define <8 x i64> @sext_16i8_to_8i64(<16 x i8> %A) nounwind uwtable readnone ssp {
499; SSE2-LABEL: sext_16i8_to_8i64:
500; SSE2:       # BB#0: # %entry
501; SSE2-NEXT:    movdqa %xmm0, %xmm1
502; 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]
503; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
504; SSE2-NEXT:    movdqa %xmm0, %xmm2
505; SSE2-NEXT:    psrad $31, %xmm2
506; SSE2-NEXT:    psrad $24, %xmm0
507; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
508; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,2,3]
509; SSE2-NEXT:    psrld $16, %xmm1
510; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
511; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
512; SSE2-NEXT:    movdqa %xmm1, %xmm2
513; SSE2-NEXT:    psrad $31, %xmm2
514; SSE2-NEXT:    psrad $24, %xmm1
515; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
516; 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]
517; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
518; SSE2-NEXT:    movdqa %xmm2, %xmm4
519; SSE2-NEXT:    psrad $31, %xmm4
520; SSE2-NEXT:    psrad $24, %xmm2
521; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
522; SSE2-NEXT:    psrld $16, %xmm3
523; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
524; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3]
525; SSE2-NEXT:    movdqa %xmm3, %xmm4
526; SSE2-NEXT:    psrad $31, %xmm4
527; SSE2-NEXT:    psrad $24, %xmm3
528; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
529; SSE2-NEXT:    retq
530;
531; SSSE3-LABEL: sext_16i8_to_8i64:
532; SSSE3:       # BB#0: # %entry
533; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = <u,u,u,2,u,u,u,3,u,u,u,255,u,u,u,255>
534; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]
535; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,2,3]
536; SSSE3-NEXT:    movdqa %xmm0, %xmm1
537; SSSE3-NEXT:    pshufb %xmm2, %xmm1
538; SSSE3-NEXT:    movdqa %xmm1, %xmm0
539; SSSE3-NEXT:    psrad $31, %xmm0
540; SSSE3-NEXT:    psrad $24, %xmm1
541; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
542; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3]
543; SSSE3-NEXT:    movdqa %xmm0, %xmm4
544; SSSE3-NEXT:    psrad $31, %xmm4
545; SSSE3-NEXT:    psrad $24, %xmm0
546; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
547; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]
548; SSSE3-NEXT:    pshufb %xmm2, %xmm3
549; SSSE3-NEXT:    movdqa %xmm3, %xmm2
550; SSSE3-NEXT:    psrad $31, %xmm2
551; SSSE3-NEXT:    psrad $24, %xmm3
552; SSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
553; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3]
554; SSSE3-NEXT:    movdqa %xmm2, %xmm4
555; SSSE3-NEXT:    psrad $31, %xmm4
556; SSSE3-NEXT:    psrad $24, %xmm2
557; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
558; SSSE3-NEXT:    retq
559;
560; SSE41-LABEL: sext_16i8_to_8i64:
561; SSE41:       # BB#0: # %entry
562; SSE41-NEXT:    pmovsxbq %xmm0, %xmm4
563; SSE41-NEXT:    movdqa %xmm0, %xmm1
564; SSE41-NEXT:    psrld $16, %xmm1
565; SSE41-NEXT:    pmovsxbq %xmm1, %xmm1
566; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
567; SSE41-NEXT:    pmovsxbq %xmm2, %xmm2
568; SSE41-NEXT:    psrlq $48, %xmm0
569; SSE41-NEXT:    pmovsxbq %xmm0, %xmm3
570; SSE41-NEXT:    movdqa %xmm4, %xmm0
571; SSE41-NEXT:    retq
572;
573; AVX1-LABEL: sext_16i8_to_8i64:
574; AVX1:       # BB#0: # %entry
575; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm1
576; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm2
577; AVX1-NEXT:    vpmovsxbq %xmm2, %xmm2
578; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm2
579; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
580; AVX1-NEXT:    vpmovsxbq %xmm1, %xmm1
581; AVX1-NEXT:    vpsrlq $48, %xmm0, %xmm0
582; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm0
583; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm1
584; AVX1-NEXT:    vmovaps %ymm2, %ymm0
585; AVX1-NEXT:    retq
586;
587; AVX2-LABEL: sext_16i8_to_8i64:
588; AVX2:       # BB#0: # %entry
589; AVX2-NEXT:    vpmovsxbq %xmm0, %ymm2
590; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
591; AVX2-NEXT:    vpmovsxbq %xmm0, %ymm1
592; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
593; AVX2-NEXT:    retq
594;
595; AVX512-LABEL: sext_16i8_to_8i64:
596; AVX512:       # BB#0: # %entry
597; AVX512-NEXT:    vpmovsxbq %xmm0, %zmm0
598; AVX512-NEXT:    retq
599;
600; X32-SSE41-LABEL: sext_16i8_to_8i64:
601; X32-SSE41:       # BB#0: # %entry
602; X32-SSE41-NEXT:    pmovsxbq %xmm0, %xmm4
603; X32-SSE41-NEXT:    movdqa %xmm0, %xmm1
604; X32-SSE41-NEXT:    psrld $16, %xmm1
605; X32-SSE41-NEXT:    pmovsxbq %xmm1, %xmm1
606; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
607; X32-SSE41-NEXT:    pmovsxbq %xmm2, %xmm2
608; X32-SSE41-NEXT:    psrlq $48, %xmm0
609; X32-SSE41-NEXT:    pmovsxbq %xmm0, %xmm3
610; X32-SSE41-NEXT:    movdqa %xmm4, %xmm0
611; X32-SSE41-NEXT:    retl
612entry:
613  %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>
614  %C = sext <8 x i8> %B to <8 x i64>
615  ret <8 x i64> %C
616}
617
618define <4 x i32> @sext_8i16_to_4i32(<8 x i16> %A) nounwind uwtable readnone ssp {
619; SSE2-LABEL: sext_8i16_to_4i32:
620; SSE2:       # BB#0: # %entry
621; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
622; SSE2-NEXT:    psrad $16, %xmm0
623; SSE2-NEXT:    retq
624;
625; SSSE3-LABEL: sext_8i16_to_4i32:
626; SSSE3:       # BB#0: # %entry
627; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
628; SSSE3-NEXT:    psrad $16, %xmm0
629; SSSE3-NEXT:    retq
630;
631; SSE41-LABEL: sext_8i16_to_4i32:
632; SSE41:       # BB#0: # %entry
633; SSE41-NEXT:    pmovsxwd %xmm0, %xmm0
634; SSE41-NEXT:    retq
635;
636; AVX-LABEL: sext_8i16_to_4i32:
637; AVX:       # BB#0: # %entry
638; AVX-NEXT:    vpmovsxwd %xmm0, %xmm0
639; AVX-NEXT:    retq
640;
641; X32-SSE41-LABEL: sext_8i16_to_4i32:
642; X32-SSE41:       # BB#0: # %entry
643; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm0
644; X32-SSE41-NEXT:    retl
645entry:
646  %B = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
647  %C = sext <4 x i16> %B to <4 x i32>
648  ret <4 x i32> %C
649}
650
651define <8 x i32> @sext_8i16_to_8i32(<8 x i16> %A) nounwind uwtable readnone ssp {
652; SSE2-LABEL: sext_8i16_to_8i32:
653; SSE2:       # BB#0: # %entry
654; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
655; SSE2-NEXT:    psrad $16, %xmm2
656; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
657; SSE2-NEXT:    psrad $16, %xmm1
658; SSE2-NEXT:    movdqa %xmm2, %xmm0
659; SSE2-NEXT:    retq
660;
661; SSSE3-LABEL: sext_8i16_to_8i32:
662; SSSE3:       # BB#0: # %entry
663; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
664; SSSE3-NEXT:    psrad $16, %xmm2
665; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
666; SSSE3-NEXT:    psrad $16, %xmm1
667; SSSE3-NEXT:    movdqa %xmm2, %xmm0
668; SSSE3-NEXT:    retq
669;
670; SSE41-LABEL: sext_8i16_to_8i32:
671; SSE41:       # BB#0: # %entry
672; SSE41-NEXT:    pmovsxwd %xmm0, %xmm2
673; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
674; SSE41-NEXT:    pmovsxwd %xmm0, %xmm1
675; SSE41-NEXT:    movdqa %xmm2, %xmm0
676; SSE41-NEXT:    retq
677;
678; AVX1-LABEL: sext_8i16_to_8i32:
679; AVX1:       # BB#0: # %entry
680; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
681; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
682; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
683; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
684; AVX1-NEXT:    retq
685;
686; AVX2-LABEL: sext_8i16_to_8i32:
687; AVX2:       # BB#0: # %entry
688; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
689; AVX2-NEXT:    retq
690;
691; AVX512-LABEL: sext_8i16_to_8i32:
692; AVX512:       # BB#0: # %entry
693; AVX512-NEXT:    vpmovsxwd %xmm0, %ymm0
694; AVX512-NEXT:    retq
695;
696; X32-SSE41-LABEL: sext_8i16_to_8i32:
697; X32-SSE41:       # BB#0: # %entry
698; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm2
699; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
700; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm1
701; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
702; X32-SSE41-NEXT:    retl
703entry:
704  %B = sext <8 x i16> %A to <8 x i32>
705  ret <8 x i32> %B
706}
707
708define <16 x i32> @sext_16i16_to_16i32(<16 x i16> %A) nounwind uwtable readnone ssp {
709; SSE2-LABEL: sext_16i16_to_16i32:
710; SSE2:       # BB#0: # %entry
711; SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]
712; SSE2-NEXT:    psrad $16, %xmm4
713; SSE2-NEXT:    punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7]
714; SSE2-NEXT:    psrad $16, %xmm5
715; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
716; SSE2-NEXT:    psrad $16, %xmm2
717; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
718; SSE2-NEXT:    psrad $16, %xmm3
719; SSE2-NEXT:    movdqa %xmm4, %xmm0
720; SSE2-NEXT:    movdqa %xmm5, %xmm1
721; SSE2-NEXT:    retq
722;
723; SSSE3-LABEL: sext_16i16_to_16i32:
724; SSSE3:       # BB#0: # %entry
725; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]
726; SSSE3-NEXT:    psrad $16, %xmm4
727; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7]
728; SSSE3-NEXT:    psrad $16, %xmm5
729; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
730; SSSE3-NEXT:    psrad $16, %xmm2
731; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
732; SSSE3-NEXT:    psrad $16, %xmm3
733; SSSE3-NEXT:    movdqa %xmm4, %xmm0
734; SSSE3-NEXT:    movdqa %xmm5, %xmm1
735; SSSE3-NEXT:    retq
736;
737; SSE41-LABEL: sext_16i16_to_16i32:
738; SSE41:       # BB#0: # %entry
739; SSE41-NEXT:    pmovsxwd %xmm0, %xmm5
740; SSE41-NEXT:    pmovsxwd %xmm1, %xmm2
741; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
742; SSE41-NEXT:    pmovsxwd %xmm0, %xmm4
743; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
744; SSE41-NEXT:    pmovsxwd %xmm0, %xmm3
745; SSE41-NEXT:    movdqa %xmm5, %xmm0
746; SSE41-NEXT:    movdqa %xmm4, %xmm1
747; SSE41-NEXT:    retq
748;
749; AVX1-LABEL: sext_16i16_to_16i32:
750; AVX1:       # BB#0: # %entry
751; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
752; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
753; AVX1-NEXT:    vpmovsxwd %xmm2, %xmm2
754; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm2
755; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
756; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
757; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
758; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
759; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm1
760; AVX1-NEXT:    vmovaps %ymm2, %ymm0
761; AVX1-NEXT:    retq
762;
763; AVX2-LABEL: sext_16i16_to_16i32:
764; AVX2:       # BB#0: # %entry
765; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm2
766; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
767; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm1
768; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
769; AVX2-NEXT:    retq
770;
771; AVX512-LABEL: sext_16i16_to_16i32:
772; AVX512:       # BB#0: # %entry
773; AVX512-NEXT:    vpmovsxwd %ymm0, %zmm0
774; AVX512-NEXT:    retq
775;
776; X32-SSE41-LABEL: sext_16i16_to_16i32:
777; X32-SSE41:       # BB#0: # %entry
778; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm5
779; X32-SSE41-NEXT:    pmovsxwd %xmm1, %xmm2
780; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
781; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm4
782; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
783; X32-SSE41-NEXT:    pmovsxwd %xmm0, %xmm3
784; X32-SSE41-NEXT:    movdqa %xmm5, %xmm0
785; X32-SSE41-NEXT:    movdqa %xmm4, %xmm1
786; X32-SSE41-NEXT:    retl
787entry:
788  %B = sext <16 x i16> %A to <16 x i32>
789  ret <16 x i32> %B
790}
791
792define <2 x i64> @sext_8i16_to_2i64(<8 x i16> %A) nounwind uwtable readnone ssp {
793; SSE2-LABEL: sext_8i16_to_2i64:
794; SSE2:       # BB#0: # %entry
795; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
796; SSE2-NEXT:    movdqa %xmm0, %xmm1
797; SSE2-NEXT:    psrad $31, %xmm1
798; SSE2-NEXT:    psrad $16, %xmm0
799; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
800; SSE2-NEXT:    retq
801;
802; SSSE3-LABEL: sext_8i16_to_2i64:
803; SSSE3:       # BB#0: # %entry
804; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
805; SSSE3-NEXT:    movdqa %xmm0, %xmm1
806; SSSE3-NEXT:    psrad $31, %xmm1
807; SSSE3-NEXT:    psrad $16, %xmm0
808; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
809; SSSE3-NEXT:    retq
810;
811; SSE41-LABEL: sext_8i16_to_2i64:
812; SSE41:       # BB#0: # %entry
813; SSE41-NEXT:    pmovsxwq %xmm0, %xmm0
814; SSE41-NEXT:    retq
815;
816; AVX-LABEL: sext_8i16_to_2i64:
817; AVX:       # BB#0: # %entry
818; AVX-NEXT:    vpmovsxwq %xmm0, %xmm0
819; AVX-NEXT:    retq
820;
821; X32-SSE41-LABEL: sext_8i16_to_2i64:
822; X32-SSE41:       # BB#0: # %entry
823; X32-SSE41-NEXT:    pmovsxwq %xmm0, %xmm0
824; X32-SSE41-NEXT:    retl
825entry:
826  %B = shufflevector <8 x i16> %A, <8 x i16> undef, <2 x i32> <i32 0, i32 1>
827  %C = sext <2 x i16> %B to <2 x i64>
828  ret <2 x i64> %C
829}
830
831define <4 x i64> @sext_8i16_to_4i64(<8 x i16> %A) nounwind uwtable readnone ssp {
832; SSE2-LABEL: sext_8i16_to_4i64:
833; SSE2:       # BB#0: # %entry
834; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
835; SSE2-NEXT:    movdqa %xmm2, %xmm1
836; SSE2-NEXT:    psrad $31, %xmm1
837; SSE2-NEXT:    psrad $16, %xmm2
838; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
839; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
840; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
841; SSE2-NEXT:    movdqa %xmm1, %xmm0
842; SSE2-NEXT:    psrad $31, %xmm0
843; SSE2-NEXT:    psrad $16, %xmm1
844; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
845; SSE2-NEXT:    movdqa %xmm2, %xmm0
846; SSE2-NEXT:    retq
847;
848; SSSE3-LABEL: sext_8i16_to_4i64:
849; SSSE3:       # BB#0: # %entry
850; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
851; SSSE3-NEXT:    movdqa %xmm2, %xmm1
852; SSSE3-NEXT:    psrad $31, %xmm1
853; SSSE3-NEXT:    psrad $16, %xmm2
854; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
855; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
856; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
857; SSSE3-NEXT:    movdqa %xmm1, %xmm0
858; SSSE3-NEXT:    psrad $31, %xmm0
859; SSSE3-NEXT:    psrad $16, %xmm1
860; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
861; SSSE3-NEXT:    movdqa %xmm2, %xmm0
862; SSSE3-NEXT:    retq
863;
864; SSE41-LABEL: sext_8i16_to_4i64:
865; SSE41:       # BB#0: # %entry
866; SSE41-NEXT:    pmovsxwq %xmm0, %xmm2
867; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
868; SSE41-NEXT:    pmovsxwq %xmm0, %xmm1
869; SSE41-NEXT:    movdqa %xmm2, %xmm0
870; SSE41-NEXT:    retq
871;
872; AVX1-LABEL: sext_8i16_to_4i64:
873; AVX1:       # BB#0: # %entry
874; AVX1-NEXT:    vpmovsxwq %xmm0, %xmm1
875; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
876; AVX1-NEXT:    vpmovsxwq %xmm0, %xmm0
877; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
878; AVX1-NEXT:    retq
879;
880; AVX2-LABEL: sext_8i16_to_4i64:
881; AVX2:       # BB#0: # %entry
882; AVX2-NEXT:    vpmovsxwq %xmm0, %ymm0
883; AVX2-NEXT:    retq
884;
885; AVX512-LABEL: sext_8i16_to_4i64:
886; AVX512:       # BB#0: # %entry
887; AVX512-NEXT:    vpmovsxwq %xmm0, %ymm0
888; AVX512-NEXT:    retq
889;
890; X32-SSE41-LABEL: sext_8i16_to_4i64:
891; X32-SSE41:       # BB#0: # %entry
892; X32-SSE41-NEXT:    pmovsxwq %xmm0, %xmm2
893; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
894; X32-SSE41-NEXT:    pmovsxwq %xmm0, %xmm1
895; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
896; X32-SSE41-NEXT:    retl
897entry:
898  %B = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
899  %C = sext <4 x i16> %B to <4 x i64>
900  ret <4 x i64> %C
901}
902
903define <8 x i64> @sext_8i16_to_8i64(<8 x i16> %A) nounwind uwtable readnone ssp {
904; SSE2-LABEL: sext_8i16_to_8i64:
905; SSE2:       # BB#0: # %entry
906; SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]
907; SSE2-NEXT:    movdqa %xmm4, %xmm1
908; SSE2-NEXT:    psrad $31, %xmm1
909; SSE2-NEXT:    psrad $16, %xmm4
910; SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1]
911; SSE2-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
912; SSE2-NEXT:    movdqa %xmm2, %xmm1
913; SSE2-NEXT:    psrad $31, %xmm1
914; SSE2-NEXT:    psrad $16, %xmm2
915; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
916; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
917; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
918; SSE2-NEXT:    movdqa %xmm1, %xmm3
919; SSE2-NEXT:    psrad $31, %xmm3
920; SSE2-NEXT:    psrad $16, %xmm1
921; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
922; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
923; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3]
924; SSE2-NEXT:    movdqa %xmm3, %xmm0
925; SSE2-NEXT:    psrad $31, %xmm0
926; SSE2-NEXT:    psrad $16, %xmm3
927; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1]
928; SSE2-NEXT:    movdqa %xmm4, %xmm0
929; SSE2-NEXT:    retq
930;
931; SSSE3-LABEL: sext_8i16_to_8i64:
932; SSSE3:       # BB#0: # %entry
933; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]
934; SSSE3-NEXT:    movdqa %xmm4, %xmm1
935; SSSE3-NEXT:    psrad $31, %xmm1
936; SSSE3-NEXT:    psrad $16, %xmm4
937; SSSE3-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1]
938; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
939; SSSE3-NEXT:    movdqa %xmm2, %xmm1
940; SSSE3-NEXT:    psrad $31, %xmm1
941; SSSE3-NEXT:    psrad $16, %xmm2
942; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
943; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
944; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
945; SSSE3-NEXT:    movdqa %xmm1, %xmm3
946; SSSE3-NEXT:    psrad $31, %xmm3
947; SSSE3-NEXT:    psrad $16, %xmm1
948; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
949; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
950; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3]
951; SSSE3-NEXT:    movdqa %xmm3, %xmm0
952; SSSE3-NEXT:    psrad $31, %xmm0
953; SSSE3-NEXT:    psrad $16, %xmm3
954; SSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1]
955; SSSE3-NEXT:    movdqa %xmm4, %xmm0
956; SSSE3-NEXT:    retq
957;
958; SSE41-LABEL: sext_8i16_to_8i64:
959; SSE41:       # BB#0: # %entry
960; SSE41-NEXT:    pmovsxwq %xmm0, %xmm4
961; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
962; SSE41-NEXT:    pmovsxwq %xmm1, %xmm1
963; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
964; SSE41-NEXT:    pmovsxwq %xmm2, %xmm2
965; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
966; SSE41-NEXT:    pmovsxwq %xmm0, %xmm3
967; SSE41-NEXT:    movdqa %xmm4, %xmm0
968; SSE41-NEXT:    retq
969;
970; AVX1-LABEL: sext_8i16_to_8i64:
971; AVX1:       # BB#0: # %entry
972; AVX1-NEXT:    vpmovsxwq %xmm0, %xmm1
973; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
974; AVX1-NEXT:    vpmovsxwq %xmm2, %xmm2
975; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm2
976; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
977; AVX1-NEXT:    vpmovsxwq %xmm1, %xmm1
978; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
979; AVX1-NEXT:    vpmovsxwq %xmm0, %xmm0
980; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm1
981; AVX1-NEXT:    vmovaps %ymm2, %ymm0
982; AVX1-NEXT:    retq
983;
984; AVX2-LABEL: sext_8i16_to_8i64:
985; AVX2:       # BB#0: # %entry
986; AVX2-NEXT:    vpmovsxwq %xmm0, %ymm2
987; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
988; AVX2-NEXT:    vpmovsxwq %xmm0, %ymm1
989; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
990; AVX2-NEXT:    retq
991;
992; AVX512-LABEL: sext_8i16_to_8i64:
993; AVX512:       # BB#0: # %entry
994; AVX512-NEXT:    vpmovsxwq %xmm0, %zmm0
995; AVX512-NEXT:    retq
996;
997; X32-SSE41-LABEL: sext_8i16_to_8i64:
998; X32-SSE41:       # BB#0: # %entry
999; X32-SSE41-NEXT:    pmovsxwq %xmm0, %xmm4
1000; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1001; X32-SSE41-NEXT:    pmovsxwq %xmm1, %xmm1
1002; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
1003; X32-SSE41-NEXT:    pmovsxwq %xmm2, %xmm2
1004; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
1005; X32-SSE41-NEXT:    pmovsxwq %xmm0, %xmm3
1006; X32-SSE41-NEXT:    movdqa %xmm4, %xmm0
1007; X32-SSE41-NEXT:    retl
1008entry:
1009  %B = sext <8 x i16> %A to <8 x i64>
1010  ret <8 x i64> %B
1011}
1012
1013define <2 x i64> @sext_4i32_to_2i64(<4 x i32> %A) nounwind uwtable readnone ssp {
1014; SSE2-LABEL: sext_4i32_to_2i64:
1015; SSE2:       # BB#0: # %entry
1016; SSE2-NEXT:    movdqa %xmm0, %xmm1
1017; SSE2-NEXT:    psrad $31, %xmm1
1018; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1019; SSE2-NEXT:    retq
1020;
1021; SSSE3-LABEL: sext_4i32_to_2i64:
1022; SSSE3:       # BB#0: # %entry
1023; SSSE3-NEXT:    movdqa %xmm0, %xmm1
1024; SSSE3-NEXT:    psrad $31, %xmm1
1025; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1026; SSSE3-NEXT:    retq
1027;
1028; SSE41-LABEL: sext_4i32_to_2i64:
1029; SSE41:       # BB#0: # %entry
1030; SSE41-NEXT:    pmovsxdq %xmm0, %xmm0
1031; SSE41-NEXT:    retq
1032;
1033; AVX-LABEL: sext_4i32_to_2i64:
1034; AVX:       # BB#0: # %entry
1035; AVX-NEXT:    vpmovsxdq %xmm0, %xmm0
1036; AVX-NEXT:    retq
1037;
1038; X32-SSE41-LABEL: sext_4i32_to_2i64:
1039; X32-SSE41:       # BB#0: # %entry
1040; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm0
1041; X32-SSE41-NEXT:    retl
1042entry:
1043  %B = shufflevector <4 x i32> %A, <4 x i32> undef, <2 x i32> <i32 0, i32 1>
1044  %C = sext <2 x i32> %B to <2 x i64>
1045  ret <2 x i64> %C
1046}
1047
1048define <4 x i64> @sext_4i32_to_4i64(<4 x i32> %A) nounwind uwtable readnone ssp {
1049; SSE2-LABEL: sext_4i32_to_4i64:
1050; SSE2:       # BB#0: # %entry
1051; SSE2-NEXT:    movdqa %xmm0, %xmm2
1052; SSE2-NEXT:    psrad $31, %xmm2
1053; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1054; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1055; SSE2-NEXT:    movdqa %xmm1, %xmm2
1056; SSE2-NEXT:    psrad $31, %xmm2
1057; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1058; SSE2-NEXT:    retq
1059;
1060; SSSE3-LABEL: sext_4i32_to_4i64:
1061; SSSE3:       # BB#0: # %entry
1062; SSSE3-NEXT:    movdqa %xmm0, %xmm2
1063; SSSE3-NEXT:    psrad $31, %xmm2
1064; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1065; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1066; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1067; SSSE3-NEXT:    psrad $31, %xmm2
1068; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1069; SSSE3-NEXT:    retq
1070;
1071; SSE41-LABEL: sext_4i32_to_4i64:
1072; SSE41:       # BB#0: # %entry
1073; SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
1074; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1075; SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
1076; SSE41-NEXT:    movdqa %xmm2, %xmm0
1077; SSE41-NEXT:    retq
1078;
1079; AVX1-LABEL: sext_4i32_to_4i64:
1080; AVX1:       # BB#0: # %entry
1081; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
1082; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1083; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
1084; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1085; AVX1-NEXT:    retq
1086;
1087; AVX2-LABEL: sext_4i32_to_4i64:
1088; AVX2:       # BB#0: # %entry
1089; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
1090; AVX2-NEXT:    retq
1091;
1092; AVX512-LABEL: sext_4i32_to_4i64:
1093; AVX512:       # BB#0: # %entry
1094; AVX512-NEXT:    vpmovsxdq %xmm0, %ymm0
1095; AVX512-NEXT:    retq
1096;
1097; X32-SSE41-LABEL: sext_4i32_to_4i64:
1098; X32-SSE41:       # BB#0: # %entry
1099; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
1100; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1101; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
1102; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
1103; X32-SSE41-NEXT:    retl
1104entry:
1105  %B = sext <4 x i32> %A to <4 x i64>
1106  ret <4 x i64> %B
1107}
1108
1109define <8 x i64> @sext_8i32_to_8i64(<8 x i32> %A) nounwind uwtable readnone ssp {
1110; SSE2-LABEL: sext_8i32_to_8i64:
1111; SSE2:       # BB#0: # %entry
1112; SSE2-NEXT:    movdqa %xmm1, %xmm2
1113; SSE2-NEXT:    movdqa %xmm0, %xmm3
1114; SSE2-NEXT:    psrad $31, %xmm3
1115; SSE2-NEXT:    movdqa %xmm2, %xmm4
1116; SSE2-NEXT:    psrad $31, %xmm4
1117; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1118; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1119; SSE2-NEXT:    movdqa %xmm1, %xmm3
1120; SSE2-NEXT:    psrad $31, %xmm3
1121; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
1122; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[2,3,0,1]
1123; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
1124; SSE2-NEXT:    movdqa %xmm3, %xmm4
1125; SSE2-NEXT:    psrad $31, %xmm4
1126; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
1127; SSE2-NEXT:    retq
1128;
1129; SSSE3-LABEL: sext_8i32_to_8i64:
1130; SSSE3:       # BB#0: # %entry
1131; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1132; SSSE3-NEXT:    movdqa %xmm0, %xmm3
1133; SSSE3-NEXT:    psrad $31, %xmm3
1134; SSSE3-NEXT:    movdqa %xmm2, %xmm4
1135; SSSE3-NEXT:    psrad $31, %xmm4
1136; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1137; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1138; SSSE3-NEXT:    movdqa %xmm1, %xmm3
1139; SSSE3-NEXT:    psrad $31, %xmm3
1140; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
1141; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[2,3,0,1]
1142; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
1143; SSSE3-NEXT:    movdqa %xmm3, %xmm4
1144; SSSE3-NEXT:    psrad $31, %xmm4
1145; SSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
1146; SSSE3-NEXT:    retq
1147;
1148; SSE41-LABEL: sext_8i32_to_8i64:
1149; SSE41:       # BB#0: # %entry
1150; SSE41-NEXT:    pmovsxdq %xmm0, %xmm5
1151; SSE41-NEXT:    pmovsxdq %xmm1, %xmm2
1152; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1153; SSE41-NEXT:    pmovsxdq %xmm0, %xmm4
1154; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1155; SSE41-NEXT:    pmovsxdq %xmm0, %xmm3
1156; SSE41-NEXT:    movdqa %xmm5, %xmm0
1157; SSE41-NEXT:    movdqa %xmm4, %xmm1
1158; SSE41-NEXT:    retq
1159;
1160; AVX1-LABEL: sext_8i32_to_8i64:
1161; AVX1:       # BB#0: # %entry
1162; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
1163; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
1164; AVX1-NEXT:    vpmovsxdq %xmm2, %xmm2
1165; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm2
1166; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1167; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
1168; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1169; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
1170; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm1
1171; AVX1-NEXT:    vmovaps %ymm2, %ymm0
1172; AVX1-NEXT:    retq
1173;
1174; AVX2-LABEL: sext_8i32_to_8i64:
1175; AVX2:       # BB#0: # %entry
1176; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm2
1177; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1178; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm1
1179; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
1180; AVX2-NEXT:    retq
1181;
1182; AVX512-LABEL: sext_8i32_to_8i64:
1183; AVX512:       # BB#0: # %entry
1184; AVX512-NEXT:    vpmovsxdq %ymm0, %zmm0
1185; AVX512-NEXT:    retq
1186;
1187; X32-SSE41-LABEL: sext_8i32_to_8i64:
1188; X32-SSE41:       # BB#0: # %entry
1189; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm5
1190; X32-SSE41-NEXT:    pmovsxdq %xmm1, %xmm2
1191; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1192; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm4
1193; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1194; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm3
1195; X32-SSE41-NEXT:    movdqa %xmm5, %xmm0
1196; X32-SSE41-NEXT:    movdqa %xmm4, %xmm1
1197; X32-SSE41-NEXT:    retl
1198entry:
1199  %B = sext <8 x i32> %A to <8 x i64>
1200  ret <8 x i64> %B
1201}
1202
1203define <2 x i64> @load_sext_2i1_to_2i64(<2 x i1> *%ptr) {
1204; SSE-LABEL: load_sext_2i1_to_2i64:
1205; SSE:       # BB#0: # %entry
1206; SSE-NEXT:    movzbl (%rdi), %eax
1207; SSE-NEXT:    movq %rax, %rcx
1208; SSE-NEXT:    shlq $62, %rcx
1209; SSE-NEXT:    sarq $63, %rcx
1210; SSE-NEXT:    movq %rcx, %xmm1
1211; SSE-NEXT:    shlq $63, %rax
1212; SSE-NEXT:    sarq $63, %rax
1213; SSE-NEXT:    movq %rax, %xmm0
1214; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1215; SSE-NEXT:    retq
1216;
1217; AVX1-LABEL: load_sext_2i1_to_2i64:
1218; AVX1:       # BB#0: # %entry
1219; AVX1-NEXT:    movzbl (%rdi), %eax
1220; AVX1-NEXT:    movq %rax, %rcx
1221; AVX1-NEXT:    shlq $62, %rcx
1222; AVX1-NEXT:    sarq $63, %rcx
1223; AVX1-NEXT:    vmovq %rcx, %xmm0
1224; AVX1-NEXT:    shlq $63, %rax
1225; AVX1-NEXT:    sarq $63, %rax
1226; AVX1-NEXT:    vmovq %rax, %xmm1
1227; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1228; AVX1-NEXT:    retq
1229;
1230; AVX2-LABEL: load_sext_2i1_to_2i64:
1231; AVX2:       # BB#0: # %entry
1232; AVX2-NEXT:    movzbl (%rdi), %eax
1233; AVX2-NEXT:    movq %rax, %rcx
1234; AVX2-NEXT:    shlq $62, %rcx
1235; AVX2-NEXT:    sarq $63, %rcx
1236; AVX2-NEXT:    vmovq %rcx, %xmm0
1237; AVX2-NEXT:    shlq $63, %rax
1238; AVX2-NEXT:    sarq $63, %rax
1239; AVX2-NEXT:    vmovq %rax, %xmm1
1240; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1241; AVX2-NEXT:    retq
1242;
1243; AVX512F-LABEL: load_sext_2i1_to_2i64:
1244; AVX512F:       # BB#0: # %entry
1245; AVX512F-NEXT:    movzbl (%rdi), %eax
1246; AVX512F-NEXT:    kmovw %eax, %k1
1247; AVX512F-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1248; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
1249; AVX512F-NEXT:    vzeroupper
1250; AVX512F-NEXT:    retq
1251;
1252; AVX512BW-LABEL: load_sext_2i1_to_2i64:
1253; AVX512BW:       # BB#0: # %entry
1254; AVX512BW-NEXT:    movzbl (%rdi), %eax
1255; AVX512BW-NEXT:    kmovd %eax, %k1
1256; AVX512BW-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1257; AVX512BW-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
1258; AVX512BW-NEXT:    vzeroupper
1259; AVX512BW-NEXT:    retq
1260;
1261; X32-SSE41-LABEL: load_sext_2i1_to_2i64:
1262; X32-SSE41:       # BB#0: # %entry
1263; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1264; X32-SSE41-NEXT:    movzbl (%eax), %eax
1265; X32-SSE41-NEXT:    movl %eax, %ecx
1266; X32-SSE41-NEXT:    shll $31, %ecx
1267; X32-SSE41-NEXT:    sarl $31, %ecx
1268; X32-SSE41-NEXT:    movd %ecx, %xmm0
1269; X32-SSE41-NEXT:    pinsrd $1, %ecx, %xmm0
1270; X32-SSE41-NEXT:    shll $30, %eax
1271; X32-SSE41-NEXT:    sarl $31, %eax
1272; X32-SSE41-NEXT:    pinsrd $2, %eax, %xmm0
1273; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm0
1274; X32-SSE41-NEXT:    retl
1275entry:
1276 %X = load <2 x i1>, <2 x i1>* %ptr
1277 %Y = sext <2 x i1> %X to <2 x i64>
1278 ret <2 x i64> %Y
1279}
1280
1281define <2 x i64> @load_sext_2i8_to_2i64(<2 x i8> *%ptr) {
1282; SSE2-LABEL: load_sext_2i8_to_2i64:
1283; SSE2:       # BB#0: # %entry
1284; SSE2-NEXT:    movzwl (%rdi), %eax
1285; SSE2-NEXT:    movd %eax, %xmm0
1286; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1287; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1288; SSE2-NEXT:    movdqa %xmm0, %xmm1
1289; SSE2-NEXT:    psrad $31, %xmm1
1290; SSE2-NEXT:    psrad $24, %xmm0
1291; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1292; SSE2-NEXT:    retq
1293;
1294; SSSE3-LABEL: load_sext_2i8_to_2i64:
1295; SSSE3:       # BB#0: # %entry
1296; SSSE3-NEXT:    movzwl (%rdi), %eax
1297; SSSE3-NEXT:    movd %eax, %xmm0
1298; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1299; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1300; SSSE3-NEXT:    movdqa %xmm0, %xmm1
1301; SSSE3-NEXT:    psrad $31, %xmm1
1302; SSSE3-NEXT:    psrad $24, %xmm0
1303; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1304; SSSE3-NEXT:    retq
1305;
1306; SSE41-LABEL: load_sext_2i8_to_2i64:
1307; SSE41:       # BB#0: # %entry
1308; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
1309; SSE41-NEXT:    retq
1310;
1311; AVX-LABEL: load_sext_2i8_to_2i64:
1312; AVX:       # BB#0: # %entry
1313; AVX-NEXT:    vpmovsxbq (%rdi), %xmm0
1314; AVX-NEXT:    retq
1315;
1316; X32-SSE41-LABEL: load_sext_2i8_to_2i64:
1317; X32-SSE41:       # BB#0: # %entry
1318; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1319; X32-SSE41-NEXT:    pmovsxbq (%eax), %xmm0
1320; X32-SSE41-NEXT:    retl
1321entry:
1322 %X = load <2 x i8>, <2 x i8>* %ptr
1323 %Y = sext <2 x i8> %X to <2 x i64>
1324 ret <2 x i64> %Y
1325}
1326
1327define <4 x i32> @load_sext_4i1_to_4i32(<4 x i1> *%ptr) {
1328; SSE2-LABEL: load_sext_4i1_to_4i32:
1329; SSE2:       # BB#0: # %entry
1330; SSE2-NEXT:    movzbl (%rdi), %eax
1331; SSE2-NEXT:    movq %rax, %rcx
1332; SSE2-NEXT:    shlq $60, %rcx
1333; SSE2-NEXT:    sarq $63, %rcx
1334; SSE2-NEXT:    movd %ecx, %xmm0
1335; SSE2-NEXT:    movq %rax, %rcx
1336; SSE2-NEXT:    shlq $61, %rcx
1337; SSE2-NEXT:    sarq $63, %rcx
1338; SSE2-NEXT:    movd %ecx, %xmm1
1339; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1340; SSE2-NEXT:    movq %rax, %rcx
1341; SSE2-NEXT:    shlq $62, %rcx
1342; SSE2-NEXT:    sarq $63, %rcx
1343; SSE2-NEXT:    movd %ecx, %xmm2
1344; SSE2-NEXT:    shlq $63, %rax
1345; SSE2-NEXT:    sarq $63, %rax
1346; SSE2-NEXT:    movd %eax, %xmm0
1347; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1348; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1349; SSE2-NEXT:    retq
1350;
1351; SSSE3-LABEL: load_sext_4i1_to_4i32:
1352; SSSE3:       # BB#0: # %entry
1353; SSSE3-NEXT:    movzbl (%rdi), %eax
1354; SSSE3-NEXT:    movq %rax, %rcx
1355; SSSE3-NEXT:    shlq $60, %rcx
1356; SSSE3-NEXT:    sarq $63, %rcx
1357; SSSE3-NEXT:    movd %ecx, %xmm0
1358; SSSE3-NEXT:    movq %rax, %rcx
1359; SSSE3-NEXT:    shlq $61, %rcx
1360; SSSE3-NEXT:    sarq $63, %rcx
1361; SSSE3-NEXT:    movd %ecx, %xmm1
1362; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1363; SSSE3-NEXT:    movq %rax, %rcx
1364; SSSE3-NEXT:    shlq $62, %rcx
1365; SSSE3-NEXT:    sarq $63, %rcx
1366; SSSE3-NEXT:    movd %ecx, %xmm2
1367; SSSE3-NEXT:    shlq $63, %rax
1368; SSSE3-NEXT:    sarq $63, %rax
1369; SSSE3-NEXT:    movd %eax, %xmm0
1370; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1371; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1372; SSSE3-NEXT:    retq
1373;
1374; SSE41-LABEL: load_sext_4i1_to_4i32:
1375; SSE41:       # BB#0: # %entry
1376; SSE41-NEXT:    movzbl (%rdi), %eax
1377; SSE41-NEXT:    movq %rax, %rcx
1378; SSE41-NEXT:    shlq $62, %rcx
1379; SSE41-NEXT:    sarq $63, %rcx
1380; SSE41-NEXT:    movq %rax, %rdx
1381; SSE41-NEXT:    shlq $63, %rdx
1382; SSE41-NEXT:    sarq $63, %rdx
1383; SSE41-NEXT:    movd %edx, %xmm0
1384; SSE41-NEXT:    pinsrd $1, %ecx, %xmm0
1385; SSE41-NEXT:    movq %rax, %rcx
1386; SSE41-NEXT:    shlq $61, %rcx
1387; SSE41-NEXT:    sarq $63, %rcx
1388; SSE41-NEXT:    pinsrd $2, %ecx, %xmm0
1389; SSE41-NEXT:    shlq $60, %rax
1390; SSE41-NEXT:    sarq $63, %rax
1391; SSE41-NEXT:    pinsrd $3, %eax, %xmm0
1392; SSE41-NEXT:    retq
1393;
1394; AVX1-LABEL: load_sext_4i1_to_4i32:
1395; AVX1:       # BB#0: # %entry
1396; AVX1-NEXT:    movzbl (%rdi), %eax
1397; AVX1-NEXT:    movq %rax, %rcx
1398; AVX1-NEXT:    shlq $62, %rcx
1399; AVX1-NEXT:    sarq $63, %rcx
1400; AVX1-NEXT:    movq %rax, %rdx
1401; AVX1-NEXT:    shlq $63, %rdx
1402; AVX1-NEXT:    sarq $63, %rdx
1403; AVX1-NEXT:    vmovd %edx, %xmm0
1404; AVX1-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
1405; AVX1-NEXT:    movq %rax, %rcx
1406; AVX1-NEXT:    shlq $61, %rcx
1407; AVX1-NEXT:    sarq $63, %rcx
1408; AVX1-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
1409; AVX1-NEXT:    shlq $60, %rax
1410; AVX1-NEXT:    sarq $63, %rax
1411; AVX1-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
1412; AVX1-NEXT:    retq
1413;
1414; AVX2-LABEL: load_sext_4i1_to_4i32:
1415; AVX2:       # BB#0: # %entry
1416; AVX2-NEXT:    movzbl (%rdi), %eax
1417; AVX2-NEXT:    movq %rax, %rcx
1418; AVX2-NEXT:    shlq $62, %rcx
1419; AVX2-NEXT:    sarq $63, %rcx
1420; AVX2-NEXT:    movq %rax, %rdx
1421; AVX2-NEXT:    shlq $63, %rdx
1422; AVX2-NEXT:    sarq $63, %rdx
1423; AVX2-NEXT:    vmovd %edx, %xmm0
1424; AVX2-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
1425; AVX2-NEXT:    movq %rax, %rcx
1426; AVX2-NEXT:    shlq $61, %rcx
1427; AVX2-NEXT:    sarq $63, %rcx
1428; AVX2-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
1429; AVX2-NEXT:    shlq $60, %rax
1430; AVX2-NEXT:    sarq $63, %rax
1431; AVX2-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
1432; AVX2-NEXT:    retq
1433;
1434; AVX512F-LABEL: load_sext_4i1_to_4i32:
1435; AVX512F:       # BB#0: # %entry
1436; AVX512F-NEXT:    movzbl (%rdi), %eax
1437; AVX512F-NEXT:    kmovw %eax, %k1
1438; AVX512F-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1439; AVX512F-NEXT:    vpmovqd %zmm0, %ymm0
1440; AVX512F-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
1441; AVX512F-NEXT:    vzeroupper
1442; AVX512F-NEXT:    retq
1443;
1444; AVX512BW-LABEL: load_sext_4i1_to_4i32:
1445; AVX512BW:       # BB#0: # %entry
1446; AVX512BW-NEXT:    movzbl (%rdi), %eax
1447; AVX512BW-NEXT:    kmovd %eax, %k1
1448; AVX512BW-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1449; AVX512BW-NEXT:    vpmovqd %zmm0, %ymm0
1450; AVX512BW-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
1451; AVX512BW-NEXT:    vzeroupper
1452; AVX512BW-NEXT:    retq
1453;
1454; X32-SSE41-LABEL: load_sext_4i1_to_4i32:
1455; X32-SSE41:       # BB#0: # %entry
1456; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1457; X32-SSE41-NEXT:    movl (%eax), %eax
1458; X32-SSE41-NEXT:    movl %eax, %ecx
1459; X32-SSE41-NEXT:    shll $30, %ecx
1460; X32-SSE41-NEXT:    sarl $31, %ecx
1461; X32-SSE41-NEXT:    movl %eax, %edx
1462; X32-SSE41-NEXT:    shll $31, %edx
1463; X32-SSE41-NEXT:    sarl $31, %edx
1464; X32-SSE41-NEXT:    movd %edx, %xmm0
1465; X32-SSE41-NEXT:    pinsrd $1, %ecx, %xmm0
1466; X32-SSE41-NEXT:    movl %eax, %ecx
1467; X32-SSE41-NEXT:    shll $29, %ecx
1468; X32-SSE41-NEXT:    sarl $31, %ecx
1469; X32-SSE41-NEXT:    pinsrd $2, %ecx, %xmm0
1470; X32-SSE41-NEXT:    shll $28, %eax
1471; X32-SSE41-NEXT:    sarl $31, %eax
1472; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm0
1473; X32-SSE41-NEXT:    retl
1474entry:
1475 %X = load <4 x i1>, <4 x i1>* %ptr
1476 %Y = sext <4 x i1> %X to <4 x i32>
1477 ret <4 x i32> %Y
1478}
1479
1480define <4 x i32> @load_sext_4i8_to_4i32(<4 x i8> *%ptr) {
1481; SSE2-LABEL: load_sext_4i8_to_4i32:
1482; SSE2:       # BB#0: # %entry
1483; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1484; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1485; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1486; SSE2-NEXT:    psrad $24, %xmm0
1487; SSE2-NEXT:    retq
1488;
1489; SSSE3-LABEL: load_sext_4i8_to_4i32:
1490; SSSE3:       # BB#0: # %entry
1491; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1492; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1493; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1494; SSSE3-NEXT:    psrad $24, %xmm0
1495; SSSE3-NEXT:    retq
1496;
1497; SSE41-LABEL: load_sext_4i8_to_4i32:
1498; SSE41:       # BB#0: # %entry
1499; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
1500; SSE41-NEXT:    retq
1501;
1502; AVX-LABEL: load_sext_4i8_to_4i32:
1503; AVX:       # BB#0: # %entry
1504; AVX-NEXT:    vpmovsxbd (%rdi), %xmm0
1505; AVX-NEXT:    retq
1506;
1507; X32-SSE41-LABEL: load_sext_4i8_to_4i32:
1508; X32-SSE41:       # BB#0: # %entry
1509; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1510; X32-SSE41-NEXT:    pmovsxbd (%eax), %xmm0
1511; X32-SSE41-NEXT:    retl
1512entry:
1513 %X = load <4 x i8>, <4 x i8>* %ptr
1514 %Y = sext <4 x i8> %X to <4 x i32>
1515 ret <4 x i32> %Y
1516}
1517
1518define <4 x i64> @load_sext_4i1_to_4i64(<4 x i1> *%ptr) {
1519; SSE2-LABEL: load_sext_4i1_to_4i64:
1520; SSE2:       # BB#0: # %entry
1521; SSE2-NEXT:    movl (%rdi), %eax
1522; SSE2-NEXT:    movl %eax, %ecx
1523; SSE2-NEXT:    shrl $3, %ecx
1524; SSE2-NEXT:    movd %ecx, %xmm0
1525; SSE2-NEXT:    movl %eax, %ecx
1526; SSE2-NEXT:    shrl $2, %ecx
1527; SSE2-NEXT:    movd %ecx, %xmm1
1528; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1529; SSE2-NEXT:    movd %eax, %xmm2
1530; SSE2-NEXT:    shrl %eax
1531; SSE2-NEXT:    movd %eax, %xmm0
1532; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
1533; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
1534; SSE2-NEXT:    pand {{.*}}(%rip), %xmm2
1535; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,1,1,3]
1536; SSE2-NEXT:    psllq $63, %xmm0
1537; SSE2-NEXT:    psrad $31, %xmm0
1538; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1539; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,1,3,3]
1540; SSE2-NEXT:    psllq $63, %xmm1
1541; SSE2-NEXT:    psrad $31, %xmm1
1542; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1543; SSE2-NEXT:    retq
1544;
1545; SSSE3-LABEL: load_sext_4i1_to_4i64:
1546; SSSE3:       # BB#0: # %entry
1547; SSSE3-NEXT:    movl (%rdi), %eax
1548; SSSE3-NEXT:    movl %eax, %ecx
1549; SSSE3-NEXT:    shrl $3, %ecx
1550; SSSE3-NEXT:    movd %ecx, %xmm0
1551; SSSE3-NEXT:    movl %eax, %ecx
1552; SSSE3-NEXT:    shrl $2, %ecx
1553; SSSE3-NEXT:    movd %ecx, %xmm1
1554; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1555; SSSE3-NEXT:    movd %eax, %xmm2
1556; SSSE3-NEXT:    shrl %eax
1557; SSSE3-NEXT:    movd %eax, %xmm0
1558; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
1559; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
1560; SSSE3-NEXT:    pand {{.*}}(%rip), %xmm2
1561; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,1,1,3]
1562; SSSE3-NEXT:    psllq $63, %xmm0
1563; SSSE3-NEXT:    psrad $31, %xmm0
1564; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1565; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,1,3,3]
1566; SSSE3-NEXT:    psllq $63, %xmm1
1567; SSSE3-NEXT:    psrad $31, %xmm1
1568; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1569; SSSE3-NEXT:    retq
1570;
1571; SSE41-LABEL: load_sext_4i1_to_4i64:
1572; SSE41:       # BB#0: # %entry
1573; SSE41-NEXT:    movl (%rdi), %eax
1574; SSE41-NEXT:    movl %eax, %ecx
1575; SSE41-NEXT:    shrl %ecx
1576; SSE41-NEXT:    movd %eax, %xmm1
1577; SSE41-NEXT:    pinsrd $1, %ecx, %xmm1
1578; SSE41-NEXT:    movl %eax, %ecx
1579; SSE41-NEXT:    shrl $2, %ecx
1580; SSE41-NEXT:    pinsrd $2, %ecx, %xmm1
1581; SSE41-NEXT:    shrl $3, %eax
1582; SSE41-NEXT:    pinsrd $3, %eax, %xmm1
1583; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
1584; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero
1585; SSE41-NEXT:    psllq $63, %xmm0
1586; SSE41-NEXT:    psrad $31, %xmm0
1587; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1588; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
1589; SSE41-NEXT:    psllq $63, %xmm1
1590; SSE41-NEXT:    psrad $31, %xmm1
1591; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1592; SSE41-NEXT:    retq
1593;
1594; AVX1-LABEL: load_sext_4i1_to_4i64:
1595; AVX1:       # BB#0: # %entry
1596; AVX1-NEXT:    movzbl (%rdi), %eax
1597; AVX1-NEXT:    movq %rax, %rcx
1598; AVX1-NEXT:    shlq $62, %rcx
1599; AVX1-NEXT:    sarq $63, %rcx
1600; AVX1-NEXT:    movq %rax, %rdx
1601; AVX1-NEXT:    shlq $63, %rdx
1602; AVX1-NEXT:    sarq $63, %rdx
1603; AVX1-NEXT:    vmovd %edx, %xmm0
1604; AVX1-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
1605; AVX1-NEXT:    movq %rax, %rcx
1606; AVX1-NEXT:    shlq $61, %rcx
1607; AVX1-NEXT:    sarq $63, %rcx
1608; AVX1-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
1609; AVX1-NEXT:    shlq $60, %rax
1610; AVX1-NEXT:    sarq $63, %rax
1611; AVX1-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
1612; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
1613; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1614; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
1615; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1616; AVX1-NEXT:    retq
1617;
1618; AVX2-LABEL: load_sext_4i1_to_4i64:
1619; AVX2:       # BB#0: # %entry
1620; AVX2-NEXT:    movzbl (%rdi), %eax
1621; AVX2-NEXT:    movq %rax, %rcx
1622; AVX2-NEXT:    shlq $60, %rcx
1623; AVX2-NEXT:    sarq $63, %rcx
1624; AVX2-NEXT:    vmovq %rcx, %xmm0
1625; AVX2-NEXT:    movq %rax, %rcx
1626; AVX2-NEXT:    shlq $61, %rcx
1627; AVX2-NEXT:    sarq $63, %rcx
1628; AVX2-NEXT:    vmovq %rcx, %xmm1
1629; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1630; AVX2-NEXT:    movq %rax, %rcx
1631; AVX2-NEXT:    shlq $62, %rcx
1632; AVX2-NEXT:    sarq $63, %rcx
1633; AVX2-NEXT:    vmovq %rcx, %xmm1
1634; AVX2-NEXT:    shlq $63, %rax
1635; AVX2-NEXT:    sarq $63, %rax
1636; AVX2-NEXT:    vmovq %rax, %xmm2
1637; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1638; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1639; AVX2-NEXT:    retq
1640;
1641; AVX512F-LABEL: load_sext_4i1_to_4i64:
1642; AVX512F:       # BB#0: # %entry
1643; AVX512F-NEXT:    movzbl (%rdi), %eax
1644; AVX512F-NEXT:    kmovw %eax, %k1
1645; AVX512F-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1646; AVX512F-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
1647; AVX512F-NEXT:    retq
1648;
1649; AVX512BW-LABEL: load_sext_4i1_to_4i64:
1650; AVX512BW:       # BB#0: # %entry
1651; AVX512BW-NEXT:    movzbl (%rdi), %eax
1652; AVX512BW-NEXT:    kmovd %eax, %k1
1653; AVX512BW-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1654; AVX512BW-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
1655; AVX512BW-NEXT:    retq
1656;
1657; X32-SSE41-LABEL: load_sext_4i1_to_4i64:
1658; X32-SSE41:       # BB#0: # %entry
1659; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1660; X32-SSE41-NEXT:    movzbl (%eax), %eax
1661; X32-SSE41-NEXT:    movl %eax, %ecx
1662; X32-SSE41-NEXT:    shrl %ecx
1663; X32-SSE41-NEXT:    movd %eax, %xmm1
1664; X32-SSE41-NEXT:    pinsrd $1, %ecx, %xmm1
1665; X32-SSE41-NEXT:    movl %eax, %ecx
1666; X32-SSE41-NEXT:    shrl $2, %ecx
1667; X32-SSE41-NEXT:    pinsrd $2, %ecx, %xmm1
1668; X32-SSE41-NEXT:    shrl $3, %eax
1669; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm1
1670; X32-SSE41-NEXT:    pand {{\.LCPI.*}}, %xmm1
1671; X32-SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero
1672; X32-SSE41-NEXT:    psllq $63, %xmm0
1673; X32-SSE41-NEXT:    psrad $31, %xmm0
1674; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1675; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
1676; X32-SSE41-NEXT:    psllq $63, %xmm1
1677; X32-SSE41-NEXT:    psrad $31, %xmm1
1678; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1679; X32-SSE41-NEXT:    retl
1680entry:
1681 %X = load <4 x i1>, <4 x i1>* %ptr
1682 %Y = sext <4 x i1> %X to <4 x i64>
1683 ret <4 x i64> %Y
1684}
1685
1686define <4 x i64> @load_sext_4i8_to_4i64(<4 x i8> *%ptr) {
1687; SSE2-LABEL: load_sext_4i8_to_4i64:
1688; SSE2:       # BB#0: # %entry
1689; SSE2-NEXT:    movsbq 1(%rdi), %rax
1690; SSE2-NEXT:    movq %rax, %xmm1
1691; SSE2-NEXT:    movsbq (%rdi), %rax
1692; SSE2-NEXT:    movq %rax, %xmm0
1693; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1694; SSE2-NEXT:    movsbq 3(%rdi), %rax
1695; SSE2-NEXT:    movq %rax, %xmm2
1696; SSE2-NEXT:    movsbq 2(%rdi), %rax
1697; SSE2-NEXT:    movq %rax, %xmm1
1698; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1699; SSE2-NEXT:    retq
1700;
1701; SSSE3-LABEL: load_sext_4i8_to_4i64:
1702; SSSE3:       # BB#0: # %entry
1703; SSSE3-NEXT:    movsbq 1(%rdi), %rax
1704; SSSE3-NEXT:    movq %rax, %xmm1
1705; SSSE3-NEXT:    movsbq (%rdi), %rax
1706; SSSE3-NEXT:    movq %rax, %xmm0
1707; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1708; SSSE3-NEXT:    movsbq 3(%rdi), %rax
1709; SSSE3-NEXT:    movq %rax, %xmm2
1710; SSSE3-NEXT:    movsbq 2(%rdi), %rax
1711; SSSE3-NEXT:    movq %rax, %xmm1
1712; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1713; SSSE3-NEXT:    retq
1714;
1715; SSE41-LABEL: load_sext_4i8_to_4i64:
1716; SSE41:       # BB#0: # %entry
1717; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
1718; SSE41-NEXT:    pmovsxbq 2(%rdi), %xmm1
1719; SSE41-NEXT:    retq
1720;
1721; AVX1-LABEL: load_sext_4i8_to_4i64:
1722; AVX1:       # BB#0: # %entry
1723; AVX1-NEXT:    vpmovsxbd (%rdi), %xmm0
1724; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
1725; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1726; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
1727; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1728; AVX1-NEXT:    retq
1729;
1730; AVX2-LABEL: load_sext_4i8_to_4i64:
1731; AVX2:       # BB#0: # %entry
1732; AVX2-NEXT:    vpmovsxbq (%rdi), %ymm0
1733; AVX2-NEXT:    retq
1734;
1735; AVX512-LABEL: load_sext_4i8_to_4i64:
1736; AVX512:       # BB#0: # %entry
1737; AVX512-NEXT:    vpmovsxbq (%rdi), %ymm0
1738; AVX512-NEXT:    retq
1739;
1740; X32-SSE41-LABEL: load_sext_4i8_to_4i64:
1741; X32-SSE41:       # BB#0: # %entry
1742; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1743; X32-SSE41-NEXT:    pmovsxbq (%eax), %xmm0
1744; X32-SSE41-NEXT:    pmovsxbq 2(%eax), %xmm1
1745; X32-SSE41-NEXT:    retl
1746entry:
1747 %X = load <4 x i8>, <4 x i8>* %ptr
1748 %Y = sext <4 x i8> %X to <4 x i64>
1749 ret <4 x i64> %Y
1750}
1751
1752define <2 x i64> @load_sext_4i8_to_4i64_extract(<4 x i8> *%ptr) {
1753; SSE2-LABEL: load_sext_4i8_to_4i64_extract:
1754; SSE2:       # BB#0:
1755; SSE2-NEXT:    movsbq 3(%rdi), %rax
1756; SSE2-NEXT:    movq %rax, %xmm1
1757; SSE2-NEXT:    movsbq 2(%rdi), %rax
1758; SSE2-NEXT:    movq %rax, %xmm0
1759; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1760; SSE2-NEXT:    retq
1761;
1762; SSSE3-LABEL: load_sext_4i8_to_4i64_extract:
1763; SSSE3:       # BB#0:
1764; SSSE3-NEXT:    movsbq 3(%rdi), %rax
1765; SSSE3-NEXT:    movq %rax, %xmm1
1766; SSSE3-NEXT:    movsbq 2(%rdi), %rax
1767; SSSE3-NEXT:    movq %rax, %xmm0
1768; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1769; SSSE3-NEXT:    retq
1770;
1771; SSE41-LABEL: load_sext_4i8_to_4i64_extract:
1772; SSE41:       # BB#0:
1773; SSE41-NEXT:    pmovsxbq 2(%rdi), %xmm0
1774; SSE41-NEXT:    retq
1775;
1776; AVX1-LABEL: load_sext_4i8_to_4i64_extract:
1777; AVX1:       # BB#0:
1778; AVX1-NEXT:    vpmovsxbd (%rdi), %xmm0
1779; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1780; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
1781; AVX1-NEXT:    retq
1782;
1783; AVX2-LABEL: load_sext_4i8_to_4i64_extract:
1784; AVX2:       # BB#0:
1785; AVX2-NEXT:    vpmovsxbq (%rdi), %ymm0
1786; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1787; AVX2-NEXT:    vzeroupper
1788; AVX2-NEXT:    retq
1789;
1790; AVX512-LABEL: load_sext_4i8_to_4i64_extract:
1791; AVX512:       # BB#0:
1792; AVX512-NEXT:    vpmovsxbq (%rdi), %ymm0
1793; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm0
1794; AVX512-NEXT:    vzeroupper
1795; AVX512-NEXT:    retq
1796;
1797; X32-SSE41-LABEL: load_sext_4i8_to_4i64_extract:
1798; X32-SSE41:       # BB#0:
1799; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1800; X32-SSE41-NEXT:    pmovsxbq 2(%eax), %xmm0
1801; X32-SSE41-NEXT:    retl
1802 %ld = load <4 x i8>, <4 x i8>* %ptr
1803 %sext = sext <4 x i8> %ld to <4 x i64>
1804 %extract = shufflevector <4 x i64> %sext, <4 x i64> undef, <2 x i32> <i32 2, i32 3>
1805 ret <2 x i64> %extract
1806}
1807
1808define <8 x i16> @load_sext_8i1_to_8i16(<8 x i1> *%ptr) {
1809; SSE2-LABEL: load_sext_8i1_to_8i16:
1810; SSE2:       # BB#0: # %entry
1811; SSE2-NEXT:    movsbq (%rdi), %rax
1812; SSE2-NEXT:    movq %rax, %rcx
1813; SSE2-NEXT:    shrq $7, %rcx
1814; SSE2-NEXT:    movd %ecx, %xmm0
1815; SSE2-NEXT:    movq %rax, %rcx
1816; SSE2-NEXT:    shlq $57, %rcx
1817; SSE2-NEXT:    sarq $63, %rcx
1818; SSE2-NEXT:    movd %ecx, %xmm2
1819; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1820; SSE2-NEXT:    movq %rax, %rcx
1821; SSE2-NEXT:    shlq $58, %rcx
1822; SSE2-NEXT:    sarq $63, %rcx
1823; SSE2-NEXT:    movd %ecx, %xmm0
1824; SSE2-NEXT:    movq %rax, %rcx
1825; SSE2-NEXT:    shlq $59, %rcx
1826; SSE2-NEXT:    sarq $63, %rcx
1827; SSE2-NEXT:    movd %ecx, %xmm1
1828; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1829; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1830; SSE2-NEXT:    movq %rax, %rcx
1831; SSE2-NEXT:    shlq $60, %rcx
1832; SSE2-NEXT:    sarq $63, %rcx
1833; SSE2-NEXT:    movd %ecx, %xmm0
1834; SSE2-NEXT:    movq %rax, %rcx
1835; SSE2-NEXT:    shlq $61, %rcx
1836; SSE2-NEXT:    sarq $63, %rcx
1837; SSE2-NEXT:    movd %ecx, %xmm2
1838; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1839; SSE2-NEXT:    movq %rax, %rcx
1840; SSE2-NEXT:    shlq $62, %rcx
1841; SSE2-NEXT:    sarq $63, %rcx
1842; SSE2-NEXT:    movd %ecx, %xmm3
1843; SSE2-NEXT:    shlq $63, %rax
1844; SSE2-NEXT:    sarq $63, %rax
1845; SSE2-NEXT:    movd %eax, %xmm0
1846; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
1847; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1848; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1849; SSE2-NEXT:    retq
1850;
1851; SSSE3-LABEL: load_sext_8i1_to_8i16:
1852; SSSE3:       # BB#0: # %entry
1853; SSSE3-NEXT:    movsbq (%rdi), %rax
1854; SSSE3-NEXT:    movq %rax, %rcx
1855; SSSE3-NEXT:    shrq $7, %rcx
1856; SSSE3-NEXT:    movd %ecx, %xmm0
1857; SSSE3-NEXT:    movq %rax, %rcx
1858; SSSE3-NEXT:    shlq $57, %rcx
1859; SSSE3-NEXT:    sarq $63, %rcx
1860; SSSE3-NEXT:    movd %ecx, %xmm2
1861; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1862; SSSE3-NEXT:    movq %rax, %rcx
1863; SSSE3-NEXT:    shlq $58, %rcx
1864; SSSE3-NEXT:    sarq $63, %rcx
1865; SSSE3-NEXT:    movd %ecx, %xmm0
1866; SSSE3-NEXT:    movq %rax, %rcx
1867; SSSE3-NEXT:    shlq $59, %rcx
1868; SSSE3-NEXT:    sarq $63, %rcx
1869; SSSE3-NEXT:    movd %ecx, %xmm1
1870; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1871; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1872; SSSE3-NEXT:    movq %rax, %rcx
1873; SSSE3-NEXT:    shlq $60, %rcx
1874; SSSE3-NEXT:    sarq $63, %rcx
1875; SSSE3-NEXT:    movd %ecx, %xmm0
1876; SSSE3-NEXT:    movq %rax, %rcx
1877; SSSE3-NEXT:    shlq $61, %rcx
1878; SSSE3-NEXT:    sarq $63, %rcx
1879; SSSE3-NEXT:    movd %ecx, %xmm2
1880; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1881; SSSE3-NEXT:    movq %rax, %rcx
1882; SSSE3-NEXT:    shlq $62, %rcx
1883; SSSE3-NEXT:    sarq $63, %rcx
1884; SSSE3-NEXT:    movd %ecx, %xmm3
1885; SSSE3-NEXT:    shlq $63, %rax
1886; SSSE3-NEXT:    sarq $63, %rax
1887; SSSE3-NEXT:    movd %eax, %xmm0
1888; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
1889; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1890; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1891; SSSE3-NEXT:    retq
1892;
1893; SSE41-LABEL: load_sext_8i1_to_8i16:
1894; SSE41:       # BB#0: # %entry
1895; SSE41-NEXT:    movsbq (%rdi), %rax
1896; SSE41-NEXT:    movq %rax, %rcx
1897; SSE41-NEXT:    shlq $62, %rcx
1898; SSE41-NEXT:    sarq $63, %rcx
1899; SSE41-NEXT:    movq %rax, %rdx
1900; SSE41-NEXT:    shlq $63, %rdx
1901; SSE41-NEXT:    sarq $63, %rdx
1902; SSE41-NEXT:    movd %edx, %xmm0
1903; SSE41-NEXT:    pinsrw $1, %ecx, %xmm0
1904; SSE41-NEXT:    movq %rax, %rcx
1905; SSE41-NEXT:    shlq $61, %rcx
1906; SSE41-NEXT:    sarq $63, %rcx
1907; SSE41-NEXT:    pinsrw $2, %ecx, %xmm0
1908; SSE41-NEXT:    movq %rax, %rcx
1909; SSE41-NEXT:    shlq $60, %rcx
1910; SSE41-NEXT:    sarq $63, %rcx
1911; SSE41-NEXT:    pinsrw $3, %ecx, %xmm0
1912; SSE41-NEXT:    movq %rax, %rcx
1913; SSE41-NEXT:    shlq $59, %rcx
1914; SSE41-NEXT:    sarq $63, %rcx
1915; SSE41-NEXT:    pinsrw $4, %ecx, %xmm0
1916; SSE41-NEXT:    movq %rax, %rcx
1917; SSE41-NEXT:    shlq $58, %rcx
1918; SSE41-NEXT:    sarq $63, %rcx
1919; SSE41-NEXT:    pinsrw $5, %ecx, %xmm0
1920; SSE41-NEXT:    movq %rax, %rcx
1921; SSE41-NEXT:    shlq $57, %rcx
1922; SSE41-NEXT:    sarq $63, %rcx
1923; SSE41-NEXT:    pinsrw $6, %ecx, %xmm0
1924; SSE41-NEXT:    shrq $7, %rax
1925; SSE41-NEXT:    pinsrw $7, %eax, %xmm0
1926; SSE41-NEXT:    retq
1927;
1928; AVX1-LABEL: load_sext_8i1_to_8i16:
1929; AVX1:       # BB#0: # %entry
1930; AVX1-NEXT:    movsbq (%rdi), %rax
1931; AVX1-NEXT:    movq %rax, %rcx
1932; AVX1-NEXT:    shlq $62, %rcx
1933; AVX1-NEXT:    sarq $63, %rcx
1934; AVX1-NEXT:    movq %rax, %rdx
1935; AVX1-NEXT:    shlq $63, %rdx
1936; AVX1-NEXT:    sarq $63, %rdx
1937; AVX1-NEXT:    vmovd %edx, %xmm0
1938; AVX1-NEXT:    vpinsrw $1, %ecx, %xmm0, %xmm0
1939; AVX1-NEXT:    movq %rax, %rcx
1940; AVX1-NEXT:    shlq $61, %rcx
1941; AVX1-NEXT:    sarq $63, %rcx
1942; AVX1-NEXT:    vpinsrw $2, %ecx, %xmm0, %xmm0
1943; AVX1-NEXT:    movq %rax, %rcx
1944; AVX1-NEXT:    shlq $60, %rcx
1945; AVX1-NEXT:    sarq $63, %rcx
1946; AVX1-NEXT:    vpinsrw $3, %ecx, %xmm0, %xmm0
1947; AVX1-NEXT:    movq %rax, %rcx
1948; AVX1-NEXT:    shlq $59, %rcx
1949; AVX1-NEXT:    sarq $63, %rcx
1950; AVX1-NEXT:    vpinsrw $4, %ecx, %xmm0, %xmm0
1951; AVX1-NEXT:    movq %rax, %rcx
1952; AVX1-NEXT:    shlq $58, %rcx
1953; AVX1-NEXT:    sarq $63, %rcx
1954; AVX1-NEXT:    vpinsrw $5, %ecx, %xmm0, %xmm0
1955; AVX1-NEXT:    movq %rax, %rcx
1956; AVX1-NEXT:    shlq $57, %rcx
1957; AVX1-NEXT:    sarq $63, %rcx
1958; AVX1-NEXT:    vpinsrw $6, %ecx, %xmm0, %xmm0
1959; AVX1-NEXT:    shrq $7, %rax
1960; AVX1-NEXT:    vpinsrw $7, %eax, %xmm0, %xmm0
1961; AVX1-NEXT:    retq
1962;
1963; AVX2-LABEL: load_sext_8i1_to_8i16:
1964; AVX2:       # BB#0: # %entry
1965; AVX2-NEXT:    movsbq (%rdi), %rax
1966; AVX2-NEXT:    movq %rax, %rcx
1967; AVX2-NEXT:    shlq $62, %rcx
1968; AVX2-NEXT:    sarq $63, %rcx
1969; AVX2-NEXT:    movq %rax, %rdx
1970; AVX2-NEXT:    shlq $63, %rdx
1971; AVX2-NEXT:    sarq $63, %rdx
1972; AVX2-NEXT:    vmovd %edx, %xmm0
1973; AVX2-NEXT:    vpinsrw $1, %ecx, %xmm0, %xmm0
1974; AVX2-NEXT:    movq %rax, %rcx
1975; AVX2-NEXT:    shlq $61, %rcx
1976; AVX2-NEXT:    sarq $63, %rcx
1977; AVX2-NEXT:    vpinsrw $2, %ecx, %xmm0, %xmm0
1978; AVX2-NEXT:    movq %rax, %rcx
1979; AVX2-NEXT:    shlq $60, %rcx
1980; AVX2-NEXT:    sarq $63, %rcx
1981; AVX2-NEXT:    vpinsrw $3, %ecx, %xmm0, %xmm0
1982; AVX2-NEXT:    movq %rax, %rcx
1983; AVX2-NEXT:    shlq $59, %rcx
1984; AVX2-NEXT:    sarq $63, %rcx
1985; AVX2-NEXT:    vpinsrw $4, %ecx, %xmm0, %xmm0
1986; AVX2-NEXT:    movq %rax, %rcx
1987; AVX2-NEXT:    shlq $58, %rcx
1988; AVX2-NEXT:    sarq $63, %rcx
1989; AVX2-NEXT:    vpinsrw $5, %ecx, %xmm0, %xmm0
1990; AVX2-NEXT:    movq %rax, %rcx
1991; AVX2-NEXT:    shlq $57, %rcx
1992; AVX2-NEXT:    sarq $63, %rcx
1993; AVX2-NEXT:    vpinsrw $6, %ecx, %xmm0, %xmm0
1994; AVX2-NEXT:    shrq $7, %rax
1995; AVX2-NEXT:    vpinsrw $7, %eax, %xmm0, %xmm0
1996; AVX2-NEXT:    retq
1997;
1998; AVX512F-LABEL: load_sext_8i1_to_8i16:
1999; AVX512F:       # BB#0: # %entry
2000; AVX512F-NEXT:    movzbl (%rdi), %eax
2001; AVX512F-NEXT:    kmovw %eax, %k1
2002; AVX512F-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2003; AVX512F-NEXT:    vpmovqw %zmm0, %xmm0
2004; AVX512F-NEXT:    vzeroupper
2005; AVX512F-NEXT:    retq
2006;
2007; AVX512BW-LABEL: load_sext_8i1_to_8i16:
2008; AVX512BW:       # BB#0: # %entry
2009; AVX512BW-NEXT:    movzbl (%rdi), %eax
2010; AVX512BW-NEXT:    kmovd %eax, %k0
2011; AVX512BW-NEXT:    vpmovm2w %k0, %zmm0
2012; AVX512BW-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
2013; AVX512BW-NEXT:    vzeroupper
2014; AVX512BW-NEXT:    retq
2015;
2016; X32-SSE41-LABEL: load_sext_8i1_to_8i16:
2017; X32-SSE41:       # BB#0: # %entry
2018; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2019; X32-SSE41-NEXT:    movsbl (%eax), %eax
2020; X32-SSE41-NEXT:    movl %eax, %ecx
2021; X32-SSE41-NEXT:    shll $30, %ecx
2022; X32-SSE41-NEXT:    sarl $31, %ecx
2023; X32-SSE41-NEXT:    movl %eax, %edx
2024; X32-SSE41-NEXT:    shll $31, %edx
2025; X32-SSE41-NEXT:    sarl $31, %edx
2026; X32-SSE41-NEXT:    movd %edx, %xmm0
2027; X32-SSE41-NEXT:    pinsrw $1, %ecx, %xmm0
2028; X32-SSE41-NEXT:    movl %eax, %ecx
2029; X32-SSE41-NEXT:    shll $29, %ecx
2030; X32-SSE41-NEXT:    sarl $31, %ecx
2031; X32-SSE41-NEXT:    pinsrw $2, %ecx, %xmm0
2032; X32-SSE41-NEXT:    movl %eax, %ecx
2033; X32-SSE41-NEXT:    shll $28, %ecx
2034; X32-SSE41-NEXT:    sarl $31, %ecx
2035; X32-SSE41-NEXT:    pinsrw $3, %ecx, %xmm0
2036; X32-SSE41-NEXT:    movl %eax, %ecx
2037; X32-SSE41-NEXT:    shll $27, %ecx
2038; X32-SSE41-NEXT:    sarl $31, %ecx
2039; X32-SSE41-NEXT:    pinsrw $4, %ecx, %xmm0
2040; X32-SSE41-NEXT:    movl %eax, %ecx
2041; X32-SSE41-NEXT:    shll $26, %ecx
2042; X32-SSE41-NEXT:    sarl $31, %ecx
2043; X32-SSE41-NEXT:    pinsrw $5, %ecx, %xmm0
2044; X32-SSE41-NEXT:    movl %eax, %ecx
2045; X32-SSE41-NEXT:    shll $25, %ecx
2046; X32-SSE41-NEXT:    sarl $31, %ecx
2047; X32-SSE41-NEXT:    pinsrw $6, %ecx, %xmm0
2048; X32-SSE41-NEXT:    shrl $7, %eax
2049; X32-SSE41-NEXT:    pinsrw $7, %eax, %xmm0
2050; X32-SSE41-NEXT:    retl
2051entry:
2052 %X = load <8 x i1>, <8 x i1>* %ptr
2053 %Y = sext <8 x i1> %X to <8 x i16>
2054 ret <8 x i16> %Y
2055}
2056
2057define <8 x i16> @load_sext_8i8_to_8i16(<8 x i8> *%ptr) {
2058; SSE2-LABEL: load_sext_8i8_to_8i16:
2059; SSE2:       # BB#0: # %entry
2060; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2061; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2062; SSE2-NEXT:    psraw $8, %xmm0
2063; SSE2-NEXT:    retq
2064;
2065; SSSE3-LABEL: load_sext_8i8_to_8i16:
2066; SSSE3:       # BB#0: # %entry
2067; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2068; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2069; SSSE3-NEXT:    psraw $8, %xmm0
2070; SSSE3-NEXT:    retq
2071;
2072; SSE41-LABEL: load_sext_8i8_to_8i16:
2073; SSE41:       # BB#0: # %entry
2074; SSE41-NEXT:    pmovsxbw (%rdi), %xmm0
2075; SSE41-NEXT:    retq
2076;
2077; AVX-LABEL: load_sext_8i8_to_8i16:
2078; AVX:       # BB#0: # %entry
2079; AVX-NEXT:    vpmovsxbw (%rdi), %xmm0
2080; AVX-NEXT:    retq
2081;
2082; X32-SSE41-LABEL: load_sext_8i8_to_8i16:
2083; X32-SSE41:       # BB#0: # %entry
2084; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2085; X32-SSE41-NEXT:    pmovsxbw (%eax), %xmm0
2086; X32-SSE41-NEXT:    retl
2087entry:
2088 %X = load <8 x i8>, <8 x i8>* %ptr
2089 %Y = sext <8 x i8> %X to <8 x i16>
2090 ret <8 x i16> %Y
2091}
2092
2093define <8 x i64> @load_sext_8i8_to_8i64(<8 x i8> *%ptr) {
2094; SSE2-LABEL: load_sext_8i8_to_8i64:
2095; SSE2:       # BB#0: # %entry
2096; SSE2-NEXT:    movsbq 1(%rdi), %rax
2097; SSE2-NEXT:    movq %rax, %xmm1
2098; SSE2-NEXT:    movsbq (%rdi), %rax
2099; SSE2-NEXT:    movq %rax, %xmm0
2100; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2101; SSE2-NEXT:    movsbq 3(%rdi), %rax
2102; SSE2-NEXT:    movq %rax, %xmm2
2103; SSE2-NEXT:    movsbq 2(%rdi), %rax
2104; SSE2-NEXT:    movq %rax, %xmm1
2105; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
2106; SSE2-NEXT:    movsbq 5(%rdi), %rax
2107; SSE2-NEXT:    movq %rax, %xmm3
2108; SSE2-NEXT:    movsbq 4(%rdi), %rax
2109; SSE2-NEXT:    movq %rax, %xmm2
2110; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
2111; SSE2-NEXT:    movsbq 7(%rdi), %rax
2112; SSE2-NEXT:    movq %rax, %xmm4
2113; SSE2-NEXT:    movsbq 6(%rdi), %rax
2114; SSE2-NEXT:    movq %rax, %xmm3
2115; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm4[0]
2116; SSE2-NEXT:    retq
2117;
2118; SSSE3-LABEL: load_sext_8i8_to_8i64:
2119; SSSE3:       # BB#0: # %entry
2120; SSSE3-NEXT:    movsbq 1(%rdi), %rax
2121; SSSE3-NEXT:    movq %rax, %xmm1
2122; SSSE3-NEXT:    movsbq (%rdi), %rax
2123; SSSE3-NEXT:    movq %rax, %xmm0
2124; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2125; SSSE3-NEXT:    movsbq 3(%rdi), %rax
2126; SSSE3-NEXT:    movq %rax, %xmm2
2127; SSSE3-NEXT:    movsbq 2(%rdi), %rax
2128; SSSE3-NEXT:    movq %rax, %xmm1
2129; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
2130; SSSE3-NEXT:    movsbq 5(%rdi), %rax
2131; SSSE3-NEXT:    movq %rax, %xmm3
2132; SSSE3-NEXT:    movsbq 4(%rdi), %rax
2133; SSSE3-NEXT:    movq %rax, %xmm2
2134; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
2135; SSSE3-NEXT:    movsbq 7(%rdi), %rax
2136; SSSE3-NEXT:    movq %rax, %xmm4
2137; SSSE3-NEXT:    movsbq 6(%rdi), %rax
2138; SSSE3-NEXT:    movq %rax, %xmm3
2139; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm4[0]
2140; SSSE3-NEXT:    retq
2141;
2142; SSE41-LABEL: load_sext_8i8_to_8i64:
2143; SSE41:       # BB#0: # %entry
2144; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
2145; SSE41-NEXT:    pmovsxbq 2(%rdi), %xmm1
2146; SSE41-NEXT:    pmovsxbq 4(%rdi), %xmm2
2147; SSE41-NEXT:    pmovsxbq 6(%rdi), %xmm3
2148; SSE41-NEXT:    retq
2149;
2150; AVX1-LABEL: load_sext_8i8_to_8i64:
2151; AVX1:       # BB#0: # %entry
2152; AVX1-NEXT:    vpmovsxbd (%rdi), %xmm0
2153; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
2154; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
2155; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
2156; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2157; AVX1-NEXT:    vpmovsxbd 4(%rdi), %xmm1
2158; AVX1-NEXT:    vpmovsxdq %xmm1, %xmm2
2159; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
2160; AVX1-NEXT:    vpmovsxdq %xmm1, %xmm1
2161; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
2162; AVX1-NEXT:    retq
2163;
2164; AVX2-LABEL: load_sext_8i8_to_8i64:
2165; AVX2:       # BB#0: # %entry
2166; AVX2-NEXT:    vpmovsxbq (%rdi), %ymm0
2167; AVX2-NEXT:    vpmovsxbq 4(%rdi), %ymm1
2168; AVX2-NEXT:    retq
2169;
2170; AVX512-LABEL: load_sext_8i8_to_8i64:
2171; AVX512:       # BB#0: # %entry
2172; AVX512-NEXT:    vpmovsxbq (%rdi), %zmm0
2173; AVX512-NEXT:    retq
2174;
2175; X32-SSE41-LABEL: load_sext_8i8_to_8i64:
2176; X32-SSE41:       # BB#0: # %entry
2177; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2178; X32-SSE41-NEXT:    pmovsxbq (%eax), %xmm0
2179; X32-SSE41-NEXT:    pmovsxbq 2(%eax), %xmm1
2180; X32-SSE41-NEXT:    pmovsxbq 4(%eax), %xmm2
2181; X32-SSE41-NEXT:    pmovsxbq 6(%eax), %xmm3
2182; X32-SSE41-NEXT:    retl
2183entry:
2184 %X = load <8 x i8>, <8 x i8>* %ptr
2185 %Y = sext <8 x i8> %X to <8 x i64>
2186 ret <8 x i64> %Y
2187}
2188
2189define <8 x i32> @load_sext_8i1_to_8i32(<8 x i1> *%ptr) {
2190; SSE2-LABEL: load_sext_8i1_to_8i32:
2191; SSE2:       # BB#0: # %entry
2192; SSE2-NEXT:    movzbl (%rdi), %eax
2193; SSE2-NEXT:    movl %eax, %ecx
2194; SSE2-NEXT:    shrl $3, %ecx
2195; SSE2-NEXT:    andl $1, %ecx
2196; SSE2-NEXT:    movd %ecx, %xmm0
2197; SSE2-NEXT:    movl %eax, %ecx
2198; SSE2-NEXT:    shrl $2, %ecx
2199; SSE2-NEXT:    andl $1, %ecx
2200; SSE2-NEXT:    movd %ecx, %xmm2
2201; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
2202; SSE2-NEXT:    movl %eax, %ecx
2203; SSE2-NEXT:    andl $1, %ecx
2204; SSE2-NEXT:    movd %ecx, %xmm1
2205; SSE2-NEXT:    movl %eax, %ecx
2206; SSE2-NEXT:    shrl %ecx
2207; SSE2-NEXT:    andl $1, %ecx
2208; SSE2-NEXT:    movd %ecx, %xmm0
2209; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2210; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
2211; SSE2-NEXT:    movl %eax, %ecx
2212; SSE2-NEXT:    shrl $5, %ecx
2213; SSE2-NEXT:    andl $1, %ecx
2214; SSE2-NEXT:    movd %ecx, %xmm0
2215; SSE2-NEXT:    movl %eax, %ecx
2216; SSE2-NEXT:    shrl $4, %ecx
2217; SSE2-NEXT:    andl $1, %ecx
2218; SSE2-NEXT:    movd %ecx, %xmm2
2219; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
2220; SSE2-NEXT:    movl %eax, %ecx
2221; SSE2-NEXT:    shrl $6, %ecx
2222; SSE2-NEXT:    andl $1, %ecx
2223; SSE2-NEXT:    movd %ecx, %xmm0
2224; SSE2-NEXT:    shrl $7, %eax
2225; SSE2-NEXT:    movzwl %ax, %eax
2226; SSE2-NEXT:    movd %eax, %xmm3
2227; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
2228; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
2229; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
2230; SSE2-NEXT:    movdqa %xmm1, %xmm0
2231; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2232; SSE2-NEXT:    pslld $31, %xmm0
2233; SSE2-NEXT:    psrad $31, %xmm0
2234; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2235; SSE2-NEXT:    pslld $31, %xmm1
2236; SSE2-NEXT:    psrad $31, %xmm1
2237; SSE2-NEXT:    retq
2238;
2239; SSSE3-LABEL: load_sext_8i1_to_8i32:
2240; SSSE3:       # BB#0: # %entry
2241; SSSE3-NEXT:    movzbl (%rdi), %eax
2242; SSSE3-NEXT:    movl %eax, %ecx
2243; SSSE3-NEXT:    shrl $3, %ecx
2244; SSSE3-NEXT:    andl $1, %ecx
2245; SSSE3-NEXT:    movd %ecx, %xmm0
2246; SSSE3-NEXT:    movl %eax, %ecx
2247; SSSE3-NEXT:    shrl $2, %ecx
2248; SSSE3-NEXT:    andl $1, %ecx
2249; SSSE3-NEXT:    movd %ecx, %xmm2
2250; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
2251; SSSE3-NEXT:    movl %eax, %ecx
2252; SSSE3-NEXT:    andl $1, %ecx
2253; SSSE3-NEXT:    movd %ecx, %xmm1
2254; SSSE3-NEXT:    movl %eax, %ecx
2255; SSSE3-NEXT:    shrl %ecx
2256; SSSE3-NEXT:    andl $1, %ecx
2257; SSSE3-NEXT:    movd %ecx, %xmm0
2258; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2259; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
2260; SSSE3-NEXT:    movl %eax, %ecx
2261; SSSE3-NEXT:    shrl $5, %ecx
2262; SSSE3-NEXT:    andl $1, %ecx
2263; SSSE3-NEXT:    movd %ecx, %xmm0
2264; SSSE3-NEXT:    movl %eax, %ecx
2265; SSSE3-NEXT:    shrl $4, %ecx
2266; SSSE3-NEXT:    andl $1, %ecx
2267; SSSE3-NEXT:    movd %ecx, %xmm2
2268; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
2269; SSSE3-NEXT:    movl %eax, %ecx
2270; SSSE3-NEXT:    shrl $6, %ecx
2271; SSSE3-NEXT:    andl $1, %ecx
2272; SSSE3-NEXT:    movd %ecx, %xmm0
2273; SSSE3-NEXT:    shrl $7, %eax
2274; SSSE3-NEXT:    movzwl %ax, %eax
2275; SSSE3-NEXT:    movd %eax, %xmm3
2276; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
2277; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
2278; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
2279; SSSE3-NEXT:    movdqa %xmm1, %xmm0
2280; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2281; SSSE3-NEXT:    pslld $31, %xmm0
2282; SSSE3-NEXT:    psrad $31, %xmm0
2283; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2284; SSSE3-NEXT:    pslld $31, %xmm1
2285; SSSE3-NEXT:    psrad $31, %xmm1
2286; SSSE3-NEXT:    retq
2287;
2288; SSE41-LABEL: load_sext_8i1_to_8i32:
2289; SSE41:       # BB#0: # %entry
2290; SSE41-NEXT:    movzbl (%rdi), %eax
2291; SSE41-NEXT:    movl %eax, %ecx
2292; SSE41-NEXT:    shrl %ecx
2293; SSE41-NEXT:    andl $1, %ecx
2294; SSE41-NEXT:    movl %eax, %edx
2295; SSE41-NEXT:    andl $1, %edx
2296; SSE41-NEXT:    movd %edx, %xmm1
2297; SSE41-NEXT:    pinsrw $1, %ecx, %xmm1
2298; SSE41-NEXT:    movl %eax, %ecx
2299; SSE41-NEXT:    shrl $2, %ecx
2300; SSE41-NEXT:    andl $1, %ecx
2301; SSE41-NEXT:    pinsrw $2, %ecx, %xmm1
2302; SSE41-NEXT:    movl %eax, %ecx
2303; SSE41-NEXT:    shrl $3, %ecx
2304; SSE41-NEXT:    andl $1, %ecx
2305; SSE41-NEXT:    pinsrw $3, %ecx, %xmm1
2306; SSE41-NEXT:    movl %eax, %ecx
2307; SSE41-NEXT:    shrl $4, %ecx
2308; SSE41-NEXT:    andl $1, %ecx
2309; SSE41-NEXT:    pinsrw $4, %ecx, %xmm1
2310; SSE41-NEXT:    movl %eax, %ecx
2311; SSE41-NEXT:    shrl $5, %ecx
2312; SSE41-NEXT:    andl $1, %ecx
2313; SSE41-NEXT:    pinsrw $5, %ecx, %xmm1
2314; SSE41-NEXT:    movl %eax, %ecx
2315; SSE41-NEXT:    shrl $6, %ecx
2316; SSE41-NEXT:    andl $1, %ecx
2317; SSE41-NEXT:    pinsrw $6, %ecx, %xmm1
2318; SSE41-NEXT:    shrl $7, %eax
2319; SSE41-NEXT:    movzwl %ax, %eax
2320; SSE41-NEXT:    pinsrw $7, %eax, %xmm1
2321; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
2322; SSE41-NEXT:    pslld $31, %xmm0
2323; SSE41-NEXT:    psrad $31, %xmm0
2324; SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2325; SSE41-NEXT:    pslld $31, %xmm1
2326; SSE41-NEXT:    psrad $31, %xmm1
2327; SSE41-NEXT:    retq
2328;
2329; AVX1-LABEL: load_sext_8i1_to_8i32:
2330; AVX1:       # BB#0: # %entry
2331; AVX1-NEXT:    movsbq (%rdi), %rax
2332; AVX1-NEXT:    movq %rax, %rcx
2333; AVX1-NEXT:    shlq $58, %rcx
2334; AVX1-NEXT:    sarq $63, %rcx
2335; AVX1-NEXT:    movq %rax, %rdx
2336; AVX1-NEXT:    shlq $59, %rdx
2337; AVX1-NEXT:    sarq $63, %rdx
2338; AVX1-NEXT:    vmovd %edx, %xmm0
2339; AVX1-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
2340; AVX1-NEXT:    movq %rax, %rcx
2341; AVX1-NEXT:    shlq $57, %rcx
2342; AVX1-NEXT:    sarq $63, %rcx
2343; AVX1-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
2344; AVX1-NEXT:    movq %rax, %rcx
2345; AVX1-NEXT:    shrq $7, %rcx
2346; AVX1-NEXT:    vpinsrd $3, %ecx, %xmm0, %xmm0
2347; AVX1-NEXT:    movq %rax, %rcx
2348; AVX1-NEXT:    shlq $62, %rcx
2349; AVX1-NEXT:    sarq $63, %rcx
2350; AVX1-NEXT:    movq %rax, %rdx
2351; AVX1-NEXT:    shlq $63, %rdx
2352; AVX1-NEXT:    sarq $63, %rdx
2353; AVX1-NEXT:    vmovd %edx, %xmm1
2354; AVX1-NEXT:    vpinsrd $1, %ecx, %xmm1, %xmm1
2355; AVX1-NEXT:    movq %rax, %rcx
2356; AVX1-NEXT:    shlq $61, %rcx
2357; AVX1-NEXT:    sarq $63, %rcx
2358; AVX1-NEXT:    vpinsrd $2, %ecx, %xmm1, %xmm1
2359; AVX1-NEXT:    shlq $60, %rax
2360; AVX1-NEXT:    sarq $63, %rax
2361; AVX1-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm1
2362; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2363; AVX1-NEXT:    retq
2364;
2365; AVX2-LABEL: load_sext_8i1_to_8i32:
2366; AVX2:       # BB#0: # %entry
2367; AVX2-NEXT:    movsbq (%rdi), %rax
2368; AVX2-NEXT:    movq %rax, %rcx
2369; AVX2-NEXT:    shlq $58, %rcx
2370; AVX2-NEXT:    sarq $63, %rcx
2371; AVX2-NEXT:    movq %rax, %rdx
2372; AVX2-NEXT:    shlq $59, %rdx
2373; AVX2-NEXT:    sarq $63, %rdx
2374; AVX2-NEXT:    vmovd %edx, %xmm0
2375; AVX2-NEXT:    vpinsrd $1, %ecx, %xmm0, %xmm0
2376; AVX2-NEXT:    movq %rax, %rcx
2377; AVX2-NEXT:    shlq $57, %rcx
2378; AVX2-NEXT:    sarq $63, %rcx
2379; AVX2-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
2380; AVX2-NEXT:    movq %rax, %rcx
2381; AVX2-NEXT:    shrq $7, %rcx
2382; AVX2-NEXT:    vpinsrd $3, %ecx, %xmm0, %xmm0
2383; AVX2-NEXT:    movq %rax, %rcx
2384; AVX2-NEXT:    shlq $62, %rcx
2385; AVX2-NEXT:    sarq $63, %rcx
2386; AVX2-NEXT:    movq %rax, %rdx
2387; AVX2-NEXT:    shlq $63, %rdx
2388; AVX2-NEXT:    sarq $63, %rdx
2389; AVX2-NEXT:    vmovd %edx, %xmm1
2390; AVX2-NEXT:    vpinsrd $1, %ecx, %xmm1, %xmm1
2391; AVX2-NEXT:    movq %rax, %rcx
2392; AVX2-NEXT:    shlq $61, %rcx
2393; AVX2-NEXT:    sarq $63, %rcx
2394; AVX2-NEXT:    vpinsrd $2, %ecx, %xmm1, %xmm1
2395; AVX2-NEXT:    shlq $60, %rax
2396; AVX2-NEXT:    sarq $63, %rax
2397; AVX2-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm1
2398; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
2399; AVX2-NEXT:    retq
2400;
2401; AVX512F-LABEL: load_sext_8i1_to_8i32:
2402; AVX512F:       # BB#0: # %entry
2403; AVX512F-NEXT:    movzbl (%rdi), %eax
2404; AVX512F-NEXT:    kmovw %eax, %k1
2405; AVX512F-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2406; AVX512F-NEXT:    vpmovqd %zmm0, %ymm0
2407; AVX512F-NEXT:    retq
2408;
2409; AVX512BW-LABEL: load_sext_8i1_to_8i32:
2410; AVX512BW:       # BB#0: # %entry
2411; AVX512BW-NEXT:    movzbl (%rdi), %eax
2412; AVX512BW-NEXT:    kmovd %eax, %k1
2413; AVX512BW-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2414; AVX512BW-NEXT:    vpmovqd %zmm0, %ymm0
2415; AVX512BW-NEXT:    retq
2416;
2417; X32-SSE41-LABEL: load_sext_8i1_to_8i32:
2418; X32-SSE41:       # BB#0: # %entry
2419; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2420; X32-SSE41-NEXT:    movzbl (%eax), %eax
2421; X32-SSE41-NEXT:    movl %eax, %ecx
2422; X32-SSE41-NEXT:    shrl %ecx
2423; X32-SSE41-NEXT:    andl $1, %ecx
2424; X32-SSE41-NEXT:    movl %eax, %edx
2425; X32-SSE41-NEXT:    andl $1, %edx
2426; X32-SSE41-NEXT:    movd %edx, %xmm1
2427; X32-SSE41-NEXT:    pinsrw $1, %ecx, %xmm1
2428; X32-SSE41-NEXT:    movl %eax, %ecx
2429; X32-SSE41-NEXT:    shrl $2, %ecx
2430; X32-SSE41-NEXT:    andl $1, %ecx
2431; X32-SSE41-NEXT:    pinsrw $2, %ecx, %xmm1
2432; X32-SSE41-NEXT:    movl %eax, %ecx
2433; X32-SSE41-NEXT:    shrl $3, %ecx
2434; X32-SSE41-NEXT:    andl $1, %ecx
2435; X32-SSE41-NEXT:    pinsrw $3, %ecx, %xmm1
2436; X32-SSE41-NEXT:    movl %eax, %ecx
2437; X32-SSE41-NEXT:    shrl $4, %ecx
2438; X32-SSE41-NEXT:    andl $1, %ecx
2439; X32-SSE41-NEXT:    pinsrw $4, %ecx, %xmm1
2440; X32-SSE41-NEXT:    movl %eax, %ecx
2441; X32-SSE41-NEXT:    shrl $5, %ecx
2442; X32-SSE41-NEXT:    andl $1, %ecx
2443; X32-SSE41-NEXT:    pinsrw $5, %ecx, %xmm1
2444; X32-SSE41-NEXT:    movl %eax, %ecx
2445; X32-SSE41-NEXT:    shrl $6, %ecx
2446; X32-SSE41-NEXT:    andl $1, %ecx
2447; X32-SSE41-NEXT:    pinsrw $6, %ecx, %xmm1
2448; X32-SSE41-NEXT:    shrl $7, %eax
2449; X32-SSE41-NEXT:    pinsrw $7, %eax, %xmm1
2450; X32-SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
2451; X32-SSE41-NEXT:    pslld $31, %xmm0
2452; X32-SSE41-NEXT:    psrad $31, %xmm0
2453; X32-SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2454; X32-SSE41-NEXT:    pslld $31, %xmm1
2455; X32-SSE41-NEXT:    psrad $31, %xmm1
2456; X32-SSE41-NEXT:    retl
2457entry:
2458 %X = load <8 x i1>, <8 x i1>* %ptr
2459 %Y = sext <8 x i1> %X to <8 x i32>
2460 ret <8 x i32> %Y
2461}
2462
2463define <8 x i32> @load_sext_8i8_to_8i32(<8 x i8> *%ptr) {
2464; SSE2-LABEL: load_sext_8i8_to_8i32:
2465; SSE2:       # BB#0: # %entry
2466; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2467; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2468; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2469; SSE2-NEXT:    psrad $24, %xmm0
2470; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2471; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2472; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
2473; SSE2-NEXT:    psrad $24, %xmm1
2474; SSE2-NEXT:    retq
2475;
2476; SSSE3-LABEL: load_sext_8i8_to_8i32:
2477; SSSE3:       # BB#0: # %entry
2478; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2479; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2480; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2481; SSSE3-NEXT:    psrad $24, %xmm0
2482; SSSE3-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2483; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2484; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
2485; SSSE3-NEXT:    psrad $24, %xmm1
2486; SSSE3-NEXT:    retq
2487;
2488; SSE41-LABEL: load_sext_8i8_to_8i32:
2489; SSE41:       # BB#0: # %entry
2490; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
2491; SSE41-NEXT:    pmovsxbd 4(%rdi), %xmm1
2492; SSE41-NEXT:    retq
2493;
2494; AVX1-LABEL: load_sext_8i8_to_8i32:
2495; AVX1:       # BB#0: # %entry
2496; AVX1-NEXT:    vpmovsxbw (%rdi), %xmm0
2497; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
2498; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
2499; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
2500; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2501; AVX1-NEXT:    retq
2502;
2503; AVX2-LABEL: load_sext_8i8_to_8i32:
2504; AVX2:       # BB#0: # %entry
2505; AVX2-NEXT:    vpmovsxbd (%rdi), %ymm0
2506; AVX2-NEXT:    retq
2507;
2508; AVX512-LABEL: load_sext_8i8_to_8i32:
2509; AVX512:       # BB#0: # %entry
2510; AVX512-NEXT:    vpmovsxbd (%rdi), %ymm0
2511; AVX512-NEXT:    retq
2512;
2513; X32-SSE41-LABEL: load_sext_8i8_to_8i32:
2514; X32-SSE41:       # BB#0: # %entry
2515; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2516; X32-SSE41-NEXT:    pmovsxbd (%eax), %xmm0
2517; X32-SSE41-NEXT:    pmovsxbd 4(%eax), %xmm1
2518; X32-SSE41-NEXT:    retl
2519entry:
2520 %X = load <8 x i8>, <8 x i8>* %ptr
2521 %Y = sext <8 x i8> %X to <8 x i32>
2522 ret <8 x i32> %Y
2523}
2524
2525define <16 x i8> @load_sext_16i1_to_16i8(<16 x i1> *%ptr) nounwind readnone {
2526; SSE2-LABEL: load_sext_16i1_to_16i8:
2527; SSE2:       # BB#0: # %entry
2528; SSE2-NEXT:    pushq %rbp
2529; SSE2-NEXT:    pushq %r15
2530; SSE2-NEXT:    pushq %r14
2531; SSE2-NEXT:    pushq %r13
2532; SSE2-NEXT:    pushq %r12
2533; SSE2-NEXT:    pushq %rbx
2534; SSE2-NEXT:    movswq (%rdi), %rax
2535; SSE2-NEXT:    movq %rax, %r8
2536; SSE2-NEXT:    movq %rax, %r9
2537; SSE2-NEXT:    movq %rax, %r10
2538; SSE2-NEXT:    movq %rax, %r11
2539; SSE2-NEXT:    movq %rax, %r14
2540; SSE2-NEXT:    movq %rax, %r15
2541; SSE2-NEXT:    movq %rax, %r12
2542; SSE2-NEXT:    movq %rax, %r13
2543; SSE2-NEXT:    movq %rax, %rbx
2544; SSE2-NEXT:    movq %rax, %rcx
2545; SSE2-NEXT:    movq %rax, %rdx
2546; SSE2-NEXT:    movq %rax, %rsi
2547; SSE2-NEXT:    movq %rax, %rdi
2548; SSE2-NEXT:    movq %rax, %rbp
2549; SSE2-NEXT:    shrq $15, %rbp
2550; SSE2-NEXT:    movd %ebp, %xmm0
2551; SSE2-NEXT:    movq %rax, %rbp
2552; SSE2-NEXT:    movsbq %al, %rax
2553; SSE2-NEXT:    shlq $49, %r8
2554; SSE2-NEXT:    sarq $63, %r8
2555; SSE2-NEXT:    movd %r8d, %xmm1
2556; SSE2-NEXT:    shlq $50, %r9
2557; SSE2-NEXT:    sarq $63, %r9
2558; SSE2-NEXT:    movd %r9d, %xmm2
2559; SSE2-NEXT:    shlq $51, %r10
2560; SSE2-NEXT:    sarq $63, %r10
2561; SSE2-NEXT:    movd %r10d, %xmm3
2562; SSE2-NEXT:    shlq $52, %r11
2563; SSE2-NEXT:    sarq $63, %r11
2564; SSE2-NEXT:    movd %r11d, %xmm4
2565; 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]
2566; SSE2-NEXT:    shlq $53, %r14
2567; SSE2-NEXT:    sarq $63, %r14
2568; SSE2-NEXT:    movd %r14d, %xmm0
2569; 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]
2570; SSE2-NEXT:    shlq $54, %r15
2571; SSE2-NEXT:    sarq $63, %r15
2572; SSE2-NEXT:    movd %r15d, %xmm2
2573; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3]
2574; SSE2-NEXT:    shlq $55, %r12
2575; SSE2-NEXT:    sarq $63, %r12
2576; SSE2-NEXT:    movd %r12d, %xmm1
2577; 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]
2578; SSE2-NEXT:    shlq $60, %r13
2579; SSE2-NEXT:    sarq $63, %r13
2580; SSE2-NEXT:    movd %r13d, %xmm4
2581; 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]
2582; SSE2-NEXT:    shlq $61, %rbx
2583; SSE2-NEXT:    sarq $63, %rbx
2584; SSE2-NEXT:    movd %ebx, %xmm2
2585; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2586; SSE2-NEXT:    shlq $62, %rcx
2587; SSE2-NEXT:    sarq $63, %rcx
2588; SSE2-NEXT:    movd %ecx, %xmm5
2589; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
2590; SSE2-NEXT:    shlq $63, %rdx
2591; SSE2-NEXT:    sarq $63, %rdx
2592; SSE2-NEXT:    movd %edx, %xmm0
2593; 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]
2594; SSE2-NEXT:    shlq $58, %rsi
2595; SSE2-NEXT:    sarq $63, %rsi
2596; SSE2-NEXT:    movd %esi, %xmm3
2597; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1],xmm0[2],xmm5[2],xmm0[3],xmm5[3],xmm0[4],xmm5[4],xmm0[5],xmm5[5],xmm0[6],xmm5[6],xmm0[7],xmm5[7]
2598; SSE2-NEXT:    shlq $59, %rdi
2599; SSE2-NEXT:    sarq $63, %rdi
2600; SSE2-NEXT:    movd %edi, %xmm4
2601; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
2602; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]
2603; SSE2-NEXT:    shlq $57, %rbp
2604; SSE2-NEXT:    sarq $63, %rbp
2605; SSE2-NEXT:    movd %ebp, %xmm2
2606; SSE2-NEXT:    shrq $7, %rax
2607; SSE2-NEXT:    movd %eax, %xmm3
2608; 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]
2609; SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3]
2610; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
2611; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2612; SSE2-NEXT:    popq %rbx
2613; SSE2-NEXT:    popq %r12
2614; SSE2-NEXT:    popq %r13
2615; SSE2-NEXT:    popq %r14
2616; SSE2-NEXT:    popq %r15
2617; SSE2-NEXT:    popq %rbp
2618; SSE2-NEXT:    retq
2619;
2620; SSSE3-LABEL: load_sext_16i1_to_16i8:
2621; SSSE3:       # BB#0: # %entry
2622; SSSE3-NEXT:    pushq %rbp
2623; SSSE3-NEXT:    pushq %r15
2624; SSSE3-NEXT:    pushq %r14
2625; SSSE3-NEXT:    pushq %r13
2626; SSSE3-NEXT:    pushq %r12
2627; SSSE3-NEXT:    pushq %rbx
2628; SSSE3-NEXT:    movswq (%rdi), %rax
2629; SSSE3-NEXT:    movq %rax, %r8
2630; SSSE3-NEXT:    movq %rax, %r9
2631; SSSE3-NEXT:    movq %rax, %r10
2632; SSSE3-NEXT:    movq %rax, %r11
2633; SSSE3-NEXT:    movq %rax, %r14
2634; SSSE3-NEXT:    movq %rax, %r15
2635; SSSE3-NEXT:    movq %rax, %r12
2636; SSSE3-NEXT:    movq %rax, %r13
2637; SSSE3-NEXT:    movq %rax, %rbx
2638; SSSE3-NEXT:    movq %rax, %rcx
2639; SSSE3-NEXT:    movq %rax, %rdx
2640; SSSE3-NEXT:    movq %rax, %rsi
2641; SSSE3-NEXT:    movq %rax, %rdi
2642; SSSE3-NEXT:    movq %rax, %rbp
2643; SSSE3-NEXT:    shrq $15, %rbp
2644; SSSE3-NEXT:    movd %ebp, %xmm0
2645; SSSE3-NEXT:    movq %rax, %rbp
2646; SSSE3-NEXT:    movsbq %al, %rax
2647; SSSE3-NEXT:    shlq $49, %r8
2648; SSSE3-NEXT:    sarq $63, %r8
2649; SSSE3-NEXT:    movd %r8d, %xmm1
2650; SSSE3-NEXT:    shlq $50, %r9
2651; SSSE3-NEXT:    sarq $63, %r9
2652; SSSE3-NEXT:    movd %r9d, %xmm2
2653; SSSE3-NEXT:    shlq $51, %r10
2654; SSSE3-NEXT:    sarq $63, %r10
2655; SSSE3-NEXT:    movd %r10d, %xmm3
2656; SSSE3-NEXT:    shlq $52, %r11
2657; SSSE3-NEXT:    sarq $63, %r11
2658; SSSE3-NEXT:    movd %r11d, %xmm4
2659; 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]
2660; SSSE3-NEXT:    shlq $53, %r14
2661; SSSE3-NEXT:    sarq $63, %r14
2662; SSSE3-NEXT:    movd %r14d, %xmm0
2663; 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]
2664; SSSE3-NEXT:    shlq $54, %r15
2665; SSSE3-NEXT:    sarq $63, %r15
2666; SSSE3-NEXT:    movd %r15d, %xmm2
2667; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3]
2668; SSSE3-NEXT:    shlq $55, %r12
2669; SSSE3-NEXT:    sarq $63, %r12
2670; SSSE3-NEXT:    movd %r12d, %xmm1
2671; 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]
2672; SSSE3-NEXT:    shlq $60, %r13
2673; SSSE3-NEXT:    sarq $63, %r13
2674; SSSE3-NEXT:    movd %r13d, %xmm4
2675; 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]
2676; SSSE3-NEXT:    shlq $61, %rbx
2677; SSSE3-NEXT:    sarq $63, %rbx
2678; SSSE3-NEXT:    movd %ebx, %xmm2
2679; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2680; SSSE3-NEXT:    shlq $62, %rcx
2681; SSSE3-NEXT:    sarq $63, %rcx
2682; SSSE3-NEXT:    movd %ecx, %xmm5
2683; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
2684; SSSE3-NEXT:    shlq $63, %rdx
2685; SSSE3-NEXT:    sarq $63, %rdx
2686; SSSE3-NEXT:    movd %edx, %xmm0
2687; 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]
2688; SSSE3-NEXT:    shlq $58, %rsi
2689; SSSE3-NEXT:    sarq $63, %rsi
2690; SSSE3-NEXT:    movd %esi, %xmm3
2691; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1],xmm0[2],xmm5[2],xmm0[3],xmm5[3],xmm0[4],xmm5[4],xmm0[5],xmm5[5],xmm0[6],xmm5[6],xmm0[7],xmm5[7]
2692; SSSE3-NEXT:    shlq $59, %rdi
2693; SSSE3-NEXT:    sarq $63, %rdi
2694; SSSE3-NEXT:    movd %edi, %xmm4
2695; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
2696; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]
2697; SSSE3-NEXT:    shlq $57, %rbp
2698; SSSE3-NEXT:    sarq $63, %rbp
2699; SSSE3-NEXT:    movd %ebp, %xmm2
2700; SSSE3-NEXT:    shrq $7, %rax
2701; SSSE3-NEXT:    movd %eax, %xmm3
2702; 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]
2703; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3]
2704; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
2705; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2706; SSSE3-NEXT:    popq %rbx
2707; SSSE3-NEXT:    popq %r12
2708; SSSE3-NEXT:    popq %r13
2709; SSSE3-NEXT:    popq %r14
2710; SSSE3-NEXT:    popq %r15
2711; SSSE3-NEXT:    popq %rbp
2712; SSSE3-NEXT:    retq
2713;
2714; SSE41-LABEL: load_sext_16i1_to_16i8:
2715; SSE41:       # BB#0: # %entry
2716; SSE41-NEXT:    movswq (%rdi), %rax
2717; SSE41-NEXT:    movq %rax, %rcx
2718; SSE41-NEXT:    shlq $62, %rcx
2719; SSE41-NEXT:    sarq $63, %rcx
2720; SSE41-NEXT:    movq %rax, %rdx
2721; SSE41-NEXT:    shlq $63, %rdx
2722; SSE41-NEXT:    sarq $63, %rdx
2723; SSE41-NEXT:    movd %edx, %xmm0
2724; SSE41-NEXT:    pinsrb $1, %ecx, %xmm0
2725; SSE41-NEXT:    movq %rax, %rcx
2726; SSE41-NEXT:    shlq $61, %rcx
2727; SSE41-NEXT:    sarq $63, %rcx
2728; SSE41-NEXT:    pinsrb $2, %ecx, %xmm0
2729; SSE41-NEXT:    movq %rax, %rcx
2730; SSE41-NEXT:    shlq $60, %rcx
2731; SSE41-NEXT:    sarq $63, %rcx
2732; SSE41-NEXT:    pinsrb $3, %ecx, %xmm0
2733; SSE41-NEXT:    movq %rax, %rcx
2734; SSE41-NEXT:    shlq $59, %rcx
2735; SSE41-NEXT:    sarq $63, %rcx
2736; SSE41-NEXT:    pinsrb $4, %ecx, %xmm0
2737; SSE41-NEXT:    movq %rax, %rcx
2738; SSE41-NEXT:    shlq $58, %rcx
2739; SSE41-NEXT:    sarq $63, %rcx
2740; SSE41-NEXT:    pinsrb $5, %ecx, %xmm0
2741; SSE41-NEXT:    movq %rax, %rcx
2742; SSE41-NEXT:    shlq $57, %rcx
2743; SSE41-NEXT:    sarq $63, %rcx
2744; SSE41-NEXT:    pinsrb $6, %ecx, %xmm0
2745; SSE41-NEXT:    movsbq %al, %rcx
2746; SSE41-NEXT:    shrq $7, %rcx
2747; SSE41-NEXT:    pinsrb $7, %ecx, %xmm0
2748; SSE41-NEXT:    movq %rax, %rcx
2749; SSE41-NEXT:    shlq $55, %rcx
2750; SSE41-NEXT:    sarq $63, %rcx
2751; SSE41-NEXT:    pinsrb $8, %ecx, %xmm0
2752; SSE41-NEXT:    movq %rax, %rcx
2753; SSE41-NEXT:    shlq $54, %rcx
2754; SSE41-NEXT:    sarq $63, %rcx
2755; SSE41-NEXT:    pinsrb $9, %ecx, %xmm0
2756; SSE41-NEXT:    movq %rax, %rcx
2757; SSE41-NEXT:    shlq $53, %rcx
2758; SSE41-NEXT:    sarq $63, %rcx
2759; SSE41-NEXT:    pinsrb $10, %ecx, %xmm0
2760; SSE41-NEXT:    movq %rax, %rcx
2761; SSE41-NEXT:    shlq $52, %rcx
2762; SSE41-NEXT:    sarq $63, %rcx
2763; SSE41-NEXT:    pinsrb $11, %ecx, %xmm0
2764; SSE41-NEXT:    movq %rax, %rcx
2765; SSE41-NEXT:    shlq $51, %rcx
2766; SSE41-NEXT:    sarq $63, %rcx
2767; SSE41-NEXT:    pinsrb $12, %ecx, %xmm0
2768; SSE41-NEXT:    movq %rax, %rcx
2769; SSE41-NEXT:    shlq $50, %rcx
2770; SSE41-NEXT:    sarq $63, %rcx
2771; SSE41-NEXT:    pinsrb $13, %ecx, %xmm0
2772; SSE41-NEXT:    movq %rax, %rcx
2773; SSE41-NEXT:    shlq $49, %rcx
2774; SSE41-NEXT:    sarq $63, %rcx
2775; SSE41-NEXT:    pinsrb $14, %ecx, %xmm0
2776; SSE41-NEXT:    shrq $15, %rax
2777; SSE41-NEXT:    pinsrb $15, %eax, %xmm0
2778; SSE41-NEXT:    retq
2779;
2780; AVX1-LABEL: load_sext_16i1_to_16i8:
2781; AVX1:       # BB#0: # %entry
2782; AVX1-NEXT:    movswq (%rdi), %rax
2783; AVX1-NEXT:    movq %rax, %rcx
2784; AVX1-NEXT:    shlq $62, %rcx
2785; AVX1-NEXT:    sarq $63, %rcx
2786; AVX1-NEXT:    movq %rax, %rdx
2787; AVX1-NEXT:    shlq $63, %rdx
2788; AVX1-NEXT:    sarq $63, %rdx
2789; AVX1-NEXT:    vmovd %edx, %xmm0
2790; AVX1-NEXT:    vpinsrb $1, %ecx, %xmm0, %xmm0
2791; AVX1-NEXT:    movq %rax, %rcx
2792; AVX1-NEXT:    shlq $61, %rcx
2793; AVX1-NEXT:    sarq $63, %rcx
2794; AVX1-NEXT:    vpinsrb $2, %ecx, %xmm0, %xmm0
2795; AVX1-NEXT:    movq %rax, %rcx
2796; AVX1-NEXT:    shlq $60, %rcx
2797; AVX1-NEXT:    sarq $63, %rcx
2798; AVX1-NEXT:    vpinsrb $3, %ecx, %xmm0, %xmm0
2799; AVX1-NEXT:    movq %rax, %rcx
2800; AVX1-NEXT:    shlq $59, %rcx
2801; AVX1-NEXT:    sarq $63, %rcx
2802; AVX1-NEXT:    vpinsrb $4, %ecx, %xmm0, %xmm0
2803; AVX1-NEXT:    movq %rax, %rcx
2804; AVX1-NEXT:    shlq $58, %rcx
2805; AVX1-NEXT:    sarq $63, %rcx
2806; AVX1-NEXT:    vpinsrb $5, %ecx, %xmm0, %xmm0
2807; AVX1-NEXT:    movq %rax, %rcx
2808; AVX1-NEXT:    shlq $57, %rcx
2809; AVX1-NEXT:    sarq $63, %rcx
2810; AVX1-NEXT:    vpinsrb $6, %ecx, %xmm0, %xmm0
2811; AVX1-NEXT:    movsbq %al, %rcx
2812; AVX1-NEXT:    shrq $7, %rcx
2813; AVX1-NEXT:    vpinsrb $7, %ecx, %xmm0, %xmm0
2814; AVX1-NEXT:    movq %rax, %rcx
2815; AVX1-NEXT:    shlq $55, %rcx
2816; AVX1-NEXT:    sarq $63, %rcx
2817; AVX1-NEXT:    vpinsrb $8, %ecx, %xmm0, %xmm0
2818; AVX1-NEXT:    movq %rax, %rcx
2819; AVX1-NEXT:    shlq $54, %rcx
2820; AVX1-NEXT:    sarq $63, %rcx
2821; AVX1-NEXT:    vpinsrb $9, %ecx, %xmm0, %xmm0
2822; AVX1-NEXT:    movq %rax, %rcx
2823; AVX1-NEXT:    shlq $53, %rcx
2824; AVX1-NEXT:    sarq $63, %rcx
2825; AVX1-NEXT:    vpinsrb $10, %ecx, %xmm0, %xmm0
2826; AVX1-NEXT:    movq %rax, %rcx
2827; AVX1-NEXT:    shlq $52, %rcx
2828; AVX1-NEXT:    sarq $63, %rcx
2829; AVX1-NEXT:    vpinsrb $11, %ecx, %xmm0, %xmm0
2830; AVX1-NEXT:    movq %rax, %rcx
2831; AVX1-NEXT:    shlq $51, %rcx
2832; AVX1-NEXT:    sarq $63, %rcx
2833; AVX1-NEXT:    vpinsrb $12, %ecx, %xmm0, %xmm0
2834; AVX1-NEXT:    movq %rax, %rcx
2835; AVX1-NEXT:    shlq $50, %rcx
2836; AVX1-NEXT:    sarq $63, %rcx
2837; AVX1-NEXT:    vpinsrb $13, %ecx, %xmm0, %xmm0
2838; AVX1-NEXT:    movq %rax, %rcx
2839; AVX1-NEXT:    shlq $49, %rcx
2840; AVX1-NEXT:    sarq $63, %rcx
2841; AVX1-NEXT:    vpinsrb $14, %ecx, %xmm0, %xmm0
2842; AVX1-NEXT:    shrq $15, %rax
2843; AVX1-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
2844; AVX1-NEXT:    retq
2845;
2846; AVX2-LABEL: load_sext_16i1_to_16i8:
2847; AVX2:       # BB#0: # %entry
2848; AVX2-NEXT:    movswq (%rdi), %rax
2849; AVX2-NEXT:    movq %rax, %rcx
2850; AVX2-NEXT:    shlq $62, %rcx
2851; AVX2-NEXT:    sarq $63, %rcx
2852; AVX2-NEXT:    movq %rax, %rdx
2853; AVX2-NEXT:    shlq $63, %rdx
2854; AVX2-NEXT:    sarq $63, %rdx
2855; AVX2-NEXT:    vmovd %edx, %xmm0
2856; AVX2-NEXT:    vpinsrb $1, %ecx, %xmm0, %xmm0
2857; AVX2-NEXT:    movq %rax, %rcx
2858; AVX2-NEXT:    shlq $61, %rcx
2859; AVX2-NEXT:    sarq $63, %rcx
2860; AVX2-NEXT:    vpinsrb $2, %ecx, %xmm0, %xmm0
2861; AVX2-NEXT:    movq %rax, %rcx
2862; AVX2-NEXT:    shlq $60, %rcx
2863; AVX2-NEXT:    sarq $63, %rcx
2864; AVX2-NEXT:    vpinsrb $3, %ecx, %xmm0, %xmm0
2865; AVX2-NEXT:    movq %rax, %rcx
2866; AVX2-NEXT:    shlq $59, %rcx
2867; AVX2-NEXT:    sarq $63, %rcx
2868; AVX2-NEXT:    vpinsrb $4, %ecx, %xmm0, %xmm0
2869; AVX2-NEXT:    movq %rax, %rcx
2870; AVX2-NEXT:    shlq $58, %rcx
2871; AVX2-NEXT:    sarq $63, %rcx
2872; AVX2-NEXT:    vpinsrb $5, %ecx, %xmm0, %xmm0
2873; AVX2-NEXT:    movq %rax, %rcx
2874; AVX2-NEXT:    shlq $57, %rcx
2875; AVX2-NEXT:    sarq $63, %rcx
2876; AVX2-NEXT:    vpinsrb $6, %ecx, %xmm0, %xmm0
2877; AVX2-NEXT:    movsbq %al, %rcx
2878; AVX2-NEXT:    shrq $7, %rcx
2879; AVX2-NEXT:    vpinsrb $7, %ecx, %xmm0, %xmm0
2880; AVX2-NEXT:    movq %rax, %rcx
2881; AVX2-NEXT:    shlq $55, %rcx
2882; AVX2-NEXT:    sarq $63, %rcx
2883; AVX2-NEXT:    vpinsrb $8, %ecx, %xmm0, %xmm0
2884; AVX2-NEXT:    movq %rax, %rcx
2885; AVX2-NEXT:    shlq $54, %rcx
2886; AVX2-NEXT:    sarq $63, %rcx
2887; AVX2-NEXT:    vpinsrb $9, %ecx, %xmm0, %xmm0
2888; AVX2-NEXT:    movq %rax, %rcx
2889; AVX2-NEXT:    shlq $53, %rcx
2890; AVX2-NEXT:    sarq $63, %rcx
2891; AVX2-NEXT:    vpinsrb $10, %ecx, %xmm0, %xmm0
2892; AVX2-NEXT:    movq %rax, %rcx
2893; AVX2-NEXT:    shlq $52, %rcx
2894; AVX2-NEXT:    sarq $63, %rcx
2895; AVX2-NEXT:    vpinsrb $11, %ecx, %xmm0, %xmm0
2896; AVX2-NEXT:    movq %rax, %rcx
2897; AVX2-NEXT:    shlq $51, %rcx
2898; AVX2-NEXT:    sarq $63, %rcx
2899; AVX2-NEXT:    vpinsrb $12, %ecx, %xmm0, %xmm0
2900; AVX2-NEXT:    movq %rax, %rcx
2901; AVX2-NEXT:    shlq $50, %rcx
2902; AVX2-NEXT:    sarq $63, %rcx
2903; AVX2-NEXT:    vpinsrb $13, %ecx, %xmm0, %xmm0
2904; AVX2-NEXT:    movq %rax, %rcx
2905; AVX2-NEXT:    shlq $49, %rcx
2906; AVX2-NEXT:    sarq $63, %rcx
2907; AVX2-NEXT:    vpinsrb $14, %ecx, %xmm0, %xmm0
2908; AVX2-NEXT:    shrq $15, %rax
2909; AVX2-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
2910; AVX2-NEXT:    retq
2911;
2912; AVX512F-LABEL: load_sext_16i1_to_16i8:
2913; AVX512F:       # BB#0: # %entry
2914; AVX512F-NEXT:    kmovw (%rdi), %k1
2915; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2916; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
2917; AVX512F-NEXT:    vzeroupper
2918; AVX512F-NEXT:    retq
2919;
2920; AVX512BW-LABEL: load_sext_16i1_to_16i8:
2921; AVX512BW:       # BB#0: # %entry
2922; AVX512BW-NEXT:    kmovw (%rdi), %k0
2923; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
2924; AVX512BW-NEXT:    # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
2925; AVX512BW-NEXT:    vzeroupper
2926; AVX512BW-NEXT:    retq
2927;
2928; X32-SSE41-LABEL: load_sext_16i1_to_16i8:
2929; X32-SSE41:       # BB#0: # %entry
2930; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2931; X32-SSE41-NEXT:    movswl (%eax), %eax
2932; X32-SSE41-NEXT:    movl %eax, %ecx
2933; X32-SSE41-NEXT:    shll $30, %ecx
2934; X32-SSE41-NEXT:    sarl $31, %ecx
2935; X32-SSE41-NEXT:    movl %eax, %edx
2936; X32-SSE41-NEXT:    shll $31, %edx
2937; X32-SSE41-NEXT:    sarl $31, %edx
2938; X32-SSE41-NEXT:    movd %edx, %xmm0
2939; X32-SSE41-NEXT:    pinsrb $1, %ecx, %xmm0
2940; X32-SSE41-NEXT:    movl %eax, %ecx
2941; X32-SSE41-NEXT:    shll $29, %ecx
2942; X32-SSE41-NEXT:    sarl $31, %ecx
2943; X32-SSE41-NEXT:    pinsrb $2, %ecx, %xmm0
2944; X32-SSE41-NEXT:    movl %eax, %ecx
2945; X32-SSE41-NEXT:    shll $28, %ecx
2946; X32-SSE41-NEXT:    sarl $31, %ecx
2947; X32-SSE41-NEXT:    pinsrb $3, %ecx, %xmm0
2948; X32-SSE41-NEXT:    movl %eax, %ecx
2949; X32-SSE41-NEXT:    shll $27, %ecx
2950; X32-SSE41-NEXT:    sarl $31, %ecx
2951; X32-SSE41-NEXT:    pinsrb $4, %ecx, %xmm0
2952; X32-SSE41-NEXT:    movl %eax, %ecx
2953; X32-SSE41-NEXT:    shll $26, %ecx
2954; X32-SSE41-NEXT:    sarl $31, %ecx
2955; X32-SSE41-NEXT:    pinsrb $5, %ecx, %xmm0
2956; X32-SSE41-NEXT:    movl %eax, %ecx
2957; X32-SSE41-NEXT:    shll $25, %ecx
2958; X32-SSE41-NEXT:    sarl $31, %ecx
2959; X32-SSE41-NEXT:    pinsrb $6, %ecx, %xmm0
2960; X32-SSE41-NEXT:    movsbl %al, %ecx
2961; X32-SSE41-NEXT:    shrl $7, %ecx
2962; X32-SSE41-NEXT:    pinsrb $7, %ecx, %xmm0
2963; X32-SSE41-NEXT:    movl %eax, %ecx
2964; X32-SSE41-NEXT:    shll $23, %ecx
2965; X32-SSE41-NEXT:    sarl $31, %ecx
2966; X32-SSE41-NEXT:    pinsrb $8, %ecx, %xmm0
2967; X32-SSE41-NEXT:    movl %eax, %ecx
2968; X32-SSE41-NEXT:    shll $22, %ecx
2969; X32-SSE41-NEXT:    sarl $31, %ecx
2970; X32-SSE41-NEXT:    pinsrb $9, %ecx, %xmm0
2971; X32-SSE41-NEXT:    movl %eax, %ecx
2972; X32-SSE41-NEXT:    shll $21, %ecx
2973; X32-SSE41-NEXT:    sarl $31, %ecx
2974; X32-SSE41-NEXT:    pinsrb $10, %ecx, %xmm0
2975; X32-SSE41-NEXT:    movl %eax, %ecx
2976; X32-SSE41-NEXT:    shll $20, %ecx
2977; X32-SSE41-NEXT:    sarl $31, %ecx
2978; X32-SSE41-NEXT:    pinsrb $11, %ecx, %xmm0
2979; X32-SSE41-NEXT:    movl %eax, %ecx
2980; X32-SSE41-NEXT:    shll $19, %ecx
2981; X32-SSE41-NEXT:    sarl $31, %ecx
2982; X32-SSE41-NEXT:    pinsrb $12, %ecx, %xmm0
2983; X32-SSE41-NEXT:    movl %eax, %ecx
2984; X32-SSE41-NEXT:    shll $18, %ecx
2985; X32-SSE41-NEXT:    sarl $31, %ecx
2986; X32-SSE41-NEXT:    pinsrb $13, %ecx, %xmm0
2987; X32-SSE41-NEXT:    movl %eax, %ecx
2988; X32-SSE41-NEXT:    shll $17, %ecx
2989; X32-SSE41-NEXT:    sarl $31, %ecx
2990; X32-SSE41-NEXT:    pinsrb $14, %ecx, %xmm0
2991; X32-SSE41-NEXT:    shrl $15, %eax
2992; X32-SSE41-NEXT:    pinsrb $15, %eax, %xmm0
2993; X32-SSE41-NEXT:    retl
2994entry:
2995 %X = load <16 x i1>, <16 x i1>* %ptr
2996 %Y = sext <16 x i1> %X to <16 x i8>
2997 ret <16 x i8> %Y
2998}
2999
3000define <16 x i16> @load_sext_16i1_to_16i16(<16 x i1> *%ptr) {
3001; SSE2-LABEL: load_sext_16i1_to_16i16:
3002; SSE2:       # BB#0: # %entry
3003; SSE2-NEXT:    movzwl (%rdi), %eax
3004; SSE2-NEXT:    movl %eax, %ecx
3005; SSE2-NEXT:    shrl $7, %ecx
3006; SSE2-NEXT:    andl $1, %ecx
3007; SSE2-NEXT:    movd %ecx, %xmm0
3008; SSE2-NEXT:    movl %eax, %ecx
3009; SSE2-NEXT:    shrl $6, %ecx
3010; SSE2-NEXT:    andl $1, %ecx
3011; SSE2-NEXT:    movd %ecx, %xmm1
3012; 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]
3013; SSE2-NEXT:    movl %eax, %ecx
3014; SSE2-NEXT:    shrl $5, %ecx
3015; SSE2-NEXT:    andl $1, %ecx
3016; SSE2-NEXT:    movd %ecx, %xmm0
3017; SSE2-NEXT:    movl %eax, %ecx
3018; SSE2-NEXT:    shrl $4, %ecx
3019; SSE2-NEXT:    andl $1, %ecx
3020; SSE2-NEXT:    movd %ecx, %xmm2
3021; 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]
3022; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
3023; SSE2-NEXT:    movl %eax, %ecx
3024; SSE2-NEXT:    shrl $3, %ecx
3025; SSE2-NEXT:    andl $1, %ecx
3026; SSE2-NEXT:    movd %ecx, %xmm0
3027; SSE2-NEXT:    movl %eax, %ecx
3028; SSE2-NEXT:    shrl $2, %ecx
3029; SSE2-NEXT:    andl $1, %ecx
3030; SSE2-NEXT:    movd %ecx, %xmm3
3031; 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]
3032; SSE2-NEXT:    movl %eax, %ecx
3033; SSE2-NEXT:    andl $1, %ecx
3034; SSE2-NEXT:    movd %ecx, %xmm1
3035; SSE2-NEXT:    movl %eax, %ecx
3036; SSE2-NEXT:    shrl %ecx
3037; SSE2-NEXT:    andl $1, %ecx
3038; SSE2-NEXT:    movd %ecx, %xmm0
3039; 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]
3040; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3]
3041; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3042; SSE2-NEXT:    movl %eax, %ecx
3043; SSE2-NEXT:    shrl $11, %ecx
3044; SSE2-NEXT:    andl $1, %ecx
3045; SSE2-NEXT:    movd %ecx, %xmm0
3046; SSE2-NEXT:    movl %eax, %ecx
3047; SSE2-NEXT:    shrl $10, %ecx
3048; SSE2-NEXT:    andl $1, %ecx
3049; SSE2-NEXT:    movd %ecx, %xmm2
3050; 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]
3051; SSE2-NEXT:    movl %eax, %ecx
3052; SSE2-NEXT:    shrl $9, %ecx
3053; SSE2-NEXT:    andl $1, %ecx
3054; SSE2-NEXT:    movd %ecx, %xmm3
3055; SSE2-NEXT:    movl %eax, %ecx
3056; SSE2-NEXT:    shrl $8, %ecx
3057; SSE2-NEXT:    andl $1, %ecx
3058; SSE2-NEXT:    movd %ecx, %xmm0
3059; 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]
3060; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
3061; SSE2-NEXT:    movl %eax, %ecx
3062; SSE2-NEXT:    shrl $13, %ecx
3063; SSE2-NEXT:    andl $1, %ecx
3064; SSE2-NEXT:    movd %ecx, %xmm2
3065; SSE2-NEXT:    movl %eax, %ecx
3066; SSE2-NEXT:    shrl $12, %ecx
3067; SSE2-NEXT:    andl $1, %ecx
3068; SSE2-NEXT:    movd %ecx, %xmm3
3069; 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]
3070; SSE2-NEXT:    movl %eax, %ecx
3071; SSE2-NEXT:    shrl $14, %ecx
3072; SSE2-NEXT:    andl $1, %ecx
3073; SSE2-NEXT:    movd %ecx, %xmm2
3074; SSE2-NEXT:    shrl $15, %eax
3075; SSE2-NEXT:    movzwl %ax, %eax
3076; SSE2-NEXT:    movd %eax, %xmm4
3077; 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]
3078; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
3079; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
3080; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
3081; SSE2-NEXT:    movdqa %xmm1, %xmm0
3082; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3083; SSE2-NEXT:    psllw $15, %xmm0
3084; SSE2-NEXT:    psraw $15, %xmm0
3085; 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]
3086; SSE2-NEXT:    psllw $15, %xmm1
3087; SSE2-NEXT:    psraw $15, %xmm1
3088; SSE2-NEXT:    retq
3089;
3090; SSSE3-LABEL: load_sext_16i1_to_16i16:
3091; SSSE3:       # BB#0: # %entry
3092; SSSE3-NEXT:    movzwl (%rdi), %eax
3093; SSSE3-NEXT:    movl %eax, %ecx
3094; SSSE3-NEXT:    shrl $7, %ecx
3095; SSSE3-NEXT:    andl $1, %ecx
3096; SSSE3-NEXT:    movd %ecx, %xmm0
3097; SSSE3-NEXT:    movl %eax, %ecx
3098; SSSE3-NEXT:    shrl $6, %ecx
3099; SSSE3-NEXT:    andl $1, %ecx
3100; SSSE3-NEXT:    movd %ecx, %xmm1
3101; 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]
3102; SSSE3-NEXT:    movl %eax, %ecx
3103; SSSE3-NEXT:    shrl $5, %ecx
3104; SSSE3-NEXT:    andl $1, %ecx
3105; SSSE3-NEXT:    movd %ecx, %xmm0
3106; SSSE3-NEXT:    movl %eax, %ecx
3107; SSSE3-NEXT:    shrl $4, %ecx
3108; SSSE3-NEXT:    andl $1, %ecx
3109; SSSE3-NEXT:    movd %ecx, %xmm2
3110; 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]
3111; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
3112; SSSE3-NEXT:    movl %eax, %ecx
3113; SSSE3-NEXT:    shrl $3, %ecx
3114; SSSE3-NEXT:    andl $1, %ecx
3115; SSSE3-NEXT:    movd %ecx, %xmm0
3116; SSSE3-NEXT:    movl %eax, %ecx
3117; SSSE3-NEXT:    shrl $2, %ecx
3118; SSSE3-NEXT:    andl $1, %ecx
3119; SSSE3-NEXT:    movd %ecx, %xmm3
3120; 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]
3121; SSSE3-NEXT:    movl %eax, %ecx
3122; SSSE3-NEXT:    andl $1, %ecx
3123; SSSE3-NEXT:    movd %ecx, %xmm1
3124; SSSE3-NEXT:    movl %eax, %ecx
3125; SSSE3-NEXT:    shrl %ecx
3126; SSSE3-NEXT:    andl $1, %ecx
3127; SSSE3-NEXT:    movd %ecx, %xmm0
3128; 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]
3129; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3]
3130; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3131; SSSE3-NEXT:    movl %eax, %ecx
3132; SSSE3-NEXT:    shrl $11, %ecx
3133; SSSE3-NEXT:    andl $1, %ecx
3134; SSSE3-NEXT:    movd %ecx, %xmm0
3135; SSSE3-NEXT:    movl %eax, %ecx
3136; SSSE3-NEXT:    shrl $10, %ecx
3137; SSSE3-NEXT:    andl $1, %ecx
3138; SSSE3-NEXT:    movd %ecx, %xmm2
3139; 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]
3140; SSSE3-NEXT:    movl %eax, %ecx
3141; SSSE3-NEXT:    shrl $9, %ecx
3142; SSSE3-NEXT:    andl $1, %ecx
3143; SSSE3-NEXT:    movd %ecx, %xmm3
3144; SSSE3-NEXT:    movl %eax, %ecx
3145; SSSE3-NEXT:    shrl $8, %ecx
3146; SSSE3-NEXT:    andl $1, %ecx
3147; SSSE3-NEXT:    movd %ecx, %xmm0
3148; 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]
3149; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
3150; SSSE3-NEXT:    movl %eax, %ecx
3151; SSSE3-NEXT:    shrl $13, %ecx
3152; SSSE3-NEXT:    andl $1, %ecx
3153; SSSE3-NEXT:    movd %ecx, %xmm2
3154; SSSE3-NEXT:    movl %eax, %ecx
3155; SSSE3-NEXT:    shrl $12, %ecx
3156; SSSE3-NEXT:    andl $1, %ecx
3157; SSSE3-NEXT:    movd %ecx, %xmm3
3158; 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]
3159; SSSE3-NEXT:    movl %eax, %ecx
3160; SSSE3-NEXT:    shrl $14, %ecx
3161; SSSE3-NEXT:    andl $1, %ecx
3162; SSSE3-NEXT:    movd %ecx, %xmm2
3163; SSSE3-NEXT:    shrl $15, %eax
3164; SSSE3-NEXT:    movzwl %ax, %eax
3165; SSSE3-NEXT:    movd %eax, %xmm4
3166; 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]
3167; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
3168; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
3169; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
3170; SSSE3-NEXT:    movdqa %xmm1, %xmm0
3171; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3172; SSSE3-NEXT:    psllw $15, %xmm0
3173; SSSE3-NEXT:    psraw $15, %xmm0
3174; 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]
3175; SSSE3-NEXT:    psllw $15, %xmm1
3176; SSSE3-NEXT:    psraw $15, %xmm1
3177; SSSE3-NEXT:    retq
3178;
3179; SSE41-LABEL: load_sext_16i1_to_16i16:
3180; SSE41:       # BB#0: # %entry
3181; SSE41-NEXT:    movzwl (%rdi), %eax
3182; SSE41-NEXT:    movl %eax, %ecx
3183; SSE41-NEXT:    shrl %ecx
3184; SSE41-NEXT:    andl $1, %ecx
3185; SSE41-NEXT:    movl %eax, %edx
3186; SSE41-NEXT:    andl $1, %edx
3187; SSE41-NEXT:    movd %edx, %xmm1
3188; SSE41-NEXT:    pinsrb $1, %ecx, %xmm1
3189; SSE41-NEXT:    movl %eax, %ecx
3190; SSE41-NEXT:    shrl $2, %ecx
3191; SSE41-NEXT:    andl $1, %ecx
3192; SSE41-NEXT:    pinsrb $2, %ecx, %xmm1
3193; SSE41-NEXT:    movl %eax, %ecx
3194; SSE41-NEXT:    shrl $3, %ecx
3195; SSE41-NEXT:    andl $1, %ecx
3196; SSE41-NEXT:    pinsrb $3, %ecx, %xmm1
3197; SSE41-NEXT:    movl %eax, %ecx
3198; SSE41-NEXT:    shrl $4, %ecx
3199; SSE41-NEXT:    andl $1, %ecx
3200; SSE41-NEXT:    pinsrb $4, %ecx, %xmm1
3201; SSE41-NEXT:    movl %eax, %ecx
3202; SSE41-NEXT:    shrl $5, %ecx
3203; SSE41-NEXT:    andl $1, %ecx
3204; SSE41-NEXT:    pinsrb $5, %ecx, %xmm1
3205; SSE41-NEXT:    movl %eax, %ecx
3206; SSE41-NEXT:    shrl $6, %ecx
3207; SSE41-NEXT:    andl $1, %ecx
3208; SSE41-NEXT:    pinsrb $6, %ecx, %xmm1
3209; SSE41-NEXT:    movl %eax, %ecx
3210; SSE41-NEXT:    shrl $7, %ecx
3211; SSE41-NEXT:    andl $1, %ecx
3212; SSE41-NEXT:    pinsrb $7, %ecx, %xmm1
3213; SSE41-NEXT:    movl %eax, %ecx
3214; SSE41-NEXT:    shrl $8, %ecx
3215; SSE41-NEXT:    andl $1, %ecx
3216; SSE41-NEXT:    pinsrb $8, %ecx, %xmm1
3217; SSE41-NEXT:    movl %eax, %ecx
3218; SSE41-NEXT:    shrl $9, %ecx
3219; SSE41-NEXT:    andl $1, %ecx
3220; SSE41-NEXT:    pinsrb $9, %ecx, %xmm1
3221; SSE41-NEXT:    movl %eax, %ecx
3222; SSE41-NEXT:    shrl $10, %ecx
3223; SSE41-NEXT:    andl $1, %ecx
3224; SSE41-NEXT:    pinsrb $10, %ecx, %xmm1
3225; SSE41-NEXT:    movl %eax, %ecx
3226; SSE41-NEXT:    shrl $11, %ecx
3227; SSE41-NEXT:    andl $1, %ecx
3228; SSE41-NEXT:    pinsrb $11, %ecx, %xmm1
3229; SSE41-NEXT:    movl %eax, %ecx
3230; SSE41-NEXT:    shrl $12, %ecx
3231; SSE41-NEXT:    andl $1, %ecx
3232; SSE41-NEXT:    pinsrb $12, %ecx, %xmm1
3233; SSE41-NEXT:    movl %eax, %ecx
3234; SSE41-NEXT:    shrl $13, %ecx
3235; SSE41-NEXT:    andl $1, %ecx
3236; SSE41-NEXT:    pinsrb $13, %ecx, %xmm1
3237; SSE41-NEXT:    movl %eax, %ecx
3238; SSE41-NEXT:    shrl $14, %ecx
3239; SSE41-NEXT:    andl $1, %ecx
3240; SSE41-NEXT:    pinsrb $14, %ecx, %xmm1
3241; SSE41-NEXT:    shrl $15, %eax
3242; SSE41-NEXT:    movzwl %ax, %eax
3243; SSE41-NEXT:    pinsrb $15, %eax, %xmm1
3244; 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
3245; SSE41-NEXT:    psllw $15, %xmm0
3246; SSE41-NEXT:    psraw $15, %xmm0
3247; SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
3248; SSE41-NEXT:    psllw $15, %xmm1
3249; SSE41-NEXT:    psraw $15, %xmm1
3250; SSE41-NEXT:    retq
3251;
3252; AVX1-LABEL: load_sext_16i1_to_16i16:
3253; AVX1:       # BB#0: # %entry
3254; AVX1-NEXT:    pushq %rbp
3255; AVX1-NEXT:    .cfi_def_cfa_offset 16
3256; AVX1-NEXT:    pushq %r15
3257; AVX1-NEXT:    .cfi_def_cfa_offset 24
3258; AVX1-NEXT:    pushq %r14
3259; AVX1-NEXT:    .cfi_def_cfa_offset 32
3260; AVX1-NEXT:    pushq %r13
3261; AVX1-NEXT:    .cfi_def_cfa_offset 40
3262; AVX1-NEXT:    pushq %r12
3263; AVX1-NEXT:    .cfi_def_cfa_offset 48
3264; AVX1-NEXT:    pushq %rbx
3265; AVX1-NEXT:    .cfi_def_cfa_offset 56
3266; AVX1-NEXT:    .cfi_offset %rbx, -56
3267; AVX1-NEXT:    .cfi_offset %r12, -48
3268; AVX1-NEXT:    .cfi_offset %r13, -40
3269; AVX1-NEXT:    .cfi_offset %r14, -32
3270; AVX1-NEXT:    .cfi_offset %r15, -24
3271; AVX1-NEXT:    .cfi_offset %rbp, -16
3272; AVX1-NEXT:    movswq (%rdi), %rax
3273; AVX1-NEXT:    movq %rax, %rcx
3274; AVX1-NEXT:    shlq $55, %rcx
3275; AVX1-NEXT:    sarq $63, %rcx
3276; AVX1-NEXT:    vmovd %ecx, %xmm0
3277; AVX1-NEXT:    movq %rax, %r8
3278; AVX1-NEXT:    movq %rax, %r10
3279; AVX1-NEXT:    movq %rax, %r11
3280; AVX1-NEXT:    movq %rax, %r14
3281; AVX1-NEXT:    movq %rax, %r15
3282; AVX1-NEXT:    movq %rax, %r9
3283; AVX1-NEXT:    movq %rax, %r12
3284; AVX1-NEXT:    movq %rax, %r13
3285; AVX1-NEXT:    movq %rax, %rbx
3286; AVX1-NEXT:    movq %rax, %rdi
3287; AVX1-NEXT:    movq %rax, %rcx
3288; AVX1-NEXT:    movq %rax, %rdx
3289; AVX1-NEXT:    movq %rax, %rsi
3290; AVX1-NEXT:    movsbq %al, %rbp
3291; AVX1-NEXT:    shlq $54, %rax
3292; AVX1-NEXT:    sarq $63, %rax
3293; AVX1-NEXT:    vpinsrw $1, %eax, %xmm0, %xmm0
3294; AVX1-NEXT:    shlq $53, %r8
3295; AVX1-NEXT:    sarq $63, %r8
3296; AVX1-NEXT:    vpinsrw $2, %r8d, %xmm0, %xmm0
3297; AVX1-NEXT:    shlq $52, %r10
3298; AVX1-NEXT:    sarq $63, %r10
3299; AVX1-NEXT:    vpinsrw $3, %r10d, %xmm0, %xmm0
3300; AVX1-NEXT:    shlq $51, %r11
3301; AVX1-NEXT:    sarq $63, %r11
3302; AVX1-NEXT:    vpinsrw $4, %r11d, %xmm0, %xmm0
3303; AVX1-NEXT:    shlq $50, %r14
3304; AVX1-NEXT:    sarq $63, %r14
3305; AVX1-NEXT:    vpinsrw $5, %r14d, %xmm0, %xmm0
3306; AVX1-NEXT:    shlq $49, %r15
3307; AVX1-NEXT:    sarq $63, %r15
3308; AVX1-NEXT:    vpinsrw $6, %r15d, %xmm0, %xmm0
3309; AVX1-NEXT:    shrq $15, %r9
3310; AVX1-NEXT:    vpinsrw $7, %r9d, %xmm0, %xmm0
3311; AVX1-NEXT:    shlq $63, %r13
3312; AVX1-NEXT:    sarq $63, %r13
3313; AVX1-NEXT:    vmovd %r13d, %xmm1
3314; AVX1-NEXT:    shlq $62, %r12
3315; AVX1-NEXT:    sarq $63, %r12
3316; AVX1-NEXT:    vpinsrw $1, %r12d, %xmm1, %xmm1
3317; AVX1-NEXT:    shlq $61, %rbx
3318; AVX1-NEXT:    sarq $63, %rbx
3319; AVX1-NEXT:    vpinsrw $2, %ebx, %xmm1, %xmm1
3320; AVX1-NEXT:    shlq $60, %rdi
3321; AVX1-NEXT:    sarq $63, %rdi
3322; AVX1-NEXT:    vpinsrw $3, %edi, %xmm1, %xmm1
3323; AVX1-NEXT:    shlq $59, %rcx
3324; AVX1-NEXT:    sarq $63, %rcx
3325; AVX1-NEXT:    vpinsrw $4, %ecx, %xmm1, %xmm1
3326; AVX1-NEXT:    shlq $58, %rdx
3327; AVX1-NEXT:    sarq $63, %rdx
3328; AVX1-NEXT:    vpinsrw $5, %edx, %xmm1, %xmm1
3329; AVX1-NEXT:    shlq $57, %rsi
3330; AVX1-NEXT:    sarq $63, %rsi
3331; AVX1-NEXT:    vpinsrw $6, %esi, %xmm1, %xmm1
3332; AVX1-NEXT:    shrq $7, %rbp
3333; AVX1-NEXT:    vpinsrw $7, %ebp, %xmm1, %xmm1
3334; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
3335; AVX1-NEXT:    popq %rbx
3336; AVX1-NEXT:    .cfi_def_cfa_offset 48
3337; AVX1-NEXT:    popq %r12
3338; AVX1-NEXT:    .cfi_def_cfa_offset 40
3339; AVX1-NEXT:    popq %r13
3340; AVX1-NEXT:    .cfi_def_cfa_offset 32
3341; AVX1-NEXT:    popq %r14
3342; AVX1-NEXT:    .cfi_def_cfa_offset 24
3343; AVX1-NEXT:    popq %r15
3344; AVX1-NEXT:    .cfi_def_cfa_offset 16
3345; AVX1-NEXT:    popq %rbp
3346; AVX1-NEXT:    .cfi_def_cfa_offset 8
3347; AVX1-NEXT:    retq
3348;
3349; AVX2-LABEL: load_sext_16i1_to_16i16:
3350; AVX2:       # BB#0: # %entry
3351; AVX2-NEXT:    pushq %rbp
3352; AVX2-NEXT:    .cfi_def_cfa_offset 16
3353; AVX2-NEXT:    pushq %r15
3354; AVX2-NEXT:    .cfi_def_cfa_offset 24
3355; AVX2-NEXT:    pushq %r14
3356; AVX2-NEXT:    .cfi_def_cfa_offset 32
3357; AVX2-NEXT:    pushq %r13
3358; AVX2-NEXT:    .cfi_def_cfa_offset 40
3359; AVX2-NEXT:    pushq %r12
3360; AVX2-NEXT:    .cfi_def_cfa_offset 48
3361; AVX2-NEXT:    pushq %rbx
3362; AVX2-NEXT:    .cfi_def_cfa_offset 56
3363; AVX2-NEXT:    .cfi_offset %rbx, -56
3364; AVX2-NEXT:    .cfi_offset %r12, -48
3365; AVX2-NEXT:    .cfi_offset %r13, -40
3366; AVX2-NEXT:    .cfi_offset %r14, -32
3367; AVX2-NEXT:    .cfi_offset %r15, -24
3368; AVX2-NEXT:    .cfi_offset %rbp, -16
3369; AVX2-NEXT:    movswq (%rdi), %rax
3370; AVX2-NEXT:    movq %rax, %rcx
3371; AVX2-NEXT:    shlq $55, %rcx
3372; AVX2-NEXT:    sarq $63, %rcx
3373; AVX2-NEXT:    vmovd %ecx, %xmm0
3374; AVX2-NEXT:    movq %rax, %r8
3375; AVX2-NEXT:    movq %rax, %r10
3376; AVX2-NEXT:    movq %rax, %r11
3377; AVX2-NEXT:    movq %rax, %r14
3378; AVX2-NEXT:    movq %rax, %r15
3379; AVX2-NEXT:    movq %rax, %r9
3380; AVX2-NEXT:    movq %rax, %r12
3381; AVX2-NEXT:    movq %rax, %r13
3382; AVX2-NEXT:    movq %rax, %rbx
3383; AVX2-NEXT:    movq %rax, %rdi
3384; AVX2-NEXT:    movq %rax, %rcx
3385; AVX2-NEXT:    movq %rax, %rdx
3386; AVX2-NEXT:    movq %rax, %rsi
3387; AVX2-NEXT:    movsbq %al, %rbp
3388; AVX2-NEXT:    shlq $54, %rax
3389; AVX2-NEXT:    sarq $63, %rax
3390; AVX2-NEXT:    vpinsrw $1, %eax, %xmm0, %xmm0
3391; AVX2-NEXT:    shlq $53, %r8
3392; AVX2-NEXT:    sarq $63, %r8
3393; AVX2-NEXT:    vpinsrw $2, %r8d, %xmm0, %xmm0
3394; AVX2-NEXT:    shlq $52, %r10
3395; AVX2-NEXT:    sarq $63, %r10
3396; AVX2-NEXT:    vpinsrw $3, %r10d, %xmm0, %xmm0
3397; AVX2-NEXT:    shlq $51, %r11
3398; AVX2-NEXT:    sarq $63, %r11
3399; AVX2-NEXT:    vpinsrw $4, %r11d, %xmm0, %xmm0
3400; AVX2-NEXT:    shlq $50, %r14
3401; AVX2-NEXT:    sarq $63, %r14
3402; AVX2-NEXT:    vpinsrw $5, %r14d, %xmm0, %xmm0
3403; AVX2-NEXT:    shlq $49, %r15
3404; AVX2-NEXT:    sarq $63, %r15
3405; AVX2-NEXT:    vpinsrw $6, %r15d, %xmm0, %xmm0
3406; AVX2-NEXT:    shrq $15, %r9
3407; AVX2-NEXT:    vpinsrw $7, %r9d, %xmm0, %xmm0
3408; AVX2-NEXT:    shlq $63, %r13
3409; AVX2-NEXT:    sarq $63, %r13
3410; AVX2-NEXT:    vmovd %r13d, %xmm1
3411; AVX2-NEXT:    shlq $62, %r12
3412; AVX2-NEXT:    sarq $63, %r12
3413; AVX2-NEXT:    vpinsrw $1, %r12d, %xmm1, %xmm1
3414; AVX2-NEXT:    shlq $61, %rbx
3415; AVX2-NEXT:    sarq $63, %rbx
3416; AVX2-NEXT:    vpinsrw $2, %ebx, %xmm1, %xmm1
3417; AVX2-NEXT:    shlq $60, %rdi
3418; AVX2-NEXT:    sarq $63, %rdi
3419; AVX2-NEXT:    vpinsrw $3, %edi, %xmm1, %xmm1
3420; AVX2-NEXT:    shlq $59, %rcx
3421; AVX2-NEXT:    sarq $63, %rcx
3422; AVX2-NEXT:    vpinsrw $4, %ecx, %xmm1, %xmm1
3423; AVX2-NEXT:    shlq $58, %rdx
3424; AVX2-NEXT:    sarq $63, %rdx
3425; AVX2-NEXT:    vpinsrw $5, %edx, %xmm1, %xmm1
3426; AVX2-NEXT:    shlq $57, %rsi
3427; AVX2-NEXT:    sarq $63, %rsi
3428; AVX2-NEXT:    vpinsrw $6, %esi, %xmm1, %xmm1
3429; AVX2-NEXT:    shrq $7, %rbp
3430; AVX2-NEXT:    vpinsrw $7, %ebp, %xmm1, %xmm1
3431; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
3432; AVX2-NEXT:    popq %rbx
3433; AVX2-NEXT:    .cfi_def_cfa_offset 48
3434; AVX2-NEXT:    popq %r12
3435; AVX2-NEXT:    .cfi_def_cfa_offset 40
3436; AVX2-NEXT:    popq %r13
3437; AVX2-NEXT:    .cfi_def_cfa_offset 32
3438; AVX2-NEXT:    popq %r14
3439; AVX2-NEXT:    .cfi_def_cfa_offset 24
3440; AVX2-NEXT:    popq %r15
3441; AVX2-NEXT:    .cfi_def_cfa_offset 16
3442; AVX2-NEXT:    popq %rbp
3443; AVX2-NEXT:    .cfi_def_cfa_offset 8
3444; AVX2-NEXT:    retq
3445;
3446; AVX512F-LABEL: load_sext_16i1_to_16i16:
3447; AVX512F:       # BB#0: # %entry
3448; AVX512F-NEXT:    kmovw (%rdi), %k1
3449; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
3450; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
3451; AVX512F-NEXT:    retq
3452;
3453; AVX512BW-LABEL: load_sext_16i1_to_16i16:
3454; AVX512BW:       # BB#0: # %entry
3455; AVX512BW-NEXT:    kmovw (%rdi), %k0
3456; AVX512BW-NEXT:    vpmovm2w %k0, %zmm0
3457; AVX512BW-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
3458; AVX512BW-NEXT:    retq
3459;
3460; X32-SSE41-LABEL: load_sext_16i1_to_16i16:
3461; X32-SSE41:       # BB#0: # %entry
3462; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
3463; X32-SSE41-NEXT:    movzwl (%eax), %eax
3464; X32-SSE41-NEXT:    movl %eax, %ecx
3465; X32-SSE41-NEXT:    shrl %ecx
3466; X32-SSE41-NEXT:    andl $1, %ecx
3467; X32-SSE41-NEXT:    movl %eax, %edx
3468; X32-SSE41-NEXT:    andl $1, %edx
3469; X32-SSE41-NEXT:    movd %edx, %xmm1
3470; X32-SSE41-NEXT:    pinsrb $1, %ecx, %xmm1
3471; X32-SSE41-NEXT:    movl %eax, %ecx
3472; X32-SSE41-NEXT:    shrl $2, %ecx
3473; X32-SSE41-NEXT:    andl $1, %ecx
3474; X32-SSE41-NEXT:    pinsrb $2, %ecx, %xmm1
3475; X32-SSE41-NEXT:    movl %eax, %ecx
3476; X32-SSE41-NEXT:    shrl $3, %ecx
3477; X32-SSE41-NEXT:    andl $1, %ecx
3478; X32-SSE41-NEXT:    pinsrb $3, %ecx, %xmm1
3479; X32-SSE41-NEXT:    movl %eax, %ecx
3480; X32-SSE41-NEXT:    shrl $4, %ecx
3481; X32-SSE41-NEXT:    andl $1, %ecx
3482; X32-SSE41-NEXT:    pinsrb $4, %ecx, %xmm1
3483; X32-SSE41-NEXT:    movl %eax, %ecx
3484; X32-SSE41-NEXT:    shrl $5, %ecx
3485; X32-SSE41-NEXT:    andl $1, %ecx
3486; X32-SSE41-NEXT:    pinsrb $5, %ecx, %xmm1
3487; X32-SSE41-NEXT:    movl %eax, %ecx
3488; X32-SSE41-NEXT:    shrl $6, %ecx
3489; X32-SSE41-NEXT:    andl $1, %ecx
3490; X32-SSE41-NEXT:    pinsrb $6, %ecx, %xmm1
3491; X32-SSE41-NEXT:    movl %eax, %ecx
3492; X32-SSE41-NEXT:    shrl $7, %ecx
3493; X32-SSE41-NEXT:    andl $1, %ecx
3494; X32-SSE41-NEXT:    pinsrb $7, %ecx, %xmm1
3495; X32-SSE41-NEXT:    movl %eax, %ecx
3496; X32-SSE41-NEXT:    shrl $8, %ecx
3497; X32-SSE41-NEXT:    andl $1, %ecx
3498; X32-SSE41-NEXT:    pinsrb $8, %ecx, %xmm1
3499; X32-SSE41-NEXT:    movl %eax, %ecx
3500; X32-SSE41-NEXT:    shrl $9, %ecx
3501; X32-SSE41-NEXT:    andl $1, %ecx
3502; X32-SSE41-NEXT:    pinsrb $9, %ecx, %xmm1
3503; X32-SSE41-NEXT:    movl %eax, %ecx
3504; X32-SSE41-NEXT:    shrl $10, %ecx
3505; X32-SSE41-NEXT:    andl $1, %ecx
3506; X32-SSE41-NEXT:    pinsrb $10, %ecx, %xmm1
3507; X32-SSE41-NEXT:    movl %eax, %ecx
3508; X32-SSE41-NEXT:    shrl $11, %ecx
3509; X32-SSE41-NEXT:    andl $1, %ecx
3510; X32-SSE41-NEXT:    pinsrb $11, %ecx, %xmm1
3511; X32-SSE41-NEXT:    movl %eax, %ecx
3512; X32-SSE41-NEXT:    shrl $12, %ecx
3513; X32-SSE41-NEXT:    andl $1, %ecx
3514; X32-SSE41-NEXT:    pinsrb $12, %ecx, %xmm1
3515; X32-SSE41-NEXT:    movl %eax, %ecx
3516; X32-SSE41-NEXT:    shrl $13, %ecx
3517; X32-SSE41-NEXT:    andl $1, %ecx
3518; X32-SSE41-NEXT:    pinsrb $13, %ecx, %xmm1
3519; X32-SSE41-NEXT:    movl %eax, %ecx
3520; X32-SSE41-NEXT:    shrl $14, %ecx
3521; X32-SSE41-NEXT:    andl $1, %ecx
3522; X32-SSE41-NEXT:    pinsrb $14, %ecx, %xmm1
3523; X32-SSE41-NEXT:    shrl $15, %eax
3524; X32-SSE41-NEXT:    pinsrb $15, %eax, %xmm1
3525; 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
3526; X32-SSE41-NEXT:    psllw $15, %xmm0
3527; X32-SSE41-NEXT:    psraw $15, %xmm0
3528; X32-SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
3529; X32-SSE41-NEXT:    psllw $15, %xmm1
3530; X32-SSE41-NEXT:    psraw $15, %xmm1
3531; X32-SSE41-NEXT:    retl
3532entry:
3533 %X = load <16 x i1>, <16 x i1>* %ptr
3534 %Y = sext <16 x i1> %X to <16 x i16>
3535 ret <16 x i16> %Y
3536}
3537
3538define <32 x i8> @load_sext_32i1_to_32i8(<32 x i1> *%ptr) nounwind readnone {
3539; SSE2-LABEL: load_sext_32i1_to_32i8:
3540; SSE2:       # BB#0: # %entry
3541; SSE2-NEXT:    pushq %rbp
3542; SSE2-NEXT:    pushq %r15
3543; SSE2-NEXT:    pushq %r14
3544; SSE2-NEXT:    pushq %r13
3545; SSE2-NEXT:    pushq %r12
3546; SSE2-NEXT:    pushq %rbx
3547; SSE2-NEXT:    movswq (%rdi), %rax
3548; SSE2-NEXT:    movq %rax, %r10
3549; SSE2-NEXT:    movq %rax, %r8
3550; SSE2-NEXT:    movq %rax, %r9
3551; SSE2-NEXT:    movq %rax, %r11
3552; SSE2-NEXT:    movq %rax, %r14
3553; SSE2-NEXT:    movq %rax, %r15
3554; SSE2-NEXT:    movq %rax, %r12
3555; SSE2-NEXT:    movq %rax, %r13
3556; SSE2-NEXT:    movq %rax, %rdx
3557; SSE2-NEXT:    movq %rax, %rsi
3558; SSE2-NEXT:    movq %rax, %rcx
3559; SSE2-NEXT:    movq %rax, %rbp
3560; SSE2-NEXT:    movq %rax, %rbx
3561; SSE2-NEXT:    shrq $15, %rbx
3562; SSE2-NEXT:    movd %ebx, %xmm0
3563; SSE2-NEXT:    movq %rax, %rbx
3564; SSE2-NEXT:    shlq $49, %r10
3565; SSE2-NEXT:    sarq $63, %r10
3566; SSE2-NEXT:    movd %r10d, %xmm15
3567; SSE2-NEXT:    movq %rax, %r10
3568; SSE2-NEXT:    movsbq %al, %rax
3569; SSE2-NEXT:    punpcklbw {{.*#+}} xmm15 = xmm15[0],xmm0[0],xmm15[1],xmm0[1],xmm15[2],xmm0[2],xmm15[3],xmm0[3],xmm15[4],xmm0[4],xmm15[5],xmm0[5],xmm15[6],xmm0[6],xmm15[7],xmm0[7]
3570; SSE2-NEXT:    shlq $50, %r8
3571; SSE2-NEXT:    sarq $63, %r8
3572; SSE2-NEXT:    movd %r8d, %xmm8
3573; SSE2-NEXT:    shlq $51, %r9
3574; SSE2-NEXT:    sarq $63, %r9
3575; SSE2-NEXT:    movd %r9d, %xmm3
3576; SSE2-NEXT:    shlq $52, %r11
3577; SSE2-NEXT:    sarq $63, %r11
3578; SSE2-NEXT:    movd %r11d, %xmm9
3579; SSE2-NEXT:    shlq $53, %r14
3580; SSE2-NEXT:    sarq $63, %r14
3581; SSE2-NEXT:    movd %r14d, %xmm6
3582; SSE2-NEXT:    shlq $54, %r15
3583; SSE2-NEXT:    sarq $63, %r15
3584; SSE2-NEXT:    movd %r15d, %xmm10
3585; SSE2-NEXT:    shlq $55, %r12
3586; SSE2-NEXT:    sarq $63, %r12
3587; SSE2-NEXT:    movd %r12d, %xmm2
3588; SSE2-NEXT:    shlq $60, %r13
3589; SSE2-NEXT:    sarq $63, %r13
3590; SSE2-NEXT:    movd %r13d, %xmm11
3591; SSE2-NEXT:    shlq $61, %rdx
3592; SSE2-NEXT:    sarq $63, %rdx
3593; SSE2-NEXT:    movd %edx, %xmm5
3594; SSE2-NEXT:    shlq $62, %rsi
3595; SSE2-NEXT:    sarq $63, %rsi
3596; SSE2-NEXT:    movd %esi, %xmm12
3597; SSE2-NEXT:    shlq $63, %rcx
3598; SSE2-NEXT:    sarq $63, %rcx
3599; SSE2-NEXT:    movd %ecx, %xmm0
3600; SSE2-NEXT:    shlq $58, %rbp
3601; SSE2-NEXT:    sarq $63, %rbp
3602; SSE2-NEXT:    movd %ebp, %xmm13
3603; SSE2-NEXT:    shlq $59, %rbx
3604; SSE2-NEXT:    sarq $63, %rbx
3605; SSE2-NEXT:    movd %ebx, %xmm7
3606; SSE2-NEXT:    shlq $57, %r10
3607; SSE2-NEXT:    sarq $63, %r10
3608; SSE2-NEXT:    movd %r10d, %xmm4
3609; SSE2-NEXT:    shrq $7, %rax
3610; SSE2-NEXT:    movd %eax, %xmm14
3611; SSE2-NEXT:    movswq 2(%rdi), %rsi
3612; SSE2-NEXT:    movq %rsi, %r8
3613; SSE2-NEXT:    movq %rsi, %r9
3614; SSE2-NEXT:    movq %rsi, %r10
3615; SSE2-NEXT:    movq %rsi, %r11
3616; SSE2-NEXT:    movq %rsi, %r14
3617; SSE2-NEXT:    movq %rsi, %r15
3618; SSE2-NEXT:    movq %rsi, %r12
3619; SSE2-NEXT:    movq %rsi, %r13
3620; SSE2-NEXT:    movq %rsi, %rbx
3621; SSE2-NEXT:    movq %rsi, %rax
3622; SSE2-NEXT:    movq %rsi, %rcx
3623; SSE2-NEXT:    movq %rsi, %rdx
3624; SSE2-NEXT:    movq %rsi, %rdi
3625; SSE2-NEXT:    movq %rsi, %rbp
3626; SSE2-NEXT:    shrq $15, %rbp
3627; SSE2-NEXT:    movd %ebp, %xmm1
3628; SSE2-NEXT:    movq %rsi, %rbp
3629; SSE2-NEXT:    movsbq %sil, %rsi
3630; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm8[0],xmm3[1],xmm8[1],xmm3[2],xmm8[2],xmm3[3],xmm8[3],xmm3[4],xmm8[4],xmm3[5],xmm8[5],xmm3[6],xmm8[6],xmm3[7],xmm8[7]
3631; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm15[0],xmm3[1],xmm15[1],xmm3[2],xmm15[2],xmm3[3],xmm15[3]
3632; SSE2-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm9[0],xmm6[1],xmm9[1],xmm6[2],xmm9[2],xmm6[3],xmm9[3],xmm6[4],xmm9[4],xmm6[5],xmm9[5],xmm6[6],xmm9[6],xmm6[7],xmm9[7]
3633; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm10[0],xmm2[1],xmm10[1],xmm2[2],xmm10[2],xmm2[3],xmm10[3],xmm2[4],xmm10[4],xmm2[5],xmm10[5],xmm2[6],xmm10[6],xmm2[7],xmm10[7]
3634; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1],xmm2[2],xmm6[2],xmm2[3],xmm6[3]
3635; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
3636; SSE2-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm11[0],xmm5[1],xmm11[1],xmm5[2],xmm11[2],xmm5[3],xmm11[3],xmm5[4],xmm11[4],xmm5[5],xmm11[5],xmm5[6],xmm11[6],xmm5[7],xmm11[7]
3637; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm12[0],xmm0[1],xmm12[1],xmm0[2],xmm12[2],xmm0[3],xmm12[3],xmm0[4],xmm12[4],xmm0[5],xmm12[5],xmm0[6],xmm12[6],xmm0[7],xmm12[7]
3638; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1],xmm0[2],xmm5[2],xmm0[3],xmm5[3]
3639; SSE2-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm13[0],xmm7[1],xmm13[1],xmm7[2],xmm13[2],xmm7[3],xmm13[3],xmm7[4],xmm13[4],xmm7[5],xmm13[5],xmm7[6],xmm13[6],xmm7[7],xmm13[7]
3640; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm14[0],xmm4[1],xmm14[1],xmm4[2],xmm14[2],xmm4[3],xmm14[3],xmm4[4],xmm14[4],xmm4[5],xmm14[5],xmm4[6],xmm14[6],xmm4[7],xmm14[7]
3641; SSE2-NEXT:    shlq $49, %r8
3642; SSE2-NEXT:    sarq $63, %r8
3643; SSE2-NEXT:    movd %r8d, %xmm3
3644; SSE2-NEXT:    punpcklwd {{.*#+}} xmm7 = xmm7[0],xmm4[0],xmm7[1],xmm4[1],xmm7[2],xmm4[2],xmm7[3],xmm4[3]
3645; SSE2-NEXT:    shlq $50, %r9
3646; SSE2-NEXT:    sarq $63, %r9
3647; SSE2-NEXT:    movd %r9d, %xmm4
3648; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1]
3649; SSE2-NEXT:    shlq $51, %r10
3650; SSE2-NEXT:    sarq $63, %r10
3651; SSE2-NEXT:    movd %r10d, %xmm5
3652; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
3653; SSE2-NEXT:    shlq $52, %r11
3654; SSE2-NEXT:    sarq $63, %r11
3655; SSE2-NEXT:    movd %r11d, %xmm2
3656; 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]
3657; SSE2-NEXT:    shlq $53, %r14
3658; SSE2-NEXT:    sarq $63, %r14
3659; SSE2-NEXT:    movd %r14d, %xmm1
3660; SSE2-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3],xmm5[4],xmm4[4],xmm5[5],xmm4[5],xmm5[6],xmm4[6],xmm5[7],xmm4[7]
3661; SSE2-NEXT:    shlq $54, %r15
3662; SSE2-NEXT:    sarq $63, %r15
3663; SSE2-NEXT:    movd %r15d, %xmm4
3664; SSE2-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1],xmm5[2],xmm3[2],xmm5[3],xmm3[3]
3665; SSE2-NEXT:    shlq $55, %r12
3666; SSE2-NEXT:    sarq $63, %r12
3667; SSE2-NEXT:    movd %r12d, %xmm3
3668; 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]
3669; SSE2-NEXT:    shlq $60, %r13
3670; SSE2-NEXT:    sarq $63, %r13
3671; SSE2-NEXT:    movd %r13d, %xmm2
3672; 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]
3673; SSE2-NEXT:    shlq $61, %rbx
3674; SSE2-NEXT:    sarq $63, %rbx
3675; SSE2-NEXT:    movd %ebx, %xmm4
3676; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3]
3677; SSE2-NEXT:    shlq $62, %rax
3678; SSE2-NEXT:    sarq $63, %rax
3679; SSE2-NEXT:    movd %eax, %xmm6
3680; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1]
3681; SSE2-NEXT:    shlq $63, %rcx
3682; SSE2-NEXT:    sarq $63, %rcx
3683; SSE2-NEXT:    movd %ecx, %xmm1
3684; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]
3685; SSE2-NEXT:    shlq $58, %rdx
3686; SSE2-NEXT:    sarq $63, %rdx
3687; SSE2-NEXT:    movd %edx, %xmm2
3688; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm6[0],xmm1[1],xmm6[1],xmm1[2],xmm6[2],xmm1[3],xmm6[3],xmm1[4],xmm6[4],xmm1[5],xmm6[5],xmm1[6],xmm6[6],xmm1[7],xmm6[7]
3689; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3]
3690; SSE2-NEXT:    shlq $59, %rdi
3691; SSE2-NEXT:    sarq $63, %rdi
3692; SSE2-NEXT:    movd %edi, %xmm4
3693; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]
3694; SSE2-NEXT:    shlq $57, %rbp
3695; SSE2-NEXT:    sarq $63, %rbp
3696; SSE2-NEXT:    movd %ebp, %xmm2
3697; SSE2-NEXT:    shrq $7, %rsi
3698; SSE2-NEXT:    movd %esi, %xmm5
3699; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1],xmm2[2],xmm5[2],xmm2[3],xmm5[3],xmm2[4],xmm5[4],xmm2[5],xmm5[5],xmm2[6],xmm5[6],xmm2[7],xmm5[7]
3700; SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3]
3701; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]
3702; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
3703; SSE2-NEXT:    popq %rbx
3704; SSE2-NEXT:    popq %r12
3705; SSE2-NEXT:    popq %r13
3706; SSE2-NEXT:    popq %r14
3707; SSE2-NEXT:    popq %r15
3708; SSE2-NEXT:    popq %rbp
3709; SSE2-NEXT:    retq
3710;
3711; SSSE3-LABEL: load_sext_32i1_to_32i8:
3712; SSSE3:       # BB#0: # %entry
3713; SSSE3-NEXT:    pushq %rbp
3714; SSSE3-NEXT:    pushq %r15
3715; SSSE3-NEXT:    pushq %r14
3716; SSSE3-NEXT:    pushq %r13
3717; SSSE3-NEXT:    pushq %r12
3718; SSSE3-NEXT:    pushq %rbx
3719; SSSE3-NEXT:    movswq (%rdi), %rax
3720; SSSE3-NEXT:    movq %rax, %r10
3721; SSSE3-NEXT:    movq %rax, %r8
3722; SSSE3-NEXT:    movq %rax, %r9
3723; SSSE3-NEXT:    movq %rax, %r11
3724; SSSE3-NEXT:    movq %rax, %r14
3725; SSSE3-NEXT:    movq %rax, %r15
3726; SSSE3-NEXT:    movq %rax, %r12
3727; SSSE3-NEXT:    movq %rax, %r13
3728; SSSE3-NEXT:    movq %rax, %rdx
3729; SSSE3-NEXT:    movq %rax, %rsi
3730; SSSE3-NEXT:    movq %rax, %rcx
3731; SSSE3-NEXT:    movq %rax, %rbp
3732; SSSE3-NEXT:    movq %rax, %rbx
3733; SSSE3-NEXT:    shrq $15, %rbx
3734; SSSE3-NEXT:    movd %ebx, %xmm0
3735; SSSE3-NEXT:    movq %rax, %rbx
3736; SSSE3-NEXT:    shlq $49, %r10
3737; SSSE3-NEXT:    sarq $63, %r10
3738; SSSE3-NEXT:    movd %r10d, %xmm15
3739; SSSE3-NEXT:    movq %rax, %r10
3740; SSSE3-NEXT:    movsbq %al, %rax
3741; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm15 = xmm15[0],xmm0[0],xmm15[1],xmm0[1],xmm15[2],xmm0[2],xmm15[3],xmm0[3],xmm15[4],xmm0[4],xmm15[5],xmm0[5],xmm15[6],xmm0[6],xmm15[7],xmm0[7]
3742; SSSE3-NEXT:    shlq $50, %r8
3743; SSSE3-NEXT:    sarq $63, %r8
3744; SSSE3-NEXT:    movd %r8d, %xmm8
3745; SSSE3-NEXT:    shlq $51, %r9
3746; SSSE3-NEXT:    sarq $63, %r9
3747; SSSE3-NEXT:    movd %r9d, %xmm3
3748; SSSE3-NEXT:    shlq $52, %r11
3749; SSSE3-NEXT:    sarq $63, %r11
3750; SSSE3-NEXT:    movd %r11d, %xmm9
3751; SSSE3-NEXT:    shlq $53, %r14
3752; SSSE3-NEXT:    sarq $63, %r14
3753; SSSE3-NEXT:    movd %r14d, %xmm6
3754; SSSE3-NEXT:    shlq $54, %r15
3755; SSSE3-NEXT:    sarq $63, %r15
3756; SSSE3-NEXT:    movd %r15d, %xmm10
3757; SSSE3-NEXT:    shlq $55, %r12
3758; SSSE3-NEXT:    sarq $63, %r12
3759; SSSE3-NEXT:    movd %r12d, %xmm2
3760; SSSE3-NEXT:    shlq $60, %r13
3761; SSSE3-NEXT:    sarq $63, %r13
3762; SSSE3-NEXT:    movd %r13d, %xmm11
3763; SSSE3-NEXT:    shlq $61, %rdx
3764; SSSE3-NEXT:    sarq $63, %rdx
3765; SSSE3-NEXT:    movd %edx, %xmm5
3766; SSSE3-NEXT:    shlq $62, %rsi
3767; SSSE3-NEXT:    sarq $63, %rsi
3768; SSSE3-NEXT:    movd %esi, %xmm12
3769; SSSE3-NEXT:    shlq $63, %rcx
3770; SSSE3-NEXT:    sarq $63, %rcx
3771; SSSE3-NEXT:    movd %ecx, %xmm0
3772; SSSE3-NEXT:    shlq $58, %rbp
3773; SSSE3-NEXT:    sarq $63, %rbp
3774; SSSE3-NEXT:    movd %ebp, %xmm13
3775; SSSE3-NEXT:    shlq $59, %rbx
3776; SSSE3-NEXT:    sarq $63, %rbx
3777; SSSE3-NEXT:    movd %ebx, %xmm7
3778; SSSE3-NEXT:    shlq $57, %r10
3779; SSSE3-NEXT:    sarq $63, %r10
3780; SSSE3-NEXT:    movd %r10d, %xmm4
3781; SSSE3-NEXT:    shrq $7, %rax
3782; SSSE3-NEXT:    movd %eax, %xmm14
3783; SSSE3-NEXT:    movswq 2(%rdi), %rsi
3784; SSSE3-NEXT:    movq %rsi, %r8
3785; SSSE3-NEXT:    movq %rsi, %r9
3786; SSSE3-NEXT:    movq %rsi, %r10
3787; SSSE3-NEXT:    movq %rsi, %r11
3788; SSSE3-NEXT:    movq %rsi, %r14
3789; SSSE3-NEXT:    movq %rsi, %r15
3790; SSSE3-NEXT:    movq %rsi, %r12
3791; SSSE3-NEXT:    movq %rsi, %r13
3792; SSSE3-NEXT:    movq %rsi, %rbx
3793; SSSE3-NEXT:    movq %rsi, %rax
3794; SSSE3-NEXT:    movq %rsi, %rcx
3795; SSSE3-NEXT:    movq %rsi, %rdx
3796; SSSE3-NEXT:    movq %rsi, %rdi
3797; SSSE3-NEXT:    movq %rsi, %rbp
3798; SSSE3-NEXT:    shrq $15, %rbp
3799; SSSE3-NEXT:    movd %ebp, %xmm1
3800; SSSE3-NEXT:    movq %rsi, %rbp
3801; SSSE3-NEXT:    movsbq %sil, %rsi
3802; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm8[0],xmm3[1],xmm8[1],xmm3[2],xmm8[2],xmm3[3],xmm8[3],xmm3[4],xmm8[4],xmm3[5],xmm8[5],xmm3[6],xmm8[6],xmm3[7],xmm8[7]
3803; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm15[0],xmm3[1],xmm15[1],xmm3[2],xmm15[2],xmm3[3],xmm15[3]
3804; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm9[0],xmm6[1],xmm9[1],xmm6[2],xmm9[2],xmm6[3],xmm9[3],xmm6[4],xmm9[4],xmm6[5],xmm9[5],xmm6[6],xmm9[6],xmm6[7],xmm9[7]
3805; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm10[0],xmm2[1],xmm10[1],xmm2[2],xmm10[2],xmm2[3],xmm10[3],xmm2[4],xmm10[4],xmm2[5],xmm10[5],xmm2[6],xmm10[6],xmm2[7],xmm10[7]
3806; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1],xmm2[2],xmm6[2],xmm2[3],xmm6[3]
3807; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
3808; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm11[0],xmm5[1],xmm11[1],xmm5[2],xmm11[2],xmm5[3],xmm11[3],xmm5[4],xmm11[4],xmm5[5],xmm11[5],xmm5[6],xmm11[6],xmm5[7],xmm11[7]
3809; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm12[0],xmm0[1],xmm12[1],xmm0[2],xmm12[2],xmm0[3],xmm12[3],xmm0[4],xmm12[4],xmm0[5],xmm12[5],xmm0[6],xmm12[6],xmm0[7],xmm12[7]
3810; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1],xmm0[2],xmm5[2],xmm0[3],xmm5[3]
3811; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm13[0],xmm7[1],xmm13[1],xmm7[2],xmm13[2],xmm7[3],xmm13[3],xmm7[4],xmm13[4],xmm7[5],xmm13[5],xmm7[6],xmm13[6],xmm7[7],xmm13[7]
3812; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm14[0],xmm4[1],xmm14[1],xmm4[2],xmm14[2],xmm4[3],xmm14[3],xmm4[4],xmm14[4],xmm4[5],xmm14[5],xmm4[6],xmm14[6],xmm4[7],xmm14[7]
3813; SSSE3-NEXT:    shlq $49, %r8
3814; SSSE3-NEXT:    sarq $63, %r8
3815; SSSE3-NEXT:    movd %r8d, %xmm3
3816; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm7 = xmm7[0],xmm4[0],xmm7[1],xmm4[1],xmm7[2],xmm4[2],xmm7[3],xmm4[3]
3817; SSSE3-NEXT:    shlq $50, %r9
3818; SSSE3-NEXT:    sarq $63, %r9
3819; SSSE3-NEXT:    movd %r9d, %xmm4
3820; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1]
3821; SSSE3-NEXT:    shlq $51, %r10
3822; SSSE3-NEXT:    sarq $63, %r10
3823; SSSE3-NEXT:    movd %r10d, %xmm5
3824; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
3825; SSSE3-NEXT:    shlq $52, %r11
3826; SSSE3-NEXT:    sarq $63, %r11
3827; SSSE3-NEXT:    movd %r11d, %xmm2
3828; 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]
3829; SSSE3-NEXT:    shlq $53, %r14
3830; SSSE3-NEXT:    sarq $63, %r14
3831; SSSE3-NEXT:    movd %r14d, %xmm1
3832; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3],xmm5[4],xmm4[4],xmm5[5],xmm4[5],xmm5[6],xmm4[6],xmm5[7],xmm4[7]
3833; SSSE3-NEXT:    shlq $54, %r15
3834; SSSE3-NEXT:    sarq $63, %r15
3835; SSSE3-NEXT:    movd %r15d, %xmm4
3836; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1],xmm5[2],xmm3[2],xmm5[3],xmm3[3]
3837; SSSE3-NEXT:    shlq $55, %r12
3838; SSSE3-NEXT:    sarq $63, %r12
3839; SSSE3-NEXT:    movd %r12d, %xmm3
3840; 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]
3841; SSSE3-NEXT:    shlq $60, %r13
3842; SSSE3-NEXT:    sarq $63, %r13
3843; SSSE3-NEXT:    movd %r13d, %xmm2
3844; 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]
3845; SSSE3-NEXT:    shlq $61, %rbx
3846; SSSE3-NEXT:    sarq $63, %rbx
3847; SSSE3-NEXT:    movd %ebx, %xmm4
3848; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3]
3849; SSSE3-NEXT:    shlq $62, %rax
3850; SSSE3-NEXT:    sarq $63, %rax
3851; SSSE3-NEXT:    movd %eax, %xmm6
3852; SSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1]
3853; SSSE3-NEXT:    shlq $63, %rcx
3854; SSSE3-NEXT:    sarq $63, %rcx
3855; SSSE3-NEXT:    movd %ecx, %xmm1
3856; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]
3857; SSSE3-NEXT:    shlq $58, %rdx
3858; SSSE3-NEXT:    sarq $63, %rdx
3859; SSSE3-NEXT:    movd %edx, %xmm2
3860; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm6[0],xmm1[1],xmm6[1],xmm1[2],xmm6[2],xmm1[3],xmm6[3],xmm1[4],xmm6[4],xmm1[5],xmm6[5],xmm1[6],xmm6[6],xmm1[7],xmm6[7]
3861; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3]
3862; SSSE3-NEXT:    shlq $59, %rdi
3863; SSSE3-NEXT:    sarq $63, %rdi
3864; SSSE3-NEXT:    movd %edi, %xmm4
3865; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]
3866; SSSE3-NEXT:    shlq $57, %rbp
3867; SSSE3-NEXT:    sarq $63, %rbp
3868; SSSE3-NEXT:    movd %ebp, %xmm2
3869; SSSE3-NEXT:    shrq $7, %rsi
3870; SSSE3-NEXT:    movd %esi, %xmm5
3871; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1],xmm2[2],xmm5[2],xmm2[3],xmm5[3],xmm2[4],xmm5[4],xmm2[5],xmm5[5],xmm2[6],xmm5[6],xmm2[7],xmm5[7]
3872; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3]
3873; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]
3874; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
3875; SSSE3-NEXT:    popq %rbx
3876; SSSE3-NEXT:    popq %r12
3877; SSSE3-NEXT:    popq %r13
3878; SSSE3-NEXT:    popq %r14
3879; SSSE3-NEXT:    popq %r15
3880; SSSE3-NEXT:    popq %rbp
3881; SSSE3-NEXT:    retq
3882;
3883; SSE41-LABEL: load_sext_32i1_to_32i8:
3884; SSE41:       # BB#0: # %entry
3885; SSE41-NEXT:    movswq (%rdi), %rax
3886; SSE41-NEXT:    movq %rax, %rcx
3887; SSE41-NEXT:    shlq $62, %rcx
3888; SSE41-NEXT:    sarq $63, %rcx
3889; SSE41-NEXT:    movq %rax, %rdx
3890; SSE41-NEXT:    shlq $63, %rdx
3891; SSE41-NEXT:    sarq $63, %rdx
3892; SSE41-NEXT:    movd %edx, %xmm0
3893; SSE41-NEXT:    pinsrb $1, %ecx, %xmm0
3894; SSE41-NEXT:    movq %rax, %rcx
3895; SSE41-NEXT:    shlq $61, %rcx
3896; SSE41-NEXT:    sarq $63, %rcx
3897; SSE41-NEXT:    pinsrb $2, %ecx, %xmm0
3898; SSE41-NEXT:    movq %rax, %rcx
3899; SSE41-NEXT:    shlq $60, %rcx
3900; SSE41-NEXT:    sarq $63, %rcx
3901; SSE41-NEXT:    pinsrb $3, %ecx, %xmm0
3902; SSE41-NEXT:    movq %rax, %rcx
3903; SSE41-NEXT:    shlq $59, %rcx
3904; SSE41-NEXT:    sarq $63, %rcx
3905; SSE41-NEXT:    pinsrb $4, %ecx, %xmm0
3906; SSE41-NEXT:    movq %rax, %rcx
3907; SSE41-NEXT:    shlq $58, %rcx
3908; SSE41-NEXT:    sarq $63, %rcx
3909; SSE41-NEXT:    pinsrb $5, %ecx, %xmm0
3910; SSE41-NEXT:    movq %rax, %rcx
3911; SSE41-NEXT:    shlq $57, %rcx
3912; SSE41-NEXT:    sarq $63, %rcx
3913; SSE41-NEXT:    pinsrb $6, %ecx, %xmm0
3914; SSE41-NEXT:    movsbq %al, %rcx
3915; SSE41-NEXT:    shrq $7, %rcx
3916; SSE41-NEXT:    pinsrb $7, %ecx, %xmm0
3917; SSE41-NEXT:    movq %rax, %rcx
3918; SSE41-NEXT:    shlq $55, %rcx
3919; SSE41-NEXT:    sarq $63, %rcx
3920; SSE41-NEXT:    pinsrb $8, %ecx, %xmm0
3921; SSE41-NEXT:    movq %rax, %rcx
3922; SSE41-NEXT:    shlq $54, %rcx
3923; SSE41-NEXT:    sarq $63, %rcx
3924; SSE41-NEXT:    pinsrb $9, %ecx, %xmm0
3925; SSE41-NEXT:    movq %rax, %rcx
3926; SSE41-NEXT:    shlq $53, %rcx
3927; SSE41-NEXT:    sarq $63, %rcx
3928; SSE41-NEXT:    pinsrb $10, %ecx, %xmm0
3929; SSE41-NEXT:    movq %rax, %rcx
3930; SSE41-NEXT:    shlq $52, %rcx
3931; SSE41-NEXT:    sarq $63, %rcx
3932; SSE41-NEXT:    pinsrb $11, %ecx, %xmm0
3933; SSE41-NEXT:    movq %rax, %rcx
3934; SSE41-NEXT:    shlq $51, %rcx
3935; SSE41-NEXT:    sarq $63, %rcx
3936; SSE41-NEXT:    pinsrb $12, %ecx, %xmm0
3937; SSE41-NEXT:    movq %rax, %rcx
3938; SSE41-NEXT:    shlq $50, %rcx
3939; SSE41-NEXT:    sarq $63, %rcx
3940; SSE41-NEXT:    pinsrb $13, %ecx, %xmm0
3941; SSE41-NEXT:    movq %rax, %rcx
3942; SSE41-NEXT:    shlq $49, %rcx
3943; SSE41-NEXT:    sarq $63, %rcx
3944; SSE41-NEXT:    pinsrb $14, %ecx, %xmm0
3945; SSE41-NEXT:    shrq $15, %rax
3946; SSE41-NEXT:    pinsrb $15, %eax, %xmm0
3947; SSE41-NEXT:    movswq 2(%rdi), %rax
3948; SSE41-NEXT:    movq %rax, %rcx
3949; SSE41-NEXT:    shlq $62, %rcx
3950; SSE41-NEXT:    sarq $63, %rcx
3951; SSE41-NEXT:    movq %rax, %rdx
3952; SSE41-NEXT:    shlq $63, %rdx
3953; SSE41-NEXT:    sarq $63, %rdx
3954; SSE41-NEXT:    movd %edx, %xmm1
3955; SSE41-NEXT:    pinsrb $1, %ecx, %xmm1
3956; SSE41-NEXT:    movq %rax, %rcx
3957; SSE41-NEXT:    shlq $61, %rcx
3958; SSE41-NEXT:    sarq $63, %rcx
3959; SSE41-NEXT:    pinsrb $2, %ecx, %xmm1
3960; SSE41-NEXT:    movq %rax, %rcx
3961; SSE41-NEXT:    shlq $60, %rcx
3962; SSE41-NEXT:    sarq $63, %rcx
3963; SSE41-NEXT:    pinsrb $3, %ecx, %xmm1
3964; SSE41-NEXT:    movq %rax, %rcx
3965; SSE41-NEXT:    shlq $59, %rcx
3966; SSE41-NEXT:    sarq $63, %rcx
3967; SSE41-NEXT:    pinsrb $4, %ecx, %xmm1
3968; SSE41-NEXT:    movq %rax, %rcx
3969; SSE41-NEXT:    shlq $58, %rcx
3970; SSE41-NEXT:    sarq $63, %rcx
3971; SSE41-NEXT:    pinsrb $5, %ecx, %xmm1
3972; SSE41-NEXT:    movq %rax, %rcx
3973; SSE41-NEXT:    shlq $57, %rcx
3974; SSE41-NEXT:    sarq $63, %rcx
3975; SSE41-NEXT:    pinsrb $6, %ecx, %xmm1
3976; SSE41-NEXT:    movsbq %al, %rcx
3977; SSE41-NEXT:    shrq $7, %rcx
3978; SSE41-NEXT:    pinsrb $7, %ecx, %xmm1
3979; SSE41-NEXT:    movq %rax, %rcx
3980; SSE41-NEXT:    shlq $55, %rcx
3981; SSE41-NEXT:    sarq $63, %rcx
3982; SSE41-NEXT:    pinsrb $8, %ecx, %xmm1
3983; SSE41-NEXT:    movq %rax, %rcx
3984; SSE41-NEXT:    shlq $54, %rcx
3985; SSE41-NEXT:    sarq $63, %rcx
3986; SSE41-NEXT:    pinsrb $9, %ecx, %xmm1
3987; SSE41-NEXT:    movq %rax, %rcx
3988; SSE41-NEXT:    shlq $53, %rcx
3989; SSE41-NEXT:    sarq $63, %rcx
3990; SSE41-NEXT:    pinsrb $10, %ecx, %xmm1
3991; SSE41-NEXT:    movq %rax, %rcx
3992; SSE41-NEXT:    shlq $52, %rcx
3993; SSE41-NEXT:    sarq $63, %rcx
3994; SSE41-NEXT:    pinsrb $11, %ecx, %xmm1
3995; SSE41-NEXT:    movq %rax, %rcx
3996; SSE41-NEXT:    shlq $51, %rcx
3997; SSE41-NEXT:    sarq $63, %rcx
3998; SSE41-NEXT:    pinsrb $12, %ecx, %xmm1
3999; SSE41-NEXT:    movq %rax, %rcx
4000; SSE41-NEXT:    shlq $50, %rcx
4001; SSE41-NEXT:    sarq $63, %rcx
4002; SSE41-NEXT:    pinsrb $13, %ecx, %xmm1
4003; SSE41-NEXT:    movq %rax, %rcx
4004; SSE41-NEXT:    shlq $49, %rcx
4005; SSE41-NEXT:    sarq $63, %rcx
4006; SSE41-NEXT:    pinsrb $14, %ecx, %xmm1
4007; SSE41-NEXT:    shrq $15, %rax
4008; SSE41-NEXT:    pinsrb $15, %eax, %xmm1
4009; SSE41-NEXT:    retq
4010;
4011; AVX1-LABEL: load_sext_32i1_to_32i8:
4012; AVX1:       # BB#0: # %entry
4013; AVX1-NEXT:    pushq %rbp
4014; AVX1-NEXT:    pushq %r15
4015; AVX1-NEXT:    pushq %r14
4016; AVX1-NEXT:    pushq %r13
4017; AVX1-NEXT:    pushq %r12
4018; AVX1-NEXT:    pushq %rbx
4019; AVX1-NEXT:    movslq (%rdi), %rax
4020; AVX1-NEXT:    movq %rax, %rcx
4021; AVX1-NEXT:    shlq $47, %rcx
4022; AVX1-NEXT:    sarq $63, %rcx
4023; AVX1-NEXT:    vmovd %ecx, %xmm0
4024; AVX1-NEXT:    movq %rax, %r8
4025; AVX1-NEXT:    movq %rax, %rdx
4026; AVX1-NEXT:    movq %rax, %rcx
4027; AVX1-NEXT:    movq %rax, %rdi
4028; AVX1-NEXT:    movq %rax, %r13
4029; AVX1-NEXT:    movq %rax, %rsi
4030; AVX1-NEXT:    movq %rax, %r10
4031; AVX1-NEXT:    movq %rax, %r11
4032; AVX1-NEXT:    movq %rax, %r9
4033; AVX1-NEXT:    movq %rax, %rbx
4034; AVX1-NEXT:    movq %rax, %r14
4035; AVX1-NEXT:    movq %rax, %r15
4036; AVX1-NEXT:    movq %rax, %r12
4037; AVX1-NEXT:    movq %rax, %rbp
4038; AVX1-NEXT:    shlq $46, %rbp
4039; AVX1-NEXT:    sarq $63, %rbp
4040; AVX1-NEXT:    vpinsrb $1, %ebp, %xmm0, %xmm0
4041; AVX1-NEXT:    movq %rax, %rbp
4042; AVX1-NEXT:    shlq $45, %r8
4043; AVX1-NEXT:    sarq $63, %r8
4044; AVX1-NEXT:    vpinsrb $2, %r8d, %xmm0, %xmm0
4045; AVX1-NEXT:    movq %rax, %r8
4046; AVX1-NEXT:    shlq $44, %rdx
4047; AVX1-NEXT:    sarq $63, %rdx
4048; AVX1-NEXT:    vpinsrb $3, %edx, %xmm0, %xmm0
4049; AVX1-NEXT:    movq %rax, %rdx
4050; AVX1-NEXT:    shlq $43, %rcx
4051; AVX1-NEXT:    sarq $63, %rcx
4052; AVX1-NEXT:    vpinsrb $4, %ecx, %xmm0, %xmm0
4053; AVX1-NEXT:    movq %rax, %rcx
4054; AVX1-NEXT:    shlq $42, %rdi
4055; AVX1-NEXT:    sarq $63, %rdi
4056; AVX1-NEXT:    vpinsrb $5, %edi, %xmm0, %xmm0
4057; AVX1-NEXT:    movq %rax, %rdi
4058; AVX1-NEXT:    shlq $41, %r13
4059; AVX1-NEXT:    sarq $63, %r13
4060; AVX1-NEXT:    vpinsrb $6, %r13d, %xmm0, %xmm0
4061; AVX1-NEXT:    movq %rax, %r13
4062; AVX1-NEXT:    shlq $40, %rsi
4063; AVX1-NEXT:    sarq $63, %rsi
4064; AVX1-NEXT:    vpinsrb $7, %esi, %xmm0, %xmm0
4065; AVX1-NEXT:    movq %rax, %rsi
4066; AVX1-NEXT:    shlq $39, %r10
4067; AVX1-NEXT:    sarq $63, %r10
4068; AVX1-NEXT:    vpinsrb $8, %r10d, %xmm0, %xmm0
4069; AVX1-NEXT:    movq %rax, %r10
4070; AVX1-NEXT:    shlq $38, %r11
4071; AVX1-NEXT:    sarq $63, %r11
4072; AVX1-NEXT:    vpinsrb $9, %r11d, %xmm0, %xmm0
4073; AVX1-NEXT:    movsbq %al, %r11
4074; AVX1-NEXT:    shlq $37, %r9
4075; AVX1-NEXT:    sarq $63, %r9
4076; AVX1-NEXT:    vpinsrb $10, %r9d, %xmm0, %xmm0
4077; AVX1-NEXT:    movq %rax, %r9
4078; AVX1-NEXT:    shlq $36, %rbx
4079; AVX1-NEXT:    sarq $63, %rbx
4080; AVX1-NEXT:    vpinsrb $11, %ebx, %xmm0, %xmm0
4081; AVX1-NEXT:    movq %rax, %rbx
4082; AVX1-NEXT:    shlq $35, %r14
4083; AVX1-NEXT:    sarq $63, %r14
4084; AVX1-NEXT:    vpinsrb $12, %r14d, %xmm0, %xmm0
4085; AVX1-NEXT:    movq %rax, %r14
4086; AVX1-NEXT:    shlq $34, %r15
4087; AVX1-NEXT:    sarq $63, %r15
4088; AVX1-NEXT:    vpinsrb $13, %r15d, %xmm0, %xmm0
4089; AVX1-NEXT:    movq %rax, %r15
4090; AVX1-NEXT:    shlq $33, %r12
4091; AVX1-NEXT:    sarq $63, %r12
4092; AVX1-NEXT:    vpinsrb $14, %r12d, %xmm0, %xmm0
4093; AVX1-NEXT:    movq %rax, %r12
4094; AVX1-NEXT:    shrq $31, %rbp
4095; AVX1-NEXT:    vpinsrb $15, %ebp, %xmm0, %xmm0
4096; AVX1-NEXT:    movq %rax, %rbp
4097; AVX1-NEXT:    shlq $63, %rdx
4098; AVX1-NEXT:    sarq $63, %rdx
4099; AVX1-NEXT:    vmovd %edx, %xmm1
4100; AVX1-NEXT:    movq %rax, %rdx
4101; AVX1-NEXT:    movswq %ax, %rax
4102; AVX1-NEXT:    shlq $62, %r8
4103; AVX1-NEXT:    sarq $63, %r8
4104; AVX1-NEXT:    vpinsrb $1, %r8d, %xmm1, %xmm1
4105; AVX1-NEXT:    shlq $61, %rcx
4106; AVX1-NEXT:    sarq $63, %rcx
4107; AVX1-NEXT:    vpinsrb $2, %ecx, %xmm1, %xmm1
4108; AVX1-NEXT:    shlq $60, %rdi
4109; AVX1-NEXT:    sarq $63, %rdi
4110; AVX1-NEXT:    vpinsrb $3, %edi, %xmm1, %xmm1
4111; AVX1-NEXT:    shlq $59, %r13
4112; AVX1-NEXT:    sarq $63, %r13
4113; AVX1-NEXT:    vpinsrb $4, %r13d, %xmm1, %xmm1
4114; AVX1-NEXT:    shlq $58, %rsi
4115; AVX1-NEXT:    sarq $63, %rsi
4116; AVX1-NEXT:    vpinsrb $5, %esi, %xmm1, %xmm1
4117; AVX1-NEXT:    shlq $57, %r10
4118; AVX1-NEXT:    sarq $63, %r10
4119; AVX1-NEXT:    vpinsrb $6, %r10d, %xmm1, %xmm1
4120; AVX1-NEXT:    shrq $7, %r11
4121; AVX1-NEXT:    vpinsrb $7, %r11d, %xmm1, %xmm1
4122; AVX1-NEXT:    shlq $55, %r9
4123; AVX1-NEXT:    sarq $63, %r9
4124; AVX1-NEXT:    vpinsrb $8, %r9d, %xmm1, %xmm1
4125; AVX1-NEXT:    shlq $54, %rbx
4126; AVX1-NEXT:    sarq $63, %rbx
4127; AVX1-NEXT:    vpinsrb $9, %ebx, %xmm1, %xmm1
4128; AVX1-NEXT:    shlq $53, %r14
4129; AVX1-NEXT:    sarq $63, %r14
4130; AVX1-NEXT:    vpinsrb $10, %r14d, %xmm1, %xmm1
4131; AVX1-NEXT:    shlq $52, %r15
4132; AVX1-NEXT:    sarq $63, %r15
4133; AVX1-NEXT:    vpinsrb $11, %r15d, %xmm1, %xmm1
4134; AVX1-NEXT:    shlq $51, %r12
4135; AVX1-NEXT:    sarq $63, %r12
4136; AVX1-NEXT:    vpinsrb $12, %r12d, %xmm1, %xmm1
4137; AVX1-NEXT:    shlq $50, %rbp
4138; AVX1-NEXT:    sarq $63, %rbp
4139; AVX1-NEXT:    vpinsrb $13, %ebp, %xmm1, %xmm1
4140; AVX1-NEXT:    shlq $49, %rdx
4141; AVX1-NEXT:    sarq $63, %rdx
4142; AVX1-NEXT:    vpinsrb $14, %edx, %xmm1, %xmm1
4143; AVX1-NEXT:    shrq $15, %rax
4144; AVX1-NEXT:    vpinsrb $15, %eax, %xmm1, %xmm1
4145; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
4146; AVX1-NEXT:    popq %rbx
4147; AVX1-NEXT:    popq %r12
4148; AVX1-NEXT:    popq %r13
4149; AVX1-NEXT:    popq %r14
4150; AVX1-NEXT:    popq %r15
4151; AVX1-NEXT:    popq %rbp
4152; AVX1-NEXT:    retq
4153;
4154; AVX2-LABEL: load_sext_32i1_to_32i8:
4155; AVX2:       # BB#0: # %entry
4156; AVX2-NEXT:    pushq %rbp
4157; AVX2-NEXT:    pushq %r15
4158; AVX2-NEXT:    pushq %r14
4159; AVX2-NEXT:    pushq %r13
4160; AVX2-NEXT:    pushq %r12
4161; AVX2-NEXT:    pushq %rbx
4162; AVX2-NEXT:    movslq (%rdi), %rax
4163; AVX2-NEXT:    movq %rax, %rcx
4164; AVX2-NEXT:    shlq $47, %rcx
4165; AVX2-NEXT:    sarq $63, %rcx
4166; AVX2-NEXT:    vmovd %ecx, %xmm0
4167; AVX2-NEXT:    movq %rax, %r8
4168; AVX2-NEXT:    movq %rax, %rdx
4169; AVX2-NEXT:    movq %rax, %rcx
4170; AVX2-NEXT:    movq %rax, %rdi
4171; AVX2-NEXT:    movq %rax, %r13
4172; AVX2-NEXT:    movq %rax, %rsi
4173; AVX2-NEXT:    movq %rax, %r10
4174; AVX2-NEXT:    movq %rax, %r11
4175; AVX2-NEXT:    movq %rax, %r9
4176; AVX2-NEXT:    movq %rax, %rbx
4177; AVX2-NEXT:    movq %rax, %r14
4178; AVX2-NEXT:    movq %rax, %r15
4179; AVX2-NEXT:    movq %rax, %r12
4180; AVX2-NEXT:    movq %rax, %rbp
4181; AVX2-NEXT:    shlq $46, %rbp
4182; AVX2-NEXT:    sarq $63, %rbp
4183; AVX2-NEXT:    vpinsrb $1, %ebp, %xmm0, %xmm0
4184; AVX2-NEXT:    movq %rax, %rbp
4185; AVX2-NEXT:    shlq $45, %r8
4186; AVX2-NEXT:    sarq $63, %r8
4187; AVX2-NEXT:    vpinsrb $2, %r8d, %xmm0, %xmm0
4188; AVX2-NEXT:    movq %rax, %r8
4189; AVX2-NEXT:    shlq $44, %rdx
4190; AVX2-NEXT:    sarq $63, %rdx
4191; AVX2-NEXT:    vpinsrb $3, %edx, %xmm0, %xmm0
4192; AVX2-NEXT:    movq %rax, %rdx
4193; AVX2-NEXT:    shlq $43, %rcx
4194; AVX2-NEXT:    sarq $63, %rcx
4195; AVX2-NEXT:    vpinsrb $4, %ecx, %xmm0, %xmm0
4196; AVX2-NEXT:    movq %rax, %rcx
4197; AVX2-NEXT:    shlq $42, %rdi
4198; AVX2-NEXT:    sarq $63, %rdi
4199; AVX2-NEXT:    vpinsrb $5, %edi, %xmm0, %xmm0
4200; AVX2-NEXT:    movq %rax, %rdi
4201; AVX2-NEXT:    shlq $41, %r13
4202; AVX2-NEXT:    sarq $63, %r13
4203; AVX2-NEXT:    vpinsrb $6, %r13d, %xmm0, %xmm0
4204; AVX2-NEXT:    movq %rax, %r13
4205; AVX2-NEXT:    shlq $40, %rsi
4206; AVX2-NEXT:    sarq $63, %rsi
4207; AVX2-NEXT:    vpinsrb $7, %esi, %xmm0, %xmm0
4208; AVX2-NEXT:    movq %rax, %rsi
4209; AVX2-NEXT:    shlq $39, %r10
4210; AVX2-NEXT:    sarq $63, %r10
4211; AVX2-NEXT:    vpinsrb $8, %r10d, %xmm0, %xmm0
4212; AVX2-NEXT:    movq %rax, %r10
4213; AVX2-NEXT:    shlq $38, %r11
4214; AVX2-NEXT:    sarq $63, %r11
4215; AVX2-NEXT:    vpinsrb $9, %r11d, %xmm0, %xmm0
4216; AVX2-NEXT:    movsbq %al, %r11
4217; AVX2-NEXT:    shlq $37, %r9
4218; AVX2-NEXT:    sarq $63, %r9
4219; AVX2-NEXT:    vpinsrb $10, %r9d, %xmm0, %xmm0
4220; AVX2-NEXT:    movq %rax, %r9
4221; AVX2-NEXT:    shlq $36, %rbx
4222; AVX2-NEXT:    sarq $63, %rbx
4223; AVX2-NEXT:    vpinsrb $11, %ebx, %xmm0, %xmm0
4224; AVX2-NEXT:    movq %rax, %rbx
4225; AVX2-NEXT:    shlq $35, %r14
4226; AVX2-NEXT:    sarq $63, %r14
4227; AVX2-NEXT:    vpinsrb $12, %r14d, %xmm0, %xmm0
4228; AVX2-NEXT:    movq %rax, %r14
4229; AVX2-NEXT:    shlq $34, %r15
4230; AVX2-NEXT:    sarq $63, %r15
4231; AVX2-NEXT:    vpinsrb $13, %r15d, %xmm0, %xmm0
4232; AVX2-NEXT:    movq %rax, %r15
4233; AVX2-NEXT:    shlq $33, %r12
4234; AVX2-NEXT:    sarq $63, %r12
4235; AVX2-NEXT:    vpinsrb $14, %r12d, %xmm0, %xmm0
4236; AVX2-NEXT:    movq %rax, %r12
4237; AVX2-NEXT:    shrq $31, %rbp
4238; AVX2-NEXT:    vpinsrb $15, %ebp, %xmm0, %xmm0
4239; AVX2-NEXT:    movq %rax, %rbp
4240; AVX2-NEXT:    shlq $63, %rdx
4241; AVX2-NEXT:    sarq $63, %rdx
4242; AVX2-NEXT:    vmovd %edx, %xmm1
4243; AVX2-NEXT:    movq %rax, %rdx
4244; AVX2-NEXT:    movswq %ax, %rax
4245; AVX2-NEXT:    shlq $62, %r8
4246; AVX2-NEXT:    sarq $63, %r8
4247; AVX2-NEXT:    vpinsrb $1, %r8d, %xmm1, %xmm1
4248; AVX2-NEXT:    shlq $61, %rcx
4249; AVX2-NEXT:    sarq $63, %rcx
4250; AVX2-NEXT:    vpinsrb $2, %ecx, %xmm1, %xmm1
4251; AVX2-NEXT:    shlq $60, %rdi
4252; AVX2-NEXT:    sarq $63, %rdi
4253; AVX2-NEXT:    vpinsrb $3, %edi, %xmm1, %xmm1
4254; AVX2-NEXT:    shlq $59, %r13
4255; AVX2-NEXT:    sarq $63, %r13
4256; AVX2-NEXT:    vpinsrb $4, %r13d, %xmm1, %xmm1
4257; AVX2-NEXT:    shlq $58, %rsi
4258; AVX2-NEXT:    sarq $63, %rsi
4259; AVX2-NEXT:    vpinsrb $5, %esi, %xmm1, %xmm1
4260; AVX2-NEXT:    shlq $57, %r10
4261; AVX2-NEXT:    sarq $63, %r10
4262; AVX2-NEXT:    vpinsrb $6, %r10d, %xmm1, %xmm1
4263; AVX2-NEXT:    shrq $7, %r11
4264; AVX2-NEXT:    vpinsrb $7, %r11d, %xmm1, %xmm1
4265; AVX2-NEXT:    shlq $55, %r9
4266; AVX2-NEXT:    sarq $63, %r9
4267; AVX2-NEXT:    vpinsrb $8, %r9d, %xmm1, %xmm1
4268; AVX2-NEXT:    shlq $54, %rbx
4269; AVX2-NEXT:    sarq $63, %rbx
4270; AVX2-NEXT:    vpinsrb $9, %ebx, %xmm1, %xmm1
4271; AVX2-NEXT:    shlq $53, %r14
4272; AVX2-NEXT:    sarq $63, %r14
4273; AVX2-NEXT:    vpinsrb $10, %r14d, %xmm1, %xmm1
4274; AVX2-NEXT:    shlq $52, %r15
4275; AVX2-NEXT:    sarq $63, %r15
4276; AVX2-NEXT:    vpinsrb $11, %r15d, %xmm1, %xmm1
4277; AVX2-NEXT:    shlq $51, %r12
4278; AVX2-NEXT:    sarq $63, %r12
4279; AVX2-NEXT:    vpinsrb $12, %r12d, %xmm1, %xmm1
4280; AVX2-NEXT:    shlq $50, %rbp
4281; AVX2-NEXT:    sarq $63, %rbp
4282; AVX2-NEXT:    vpinsrb $13, %ebp, %xmm1, %xmm1
4283; AVX2-NEXT:    shlq $49, %rdx
4284; AVX2-NEXT:    sarq $63, %rdx
4285; AVX2-NEXT:    vpinsrb $14, %edx, %xmm1, %xmm1
4286; AVX2-NEXT:    shrq $15, %rax
4287; AVX2-NEXT:    vpinsrb $15, %eax, %xmm1, %xmm1
4288; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
4289; AVX2-NEXT:    popq %rbx
4290; AVX2-NEXT:    popq %r12
4291; AVX2-NEXT:    popq %r13
4292; AVX2-NEXT:    popq %r14
4293; AVX2-NEXT:    popq %r15
4294; AVX2-NEXT:    popq %rbp
4295; AVX2-NEXT:    retq
4296;
4297; AVX512F-LABEL: load_sext_32i1_to_32i8:
4298; AVX512F:       # BB#0: # %entry
4299; AVX512F-NEXT:    kmovw (%rdi), %k1
4300; AVX512F-NEXT:    kmovw 2(%rdi), %k2
4301; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
4302; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
4303; AVX512F-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k2} {z}
4304; AVX512F-NEXT:    vpmovdb %zmm1, %xmm1
4305; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
4306; AVX512F-NEXT:    retq
4307;
4308; AVX512BW-LABEL: load_sext_32i1_to_32i8:
4309; AVX512BW:       # BB#0: # %entry
4310; AVX512BW-NEXT:    kmovd (%rdi), %k0
4311; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
4312; AVX512BW-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
4313; AVX512BW-NEXT:    retq
4314;
4315; X32-SSE41-LABEL: load_sext_32i1_to_32i8:
4316; X32-SSE41:       # BB#0: # %entry
4317; X32-SSE41-NEXT:    pushl %esi
4318; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
4319; X32-SSE41-NEXT:    movswl (%eax), %ecx
4320; X32-SSE41-NEXT:    movl %ecx, %edx
4321; X32-SSE41-NEXT:    shll $30, %edx
4322; X32-SSE41-NEXT:    sarl $31, %edx
4323; X32-SSE41-NEXT:    movl %ecx, %esi
4324; X32-SSE41-NEXT:    shll $31, %esi
4325; X32-SSE41-NEXT:    sarl $31, %esi
4326; X32-SSE41-NEXT:    movd %esi, %xmm0
4327; X32-SSE41-NEXT:    pinsrb $1, %edx, %xmm0
4328; X32-SSE41-NEXT:    movl %ecx, %edx
4329; X32-SSE41-NEXT:    shll $29, %edx
4330; X32-SSE41-NEXT:    sarl $31, %edx
4331; X32-SSE41-NEXT:    pinsrb $2, %edx, %xmm0
4332; X32-SSE41-NEXT:    movl %ecx, %edx
4333; X32-SSE41-NEXT:    shll $28, %edx
4334; X32-SSE41-NEXT:    sarl $31, %edx
4335; X32-SSE41-NEXT:    pinsrb $3, %edx, %xmm0
4336; X32-SSE41-NEXT:    movl %ecx, %edx
4337; X32-SSE41-NEXT:    shll $27, %edx
4338; X32-SSE41-NEXT:    sarl $31, %edx
4339; X32-SSE41-NEXT:    pinsrb $4, %edx, %xmm0
4340; X32-SSE41-NEXT:    movl %ecx, %edx
4341; X32-SSE41-NEXT:    shll $26, %edx
4342; X32-SSE41-NEXT:    sarl $31, %edx
4343; X32-SSE41-NEXT:    pinsrb $5, %edx, %xmm0
4344; X32-SSE41-NEXT:    movl %ecx, %edx
4345; X32-SSE41-NEXT:    shll $25, %edx
4346; X32-SSE41-NEXT:    sarl $31, %edx
4347; X32-SSE41-NEXT:    pinsrb $6, %edx, %xmm0
4348; X32-SSE41-NEXT:    movsbl %cl, %edx
4349; X32-SSE41-NEXT:    shrl $7, %edx
4350; X32-SSE41-NEXT:    pinsrb $7, %edx, %xmm0
4351; X32-SSE41-NEXT:    movl %ecx, %edx
4352; X32-SSE41-NEXT:    shll $23, %edx
4353; X32-SSE41-NEXT:    sarl $31, %edx
4354; X32-SSE41-NEXT:    pinsrb $8, %edx, %xmm0
4355; X32-SSE41-NEXT:    movl %ecx, %edx
4356; X32-SSE41-NEXT:    shll $22, %edx
4357; X32-SSE41-NEXT:    sarl $31, %edx
4358; X32-SSE41-NEXT:    pinsrb $9, %edx, %xmm0
4359; X32-SSE41-NEXT:    movl %ecx, %edx
4360; X32-SSE41-NEXT:    shll $21, %edx
4361; X32-SSE41-NEXT:    sarl $31, %edx
4362; X32-SSE41-NEXT:    pinsrb $10, %edx, %xmm0
4363; X32-SSE41-NEXT:    movl %ecx, %edx
4364; X32-SSE41-NEXT:    shll $20, %edx
4365; X32-SSE41-NEXT:    sarl $31, %edx
4366; X32-SSE41-NEXT:    pinsrb $11, %edx, %xmm0
4367; X32-SSE41-NEXT:    movl %ecx, %edx
4368; X32-SSE41-NEXT:    shll $19, %edx
4369; X32-SSE41-NEXT:    sarl $31, %edx
4370; X32-SSE41-NEXT:    pinsrb $12, %edx, %xmm0
4371; X32-SSE41-NEXT:    movl %ecx, %edx
4372; X32-SSE41-NEXT:    shll $18, %edx
4373; X32-SSE41-NEXT:    sarl $31, %edx
4374; X32-SSE41-NEXT:    pinsrb $13, %edx, %xmm0
4375; X32-SSE41-NEXT:    movl %ecx, %edx
4376; X32-SSE41-NEXT:    shll $17, %edx
4377; X32-SSE41-NEXT:    sarl $31, %edx
4378; X32-SSE41-NEXT:    pinsrb $14, %edx, %xmm0
4379; X32-SSE41-NEXT:    shrl $15, %ecx
4380; X32-SSE41-NEXT:    pinsrb $15, %ecx, %xmm0
4381; X32-SSE41-NEXT:    movswl 2(%eax), %eax
4382; X32-SSE41-NEXT:    movl %eax, %ecx
4383; X32-SSE41-NEXT:    shll $30, %ecx
4384; X32-SSE41-NEXT:    sarl $31, %ecx
4385; X32-SSE41-NEXT:    movl %eax, %edx
4386; X32-SSE41-NEXT:    shll $31, %edx
4387; X32-SSE41-NEXT:    sarl $31, %edx
4388; X32-SSE41-NEXT:    movd %edx, %xmm1
4389; X32-SSE41-NEXT:    pinsrb $1, %ecx, %xmm1
4390; X32-SSE41-NEXT:    movl %eax, %ecx
4391; X32-SSE41-NEXT:    shll $29, %ecx
4392; X32-SSE41-NEXT:    sarl $31, %ecx
4393; X32-SSE41-NEXT:    pinsrb $2, %ecx, %xmm1
4394; X32-SSE41-NEXT:    movl %eax, %ecx
4395; X32-SSE41-NEXT:    shll $28, %ecx
4396; X32-SSE41-NEXT:    sarl $31, %ecx
4397; X32-SSE41-NEXT:    pinsrb $3, %ecx, %xmm1
4398; X32-SSE41-NEXT:    movl %eax, %ecx
4399; X32-SSE41-NEXT:    shll $27, %ecx
4400; X32-SSE41-NEXT:    sarl $31, %ecx
4401; X32-SSE41-NEXT:    pinsrb $4, %ecx, %xmm1
4402; X32-SSE41-NEXT:    movl %eax, %ecx
4403; X32-SSE41-NEXT:    shll $26, %ecx
4404; X32-SSE41-NEXT:    sarl $31, %ecx
4405; X32-SSE41-NEXT:    pinsrb $5, %ecx, %xmm1
4406; X32-SSE41-NEXT:    movl %eax, %ecx
4407; X32-SSE41-NEXT:    shll $25, %ecx
4408; X32-SSE41-NEXT:    sarl $31, %ecx
4409; X32-SSE41-NEXT:    pinsrb $6, %ecx, %xmm1
4410; X32-SSE41-NEXT:    movsbl %al, %ecx
4411; X32-SSE41-NEXT:    shrl $7, %ecx
4412; X32-SSE41-NEXT:    pinsrb $7, %ecx, %xmm1
4413; X32-SSE41-NEXT:    movl %eax, %ecx
4414; X32-SSE41-NEXT:    shll $23, %ecx
4415; X32-SSE41-NEXT:    sarl $31, %ecx
4416; X32-SSE41-NEXT:    pinsrb $8, %ecx, %xmm1
4417; X32-SSE41-NEXT:    movl %eax, %ecx
4418; X32-SSE41-NEXT:    shll $22, %ecx
4419; X32-SSE41-NEXT:    sarl $31, %ecx
4420; X32-SSE41-NEXT:    pinsrb $9, %ecx, %xmm1
4421; X32-SSE41-NEXT:    movl %eax, %ecx
4422; X32-SSE41-NEXT:    shll $21, %ecx
4423; X32-SSE41-NEXT:    sarl $31, %ecx
4424; X32-SSE41-NEXT:    pinsrb $10, %ecx, %xmm1
4425; X32-SSE41-NEXT:    movl %eax, %ecx
4426; X32-SSE41-NEXT:    shll $20, %ecx
4427; X32-SSE41-NEXT:    sarl $31, %ecx
4428; X32-SSE41-NEXT:    pinsrb $11, %ecx, %xmm1
4429; X32-SSE41-NEXT:    movl %eax, %ecx
4430; X32-SSE41-NEXT:    shll $19, %ecx
4431; X32-SSE41-NEXT:    sarl $31, %ecx
4432; X32-SSE41-NEXT:    pinsrb $12, %ecx, %xmm1
4433; X32-SSE41-NEXT:    movl %eax, %ecx
4434; X32-SSE41-NEXT:    shll $18, %ecx
4435; X32-SSE41-NEXT:    sarl $31, %ecx
4436; X32-SSE41-NEXT:    pinsrb $13, %ecx, %xmm1
4437; X32-SSE41-NEXT:    movl %eax, %ecx
4438; X32-SSE41-NEXT:    shll $17, %ecx
4439; X32-SSE41-NEXT:    sarl $31, %ecx
4440; X32-SSE41-NEXT:    pinsrb $14, %ecx, %xmm1
4441; X32-SSE41-NEXT:    shrl $15, %eax
4442; X32-SSE41-NEXT:    pinsrb $15, %eax, %xmm1
4443; X32-SSE41-NEXT:    popl %esi
4444; X32-SSE41-NEXT:    retl
4445entry:
4446 %X = load <32 x i1>, <32 x i1>* %ptr
4447 %Y = sext <32 x i1> %X to <32 x i8>
4448 ret <32 x i8> %Y
4449}
4450
4451define <16 x i16> @load_sext_16i8_to_16i16(<16 x i8> *%ptr) {
4452; SSE2-LABEL: load_sext_16i8_to_16i16:
4453; SSE2:       # BB#0: # %entry
4454; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
4455; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
4456; SSE2-NEXT:    psraw $8, %xmm0
4457; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
4458; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
4459; SSE2-NEXT:    psraw $8, %xmm1
4460; SSE2-NEXT:    retq
4461;
4462; SSSE3-LABEL: load_sext_16i8_to_16i16:
4463; SSSE3:       # BB#0: # %entry
4464; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
4465; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
4466; SSSE3-NEXT:    psraw $8, %xmm0
4467; SSSE3-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
4468; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
4469; SSSE3-NEXT:    psraw $8, %xmm1
4470; SSSE3-NEXT:    retq
4471;
4472; SSE41-LABEL: load_sext_16i8_to_16i16:
4473; SSE41:       # BB#0: # %entry
4474; SSE41-NEXT:    pmovsxbw (%rdi), %xmm0
4475; SSE41-NEXT:    pmovsxbw 8(%rdi), %xmm1
4476; SSE41-NEXT:    retq
4477;
4478; AVX1-LABEL: load_sext_16i8_to_16i16:
4479; AVX1:       # BB#0: # %entry
4480; AVX1-NEXT:    vpmovsxbw (%rdi), %xmm0
4481; AVX1-NEXT:    vpmovsxbw 8(%rdi), %xmm1
4482; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
4483; AVX1-NEXT:    retq
4484;
4485; AVX2-LABEL: load_sext_16i8_to_16i16:
4486; AVX2:       # BB#0: # %entry
4487; AVX2-NEXT:    vpmovsxbw (%rdi), %ymm0
4488; AVX2-NEXT:    retq
4489;
4490; AVX512-LABEL: load_sext_16i8_to_16i16:
4491; AVX512:       # BB#0: # %entry
4492; AVX512-NEXT:    vpmovsxbw (%rdi), %ymm0
4493; AVX512-NEXT:    retq
4494;
4495; X32-SSE41-LABEL: load_sext_16i8_to_16i16:
4496; X32-SSE41:       # BB#0: # %entry
4497; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
4498; X32-SSE41-NEXT:    pmovsxbw (%eax), %xmm0
4499; X32-SSE41-NEXT:    pmovsxbw 8(%eax), %xmm1
4500; X32-SSE41-NEXT:    retl
4501entry:
4502 %X = load <16 x i8>, <16 x i8>* %ptr
4503 %Y = sext <16 x i8> %X to <16 x i16>
4504 ret <16 x i16> %Y
4505}
4506
4507define <2 x i64> @load_sext_2i16_to_2i64(<2 x i16> *%ptr) {
4508; SSE2-LABEL: load_sext_2i16_to_2i64:
4509; SSE2:       # BB#0: # %entry
4510; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
4511; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]
4512; SSE2-NEXT:    movdqa %xmm0, %xmm1
4513; SSE2-NEXT:    psrad $31, %xmm1
4514; SSE2-NEXT:    psrad $16, %xmm0
4515; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
4516; SSE2-NEXT:    retq
4517;
4518; SSSE3-LABEL: load_sext_2i16_to_2i64:
4519; SSSE3:       # BB#0: # %entry
4520; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
4521; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]
4522; SSSE3-NEXT:    movdqa %xmm0, %xmm1
4523; SSSE3-NEXT:    psrad $31, %xmm1
4524; SSSE3-NEXT:    psrad $16, %xmm0
4525; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
4526; SSSE3-NEXT:    retq
4527;
4528; SSE41-LABEL: load_sext_2i16_to_2i64:
4529; SSE41:       # BB#0: # %entry
4530; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
4531; SSE41-NEXT:    retq
4532;
4533; AVX-LABEL: load_sext_2i16_to_2i64:
4534; AVX:       # BB#0: # %entry
4535; AVX-NEXT:    vpmovsxwq (%rdi), %xmm0
4536; AVX-NEXT:    retq
4537;
4538; X32-SSE41-LABEL: load_sext_2i16_to_2i64:
4539; X32-SSE41:       # BB#0: # %entry
4540; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
4541; X32-SSE41-NEXT:    pmovsxwq (%eax), %xmm0
4542; X32-SSE41-NEXT:    retl
4543entry:
4544 %X = load <2 x i16>, <2 x i16>* %ptr
4545 %Y = sext <2 x i16> %X to <2 x i64>
4546 ret <2 x i64> %Y
4547}
4548
4549define <4 x i32> @load_sext_4i16_to_4i32(<4 x i16> *%ptr) {
4550; SSE2-LABEL: load_sext_4i16_to_4i32:
4551; SSE2:       # BB#0: # %entry
4552; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
4553; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
4554; SSE2-NEXT:    psrad $16, %xmm0
4555; SSE2-NEXT:    retq
4556;
4557; SSSE3-LABEL: load_sext_4i16_to_4i32:
4558; SSSE3:       # BB#0: # %entry
4559; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
4560; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
4561; SSSE3-NEXT:    psrad $16, %xmm0
4562; SSSE3-NEXT:    retq
4563;
4564; SSE41-LABEL: load_sext_4i16_to_4i32:
4565; SSE41:       # BB#0: # %entry
4566; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
4567; SSE41-NEXT:    retq
4568;
4569; AVX-LABEL: load_sext_4i16_to_4i32:
4570; AVX:       # BB#0: # %entry
4571; AVX-NEXT:    vpmovsxwd (%rdi), %xmm0
4572; AVX-NEXT:    retq
4573;
4574; X32-SSE41-LABEL: load_sext_4i16_to_4i32:
4575; X32-SSE41:       # BB#0: # %entry
4576; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
4577; X32-SSE41-NEXT:    pmovsxwd (%eax), %xmm0
4578; X32-SSE41-NEXT:    retl
4579entry:
4580 %X = load <4 x i16>, <4 x i16>* %ptr
4581 %Y = sext <4 x i16> %X to <4 x i32>
4582 ret <4 x i32> %Y
4583}
4584
4585define <4 x i64> @load_sext_4i16_to_4i64(<4 x i16> *%ptr) {
4586; SSE2-LABEL: load_sext_4i16_to_4i64:
4587; SSE2:       # BB#0: # %entry
4588; SSE2-NEXT:    movswq 2(%rdi), %rax
4589; SSE2-NEXT:    movq %rax, %xmm1
4590; SSE2-NEXT:    movswq (%rdi), %rax
4591; SSE2-NEXT:    movq %rax, %xmm0
4592; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4593; SSE2-NEXT:    movswq 6(%rdi), %rax
4594; SSE2-NEXT:    movq %rax, %xmm2
4595; SSE2-NEXT:    movswq 4(%rdi), %rax
4596; SSE2-NEXT:    movq %rax, %xmm1
4597; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
4598; SSE2-NEXT:    retq
4599;
4600; SSSE3-LABEL: load_sext_4i16_to_4i64:
4601; SSSE3:       # BB#0: # %entry
4602; SSSE3-NEXT:    movswq 2(%rdi), %rax
4603; SSSE3-NEXT:    movq %rax, %xmm1
4604; SSSE3-NEXT:    movswq (%rdi), %rax
4605; SSSE3-NEXT:    movq %rax, %xmm0
4606; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4607; SSSE3-NEXT:    movswq 6(%rdi), %rax
4608; SSSE3-NEXT:    movq %rax, %xmm2
4609; SSSE3-NEXT:    movswq 4(%rdi), %rax
4610; SSSE3-NEXT:    movq %rax, %xmm1
4611; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
4612; SSSE3-NEXT:    retq
4613;
4614; SSE41-LABEL: load_sext_4i16_to_4i64:
4615; SSE41:       # BB#0: # %entry
4616; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
4617; SSE41-NEXT:    pmovsxwq 4(%rdi), %xmm1
4618; SSE41-NEXT:    retq
4619;
4620; AVX1-LABEL: load_sext_4i16_to_4i64:
4621; AVX1:       # BB#0: # %entry
4622; AVX1-NEXT:    vpmovsxwd (%rdi), %xmm0
4623; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
4624; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
4625; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
4626; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
4627; AVX1-NEXT:    retq
4628;
4629; AVX2-LABEL: load_sext_4i16_to_4i64:
4630; AVX2:       # BB#0: # %entry
4631; AVX2-NEXT:    vpmovsxwq (%rdi), %ymm0
4632; AVX2-NEXT:    retq
4633;
4634; AVX512-LABEL: load_sext_4i16_to_4i64:
4635; AVX512:       # BB#0: # %entry
4636; AVX512-NEXT:    vpmovsxwq (%rdi), %ymm0
4637; AVX512-NEXT:    retq
4638;
4639; X32-SSE41-LABEL: load_sext_4i16_to_4i64:
4640; X32-SSE41:       # BB#0: # %entry
4641; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
4642; X32-SSE41-NEXT:    pmovsxwq (%eax), %xmm0
4643; X32-SSE41-NEXT:    pmovsxwq 4(%eax), %xmm1
4644; X32-SSE41-NEXT:    retl
4645entry:
4646 %X = load <4 x i16>, <4 x i16>* %ptr
4647 %Y = sext <4 x i16> %X to <4 x i64>
4648 ret <4 x i64> %Y
4649}
4650
4651define <8 x i32> @load_sext_8i16_to_8i32(<8 x i16> *%ptr) {
4652; SSE2-LABEL: load_sext_8i16_to_8i32:
4653; SSE2:       # BB#0: # %entry
4654; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
4655; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
4656; SSE2-NEXT:    psrad $16, %xmm0
4657; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
4658; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
4659; SSE2-NEXT:    psrad $16, %xmm1
4660; SSE2-NEXT:    retq
4661;
4662; SSSE3-LABEL: load_sext_8i16_to_8i32:
4663; SSSE3:       # BB#0: # %entry
4664; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
4665; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
4666; SSSE3-NEXT:    psrad $16, %xmm0
4667; SSSE3-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
4668; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
4669; SSSE3-NEXT:    psrad $16, %xmm1
4670; SSSE3-NEXT:    retq
4671;
4672; SSE41-LABEL: load_sext_8i16_to_8i32:
4673; SSE41:       # BB#0: # %entry
4674; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
4675; SSE41-NEXT:    pmovsxwd 8(%rdi), %xmm1
4676; SSE41-NEXT:    retq
4677;
4678; AVX1-LABEL: load_sext_8i16_to_8i32:
4679; AVX1:       # BB#0: # %entry
4680; AVX1-NEXT:    vpmovsxwd (%rdi), %xmm0
4681; AVX1-NEXT:    vpmovsxwd 8(%rdi), %xmm1
4682; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
4683; AVX1-NEXT:    retq
4684;
4685; AVX2-LABEL: load_sext_8i16_to_8i32:
4686; AVX2:       # BB#0: # %entry
4687; AVX2-NEXT:    vpmovsxwd (%rdi), %ymm0
4688; AVX2-NEXT:    retq
4689;
4690; AVX512-LABEL: load_sext_8i16_to_8i32:
4691; AVX512:       # BB#0: # %entry
4692; AVX512-NEXT:    vpmovsxwd (%rdi), %ymm0
4693; AVX512-NEXT:    retq
4694;
4695; X32-SSE41-LABEL: load_sext_8i16_to_8i32:
4696; X32-SSE41:       # BB#0: # %entry
4697; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
4698; X32-SSE41-NEXT:    pmovsxwd (%eax), %xmm0
4699; X32-SSE41-NEXT:    pmovsxwd 8(%eax), %xmm1
4700; X32-SSE41-NEXT:    retl
4701entry:
4702 %X = load <8 x i16>, <8 x i16>* %ptr
4703 %Y = sext <8 x i16> %X to <8 x i32>
4704 ret <8 x i32> %Y
4705}
4706
4707define <2 x i64> @load_sext_2i32_to_2i64(<2 x i32> *%ptr) {
4708; SSE2-LABEL: load_sext_2i32_to_2i64:
4709; SSE2:       # BB#0: # %entry
4710; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
4711; SSE2-NEXT:    movdqa %xmm0, %xmm1
4712; SSE2-NEXT:    psrad $31, %xmm1
4713; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
4714; SSE2-NEXT:    retq
4715;
4716; SSSE3-LABEL: load_sext_2i32_to_2i64:
4717; SSSE3:       # BB#0: # %entry
4718; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
4719; SSSE3-NEXT:    movdqa %xmm0, %xmm1
4720; SSSE3-NEXT:    psrad $31, %xmm1
4721; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
4722; SSSE3-NEXT:    retq
4723;
4724; SSE41-LABEL: load_sext_2i32_to_2i64:
4725; SSE41:       # BB#0: # %entry
4726; SSE41-NEXT:    pmovsxdq (%rdi), %xmm0
4727; SSE41-NEXT:    retq
4728;
4729; AVX-LABEL: load_sext_2i32_to_2i64:
4730; AVX:       # BB#0: # %entry
4731; AVX-NEXT:    vpmovsxdq (%rdi), %xmm0
4732; AVX-NEXT:    retq
4733;
4734; X32-SSE41-LABEL: load_sext_2i32_to_2i64:
4735; X32-SSE41:       # BB#0: # %entry
4736; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
4737; X32-SSE41-NEXT:    pmovsxdq (%eax), %xmm0
4738; X32-SSE41-NEXT:    retl
4739entry:
4740 %X = load <2 x i32>, <2 x i32>* %ptr
4741 %Y = sext <2 x i32> %X to <2 x i64>
4742 ret <2 x i64> %Y
4743}
4744
4745define <4 x i64> @load_sext_4i32_to_4i64(<4 x i32> *%ptr) {
4746; SSE2-LABEL: load_sext_4i32_to_4i64:
4747; SSE2:       # BB#0: # %entry
4748; SSE2-NEXT:    movdqa (%rdi), %xmm0
4749; SSE2-NEXT:    movdqa %xmm0, %xmm2
4750; SSE2-NEXT:    psrad $31, %xmm2
4751; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
4752; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
4753; SSE2-NEXT:    movdqa %xmm1, %xmm2
4754; SSE2-NEXT:    psrad $31, %xmm2
4755; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
4756; SSE2-NEXT:    retq
4757;
4758; SSSE3-LABEL: load_sext_4i32_to_4i64:
4759; SSSE3:       # BB#0: # %entry
4760; SSSE3-NEXT:    movdqa (%rdi), %xmm0
4761; SSSE3-NEXT:    movdqa %xmm0, %xmm2
4762; SSSE3-NEXT:    psrad $31, %xmm2
4763; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
4764; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
4765; SSSE3-NEXT:    movdqa %xmm1, %xmm2
4766; SSSE3-NEXT:    psrad $31, %xmm2
4767; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
4768; SSSE3-NEXT:    retq
4769;
4770; SSE41-LABEL: load_sext_4i32_to_4i64:
4771; SSE41:       # BB#0: # %entry
4772; SSE41-NEXT:    pmovsxdq (%rdi), %xmm0
4773; SSE41-NEXT:    pmovsxdq 8(%rdi), %xmm1
4774; SSE41-NEXT:    retq
4775;
4776; AVX1-LABEL: load_sext_4i32_to_4i64:
4777; AVX1:       # BB#0: # %entry
4778; AVX1-NEXT:    vpmovsxdq (%rdi), %xmm0
4779; AVX1-NEXT:    vpmovsxdq 8(%rdi), %xmm1
4780; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
4781; AVX1-NEXT:    retq
4782;
4783; AVX2-LABEL: load_sext_4i32_to_4i64:
4784; AVX2:       # BB#0: # %entry
4785; AVX2-NEXT:    vpmovsxdq (%rdi), %ymm0
4786; AVX2-NEXT:    retq
4787;
4788; AVX512-LABEL: load_sext_4i32_to_4i64:
4789; AVX512:       # BB#0: # %entry
4790; AVX512-NEXT:    vpmovsxdq (%rdi), %ymm0
4791; AVX512-NEXT:    retq
4792;
4793; X32-SSE41-LABEL: load_sext_4i32_to_4i64:
4794; X32-SSE41:       # BB#0: # %entry
4795; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
4796; X32-SSE41-NEXT:    pmovsxdq (%eax), %xmm0
4797; X32-SSE41-NEXT:    pmovsxdq 8(%eax), %xmm1
4798; X32-SSE41-NEXT:    retl
4799entry:
4800 %X = load <4 x i32>, <4 x i32>* %ptr
4801 %Y = sext <4 x i32> %X to <4 x i64>
4802 ret <4 x i64> %Y
4803}
4804
4805define i32 @sext_2i8_to_i32(<16 x i8> %A) nounwind uwtable readnone ssp {
4806; SSE2-LABEL: sext_2i8_to_i32:
4807; SSE2:       # BB#0: # %entry
4808; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
4809; SSE2-NEXT:    psraw $8, %xmm0
4810; SSE2-NEXT:    movd %xmm0, %eax
4811; SSE2-NEXT:    retq
4812;
4813; SSSE3-LABEL: sext_2i8_to_i32:
4814; SSSE3:       # BB#0: # %entry
4815; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
4816; SSSE3-NEXT:    psraw $8, %xmm0
4817; SSSE3-NEXT:    movd %xmm0, %eax
4818; SSSE3-NEXT:    retq
4819;
4820; SSE41-LABEL: sext_2i8_to_i32:
4821; SSE41:       # BB#0: # %entry
4822; SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
4823; SSE41-NEXT:    movd %xmm0, %eax
4824; SSE41-NEXT:    retq
4825;
4826; AVX-LABEL: sext_2i8_to_i32:
4827; AVX:       # BB#0: # %entry
4828; AVX-NEXT:    vpmovsxbw %xmm0, %xmm0
4829; AVX-NEXT:    vmovd %xmm0, %eax
4830; AVX-NEXT:    retq
4831;
4832; X32-SSE41-LABEL: sext_2i8_to_i32:
4833; X32-SSE41:       # BB#0: # %entry
4834; X32-SSE41-NEXT:    pushl %eax
4835; X32-SSE41-NEXT:    .cfi_def_cfa_offset 8
4836; X32-SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
4837; X32-SSE41-NEXT:    movd %xmm0, %eax
4838; X32-SSE41-NEXT:    popl %ecx
4839; X32-SSE41-NEXT:    .cfi_def_cfa_offset 4
4840; X32-SSE41-NEXT:    retl
4841entry:
4842  %Shuf = shufflevector <16 x i8> %A, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
4843  %Ex = sext <2 x i8> %Shuf to <2 x i16>
4844  %Bc = bitcast <2 x i16> %Ex to i32
4845  ret i32 %Bc
4846}
4847
4848define <4 x i64> @sext_4i1_to_4i64(<4 x i1> %mask) {
4849; SSE2-LABEL: sext_4i1_to_4i64:
4850; SSE2:       # BB#0:
4851; SSE2-NEXT:    pslld $31, %xmm0
4852; SSE2-NEXT:    psrad $31, %xmm0
4853; SSE2-NEXT:    movdqa %xmm0, %xmm2
4854; SSE2-NEXT:    psrad $31, %xmm2
4855; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
4856; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
4857; SSE2-NEXT:    movdqa %xmm1, %xmm2
4858; SSE2-NEXT:    psrad $31, %xmm2
4859; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
4860; SSE2-NEXT:    retq
4861;
4862; SSSE3-LABEL: sext_4i1_to_4i64:
4863; SSSE3:       # BB#0:
4864; SSSE3-NEXT:    pslld $31, %xmm0
4865; SSSE3-NEXT:    psrad $31, %xmm0
4866; SSSE3-NEXT:    movdqa %xmm0, %xmm2
4867; SSSE3-NEXT:    psrad $31, %xmm2
4868; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
4869; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
4870; SSSE3-NEXT:    movdqa %xmm1, %xmm2
4871; SSSE3-NEXT:    psrad $31, %xmm2
4872; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
4873; SSSE3-NEXT:    retq
4874;
4875; SSE41-LABEL: sext_4i1_to_4i64:
4876; SSE41:       # BB#0:
4877; SSE41-NEXT:    pslld $31, %xmm0
4878; SSE41-NEXT:    psrad $31, %xmm0
4879; SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
4880; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
4881; SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
4882; SSE41-NEXT:    movdqa %xmm2, %xmm0
4883; SSE41-NEXT:    retq
4884;
4885; AVX1-LABEL: sext_4i1_to_4i64:
4886; AVX1:       # BB#0:
4887; AVX1-NEXT:    vpslld $31, %xmm0, %xmm0
4888; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm0
4889; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
4890; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
4891; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
4892; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
4893; AVX1-NEXT:    retq
4894;
4895; AVX2-LABEL: sext_4i1_to_4i64:
4896; AVX2:       # BB#0:
4897; AVX2-NEXT:    vpslld $31, %xmm0, %xmm0
4898; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm0
4899; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
4900; AVX2-NEXT:    retq
4901;
4902; AVX512-LABEL: sext_4i1_to_4i64:
4903; AVX512:       # BB#0:
4904; AVX512-NEXT:    vpslld $31, %xmm0, %xmm0
4905; AVX512-NEXT:    vpsrad $31, %xmm0, %xmm0
4906; AVX512-NEXT:    vpmovsxdq %xmm0, %ymm0
4907; AVX512-NEXT:    retq
4908;
4909; X32-SSE41-LABEL: sext_4i1_to_4i64:
4910; X32-SSE41:       # BB#0:
4911; X32-SSE41-NEXT:    pslld $31, %xmm0
4912; X32-SSE41-NEXT:    psrad $31, %xmm0
4913; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
4914; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
4915; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
4916; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
4917; X32-SSE41-NEXT:    retl
4918  %extmask = sext <4 x i1> %mask to <4 x i64>
4919  ret <4 x i64> %extmask
4920}
4921
4922define <4 x i64> @sext_4i8_to_4i64(<4 x i8> %mask) {
4923; SSE2-LABEL: sext_4i8_to_4i64:
4924; SSE2:       # BB#0:
4925; SSE2-NEXT:    pslld $24, %xmm0
4926; SSE2-NEXT:    psrad $24, %xmm0
4927; SSE2-NEXT:    movdqa %xmm0, %xmm2
4928; SSE2-NEXT:    psrad $31, %xmm2
4929; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
4930; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
4931; SSE2-NEXT:    movdqa %xmm1, %xmm2
4932; SSE2-NEXT:    psrad $31, %xmm2
4933; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
4934; SSE2-NEXT:    retq
4935;
4936; SSSE3-LABEL: sext_4i8_to_4i64:
4937; SSSE3:       # BB#0:
4938; SSSE3-NEXT:    pslld $24, %xmm0
4939; SSSE3-NEXT:    psrad $24, %xmm0
4940; SSSE3-NEXT:    movdqa %xmm0, %xmm2
4941; SSSE3-NEXT:    psrad $31, %xmm2
4942; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
4943; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
4944; SSSE3-NEXT:    movdqa %xmm1, %xmm2
4945; SSSE3-NEXT:    psrad $31, %xmm2
4946; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
4947; SSSE3-NEXT:    retq
4948;
4949; SSE41-LABEL: sext_4i8_to_4i64:
4950; SSE41:       # BB#0:
4951; SSE41-NEXT:    pslld $24, %xmm0
4952; SSE41-NEXT:    psrad $24, %xmm0
4953; SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
4954; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
4955; SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
4956; SSE41-NEXT:    movdqa %xmm2, %xmm0
4957; SSE41-NEXT:    retq
4958;
4959; AVX1-LABEL: sext_4i8_to_4i64:
4960; AVX1:       # BB#0:
4961; AVX1-NEXT:    vpslld $24, %xmm0, %xmm0
4962; AVX1-NEXT:    vpsrad $24, %xmm0, %xmm0
4963; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
4964; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
4965; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
4966; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
4967; AVX1-NEXT:    retq
4968;
4969; AVX2-LABEL: sext_4i8_to_4i64:
4970; AVX2:       # BB#0:
4971; AVX2-NEXT:    vpslld $24, %xmm0, %xmm0
4972; AVX2-NEXT:    vpsrad $24, %xmm0, %xmm0
4973; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
4974; AVX2-NEXT:    retq
4975;
4976; AVX512-LABEL: sext_4i8_to_4i64:
4977; AVX512:       # BB#0:
4978; AVX512-NEXT:    vpslld $24, %xmm0, %xmm0
4979; AVX512-NEXT:    vpsrad $24, %xmm0, %xmm0
4980; AVX512-NEXT:    vpmovsxdq %xmm0, %ymm0
4981; AVX512-NEXT:    retq
4982;
4983; X32-SSE41-LABEL: sext_4i8_to_4i64:
4984; X32-SSE41:       # BB#0:
4985; X32-SSE41-NEXT:    pslld $24, %xmm0
4986; X32-SSE41-NEXT:    psrad $24, %xmm0
4987; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm2
4988; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
4989; X32-SSE41-NEXT:    pmovsxdq %xmm0, %xmm1
4990; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
4991; X32-SSE41-NEXT:    retl
4992  %extmask = sext <4 x i8> %mask to <4 x i64>
4993  ret <4 x i64> %extmask
4994}
4995
4996define <32 x i8> @sext_32xi1_to_32xi8(<32 x i16> %c1, <32 x i16> %c2)nounwind {
4997; SSE-LABEL: sext_32xi1_to_32xi8:
4998; SSE:       # BB#0:
4999; SSE-NEXT:    pcmpeqw %xmm5, %xmm1
5000; SSE-NEXT:    pcmpeqw %xmm4, %xmm0
5001; SSE-NEXT:    packsswb %xmm1, %xmm0
5002; SSE-NEXT:    pcmpeqw %xmm7, %xmm3
5003; SSE-NEXT:    pcmpeqw %xmm6, %xmm2
5004; SSE-NEXT:    packsswb %xmm3, %xmm2
5005; SSE-NEXT:    movdqa %xmm2, %xmm1
5006; SSE-NEXT:    retq
5007;
5008; AVX1-LABEL: sext_32xi1_to_32xi8:
5009; AVX1:       # BB#0:
5010; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
5011; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
5012; AVX1-NEXT:    vpcmpeqw %xmm4, %xmm5, %xmm4
5013; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm1, %xmm1
5014; AVX1-NEXT:    vpacksswb %xmm4, %xmm1, %xmm1
5015; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
5016; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
5017; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm4, %xmm3
5018; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm0, %xmm0
5019; AVX1-NEXT:    vpacksswb %xmm3, %xmm0, %xmm0
5020; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
5021; AVX1-NEXT:    retq
5022;
5023; AVX2-LABEL: sext_32xi1_to_32xi8:
5024; AVX2:       # BB#0:
5025; AVX2-NEXT:    vpcmpeqw %ymm3, %ymm1, %ymm1
5026; AVX2-NEXT:    vpcmpeqw %ymm2, %ymm0, %ymm0
5027; AVX2-NEXT:    vpacksswb %ymm1, %ymm0, %ymm0
5028; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
5029; AVX2-NEXT:    retq
5030;
5031; AVX512F-LABEL: sext_32xi1_to_32xi8:
5032; AVX512F:       # BB#0:
5033; AVX512F-NEXT:    vpcmpeqw %ymm2, %ymm0, %ymm0
5034; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm0
5035; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
5036; AVX512F-NEXT:    vpcmpeqw %ymm3, %ymm1, %ymm1
5037; AVX512F-NEXT:    vpmovsxwd %ymm1, %zmm1
5038; AVX512F-NEXT:    vpmovdb %zmm1, %xmm1
5039; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
5040; AVX512F-NEXT:    retq
5041;
5042; AVX512BW-LABEL: sext_32xi1_to_32xi8:
5043; AVX512BW:       # BB#0:
5044; AVX512BW-NEXT:    vpcmpeqw %zmm1, %zmm0, %k0
5045; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
5046; AVX512BW-NEXT:    # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
5047; AVX512BW-NEXT:    retq
5048;
5049; X32-SSE41-LABEL: sext_32xi1_to_32xi8:
5050; X32-SSE41:       # BB#0:
5051; X32-SSE41-NEXT:    pushl %ebp
5052; X32-SSE41-NEXT:    movl %esp, %ebp
5053; X32-SSE41-NEXT:    andl $-16, %esp
5054; X32-SSE41-NEXT:    subl $16, %esp
5055; X32-SSE41-NEXT:    movdqa 8(%ebp), %xmm3
5056; X32-SSE41-NEXT:    pcmpeqw 40(%ebp), %xmm1
5057; X32-SSE41-NEXT:    pcmpeqw 24(%ebp), %xmm0
5058; X32-SSE41-NEXT:    packsswb %xmm1, %xmm0
5059; X32-SSE41-NEXT:    pcmpeqw 72(%ebp), %xmm3
5060; X32-SSE41-NEXT:    pcmpeqw 56(%ebp), %xmm2
5061; X32-SSE41-NEXT:    packsswb %xmm3, %xmm2
5062; X32-SSE41-NEXT:    movdqa %xmm2, %xmm1
5063; X32-SSE41-NEXT:    movl %ebp, %esp
5064; X32-SSE41-NEXT:    popl %ebp
5065; X32-SSE41-NEXT:    retl
5066  %a = icmp eq <32 x i16> %c1, %c2
5067  %b = sext <32 x i1> %a to <32 x i8>
5068  ret <32 x i8> %b
5069}
5070
5071define <2 x i32> @sext_2i8_to_2i32(<2 x i8>* %addr) {
5072; SSE2-LABEL: sext_2i8_to_2i32:
5073; SSE2:       # BB#0:
5074; SSE2-NEXT:    movzwl (%rdi), %eax
5075; SSE2-NEXT:    movd %eax, %xmm0
5076; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
5077; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
5078; SSE2-NEXT:    psrad $24, %xmm0
5079; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
5080; SSE2-NEXT:    paddq %xmm0, %xmm0
5081; SSE2-NEXT:    retq
5082;
5083; SSSE3-LABEL: sext_2i8_to_2i32:
5084; SSSE3:       # BB#0:
5085; SSSE3-NEXT:    movzwl (%rdi), %eax
5086; SSSE3-NEXT:    movd %eax, %xmm0
5087; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
5088; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
5089; SSSE3-NEXT:    psrad $24, %xmm0
5090; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
5091; SSSE3-NEXT:    paddq %xmm0, %xmm0
5092; SSSE3-NEXT:    retq
5093;
5094; SSE41-LABEL: sext_2i8_to_2i32:
5095; SSE41:       # BB#0:
5096; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
5097; SSE41-NEXT:    paddq %xmm0, %xmm0
5098; SSE41-NEXT:    retq
5099;
5100; AVX-LABEL: sext_2i8_to_2i32:
5101; AVX:       # BB#0:
5102; AVX-NEXT:    vpmovsxbq (%rdi), %xmm0
5103; AVX-NEXT:    vpaddq %xmm0, %xmm0, %xmm0
5104; AVX-NEXT:    retq
5105;
5106; X32-SSE41-LABEL: sext_2i8_to_2i32:
5107; X32-SSE41:       # BB#0:
5108; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
5109; X32-SSE41-NEXT:    pmovsxbq (%eax), %xmm0
5110; X32-SSE41-NEXT:    paddq %xmm0, %xmm0
5111; X32-SSE41-NEXT:    retl
5112  %x = load <2 x i8>, <2 x i8>* %addr, align 1
5113  %y = sext <2 x i8> %x to <2 x i32>
5114  %z = add <2 x i32>%y, %y
5115  ret <2 x i32>%z
5116}
5117
5118