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-prefix=AVX --check-prefix=AVX2
6
7define void @v3i64(<2 x i64> %a, <2 x i64> %b, <3 x i64>* %p) nounwind {
8; SSE2-LABEL: v3i64:
9; SSE2:       # BB#0:
10; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
11; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
12; SSE2-NEXT:    movq %xmm2, 16(%rdi)
13; SSE2-NEXT:    movdqa %xmm0, (%rdi)
14; SSE2-NEXT:    retq
15;
16; SSE42-LABEL: v3i64:
17; SSE42:       # BB#0:
18; SSE42-NEXT:    pextrq $1, %xmm0, 16(%rdi)
19; SSE42-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
20; SSE42-NEXT:    movdqa %xmm0, (%rdi)
21; SSE42-NEXT:    retq
22;
23; AVX1-LABEL: v3i64:
24; AVX1:       # BB#0:
25; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm0[0],xmm1[0]
26; AVX1-NEXT:    vpextrq $1, %xmm0, 16(%rdi)
27; AVX1-NEXT:    vmovapd %xmm1, (%rdi)
28; AVX1-NEXT:    retq
29;
30; AVX2-LABEL: v3i64:
31; AVX2:       # BB#0:
32; AVX2-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
33; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm1
34; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
35; AVX2-NEXT:    vpextrq $1, %xmm0, 16(%rdi)
36; AVX2-NEXT:    vmovdqa %xmm1, (%rdi)
37; AVX2-NEXT:    vzeroupper
38; AVX2-NEXT:    retq
39  %r = shufflevector <2 x i64> %a, <2 x i64> %b, <3 x i32> <i32 0, i32 2, i32 1>
40  store <3 x i64> %r, <3 x i64>* %p
41  ret void
42}
43define void @v3f64(<2 x double> %a, <2 x double> %b, <3 x double>* %p) nounwind {
44; SSE-LABEL: v3f64:
45; SSE:       # BB#0:
46; SSE-NEXT:    movhpd %xmm0, 16(%rdi)
47; SSE-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
48; SSE-NEXT:    movapd %xmm0, (%rdi)
49; SSE-NEXT:    retq
50;
51; AVX1-LABEL: v3f64:
52; AVX1:       # BB#0:
53; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm0[0],xmm1[0]
54; AVX1-NEXT:    vmovhpd %xmm0, 16(%rdi)
55; AVX1-NEXT:    vmovapd %xmm1, (%rdi)
56; AVX1-NEXT:    retq
57;
58; AVX2-LABEL: v3f64:
59; AVX2:       # BB#0:
60; AVX2-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
61; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm1
62; AVX2-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[0,2,1,3]
63; AVX2-NEXT:    vmovhpd %xmm0, 16(%rdi)
64; AVX2-NEXT:    vmovapd %xmm1, (%rdi)
65; AVX2-NEXT:    vzeroupper
66; AVX2-NEXT:    retq
67  %r = shufflevector <2 x double> %a, <2 x double> %b, <3 x i32> <i32 0, i32 2, i32 1>
68  store <3 x double> %r, <3 x double>* %p
69  ret void
70}
71
72define void @v3i32(<2 x i32> %a, <2 x i32> %b, <3 x i32>* %p) nounwind {
73; SSE2-LABEL: v3i32:
74; SSE2:       # BB#0:
75; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]
76; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
77; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
78; SSE2-NEXT:    movd %xmm0, 8(%rdi)
79; SSE2-NEXT:    movq %xmm2, (%rdi)
80; SSE2-NEXT:    retq
81;
82; SSE42-LABEL: v3i32:
83; SSE42:       # BB#0:
84; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
85; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
86; SSE42-NEXT:    pextrd $2, %xmm0, 8(%rdi)
87; SSE42-NEXT:    movq %xmm1, (%rdi)
88; SSE42-NEXT:    retq
89;
90; AVX1-LABEL: v3i32:
91; AVX1:       # BB#0:
92; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
93; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
94; AVX1-NEXT:    vpextrd $2, %xmm0, 8(%rdi)
95; AVX1-NEXT:    vmovq %xmm1, (%rdi)
96; AVX1-NEXT:    retq
97;
98; AVX2-LABEL: v3i32:
99; AVX2:       # BB#0:
100; AVX2-NEXT:    vpbroadcastd %xmm1, %xmm1
101; AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2,3]
102; AVX2-NEXT:    vpextrd $2, %xmm0, 8(%rdi)
103; AVX2-NEXT:    vmovq %xmm1, (%rdi)
104; AVX2-NEXT:    retq
105  %r = shufflevector <2 x i32> %a, <2 x i32> %b, <3 x i32> <i32 0, i32 2, i32 1>
106  store <3 x i32> %r, <3 x i32>* %p
107  ret void
108}
109
110define void @v5i16(<4 x i16> %a, <4 x i16> %b, <5 x i16>* %p) nounwind {
111; SSE2-LABEL: v5i16:
112; SSE2:       # BB#0:
113; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,1,2,3]
114; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[2,0,2,3,4,5,6,7]
115; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm0[0,2,2,3,4,5,6,7]
116; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,3,2,3]
117; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
118; SSE2-NEXT:    pextrw $6, %xmm0, %eax
119; SSE2-NEXT:    movw %ax, 8(%rdi)
120; SSE2-NEXT:    movq %xmm2, (%rdi)
121; SSE2-NEXT:    retq
122;
123; SSE42-LABEL: v5i16:
124; SSE42:       # BB#0:
125; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,1,2,3]
126; SSE42-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[2,0,2,3,4,5,6,7]
127; SSE42-NEXT:    pshuflw {{.*#+}} xmm2 = xmm0[0,2,2,3,4,5,6,7]
128; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,3,2,3]
129; SSE42-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
130; SSE42-NEXT:    pextrw $6, %xmm0, 8(%rdi)
131; SSE42-NEXT:    movq %xmm2, (%rdi)
132; SSE42-NEXT:    retq
133;
134; AVX-LABEL: v5i16:
135; AVX:       # BB#0:
136; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,1,2,3]
137; AVX-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[2,0,2,3,4,5,6,7]
138; AVX-NEXT:    vpshuflw {{.*#+}} xmm2 = xmm0[0,2,2,3,4,5,6,7]
139; AVX-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[0,3,2,3]
140; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
141; AVX-NEXT:    vpextrw $6, %xmm0, 8(%rdi)
142; AVX-NEXT:    vmovq %xmm1, (%rdi)
143; AVX-NEXT:    retq
144  %r = shufflevector <4 x i16> %a, <4 x i16> %b, <5 x i32> <i32 0, i32 5, i32 1, i32 6, i32 3>
145  store <5 x i16> %r, <5 x i16>* %p
146  ret void
147}
148
149define void @v5i32(<4 x i32> %a, <4 x i32> %b, <5 x i32>* %p) nounwind {
150; SSE2-LABEL: v5i32:
151; SSE2:       # BB#0:
152; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,2,2,3]
153; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[3,1,2,3]
154; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
155; SSE2-NEXT:    movd %xmm2, 16(%rdi)
156; SSE2-NEXT:    movdqa %xmm0, (%rdi)
157; SSE2-NEXT:    retq
158;
159; SSE42-LABEL: v5i32:
160; SSE42:       # BB#0:
161; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,2,2]
162; SSE42-NEXT:    pmovzxdq {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero
163; SSE42-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
164; SSE42-NEXT:    pextrd $3, %xmm0, 16(%rdi)
165; SSE42-NEXT:    movdqa %xmm2, (%rdi)
166; SSE42-NEXT:    retq
167;
168; AVX1-LABEL: v5i32:
169; AVX1:       # BB#0:
170; AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[0,1],xmm1[1,2]
171; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[0,2,1,3]
172; AVX1-NEXT:    vpextrd $3, %xmm0, 16(%rdi)
173; AVX1-NEXT:    vmovaps %xmm1, (%rdi)
174; AVX1-NEXT:    retq
175;
176; AVX2-LABEL: v5i32:
177; AVX2:       # BB#0:
178; AVX2-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
179; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm1
180; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = <0,5,1,6,3,u,u,u>
181; AVX2-NEXT:    vpermd %ymm1, %ymm2, %ymm1
182; AVX2-NEXT:    vpextrd $3, %xmm0, 16(%rdi)
183; AVX2-NEXT:    vmovdqa %xmm1, (%rdi)
184; AVX2-NEXT:    vzeroupper
185; AVX2-NEXT:    retq
186  %r = shufflevector <4 x i32> %a, <4 x i32> %b, <5 x i32> <i32 0, i32 5, i32 1, i32 6, i32 3>
187  store <5 x i32> %r, <5 x i32>* %p
188  ret void
189}
190
191define void @v5f32(<4 x float> %a, <4 x float> %b, <5 x float>* %p) nounwind {
192; SSE2-LABEL: v5f32:
193; SSE2:       # BB#0:
194; SSE2-NEXT:    movaps %xmm0, %xmm2
195; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,1],xmm1[1,2]
196; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2,1,3]
197; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,1,2,3]
198; SSE2-NEXT:    movss %xmm0, 16(%rdi)
199; SSE2-NEXT:    movaps %xmm2, (%rdi)
200; SSE2-NEXT:    retq
201;
202; SSE42-LABEL: v5f32:
203; SSE42:       # BB#0:
204; SSE42-NEXT:    extractps $3, %xmm0, 16(%rdi)
205; SSE42-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[1,2]
206; SSE42-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
207; SSE42-NEXT:    movaps %xmm0, (%rdi)
208; SSE42-NEXT:    retq
209;
210; AVX1-LABEL: v5f32:
211; AVX1:       # BB#0:
212; AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[0,1],xmm1[1,2]
213; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[0,2,1,3]
214; AVX1-NEXT:    vextractps $3, %xmm0, 16(%rdi)
215; AVX1-NEXT:    vmovaps %xmm1, (%rdi)
216; AVX1-NEXT:    retq
217;
218; AVX2-LABEL: v5f32:
219; AVX2:       # BB#0:
220; AVX2-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
221; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm1
222; AVX2-NEXT:    vmovaps {{.*#+}} ymm2 = <0,5,1,6,3,u,u,u>
223; AVX2-NEXT:    vpermps %ymm1, %ymm2, %ymm1
224; AVX2-NEXT:    vextractps $3, %xmm0, 16(%rdi)
225; AVX2-NEXT:    vmovaps %xmm1, (%rdi)
226; AVX2-NEXT:    vzeroupper
227; AVX2-NEXT:    retq
228  %r = shufflevector <4 x float> %a, <4 x float> %b, <5 x i32> <i32 0, i32 5, i32 1, i32 6, i32 3>
229  store <5 x float> %r, <5 x float>* %p
230  ret void
231}
232
233define void @v7i8(<4 x i8> %a, <4 x i8> %b, <7 x i8>* %p) nounwind {
234; SSE2-LABEL: v7i8:
235; SSE2:       # BB#0:
236; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,1,3]
237; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,65535,0,65535,0,65535,65535,65535]
238; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,1,0,3]
239; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,2,0,4,5,6,7]
240; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,6,4,7]
241; SSE2-NEXT:    pand %xmm2, %xmm1
242; SSE2-NEXT:    pandn %xmm0, %xmm2
243; SSE2-NEXT:    por %xmm1, %xmm2
244; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255]
245; SSE2-NEXT:    pand %xmm2, %xmm0
246; SSE2-NEXT:    packuswb %xmm0, %xmm0
247; SSE2-NEXT:    movdqa %xmm2, -{{[0-9]+}}(%rsp)
248; SSE2-NEXT:    movb -{{[0-9]+}}(%rsp), %al
249; SSE2-NEXT:    movb %al, 6(%rdi)
250; SSE2-NEXT:    movd %xmm0, (%rdi)
251; SSE2-NEXT:    pextrw $2, %xmm0, %eax
252; SSE2-NEXT:    movw %ax, 4(%rdi)
253; SSE2-NEXT:    retq
254;
255; SSE42-LABEL: v7i8:
256; SSE42:       # BB#0:
257; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,1,3]
258; SSE42-NEXT:    pextrb $0, %xmm1, 6(%rdi)
259; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[8,9,8,9,4,5,8,9,0,1,12,13,0,1,14,15]
260; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5,6,7]
261; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
262; SSE42-NEXT:    pextrw $2, %xmm1, 4(%rdi)
263; SSE42-NEXT:    movd %xmm1, (%rdi)
264; SSE42-NEXT:    retq
265;
266; AVX-LABEL: v7i8:
267; AVX:       # BB#0:
268; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,3,1,3]
269; AVX-NEXT:    vpshufb {{.*#+}} xmm2 = xmm1[8,9,8,9,4,5,8,9,0,1,12,13,0,1,14,15]
270; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5,6,7]
271; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
272; AVX-NEXT:    vpextrb $0, %xmm1, 6(%rdi)
273; AVX-NEXT:    vpextrw $2, %xmm0, 4(%rdi)
274; AVX-NEXT:    vmovd %xmm0, (%rdi)
275; AVX-NEXT:    retq
276  %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>
277  store <7 x i8> %r, <7 x i8>* %p
278  ret void
279}
280
281define void @v7i16(<4 x i16> %a, <4 x i16> %b, <7 x i16>* %p) nounwind {
282; SSE2-LABEL: v7i16:
283; SSE2:       # BB#0:
284; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,1,3]
285; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,65535,0,65535,0,65535,65535,65535]
286; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,1,0,3]
287; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,0,2,0,4,5,6,7]
288; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,6,4,7]
289; SSE2-NEXT:    pand %xmm2, %xmm3
290; SSE2-NEXT:    pandn %xmm0, %xmm2
291; SSE2-NEXT:    por %xmm3, %xmm2
292; SSE2-NEXT:    movd %xmm1, %eax
293; SSE2-NEXT:    movw %ax, 12(%rdi)
294; SSE2-NEXT:    movq %xmm2, (%rdi)
295; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
296; SSE2-NEXT:    movd %xmm0, 8(%rdi)
297; SSE2-NEXT:    retq
298;
299; SSE42-LABEL: v7i16:
300; SSE42:       # BB#0:
301; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,1,3]
302; SSE42-NEXT:    pextrw $0, %xmm1, 12(%rdi)
303; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[8,9,8,9,4,5,8,9,0,1,12,13,0,1,14,15]
304; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5,6,7]
305; SSE42-NEXT:    pextrd $2, %xmm1, 8(%rdi)
306; SSE42-NEXT:    movq %xmm1, (%rdi)
307; SSE42-NEXT:    retq
308;
309; AVX-LABEL: v7i16:
310; AVX:       # BB#0:
311; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,3,1,3]
312; AVX-NEXT:    vpshufb {{.*#+}} xmm2 = xmm1[8,9,8,9,4,5,8,9,0,1,12,13,0,1,14,15]
313; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5,6,7]
314; AVX-NEXT:    vpextrw $0, %xmm1, 12(%rdi)
315; AVX-NEXT:    vpextrd $2, %xmm0, 8(%rdi)
316; AVX-NEXT:    vmovq %xmm0, (%rdi)
317; AVX-NEXT:    retq
318  %r = shufflevector <4 x i16> %a, <4 x i16> %b, <7 x i32> <i32 0, i32 6, i32 3, i32 6, i32 1, i32 7, i32 4>
319  store <7 x i16> %r, <7 x i16>* %p
320  ret void
321}
322
323
324define void @v7i32(<4 x i32> %a, <4 x i32> %b, <7 x i32>* %p) nounwind {
325; SSE2-LABEL: v7i32:
326; SSE2:       # BB#0:
327; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,1,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:    shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[3,0]
331; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,3]
332; SSE2-NEXT:    movd %xmm1, 24(%rdi)
333; SSE2-NEXT:    movlps %xmm0, 16(%rdi)
334; SSE2-NEXT:    movdqa %xmm3, (%rdi)
335; SSE2-NEXT:    retq
336;
337; SSE42-LABEL: v7i32:
338; SSE42:       # BB#0:
339; SSE42-NEXT:    movdqa %xmm1, %xmm2
340; SSE42-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm0[2,3],xmm2[4,5,6,7]
341; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5],xmm0[6,7]
342; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,3,2]
343; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,0,3]
344; SSE42-NEXT:    movd %xmm1, 24(%rdi)
345; SSE42-NEXT:    movq %xmm2, 16(%rdi)
346; SSE42-NEXT:    movdqa %xmm0, (%rdi)
347; SSE42-NEXT:    retq
348;
349; AVX1-LABEL: v7i32:
350; AVX1:       # BB#0:
351; AVX1-NEXT:    vblendps {{.*#+}} xmm2 = xmm0[0,1],xmm1[2],xmm0[3]
352; AVX1-NEXT:    vpermilps {{.*#+}} xmm2 = xmm2[0,2,3,2]
353; AVX1-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3]
354; AVX1-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[1,3,0,3]
355; AVX1-NEXT:    vmovss %xmm1, 24(%rdi)
356; AVX1-NEXT:    vmovlps %xmm0, 16(%rdi)
357; AVX1-NEXT:    vmovaps %xmm2, (%rdi)
358; AVX1-NEXT:    retq
359;
360; AVX2-LABEL: v7i32:
361; AVX2:       # BB#0:
362; AVX2-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
363; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
364; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = <0,6,3,6,1,7,4,u>
365; AVX2-NEXT:    vpermd %ymm0, %ymm2, %ymm0
366; AVX2-NEXT:    vmovd %xmm1, 24(%rdi)
367; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
368; AVX2-NEXT:    vmovq %xmm1, 16(%rdi)
369; AVX2-NEXT:    vmovdqa %xmm0, (%rdi)
370; AVX2-NEXT:    vzeroupper
371; AVX2-NEXT:    retq
372  %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>
373  store <7 x i32> %r, <7 x i32>* %p
374  ret void
375}
376
377define void @v12i8(<8 x i8> %a, <8 x i8> %b, <12 x i8>* %p) nounwind {
378; SSE2-LABEL: v12i8:
379; SSE2:       # BB#0:
380; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
381; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
382; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,6,6,7]
383; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,0,255,255,0,255,255,0,255,255,0,255,255,255,255]
384; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
385; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[3,1,2,3]
386; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,3,1,3,4,5,6,7]
387; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,5,4,7]
388; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,2,1]
389; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,1,4,5,6,7]
390; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,6,4]
391; SSE2-NEXT:    packuswb %xmm3, %xmm0
392; SSE2-NEXT:    pand %xmm2, %xmm0
393; SSE2-NEXT:    pandn %xmm1, %xmm2
394; SSE2-NEXT:    por %xmm0, %xmm2
395; SSE2-NEXT:    movq %xmm2, (%rdi)
396; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
397; SSE2-NEXT:    movd %xmm0, 8(%rdi)
398; SSE2-NEXT:    retq
399;
400; SSE42-LABEL: v12i8:
401; SSE42:       # BB#0:
402; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = zero,zero,xmm1[0],zero,zero,xmm1[2],zero,zero,xmm1[4],zero,zero,xmm1[6,u,u,u,u]
403; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,8],zero,xmm0[2,10],zero,xmm0[4,12],zero,xmm0[6,14],zero,xmm0[u,u,u,u]
404; SSE42-NEXT:    por %xmm1, %xmm0
405; SSE42-NEXT:    pextrd $2, %xmm0, 8(%rdi)
406; SSE42-NEXT:    movq %xmm0, (%rdi)
407; SSE42-NEXT:    retq
408;
409; AVX-LABEL: v12i8:
410; AVX:       # BB#0:
411; AVX-NEXT:    vpshufb {{.*#+}} xmm1 = zero,zero,xmm1[0],zero,zero,xmm1[2],zero,zero,xmm1[4],zero,zero,xmm1[6,u,u,u,u]
412; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8],zero,xmm0[2,10],zero,xmm0[4,12],zero,xmm0[6,14],zero,xmm0[u,u,u,u]
413; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
414; AVX-NEXT:    vpextrd $2, %xmm0, 8(%rdi)
415; AVX-NEXT:    vmovq %xmm0, (%rdi)
416; AVX-NEXT:    retq
417  %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>
418  store <12 x i8> %r, <12 x i8>* %p
419  ret void
420}
421
422define void @v12i16(<8 x i16> %a, <8 x i16> %b, <12 x i16>* %p) nounwind {
423; SSE2-LABEL: v12i16:
424; SSE2:       # BB#0:
425; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,0,3]
426; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [65535,65535,0,65535,65535,0,65535,65535]
427; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm0[0,1,2,3,6,5,4,7]
428; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,3,2,1]
429; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[0,2,2,1,4,5,6,7]
430; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,5,5,6,4]
431; SSE2-NEXT:    pand %xmm3, %xmm4
432; SSE2-NEXT:    pandn %xmm2, %xmm3
433; SSE2-NEXT:    por %xmm4, %xmm3
434; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
435; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [65535,0,0,65535,65535,65535,65535,65535]
436; SSE2-NEXT:    pand %xmm2, %xmm1
437; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
438; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,3,1,3,4,5,6,7]
439; SSE2-NEXT:    pandn %xmm0, %xmm2
440; SSE2-NEXT:    por %xmm1, %xmm2
441; SSE2-NEXT:    movq %xmm2, 16(%rdi)
442; SSE2-NEXT:    movdqa %xmm3, (%rdi)
443; SSE2-NEXT:    retq
444;
445; SSE42-LABEL: v12i16:
446; SSE42:       # BB#0:
447; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,2,3]
448; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[3,1,2,3]
449; SSE42-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,3,1,3,4,5,6,7]
450; SSE42-NEXT:    pblendw {{.*#+}} xmm3 = xmm2[0],xmm3[1,2],xmm2[3,4,5,6,7]
451; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,3]
452; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,2,3,10,11,10,11,4,5,12,13]
453; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7]
454; SSE42-NEXT:    movdqa %xmm0, (%rdi)
455; SSE42-NEXT:    movq %xmm3, 16(%rdi)
456; SSE42-NEXT:    retq
457;
458; AVX1-LABEL: v12i16:
459; AVX1:       # BB#0:
460; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,2,3]
461; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[3,1,2,3]
462; AVX1-NEXT:    vpshuflw {{.*#+}} xmm3 = xmm3[0,3,1,3,4,5,6,7]
463; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1,2],xmm2[3],xmm3[4,5,6,7]
464; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,3]
465; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,2,3,10,11,10,11,4,5,12,13]
466; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7]
467; AVX1-NEXT:    vmovdqa %xmm0, (%rdi)
468; AVX1-NEXT:    vmovq %xmm2, 16(%rdi)
469; AVX1-NEXT:    retq
470;
471; AVX2-LABEL: v12i16:
472; AVX2:       # BB#0:
473; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,2,3]
474; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[3,1,2,3]
475; AVX2-NEXT:    vpshuflw {{.*#+}} xmm3 = xmm3[0,3,1,3,4,5,6,7]
476; AVX2-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1,2],xmm2[3],xmm3[4,5,6,7]
477; AVX2-NEXT:    vpbroadcastd %xmm1, %xmm1
478; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,2,3,10,11,10,11,4,5,12,13]
479; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4],xmm1[5],xmm0[6,7]
480; AVX2-NEXT:    vmovdqa %xmm0, (%rdi)
481; AVX2-NEXT:    vmovq %xmm2, 16(%rdi)
482; AVX2-NEXT:    retq
483  %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>
484  store <12 x i16> %r, <12 x i16>* %p
485  ret void
486}
487
488define void @v12i32(<8 x i32> %a, <8 x i32> %b, <12 x i32>* %p) nounwind {
489; SSE2-LABEL: v12i32:
490; SSE2:       # BB#0:
491; SSE2-NEXT:    movdqa %xmm0, %xmm3
492; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
493; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,1,2,2]
494; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,1,0,1]
495; SSE2-NEXT:    shufps {{.*#+}} xmm4 = xmm4[2,0],xmm3[3,0]
496; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,1],xmm4[0,2]
497; SSE2-NEXT:    movdqa %xmm2, %xmm4
498; SSE2-NEXT:    shufps {{.*#+}} xmm4 = xmm4[1,0],xmm1[1,0]
499; SSE2-NEXT:    shufps {{.*#+}} xmm4 = xmm4[2,0],xmm1[2,2]
500; SSE2-NEXT:    punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm0[2],xmm2[3],xmm0[3]
501; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm4[3,0]
502; SSE2-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,1],xmm0[0,2]
503; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,3,2,2]
504; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
505; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[3,0]
506; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
507; SSE2-NEXT:    movaps %xmm0, 32(%rdi)
508; SSE2-NEXT:    movaps %xmm4, 16(%rdi)
509; SSE2-NEXT:    movaps %xmm3, (%rdi)
510; SSE2-NEXT:    retq
511;
512; SSE42-LABEL: v12i32:
513; SSE42:       # BB#0:
514; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[0,0,1,1]
515; SSE42-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,1,0,1]
516; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm3[2,3],xmm4[4,5,6,7]
517; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,1,0,1]
518; SSE42-NEXT:    pblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5],xmm4[6,7]
519; SSE42-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,2,2]
520; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm2[2,3],xmm4[4,5,6,7]
521; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm0[4,5],xmm4[6,7]
522; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
523; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]
524; SSE42-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm0[2,3],xmm2[4,5,6,7]
525; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,2,3,3]
526; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5],xmm2[6,7]
527; SSE42-NEXT:    movdqa %xmm0, 32(%rdi)
528; SSE42-NEXT:    movdqa %xmm4, 16(%rdi)
529; SSE42-NEXT:    movdqa %xmm3, (%rdi)
530; SSE42-NEXT:    retq
531;
532; AVX1-LABEL: v12i32:
533; AVX1:       # BB#0:
534; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3,0,1]
535; AVX1-NEXT:    vmovsldup {{.*#+}} ymm2 = ymm2[0,0,2,2,4,4,6,6]
536; AVX1-NEXT:    vpermilps {{.*#+}} ymm3 = ymm0[0,u,u,1,5,u,u,6]
537; AVX1-NEXT:    vblendps {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2,3,4,5],ymm2[6],ymm3[7]
538; AVX1-NEXT:    vmovddup {{.*#+}} xmm3 = xmm1[0,0]
539; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm3, %ymm3
540; AVX1-NEXT:    vblendps {{.*#+}} ymm2 = ymm2[0,1],ymm3[2],ymm2[3,4],ymm3[5],ymm2[6,7]
541; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
542; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,3],xmm3[3,3]
543; AVX1-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,1]
544; AVX1-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3]
545; AVX1-NEXT:    vmovaps %xmm0, 32(%rdi)
546; AVX1-NEXT:    vmovaps %ymm2, (%rdi)
547; AVX1-NEXT:    vzeroupper
548; AVX1-NEXT:    retq
549;
550; AVX2-LABEL: v12i32:
551; AVX2:       # BB#0:
552; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
553; AVX2-NEXT:    vpshufd {{.*#+}} ymm3 = ymm0[3,3,2,3,7,7,6,7]
554; AVX2-NEXT:    vpermq {{.*#+}} ymm3 = ymm3[0,2,2,3]
555; AVX2-NEXT:    vpblendd {{.*#+}} xmm2 = xmm2[0],xmm3[1,2],xmm2[3]
556; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = <0,4,u,1,5,u,2,6>
557; AVX2-NEXT:    vpermd %ymm0, %ymm3, %ymm0
558; AVX2-NEXT:    vpbroadcastq %xmm1, %ymm1
559; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7]
560; AVX2-NEXT:    vmovdqa %ymm0, (%rdi)
561; AVX2-NEXT:    vmovdqa %xmm2, 32(%rdi)
562; AVX2-NEXT:    vzeroupper
563; AVX2-NEXT:    retq
564  %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>
565  store <12 x i32> %r, <12 x i32>* %p
566  ret void
567}
568
569define void @pr29025(<4 x i8> %a, <4 x i8> %b, <4 x i8> %c, <12 x i8> *%p) nounwind {
570; SSE2-LABEL: pr29025:
571; SSE2:       # BB#0:
572; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255]
573; SSE2-NEXT:    pand %xmm3, %xmm1
574; SSE2-NEXT:    pand %xmm3, %xmm0
575; SSE2-NEXT:    packuswb %xmm1, %xmm0
576; SSE2-NEXT:    packuswb %xmm0, %xmm0
577; SSE2-NEXT:    pxor %xmm1, %xmm1
578; 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]
579; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,1,2,3]
580; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,3,1,3,4,5,6,7]
581; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,5,4,7]
582; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,2,1]
583; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,1,4,5,6,7]
584; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,6,4]
585; SSE2-NEXT:    packuswb %xmm1, %xmm0
586; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,0,255,255,0,255,255,0,255,255,0,255,255,255,255]
587; SSE2-NEXT:    pand %xmm1, %xmm0
588; SSE2-NEXT:    pand %xmm3, %xmm2
589; SSE2-NEXT:    packuswb %xmm2, %xmm2
590; SSE2-NEXT:    packuswb %xmm2, %xmm2
591; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,0,1,1,4,5,6,7]
592; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,0,1,1]
593; SSE2-NEXT:    pandn %xmm2, %xmm1
594; SSE2-NEXT:    por %xmm0, %xmm1
595; SSE2-NEXT:    movq %xmm1, (%rdi)
596; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
597; SSE2-NEXT:    movd %xmm0, 8(%rdi)
598; SSE2-NEXT:    retq
599;
600; SSE42-LABEL: pr29025:
601; SSE42:       # BB#0:
602; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
603; SSE42-NEXT:    pshufb %xmm3, %xmm1
604; SSE42-NEXT:    pshufb %xmm3, %xmm0
605; SSE42-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
606; SSE42-NEXT:    pshufb %xmm3, %xmm2
607; 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]
608; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,8,1,2,10,3,4,12,5,6,14,7,u,u,u,u]
609; SSE42-NEXT:    pextrd $2, %xmm0, 8(%rdi)
610; SSE42-NEXT:    movq %xmm0, (%rdi)
611; SSE42-NEXT:    retq
612;
613; AVX-LABEL: pr29025:
614; AVX:       # BB#0:
615; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
616; AVX-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
617; AVX-NEXT:    vpshufb %xmm3, %xmm0, %xmm0
618; AVX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
619; AVX-NEXT:    vpshufb %xmm3, %xmm2, %xmm1
620; 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]
621; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8,1,2,10,3,4,12,5,6,14,7,u,u,u,u]
622; AVX-NEXT:    vpextrd $2, %xmm0, 8(%rdi)
623; AVX-NEXT:    vmovq %xmm0, (%rdi)
624; AVX-NEXT:    retq
625  %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>
626  %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>
627  %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>
628  store <12 x i8> %r, <12 x i8>* %p, align 1
629  ret void
630}
631
632define void @interleave_24i8_out(<24 x i8>* %p, <8 x i8>* %q1, <8 x i8>* %q2, <8 x i8>* %q3) nounwind {
633; SSE2-LABEL: interleave_24i8_out:
634; SSE2:       # BB#0:
635; SSE2-NEXT:    movdqu (%rdi), %xmm0
636; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
637; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,0,255,255,0,255,255,255,255,255,255,255,255,255,255]
638; SSE2-NEXT:    movdqa %xmm0, %xmm2
639; SSE2-NEXT:    pand %xmm3, %xmm2
640; SSE2-NEXT:    pandn %xmm1, %xmm3
641; SSE2-NEXT:    por %xmm2, %xmm3
642; SSE2-NEXT:    pxor %xmm2, %xmm2
643; SSE2-NEXT:    movdqa %xmm3, %xmm4
644; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm2[8],xmm4[9],xmm2[9],xmm4[10],xmm2[10],xmm4[11],xmm2[11],xmm4[12],xmm2[12],xmm4[13],xmm2[13],xmm4[14],xmm2[14],xmm4[15],xmm2[15]
645; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [65535,0,65535,65535,0,65535,65535,0]
646; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
647; SSE2-NEXT:    pand %xmm5, %xmm3
648; SSE2-NEXT:    pandn %xmm4, %xmm5
649; SSE2-NEXT:    por %xmm3, %xmm5
650; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm5[0,2,1,3]
651; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,7,6,5]
652; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,3,2,1]
653; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,3,2,1,4,5,6,7]
654; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,6,5,4,7]
655; SSE2-NEXT:    packuswb %xmm0, %xmm3
656; SSE2-NEXT:    movq %xmm3, (%rsi)
657; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [0,255,255,0,255,255,0,255,255,255,255,255,255,255,255,255]
658; SSE2-NEXT:    movdqa %xmm0, %xmm4
659; SSE2-NEXT:    pand %xmm3, %xmm4
660; SSE2-NEXT:    pandn %xmm1, %xmm3
661; SSE2-NEXT:    por %xmm4, %xmm3
662; SSE2-NEXT:    movdqa %xmm3, %xmm4
663; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm2[8],xmm4[9],xmm2[9],xmm4[10],xmm2[10],xmm4[11],xmm2[11],xmm4[12],xmm2[12],xmm4[13],xmm2[13],xmm4[14],xmm2[14],xmm4[15],xmm2[15]
664; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [65535,65535,0,65535,65535,0,65535,65535]
665; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
666; SSE2-NEXT:    pand %xmm5, %xmm3
667; SSE2-NEXT:    pandn %xmm4, %xmm5
668; SSE2-NEXT:    por %xmm3, %xmm5
669; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm5[2,1,0,3,4,5,6,7]
670; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,6,5,4,7]
671; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,3,2,1]
672; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[1,2,3,0,4,5,6,7]
673; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,5,6,7,4]
674; SSE2-NEXT:    packuswb %xmm0, %xmm3
675; SSE2-NEXT:    movq %xmm3, (%rdx)
676; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,0,255,255,0,255,255,0,255,255,255,255,255,255,255,255]
677; SSE2-NEXT:    pand %xmm3, %xmm0
678; SSE2-NEXT:    pandn %xmm1, %xmm3
679; SSE2-NEXT:    por %xmm0, %xmm3
680; SSE2-NEXT:    movdqa %xmm3, %xmm0
681; SSE2-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm2[8],xmm0[9],xmm2[9],xmm0[10],xmm2[10],xmm0[11],xmm2[11],xmm0[12],xmm2[12],xmm0[13],xmm2[13],xmm0[14],xmm2[14],xmm0[15],xmm2[15]
682; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [0,65535,65535,0,65535,65535,0,65535]
683; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
684; SSE2-NEXT:    pand %xmm1, %xmm3
685; SSE2-NEXT:    pandn %xmm0, %xmm1
686; SSE2-NEXT:    por %xmm3, %xmm1
687; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[3,1,2,0]
688; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,7,6,5]
689; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,0]
690; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,1,0,3,4,5,6,7]
691; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,6,5,4,7]
692; SSE2-NEXT:    packuswb %xmm0, %xmm0
693; SSE2-NEXT:    movq %xmm0, (%rcx)
694; SSE2-NEXT:    retq
695;
696; SSE42-LABEL: interleave_24i8_out:
697; SSE42:       # BB#0:
698; SSE42-NEXT:    movdqu (%rdi), %xmm0
699; SSE42-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
700; SSE42-NEXT:    movdqa %xmm1, %xmm2
701; SSE42-NEXT:    pshufb {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,xmm2[2,5,u,u,u,u,u,u,u,u]
702; SSE42-NEXT:    movdqa %xmm0, %xmm3
703; SSE42-NEXT:    pshufb {{.*#+}} xmm3 = xmm3[0,3,6,9,12,15],zero,zero,xmm3[u,u,u,u,u,u,u,u]
704; SSE42-NEXT:    por %xmm2, %xmm3
705; SSE42-NEXT:    movq %xmm3, (%rsi)
706; SSE42-NEXT:    movdqa %xmm1, %xmm2
707; SSE42-NEXT:    pshufb {{.*#+}} xmm2 = zero,zero,zero,zero,zero,xmm2[0,3,6,u,u,u,u,u,u,u,u]
708; SSE42-NEXT:    movdqa %xmm0, %xmm3
709; SSE42-NEXT:    pshufb {{.*#+}} xmm3 = xmm3[1,4,7,10,13],zero,zero,zero,xmm3[u,u,u,u,u,u,u,u]
710; SSE42-NEXT:    por %xmm2, %xmm3
711; SSE42-NEXT:    movq %xmm3, (%rdx)
712; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = zero,zero,zero,zero,zero,xmm1[1,4,7,u,u,u,u,u,u,u,u]
713; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[2,5,8,11,14],zero,zero,zero,xmm0[u,u,u,u,u,u,u,u]
714; SSE42-NEXT:    por %xmm1, %xmm0
715; SSE42-NEXT:    movq %xmm0, (%rcx)
716; SSE42-NEXT:    retq
717;
718; AVX-LABEL: interleave_24i8_out:
719; AVX:       # BB#0:
720; AVX-NEXT:    vmovdqu (%rdi), %xmm0
721; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
722; AVX-NEXT:    vpshufb {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,xmm1[2,5,u,u,u,u,u,u,u,u]
723; AVX-NEXT:    vpshufb {{.*#+}} xmm3 = xmm0[0,3,6,9,12,15],zero,zero,xmm0[u,u,u,u,u,u,u,u]
724; AVX-NEXT:    vpor %xmm2, %xmm3, %xmm2
725; AVX-NEXT:    vmovq %xmm2, (%rsi)
726; AVX-NEXT:    vpshufb {{.*#+}} xmm2 = zero,zero,zero,zero,zero,xmm1[0,3,6,u,u,u,u,u,u,u,u]
727; AVX-NEXT:    vpshufb {{.*#+}} xmm3 = xmm0[1,4,7,10,13],zero,zero,zero,xmm0[u,u,u,u,u,u,u,u]
728; AVX-NEXT:    vpor %xmm2, %xmm3, %xmm2
729; AVX-NEXT:    vmovq %xmm2, (%rdx)
730; AVX-NEXT:    vpshufb {{.*#+}} xmm1 = zero,zero,zero,zero,zero,xmm1[1,4,7,u,u,u,u,u,u,u,u]
731; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[2,5,8,11,14],zero,zero,zero,xmm0[u,u,u,u,u,u,u,u]
732; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
733; AVX-NEXT:    vmovq %xmm0, (%rcx)
734; AVX-NEXT:    retq
735  %wide.vec = load <24 x i8>, <24 x i8>* %p, align 4
736  %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>
737  %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>
738  %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>
739  store <8 x i8> %s1, <8 x i8>* %q1, align 4
740  store <8 x i8> %s2, <8 x i8>* %q2, align 4
741  store <8 x i8> %s3, <8 x i8>* %q3, align 4
742  ret void
743}
744
745define void @interleave_24i8_in(<24 x i8>* %p, <8 x i8>* %q1, <8 x i8>* %q2, <8 x i8>* %q3) nounwind {
746; SSE2-LABEL: interleave_24i8_in:
747; SSE2:       # BB#0:
748; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
749; SSE2-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero
750; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
751; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
752; SSE2-NEXT:    pxor %xmm2, %xmm2
753; SSE2-NEXT:    movdqa %xmm1, %xmm3
754; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
755; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,2,2]
756; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [65535,65535,0,65535,65535,0,65535,65535]
757; SSE2-NEXT:    pand %xmm5, %xmm4
758; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]
759; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm1[0,1,3,3,4,5,6,7]
760; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,4,4,6,7]
761; SSE2-NEXT:    pandn %xmm2, %xmm5
762; SSE2-NEXT:    por %xmm4, %xmm5
763; SSE2-NEXT:    movdqa %xmm3, %xmm2
764; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
765; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,1,2,1]
766; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,1,2,2,4,5,6,7]
767; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,5,4,5]
768; SSE2-NEXT:    packuswb %xmm5, %xmm2
769; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [255,255,0,255,255,0,255,255,0,255,255,0,255,255,0,255]
770; SSE2-NEXT:    pand %xmm4, %xmm2
771; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,1,0,1]
772; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm5[0,0,0,3,4,5,6,7]
773; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,5,5,6,6]
774; SSE2-NEXT:    pandn %xmm5, %xmm4
775; SSE2-NEXT:    por %xmm2, %xmm4
776; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
777; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,1,2,3]
778; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[2,1,1,0,4,5,6,7]
779; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,7,6,7]
780; SSE2-NEXT:    packuswb %xmm0, %xmm1
781; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,0,255,255,0,255,255,0,255,255,255,255,255,255,255,255]
782; SSE2-NEXT:    pand %xmm2, %xmm1
783; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,1,3,3,4,5,6,7]
784; SSE2-NEXT:    pandn %xmm0, %xmm2
785; SSE2-NEXT:    por %xmm1, %xmm2
786; SSE2-NEXT:    movq %xmm2, 16(%rdi)
787; SSE2-NEXT:    movdqu %xmm4, (%rdi)
788; SSE2-NEXT:    retq
789;
790; SSE42-LABEL: interleave_24i8_in:
791; SSE42:       # BB#0:
792; SSE42-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
793; SSE42-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
794; SSE42-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero
795; SSE42-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
796; SSE42-NEXT:    movdqa %xmm0, %xmm1
797; 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]
798; SSE42-NEXT:    movdqa %xmm2, %xmm3
799; 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
800; SSE42-NEXT:    por %xmm1, %xmm3
801; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[13],zero,xmm0[6,14],zero,xmm0[7,15],zero,xmm0[u,u,u,u,u,u,u,u]
802; SSE42-NEXT:    pshufb {{.*#+}} xmm2 = zero,xmm2[5],zero,zero,xmm2[6],zero,zero,xmm2[7,u,u,u,u,u,u,u,u]
803; SSE42-NEXT:    por %xmm0, %xmm2
804; SSE42-NEXT:    movq %xmm2, 16(%rdi)
805; SSE42-NEXT:    movdqu %xmm3, (%rdi)
806; SSE42-NEXT:    retq
807;
808; AVX-LABEL: interleave_24i8_in:
809; AVX:       # BB#0:
810; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
811; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
812; AVX-NEXT:    vmovq {{.*#+}} xmm2 = mem[0],zero
813; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
814; AVX-NEXT:    vpshufb {{.*#+}} xmm1 = xmm0[0,8],zero,xmm0[1,9],zero,xmm0[2,10],zero,xmm0[3,11],zero,xmm0[4,12],zero,xmm0[5]
815; AVX-NEXT:    vpshufb {{.*#+}} xmm3 = zero,zero,xmm2[0],zero,zero,xmm2[1],zero,zero,xmm2[2],zero,zero,xmm2[3],zero,zero,xmm2[4],zero
816; AVX-NEXT:    vpor %xmm3, %xmm1, %xmm1
817; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[13],zero,xmm0[6,14],zero,xmm0[7,15],zero,xmm0[u,u,u,u,u,u,u,u]
818; AVX-NEXT:    vpshufb {{.*#+}} xmm2 = zero,xmm2[5],zero,zero,xmm2[6],zero,zero,xmm2[7,u,u,u,u,u,u,u,u]
819; AVX-NEXT:    vpor %xmm2, %xmm0, %xmm0
820; AVX-NEXT:    vmovq %xmm0, 16(%rdi)
821; AVX-NEXT:    vmovdqu %xmm1, (%rdi)
822; AVX-NEXT:    retq
823  %s1 = load <8 x i8>, <8 x i8>* %q1, align 4
824  %s2 = load <8 x i8>, <8 x i8>* %q2, align 4
825  %s3 = load <8 x i8>, <8 x i8>* %q3, align 4
826  %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>
827  %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>
828  %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>
829  store <24 x i8> %interleaved, <24 x i8>* %p, align 4
830  ret void
831}
832
833
834define void @interleave_24i16_out(<24 x i16>* %p, <8 x i16>* %q1, <8 x i16>* %q2, <8 x i16>* %q3) nounwind {
835; SSE2-LABEL: interleave_24i16_out:
836; SSE2:       # BB#0:
837; SSE2-NEXT:    movdqu (%rdi), %xmm3
838; SSE2-NEXT:    movdqu 16(%rdi), %xmm2
839; SSE2-NEXT:    movdqu 32(%rdi), %xmm8
840; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [65535,0,65535,65535,0,65535,65535,0]
841; SSE2-NEXT:    movdqa %xmm3, %xmm4
842; SSE2-NEXT:    pand %xmm1, %xmm4
843; SSE2-NEXT:    pandn %xmm2, %xmm1
844; SSE2-NEXT:    por %xmm4, %xmm1
845; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,1,3]
846; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,6,5,6,7]
847; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,1,3]
848; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,3,2,1,4,5,6,7]
849; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,7,6,7]
850; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm8[0,1,2,1]
851; SSE2-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,5,6,5]
852; SSE2-NEXT:    shufps {{.*#+}} xmm4 = xmm4[3,0],xmm1[2,0]
853; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm4[2,0]
854; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [65535,65535,0,65535,65535,0,65535,65535]
855; SSE2-NEXT:    movdqa %xmm4, %xmm5
856; SSE2-NEXT:    pandn %xmm2, %xmm5
857; SSE2-NEXT:    movdqa %xmm3, %xmm6
858; SSE2-NEXT:    pand %xmm4, %xmm6
859; SSE2-NEXT:    por %xmm5, %xmm6
860; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm6[2,1,2,3,4,5,6,7]
861; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,4,5,4,7]
862; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[0,3,2,3]
863; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm5[1,2,3,0,4,5,6,7]
864; SSE2-NEXT:    pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,5,5,6,7]
865; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [65535,65535,65535,65535,65535,0,0,0]
866; SSE2-NEXT:    pand %xmm6, %xmm5
867; SSE2-NEXT:    pshuflw {{.*#+}} xmm7 = xmm8[0,3,2,3,4,5,6,7]
868; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[0,1,0,3]
869; SSE2-NEXT:    pshufhw {{.*#+}} xmm7 = xmm7[0,1,2,3,4,4,5,6]
870; SSE2-NEXT:    movdqa %xmm6, %xmm0
871; SSE2-NEXT:    pandn %xmm7, %xmm0
872; SSE2-NEXT:    por %xmm5, %xmm0
873; SSE2-NEXT:    pand %xmm4, %xmm2
874; SSE2-NEXT:    pandn %xmm3, %xmm4
875; SSE2-NEXT:    por %xmm2, %xmm4
876; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[3,1,2,0]
877; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,6,5,6,7]
878; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,1,0,3]
879; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[2,1,0,3,4,5,6,7]
880; SSE2-NEXT:    pand %xmm6, %xmm2
881; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm8[0,1,2,3,4,7,6,7]
882; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,1,2,0]
883; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,7,4,5]
884; SSE2-NEXT:    pandn %xmm3, %xmm6
885; SSE2-NEXT:    por %xmm2, %xmm6
886; SSE2-NEXT:    movups %xmm1, (%rsi)
887; SSE2-NEXT:    movdqu %xmm0, (%rdx)
888; SSE2-NEXT:    movdqu %xmm6, (%rcx)
889; SSE2-NEXT:    retq
890;
891; SSE42-LABEL: interleave_24i16_out:
892; SSE42:       # BB#0:
893; SSE42-NEXT:    movdqu (%rdi), %xmm0
894; SSE42-NEXT:    movdqu 16(%rdi), %xmm1
895; SSE42-NEXT:    movdqu 32(%rdi), %xmm2
896; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,1,2,1]
897; SSE42-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,5,6,5]
898; SSE42-NEXT:    movdqa %xmm0, %xmm4
899; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0],xmm1[1],xmm4[2,3],xmm1[4],xmm4[5,6],xmm1[7]
900; SSE42-NEXT:    pshufb {{.*#+}} xmm4 = xmm4[0,1,6,7,12,13,2,3,8,9,14,15,12,13,14,15]
901; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,5],xmm3[6,7]
902; SSE42-NEXT:    movdqa %xmm2, %xmm3
903; SSE42-NEXT:    pshufb {{.*#+}} xmm3 = xmm3[0,1,6,7,4,5,6,7,0,1,0,1,6,7,12,13]
904; SSE42-NEXT:    movdqa %xmm0, %xmm5
905; SSE42-NEXT:    pblendw {{.*#+}} xmm5 = xmm5[0,1],xmm1[2],xmm5[3,4],xmm1[5],xmm5[6,7]
906; SSE42-NEXT:    pshufb {{.*#+}} xmm5 = xmm5[2,3,8,9,14,15,4,5,10,11,10,11,8,9,14,15]
907; SSE42-NEXT:    pblendw {{.*#+}} xmm5 = xmm5[0,1,2,3,4],xmm3[5,6,7]
908; SSE42-NEXT:    pshufb {{.*#+}} xmm2 = xmm2[0,1,2,3,4,5,6,7,8,9,2,3,8,9,14,15]
909; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm0[2],xmm1[3,4],xmm0[5],xmm1[6,7]
910; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[4,5,10,11,0,1,6,7,12,13,14,15,0,1,2,3]
911; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3,4],xmm2[5,6,7]
912; SSE42-NEXT:    movdqu %xmm4, (%rsi)
913; SSE42-NEXT:    movdqu %xmm5, (%rdx)
914; SSE42-NEXT:    movdqu %xmm1, (%rcx)
915; SSE42-NEXT:    retq
916;
917; AVX1-LABEL: interleave_24i16_out:
918; AVX1:       # BB#0:
919; AVX1-NEXT:    vmovdqu 32(%rdi), %xmm0
920; AVX1-NEXT:    vmovdqu (%rdi), %ymm1
921; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
922; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm1[0],xmm2[1],xmm1[2,3],xmm2[4],xmm1[5,6],xmm2[7]
923; AVX1-NEXT:    vpshufb {{.*#+}} xmm3 = xmm3[0,1,6,7,12,13,2,3,8,9,14,15,12,13,14,15]
924; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm0[0,1,2,1]
925; AVX1-NEXT:    vpshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,5,6,5]
926; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,5],xmm4[6,7]
927; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm1[0,1],xmm2[2],xmm1[3,4],xmm2[5],xmm1[6,7]
928; AVX1-NEXT:    vpshufb {{.*#+}} xmm4 = xmm4[2,3,8,9,14,15,4,5,10,11,10,11,8,9,14,15]
929; AVX1-NEXT:    vpshufb {{.*#+}} xmm5 = xmm0[0,1,6,7,4,5,6,7,0,1,0,1,6,7,12,13]
930; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm4[0,1,2,3,4],xmm5[5,6,7]
931; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2],xmm2[3,4],xmm1[5],xmm2[6,7]
932; AVX1-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[4,5,10,11,0,1,6,7,12,13,14,15,0,1,2,3]
933; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,6,7,8,9,2,3,8,9,14,15]
934; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3,4],xmm0[5,6,7]
935; AVX1-NEXT:    vmovdqu %xmm3, (%rsi)
936; AVX1-NEXT:    vmovdqu %xmm4, (%rdx)
937; AVX1-NEXT:    vmovdqu %xmm0, (%rcx)
938; AVX1-NEXT:    vzeroupper
939; AVX1-NEXT:    retq
940;
941; AVX2-LABEL: interleave_24i16_out:
942; AVX2:       # BB#0:
943; AVX2-NEXT:    vmovdqu (%rdi), %ymm0
944; AVX2-NEXT:    vmovdqu 32(%rdi), %xmm1
945; AVX2-NEXT:    vpblendw {{.*#+}} ymm2 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7,8,9],ymm1[10],ymm0[11,12],ymm1[13],ymm0[14,15]
946; AVX2-NEXT:    vextracti128 $1, %ymm2, %xmm3
947; AVX2-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1],xmm2[2,3],xmm3[4],xmm2[5,6],xmm3[7]
948; AVX2-NEXT:    vpshufb {{.*#+}} xmm2 = xmm2[0,1,6,7,12,13,2,3,8,9,14,15,4,5,10,11]
949; AVX2-NEXT:    vpblendw {{.*#+}} ymm3 = ymm1[0],ymm0[1,2],ymm1[3],ymm0[4,5],ymm1[6],ymm0[7],ymm1[8],ymm0[9,10],ymm1[11],ymm0[12,13],ymm1[14],ymm0[15]
950; AVX2-NEXT:    vextracti128 $1, %ymm3, %xmm4
951; AVX2-NEXT:    vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2],xmm3[3,4],xmm4[5],xmm3[6,7]
952; AVX2-NEXT:    vpshufb {{.*#+}} xmm3 = xmm3[2,3,8,9,14,15,4,5,10,11,0,1,6,7,12,13]
953; AVX2-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2,3],ymm1[4],ymm0[5,6],ymm1[7],ymm0[8],ymm1[9],ymm0[10,11],ymm1[12],ymm0[13,14],ymm1[15]
954; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
955; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3],xmm0[4,5],xmm1[6],xmm0[7]
956; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,10,11,0,1,6,7,12,13,2,3,8,9,14,15]
957; AVX2-NEXT:    vmovdqu %xmm2, (%rsi)
958; AVX2-NEXT:    vmovdqu %xmm3, (%rdx)
959; AVX2-NEXT:    vmovdqu %xmm0, (%rcx)
960; AVX2-NEXT:    vzeroupper
961; AVX2-NEXT:    retq
962  %wide.vec = load <24 x i16>, <24 x i16>* %p, align 4
963  %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>
964  %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>
965  %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>
966  store <8 x i16> %s1, <8 x i16>* %q1, align 4
967  store <8 x i16> %s2, <8 x i16>* %q2, align 4
968  store <8 x i16> %s3, <8 x i16>* %q3, align 4
969  ret void
970}
971
972define void @interleave_24i16_in(<24 x i16>* %p, <8 x i16>* %q1, <8 x i16>* %q2, <8 x i16>* %q3) nounwind {
973; SSE2-LABEL: interleave_24i16_in:
974; SSE2:       # BB#0:
975; SSE2-NEXT:    movdqu (%rsi), %xmm3
976; SSE2-NEXT:    movdqu (%rdx), %xmm2
977; SSE2-NEXT:    movdqu (%rcx), %xmm1
978; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,0,0,3]
979; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [65535,65535,0,65535,65535,0,65535,65535]
980; SSE2-NEXT:    movdqa %xmm0, %xmm5
981; SSE2-NEXT:    pandn %xmm4, %xmm5
982; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,3,3,3]
983; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[1,1,2,2]
984; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
985; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,1,2,1]
986; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,1,2,2,4,5,6,7]
987; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,5,4,5]
988; SSE2-NEXT:    pand %xmm0, %xmm3
989; SSE2-NEXT:    por %xmm5, %xmm3
990; SSE2-NEXT:    movdqa %xmm0, %xmm5
991; SSE2-NEXT:    pandn %xmm4, %xmm5
992; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm2[0,1,3,3,4,5,6,7]
993; SSE2-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
994; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,1,2,3]
995; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[2,3,2,0,4,5,6,7]
996; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,5,6,7]
997; SSE2-NEXT:    pand %xmm0, %xmm2
998; SSE2-NEXT:    por %xmm5, %xmm2
999; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [65535,0,65535,65535,0,65535,65535,0]
1000; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,2,2]
1001; SSE2-NEXT:    pand %xmm5, %xmm1
1002; SSE2-NEXT:    pandn %xmm6, %xmm5
1003; SSE2-NEXT:    por %xmm1, %xmm5
1004; SSE2-NEXT:    pand %xmm0, %xmm5
1005; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm4[0,1,2,3,4,4,6,7]
1006; SSE2-NEXT:    pandn %xmm1, %xmm0
1007; SSE2-NEXT:    por %xmm5, %xmm0
1008; SSE2-NEXT:    movdqu %xmm0, 16(%rdi)
1009; SSE2-NEXT:    movdqu %xmm2, 32(%rdi)
1010; SSE2-NEXT:    movdqu %xmm3, (%rdi)
1011; SSE2-NEXT:    retq
1012;
1013; SSE42-LABEL: interleave_24i16_in:
1014; SSE42:       # BB#0:
1015; SSE42-NEXT:    movdqu (%rsi), %xmm0
1016; SSE42-NEXT:    movdqu (%rdx), %xmm1
1017; SSE42-NEXT:    movdqu (%rcx), %xmm2
1018; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,2,2]
1019; SSE42-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,3,3,3]
1020; SSE42-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1021; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,4,5,6,7,10,11,8,9,10,11]
1022; SSE42-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,0,3]
1023; SSE42-NEXT:    pblendw {{.*#+}} xmm5 = xmm0[0,1],xmm5[2],xmm0[3,4],xmm5[5],xmm0[6,7]
1024; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,2,2]
1025; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm3[1],xmm0[2,3],xmm3[4],xmm0[5,6],xmm3[7]
1026; SSE42-NEXT:    pshuflw {{.*#+}} xmm3 = xmm1[0,1,3,3,4,5,6,7]
1027; SSE42-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,4,6,7]
1028; SSE42-NEXT:    pblendw {{.*#+}} xmm3 = xmm0[0,1],xmm3[2],xmm0[3,4],xmm3[5],xmm0[6,7]
1029; SSE42-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1030; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[4,5,6,7,4,5,8,9,10,11,10,11,12,13,14,15]
1031; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm1[0,1],xmm4[2],xmm1[3,4],xmm4[5],xmm1[6,7]
1032; SSE42-NEXT:    movdqu %xmm4, 32(%rdi)
1033; SSE42-NEXT:    movdqu %xmm3, 16(%rdi)
1034; SSE42-NEXT:    movdqu %xmm5, (%rdi)
1035; SSE42-NEXT:    retq
1036;
1037; AVX1-LABEL: interleave_24i16_in:
1038; AVX1:       # BB#0:
1039; AVX1-NEXT:    vmovdqu (%rsi), %xmm0
1040; AVX1-NEXT:    vmovdqu (%rdx), %xmm1
1041; AVX1-NEXT:    vmovdqu (%rcx), %xmm2
1042; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,2,2]
1043; AVX1-NEXT:    vpshuflw {{.*#+}} xmm4 = xmm1[0,1,3,3,4,5,6,7]
1044; AVX1-NEXT:    vpshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,4,6,7]
1045; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2],xmm3[3,4],xmm4[5],xmm3[6,7]
1046; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm2[1,1,2,2]
1047; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0],xmm3[1,2],xmm4[3],xmm3[4,5],xmm4[6],xmm3[7]
1048; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm4 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1049; AVX1-NEXT:    vpshufb {{.*#+}} xmm4 = xmm4[0,1,2,3,4,5,4,5,6,7,10,11,8,9,10,11]
1050; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm2[0,0,0,3]
1051; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2],xmm4[3,4],xmm5[5],xmm4[6,7]
1052; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
1053; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1054; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,10,11,10,11,8,9,8,9,14,15,12,13,14,15]
1055; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm2[2,2,3,3]
1056; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7]
1057; AVX1-NEXT:    vmovdqu %xmm0, 32(%rdi)
1058; AVX1-NEXT:    vmovups %ymm3, (%rdi)
1059; AVX1-NEXT:    vzeroupper
1060; AVX1-NEXT:    retq
1061;
1062; AVX2-LABEL: interleave_24i16_in:
1063; AVX2:       # BB#0:
1064; AVX2-NEXT:    vmovdqu (%rsi), %xmm0
1065; AVX2-NEXT:    vmovdqu (%rdx), %xmm1
1066; AVX2-NEXT:    vmovdqu (%rcx), %xmm2
1067; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm3
1068; AVX2-NEXT:    vpshufb {{.*#+}} ymm4 = ymm3[0,1,2,3,6,7,2,3,8,9,8,9,4,5,6,7,16,17,18,19,22,23,18,19,24,25,24,25,20,21,22,23]
1069; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm3 = ymm3[2,3,0,1]
1070; AVX2-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]
1071; AVX2-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]
1072; AVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = <u,0,0,u,1,1,u,2>
1073; AVX2-NEXT:    vpermd %ymm2, %ymm4, %ymm4
1074; AVX2-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]
1075; AVX2-NEXT:    vpblendvb %ymm5, %ymm3, %ymm4, %ymm3
1076; AVX2-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1077; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,10,11,10,11,8,9,8,9,14,15,12,13,14,15]
1078; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm2[2,2,3,3]
1079; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3],xmm1[4],xmm0[5,6],xmm1[7]
1080; AVX2-NEXT:    vmovdqu %xmm0, 32(%rdi)
1081; AVX2-NEXT:    vmovdqu %ymm3, (%rdi)
1082; AVX2-NEXT:    vzeroupper
1083; AVX2-NEXT:    retq
1084  %s1 = load <8 x i16>, <8 x i16>* %q1, align 4
1085  %s2 = load <8 x i16>, <8 x i16>* %q2, align 4
1086  %s3 = load <8 x i16>, <8 x i16>* %q3, align 4
1087  %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>
1088  %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>
1089  %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>
1090  store <24 x i16> %interleaved, <24 x i16>* %p, align 4
1091  ret void
1092}
1093
1094define void @interleave_24i32_out(<24 x i32>* %p, <8 x i32>* %q1, <8 x i32>* %q2, <8 x i32>* %q3) nounwind {
1095; SSE2-LABEL: interleave_24i32_out:
1096; SSE2:       # BB#0:
1097; SSE2-NEXT:    movups 80(%rdi), %xmm5
1098; SSE2-NEXT:    movups 64(%rdi), %xmm8
1099; SSE2-NEXT:    movups (%rdi), %xmm0
1100; SSE2-NEXT:    movups 16(%rdi), %xmm6
1101; SSE2-NEXT:    movups 32(%rdi), %xmm2
1102; SSE2-NEXT:    movups 48(%rdi), %xmm1
1103; SSE2-NEXT:    movaps %xmm1, %xmm3
1104; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,3],xmm8[2,3]
1105; SSE2-NEXT:    movaps %xmm5, %xmm4
1106; SSE2-NEXT:    shufps {{.*#+}} xmm4 = xmm4[1,0],xmm3[2,0]
1107; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,0]
1108; SSE2-NEXT:    movaps %xmm0, %xmm4
1109; SSE2-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,3],xmm6[2,3]
1110; SSE2-NEXT:    movaps %xmm2, %xmm7
1111; SSE2-NEXT:    shufps {{.*#+}} xmm7 = xmm7[1,0],xmm4[2,0]
1112; SSE2-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,1],xmm7[2,0]
1113; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm0[2,3,0,1]
1114; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,0],xmm6[0,0]
1115; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm6[3,3]
1116; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm2[0,1,0,3]
1117; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[2,0],xmm0[2,0]
1118; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,0]
1119; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,0,1]
1120; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,0],xmm8[0,0]
1121; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm8[3,3]
1122; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[0,1,0,3]
1123; SSE2-NEXT:    shufps {{.*#+}} xmm5 = xmm5[2,0],xmm1[2,0]
1124; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm5[2,0]
1125; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,2,3]
1126; SSE2-NEXT:    punpckldq {{.*#+}} xmm10 = xmm10[0],xmm5[0],xmm10[1],xmm5[1]
1127; SSE2-NEXT:    movsd {{.*#+}} xmm9 = xmm10[0],xmm9[1]
1128; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm8[1,1,2,3]
1129; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
1130; SSE2-NEXT:    movsd {{.*#+}} xmm7 = xmm2[0],xmm7[1]
1131; SSE2-NEXT:    movups %xmm3, 16(%rsi)
1132; SSE2-NEXT:    movups %xmm4, (%rsi)
1133; SSE2-NEXT:    movups %xmm1, 16(%rdx)
1134; SSE2-NEXT:    movups %xmm0, (%rdx)
1135; SSE2-NEXT:    movupd %xmm7, 16(%rcx)
1136; SSE2-NEXT:    movupd %xmm9, (%rcx)
1137; SSE2-NEXT:    retq
1138;
1139; SSE42-LABEL: interleave_24i32_out:
1140; SSE42:       # BB#0:
1141; SSE42-NEXT:    movdqu 80(%rdi), %xmm9
1142; SSE42-NEXT:    movdqu 64(%rdi), %xmm10
1143; SSE42-NEXT:    movdqu (%rdi), %xmm4
1144; SSE42-NEXT:    movdqu 16(%rdi), %xmm2
1145; SSE42-NEXT:    movdqu 32(%rdi), %xmm11
1146; SSE42-NEXT:    movdqu 48(%rdi), %xmm5
1147; SSE42-NEXT:    pshufd {{.*#+}} xmm8 = xmm11[0,1,0,1]
1148; SSE42-NEXT:    movdqa %xmm2, %xmm7
1149; SSE42-NEXT:    pblendw {{.*#+}} xmm7 = xmm7[0,1],xmm4[2,3],xmm7[4,5,6,7]
1150; SSE42-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[2,3,0,1]
1151; SSE42-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,3],xmm2[2,3]
1152; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,5],xmm8[6,7]
1153; SSE42-NEXT:    movdqa %xmm10, %xmm1
1154; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm5[2,3],xmm1[4,5,6,7]
1155; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[2,3,0,1]
1156; SSE42-NEXT:    shufps {{.*#+}} xmm5 = xmm5[0,3],xmm10[2,3]
1157; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm9[0,1,0,1]
1158; SSE42-NEXT:    pblendw {{.*#+}} xmm3 = xmm5[0,1,2,3,4,5],xmm3[6,7]
1159; SSE42-NEXT:    pshufd {{.*#+}} xmm5 = xmm11[0,1,2,2]
1160; SSE42-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,0,3,3]
1161; SSE42-NEXT:    pblendw {{.*#+}} xmm7 = xmm7[0,1,2,3,4,5],xmm5[6,7]
1162; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,0,3,3]
1163; SSE42-NEXT:    pshufd {{.*#+}} xmm5 = xmm9[0,1,2,2]
1164; SSE42-NEXT:    pblendw {{.*#+}} xmm5 = xmm1[0,1,2,3,4,5],xmm5[6,7]
1165; SSE42-NEXT:    pblendw {{.*#+}} xmm6 = xmm6[0,1],xmm2[2,3],xmm6[4,5,6,7]
1166; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm11[0,1,0,3]
1167; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm6[0,1,2,3],xmm1[4,5,6,7]
1168; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm10[2,3],xmm0[4,5,6,7]
1169; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm9[0,1,0,3]
1170; SSE42-NEXT:    pblendw {{.*#+}} xmm2 = xmm0[0,1,2,3],xmm2[4,5,6,7]
1171; SSE42-NEXT:    movdqu %xmm3, 16(%rsi)
1172; SSE42-NEXT:    movdqu %xmm4, (%rsi)
1173; SSE42-NEXT:    movdqu %xmm5, 16(%rdx)
1174; SSE42-NEXT:    movdqu %xmm7, (%rdx)
1175; SSE42-NEXT:    movdqu %xmm2, 16(%rcx)
1176; SSE42-NEXT:    movdqu %xmm1, (%rcx)
1177; SSE42-NEXT:    retq
1178;
1179; AVX1-LABEL: interleave_24i32_out:
1180; AVX1:       # BB#0:
1181; AVX1-NEXT:    vmovups (%rdi), %ymm0
1182; AVX1-NEXT:    vmovups 32(%rdi), %ymm1
1183; AVX1-NEXT:    vmovups 64(%rdi), %ymm2
1184; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
1185; AVX1-NEXT:    vinsertps {{.*#+}} xmm4 = zero,zero,xmm2[2],xmm3[1]
1186; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm4
1187; AVX1-NEXT:    vblendps {{.*#+}} ymm5 = ymm0[0],ymm1[1],ymm0[2,3],ymm1[4],ymm0[5,6],ymm1[7]
1188; AVX1-NEXT:    vextractf128 $1, %ymm5, %xmm6
1189; AVX1-NEXT:    vblendps {{.*#+}} xmm5 = xmm5[0,1],xmm6[2],xmm5[3]
1190; AVX1-NEXT:    vpermilps {{.*#+}} xmm5 = xmm5[0,3,2,1]
1191; AVX1-NEXT:    vpermilps {{.*#+}} xmm6 = xmm6[0,3,2,3]
1192; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm5, %ymm5
1193; AVX1-NEXT:    vblendpd {{.*#+}} ymm4 = ymm5[0,1,2],ymm4[3]
1194; AVX1-NEXT:    vblendps {{.*#+}} xmm5 = xmm2[0,1],xmm3[2],xmm2[3]
1195; AVX1-NEXT:    vpermilps {{.*#+}} xmm5 = xmm5[0,0,3,2]
1196; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm0, %ymm5
1197; AVX1-NEXT:    vblendps {{.*#+}} ymm6 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7]
1198; AVX1-NEXT:    vextractf128 $1, %ymm6, %xmm7
1199; AVX1-NEXT:    vblendps {{.*#+}} xmm6 = xmm7[0],xmm6[1,2],xmm7[3]
1200; AVX1-NEXT:    vpermilps {{.*#+}} xmm6 = xmm6[1,0,3,2]
1201; AVX1-NEXT:    vmovshdup {{.*#+}} xmm7 = xmm7[1,1,3,3]
1202; AVX1-NEXT:    vinsertf128 $1, %xmm7, %ymm6, %ymm6
1203; AVX1-NEXT:    vblendps {{.*#+}} ymm5 = ymm6[0,1,2,3,4],ymm5[5,6,7]
1204; AVX1-NEXT:    vshufps {{.*#+}} xmm2 = xmm2[0,1],xmm3[0,3]
1205; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm2
1206; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1],ymm0[2],ymm1[3,4],ymm0[5],ymm1[6,7]
1207; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1208; AVX1-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
1209; AVX1-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[2,1,0,3]
1210; AVX1-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]
1211; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1212; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3,4],ymm2[5,6,7]
1213; AVX1-NEXT:    vmovupd %ymm4, (%rsi)
1214; AVX1-NEXT:    vmovups %ymm5, (%rdx)
1215; AVX1-NEXT:    vmovups %ymm0, (%rcx)
1216; AVX1-NEXT:    vzeroupper
1217; AVX1-NEXT:    retq
1218;
1219; AVX2-LABEL: interleave_24i32_out:
1220; AVX2:       # BB#0:
1221; AVX2-NEXT:    vmovdqu (%rdi), %ymm0
1222; AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
1223; AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
1224; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = <u,u,u,u,u,u,2,5>
1225; AVX2-NEXT:    vpermd %ymm2, %ymm3, %ymm3
1226; AVX2-NEXT:    vpblendd {{.*#+}} ymm4 = ymm0[0],ymm1[1],ymm0[2,3],ymm1[4],ymm0[5,6],ymm1[7]
1227; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = <0,3,6,1,4,7,u,u>
1228; AVX2-NEXT:    vpermd %ymm4, %ymm5, %ymm4
1229; AVX2-NEXT:    vpblendd {{.*#+}} ymm3 = ymm4[0,1,2,3,4,5],ymm3[6,7]
1230; AVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = <u,u,u,u,u,0,3,6>
1231; AVX2-NEXT:    vpermd %ymm2, %ymm4, %ymm4
1232; AVX2-NEXT:    vpblendd {{.*#+}} ymm5 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7]
1233; AVX2-NEXT:    vmovdqa {{.*#+}} ymm6 = <1,4,7,2,5,u,u,u>
1234; AVX2-NEXT:    vpermd %ymm5, %ymm6, %ymm5
1235; AVX2-NEXT:    vpblendd {{.*#+}} ymm4 = ymm5[0,1,2,3,4],ymm4[5,6,7]
1236; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1],ymm0[2],ymm1[3,4],ymm0[5],ymm1[6,7]
1237; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = <2,5,0,3,6,u,u,u>
1238; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
1239; AVX2-NEXT:    vpshufd {{.*#+}} ymm1 = ymm2[0,1,0,3,4,5,4,7]
1240; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,1,0,3]
1241; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4],ymm1[5,6,7]
1242; AVX2-NEXT:    vmovdqu %ymm3, (%rsi)
1243; AVX2-NEXT:    vmovdqu %ymm4, (%rdx)
1244; AVX2-NEXT:    vmovdqu %ymm0, (%rcx)
1245; AVX2-NEXT:    vzeroupper
1246; AVX2-NEXT:    retq
1247  %wide.vec = load <24 x i32>, <24 x i32>* %p, align 4
1248  %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>
1249  %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>
1250  %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>
1251  store <8 x i32> %s1, <8 x i32>* %q1, align 4
1252  store <8 x i32> %s2, <8 x i32>* %q2, align 4
1253  store <8 x i32> %s3, <8 x i32>* %q3, align 4
1254  ret void
1255}
1256
1257define void @interleave_24i32_in(<24 x i32>* %p, <8 x i32>* %q1, <8 x i32>* %q2, <8 x i32>* %q3) nounwind {
1258; SSE2-LABEL: interleave_24i32_in:
1259; SSE2:       # BB#0:
1260; SSE2-NEXT:    movdqu (%rsi), %xmm5
1261; SSE2-NEXT:    movdqu 16(%rsi), %xmm2
1262; SSE2-NEXT:    movdqu (%rdx), %xmm6
1263; SSE2-NEXT:    movdqu 16(%rdx), %xmm1
1264; SSE2-NEXT:    movdqu (%rcx), %xmm7
1265; SSE2-NEXT:    movdqu 16(%rcx), %xmm4
1266; SSE2-NEXT:    movdqa %xmm5, %xmm0
1267; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm6[0],xmm0[1],xmm6[1]
1268; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,2,2]
1269; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm7[0,1,0,1]
1270; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[2,0],xmm0[3,0]
1271; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm3[0,2]
1272; SSE2-NEXT:    movdqa %xmm7, %xmm3
1273; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,0],xmm6[1,0]
1274; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[2,0],xmm6[2,2]
1275; SSE2-NEXT:    punpckhdq {{.*#+}} xmm7 = xmm7[2],xmm5[2],xmm7[3],xmm5[3]
1276; SSE2-NEXT:    shufps {{.*#+}} xmm5 = xmm5[2,0],xmm3[3,0]
1277; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,1],xmm5[0,2]
1278; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[0,3,2,2]
1279; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[2,2,3,3]
1280; SSE2-NEXT:    shufps {{.*#+}} xmm6 = xmm6[2,0],xmm5[3,0]
1281; SSE2-NEXT:    shufps {{.*#+}} xmm5 = xmm5[0,1],xmm6[0,2]
1282; SSE2-NEXT:    movdqa %xmm2, %xmm6
1283; SSE2-NEXT:    punpckldq {{.*#+}} xmm6 = xmm6[0],xmm1[0],xmm6[1],xmm1[1]
1284; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[0,1,2,2]
1285; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,1,0,1]
1286; SSE2-NEXT:    shufps {{.*#+}} xmm7 = xmm7[2,0],xmm6[3,0]
1287; SSE2-NEXT:    shufps {{.*#+}} xmm6 = xmm6[0,1],xmm7[0,2]
1288; SSE2-NEXT:    movdqa %xmm4, %xmm7
1289; SSE2-NEXT:    shufps {{.*#+}} xmm7 = xmm7[1,0],xmm1[1,0]
1290; SSE2-NEXT:    shufps {{.*#+}} xmm7 = xmm7[2,0],xmm1[2,2]
1291; SSE2-NEXT:    punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm2[2],xmm4[3],xmm2[3]
1292; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[2,0],xmm7[3,0]
1293; SSE2-NEXT:    shufps {{.*#+}} xmm7 = xmm7[0,1],xmm2[0,2]
1294; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[0,3,2,2]
1295; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
1296; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm2[3,0]
1297; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,1],xmm1[0,2]
1298; SSE2-NEXT:    movups %xmm2, 80(%rdi)
1299; SSE2-NEXT:    movups %xmm7, 64(%rdi)
1300; SSE2-NEXT:    movups %xmm6, 48(%rdi)
1301; SSE2-NEXT:    movups %xmm5, 32(%rdi)
1302; SSE2-NEXT:    movups %xmm3, 16(%rdi)
1303; SSE2-NEXT:    movups %xmm0, (%rdi)
1304; SSE2-NEXT:    retq
1305;
1306; SSE42-LABEL: interleave_24i32_in:
1307; SSE42:       # BB#0:
1308; SSE42-NEXT:    movdqu (%rsi), %xmm5
1309; SSE42-NEXT:    movdqu 16(%rsi), %xmm2
1310; SSE42-NEXT:    movdqu (%rdx), %xmm6
1311; SSE42-NEXT:    movdqu 16(%rdx), %xmm1
1312; SSE42-NEXT:    movdqu (%rcx), %xmm7
1313; SSE42-NEXT:    movdqu 16(%rcx), %xmm4
1314; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,1,1]
1315; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm5[0,1,0,1]
1316; SSE42-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm0[2,3],xmm3[4,5,6,7]
1317; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,1,0,1]
1318; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5],xmm3[6,7]
1319; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,2,2]
1320; SSE42-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm7[2,3],xmm3[4,5,6,7]
1321; SSE42-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm5[4,5],xmm3[6,7]
1322; SSE42-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[2,3,0,1]
1323; SSE42-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[2,3,2,3]
1324; SSE42-NEXT:    pblendw {{.*#+}} xmm7 = xmm7[0,1],xmm5[2,3],xmm7[4,5,6,7]
1325; SSE42-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[2,2,3,3]
1326; SSE42-NEXT:    pblendw {{.*#+}} xmm5 = xmm7[0,1,2,3],xmm5[4,5],xmm7[6,7]
1327; SSE42-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,0,1,1]
1328; SSE42-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[0,1,0,1]
1329; SSE42-NEXT:    pblendw {{.*#+}} xmm7 = xmm7[0,1],xmm6[2,3],xmm7[4,5,6,7]
1330; SSE42-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,1,0,1]
1331; SSE42-NEXT:    pblendw {{.*#+}} xmm6 = xmm7[0,1,2,3],xmm6[4,5],xmm7[6,7]
1332; SSE42-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[1,1,2,2]
1333; SSE42-NEXT:    pblendw {{.*#+}} xmm7 = xmm7[0,1],xmm4[2,3],xmm7[4,5,6,7]
1334; SSE42-NEXT:    pblendw {{.*#+}} xmm7 = xmm7[0,1,2,3],xmm2[4,5],xmm7[6,7]
1335; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
1336; SSE42-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[2,3,2,3]
1337; SSE42-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm2[2,3],xmm4[4,5,6,7]
1338; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
1339; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm4[0,1,2,3],xmm1[4,5],xmm4[6,7]
1340; SSE42-NEXT:    movdqu %xmm1, 80(%rdi)
1341; SSE42-NEXT:    movdqu %xmm7, 64(%rdi)
1342; SSE42-NEXT:    movdqu %xmm6, 48(%rdi)
1343; SSE42-NEXT:    movdqu %xmm5, 32(%rdi)
1344; SSE42-NEXT:    movdqu %xmm3, 16(%rdi)
1345; SSE42-NEXT:    movdqu %xmm0, (%rdi)
1346; SSE42-NEXT:    retq
1347;
1348; AVX1-LABEL: interleave_24i32_in:
1349; AVX1:       # BB#0:
1350; AVX1-NEXT:    vmovups (%rsi), %ymm0
1351; AVX1-NEXT:    vmovups (%rdx), %ymm1
1352; AVX1-NEXT:    vmovupd (%rcx), %ymm2
1353; AVX1-NEXT:    vshufps {{.*#+}} xmm3 = xmm0[2,0],xmm1[2,0]
1354; AVX1-NEXT:    vshufps {{.*#+}} xmm3 = xmm1[1,1],xmm3[0,2]
1355; AVX1-NEXT:    vshufps {{.*#+}} xmm4 = xmm1[0,0],xmm0[0,0]
1356; AVX1-NEXT:    vshufps {{.*#+}} xmm4 = xmm4[2,0],xmm0[2,1]
1357; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
1358; AVX1-NEXT:    vmovddup {{.*#+}} xmm4 = xmm2[0,0]
1359; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm4, %ymm4
1360; AVX1-NEXT:    vblendps {{.*#+}} ymm3 = ymm3[0,1],ymm4[2],ymm3[3,4],ymm4[5],ymm3[6,7]
1361; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1362; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
1363; AVX1-NEXT:    vshufps {{.*#+}} xmm6 = xmm5[3,0],xmm4[3,0]
1364; AVX1-NEXT:    vshufps {{.*#+}} xmm6 = xmm4[2,1],xmm6[0,2]
1365; AVX1-NEXT:    vshufps {{.*#+}} xmm4 = xmm4[1,0],xmm5[1,0]
1366; AVX1-NEXT:    vshufps {{.*#+}} xmm4 = xmm4[2,0],xmm5[2,2]
1367; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm4, %ymm4
1368; AVX1-NEXT:    vpermilpd {{.*#+}} ymm5 = ymm0[1,1,3,3]
1369; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm5 = ymm5[2,3,2,3]
1370; AVX1-NEXT:    vblendps {{.*#+}} ymm4 = ymm4[0,1],ymm5[2],ymm4[3,4],ymm5[5],ymm4[6,7]
1371; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,2,2]
1372; AVX1-NEXT:    vpermilpd {{.*#+}} ymm2 = ymm2[1,1,2,2]
1373; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm2[0],ymm0[1],ymm2[2,3],ymm0[4],ymm2[5,6],ymm0[7]
1374; AVX1-NEXT:    vpermilps {{.*#+}} ymm1 = ymm1[0,0,3,3,4,4,7,7]
1375; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7]
1376; AVX1-NEXT:    vmovups %ymm0, 32(%rdi)
1377; AVX1-NEXT:    vmovups %ymm4, 64(%rdi)
1378; AVX1-NEXT:    vmovups %ymm3, (%rdi)
1379; AVX1-NEXT:    vzeroupper
1380; AVX1-NEXT:    retq
1381;
1382; AVX2-LABEL: interleave_24i32_in:
1383; AVX2:       # BB#0:
1384; AVX2-NEXT:    vmovdqu (%rsi), %ymm0
1385; AVX2-NEXT:    vmovdqu (%rdx), %ymm1
1386; AVX2-NEXT:    vmovdqu (%rcx), %ymm2
1387; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[1,0,2,2]
1388; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm3 = ymm3[0,1,0,1]
1389; AVX2-NEXT:    vpermq {{.*#+}} ymm4 = ymm0[0,0,2,1]
1390; AVX2-NEXT:    vpblendd {{.*#+}} ymm3 = ymm4[0],ymm3[1],ymm4[2,3],ymm3[4],ymm4[5,6],ymm3[7]
1391; AVX2-NEXT:    vpbroadcastq %xmm2, %ymm4
1392; AVX2-NEXT:    vpblendd {{.*#+}} ymm3 = ymm3[0,1],ymm4[2],ymm3[3,4],ymm4[5],ymm3[6,7]
1393; AVX2-NEXT:    vpermq {{.*#+}} ymm4 = ymm2[2,1,3,3]
1394; AVX2-NEXT:    vpshufd {{.*#+}} ymm5 = ymm1[1,2,3,3,5,6,7,7]
1395; AVX2-NEXT:    vpermq {{.*#+}} ymm5 = ymm5[2,2,2,3]
1396; AVX2-NEXT:    vpblendd {{.*#+}} ymm4 = ymm5[0],ymm4[1],ymm5[2,3],ymm4[4],ymm5[5,6],ymm4[7]
1397; AVX2-NEXT:    vpbroadcastq 24(%rsi), %ymm5
1398; AVX2-NEXT:    vpblendd {{.*#+}} ymm4 = ymm4[0,1],ymm5[2],ymm4[3,4],ymm5[5],ymm4[6,7]
1399; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[1,1,2,2]
1400; AVX2-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[1,1,2,2]
1401; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm2[0],ymm0[1],ymm2[2,3],ymm0[4],ymm2[5,6],ymm0[7]
1402; AVX2-NEXT:    vpshufd {{.*#+}} ymm1 = ymm1[0,0,3,3,4,4,7,7]
1403; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2],ymm0[3,4],ymm1[5],ymm0[6,7]
1404; AVX2-NEXT:    vmovdqu %ymm0, 32(%rdi)
1405; AVX2-NEXT:    vmovdqu %ymm4, 64(%rdi)
1406; AVX2-NEXT:    vmovdqu %ymm3, (%rdi)
1407; AVX2-NEXT:    vzeroupper
1408; AVX2-NEXT:    retq
1409  %s1 = load <8 x i32>, <8 x i32>* %q1, align 4
1410  %s2 = load <8 x i32>, <8 x i32>* %q2, align 4
1411  %s3 = load <8 x i32>, <8 x i32>* %q3, align 4
1412  %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>
1413  %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>
1414  %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>
1415  store <24 x i32> %interleaved, <24 x i32>* %p, align 4
1416  ret void
1417}
1418
1419define <2 x double> @wrongorder(<4 x double> %A, <8 x double>* %P) #0 {
1420; SSE2-LABEL: wrongorder:
1421; SSE2:       # BB#0:
1422; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
1423; SSE2-NEXT:    movaps %xmm0, 48(%rdi)
1424; SSE2-NEXT:    movaps %xmm0, 32(%rdi)
1425; SSE2-NEXT:    movaps %xmm0, 16(%rdi)
1426; SSE2-NEXT:    movaps %xmm0, (%rdi)
1427; SSE2-NEXT:    retq
1428;
1429; SSE42-LABEL: wrongorder:
1430; SSE42:       # BB#0:
1431; SSE42-NEXT:    movddup {{.*#+}} xmm0 = xmm0[0,0]
1432; SSE42-NEXT:    movapd %xmm0, 48(%rdi)
1433; SSE42-NEXT:    movapd %xmm0, 32(%rdi)
1434; SSE42-NEXT:    movapd %xmm0, 16(%rdi)
1435; SSE42-NEXT:    movapd %xmm0, (%rdi)
1436; SSE42-NEXT:    retq
1437;
1438; AVX1-LABEL: wrongorder:
1439; AVX1:       # BB#0:
1440; AVX1-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
1441; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm1
1442; AVX1-NEXT:    vmovaps %ymm1, 32(%rdi)
1443; AVX1-NEXT:    vmovaps %ymm1, (%rdi)
1444; AVX1-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
1445; AVX1-NEXT:    vzeroupper
1446; AVX1-NEXT:    retq
1447;
1448; AVX2-LABEL: wrongorder:
1449; AVX2:       # BB#0:
1450; AVX2-NEXT:    vbroadcastsd %xmm0, %ymm1
1451; AVX2-NEXT:    vmovapd %ymm1, 32(%rdi)
1452; AVX2-NEXT:    vmovapd %ymm1, (%rdi)
1453; AVX2-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
1454; AVX2-NEXT:    vzeroupper
1455; AVX2-NEXT:    retq
1456  %shuffle = shufflevector <4 x double> %A, <4 x double> %A, <8 x i32> zeroinitializer
1457  store <8 x double> %shuffle, <8 x double>* %P, align 64
1458  %m2 = load <8 x double>, <8 x double>* %P, align 64
1459  store <8 x double> %m2, <8 x double>* %P, align 64
1460  %m3 = load <8 x double>, <8 x double>* %P, align 64
1461  %m4 = shufflevector <8 x double> %m3, <8 x double> undef, <2 x i32> <i32 2, i32 0>
1462  ret <2 x double> %m4
1463}
1464