1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSSE3
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -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:    movsd {{.*#+}} xmm1 = mem[0],zero
46; SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
47; SSE-NEXT:    movlhps {{.*#+}} 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:    vmovsd {{.*#+}} xmm0 = mem[0],zero
58; AVX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
59; AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[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:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
83; SSE2-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
84; SSE2-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
85; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
86; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
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:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
103; SSSE3-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
104; SSSE3-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
105; SSSE3-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
106; SSSE3-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
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:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
166; SSE2-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
167; SSE2-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
168; SSE2-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
169; SSE2-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
170; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
171; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
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:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
186; SSSE3-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
187; SSSE3-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
188; SSSE3-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
189; SSSE3-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
190; SSSE3-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
191; SSSE3-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
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,%rcx,2), %ecx
259; SSE2-NEXT:    movd %ecx, %xmm0
260; SSE2-NEXT:    movzwl -24(%rsp,%rdx,2), %ecx
261; SSE2-NEXT:    movd %ecx, %xmm1
262; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
263; SSE2-NEXT:    movzwl -24(%rsp,%rsi,2), %ecx
264; SSE2-NEXT:    movd %ecx, %xmm2
265; SSE2-NEXT:    movzwl -24(%rsp,%rdi,2), %ecx
266; SSE2-NEXT:    movd %ecx, %xmm0
267; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
268; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
269; SSE2-NEXT:    movzwl -24(%rsp,%r9,2), %ecx
270; SSE2-NEXT:    movd %ecx, %xmm1
271; SSE2-NEXT:    movzwl -24(%rsp,%r8,2), %ecx
272; SSE2-NEXT:    movd %ecx, %xmm2
273; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
274; SSE2-NEXT:    movzwl -24(%rsp,%rax,2), %eax
275; SSE2-NEXT:    movd %eax, %xmm1
276; SSE2-NEXT:    movzwl -24(%rsp,%r10,2), %eax
277; SSE2-NEXT:    movd %eax, %xmm3
278; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3]
279; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
280; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
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,%rcx,2), %ecx
303; SSSE3-NEXT:    movd %ecx, %xmm0
304; SSSE3-NEXT:    movzwl -24(%rsp,%rdx,2), %ecx
305; SSSE3-NEXT:    movd %ecx, %xmm1
306; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
307; SSSE3-NEXT:    movzwl -24(%rsp,%rsi,2), %ecx
308; SSSE3-NEXT:    movd %ecx, %xmm2
309; SSSE3-NEXT:    movzwl -24(%rsp,%rdi,2), %ecx
310; SSSE3-NEXT:    movd %ecx, %xmm0
311; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
312; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
313; SSSE3-NEXT:    movzwl -24(%rsp,%r9,2), %ecx
314; SSSE3-NEXT:    movd %ecx, %xmm1
315; SSSE3-NEXT:    movzwl -24(%rsp,%r8,2), %ecx
316; SSSE3-NEXT:    movd %ecx, %xmm2
317; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
318; SSSE3-NEXT:    movzwl -24(%rsp,%rax,2), %eax
319; SSSE3-NEXT:    movd %eax, %xmm1
320; SSSE3-NEXT:    movzwl -24(%rsp,%r10,2), %eax
321; SSSE3-NEXT:    movd %eax, %xmm3
322; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3]
323; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
324; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
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,%rdi,2), %edi
347; SSE41-NEXT:    movd %edi, %xmm0
348; SSE41-NEXT:    pinsrw $1, -24(%rsp,%rsi,2), %xmm0
349; SSE41-NEXT:    pinsrw $2, -24(%rsp,%rdx,2), %xmm0
350; SSE41-NEXT:    pinsrw $3, -24(%rsp,%rcx,2), %xmm0
351; SSE41-NEXT:    pinsrw $4, -24(%rsp,%r8,2), %xmm0
352; SSE41-NEXT:    pinsrw $5, -24(%rsp,%r9,2), %xmm0
353; SSE41-NEXT:    pinsrw $6, -24(%rsp,%r10,2), %xmm0
354; SSE41-NEXT:    pinsrw $7, -24(%rsp,%rax,2), %xmm0
355; SSE41-NEXT:    retq
356;
357; AVX-LABEL: var_shuffle_v8i16_v8i16_xxxxxxxx_i16:
358; AVX:       # BB#0:
359; AVX-NEXT:    # kill: %R9D<def> %R9D<kill> %R9<def>
360; AVX-NEXT:    # kill: %R8D<def> %R8D<kill> %R8<def>
361; AVX-NEXT:    # kill: %ECX<def> %ECX<kill> %RCX<def>
362; AVX-NEXT:    # kill: %EDX<def> %EDX<kill> %RDX<def>
363; AVX-NEXT:    # kill: %ESI<def> %ESI<kill> %RSI<def>
364; AVX-NEXT:    # kill: %EDI<def> %EDI<kill> %RDI<def>
365; AVX-NEXT:    andl $7, %edi
366; AVX-NEXT:    andl $7, %esi
367; AVX-NEXT:    andl $7, %edx
368; AVX-NEXT:    andl $7, %ecx
369; AVX-NEXT:    andl $7, %r8d
370; AVX-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)
371; AVX-NEXT:    andl $7, %r9d
372; AVX-NEXT:    movzwl {{[0-9]+}}(%rsp), %r10d
373; AVX-NEXT:    andl $7, %r10d
374; AVX-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax
375; AVX-NEXT:    andl $7, %eax
376; AVX-NEXT:    movzwl -24(%rsp,%rdi,2), %edi
377; AVX-NEXT:    vmovd %edi, %xmm0
378; AVX-NEXT:    vpinsrw $1, -24(%rsp,%rsi,2), %xmm0, %xmm0
379; AVX-NEXT:    vpinsrw $2, -24(%rsp,%rdx,2), %xmm0, %xmm0
380; AVX-NEXT:    vpinsrw $3, -24(%rsp,%rcx,2), %xmm0, %xmm0
381; AVX-NEXT:    vpinsrw $4, -24(%rsp,%r8,2), %xmm0, %xmm0
382; AVX-NEXT:    vpinsrw $5, -24(%rsp,%r9,2), %xmm0, %xmm0
383; AVX-NEXT:    vpinsrw $6, -24(%rsp,%r10,2), %xmm0, %xmm0
384; AVX-NEXT:    vpinsrw $7, -24(%rsp,%rax,2), %xmm0, %xmm0
385; AVX-NEXT:    retq
386  %x0 = extractelement <8 x i16> %x, i16 %i0
387  %x1 = extractelement <8 x i16> %x, i16 %i1
388  %x2 = extractelement <8 x i16> %x, i16 %i2
389  %x3 = extractelement <8 x i16> %x, i16 %i3
390  %x4 = extractelement <8 x i16> %x, i16 %i4
391  %x5 = extractelement <8 x i16> %x, i16 %i5
392  %x6 = extractelement <8 x i16> %x, i16 %i6
393  %x7 = extractelement <8 x i16> %x, i16 %i7
394  %r0 = insertelement <8 x i16> undef, i16 %x0, i32 0
395  %r1 = insertelement <8 x i16>   %r0, i16 %x1, i32 1
396  %r2 = insertelement <8 x i16>   %r1, i16 %x2, i32 2
397  %r3 = insertelement <8 x i16>   %r2, i16 %x3, i32 3
398  %r4 = insertelement <8 x i16>   %r3, i16 %x4, i32 4
399  %r5 = insertelement <8 x i16>   %r4, i16 %x5, i32 5
400  %r6 = insertelement <8 x i16>   %r5, i16 %x6, i32 6
401  %r7 = insertelement <8 x i16>   %r6, i16 %x7, i32 7
402  ret <8 x i16> %r7
403}
404
405define <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 {
406; SSE2-LABEL: var_shuffle_v16i8_v16i8_xxxxxxxxxxxxxxxx_i8:
407; SSE2:       # BB#0:
408; SSE2-NEXT:    # kill: %R9D<def> %R9D<kill> %R9<def>
409; SSE2-NEXT:    # kill: %R8D<def> %R8D<kill> %R8<def>
410; SSE2-NEXT:    # kill: %ECX<def> %ECX<kill> %RCX<def>
411; SSE2-NEXT:    # kill: %EDX<def> %EDX<kill> %RDX<def>
412; SSE2-NEXT:    # kill: %ESI<def> %ESI<kill> %RSI<def>
413; SSE2-NEXT:    # kill: %EDI<def> %EDI<kill> %RDI<def>
414; SSE2-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
415; SSE2-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
416; SSE2-NEXT:    andl $15, %eax
417; SSE2-NEXT:    leaq -{{[0-9]+}}(%rsp), %r10
418; SSE2-NEXT:    movzbl (%rax,%r10), %eax
419; SSE2-NEXT:    movd %eax, %xmm8
420; SSE2-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
421; SSE2-NEXT:    andl $15, %eax
422; SSE2-NEXT:    movzbl (%rax,%r10), %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,%r10), %eax
427; SSE2-NEXT:    movd %eax, %xmm9
428; SSE2-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
429; SSE2-NEXT:    andl $15, %eax
430; SSE2-NEXT:    movzbl (%rax,%r10), %eax
431; SSE2-NEXT:    movd %eax, %xmm3
432; SSE2-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
433; SSE2-NEXT:    andl $15, %eax
434; SSE2-NEXT:    movzbl (%rax,%r10), %eax
435; SSE2-NEXT:    movd %eax, %xmm10
436; SSE2-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
437; SSE2-NEXT:    andl $15, %eax
438; SSE2-NEXT:    movzbl (%rax,%r10), %eax
439; SSE2-NEXT:    movd %eax, %xmm7
440; SSE2-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
441; SSE2-NEXT:    andl $15, %eax
442; SSE2-NEXT:    movzbl (%rax,%r10), %eax
443; SSE2-NEXT:    movd %eax, %xmm11
444; SSE2-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
445; SSE2-NEXT:    andl $15, %eax
446; SSE2-NEXT:    movzbl (%rax,%r10), %eax
447; SSE2-NEXT:    movd %eax, %xmm6
448; SSE2-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
449; SSE2-NEXT:    andl $15, %eax
450; SSE2-NEXT:    movzbl (%rax,%r10), %eax
451; SSE2-NEXT:    movd %eax, %xmm12
452; SSE2-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
453; SSE2-NEXT:    andl $15, %eax
454; SSE2-NEXT:    movzbl (%rax,%r10), %eax
455; SSE2-NEXT:    movd %eax, %xmm5
456; SSE2-NEXT:    andl $15, %r9d
457; SSE2-NEXT:    movzbl (%r9,%r10), %eax
458; SSE2-NEXT:    movd %eax, %xmm13
459; SSE2-NEXT:    andl $15, %r8d
460; SSE2-NEXT:    movzbl (%r8,%r10), %eax
461; SSE2-NEXT:    movd %eax, %xmm4
462; SSE2-NEXT:    andl $15, %ecx
463; SSE2-NEXT:    movzbl (%rcx,%r10), %eax
464; SSE2-NEXT:    movd %eax, %xmm14
465; SSE2-NEXT:    andl $15, %edx
466; SSE2-NEXT:    movzbl (%rdx,%r10), %eax
467; SSE2-NEXT:    movd %eax, %xmm1
468; SSE2-NEXT:    andl $15, %esi
469; SSE2-NEXT:    movzbl (%rsi,%r10), %eax
470; SSE2-NEXT:    movd %eax, %xmm2
471; SSE2-NEXT:    andl $15, %edi
472; SSE2-NEXT:    movzbl (%rdi,%r10), %eax
473; SSE2-NEXT:    movd %eax, %xmm0
474; 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]
475; 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]
476; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm15[0],xmm3[1],xmm15[1],xmm3[2],xmm15[2],xmm3[3],xmm15[3]
477; SSE2-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm10[0],xmm7[1],xmm10[1],xmm7[2],xmm10[2],xmm7[3],xmm10[3],xmm7[4],xmm10[4],xmm7[5],xmm10[5],xmm7[6],xmm10[6],xmm7[7],xmm10[7]
478; SSE2-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm11[0],xmm6[1],xmm11[1],xmm6[2],xmm11[2],xmm6[3],xmm11[3],xmm6[4],xmm11[4],xmm6[5],xmm11[5],xmm6[6],xmm11[6],xmm6[7],xmm11[7]
479; SSE2-NEXT:    punpcklwd {{.*#+}} xmm6 = xmm6[0],xmm7[0],xmm6[1],xmm7[1],xmm6[2],xmm7[2],xmm6[3],xmm7[3]
480; SSE2-NEXT:    punpckldq {{.*#+}} xmm6 = xmm6[0],xmm3[0],xmm6[1],xmm3[1]
481; SSE2-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm12[0],xmm5[1],xmm12[1],xmm5[2],xmm12[2],xmm5[3],xmm12[3],xmm5[4],xmm12[4],xmm5[5],xmm12[5],xmm5[6],xmm12[6],xmm5[7],xmm12[7]
482; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm13[0],xmm4[1],xmm13[1],xmm4[2],xmm13[2],xmm4[3],xmm13[3],xmm4[4],xmm13[4],xmm4[5],xmm13[5],xmm4[6],xmm13[6],xmm4[7],xmm13[7]
483; SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1],xmm4[2],xmm5[2],xmm4[3],xmm5[3]
484; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm14[0],xmm1[1],xmm14[1],xmm1[2],xmm14[2],xmm1[3],xmm14[3],xmm1[4],xmm14[4],xmm1[5],xmm14[5],xmm1[6],xmm14[6],xmm1[7],xmm14[7]
485; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
486; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
487; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
488; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm6[0]
489; SSE2-NEXT:    retq
490;
491; SSSE3-LABEL: var_shuffle_v16i8_v16i8_xxxxxxxxxxxxxxxx_i8:
492; SSSE3:       # BB#0:
493; SSSE3-NEXT:    # kill: %R9D<def> %R9D<kill> %R9<def>
494; SSSE3-NEXT:    # kill: %R8D<def> %R8D<kill> %R8<def>
495; SSSE3-NEXT:    # kill: %ECX<def> %ECX<kill> %RCX<def>
496; SSSE3-NEXT:    # kill: %EDX<def> %EDX<kill> %RDX<def>
497; SSSE3-NEXT:    # kill: %ESI<def> %ESI<kill> %RSI<def>
498; SSSE3-NEXT:    # kill: %EDI<def> %EDI<kill> %RDI<def>
499; SSSE3-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
500; SSSE3-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
501; SSSE3-NEXT:    andl $15, %eax
502; SSSE3-NEXT:    leaq -{{[0-9]+}}(%rsp), %r10
503; SSSE3-NEXT:    movzbl (%rax,%r10), %eax
504; SSSE3-NEXT:    movd %eax, %xmm8
505; SSSE3-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
506; SSSE3-NEXT:    andl $15, %eax
507; SSSE3-NEXT:    movzbl (%rax,%r10), %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,%r10), %eax
512; SSSE3-NEXT:    movd %eax, %xmm9
513; SSSE3-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
514; SSSE3-NEXT:    andl $15, %eax
515; SSSE3-NEXT:    movzbl (%rax,%r10), %eax
516; SSSE3-NEXT:    movd %eax, %xmm3
517; SSSE3-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
518; SSSE3-NEXT:    andl $15, %eax
519; SSSE3-NEXT:    movzbl (%rax,%r10), %eax
520; SSSE3-NEXT:    movd %eax, %xmm10
521; SSSE3-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
522; SSSE3-NEXT:    andl $15, %eax
523; SSSE3-NEXT:    movzbl (%rax,%r10), %eax
524; SSSE3-NEXT:    movd %eax, %xmm7
525; SSSE3-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
526; SSSE3-NEXT:    andl $15, %eax
527; SSSE3-NEXT:    movzbl (%rax,%r10), %eax
528; SSSE3-NEXT:    movd %eax, %xmm11
529; SSSE3-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
530; SSSE3-NEXT:    andl $15, %eax
531; SSSE3-NEXT:    movzbl (%rax,%r10), %eax
532; SSSE3-NEXT:    movd %eax, %xmm6
533; SSSE3-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
534; SSSE3-NEXT:    andl $15, %eax
535; SSSE3-NEXT:    movzbl (%rax,%r10), %eax
536; SSSE3-NEXT:    movd %eax, %xmm12
537; SSSE3-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
538; SSSE3-NEXT:    andl $15, %eax
539; SSSE3-NEXT:    movzbl (%rax,%r10), %eax
540; SSSE3-NEXT:    movd %eax, %xmm5
541; SSSE3-NEXT:    andl $15, %r9d
542; SSSE3-NEXT:    movzbl (%r9,%r10), %eax
543; SSSE3-NEXT:    movd %eax, %xmm13
544; SSSE3-NEXT:    andl $15, %r8d
545; SSSE3-NEXT:    movzbl (%r8,%r10), %eax
546; SSSE3-NEXT:    movd %eax, %xmm4
547; SSSE3-NEXT:    andl $15, %ecx
548; SSSE3-NEXT:    movzbl (%rcx,%r10), %eax
549; SSSE3-NEXT:    movd %eax, %xmm14
550; SSSE3-NEXT:    andl $15, %edx
551; SSSE3-NEXT:    movzbl (%rdx,%r10), %eax
552; SSSE3-NEXT:    movd %eax, %xmm1
553; SSSE3-NEXT:    andl $15, %esi
554; SSSE3-NEXT:    movzbl (%rsi,%r10), %eax
555; SSSE3-NEXT:    movd %eax, %xmm2
556; SSSE3-NEXT:    andl $15, %edi
557; SSSE3-NEXT:    movzbl (%rdi,%r10), %eax
558; SSSE3-NEXT:    movd %eax, %xmm0
559; 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]
560; 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]
561; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm15[0],xmm3[1],xmm15[1],xmm3[2],xmm15[2],xmm3[3],xmm15[3]
562; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm10[0],xmm7[1],xmm10[1],xmm7[2],xmm10[2],xmm7[3],xmm10[3],xmm7[4],xmm10[4],xmm7[5],xmm10[5],xmm7[6],xmm10[6],xmm7[7],xmm10[7]
563; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm11[0],xmm6[1],xmm11[1],xmm6[2],xmm11[2],xmm6[3],xmm11[3],xmm6[4],xmm11[4],xmm6[5],xmm11[5],xmm6[6],xmm11[6],xmm6[7],xmm11[7]
564; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm6 = xmm6[0],xmm7[0],xmm6[1],xmm7[1],xmm6[2],xmm7[2],xmm6[3],xmm7[3]
565; SSSE3-NEXT:    punpckldq {{.*#+}} xmm6 = xmm6[0],xmm3[0],xmm6[1],xmm3[1]
566; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm12[0],xmm5[1],xmm12[1],xmm5[2],xmm12[2],xmm5[3],xmm12[3],xmm5[4],xmm12[4],xmm5[5],xmm12[5],xmm5[6],xmm12[6],xmm5[7],xmm12[7]
567; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm13[0],xmm4[1],xmm13[1],xmm4[2],xmm13[2],xmm4[3],xmm13[3],xmm4[4],xmm13[4],xmm4[5],xmm13[5],xmm4[6],xmm13[6],xmm4[7],xmm13[7]
568; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1],xmm4[2],xmm5[2],xmm4[3],xmm5[3]
569; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm14[0],xmm1[1],xmm14[1],xmm1[2],xmm14[2],xmm1[3],xmm14[3],xmm1[4],xmm14[4],xmm1[5],xmm14[5],xmm1[6],xmm14[6],xmm1[7],xmm14[7]
570; SSSE3-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]
571; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
572; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
573; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm6[0]
574; SSSE3-NEXT:    retq
575;
576; SSE41-LABEL: var_shuffle_v16i8_v16i8_xxxxxxxxxxxxxxxx_i8:
577; SSE41:       # BB#0:
578; SSE41-NEXT:    # kill: %R9D<def> %R9D<kill> %R9<def>
579; SSE41-NEXT:    # kill: %R8D<def> %R8D<kill> %R8<def>
580; SSE41-NEXT:    # kill: %ECX<def> %ECX<kill> %RCX<def>
581; SSE41-NEXT:    # kill: %EDX<def> %EDX<kill> %RDX<def>
582; SSE41-NEXT:    # kill: %ESI<def> %ESI<kill> %RSI<def>
583; SSE41-NEXT:    # kill: %EDI<def> %EDI<kill> %RDI<def>
584; SSE41-NEXT:    andl $15, %edi
585; SSE41-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
586; SSE41-NEXT:    leaq -{{[0-9]+}}(%rsp), %rax
587; SSE41-NEXT:    movzbl (%rdi,%rax), %edi
588; SSE41-NEXT:    movd %edi, %xmm0
589; SSE41-NEXT:    andl $15, %esi
590; SSE41-NEXT:    pinsrb $1, (%rsi,%rax), %xmm0
591; SSE41-NEXT:    andl $15, %edx
592; SSE41-NEXT:    pinsrb $2, (%rdx,%rax), %xmm0
593; SSE41-NEXT:    andl $15, %ecx
594; SSE41-NEXT:    pinsrb $3, (%rcx,%rax), %xmm0
595; SSE41-NEXT:    andl $15, %r8d
596; SSE41-NEXT:    pinsrb $4, (%r8,%rax), %xmm0
597; SSE41-NEXT:    andl $15, %r9d
598; SSE41-NEXT:    pinsrb $5, (%r9,%rax), %xmm0
599; SSE41-NEXT:    movzbl {{[0-9]+}}(%rsp), %ecx
600; SSE41-NEXT:    andl $15, %ecx
601; SSE41-NEXT:    pinsrb $6, (%rcx,%rax), %xmm0
602; SSE41-NEXT:    movzbl {{[0-9]+}}(%rsp), %ecx
603; SSE41-NEXT:    andl $15, %ecx
604; SSE41-NEXT:    pinsrb $7, (%rcx,%rax), %xmm0
605; SSE41-NEXT:    movzbl {{[0-9]+}}(%rsp), %ecx
606; SSE41-NEXT:    andl $15, %ecx
607; SSE41-NEXT:    pinsrb $8, (%rcx,%rax), %xmm0
608; SSE41-NEXT:    movzbl {{[0-9]+}}(%rsp), %ecx
609; SSE41-NEXT:    andl $15, %ecx
610; SSE41-NEXT:    pinsrb $9, (%rcx,%rax), %xmm0
611; SSE41-NEXT:    movzbl {{[0-9]+}}(%rsp), %ecx
612; SSE41-NEXT:    andl $15, %ecx
613; SSE41-NEXT:    pinsrb $10, (%rcx,%rax), %xmm0
614; SSE41-NEXT:    movzbl {{[0-9]+}}(%rsp), %ecx
615; SSE41-NEXT:    andl $15, %ecx
616; SSE41-NEXT:    pinsrb $11, (%rcx,%rax), %xmm0
617; SSE41-NEXT:    movzbl {{[0-9]+}}(%rsp), %ecx
618; SSE41-NEXT:    andl $15, %ecx
619; SSE41-NEXT:    pinsrb $12, (%rcx,%rax), %xmm0
620; SSE41-NEXT:    movzbl {{[0-9]+}}(%rsp), %ecx
621; SSE41-NEXT:    andl $15, %ecx
622; SSE41-NEXT:    pinsrb $13, (%rcx,%rax), %xmm0
623; SSE41-NEXT:    movzbl {{[0-9]+}}(%rsp), %ecx
624; SSE41-NEXT:    andl $15, %ecx
625; SSE41-NEXT:    pinsrb $14, (%rcx,%rax), %xmm0
626; SSE41-NEXT:    movzbl {{[0-9]+}}(%rsp), %ecx
627; SSE41-NEXT:    andl $15, %ecx
628; SSE41-NEXT:    pinsrb $15, (%rcx,%rax), %xmm0
629; SSE41-NEXT:    retq
630;
631; AVX-LABEL: var_shuffle_v16i8_v16i8_xxxxxxxxxxxxxxxx_i8:
632; AVX:       # BB#0:
633; AVX-NEXT:    # kill: %R9D<def> %R9D<kill> %R9<def>
634; AVX-NEXT:    # kill: %R8D<def> %R8D<kill> %R8<def>
635; AVX-NEXT:    # kill: %ECX<def> %ECX<kill> %RCX<def>
636; AVX-NEXT:    # kill: %EDX<def> %EDX<kill> %RDX<def>
637; AVX-NEXT:    # kill: %ESI<def> %ESI<kill> %RSI<def>
638; AVX-NEXT:    # kill: %EDI<def> %EDI<kill> %RDI<def>
639; AVX-NEXT:    andl $15, %edi
640; AVX-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)
641; AVX-NEXT:    leaq -{{[0-9]+}}(%rsp), %rax
642; AVX-NEXT:    movzbl (%rdi,%rax), %edi
643; AVX-NEXT:    vmovd %edi, %xmm0
644; AVX-NEXT:    andl $15, %esi
645; AVX-NEXT:    vpinsrb $1, (%rsi,%rax), %xmm0, %xmm0
646; AVX-NEXT:    andl $15, %edx
647; AVX-NEXT:    vpinsrb $2, (%rdx,%rax), %xmm0, %xmm0
648; AVX-NEXT:    andl $15, %ecx
649; AVX-NEXT:    vpinsrb $3, (%rcx,%rax), %xmm0, %xmm0
650; AVX-NEXT:    andl $15, %r8d
651; AVX-NEXT:    vpinsrb $4, (%r8,%rax), %xmm0, %xmm0
652; AVX-NEXT:    andl $15, %r9d
653; AVX-NEXT:    vpinsrb $5, (%r9,%rax), %xmm0, %xmm0
654; AVX-NEXT:    movzbl {{[0-9]+}}(%rsp), %ecx
655; AVX-NEXT:    andl $15, %ecx
656; AVX-NEXT:    vpinsrb $6, (%rcx,%rax), %xmm0, %xmm0
657; AVX-NEXT:    movzbl {{[0-9]+}}(%rsp), %ecx
658; AVX-NEXT:    andl $15, %ecx
659; AVX-NEXT:    vpinsrb $7, (%rcx,%rax), %xmm0, %xmm0
660; AVX-NEXT:    movzbl {{[0-9]+}}(%rsp), %ecx
661; AVX-NEXT:    andl $15, %ecx
662; AVX-NEXT:    vpinsrb $8, (%rcx,%rax), %xmm0, %xmm0
663; AVX-NEXT:    movzbl {{[0-9]+}}(%rsp), %ecx
664; AVX-NEXT:    andl $15, %ecx
665; AVX-NEXT:    vpinsrb $9, (%rcx,%rax), %xmm0, %xmm0
666; AVX-NEXT:    movzbl {{[0-9]+}}(%rsp), %ecx
667; AVX-NEXT:    andl $15, %ecx
668; AVX-NEXT:    vpinsrb $10, (%rcx,%rax), %xmm0, %xmm0
669; AVX-NEXT:    movzbl {{[0-9]+}}(%rsp), %ecx
670; AVX-NEXT:    andl $15, %ecx
671; AVX-NEXT:    vpinsrb $11, (%rcx,%rax), %xmm0, %xmm0
672; AVX-NEXT:    movzbl {{[0-9]+}}(%rsp), %ecx
673; AVX-NEXT:    andl $15, %ecx
674; AVX-NEXT:    vpinsrb $12, (%rcx,%rax), %xmm0, %xmm0
675; AVX-NEXT:    movzbl {{[0-9]+}}(%rsp), %ecx
676; AVX-NEXT:    andl $15, %ecx
677; AVX-NEXT:    vpinsrb $13, (%rcx,%rax), %xmm0, %xmm0
678; AVX-NEXT:    movzbl {{[0-9]+}}(%rsp), %ecx
679; AVX-NEXT:    andl $15, %ecx
680; AVX-NEXT:    vpinsrb $14, (%rcx,%rax), %xmm0, %xmm0
681; AVX-NEXT:    movzbl {{[0-9]+}}(%rsp), %ecx
682; AVX-NEXT:    andl $15, %ecx
683; AVX-NEXT:    vpinsrb $15, (%rcx,%rax), %xmm0, %xmm0
684; AVX-NEXT:    retq
685  %x0  = extractelement <16 x i8> %x, i8 %i0
686  %x1  = extractelement <16 x i8> %x, i8 %i1
687  %x2  = extractelement <16 x i8> %x, i8 %i2
688  %x3  = extractelement <16 x i8> %x, i8 %i3
689  %x4  = extractelement <16 x i8> %x, i8 %i4
690  %x5  = extractelement <16 x i8> %x, i8 %i5
691  %x6  = extractelement <16 x i8> %x, i8 %i6
692  %x7  = extractelement <16 x i8> %x, i8 %i7
693  %x8  = extractelement <16 x i8> %x, i8 %i8
694  %x9  = extractelement <16 x i8> %x, i8 %i9
695  %x10 = extractelement <16 x i8> %x, i8 %i10
696  %x11 = extractelement <16 x i8> %x, i8 %i11
697  %x12 = extractelement <16 x i8> %x, i8 %i12
698  %x13 = extractelement <16 x i8> %x, i8 %i13
699  %x14 = extractelement <16 x i8> %x, i8 %i14
700  %x15 = extractelement <16 x i8> %x, i8 %i15
701  %r0  = insertelement <16 x i8> undef, i8 %x0 , i32 0
702  %r1  = insertelement <16 x i8>  %r0 , i8 %x1 , i32 1
703  %r2  = insertelement <16 x i8>  %r1 , i8 %x2 , i32 2
704  %r3  = insertelement <16 x i8>  %r2 , i8 %x3 , i32 3
705  %r4  = insertelement <16 x i8>  %r3 , i8 %x4 , i32 4
706  %r5  = insertelement <16 x i8>  %r4 , i8 %x5 , i32 5
707  %r6  = insertelement <16 x i8>  %r5 , i8 %x6 , i32 6
708  %r7  = insertelement <16 x i8>  %r6 , i8 %x7 , i32 7
709  %r8  = insertelement <16 x i8>  %r7 , i8 %x8 , i32 8
710  %r9  = insertelement <16 x i8>  %r8 , i8 %x9 , i32 9
711  %r10 = insertelement <16 x i8>  %r9 , i8 %x10, i32 10
712  %r11 = insertelement <16 x i8>  %r10, i8 %x11, i32 11
713  %r12 = insertelement <16 x i8>  %r11, i8 %x12, i32 12
714  %r13 = insertelement <16 x i8>  %r12, i8 %x13, i32 13
715  %r14 = insertelement <16 x i8>  %r13, i8 %x14, i32 14
716  %r15 = insertelement <16 x i8>  %r14, i8 %x15, i32 15
717  ret <16 x i8> %r15
718}
719
720;
721; Unary shuffle indices from memory
722;
723
724define <4 x i32> @mem_shuffle_v4i32_v4i32_xxxx_i32(<4 x i32> %x, i32* %i) nounwind {
725; SSE2-LABEL: mem_shuffle_v4i32_v4i32_xxxx_i32:
726; SSE2:       # BB#0:
727; SSE2-NEXT:    movl (%rdi), %eax
728; SSE2-NEXT:    movl 4(%rdi), %ecx
729; SSE2-NEXT:    andl $3, %eax
730; SSE2-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
731; SSE2-NEXT:    andl $3, %ecx
732; SSE2-NEXT:    movl 8(%rdi), %edx
733; SSE2-NEXT:    andl $3, %edx
734; SSE2-NEXT:    movl 12(%rdi), %esi
735; SSE2-NEXT:    andl $3, %esi
736; SSE2-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
737; SSE2-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
738; SSE2-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
739; SSE2-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
740; SSE2-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
741; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
742; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
743; SSE2-NEXT:    retq
744;
745; SSSE3-LABEL: mem_shuffle_v4i32_v4i32_xxxx_i32:
746; SSSE3:       # BB#0:
747; SSSE3-NEXT:    movl (%rdi), %eax
748; SSSE3-NEXT:    movl 4(%rdi), %ecx
749; SSSE3-NEXT:    andl $3, %eax
750; SSSE3-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
751; SSSE3-NEXT:    andl $3, %ecx
752; SSSE3-NEXT:    movl 8(%rdi), %edx
753; SSSE3-NEXT:    andl $3, %edx
754; SSSE3-NEXT:    movl 12(%rdi), %esi
755; SSSE3-NEXT:    andl $3, %esi
756; SSSE3-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
757; SSSE3-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
758; SSSE3-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
759; SSSE3-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
760; SSSE3-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
761; SSSE3-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
762; SSSE3-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
763; SSSE3-NEXT:    retq
764;
765; SSE41-LABEL: mem_shuffle_v4i32_v4i32_xxxx_i32:
766; SSE41:       # BB#0:
767; SSE41-NEXT:    movl (%rdi), %eax
768; SSE41-NEXT:    movl 4(%rdi), %ecx
769; SSE41-NEXT:    andl $3, %eax
770; SSE41-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
771; SSE41-NEXT:    andl $3, %ecx
772; SSE41-NEXT:    movl 8(%rdi), %edx
773; SSE41-NEXT:    andl $3, %edx
774; SSE41-NEXT:    movl 12(%rdi), %esi
775; SSE41-NEXT:    andl $3, %esi
776; SSE41-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
777; SSE41-NEXT:    pinsrd $1, -24(%rsp,%rcx,4), %xmm0
778; SSE41-NEXT:    pinsrd $2, -24(%rsp,%rdx,4), %xmm0
779; SSE41-NEXT:    pinsrd $3, -24(%rsp,%rsi,4), %xmm0
780; SSE41-NEXT:    retq
781;
782; AVX-LABEL: mem_shuffle_v4i32_v4i32_xxxx_i32:
783; AVX:       # BB#0:
784; AVX-NEXT:    movl (%rdi), %eax
785; AVX-NEXT:    movl 4(%rdi), %ecx
786; AVX-NEXT:    andl $3, %eax
787; AVX-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)
788; AVX-NEXT:    andl $3, %ecx
789; AVX-NEXT:    movl 8(%rdi), %edx
790; AVX-NEXT:    andl $3, %edx
791; AVX-NEXT:    movl 12(%rdi), %esi
792; AVX-NEXT:    andl $3, %esi
793; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
794; AVX-NEXT:    vpinsrd $1, -24(%rsp,%rcx,4), %xmm0, %xmm0
795; AVX-NEXT:    vpinsrd $2, -24(%rsp,%rdx,4), %xmm0, %xmm0
796; AVX-NEXT:    vpinsrd $3, -24(%rsp,%rsi,4), %xmm0, %xmm0
797; AVX-NEXT:    retq
798  %p0  = getelementptr inbounds i32, i32* %i, i64 0
799  %p1  = getelementptr inbounds i32, i32* %i, i64 1
800  %p2  = getelementptr inbounds i32, i32* %i, i64 2
801  %p3  = getelementptr inbounds i32, i32* %i, i64 3
802  %i0  = load i32, i32* %p0, align 4
803  %i1  = load i32, i32* %p1, align 4
804  %i2  = load i32, i32* %p2, align 4
805  %i3  = load i32, i32* %p3, align 4
806  %x0 = extractelement <4 x i32> %x, i32 %i0
807  %x1 = extractelement <4 x i32> %x, i32 %i1
808  %x2 = extractelement <4 x i32> %x, i32 %i2
809  %x3 = extractelement <4 x i32> %x, i32 %i3
810  %r0 = insertelement <4 x i32> undef, i32 %x0, i32 0
811  %r1 = insertelement <4 x i32>   %r0, i32 %x1, i32 1
812  %r2 = insertelement <4 x i32>   %r1, i32 %x2, i32 2
813  %r3 = insertelement <4 x i32>   %r2, i32 %x3, i32 3
814  ret <4 x i32> %r3
815}
816
817define <16 x i8> @mem_shuffle_v16i8_v16i8_xxxxxxxxxxxxxxxx_i8(<16 x i8> %x, i8* %i) nounwind {
818; SSE2-LABEL: mem_shuffle_v16i8_v16i8_xxxxxxxxxxxxxxxx_i8:
819; SSE2:       # BB#0:
820; SSE2-NEXT:    movzbl (%rdi), %eax
821; SSE2-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
822; SSE2-NEXT:    movzbl 15(%rdi), %edx
823; SSE2-NEXT:    andl $15, %edx
824; SSE2-NEXT:    leaq -{{[0-9]+}}(%rsp), %rcx
825; SSE2-NEXT:    movzbl (%rdx,%rcx), %edx
826; SSE2-NEXT:    movd %edx, %xmm8
827; SSE2-NEXT:    movzbl 14(%rdi), %edx
828; SSE2-NEXT:    andl $15, %edx
829; SSE2-NEXT:    movzbl (%rdx,%rcx), %edx
830; SSE2-NEXT:    movd %edx, %xmm15
831; SSE2-NEXT:    movzbl 13(%rdi), %edx
832; SSE2-NEXT:    andl $15, %edx
833; SSE2-NEXT:    movzbl (%rdx,%rcx), %edx
834; SSE2-NEXT:    movd %edx, %xmm9
835; SSE2-NEXT:    movzbl 12(%rdi), %edx
836; SSE2-NEXT:    andl $15, %edx
837; SSE2-NEXT:    movzbl (%rdx,%rcx), %edx
838; SSE2-NEXT:    movd %edx, %xmm3
839; SSE2-NEXT:    movzbl 11(%rdi), %edx
840; SSE2-NEXT:    andl $15, %edx
841; SSE2-NEXT:    movzbl (%rdx,%rcx), %edx
842; SSE2-NEXT:    movd %edx, %xmm10
843; SSE2-NEXT:    movzbl 10(%rdi), %edx
844; SSE2-NEXT:    andl $15, %edx
845; SSE2-NEXT:    movzbl (%rdx,%rcx), %edx
846; SSE2-NEXT:    movd %edx, %xmm7
847; SSE2-NEXT:    movzbl 9(%rdi), %edx
848; SSE2-NEXT:    andl $15, %edx
849; SSE2-NEXT:    movzbl (%rdx,%rcx), %edx
850; SSE2-NEXT:    movd %edx, %xmm11
851; SSE2-NEXT:    movzbl 8(%rdi), %edx
852; SSE2-NEXT:    andl $15, %edx
853; SSE2-NEXT:    movzbl (%rdx,%rcx), %edx
854; SSE2-NEXT:    movd %edx, %xmm6
855; SSE2-NEXT:    movzbl 7(%rdi), %edx
856; SSE2-NEXT:    andl $15, %edx
857; SSE2-NEXT:    movzbl (%rdx,%rcx), %edx
858; SSE2-NEXT:    movd %edx, %xmm12
859; SSE2-NEXT:    movzbl 6(%rdi), %edx
860; SSE2-NEXT:    andl $15, %edx
861; SSE2-NEXT:    movzbl (%rdx,%rcx), %edx
862; SSE2-NEXT:    movd %edx, %xmm5
863; SSE2-NEXT:    movzbl 5(%rdi), %edx
864; SSE2-NEXT:    andl $15, %edx
865; SSE2-NEXT:    movzbl (%rdx,%rcx), %edx
866; SSE2-NEXT:    movd %edx, %xmm13
867; SSE2-NEXT:    movzbl 4(%rdi), %edx
868; SSE2-NEXT:    andl $15, %edx
869; SSE2-NEXT:    movzbl (%rdx,%rcx), %edx
870; SSE2-NEXT:    movd %edx, %xmm4
871; SSE2-NEXT:    movzbl 3(%rdi), %edx
872; SSE2-NEXT:    andl $15, %edx
873; SSE2-NEXT:    movzbl (%rdx,%rcx), %edx
874; SSE2-NEXT:    movd %edx, %xmm14
875; SSE2-NEXT:    movzbl 2(%rdi), %edx
876; SSE2-NEXT:    andl $15, %edx
877; SSE2-NEXT:    movzbl (%rdx,%rcx), %edx
878; SSE2-NEXT:    movd %edx, %xmm1
879; SSE2-NEXT:    movzbl 1(%rdi), %edx
880; SSE2-NEXT:    andl $15, %edx
881; SSE2-NEXT:    movzbl (%rdx,%rcx), %edx
882; SSE2-NEXT:    movd %edx, %xmm2
883; SSE2-NEXT:    andl $15, %eax
884; SSE2-NEXT:    movzbl (%rax,%rcx), %eax
885; SSE2-NEXT:    movd %eax, %xmm0
886; 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]
887; 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]
888; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm15[0],xmm3[1],xmm15[1],xmm3[2],xmm15[2],xmm3[3],xmm15[3]
889; SSE2-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm10[0],xmm7[1],xmm10[1],xmm7[2],xmm10[2],xmm7[3],xmm10[3],xmm7[4],xmm10[4],xmm7[5],xmm10[5],xmm7[6],xmm10[6],xmm7[7],xmm10[7]
890; SSE2-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm11[0],xmm6[1],xmm11[1],xmm6[2],xmm11[2],xmm6[3],xmm11[3],xmm6[4],xmm11[4],xmm6[5],xmm11[5],xmm6[6],xmm11[6],xmm6[7],xmm11[7]
891; SSE2-NEXT:    punpcklwd {{.*#+}} xmm6 = xmm6[0],xmm7[0],xmm6[1],xmm7[1],xmm6[2],xmm7[2],xmm6[3],xmm7[3]
892; SSE2-NEXT:    punpckldq {{.*#+}} xmm6 = xmm6[0],xmm3[0],xmm6[1],xmm3[1]
893; SSE2-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm12[0],xmm5[1],xmm12[1],xmm5[2],xmm12[2],xmm5[3],xmm12[3],xmm5[4],xmm12[4],xmm5[5],xmm12[5],xmm5[6],xmm12[6],xmm5[7],xmm12[7]
894; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm13[0],xmm4[1],xmm13[1],xmm4[2],xmm13[2],xmm4[3],xmm13[3],xmm4[4],xmm13[4],xmm4[5],xmm13[5],xmm4[6],xmm13[6],xmm4[7],xmm13[7]
895; SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1],xmm4[2],xmm5[2],xmm4[3],xmm5[3]
896; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm14[0],xmm1[1],xmm14[1],xmm1[2],xmm14[2],xmm1[3],xmm14[3],xmm1[4],xmm14[4],xmm1[5],xmm14[5],xmm1[6],xmm14[6],xmm1[7],xmm14[7]
897; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
898; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
899; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
900; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm6[0]
901; SSE2-NEXT:    retq
902;
903; SSSE3-LABEL: mem_shuffle_v16i8_v16i8_xxxxxxxxxxxxxxxx_i8:
904; SSSE3:       # BB#0:
905; SSSE3-NEXT:    movzbl (%rdi), %eax
906; SSSE3-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
907; SSSE3-NEXT:    movzbl 15(%rdi), %edx
908; SSSE3-NEXT:    andl $15, %edx
909; SSSE3-NEXT:    leaq -{{[0-9]+}}(%rsp), %rcx
910; SSSE3-NEXT:    movzbl (%rdx,%rcx), %edx
911; SSSE3-NEXT:    movd %edx, %xmm8
912; SSSE3-NEXT:    movzbl 14(%rdi), %edx
913; SSSE3-NEXT:    andl $15, %edx
914; SSSE3-NEXT:    movzbl (%rdx,%rcx), %edx
915; SSSE3-NEXT:    movd %edx, %xmm15
916; SSSE3-NEXT:    movzbl 13(%rdi), %edx
917; SSSE3-NEXT:    andl $15, %edx
918; SSSE3-NEXT:    movzbl (%rdx,%rcx), %edx
919; SSSE3-NEXT:    movd %edx, %xmm9
920; SSSE3-NEXT:    movzbl 12(%rdi), %edx
921; SSSE3-NEXT:    andl $15, %edx
922; SSSE3-NEXT:    movzbl (%rdx,%rcx), %edx
923; SSSE3-NEXT:    movd %edx, %xmm3
924; SSSE3-NEXT:    movzbl 11(%rdi), %edx
925; SSSE3-NEXT:    andl $15, %edx
926; SSSE3-NEXT:    movzbl (%rdx,%rcx), %edx
927; SSSE3-NEXT:    movd %edx, %xmm10
928; SSSE3-NEXT:    movzbl 10(%rdi), %edx
929; SSSE3-NEXT:    andl $15, %edx
930; SSSE3-NEXT:    movzbl (%rdx,%rcx), %edx
931; SSSE3-NEXT:    movd %edx, %xmm7
932; SSSE3-NEXT:    movzbl 9(%rdi), %edx
933; SSSE3-NEXT:    andl $15, %edx
934; SSSE3-NEXT:    movzbl (%rdx,%rcx), %edx
935; SSSE3-NEXT:    movd %edx, %xmm11
936; SSSE3-NEXT:    movzbl 8(%rdi), %edx
937; SSSE3-NEXT:    andl $15, %edx
938; SSSE3-NEXT:    movzbl (%rdx,%rcx), %edx
939; SSSE3-NEXT:    movd %edx, %xmm6
940; SSSE3-NEXT:    movzbl 7(%rdi), %edx
941; SSSE3-NEXT:    andl $15, %edx
942; SSSE3-NEXT:    movzbl (%rdx,%rcx), %edx
943; SSSE3-NEXT:    movd %edx, %xmm12
944; SSSE3-NEXT:    movzbl 6(%rdi), %edx
945; SSSE3-NEXT:    andl $15, %edx
946; SSSE3-NEXT:    movzbl (%rdx,%rcx), %edx
947; SSSE3-NEXT:    movd %edx, %xmm5
948; SSSE3-NEXT:    movzbl 5(%rdi), %edx
949; SSSE3-NEXT:    andl $15, %edx
950; SSSE3-NEXT:    movzbl (%rdx,%rcx), %edx
951; SSSE3-NEXT:    movd %edx, %xmm13
952; SSSE3-NEXT:    movzbl 4(%rdi), %edx
953; SSSE3-NEXT:    andl $15, %edx
954; SSSE3-NEXT:    movzbl (%rdx,%rcx), %edx
955; SSSE3-NEXT:    movd %edx, %xmm4
956; SSSE3-NEXT:    movzbl 3(%rdi), %edx
957; SSSE3-NEXT:    andl $15, %edx
958; SSSE3-NEXT:    movzbl (%rdx,%rcx), %edx
959; SSSE3-NEXT:    movd %edx, %xmm14
960; SSSE3-NEXT:    movzbl 2(%rdi), %edx
961; SSSE3-NEXT:    andl $15, %edx
962; SSSE3-NEXT:    movzbl (%rdx,%rcx), %edx
963; SSSE3-NEXT:    movd %edx, %xmm1
964; SSSE3-NEXT:    movzbl 1(%rdi), %edx
965; SSSE3-NEXT:    andl $15, %edx
966; SSSE3-NEXT:    movzbl (%rdx,%rcx), %edx
967; SSSE3-NEXT:    movd %edx, %xmm2
968; SSSE3-NEXT:    andl $15, %eax
969; SSSE3-NEXT:    movzbl (%rax,%rcx), %eax
970; SSSE3-NEXT:    movd %eax, %xmm0
971; 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]
972; 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]
973; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm15[0],xmm3[1],xmm15[1],xmm3[2],xmm15[2],xmm3[3],xmm15[3]
974; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm10[0],xmm7[1],xmm10[1],xmm7[2],xmm10[2],xmm7[3],xmm10[3],xmm7[4],xmm10[4],xmm7[5],xmm10[5],xmm7[6],xmm10[6],xmm7[7],xmm10[7]
975; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm11[0],xmm6[1],xmm11[1],xmm6[2],xmm11[2],xmm6[3],xmm11[3],xmm6[4],xmm11[4],xmm6[5],xmm11[5],xmm6[6],xmm11[6],xmm6[7],xmm11[7]
976; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm6 = xmm6[0],xmm7[0],xmm6[1],xmm7[1],xmm6[2],xmm7[2],xmm6[3],xmm7[3]
977; SSSE3-NEXT:    punpckldq {{.*#+}} xmm6 = xmm6[0],xmm3[0],xmm6[1],xmm3[1]
978; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm12[0],xmm5[1],xmm12[1],xmm5[2],xmm12[2],xmm5[3],xmm12[3],xmm5[4],xmm12[4],xmm5[5],xmm12[5],xmm5[6],xmm12[6],xmm5[7],xmm12[7]
979; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm13[0],xmm4[1],xmm13[1],xmm4[2],xmm13[2],xmm4[3],xmm13[3],xmm4[4],xmm13[4],xmm4[5],xmm13[5],xmm4[6],xmm13[6],xmm4[7],xmm13[7]
980; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1],xmm4[2],xmm5[2],xmm4[3],xmm5[3]
981; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm14[0],xmm1[1],xmm14[1],xmm1[2],xmm14[2],xmm1[3],xmm14[3],xmm1[4],xmm14[4],xmm1[5],xmm14[5],xmm1[6],xmm14[6],xmm1[7],xmm14[7]
982; SSSE3-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]
983; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
984; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
985; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm6[0]
986; SSSE3-NEXT:    retq
987;
988; SSE41-LABEL: mem_shuffle_v16i8_v16i8_xxxxxxxxxxxxxxxx_i8:
989; SSE41:       # BB#0:
990; SSE41-NEXT:    movzbl (%rdi), %eax
991; SSE41-NEXT:    andl $15, %eax
992; SSE41-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
993; SSE41-NEXT:    leaq -{{[0-9]+}}(%rsp), %rcx
994; SSE41-NEXT:    movzbl (%rax,%rcx), %eax
995; SSE41-NEXT:    movd %eax, %xmm0
996; SSE41-NEXT:    movzbl 1(%rdi), %eax
997; SSE41-NEXT:    andl $15, %eax
998; SSE41-NEXT:    pinsrb $1, (%rax,%rcx), %xmm0
999; SSE41-NEXT:    movzbl 2(%rdi), %eax
1000; SSE41-NEXT:    andl $15, %eax
1001; SSE41-NEXT:    pinsrb $2, (%rax,%rcx), %xmm0
1002; SSE41-NEXT:    movzbl 3(%rdi), %eax
1003; SSE41-NEXT:    andl $15, %eax
1004; SSE41-NEXT:    pinsrb $3, (%rax,%rcx), %xmm0
1005; SSE41-NEXT:    movzbl 4(%rdi), %eax
1006; SSE41-NEXT:    andl $15, %eax
1007; SSE41-NEXT:    pinsrb $4, (%rax,%rcx), %xmm0
1008; SSE41-NEXT:    movzbl 5(%rdi), %eax
1009; SSE41-NEXT:    andl $15, %eax
1010; SSE41-NEXT:    pinsrb $5, (%rax,%rcx), %xmm0
1011; SSE41-NEXT:    movzbl 6(%rdi), %eax
1012; SSE41-NEXT:    andl $15, %eax
1013; SSE41-NEXT:    pinsrb $6, (%rax,%rcx), %xmm0
1014; SSE41-NEXT:    movzbl 7(%rdi), %eax
1015; SSE41-NEXT:    andl $15, %eax
1016; SSE41-NEXT:    pinsrb $7, (%rax,%rcx), %xmm0
1017; SSE41-NEXT:    movzbl 8(%rdi), %eax
1018; SSE41-NEXT:    andl $15, %eax
1019; SSE41-NEXT:    pinsrb $8, (%rax,%rcx), %xmm0
1020; SSE41-NEXT:    movzbl 9(%rdi), %eax
1021; SSE41-NEXT:    andl $15, %eax
1022; SSE41-NEXT:    pinsrb $9, (%rax,%rcx), %xmm0
1023; SSE41-NEXT:    movzbl 10(%rdi), %eax
1024; SSE41-NEXT:    andl $15, %eax
1025; SSE41-NEXT:    pinsrb $10, (%rax,%rcx), %xmm0
1026; SSE41-NEXT:    movzbl 11(%rdi), %eax
1027; SSE41-NEXT:    andl $15, %eax
1028; SSE41-NEXT:    pinsrb $11, (%rax,%rcx), %xmm0
1029; SSE41-NEXT:    movzbl 12(%rdi), %eax
1030; SSE41-NEXT:    andl $15, %eax
1031; SSE41-NEXT:    pinsrb $12, (%rax,%rcx), %xmm0
1032; SSE41-NEXT:    movzbl 13(%rdi), %eax
1033; SSE41-NEXT:    andl $15, %eax
1034; SSE41-NEXT:    pinsrb $13, (%rax,%rcx), %xmm0
1035; SSE41-NEXT:    movzbl 14(%rdi), %eax
1036; SSE41-NEXT:    andl $15, %eax
1037; SSE41-NEXT:    pinsrb $14, (%rax,%rcx), %xmm0
1038; SSE41-NEXT:    movzbl 15(%rdi), %eax
1039; SSE41-NEXT:    andl $15, %eax
1040; SSE41-NEXT:    pinsrb $15, (%rax,%rcx), %xmm0
1041; SSE41-NEXT:    retq
1042;
1043; AVX-LABEL: mem_shuffle_v16i8_v16i8_xxxxxxxxxxxxxxxx_i8:
1044; AVX:       # BB#0:
1045; AVX-NEXT:    movzbl (%rdi), %eax
1046; AVX-NEXT:    andl $15, %eax
1047; AVX-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)
1048; AVX-NEXT:    leaq -{{[0-9]+}}(%rsp), %rcx
1049; AVX-NEXT:    movzbl (%rax,%rcx), %eax
1050; AVX-NEXT:    vmovd %eax, %xmm0
1051; AVX-NEXT:    movzbl 1(%rdi), %eax
1052; AVX-NEXT:    andl $15, %eax
1053; AVX-NEXT:    vpinsrb $1, (%rax,%rcx), %xmm0, %xmm0
1054; AVX-NEXT:    movzbl 2(%rdi), %eax
1055; AVX-NEXT:    andl $15, %eax
1056; AVX-NEXT:    vpinsrb $2, (%rax,%rcx), %xmm0, %xmm0
1057; AVX-NEXT:    movzbl 3(%rdi), %eax
1058; AVX-NEXT:    andl $15, %eax
1059; AVX-NEXT:    vpinsrb $3, (%rax,%rcx), %xmm0, %xmm0
1060; AVX-NEXT:    movzbl 4(%rdi), %eax
1061; AVX-NEXT:    andl $15, %eax
1062; AVX-NEXT:    vpinsrb $4, (%rax,%rcx), %xmm0, %xmm0
1063; AVX-NEXT:    movzbl 5(%rdi), %eax
1064; AVX-NEXT:    andl $15, %eax
1065; AVX-NEXT:    vpinsrb $5, (%rax,%rcx), %xmm0, %xmm0
1066; AVX-NEXT:    movzbl 6(%rdi), %eax
1067; AVX-NEXT:    andl $15, %eax
1068; AVX-NEXT:    vpinsrb $6, (%rax,%rcx), %xmm0, %xmm0
1069; AVX-NEXT:    movzbl 7(%rdi), %eax
1070; AVX-NEXT:    andl $15, %eax
1071; AVX-NEXT:    vpinsrb $7, (%rax,%rcx), %xmm0, %xmm0
1072; AVX-NEXT:    movzbl 8(%rdi), %eax
1073; AVX-NEXT:    andl $15, %eax
1074; AVX-NEXT:    vpinsrb $8, (%rax,%rcx), %xmm0, %xmm0
1075; AVX-NEXT:    movzbl 9(%rdi), %eax
1076; AVX-NEXT:    andl $15, %eax
1077; AVX-NEXT:    vpinsrb $9, (%rax,%rcx), %xmm0, %xmm0
1078; AVX-NEXT:    movzbl 10(%rdi), %eax
1079; AVX-NEXT:    andl $15, %eax
1080; AVX-NEXT:    vpinsrb $10, (%rax,%rcx), %xmm0, %xmm0
1081; AVX-NEXT:    movzbl 11(%rdi), %eax
1082; AVX-NEXT:    andl $15, %eax
1083; AVX-NEXT:    vpinsrb $11, (%rax,%rcx), %xmm0, %xmm0
1084; AVX-NEXT:    movzbl 12(%rdi), %eax
1085; AVX-NEXT:    andl $15, %eax
1086; AVX-NEXT:    vpinsrb $12, (%rax,%rcx), %xmm0, %xmm0
1087; AVX-NEXT:    movzbl 13(%rdi), %eax
1088; AVX-NEXT:    andl $15, %eax
1089; AVX-NEXT:    vpinsrb $13, (%rax,%rcx), %xmm0, %xmm0
1090; AVX-NEXT:    movzbl 14(%rdi), %eax
1091; AVX-NEXT:    andl $15, %eax
1092; AVX-NEXT:    vpinsrb $14, (%rax,%rcx), %xmm0, %xmm0
1093; AVX-NEXT:    movzbl 15(%rdi), %eax
1094; AVX-NEXT:    andl $15, %eax
1095; AVX-NEXT:    vpinsrb $15, (%rax,%rcx), %xmm0, %xmm0
1096; AVX-NEXT:    retq
1097  %p0  = getelementptr inbounds i8, i8* %i, i64 0
1098  %p1  = getelementptr inbounds i8, i8* %i, i64 1
1099  %p2  = getelementptr inbounds i8, i8* %i, i64 2
1100  %p3  = getelementptr inbounds i8, i8* %i, i64 3
1101  %p4  = getelementptr inbounds i8, i8* %i, i64 4
1102  %p5  = getelementptr inbounds i8, i8* %i, i64 5
1103  %p6  = getelementptr inbounds i8, i8* %i, i64 6
1104  %p7  = getelementptr inbounds i8, i8* %i, i64 7
1105  %p8  = getelementptr inbounds i8, i8* %i, i64 8
1106  %p9  = getelementptr inbounds i8, i8* %i, i64 9
1107  %p10 = getelementptr inbounds i8, i8* %i, i64 10
1108  %p11 = getelementptr inbounds i8, i8* %i, i64 11
1109  %p12 = getelementptr inbounds i8, i8* %i, i64 12
1110  %p13 = getelementptr inbounds i8, i8* %i, i64 13
1111  %p14 = getelementptr inbounds i8, i8* %i, i64 14
1112  %p15 = getelementptr inbounds i8, i8* %i, i64 15
1113  %i0  = load i8, i8* %p0 , align 4
1114  %i1  = load i8, i8* %p1 , align 4
1115  %i2  = load i8, i8* %p2 , align 4
1116  %i3  = load i8, i8* %p3 , align 4
1117  %i4  = load i8, i8* %p4 , align 4
1118  %i5  = load i8, i8* %p5 , align 4
1119  %i6  = load i8, i8* %p6 , align 4
1120  %i7  = load i8, i8* %p7 , align 4
1121  %i8  = load i8, i8* %p8 , align 4
1122  %i9  = load i8, i8* %p9 , align 4
1123  %i10 = load i8, i8* %p10, align 4
1124  %i11 = load i8, i8* %p11, align 4
1125  %i12 = load i8, i8* %p12, align 4
1126  %i13 = load i8, i8* %p13, align 4
1127  %i14 = load i8, i8* %p14, align 4
1128  %i15 = load i8, i8* %p15, align 4
1129  %x0  = extractelement <16 x i8> %x, i8 %i0
1130  %x1  = extractelement <16 x i8> %x, i8 %i1
1131  %x2  = extractelement <16 x i8> %x, i8 %i2
1132  %x3  = extractelement <16 x i8> %x, i8 %i3
1133  %x4  = extractelement <16 x i8> %x, i8 %i4
1134  %x5  = extractelement <16 x i8> %x, i8 %i5
1135  %x6  = extractelement <16 x i8> %x, i8 %i6
1136  %x7  = extractelement <16 x i8> %x, i8 %i7
1137  %x8  = extractelement <16 x i8> %x, i8 %i8
1138  %x9  = extractelement <16 x i8> %x, i8 %i9
1139  %x10 = extractelement <16 x i8> %x, i8 %i10
1140  %x11 = extractelement <16 x i8> %x, i8 %i11
1141  %x12 = extractelement <16 x i8> %x, i8 %i12
1142  %x13 = extractelement <16 x i8> %x, i8 %i13
1143  %x14 = extractelement <16 x i8> %x, i8 %i14
1144  %x15 = extractelement <16 x i8> %x, i8 %i15
1145  %r0  = insertelement <16 x i8> undef, i8 %x0 , i32 0
1146  %r1  = insertelement <16 x i8>  %r0 , i8 %x1 , i32 1
1147  %r2  = insertelement <16 x i8>  %r1 , i8 %x2 , i32 2
1148  %r3  = insertelement <16 x i8>  %r2 , i8 %x3 , i32 3
1149  %r4  = insertelement <16 x i8>  %r3 , i8 %x4 , i32 4
1150  %r5  = insertelement <16 x i8>  %r4 , i8 %x5 , i32 5
1151  %r6  = insertelement <16 x i8>  %r5 , i8 %x6 , i32 6
1152  %r7  = insertelement <16 x i8>  %r6 , i8 %x7 , i32 7
1153  %r8  = insertelement <16 x i8>  %r7 , i8 %x8 , i32 8
1154  %r9  = insertelement <16 x i8>  %r8 , i8 %x9 , i32 9
1155  %r10 = insertelement <16 x i8>  %r9 , i8 %x10, i32 10
1156  %r11 = insertelement <16 x i8>  %r10, i8 %x11, i32 11
1157  %r12 = insertelement <16 x i8>  %r11, i8 %x12, i32 12
1158  %r13 = insertelement <16 x i8>  %r12, i8 %x13, i32 13
1159  %r14 = insertelement <16 x i8>  %r13, i8 %x14, i32 14
1160  %r15 = insertelement <16 x i8>  %r14, i8 %x15, i32 15
1161  ret <16 x i8> %r15
1162}
1163
1164;
1165; Binary shuffle indices from registers
1166;
1167
1168define <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 {
1169; SSE-LABEL: var_shuffle_v4f32_v4f32_x0yx_i32:
1170; SSE:       # BB#0:
1171; SSE-NEXT:    # kill: %ECX<def> %ECX<kill> %RCX<def>
1172; SSE-NEXT:    # kill: %EDX<def> %EDX<kill> %RDX<def>
1173; SSE-NEXT:    # kill: %EDI<def> %EDI<kill> %RDI<def>
1174; SSE-NEXT:    andl $3, %edi
1175; SSE-NEXT:    movaps %xmm1, -{{[0-9]+}}(%rsp)
1176; SSE-NEXT:    andl $3, %edx
1177; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
1178; SSE-NEXT:    andl $3, %ecx
1179; SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1180; SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1181; SSE-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
1182; SSE-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1183; SSE-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1184; SSE-NEXT:    retq
1185;
1186; AVX-LABEL: var_shuffle_v4f32_v4f32_x0yx_i32:
1187; AVX:       # BB#0:
1188; AVX-NEXT:    # kill: %ECX<def> %ECX<kill> %RCX<def>
1189; AVX-NEXT:    # kill: %EDX<def> %EDX<kill> %RDX<def>
1190; AVX-NEXT:    # kill: %EDI<def> %EDI<kill> %RDI<def>
1191; AVX-NEXT:    andl $3, %edi
1192; AVX-NEXT:    vmovaps %xmm1, -{{[0-9]+}}(%rsp)
1193; AVX-NEXT:    andl $3, %edx
1194; AVX-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)
1195; AVX-NEXT:    andl $3, %ecx
1196; AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1197; AVX-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1198; AVX-NEXT:    vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero
1199; AVX-NEXT:    vunpcklps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1200; AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1201; AVX-NEXT:    retq
1202  %x0 = extractelement <4 x float> %x, i32 %i0
1203  %x1 = extractelement <4 x float> %x, i32 %i1
1204  %y2 = extractelement <4 x float> %y, i32 %i2
1205  %x3 = extractelement <4 x float> %x, i32 %i3
1206  %r0 = insertelement <4 x float> undef, float %x0, i32 0
1207  %r1 = insertelement <4 x float>   %r0, float 0.0, i32 1
1208  %r2 = insertelement <4 x float>   %r1, float %y2, i32 2
1209  %r3 = insertelement <4 x float>   %r2, float %x3, i32 3
1210  ret <4 x float> %r3
1211}
1212
1213define <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 {
1214; SSE2-LABEL: var_shuffle_v8i16_v8i16_xyxyxy00_i16:
1215; SSE2:       # BB#0:
1216; SSE2-NEXT:    # kill: %R9D<def> %R9D<kill> %R9<def>
1217; SSE2-NEXT:    # kill: %R8D<def> %R8D<kill> %R8<def>
1218; SSE2-NEXT:    # kill: %ECX<def> %ECX<kill> %RCX<def>
1219; SSE2-NEXT:    # kill: %EDX<def> %EDX<kill> %RDX<def>
1220; SSE2-NEXT:    # kill: %ESI<def> %ESI<kill> %RSI<def>
1221; SSE2-NEXT:    # kill: %EDI<def> %EDI<kill> %RDI<def>
1222; SSE2-NEXT:    andl $7, %edi
1223; SSE2-NEXT:    andl $7, %esi
1224; SSE2-NEXT:    andl $7, %edx
1225; SSE2-NEXT:    andl $7, %ecx
1226; SSE2-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
1227; SSE2-NEXT:    andl $7, %r8d
1228; SSE2-NEXT:    movaps %xmm1, -{{[0-9]+}}(%rsp)
1229; SSE2-NEXT:    andl $7, %r9d
1230; SSE2-NEXT:    movzwl -24(%rsp,%rcx,2), %eax
1231; SSE2-NEXT:    movd %eax, %xmm0
1232; SSE2-NEXT:    movzwl -40(%rsp,%rdx,2), %eax
1233; SSE2-NEXT:    movd %eax, %xmm1
1234; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1235; SSE2-NEXT:    movzwl -24(%rsp,%rsi,2), %eax
1236; SSE2-NEXT:    movd %eax, %xmm2
1237; SSE2-NEXT:    movzwl -40(%rsp,%rdi,2), %eax
1238; SSE2-NEXT:    movd %eax, %xmm0
1239; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1240; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1241; SSE2-NEXT:    movzwl -24(%rsp,%r9,2), %eax
1242; SSE2-NEXT:    movd %eax, %xmm1
1243; SSE2-NEXT:    movzwl -40(%rsp,%r8,2), %eax
1244; SSE2-NEXT:    movd %eax, %xmm2
1245; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
1246; SSE2-NEXT:    pxor %xmm1, %xmm1
1247; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
1248; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
1249; SSE2-NEXT:    retq
1250;
1251; SSSE3-LABEL: var_shuffle_v8i16_v8i16_xyxyxy00_i16:
1252; SSSE3:       # BB#0:
1253; SSSE3-NEXT:    # kill: %R9D<def> %R9D<kill> %R9<def>
1254; SSSE3-NEXT:    # kill: %R8D<def> %R8D<kill> %R8<def>
1255; SSSE3-NEXT:    # kill: %ECX<def> %ECX<kill> %RCX<def>
1256; SSSE3-NEXT:    # kill: %EDX<def> %EDX<kill> %RDX<def>
1257; SSSE3-NEXT:    # kill: %ESI<def> %ESI<kill> %RSI<def>
1258; SSSE3-NEXT:    # kill: %EDI<def> %EDI<kill> %RDI<def>
1259; SSSE3-NEXT:    andl $7, %edi
1260; SSSE3-NEXT:    andl $7, %esi
1261; SSSE3-NEXT:    andl $7, %edx
1262; SSSE3-NEXT:    andl $7, %ecx
1263; SSSE3-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
1264; SSSE3-NEXT:    andl $7, %r8d
1265; SSSE3-NEXT:    movaps %xmm1, -{{[0-9]+}}(%rsp)
1266; SSSE3-NEXT:    andl $7, %r9d
1267; SSSE3-NEXT:    movzwl -24(%rsp,%rcx,2), %eax
1268; SSSE3-NEXT:    movd %eax, %xmm0
1269; SSSE3-NEXT:    movzwl -40(%rsp,%rdx,2), %eax
1270; SSSE3-NEXT:    movd %eax, %xmm1
1271; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1272; SSSE3-NEXT:    movzwl -24(%rsp,%rsi,2), %eax
1273; SSSE3-NEXT:    movd %eax, %xmm2
1274; SSSE3-NEXT:    movzwl -40(%rsp,%rdi,2), %eax
1275; SSSE3-NEXT:    movd %eax, %xmm0
1276; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1277; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1278; SSSE3-NEXT:    movzwl -24(%rsp,%r9,2), %eax
1279; SSSE3-NEXT:    movd %eax, %xmm1
1280; SSSE3-NEXT:    movzwl -40(%rsp,%r8,2), %eax
1281; SSSE3-NEXT:    movd %eax, %xmm2
1282; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
1283; SSSE3-NEXT:    pxor %xmm1, %xmm1
1284; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
1285; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
1286; SSSE3-NEXT:    retq
1287;
1288; SSE41-LABEL: var_shuffle_v8i16_v8i16_xyxyxy00_i16:
1289; SSE41:       # BB#0:
1290; SSE41-NEXT:    # kill: %R9D<def> %R9D<kill> %R9<def>
1291; SSE41-NEXT:    # kill: %R8D<def> %R8D<kill> %R8<def>
1292; SSE41-NEXT:    # kill: %ECX<def> %ECX<kill> %RCX<def>
1293; SSE41-NEXT:    # kill: %EDX<def> %EDX<kill> %RDX<def>
1294; SSE41-NEXT:    # kill: %ESI<def> %ESI<kill> %RSI<def>
1295; SSE41-NEXT:    # kill: %EDI<def> %EDI<kill> %RDI<def>
1296; SSE41-NEXT:    andl $7, %edi
1297; SSE41-NEXT:    andl $7, %esi
1298; SSE41-NEXT:    andl $7, %edx
1299; SSE41-NEXT:    andl $7, %ecx
1300; SSE41-NEXT:    movdqa %xmm0, -{{[0-9]+}}(%rsp)
1301; SSE41-NEXT:    andl $7, %r8d
1302; SSE41-NEXT:    movaps %xmm1, -{{[0-9]+}}(%rsp)
1303; SSE41-NEXT:    andl $7, %r9d
1304; SSE41-NEXT:    pxor %xmm0, %xmm0
1305; SSE41-NEXT:    pinsrw $0, -40(%rsp,%rdi,2), %xmm0
1306; SSE41-NEXT:    pinsrw $1, -24(%rsp,%rsi,2), %xmm0
1307; SSE41-NEXT:    pinsrw $2, -40(%rsp,%rdx,2), %xmm0
1308; SSE41-NEXT:    pinsrw $3, -24(%rsp,%rcx,2), %xmm0
1309; SSE41-NEXT:    pinsrw $4, -40(%rsp,%r8,2), %xmm0
1310; SSE41-NEXT:    pinsrw $5, -24(%rsp,%r9,2), %xmm0
1311; SSE41-NEXT:    retq
1312;
1313; AVX-LABEL: var_shuffle_v8i16_v8i16_xyxyxy00_i16:
1314; AVX:       # BB#0:
1315; AVX-NEXT:    # kill: %R9D<def> %R9D<kill> %R9<def>
1316; AVX-NEXT:    # kill: %R8D<def> %R8D<kill> %R8<def>
1317; AVX-NEXT:    # kill: %ECX<def> %ECX<kill> %RCX<def>
1318; AVX-NEXT:    # kill: %EDX<def> %EDX<kill> %RDX<def>
1319; AVX-NEXT:    # kill: %ESI<def> %ESI<kill> %RSI<def>
1320; AVX-NEXT:    # kill: %EDI<def> %EDI<kill> %RDI<def>
1321; AVX-NEXT:    andl $7, %edi
1322; AVX-NEXT:    andl $7, %esi
1323; AVX-NEXT:    andl $7, %edx
1324; AVX-NEXT:    andl $7, %ecx
1325; AVX-NEXT:    vmovdqa %xmm0, -{{[0-9]+}}(%rsp)
1326; AVX-NEXT:    andl $7, %r8d
1327; AVX-NEXT:    vmovaps %xmm1, -{{[0-9]+}}(%rsp)
1328; AVX-NEXT:    andl $7, %r9d
1329; AVX-NEXT:    vpxor %xmm0, %xmm0, %xmm0
1330; AVX-NEXT:    vpinsrw $0, -40(%rsp,%rdi,2), %xmm0, %xmm0
1331; AVX-NEXT:    vpinsrw $1, -24(%rsp,%rsi,2), %xmm0, %xmm0
1332; AVX-NEXT:    vpinsrw $2, -40(%rsp,%rdx,2), %xmm0, %xmm0
1333; AVX-NEXT:    vpinsrw $3, -24(%rsp,%rcx,2), %xmm0, %xmm0
1334; AVX-NEXT:    vpinsrw $4, -40(%rsp,%r8,2), %xmm0, %xmm0
1335; AVX-NEXT:    vpinsrw $5, -24(%rsp,%r9,2), %xmm0, %xmm0
1336; AVX-NEXT:    retq
1337  %x0 = extractelement <8 x i16> %x, i16 %i0
1338  %y1 = extractelement <8 x i16> %y, i16 %i1
1339  %x2 = extractelement <8 x i16> %x, i16 %i2
1340  %y3 = extractelement <8 x i16> %y, i16 %i3
1341  %x4 = extractelement <8 x i16> %x, i16 %i4
1342  %y5 = extractelement <8 x i16> %y, i16 %i5
1343  %x6 = extractelement <8 x i16> %x, i16 %i6
1344  %x7 = extractelement <8 x i16> %x, i16 %i7
1345  %r0 = insertelement <8 x i16> undef, i16 %x0, i32 0
1346  %r1 = insertelement <8 x i16>   %r0, i16 %y1, i32 1
1347  %r2 = insertelement <8 x i16>   %r1, i16 %x2, i32 2
1348  %r3 = insertelement <8 x i16>   %r2, i16 %y3, i32 3
1349  %r4 = insertelement <8 x i16>   %r3, i16 %x4, i32 4
1350  %r5 = insertelement <8 x i16>   %r4, i16 %y5, i32 5
1351  %r6 = insertelement <8 x i16>   %r5, i16   0, i32 6
1352  %r7 = insertelement <8 x i16>   %r6, i16   0, i32 7
1353  ret <8 x i16> %r7
1354}
1355