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