1; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=x86-64 -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
2; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=x86-64 -mattr=+ssse3 | FileCheck %s --check-prefix=SSE --check-prefix=SSSE3
3; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=x86-64 -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
4; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=x86-64 -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
5; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=x86-64 -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
6;
7; Just one 32-bit run to make sure we do reasonable things there.
8; RUN: llc < %s -mtriple=i686-apple-darwin -mcpu=i686 -mattr=+sse4.1 | FileCheck %s --check-prefix=X32-SSE41
9
10define <8 x i32> @sext_8i16_to_8i32(<8 x i16> %A) nounwind uwtable readnone ssp {
11; SSE2-LABEL: sext_8i16_to_8i32:
12; SSE2:       ## BB#0:
13; SSE2-NEXT:    movdqa %xmm0, %xmm1
14; SSE2-NEXT:      ## kill: XMM0<def> XMM1<kill>
15; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
16; SSE2-NEXT:    pslld $16, %xmm0
17; SSE2-NEXT:    psrad $16, %xmm0
18; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
19; SSE2-NEXT:    pslld $16, %xmm1
20; SSE2-NEXT:    psrad $16, %xmm1
21; SSE2-NEXT:    retq
22;
23; SSSE3-LABEL: sext_8i16_to_8i32:
24; SSSE3:       ## BB#0:
25; SSSE3-NEXT:    movdqa %xmm0, %xmm1
26; SSSE3-NEXT:      ## kill: XMM0<def> XMM1<kill>
27; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
28; SSSE3-NEXT:    pslld $16, %xmm0
29; SSSE3-NEXT:    psrad $16, %xmm0
30; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
31; SSSE3-NEXT:    pslld $16, %xmm1
32; SSSE3-NEXT:    psrad $16, %xmm1
33; SSSE3-NEXT:    retq
34;
35; SSE41-LABEL: sext_8i16_to_8i32:
36; SSE41:       ## BB#0:
37; SSE41-NEXT:    movdqa %xmm0, %xmm1
38; SSE41-NEXT:    pmovzxwd %xmm1, %xmm0
39; SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
40; SSE41-NEXT:    pslld $16, %xmm1
41; SSE41-NEXT:    psrad $16, %xmm1
42; SSE41-NEXT:    pslld $16, %xmm0
43; SSE41-NEXT:    psrad $16, %xmm0
44; SSE41-NEXT:    retq
45;
46; AVX1-LABEL: sext_8i16_to_8i32:
47; AVX1:       ## BB#0:
48; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
49; AVX1-NEXT:    vmovhlps {{.*#+}} xmm0 = xmm0[1,1]
50; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
51; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
52; AVX1-NEXT:    retq
53;
54; AVX2-LABEL: sext_8i16_to_8i32:
55; AVX2:       ## BB#0:
56; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
57; AVX2-NEXT:    retq
58;
59; X32-SSE41-LABEL: sext_8i16_to_8i32:
60; X32-SSE41:       ## BB#0:
61; X32-SSE41-NEXT:    movdqa %xmm0, %xmm1
62; X32-SSE41-NEXT:    pmovzxwd %xmm1, %xmm0
63; X32-SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
64; X32-SSE41-NEXT:    pslld $16, %xmm1
65; X32-SSE41-NEXT:    psrad $16, %xmm1
66; X32-SSE41-NEXT:    pslld $16, %xmm0
67; X32-SSE41-NEXT:    psrad $16, %xmm0
68; X32-SSE41-NEXT:    retl
69
70  %B = sext <8 x i16> %A to <8 x i32>
71  ret <8 x i32>%B
72}
73
74define <4 x i64> @sext_4i32_to_4i64(<4 x i32> %A) nounwind uwtable readnone ssp {
75; SSE2-LABEL: sext_4i32_to_4i64:
76; SSE2:       ## BB#0:
77; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0]
78; SSE2-NEXT:    movd %xmm1, %rax
79; SSE2-NEXT:    cltq
80; SSE2-NEXT:    movd %rax, %xmm2
81; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
82; SSE2-NEXT:    movd %xmm1, %rax
83; SSE2-NEXT:    cltq
84; SSE2-NEXT:    movd %rax, %xmm1
85; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
86; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
87; SSE2-NEXT:    movd %xmm0, %rax
88; SSE2-NEXT:    cltq
89; SSE2-NEXT:    movd %rax, %xmm1
90; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
91; SSE2-NEXT:    movd %xmm0, %rax
92; SSE2-NEXT:    cltq
93; SSE2-NEXT:    movd %rax, %xmm0
94; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
95; SSE2-NEXT:    movdqa %xmm2, %xmm0
96; SSE2-NEXT:    retq
97;
98; SSSE3-LABEL: sext_4i32_to_4i64:
99; SSSE3:       ## BB#0:
100; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0]
101; SSSE3-NEXT:    movd %xmm1, %rax
102; SSSE3-NEXT:    cltq
103; SSSE3-NEXT:    movd %rax, %xmm2
104; SSSE3-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
105; SSSE3-NEXT:    movd %xmm1, %rax
106; SSSE3-NEXT:    cltq
107; SSSE3-NEXT:    movd %rax, %xmm1
108; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
109; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
110; SSSE3-NEXT:    movd %xmm0, %rax
111; SSSE3-NEXT:    cltq
112; SSSE3-NEXT:    movd %rax, %xmm1
113; SSSE3-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
114; SSSE3-NEXT:    movd %xmm0, %rax
115; SSSE3-NEXT:    cltq
116; SSSE3-NEXT:    movd %rax, %xmm0
117; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
118; SSSE3-NEXT:    movdqa %xmm2, %xmm0
119; SSSE3-NEXT:    retq
120;
121; SSE41-LABEL: sext_4i32_to_4i64:
122; SSE41:       ## BB#0:
123; SSE41-NEXT:    pmovzxdq %xmm0, %xmm1
124; SSE41-NEXT:    pextrq $1, %xmm1, %rax
125; SSE41-NEXT:    cltq
126; SSE41-NEXT:    movd %rax, %xmm3
127; SSE41-NEXT:    movd %xmm1, %rax
128; SSE41-NEXT:    cltq
129; SSE41-NEXT:    movd %rax, %xmm2
130; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
131; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
132; SSE41-NEXT:    pextrq $1, %xmm0, %rax
133; SSE41-NEXT:    cltq
134; SSE41-NEXT:    movd %rax, %xmm3
135; SSE41-NEXT:    movd %xmm0, %rax
136; SSE41-NEXT:    cltq
137; SSE41-NEXT:    movd %rax, %xmm1
138; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
139; SSE41-NEXT:    movdqa %xmm2, %xmm0
140; SSE41-NEXT:    retq
141;
142; AVX1-LABEL: sext_4i32_to_4i64:
143; AVX1:       ## BB#0:
144; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
145; AVX1-NEXT:    vmovhlps {{.*#+}} xmm0 = xmm0[1,1]
146; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
147; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
148; AVX1-NEXT:    retq
149;
150; AVX2-LABEL: sext_4i32_to_4i64:
151; AVX2:       ## BB#0:
152; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
153; AVX2-NEXT:    retq
154;
155; X32-SSE41-LABEL: sext_4i32_to_4i64:
156; X32-SSE41:       ## BB#0:
157; X32-SSE41-NEXT:    pmovzxdq %xmm0, %xmm2
158; X32-SSE41-NEXT:    movd %xmm2, %eax
159; X32-SSE41-NEXT:    sarl $31, %eax
160; X32-SSE41-NEXT:    pextrd $2, %xmm2, %ecx
161; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm2
162; X32-SSE41-NEXT:    sarl $31, %ecx
163; X32-SSE41-NEXT:    pinsrd $3, %ecx, %xmm2
164; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,0,3,0]
165; X32-SSE41-NEXT:    movd %xmm1, %eax
166; X32-SSE41-NEXT:    sarl $31, %eax
167; X32-SSE41-NEXT:    pextrd $2, %xmm1, %ecx
168; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm1
169; X32-SSE41-NEXT:    sarl $31, %ecx
170; X32-SSE41-NEXT:    pinsrd $3, %ecx, %xmm1
171; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
172; X32-SSE41-NEXT:    retl
173
174  %B = sext <4 x i32> %A to <4 x i64>
175  ret <4 x i64>%B
176}
177
178define <4 x i32> @load_sext_test1(<4 x i16> *%ptr) {
179; SSE2-LABEL: load_sext_test1:
180; SSE2:       ## BB#0:
181; SSE2-NEXT:    movq (%rdi), %xmm0
182; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
183; SSE2-NEXT:    psrad $16, %xmm0
184; SSE2-NEXT:    retq
185;
186; SSSE3-LABEL: load_sext_test1:
187; SSSE3:       ## BB#0:
188; SSSE3-NEXT:    movq (%rdi), %xmm0
189; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
190; SSSE3-NEXT:    psrad $16, %xmm0
191; SSSE3-NEXT:    retq
192;
193; SSE41-LABEL: load_sext_test1:
194; SSE41:       ## BB#0:
195; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
196; SSE41-NEXT:    retq
197;
198; AVX-LABEL: load_sext_test1:
199; AVX:       ## BB#0:
200; AVX-NEXT:    vpmovsxwd (%rdi), %xmm0
201; AVX-NEXT:    retq
202;
203; X32-SSE41-LABEL: load_sext_test1:
204; X32-SSE41:       ## BB#0:
205; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
206; X32-SSE41-NEXT:    pmovsxwd (%eax), %xmm0
207; X32-SSE41-NEXT:    retl
208
209 %X = load <4 x i16>* %ptr
210 %Y = sext <4 x i16> %X to <4 x i32>
211 ret <4 x i32>%Y
212}
213
214define <4 x i32> @load_sext_test2(<4 x i8> *%ptr) {
215; SSE2-LABEL: load_sext_test2:
216; SSE2:       ## BB#0:
217; SSE2-NEXT:    movl (%rdi), %eax
218; SSE2-NEXT:    movl %eax, %ecx
219; SSE2-NEXT:    shll $8, %ecx
220; SSE2-NEXT:    movd %eax, %xmm0
221; SSE2-NEXT:    pextrw $1, %xmm0, %edx
222; SSE2-NEXT:    pinsrw $1, %ecx, %xmm0
223; SSE2-NEXT:    pinsrw $3, %eax, %xmm0
224; SSE2-NEXT:    movl %edx, %eax
225; SSE2-NEXT:    shll $8, %eax
226; SSE2-NEXT:    pinsrw $5, %eax, %xmm0
227; SSE2-NEXT:    pinsrw $7, %edx, %xmm0
228; SSE2-NEXT:    psrad $24, %xmm0
229; SSE2-NEXT:    retq
230;
231; SSSE3-LABEL: load_sext_test2:
232; SSSE3:       ## BB#0:
233; SSSE3-NEXT:    movd (%rdi), %xmm0
234; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = zero,zero,zero,xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3]
235; SSSE3-NEXT:    psrad $24, %xmm0
236; SSSE3-NEXT:    retq
237;
238; SSE41-LABEL: load_sext_test2:
239; SSE41:       ## BB#0:
240; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
241; SSE41-NEXT:    retq
242;
243; AVX-LABEL: load_sext_test2:
244; AVX:       ## BB#0:
245; AVX-NEXT:    vpmovsxbd (%rdi), %xmm0
246; AVX-NEXT:    retq
247;
248; X32-SSE41-LABEL: load_sext_test2:
249; X32-SSE41:       ## BB#0:
250; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
251; X32-SSE41-NEXT:    pmovsxbd (%eax), %xmm0
252; X32-SSE41-NEXT:    retl
253 %X = load <4 x i8>* %ptr
254 %Y = sext <4 x i8> %X to <4 x i32>
255 ret <4 x i32>%Y
256}
257
258define <2 x i64> @load_sext_test3(<2 x i8> *%ptr) {
259; SSE2-LABEL: load_sext_test3:
260; SSE2:       ## BB#0:
261; SSE2-NEXT:    movsbq 1(%rdi), %rax
262; SSE2-NEXT:    movd %rax, %xmm1
263; SSE2-NEXT:    movsbq (%rdi), %rax
264; SSE2-NEXT:    movd %rax, %xmm0
265; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
266; SSE2-NEXT:    retq
267;
268; SSSE3-LABEL: load_sext_test3:
269; SSSE3:       ## BB#0:
270; SSSE3-NEXT:    movsbq 1(%rdi), %rax
271; SSSE3-NEXT:    movd %rax, %xmm1
272; SSSE3-NEXT:    movsbq (%rdi), %rax
273; SSSE3-NEXT:    movd %rax, %xmm0
274; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
275; SSSE3-NEXT:    retq
276;
277; SSE41-LABEL: load_sext_test3:
278; SSE41:       ## BB#0:
279; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
280; SSE41-NEXT:    retq
281;
282; AVX-LABEL: load_sext_test3:
283; AVX:       ## BB#0:
284; AVX-NEXT:    vpmovsxbq (%rdi), %xmm0
285; AVX-NEXT:    retq
286;
287; X32-SSE41-LABEL: load_sext_test3:
288; X32-SSE41:       ## BB#0:
289; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
290; X32-SSE41-NEXT:    pmovsxbq (%eax), %xmm0
291; X32-SSE41-NEXT:    retl
292 %X = load <2 x i8>* %ptr
293 %Y = sext <2 x i8> %X to <2 x i64>
294 ret <2 x i64>%Y
295}
296
297define <2 x i64> @load_sext_test4(<2 x i16> *%ptr) {
298; SSE2-LABEL: load_sext_test4:
299; SSE2:       ## BB#0:
300; SSE2-NEXT:    movswq 2(%rdi), %rax
301; SSE2-NEXT:    movd %rax, %xmm1
302; SSE2-NEXT:    movswq (%rdi), %rax
303; SSE2-NEXT:    movd %rax, %xmm0
304; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
305; SSE2-NEXT:    retq
306;
307; SSSE3-LABEL: load_sext_test4:
308; SSSE3:       ## BB#0:
309; SSSE3-NEXT:    movswq 2(%rdi), %rax
310; SSSE3-NEXT:    movd %rax, %xmm1
311; SSSE3-NEXT:    movswq (%rdi), %rax
312; SSSE3-NEXT:    movd %rax, %xmm0
313; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
314; SSSE3-NEXT:    retq
315;
316; SSE41-LABEL: load_sext_test4:
317; SSE41:       ## BB#0:
318; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
319; SSE41-NEXT:    retq
320;
321; AVX-LABEL: load_sext_test4:
322; AVX:       ## BB#0:
323; AVX-NEXT:    vpmovsxwq (%rdi), %xmm0
324; AVX-NEXT:    retq
325;
326; X32-SSE41-LABEL: load_sext_test4:
327; X32-SSE41:       ## BB#0:
328; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
329; X32-SSE41-NEXT:    pmovsxwq (%eax), %xmm0
330; X32-SSE41-NEXT:    retl
331 %X = load <2 x i16>* %ptr
332 %Y = sext <2 x i16> %X to <2 x i64>
333 ret <2 x i64>%Y
334}
335
336define <2 x i64> @load_sext_test5(<2 x i32> *%ptr) {
337; SSE2-LABEL: load_sext_test5:
338; SSE2:       ## BB#0:
339; SSE2-NEXT:    movslq 4(%rdi), %rax
340; SSE2-NEXT:    movd %rax, %xmm1
341; SSE2-NEXT:    movslq (%rdi), %rax
342; SSE2-NEXT:    movd %rax, %xmm0
343; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
344; SSE2-NEXT:    retq
345;
346; SSSE3-LABEL: load_sext_test5:
347; SSSE3:       ## BB#0:
348; SSSE3-NEXT:    movslq 4(%rdi), %rax
349; SSSE3-NEXT:    movd %rax, %xmm1
350; SSSE3-NEXT:    movslq (%rdi), %rax
351; SSSE3-NEXT:    movd %rax, %xmm0
352; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
353; SSSE3-NEXT:    retq
354;
355; SSE41-LABEL: load_sext_test5:
356; SSE41:       ## BB#0:
357; SSE41-NEXT:    pmovsxdq (%rdi), %xmm0
358; SSE41-NEXT:    retq
359;
360; AVX-LABEL: load_sext_test5:
361; AVX:       ## BB#0:
362; AVX-NEXT:    vpmovsxdq (%rdi), %xmm0
363; AVX-NEXT:    retq
364;
365; X32-SSE41-LABEL: load_sext_test5:
366; X32-SSE41:       ## BB#0:
367; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
368; X32-SSE41-NEXT:    pmovsxdq (%eax), %xmm0
369; X32-SSE41-NEXT:    retl
370 %X = load <2 x i32>* %ptr
371 %Y = sext <2 x i32> %X to <2 x i64>
372 ret <2 x i64>%Y
373}
374
375define <8 x i16> @load_sext_test6(<8 x i8> *%ptr) {
376; SSE2-LABEL: load_sext_test6:
377; SSE2:       ## BB#0:
378; SSE2-NEXT:    movq (%rdi), %xmm0
379; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
380; SSE2-NEXT:    psraw $8, %xmm0
381; SSE2-NEXT:    retq
382;
383; SSSE3-LABEL: load_sext_test6:
384; SSSE3:       ## BB#0:
385; SSSE3-NEXT:    movq (%rdi), %xmm0
386; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
387; SSSE3-NEXT:    psraw $8, %xmm0
388; SSSE3-NEXT:    retq
389;
390; SSE41-LABEL: load_sext_test6:
391; SSE41:       ## BB#0:
392; SSE41-NEXT:    pmovsxbw (%rdi), %xmm0
393; SSE41-NEXT:    retq
394;
395; AVX-LABEL: load_sext_test6:
396; AVX:       ## BB#0:
397; AVX-NEXT:    vpmovsxbw (%rdi), %xmm0
398; AVX-NEXT:    retq
399;
400; X32-SSE41-LABEL: load_sext_test6:
401; X32-SSE41:       ## BB#0:
402; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
403; X32-SSE41-NEXT:    pmovsxbw (%eax), %xmm0
404; X32-SSE41-NEXT:    retl
405 %X = load <8 x i8>* %ptr
406 %Y = sext <8 x i8> %X to <8 x i16>
407 ret <8 x i16>%Y
408}
409
410define <4 x i64> @sext_4i1_to_4i64(<4 x i1> %mask) {
411; SSE2-LABEL: sext_4i1_to_4i64:
412; SSE2:       ## BB#0:
413; SSE2-NEXT:    pslld $31, %xmm0
414; SSE2-NEXT:    psrad $31, %xmm0
415; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0]
416; SSE2-NEXT:    movd %xmm1, %rax
417; SSE2-NEXT:    cltq
418; SSE2-NEXT:    movd %rax, %xmm2
419; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
420; SSE2-NEXT:    movd %xmm1, %rax
421; SSE2-NEXT:    cltq
422; SSE2-NEXT:    movd %rax, %xmm1
423; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
424; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
425; SSE2-NEXT:    movd %xmm0, %rax
426; SSE2-NEXT:    cltq
427; SSE2-NEXT:    movd %rax, %xmm1
428; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
429; SSE2-NEXT:    movd %xmm0, %rax
430; SSE2-NEXT:    cltq
431; SSE2-NEXT:    movd %rax, %xmm0
432; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
433; SSE2-NEXT:    movdqa %xmm2, %xmm0
434; SSE2-NEXT:    retq
435;
436; SSSE3-LABEL: sext_4i1_to_4i64:
437; SSSE3:       ## BB#0:
438; SSSE3-NEXT:    pslld $31, %xmm0
439; SSSE3-NEXT:    psrad $31, %xmm0
440; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0]
441; SSSE3-NEXT:    movd %xmm1, %rax
442; SSSE3-NEXT:    cltq
443; SSSE3-NEXT:    movd %rax, %xmm2
444; SSSE3-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
445; SSSE3-NEXT:    movd %xmm1, %rax
446; SSSE3-NEXT:    cltq
447; SSSE3-NEXT:    movd %rax, %xmm1
448; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
449; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
450; SSSE3-NEXT:    movd %xmm0, %rax
451; SSSE3-NEXT:    cltq
452; SSSE3-NEXT:    movd %rax, %xmm1
453; SSSE3-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
454; SSSE3-NEXT:    movd %xmm0, %rax
455; SSSE3-NEXT:    cltq
456; SSSE3-NEXT:    movd %rax, %xmm0
457; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
458; SSSE3-NEXT:    movdqa %xmm2, %xmm0
459; SSSE3-NEXT:    retq
460;
461; SSE41-LABEL: sext_4i1_to_4i64:
462; SSE41:       ## BB#0:
463; SSE41-NEXT:    pslld $31, %xmm0
464; SSE41-NEXT:    psrad $31, %xmm0
465; SSE41-NEXT:    pmovzxdq %xmm0, %xmm1
466; SSE41-NEXT:    pextrq $1, %xmm1, %rax
467; SSE41-NEXT:    cltq
468; SSE41-NEXT:    movd %rax, %xmm3
469; SSE41-NEXT:    movd %xmm1, %rax
470; SSE41-NEXT:    cltq
471; SSE41-NEXT:    movd %rax, %xmm2
472; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
473; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
474; SSE41-NEXT:    pextrq $1, %xmm0, %rax
475; SSE41-NEXT:    cltq
476; SSE41-NEXT:    movd %rax, %xmm3
477; SSE41-NEXT:    movd %xmm0, %rax
478; SSE41-NEXT:    cltq
479; SSE41-NEXT:    movd %rax, %xmm1
480; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
481; SSE41-NEXT:    movdqa %xmm2, %xmm0
482; SSE41-NEXT:    retq
483;
484; AVX1-LABEL: sext_4i1_to_4i64:
485; AVX1:       ## BB#0:
486; AVX1-NEXT:    vpslld $31, %xmm0, %xmm0
487; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm0
488; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
489; AVX1-NEXT:    vmovhlps {{.*#+}} xmm0 = xmm0[1,1]
490; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
491; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
492; AVX1-NEXT:    retq
493;
494; AVX2-LABEL: sext_4i1_to_4i64:
495; AVX2:       ## BB#0:
496; AVX2-NEXT:    vpslld $31, %xmm0, %xmm0
497; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm0
498; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
499; AVX2-NEXT:    retq
500;
501; X32-SSE41-LABEL: sext_4i1_to_4i64:
502; X32-SSE41:       ## BB#0:
503; X32-SSE41-NEXT:    pslld $31, %xmm0
504; X32-SSE41-NEXT:    psrad $31, %xmm0
505; X32-SSE41-NEXT:    pmovzxdq %xmm0, %xmm2
506; X32-SSE41-NEXT:    movd %xmm2, %eax
507; X32-SSE41-NEXT:    sarl $31, %eax
508; X32-SSE41-NEXT:    pextrd $2, %xmm2, %ecx
509; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm2
510; X32-SSE41-NEXT:    sarl $31, %ecx
511; X32-SSE41-NEXT:    pinsrd $3, %ecx, %xmm2
512; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,0,3,0]
513; X32-SSE41-NEXT:    movd %xmm1, %eax
514; X32-SSE41-NEXT:    sarl $31, %eax
515; X32-SSE41-NEXT:    pextrd $2, %xmm1, %ecx
516; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm1
517; X32-SSE41-NEXT:    sarl $31, %ecx
518; X32-SSE41-NEXT:    pinsrd $3, %ecx, %xmm1
519; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
520; X32-SSE41-NEXT:    retl
521  %extmask = sext <4 x i1> %mask to <4 x i64>
522  ret <4 x i64> %extmask
523}
524
525define <16 x i16> @sext_16i8_to_16i16(<16 x i8> *%ptr) {
526; SSE2-LABEL: sext_16i8_to_16i16:
527; SSE2:       ## BB#0:
528; SSE2-NEXT:    movdqa (%rdi), %xmm1
529; SSE2-NEXT:    movdqa %xmm1, %xmm0
530; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
531; SSE2-NEXT:    psllw $8, %xmm0
532; SSE2-NEXT:    psraw $8, %xmm0
533; 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]
534; SSE2-NEXT:    psllw $8, %xmm1
535; SSE2-NEXT:    psraw $8, %xmm1
536; SSE2-NEXT:    retq
537;
538; SSSE3-LABEL: sext_16i8_to_16i16:
539; SSSE3:       ## BB#0:
540; SSSE3-NEXT:    movdqa (%rdi), %xmm1
541; SSSE3-NEXT:    movdqa %xmm1, %xmm0
542; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
543; SSSE3-NEXT:    psllw $8, %xmm0
544; SSSE3-NEXT:    psraw $8, %xmm0
545; 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]
546; SSSE3-NEXT:    psllw $8, %xmm1
547; SSSE3-NEXT:    psraw $8, %xmm1
548; SSSE3-NEXT:    retq
549;
550; SSE41-LABEL: sext_16i8_to_16i16:
551; SSE41:       ## BB#0:
552; SSE41-NEXT:    movdqa (%rdi), %xmm1
553; SSE41-NEXT:    pmovzxbw %xmm1, %xmm0
554; SSE41-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]
555; SSE41-NEXT:    psllw $8, %xmm1
556; SSE41-NEXT:    psraw $8, %xmm1
557; SSE41-NEXT:    psllw $8, %xmm0
558; SSE41-NEXT:    psraw $8, %xmm0
559; SSE41-NEXT:    retq
560;
561; AVX1-LABEL: sext_16i8_to_16i16:
562; AVX1:       ## BB#0:
563; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
564; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm1
565; AVX1-NEXT:    vmovhlps {{.*#+}} xmm0 = xmm0[1,1]
566; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm0
567; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
568; AVX1-NEXT:    retq
569;
570; AVX2-LABEL: sext_16i8_to_16i16:
571; AVX2:       ## BB#0:
572; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
573; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm0
574; AVX2-NEXT:    retq
575;
576; X32-SSE41-LABEL: sext_16i8_to_16i16:
577; X32-SSE41:       ## BB#0:
578; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
579; X32-SSE41-NEXT:    movdqa (%eax), %xmm1
580; X32-SSE41-NEXT:    pmovzxbw %xmm1, %xmm0
581; X32-SSE41-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]
582; X32-SSE41-NEXT:    psllw $8, %xmm1
583; X32-SSE41-NEXT:    psraw $8, %xmm1
584; X32-SSE41-NEXT:    psllw $8, %xmm0
585; X32-SSE41-NEXT:    psraw $8, %xmm0
586; X32-SSE41-NEXT:    retl
587 %X = load <16 x i8>* %ptr
588 %Y = sext <16 x i8> %X to <16 x i16>
589 ret <16 x i16> %Y
590}
591
592define <4 x i64> @sext_4i8_to_4i64(<4 x i8> %mask) {
593; SSE2-LABEL: sext_4i8_to_4i64:
594; SSE2:       ## BB#0:
595; SSE2-NEXT:    pslld $24, %xmm0
596; SSE2-NEXT:    psrad $24, %xmm0
597; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0]
598; SSE2-NEXT:    movd %xmm1, %rax
599; SSE2-NEXT:    cltq
600; SSE2-NEXT:    movd %rax, %xmm2
601; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
602; SSE2-NEXT:    movd %xmm1, %rax
603; SSE2-NEXT:    cltq
604; SSE2-NEXT:    movd %rax, %xmm1
605; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
606; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
607; SSE2-NEXT:    movd %xmm0, %rax
608; SSE2-NEXT:    cltq
609; SSE2-NEXT:    movd %rax, %xmm1
610; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
611; SSE2-NEXT:    movd %xmm0, %rax
612; SSE2-NEXT:    cltq
613; SSE2-NEXT:    movd %rax, %xmm0
614; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
615; SSE2-NEXT:    movdqa %xmm2, %xmm0
616; SSE2-NEXT:    retq
617;
618; SSSE3-LABEL: sext_4i8_to_4i64:
619; SSSE3:       ## BB#0:
620; SSSE3-NEXT:    pslld $24, %xmm0
621; SSSE3-NEXT:    psrad $24, %xmm0
622; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0]
623; SSSE3-NEXT:    movd %xmm1, %rax
624; SSSE3-NEXT:    cltq
625; SSSE3-NEXT:    movd %rax, %xmm2
626; SSSE3-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]
627; SSSE3-NEXT:    movd %xmm1, %rax
628; SSSE3-NEXT:    cltq
629; SSSE3-NEXT:    movd %rax, %xmm1
630; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
631; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
632; SSSE3-NEXT:    movd %xmm0, %rax
633; SSSE3-NEXT:    cltq
634; SSSE3-NEXT:    movd %rax, %xmm1
635; SSSE3-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
636; SSSE3-NEXT:    movd %xmm0, %rax
637; SSSE3-NEXT:    cltq
638; SSSE3-NEXT:    movd %rax, %xmm0
639; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
640; SSSE3-NEXT:    movdqa %xmm2, %xmm0
641; SSSE3-NEXT:    retq
642;
643; SSE41-LABEL: sext_4i8_to_4i64:
644; SSE41:       ## BB#0:
645; SSE41-NEXT:    pslld $24, %xmm0
646; SSE41-NEXT:    psrad $24, %xmm0
647; SSE41-NEXT:    pmovzxdq %xmm0, %xmm1
648; SSE41-NEXT:    pextrq $1, %xmm1, %rax
649; SSE41-NEXT:    cltq
650; SSE41-NEXT:    movd %rax, %xmm3
651; SSE41-NEXT:    movd %xmm1, %rax
652; SSE41-NEXT:    cltq
653; SSE41-NEXT:    movd %rax, %xmm2
654; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
655; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0]
656; SSE41-NEXT:    pextrq $1, %xmm0, %rax
657; SSE41-NEXT:    cltq
658; SSE41-NEXT:    movd %rax, %xmm3
659; SSE41-NEXT:    movd %xmm0, %rax
660; SSE41-NEXT:    cltq
661; SSE41-NEXT:    movd %rax, %xmm1
662; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
663; SSE41-NEXT:    movdqa %xmm2, %xmm0
664; SSE41-NEXT:    retq
665;
666; AVX1-LABEL: sext_4i8_to_4i64:
667; AVX1:       ## BB#0:
668; AVX1-NEXT:    vpslld $24, %xmm0, %xmm0
669; AVX1-NEXT:    vpsrad $24, %xmm0, %xmm0
670; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
671; AVX1-NEXT:    vmovhlps {{.*#+}} xmm0 = xmm0[1,1]
672; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
673; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
674; AVX1-NEXT:    retq
675;
676; AVX2-LABEL: sext_4i8_to_4i64:
677; AVX2:       ## BB#0:
678; AVX2-NEXT:    vpslld $24, %xmm0, %xmm0
679; AVX2-NEXT:    vpsrad $24, %xmm0, %xmm0
680; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
681; AVX2-NEXT:    retq
682;
683; X32-SSE41-LABEL: sext_4i8_to_4i64:
684; X32-SSE41:       ## BB#0:
685; X32-SSE41-NEXT:    pslld $24, %xmm0
686; X32-SSE41-NEXT:    psrad $24, %xmm0
687; X32-SSE41-NEXT:    pmovzxdq %xmm0, %xmm2
688; X32-SSE41-NEXT:    movd %xmm2, %eax
689; X32-SSE41-NEXT:    sarl $31, %eax
690; X32-SSE41-NEXT:    pextrd $2, %xmm2, %ecx
691; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm2
692; X32-SSE41-NEXT:    sarl $31, %ecx
693; X32-SSE41-NEXT:    pinsrd $3, %ecx, %xmm2
694; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,0,3,0]
695; X32-SSE41-NEXT:    movd %xmm1, %eax
696; X32-SSE41-NEXT:    sarl $31, %eax
697; X32-SSE41-NEXT:    pextrd $2, %xmm1, %ecx
698; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm1
699; X32-SSE41-NEXT:    sarl $31, %ecx
700; X32-SSE41-NEXT:    pinsrd $3, %ecx, %xmm1
701; X32-SSE41-NEXT:    movdqa %xmm2, %xmm0
702; X32-SSE41-NEXT:    retl
703  %extmask = sext <4 x i8> %mask to <4 x i64>
704  ret <4 x i64> %extmask
705}
706
707define <4 x i64> @load_sext_4i8_to_4i64(<4 x i8> *%ptr) {
708; SSE2-LABEL: load_sext_4i8_to_4i64:
709; SSE2:       ## BB#0:
710; SSE2-NEXT:    movl (%rdi), %eax
711; SSE2-NEXT:    movd %eax, %xmm1
712; SSE2-NEXT:    pextrw $1, %xmm1, %ecx
713; SSE2-NEXT:    pinsrw $0, %eax, %xmm1
714; SSE2-NEXT:    movzbl %ah, %eax
715; SSE2-NEXT:    pinsrw $2, %eax, %xmm1
716; SSE2-NEXT:    pinsrw $4, %ecx, %xmm1
717; SSE2-NEXT:    shrl $8, %ecx
718; SSE2-NEXT:    pinsrw $6, %ecx, %xmm1
719; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,1,0]
720; SSE2-NEXT:    movd %xmm2, %rax
721; SSE2-NEXT:    movsbq %al, %rax
722; SSE2-NEXT:    movd %rax, %xmm0
723; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
724; SSE2-NEXT:    movd %xmm2, %rax
725; SSE2-NEXT:    movsbq %al, %rax
726; SSE2-NEXT:    movd %rax, %xmm2
727; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
728; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0]
729; SSE2-NEXT:    movd %xmm2, %rax
730; SSE2-NEXT:    movsbq %al, %rax
731; SSE2-NEXT:    movd %rax, %xmm1
732; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
733; SSE2-NEXT:    movd %xmm2, %rax
734; SSE2-NEXT:    movsbq %al, %rax
735; SSE2-NEXT:    movd %rax, %xmm2
736; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
737; SSE2-NEXT:    retq
738;
739; SSSE3-LABEL: load_sext_4i8_to_4i64:
740; SSSE3:       ## BB#0:
741; SSSE3-NEXT:    movd (%rdi), %xmm1
742; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
743; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,1,0]
744; SSSE3-NEXT:    movd %xmm2, %rax
745; SSSE3-NEXT:    movsbq %al, %rax
746; SSSE3-NEXT:    movd %rax, %xmm0
747; SSSE3-NEXT:    punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
748; SSSE3-NEXT:    movd %xmm2, %rax
749; SSSE3-NEXT:    movsbq %al, %rax
750; SSSE3-NEXT:    movd %rax, %xmm2
751; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
752; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0]
753; SSSE3-NEXT:    movd %xmm2, %rax
754; SSSE3-NEXT:    movsbq %al, %rax
755; SSSE3-NEXT:    movd %rax, %xmm1
756; SSSE3-NEXT:    punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
757; SSSE3-NEXT:    movd %xmm2, %rax
758; SSSE3-NEXT:    movsbq %al, %rax
759; SSSE3-NEXT:    movd %rax, %xmm2
760; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
761; SSSE3-NEXT:    retq
762;
763; SSE41-LABEL: load_sext_4i8_to_4i64:
764; SSE41:       ## BB#0:
765; SSE41-NEXT:    movd (%rdi), %xmm0
766; SSE41-NEXT:    pmovzxbd %xmm0, %xmm1
767; SSE41-NEXT:    pmovzxbq %xmm0, %xmm0
768; SSE41-NEXT:    pextrq $1, %xmm0, %rax
769; SSE41-NEXT:    movsbq %al, %rax
770; SSE41-NEXT:    movd %rax, %xmm2
771; SSE41-NEXT:    movd %xmm0, %rax
772; SSE41-NEXT:    movsbq %al, %rax
773; SSE41-NEXT:    movd %rax, %xmm0
774; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
775; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,0,3,0]
776; SSE41-NEXT:    pextrq $1, %xmm1, %rax
777; SSE41-NEXT:    movsbq %al, %rax
778; SSE41-NEXT:    movd %rax, %xmm2
779; SSE41-NEXT:    movd %xmm1, %rax
780; SSE41-NEXT:    movsbq %al, %rax
781; SSE41-NEXT:    movd %rax, %xmm1
782; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
783; SSE41-NEXT:    retq
784;
785; AVX1-LABEL: load_sext_4i8_to_4i64:
786; AVX1:       ## BB#0:
787; AVX1-NEXT:    vpmovsxbd (%rdi), %xmm0
788; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
789; AVX1-NEXT:    vmovhlps {{.*#+}} xmm0 = xmm0[1,1]
790; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
791; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
792; AVX1-NEXT:    retq
793;
794; AVX2-LABEL: load_sext_4i8_to_4i64:
795; AVX2:       ## BB#0:
796; AVX2-NEXT:    vpmovsxbq (%rdi), %ymm0
797; AVX2-NEXT:    retq
798;
799; X32-SSE41-LABEL: load_sext_4i8_to_4i64:
800; X32-SSE41:       ## BB#0:
801; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
802; X32-SSE41-NEXT:    movd (%eax), %xmm0
803; X32-SSE41-NEXT:    pmovzxbd %xmm0, %xmm1
804; X32-SSE41-NEXT:    pmovzxbq %xmm0, %xmm2
805; X32-SSE41-NEXT:    movd %xmm2, %eax
806; X32-SSE41-NEXT:    movsbl %al, %eax
807; X32-SSE41-NEXT:    movd %eax, %xmm0
808; X32-SSE41-NEXT:    sarl $31, %eax
809; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm0
810; X32-SSE41-NEXT:    pextrd $2, %xmm2, %eax
811; X32-SSE41-NEXT:    movsbl %al, %eax
812; X32-SSE41-NEXT:    pinsrd $2, %eax, %xmm0
813; X32-SSE41-NEXT:    sarl $31, %eax
814; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm0
815; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0]
816; X32-SSE41-NEXT:    movd %xmm2, %eax
817; X32-SSE41-NEXT:    movsbl %al, %eax
818; X32-SSE41-NEXT:    movd %eax, %xmm1
819; X32-SSE41-NEXT:    sarl $31, %eax
820; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm1
821; X32-SSE41-NEXT:    pextrd $2, %xmm2, %eax
822; X32-SSE41-NEXT:    movsbl %al, %eax
823; X32-SSE41-NEXT:    pinsrd $2, %eax, %xmm1
824; X32-SSE41-NEXT:    sarl $31, %eax
825; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm1
826; X32-SSE41-NEXT:    retl
827 %X = load <4 x i8>* %ptr
828 %Y = sext <4 x i8> %X to <4 x i64>
829 ret <4 x i64>%Y
830}
831
832define <4 x i64> @load_sext_4i16_to_4i64(<4 x i16> *%ptr) {
833; SSE2-LABEL: load_sext_4i16_to_4i64:
834; SSE2:       ## BB#0:
835; SSE2-NEXT:    movq (%rdi), %xmm1
836; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
837; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,1,0]
838; SSE2-NEXT:    movd %xmm2, %rax
839; SSE2-NEXT:    movswq %ax, %rax
840; SSE2-NEXT:    movd %rax, %xmm0
841; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
842; SSE2-NEXT:    movd %xmm2, %rax
843; SSE2-NEXT:    movswq %ax, %rax
844; SSE2-NEXT:    movd %rax, %xmm2
845; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
846; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0]
847; SSE2-NEXT:    movd %xmm2, %rax
848; SSE2-NEXT:    movswq %ax, %rax
849; SSE2-NEXT:    movd %rax, %xmm1
850; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
851; SSE2-NEXT:    movd %xmm2, %rax
852; SSE2-NEXT:    movswq %ax, %rax
853; SSE2-NEXT:    movd %rax, %xmm2
854; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
855; SSE2-NEXT:    retq
856;
857; SSSE3-LABEL: load_sext_4i16_to_4i64:
858; SSSE3:       ## BB#0:
859; SSSE3-NEXT:    movq (%rdi), %xmm1
860; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
861; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,1,0]
862; SSSE3-NEXT:    movd %xmm2, %rax
863; SSSE3-NEXT:    movswq %ax, %rax
864; SSSE3-NEXT:    movd %rax, %xmm0
865; SSSE3-NEXT:    punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
866; SSSE3-NEXT:    movd %xmm2, %rax
867; SSSE3-NEXT:    movswq %ax, %rax
868; SSSE3-NEXT:    movd %rax, %xmm2
869; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
870; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0]
871; SSSE3-NEXT:    movd %xmm2, %rax
872; SSSE3-NEXT:    movswq %ax, %rax
873; SSSE3-NEXT:    movd %rax, %xmm1
874; SSSE3-NEXT:    punpckhqdq {{.*#+}} xmm2 = xmm2[1,1]
875; SSSE3-NEXT:    movd %xmm2, %rax
876; SSSE3-NEXT:    movswq %ax, %rax
877; SSSE3-NEXT:    movd %rax, %xmm2
878; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
879; SSSE3-NEXT:    retq
880;
881; SSE41-LABEL: load_sext_4i16_to_4i64:
882; SSE41:       ## BB#0:
883; SSE41-NEXT:    movq (%rdi), %xmm0
884; SSE41-NEXT:    pmovzxwd %xmm0, %xmm1
885; SSE41-NEXT:    pmovzxwq %xmm0, %xmm0
886; SSE41-NEXT:    pextrq $1, %xmm0, %rax
887; SSE41-NEXT:    movswq %ax, %rax
888; SSE41-NEXT:    movd %rax, %xmm2
889; SSE41-NEXT:    movd %xmm0, %rax
890; SSE41-NEXT:    movswq %ax, %rax
891; SSE41-NEXT:    movd %rax, %xmm0
892; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
893; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,0,3,0]
894; SSE41-NEXT:    pextrq $1, %xmm1, %rax
895; SSE41-NEXT:    movswq %ax, %rax
896; SSE41-NEXT:    movd %rax, %xmm2
897; SSE41-NEXT:    movd %xmm1, %rax
898; SSE41-NEXT:    movswq %ax, %rax
899; SSE41-NEXT:    movd %rax, %xmm1
900; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
901; SSE41-NEXT:    retq
902;
903; AVX1-LABEL: load_sext_4i16_to_4i64:
904; AVX1:       ## BB#0:
905; AVX1-NEXT:    vpmovsxwd (%rdi), %xmm0
906; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
907; AVX1-NEXT:    vmovhlps {{.*#+}} xmm0 = xmm0[1,1]
908; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
909; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
910; AVX1-NEXT:    retq
911;
912; AVX2-LABEL: load_sext_4i16_to_4i64:
913; AVX2:       ## BB#0:
914; AVX2-NEXT:    vpmovsxwq (%rdi), %ymm0
915; AVX2-NEXT:    retq
916;
917; X32-SSE41-LABEL: load_sext_4i16_to_4i64:
918; X32-SSE41:       ## BB#0:
919; X32-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
920; X32-SSE41-NEXT:    movsd (%eax), %xmm0
921; X32-SSE41-NEXT:    pmovzxwd %xmm0, %xmm1
922; X32-SSE41-NEXT:    pmovzxwq %xmm0, %xmm2
923; X32-SSE41-NEXT:    movd %xmm2, %eax
924; X32-SSE41-NEXT:    cwtl
925; X32-SSE41-NEXT:    movd %eax, %xmm0
926; X32-SSE41-NEXT:    sarl $31, %eax
927; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm0
928; X32-SSE41-NEXT:    pextrd $2, %xmm2, %eax
929; X32-SSE41-NEXT:    cwtl
930; X32-SSE41-NEXT:    pinsrd $2, %eax, %xmm0
931; X32-SSE41-NEXT:    sarl $31, %eax
932; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm0
933; X32-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0]
934; X32-SSE41-NEXT:    movd %xmm2, %eax
935; X32-SSE41-NEXT:    cwtl
936; X32-SSE41-NEXT:    movd %eax, %xmm1
937; X32-SSE41-NEXT:    sarl $31, %eax
938; X32-SSE41-NEXT:    pinsrd $1, %eax, %xmm1
939; X32-SSE41-NEXT:    pextrd $2, %xmm2, %eax
940; X32-SSE41-NEXT:    cwtl
941; X32-SSE41-NEXT:    pinsrd $2, %eax, %xmm1
942; X32-SSE41-NEXT:    sarl $31, %eax
943; X32-SSE41-NEXT:    pinsrd $3, %eax, %xmm1
944; X32-SSE41-NEXT:    retl
945 %X = load <4 x i16>* %ptr
946 %Y = sext <4 x i16> %X to <4 x i64>
947 ret <4 x i64>%Y
948}
949