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