1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
3; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+sse4.2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE42
4; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
5; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-SLOW
6; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+avx2,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST,AVX2-FAST-ALL
7; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+avx2,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST,AVX2-FAST-PERLANE
8; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+xop | FileCheck %s --check-prefix=XOP
9
10define void @v3i64(<2 x i64> %a, <2 x i64> %b, <3 x i64>* %p) nounwind {
11; SSE2-LABEL: v3i64:
12; SSE2:       # %bb.0:
13; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
14; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
15; SSE2-NEXT:    movq %xmm2, 16(%rdi)
16; SSE2-NEXT:    movdqa %xmm0, (%rdi)
17; SSE2-NEXT:    retq
18;
19; SSE42-LABEL: v3i64:
20; SSE42:       # %bb.0:
21; SSE42-NEXT:    pextrq $1, %xmm0, 16(%rdi)
22; SSE42-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
23; SSE42-NEXT:    movdqa %xmm0, (%rdi)
24; SSE42-NEXT:    retq
25;
26; AVX-LABEL: v3i64:
27; AVX:       # %bb.0:
28; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm0[0],xmm1[0]
29; AVX-NEXT:    vpextrq $1, %xmm0, 16(%rdi)
30; AVX-NEXT:    vmovdqa %xmm1, (%rdi)
31; AVX-NEXT:    retq
32;
33; XOP-LABEL: v3i64:
34; XOP:       # %bb.0:
35; XOP-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm0[0],xmm1[0]
36; XOP-NEXT:    vpextrq $1, %xmm0, 16(%rdi)
37; XOP-NEXT:    vmovdqa %xmm1, (%rdi)
38; XOP-NEXT:    retq
39  %r = shufflevector <2 x i64> %a, <2 x i64> %b, <3 x i32> <i32 0, i32 2, i32 1>
40  store <3 x i64> %r, <3 x i64>* %p
41  ret void
42}
43define void @v3f64(<2 x double> %a, <2 x double> %b, <3 x double>* %p) nounwind {
44; SSE-LABEL: v3f64:
45; SSE:       # %bb.0:
46; SSE-NEXT:    movhps %xmm0, 16(%rdi)
47; SSE-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
48; SSE-NEXT:    movaps %xmm0, (%rdi)
49; SSE-NEXT:    retq
50;
51; AVX-LABEL: v3f64:
52; AVX:       # %bb.0:
53; AVX-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm0[0],xmm1[0]
54; AVX-NEXT:    vmovhps %xmm0, 16(%rdi)
55; AVX-NEXT:    vmovaps %xmm1, (%rdi)
56; AVX-NEXT:    retq
57;
58; XOP-LABEL: v3f64:
59; XOP:       # %bb.0:
60; XOP-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm0[0],xmm1[0]
61; XOP-NEXT:    vmovhps %xmm0, 16(%rdi)
62; XOP-NEXT:    vmovaps %xmm1, (%rdi)
63; XOP-NEXT:    retq
64  %r = shufflevector <2 x double> %a, <2 x double> %b, <3 x i32> <i32 0, i32 2, i32 1>
65  store <3 x double> %r, <3 x double>* %p
66  ret void
67}
68
69define void @v3i32(<2 x i32> %a, <2 x i32> %b, <3 x i32>* %p) nounwind {
70; SSE2-LABEL: v3i32:
71; SSE2:       # %bb.0:
72; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]
73; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
74; SSE2-NEXT:    movd %xmm2, 8(%rdi)
75; SSE2-NEXT:    movq %xmm0, (%rdi)
76; SSE2-NEXT:    retq
77;
78; SSE42-LABEL: v3i32:
79; SSE42:       # %bb.0:
80; SSE42-NEXT:    extractps $1, %xmm0, 8(%rdi)
81; SSE42-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
82; SSE42-NEXT:    movlps %xmm0, (%rdi)
83; SSE42-NEXT:    retq
84;
85; AVX-LABEL: v3i32:
86; AVX:       # %bb.0:
87; AVX-NEXT:    vunpcklps {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
88; AVX-NEXT:    vextractps $1, %xmm0, 8(%rdi)
89; AVX-NEXT:    vmovlps %xmm1, (%rdi)
90; AVX-NEXT:    retq
91;
92; XOP-LABEL: v3i32:
93; XOP:       # %bb.0:
94; XOP-NEXT:    vunpcklps {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
95; XOP-NEXT:    vextractps $1, %xmm0, 8(%rdi)
96; XOP-NEXT:    vmovlps %xmm1, (%rdi)
97; XOP-NEXT:    retq
98  %r = shufflevector <2 x i32> %a, <2 x i32> %b, <3 x i32> <i32 0, i32 2, i32 1>
99  store <3 x i32> %r, <3 x i32>* %p
100  ret void
101}
102
103define void @v5i16(<4 x i16> %a, <4 x i16> %b, <5 x i16>* %p) nounwind {
104; SSE2-LABEL: v5i16:
105; SSE2:       # %bb.0:
106; SSE2-NEXT:    psrlq $16, %xmm1
107; SSE2-NEXT:    pextrw $3, %xmm0, %eax
108; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
109; SSE2-NEXT:    movw %ax, 8(%rdi)
110; SSE2-NEXT:    movq %xmm0, (%rdi)
111; SSE2-NEXT:    retq
112;
113; SSE42-LABEL: v5i16:
114; SSE42:       # %bb.0:
115; SSE42-NEXT:    psrlq $16, %xmm1
116; SSE42-NEXT:    pextrw $3, %xmm0, 8(%rdi)
117; SSE42-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
118; SSE42-NEXT:    movq %xmm0, (%rdi)
119; SSE42-NEXT:    retq
120;
121; AVX-LABEL: v5i16:
122; AVX:       # %bb.0:
123; AVX-NEXT:    vpsrlq $16, %xmm1, %xmm1
124; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
125; AVX-NEXT:    vpextrw $3, %xmm0, 8(%rdi)
126; AVX-NEXT:    vmovq %xmm1, (%rdi)
127; AVX-NEXT:    retq
128;
129; XOP-LABEL: v5i16:
130; XOP:       # %bb.0:
131; XOP-NEXT:    vpsrlq $16, %xmm1, %xmm1
132; XOP-NEXT:    vpunpcklwd {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
133; XOP-NEXT:    vpextrw $3, %xmm0, 8(%rdi)
134; XOP-NEXT:    vmovq %xmm1, (%rdi)
135; XOP-NEXT:    retq
136  %r = shufflevector <4 x i16> %a, <4 x i16> %b, <5 x i32> <i32 0, i32 5, i32 1, i32 6, i32 3>
137  store <5 x i16> %r, <5 x i16>* %p
138  ret void
139}
140
141define void @v5i32(<4 x i32> %a, <4 x i32> %b, <5 x i32>* %p) nounwind {
142; SSE2-LABEL: v5i32:
143; SSE2:       # %bb.0:
144; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,2,2,3]
145; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[3,3,3,3]
146; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
147; SSE2-NEXT:    movd %xmm2, 16(%rdi)
148; SSE2-NEXT:    movdqa %xmm0, (%rdi)
149; SSE2-NEXT:    retq
150;
151; SSE42-LABEL: v5i32:
152; SSE42:       # %bb.0:
153; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,2,2]
154; SSE42-NEXT:    pmovzxdq {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero
155; SSE42-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
156; SSE42-NEXT:    pextrd $3, %xmm0, 16(%rdi)
157; SSE42-NEXT:    movdqa %xmm2, (%rdi)
158; SSE42-NEXT:    retq
159;
160; AVX1-LABEL: v5i32:
161; AVX1:       # %bb.0:
162; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,1,2,2]
163; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero
164; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
165; AVX1-NEXT:    vpextrd $3, %xmm0, 16(%rdi)
166; AVX1-NEXT:    vmovdqa %xmm1, (%rdi)
167; AVX1-NEXT:    retq
168;
169; AVX2-LABEL: v5i32:
170; AVX2:       # %bb.0:
171; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,1,2,2]
172; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero
173; AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3]
174; AVX2-NEXT:    vpextrd $3, %xmm0, 16(%rdi)
175; AVX2-NEXT:    vmovdqa %xmm1, (%rdi)
176; AVX2-NEXT:    retq
177;
178; XOP-LABEL: v5i32:
179; XOP:       # %bb.0:
180; XOP-NEXT:    vpperm {{.*#+}} xmm1 = xmm0[0,1,2,3],xmm1[4,5,6,7],xmm0[4,5,6,7],xmm1[8,9,10,11]
181; XOP-NEXT:    vpextrd $3, %xmm0, 16(%rdi)
182; XOP-NEXT:    vmovdqa %xmm1, (%rdi)
183; XOP-NEXT:    retq
184  %r = shufflevector <4 x i32> %a, <4 x i32> %b, <5 x i32> <i32 0, i32 5, i32 1, i32 6, i32 3>
185  store <5 x i32> %r, <5 x i32>* %p
186  ret void
187}
188
189define void @v5f32(<4 x float> %a, <4 x float> %b, <5 x float>* %p) nounwind {
190; SSE2-LABEL: v5f32:
191; SSE2:       # %bb.0:
192; SSE2-NEXT:    movaps %xmm0, %xmm2
193; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,1],xmm1[1,2]
194; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2,1,3]
195; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
196; SSE2-NEXT:    movss %xmm0, 16(%rdi)
197; SSE2-NEXT:    movaps %xmm2, (%rdi)
198; SSE2-NEXT:    retq
199;
200; SSE42-LABEL: v5f32:
201; SSE42:       # %bb.0:
202; SSE42-NEXT:    extractps $3, %xmm0, 16(%rdi)
203; SSE42-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[1,2]
204; SSE42-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
205; SSE42-NEXT:    movaps %xmm0, (%rdi)
206; SSE42-NEXT:    retq
207;
208; AVX-LABEL: v5f32:
209; AVX:       # %bb.0:
210; AVX-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[0,1],xmm1[1,2]
211; AVX-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[0,2,1,3]
212; AVX-NEXT:    vextractps $3, %xmm0, 16(%rdi)
213; AVX-NEXT:    vmovaps %xmm1, (%rdi)
214; AVX-NEXT:    retq
215;
216; XOP-LABEL: v5f32:
217; XOP:       # %bb.0:
218; XOP-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[0,1],xmm1[1,2]
219; XOP-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[0,2,1,3]
220; XOP-NEXT:    vextractps $3, %xmm0, 16(%rdi)
221; XOP-NEXT:    vmovaps %xmm1, (%rdi)
222; XOP-NEXT:    retq
223  %r = shufflevector <4 x float> %a, <4 x float> %b, <5 x i32> <i32 0, i32 5, i32 1, i32 6, i32 3>
224  store <5 x float> %r, <5 x float>* %p
225  ret void
226}
227
228define void @v7i8(<4 x i8> %a, <4 x i8> %b, <7 x i8>* %p) nounwind {
229; SSE2-LABEL: v7i8:
230; SSE2:       # %bb.0:
231; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
232; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,3,1,3,4,5,6,7]
233; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,255,0,255,0,255,255,255,255,255,255,255,255,255,255,255]
234; SSE2-NEXT:    movdqa %xmm1, -{{[0-9]+}}(%rsp)
235; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
236; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[2,2,3,0,4,5,6,7]
237; SSE2-NEXT:    pand %xmm2, %xmm1
238; SSE2-NEXT:    pandn %xmm0, %xmm2
239; SSE2-NEXT:    por %xmm1, %xmm2
240; SSE2-NEXT:    movb -{{[0-9]+}}(%rsp), %al
241; SSE2-NEXT:    movb %al, 6(%rdi)
242; SSE2-NEXT:    movd %xmm2, (%rdi)
243; SSE2-NEXT:    pextrw $2, %xmm2, %eax
244; SSE2-NEXT:    movw %ax, 4(%rdi)
245; SSE2-NEXT:    retq
246;
247; SSE42-LABEL: v7i8:
248; SSE42:       # %bb.0:
249; SSE42-NEXT:    pextrb $0, %xmm1, 6(%rdi)
250; SSE42-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]
251; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[1,4,7,4,3,6,0,u,u,u,u,u,u,u,u,u]
252; SSE42-NEXT:    pextrw $2, %xmm1, 4(%rdi)
253; SSE42-NEXT:    movd %xmm1, (%rdi)
254; SSE42-NEXT:    retq
255;
256; AVX-LABEL: v7i8:
257; AVX:       # %bb.0:
258; AVX-NEXT:    vpunpcklbw {{.*#+}} xmm0 = 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]
259; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[1,4,7,4,3,6,0,u,u,u,u,u,u,u,u,u]
260; AVX-NEXT:    vpextrb $0, %xmm1, 6(%rdi)
261; AVX-NEXT:    vpextrw $2, %xmm0, 4(%rdi)
262; AVX-NEXT:    vmovd %xmm0, (%rdi)
263; AVX-NEXT:    retq
264;
265; XOP-LABEL: v7i8:
266; XOP:       # %bb.0:
267; XOP-NEXT:    vpperm {{.*#+}} xmm0 = xmm0[0],xmm1[2],xmm0[3],xmm1[2],xmm0[1],xmm1[3,0,u,u,u,u,u,u,u,u,u]
268; XOP-NEXT:    vpextrb $0, %xmm1, 6(%rdi)
269; XOP-NEXT:    vpextrw $2, %xmm0, 4(%rdi)
270; XOP-NEXT:    vmovd %xmm0, (%rdi)
271; XOP-NEXT:    retq
272  %r = shufflevector <4 x i8> %a, <4 x i8> %b, <7 x i32> <i32 0, i32 6, i32 3, i32 6, i32 1, i32 7, i32 4>
273  store <7 x i8> %r, <7 x i8>* %p
274  ret void
275}
276
277define void @v7i16(<4 x i16> %a, <4 x i16> %b, <7 x i16>* %p) nounwind {
278; SSE2-LABEL: v7i16:
279; SSE2:       # %bb.0:
280; SSE2-NEXT:    movd %xmm1, %eax
281; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
282; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm1[0,1,0,3,4,5,6,7]
283; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,7,6,7]
284; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
285; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,2,3,2,4,5,6,7]
286; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm0[0,1,2,3,5,6,4,7]
287; SSE2-NEXT:    movw %ax, 12(%rdi)
288; SSE2-NEXT:    movq %xmm0, (%rdi)
289; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
290; SSE2-NEXT:    movd %xmm0, 8(%rdi)
291; SSE2-NEXT:    retq
292;
293; SSE42-LABEL: v7i16:
294; SSE42:       # %bb.0:
295; SSE42-NEXT:    pextrw $0, %xmm1, 12(%rdi)
296; SSE42-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
297; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[2,3,8,9,14,15,8,9,6,7,12,13,0,1,14,15]
298; SSE42-NEXT:    pextrd $2, %xmm1, 8(%rdi)
299; SSE42-NEXT:    movq %xmm1, (%rdi)
300; SSE42-NEXT:    retq
301;
302; AVX-LABEL: v7i16:
303; AVX:       # %bb.0:
304; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
305; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[2,3,8,9,14,15,8,9,6,7,12,13,0,1,14,15]
306; AVX-NEXT:    vpextrw $0, %xmm1, 12(%rdi)
307; AVX-NEXT:    vpextrd $2, %xmm0, 8(%rdi)
308; AVX-NEXT:    vmovq %xmm0, (%rdi)
309; AVX-NEXT:    retq
310;
311; XOP-LABEL: v7i16:
312; XOP:       # %bb.0:
313; XOP-NEXT:    vpperm {{.*#+}} xmm0 = xmm0[0,1],xmm1[4,5],xmm0[6,7],xmm1[4,5],xmm0[2,3],xmm1[6,7,0,1],xmm0[6,7]
314; XOP-NEXT:    vpextrw $0, %xmm1, 12(%rdi)
315; XOP-NEXT:    vpextrd $2, %xmm0, 8(%rdi)
316; XOP-NEXT:    vmovq %xmm0, (%rdi)
317; XOP-NEXT:    retq
318  %r = shufflevector <4 x i16> %a, <4 x i16> %b, <7 x i32> <i32 0, i32 6, i32 3, i32 6, i32 1, i32 7, i32 4>
319  store <7 x i16> %r, <7 x i16>* %p
320  ret void
321}
322
323
324define void @v7i32(<4 x i32> %a, <4 x i32> %b, <7 x i32>* %p) nounwind {
325; SSE2-LABEL: v7i32:
326; SSE2:       # %bb.0:
327; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,2,2,2]
328; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,1,0,3]
329; SSE2-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm2[2],xmm3[3],xmm2[3]
330; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]
331; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
332; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
333; SSE2-NEXT:    movd %xmm1, 24(%rdi)
334; SSE2-NEXT:    movq %xmm0, 16(%rdi)
335; SSE2-NEXT:    movdqa %xmm3, (%rdi)
336; SSE2-NEXT:    retq
337;
338; SSE42-LABEL: v7i32:
339; SSE42:       # %bb.0:
340; SSE42-NEXT:    movdqa %xmm0, %xmm2
341; SSE42-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5],xmm2[6,7]
342; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,3,2]
343; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
344; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
345; SSE42-NEXT:    movd %xmm1, 24(%rdi)
346; SSE42-NEXT:    movq %xmm0, 16(%rdi)
347; SSE42-NEXT:    movdqa %xmm2, (%rdi)
348; SSE42-NEXT:    retq
349;
350; AVX-LABEL: v7i32:
351; AVX:       # %bb.0:
352; AVX-NEXT:    vblendps {{.*#+}} xmm2 = xmm0[0,1],xmm1[2],xmm0[3]
353; AVX-NEXT:    vpermilps {{.*#+}} xmm2 = xmm2[0,2,3,2]
354; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
355; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[1,3,2,3]
356; AVX-NEXT:    vmovss %xmm1, 24(%rdi)
357; AVX-NEXT:    vmovlps %xmm0, 16(%rdi)
358; AVX-NEXT:    vmovaps %xmm2, (%rdi)
359; AVX-NEXT:    retq
360;
361; XOP-LABEL: v7i32:
362; XOP:       # %bb.0:
363; XOP-NEXT:    vblendps {{.*#+}} xmm2 = xmm0[0,1],xmm1[2],xmm0[3]
364; XOP-NEXT:    vpermilps {{.*#+}} xmm2 = xmm2[0,2,3,2]
365; XOP-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
366; XOP-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[1,3,2,3]
367; XOP-NEXT:    vmovss %xmm1, 24(%rdi)
368; XOP-NEXT:    vmovlps %xmm0, 16(%rdi)
369; XOP-NEXT:    vmovaps %xmm2, (%rdi)
370; XOP-NEXT:    retq
371  %r = shufflevector <4 x i32> %a, <4 x i32> %b, <7 x i32> <i32 0, i32 6, i32 3, i32 6, i32 1, i32 7, i32 4>
372  store <7 x i32> %r, <7 x i32>* %p
373  ret void
374}
375
376define void @v12i8(<8 x i8> %a, <8 x i8> %b, <12 x i8>* %p) nounwind {
377; SSE2-LABEL: v12i8:
378; SSE2:       # %bb.0:
379; SSE2-NEXT:    pxor %xmm2, %xmm2
380; 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]
381; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[3,1,2,3]
382; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,3,1,3,4,5,6,7]
383; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,5,4,7]
384; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,2,1]
385; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,1,4,5,6,7]
386; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,6,4]
387; SSE2-NEXT:    packuswb %xmm2, %xmm0
388; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,0,255,255,0,255,255,0,255,255,0,255,255,255,255]
389; SSE2-NEXT:    pand %xmm2, %xmm0
390; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,1,1,4,5,6,7]
391; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,1,3]
392; SSE2-NEXT:    pandn %xmm1, %xmm2
393; SSE2-NEXT:    por %xmm0, %xmm2
394; SSE2-NEXT:    movq %xmm2, (%rdi)
395; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
396; SSE2-NEXT:    movd %xmm0, 8(%rdi)
397; SSE2-NEXT:    retq
398;
399; SSE42-LABEL: v12i8:
400; SSE42:       # %bb.0:
401; SSE42-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]
402; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,8,1,2,10,3,4,12,5,6,14,7,u,u,u,u]
403; SSE42-NEXT:    pextrd $2, %xmm0, 8(%rdi)
404; SSE42-NEXT:    movq %xmm0, (%rdi)
405; SSE42-NEXT:    retq
406;
407; AVX-LABEL: v12i8:
408; AVX:       # %bb.0:
409; AVX-NEXT:    vpunpcklbw {{.*#+}} 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]
410; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8,1,2,10,3,4,12,5,6,14,7,u,u,u,u]
411; AVX-NEXT:    vpextrd $2, %xmm0, 8(%rdi)
412; AVX-NEXT:    vmovq %xmm0, (%rdi)
413; AVX-NEXT:    retq
414;
415; XOP-LABEL: v12i8:
416; XOP:       # %bb.0:
417; XOP-NEXT:    vpperm {{.*#+}} xmm0 = xmm0[0,4],xmm1[0],xmm0[1,5],xmm1[1],xmm0[2,6],xmm1[2],xmm0[3,7],xmm1[3],xmm0[u,u,u,u]
418; XOP-NEXT:    vpextrd $2, %xmm0, 8(%rdi)
419; XOP-NEXT:    vmovq %xmm0, (%rdi)
420; XOP-NEXT:    retq
421  %r = shufflevector <8 x i8> %a, <8 x i8> %b, <12 x i32> <i32 0, i32 4, i32 8, i32 1, i32 5, i32 9, i32 2, i32 6, i32 10, i32 3, i32 7, i32 11>
422  store <12 x i8> %r, <12 x i8>* %p
423  ret void
424}
425
426define void @v12i16(<8 x i16> %a, <8 x i16> %b, <12 x i16>* %p) nounwind {
427; SSE2-LABEL: v12i16:
428; SSE2:       # %bb.0:
429; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,0,0]
430; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [65535,65535,0,65535,65535,0,65535,65535]
431; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm0[0,1,2,3,6,5,4,7]
432; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,3,2,1]
433; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[0,2,2,1,4,5,6,7]
434; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,5,5,6,4]
435; SSE2-NEXT:    pand %xmm3, %xmm4
436; SSE2-NEXT:    pandn %xmm2, %xmm3
437; SSE2-NEXT:    por %xmm4, %xmm3
438; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]
439; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,65535,65535,0,65535,65535,65535,65535]
440; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
441; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,3,1,3,4,5,6,7]
442; SSE2-NEXT:    pand %xmm2, %xmm0
443; SSE2-NEXT:    pandn %xmm1, %xmm2
444; SSE2-NEXT:    por %xmm0, %xmm2
445; SSE2-NEXT:    movq %xmm2, 16(%rdi)
446; SSE2-NEXT:    movdqa %xmm3, (%rdi)
447; SSE2-NEXT:    retq
448;
449; SSE42-LABEL: v12i16:
450; SSE42:       # %bb.0:
451; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]
452; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[3,1,2,3]
453; SSE42-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,3,1,3,4,5,6,7]
454; SSE42-NEXT:    pblendw {{.*#+}} xmm3 = xmm2[0],xmm3[1,2],xmm2[3],xmm3[4,5,6,7]
455; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
456; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,u,u,2,3,10,11,u,u,4,5,12,13]
457; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7]
458; SSE42-NEXT:    movdqa %xmm0, (%rdi)
459; SSE42-NEXT:    movq %xmm3, 16(%rdi)
460; SSE42-NEXT:    retq
461;
462; AVX1-LABEL: v12i16:
463; AVX1:       # %bb.0:
464; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]
465; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[3,1,2,3]
466; AVX1-NEXT:    vpshuflw {{.*#+}} xmm3 = xmm3[0,3,1,3,4,5,6,7]
467; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1,2],xmm2[3],xmm3[4,5,6,7]
468; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
469; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,u,u,2,3,10,11,u,u,4,5,12,13]
470; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7]
471; AVX1-NEXT:    vmovdqa %xmm0, (%rdi)
472; AVX1-NEXT:    vmovq %xmm2, 16(%rdi)
473; AVX1-NEXT:    retq
474;
475; AVX2-SLOW-LABEL: v12i16:
476; AVX2-SLOW:       # %bb.0:
477; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]
478; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[3,1,2,3]
479; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm3 = xmm3[0,3,1,3,4,5,6,7]
480; AVX2-SLOW-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1,2],xmm2[3],xmm3[4,5,6,7]
481; AVX2-SLOW-NEXT:    vpbroadcastd %xmm1, %xmm1
482; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,u,u,2,3,10,11,u,u,4,5,12,13]
483; AVX2-SLOW-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7]
484; AVX2-SLOW-NEXT:    vmovdqa %xmm0, (%rdi)
485; AVX2-SLOW-NEXT:    vmovq %xmm2, 16(%rdi)
486; AVX2-SLOW-NEXT:    retq
487;
488; AVX2-FAST-LABEL: v12i16:
489; AVX2-FAST:       # %bb.0:
490; AVX2-FAST-NEXT:    vpbroadcastd %xmm1, %xmm2
491; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm3 = xmm0[0,1,8,9,u,u,2,3,10,11,u,u,4,5,12,13]
492; AVX2-FAST-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2],xmm3[3,4],xmm2[5],xmm3[6,7]
493; AVX2-FAST-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]
494; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[u,u,6,7,14,15,u,u,u,u,u,u,u,u,u,u]
495; AVX2-FAST-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3],xmm0[4,5,6,7]
496; AVX2-FAST-NEXT:    vmovq %xmm0, 16(%rdi)
497; AVX2-FAST-NEXT:    vmovdqa %xmm2, (%rdi)
498; AVX2-FAST-NEXT:    retq
499;
500; XOP-LABEL: v12i16:
501; XOP:       # %bb.0:
502; XOP-NEXT:    vpperm {{.*#+}} xmm2 = xmm0[0,1,8,9],xmm1[0,1],xmm0[2,3,10,11],xmm1[2,3],xmm0[4,5,12,13]
503; XOP-NEXT:    vpperm {{.*#+}} xmm0 = xmm1[4,5],xmm0[6,7,14,15],xmm1[6,7],xmm0[u,u,u,u,u,u,u,u]
504; XOP-NEXT:    vmovq %xmm0, 16(%rdi)
505; XOP-NEXT:    vmovdqa %xmm2, (%rdi)
506; XOP-NEXT:    retq
507  %r = shufflevector <8 x i16> %a, <8 x i16> %b, <12 x i32> <i32 0, i32 4, i32 8, i32 1, i32 5, i32 9, i32 2, i32 6, i32 10, i32 3, i32 7, i32 11>
508  store <12 x i16> %r, <12 x i16>* %p
509  ret void
510}
511
512define void @v12i32(<8 x i32> %a, <8 x i32> %b, <12 x i32>* %p) nounwind {
513; SSE2-LABEL: v12i32:
514; SSE2:       # %bb.0:
515; SSE2-NEXT:    movaps %xmm2, %xmm3
516; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,1],xmm0[1,3]
517; SSE2-NEXT:    movaps %xmm0, %xmm4
518; SSE2-NEXT:    unpcklps {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1]
519; SSE2-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,1],xmm3[0,2]
520; SSE2-NEXT:    movaps %xmm0, %xmm3
521; SSE2-NEXT:    unpckhpd {{.*#+}} xmm3 = xmm3[1],xmm1[1]
522; SSE2-NEXT:    movaps %xmm2, %xmm5
523; SSE2-NEXT:    shufps {{.*#+}} xmm5 = xmm5[1,0],xmm1[1,0]
524; SSE2-NEXT:    shufps {{.*#+}} xmm5 = xmm5[2,0],xmm3[0,2]
525; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,3],xmm2[3,3]
526; SSE2-NEXT:    unpckhps {{.*#+}} xmm2 = xmm2[2],xmm0[2],xmm2[3],xmm0[3]
527; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,3],xmm1[0,2]
528; SSE2-NEXT:    movaps %xmm2, 32(%rdi)
529; SSE2-NEXT:    movaps %xmm5, 16(%rdi)
530; SSE2-NEXT:    movaps %xmm4, (%rdi)
531; SSE2-NEXT:    retq
532;
533; SSE42-LABEL: v12i32:
534; SSE42:       # %bb.0:
535; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[0,0,1,1]
536; SSE42-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,1,0,1]
537; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm3[2,3],xmm4[4,5,6,7]
538; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,1,0,1]
539; SSE42-NEXT:    pblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5],xmm4[6,7]
540; SSE42-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,2,2]
541; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm2[2,3],xmm4[4,5,6,7]
542; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm0[4,5],xmm4[6,7]
543; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
544; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]
545; SSE42-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm0[2,3],xmm2[4,5,6,7]
546; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,2,3,3]
547; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5],xmm2[6,7]
548; SSE42-NEXT:    movdqa %xmm0, 32(%rdi)
549; SSE42-NEXT:    movdqa %xmm4, 16(%rdi)
550; SSE42-NEXT:    movdqa %xmm3, (%rdi)
551; SSE42-NEXT:    retq
552;
553; AVX1-LABEL: v12i32:
554; AVX1:       # %bb.0:
555; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3,0,1]
556; AVX1-NEXT:    vmovsldup {{.*#+}} ymm2 = ymm2[0,0,2,2,4,4,6,6]
557; AVX1-NEXT:    vpermilps {{.*#+}} ymm3 = ymm0[0,u,u,1,5,u,u,6]
558; AVX1-NEXT:    vblendps {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2,3,4,5],ymm2[6],ymm3[7]
559; AVX1-NEXT:    vpermilps {{.*#+}} xmm3 = xmm1[0,1,0,1]
560; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm3, %ymm3
561; AVX1-NEXT:    vblendps {{.*#+}} ymm2 = ymm2[0,1],ymm3[2],ymm2[3,4],ymm3[5],ymm2[6,7]
562; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
563; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3],xmm3[3,3]
564; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[2,3,2,3]
565; AVX1-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3]
566; AVX1-NEXT:    vmovaps %xmm0, 32(%rdi)
567; AVX1-NEXT:    vmovaps %ymm2, (%rdi)
568; AVX1-NEXT:    vzeroupper
569; AVX1-NEXT:    retq
570;
571; AVX2-SLOW-LABEL: v12i32:
572; AVX2-SLOW:       # %bb.0:
573; AVX2-SLOW-NEXT:    vmovaps {{.*#+}} ymm2 = <0,4,u,1,5,u,2,6>
574; AVX2-SLOW-NEXT:    vpermps %ymm0, %ymm2, %ymm2
575; AVX2-SLOW-NEXT:    vbroadcastsd %xmm1, %ymm3
576; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm2 = ymm2[0,1],ymm3[2],ymm2[3,4],ymm3[5],ymm2[6,7]
577; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm3
578; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3],xmm3[3,3]
579; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[2,3,2,3]
580; AVX2-SLOW-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3]
581; AVX2-SLOW-NEXT:    vmovaps %xmm0, 32(%rdi)
582; AVX2-SLOW-NEXT:    vmovaps %ymm2, (%rdi)
583; AVX2-SLOW-NEXT:    vzeroupper
584; AVX2-SLOW-NEXT:    retq
585;
586; AVX2-FAST-ALL-LABEL: v12i32:
587; AVX2-FAST-ALL:       # %bb.0:
588; AVX2-FAST-ALL-NEXT:    vmovaps {{.*#+}} ymm2 = <0,4,u,1,5,u,2,6>
589; AVX2-FAST-ALL-NEXT:    vpermps %ymm0, %ymm2, %ymm2
590; AVX2-FAST-ALL-NEXT:    vbroadcastsd %xmm1, %ymm3
591; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm2 = ymm2[0,1],ymm3[2],ymm2[3,4],ymm3[5],ymm2[6,7]
592; AVX2-FAST-ALL-NEXT:    vmovaps {{.*#+}} ymm3 = <u,3,7,u,u,u,u,u>
593; AVX2-FAST-ALL-NEXT:    vpermps %ymm0, %ymm3, %ymm0
594; AVX2-FAST-ALL-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[2,3,2,3]
595; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3]
596; AVX2-FAST-ALL-NEXT:    vmovaps %xmm0, 32(%rdi)
597; AVX2-FAST-ALL-NEXT:    vmovaps %ymm2, (%rdi)
598; AVX2-FAST-ALL-NEXT:    vzeroupper
599; AVX2-FAST-ALL-NEXT:    retq
600;
601; AVX2-FAST-PERLANE-LABEL: v12i32:
602; AVX2-FAST-PERLANE:       # %bb.0:
603; AVX2-FAST-PERLANE-NEXT:    vmovaps {{.*#+}} ymm2 = <0,4,u,1,5,u,2,6>
604; AVX2-FAST-PERLANE-NEXT:    vpermps %ymm0, %ymm2, %ymm2
605; AVX2-FAST-PERLANE-NEXT:    vbroadcastsd %xmm1, %ymm3
606; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm2 = ymm2[0,1],ymm3[2],ymm2[3,4],ymm3[5],ymm2[6,7]
607; AVX2-FAST-PERLANE-NEXT:    vextractf128 $1, %ymm0, %xmm3
608; AVX2-FAST-PERLANE-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3],xmm3[3,3]
609; AVX2-FAST-PERLANE-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[2,3,2,3]
610; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3]
611; AVX2-FAST-PERLANE-NEXT:    vmovaps %xmm0, 32(%rdi)
612; AVX2-FAST-PERLANE-NEXT:    vmovaps %ymm2, (%rdi)
613; AVX2-FAST-PERLANE-NEXT:    vzeroupper
614; AVX2-FAST-PERLANE-NEXT:    retq
615;
616; XOP-LABEL: v12i32:
617; XOP:       # %bb.0:
618; XOP-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3,0,1]
619; XOP-NEXT:    vpermil2ps {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[u,1,5,u],ymm2[6],ymm0[6]
620; XOP-NEXT:    vpermilps {{.*#+}} xmm3 = xmm1[0,1,0,1]
621; XOP-NEXT:    vinsertf128 $1, %xmm1, %ymm3, %ymm3
622; XOP-NEXT:    vblendps {{.*#+}} ymm2 = ymm2[0,1],ymm3[2],ymm2[3,4],ymm3[5],ymm2[6,7]
623; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm3
624; XOP-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3],xmm3[3,3]
625; XOP-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[2,3,2,3]
626; XOP-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3]
627; XOP-NEXT:    vmovaps %xmm0, 32(%rdi)
628; XOP-NEXT:    vmovaps %ymm2, (%rdi)
629; XOP-NEXT:    vzeroupper
630; XOP-NEXT:    retq
631  %r = shufflevector <8 x i32> %a, <8 x i32> %b, <12 x i32> <i32 0, i32 4, i32 8, i32 1, i32 5, i32 9, i32 2, i32 6, i32 10, i32 3, i32 7, i32 11>
632  store <12 x i32> %r, <12 x i32>* %p
633  ret void
634}
635
636define void @pr29025(<4 x i8> %a, <4 x i8> %b, <4 x i8> %c, <12 x i8> *%p) nounwind {
637; SSE2-LABEL: pr29025:
638; SSE2:       # %bb.0:
639; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
640; SSE2-NEXT:    pxor %xmm1, %xmm1
641; 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]
642; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,1,2,3]
643; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,3,1,3,4,5,6,7]
644; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,5,4,7]
645; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,2,1]
646; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,1,4,5,6,7]
647; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,6,4]
648; SSE2-NEXT:    packuswb %xmm1, %xmm0
649; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,0,255,255,0,255,255,0,255,255,0,255,255,255,255]
650; SSE2-NEXT:    pand %xmm1, %xmm0
651; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,0,1,1,4,5,6,7]
652; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,0,1,3]
653; SSE2-NEXT:    pandn %xmm2, %xmm1
654; SSE2-NEXT:    por %xmm0, %xmm1
655; SSE2-NEXT:    movq %xmm1, (%rdi)
656; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
657; SSE2-NEXT:    movd %xmm0, 8(%rdi)
658; SSE2-NEXT:    retq
659;
660; SSE42-LABEL: pr29025:
661; SSE42:       # %bb.0:
662; SSE42-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
663; SSE42-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]
664; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,8,1,2,10,3,4,12,5,6,14,7,u,u,u,u]
665; SSE42-NEXT:    pextrd $2, %xmm0, 8(%rdi)
666; SSE42-NEXT:    movq %xmm0, (%rdi)
667; SSE42-NEXT:    retq
668;
669; AVX-LABEL: pr29025:
670; AVX:       # %bb.0:
671; AVX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
672; AVX-NEXT:    vpunpcklbw {{.*#+}} 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]
673; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8,1,2,10,3,4,12,5,6,14,7,u,u,u,u]
674; AVX-NEXT:    vpextrd $2, %xmm0, 8(%rdi)
675; AVX-NEXT:    vmovq %xmm0, (%rdi)
676; AVX-NEXT:    retq
677;
678; XOP-LABEL: pr29025:
679; XOP:       # %bb.0:
680; XOP-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
681; XOP-NEXT:    vpperm {{.*#+}} xmm0 = xmm0[0,4],xmm2[0],xmm0[1,5],xmm2[1],xmm0[2,6],xmm2[2],xmm0[3,7],xmm2[3],xmm0[u,u,u,u]
682; XOP-NEXT:    vpextrd $2, %xmm0, 8(%rdi)
683; XOP-NEXT:    vmovq %xmm0, (%rdi)
684; XOP-NEXT:    retq
685  %s1 = shufflevector <4 x i8> %a, <4 x i8> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
686  %s2 = shufflevector <4 x i8> %c, <4 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>
687  %r = shufflevector <8 x i8> %s1, <8 x i8> %s2, <12 x i32> <i32 0, i32 4, i32 8, i32 1, i32 5, i32 9, i32 2, i32 6, i32 10, i32 3, i32 7, i32 11>
688  store <12 x i8> %r, <12 x i8>* %p, align 1
689  ret void
690}
691
692define void @interleave_24i8_out(<24 x i8>* %p, <8 x i8>* %q1, <8 x i8>* %q2, <8 x i8>* %q3) nounwind {
693; SSE2-LABEL: interleave_24i8_out:
694; SSE2:       # %bb.0:
695; SSE2-NEXT:    movdqu (%rdi), %xmm0
696; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
697; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [255,255,0,255,255,0,255,255,255,255,255,255,255,255,255,255]
698; SSE2-NEXT:    movdqa %xmm0, %xmm2
699; SSE2-NEXT:    pand %xmm4, %xmm2
700; SSE2-NEXT:    pandn %xmm1, %xmm4
701; SSE2-NEXT:    por %xmm2, %xmm4
702; SSE2-NEXT:    pxor %xmm2, %xmm2
703; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]
704; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [65535,0,65535,65535,0,65535,65535,0]
705; SSE2-NEXT:    pand %xmm5, %xmm4
706; SSE2-NEXT:    movdqa %xmm0, %xmm3
707; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15]
708; SSE2-NEXT:    pandn %xmm3, %xmm5
709; SSE2-NEXT:    por %xmm4, %xmm5
710; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[0,2,1,3]
711; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,7,6,5]
712; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,3,2,1]
713; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[0,3,2,1,4,5,6,7]
714; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,6,5,4,7]
715; SSE2-NEXT:    packuswb %xmm4, %xmm4
716; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [0,255,255,0,255,255,0,255,255,255,255,255,255,255,255,255]
717; SSE2-NEXT:    movdqa %xmm0, %xmm6
718; SSE2-NEXT:    pand %xmm5, %xmm6
719; SSE2-NEXT:    pandn %xmm1, %xmm5
720; SSE2-NEXT:    por %xmm6, %xmm5
721; SSE2-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1],xmm5[2],xmm2[2],xmm5[3],xmm2[3],xmm5[4],xmm2[4],xmm5[5],xmm2[5],xmm5[6],xmm2[6],xmm5[7],xmm2[7]
722; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [65535,65535,0,65535,65535,0,65535,65535]
723; SSE2-NEXT:    pand %xmm6, %xmm5
724; SSE2-NEXT:    pandn %xmm3, %xmm6
725; SSE2-NEXT:    por %xmm5, %xmm6
726; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm6[2,1,0,3,4,5,6,7]
727; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,6,5,4,7]
728; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[0,3,2,1]
729; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm5[1,2,3,0,4,5,6,7]
730; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,5,6,7,4]
731; SSE2-NEXT:    packuswb %xmm5, %xmm5
732; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [255,0,255,255,0,255,255,0,255,255,255,255,255,255,255,255]
733; SSE2-NEXT:    pand %xmm6, %xmm0
734; SSE2-NEXT:    pandn %xmm1, %xmm6
735; SSE2-NEXT:    por %xmm0, %xmm6
736; SSE2-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm2[0],xmm6[1],xmm2[1],xmm6[2],xmm2[2],xmm6[3],xmm2[3],xmm6[4],xmm2[4],xmm6[5],xmm2[5],xmm6[6],xmm2[6],xmm6[7],xmm2[7]
737; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [0,65535,65535,0,65535,65535,0,65535]
738; SSE2-NEXT:    pand %xmm0, %xmm6
739; SSE2-NEXT:    pandn %xmm3, %xmm0
740; SSE2-NEXT:    por %xmm6, %xmm0
741; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,0]
742; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,7,6,5]
743; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,0]
744; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,1,0,3,4,5,6,7]
745; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,5,4,7]
746; SSE2-NEXT:    packuswb %xmm0, %xmm0
747; SSE2-NEXT:    movq %xmm4, (%rsi)
748; SSE2-NEXT:    movq %xmm5, (%rdx)
749; SSE2-NEXT:    movq %xmm0, (%rcx)
750; SSE2-NEXT:    retq
751;
752; SSE42-LABEL: interleave_24i8_out:
753; SSE42:       # %bb.0:
754; SSE42-NEXT:    movdqu (%rdi), %xmm0
755; SSE42-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
756; SSE42-NEXT:    movdqa %xmm1, %xmm2
757; SSE42-NEXT:    pshufb {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,xmm2[2,5,u,u,u,u,u,u,u,u]
758; SSE42-NEXT:    movdqa %xmm0, %xmm3
759; SSE42-NEXT:    pshufb {{.*#+}} xmm3 = xmm3[0,3,6,9,12,15],zero,zero,xmm3[u,u,u,u,u,u,u,u]
760; SSE42-NEXT:    por %xmm2, %xmm3
761; SSE42-NEXT:    movdqa %xmm1, %xmm2
762; SSE42-NEXT:    pshufb {{.*#+}} xmm2 = zero,zero,zero,zero,zero,xmm2[0,3,6,u,u,u,u,u,u,u,u]
763; SSE42-NEXT:    movdqa %xmm0, %xmm4
764; SSE42-NEXT:    pshufb {{.*#+}} xmm4 = xmm4[1,4,7,10,13],zero,zero,zero,xmm4[u,u,u,u,u,u,u,u]
765; SSE42-NEXT:    por %xmm2, %xmm4
766; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = zero,zero,zero,zero,zero,xmm1[1,4,7,u,u,u,u,u,u,u,u]
767; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[2,5,8,11,14],zero,zero,zero,xmm0[u,u,u,u,u,u,u,u]
768; SSE42-NEXT:    por %xmm1, %xmm0
769; SSE42-NEXT:    movq %xmm3, (%rsi)
770; SSE42-NEXT:    movq %xmm4, (%rdx)
771; SSE42-NEXT:    movq %xmm0, (%rcx)
772; SSE42-NEXT:    retq
773;
774; AVX-LABEL: interleave_24i8_out:
775; AVX:       # %bb.0:
776; AVX-NEXT:    vmovdqu (%rdi), %xmm0
777; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
778; AVX-NEXT:    vpshufb {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,xmm1[2,5,u,u,u,u,u,u,u,u]
779; AVX-NEXT:    vpshufb {{.*#+}} xmm3 = xmm0[0,3,6,9,12,15],zero,zero,xmm0[u,u,u,u,u,u,u,u]
780; AVX-NEXT:    vpor %xmm2, %xmm3, %xmm2
781; AVX-NEXT:    vpshufb {{.*#+}} xmm3 = zero,zero,zero,zero,zero,xmm1[0,3,6,u,u,u,u,u,u,u,u]
782; AVX-NEXT:    vpshufb {{.*#+}} xmm4 = xmm0[1,4,7,10,13],zero,zero,zero,xmm0[u,u,u,u,u,u,u,u]
783; AVX-NEXT:    vpor %xmm3, %xmm4, %xmm3
784; AVX-NEXT:    vpshufb {{.*#+}} xmm1 = zero,zero,zero,zero,zero,xmm1[1,4,7,u,u,u,u,u,u,u,u]
785; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[2,5,8,11,14],zero,zero,zero,xmm0[u,u,u,u,u,u,u,u]
786; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
787; AVX-NEXT:    vmovq %xmm2, (%rsi)
788; AVX-NEXT:    vmovq %xmm3, (%rdx)
789; AVX-NEXT:    vmovq %xmm0, (%rcx)
790; AVX-NEXT:    retq
791;
792; XOP-LABEL: interleave_24i8_out:
793; XOP:       # %bb.0:
794; XOP-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
795; XOP-NEXT:    vmovdqu (%rdi), %xmm1
796; XOP-NEXT:    vpperm {{.*#+}} xmm2 = xmm1[0,3,6,9,12,15],xmm0[2,5],xmm1[u,u,u,u,u,u,u,u]
797; XOP-NEXT:    vpperm {{.*#+}} xmm3 = xmm1[1,4,7,10,13],xmm0[0,3,6],xmm1[u,u,u,u,u,u,u,u]
798; XOP-NEXT:    vpperm {{.*#+}} xmm0 = xmm1[2,5,8,11,14],xmm0[1,4,7],xmm1[u,u,u,u,u,u,u,u]
799; XOP-NEXT:    vmovq %xmm2, (%rsi)
800; XOP-NEXT:    vmovq %xmm3, (%rdx)
801; XOP-NEXT:    vmovq %xmm0, (%rcx)
802; XOP-NEXT:    retq
803  %wide.vec = load <24 x i8>, <24 x i8>* %p, align 4
804  %s1 = shufflevector <24 x i8> %wide.vec, <24 x i8> undef, <8 x i32> <i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21>
805  %s2 = shufflevector <24 x i8> %wide.vec, <24 x i8> undef, <8 x i32> <i32 1, i32 4, i32 7, i32 10, i32 13, i32 16, i32 19, i32 22>
806  %s3 = shufflevector <24 x i8> %wide.vec, <24 x i8> undef, <8 x i32> <i32 2, i32 5, i32 8, i32 11, i32 14, i32 17, i32 20, i32 23>
807  store <8 x i8> %s1, <8 x i8>* %q1, align 4
808  store <8 x i8> %s2, <8 x i8>* %q2, align 4
809  store <8 x i8> %s3, <8 x i8>* %q3, align 4
810  ret void
811}
812
813define void @interleave_24i8_in(<24 x i8>* %p, <8 x i8>* %q1, <8 x i8>* %q2, <8 x i8>* %q3) nounwind {
814; SSE2-LABEL: interleave_24i8_in:
815; SSE2:       # %bb.0:
816; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
817; SSE2-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero
818; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
819; SSE2-NEXT:    pxor %xmm3, %xmm3
820; 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]
821; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,2,2]
822; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [65535,65535,0,65535,65535,0,65535,65535]
823; SSE2-NEXT:    pand %xmm5, %xmm4
824; 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]
825; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm2[3,3,3,3,4,5,6,7]
826; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,4,4,4]
827; SSE2-NEXT:    pandn %xmm3, %xmm5
828; SSE2-NEXT:    por %xmm4, %xmm5
829; SSE2-NEXT:    movdqa %xmm1, %xmm3
830; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
831; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,1,2,1]
832; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,1,2,2,4,5,6,7]
833; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,5,4,5]
834; SSE2-NEXT:    packuswb %xmm5, %xmm3
835; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [255,255,0,255,255,0,255,255,0,255,255,0,255,255,0,255]
836; SSE2-NEXT:    pand %xmm4, %xmm3
837; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,1,0,1]
838; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm5[0,0,0,0,4,5,6,7]
839; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,5,5,6,6]
840; SSE2-NEXT:    pandn %xmm5, %xmm4
841; SSE2-NEXT:    por %xmm3, %xmm4
842; SSE2-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
843; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,1,3,3]
844; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[2,1,1,0,4,5,6,7]
845; SSE2-NEXT:    packuswb %xmm1, %xmm1
846; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,0,255,255,0,255,255,0,255,255,255,255,255,255,255,255]
847; SSE2-NEXT:    pand %xmm2, %xmm1
848; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,1,3,3,4,5,6,7]
849; SSE2-NEXT:    pandn %xmm0, %xmm2
850; SSE2-NEXT:    por %xmm1, %xmm2
851; SSE2-NEXT:    movq %xmm2, 16(%rdi)
852; SSE2-NEXT:    movdqu %xmm4, (%rdi)
853; SSE2-NEXT:    retq
854;
855; SSE42-LABEL: interleave_24i8_in:
856; SSE42:       # %bb.0:
857; SSE42-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
858; SSE42-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
859; SSE42-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
860; SSE42-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
861; SSE42-NEXT:    movdqa %xmm0, %xmm2
862; SSE42-NEXT:    pshufb {{.*#+}} xmm2 = xmm2[0,8],zero,xmm2[1,9],zero,xmm2[2,10],zero,xmm2[3,11],zero,xmm2[4,12],zero,xmm2[5]
863; SSE42-NEXT:    movdqa %xmm1, %xmm3
864; SSE42-NEXT:    pshufb {{.*#+}} xmm3 = zero,zero,xmm3[0],zero,zero,xmm3[1],zero,zero,xmm3[2],zero,zero,xmm3[3],zero,zero,xmm3[4],zero
865; SSE42-NEXT:    por %xmm2, %xmm3
866; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[13],zero,xmm0[6,14],zero,xmm0[7,15],zero,xmm0[u,u,u,u,u,u,u,u]
867; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = zero,xmm1[5],zero,zero,xmm1[6],zero,zero,xmm1[7,u,u,u,u,u,u,u,u]
868; SSE42-NEXT:    por %xmm0, %xmm1
869; SSE42-NEXT:    movq %xmm1, 16(%rdi)
870; SSE42-NEXT:    movdqu %xmm3, (%rdi)
871; SSE42-NEXT:    retq
872;
873; AVX-LABEL: interleave_24i8_in:
874; AVX:       # %bb.0:
875; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
876; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
877; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
878; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
879; AVX-NEXT:    vpshufb {{.*#+}} xmm2 = xmm0[0,8],zero,xmm0[1,9],zero,xmm0[2,10],zero,xmm0[3,11],zero,xmm0[4,12],zero,xmm0[5]
880; AVX-NEXT:    vpshufb {{.*#+}} xmm3 = zero,zero,xmm1[0],zero,zero,xmm1[1],zero,zero,xmm1[2],zero,zero,xmm1[3],zero,zero,xmm1[4],zero
881; AVX-NEXT:    vpor %xmm3, %xmm2, %xmm2
882; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[13],zero,xmm0[6,14],zero,xmm0[7,15],zero,xmm0[u,u,u,u,u,u,u,u]
883; AVX-NEXT:    vpshufb {{.*#+}} xmm1 = zero,xmm1[5],zero,zero,xmm1[6],zero,zero,xmm1[7,u,u,u,u,u,u,u,u]
884; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
885; AVX-NEXT:    vmovq %xmm0, 16(%rdi)
886; AVX-NEXT:    vmovdqu %xmm2, (%rdi)
887; AVX-NEXT:    retq
888;
889; XOP-LABEL: interleave_24i8_in:
890; XOP:       # %bb.0:
891; XOP-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
892; XOP-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
893; XOP-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
894; XOP-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
895; XOP-NEXT:    vpperm {{.*#+}} xmm2 = xmm0[0,8],xmm1[0],xmm0[1,9],xmm1[1],xmm0[2,10],xmm1[2],xmm0[3,11],xmm1[3],xmm0[4,12],xmm1[4],xmm0[5]
896; XOP-NEXT:    vpperm {{.*#+}} xmm0 = xmm0[13],xmm1[5],xmm0[6,14],xmm1[6],xmm0[7,15],xmm1[7],xmm0[u,u,u,u,u,u,u,u]
897; XOP-NEXT:    vmovq %xmm0, 16(%rdi)
898; XOP-NEXT:    vmovdqu %xmm2, (%rdi)
899; XOP-NEXT:    retq
900  %s1 = load <8 x i8>, <8 x i8>* %q1, align 4
901  %s2 = load <8 x i8>, <8 x i8>* %q2, align 4
902  %s3 = load <8 x i8>, <8 x i8>* %q3, align 4
903  %t1 = shufflevector <8 x i8> %s1, <8 x i8> %s2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
904  %t2 = shufflevector <8 x i8> %s3, <8 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
905  %interleaved = shufflevector <16 x i8> %t1, <16 x i8> %t2, <24 x i32> <i32 0, i32 8, i32 16, i32 1, i32 9, i32 17, i32 2, i32 10, i32 18, i32 3, i32 11, i32 19, i32 4, i32 12, i32 20, i32 5, i32 13, i32 21, i32 6, i32 14, i32 22, i32 7, i32 15, i32 23>
906  store <24 x i8> %interleaved, <24 x i8>* %p, align 4
907  ret void
908}
909
910
911define void @interleave_24i16_out(<24 x i16>* %p, <8 x i16>* %q1, <8 x i16>* %q2, <8 x i16>* %q3) nounwind {
912; SSE2-LABEL: interleave_24i16_out:
913; SSE2:       # %bb.0:
914; SSE2-NEXT:    movdqu (%rdi), %xmm3
915; SSE2-NEXT:    movdqu 16(%rdi), %xmm2
916; SSE2-NEXT:    movdqu 32(%rdi), %xmm8
917; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [65535,0,65535,65535,0,65535,65535,0]
918; SSE2-NEXT:    movdqa %xmm3, %xmm4
919; SSE2-NEXT:    pand %xmm1, %xmm4
920; SSE2-NEXT:    pandn %xmm2, %xmm1
921; SSE2-NEXT:    por %xmm4, %xmm1
922; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,1,3]
923; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,6,5,6,7]
924; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,1,3]
925; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,3,2,1,4,5,6,7]
926; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm2[0,1,2,3,4,7,6,7]
927; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm8[0,1,2,1]
928; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,4,5,6,5]
929; SSE2-NEXT:    shufps {{.*#+}} xmm5 = xmm5[3,0],xmm4[2,0]
930; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm5[2,0]
931; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [65535,65535,0,65535,65535,0,65535,65535]
932; SSE2-NEXT:    movdqa %xmm4, %xmm5
933; SSE2-NEXT:    pandn %xmm2, %xmm5
934; SSE2-NEXT:    movdqa %xmm3, %xmm6
935; SSE2-NEXT:    pand %xmm4, %xmm6
936; SSE2-NEXT:    por %xmm5, %xmm6
937; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm6[2,1,2,3,4,5,6,7]
938; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,4,5,4,7]
939; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[0,3,2,3]
940; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm5[1,2,3,0,4,5,6,7]
941; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,5,5,5,5]
942; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [65535,65535,65535,65535,65535,0,0,0]
943; SSE2-NEXT:    pand %xmm6, %xmm5
944; SSE2-NEXT:    pshuflw {{.*#+}} xmm7 = xmm8[0,3,2,3,4,5,6,7]
945; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[0,1,0,3]
946; SSE2-NEXT:    pshufhw {{.*#+}} xmm7 = xmm7[0,1,2,3,4,4,5,6]
947; SSE2-NEXT:    movdqa %xmm6, %xmm0
948; SSE2-NEXT:    pandn %xmm7, %xmm0
949; SSE2-NEXT:    por %xmm5, %xmm0
950; SSE2-NEXT:    pand %xmm4, %xmm2
951; SSE2-NEXT:    pandn %xmm3, %xmm4
952; SSE2-NEXT:    por %xmm2, %xmm4
953; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[3,1,2,0]
954; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,6,5,6,7]
955; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,1,0,3]
956; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[2,1,0,3,4,5,6,7]
957; SSE2-NEXT:    pand %xmm6, %xmm2
958; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm8[0,1,2,3,4,7,6,7]
959; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,1,2,0]
960; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,7,4,5]
961; SSE2-NEXT:    pandn %xmm3, %xmm6
962; SSE2-NEXT:    por %xmm2, %xmm6
963; SSE2-NEXT:    movups %xmm1, (%rsi)
964; SSE2-NEXT:    movdqu %xmm0, (%rdx)
965; SSE2-NEXT:    movdqu %xmm6, (%rcx)
966; SSE2-NEXT:    retq
967;
968; SSE42-LABEL: interleave_24i16_out:
969; SSE42:       # %bb.0:
970; SSE42-NEXT:    movdqu (%rdi), %xmm0
971; SSE42-NEXT:    movdqu 16(%rdi), %xmm1
972; SSE42-NEXT:    movdqu 32(%rdi), %xmm2
973; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,1,2,1]
974; SSE42-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,5,6,5]
975; SSE42-NEXT:    movdqa %xmm0, %xmm4
976; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0],xmm1[1],xmm4[2,3],xmm1[4],xmm4[5,6],xmm1[7]
977; SSE42-NEXT:    pshufb {{.*#+}} xmm4 = xmm4[0,1,6,7,12,13,2,3,8,9,14,15,u,u,u,u]
978; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,5],xmm3[6,7]
979; SSE42-NEXT:    movdqa %xmm2, %xmm3
980; SSE42-NEXT:    pshufb {{.*#+}} xmm3 = xmm3[u,u,u,u,u,u,u,u,u,u,0,1,6,7,12,13]
981; SSE42-NEXT:    movdqa %xmm0, %xmm5
982; SSE42-NEXT:    pblendw {{.*#+}} xmm5 = xmm5[0,1],xmm1[2],xmm5[3,4],xmm1[5],xmm5[6,7]
983; SSE42-NEXT:    pshufb {{.*#+}} xmm5 = xmm5[2,3,8,9,14,15,4,5,10,11,u,u,u,u,u,u]
984; SSE42-NEXT:    pblendw {{.*#+}} xmm5 = xmm5[0,1,2,3,4],xmm3[5,6,7]
985; SSE42-NEXT:    pshufb {{.*#+}} xmm2 = xmm2[u,u,u,u,u,u,u,u,u,u,2,3,8,9,14,15]
986; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm0[2],xmm1[3,4],xmm0[5],xmm1[6,7]
987; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[4,5,10,11,0,1,6,7,12,13,u,u,u,u,u,u]
988; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3,4],xmm2[5,6,7]
989; SSE42-NEXT:    movdqu %xmm4, (%rsi)
990; SSE42-NEXT:    movdqu %xmm5, (%rdx)
991; SSE42-NEXT:    movdqu %xmm1, (%rcx)
992; SSE42-NEXT:    retq
993;
994; AVX1-LABEL: interleave_24i16_out:
995; AVX1:       # %bb.0:
996; AVX1-NEXT:    vmovdqu (%rdi), %xmm0
997; AVX1-NEXT:    vmovdqu 16(%rdi), %xmm1
998; AVX1-NEXT:    vmovdqu 32(%rdi), %xmm2
999; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm2[0,1,2,1]
1000; AVX1-NEXT:    vpshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,5,6,5]
1001; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7]
1002; AVX1-NEXT:    vpshufb {{.*#+}} xmm4 = xmm4[0,1,6,7,12,13,2,3,8,9,14,15,u,u,u,u]
1003; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3,4,5],xmm3[6,7]
1004; AVX1-NEXT:    vpshufb {{.*#+}} xmm4 = xmm2[u,u,u,u,u,u,u,u,u,u,0,1,6,7,12,13]
1005; AVX1-NEXT:    vpblendw {{.*#+}} xmm5 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7]
1006; AVX1-NEXT:    vpshufb {{.*#+}} xmm5 = xmm5[2,3,8,9,14,15,4,5,10,11,u,u,u,u,u,u]
1007; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3,4],xmm4[5,6,7]
1008; AVX1-NEXT:    vpshufb {{.*#+}} xmm2 = xmm2[u,u,u,u,u,u,u,u,u,u,2,3,8,9,14,15]
1009; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2],xmm1[3,4],xmm0[5],xmm1[6,7]
1010; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,10,11,0,1,6,7,12,13,u,u,u,u,u,u]
1011; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4],xmm2[5,6,7]
1012; AVX1-NEXT:    vmovdqu %xmm3, (%rsi)
1013; AVX1-NEXT:    vmovdqu %xmm4, (%rdx)
1014; AVX1-NEXT:    vmovdqu %xmm0, (%rcx)
1015; AVX1-NEXT:    retq
1016;
1017; AVX2-LABEL: interleave_24i16_out:
1018; AVX2:       # %bb.0:
1019; AVX2-NEXT:    vmovdqu (%rdi), %xmm0
1020; AVX2-NEXT:    vmovdqu 16(%rdi), %xmm1
1021; AVX2-NEXT:    vmovdqu 32(%rdi), %xmm2
1022; AVX2-NEXT:    vpblendw {{.*#+}} xmm3 = xmm0[0,1],xmm2[2],xmm0[3,4],xmm2[5],xmm0[6,7]
1023; AVX2-NEXT:    vpblendw {{.*#+}} xmm3 = xmm3[0],xmm1[1],xmm3[2,3],xmm1[4],xmm3[5,6],xmm1[7]
1024; AVX2-NEXT:    vpshufb {{.*#+}} xmm3 = xmm3[0,1,6,7,12,13,2,3,8,9,14,15,4,5,10,11]
1025; AVX2-NEXT:    vpblendw {{.*#+}} xmm4 = xmm2[0],xmm0[1,2],xmm2[3],xmm0[4,5],xmm2[6],xmm0[7]
1026; AVX2-NEXT:    vpblendw {{.*#+}} xmm4 = xmm4[0,1],xmm1[2],xmm4[3,4],xmm1[5],xmm4[6,7]
1027; AVX2-NEXT:    vpshufb {{.*#+}} xmm4 = xmm4[2,3,8,9,14,15,4,5,10,11,0,1,6,7,12,13]
1028; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2,3],xmm2[4],xmm0[5,6],xmm2[7]
1029; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3],xmm0[4,5],xmm1[6],xmm0[7]
1030; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,10,11,0,1,6,7,12,13,2,3,8,9,14,15]
1031; AVX2-NEXT:    vmovdqu %xmm3, (%rsi)
1032; AVX2-NEXT:    vmovdqu %xmm4, (%rdx)
1033; AVX2-NEXT:    vmovdqu %xmm0, (%rcx)
1034; AVX2-NEXT:    retq
1035;
1036; XOP-LABEL: interleave_24i16_out:
1037; XOP:       # %bb.0:
1038; XOP-NEXT:    vmovdqu (%rdi), %xmm0
1039; XOP-NEXT:    vmovdqu 16(%rdi), %xmm1
1040; XOP-NEXT:    vmovdqu 32(%rdi), %xmm2
1041; XOP-NEXT:    vpblendw {{.*#+}} xmm3 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7]
1042; XOP-NEXT:    vpperm {{.*#+}} xmm3 = xmm3[0,1,6,7,12,13,2,3,8,9,14,15],xmm2[4,5,10,11]
1043; XOP-NEXT:    vpblendw {{.*#+}} xmm4 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7]
1044; XOP-NEXT:    vpperm {{.*#+}} xmm4 = xmm4[2,3,8,9,14,15,4,5,10,11],xmm2[0,1,6,7,12,13]
1045; XOP-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2],xmm1[3,4],xmm0[5],xmm1[6,7]
1046; XOP-NEXT:    vpperm {{.*#+}} xmm0 = xmm0[4,5,10,11,0,1,6,7,12,13],xmm2[2,3,8,9,14,15]
1047; XOP-NEXT:    vmovdqu %xmm3, (%rsi)
1048; XOP-NEXT:    vmovdqu %xmm4, (%rdx)
1049; XOP-NEXT:    vmovdqu %xmm0, (%rcx)
1050; XOP-NEXT:    retq
1051  %wide.vec = load <24 x i16>, <24 x i16>* %p, align 4
1052  %s1 = shufflevector <24 x i16> %wide.vec, <24 x i16> undef, <8 x i32> <i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21>
1053  %s2 = shufflevector <24 x i16> %wide.vec, <24 x i16> undef, <8 x i32> <i32 1, i32 4, i32 7, i32 10, i32 13, i32 16, i32 19, i32 22>
1054  %s3 = shufflevector <24 x i16> %wide.vec, <24 x i16> undef, <8 x i32> <i32 2, i32 5, i32 8, i32 11, i32 14, i32 17, i32 20, i32 23>
1055  store <8 x i16> %s1, <8 x i16>* %q1, align 4
1056  store <8 x i16> %s2, <8 x i16>* %q2, align 4
1057  store <8 x i16> %s3, <8 x i16>* %q3, align 4
1058  ret void
1059}
1060
1061define void @interleave_24i16_out_reverse(<24 x i16>* %p, <8 x i16>* %q1, <8 x i16>* %q2, <8 x i16>* %q3) nounwind {
1062; SSE2-LABEL: interleave_24i16_out_reverse:
1063; SSE2:       # %bb.0:
1064; SSE2-NEXT:    movdqu (%rdi), %xmm8
1065; SSE2-NEXT:    movdqu 16(%rdi), %xmm1
1066; SSE2-NEXT:    movdqu 32(%rdi), %xmm3
1067; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [65535,0,65535,65535,0,65535,65535,0]
1068; SSE2-NEXT:    movdqa %xmm1, %xmm4
1069; SSE2-NEXT:    pand %xmm2, %xmm4
1070; SSE2-NEXT:    pandn %xmm3, %xmm2
1071; SSE2-NEXT:    por %xmm4, %xmm2
1072; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,1,3]
1073; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[2,1,0,3,4,5,6,7]
1074; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,3,2,1]
1075; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm2[0,1,2,3,5,6,6,7]
1076; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm8[0,1,2,1]
1077; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,4,5,5,6]
1078; SSE2-NEXT:    shufps {{.*#+}} xmm5 = xmm5[3,0],xmm4[2,0]
1079; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[3,0,1,2,4,5,6,7]
1080; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,1],xmm5[2,0]
1081; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [65535,65535,0,65535,65535,0,65535,65535]
1082; SSE2-NEXT:    movdqa %xmm4, %xmm5
1083; SSE2-NEXT:    pandn %xmm1, %xmm5
1084; SSE2-NEXT:    movdqa %xmm3, %xmm6
1085; SSE2-NEXT:    pand %xmm4, %xmm6
1086; SSE2-NEXT:    por %xmm5, %xmm6
1087; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm6[0,3,2,3,4,5,6,7]
1088; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,6,5,6,7]
1089; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[0,2,1,1]
1090; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm5[2,1,0,3,4,5,6,7]
1091; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [65535,65535,65535,65535,65535,0,0,0]
1092; SSE2-NEXT:    pand %xmm6, %xmm5
1093; SSE2-NEXT:    pshufhw {{.*#+}} xmm7 = xmm8[0,1,2,3,4,7,6,7]
1094; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[0,1,2,0]
1095; SSE2-NEXT:    pshufhw {{.*#+}} xmm7 = xmm7[0,1,2,3,4,5,4,7]
1096; SSE2-NEXT:    movdqa %xmm6, %xmm0
1097; SSE2-NEXT:    pandn %xmm7, %xmm0
1098; SSE2-NEXT:    por %xmm5, %xmm0
1099; SSE2-NEXT:    pand %xmm4, %xmm1
1100; SSE2-NEXT:    pandn %xmm3, %xmm4
1101; SSE2-NEXT:    por %xmm1, %xmm4
1102; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[3,1,2,0]
1103; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[2,1,2,3,4,5,6,7]
1104; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
1105; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[3,0,1,2,4,5,6,7]
1106; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,7,7,7]
1107; SSE2-NEXT:    pand %xmm6, %xmm1
1108; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm8[0,3,2,3,4,5,6,7]
1109; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,1,0,3]
1110; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,6,5,4]
1111; SSE2-NEXT:    pandn %xmm3, %xmm6
1112; SSE2-NEXT:    por %xmm1, %xmm6
1113; SSE2-NEXT:    movups %xmm2, (%rsi)
1114; SSE2-NEXT:    movdqu %xmm0, (%rdx)
1115; SSE2-NEXT:    movdqu %xmm6, (%rcx)
1116; SSE2-NEXT:    retq
1117;
1118; SSE42-LABEL: interleave_24i16_out_reverse:
1119; SSE42:       # %bb.0:
1120; SSE42-NEXT:    movdqu (%rdi), %xmm0
1121; SSE42-NEXT:    movdqu 16(%rdi), %xmm1
1122; SSE42-NEXT:    movdqu 32(%rdi), %xmm2
1123; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,1,2,1]
1124; SSE42-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,5,5,6]
1125; SSE42-NEXT:    movdqa %xmm1, %xmm4
1126; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0],xmm2[1],xmm4[2,3],xmm2[4],xmm4[5,6],xmm2[7]
1127; SSE42-NEXT:    pshufb {{.*#+}} xmm4 = xmm4[14,15,8,9,2,3,12,13,6,7,0,1,u,u,u,u]
1128; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,5],xmm3[6,7]
1129; SSE42-NEXT:    movdqa %xmm0, %xmm3
1130; SSE42-NEXT:    pshufb {{.*#+}} xmm3 = xmm3[u,u,u,u,u,u,u,u,u,u,14,15,8,9,2,3]
1131; SSE42-NEXT:    movdqa %xmm2, %xmm5
1132; SSE42-NEXT:    pblendw {{.*#+}} xmm5 = xmm5[0,1],xmm1[2],xmm5[3,4],xmm1[5],xmm5[6,7]
1133; SSE42-NEXT:    pshufb {{.*#+}} xmm5 = xmm5[12,13,6,7,0,1,10,11,4,5,u,u,u,u,u,u]
1134; SSE42-NEXT:    pblendw {{.*#+}} xmm5 = xmm5[0,1,2,3,4],xmm3[5,6,7]
1135; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[u,u,u,u,u,u,u,u,u,u,12,13,6,7,0,1]
1136; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2],xmm1[3,4],xmm2[5],xmm1[6,7]
1137; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[10,11,4,5,14,15,8,9,2,3,u,u,u,u,u,u]
1138; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3,4],xmm0[5,6,7]
1139; SSE42-NEXT:    movdqu %xmm4, (%rsi)
1140; SSE42-NEXT:    movdqu %xmm5, (%rdx)
1141; SSE42-NEXT:    movdqu %xmm1, (%rcx)
1142; SSE42-NEXT:    retq
1143;
1144; AVX1-LABEL: interleave_24i16_out_reverse:
1145; AVX1:       # %bb.0:
1146; AVX1-NEXT:    vmovdqu (%rdi), %xmm0
1147; AVX1-NEXT:    vmovdqu 16(%rdi), %xmm1
1148; AVX1-NEXT:    vmovdqu 32(%rdi), %xmm2
1149; AVX1-NEXT:    vpshufb {{.*#+}} xmm3 = xmm2[14,15,8,9,2,3,u,u,u,u,u,u,u,u,u,u]
1150; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm1[0,1],xmm0[2],xmm1[3,4],xmm0[5],xmm1[6,7]
1151; AVX1-NEXT:    vpshufb {{.*#+}} xmm4 = xmm4[u,u,u,u,u,u,12,13,6,7,0,1,10,11,4,5]
1152; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm3[0,1,2],xmm4[3,4,5,6,7]
1153; AVX1-NEXT:    vpshufb {{.*#+}} xmm4 = xmm2[12,13,6,7,0,1,u,u,u,u,u,u,u,u,u,u]
1154; AVX1-NEXT:    vpblendw {{.*#+}} xmm5 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7]
1155; AVX1-NEXT:    vpshufb {{.*#+}} xmm5 = xmm5[u,u,u,u,u,u,10,11,4,5,14,15,8,9,2,3]
1156; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm4[0,1,2],xmm5[3,4,5,6,7]
1157; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[2,1,2,3]
1158; AVX1-NEXT:    vpshuflw {{.*#+}} xmm2 = xmm2[1,2,2,3,4,5,6,7]
1159; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7]
1160; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[u,u,u,u,14,15,8,9,2,3,12,13,6,7,0,1]
1161; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3,4,5,6,7]
1162; AVX1-NEXT:    vmovdqu %xmm3, (%rsi)
1163; AVX1-NEXT:    vmovdqu %xmm4, (%rdx)
1164; AVX1-NEXT:    vmovdqu %xmm0, (%rcx)
1165; AVX1-NEXT:    retq
1166;
1167; AVX2-LABEL: interleave_24i16_out_reverse:
1168; AVX2:       # %bb.0:
1169; AVX2-NEXT:    vmovdqu (%rdi), %xmm0
1170; AVX2-NEXT:    vmovdqu 16(%rdi), %xmm1
1171; AVX2-NEXT:    vmovdqu 32(%rdi), %xmm2
1172; AVX2-NEXT:    vpblendw {{.*#+}} xmm3 = xmm0[0],xmm2[1],xmm0[2,3],xmm2[4],xmm0[5,6],xmm2[7]
1173; AVX2-NEXT:    vpblendw {{.*#+}} xmm3 = xmm1[0],xmm3[1,2],xmm1[3],xmm3[4,5],xmm1[6],xmm3[7]
1174; AVX2-NEXT:    vpshufb {{.*#+}} xmm3 = xmm3[14,15,8,9,2,3,12,13,6,7,0,1,10,11,4,5]
1175; AVX2-NEXT:    vpblendw {{.*#+}} xmm4 = xmm2[0],xmm0[1,2],xmm2[3],xmm0[4,5],xmm2[6],xmm0[7]
1176; AVX2-NEXT:    vpblendw {{.*#+}} xmm4 = xmm4[0,1],xmm1[2],xmm4[3,4],xmm1[5],xmm4[6,7]
1177; AVX2-NEXT:    vpshufb {{.*#+}} xmm4 = xmm4[12,13,6,7,0,1,10,11,4,5,14,15,8,9,2,3]
1178; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2],xmm0[3,4],xmm2[5],xmm0[6,7]
1179; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7]
1180; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[10,11,4,5,14,15,8,9,2,3,12,13,6,7,0,1]
1181; AVX2-NEXT:    vmovdqu %xmm3, (%rsi)
1182; AVX2-NEXT:    vmovdqu %xmm4, (%rdx)
1183; AVX2-NEXT:    vmovdqu %xmm0, (%rcx)
1184; AVX2-NEXT:    retq
1185;
1186; XOP-LABEL: interleave_24i16_out_reverse:
1187; XOP:       # %bb.0:
1188; XOP-NEXT:    vmovdqu (%rdi), %xmm0
1189; XOP-NEXT:    vmovdqu 16(%rdi), %xmm1
1190; XOP-NEXT:    vmovdqu 32(%rdi), %xmm2
1191; XOP-NEXT:    vpblendw {{.*#+}} xmm3 = xmm1[0,1],xmm0[2],xmm1[3,4],xmm0[5],xmm1[6,7]
1192; XOP-NEXT:    vpperm {{.*#+}} xmm3 = xmm2[14,15,8,9,2,3],xmm3[12,13,6,7,0,1,10,11,4,5]
1193; XOP-NEXT:    vpblendw {{.*#+}} xmm4 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7]
1194; XOP-NEXT:    vpperm {{.*#+}} xmm4 = xmm2[12,13,6,7,0,1],xmm4[10,11,4,5,14,15,8,9,2,3]
1195; XOP-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7]
1196; XOP-NEXT:    vpperm {{.*#+}} xmm0 = xmm2[10,11,4,5],xmm0[14,15,8,9,2,3,12,13,6,7,0,1]
1197; XOP-NEXT:    vmovdqu %xmm3, (%rsi)
1198; XOP-NEXT:    vmovdqu %xmm4, (%rdx)
1199; XOP-NEXT:    vmovdqu %xmm0, (%rcx)
1200; XOP-NEXT:    retq
1201  %wide.vec.reverse = load <24 x i16>, <24 x i16>* %p, align 4
1202  %wide.vec = shufflevector <24 x i16> %wide.vec.reverse, <24 x i16> undef, <24 x i32> <i32 23, i32 22, i32 21, i32 20, i32 19, i32 18, i32 17, i32 16, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
1203  %s1 = shufflevector <24 x i16> %wide.vec, <24 x i16> undef, <8 x i32> <i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21>
1204  %s2 = shufflevector <24 x i16> %wide.vec, <24 x i16> undef, <8 x i32> <i32 1, i32 4, i32 7, i32 10, i32 13, i32 16, i32 19, i32 22>
1205  %s3 = shufflevector <24 x i16> %wide.vec, <24 x i16> undef, <8 x i32> <i32 2, i32 5, i32 8, i32 11, i32 14, i32 17, i32 20, i32 23>
1206  store <8 x i16> %s1, <8 x i16>* %q1, align 4
1207  store <8 x i16> %s2, <8 x i16>* %q2, align 4
1208  store <8 x i16> %s3, <8 x i16>* %q3, align 4
1209  ret void
1210}
1211
1212define void @interleave_24i16_in(<24 x i16>* %p, <8 x i16>* %q1, <8 x i16>* %q2, <8 x i16>* %q3) nounwind {
1213; SSE2-LABEL: interleave_24i16_in:
1214; SSE2:       # %bb.0:
1215; SSE2-NEXT:    movdqu (%rsi), %xmm3
1216; SSE2-NEXT:    movdqu (%rdx), %xmm2
1217; SSE2-NEXT:    movdqu (%rcx), %xmm1
1218; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,0,0,0]
1219; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [65535,65535,0,65535,65535,0,65535,65535]
1220; SSE2-NEXT:    movdqa %xmm0, %xmm5
1221; SSE2-NEXT:    pandn %xmm4, %xmm5
1222; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[3,3,3,3]
1223; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[1,1,2,2]
1224; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
1225; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,1,2,1]
1226; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,1,2,2,4,5,6,7]
1227; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,5,4,5]
1228; SSE2-NEXT:    pand %xmm0, %xmm3
1229; SSE2-NEXT:    por %xmm5, %xmm3
1230; SSE2-NEXT:    movdqa %xmm0, %xmm5
1231; SSE2-NEXT:    pandn %xmm4, %xmm5
1232; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm2[3,3,3,3,4,5,6,7]
1233; SSE2-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
1234; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,1,2,3]
1235; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[2,3,2,0,4,5,6,7]
1236; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,5,6,7]
1237; SSE2-NEXT:    pand %xmm0, %xmm2
1238; SSE2-NEXT:    por %xmm5, %xmm2
1239; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [65535,0,65535,65535,0,65535,65535,0]
1240; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,2,2]
1241; SSE2-NEXT:    pand %xmm5, %xmm1
1242; SSE2-NEXT:    pandn %xmm6, %xmm5
1243; SSE2-NEXT:    por %xmm1, %xmm5
1244; SSE2-NEXT:    pand %xmm0, %xmm5
1245; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm4[0,1,2,3,4,4,4,4]
1246; SSE2-NEXT:    pandn %xmm1, %xmm0
1247; SSE2-NEXT:    por %xmm5, %xmm0
1248; SSE2-NEXT:    movdqu %xmm0, 16(%rdi)
1249; SSE2-NEXT:    movdqu %xmm2, 32(%rdi)
1250; SSE2-NEXT:    movdqu %xmm3, (%rdi)
1251; SSE2-NEXT:    retq
1252;
1253; SSE42-LABEL: interleave_24i16_in:
1254; SSE42:       # %bb.0:
1255; SSE42-NEXT:    movdqu (%rsi), %xmm0
1256; SSE42-NEXT:    movdqu (%rdx), %xmm1
1257; SSE42-NEXT:    movdqu (%rcx), %xmm2
1258; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,2,2]
1259; SSE42-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[3,3,3,3]
1260; SSE42-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1261; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,u,u,4,5,6,7,u,u,8,9,10,11]
1262; SSE42-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,0,0]
1263; SSE42-NEXT:    pblendw {{.*#+}} xmm5 = xmm0[0,1],xmm5[2],xmm0[3,4],xmm5[5],xmm0[6,7]
1264; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,2,2]
1265; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm3[1],xmm0[2,3],xmm3[4],xmm0[5,6],xmm3[7]
1266; SSE42-NEXT:    pshuflw {{.*#+}} xmm3 = xmm1[3,3,3,3,4,5,6,7]
1267; SSE42-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,4,4,4]
1268; SSE42-NEXT:    pblendw {{.*#+}} xmm3 = xmm0[0,1],xmm3[2],xmm0[3,4],xmm3[5],xmm0[6,7]
1269; SSE42-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1270; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[4,5,6,7,u,u,8,9,10,11,u,u,12,13,14,15]
1271; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm1[0,1],xmm4[2],xmm1[3,4],xmm4[5],xmm1[6,7]
1272; SSE42-NEXT:    movdqu %xmm4, 32(%rdi)
1273; SSE42-NEXT:    movdqu %xmm3, 16(%rdi)
1274; SSE42-NEXT:    movdqu %xmm5, (%rdi)
1275; SSE42-NEXT:    retq
1276;
1277; AVX1-LABEL: interleave_24i16_in:
1278; AVX1:       # %bb.0:
1279; AVX1-NEXT:    vmovdqu (%rsi), %xmm0
1280; AVX1-NEXT:    vmovdqu (%rdx), %xmm1
1281; AVX1-NEXT:    vmovdqu (%rcx), %xmm2
1282; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,2,2]
1283; AVX1-NEXT:    vpshuflw {{.*#+}} xmm4 = xmm1[3,3,3,3,4,5,6,7]
1284; AVX1-NEXT:    vpshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,4,4,4]
1285; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2],xmm3[3,4],xmm4[5],xmm3[6,7]
1286; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm2[1,1,2,2]
1287; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0],xmm3[1,2],xmm4[3],xmm3[4,5],xmm4[6],xmm3[7]
1288; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm4 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1289; AVX1-NEXT:    vpshufb {{.*#+}} xmm4 = xmm4[4,5,u,u,10,11,8,9,u,u,14,15,12,13,u,u]
1290; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm2[2,2,3,3]
1291; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm4[0],xmm5[1],xmm4[2,3],xmm5[4],xmm4[5,6],xmm5[7]
1292; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1293; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,u,u,4,5,6,7,u,u,8,9,10,11]
1294; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm2[0,0,0,0]
1295; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7]
1296; AVX1-NEXT:    vmovdqu %xmm0, (%rdi)
1297; AVX1-NEXT:    vmovdqu %xmm4, 32(%rdi)
1298; AVX1-NEXT:    vmovdqu %xmm3, 16(%rdi)
1299; AVX1-NEXT:    retq
1300;
1301; AVX2-SLOW-LABEL: interleave_24i16_in:
1302; AVX2-SLOW:       # %bb.0:
1303; AVX2-SLOW-NEXT:    vmovdqu (%rsi), %xmm0
1304; AVX2-SLOW-NEXT:    vmovdqu (%rdx), %xmm1
1305; AVX2-SLOW-NEXT:    vmovdqu (%rcx), %xmm2
1306; AVX2-SLOW-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm3
1307; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} ymm4 = ymm3[0,1,u,u,6,7,2,3,u,u,8,9,4,5,u,u,16,17,u,u,22,23,18,19,u,u,24,25,20,21,u,u]
1308; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm3 = ymm3[2,3,0,1]
1309; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} ymm3 = ymm3[u,u,0,1,u,u,u,u,2,3,u,u,u,u,4,5,u,u,22,23,u,u,u,u,24,25,u,u,u,u,26,27]
1310; AVX2-SLOW-NEXT:    vpblendw {{.*#+}} ymm3 = ymm4[0],ymm3[1],ymm4[2,3],ymm3[4],ymm4[5,6],ymm3[7],ymm4[8],ymm3[9],ymm4[10,11],ymm3[12],ymm4[13,14],ymm3[15]
1311; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} ymm4 = <u,0,0,u,1,1,u,2>
1312; AVX2-SLOW-NEXT:    vpermd %ymm2, %ymm4, %ymm4
1313; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} ymm5 = [255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255]
1314; AVX2-SLOW-NEXT:    vpblendvb %ymm5, %ymm3, %ymm4, %ymm3
1315; AVX2-SLOW-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1316; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,u,u,10,11,8,9,u,u,14,15,12,13,u,u]
1317; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm2[2,2,3,3]
1318; AVX2-SLOW-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7]
1319; AVX2-SLOW-NEXT:    vmovdqu %xmm0, 32(%rdi)
1320; AVX2-SLOW-NEXT:    vmovdqu %ymm3, (%rdi)
1321; AVX2-SLOW-NEXT:    vzeroupper
1322; AVX2-SLOW-NEXT:    retq
1323;
1324; AVX2-FAST-ALL-LABEL: interleave_24i16_in:
1325; AVX2-FAST-ALL:       # %bb.0:
1326; AVX2-FAST-ALL-NEXT:    vmovdqu (%rsi), %xmm0
1327; AVX2-FAST-ALL-NEXT:    vmovdqu (%rdx), %xmm1
1328; AVX2-FAST-ALL-NEXT:    vmovdqu (%rcx), %xmm2
1329; AVX2-FAST-ALL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm3
1330; AVX2-FAST-ALL-NEXT:    vmovdqa {{.*#+}} ymm4 = <u,0,0,u,1,1,u,2>
1331; AVX2-FAST-ALL-NEXT:    vpermd %ymm2, %ymm4, %ymm4
1332; AVX2-FAST-ALL-NEXT:    vmovdqa {{.*#+}} ymm5 = [0,4,1,5,1,5,2,6]
1333; AVX2-FAST-ALL-NEXT:    vpermd %ymm3, %ymm5, %ymm3
1334; AVX2-FAST-ALL-NEXT:    vpshufb {{.*#+}} ymm3 = ymm3[0,1,4,5,u,u,2,3,6,7,u,u,8,9,12,13,u,u,18,19,22,23,u,u,24,25,28,29,u,u,26,27]
1335; AVX2-FAST-ALL-NEXT:    vmovdqa {{.*#+}} ymm5 = [255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255]
1336; AVX2-FAST-ALL-NEXT:    vpblendvb %ymm5, %ymm3, %ymm4, %ymm3
1337; AVX2-FAST-ALL-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1338; AVX2-FAST-ALL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,u,u,10,11,8,9,u,u,14,15,12,13,u,u]
1339; AVX2-FAST-ALL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm2[2,2,3,3]
1340; AVX2-FAST-ALL-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7]
1341; AVX2-FAST-ALL-NEXT:    vmovdqu %xmm0, 32(%rdi)
1342; AVX2-FAST-ALL-NEXT:    vmovdqu %ymm3, (%rdi)
1343; AVX2-FAST-ALL-NEXT:    vzeroupper
1344; AVX2-FAST-ALL-NEXT:    retq
1345;
1346; AVX2-FAST-PERLANE-LABEL: interleave_24i16_in:
1347; AVX2-FAST-PERLANE:       # %bb.0:
1348; AVX2-FAST-PERLANE-NEXT:    vmovdqu (%rsi), %xmm0
1349; AVX2-FAST-PERLANE-NEXT:    vmovdqu (%rdx), %xmm1
1350; AVX2-FAST-PERLANE-NEXT:    vmovdqu (%rcx), %xmm2
1351; AVX2-FAST-PERLANE-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm3
1352; AVX2-FAST-PERLANE-NEXT:    vpshufb {{.*#+}} ymm4 = ymm3[0,1,u,u,6,7,2,3,u,u,8,9,4,5,u,u,16,17,u,u,22,23,18,19,u,u,24,25,20,21,u,u]
1353; AVX2-FAST-PERLANE-NEXT:    vpermq {{.*#+}} ymm3 = ymm3[2,3,0,1]
1354; AVX2-FAST-PERLANE-NEXT:    vpshufb {{.*#+}} ymm3 = ymm3[u,u,0,1,u,u,u,u,2,3,u,u,u,u,4,5,u,u,22,23,u,u,u,u,24,25,u,u,u,u,26,27]
1355; AVX2-FAST-PERLANE-NEXT:    vpblendw {{.*#+}} ymm3 = ymm4[0],ymm3[1],ymm4[2,3],ymm3[4],ymm4[5,6],ymm3[7],ymm4[8],ymm3[9],ymm4[10,11],ymm3[12],ymm4[13,14],ymm3[15]
1356; AVX2-FAST-PERLANE-NEXT:    vmovdqa {{.*#+}} ymm4 = <u,0,0,u,1,1,u,2>
1357; AVX2-FAST-PERLANE-NEXT:    vpermd %ymm2, %ymm4, %ymm4
1358; AVX2-FAST-PERLANE-NEXT:    vmovdqa {{.*#+}} ymm5 = [255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255]
1359; AVX2-FAST-PERLANE-NEXT:    vpblendvb %ymm5, %ymm3, %ymm4, %ymm3
1360; AVX2-FAST-PERLANE-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1361; AVX2-FAST-PERLANE-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,u,u,10,11,8,9,u,u,14,15,12,13,u,u]
1362; AVX2-FAST-PERLANE-NEXT:    vpshufd {{.*#+}} xmm1 = xmm2[2,2,3,3]
1363; AVX2-FAST-PERLANE-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7]
1364; AVX2-FAST-PERLANE-NEXT:    vmovdqu %xmm0, 32(%rdi)
1365; AVX2-FAST-PERLANE-NEXT:    vmovdqu %ymm3, (%rdi)
1366; AVX2-FAST-PERLANE-NEXT:    vzeroupper
1367; AVX2-FAST-PERLANE-NEXT:    retq
1368;
1369; XOP-LABEL: interleave_24i16_in:
1370; XOP:       # %bb.0:
1371; XOP-NEXT:    vmovdqu (%rsi), %xmm0
1372; XOP-NEXT:    vmovdqu (%rdx), %xmm1
1373; XOP-NEXT:    vmovdqu (%rcx), %xmm2
1374; XOP-NEXT:    vpperm {{.*#+}} xmm3 = xmm0[u,u,6,7],xmm1[6,7],xmm0[u,u,8,9],xmm1[8,9],xmm0[u,u,10,11]
1375; XOP-NEXT:    vpshufd {{.*#+}} xmm4 = xmm2[1,1,2,2]
1376; XOP-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0],xmm3[1,2],xmm4[3],xmm3[4,5],xmm4[6],xmm3[7]
1377; XOP-NEXT:    vpunpcklwd {{.*#+}} xmm4 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1378; XOP-NEXT:    vpperm {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm2[0,1],xmm4[4,5,6,7],xmm2[2,3],xmm4[8,9,10,11]
1379; XOP-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
1380; XOP-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1381; XOP-NEXT:    vpperm {{.*#+}} xmm0 = xmm0[4,5],xmm2[10,11],xmm0[10,11,8,9],xmm2[12,13],xmm0[14,15,12,13],xmm2[14,15]
1382; XOP-NEXT:    vmovdqu %xmm0, 32(%rdi)
1383; XOP-NEXT:    vmovups %ymm3, (%rdi)
1384; XOP-NEXT:    vzeroupper
1385; XOP-NEXT:    retq
1386  %s1 = load <8 x i16>, <8 x i16>* %q1, align 4
1387  %s2 = load <8 x i16>, <8 x i16>* %q2, align 4
1388  %s3 = load <8 x i16>, <8 x i16>* %q3, align 4
1389  %t1 = shufflevector <8 x i16> %s1, <8 x i16> %s2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1390  %t2 = shufflevector <8 x i16> %s3, <8 x i16> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1391  %interleaved = shufflevector <16 x i16> %t1, <16 x i16> %t2, <24 x i32> <i32 0, i32 8, i32 16, i32 1, i32 9, i32 17, i32 2, i32 10, i32 18, i32 3, i32 11, i32 19, i32 4, i32 12, i32 20, i32 5, i32 13, i32 21, i32 6, i32 14, i32 22, i32 7, i32 15, i32 23>
1392  store <24 x i16> %interleaved, <24 x i16>* %p, align 4
1393  ret void
1394}
1395
1396define void @interleave_24i32_out(<24 x i32>* %p, <8 x i32>* %q1, <8 x i32>* %q2, <8 x i32>* %q3) nounwind {
1397; SSE2-LABEL: interleave_24i32_out:
1398; SSE2:       # %bb.0:
1399; SSE2-NEXT:    movdqu 64(%rdi), %xmm9
1400; SSE2-NEXT:    movups 80(%rdi), %xmm8
1401; SSE2-NEXT:    movdqu (%rdi), %xmm0
1402; SSE2-NEXT:    movdqu 16(%rdi), %xmm10
1403; SSE2-NEXT:    movups 32(%rdi), %xmm5
1404; SSE2-NEXT:    movdqu 48(%rdi), %xmm3
1405; SSE2-NEXT:    movaps %xmm5, %xmm6
1406; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[2,3,2,3]
1407; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm10[1,1,1,1]
1408; SSE2-NEXT:    punpckldq {{.*#+}} xmm7 = xmm7[0],xmm4[0],xmm7[1],xmm4[1]
1409; SSE2-NEXT:    shufps {{.*#+}} xmm7 = xmm7[0,1],xmm5[0,3]
1410; SSE2-NEXT:    shufps {{.*#+}} xmm5 = xmm5[1,1],xmm10[2,3]
1411; SSE2-NEXT:    movdqa %xmm0, %xmm4
1412; SSE2-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,3],xmm5[2,0]
1413; SSE2-NEXT:    movaps %xmm8, %xmm5
1414; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]
1415; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm9[1,1,1,1]
1416; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1417; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm8[0,3]
1418; SSE2-NEXT:    shufps {{.*#+}} xmm8 = xmm8[1,1],xmm9[2,3]
1419; SSE2-NEXT:    movdqa %xmm3, %xmm2
1420; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,3],xmm8[2,0]
1421; SSE2-NEXT:    shufps {{.*#+}} xmm5 = xmm5[2,1],xmm9[3,3]
1422; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,0],xmm9[0,0]
1423; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,2],xmm5[2,0]
1424; SSE2-NEXT:    shufps {{.*#+}} xmm6 = xmm6[2,1],xmm10[3,3]
1425; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,0],xmm10[0,0]
1426; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm6[2,0]
1427; SSE2-NEXT:    movups %xmm2, 16(%rsi)
1428; SSE2-NEXT:    movups %xmm4, (%rsi)
1429; SSE2-NEXT:    movups %xmm3, 16(%rdx)
1430; SSE2-NEXT:    movups %xmm0, (%rdx)
1431; SSE2-NEXT:    movups %xmm1, 16(%rcx)
1432; SSE2-NEXT:    movups %xmm7, (%rcx)
1433; SSE2-NEXT:    retq
1434;
1435; SSE42-LABEL: interleave_24i32_out:
1436; SSE42:       # %bb.0:
1437; SSE42-NEXT:    movups 80(%rdi), %xmm8
1438; SSE42-NEXT:    movdqu 64(%rdi), %xmm9
1439; SSE42-NEXT:    movdqu (%rdi), %xmm3
1440; SSE42-NEXT:    movdqu 16(%rdi), %xmm2
1441; SSE42-NEXT:    movups 32(%rdi), %xmm10
1442; SSE42-NEXT:    movdqu 48(%rdi), %xmm5
1443; SSE42-NEXT:    movdqa %xmm2, %xmm6
1444; SSE42-NEXT:    pblendw {{.*#+}} xmm6 = xmm6[0,1],xmm3[2,3],xmm6[4,5,6,7]
1445; SSE42-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[2,3,2,3]
1446; SSE42-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,3],xmm2[2,3]
1447; SSE42-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0,1,2],xmm10[1]
1448; SSE42-NEXT:    movdqa %xmm9, %xmm1
1449; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm5[2,3],xmm1[4,5,6,7]
1450; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[2,3,2,3]
1451; SSE42-NEXT:    shufps {{.*#+}} xmm5 = xmm5[0,3],xmm9[2,3]
1452; SSE42-NEXT:    insertps {{.*#+}} xmm5 = xmm5[0,1,2],xmm8[1]
1453; SSE42-NEXT:    pshufd {{.*#+}} xmm4 = xmm10[2,2,2,2]
1454; SSE42-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,0,3,3]
1455; SSE42-NEXT:    pblendw {{.*#+}} xmm6 = xmm6[0,1,2,3,4,5],xmm4[6,7]
1456; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,0,3,3]
1457; SSE42-NEXT:    pshufd {{.*#+}} xmm4 = xmm8[2,2,2,2]
1458; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm1[0,1,2,3,4,5],xmm4[6,7]
1459; SSE42-NEXT:    pblendw {{.*#+}} xmm7 = xmm7[0,1],xmm2[2,3],xmm7[4,5,6,7]
1460; SSE42-NEXT:    shufps {{.*#+}} xmm7 = xmm7[0,1],xmm10[0,3]
1461; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm9[2,3],xmm0[4,5,6,7]
1462; SSE42-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm8[0,3]
1463; SSE42-NEXT:    movups %xmm5, 16(%rsi)
1464; SSE42-NEXT:    movups %xmm3, (%rsi)
1465; SSE42-NEXT:    movdqu %xmm4, 16(%rdx)
1466; SSE42-NEXT:    movdqu %xmm6, (%rdx)
1467; SSE42-NEXT:    movups %xmm0, 16(%rcx)
1468; SSE42-NEXT:    movups %xmm7, (%rcx)
1469; SSE42-NEXT:    retq
1470;
1471; AVX1-LABEL: interleave_24i32_out:
1472; AVX1:       # %bb.0:
1473; AVX1-NEXT:    vmovups 64(%rdi), %ymm0
1474; AVX1-NEXT:    vmovups 32(%rdi), %ymm1
1475; AVX1-NEXT:    vmovups (%rdi), %ymm2
1476; AVX1-NEXT:    vblendps {{.*#+}} ymm3 = ymm2[0],ymm1[1],ymm2[2,3],ymm1[4],ymm2[5,6],ymm1[7]
1477; AVX1-NEXT:    vmovups 16(%rdi), %xmm4
1478; AVX1-NEXT:    vshufps {{.*#+}} ymm4 = ymm4[2,1],ymm1[1,3],ymm4[6,5],ymm1[5,7]
1479; AVX1-NEXT:    vshufps {{.*#+}} ymm3 = ymm3[0,3],ymm4[0,2],ymm3[4,7],ymm4[4,6]
1480; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm4 = ymm0[2,3,0,1]
1481; AVX1-NEXT:    vshufps {{.*#+}} ymm5 = ymm0[1,0],ymm4[2,0],ymm0[5,4],ymm4[6,4]
1482; AVX1-NEXT:    vpermilps {{.*#+}} ymm5 = ymm5[0,1,2,0,4,5,6,4]
1483; AVX1-NEXT:    vblendps {{.*#+}} ymm3 = ymm3[0,1,2,3,4,5],ymm5[6,7]
1484; AVX1-NEXT:    vshufps {{.*#+}} ymm5 = ymm0[2,0],ymm4[3,0],ymm0[6,4],ymm4[7,4]
1485; AVX1-NEXT:    vshufps {{.*#+}} ymm5 = ymm4[0,0],ymm5[2,0],ymm4[4,4],ymm5[6,4]
1486; AVX1-NEXT:    vmovups 16(%rdi), %xmm6
1487; AVX1-NEXT:    vblendps {{.*#+}} ymm7 = ymm2[0,1],ymm1[2],ymm2[3,4],ymm1[5],ymm2[6,7]
1488; AVX1-NEXT:    vshufps {{.*#+}} ymm7 = ymm7[1,2],ymm6[0,3],ymm7[5,6],ymm6[4,7]
1489; AVX1-NEXT:    vpermilps {{.*#+}} ymm7 = ymm7[0,2,3,1,4,6,7,5]
1490; AVX1-NEXT:    vblendps {{.*#+}} ymm5 = ymm7[0,1,2,3,4],ymm5[5,6,7]
1491; AVX1-NEXT:    vblendps {{.*#+}} ymm2 = ymm1[0,1],ymm2[2],ymm1[3,4],ymm2[5],ymm1[6,7]
1492; AVX1-NEXT:    vshufps {{.*#+}} ymm2 = ymm6[1,0],ymm2[2,0],ymm6[5,4],ymm2[6,4]
1493; AVX1-NEXT:    vshufps {{.*#+}} ymm1 = ymm2[2,0],ymm1[0,3],ymm2[6,4],ymm1[4,7]
1494; AVX1-NEXT:    vshufps {{.*#+}} ymm0 = ymm4[0,1],ymm0[0,3],ymm4[4,5],ymm0[4,7]
1495; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3,4],ymm0[5,6,7]
1496; AVX1-NEXT:    vmovups %ymm3, (%rsi)
1497; AVX1-NEXT:    vmovups %ymm5, (%rdx)
1498; AVX1-NEXT:    vmovups %ymm0, (%rcx)
1499; AVX1-NEXT:    vzeroupper
1500; AVX1-NEXT:    retq
1501;
1502; AVX2-SLOW-LABEL: interleave_24i32_out:
1503; AVX2-SLOW:       # %bb.0:
1504; AVX2-SLOW-NEXT:    vmovups (%rdi), %ymm0
1505; AVX2-SLOW-NEXT:    vmovups 32(%rdi), %ymm1
1506; AVX2-SLOW-NEXT:    vmovups 64(%rdi), %ymm2
1507; AVX2-SLOW-NEXT:    vbroadcastsd {{.*#+}} ymm3 = [21474836482,21474836482,21474836482,21474836482]
1508; AVX2-SLOW-NEXT:    vpermps %ymm2, %ymm3, %ymm3
1509; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm4 = ymm0[0],ymm1[1],ymm0[2,3],ymm1[4],ymm0[5,6],ymm1[7]
1510; AVX2-SLOW-NEXT:    vmovaps {{.*#+}} ymm5 = <0,3,6,1,4,7,u,u>
1511; AVX2-SLOW-NEXT:    vpermps %ymm4, %ymm5, %ymm4
1512; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm3 = ymm4[0,1,2,3,4,5],ymm3[6,7]
1513; AVX2-SLOW-NEXT:    vbroadcastf128 {{.*#+}} ymm4 = [0,0,3,6,0,0,3,6]
1514; AVX2-SLOW-NEXT:    # ymm4 = mem[0,1,0,1]
1515; AVX2-SLOW-NEXT:    vpermps %ymm2, %ymm4, %ymm4
1516; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm5 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7]
1517; AVX2-SLOW-NEXT:    vmovaps {{.*#+}} ymm6 = <1,4,7,2,5,u,u,u>
1518; AVX2-SLOW-NEXT:    vpermps %ymm5, %ymm6, %ymm5
1519; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm4 = ymm5[0,1,2,3,4],ymm4[5,6,7]
1520; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1],ymm0[2],ymm1[3,4],ymm0[5],ymm1[6,7]
1521; AVX2-SLOW-NEXT:    vmovaps {{.*#+}} ymm1 = <2,5,0,3,6,u,u,u>
1522; AVX2-SLOW-NEXT:    vpermps %ymm0, %ymm1, %ymm0
1523; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} ymm1 = ymm2[0,1,0,3,4,5,4,7]
1524; AVX2-SLOW-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[0,1,0,3]
1525; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3,4],ymm1[5,6,7]
1526; AVX2-SLOW-NEXT:    vmovups %ymm3, (%rsi)
1527; AVX2-SLOW-NEXT:    vmovups %ymm4, (%rdx)
1528; AVX2-SLOW-NEXT:    vmovups %ymm0, (%rcx)
1529; AVX2-SLOW-NEXT:    vzeroupper
1530; AVX2-SLOW-NEXT:    retq
1531;
1532; AVX2-FAST-ALL-LABEL: interleave_24i32_out:
1533; AVX2-FAST-ALL:       # %bb.0:
1534; AVX2-FAST-ALL-NEXT:    vmovups (%rdi), %ymm0
1535; AVX2-FAST-ALL-NEXT:    vmovups 32(%rdi), %ymm1
1536; AVX2-FAST-ALL-NEXT:    vmovups 64(%rdi), %ymm2
1537; AVX2-FAST-ALL-NEXT:    vbroadcastsd {{.*#+}} ymm3 = [21474836482,21474836482,21474836482,21474836482]
1538; AVX2-FAST-ALL-NEXT:    vpermps %ymm2, %ymm3, %ymm3
1539; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm4 = ymm0[0],ymm1[1],ymm0[2,3],ymm1[4],ymm0[5,6],ymm1[7]
1540; AVX2-FAST-ALL-NEXT:    vmovaps {{.*#+}} ymm5 = <0,3,6,1,4,7,u,u>
1541; AVX2-FAST-ALL-NEXT:    vpermps %ymm4, %ymm5, %ymm4
1542; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm3 = ymm4[0,1,2,3,4,5],ymm3[6,7]
1543; AVX2-FAST-ALL-NEXT:    vbroadcastf128 {{.*#+}} ymm4 = [0,0,3,6,0,0,3,6]
1544; AVX2-FAST-ALL-NEXT:    # ymm4 = mem[0,1,0,1]
1545; AVX2-FAST-ALL-NEXT:    vpermps %ymm2, %ymm4, %ymm4
1546; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm5 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7]
1547; AVX2-FAST-ALL-NEXT:    vmovaps {{.*#+}} ymm6 = <1,4,7,2,5,u,u,u>
1548; AVX2-FAST-ALL-NEXT:    vpermps %ymm5, %ymm6, %ymm5
1549; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm4 = ymm5[0,1,2,3,4],ymm4[5,6,7]
1550; AVX2-FAST-ALL-NEXT:    vmovaps {{.*#+}} ymm5 = <u,u,u,u,u,1,4,7>
1551; AVX2-FAST-ALL-NEXT:    vpermps %ymm2, %ymm5, %ymm2
1552; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1],ymm0[2],ymm1[3,4],ymm0[5],ymm1[6,7]
1553; AVX2-FAST-ALL-NEXT:    vmovaps {{.*#+}} ymm1 = <2,5,0,3,6,u,u,u>
1554; AVX2-FAST-ALL-NEXT:    vpermps %ymm0, %ymm1, %ymm0
1555; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3,4],ymm2[5,6,7]
1556; AVX2-FAST-ALL-NEXT:    vmovups %ymm3, (%rsi)
1557; AVX2-FAST-ALL-NEXT:    vmovups %ymm4, (%rdx)
1558; AVX2-FAST-ALL-NEXT:    vmovups %ymm0, (%rcx)
1559; AVX2-FAST-ALL-NEXT:    vzeroupper
1560; AVX2-FAST-ALL-NEXT:    retq
1561;
1562; AVX2-FAST-PERLANE-LABEL: interleave_24i32_out:
1563; AVX2-FAST-PERLANE:       # %bb.0:
1564; AVX2-FAST-PERLANE-NEXT:    vmovups (%rdi), %ymm0
1565; AVX2-FAST-PERLANE-NEXT:    vmovups 32(%rdi), %ymm1
1566; AVX2-FAST-PERLANE-NEXT:    vmovups 64(%rdi), %ymm2
1567; AVX2-FAST-PERLANE-NEXT:    vbroadcastsd {{.*#+}} ymm3 = [21474836482,21474836482,21474836482,21474836482]
1568; AVX2-FAST-PERLANE-NEXT:    vpermps %ymm2, %ymm3, %ymm3
1569; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm4 = ymm0[0],ymm1[1],ymm0[2,3],ymm1[4],ymm0[5,6],ymm1[7]
1570; AVX2-FAST-PERLANE-NEXT:    vmovaps {{.*#+}} ymm5 = <0,3,6,1,4,7,u,u>
1571; AVX2-FAST-PERLANE-NEXT:    vpermps %ymm4, %ymm5, %ymm4
1572; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm3 = ymm4[0,1,2,3,4,5],ymm3[6,7]
1573; AVX2-FAST-PERLANE-NEXT:    vbroadcastf128 {{.*#+}} ymm4 = [0,0,3,6,0,0,3,6]
1574; AVX2-FAST-PERLANE-NEXT:    # ymm4 = mem[0,1,0,1]
1575; AVX2-FAST-PERLANE-NEXT:    vpermps %ymm2, %ymm4, %ymm4
1576; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm5 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7]
1577; AVX2-FAST-PERLANE-NEXT:    vmovaps {{.*#+}} ymm6 = <1,4,7,2,5,u,u,u>
1578; AVX2-FAST-PERLANE-NEXT:    vpermps %ymm5, %ymm6, %ymm5
1579; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm4 = ymm5[0,1,2,3,4],ymm4[5,6,7]
1580; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1],ymm0[2],ymm1[3,4],ymm0[5],ymm1[6,7]
1581; AVX2-FAST-PERLANE-NEXT:    vmovaps {{.*#+}} ymm1 = <2,5,0,3,6,u,u,u>
1582; AVX2-FAST-PERLANE-NEXT:    vpermps %ymm0, %ymm1, %ymm0
1583; AVX2-FAST-PERLANE-NEXT:    vpermilps {{.*#+}} ymm1 = ymm2[0,1,0,3,4,5,4,7]
1584; AVX2-FAST-PERLANE-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[0,1,0,3]
1585; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3,4],ymm1[5,6,7]
1586; AVX2-FAST-PERLANE-NEXT:    vmovups %ymm3, (%rsi)
1587; AVX2-FAST-PERLANE-NEXT:    vmovups %ymm4, (%rdx)
1588; AVX2-FAST-PERLANE-NEXT:    vmovups %ymm0, (%rcx)
1589; AVX2-FAST-PERLANE-NEXT:    vzeroupper
1590; AVX2-FAST-PERLANE-NEXT:    retq
1591;
1592; XOP-LABEL: interleave_24i32_out:
1593; XOP:       # %bb.0:
1594; XOP-NEXT:    vmovups 64(%rdi), %ymm0
1595; XOP-NEXT:    vmovups 32(%rdi), %ymm1
1596; XOP-NEXT:    vmovups (%rdi), %ymm2
1597; XOP-NEXT:    vblendps {{.*#+}} ymm3 = ymm2[0],ymm1[1],ymm2[2,3],ymm1[4],ymm2[5,6],ymm1[7]
1598; XOP-NEXT:    vmovups 16(%rdi), %xmm4
1599; XOP-NEXT:    vshufps {{.*#+}} ymm4 = ymm4[2,1],ymm1[1,3],ymm4[6,5],ymm1[5,7]
1600; XOP-NEXT:    vshufps {{.*#+}} ymm3 = ymm3[0,3],ymm4[0,2],ymm3[4,7],ymm4[4,6]
1601; XOP-NEXT:    vperm2f128 {{.*#+}} ymm4 = ymm0[2,3,0,1]
1602; XOP-NEXT:    vshufps {{.*#+}} ymm5 = ymm0[1,0],ymm4[2,0],ymm0[5,4],ymm4[6,4]
1603; XOP-NEXT:    vpermilps {{.*#+}} ymm5 = ymm5[0,1,2,0,4,5,6,4]
1604; XOP-NEXT:    vblendps {{.*#+}} ymm3 = ymm3[0,1,2,3,4,5],ymm5[6,7]
1605; XOP-NEXT:    vshufps {{.*#+}} ymm5 = ymm0[2,0],ymm4[3,0],ymm0[6,4],ymm4[7,4]
1606; XOP-NEXT:    vshufps {{.*#+}} ymm5 = ymm4[0,0],ymm5[2,0],ymm4[4,4],ymm5[6,4]
1607; XOP-NEXT:    vmovups 16(%rdi), %xmm6
1608; XOP-NEXT:    vblendps {{.*#+}} ymm7 = ymm2[0,1],ymm1[2],ymm2[3,4],ymm1[5],ymm2[6,7]
1609; XOP-NEXT:    vshufps {{.*#+}} ymm7 = ymm7[1,2],ymm6[0,3],ymm7[5,6],ymm6[4,7]
1610; XOP-NEXT:    vpermilps {{.*#+}} ymm7 = ymm7[0,2,3,1,4,6,7,5]
1611; XOP-NEXT:    vblendps {{.*#+}} ymm5 = ymm7[0,1,2,3,4],ymm5[5,6,7]
1612; XOP-NEXT:    vblendps {{.*#+}} ymm2 = ymm1[0,1],ymm2[2],ymm1[3,4],ymm2[5],ymm1[6,7]
1613; XOP-NEXT:    vshufps {{.*#+}} ymm2 = ymm6[1,0],ymm2[2,0],ymm6[5,4],ymm2[6,4]
1614; XOP-NEXT:    vshufps {{.*#+}} ymm1 = ymm2[2,0],ymm1[0,3],ymm2[6,4],ymm1[4,7]
1615; XOP-NEXT:    vshufps {{.*#+}} ymm0 = ymm4[0,1],ymm0[0,3],ymm4[4,5],ymm0[4,7]
1616; XOP-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3,4],ymm0[5,6,7]
1617; XOP-NEXT:    vmovups %ymm3, (%rsi)
1618; XOP-NEXT:    vmovups %ymm5, (%rdx)
1619; XOP-NEXT:    vmovups %ymm0, (%rcx)
1620; XOP-NEXT:    vzeroupper
1621; XOP-NEXT:    retq
1622  %wide.vec = load <24 x i32>, <24 x i32>* %p, align 4
1623  %s1 = shufflevector <24 x i32> %wide.vec, <24 x i32> undef, <8 x i32> <i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21>
1624  %s2 = shufflevector <24 x i32> %wide.vec, <24 x i32> undef, <8 x i32> <i32 1, i32 4, i32 7, i32 10, i32 13, i32 16, i32 19, i32 22>
1625  %s3 = shufflevector <24 x i32> %wide.vec, <24 x i32> undef, <8 x i32> <i32 2, i32 5, i32 8, i32 11, i32 14, i32 17, i32 20, i32 23>
1626  store <8 x i32> %s1, <8 x i32>* %q1, align 4
1627  store <8 x i32> %s2, <8 x i32>* %q2, align 4
1628  store <8 x i32> %s3, <8 x i32>* %q3, align 4
1629  ret void
1630}
1631
1632define void @interleave_24i32_in(<24 x i32>* %p, <8 x i32>* %q1, <8 x i32>* %q2, <8 x i32>* %q3) nounwind {
1633; SSE2-LABEL: interleave_24i32_in:
1634; SSE2:       # %bb.0:
1635; SSE2-NEXT:    movups (%rsi), %xmm1
1636; SSE2-NEXT:    movups 16(%rsi), %xmm0
1637; SSE2-NEXT:    movups (%rdx), %xmm8
1638; SSE2-NEXT:    movups 16(%rdx), %xmm5
1639; SSE2-NEXT:    movups (%rcx), %xmm3
1640; SSE2-NEXT:    movups 16(%rcx), %xmm6
1641; SSE2-NEXT:    movaps %xmm3, %xmm7
1642; SSE2-NEXT:    shufps {{.*#+}} xmm7 = xmm7[0,1],xmm1[1,3]
1643; SSE2-NEXT:    movaps %xmm1, %xmm9
1644; SSE2-NEXT:    unpcklps {{.*#+}} xmm9 = xmm9[0],xmm8[0],xmm9[1],xmm8[1]
1645; SSE2-NEXT:    shufps {{.*#+}} xmm9 = xmm9[0,1],xmm7[0,2]
1646; SSE2-NEXT:    movaps %xmm5, %xmm7
1647; SSE2-NEXT:    shufps {{.*#+}} xmm7 = xmm7[3,3],xmm6[3,3]
1648; SSE2-NEXT:    movaps %xmm6, %xmm4
1649; SSE2-NEXT:    unpckhps {{.*#+}} xmm4 = xmm4[2],xmm0[2],xmm4[3],xmm0[3]
1650; SSE2-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,3],xmm7[0,2]
1651; SSE2-NEXT:    movaps %xmm0, %xmm7
1652; SSE2-NEXT:    unpckhpd {{.*#+}} xmm7 = xmm7[1],xmm5[1]
1653; SSE2-NEXT:    movaps %xmm6, %xmm2
1654; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,0],xmm5[1,0]
1655; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[2,0],xmm7[0,2]
1656; SSE2-NEXT:    shufps {{.*#+}} xmm6 = xmm6[0,1],xmm0[1,3]
1657; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
1658; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm6[0,2]
1659; SSE2-NEXT:    movaps %xmm8, %xmm5
1660; SSE2-NEXT:    shufps {{.*#+}} xmm5 = xmm5[3,3],xmm3[3,3]
1661; SSE2-NEXT:    movaps %xmm3, %xmm6
1662; SSE2-NEXT:    unpckhps {{.*#+}} xmm6 = xmm6[2],xmm1[2],xmm6[3],xmm1[3]
1663; SSE2-NEXT:    shufps {{.*#+}} xmm6 = xmm6[0,3],xmm5[0,2]
1664; SSE2-NEXT:    unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm8[1]
1665; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,0],xmm8[1,0]
1666; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[2,0],xmm1[0,2]
1667; SSE2-NEXT:    movups %xmm3, 16(%rdi)
1668; SSE2-NEXT:    movups %xmm6, 32(%rdi)
1669; SSE2-NEXT:    movups %xmm0, 48(%rdi)
1670; SSE2-NEXT:    movups %xmm2, 64(%rdi)
1671; SSE2-NEXT:    movups %xmm4, 80(%rdi)
1672; SSE2-NEXT:    movups %xmm9, (%rdi)
1673; SSE2-NEXT:    retq
1674;
1675; SSE42-LABEL: interleave_24i32_in:
1676; SSE42:       # %bb.0:
1677; SSE42-NEXT:    movdqu (%rsi), %xmm8
1678; SSE42-NEXT:    movdqu 16(%rsi), %xmm4
1679; SSE42-NEXT:    movdqu (%rdx), %xmm2
1680; SSE42-NEXT:    movdqu 16(%rdx), %xmm5
1681; SSE42-NEXT:    movdqu (%rcx), %xmm3
1682; SSE42-NEXT:    movdqu 16(%rcx), %xmm6
1683; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,0,1,1]
1684; SSE42-NEXT:    pshufd {{.*#+}} xmm7 = xmm8[0,1,0,1]
1685; SSE42-NEXT:    pblendw {{.*#+}} xmm7 = xmm7[0,1],xmm1[2,3],xmm7[4,5,6,7]
1686; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[0,1,0,1]
1687; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm7[0,1,2,3],xmm1[4,5],xmm7[6,7]
1688; SSE42-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[2,3,2,3]
1689; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[2,3,2,3]
1690; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm7[2,3],xmm0[4,5,6,7]
1691; SSE42-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[2,2,3,3]
1692; SSE42-NEXT:    pblendw {{.*#+}} xmm7 = xmm0[0,1,2,3],xmm7[4,5],xmm0[6,7]
1693; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,2,2]
1694; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm6[2,3],xmm0[4,5,6,7]
1695; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5],xmm0[6,7]
1696; SSE42-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[0,0,1,1]
1697; SSE42-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,1,0,1]
1698; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5,6,7]
1699; SSE42-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[0,1,0,1]
1700; SSE42-NEXT:    pblendw {{.*#+}} xmm5 = xmm4[0,1,2,3],xmm5[4,5],xmm4[6,7]
1701; SSE42-NEXT:    pshufd {{.*#+}} xmm4 = xmm8[2,3,2,3]
1702; SSE42-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[2,3,2,3]
1703; SSE42-NEXT:    pblendw {{.*#+}} xmm6 = xmm6[0,1],xmm4[2,3],xmm6[4,5,6,7]
1704; SSE42-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[2,2,3,3]
1705; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm6[0,1,2,3],xmm4[4,5],xmm6[6,7]
1706; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,2,2]
1707; SSE42-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5,6,7]
1708; SSE42-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm8[4,5],xmm2[6,7]
1709; SSE42-NEXT:    movdqu %xmm2, 16(%rdi)
1710; SSE42-NEXT:    movdqu %xmm4, 32(%rdi)
1711; SSE42-NEXT:    movdqu %xmm5, 48(%rdi)
1712; SSE42-NEXT:    movdqu %xmm0, 64(%rdi)
1713; SSE42-NEXT:    movdqu %xmm7, 80(%rdi)
1714; SSE42-NEXT:    movdqu %xmm1, (%rdi)
1715; SSE42-NEXT:    retq
1716;
1717; AVX1-LABEL: interleave_24i32_in:
1718; AVX1:       # %bb.0:
1719; AVX1-NEXT:    vmovups (%rdx), %xmm0
1720; AVX1-NEXT:    vmovups (%rsi), %xmm1
1721; AVX1-NEXT:    vunpckhpd {{.*#+}} xmm2 = xmm1[1],xmm0[1]
1722; AVX1-NEXT:    vshufps {{.*#+}} xmm2 = xmm0[1,1],xmm2[0,2]
1723; AVX1-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1724; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,1]
1725; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1726; AVX1-NEXT:    vbroadcastsd (%rcx), %ymm1
1727; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7]
1728; AVX1-NEXT:    vmovups 16(%rcx), %xmm1
1729; AVX1-NEXT:    vmovups 16(%rdx), %xmm2
1730; AVX1-NEXT:    vshufps {{.*#+}} xmm3 = xmm2[3,0],xmm1[3,0]
1731; AVX1-NEXT:    vshufps {{.*#+}} xmm3 = xmm1[2,1],xmm3[0,2]
1732; AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[1,0],xmm2[1,0]
1733; AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[2,0],xmm2[2,2]
1734; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1735; AVX1-NEXT:    vbroadcastsd 24(%rsi), %ymm2
1736; AVX1-NEXT:    vblendps {{.*#+}} ymm1 = ymm1[0,1],ymm2[2],ymm1[3,4],ymm2[5],ymm1[6,7]
1737; AVX1-NEXT:    vpermilpd {{.*#+}} ymm2 = mem[1,0,2,2]
1738; AVX1-NEXT:    vpermilpd {{.*#+}} ymm3 = mem[1,1,2,2]
1739; AVX1-NEXT:    vblendps {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2,3],ymm2[4],ymm3[5,6],ymm2[7]
1740; AVX1-NEXT:    vpermilps {{.*#+}} ymm3 = mem[0,0,3,3,4,4,7,7]
1741; AVX1-NEXT:    vblendps {{.*#+}} ymm2 = ymm2[0,1],ymm3[2],ymm2[3,4],ymm3[5],ymm2[6,7]
1742; AVX1-NEXT:    vmovups %ymm2, 32(%rdi)
1743; AVX1-NEXT:    vmovups %ymm1, 64(%rdi)
1744; AVX1-NEXT:    vmovups %ymm0, (%rdi)
1745; AVX1-NEXT:    vzeroupper
1746; AVX1-NEXT:    retq
1747;
1748; AVX2-SLOW-LABEL: interleave_24i32_in:
1749; AVX2-SLOW:       # %bb.0:
1750; AVX2-SLOW-NEXT:    vmovups (%rsi), %ymm0
1751; AVX2-SLOW-NEXT:    vmovups (%rdx), %ymm1
1752; AVX2-SLOW-NEXT:    vmovups (%rcx), %ymm2
1753; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} xmm3 = mem[1,0,2,2]
1754; AVX2-SLOW-NEXT:    vpermpd {{.*#+}} ymm3 = ymm3[0,1,0,1]
1755; AVX2-SLOW-NEXT:    vpermpd {{.*#+}} ymm4 = ymm0[0,0,2,1]
1756; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm3 = ymm4[0],ymm3[1],ymm4[2,3],ymm3[4],ymm4[5,6],ymm3[7]
1757; AVX2-SLOW-NEXT:    vbroadcastsd (%rcx), %ymm4
1758; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm3 = ymm3[0,1],ymm4[2],ymm3[3,4],ymm4[5],ymm3[6,7]
1759; AVX2-SLOW-NEXT:    vpermpd {{.*#+}} ymm4 = ymm2[2,1,3,3]
1760; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} ymm5 = ymm1[1,2,3,3,5,6,7,7]
1761; AVX2-SLOW-NEXT:    vpermpd {{.*#+}} ymm5 = ymm5[2,2,2,3]
1762; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm4 = ymm5[0],ymm4[1],ymm5[2,3],ymm4[4],ymm5[5,6],ymm4[7]
1763; AVX2-SLOW-NEXT:    vbroadcastsd 24(%rsi), %ymm5
1764; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm4 = ymm4[0,1],ymm5[2],ymm4[3,4],ymm5[5],ymm4[6,7]
1765; AVX2-SLOW-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[1,1,2,2]
1766; AVX2-SLOW-NEXT:    vpermpd {{.*#+}} ymm2 = ymm2[1,1,2,2]
1767; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm0 = ymm2[0],ymm0[1],ymm2[2,3],ymm0[4],ymm2[5,6],ymm0[7]
1768; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} ymm1 = ymm1[0,0,3,3,4,4,7,7]
1769; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7]
1770; AVX2-SLOW-NEXT:    vmovups %ymm0, 32(%rdi)
1771; AVX2-SLOW-NEXT:    vmovups %ymm4, 64(%rdi)
1772; AVX2-SLOW-NEXT:    vmovups %ymm3, (%rdi)
1773; AVX2-SLOW-NEXT:    vzeroupper
1774; AVX2-SLOW-NEXT:    retq
1775;
1776; AVX2-FAST-ALL-LABEL: interleave_24i32_in:
1777; AVX2-FAST-ALL:       # %bb.0:
1778; AVX2-FAST-ALL-NEXT:    vmovups (%rsi), %ymm0
1779; AVX2-FAST-ALL-NEXT:    vmovups (%rdx), %ymm1
1780; AVX2-FAST-ALL-NEXT:    vmovups (%rcx), %ymm2
1781; AVX2-FAST-ALL-NEXT:    vbroadcastf128 {{.*#+}} ymm3 = [1,0,2,2,1,0,2,2]
1782; AVX2-FAST-ALL-NEXT:    # ymm3 = mem[0,1,0,1]
1783; AVX2-FAST-ALL-NEXT:    vpermps %ymm1, %ymm3, %ymm3
1784; AVX2-FAST-ALL-NEXT:    vpermpd {{.*#+}} ymm4 = ymm0[0,0,2,1]
1785; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm3 = ymm4[0],ymm3[1],ymm4[2,3],ymm3[4],ymm4[5,6],ymm3[7]
1786; AVX2-FAST-ALL-NEXT:    vbroadcastsd (%rcx), %ymm4
1787; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm3 = ymm3[0,1],ymm4[2],ymm3[3,4],ymm4[5],ymm3[6,7]
1788; AVX2-FAST-ALL-NEXT:    vmovaps {{.*#+}} ymm4 = <5,u,u,6,u,u,7,u>
1789; AVX2-FAST-ALL-NEXT:    vpermps %ymm1, %ymm4, %ymm4
1790; AVX2-FAST-ALL-NEXT:    vpermpd {{.*#+}} ymm5 = ymm2[2,1,3,3]
1791; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm4 = ymm4[0],ymm5[1],ymm4[2,3],ymm5[4],ymm4[5,6],ymm5[7]
1792; AVX2-FAST-ALL-NEXT:    vbroadcastsd 24(%rsi), %ymm5
1793; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm4 = ymm4[0,1],ymm5[2],ymm4[3,4],ymm5[5],ymm4[6,7]
1794; AVX2-FAST-ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[1,1,2,2]
1795; AVX2-FAST-ALL-NEXT:    vpermpd {{.*#+}} ymm2 = ymm2[1,1,2,2]
1796; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm0 = ymm2[0],ymm0[1],ymm2[2,3],ymm0[4],ymm2[5,6],ymm0[7]
1797; AVX2-FAST-ALL-NEXT:    vpermilps {{.*#+}} ymm1 = ymm1[0,0,3,3,4,4,7,7]
1798; AVX2-FAST-ALL-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7]
1799; AVX2-FAST-ALL-NEXT:    vmovups %ymm0, 32(%rdi)
1800; AVX2-FAST-ALL-NEXT:    vmovups %ymm4, 64(%rdi)
1801; AVX2-FAST-ALL-NEXT:    vmovups %ymm3, (%rdi)
1802; AVX2-FAST-ALL-NEXT:    vzeroupper
1803; AVX2-FAST-ALL-NEXT:    retq
1804;
1805; AVX2-FAST-PERLANE-LABEL: interleave_24i32_in:
1806; AVX2-FAST-PERLANE:       # %bb.0:
1807; AVX2-FAST-PERLANE-NEXT:    vmovups (%rsi), %ymm0
1808; AVX2-FAST-PERLANE-NEXT:    vmovups (%rdx), %ymm1
1809; AVX2-FAST-PERLANE-NEXT:    vmovups (%rcx), %ymm2
1810; AVX2-FAST-PERLANE-NEXT:    vpermilps {{.*#+}} xmm3 = mem[1,0,2,2]
1811; AVX2-FAST-PERLANE-NEXT:    vpermpd {{.*#+}} ymm3 = ymm3[0,1,0,1]
1812; AVX2-FAST-PERLANE-NEXT:    vpermpd {{.*#+}} ymm4 = ymm0[0,0,2,1]
1813; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm3 = ymm4[0],ymm3[1],ymm4[2,3],ymm3[4],ymm4[5,6],ymm3[7]
1814; AVX2-FAST-PERLANE-NEXT:    vbroadcastsd (%rcx), %ymm4
1815; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm3 = ymm3[0,1],ymm4[2],ymm3[3,4],ymm4[5],ymm3[6,7]
1816; AVX2-FAST-PERLANE-NEXT:    vpermpd {{.*#+}} ymm4 = ymm2[2,1,3,3]
1817; AVX2-FAST-PERLANE-NEXT:    vpermilps {{.*#+}} ymm5 = ymm1[1,2,3,3,5,6,7,7]
1818; AVX2-FAST-PERLANE-NEXT:    vpermpd {{.*#+}} ymm5 = ymm5[2,2,2,3]
1819; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm4 = ymm5[0],ymm4[1],ymm5[2,3],ymm4[4],ymm5[5,6],ymm4[7]
1820; AVX2-FAST-PERLANE-NEXT:    vbroadcastsd 24(%rsi), %ymm5
1821; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm4 = ymm4[0,1],ymm5[2],ymm4[3,4],ymm5[5],ymm4[6,7]
1822; AVX2-FAST-PERLANE-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[1,1,2,2]
1823; AVX2-FAST-PERLANE-NEXT:    vpermpd {{.*#+}} ymm2 = ymm2[1,1,2,2]
1824; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm0 = ymm2[0],ymm0[1],ymm2[2,3],ymm0[4],ymm2[5,6],ymm0[7]
1825; AVX2-FAST-PERLANE-NEXT:    vpermilps {{.*#+}} ymm1 = ymm1[0,0,3,3,4,4,7,7]
1826; AVX2-FAST-PERLANE-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7]
1827; AVX2-FAST-PERLANE-NEXT:    vmovups %ymm0, 32(%rdi)
1828; AVX2-FAST-PERLANE-NEXT:    vmovups %ymm4, 64(%rdi)
1829; AVX2-FAST-PERLANE-NEXT:    vmovups %ymm3, (%rdi)
1830; AVX2-FAST-PERLANE-NEXT:    vzeroupper
1831; AVX2-FAST-PERLANE-NEXT:    retq
1832;
1833; XOP-LABEL: interleave_24i32_in:
1834; XOP:       # %bb.0:
1835; XOP-NEXT:    vmovups (%rsi), %ymm0
1836; XOP-NEXT:    vmovups (%rcx), %ymm1
1837; XOP-NEXT:    vpermil2ps {{.*#+}} ymm0 = ymm1[2],ymm0[3],ymm1[u,3],ymm0[4],ymm1[u,4],ymm0[5]
1838; XOP-NEXT:    vmovups (%rdx), %xmm1
1839; XOP-NEXT:    vmovups (%rsi), %xmm2
1840; XOP-NEXT:    vunpckhpd {{.*#+}} xmm3 = xmm2[1],xmm1[1]
1841; XOP-NEXT:    vshufps {{.*#+}} xmm3 = xmm1[1,1],xmm3[0,2]
1842; XOP-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1843; XOP-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[2,0],xmm2[2,1]
1844; XOP-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1845; XOP-NEXT:    vbroadcastsd (%rcx), %ymm2
1846; XOP-NEXT:    vblendps {{.*#+}} ymm1 = ymm1[0,1],ymm2[2],ymm1[3,4],ymm2[5],ymm1[6,7]
1847; XOP-NEXT:    vmovups 16(%rcx), %xmm2
1848; XOP-NEXT:    vmovups 16(%rdx), %xmm3
1849; XOP-NEXT:    vshufps {{.*#+}} xmm4 = xmm3[3,0],xmm2[3,0]
1850; XOP-NEXT:    vshufps {{.*#+}} xmm4 = xmm2[2,1],xmm4[0,2]
1851; XOP-NEXT:    vshufps {{.*#+}} xmm2 = xmm2[1,0],xmm3[1,0]
1852; XOP-NEXT:    vshufps {{.*#+}} xmm2 = xmm2[2,0],xmm3[2,2]
1853; XOP-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
1854; XOP-NEXT:    vbroadcastsd 24(%rsi), %ymm3
1855; XOP-NEXT:    vblendps {{.*#+}} ymm2 = ymm2[0,1],ymm3[2],ymm2[3,4],ymm3[5],ymm2[6,7]
1856; XOP-NEXT:    vpermilps {{.*#+}} ymm3 = mem[0,0,3,3,4,4,7,7]
1857; XOP-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm3[2],ymm0[3,4],ymm3[5],ymm0[6,7]
1858; XOP-NEXT:    vmovups %ymm0, 32(%rdi)
1859; XOP-NEXT:    vmovups %ymm2, 64(%rdi)
1860; XOP-NEXT:    vmovups %ymm1, (%rdi)
1861; XOP-NEXT:    vzeroupper
1862; XOP-NEXT:    retq
1863  %s1 = load <8 x i32>, <8 x i32>* %q1, align 4
1864  %s2 = load <8 x i32>, <8 x i32>* %q2, align 4
1865  %s3 = load <8 x i32>, <8 x i32>* %q3, align 4
1866  %t1 = shufflevector <8 x i32> %s1, <8 x i32> %s2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1867  %t2 = shufflevector <8 x i32> %s3, <8 x i32> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1868  %interleaved = shufflevector <16 x i32> %t1, <16 x i32> %t2, <24 x i32> <i32 0, i32 8, i32 16, i32 1, i32 9, i32 17, i32 2, i32 10, i32 18, i32 3, i32 11, i32 19, i32 4, i32 12, i32 20, i32 5, i32 13, i32 21, i32 6, i32 14, i32 22, i32 7, i32 15, i32 23>
1869  store <24 x i32> %interleaved, <24 x i32>* %p, align 4
1870  ret void
1871}
1872
1873; Repeat each element x 3 of <16 x i8> a0 + a1 to create a <96 x i8>.
1874define void @splat3_128(<16 x i8> %a0, <16 x i8> %a1, <96 x i8> *%a2) {
1875; SSE2-LABEL: splat3_128:
1876; SSE2:       # %bb.0:
1877; SSE2-NEXT:    pxor %xmm4, %xmm4
1878; SSE2-NEXT:    movdqa %xmm0, %xmm3
1879; 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]
1880; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm3[2,3,3,3,4,5,6,7]
1881; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm2[0,1,2,3,4,4,4,5]
1882; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,1,0,1]
1883; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,0,0,1,4,5,6,7]
1884; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,5,6,6]
1885; SSE2-NEXT:    packuswb %xmm5, %xmm2
1886; SSE2-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm4[8],xmm0[9],xmm4[9],xmm0[10],xmm4[10],xmm0[11],xmm4[11],xmm0[12],xmm4[12],xmm0[13],xmm4[13],xmm0[14],xmm4[14],xmm0[15],xmm4[15]
1887; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,1,0,1]
1888; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm5[0,0,0,1,4,5,6,7]
1889; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,5,5,6,6]
1890; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]
1891; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[1,1,2,2,4,5,6,7]
1892; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,6,7,7,7]
1893; SSE2-NEXT:    packuswb %xmm5, %xmm3
1894; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm0[2,3,3,3,4,5,6,7]
1895; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,4,4,4,5]
1896; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
1897; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,1,2,2,4,5,6,7]
1898; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,7,7,7]
1899; SSE2-NEXT:    packuswb %xmm0, %xmm5
1900; SSE2-NEXT:    movdqa %xmm1, %xmm0
1901; 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]
1902; SSE2-NEXT:    pshuflw {{.*#+}} xmm6 = xmm0[2,3,3,3,4,5,6,7]
1903; SSE2-NEXT:    pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,4,4,4,5]
1904; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[0,1,0,1]
1905; SSE2-NEXT:    pshuflw {{.*#+}} xmm7 = xmm7[0,0,0,1,4,5,6,7]
1906; SSE2-NEXT:    pshufhw {{.*#+}} xmm7 = xmm7[0,1,2,3,5,5,6,6]
1907; SSE2-NEXT:    packuswb %xmm6, %xmm7
1908; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm4[8],xmm1[9],xmm4[9],xmm1[10],xmm4[10],xmm1[11],xmm4[11],xmm1[12],xmm4[12],xmm1[13],xmm4[13],xmm1[14],xmm4[14],xmm1[15],xmm4[15]
1909; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,1,0,1]
1910; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[0,0,0,1,4,5,6,7]
1911; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,5,5,6,6]
1912; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
1913; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,1,2,2,4,5,6,7]
1914; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,7,7,7]
1915; SSE2-NEXT:    packuswb %xmm4, %xmm0
1916; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm1[2,3,3,3,4,5,6,7]
1917; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,4,4,5]
1918; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
1919; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[1,1,2,2,4,5,6,7]
1920; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,6,7,7,7]
1921; SSE2-NEXT:    packuswb %xmm1, %xmm4
1922; SSE2-NEXT:    movdqa %xmm4, 80(%rdi)
1923; SSE2-NEXT:    movdqa %xmm0, 64(%rdi)
1924; SSE2-NEXT:    movdqa %xmm7, 48(%rdi)
1925; SSE2-NEXT:    movdqa %xmm5, 32(%rdi)
1926; SSE2-NEXT:    movdqa %xmm3, 16(%rdi)
1927; SSE2-NEXT:    movdqa %xmm2, (%rdi)
1928; SSE2-NEXT:    retq
1929;
1930; SSE42-LABEL: splat3_128:
1931; SSE42:       # %bb.0:
1932; SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [0,0,0,1,1,1,2,2,2,3,3,3,4,4,4,5]
1933; SSE42-NEXT:    movdqa %xmm0, %xmm3
1934; SSE42-NEXT:    pshufb %xmm2, %xmm3
1935; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [5,5,6,6,6,7,7,7,8,8,8,9,9,9,10,10]
1936; SSE42-NEXT:    movdqa %xmm0, %xmm5
1937; SSE42-NEXT:    pshufb %xmm4, %xmm5
1938; SSE42-NEXT:    movdqa {{.*#+}} xmm6 = [10,11,11,11,12,12,12,13,13,13,14,14,14,15,15,15]
1939; SSE42-NEXT:    pshufb %xmm6, %xmm0
1940; SSE42-NEXT:    movdqa %xmm1, %xmm7
1941; SSE42-NEXT:    pshufb %xmm2, %xmm7
1942; SSE42-NEXT:    movdqa %xmm1, %xmm2
1943; SSE42-NEXT:    pshufb %xmm4, %xmm2
1944; SSE42-NEXT:    pshufb %xmm6, %xmm1
1945; SSE42-NEXT:    movdqa %xmm1, 80(%rdi)
1946; SSE42-NEXT:    movdqa %xmm2, 64(%rdi)
1947; SSE42-NEXT:    movdqa %xmm7, 48(%rdi)
1948; SSE42-NEXT:    movdqa %xmm0, 32(%rdi)
1949; SSE42-NEXT:    movdqa %xmm5, 16(%rdi)
1950; SSE42-NEXT:    movdqa %xmm3, (%rdi)
1951; SSE42-NEXT:    retq
1952;
1953; AVX1-LABEL: splat3_128:
1954; AVX1:       # %bb.0:
1955; AVX1-NEXT:    vpalignr {{.*#+}} xmm2 = xmm1[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]
1956; AVX1-NEXT:    vpalignr {{.*#+}} xmm3 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]
1957; AVX1-NEXT:    vpalignr {{.*#+}} xmm4 = xmm1[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10]
1958; AVX1-NEXT:    vpalignr {{.*#+}} xmm5 = xmm0[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10]
1959; AVX1-NEXT:    vpalignr {{.*#+}} xmm6 = xmm3[5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4]
1960; AVX1-NEXT:    vpalignr {{.*#+}} xmm7 = xmm2[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4]
1961; AVX1-NEXT:    vpalignr {{.*#+}} xmm3 = xmm5[5,6,7,8,9,10,11,12,13,14,15],xmm3[0,1,2,3,4]
1962; AVX1-NEXT:    vpalignr {{.*#+}} xmm2 = xmm4[5,6,7,8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4]
1963; AVX1-NEXT:    vpalignr {{.*#+}} xmm5 = xmm0[5,6,7,8,9,10,11,12,13,14,15],xmm5[0,1,2,3,4]
1964; AVX1-NEXT:    vpalignr {{.*#+}} xmm4 = xmm1[5,6,7,8,9,10,11,12,13,14,15],xmm4[0,1,2,3,4]
1965; AVX1-NEXT:    vpalignr {{.*#+}} xmm1 = xmm7[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4]
1966; AVX1-NEXT:    vpalignr {{.*#+}} xmm0 = xmm6[5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4]
1967; AVX1-NEXT:    vpalignr {{.*#+}} xmm2 = xmm2[5,6,7,8,9,10,11,12,13,14,15],xmm4[0,1,2,3,4]
1968; AVX1-NEXT:    vpalignr {{.*#+}} xmm3 = xmm3[5,6,7,8,9,10,11,12,13,14,15],xmm5[0,1,2,3,4]
1969; AVX1-NEXT:    vpalignr {{.*#+}} xmm4 = xmm4[5,6,7,8,9,10,11,12,13,14,15],xmm7[0,1,2,3,4]
1970; AVX1-NEXT:    vpalignr {{.*#+}} xmm5 = xmm5[5,6,7,8,9,10,11,12,13,14,15],xmm6[0,1,2,3,4]
1971; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [0,11,6,1,12,7,2,13,8,3,14,9,4,15,10,5]
1972; AVX1-NEXT:    vpshufb %xmm6, %xmm3, %xmm3
1973; AVX1-NEXT:    vpshufb %xmm6, %xmm0, %xmm0
1974; AVX1-NEXT:    vpshufb %xmm6, %xmm5, %xmm5
1975; AVX1-NEXT:    vpshufb %xmm6, %xmm1, %xmm1
1976; AVX1-NEXT:    vpshufb %xmm6, %xmm2, %xmm2
1977; AVX1-NEXT:    vpshufb %xmm6, %xmm4, %xmm4
1978; AVX1-NEXT:    vmovdqa %xmm4, 80(%rdi)
1979; AVX1-NEXT:    vmovdqa %xmm2, 64(%rdi)
1980; AVX1-NEXT:    vmovdqa %xmm1, 48(%rdi)
1981; AVX1-NEXT:    vmovdqa %xmm5, 32(%rdi)
1982; AVX1-NEXT:    vmovdqa %xmm3, 16(%rdi)
1983; AVX1-NEXT:    vmovdqa %xmm0, (%rdi)
1984; AVX1-NEXT:    retq
1985;
1986; AVX2-LABEL: splat3_128:
1987; AVX2:       # %bb.0:
1988; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
1989; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1990; AVX2-NEXT:    vpalignr {{.*#+}} ymm1 = ymm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5,22,23,24,25,26,27,28,29,30,31,16,17,18,19,20,21]
1991; AVX2-NEXT:    vpalignr {{.*#+}} ymm2 = ymm0[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10,27,28,29,30,31,16,17,18,19,20,21,22,23,24,25,26]
1992; AVX2-NEXT:    vpalignr {{.*#+}} ymm3 = ymm1[5,6,7,8,9,10,11,12,13,14,15],ymm0[0,1,2,3,4],ymm1[21,22,23,24,25,26,27,28,29,30,31],ymm0[16,17,18,19,20]
1993; AVX2-NEXT:    vpalignr {{.*#+}} ymm1 = ymm2[5,6,7,8,9,10,11,12,13,14,15],ymm1[0,1,2,3,4],ymm2[21,22,23,24,25,26,27,28,29,30,31],ymm1[16,17,18,19,20]
1994; AVX2-NEXT:    vpalignr {{.*#+}} ymm2 = ymm0[5,6,7,8,9,10,11,12,13,14,15],ymm2[0,1,2,3,4],ymm0[21,22,23,24,25,26,27,28,29,30,31],ymm2[16,17,18,19,20]
1995; AVX2-NEXT:    vpalignr {{.*#+}} ymm0 = ymm3[5,6,7,8,9,10,11,12,13,14,15],ymm0[0,1,2,3,4],ymm3[21,22,23,24,25,26,27,28,29,30,31],ymm0[16,17,18,19,20]
1996; AVX2-NEXT:    vpalignr {{.*#+}} ymm1 = ymm1[5,6,7,8,9,10,11,12,13,14,15],ymm2[0,1,2,3,4],ymm1[21,22,23,24,25,26,27,28,29,30,31],ymm2[16,17,18,19,20]
1997; AVX2-NEXT:    vpalignr {{.*#+}} ymm2 = ymm2[5,6,7,8,9,10,11,12,13,14,15],ymm3[0,1,2,3,4],ymm2[21,22,23,24,25,26,27,28,29,30,31],ymm3[16,17,18,19,20]
1998; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm3
1999; AVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [0,11,6,1,12,7,2,13,8,3,14,9,4,15,10,5,0,11,6,1,12,7,2,13,8,3,14,9,4,15,10,5]
2000; AVX2-NEXT:    vpshufb %ymm4, %ymm3, %ymm3
2001; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7]
2002; AVX2-NEXT:    vpshufb %ymm4, %ymm0, %ymm0
2003; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm1 = ymm1[2,3],ymm2[2,3]
2004; AVX2-NEXT:    vpshufb %ymm4, %ymm1, %ymm1
2005; AVX2-NEXT:    vmovdqa %ymm1, 64(%rdi)
2006; AVX2-NEXT:    vmovdqa %ymm0, 32(%rdi)
2007; AVX2-NEXT:    vmovdqa %ymm3, (%rdi)
2008; AVX2-NEXT:    vzeroupper
2009; AVX2-NEXT:    retq
2010;
2011; XOP-LABEL: splat3_128:
2012; XOP:       # %bb.0:
2013; XOP-NEXT:    vpalignr {{.*#+}} xmm2 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]
2014; XOP-NEXT:    vpalignr {{.*#+}} xmm3 = xmm1[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]
2015; XOP-NEXT:    vpalignr {{.*#+}} xmm4 = xmm0[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10]
2016; XOP-NEXT:    vpalignr {{.*#+}} xmm5 = xmm1[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10]
2017; XOP-NEXT:    vpalignr {{.*#+}} xmm6 = xmm3[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4]
2018; XOP-NEXT:    vpalignr {{.*#+}} xmm7 = xmm2[5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4]
2019; XOP-NEXT:    vpalignr {{.*#+}} xmm8 = xmm5[5,6,7,8,9,10,11,12,13,14,15],xmm3[0,1,2,3,4]
2020; XOP-NEXT:    vpalignr {{.*#+}} xmm2 = xmm4[5,6,7,8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4]
2021; XOP-NEXT:    vpalignr {{.*#+}} xmm5 = xmm1[5,6,7,8,9,10,11,12,13,14,15],xmm5[0,1,2,3,4]
2022; XOP-NEXT:    vpalignr {{.*#+}} xmm4 = xmm0[5,6,7,8,9,10,11,12,13,14,15],xmm4[0,1,2,3,4]
2023; XOP-NEXT:    vmovdqa {{.*#+}} xmm3 = [5,16,11,6,17,12,7,18,13,8,19,14,9,20,15,10]
2024; XOP-NEXT:    vpperm %xmm3, %xmm4, %xmm2, %xmm2
2025; XOP-NEXT:    vpperm %xmm3, %xmm0, %xmm7, %xmm0
2026; XOP-NEXT:    vpperm %xmm3, %xmm7, %xmm4, %xmm4
2027; XOP-NEXT:    vpperm %xmm3, %xmm1, %xmm6, %xmm1
2028; XOP-NEXT:    vpperm %xmm3, %xmm5, %xmm8, %xmm7
2029; XOP-NEXT:    vpperm %xmm3, %xmm6, %xmm5, %xmm3
2030; XOP-NEXT:    vmovdqa %xmm3, 80(%rdi)
2031; XOP-NEXT:    vmovdqa %xmm7, 64(%rdi)
2032; XOP-NEXT:    vmovdqa %xmm1, 48(%rdi)
2033; XOP-NEXT:    vmovdqa %xmm4, 32(%rdi)
2034; XOP-NEXT:    vmovdqa %xmm2, 16(%rdi)
2035; XOP-NEXT:    vmovdqa %xmm0, (%rdi)
2036; XOP-NEXT:    retq
2037  %1 = shufflevector <16 x i8> %a0, <16 x i8> %a1, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
2038  %2 = shufflevector <16 x i8> %a0, <16 x i8> %a1, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
2039  %3 = shufflevector <64 x i8> %1, <64 x i8> %2, <96 x i32> <i32 0, i32 32, i32 64, i32 1, i32 33, i32 65, i32 2, i32 34, i32 66, i32 3, i32 35, i32 67, i32 4, i32 36, i32 68, i32 5, i32 37, i32 69, i32 6, i32 38, i32 70, i32 7, i32 39, i32 71, i32 8, i32 40, i32 72, i32 9, i32 41, i32 73, i32 10, i32 42, i32 74, i32 11, i32 43, i32 75, i32 12, i32 44, i32 76, i32 13, i32 45, i32 77, i32 14, i32 46, i32 78, i32 15, i32 47, i32 79, i32 16, i32 48, i32 80, i32 17, i32 49, i32 81, i32 18, i32 50, i32 82, i32 19, i32 51, i32 83, i32 20, i32 52, i32 84, i32 21, i32 53, i32 85, i32 22, i32 54, i32 86, i32 23, i32 55, i32 87, i32 24, i32 56, i32 88, i32 25, i32 57, i32 89, i32 26, i32 58, i32 90, i32 27, i32 59, i32 91, i32 28, i32 60, i32 92, i32 29, i32 61, i32 93, i32 30, i32 62, i32 94, i32 31, i32 63, i32 95>
2040  store <96 x i8> %3, <96 x i8>* %a2
2041  ret void
2042}
2043
2044; Repeat each element x 3 of <32 x i8> a0 to create a <96 x i8>.
2045define void @splat3_256(<32 x i8> %a0, <96 x i8> *%a1) {
2046; SSE2-LABEL: splat3_256:
2047; SSE2:       # %bb.0:
2048; SSE2-NEXT:    pxor %xmm4, %xmm4
2049; SSE2-NEXT:    movdqa %xmm0, %xmm3
2050; 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]
2051; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm3[2,3,3,3,4,5,6,7]
2052; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm2[0,1,2,3,4,4,4,5]
2053; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,1,0,1]
2054; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,0,0,1,4,5,6,7]
2055; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,5,6,6]
2056; SSE2-NEXT:    packuswb %xmm5, %xmm2
2057; SSE2-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm4[8],xmm0[9],xmm4[9],xmm0[10],xmm4[10],xmm0[11],xmm4[11],xmm0[12],xmm4[12],xmm0[13],xmm4[13],xmm0[14],xmm4[14],xmm0[15],xmm4[15]
2058; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,1,0,1]
2059; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm5[0,0,0,1,4,5,6,7]
2060; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,5,5,6,6]
2061; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]
2062; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[1,1,2,2,4,5,6,7]
2063; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,6,7,7,7]
2064; SSE2-NEXT:    packuswb %xmm5, %xmm3
2065; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm0[2,3,3,3,4,5,6,7]
2066; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,4,4,4,5]
2067; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
2068; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,1,2,2,4,5,6,7]
2069; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,7,7,7]
2070; SSE2-NEXT:    packuswb %xmm0, %xmm5
2071; SSE2-NEXT:    movdqa %xmm1, %xmm0
2072; 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]
2073; SSE2-NEXT:    pshuflw {{.*#+}} xmm6 = xmm0[2,3,3,3,4,5,6,7]
2074; SSE2-NEXT:    pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,4,4,4,5]
2075; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[0,1,0,1]
2076; SSE2-NEXT:    pshuflw {{.*#+}} xmm7 = xmm7[0,0,0,1,4,5,6,7]
2077; SSE2-NEXT:    pshufhw {{.*#+}} xmm7 = xmm7[0,1,2,3,5,5,6,6]
2078; SSE2-NEXT:    packuswb %xmm6, %xmm7
2079; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm4[8],xmm1[9],xmm4[9],xmm1[10],xmm4[10],xmm1[11],xmm4[11],xmm1[12],xmm4[12],xmm1[13],xmm4[13],xmm1[14],xmm4[14],xmm1[15],xmm4[15]
2080; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,1,0,1]
2081; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[0,0,0,1,4,5,6,7]
2082; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,5,5,6,6]
2083; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
2084; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,1,2,2,4,5,6,7]
2085; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,7,7,7]
2086; SSE2-NEXT:    packuswb %xmm4, %xmm0
2087; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm1[2,3,3,3,4,5,6,7]
2088; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,4,4,5]
2089; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
2090; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[1,1,2,2,4,5,6,7]
2091; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,6,7,7,7]
2092; SSE2-NEXT:    packuswb %xmm1, %xmm4
2093; SSE2-NEXT:    movdqa %xmm4, 80(%rdi)
2094; SSE2-NEXT:    movdqa %xmm0, 64(%rdi)
2095; SSE2-NEXT:    movdqa %xmm7, 48(%rdi)
2096; SSE2-NEXT:    movdqa %xmm5, 32(%rdi)
2097; SSE2-NEXT:    movdqa %xmm3, 16(%rdi)
2098; SSE2-NEXT:    movdqa %xmm2, (%rdi)
2099; SSE2-NEXT:    retq
2100;
2101; SSE42-LABEL: splat3_256:
2102; SSE42:       # %bb.0:
2103; SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [0,0,0,1,1,1,2,2,2,3,3,3,4,4,4,5]
2104; SSE42-NEXT:    movdqa %xmm0, %xmm3
2105; SSE42-NEXT:    pshufb %xmm2, %xmm3
2106; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [5,5,6,6,6,7,7,7,8,8,8,9,9,9,10,10]
2107; SSE42-NEXT:    movdqa %xmm0, %xmm5
2108; SSE42-NEXT:    pshufb %xmm4, %xmm5
2109; SSE42-NEXT:    movdqa {{.*#+}} xmm6 = [10,11,11,11,12,12,12,13,13,13,14,14,14,15,15,15]
2110; SSE42-NEXT:    pshufb %xmm6, %xmm0
2111; SSE42-NEXT:    movdqa %xmm1, %xmm7
2112; SSE42-NEXT:    pshufb %xmm2, %xmm7
2113; SSE42-NEXT:    movdqa %xmm1, %xmm2
2114; SSE42-NEXT:    pshufb %xmm4, %xmm2
2115; SSE42-NEXT:    pshufb %xmm6, %xmm1
2116; SSE42-NEXT:    movdqa %xmm1, 80(%rdi)
2117; SSE42-NEXT:    movdqa %xmm2, 64(%rdi)
2118; SSE42-NEXT:    movdqa %xmm7, 48(%rdi)
2119; SSE42-NEXT:    movdqa %xmm0, 32(%rdi)
2120; SSE42-NEXT:    movdqa %xmm5, 16(%rdi)
2121; SSE42-NEXT:    movdqa %xmm3, (%rdi)
2122; SSE42-NEXT:    retq
2123;
2124; AVX1-LABEL: splat3_256:
2125; AVX1:       # %bb.0:
2126; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2127; AVX1-NEXT:    vpalignr {{.*#+}} xmm2 = xmm1[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]
2128; AVX1-NEXT:    vpalignr {{.*#+}} xmm3 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]
2129; AVX1-NEXT:    vpalignr {{.*#+}} xmm4 = xmm1[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10]
2130; AVX1-NEXT:    vpalignr {{.*#+}} xmm5 = xmm0[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10]
2131; AVX1-NEXT:    vpalignr {{.*#+}} xmm6 = xmm3[5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4]
2132; AVX1-NEXT:    vpalignr {{.*#+}} xmm7 = xmm2[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4]
2133; AVX1-NEXT:    vpalignr {{.*#+}} xmm3 = xmm5[5,6,7,8,9,10,11,12,13,14,15],xmm3[0,1,2,3,4]
2134; AVX1-NEXT:    vpalignr {{.*#+}} xmm2 = xmm4[5,6,7,8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4]
2135; AVX1-NEXT:    vpalignr {{.*#+}} xmm5 = xmm0[5,6,7,8,9,10,11,12,13,14,15],xmm5[0,1,2,3,4]
2136; AVX1-NEXT:    vpalignr {{.*#+}} xmm4 = xmm1[5,6,7,8,9,10,11,12,13,14,15],xmm4[0,1,2,3,4]
2137; AVX1-NEXT:    vpalignr {{.*#+}} xmm1 = xmm7[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4]
2138; AVX1-NEXT:    vpalignr {{.*#+}} xmm0 = xmm6[5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4]
2139; AVX1-NEXT:    vpalignr {{.*#+}} xmm2 = xmm2[5,6,7,8,9,10,11,12,13,14,15],xmm4[0,1,2,3,4]
2140; AVX1-NEXT:    vpalignr {{.*#+}} xmm3 = xmm3[5,6,7,8,9,10,11,12,13,14,15],xmm5[0,1,2,3,4]
2141; AVX1-NEXT:    vpalignr {{.*#+}} xmm4 = xmm4[5,6,7,8,9,10,11,12,13,14,15],xmm7[0,1,2,3,4]
2142; AVX1-NEXT:    vpalignr {{.*#+}} xmm5 = xmm5[5,6,7,8,9,10,11,12,13,14,15],xmm6[0,1,2,3,4]
2143; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [0,11,6,1,12,7,2,13,8,3,14,9,4,15,10,5]
2144; AVX1-NEXT:    vpshufb %xmm6, %xmm3, %xmm3
2145; AVX1-NEXT:    vpshufb %xmm6, %xmm0, %xmm0
2146; AVX1-NEXT:    vpshufb %xmm6, %xmm5, %xmm5
2147; AVX1-NEXT:    vpshufb %xmm6, %xmm1, %xmm1
2148; AVX1-NEXT:    vpshufb %xmm6, %xmm2, %xmm2
2149; AVX1-NEXT:    vpshufb %xmm6, %xmm4, %xmm4
2150; AVX1-NEXT:    vmovdqa %xmm4, 80(%rdi)
2151; AVX1-NEXT:    vmovdqa %xmm2, 64(%rdi)
2152; AVX1-NEXT:    vmovdqa %xmm1, 48(%rdi)
2153; AVX1-NEXT:    vmovdqa %xmm5, 32(%rdi)
2154; AVX1-NEXT:    vmovdqa %xmm3, 16(%rdi)
2155; AVX1-NEXT:    vmovdqa %xmm0, (%rdi)
2156; AVX1-NEXT:    vzeroupper
2157; AVX1-NEXT:    retq
2158;
2159; AVX2-LABEL: splat3_256:
2160; AVX2:       # %bb.0:
2161; AVX2-NEXT:    vpalignr {{.*#+}} ymm1 = ymm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5,22,23,24,25,26,27,28,29,30,31,16,17,18,19,20,21]
2162; AVX2-NEXT:    vpalignr {{.*#+}} ymm2 = ymm0[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10,27,28,29,30,31,16,17,18,19,20,21,22,23,24,25,26]
2163; AVX2-NEXT:    vpalignr {{.*#+}} ymm3 = ymm1[5,6,7,8,9,10,11,12,13,14,15],ymm0[0,1,2,3,4],ymm1[21,22,23,24,25,26,27,28,29,30,31],ymm0[16,17,18,19,20]
2164; AVX2-NEXT:    vpalignr {{.*#+}} ymm1 = ymm2[5,6,7,8,9,10,11,12,13,14,15],ymm1[0,1,2,3,4],ymm2[21,22,23,24,25,26,27,28,29,30,31],ymm1[16,17,18,19,20]
2165; AVX2-NEXT:    vpalignr {{.*#+}} ymm2 = ymm0[5,6,7,8,9,10,11,12,13,14,15],ymm2[0,1,2,3,4],ymm0[21,22,23,24,25,26,27,28,29,30,31],ymm2[16,17,18,19,20]
2166; AVX2-NEXT:    vpalignr {{.*#+}} ymm0 = ymm3[5,6,7,8,9,10,11,12,13,14,15],ymm0[0,1,2,3,4],ymm3[21,22,23,24,25,26,27,28,29,30,31],ymm0[16,17,18,19,20]
2167; AVX2-NEXT:    vpalignr {{.*#+}} ymm1 = ymm1[5,6,7,8,9,10,11,12,13,14,15],ymm2[0,1,2,3,4],ymm1[21,22,23,24,25,26,27,28,29,30,31],ymm2[16,17,18,19,20]
2168; AVX2-NEXT:    vpalignr {{.*#+}} ymm2 = ymm2[5,6,7,8,9,10,11,12,13,14,15],ymm3[0,1,2,3,4],ymm2[21,22,23,24,25,26,27,28,29,30,31],ymm3[16,17,18,19,20]
2169; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm3
2170; AVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [0,11,6,1,12,7,2,13,8,3,14,9,4,15,10,5,0,11,6,1,12,7,2,13,8,3,14,9,4,15,10,5]
2171; AVX2-NEXT:    vpshufb %ymm4, %ymm3, %ymm3
2172; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7]
2173; AVX2-NEXT:    vpshufb %ymm4, %ymm0, %ymm0
2174; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm1 = ymm1[2,3],ymm2[2,3]
2175; AVX2-NEXT:    vpshufb %ymm4, %ymm1, %ymm1
2176; AVX2-NEXT:    vmovdqa %ymm1, 64(%rdi)
2177; AVX2-NEXT:    vmovdqa %ymm0, 32(%rdi)
2178; AVX2-NEXT:    vmovdqa %ymm3, (%rdi)
2179; AVX2-NEXT:    vzeroupper
2180; AVX2-NEXT:    retq
2181;
2182; XOP-LABEL: splat3_256:
2183; XOP:       # %bb.0:
2184; XOP-NEXT:    vpalignr {{.*#+}} xmm1 = xmm0[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]
2185; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm2
2186; XOP-NEXT:    vpalignr {{.*#+}} xmm3 = xmm2[6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5]
2187; XOP-NEXT:    vpalignr {{.*#+}} xmm4 = xmm0[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10]
2188; XOP-NEXT:    vpalignr {{.*#+}} xmm5 = xmm2[11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10]
2189; XOP-NEXT:    vpalignr {{.*#+}} xmm6 = xmm3[5,6,7,8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4]
2190; XOP-NEXT:    vpalignr {{.*#+}} xmm7 = xmm1[5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4]
2191; XOP-NEXT:    vpalignr {{.*#+}} xmm8 = xmm5[5,6,7,8,9,10,11,12,13,14,15],xmm3[0,1,2,3,4]
2192; XOP-NEXT:    vpalignr {{.*#+}} xmm1 = xmm4[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4]
2193; XOP-NEXT:    vpalignr {{.*#+}} xmm5 = xmm2[5,6,7,8,9,10,11,12,13,14,15],xmm5[0,1,2,3,4]
2194; XOP-NEXT:    vpalignr {{.*#+}} xmm4 = xmm0[5,6,7,8,9,10,11,12,13,14,15],xmm4[0,1,2,3,4]
2195; XOP-NEXT:    vmovdqa {{.*#+}} xmm3 = [5,16,11,6,17,12,7,18,13,8,19,14,9,20,15,10]
2196; XOP-NEXT:    vpperm %xmm3, %xmm4, %xmm1, %xmm1
2197; XOP-NEXT:    vpperm %xmm3, %xmm0, %xmm7, %xmm0
2198; XOP-NEXT:    vpperm %xmm3, %xmm7, %xmm4, %xmm4
2199; XOP-NEXT:    vpperm %xmm3, %xmm2, %xmm6, %xmm2
2200; XOP-NEXT:    vpperm %xmm3, %xmm5, %xmm8, %xmm7
2201; XOP-NEXT:    vpperm %xmm3, %xmm6, %xmm5, %xmm3
2202; XOP-NEXT:    vmovdqa %xmm3, 80(%rdi)
2203; XOP-NEXT:    vmovdqa %xmm7, 64(%rdi)
2204; XOP-NEXT:    vmovdqa %xmm2, 48(%rdi)
2205; XOP-NEXT:    vmovdqa %xmm4, 32(%rdi)
2206; XOP-NEXT:    vmovdqa %xmm1, 16(%rdi)
2207; XOP-NEXT:    vmovdqa %xmm0, (%rdi)
2208; XOP-NEXT:    vzeroupper
2209; XOP-NEXT:    retq
2210  %1 = shufflevector <32 x i8> %a0, <32 x i8> undef, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
2211  %2 = shufflevector <32 x i8> %a0, <32 x i8> undef, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
2212  %3 = shufflevector <64 x i8> %1, <64 x i8> %2, <96 x i32> <i32 0, i32 32, i32 64, i32 1, i32 33, i32 65, i32 2, i32 34, i32 66, i32 3, i32 35, i32 67, i32 4, i32 36, i32 68, i32 5, i32 37, i32 69, i32 6, i32 38, i32 70, i32 7, i32 39, i32 71, i32 8, i32 40, i32 72, i32 9, i32 41, i32 73, i32 10, i32 42, i32 74, i32 11, i32 43, i32 75, i32 12, i32 44, i32 76, i32 13, i32 45, i32 77, i32 14, i32 46, i32 78, i32 15, i32 47, i32 79, i32 16, i32 48, i32 80, i32 17, i32 49, i32 81, i32 18, i32 50, i32 82, i32 19, i32 51, i32 83, i32 20, i32 52, i32 84, i32 21, i32 53, i32 85, i32 22, i32 54, i32 86, i32 23, i32 55, i32 87, i32 24, i32 56, i32 88, i32 25, i32 57, i32 89, i32 26, i32 58, i32 90, i32 27, i32 59, i32 91, i32 28, i32 60, i32 92, i32 29, i32 61, i32 93, i32 30, i32 62, i32 94, i32 31, i32 63, i32 95>
2213  store <96 x i8> %3, <96 x i8>* %a1
2214  ret void
2215}
2216
2217; D79987
2218define <16 x i32> @splat_v3i32(<3 x i32>* %ptr) {
2219; SSE2-LABEL: splat_v3i32:
2220; SSE2:       # %bb.0:
2221; SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
2222; SSE2-NEXT:    xorps %xmm1, %xmm1
2223; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
2224; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,0,1]
2225; SSE2-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2226; SSE2-NEXT:    xorps %xmm1, %xmm1
2227; SSE2-NEXT:    xorps %xmm3, %xmm3
2228; SSE2-NEXT:    retq
2229;
2230; SSE42-LABEL: splat_v3i32:
2231; SSE42:       # %bb.0:
2232; SSE42-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2233; SSE42-NEXT:    pxor %xmm1, %xmm1
2234; SSE42-NEXT:    pxor %xmm2, %xmm2
2235; SSE42-NEXT:    pblendw {{.*#+}} xmm2 = xmm0[0,1],xmm2[2,3,4,5,6,7]
2236; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5,6,7]
2237; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,0,1]
2238; SSE42-NEXT:    pxor %xmm1, %xmm1
2239; SSE42-NEXT:    xorps %xmm3, %xmm3
2240; SSE42-NEXT:    retq
2241;
2242; AVX1-LABEL: splat_v3i32:
2243; AVX1:       # %bb.0:
2244; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = mem[0,0]
2245; AVX1-NEXT:    vxorps %xmm2, %xmm2, %xmm2
2246; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm2[0],ymm1[1],ymm2[2,3,4,5,6,7]
2247; AVX1-NEXT:    vblendps {{.*#+}} ymm1 = ymm2[0,1],ymm1[2],ymm2[3,4,5,6,7]
2248; AVX1-NEXT:    retq
2249;
2250; AVX2-SLOW-LABEL: splat_v3i32:
2251; AVX2-SLOW:       # %bb.0:
2252; AVX2-SLOW-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
2253; AVX2-SLOW-NEXT:    vxorps %xmm2, %xmm2, %xmm2
2254; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm0 = ymm2[0],ymm1[1],ymm2[2,3,4,5,6,7]
2255; AVX2-SLOW-NEXT:    vbroadcastss %xmm1, %xmm1
2256; AVX2-SLOW-NEXT:    vblendps {{.*#+}} ymm1 = ymm2[0,1],ymm1[2],ymm2[3,4,5,6,7]
2257; AVX2-SLOW-NEXT:    retq
2258;
2259; AVX2-FAST-LABEL: splat_v3i32:
2260; AVX2-FAST:       # %bb.0:
2261; AVX2-FAST-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
2262; AVX2-FAST-NEXT:    vpxor %xmm0, %xmm0, %xmm0
2263; AVX2-FAST-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2,3,4,5,6,7]
2264; AVX2-FAST-NEXT:    vpshufb {{.*#+}} ymm1 = zero,zero,zero,zero,zero,zero,zero,zero,ymm1[0,1,2,3],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
2265; AVX2-FAST-NEXT:    retq
2266;
2267; XOP-LABEL: splat_v3i32:
2268; XOP:       # %bb.0:
2269; XOP-NEXT:    vmovddup {{.*#+}} xmm1 = mem[0,0]
2270; XOP-NEXT:    vxorps %xmm2, %xmm2, %xmm2
2271; XOP-NEXT:    vblendps {{.*#+}} ymm0 = ymm2[0],ymm1[1],ymm2[2,3,4,5,6,7]
2272; XOP-NEXT:    vblendps {{.*#+}} ymm1 = ymm2[0,1],ymm1[2],ymm2[3,4,5,6,7]
2273; XOP-NEXT:    retq
2274  %1 = load <3 x i32>, <3 x i32>* %ptr, align 1
2275  %2 = shufflevector <3 x i32> %1, <3 x i32> undef, <16 x i32> <i32 0, i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
2276  %3 = shufflevector <16 x i32> <i32 0, i32 undef, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 0, i32 0, i32 0, i32 0, i32 0>, <16 x i32> %2, <16 x i32> <i32 0, i32 17, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 16, i32 11, i32 12, i32 13, i32 14, i32 15>
2277  ret <16 x i32 > %3
2278}
2279
2280define <2 x double> @wrongorder(<4 x double> %A, <8 x double>* %P) #0 {
2281; SSE2-LABEL: wrongorder:
2282; SSE2:       # %bb.0:
2283; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
2284; SSE2-NEXT:    movaps %xmm0, 48(%rdi)
2285; SSE2-NEXT:    movaps %xmm0, 32(%rdi)
2286; SSE2-NEXT:    movaps %xmm0, 16(%rdi)
2287; SSE2-NEXT:    movaps %xmm0, (%rdi)
2288; SSE2-NEXT:    retq
2289;
2290; SSE42-LABEL: wrongorder:
2291; SSE42:       # %bb.0:
2292; SSE42-NEXT:    movddup {{.*#+}} xmm0 = xmm0[0,0]
2293; SSE42-NEXT:    movapd %xmm0, 48(%rdi)
2294; SSE42-NEXT:    movapd %xmm0, 32(%rdi)
2295; SSE42-NEXT:    movapd %xmm0, 16(%rdi)
2296; SSE42-NEXT:    movapd %xmm0, (%rdi)
2297; SSE42-NEXT:    retq
2298;
2299; AVX1-LABEL: wrongorder:
2300; AVX1:       # %bb.0:
2301; AVX1-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
2302; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm1
2303; AVX1-NEXT:    vmovaps %ymm1, 32(%rdi)
2304; AVX1-NEXT:    vmovaps %ymm1, (%rdi)
2305; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2306; AVX1-NEXT:    vzeroupper
2307; AVX1-NEXT:    retq
2308;
2309; AVX2-LABEL: wrongorder:
2310; AVX2:       # %bb.0:
2311; AVX2-NEXT:    vbroadcastsd %xmm0, %ymm0
2312; AVX2-NEXT:    vmovaps %ymm0, 32(%rdi)
2313; AVX2-NEXT:    vmovaps %ymm0, (%rdi)
2314; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2315; AVX2-NEXT:    vzeroupper
2316; AVX2-NEXT:    retq
2317;
2318; XOP-LABEL: wrongorder:
2319; XOP:       # %bb.0:
2320; XOP-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
2321; XOP-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm1
2322; XOP-NEXT:    vmovaps %ymm1, 32(%rdi)
2323; XOP-NEXT:    vmovaps %ymm1, (%rdi)
2324; XOP-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2325; XOP-NEXT:    vzeroupper
2326; XOP-NEXT:    retq
2327  %shuffle = shufflevector <4 x double> %A, <4 x double> %A, <8 x i32> zeroinitializer
2328  store <8 x double> %shuffle, <8 x double>* %P, align 64
2329  %m2 = load <8 x double>, <8 x double>* %P, align 64
2330  store <8 x double> %m2, <8 x double>* %P, align 64
2331  %m3 = load <8 x double>, <8 x double>* %P, align 64
2332  %m4 = shufflevector <8 x double> %m3, <8 x double> undef, <2 x i32> <i32 2, i32 0>
2333  ret <2 x double> %m4
2334}
2335
2336define void @PR41097() {
2337; SSE2-LABEL: PR41097:
2338; SSE2:       # %bb.0:
2339; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2340; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2341; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
2342; SSE2-NEXT:    psrad $24, %xmm0
2343; SSE2-NEXT:    pxor %xmm1, %xmm1
2344; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2345; SSE2-NEXT:    movdqu %xmm0, (%rax)
2346; SSE2-NEXT:    retq
2347;
2348; SSE42-LABEL: PR41097:
2349; SSE42:       # %bb.0:
2350; SSE42-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2351; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,3,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2352; SSE42-NEXT:    pmovsxbd %xmm0, %xmm0
2353; SSE42-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
2354; SSE42-NEXT:    movdqu %xmm0, (%rax)
2355; SSE42-NEXT:    retq
2356;
2357; AVX-LABEL: PR41097:
2358; AVX:       # %bb.0:
2359; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2360; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,3,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2361; AVX-NEXT:    vpmovsxbd %xmm0, %xmm0
2362; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
2363; AVX-NEXT:    vmovdqu %xmm0, (%rax)
2364; AVX-NEXT:    retq
2365;
2366; XOP-LABEL: PR41097:
2367; XOP:       # %bb.0:
2368; XOP-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2369; XOP-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,3,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2370; XOP-NEXT:    vpmovsxbd %xmm0, %xmm0
2371; XOP-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
2372; XOP-NEXT:    vmovdqu %xmm0, (%rax)
2373; XOP-NEXT:    retq
2374  %wide.vec = load <6 x i8>, <6 x i8>* undef, align 1
2375  %strided.vec = shufflevector <6 x i8> %wide.vec, <6 x i8> undef, <2 x i32> <i32 0, i32 3>
2376  %tmp = sext <2 x i8> %strided.vec to <2 x i32>
2377  %tmp7 = zext <2 x i32> %tmp to <2 x i64>
2378  store <2 x i64> %tmp7, <2 x i64>* undef, align 8
2379  ret void
2380}
2381
2382define void @D107009(<64 x i32>* %input, <64 x i32>* %output) {
2383; SSE-LABEL: D107009:
2384; SSE:       # %bb.0:
2385; SSE-NEXT:    movdqa 16(%rdi), %xmm0
2386; SSE-NEXT:    movdqa 80(%rdi), %xmm1
2387; SSE-NEXT:    movdqa 144(%rdi), %xmm2
2388; SSE-NEXT:    movdqa 208(%rdi), %xmm3
2389; SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[1],mem[1]
2390; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2391; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2392; SSE-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],mem[0],xmm3[1],mem[1]
2393; SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[1],mem[1]
2394; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
2395; SSE-NEXT:    psrld $16, %xmm2
2396; SSE-NEXT:    psrld $16, %xmm0
2397; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
2398; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]
2399; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[3,3,3,3]
2400; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[1,1,1,1]
2401; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[2,3,2,3]
2402; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[3,3,3,3]
2403; SSE-NEXT:    movdqa %xmm0, 128(%rsi)
2404; SSE-NEXT:    movdqa %xmm2, 144(%rsi)
2405; SSE-NEXT:    movdqa %xmm0, 16(%rsi)
2406; SSE-NEXT:    movdqa %xmm7, 240(%rsi)
2407; SSE-NEXT:    movdqa %xmm6, 208(%rsi)
2408; SSE-NEXT:    movdqa %xmm5, 176(%rsi)
2409; SSE-NEXT:    movdqa %xmm4, 112(%rsi)
2410; SSE-NEXT:    movdqa %xmm3, 80(%rsi)
2411; SSE-NEXT:    movdqa %xmm1, 48(%rsi)
2412; SSE-NEXT:    retq
2413;
2414; AVX1-LABEL: D107009:
2415; AVX1:       # %bb.0:
2416; AVX1-NEXT:    vmovups 96(%rdi), %ymm0
2417; AVX1-NEXT:    vmovups (%rdi), %ymm1
2418; AVX1-NEXT:    vmovups 128(%rdi), %ymm2
2419; AVX1-NEXT:    vmovups 224(%rdi), %ymm3
2420; AVX1-NEXT:    vunpcklpd {{.*#+}} ymm3 = ymm3[0],mem[0],ymm3[2],mem[2]
2421; AVX1-NEXT:    vunpcklps {{.*#+}} ymm2 = ymm2[0],mem[0],ymm2[1],mem[1],ymm2[4],mem[4],ymm2[5],mem[5]
2422; AVX1-NEXT:    vshufps {{.*#+}} ymm2 = ymm2[0,1],ymm3[2,0],ymm2[4,5],ymm3[6,4]
2423; AVX1-NEXT:    vunpcklps {{.*#+}} ymm1 = ymm1[0],mem[0],ymm1[1],mem[1],ymm1[4],mem[4],ymm1[5],mem[5]
2424; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2425; AVX1-NEXT:    vunpcklpd {{.*#+}} ymm0 = ymm0[0],mem[0],ymm0[2],mem[2]
2426; AVX1-NEXT:    vpermilps {{.*#+}} ymm0 = ymm0[0,1,2,0,4,5,6,4]
2427; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2428; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
2429; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
2430; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm1
2431; AVX1-NEXT:    vpsrld $16, %xmm1, %xmm1
2432; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm1
2433; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[0,1,1,3]
2434; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[2,1,3,3]
2435; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
2436; AVX1-NEXT:    vmovshdup {{.*#+}} ymm3 = ymm1[1,1,3,3,5,5,7,7]
2437; AVX1-NEXT:    vpermilps {{.*#+}} ymm4 = ymm1[3,3,3,3,7,7,7,7]
2438; AVX1-NEXT:    vpermilpd {{.*#+}} ymm5 = ymm1[0,0,3,2]
2439; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm0[1,1,1,1]
2440; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm0, %ymm6
2441; AVX1-NEXT:    vpshufd {{.*#+}} xmm7 = xmm0[3,3,3,3]
2442; AVX1-NEXT:    vinsertf128 $1, %xmm7, %ymm0, %ymm7
2443; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
2444; AVX1-NEXT:    vmovups %ymm0, (%rsi)
2445; AVX1-NEXT:    vmovups %ymm1, 128(%rsi)
2446; AVX1-NEXT:    vmovups %ymm7, 96(%rsi)
2447; AVX1-NEXT:    vmovups %ymm6, 32(%rsi)
2448; AVX1-NEXT:    vmovupd %ymm5, 192(%rsi)
2449; AVX1-NEXT:    vmovups %ymm4, 224(%rsi)
2450; AVX1-NEXT:    vmovups %ymm3, 160(%rsi)
2451; AVX1-NEXT:    vmovups %ymm2, 64(%rsi)
2452; AVX1-NEXT:    vzeroupper
2453; AVX1-NEXT:    retq
2454;
2455; AVX2-LABEL: D107009:
2456; AVX2:       # %bb.0:
2457; AVX2-NEXT:    vmovdqu 64(%rdi), %ymm0
2458; AVX2-NEXT:    vmovdqu 128(%rdi), %ymm1
2459; AVX2-NEXT:    vmovdqu 192(%rdi), %ymm2
2460; AVX2-NEXT:    vpunpckldq {{.*#+}} ymm2 = ymm2[0],mem[0],ymm2[1],mem[1],ymm2[4],mem[4],ymm2[5],mem[5]
2461; AVX2-NEXT:    vpunpckldq {{.*#+}} ymm1 = ymm1[0],mem[0],ymm1[1],mem[1],ymm1[4],mem[4],ymm1[5],mem[5]
2462; AVX2-NEXT:    vpunpcklqdq {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[2],ymm2[2]
2463; AVX2-NEXT:    vpbroadcastd 48(%rdi), %xmm2
2464; AVX2-NEXT:    vpbroadcastd 16(%rdi), %ymm3
2465; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
2466; AVX2-NEXT:    vpunpckldq {{.*#+}} ymm0 = ymm0[0],mem[0],ymm0[1],mem[1],ymm0[4],mem[4],ymm0[5],mem[5]
2467; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[2,2,2,2]
2468; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3]
2469; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
2470; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
2471; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[3,3,3,3]
2472; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm1
2473; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]
2474; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm2
2475; AVX2-NEXT:    vpmovzxdq {{.*#+}} ymm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2476; AVX2-NEXT:    vpbroadcastd %xmm0, %ymm4
2477; AVX2-NEXT:    vpshufd {{.*#+}} ymm5 = ymm0[3,3,3,3,7,7,7,7]
2478; AVX2-NEXT:    vpshufd {{.*#+}} ymm6 = ymm0[2,3,2,3,6,7,6,7]
2479; AVX2-NEXT:    vpshufd {{.*#+}} ymm7 = ymm0[1,1,1,1,5,5,5,5]
2480; AVX2-NEXT:    vmovdqu %ymm0, 128(%rsi)
2481; AVX2-NEXT:    vmovdqu %ymm7, 160(%rsi)
2482; AVX2-NEXT:    vmovdqu %ymm6, 192(%rsi)
2483; AVX2-NEXT:    vmovdqu %ymm5, 224(%rsi)
2484; AVX2-NEXT:    vmovdqu %ymm4, (%rsi)
2485; AVX2-NEXT:    vmovdqu %ymm3, 64(%rsi)
2486; AVX2-NEXT:    vmovdqu %ymm2, 32(%rsi)
2487; AVX2-NEXT:    vmovdqu %ymm1, 96(%rsi)
2488; AVX2-NEXT:    vzeroupper
2489; AVX2-NEXT:    retq
2490;
2491; XOP-LABEL: D107009:
2492; XOP:       # %bb.0:
2493; XOP-NEXT:    vmovups 96(%rdi), %ymm0
2494; XOP-NEXT:    vmovups (%rdi), %ymm1
2495; XOP-NEXT:    vmovups 128(%rdi), %ymm2
2496; XOP-NEXT:    vmovups 224(%rdi), %ymm3
2497; XOP-NEXT:    vunpcklpd {{.*#+}} ymm3 = ymm3[0],mem[0],ymm3[2],mem[2]
2498; XOP-NEXT:    vunpcklps {{.*#+}} ymm2 = ymm2[0],mem[0],ymm2[1],mem[1],ymm2[4],mem[4],ymm2[5],mem[5]
2499; XOP-NEXT:    vshufps {{.*#+}} ymm2 = ymm2[0,1],ymm3[2,0],ymm2[4,5],ymm3[6,4]
2500; XOP-NEXT:    vunpcklps {{.*#+}} ymm1 = ymm1[0],mem[0],ymm1[1],mem[1],ymm1[4],mem[4],ymm1[5],mem[5]
2501; XOP-NEXT:    vextractf128 $1, %ymm1, %xmm1
2502; XOP-NEXT:    vunpcklpd {{.*#+}} ymm0 = ymm0[0],mem[0],ymm0[2],mem[2]
2503; XOP-NEXT:    vpermilps {{.*#+}} ymm0 = ymm0[0,1,2,0,4,5,6,4]
2504; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm0
2505; XOP-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
2506; XOP-NEXT:    vpsrld $16, %xmm0, %xmm0
2507; XOP-NEXT:    vextractf128 $1, %ymm2, %xmm1
2508; XOP-NEXT:    vpsrld $16, %xmm1, %xmm1
2509; XOP-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm1
2510; XOP-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[0,1,1,3]
2511; XOP-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[2,1,3,3]
2512; XOP-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
2513; XOP-NEXT:    vmovshdup {{.*#+}} ymm3 = ymm1[1,1,3,3,5,5,7,7]
2514; XOP-NEXT:    vpermilps {{.*#+}} ymm4 = ymm1[3,3,3,3,7,7,7,7]
2515; XOP-NEXT:    vpermilpd {{.*#+}} ymm5 = ymm1[0,0,3,2]
2516; XOP-NEXT:    vpshufd {{.*#+}} xmm6 = xmm0[1,1,1,1]
2517; XOP-NEXT:    vinsertf128 $1, %xmm6, %ymm0, %ymm6
2518; XOP-NEXT:    vpshufd {{.*#+}} xmm7 = xmm0[3,3,3,3]
2519; XOP-NEXT:    vinsertf128 $1, %xmm7, %ymm0, %ymm7
2520; XOP-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
2521; XOP-NEXT:    vmovups %ymm0, (%rsi)
2522; XOP-NEXT:    vmovups %ymm1, 128(%rsi)
2523; XOP-NEXT:    vmovups %ymm7, 96(%rsi)
2524; XOP-NEXT:    vmovups %ymm6, 32(%rsi)
2525; XOP-NEXT:    vmovupd %ymm5, 192(%rsi)
2526; XOP-NEXT:    vmovups %ymm4, 224(%rsi)
2527; XOP-NEXT:    vmovups %ymm3, 160(%rsi)
2528; XOP-NEXT:    vmovups %ymm2, 64(%rsi)
2529; XOP-NEXT:    vzeroupper
2530; XOP-NEXT:    retq
2531  %i = load <64 x i32>, <64 x i32>* %input, align 16
2532  %i2 = shufflevector <64 x i32> %i, <64 x i32> poison, <8 x i32> <i32 4, i32 12, i32 20, i32 28, i32 36, i32 44, i32 52, i32 60>
2533  %i3 = lshr <8 x i32> %i2, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
2534  %i4 = add <8 x i32> zeroinitializer, %i3
2535  %i5 = shufflevector <8 x i32> %i4, <8 x i32> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
2536  %i6 = shufflevector <16 x i32> %i5, <16 x i32> poison, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
2537  %i7 = shufflevector <32 x i32> poison, <32 x i32> %i6, <64 x i32> <i32 0, i32 8, i32 16, i32 24, i32 32, i32 40, i32 48, i32 56, i32 1, i32 9, i32 17, i32 25, i32 33, i32 41, i32 49, i32 57, i32 2, i32 10, i32 18, i32 26, i32 34, i32 42, i32 50, i32 58, i32 3, i32 11, i32 19, i32 27, i32 35, i32 43, i32 51, i32 59, i32 4, i32 12, i32 20, i32 28, i32 36, i32 44, i32 52, i32 60, i32 5, i32 13, i32 21, i32 29, i32 37, i32 45, i32 53, i32 61, i32 6, i32 14, i32 22, i32 30, i32 38, i32 46, i32 54, i32 62, i32 7, i32 15, i32 23, i32 31, i32 39, i32 47, i32 55, i32 63>
2538  store <64 x i32> %i7, <64 x i32>* %output, align 16
2539  ret void
2540}
2541