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