1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512VL --check-prefix=AVX512BWVL
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512dq | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512DQ
9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512dq,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512VL --check-prefix=AVX512DQVL
10
11;
12; vXi64
13;
14
15define i64 @test_v2i64(<2 x i64> %a0) {
16; SSE-LABEL: test_v2i64:
17; SSE:       # %bb.0:
18; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
19; SSE-NEXT:    movdqa %xmm0, %xmm2
20; SSE-NEXT:    psrlq $32, %xmm2
21; SSE-NEXT:    pmuludq %xmm1, %xmm2
22; SSE-NEXT:    movdqa %xmm0, %xmm3
23; SSE-NEXT:    psrldq {{.*#+}} xmm3 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
24; SSE-NEXT:    pmuludq %xmm0, %xmm3
25; SSE-NEXT:    paddq %xmm2, %xmm3
26; SSE-NEXT:    psllq $32, %xmm3
27; SSE-NEXT:    pmuludq %xmm1, %xmm0
28; SSE-NEXT:    paddq %xmm3, %xmm0
29; SSE-NEXT:    movq %xmm0, %rax
30; SSE-NEXT:    retq
31;
32; AVX-LABEL: test_v2i64:
33; AVX:       # %bb.0:
34; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
35; AVX-NEXT:    vpsrlq $32, %xmm0, %xmm2
36; AVX-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
37; AVX-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
38; AVX-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
39; AVX-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
40; AVX-NEXT:    vpsllq $32, %xmm2, %xmm2
41; AVX-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
42; AVX-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
43; AVX-NEXT:    vmovq %xmm0, %rax
44; AVX-NEXT:    retq
45;
46; AVX512BW-LABEL: test_v2i64:
47; AVX512BW:       # %bb.0:
48; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
49; AVX512BW-NEXT:    vpsrlq $32, %xmm0, %xmm2
50; AVX512BW-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
51; AVX512BW-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
52; AVX512BW-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
53; AVX512BW-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
54; AVX512BW-NEXT:    vpsllq $32, %xmm2, %xmm2
55; AVX512BW-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
56; AVX512BW-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
57; AVX512BW-NEXT:    vmovq %xmm0, %rax
58; AVX512BW-NEXT:    retq
59;
60; AVX512BWVL-LABEL: test_v2i64:
61; AVX512BWVL:       # %bb.0:
62; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
63; AVX512BWVL-NEXT:    vpsrlq $32, %xmm0, %xmm2
64; AVX512BWVL-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
65; AVX512BWVL-NEXT:    vpsrlq $32, %xmm1, %xmm3
66; AVX512BWVL-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
67; AVX512BWVL-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
68; AVX512BWVL-NEXT:    vpsllq $32, %xmm2, %xmm2
69; AVX512BWVL-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
70; AVX512BWVL-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
71; AVX512BWVL-NEXT:    vmovq %xmm0, %rax
72; AVX512BWVL-NEXT:    retq
73;
74; AVX512DQ-LABEL: test_v2i64:
75; AVX512DQ:       # %bb.0:
76; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
77; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
78; AVX512DQ-NEXT:    vpmullq %zmm1, %zmm0, %zmm0
79; AVX512DQ-NEXT:    vmovq %xmm0, %rax
80; AVX512DQ-NEXT:    vzeroupper
81; AVX512DQ-NEXT:    retq
82;
83; AVX512DQVL-LABEL: test_v2i64:
84; AVX512DQVL:       # %bb.0:
85; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
86; AVX512DQVL-NEXT:    vpmullq %xmm1, %xmm0, %xmm0
87; AVX512DQVL-NEXT:    vmovq %xmm0, %rax
88; AVX512DQVL-NEXT:    retq
89  %1 = call i64 @llvm.experimental.vector.reduce.mul.i64.v2i64(<2 x i64> %a0)
90  ret i64 %1
91}
92
93define i64 @test_v4i64(<4 x i64> %a0) {
94; SSE-LABEL: test_v4i64:
95; SSE:       # %bb.0:
96; SSE-NEXT:    movdqa %xmm0, %xmm2
97; SSE-NEXT:    psrlq $32, %xmm2
98; SSE-NEXT:    pmuludq %xmm1, %xmm2
99; SSE-NEXT:    movdqa %xmm1, %xmm3
100; SSE-NEXT:    psrlq $32, %xmm3
101; SSE-NEXT:    pmuludq %xmm0, %xmm3
102; SSE-NEXT:    paddq %xmm2, %xmm3
103; SSE-NEXT:    psllq $32, %xmm3
104; SSE-NEXT:    pmuludq %xmm1, %xmm0
105; SSE-NEXT:    paddq %xmm3, %xmm0
106; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
107; SSE-NEXT:    movdqa %xmm0, %xmm2
108; SSE-NEXT:    psrlq $32, %xmm2
109; SSE-NEXT:    pmuludq %xmm1, %xmm2
110; SSE-NEXT:    movdqa %xmm0, %xmm3
111; SSE-NEXT:    psrldq {{.*#+}} xmm3 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
112; SSE-NEXT:    pmuludq %xmm0, %xmm3
113; SSE-NEXT:    paddq %xmm2, %xmm3
114; SSE-NEXT:    psllq $32, %xmm3
115; SSE-NEXT:    pmuludq %xmm1, %xmm0
116; SSE-NEXT:    paddq %xmm3, %xmm0
117; SSE-NEXT:    movq %xmm0, %rax
118; SSE-NEXT:    retq
119;
120; AVX1-LABEL: test_v4i64:
121; AVX1:       # %bb.0:
122; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
123; AVX1-NEXT:    vpsrlq $32, %xmm0, %xmm2
124; AVX1-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
125; AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm3
126; AVX1-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
127; AVX1-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
128; AVX1-NEXT:    vpsllq $32, %xmm2, %xmm2
129; AVX1-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
130; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
131; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
132; AVX1-NEXT:    vpsrlq $32, %xmm0, %xmm2
133; AVX1-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
134; AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm3
135; AVX1-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
136; AVX1-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
137; AVX1-NEXT:    vpsllq $32, %xmm2, %xmm2
138; AVX1-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
139; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
140; AVX1-NEXT:    vmovq %xmm0, %rax
141; AVX1-NEXT:    vzeroupper
142; AVX1-NEXT:    retq
143;
144; AVX2-LABEL: test_v4i64:
145; AVX2:       # %bb.0:
146; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
147; AVX2-NEXT:    vpsrlq $32, %ymm0, %ymm2
148; AVX2-NEXT:    vpmuludq %ymm1, %ymm2, %ymm2
149; AVX2-NEXT:    vpsrlq $32, %ymm1, %ymm3
150; AVX2-NEXT:    vpmuludq %ymm3, %ymm0, %ymm3
151; AVX2-NEXT:    vpaddq %ymm2, %ymm3, %ymm2
152; AVX2-NEXT:    vpsllq $32, %ymm2, %ymm2
153; AVX2-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
154; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
155; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
156; AVX2-NEXT:    vpsrldq {{.*#+}} ymm2 = ymm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,ymm0[28,29,30,31],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
157; AVX2-NEXT:    vpmuludq %ymm2, %ymm0, %ymm2
158; AVX2-NEXT:    vpsrlq $32, %ymm0, %ymm3
159; AVX2-NEXT:    vpmuludq %ymm1, %ymm3, %ymm3
160; AVX2-NEXT:    vpaddq %ymm3, %ymm2, %ymm2
161; AVX2-NEXT:    vpsllq $32, %ymm2, %ymm2
162; AVX2-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
163; AVX2-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
164; AVX2-NEXT:    vmovq %xmm0, %rax
165; AVX2-NEXT:    vzeroupper
166; AVX2-NEXT:    retq
167;
168; AVX512BW-LABEL: test_v4i64:
169; AVX512BW:       # %bb.0:
170; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
171; AVX512BW-NEXT:    vpsrlq $32, %ymm0, %ymm2
172; AVX512BW-NEXT:    vpmuludq %ymm1, %ymm2, %ymm2
173; AVX512BW-NEXT:    vpsrlq $32, %ymm1, %ymm3
174; AVX512BW-NEXT:    vpmuludq %ymm3, %ymm0, %ymm3
175; AVX512BW-NEXT:    vpaddq %ymm2, %ymm3, %ymm2
176; AVX512BW-NEXT:    vpsllq $32, %ymm2, %ymm2
177; AVX512BW-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
178; AVX512BW-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
179; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
180; AVX512BW-NEXT:    vpsrldq {{.*#+}} ymm2 = ymm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,ymm0[28,29,30,31],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
181; AVX512BW-NEXT:    vpmuludq %ymm2, %ymm0, %ymm2
182; AVX512BW-NEXT:    vpsrlq $32, %ymm0, %ymm3
183; AVX512BW-NEXT:    vpmuludq %ymm1, %ymm3, %ymm3
184; AVX512BW-NEXT:    vpaddq %ymm3, %ymm2, %ymm2
185; AVX512BW-NEXT:    vpsllq $32, %ymm2, %ymm2
186; AVX512BW-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
187; AVX512BW-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
188; AVX512BW-NEXT:    vmovq %xmm0, %rax
189; AVX512BW-NEXT:    vzeroupper
190; AVX512BW-NEXT:    retq
191;
192; AVX512BWVL-LABEL: test_v4i64:
193; AVX512BWVL:       # %bb.0:
194; AVX512BWVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
195; AVX512BWVL-NEXT:    vpsrlq $32, %ymm0, %ymm2
196; AVX512BWVL-NEXT:    vpmuludq %ymm1, %ymm2, %ymm2
197; AVX512BWVL-NEXT:    vpsrlq $32, %ymm1, %ymm3
198; AVX512BWVL-NEXT:    vpmuludq %ymm3, %ymm0, %ymm3
199; AVX512BWVL-NEXT:    vpaddq %ymm2, %ymm3, %ymm2
200; AVX512BWVL-NEXT:    vpsllq $32, %ymm2, %ymm2
201; AVX512BWVL-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
202; AVX512BWVL-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
203; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
204; AVX512BWVL-NEXT:    vpsrlq $32, %ymm0, %ymm2
205; AVX512BWVL-NEXT:    vpmuludq %ymm1, %ymm2, %ymm2
206; AVX512BWVL-NEXT:    vpsrlq $32, %ymm1, %ymm3
207; AVX512BWVL-NEXT:    vpmuludq %ymm3, %ymm0, %ymm3
208; AVX512BWVL-NEXT:    vpaddq %ymm2, %ymm3, %ymm2
209; AVX512BWVL-NEXT:    vpsllq $32, %ymm2, %ymm2
210; AVX512BWVL-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
211; AVX512BWVL-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
212; AVX512BWVL-NEXT:    vmovq %xmm0, %rax
213; AVX512BWVL-NEXT:    vzeroupper
214; AVX512BWVL-NEXT:    retq
215;
216; AVX512DQ-LABEL: test_v4i64:
217; AVX512DQ:       # %bb.0:
218; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
219; AVX512DQ-NEXT:    vextracti128 $1, %ymm0, %xmm1
220; AVX512DQ-NEXT:    vpmullq %zmm1, %zmm0, %zmm0
221; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
222; AVX512DQ-NEXT:    vpmullq %zmm1, %zmm0, %zmm0
223; AVX512DQ-NEXT:    vmovq %xmm0, %rax
224; AVX512DQ-NEXT:    vzeroupper
225; AVX512DQ-NEXT:    retq
226;
227; AVX512DQVL-LABEL: test_v4i64:
228; AVX512DQVL:       # %bb.0:
229; AVX512DQVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
230; AVX512DQVL-NEXT:    vpmullq %ymm1, %ymm0, %ymm0
231; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
232; AVX512DQVL-NEXT:    vpmullq %xmm1, %xmm0, %xmm0
233; AVX512DQVL-NEXT:    vmovq %xmm0, %rax
234; AVX512DQVL-NEXT:    vzeroupper
235; AVX512DQVL-NEXT:    retq
236  %1 = call i64 @llvm.experimental.vector.reduce.mul.i64.v4i64(<4 x i64> %a0)
237  ret i64 %1
238}
239
240define i64 @test_v8i64(<8 x i64> %a0) {
241; SSE-LABEL: test_v8i64:
242; SSE:       # %bb.0:
243; SSE-NEXT:    movdqa %xmm1, %xmm4
244; SSE-NEXT:    psrlq $32, %xmm4
245; SSE-NEXT:    pmuludq %xmm3, %xmm4
246; SSE-NEXT:    movdqa %xmm3, %xmm5
247; SSE-NEXT:    psrlq $32, %xmm5
248; SSE-NEXT:    pmuludq %xmm1, %xmm5
249; SSE-NEXT:    paddq %xmm4, %xmm5
250; SSE-NEXT:    psllq $32, %xmm5
251; SSE-NEXT:    pmuludq %xmm3, %xmm1
252; SSE-NEXT:    paddq %xmm5, %xmm1
253; SSE-NEXT:    movdqa %xmm0, %xmm3
254; SSE-NEXT:    psrlq $32, %xmm3
255; SSE-NEXT:    pmuludq %xmm2, %xmm3
256; SSE-NEXT:    movdqa %xmm2, %xmm4
257; SSE-NEXT:    psrlq $32, %xmm4
258; SSE-NEXT:    pmuludq %xmm0, %xmm4
259; SSE-NEXT:    paddq %xmm3, %xmm4
260; SSE-NEXT:    psllq $32, %xmm4
261; SSE-NEXT:    pmuludq %xmm2, %xmm0
262; SSE-NEXT:    paddq %xmm4, %xmm0
263; SSE-NEXT:    movdqa %xmm0, %xmm2
264; SSE-NEXT:    psrlq $32, %xmm2
265; SSE-NEXT:    pmuludq %xmm1, %xmm2
266; SSE-NEXT:    movdqa %xmm1, %xmm3
267; SSE-NEXT:    psrlq $32, %xmm3
268; SSE-NEXT:    pmuludq %xmm0, %xmm3
269; SSE-NEXT:    paddq %xmm2, %xmm3
270; SSE-NEXT:    psllq $32, %xmm3
271; SSE-NEXT:    pmuludq %xmm1, %xmm0
272; SSE-NEXT:    paddq %xmm3, %xmm0
273; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
274; SSE-NEXT:    movdqa %xmm0, %xmm2
275; SSE-NEXT:    psrlq $32, %xmm2
276; SSE-NEXT:    pmuludq %xmm1, %xmm2
277; SSE-NEXT:    movdqa %xmm0, %xmm3
278; SSE-NEXT:    psrldq {{.*#+}} xmm3 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
279; SSE-NEXT:    pmuludq %xmm0, %xmm3
280; SSE-NEXT:    paddq %xmm2, %xmm3
281; SSE-NEXT:    psllq $32, %xmm3
282; SSE-NEXT:    pmuludq %xmm1, %xmm0
283; SSE-NEXT:    paddq %xmm3, %xmm0
284; SSE-NEXT:    movq %xmm0, %rax
285; SSE-NEXT:    retq
286;
287; AVX1-LABEL: test_v8i64:
288; AVX1:       # %bb.0:
289; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
290; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
291; AVX1-NEXT:    vpsrlq $32, %xmm3, %xmm4
292; AVX1-NEXT:    vpmuludq %xmm2, %xmm4, %xmm4
293; AVX1-NEXT:    vpsrlq $32, %xmm2, %xmm5
294; AVX1-NEXT:    vpmuludq %xmm5, %xmm3, %xmm5
295; AVX1-NEXT:    vpaddq %xmm4, %xmm5, %xmm4
296; AVX1-NEXT:    vpsllq $32, %xmm4, %xmm4
297; AVX1-NEXT:    vpmuludq %xmm2, %xmm3, %xmm2
298; AVX1-NEXT:    vpaddq %xmm4, %xmm2, %xmm2
299; AVX1-NEXT:    vpsrlq $32, %xmm0, %xmm3
300; AVX1-NEXT:    vpmuludq %xmm1, %xmm3, %xmm3
301; AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm4
302; AVX1-NEXT:    vpmuludq %xmm4, %xmm0, %xmm4
303; AVX1-NEXT:    vpaddq %xmm3, %xmm4, %xmm3
304; AVX1-NEXT:    vpsllq $32, %xmm3, %xmm3
305; AVX1-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
306; AVX1-NEXT:    vpaddq %xmm3, %xmm0, %xmm0
307; AVX1-NEXT:    vpsrlq $32, %xmm0, %xmm1
308; AVX1-NEXT:    vpmuludq %xmm2, %xmm1, %xmm1
309; AVX1-NEXT:    vpsrlq $32, %xmm2, %xmm3
310; AVX1-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
311; AVX1-NEXT:    vpaddq %xmm1, %xmm3, %xmm1
312; AVX1-NEXT:    vpsllq $32, %xmm1, %xmm1
313; AVX1-NEXT:    vpmuludq %xmm2, %xmm0, %xmm0
314; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
315; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
316; AVX1-NEXT:    vpsrlq $32, %xmm0, %xmm2
317; AVX1-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
318; AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm3
319; AVX1-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
320; AVX1-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
321; AVX1-NEXT:    vpsllq $32, %xmm2, %xmm2
322; AVX1-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
323; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
324; AVX1-NEXT:    vmovq %xmm0, %rax
325; AVX1-NEXT:    vzeroupper
326; AVX1-NEXT:    retq
327;
328; AVX2-LABEL: test_v8i64:
329; AVX2:       # %bb.0:
330; AVX2-NEXT:    vpsrlq $32, %ymm0, %ymm2
331; AVX2-NEXT:    vpmuludq %ymm1, %ymm2, %ymm2
332; AVX2-NEXT:    vpsrlq $32, %ymm1, %ymm3
333; AVX2-NEXT:    vpmuludq %ymm3, %ymm0, %ymm3
334; AVX2-NEXT:    vpaddq %ymm2, %ymm3, %ymm2
335; AVX2-NEXT:    vpsllq $32, %ymm2, %ymm2
336; AVX2-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
337; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
338; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
339; AVX2-NEXT:    vpsrlq $32, %ymm0, %ymm2
340; AVX2-NEXT:    vpmuludq %ymm1, %ymm2, %ymm2
341; AVX2-NEXT:    vpsrlq $32, %ymm1, %ymm3
342; AVX2-NEXT:    vpmuludq %ymm3, %ymm0, %ymm3
343; AVX2-NEXT:    vpaddq %ymm2, %ymm3, %ymm2
344; AVX2-NEXT:    vpsllq $32, %ymm2, %ymm2
345; AVX2-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
346; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
347; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
348; AVX2-NEXT:    vpsrldq {{.*#+}} ymm2 = ymm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,ymm0[28,29,30,31],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
349; AVX2-NEXT:    vpmuludq %ymm2, %ymm0, %ymm2
350; AVX2-NEXT:    vpsrlq $32, %ymm0, %ymm3
351; AVX2-NEXT:    vpmuludq %ymm1, %ymm3, %ymm3
352; AVX2-NEXT:    vpaddq %ymm3, %ymm2, %ymm2
353; AVX2-NEXT:    vpsllq $32, %ymm2, %ymm2
354; AVX2-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
355; AVX2-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
356; AVX2-NEXT:    vmovq %xmm0, %rax
357; AVX2-NEXT:    vzeroupper
358; AVX2-NEXT:    retq
359;
360; AVX512BW-LABEL: test_v8i64:
361; AVX512BW:       # %bb.0:
362; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
363; AVX512BW-NEXT:    vpsrlq $32, %zmm0, %zmm2
364; AVX512BW-NEXT:    vpmuludq %zmm1, %zmm2, %zmm2
365; AVX512BW-NEXT:    vpsrlq $32, %zmm1, %zmm3
366; AVX512BW-NEXT:    vpmuludq %zmm3, %zmm0, %zmm3
367; AVX512BW-NEXT:    vpaddq %zmm2, %zmm3, %zmm2
368; AVX512BW-NEXT:    vpsllq $32, %zmm2, %zmm2
369; AVX512BW-NEXT:    vpmuludq %zmm1, %zmm0, %zmm0
370; AVX512BW-NEXT:    vpaddq %zmm2, %zmm0, %zmm0
371; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
372; AVX512BW-NEXT:    vpsrlq $32, %zmm0, %zmm2
373; AVX512BW-NEXT:    vpmuludq %zmm1, %zmm2, %zmm2
374; AVX512BW-NEXT:    vpsrlq $32, %zmm1, %zmm3
375; AVX512BW-NEXT:    vpmuludq %zmm3, %zmm0, %zmm3
376; AVX512BW-NEXT:    vpaddq %zmm2, %zmm3, %zmm2
377; AVX512BW-NEXT:    vpsllq $32, %zmm2, %zmm2
378; AVX512BW-NEXT:    vpmuludq %zmm1, %zmm0, %zmm0
379; AVX512BW-NEXT:    vpaddq %zmm2, %zmm0, %zmm0
380; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
381; AVX512BW-NEXT:    vpsrlq $32, %zmm0, %zmm2
382; AVX512BW-NEXT:    vpmuludq %zmm1, %zmm2, %zmm2
383; AVX512BW-NEXT:    vpsrlq $32, %zmm1, %zmm3
384; AVX512BW-NEXT:    vpmuludq %zmm3, %zmm0, %zmm3
385; AVX512BW-NEXT:    vpaddq %zmm2, %zmm3, %zmm2
386; AVX512BW-NEXT:    vpsllq $32, %zmm2, %zmm2
387; AVX512BW-NEXT:    vpmuludq %zmm1, %zmm0, %zmm0
388; AVX512BW-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
389; AVX512BW-NEXT:    vmovq %xmm0, %rax
390; AVX512BW-NEXT:    vzeroupper
391; AVX512BW-NEXT:    retq
392;
393; AVX512BWVL-LABEL: test_v8i64:
394; AVX512BWVL:       # %bb.0:
395; AVX512BWVL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
396; AVX512BWVL-NEXT:    vpsrlq $32, %zmm0, %zmm2
397; AVX512BWVL-NEXT:    vpmuludq %zmm1, %zmm2, %zmm2
398; AVX512BWVL-NEXT:    vpsrlq $32, %zmm1, %zmm3
399; AVX512BWVL-NEXT:    vpmuludq %zmm3, %zmm0, %zmm3
400; AVX512BWVL-NEXT:    vpaddq %zmm2, %zmm3, %zmm2
401; AVX512BWVL-NEXT:    vpsllq $32, %zmm2, %zmm2
402; AVX512BWVL-NEXT:    vpmuludq %zmm1, %zmm0, %zmm0
403; AVX512BWVL-NEXT:    vpaddq %zmm2, %zmm0, %zmm0
404; AVX512BWVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
405; AVX512BWVL-NEXT:    vpsrlq $32, %zmm0, %zmm2
406; AVX512BWVL-NEXT:    vpmuludq %zmm1, %zmm2, %zmm2
407; AVX512BWVL-NEXT:    vpsrlq $32, %zmm1, %zmm3
408; AVX512BWVL-NEXT:    vpmuludq %zmm3, %zmm0, %zmm3
409; AVX512BWVL-NEXT:    vpaddq %zmm2, %zmm3, %zmm2
410; AVX512BWVL-NEXT:    vpsllq $32, %zmm2, %zmm2
411; AVX512BWVL-NEXT:    vpmuludq %zmm1, %zmm0, %zmm0
412; AVX512BWVL-NEXT:    vpaddq %zmm2, %zmm0, %zmm0
413; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
414; AVX512BWVL-NEXT:    vpsrlq $32, %zmm0, %zmm2
415; AVX512BWVL-NEXT:    vpmuludq %zmm1, %zmm2, %zmm2
416; AVX512BWVL-NEXT:    vpsrlq $32, %zmm1, %zmm3
417; AVX512BWVL-NEXT:    vpmuludq %zmm3, %zmm0, %zmm3
418; AVX512BWVL-NEXT:    vpaddq %zmm2, %zmm3, %zmm2
419; AVX512BWVL-NEXT:    vpsllq $32, %zmm2, %zmm2
420; AVX512BWVL-NEXT:    vpmuludq %zmm1, %zmm0, %zmm0
421; AVX512BWVL-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
422; AVX512BWVL-NEXT:    vmovq %xmm0, %rax
423; AVX512BWVL-NEXT:    vzeroupper
424; AVX512BWVL-NEXT:    retq
425;
426; AVX512DQ-LABEL: test_v8i64:
427; AVX512DQ:       # %bb.0:
428; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
429; AVX512DQ-NEXT:    vpmullq %zmm1, %zmm0, %zmm0
430; AVX512DQ-NEXT:    vextracti128 $1, %ymm0, %xmm1
431; AVX512DQ-NEXT:    vpmullq %zmm1, %zmm0, %zmm0
432; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
433; AVX512DQ-NEXT:    vpmullq %zmm1, %zmm0, %zmm0
434; AVX512DQ-NEXT:    vmovq %xmm0, %rax
435; AVX512DQ-NEXT:    vzeroupper
436; AVX512DQ-NEXT:    retq
437;
438; AVX512DQVL-LABEL: test_v8i64:
439; AVX512DQVL:       # %bb.0:
440; AVX512DQVL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
441; AVX512DQVL-NEXT:    vpmullq %zmm1, %zmm0, %zmm0
442; AVX512DQVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
443; AVX512DQVL-NEXT:    vpmullq %zmm1, %zmm0, %zmm0
444; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
445; AVX512DQVL-NEXT:    vpmullq %xmm1, %xmm0, %xmm0
446; AVX512DQVL-NEXT:    vmovq %xmm0, %rax
447; AVX512DQVL-NEXT:    vzeroupper
448; AVX512DQVL-NEXT:    retq
449  %1 = call i64 @llvm.experimental.vector.reduce.mul.i64.v8i64(<8 x i64> %a0)
450  ret i64 %1
451}
452
453define i64 @test_v16i64(<16 x i64> %a0) {
454; SSE-LABEL: test_v16i64:
455; SSE:       # %bb.0:
456; SSE-NEXT:    movdqa %xmm2, %xmm8
457; SSE-NEXT:    psrlq $32, %xmm8
458; SSE-NEXT:    pmuludq %xmm6, %xmm8
459; SSE-NEXT:    movdqa %xmm6, %xmm9
460; SSE-NEXT:    psrlq $32, %xmm9
461; SSE-NEXT:    pmuludq %xmm2, %xmm9
462; SSE-NEXT:    paddq %xmm8, %xmm9
463; SSE-NEXT:    psllq $32, %xmm9
464; SSE-NEXT:    pmuludq %xmm6, %xmm2
465; SSE-NEXT:    paddq %xmm9, %xmm2
466; SSE-NEXT:    movdqa %xmm0, %xmm8
467; SSE-NEXT:    psrlq $32, %xmm8
468; SSE-NEXT:    pmuludq %xmm4, %xmm8
469; SSE-NEXT:    movdqa %xmm4, %xmm6
470; SSE-NEXT:    psrlq $32, %xmm6
471; SSE-NEXT:    pmuludq %xmm0, %xmm6
472; SSE-NEXT:    paddq %xmm8, %xmm6
473; SSE-NEXT:    psllq $32, %xmm6
474; SSE-NEXT:    pmuludq %xmm4, %xmm0
475; SSE-NEXT:    paddq %xmm6, %xmm0
476; SSE-NEXT:    movdqa %xmm3, %xmm4
477; SSE-NEXT:    psrlq $32, %xmm4
478; SSE-NEXT:    pmuludq %xmm7, %xmm4
479; SSE-NEXT:    movdqa %xmm7, %xmm6
480; SSE-NEXT:    psrlq $32, %xmm6
481; SSE-NEXT:    pmuludq %xmm3, %xmm6
482; SSE-NEXT:    paddq %xmm4, %xmm6
483; SSE-NEXT:    psllq $32, %xmm6
484; SSE-NEXT:    pmuludq %xmm7, %xmm3
485; SSE-NEXT:    paddq %xmm6, %xmm3
486; SSE-NEXT:    movdqa %xmm1, %xmm4
487; SSE-NEXT:    psrlq $32, %xmm4
488; SSE-NEXT:    pmuludq %xmm5, %xmm4
489; SSE-NEXT:    movdqa %xmm5, %xmm6
490; SSE-NEXT:    psrlq $32, %xmm6
491; SSE-NEXT:    pmuludq %xmm1, %xmm6
492; SSE-NEXT:    paddq %xmm4, %xmm6
493; SSE-NEXT:    psllq $32, %xmm6
494; SSE-NEXT:    pmuludq %xmm5, %xmm1
495; SSE-NEXT:    paddq %xmm6, %xmm1
496; SSE-NEXT:    movdqa %xmm1, %xmm4
497; SSE-NEXT:    psrlq $32, %xmm4
498; SSE-NEXT:    pmuludq %xmm3, %xmm4
499; SSE-NEXT:    movdqa %xmm3, %xmm5
500; SSE-NEXT:    psrlq $32, %xmm5
501; SSE-NEXT:    pmuludq %xmm1, %xmm5
502; SSE-NEXT:    paddq %xmm4, %xmm5
503; SSE-NEXT:    psllq $32, %xmm5
504; SSE-NEXT:    pmuludq %xmm3, %xmm1
505; SSE-NEXT:    paddq %xmm5, %xmm1
506; SSE-NEXT:    movdqa %xmm0, %xmm3
507; SSE-NEXT:    psrlq $32, %xmm3
508; SSE-NEXT:    pmuludq %xmm2, %xmm3
509; SSE-NEXT:    movdqa %xmm2, %xmm4
510; SSE-NEXT:    psrlq $32, %xmm4
511; SSE-NEXT:    pmuludq %xmm0, %xmm4
512; SSE-NEXT:    paddq %xmm3, %xmm4
513; SSE-NEXT:    psllq $32, %xmm4
514; SSE-NEXT:    pmuludq %xmm2, %xmm0
515; SSE-NEXT:    paddq %xmm4, %xmm0
516; SSE-NEXT:    movdqa %xmm0, %xmm2
517; SSE-NEXT:    psrlq $32, %xmm2
518; SSE-NEXT:    pmuludq %xmm1, %xmm2
519; SSE-NEXT:    movdqa %xmm1, %xmm3
520; SSE-NEXT:    psrlq $32, %xmm3
521; SSE-NEXT:    pmuludq %xmm0, %xmm3
522; SSE-NEXT:    paddq %xmm2, %xmm3
523; SSE-NEXT:    psllq $32, %xmm3
524; SSE-NEXT:    pmuludq %xmm1, %xmm0
525; SSE-NEXT:    paddq %xmm3, %xmm0
526; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
527; SSE-NEXT:    movdqa %xmm0, %xmm2
528; SSE-NEXT:    psrlq $32, %xmm2
529; SSE-NEXT:    pmuludq %xmm1, %xmm2
530; SSE-NEXT:    movdqa %xmm0, %xmm3
531; SSE-NEXT:    psrldq {{.*#+}} xmm3 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
532; SSE-NEXT:    pmuludq %xmm0, %xmm3
533; SSE-NEXT:    paddq %xmm2, %xmm3
534; SSE-NEXT:    psllq $32, %xmm3
535; SSE-NEXT:    pmuludq %xmm1, %xmm0
536; SSE-NEXT:    paddq %xmm3, %xmm0
537; SSE-NEXT:    movq %xmm0, %rax
538; SSE-NEXT:    retq
539;
540; AVX1-LABEL: test_v16i64:
541; AVX1:       # %bb.0:
542; AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm4
543; AVX1-NEXT:    vpmuludq %xmm3, %xmm4, %xmm4
544; AVX1-NEXT:    vpsrlq $32, %xmm3, %xmm5
545; AVX1-NEXT:    vpmuludq %xmm5, %xmm1, %xmm5
546; AVX1-NEXT:    vpaddq %xmm4, %xmm5, %xmm4
547; AVX1-NEXT:    vpsllq $32, %xmm4, %xmm4
548; AVX1-NEXT:    vpmuludq %xmm3, %xmm1, %xmm5
549; AVX1-NEXT:    vpaddq %xmm4, %xmm5, %xmm4
550; AVX1-NEXT:    vpsrlq $32, %xmm0, %xmm5
551; AVX1-NEXT:    vpmuludq %xmm2, %xmm5, %xmm5
552; AVX1-NEXT:    vpsrlq $32, %xmm2, %xmm6
553; AVX1-NEXT:    vpmuludq %xmm6, %xmm0, %xmm6
554; AVX1-NEXT:    vpaddq %xmm5, %xmm6, %xmm5
555; AVX1-NEXT:    vpsllq $32, %xmm5, %xmm5
556; AVX1-NEXT:    vpmuludq %xmm2, %xmm0, %xmm6
557; AVX1-NEXT:    vpaddq %xmm5, %xmm6, %xmm5
558; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
559; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
560; AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm6
561; AVX1-NEXT:    vpmuludq %xmm3, %xmm6, %xmm6
562; AVX1-NEXT:    vpsrlq $32, %xmm3, %xmm7
563; AVX1-NEXT:    vpmuludq %xmm7, %xmm1, %xmm7
564; AVX1-NEXT:    vpaddq %xmm6, %xmm7, %xmm6
565; AVX1-NEXT:    vpsllq $32, %xmm6, %xmm6
566; AVX1-NEXT:    vpmuludq %xmm3, %xmm1, %xmm1
567; AVX1-NEXT:    vpaddq %xmm6, %xmm1, %xmm1
568; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2
569; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
570; AVX1-NEXT:    vpsrlq $32, %xmm0, %xmm3
571; AVX1-NEXT:    vpmuludq %xmm2, %xmm3, %xmm3
572; AVX1-NEXT:    vpsrlq $32, %xmm2, %xmm6
573; AVX1-NEXT:    vpmuludq %xmm6, %xmm0, %xmm6
574; AVX1-NEXT:    vpaddq %xmm3, %xmm6, %xmm3
575; AVX1-NEXT:    vpsllq $32, %xmm3, %xmm3
576; AVX1-NEXT:    vpmuludq %xmm2, %xmm0, %xmm0
577; AVX1-NEXT:    vpaddq %xmm3, %xmm0, %xmm0
578; AVX1-NEXT:    vpsrlq $32, %xmm0, %xmm2
579; AVX1-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
580; AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm3
581; AVX1-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
582; AVX1-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
583; AVX1-NEXT:    vpsllq $32, %xmm2, %xmm2
584; AVX1-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
585; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
586; AVX1-NEXT:    vpsrlq $32, %xmm5, %xmm1
587; AVX1-NEXT:    vpmuludq %xmm4, %xmm1, %xmm1
588; AVX1-NEXT:    vpsrlq $32, %xmm4, %xmm2
589; AVX1-NEXT:    vpmuludq %xmm2, %xmm5, %xmm2
590; AVX1-NEXT:    vpaddq %xmm1, %xmm2, %xmm1
591; AVX1-NEXT:    vpsllq $32, %xmm1, %xmm1
592; AVX1-NEXT:    vpmuludq %xmm4, %xmm5, %xmm2
593; AVX1-NEXT:    vpaddq %xmm1, %xmm2, %xmm1
594; AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm2
595; AVX1-NEXT:    vpmuludq %xmm0, %xmm2, %xmm2
596; AVX1-NEXT:    vpsrlq $32, %xmm0, %xmm3
597; AVX1-NEXT:    vpmuludq %xmm3, %xmm1, %xmm3
598; AVX1-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
599; AVX1-NEXT:    vpsllq $32, %xmm2, %xmm2
600; AVX1-NEXT:    vpmuludq %xmm0, %xmm1, %xmm0
601; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
602; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
603; AVX1-NEXT:    vpsrlq $32, %xmm0, %xmm2
604; AVX1-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
605; AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm3
606; AVX1-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
607; AVX1-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
608; AVX1-NEXT:    vpsllq $32, %xmm2, %xmm2
609; AVX1-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
610; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
611; AVX1-NEXT:    vmovq %xmm0, %rax
612; AVX1-NEXT:    vzeroupper
613; AVX1-NEXT:    retq
614;
615; AVX2-LABEL: test_v16i64:
616; AVX2:       # %bb.0:
617; AVX2-NEXT:    vpsrlq $32, %ymm1, %ymm4
618; AVX2-NEXT:    vpmuludq %ymm3, %ymm4, %ymm4
619; AVX2-NEXT:    vpsrlq $32, %ymm3, %ymm5
620; AVX2-NEXT:    vpmuludq %ymm5, %ymm1, %ymm5
621; AVX2-NEXT:    vpaddq %ymm4, %ymm5, %ymm4
622; AVX2-NEXT:    vpsllq $32, %ymm4, %ymm4
623; AVX2-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
624; AVX2-NEXT:    vpaddq %ymm4, %ymm1, %ymm1
625; AVX2-NEXT:    vpsrlq $32, %ymm0, %ymm3
626; AVX2-NEXT:    vpmuludq %ymm2, %ymm3, %ymm3
627; AVX2-NEXT:    vpsrlq $32, %ymm2, %ymm4
628; AVX2-NEXT:    vpmuludq %ymm4, %ymm0, %ymm4
629; AVX2-NEXT:    vpaddq %ymm3, %ymm4, %ymm3
630; AVX2-NEXT:    vpsllq $32, %ymm3, %ymm3
631; AVX2-NEXT:    vpmuludq %ymm2, %ymm0, %ymm0
632; AVX2-NEXT:    vpaddq %ymm3, %ymm0, %ymm0
633; AVX2-NEXT:    vpsrlq $32, %ymm0, %ymm2
634; AVX2-NEXT:    vpmuludq %ymm1, %ymm2, %ymm2
635; AVX2-NEXT:    vpsrlq $32, %ymm1, %ymm3
636; AVX2-NEXT:    vpmuludq %ymm3, %ymm0, %ymm3
637; AVX2-NEXT:    vpaddq %ymm2, %ymm3, %ymm2
638; AVX2-NEXT:    vpsllq $32, %ymm2, %ymm2
639; AVX2-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
640; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
641; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
642; AVX2-NEXT:    vpsrlq $32, %ymm0, %ymm2
643; AVX2-NEXT:    vpmuludq %ymm1, %ymm2, %ymm2
644; AVX2-NEXT:    vpsrlq $32, %ymm1, %ymm3
645; AVX2-NEXT:    vpmuludq %ymm3, %ymm0, %ymm3
646; AVX2-NEXT:    vpaddq %ymm2, %ymm3, %ymm2
647; AVX2-NEXT:    vpsllq $32, %ymm2, %ymm2
648; AVX2-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
649; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
650; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
651; AVX2-NEXT:    vpsrldq {{.*#+}} ymm2 = ymm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,ymm0[28,29,30,31],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
652; AVX2-NEXT:    vpmuludq %ymm2, %ymm0, %ymm2
653; AVX2-NEXT:    vpsrlq $32, %ymm0, %ymm3
654; AVX2-NEXT:    vpmuludq %ymm1, %ymm3, %ymm3
655; AVX2-NEXT:    vpaddq %ymm3, %ymm2, %ymm2
656; AVX2-NEXT:    vpsllq $32, %ymm2, %ymm2
657; AVX2-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
658; AVX2-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
659; AVX2-NEXT:    vmovq %xmm0, %rax
660; AVX2-NEXT:    vzeroupper
661; AVX2-NEXT:    retq
662;
663; AVX512BW-LABEL: test_v16i64:
664; AVX512BW:       # %bb.0:
665; AVX512BW-NEXT:    vpsrlq $32, %zmm0, %zmm2
666; AVX512BW-NEXT:    vpmuludq %zmm1, %zmm2, %zmm2
667; AVX512BW-NEXT:    vpsrlq $32, %zmm1, %zmm3
668; AVX512BW-NEXT:    vpmuludq %zmm3, %zmm0, %zmm3
669; AVX512BW-NEXT:    vpaddq %zmm2, %zmm3, %zmm2
670; AVX512BW-NEXT:    vpsllq $32, %zmm2, %zmm2
671; AVX512BW-NEXT:    vpmuludq %zmm1, %zmm0, %zmm0
672; AVX512BW-NEXT:    vpaddq %zmm2, %zmm0, %zmm0
673; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
674; AVX512BW-NEXT:    vpsrlq $32, %zmm0, %zmm2
675; AVX512BW-NEXT:    vpmuludq %zmm1, %zmm2, %zmm2
676; AVX512BW-NEXT:    vpsrlq $32, %zmm1, %zmm3
677; AVX512BW-NEXT:    vpmuludq %zmm3, %zmm0, %zmm3
678; AVX512BW-NEXT:    vpaddq %zmm2, %zmm3, %zmm2
679; AVX512BW-NEXT:    vpsllq $32, %zmm2, %zmm2
680; AVX512BW-NEXT:    vpmuludq %zmm1, %zmm0, %zmm0
681; AVX512BW-NEXT:    vpaddq %zmm2, %zmm0, %zmm0
682; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
683; AVX512BW-NEXT:    vpsrlq $32, %zmm0, %zmm2
684; AVX512BW-NEXT:    vpmuludq %zmm1, %zmm2, %zmm2
685; AVX512BW-NEXT:    vpsrlq $32, %zmm1, %zmm3
686; AVX512BW-NEXT:    vpmuludq %zmm3, %zmm0, %zmm3
687; AVX512BW-NEXT:    vpaddq %zmm2, %zmm3, %zmm2
688; AVX512BW-NEXT:    vpsllq $32, %zmm2, %zmm2
689; AVX512BW-NEXT:    vpmuludq %zmm1, %zmm0, %zmm0
690; AVX512BW-NEXT:    vpaddq %zmm2, %zmm0, %zmm0
691; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
692; AVX512BW-NEXT:    vpsrlq $32, %zmm0, %zmm2
693; AVX512BW-NEXT:    vpmuludq %zmm1, %zmm2, %zmm2
694; AVX512BW-NEXT:    vpsrlq $32, %zmm1, %zmm3
695; AVX512BW-NEXT:    vpmuludq %zmm3, %zmm0, %zmm3
696; AVX512BW-NEXT:    vpaddq %zmm2, %zmm3, %zmm2
697; AVX512BW-NEXT:    vpsllq $32, %zmm2, %zmm2
698; AVX512BW-NEXT:    vpmuludq %zmm1, %zmm0, %zmm0
699; AVX512BW-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
700; AVX512BW-NEXT:    vmovq %xmm0, %rax
701; AVX512BW-NEXT:    vzeroupper
702; AVX512BW-NEXT:    retq
703;
704; AVX512BWVL-LABEL: test_v16i64:
705; AVX512BWVL:       # %bb.0:
706; AVX512BWVL-NEXT:    vpsrlq $32, %zmm0, %zmm2
707; AVX512BWVL-NEXT:    vpmuludq %zmm1, %zmm2, %zmm2
708; AVX512BWVL-NEXT:    vpsrlq $32, %zmm1, %zmm3
709; AVX512BWVL-NEXT:    vpmuludq %zmm3, %zmm0, %zmm3
710; AVX512BWVL-NEXT:    vpaddq %zmm2, %zmm3, %zmm2
711; AVX512BWVL-NEXT:    vpsllq $32, %zmm2, %zmm2
712; AVX512BWVL-NEXT:    vpmuludq %zmm1, %zmm0, %zmm0
713; AVX512BWVL-NEXT:    vpaddq %zmm2, %zmm0, %zmm0
714; AVX512BWVL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
715; AVX512BWVL-NEXT:    vpsrlq $32, %zmm0, %zmm2
716; AVX512BWVL-NEXT:    vpmuludq %zmm1, %zmm2, %zmm2
717; AVX512BWVL-NEXT:    vpsrlq $32, %zmm1, %zmm3
718; AVX512BWVL-NEXT:    vpmuludq %zmm3, %zmm0, %zmm3
719; AVX512BWVL-NEXT:    vpaddq %zmm2, %zmm3, %zmm2
720; AVX512BWVL-NEXT:    vpsllq $32, %zmm2, %zmm2
721; AVX512BWVL-NEXT:    vpmuludq %zmm1, %zmm0, %zmm0
722; AVX512BWVL-NEXT:    vpaddq %zmm2, %zmm0, %zmm0
723; AVX512BWVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
724; AVX512BWVL-NEXT:    vpsrlq $32, %zmm0, %zmm2
725; AVX512BWVL-NEXT:    vpmuludq %zmm1, %zmm2, %zmm2
726; AVX512BWVL-NEXT:    vpsrlq $32, %zmm1, %zmm3
727; AVX512BWVL-NEXT:    vpmuludq %zmm3, %zmm0, %zmm3
728; AVX512BWVL-NEXT:    vpaddq %zmm2, %zmm3, %zmm2
729; AVX512BWVL-NEXT:    vpsllq $32, %zmm2, %zmm2
730; AVX512BWVL-NEXT:    vpmuludq %zmm1, %zmm0, %zmm0
731; AVX512BWVL-NEXT:    vpaddq %zmm2, %zmm0, %zmm0
732; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
733; AVX512BWVL-NEXT:    vpsrlq $32, %zmm0, %zmm2
734; AVX512BWVL-NEXT:    vpmuludq %zmm1, %zmm2, %zmm2
735; AVX512BWVL-NEXT:    vpsrlq $32, %zmm1, %zmm3
736; AVX512BWVL-NEXT:    vpmuludq %zmm3, %zmm0, %zmm3
737; AVX512BWVL-NEXT:    vpaddq %zmm2, %zmm3, %zmm2
738; AVX512BWVL-NEXT:    vpsllq $32, %zmm2, %zmm2
739; AVX512BWVL-NEXT:    vpmuludq %zmm1, %zmm0, %zmm0
740; AVX512BWVL-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
741; AVX512BWVL-NEXT:    vmovq %xmm0, %rax
742; AVX512BWVL-NEXT:    vzeroupper
743; AVX512BWVL-NEXT:    retq
744;
745; AVX512DQ-LABEL: test_v16i64:
746; AVX512DQ:       # %bb.0:
747; AVX512DQ-NEXT:    vpmullq %zmm1, %zmm0, %zmm0
748; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
749; AVX512DQ-NEXT:    vpmullq %zmm1, %zmm0, %zmm0
750; AVX512DQ-NEXT:    vextracti128 $1, %ymm0, %xmm1
751; AVX512DQ-NEXT:    vpmullq %zmm1, %zmm0, %zmm0
752; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
753; AVX512DQ-NEXT:    vpmullq %zmm1, %zmm0, %zmm0
754; AVX512DQ-NEXT:    vmovq %xmm0, %rax
755; AVX512DQ-NEXT:    vzeroupper
756; AVX512DQ-NEXT:    retq
757;
758; AVX512DQVL-LABEL: test_v16i64:
759; AVX512DQVL:       # %bb.0:
760; AVX512DQVL-NEXT:    vpmullq %zmm1, %zmm0, %zmm0
761; AVX512DQVL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
762; AVX512DQVL-NEXT:    vpmullq %zmm1, %zmm0, %zmm0
763; AVX512DQVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
764; AVX512DQVL-NEXT:    vpmullq %zmm1, %zmm0, %zmm0
765; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
766; AVX512DQVL-NEXT:    vpmullq %xmm1, %xmm0, %xmm0
767; AVX512DQVL-NEXT:    vmovq %xmm0, %rax
768; AVX512DQVL-NEXT:    vzeroupper
769; AVX512DQVL-NEXT:    retq
770  %1 = call i64 @llvm.experimental.vector.reduce.mul.i64.v16i64(<16 x i64> %a0)
771  ret i64 %1
772}
773
774;
775; vXi32
776;
777
778define i32 @test_v2i32(<2 x i32> %a0) {
779; SSE-LABEL: test_v2i32:
780; SSE:       # %bb.0:
781; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
782; SSE-NEXT:    pmuludq %xmm0, %xmm1
783; SSE-NEXT:    movd %xmm1, %eax
784; SSE-NEXT:    retq
785;
786; AVX-LABEL: test_v2i32:
787; AVX:       # %bb.0:
788; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
789; AVX-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
790; AVX-NEXT:    vmovd %xmm0, %eax
791; AVX-NEXT:    retq
792;
793; AVX512-LABEL: test_v2i32:
794; AVX512:       # %bb.0:
795; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
796; AVX512-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
797; AVX512-NEXT:    vmovd %xmm0, %eax
798; AVX512-NEXT:    retq
799  %1 = call i32 @llvm.experimental.vector.reduce.mul.i32.v2i32(<2 x i32> %a0)
800  ret i32 %1
801}
802
803define i32 @test_v4i32(<4 x i32> %a0) {
804; SSE2-LABEL: test_v4i32:
805; SSE2:       # %bb.0:
806; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
807; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[3,3,1,1]
808; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
809; SSE2-NEXT:    pmuludq %xmm2, %xmm3
810; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3]
811; SSE2-NEXT:    pmuludq %xmm0, %xmm1
812; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
813; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
814; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
815; SSE2-NEXT:    pmuludq %xmm0, %xmm1
816; SSE2-NEXT:    movd %xmm1, %eax
817; SSE2-NEXT:    retq
818;
819; SSE41-LABEL: test_v4i32:
820; SSE41:       # %bb.0:
821; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
822; SSE41-NEXT:    pmulld %xmm0, %xmm1
823; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
824; SSE41-NEXT:    pmulld %xmm1, %xmm0
825; SSE41-NEXT:    movd %xmm0, %eax
826; SSE41-NEXT:    retq
827;
828; AVX-LABEL: test_v4i32:
829; AVX:       # %bb.0:
830; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
831; AVX-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
832; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
833; AVX-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
834; AVX-NEXT:    vmovd %xmm0, %eax
835; AVX-NEXT:    retq
836;
837; AVX512-LABEL: test_v4i32:
838; AVX512:       # %bb.0:
839; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
840; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
841; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
842; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
843; AVX512-NEXT:    vmovd %xmm0, %eax
844; AVX512-NEXT:    retq
845  %1 = call i32 @llvm.experimental.vector.reduce.mul.i32.v4i32(<4 x i32> %a0)
846  ret i32 %1
847}
848
849define i32 @test_v8i32(<8 x i32> %a0) {
850; SSE2-LABEL: test_v8i32:
851; SSE2:       # %bb.0:
852; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
853; SSE2-NEXT:    pmuludq %xmm1, %xmm0
854; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
855; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
856; SSE2-NEXT:    pmuludq %xmm2, %xmm1
857; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3]
858; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
859; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
860; SSE2-NEXT:    pmuludq %xmm0, %xmm2
861; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
862; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,2,0,0]
863; SSE2-NEXT:    pmuludq %xmm1, %xmm2
864; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
865; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
866; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
867; SSE2-NEXT:    pmuludq %xmm0, %xmm1
868; SSE2-NEXT:    movd %xmm1, %eax
869; SSE2-NEXT:    retq
870;
871; SSE41-LABEL: test_v8i32:
872; SSE41:       # %bb.0:
873; SSE41-NEXT:    pmulld %xmm1, %xmm0
874; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
875; SSE41-NEXT:    pmulld %xmm0, %xmm1
876; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
877; SSE41-NEXT:    pmulld %xmm1, %xmm0
878; SSE41-NEXT:    movd %xmm0, %eax
879; SSE41-NEXT:    retq
880;
881; AVX1-LABEL: test_v8i32:
882; AVX1:       # %bb.0:
883; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
884; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
885; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
886; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
887; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
888; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
889; AVX1-NEXT:    vmovd %xmm0, %eax
890; AVX1-NEXT:    vzeroupper
891; AVX1-NEXT:    retq
892;
893; AVX2-LABEL: test_v8i32:
894; AVX2:       # %bb.0:
895; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
896; AVX2-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
897; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
898; AVX2-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
899; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
900; AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
901; AVX2-NEXT:    vmovd %xmm0, %eax
902; AVX2-NEXT:    vzeroupper
903; AVX2-NEXT:    retq
904;
905; AVX512-LABEL: test_v8i32:
906; AVX512:       # %bb.0:
907; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
908; AVX512-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
909; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
910; AVX512-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
911; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
912; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
913; AVX512-NEXT:    vmovd %xmm0, %eax
914; AVX512-NEXT:    vzeroupper
915; AVX512-NEXT:    retq
916  %1 = call i32 @llvm.experimental.vector.reduce.mul.i32.v8i32(<8 x i32> %a0)
917  ret i32 %1
918}
919
920define i32 @test_v16i32(<16 x i32> %a0) {
921; SSE2-LABEL: test_v16i32:
922; SSE2:       # %bb.0:
923; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
924; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
925; SSE2-NEXT:    pmuludq %xmm4, %xmm5
926; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
927; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
928; SSE2-NEXT:    pmuludq %xmm4, %xmm6
929; SSE2-NEXT:    pmuludq %xmm5, %xmm6
930; SSE2-NEXT:    pmuludq %xmm3, %xmm1
931; SSE2-NEXT:    pmuludq %xmm2, %xmm0
932; SSE2-NEXT:    pmuludq %xmm1, %xmm0
933; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
934; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[0,2,2,3]
935; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
936; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
937; SSE2-NEXT:    pmuludq %xmm0, %xmm1
938; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
939; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[2,2,0,0]
940; SSE2-NEXT:    pmuludq %xmm6, %xmm1
941; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
942; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
943; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
944; SSE2-NEXT:    pmuludq %xmm0, %xmm1
945; SSE2-NEXT:    movd %xmm1, %eax
946; SSE2-NEXT:    retq
947;
948; SSE41-LABEL: test_v16i32:
949; SSE41:       # %bb.0:
950; SSE41-NEXT:    pmulld %xmm3, %xmm1
951; SSE41-NEXT:    pmulld %xmm2, %xmm0
952; SSE41-NEXT:    pmulld %xmm1, %xmm0
953; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
954; SSE41-NEXT:    pmulld %xmm0, %xmm1
955; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
956; SSE41-NEXT:    pmulld %xmm1, %xmm0
957; SSE41-NEXT:    movd %xmm0, %eax
958; SSE41-NEXT:    retq
959;
960; AVX1-LABEL: test_v16i32:
961; AVX1:       # %bb.0:
962; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
963; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
964; AVX1-NEXT:    vpmulld %xmm2, %xmm3, %xmm2
965; AVX1-NEXT:    vpmulld %xmm2, %xmm1, %xmm1
966; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
967; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
968; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
969; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
970; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
971; AVX1-NEXT:    vmovd %xmm0, %eax
972; AVX1-NEXT:    vzeroupper
973; AVX1-NEXT:    retq
974;
975; AVX2-LABEL: test_v16i32:
976; AVX2:       # %bb.0:
977; AVX2-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
978; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
979; AVX2-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
980; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
981; AVX2-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
982; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
983; AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
984; AVX2-NEXT:    vmovd %xmm0, %eax
985; AVX2-NEXT:    vzeroupper
986; AVX2-NEXT:    retq
987;
988; AVX512-LABEL: test_v16i32:
989; AVX512:       # %bb.0:
990; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
991; AVX512-NEXT:    vpmulld %zmm1, %zmm0, %zmm0
992; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
993; AVX512-NEXT:    vpmulld %zmm1, %zmm0, %zmm0
994; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
995; AVX512-NEXT:    vpmulld %zmm1, %zmm0, %zmm0
996; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
997; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
998; AVX512-NEXT:    vmovd %xmm0, %eax
999; AVX512-NEXT:    vzeroupper
1000; AVX512-NEXT:    retq
1001  %1 = call i32 @llvm.experimental.vector.reduce.mul.i32.v16i32(<16 x i32> %a0)
1002  ret i32 %1
1003}
1004
1005define i32 @test_v32i32(<32 x i32> %a0) {
1006; SSE2-LABEL: test_v32i32:
1007; SSE2:       # %bb.0:
1008; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm2[1,1,3,3]
1009; SSE2-NEXT:    pmuludq %xmm6, %xmm2
1010; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm0[1,1,3,3]
1011; SSE2-NEXT:    pmuludq %xmm4, %xmm0
1012; SSE2-NEXT:    pmuludq %xmm2, %xmm0
1013; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1014; SSE2-NEXT:    pmuludq %xmm7, %xmm3
1015; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm1[1,1,3,3]
1016; SSE2-NEXT:    pmuludq %xmm5, %xmm1
1017; SSE2-NEXT:    pmuludq %xmm3, %xmm1
1018; SSE2-NEXT:    pmuludq %xmm0, %xmm1
1019; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
1020; SSE2-NEXT:    pmuludq %xmm8, %xmm0
1021; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1022; SSE2-NEXT:    pmuludq %xmm9, %xmm3
1023; SSE2-NEXT:    pmuludq %xmm0, %xmm3
1024; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
1025; SSE2-NEXT:    pmuludq %xmm2, %xmm0
1026; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
1027; SSE2-NEXT:    pmuludq %xmm10, %xmm2
1028; SSE2-NEXT:    pmuludq %xmm0, %xmm2
1029; SSE2-NEXT:    pmuludq %xmm3, %xmm2
1030; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1031; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
1032; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1033; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1034; SSE2-NEXT:    pmuludq %xmm0, %xmm1
1035; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1036; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,2,0,0]
1037; SSE2-NEXT:    pmuludq %xmm2, %xmm1
1038; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
1039; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1040; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1041; SSE2-NEXT:    pmuludq %xmm0, %xmm1
1042; SSE2-NEXT:    movd %xmm1, %eax
1043; SSE2-NEXT:    retq
1044;
1045; SSE41-LABEL: test_v32i32:
1046; SSE41:       # %bb.0:
1047; SSE41-NEXT:    pmulld %xmm6, %xmm2
1048; SSE41-NEXT:    pmulld %xmm4, %xmm0
1049; SSE41-NEXT:    pmulld %xmm2, %xmm0
1050; SSE41-NEXT:    pmulld %xmm7, %xmm3
1051; SSE41-NEXT:    pmulld %xmm5, %xmm1
1052; SSE41-NEXT:    pmulld %xmm3, %xmm1
1053; SSE41-NEXT:    pmulld %xmm0, %xmm1
1054; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1055; SSE41-NEXT:    pmulld %xmm1, %xmm0
1056; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1057; SSE41-NEXT:    pmulld %xmm0, %xmm1
1058; SSE41-NEXT:    movd %xmm1, %eax
1059; SSE41-NEXT:    retq
1060;
1061; AVX1-LABEL: test_v32i32:
1062; AVX1:       # %bb.0:
1063; AVX1-NEXT:    vpmulld %xmm3, %xmm1, %xmm4
1064; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
1065; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1066; AVX1-NEXT:    vpmulld %xmm3, %xmm1, %xmm1
1067; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
1068; AVX1-NEXT:    vpmulld %xmm1, %xmm3, %xmm1
1069; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1070; AVX1-NEXT:    vpmulld %xmm1, %xmm3, %xmm1
1071; AVX1-NEXT:    vpmulld %xmm4, %xmm2, %xmm2
1072; AVX1-NEXT:    vpmulld %xmm1, %xmm2, %xmm1
1073; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1074; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1075; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1076; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1077; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1078; AVX1-NEXT:    vmovd %xmm0, %eax
1079; AVX1-NEXT:    vzeroupper
1080; AVX1-NEXT:    retq
1081;
1082; AVX2-LABEL: test_v32i32:
1083; AVX2:       # %bb.0:
1084; AVX2-NEXT:    vpmulld %ymm3, %ymm1, %ymm1
1085; AVX2-NEXT:    vpmulld %ymm1, %ymm2, %ymm1
1086; AVX2-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
1087; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1088; AVX2-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
1089; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1090; AVX2-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
1091; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1092; AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1093; AVX2-NEXT:    vmovd %xmm0, %eax
1094; AVX2-NEXT:    vzeroupper
1095; AVX2-NEXT:    retq
1096;
1097; AVX512-LABEL: test_v32i32:
1098; AVX512:       # %bb.0:
1099; AVX512-NEXT:    vpmulld %zmm1, %zmm0, %zmm0
1100; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1101; AVX512-NEXT:    vpmulld %zmm1, %zmm0, %zmm0
1102; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1103; AVX512-NEXT:    vpmulld %zmm1, %zmm0, %zmm0
1104; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1105; AVX512-NEXT:    vpmulld %zmm1, %zmm0, %zmm0
1106; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1107; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1108; AVX512-NEXT:    vmovd %xmm0, %eax
1109; AVX512-NEXT:    vzeroupper
1110; AVX512-NEXT:    retq
1111  %1 = call i32 @llvm.experimental.vector.reduce.mul.i32.v32i32(<32 x i32> %a0)
1112  ret i32 %1
1113}
1114
1115;
1116; vXi16
1117;
1118
1119define i16 @test_v2i16(<2 x i16> %a0) {
1120; SSE-LABEL: test_v2i16:
1121; SSE:       # %bb.0:
1122; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1123; SSE-NEXT:    pmuludq %xmm0, %xmm1
1124; SSE-NEXT:    movd %xmm1, %eax
1125; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
1126; SSE-NEXT:    retq
1127;
1128; AVX-LABEL: test_v2i16:
1129; AVX:       # %bb.0:
1130; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1131; AVX-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
1132; AVX-NEXT:    vmovd %xmm0, %eax
1133; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
1134; AVX-NEXT:    retq
1135;
1136; AVX512-LABEL: test_v2i16:
1137; AVX512:       # %bb.0:
1138; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1139; AVX512-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
1140; AVX512-NEXT:    vmovd %xmm0, %eax
1141; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1142; AVX512-NEXT:    retq
1143  %1 = call i16 @llvm.experimental.vector.reduce.mul.i16.v2i16(<2 x i16> %a0)
1144  ret i16 %1
1145}
1146
1147define i16 @test_v4i16(<4 x i16> %a0) {
1148; SSE2-LABEL: test_v4i16:
1149; SSE2:       # %bb.0:
1150; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1151; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[3,3,1,1]
1152; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
1153; SSE2-NEXT:    pmuludq %xmm2, %xmm3
1154; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3]
1155; SSE2-NEXT:    pmuludq %xmm0, %xmm1
1156; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1157; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1158; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1159; SSE2-NEXT:    pmuludq %xmm0, %xmm1
1160; SSE2-NEXT:    pextrw $0, %xmm1, %eax
1161; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1162; SSE2-NEXT:    retq
1163;
1164; SSE41-LABEL: test_v4i16:
1165; SSE41:       # %bb.0:
1166; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1167; SSE41-NEXT:    pmulld %xmm0, %xmm1
1168; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1169; SSE41-NEXT:    pmulld %xmm1, %xmm0
1170; SSE41-NEXT:    movd %xmm0, %eax
1171; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax
1172; SSE41-NEXT:    retq
1173;
1174; AVX-LABEL: test_v4i16:
1175; AVX:       # %bb.0:
1176; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1177; AVX-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1178; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1179; AVX-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1180; AVX-NEXT:    vmovd %xmm0, %eax
1181; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
1182; AVX-NEXT:    retq
1183;
1184; AVX512-LABEL: test_v4i16:
1185; AVX512:       # %bb.0:
1186; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1187; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1188; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1189; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1190; AVX512-NEXT:    vmovd %xmm0, %eax
1191; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1192; AVX512-NEXT:    retq
1193  %1 = call i16 @llvm.experimental.vector.reduce.mul.i16.v4i16(<4 x i16> %a0)
1194  ret i16 %1
1195}
1196
1197define i16 @test_v8i16(<8 x i16> %a0) {
1198; SSE-LABEL: test_v8i16:
1199; SSE:       # %bb.0:
1200; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1201; SSE-NEXT:    pmullw %xmm0, %xmm1
1202; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1203; SSE-NEXT:    pmullw %xmm1, %xmm0
1204; SSE-NEXT:    movdqa %xmm0, %xmm1
1205; SSE-NEXT:    psrld $16, %xmm1
1206; SSE-NEXT:    pmullw %xmm0, %xmm1
1207; SSE-NEXT:    movd %xmm1, %eax
1208; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
1209; SSE-NEXT:    retq
1210;
1211; AVX-LABEL: test_v8i16:
1212; AVX:       # %bb.0:
1213; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1214; AVX-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1215; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1216; AVX-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1217; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
1218; AVX-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1219; AVX-NEXT:    vmovd %xmm0, %eax
1220; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
1221; AVX-NEXT:    retq
1222;
1223; AVX512-LABEL: test_v8i16:
1224; AVX512:       # %bb.0:
1225; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1226; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1227; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1228; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1229; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1230; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1231; AVX512-NEXT:    vmovd %xmm0, %eax
1232; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1233; AVX512-NEXT:    retq
1234  %1 = call i16 @llvm.experimental.vector.reduce.mul.i16.v8i16(<8 x i16> %a0)
1235  ret i16 %1
1236}
1237
1238define i16 @test_v16i16(<16 x i16> %a0) {
1239; SSE-LABEL: test_v16i16:
1240; SSE:       # %bb.0:
1241; SSE-NEXT:    pmullw %xmm1, %xmm0
1242; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1243; SSE-NEXT:    pmullw %xmm0, %xmm1
1244; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1245; SSE-NEXT:    pmullw %xmm1, %xmm0
1246; SSE-NEXT:    movdqa %xmm0, %xmm1
1247; SSE-NEXT:    psrld $16, %xmm1
1248; SSE-NEXT:    pmullw %xmm0, %xmm1
1249; SSE-NEXT:    movd %xmm1, %eax
1250; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
1251; SSE-NEXT:    retq
1252;
1253; AVX1-LABEL: test_v16i16:
1254; AVX1:       # %bb.0:
1255; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1256; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1257; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1258; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1259; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1260; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1261; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
1262; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1263; AVX1-NEXT:    vmovd %xmm0, %eax
1264; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
1265; AVX1-NEXT:    vzeroupper
1266; AVX1-NEXT:    retq
1267;
1268; AVX2-LABEL: test_v16i16:
1269; AVX2:       # %bb.0:
1270; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1271; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1272; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1273; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1274; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1275; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1276; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
1277; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1278; AVX2-NEXT:    vmovd %xmm0, %eax
1279; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
1280; AVX2-NEXT:    vzeroupper
1281; AVX2-NEXT:    retq
1282;
1283; AVX512-LABEL: test_v16i16:
1284; AVX512:       # %bb.0:
1285; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1286; AVX512-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1287; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1288; AVX512-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1289; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1290; AVX512-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1291; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1292; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1293; AVX512-NEXT:    vmovd %xmm0, %eax
1294; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1295; AVX512-NEXT:    vzeroupper
1296; AVX512-NEXT:    retq
1297  %1 = call i16 @llvm.experimental.vector.reduce.mul.i16.v16i16(<16 x i16> %a0)
1298  ret i16 %1
1299}
1300
1301define i16 @test_v32i16(<32 x i16> %a0) {
1302; SSE-LABEL: test_v32i16:
1303; SSE:       # %bb.0:
1304; SSE-NEXT:    pmullw %xmm3, %xmm1
1305; SSE-NEXT:    pmullw %xmm2, %xmm0
1306; SSE-NEXT:    pmullw %xmm1, %xmm0
1307; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1308; SSE-NEXT:    pmullw %xmm0, %xmm1
1309; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1310; SSE-NEXT:    pmullw %xmm1, %xmm0
1311; SSE-NEXT:    movdqa %xmm0, %xmm1
1312; SSE-NEXT:    psrld $16, %xmm1
1313; SSE-NEXT:    pmullw %xmm0, %xmm1
1314; SSE-NEXT:    movd %xmm1, %eax
1315; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
1316; SSE-NEXT:    retq
1317;
1318; AVX1-LABEL: test_v32i16:
1319; AVX1:       # %bb.0:
1320; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1321; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1322; AVX1-NEXT:    vpmullw %xmm2, %xmm3, %xmm2
1323; AVX1-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
1324; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1325; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1326; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1327; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1328; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1329; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
1330; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1331; AVX1-NEXT:    vmovd %xmm0, %eax
1332; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
1333; AVX1-NEXT:    vzeroupper
1334; AVX1-NEXT:    retq
1335;
1336; AVX2-LABEL: test_v32i16:
1337; AVX2:       # %bb.0:
1338; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1339; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1340; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1341; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1342; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1343; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1344; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1345; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
1346; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1347; AVX2-NEXT:    vmovd %xmm0, %eax
1348; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
1349; AVX2-NEXT:    vzeroupper
1350; AVX2-NEXT:    retq
1351;
1352; AVX512BW-LABEL: test_v32i16:
1353; AVX512BW:       # %bb.0:
1354; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1355; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1356; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
1357; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1358; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1359; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1360; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1361; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1362; AVX512BW-NEXT:    vpsrld $16, %xmm0, %xmm1
1363; AVX512BW-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1364; AVX512BW-NEXT:    vmovd %xmm0, %eax
1365; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
1366; AVX512BW-NEXT:    vzeroupper
1367; AVX512BW-NEXT:    retq
1368;
1369; AVX512BWVL-LABEL: test_v32i16:
1370; AVX512BWVL:       # %bb.0:
1371; AVX512BWVL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1372; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1373; AVX512BWVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
1374; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1375; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1376; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1377; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1378; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1379; AVX512BWVL-NEXT:    vpsrld $16, %xmm0, %xmm1
1380; AVX512BWVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1381; AVX512BWVL-NEXT:    vmovd %xmm0, %eax
1382; AVX512BWVL-NEXT:    # kill: def $ax killed $ax killed $eax
1383; AVX512BWVL-NEXT:    vzeroupper
1384; AVX512BWVL-NEXT:    retq
1385;
1386; AVX512DQ-LABEL: test_v32i16:
1387; AVX512DQ:       # %bb.0:
1388; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1389; AVX512DQ-NEXT:    vextracti128 $1, %ymm0, %xmm1
1390; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1391; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1392; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1393; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1394; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1395; AVX512DQ-NEXT:    vpsrld $16, %xmm0, %xmm1
1396; AVX512DQ-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1397; AVX512DQ-NEXT:    vmovd %xmm0, %eax
1398; AVX512DQ-NEXT:    # kill: def $ax killed $ax killed $eax
1399; AVX512DQ-NEXT:    vzeroupper
1400; AVX512DQ-NEXT:    retq
1401;
1402; AVX512DQVL-LABEL: test_v32i16:
1403; AVX512DQVL:       # %bb.0:
1404; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1405; AVX512DQVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
1406; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1407; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1408; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1409; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1410; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1411; AVX512DQVL-NEXT:    vpsrld $16, %xmm0, %xmm1
1412; AVX512DQVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1413; AVX512DQVL-NEXT:    vmovd %xmm0, %eax
1414; AVX512DQVL-NEXT:    # kill: def $ax killed $ax killed $eax
1415; AVX512DQVL-NEXT:    vzeroupper
1416; AVX512DQVL-NEXT:    retq
1417  %1 = call i16 @llvm.experimental.vector.reduce.mul.i16.v32i16(<32 x i16> %a0)
1418  ret i16 %1
1419}
1420
1421define i16 @test_v64i16(<64 x i16> %a0) {
1422; SSE-LABEL: test_v64i16:
1423; SSE:       # %bb.0:
1424; SSE-NEXT:    pmullw %xmm6, %xmm2
1425; SSE-NEXT:    pmullw %xmm4, %xmm0
1426; SSE-NEXT:    pmullw %xmm2, %xmm0
1427; SSE-NEXT:    pmullw %xmm7, %xmm3
1428; SSE-NEXT:    pmullw %xmm5, %xmm1
1429; SSE-NEXT:    pmullw %xmm3, %xmm1
1430; SSE-NEXT:    pmullw %xmm0, %xmm1
1431; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1432; SSE-NEXT:    pmullw %xmm1, %xmm0
1433; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1434; SSE-NEXT:    pmullw %xmm0, %xmm1
1435; SSE-NEXT:    movdqa %xmm1, %xmm0
1436; SSE-NEXT:    psrld $16, %xmm0
1437; SSE-NEXT:    pmullw %xmm1, %xmm0
1438; SSE-NEXT:    movd %xmm0, %eax
1439; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
1440; SSE-NEXT:    retq
1441;
1442; AVX1-LABEL: test_v64i16:
1443; AVX1:       # %bb.0:
1444; AVX1-NEXT:    vpmullw %xmm3, %xmm1, %xmm4
1445; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
1446; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1447; AVX1-NEXT:    vpmullw %xmm3, %xmm1, %xmm1
1448; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
1449; AVX1-NEXT:    vpmullw %xmm1, %xmm3, %xmm1
1450; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1451; AVX1-NEXT:    vpmullw %xmm1, %xmm3, %xmm1
1452; AVX1-NEXT:    vpmullw %xmm4, %xmm2, %xmm2
1453; AVX1-NEXT:    vpmullw %xmm1, %xmm2, %xmm1
1454; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1455; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1456; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1457; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1458; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1459; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
1460; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1461; AVX1-NEXT:    vmovd %xmm0, %eax
1462; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
1463; AVX1-NEXT:    vzeroupper
1464; AVX1-NEXT:    retq
1465;
1466; AVX2-LABEL: test_v64i16:
1467; AVX2:       # %bb.0:
1468; AVX2-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
1469; AVX2-NEXT:    vpmullw %ymm1, %ymm2, %ymm1
1470; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1471; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1472; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1473; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1474; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1475; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1476; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1477; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
1478; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1479; AVX2-NEXT:    vmovd %xmm0, %eax
1480; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
1481; AVX2-NEXT:    vzeroupper
1482; AVX2-NEXT:    retq
1483;
1484; AVX512BW-LABEL: test_v64i16:
1485; AVX512BW:       # %bb.0:
1486; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1487; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1488; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1489; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
1490; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1491; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1492; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1493; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1494; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1495; AVX512BW-NEXT:    vpsrld $16, %xmm0, %xmm1
1496; AVX512BW-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1497; AVX512BW-NEXT:    vmovd %xmm0, %eax
1498; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
1499; AVX512BW-NEXT:    vzeroupper
1500; AVX512BW-NEXT:    retq
1501;
1502; AVX512BWVL-LABEL: test_v64i16:
1503; AVX512BWVL:       # %bb.0:
1504; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1505; AVX512BWVL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1506; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1507; AVX512BWVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
1508; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1509; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1510; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1511; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1512; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1513; AVX512BWVL-NEXT:    vpsrld $16, %xmm0, %xmm1
1514; AVX512BWVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1515; AVX512BWVL-NEXT:    vmovd %xmm0, %eax
1516; AVX512BWVL-NEXT:    # kill: def $ax killed $ax killed $eax
1517; AVX512BWVL-NEXT:    vzeroupper
1518; AVX512BWVL-NEXT:    retq
1519;
1520; AVX512DQ-LABEL: test_v64i16:
1521; AVX512DQ:       # %bb.0:
1522; AVX512DQ-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
1523; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm2, %ymm1
1524; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1525; AVX512DQ-NEXT:    vextracti128 $1, %ymm0, %xmm1
1526; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1527; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1528; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1529; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1530; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1531; AVX512DQ-NEXT:    vpsrld $16, %xmm0, %xmm1
1532; AVX512DQ-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1533; AVX512DQ-NEXT:    vmovd %xmm0, %eax
1534; AVX512DQ-NEXT:    # kill: def $ax killed $ax killed $eax
1535; AVX512DQ-NEXT:    vzeroupper
1536; AVX512DQ-NEXT:    retq
1537;
1538; AVX512DQVL-LABEL: test_v64i16:
1539; AVX512DQVL:       # %bb.0:
1540; AVX512DQVL-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
1541; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm2, %ymm1
1542; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1543; AVX512DQVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
1544; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1545; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1546; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1547; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1548; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1549; AVX512DQVL-NEXT:    vpsrld $16, %xmm0, %xmm1
1550; AVX512DQVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1551; AVX512DQVL-NEXT:    vmovd %xmm0, %eax
1552; AVX512DQVL-NEXT:    # kill: def $ax killed $ax killed $eax
1553; AVX512DQVL-NEXT:    vzeroupper
1554; AVX512DQVL-NEXT:    retq
1555  %1 = call i16 @llvm.experimental.vector.reduce.mul.i16.v64i16(<64 x i16> %a0)
1556  ret i16 %1
1557}
1558
1559;
1560; vXi8
1561;
1562
1563define i8 @test_v2i8(<2 x i8> %a0) {
1564; SSE2-LABEL: test_v2i8:
1565; SSE2:       # %bb.0:
1566; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1567; SSE2-NEXT:    pmuludq %xmm0, %xmm1
1568; SSE2-NEXT:    movd %xmm1, %eax
1569; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1570; SSE2-NEXT:    retq
1571;
1572; SSE41-LABEL: test_v2i8:
1573; SSE41:       # %bb.0:
1574; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1575; SSE41-NEXT:    pmuludq %xmm0, %xmm1
1576; SSE41-NEXT:    pextrb $0, %xmm1, %eax
1577; SSE41-NEXT:    # kill: def $al killed $al killed $eax
1578; SSE41-NEXT:    retq
1579;
1580; AVX-LABEL: test_v2i8:
1581; AVX:       # %bb.0:
1582; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1583; AVX-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
1584; AVX-NEXT:    vpextrb $0, %xmm0, %eax
1585; AVX-NEXT:    # kill: def $al killed $al killed $eax
1586; AVX-NEXT:    retq
1587;
1588; AVX512-LABEL: test_v2i8:
1589; AVX512:       # %bb.0:
1590; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1591; AVX512-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
1592; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
1593; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1594; AVX512-NEXT:    retq
1595  %1 = call i8 @llvm.experimental.vector.reduce.mul.i8.v2i8(<2 x i8> %a0)
1596  ret i8 %1
1597}
1598
1599define i8 @test_v4i8(<4 x i8> %a0) {
1600; SSE2-LABEL: test_v4i8:
1601; SSE2:       # %bb.0:
1602; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1603; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[3,3,1,1]
1604; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
1605; SSE2-NEXT:    pmuludq %xmm2, %xmm3
1606; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3]
1607; SSE2-NEXT:    pmuludq %xmm0, %xmm1
1608; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1609; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1610; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1611; SSE2-NEXT:    pmuludq %xmm0, %xmm1
1612; SSE2-NEXT:    movd %xmm1, %eax
1613; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1614; SSE2-NEXT:    retq
1615;
1616; SSE41-LABEL: test_v4i8:
1617; SSE41:       # %bb.0:
1618; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1619; SSE41-NEXT:    pmulld %xmm0, %xmm1
1620; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1621; SSE41-NEXT:    pmulld %xmm1, %xmm0
1622; SSE41-NEXT:    pextrb $0, %xmm0, %eax
1623; SSE41-NEXT:    # kill: def $al killed $al killed $eax
1624; SSE41-NEXT:    retq
1625;
1626; AVX-LABEL: test_v4i8:
1627; AVX:       # %bb.0:
1628; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1629; AVX-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1630; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1631; AVX-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1632; AVX-NEXT:    vpextrb $0, %xmm0, %eax
1633; AVX-NEXT:    # kill: def $al killed $al killed $eax
1634; AVX-NEXT:    retq
1635;
1636; AVX512-LABEL: test_v4i8:
1637; AVX512:       # %bb.0:
1638; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1639; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1640; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1641; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1642; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
1643; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1644; AVX512-NEXT:    retq
1645  %1 = call i8 @llvm.experimental.vector.reduce.mul.i8.v4i8(<4 x i8> %a0)
1646  ret i8 %1
1647}
1648
1649define i8 @test_v8i8(<8 x i8> %a0) {
1650; SSE2-LABEL: test_v8i8:
1651; SSE2:       # %bb.0:
1652; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1653; SSE2-NEXT:    pmullw %xmm0, %xmm1
1654; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1655; SSE2-NEXT:    pmullw %xmm1, %xmm0
1656; SSE2-NEXT:    movdqa %xmm0, %xmm1
1657; SSE2-NEXT:    psrld $16, %xmm1
1658; SSE2-NEXT:    pmullw %xmm0, %xmm1
1659; SSE2-NEXT:    movd %xmm1, %eax
1660; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1661; SSE2-NEXT:    retq
1662;
1663; SSE41-LABEL: test_v8i8:
1664; SSE41:       # %bb.0:
1665; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1666; SSE41-NEXT:    pmullw %xmm0, %xmm1
1667; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1668; SSE41-NEXT:    pmullw %xmm1, %xmm0
1669; SSE41-NEXT:    movdqa %xmm0, %xmm1
1670; SSE41-NEXT:    psrld $16, %xmm1
1671; SSE41-NEXT:    pmullw %xmm0, %xmm1
1672; SSE41-NEXT:    pextrb $0, %xmm1, %eax
1673; SSE41-NEXT:    # kill: def $al killed $al killed $eax
1674; SSE41-NEXT:    retq
1675;
1676; AVX-LABEL: test_v8i8:
1677; AVX:       # %bb.0:
1678; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1679; AVX-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1680; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1681; AVX-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1682; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
1683; AVX-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1684; AVX-NEXT:    vpextrb $0, %xmm0, %eax
1685; AVX-NEXT:    # kill: def $al killed $al killed $eax
1686; AVX-NEXT:    retq
1687;
1688; AVX512-LABEL: test_v8i8:
1689; AVX512:       # %bb.0:
1690; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1691; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1692; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1693; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1694; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1695; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1696; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
1697; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1698; AVX512-NEXT:    retq
1699  %1 = call i8 @llvm.experimental.vector.reduce.mul.i8.v8i8(<8 x i8> %a0)
1700  ret i8 %1
1701}
1702
1703define i8 @test_v16i8(<16 x i8> %a0) {
1704; SSE2-LABEL: test_v16i8:
1705; SSE2:       # %bb.0:
1706; SSE2-NEXT:    movdqa %xmm0, %xmm1
1707; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
1708; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1709; SSE2-NEXT:    pmullw %xmm1, %xmm0
1710; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
1711; SSE2-NEXT:    pand %xmm1, %xmm0
1712; SSE2-NEXT:    pxor %xmm2, %xmm2
1713; SSE2-NEXT:    packuswb %xmm2, %xmm0
1714; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,2,3,3]
1715; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1716; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1717; SSE2-NEXT:    pmullw %xmm0, %xmm3
1718; SSE2-NEXT:    pand %xmm1, %xmm3
1719; SSE2-NEXT:    packuswb %xmm2, %xmm3
1720; SSE2-NEXT:    movdqa %xmm3, %xmm0
1721; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1722; SSE2-NEXT:    psrldq {{.*#+}} xmm3 = xmm3[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
1723; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1724; SSE2-NEXT:    pmullw %xmm0, %xmm3
1725; SSE2-NEXT:    pand %xmm1, %xmm3
1726; SSE2-NEXT:    packuswb %xmm2, %xmm3
1727; SSE2-NEXT:    movdqa %xmm3, %xmm0
1728; SSE2-NEXT:    psrlw $8, %xmm0
1729; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1730; SSE2-NEXT:    pmullw %xmm0, %xmm3
1731; SSE2-NEXT:    pand %xmm1, %xmm3
1732; SSE2-NEXT:    packuswb %xmm2, %xmm3
1733; SSE2-NEXT:    movd %xmm3, %eax
1734; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1735; SSE2-NEXT:    retq
1736;
1737; SSE41-LABEL: test_v16i8:
1738; SSE41:       # %bb.0:
1739; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1740; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1741; SSE41-NEXT:    pmullw %xmm1, %xmm0
1742; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
1743; SSE41-NEXT:    pand %xmm1, %xmm0
1744; SSE41-NEXT:    pxor %xmm2, %xmm2
1745; SSE41-NEXT:    packuswb %xmm2, %xmm0
1746; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1747; SSE41-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1748; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1749; SSE41-NEXT:    pmullw %xmm3, %xmm0
1750; SSE41-NEXT:    pand %xmm1, %xmm0
1751; SSE41-NEXT:    packuswb %xmm2, %xmm0
1752; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1753; SSE41-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1754; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1755; SSE41-NEXT:    pmullw %xmm3, %xmm0
1756; SSE41-NEXT:    pand %xmm1, %xmm0
1757; SSE41-NEXT:    packuswb %xmm2, %xmm0
1758; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1759; SSE41-NEXT:    psrlw $8, %xmm0
1760; SSE41-NEXT:    pmullw %xmm1, %xmm0
1761; SSE41-NEXT:    pextrb $0, %xmm0, %eax
1762; SSE41-NEXT:    # kill: def $al killed $al killed $eax
1763; SSE41-NEXT:    retq
1764;
1765; AVX1-LABEL: test_v16i8:
1766; AVX1:       # %bb.0:
1767; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1768; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1769; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1770; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
1771; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
1772; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1773; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
1774; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1775; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1776; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1777; AVX1-NEXT:    vpmullw %xmm0, %xmm3, %xmm0
1778; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
1779; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
1780; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1781; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1782; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1783; AVX1-NEXT:    vpmullw %xmm0, %xmm3, %xmm0
1784; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
1785; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
1786; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
1787; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1788; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1789; AVX1-NEXT:    vpextrb $0, %xmm0, %eax
1790; AVX1-NEXT:    # kill: def $al killed $al killed $eax
1791; AVX1-NEXT:    retq
1792;
1793; AVX2-LABEL: test_v16i8:
1794; AVX2:       # %bb.0:
1795; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1796; AVX2-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
1797; AVX2-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1798; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1799; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1800; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
1801; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
1802; AVX2-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
1803; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
1804; AVX2-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
1805; AVX2-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
1806; AVX2-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
1807; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
1808; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
1809; AVX2-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
1810; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm2
1811; AVX2-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
1812; AVX2-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
1813; AVX2-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
1814; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
1815; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1816; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
1817; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
1818; AVX2-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
1819; AVX2-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1820; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1821; AVX2-NEXT:    vpextrb $0, %xmm0, %eax
1822; AVX2-NEXT:    # kill: def $al killed $al killed $eax
1823; AVX2-NEXT:    vzeroupper
1824; AVX2-NEXT:    retq
1825;
1826; AVX512BW-LABEL: test_v16i8:
1827; AVX512BW:       # %bb.0:
1828; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1829; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
1830; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1831; AVX512BW-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1832; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm1
1833; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
1834; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1835; AVX512BW-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1836; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm1
1837; AVX512BW-NEXT:    vpsrld $16, %xmm1, %xmm1
1838; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1839; AVX512BW-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1840; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm1
1841; AVX512BW-NEXT:    vpsrlw $8, %xmm1, %xmm1
1842; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1843; AVX512BW-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1844; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
1845; AVX512BW-NEXT:    vpextrb $0, %xmm0, %eax
1846; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
1847; AVX512BW-NEXT:    vzeroupper
1848; AVX512BW-NEXT:    retq
1849;
1850; AVX512BWVL-LABEL: test_v16i8:
1851; AVX512BWVL:       # %bb.0:
1852; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1853; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
1854; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1855; AVX512BWVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1856; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm1
1857; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
1858; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1859; AVX512BWVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1860; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm1
1861; AVX512BWVL-NEXT:    vpsrld $16, %xmm1, %xmm1
1862; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1863; AVX512BWVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1864; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm1
1865; AVX512BWVL-NEXT:    vpsrlw $8, %xmm1, %xmm1
1866; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1867; AVX512BWVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1868; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm0
1869; AVX512BWVL-NEXT:    vpextrb $0, %xmm0, %eax
1870; AVX512BWVL-NEXT:    # kill: def $al killed $al killed $eax
1871; AVX512BWVL-NEXT:    vzeroupper
1872; AVX512BWVL-NEXT:    retq
1873;
1874; AVX512DQ-LABEL: test_v16i8:
1875; AVX512DQ:       # %bb.0:
1876; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1877; AVX512DQ-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
1878; AVX512DQ-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1879; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1880; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1881; AVX512DQ-NEXT:    vpmovdb %zmm1, %xmm1
1882; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
1883; AVX512DQ-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1884; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1885; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1886; AVX512DQ-NEXT:    vpmovdb %zmm1, %xmm1
1887; AVX512DQ-NEXT:    vpsrld $16, %xmm1, %xmm1
1888; AVX512DQ-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1889; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1890; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1891; AVX512DQ-NEXT:    vpmovdb %zmm1, %xmm1
1892; AVX512DQ-NEXT:    vpsrlw $8, %xmm1, %xmm1
1893; AVX512DQ-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1894; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1895; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1896; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
1897; AVX512DQ-NEXT:    vpextrb $0, %xmm0, %eax
1898; AVX512DQ-NEXT:    # kill: def $al killed $al killed $eax
1899; AVX512DQ-NEXT:    vzeroupper
1900; AVX512DQ-NEXT:    retq
1901;
1902; AVX512DQVL-LABEL: test_v16i8:
1903; AVX512DQVL:       # %bb.0:
1904; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1905; AVX512DQVL-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
1906; AVX512DQVL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1907; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1908; AVX512DQVL-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1909; AVX512DQVL-NEXT:    vpmovdb %zmm1, %xmm1
1910; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
1911; AVX512DQVL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1912; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1913; AVX512DQVL-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1914; AVX512DQVL-NEXT:    vpmovdb %zmm1, %xmm1
1915; AVX512DQVL-NEXT:    vpsrld $16, %xmm1, %xmm1
1916; AVX512DQVL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1917; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1918; AVX512DQVL-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1919; AVX512DQVL-NEXT:    vpmovdb %zmm1, %xmm1
1920; AVX512DQVL-NEXT:    vpsrlw $8, %xmm1, %xmm1
1921; AVX512DQVL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1922; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1923; AVX512DQVL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1924; AVX512DQVL-NEXT:    vpmovdb %zmm0, %xmm0
1925; AVX512DQVL-NEXT:    vpextrb $0, %xmm0, %eax
1926; AVX512DQVL-NEXT:    # kill: def $al killed $al killed $eax
1927; AVX512DQVL-NEXT:    vzeroupper
1928; AVX512DQVL-NEXT:    retq
1929  %1 = call i8 @llvm.experimental.vector.reduce.mul.i8.v16i8(<16 x i8> %a0)
1930  ret i8 %1
1931}
1932
1933define i8 @test_v32i8(<32 x i8> %a0) {
1934; SSE2-LABEL: test_v32i8:
1935; SSE2:       # %bb.0:
1936; SSE2-NEXT:    movdqa %xmm1, %xmm2
1937; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
1938; SSE2-NEXT:    movdqa %xmm0, %xmm3
1939; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]
1940; SSE2-NEXT:    pmullw %xmm2, %xmm3
1941; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
1942; SSE2-NEXT:    pand %xmm2, %xmm3
1943; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1944; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1945; SSE2-NEXT:    pmullw %xmm1, %xmm0
1946; SSE2-NEXT:    pand %xmm2, %xmm0
1947; SSE2-NEXT:    packuswb %xmm3, %xmm0
1948; SSE2-NEXT:    movdqa %xmm0, %xmm1
1949; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
1950; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1951; SSE2-NEXT:    pmullw %xmm1, %xmm0
1952; SSE2-NEXT:    pand %xmm2, %xmm0
1953; SSE2-NEXT:    pxor %xmm1, %xmm1
1954; SSE2-NEXT:    packuswb %xmm1, %xmm0
1955; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,2,3,3]
1956; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1957; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1958; SSE2-NEXT:    pmullw %xmm0, %xmm3
1959; SSE2-NEXT:    pand %xmm2, %xmm3
1960; SSE2-NEXT:    packuswb %xmm1, %xmm3
1961; SSE2-NEXT:    movdqa %xmm3, %xmm0
1962; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1963; SSE2-NEXT:    psrldq {{.*#+}} xmm3 = xmm3[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
1964; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1965; SSE2-NEXT:    pmullw %xmm0, %xmm3
1966; SSE2-NEXT:    pand %xmm2, %xmm3
1967; SSE2-NEXT:    packuswb %xmm1, %xmm3
1968; SSE2-NEXT:    movdqa %xmm3, %xmm0
1969; SSE2-NEXT:    psrlw $8, %xmm0
1970; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1971; SSE2-NEXT:    pmullw %xmm0, %xmm3
1972; SSE2-NEXT:    pand %xmm2, %xmm3
1973; SSE2-NEXT:    packuswb %xmm1, %xmm3
1974; SSE2-NEXT:    movd %xmm3, %eax
1975; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1976; SSE2-NEXT:    retq
1977;
1978; SSE41-LABEL: test_v32i8:
1979; SSE41:       # %bb.0:
1980; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
1981; SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
1982; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1983; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1984; SSE41-NEXT:    pmullw %xmm1, %xmm0
1985; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
1986; SSE41-NEXT:    pand %xmm1, %xmm0
1987; SSE41-NEXT:    pmullw %xmm2, %xmm3
1988; SSE41-NEXT:    pand %xmm1, %xmm3
1989; SSE41-NEXT:    packuswb %xmm0, %xmm3
1990; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
1991; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]
1992; SSE41-NEXT:    pmullw %xmm0, %xmm3
1993; SSE41-NEXT:    pand %xmm1, %xmm3
1994; SSE41-NEXT:    pxor %xmm0, %xmm0
1995; SSE41-NEXT:    packuswb %xmm0, %xmm3
1996; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
1997; SSE41-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1998; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[2,3,0,1]
1999; SSE41-NEXT:    pmullw %xmm2, %xmm3
2000; SSE41-NEXT:    pand %xmm1, %xmm3
2001; SSE41-NEXT:    packuswb %xmm0, %xmm3
2002; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
2003; SSE41-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2004; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,2,3]
2005; SSE41-NEXT:    pmullw %xmm2, %xmm3
2006; SSE41-NEXT:    pand %xmm1, %xmm3
2007; SSE41-NEXT:    packuswb %xmm0, %xmm3
2008; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
2009; SSE41-NEXT:    psrlw $8, %xmm3
2010; SSE41-NEXT:    pmullw %xmm0, %xmm3
2011; SSE41-NEXT:    pextrb $0, %xmm3, %eax
2012; SSE41-NEXT:    # kill: def $al killed $al killed $eax
2013; SSE41-NEXT:    retq
2014;
2015; AVX1-LABEL: test_v32i8:
2016; AVX1:       # %bb.0:
2017; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2018; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
2019; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2020; AVX1-NEXT:    vpmullw %xmm2, %xmm3, %xmm2
2021; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
2022; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
2023; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2024; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2025; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2026; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
2027; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
2028; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
2029; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2030; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2031; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2032; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
2033; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2034; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2035; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
2036; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2037; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
2038; AVX1-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
2039; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
2040; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2041; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm2
2042; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2043; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
2044; AVX1-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
2045; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
2046; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2047; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm2
2048; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2049; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
2050; AVX1-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
2051; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
2052; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2053; AVX1-NEXT:    vpextrb $0, %xmm0, %eax
2054; AVX1-NEXT:    # kill: def $al killed $al killed $eax
2055; AVX1-NEXT:    vzeroupper
2056; AVX1-NEXT:    retq
2057;
2058; AVX2-LABEL: test_v32i8:
2059; AVX2:       # %bb.0:
2060; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
2061; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm1 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2062; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15],ymm2[24],ymm0[24],ymm2[25],ymm0[25],ymm2[26],ymm0[26],ymm2[27],ymm0[27],ymm2[28],ymm0[28],ymm2[29],ymm0[29],ymm2[30],ymm0[30],ymm2[31],ymm0[31]
2063; AVX2-NEXT:    vpmullw %ymm3, %ymm1, %ymm3
2064; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2065; AVX2-NEXT:    vpand %ymm1, %ymm3, %ymm3
2066; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2067; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[16],ymm0[16],ymm2[17],ymm0[17],ymm2[18],ymm0[18],ymm2[19],ymm0[19],ymm2[20],ymm0[20],ymm2[21],ymm0[21],ymm2[22],ymm0[22],ymm2[23],ymm0[23]
2068; AVX2-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
2069; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
2070; AVX2-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
2071; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2072; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2073; AVX2-NEXT:    vpmullw %ymm0, %ymm2, %ymm0
2074; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
2075; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2076; AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
2077; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm3 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2078; AVX2-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2079; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
2080; AVX2-NEXT:    vpmullw %ymm0, %ymm3, %ymm0
2081; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
2082; AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
2083; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm3 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2084; AVX2-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2085; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
2086; AVX2-NEXT:    vpmullw %ymm0, %ymm3, %ymm0
2087; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
2088; AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
2089; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm3
2090; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2091; AVX2-NEXT:    vpmullw %ymm3, %ymm0, %ymm0
2092; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
2093; AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
2094; AVX2-NEXT:    vpextrb $0, %xmm0, %eax
2095; AVX2-NEXT:    # kill: def $al killed $al killed $eax
2096; AVX2-NEXT:    vzeroupper
2097; AVX2-NEXT:    retq
2098;
2099; AVX512BW-LABEL: test_v32i8:
2100; AVX512BW:       # %bb.0:
2101; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
2102; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
2103; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
2104; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2105; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm1
2106; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
2107; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
2108; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2109; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm1
2110; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
2111; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
2112; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2113; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm1
2114; AVX512BW-NEXT:    vpsrld $16, %xmm1, %xmm1
2115; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
2116; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2117; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm1
2118; AVX512BW-NEXT:    vpsrlw $8, %xmm1, %xmm1
2119; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
2120; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2121; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
2122; AVX512BW-NEXT:    vpextrb $0, %xmm0, %eax
2123; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
2124; AVX512BW-NEXT:    vzeroupper
2125; AVX512BW-NEXT:    retq
2126;
2127; AVX512BWVL-LABEL: test_v32i8:
2128; AVX512BWVL:       # %bb.0:
2129; AVX512BWVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
2130; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
2131; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
2132; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2133; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm1
2134; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
2135; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
2136; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2137; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm1
2138; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
2139; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
2140; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2141; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm1
2142; AVX512BWVL-NEXT:    vpsrld $16, %xmm1, %xmm1
2143; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
2144; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2145; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm1
2146; AVX512BWVL-NEXT:    vpsrlw $8, %xmm1, %xmm1
2147; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
2148; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2149; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm0
2150; AVX512BWVL-NEXT:    vpextrb $0, %xmm0, %eax
2151; AVX512BWVL-NEXT:    # kill: def $al killed $al killed $eax
2152; AVX512BWVL-NEXT:    vzeroupper
2153; AVX512BWVL-NEXT:    retq
2154;
2155; AVX512DQ-LABEL: test_v32i8:
2156; AVX512DQ:       # %bb.0:
2157; AVX512DQ-NEXT:    vextracti128 $1, %ymm0, %xmm2
2158; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} ymm1 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2159; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15],ymm2[24],ymm0[24],ymm2[25],ymm0[25],ymm2[26],ymm0[26],ymm2[27],ymm0[27],ymm2[28],ymm0[28],ymm2[29],ymm0[29],ymm2[30],ymm0[30],ymm2[31],ymm0[31]
2160; AVX512DQ-NEXT:    vpmullw %ymm3, %ymm1, %ymm3
2161; AVX512DQ-NEXT:    vmovdqa {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2162; AVX512DQ-NEXT:    vpand %ymm1, %ymm3, %ymm3
2163; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2164; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[16],ymm0[16],ymm2[17],ymm0[17],ymm2[18],ymm0[18],ymm2[19],ymm0[19],ymm2[20],ymm0[20],ymm2[21],ymm0[21],ymm2[22],ymm0[22],ymm2[23],ymm0[23]
2165; AVX512DQ-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
2166; AVX512DQ-NEXT:    vpand %ymm1, %ymm0, %ymm0
2167; AVX512DQ-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
2168; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2169; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2170; AVX512DQ-NEXT:    vpmullw %ymm0, %ymm2, %ymm0
2171; AVX512DQ-NEXT:    vpand %ymm1, %ymm0, %ymm0
2172; AVX512DQ-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2173; AVX512DQ-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
2174; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm3 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2175; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2176; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
2177; AVX512DQ-NEXT:    vpmullw %ymm0, %ymm3, %ymm0
2178; AVX512DQ-NEXT:    vpand %ymm1, %ymm0, %ymm0
2179; AVX512DQ-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
2180; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm3 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2181; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2182; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
2183; AVX512DQ-NEXT:    vpmullw %ymm0, %ymm3, %ymm0
2184; AVX512DQ-NEXT:    vpand %ymm1, %ymm0, %ymm0
2185; AVX512DQ-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
2186; AVX512DQ-NEXT:    vpsrlw $8, %xmm0, %xmm3
2187; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2188; AVX512DQ-NEXT:    vpmullw %ymm3, %ymm0, %ymm0
2189; AVX512DQ-NEXT:    vpand %ymm1, %ymm0, %ymm0
2190; AVX512DQ-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
2191; AVX512DQ-NEXT:    vpextrb $0, %xmm0, %eax
2192; AVX512DQ-NEXT:    # kill: def $al killed $al killed $eax
2193; AVX512DQ-NEXT:    vzeroupper
2194; AVX512DQ-NEXT:    retq
2195;
2196; AVX512DQVL-LABEL: test_v32i8:
2197; AVX512DQVL:       # %bb.0:
2198; AVX512DQVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
2199; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2200; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
2201; AVX512DQVL-NEXT:    vpmullw %ymm3, %ymm2, %ymm2
2202; AVX512DQVL-NEXT:    vmovdqa {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2203; AVX512DQVL-NEXT:    vpand %ymm3, %ymm2, %ymm2
2204; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2205; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
2206; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
2207; AVX512DQVL-NEXT:    vpand %ymm3, %ymm0, %ymm0
2208; AVX512DQVL-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
2209; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2210; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2211; AVX512DQVL-NEXT:    vpmullw %ymm0, %ymm1, %ymm0
2212; AVX512DQVL-NEXT:    vpand %ymm3, %ymm0, %ymm0
2213; AVX512DQVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2214; AVX512DQVL-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
2215; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2216; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2217; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
2218; AVX512DQVL-NEXT:    vpmullw %ymm0, %ymm2, %ymm0
2219; AVX512DQVL-NEXT:    vpand %ymm3, %ymm0, %ymm0
2220; AVX512DQVL-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
2221; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2222; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2223; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
2224; AVX512DQVL-NEXT:    vpmullw %ymm0, %ymm2, %ymm0
2225; AVX512DQVL-NEXT:    vpand %ymm3, %ymm0, %ymm0
2226; AVX512DQVL-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
2227; AVX512DQVL-NEXT:    vpsrlw $8, %xmm0, %xmm2
2228; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2229; AVX512DQVL-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
2230; AVX512DQVL-NEXT:    vpand %ymm3, %ymm0, %ymm0
2231; AVX512DQVL-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
2232; AVX512DQVL-NEXT:    vpextrb $0, %xmm0, %eax
2233; AVX512DQVL-NEXT:    # kill: def $al killed $al killed $eax
2234; AVX512DQVL-NEXT:    vzeroupper
2235; AVX512DQVL-NEXT:    retq
2236  %1 = call i8 @llvm.experimental.vector.reduce.mul.i8.v32i8(<32 x i8> %a0)
2237  ret i8 %1
2238}
2239
2240define i8 @test_v64i8(<64 x i8> %a0) {
2241; SSE2-LABEL: test_v64i8:
2242; SSE2:       # %bb.0:
2243; SSE2-NEXT:    movdqa %xmm2, %xmm4
2244; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15]
2245; SSE2-NEXT:    movdqa %xmm0, %xmm5
2246; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
2247; SSE2-NEXT:    pmullw %xmm4, %xmm5
2248; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
2249; SSE2-NEXT:    pand %xmm4, %xmm5
2250; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
2251; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2252; SSE2-NEXT:    pmullw %xmm2, %xmm0
2253; SSE2-NEXT:    pand %xmm4, %xmm0
2254; SSE2-NEXT:    packuswb %xmm5, %xmm0
2255; SSE2-NEXT:    movdqa %xmm3, %xmm2
2256; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
2257; SSE2-NEXT:    movdqa %xmm1, %xmm5
2258; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
2259; SSE2-NEXT:    pmullw %xmm2, %xmm5
2260; SSE2-NEXT:    pand %xmm4, %xmm5
2261; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
2262; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2263; SSE2-NEXT:    pmullw %xmm3, %xmm1
2264; SSE2-NEXT:    pand %xmm4, %xmm1
2265; SSE2-NEXT:    packuswb %xmm5, %xmm1
2266; SSE2-NEXT:    movdqa %xmm1, %xmm2
2267; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
2268; SSE2-NEXT:    movdqa %xmm0, %xmm3
2269; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]
2270; SSE2-NEXT:    pmullw %xmm2, %xmm3
2271; SSE2-NEXT:    pand %xmm4, %xmm3
2272; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2273; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2274; SSE2-NEXT:    pmullw %xmm1, %xmm0
2275; SSE2-NEXT:    pand %xmm4, %xmm0
2276; SSE2-NEXT:    packuswb %xmm3, %xmm0
2277; SSE2-NEXT:    movdqa %xmm0, %xmm1
2278; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
2279; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2280; SSE2-NEXT:    pmullw %xmm1, %xmm0
2281; SSE2-NEXT:    pand %xmm4, %xmm0
2282; SSE2-NEXT:    pxor %xmm1, %xmm1
2283; SSE2-NEXT:    packuswb %xmm1, %xmm0
2284; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,2,3,3]
2285; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2286; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
2287; SSE2-NEXT:    pmullw %xmm0, %xmm2
2288; SSE2-NEXT:    pand %xmm4, %xmm2
2289; SSE2-NEXT:    packuswb %xmm1, %xmm2
2290; SSE2-NEXT:    movdqa %xmm2, %xmm0
2291; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2292; SSE2-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
2293; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
2294; SSE2-NEXT:    pmullw %xmm0, %xmm2
2295; SSE2-NEXT:    pand %xmm4, %xmm2
2296; SSE2-NEXT:    packuswb %xmm1, %xmm2
2297; SSE2-NEXT:    movdqa %xmm2, %xmm0
2298; SSE2-NEXT:    psrlw $8, %xmm0
2299; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
2300; SSE2-NEXT:    pmullw %xmm0, %xmm2
2301; SSE2-NEXT:    pand %xmm4, %xmm2
2302; SSE2-NEXT:    packuswb %xmm1, %xmm2
2303; SSE2-NEXT:    movd %xmm2, %eax
2304; SSE2-NEXT:    # kill: def $al killed $al killed $eax
2305; SSE2-NEXT:    retq
2306;
2307; SSE41-LABEL: test_v64i8:
2308; SSE41:       # %bb.0:
2309; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm5 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
2310; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
2311; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm4 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2312; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2313; SSE41-NEXT:    pmullw %xmm2, %xmm0
2314; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
2315; SSE41-NEXT:    pand %xmm2, %xmm0
2316; SSE41-NEXT:    pmullw %xmm5, %xmm4
2317; SSE41-NEXT:    pand %xmm2, %xmm4
2318; SSE41-NEXT:    packuswb %xmm0, %xmm4
2319; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
2320; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]
2321; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm5 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2322; SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
2323; SSE41-NEXT:    pmullw %xmm3, %xmm1
2324; SSE41-NEXT:    pand %xmm2, %xmm1
2325; SSE41-NEXT:    pmullw %xmm0, %xmm5
2326; SSE41-NEXT:    pand %xmm2, %xmm5
2327; SSE41-NEXT:    packuswb %xmm1, %xmm5
2328; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
2329; SSE41-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
2330; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm1 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero
2331; SSE41-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15]
2332; SSE41-NEXT:    pmullw %xmm5, %xmm4
2333; SSE41-NEXT:    pand %xmm2, %xmm4
2334; SSE41-NEXT:    pmullw %xmm0, %xmm1
2335; SSE41-NEXT:    pand %xmm2, %xmm1
2336; SSE41-NEXT:    packuswb %xmm4, %xmm1
2337; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2338; SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
2339; SSE41-NEXT:    pmullw %xmm0, %xmm1
2340; SSE41-NEXT:    pand %xmm2, %xmm1
2341; SSE41-NEXT:    pxor %xmm0, %xmm0
2342; SSE41-NEXT:    packuswb %xmm0, %xmm1
2343; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2344; SSE41-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2345; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
2346; SSE41-NEXT:    pmullw %xmm3, %xmm1
2347; SSE41-NEXT:    pand %xmm2, %xmm1
2348; SSE41-NEXT:    packuswb %xmm0, %xmm1
2349; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2350; SSE41-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2351; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
2352; SSE41-NEXT:    pmullw %xmm3, %xmm1
2353; SSE41-NEXT:    pand %xmm2, %xmm1
2354; SSE41-NEXT:    packuswb %xmm0, %xmm1
2355; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2356; SSE41-NEXT:    psrlw $8, %xmm1
2357; SSE41-NEXT:    pmullw %xmm0, %xmm1
2358; SSE41-NEXT:    pextrb $0, %xmm1, %eax
2359; SSE41-NEXT:    # kill: def $al killed $al killed $eax
2360; SSE41-NEXT:    retq
2361;
2362; AVX1-LABEL: test_v64i8:
2363; AVX1:       # %bb.0:
2364; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
2365; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2366; AVX1-NEXT:    vpmullw %xmm2, %xmm3, %xmm3
2367; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
2368; AVX1-NEXT:    vpand %xmm2, %xmm3, %xmm3
2369; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm4 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2370; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2371; AVX1-NEXT:    vpmullw %xmm4, %xmm5, %xmm4
2372; AVX1-NEXT:    vpand %xmm2, %xmm4, %xmm4
2373; AVX1-NEXT:    vpackuswb %xmm3, %xmm4, %xmm3
2374; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2375; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
2376; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2377; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2378; AVX1-NEXT:    vpmullw %xmm4, %xmm5, %xmm4
2379; AVX1-NEXT:    vpand %xmm2, %xmm4, %xmm4
2380; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2381; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2382; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2383; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
2384; AVX1-NEXT:    vpackuswb %xmm4, %xmm0, %xmm0
2385; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2386; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]
2387; AVX1-NEXT:    vpmullw %xmm1, %xmm4, %xmm1
2388; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
2389; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2390; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
2391; AVX1-NEXT:    vpmullw %xmm0, %xmm3, %xmm0
2392; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
2393; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2394; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
2395; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2396; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2397; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2398; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
2399; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2400; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2401; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,2,3]
2402; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2403; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
2404; AVX1-NEXT:    vpmullw %xmm3, %xmm0, %xmm0
2405; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
2406; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2407; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm3
2408; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2409; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
2410; AVX1-NEXT:    vpmullw %xmm3, %xmm0, %xmm0
2411; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
2412; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2413; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm3
2414; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2415; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
2416; AVX1-NEXT:    vpmullw %xmm3, %xmm0, %xmm0
2417; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
2418; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2419; AVX1-NEXT:    vpextrb $0, %xmm0, %eax
2420; AVX1-NEXT:    # kill: def $al killed $al killed $eax
2421; AVX1-NEXT:    vzeroupper
2422; AVX1-NEXT:    retq
2423;
2424; AVX2-LABEL: test_v64i8:
2425; AVX2:       # %bb.0:
2426; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
2427; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2428; AVX2-NEXT:    vpmullw %ymm2, %ymm3, %ymm3
2429; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2430; AVX2-NEXT:    vpand %ymm2, %ymm3, %ymm3
2431; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
2432; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2433; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
2434; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
2435; AVX2-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
2436; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2437; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2438; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
2439; AVX2-NEXT:    vpmullw %ymm4, %ymm3, %ymm3
2440; AVX2-NEXT:    vpand %ymm2, %ymm3, %ymm3
2441; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2442; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
2443; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
2444; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
2445; AVX2-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
2446; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2447; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2448; AVX2-NEXT:    vpmullw %ymm0, %ymm1, %ymm0
2449; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
2450; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2451; AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
2452; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm3 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2453; AVX2-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2454; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
2455; AVX2-NEXT:    vpmullw %ymm0, %ymm3, %ymm0
2456; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
2457; AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
2458; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm3 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2459; AVX2-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2460; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
2461; AVX2-NEXT:    vpmullw %ymm0, %ymm3, %ymm0
2462; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
2463; AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
2464; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm3
2465; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2466; AVX2-NEXT:    vpmullw %ymm3, %ymm0, %ymm0
2467; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
2468; AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
2469; AVX2-NEXT:    vpextrb $0, %xmm0, %eax
2470; AVX2-NEXT:    # kill: def $al killed $al killed $eax
2471; AVX2-NEXT:    vzeroupper
2472; AVX2-NEXT:    retq
2473;
2474; AVX512BW-LABEL: test_v64i8:
2475; AVX512BW:       # %bb.0:
2476; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2477; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm2 = zmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]
2478; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm3 = zmm1[8],zmm0[8],zmm1[9],zmm0[9],zmm1[10],zmm0[10],zmm1[11],zmm0[11],zmm1[12],zmm0[12],zmm1[13],zmm0[13],zmm1[14],zmm0[14],zmm1[15],zmm0[15],zmm1[24],zmm0[24],zmm1[25],zmm0[25],zmm1[26],zmm0[26],zmm1[27],zmm0[27],zmm1[28],zmm0[28],zmm1[29],zmm0[29],zmm1[30],zmm0[30],zmm1[31],zmm0[31],zmm1[40],zmm0[40],zmm1[41],zmm0[41],zmm1[42],zmm0[42],zmm1[43],zmm0[43],zmm1[44],zmm0[44],zmm1[45],zmm0[45],zmm1[46],zmm0[46],zmm1[47],zmm0[47],zmm1[56],zmm0[56],zmm1[57],zmm0[57],zmm1[58],zmm0[58],zmm1[59],zmm0[59],zmm1[60],zmm0[60],zmm1[61],zmm0[61],zmm1[62],zmm0[62],zmm1[63],zmm0[63]
2479; AVX512BW-NEXT:    vpmullw %zmm3, %zmm2, %zmm2
2480; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2481; AVX512BW-NEXT:    vpandq %zmm3, %zmm2, %zmm2
2482; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
2483; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm0[0],zmm1[1],zmm0[1],zmm1[2],zmm0[2],zmm1[3],zmm0[3],zmm1[4],zmm0[4],zmm1[5],zmm0[5],zmm1[6],zmm0[6],zmm1[7],zmm0[7],zmm1[16],zmm0[16],zmm1[17],zmm0[17],zmm1[18],zmm0[18],zmm1[19],zmm0[19],zmm1[20],zmm0[20],zmm1[21],zmm0[21],zmm1[22],zmm0[22],zmm1[23],zmm0[23],zmm1[32],zmm0[32],zmm1[33],zmm0[33],zmm1[34],zmm0[34],zmm1[35],zmm0[35],zmm1[36],zmm0[36],zmm1[37],zmm0[37],zmm1[38],zmm0[38],zmm1[39],zmm0[39],zmm1[48],zmm0[48],zmm1[49],zmm0[49],zmm1[50],zmm0[50],zmm1[51],zmm0[51],zmm1[52],zmm0[52],zmm1[53],zmm0[53],zmm1[54],zmm0[54],zmm1[55],zmm0[55]
2484; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2485; AVX512BW-NEXT:    vpandq %zmm3, %zmm0, %zmm0
2486; AVX512BW-NEXT:    vpackuswb %zmm2, %zmm0, %zmm0
2487; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
2488; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm2 = zmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]
2489; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm4 = zmm1[8],zmm0[8],zmm1[9],zmm0[9],zmm1[10],zmm0[10],zmm1[11],zmm0[11],zmm1[12],zmm0[12],zmm1[13],zmm0[13],zmm1[14],zmm0[14],zmm1[15],zmm0[15],zmm1[24],zmm0[24],zmm1[25],zmm0[25],zmm1[26],zmm0[26],zmm1[27],zmm0[27],zmm1[28],zmm0[28],zmm1[29],zmm0[29],zmm1[30],zmm0[30],zmm1[31],zmm0[31],zmm1[40],zmm0[40],zmm1[41],zmm0[41],zmm1[42],zmm0[42],zmm1[43],zmm0[43],zmm1[44],zmm0[44],zmm1[45],zmm0[45],zmm1[46],zmm0[46],zmm1[47],zmm0[47],zmm1[56],zmm0[56],zmm1[57],zmm0[57],zmm1[58],zmm0[58],zmm1[59],zmm0[59],zmm1[60],zmm0[60],zmm1[61],zmm0[61],zmm1[62],zmm0[62],zmm1[63],zmm0[63]
2490; AVX512BW-NEXT:    vpmullw %zmm4, %zmm2, %zmm2
2491; AVX512BW-NEXT:    vpandq %zmm3, %zmm2, %zmm2
2492; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
2493; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm0[0],zmm1[1],zmm0[1],zmm1[2],zmm0[2],zmm1[3],zmm0[3],zmm1[4],zmm0[4],zmm1[5],zmm0[5],zmm1[6],zmm0[6],zmm1[7],zmm0[7],zmm1[16],zmm0[16],zmm1[17],zmm0[17],zmm1[18],zmm0[18],zmm1[19],zmm0[19],zmm1[20],zmm0[20],zmm1[21],zmm0[21],zmm1[22],zmm0[22],zmm1[23],zmm0[23],zmm1[32],zmm0[32],zmm1[33],zmm0[33],zmm1[34],zmm0[34],zmm1[35],zmm0[35],zmm1[36],zmm0[36],zmm1[37],zmm0[37],zmm1[38],zmm0[38],zmm1[39],zmm0[39],zmm1[48],zmm0[48],zmm1[49],zmm0[49],zmm1[50],zmm0[50],zmm1[51],zmm0[51],zmm1[52],zmm0[52],zmm1[53],zmm0[53],zmm1[54],zmm0[54],zmm1[55],zmm0[55]
2494; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2495; AVX512BW-NEXT:    vpandq %zmm3, %zmm0, %zmm0
2496; AVX512BW-NEXT:    vpackuswb %zmm2, %zmm0, %zmm0
2497; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
2498; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2499; AVX512BW-NEXT:    vpmullw %zmm0, %zmm1, %zmm0
2500; AVX512BW-NEXT:    vpandq %zmm3, %zmm0, %zmm0
2501; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2502; AVX512BW-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0
2503; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm2 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
2504; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2505; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
2506; AVX512BW-NEXT:    vpmullw %zmm0, %zmm2, %zmm0
2507; AVX512BW-NEXT:    vpandq %zmm3, %zmm0, %zmm0
2508; AVX512BW-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0
2509; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm2 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
2510; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2511; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
2512; AVX512BW-NEXT:    vpmullw %zmm0, %zmm2, %zmm0
2513; AVX512BW-NEXT:    vpandq %zmm3, %zmm0, %zmm0
2514; AVX512BW-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0
2515; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm2
2516; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
2517; AVX512BW-NEXT:    vpmullw %zmm2, %zmm0, %zmm0
2518; AVX512BW-NEXT:    vpandq %zmm3, %zmm0, %zmm0
2519; AVX512BW-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0
2520; AVX512BW-NEXT:    vpextrb $0, %xmm0, %eax
2521; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
2522; AVX512BW-NEXT:    vzeroupper
2523; AVX512BW-NEXT:    retq
2524;
2525; AVX512BWVL-LABEL: test_v64i8:
2526; AVX512BWVL:       # %bb.0:
2527; AVX512BWVL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2528; AVX512BWVL-NEXT:    vpunpckhbw {{.*#+}} zmm2 = zmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]
2529; AVX512BWVL-NEXT:    vpunpckhbw {{.*#+}} zmm3 = zmm1[8],zmm0[8],zmm1[9],zmm0[9],zmm1[10],zmm0[10],zmm1[11],zmm0[11],zmm1[12],zmm0[12],zmm1[13],zmm0[13],zmm1[14],zmm0[14],zmm1[15],zmm0[15],zmm1[24],zmm0[24],zmm1[25],zmm0[25],zmm1[26],zmm0[26],zmm1[27],zmm0[27],zmm1[28],zmm0[28],zmm1[29],zmm0[29],zmm1[30],zmm0[30],zmm1[31],zmm0[31],zmm1[40],zmm0[40],zmm1[41],zmm0[41],zmm1[42],zmm0[42],zmm1[43],zmm0[43],zmm1[44],zmm0[44],zmm1[45],zmm0[45],zmm1[46],zmm0[46],zmm1[47],zmm0[47],zmm1[56],zmm0[56],zmm1[57],zmm0[57],zmm1[58],zmm0[58],zmm1[59],zmm0[59],zmm1[60],zmm0[60],zmm1[61],zmm0[61],zmm1[62],zmm0[62],zmm1[63],zmm0[63]
2530; AVX512BWVL-NEXT:    vpmullw %zmm3, %zmm2, %zmm2
2531; AVX512BWVL-NEXT:    vmovdqa64 {{.*#+}} zmm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2532; AVX512BWVL-NEXT:    vpandq %zmm3, %zmm2, %zmm2
2533; AVX512BWVL-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
2534; AVX512BWVL-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm0[0],zmm1[1],zmm0[1],zmm1[2],zmm0[2],zmm1[3],zmm0[3],zmm1[4],zmm0[4],zmm1[5],zmm0[5],zmm1[6],zmm0[6],zmm1[7],zmm0[7],zmm1[16],zmm0[16],zmm1[17],zmm0[17],zmm1[18],zmm0[18],zmm1[19],zmm0[19],zmm1[20],zmm0[20],zmm1[21],zmm0[21],zmm1[22],zmm0[22],zmm1[23],zmm0[23],zmm1[32],zmm0[32],zmm1[33],zmm0[33],zmm1[34],zmm0[34],zmm1[35],zmm0[35],zmm1[36],zmm0[36],zmm1[37],zmm0[37],zmm1[38],zmm0[38],zmm1[39],zmm0[39],zmm1[48],zmm0[48],zmm1[49],zmm0[49],zmm1[50],zmm0[50],zmm1[51],zmm0[51],zmm1[52],zmm0[52],zmm1[53],zmm0[53],zmm1[54],zmm0[54],zmm1[55],zmm0[55]
2535; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2536; AVX512BWVL-NEXT:    vpandq %zmm3, %zmm0, %zmm0
2537; AVX512BWVL-NEXT:    vpackuswb %zmm2, %zmm0, %zmm0
2538; AVX512BWVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
2539; AVX512BWVL-NEXT:    vpunpckhbw {{.*#+}} zmm2 = zmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]
2540; AVX512BWVL-NEXT:    vpunpckhbw {{.*#+}} zmm4 = zmm1[8],zmm0[8],zmm1[9],zmm0[9],zmm1[10],zmm0[10],zmm1[11],zmm0[11],zmm1[12],zmm0[12],zmm1[13],zmm0[13],zmm1[14],zmm0[14],zmm1[15],zmm0[15],zmm1[24],zmm0[24],zmm1[25],zmm0[25],zmm1[26],zmm0[26],zmm1[27],zmm0[27],zmm1[28],zmm0[28],zmm1[29],zmm0[29],zmm1[30],zmm0[30],zmm1[31],zmm0[31],zmm1[40],zmm0[40],zmm1[41],zmm0[41],zmm1[42],zmm0[42],zmm1[43],zmm0[43],zmm1[44],zmm0[44],zmm1[45],zmm0[45],zmm1[46],zmm0[46],zmm1[47],zmm0[47],zmm1[56],zmm0[56],zmm1[57],zmm0[57],zmm1[58],zmm0[58],zmm1[59],zmm0[59],zmm1[60],zmm0[60],zmm1[61],zmm0[61],zmm1[62],zmm0[62],zmm1[63],zmm0[63]
2541; AVX512BWVL-NEXT:    vpmullw %zmm4, %zmm2, %zmm2
2542; AVX512BWVL-NEXT:    vpandq %zmm3, %zmm2, %zmm2
2543; AVX512BWVL-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
2544; AVX512BWVL-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm0[0],zmm1[1],zmm0[1],zmm1[2],zmm0[2],zmm1[3],zmm0[3],zmm1[4],zmm0[4],zmm1[5],zmm0[5],zmm1[6],zmm0[6],zmm1[7],zmm0[7],zmm1[16],zmm0[16],zmm1[17],zmm0[17],zmm1[18],zmm0[18],zmm1[19],zmm0[19],zmm1[20],zmm0[20],zmm1[21],zmm0[21],zmm1[22],zmm0[22],zmm1[23],zmm0[23],zmm1[32],zmm0[32],zmm1[33],zmm0[33],zmm1[34],zmm0[34],zmm1[35],zmm0[35],zmm1[36],zmm0[36],zmm1[37],zmm0[37],zmm1[38],zmm0[38],zmm1[39],zmm0[39],zmm1[48],zmm0[48],zmm1[49],zmm0[49],zmm1[50],zmm0[50],zmm1[51],zmm0[51],zmm1[52],zmm0[52],zmm1[53],zmm0[53],zmm1[54],zmm0[54],zmm1[55],zmm0[55]
2545; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2546; AVX512BWVL-NEXT:    vpandq %zmm3, %zmm0, %zmm0
2547; AVX512BWVL-NEXT:    vpackuswb %zmm2, %zmm0, %zmm0
2548; AVX512BWVL-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
2549; AVX512BWVL-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2550; AVX512BWVL-NEXT:    vpmullw %zmm0, %zmm1, %zmm0
2551; AVX512BWVL-NEXT:    vpandq %zmm3, %zmm0, %zmm0
2552; AVX512BWVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2553; AVX512BWVL-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0
2554; AVX512BWVL-NEXT:    vpunpcklbw {{.*#+}} zmm2 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
2555; AVX512BWVL-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2556; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
2557; AVX512BWVL-NEXT:    vpmullw %zmm0, %zmm2, %zmm0
2558; AVX512BWVL-NEXT:    vpandq %zmm3, %zmm0, %zmm0
2559; AVX512BWVL-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0
2560; AVX512BWVL-NEXT:    vpunpcklbw {{.*#+}} zmm2 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
2561; AVX512BWVL-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2562; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
2563; AVX512BWVL-NEXT:    vpmullw %zmm0, %zmm2, %zmm0
2564; AVX512BWVL-NEXT:    vpandq %zmm3, %zmm0, %zmm0
2565; AVX512BWVL-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0
2566; AVX512BWVL-NEXT:    vpsrlw $8, %xmm0, %xmm2
2567; AVX512BWVL-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
2568; AVX512BWVL-NEXT:    vpmullw %zmm2, %zmm0, %zmm0
2569; AVX512BWVL-NEXT:    vpandq %zmm3, %zmm0, %zmm0
2570; AVX512BWVL-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0
2571; AVX512BWVL-NEXT:    vpextrb $0, %xmm0, %eax
2572; AVX512BWVL-NEXT:    # kill: def $al killed $al killed $eax
2573; AVX512BWVL-NEXT:    vzeroupper
2574; AVX512BWVL-NEXT:    retq
2575;
2576; AVX512DQ-LABEL: test_v64i8:
2577; AVX512DQ:       # %bb.0:
2578; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
2579; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2580; AVX512DQ-NEXT:    vpmullw %ymm2, %ymm3, %ymm3
2581; AVX512DQ-NEXT:    vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2582; AVX512DQ-NEXT:    vpand %ymm2, %ymm3, %ymm3
2583; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
2584; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2585; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
2586; AVX512DQ-NEXT:    vpand %ymm2, %ymm0, %ymm0
2587; AVX512DQ-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
2588; AVX512DQ-NEXT:    vextracti128 $1, %ymm0, %xmm1
2589; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2590; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
2591; AVX512DQ-NEXT:    vpmullw %ymm4, %ymm3, %ymm3
2592; AVX512DQ-NEXT:    vpand %ymm2, %ymm3, %ymm3
2593; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2594; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
2595; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
2596; AVX512DQ-NEXT:    vpand %ymm2, %ymm0, %ymm0
2597; AVX512DQ-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
2598; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2599; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2600; AVX512DQ-NEXT:    vpmullw %ymm0, %ymm1, %ymm0
2601; AVX512DQ-NEXT:    vpand %ymm2, %ymm0, %ymm0
2602; AVX512DQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2603; AVX512DQ-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
2604; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm3 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2605; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2606; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
2607; AVX512DQ-NEXT:    vpmullw %ymm0, %ymm3, %ymm0
2608; AVX512DQ-NEXT:    vpand %ymm2, %ymm0, %ymm0
2609; AVX512DQ-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
2610; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm3 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2611; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2612; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
2613; AVX512DQ-NEXT:    vpmullw %ymm0, %ymm3, %ymm0
2614; AVX512DQ-NEXT:    vpand %ymm2, %ymm0, %ymm0
2615; AVX512DQ-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
2616; AVX512DQ-NEXT:    vpsrlw $8, %xmm0, %xmm3
2617; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2618; AVX512DQ-NEXT:    vpmullw %ymm3, %ymm0, %ymm0
2619; AVX512DQ-NEXT:    vpand %ymm2, %ymm0, %ymm0
2620; AVX512DQ-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
2621; AVX512DQ-NEXT:    vpextrb $0, %xmm0, %eax
2622; AVX512DQ-NEXT:    # kill: def $al killed $al killed $eax
2623; AVX512DQ-NEXT:    vzeroupper
2624; AVX512DQ-NEXT:    retq
2625;
2626; AVX512DQVL-LABEL: test_v64i8:
2627; AVX512DQVL:       # %bb.0:
2628; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
2629; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2630; AVX512DQVL-NEXT:    vpmullw %ymm2, %ymm3, %ymm2
2631; AVX512DQVL-NEXT:    vmovdqa {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2632; AVX512DQVL-NEXT:    vpand %ymm3, %ymm2, %ymm2
2633; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
2634; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2635; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
2636; AVX512DQVL-NEXT:    vpand %ymm3, %ymm0, %ymm0
2637; AVX512DQVL-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
2638; AVX512DQVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
2639; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2640; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
2641; AVX512DQVL-NEXT:    vpmullw %ymm4, %ymm2, %ymm2
2642; AVX512DQVL-NEXT:    vpand %ymm3, %ymm2, %ymm2
2643; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2644; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
2645; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
2646; AVX512DQVL-NEXT:    vpand %ymm3, %ymm0, %ymm0
2647; AVX512DQVL-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
2648; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2649; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2650; AVX512DQVL-NEXT:    vpmullw %ymm0, %ymm1, %ymm0
2651; AVX512DQVL-NEXT:    vpand %ymm3, %ymm0, %ymm0
2652; AVX512DQVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2653; AVX512DQVL-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
2654; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2655; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2656; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
2657; AVX512DQVL-NEXT:    vpmullw %ymm0, %ymm2, %ymm0
2658; AVX512DQVL-NEXT:    vpand %ymm3, %ymm0, %ymm0
2659; AVX512DQVL-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
2660; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2661; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2662; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
2663; AVX512DQVL-NEXT:    vpmullw %ymm0, %ymm2, %ymm0
2664; AVX512DQVL-NEXT:    vpand %ymm3, %ymm0, %ymm0
2665; AVX512DQVL-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
2666; AVX512DQVL-NEXT:    vpsrlw $8, %xmm0, %xmm2
2667; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2668; AVX512DQVL-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
2669; AVX512DQVL-NEXT:    vpand %ymm3, %ymm0, %ymm0
2670; AVX512DQVL-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
2671; AVX512DQVL-NEXT:    vpextrb $0, %xmm0, %eax
2672; AVX512DQVL-NEXT:    # kill: def $al killed $al killed $eax
2673; AVX512DQVL-NEXT:    vzeroupper
2674; AVX512DQVL-NEXT:    retq
2675  %1 = call i8 @llvm.experimental.vector.reduce.mul.i8.v64i8(<64 x i8> %a0)
2676  ret i8 %1
2677}
2678
2679define i8 @test_v128i8(<128 x i8> %a0) {
2680; SSE2-LABEL: test_v128i8:
2681; SSE2:       # %bb.0:
2682; SSE2-NEXT:    movdqa %xmm5, %xmm8
2683; SSE2-NEXT:    punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm0[8],xmm8[9],xmm0[9],xmm8[10],xmm0[10],xmm8[11],xmm0[11],xmm8[12],xmm0[12],xmm8[13],xmm0[13],xmm8[14],xmm0[14],xmm8[15],xmm0[15]
2684; SSE2-NEXT:    movdqa %xmm1, %xmm9
2685; SSE2-NEXT:    punpckhbw {{.*#+}} xmm9 = xmm9[8],xmm0[8],xmm9[9],xmm0[9],xmm9[10],xmm0[10],xmm9[11],xmm0[11],xmm9[12],xmm0[12],xmm9[13],xmm0[13],xmm9[14],xmm0[14],xmm9[15],xmm0[15]
2686; SSE2-NEXT:    pmullw %xmm8, %xmm9
2687; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255,255,255,255,255,255,255]
2688; SSE2-NEXT:    pand %xmm8, %xmm9
2689; SSE2-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1],xmm5[2],xmm0[2],xmm5[3],xmm0[3],xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7]
2690; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2691; SSE2-NEXT:    pmullw %xmm5, %xmm1
2692; SSE2-NEXT:    pand %xmm8, %xmm1
2693; SSE2-NEXT:    packuswb %xmm9, %xmm1
2694; SSE2-NEXT:    movdqa %xmm7, %xmm9
2695; SSE2-NEXT:    punpckhbw {{.*#+}} xmm9 = xmm9[8],xmm0[8],xmm9[9],xmm0[9],xmm9[10],xmm0[10],xmm9[11],xmm0[11],xmm9[12],xmm0[12],xmm9[13],xmm0[13],xmm9[14],xmm0[14],xmm9[15],xmm0[15]
2696; SSE2-NEXT:    movdqa %xmm3, %xmm5
2697; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
2698; SSE2-NEXT:    pmullw %xmm9, %xmm5
2699; SSE2-NEXT:    pand %xmm8, %xmm5
2700; SSE2-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm0[0],xmm7[1],xmm0[1],xmm7[2],xmm0[2],xmm7[3],xmm0[3],xmm7[4],xmm0[4],xmm7[5],xmm0[5],xmm7[6],xmm0[6],xmm7[7],xmm0[7]
2701; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
2702; SSE2-NEXT:    pmullw %xmm7, %xmm3
2703; SSE2-NEXT:    pand %xmm8, %xmm3
2704; SSE2-NEXT:    packuswb %xmm5, %xmm3
2705; SSE2-NEXT:    movdqa %xmm4, %xmm5
2706; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
2707; SSE2-NEXT:    movdqa %xmm0, %xmm7
2708; SSE2-NEXT:    punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm0[8],xmm7[9],xmm0[9],xmm7[10],xmm0[10],xmm7[11],xmm0[11],xmm7[12],xmm0[12],xmm7[13],xmm0[13],xmm7[14],xmm0[14],xmm7[15],xmm0[15]
2709; SSE2-NEXT:    pmullw %xmm5, %xmm7
2710; SSE2-NEXT:    pand %xmm8, %xmm7
2711; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]
2712; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2713; SSE2-NEXT:    pmullw %xmm4, %xmm0
2714; SSE2-NEXT:    pand %xmm8, %xmm0
2715; SSE2-NEXT:    packuswb %xmm7, %xmm0
2716; SSE2-NEXT:    movdqa %xmm6, %xmm4
2717; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15]
2718; SSE2-NEXT:    movdqa %xmm2, %xmm5
2719; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
2720; SSE2-NEXT:    pmullw %xmm4, %xmm5
2721; SSE2-NEXT:    pand %xmm8, %xmm5
2722; SSE2-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm0[0],xmm6[1],xmm0[1],xmm6[2],xmm0[2],xmm6[3],xmm0[3],xmm6[4],xmm0[4],xmm6[5],xmm0[5],xmm6[6],xmm0[6],xmm6[7],xmm0[7]
2723; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
2724; SSE2-NEXT:    pmullw %xmm6, %xmm2
2725; SSE2-NEXT:    pand %xmm8, %xmm2
2726; SSE2-NEXT:    packuswb %xmm5, %xmm2
2727; SSE2-NEXT:    movdqa %xmm2, %xmm4
2728; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15]
2729; SSE2-NEXT:    movdqa %xmm0, %xmm5
2730; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
2731; SSE2-NEXT:    pmullw %xmm4, %xmm5
2732; SSE2-NEXT:    pand %xmm8, %xmm5
2733; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
2734; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2735; SSE2-NEXT:    pmullw %xmm2, %xmm0
2736; SSE2-NEXT:    pand %xmm8, %xmm0
2737; SSE2-NEXT:    packuswb %xmm5, %xmm0
2738; SSE2-NEXT:    movdqa %xmm3, %xmm2
2739; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
2740; SSE2-NEXT:    movdqa %xmm1, %xmm4
2741; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15]
2742; SSE2-NEXT:    pmullw %xmm2, %xmm4
2743; SSE2-NEXT:    pand %xmm8, %xmm4
2744; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
2745; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2746; SSE2-NEXT:    pmullw %xmm3, %xmm1
2747; SSE2-NEXT:    pand %xmm8, %xmm1
2748; SSE2-NEXT:    packuswb %xmm4, %xmm1
2749; SSE2-NEXT:    movdqa %xmm1, %xmm2
2750; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
2751; SSE2-NEXT:    movdqa %xmm0, %xmm3
2752; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]
2753; SSE2-NEXT:    pmullw %xmm2, %xmm3
2754; SSE2-NEXT:    pand %xmm8, %xmm3
2755; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2756; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2757; SSE2-NEXT:    pmullw %xmm1, %xmm0
2758; SSE2-NEXT:    pand %xmm8, %xmm0
2759; SSE2-NEXT:    packuswb %xmm3, %xmm0
2760; SSE2-NEXT:    movdqa %xmm0, %xmm1
2761; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
2762; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2763; SSE2-NEXT:    pmullw %xmm1, %xmm0
2764; SSE2-NEXT:    pand %xmm8, %xmm0
2765; SSE2-NEXT:    pxor %xmm1, %xmm1
2766; SSE2-NEXT:    packuswb %xmm1, %xmm0
2767; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,2,3,3]
2768; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2769; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
2770; SSE2-NEXT:    pmullw %xmm0, %xmm2
2771; SSE2-NEXT:    pand %xmm8, %xmm2
2772; SSE2-NEXT:    packuswb %xmm1, %xmm2
2773; SSE2-NEXT:    movdqa %xmm2, %xmm0
2774; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2775; SSE2-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
2776; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
2777; SSE2-NEXT:    pmullw %xmm0, %xmm2
2778; SSE2-NEXT:    pand %xmm8, %xmm2
2779; SSE2-NEXT:    packuswb %xmm1, %xmm2
2780; SSE2-NEXT:    movdqa %xmm2, %xmm0
2781; SSE2-NEXT:    psrlw $8, %xmm0
2782; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
2783; SSE2-NEXT:    pmullw %xmm0, %xmm2
2784; SSE2-NEXT:    pand %xmm8, %xmm2
2785; SSE2-NEXT:    packuswb %xmm1, %xmm2
2786; SSE2-NEXT:    movd %xmm2, %eax
2787; SSE2-NEXT:    # kill: def $al killed $al killed $eax
2788; SSE2-NEXT:    retq
2789;
2790; SSE41-LABEL: test_v128i8:
2791; SSE41:       # %bb.0:
2792; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm9 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
2793; SSE41-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
2794; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm8 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2795; SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
2796; SSE41-NEXT:    pmullw %xmm5, %xmm1
2797; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255]
2798; SSE41-NEXT:    pand %xmm5, %xmm1
2799; SSE41-NEXT:    pmullw %xmm9, %xmm8
2800; SSE41-NEXT:    pand %xmm5, %xmm8
2801; SSE41-NEXT:    packuswb %xmm1, %xmm8
2802; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm9 = xmm7[0],zero,xmm7[1],zero,xmm7[2],zero,xmm7[3],zero,xmm7[4],zero,xmm7[5],zero,xmm7[6],zero,xmm7[7],zero
2803; SSE41-NEXT:    punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm0[8],xmm7[9],xmm0[9],xmm7[10],xmm0[10],xmm7[11],xmm0[11],xmm7[12],xmm0[12],xmm7[13],xmm0[13],xmm7[14],xmm0[14],xmm7[15],xmm0[15]
2804; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm1 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
2805; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]
2806; SSE41-NEXT:    pmullw %xmm7, %xmm3
2807; SSE41-NEXT:    pand %xmm5, %xmm3
2808; SSE41-NEXT:    pmullw %xmm9, %xmm1
2809; SSE41-NEXT:    pand %xmm5, %xmm1
2810; SSE41-NEXT:    packuswb %xmm3, %xmm1
2811; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm7 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero
2812; SSE41-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15]
2813; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2814; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2815; SSE41-NEXT:    pmullw %xmm4, %xmm0
2816; SSE41-NEXT:    pand %xmm5, %xmm0
2817; SSE41-NEXT:    pmullw %xmm7, %xmm3
2818; SSE41-NEXT:    pand %xmm5, %xmm3
2819; SSE41-NEXT:    packuswb %xmm0, %xmm3
2820; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm6[0],zero,xmm6[1],zero,xmm6[2],zero,xmm6[3],zero,xmm6[4],zero,xmm6[5],zero,xmm6[6],zero,xmm6[7],zero
2821; SSE41-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
2822; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm4 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
2823; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
2824; SSE41-NEXT:    pmullw %xmm6, %xmm2
2825; SSE41-NEXT:    pand %xmm5, %xmm2
2826; SSE41-NEXT:    pmullw %xmm0, %xmm4
2827; SSE41-NEXT:    pand %xmm5, %xmm4
2828; SSE41-NEXT:    packuswb %xmm2, %xmm4
2829; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm2 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero
2830; SSE41-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15]
2831; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
2832; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]
2833; SSE41-NEXT:    pmullw %xmm4, %xmm3
2834; SSE41-NEXT:    pand %xmm5, %xmm3
2835; SSE41-NEXT:    pmullw %xmm2, %xmm0
2836; SSE41-NEXT:    pand %xmm5, %xmm0
2837; SSE41-NEXT:    packuswb %xmm3, %xmm0
2838; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2839; SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
2840; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = xmm8[0],zero,xmm8[1],zero,xmm8[2],zero,xmm8[3],zero,xmm8[4],zero,xmm8[5],zero,xmm8[6],zero,xmm8[7],zero
2841; SSE41-NEXT:    punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm0[8],xmm8[9],xmm0[9],xmm8[10],xmm0[10],xmm8[11],xmm0[11],xmm8[12],xmm0[12],xmm8[13],xmm0[13],xmm8[14],xmm0[14],xmm8[15],xmm0[15]
2842; SSE41-NEXT:    pmullw %xmm1, %xmm8
2843; SSE41-NEXT:    pand %xmm5, %xmm8
2844; SSE41-NEXT:    pmullw %xmm2, %xmm3
2845; SSE41-NEXT:    pand %xmm5, %xmm3
2846; SSE41-NEXT:    packuswb %xmm8, %xmm3
2847; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm1 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
2848; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]
2849; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2850; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2851; SSE41-NEXT:    pmullw %xmm3, %xmm0
2852; SSE41-NEXT:    pand %xmm5, %xmm0
2853; SSE41-NEXT:    pmullw %xmm1, %xmm2
2854; SSE41-NEXT:    pand %xmm5, %xmm2
2855; SSE41-NEXT:    packuswb %xmm0, %xmm2
2856; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
2857; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
2858; SSE41-NEXT:    pmullw %xmm0, %xmm2
2859; SSE41-NEXT:    pand %xmm5, %xmm2
2860; SSE41-NEXT:    pxor %xmm0, %xmm0
2861; SSE41-NEXT:    packuswb %xmm0, %xmm2
2862; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm1 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
2863; SSE41-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2864; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
2865; SSE41-NEXT:    pmullw %xmm1, %xmm2
2866; SSE41-NEXT:    pand %xmm5, %xmm2
2867; SSE41-NEXT:    packuswb %xmm0, %xmm2
2868; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm1 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
2869; SSE41-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2870; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,2,3]
2871; SSE41-NEXT:    pmullw %xmm1, %xmm2
2872; SSE41-NEXT:    pand %xmm5, %xmm2
2873; SSE41-NEXT:    packuswb %xmm0, %xmm2
2874; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
2875; SSE41-NEXT:    psrlw $8, %xmm2
2876; SSE41-NEXT:    pmullw %xmm0, %xmm2
2877; SSE41-NEXT:    pextrb $0, %xmm2, %eax
2878; SSE41-NEXT:    # kill: def $al killed $al killed $eax
2879; SSE41-NEXT:    retq
2880;
2881; AVX1-LABEL: test_v128i8:
2882; AVX1:       # %bb.0:
2883; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
2884; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
2885; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
2886; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
2887; AVX1-NEXT:    vpmullw %xmm4, %xmm7, %xmm7
2888; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
2889; AVX1-NEXT:    vpand %xmm4, %xmm7, %xmm7
2890; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
2891; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm6 = xmm6[0],zero,xmm6[1],zero,xmm6[2],zero,xmm6[3],zero,xmm6[4],zero,xmm6[5],zero,xmm6[6],zero,xmm6[7],zero
2892; AVX1-NEXT:    vpmullw %xmm5, %xmm6, %xmm5
2893; AVX1-NEXT:    vpand %xmm4, %xmm5, %xmm5
2894; AVX1-NEXT:    vpackuswb %xmm7, %xmm5, %xmm8
2895; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm6
2896; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm9 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
2897; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
2898; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
2899; AVX1-NEXT:    vpmullw %xmm9, %xmm7, %xmm7
2900; AVX1-NEXT:    vpand %xmm4, %xmm7, %xmm7
2901; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm6 = xmm6[0],zero,xmm6[1],zero,xmm6[2],zero,xmm6[3],zero,xmm6[4],zero,xmm6[5],zero,xmm6[6],zero,xmm6[7],zero
2902; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
2903; AVX1-NEXT:    vpmullw %xmm6, %xmm5, %xmm5
2904; AVX1-NEXT:    vpand %xmm4, %xmm5, %xmm5
2905; AVX1-NEXT:    vpackuswb %xmm7, %xmm5, %xmm6
2906; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
2907; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2908; AVX1-NEXT:    vpmullw %xmm5, %xmm7, %xmm5
2909; AVX1-NEXT:    vpand %xmm4, %xmm5, %xmm5
2910; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
2911; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2912; AVX1-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
2913; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
2914; AVX1-NEXT:    vpackuswb %xmm5, %xmm0, %xmm0
2915; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]
2916; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
2917; AVX1-NEXT:    vpmullw %xmm2, %xmm5, %xmm2
2918; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
2919; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
2920; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2921; AVX1-NEXT:    vpmullw %xmm3, %xmm1, %xmm1
2922; AVX1-NEXT:    vpand %xmm4, %xmm1, %xmm1
2923; AVX1-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
2924; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
2925; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2926; AVX1-NEXT:    vpmullw %xmm2, %xmm3, %xmm2
2927; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
2928; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2929; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2930; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2931; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
2932; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
2933; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
2934; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm8[8],xmm0[8],xmm8[9],xmm0[9],xmm8[10],xmm0[10],xmm8[11],xmm0[11],xmm8[12],xmm0[12],xmm8[13],xmm0[13],xmm8[14],xmm0[14],xmm8[15],xmm0[15]
2935; AVX1-NEXT:    vpmullw %xmm1, %xmm2, %xmm1
2936; AVX1-NEXT:    vpand %xmm4, %xmm1, %xmm1
2937; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm6[0],zero,xmm6[1],zero,xmm6[2],zero,xmm6[3],zero,xmm6[4],zero,xmm6[5],zero,xmm6[6],zero,xmm6[7],zero
2938; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm8[0],zero,xmm8[1],zero,xmm8[2],zero,xmm8[3],zero,xmm8[4],zero,xmm8[5],zero,xmm8[6],zero,xmm8[7],zero
2939; AVX1-NEXT:    vpmullw %xmm2, %xmm3, %xmm2
2940; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
2941; AVX1-NEXT:    vpackuswb %xmm1, %xmm2, %xmm1
2942; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
2943; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2944; AVX1-NEXT:    vpmullw %xmm2, %xmm3, %xmm2
2945; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
2946; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2947; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2948; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2949; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
2950; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
2951; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
2952; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2953; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2954; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2955; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
2956; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2957; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2958; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
2959; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2960; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
2961; AVX1-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
2962; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
2963; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2964; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm2
2965; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2966; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
2967; AVX1-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
2968; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
2969; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2970; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm2
2971; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2972; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
2973; AVX1-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
2974; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
2975; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2976; AVX1-NEXT:    vpextrb $0, %xmm0, %eax
2977; AVX1-NEXT:    # kill: def $al killed $al killed $eax
2978; AVX1-NEXT:    vzeroupper
2979; AVX1-NEXT:    retq
2980;
2981; AVX2-LABEL: test_v128i8:
2982; AVX2:       # %bb.0:
2983; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15],ymm2[24],ymm0[24],ymm2[25],ymm0[25],ymm2[26],ymm0[26],ymm2[27],ymm0[27],ymm2[28],ymm0[28],ymm2[29],ymm0[29],ymm2[30],ymm0[30],ymm2[31],ymm0[31]
2984; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm5 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
2985; AVX2-NEXT:    vpmullw %ymm4, %ymm5, %ymm5
2986; AVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2987; AVX2-NEXT:    vpand %ymm4, %ymm5, %ymm5
2988; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[16],ymm0[16],ymm2[17],ymm0[17],ymm2[18],ymm0[18],ymm2[19],ymm0[19],ymm2[20],ymm0[20],ymm2[21],ymm0[21],ymm2[22],ymm0[22],ymm2[23],ymm0[23]
2989; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
2990; AVX2-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
2991; AVX2-NEXT:    vpand %ymm4, %ymm0, %ymm0
2992; AVX2-NEXT:    vpackuswb %ymm5, %ymm0, %ymm0
2993; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm3[8],ymm0[8],ymm3[9],ymm0[9],ymm3[10],ymm0[10],ymm3[11],ymm0[11],ymm3[12],ymm0[12],ymm3[13],ymm0[13],ymm3[14],ymm0[14],ymm3[15],ymm0[15],ymm3[24],ymm0[24],ymm3[25],ymm0[25],ymm3[26],ymm0[26],ymm3[27],ymm0[27],ymm3[28],ymm0[28],ymm3[29],ymm0[29],ymm3[30],ymm0[30],ymm3[31],ymm0[31]
2994; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm5 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
2995; AVX2-NEXT:    vpmullw %ymm2, %ymm5, %ymm2
2996; AVX2-NEXT:    vpand %ymm4, %ymm2, %ymm2
2997; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm3 = ymm3[0],ymm0[0],ymm3[1],ymm0[1],ymm3[2],ymm0[2],ymm3[3],ymm0[3],ymm3[4],ymm0[4],ymm3[5],ymm0[5],ymm3[6],ymm0[6],ymm3[7],ymm0[7],ymm3[16],ymm0[16],ymm3[17],ymm0[17],ymm3[18],ymm0[18],ymm3[19],ymm0[19],ymm3[20],ymm0[20],ymm3[21],ymm0[21],ymm3[22],ymm0[22],ymm3[23],ymm0[23]
2998; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
2999; AVX2-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
3000; AVX2-NEXT:    vpand %ymm4, %ymm1, %ymm1
3001; AVX2-NEXT:    vpackuswb %ymm2, %ymm1, %ymm1
3002; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
3003; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
3004; AVX2-NEXT:    vpmullw %ymm2, %ymm3, %ymm2
3005; AVX2-NEXT:    vpand %ymm4, %ymm2, %ymm2
3006; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
3007; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
3008; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
3009; AVX2-NEXT:    vpand %ymm4, %ymm0, %ymm0
3010; AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
3011; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
3012; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
3013; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
3014; AVX2-NEXT:    vpmullw %ymm3, %ymm2, %ymm2
3015; AVX2-NEXT:    vpand %ymm4, %ymm2, %ymm2
3016; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
3017; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
3018; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
3019; AVX2-NEXT:    vpand %ymm4, %ymm0, %ymm0
3020; AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
3021; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
3022; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
3023; AVX2-NEXT:    vpmullw %ymm0, %ymm1, %ymm0
3024; AVX2-NEXT:    vpand %ymm4, %ymm0, %ymm0
3025; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3026; AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
3027; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
3028; AVX2-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3029; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3030; AVX2-NEXT:    vpmullw %ymm0, %ymm2, %ymm0
3031; AVX2-NEXT:    vpand %ymm4, %ymm0, %ymm0
3032; AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
3033; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
3034; AVX2-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3035; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
3036; AVX2-NEXT:    vpmullw %ymm0, %ymm2, %ymm0
3037; AVX2-NEXT:    vpand %ymm4, %ymm0, %ymm0
3038; AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
3039; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm2
3040; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
3041; AVX2-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
3042; AVX2-NEXT:    vpand %ymm4, %ymm0, %ymm0
3043; AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
3044; AVX2-NEXT:    vpextrb $0, %xmm0, %eax
3045; AVX2-NEXT:    # kill: def $al killed $al killed $eax
3046; AVX2-NEXT:    vzeroupper
3047; AVX2-NEXT:    retq
3048;
3049; AVX512BW-LABEL: test_v128i8:
3050; AVX512BW:       # %bb.0:
3051; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm2 = zmm1[8],zmm0[8],zmm1[9],zmm0[9],zmm1[10],zmm0[10],zmm1[11],zmm0[11],zmm1[12],zmm0[12],zmm1[13],zmm0[13],zmm1[14],zmm0[14],zmm1[15],zmm0[15],zmm1[24],zmm0[24],zmm1[25],zmm0[25],zmm1[26],zmm0[26],zmm1[27],zmm0[27],zmm1[28],zmm0[28],zmm1[29],zmm0[29],zmm1[30],zmm0[30],zmm1[31],zmm0[31],zmm1[40],zmm0[40],zmm1[41],zmm0[41],zmm1[42],zmm0[42],zmm1[43],zmm0[43],zmm1[44],zmm0[44],zmm1[45],zmm0[45],zmm1[46],zmm0[46],zmm1[47],zmm0[47],zmm1[56],zmm0[56],zmm1[57],zmm0[57],zmm1[58],zmm0[58],zmm1[59],zmm0[59],zmm1[60],zmm0[60],zmm1[61],zmm0[61],zmm1[62],zmm0[62],zmm1[63],zmm0[63]
3052; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm3 = zmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]
3053; AVX512BW-NEXT:    vpmullw %zmm2, %zmm3, %zmm3
3054; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3055; AVX512BW-NEXT:    vpandq %zmm2, %zmm3, %zmm3
3056; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm0[0],zmm1[1],zmm0[1],zmm1[2],zmm0[2],zmm1[3],zmm0[3],zmm1[4],zmm0[4],zmm1[5],zmm0[5],zmm1[6],zmm0[6],zmm1[7],zmm0[7],zmm1[16],zmm0[16],zmm1[17],zmm0[17],zmm1[18],zmm0[18],zmm1[19],zmm0[19],zmm1[20],zmm0[20],zmm1[21],zmm0[21],zmm1[22],zmm0[22],zmm1[23],zmm0[23],zmm1[32],zmm0[32],zmm1[33],zmm0[33],zmm1[34],zmm0[34],zmm1[35],zmm0[35],zmm1[36],zmm0[36],zmm1[37],zmm0[37],zmm1[38],zmm0[38],zmm1[39],zmm0[39],zmm1[48],zmm0[48],zmm1[49],zmm0[49],zmm1[50],zmm0[50],zmm1[51],zmm0[51],zmm1[52],zmm0[52],zmm1[53],zmm0[53],zmm1[54],zmm0[54],zmm1[55],zmm0[55]
3057; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
3058; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
3059; AVX512BW-NEXT:    vpandq %zmm2, %zmm0, %zmm0
3060; AVX512BW-NEXT:    vpackuswb %zmm3, %zmm0, %zmm0
3061; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
3062; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm3 = zmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]
3063; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm4 = zmm1[8],zmm0[8],zmm1[9],zmm0[9],zmm1[10],zmm0[10],zmm1[11],zmm0[11],zmm1[12],zmm0[12],zmm1[13],zmm0[13],zmm1[14],zmm0[14],zmm1[15],zmm0[15],zmm1[24],zmm0[24],zmm1[25],zmm0[25],zmm1[26],zmm0[26],zmm1[27],zmm0[27],zmm1[28],zmm0[28],zmm1[29],zmm0[29],zmm1[30],zmm0[30],zmm1[31],zmm0[31],zmm1[40],zmm0[40],zmm1[41],zmm0[41],zmm1[42],zmm0[42],zmm1[43],zmm0[43],zmm1[44],zmm0[44],zmm1[45],zmm0[45],zmm1[46],zmm0[46],zmm1[47],zmm0[47],zmm1[56],zmm0[56],zmm1[57],zmm0[57],zmm1[58],zmm0[58],zmm1[59],zmm0[59],zmm1[60],zmm0[60],zmm1[61],zmm0[61],zmm1[62],zmm0[62],zmm1[63],zmm0[63]
3064; AVX512BW-NEXT:    vpmullw %zmm4, %zmm3, %zmm3
3065; AVX512BW-NEXT:    vpandq %zmm2, %zmm3, %zmm3
3066; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
3067; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm0[0],zmm1[1],zmm0[1],zmm1[2],zmm0[2],zmm1[3],zmm0[3],zmm1[4],zmm0[4],zmm1[5],zmm0[5],zmm1[6],zmm0[6],zmm1[7],zmm0[7],zmm1[16],zmm0[16],zmm1[17],zmm0[17],zmm1[18],zmm0[18],zmm1[19],zmm0[19],zmm1[20],zmm0[20],zmm1[21],zmm0[21],zmm1[22],zmm0[22],zmm1[23],zmm0[23],zmm1[32],zmm0[32],zmm1[33],zmm0[33],zmm1[34],zmm0[34],zmm1[35],zmm0[35],zmm1[36],zmm0[36],zmm1[37],zmm0[37],zmm1[38],zmm0[38],zmm1[39],zmm0[39],zmm1[48],zmm0[48],zmm1[49],zmm0[49],zmm1[50],zmm0[50],zmm1[51],zmm0[51],zmm1[52],zmm0[52],zmm1[53],zmm0[53],zmm1[54],zmm0[54],zmm1[55],zmm0[55]
3068; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
3069; AVX512BW-NEXT:    vpandq %zmm2, %zmm0, %zmm0
3070; AVX512BW-NEXT:    vpackuswb %zmm3, %zmm0, %zmm0
3071; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
3072; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm3 = zmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]
3073; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm4 = zmm1[8],zmm0[8],zmm1[9],zmm0[9],zmm1[10],zmm0[10],zmm1[11],zmm0[11],zmm1[12],zmm0[12],zmm1[13],zmm0[13],zmm1[14],zmm0[14],zmm1[15],zmm0[15],zmm1[24],zmm0[24],zmm1[25],zmm0[25],zmm1[26],zmm0[26],zmm1[27],zmm0[27],zmm1[28],zmm0[28],zmm1[29],zmm0[29],zmm1[30],zmm0[30],zmm1[31],zmm0[31],zmm1[40],zmm0[40],zmm1[41],zmm0[41],zmm1[42],zmm0[42],zmm1[43],zmm0[43],zmm1[44],zmm0[44],zmm1[45],zmm0[45],zmm1[46],zmm0[46],zmm1[47],zmm0[47],zmm1[56],zmm0[56],zmm1[57],zmm0[57],zmm1[58],zmm0[58],zmm1[59],zmm0[59],zmm1[60],zmm0[60],zmm1[61],zmm0[61],zmm1[62],zmm0[62],zmm1[63],zmm0[63]
3074; AVX512BW-NEXT:    vpmullw %zmm4, %zmm3, %zmm3
3075; AVX512BW-NEXT:    vpandq %zmm2, %zmm3, %zmm3
3076; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
3077; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm0[0],zmm1[1],zmm0[1],zmm1[2],zmm0[2],zmm1[3],zmm0[3],zmm1[4],zmm0[4],zmm1[5],zmm0[5],zmm1[6],zmm0[6],zmm1[7],zmm0[7],zmm1[16],zmm0[16],zmm1[17],zmm0[17],zmm1[18],zmm0[18],zmm1[19],zmm0[19],zmm1[20],zmm0[20],zmm1[21],zmm0[21],zmm1[22],zmm0[22],zmm1[23],zmm0[23],zmm1[32],zmm0[32],zmm1[33],zmm0[33],zmm1[34],zmm0[34],zmm1[35],zmm0[35],zmm1[36],zmm0[36],zmm1[37],zmm0[37],zmm1[38],zmm0[38],zmm1[39],zmm0[39],zmm1[48],zmm0[48],zmm1[49],zmm0[49],zmm1[50],zmm0[50],zmm1[51],zmm0[51],zmm1[52],zmm0[52],zmm1[53],zmm0[53],zmm1[54],zmm0[54],zmm1[55],zmm0[55]
3078; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
3079; AVX512BW-NEXT:    vpandq %zmm2, %zmm0, %zmm0
3080; AVX512BW-NEXT:    vpackuswb %zmm3, %zmm0, %zmm0
3081; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
3082; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
3083; AVX512BW-NEXT:    vpmullw %zmm0, %zmm1, %zmm0
3084; AVX512BW-NEXT:    vpandq %zmm2, %zmm0, %zmm0
3085; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3086; AVX512BW-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0
3087; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm3 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
3088; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3089; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3090; AVX512BW-NEXT:    vpmullw %zmm0, %zmm3, %zmm0
3091; AVX512BW-NEXT:    vpandq %zmm2, %zmm0, %zmm0
3092; AVX512BW-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0
3093; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm3 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
3094; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3095; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
3096; AVX512BW-NEXT:    vpmullw %zmm0, %zmm3, %zmm0
3097; AVX512BW-NEXT:    vpandq %zmm2, %zmm0, %zmm0
3098; AVX512BW-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0
3099; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm3
3100; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
3101; AVX512BW-NEXT:    vpmullw %zmm3, %zmm0, %zmm0
3102; AVX512BW-NEXT:    vpandq %zmm2, %zmm0, %zmm0
3103; AVX512BW-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0
3104; AVX512BW-NEXT:    vpextrb $0, %xmm0, %eax
3105; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
3106; AVX512BW-NEXT:    vzeroupper
3107; AVX512BW-NEXT:    retq
3108;
3109; AVX512BWVL-LABEL: test_v128i8:
3110; AVX512BWVL:       # %bb.0:
3111; AVX512BWVL-NEXT:    vpunpckhbw {{.*#+}} zmm2 = zmm1[8],zmm0[8],zmm1[9],zmm0[9],zmm1[10],zmm0[10],zmm1[11],zmm0[11],zmm1[12],zmm0[12],zmm1[13],zmm0[13],zmm1[14],zmm0[14],zmm1[15],zmm0[15],zmm1[24],zmm0[24],zmm1[25],zmm0[25],zmm1[26],zmm0[26],zmm1[27],zmm0[27],zmm1[28],zmm0[28],zmm1[29],zmm0[29],zmm1[30],zmm0[30],zmm1[31],zmm0[31],zmm1[40],zmm0[40],zmm1[41],zmm0[41],zmm1[42],zmm0[42],zmm1[43],zmm0[43],zmm1[44],zmm0[44],zmm1[45],zmm0[45],zmm1[46],zmm0[46],zmm1[47],zmm0[47],zmm1[56],zmm0[56],zmm1[57],zmm0[57],zmm1[58],zmm0[58],zmm1[59],zmm0[59],zmm1[60],zmm0[60],zmm1[61],zmm0[61],zmm1[62],zmm0[62],zmm1[63],zmm0[63]
3112; AVX512BWVL-NEXT:    vpunpckhbw {{.*#+}} zmm3 = zmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]
3113; AVX512BWVL-NEXT:    vpmullw %zmm2, %zmm3, %zmm3
3114; AVX512BWVL-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3115; AVX512BWVL-NEXT:    vpandq %zmm2, %zmm3, %zmm3
3116; AVX512BWVL-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm0[0],zmm1[1],zmm0[1],zmm1[2],zmm0[2],zmm1[3],zmm0[3],zmm1[4],zmm0[4],zmm1[5],zmm0[5],zmm1[6],zmm0[6],zmm1[7],zmm0[7],zmm1[16],zmm0[16],zmm1[17],zmm0[17],zmm1[18],zmm0[18],zmm1[19],zmm0[19],zmm1[20],zmm0[20],zmm1[21],zmm0[21],zmm1[22],zmm0[22],zmm1[23],zmm0[23],zmm1[32],zmm0[32],zmm1[33],zmm0[33],zmm1[34],zmm0[34],zmm1[35],zmm0[35],zmm1[36],zmm0[36],zmm1[37],zmm0[37],zmm1[38],zmm0[38],zmm1[39],zmm0[39],zmm1[48],zmm0[48],zmm1[49],zmm0[49],zmm1[50],zmm0[50],zmm1[51],zmm0[51],zmm1[52],zmm0[52],zmm1[53],zmm0[53],zmm1[54],zmm0[54],zmm1[55],zmm0[55]
3117; AVX512BWVL-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
3118; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
3119; AVX512BWVL-NEXT:    vpandq %zmm2, %zmm0, %zmm0
3120; AVX512BWVL-NEXT:    vpackuswb %zmm3, %zmm0, %zmm0
3121; AVX512BWVL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
3122; AVX512BWVL-NEXT:    vpunpckhbw {{.*#+}} zmm3 = zmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]
3123; AVX512BWVL-NEXT:    vpunpckhbw {{.*#+}} zmm4 = zmm1[8],zmm0[8],zmm1[9],zmm0[9],zmm1[10],zmm0[10],zmm1[11],zmm0[11],zmm1[12],zmm0[12],zmm1[13],zmm0[13],zmm1[14],zmm0[14],zmm1[15],zmm0[15],zmm1[24],zmm0[24],zmm1[25],zmm0[25],zmm1[26],zmm0[26],zmm1[27],zmm0[27],zmm1[28],zmm0[28],zmm1[29],zmm0[29],zmm1[30],zmm0[30],zmm1[31],zmm0[31],zmm1[40],zmm0[40],zmm1[41],zmm0[41],zmm1[42],zmm0[42],zmm1[43],zmm0[43],zmm1[44],zmm0[44],zmm1[45],zmm0[45],zmm1[46],zmm0[46],zmm1[47],zmm0[47],zmm1[56],zmm0[56],zmm1[57],zmm0[57],zmm1[58],zmm0[58],zmm1[59],zmm0[59],zmm1[60],zmm0[60],zmm1[61],zmm0[61],zmm1[62],zmm0[62],zmm1[63],zmm0[63]
3124; AVX512BWVL-NEXT:    vpmullw %zmm4, %zmm3, %zmm3
3125; AVX512BWVL-NEXT:    vpandq %zmm2, %zmm3, %zmm3
3126; AVX512BWVL-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
3127; AVX512BWVL-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm0[0],zmm1[1],zmm0[1],zmm1[2],zmm0[2],zmm1[3],zmm0[3],zmm1[4],zmm0[4],zmm1[5],zmm0[5],zmm1[6],zmm0[6],zmm1[7],zmm0[7],zmm1[16],zmm0[16],zmm1[17],zmm0[17],zmm1[18],zmm0[18],zmm1[19],zmm0[19],zmm1[20],zmm0[20],zmm1[21],zmm0[21],zmm1[22],zmm0[22],zmm1[23],zmm0[23],zmm1[32],zmm0[32],zmm1[33],zmm0[33],zmm1[34],zmm0[34],zmm1[35],zmm0[35],zmm1[36],zmm0[36],zmm1[37],zmm0[37],zmm1[38],zmm0[38],zmm1[39],zmm0[39],zmm1[48],zmm0[48],zmm1[49],zmm0[49],zmm1[50],zmm0[50],zmm1[51],zmm0[51],zmm1[52],zmm0[52],zmm1[53],zmm0[53],zmm1[54],zmm0[54],zmm1[55],zmm0[55]
3128; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
3129; AVX512BWVL-NEXT:    vpandq %zmm2, %zmm0, %zmm0
3130; AVX512BWVL-NEXT:    vpackuswb %zmm3, %zmm0, %zmm0
3131; AVX512BWVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
3132; AVX512BWVL-NEXT:    vpunpckhbw {{.*#+}} zmm3 = zmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]
3133; AVX512BWVL-NEXT:    vpunpckhbw {{.*#+}} zmm4 = zmm1[8],zmm0[8],zmm1[9],zmm0[9],zmm1[10],zmm0[10],zmm1[11],zmm0[11],zmm1[12],zmm0[12],zmm1[13],zmm0[13],zmm1[14],zmm0[14],zmm1[15],zmm0[15],zmm1[24],zmm0[24],zmm1[25],zmm0[25],zmm1[26],zmm0[26],zmm1[27],zmm0[27],zmm1[28],zmm0[28],zmm1[29],zmm0[29],zmm1[30],zmm0[30],zmm1[31],zmm0[31],zmm1[40],zmm0[40],zmm1[41],zmm0[41],zmm1[42],zmm0[42],zmm1[43],zmm0[43],zmm1[44],zmm0[44],zmm1[45],zmm0[45],zmm1[46],zmm0[46],zmm1[47],zmm0[47],zmm1[56],zmm0[56],zmm1[57],zmm0[57],zmm1[58],zmm0[58],zmm1[59],zmm0[59],zmm1[60],zmm0[60],zmm1[61],zmm0[61],zmm1[62],zmm0[62],zmm1[63],zmm0[63]
3134; AVX512BWVL-NEXT:    vpmullw %zmm4, %zmm3, %zmm3
3135; AVX512BWVL-NEXT:    vpandq %zmm2, %zmm3, %zmm3
3136; AVX512BWVL-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
3137; AVX512BWVL-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm0[0],zmm1[1],zmm0[1],zmm1[2],zmm0[2],zmm1[3],zmm0[3],zmm1[4],zmm0[4],zmm1[5],zmm0[5],zmm1[6],zmm0[6],zmm1[7],zmm0[7],zmm1[16],zmm0[16],zmm1[17],zmm0[17],zmm1[18],zmm0[18],zmm1[19],zmm0[19],zmm1[20],zmm0[20],zmm1[21],zmm0[21],zmm1[22],zmm0[22],zmm1[23],zmm0[23],zmm1[32],zmm0[32],zmm1[33],zmm0[33],zmm1[34],zmm0[34],zmm1[35],zmm0[35],zmm1[36],zmm0[36],zmm1[37],zmm0[37],zmm1[38],zmm0[38],zmm1[39],zmm0[39],zmm1[48],zmm0[48],zmm1[49],zmm0[49],zmm1[50],zmm0[50],zmm1[51],zmm0[51],zmm1[52],zmm0[52],zmm1[53],zmm0[53],zmm1[54],zmm0[54],zmm1[55],zmm0[55]
3138; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
3139; AVX512BWVL-NEXT:    vpandq %zmm2, %zmm0, %zmm0
3140; AVX512BWVL-NEXT:    vpackuswb %zmm3, %zmm0, %zmm0
3141; AVX512BWVL-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
3142; AVX512BWVL-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
3143; AVX512BWVL-NEXT:    vpmullw %zmm0, %zmm1, %zmm0
3144; AVX512BWVL-NEXT:    vpandq %zmm2, %zmm0, %zmm0
3145; AVX512BWVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3146; AVX512BWVL-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0
3147; AVX512BWVL-NEXT:    vpunpcklbw {{.*#+}} zmm3 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
3148; AVX512BWVL-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3149; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3150; AVX512BWVL-NEXT:    vpmullw %zmm0, %zmm3, %zmm0
3151; AVX512BWVL-NEXT:    vpandq %zmm2, %zmm0, %zmm0
3152; AVX512BWVL-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0
3153; AVX512BWVL-NEXT:    vpunpcklbw {{.*#+}} zmm3 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
3154; AVX512BWVL-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3155; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
3156; AVX512BWVL-NEXT:    vpmullw %zmm0, %zmm3, %zmm0
3157; AVX512BWVL-NEXT:    vpandq %zmm2, %zmm0, %zmm0
3158; AVX512BWVL-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0
3159; AVX512BWVL-NEXT:    vpsrlw $8, %xmm0, %xmm3
3160; AVX512BWVL-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
3161; AVX512BWVL-NEXT:    vpmullw %zmm3, %zmm0, %zmm0
3162; AVX512BWVL-NEXT:    vpandq %zmm2, %zmm0, %zmm0
3163; AVX512BWVL-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0
3164; AVX512BWVL-NEXT:    vpextrb $0, %xmm0, %eax
3165; AVX512BWVL-NEXT:    # kill: def $al killed $al killed $eax
3166; AVX512BWVL-NEXT:    vzeroupper
3167; AVX512BWVL-NEXT:    retq
3168;
3169; AVX512DQ-LABEL: test_v128i8:
3170; AVX512DQ:       # %bb.0:
3171; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15],ymm2[24],ymm0[24],ymm2[25],ymm0[25],ymm2[26],ymm0[26],ymm2[27],ymm0[27],ymm2[28],ymm0[28],ymm2[29],ymm0[29],ymm2[30],ymm0[30],ymm2[31],ymm0[31]
3172; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} ymm5 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
3173; AVX512DQ-NEXT:    vpmullw %ymm4, %ymm5, %ymm5
3174; AVX512DQ-NEXT:    vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3175; AVX512DQ-NEXT:    vpand %ymm4, %ymm5, %ymm5
3176; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[16],ymm0[16],ymm2[17],ymm0[17],ymm2[18],ymm0[18],ymm2[19],ymm0[19],ymm2[20],ymm0[20],ymm2[21],ymm0[21],ymm2[22],ymm0[22],ymm2[23],ymm0[23]
3177; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
3178; AVX512DQ-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
3179; AVX512DQ-NEXT:    vpand %ymm4, %ymm0, %ymm0
3180; AVX512DQ-NEXT:    vpackuswb %ymm5, %ymm0, %ymm0
3181; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm3[8],ymm0[8],ymm3[9],ymm0[9],ymm3[10],ymm0[10],ymm3[11],ymm0[11],ymm3[12],ymm0[12],ymm3[13],ymm0[13],ymm3[14],ymm0[14],ymm3[15],ymm0[15],ymm3[24],ymm0[24],ymm3[25],ymm0[25],ymm3[26],ymm0[26],ymm3[27],ymm0[27],ymm3[28],ymm0[28],ymm3[29],ymm0[29],ymm3[30],ymm0[30],ymm3[31],ymm0[31]
3182; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} ymm5 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
3183; AVX512DQ-NEXT:    vpmullw %ymm2, %ymm5, %ymm2
3184; AVX512DQ-NEXT:    vpand %ymm4, %ymm2, %ymm2
3185; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm3 = ymm3[0],ymm0[0],ymm3[1],ymm0[1],ymm3[2],ymm0[2],ymm3[3],ymm0[3],ymm3[4],ymm0[4],ymm3[5],ymm0[5],ymm3[6],ymm0[6],ymm3[7],ymm0[7],ymm3[16],ymm0[16],ymm3[17],ymm0[17],ymm3[18],ymm0[18],ymm3[19],ymm0[19],ymm3[20],ymm0[20],ymm3[21],ymm0[21],ymm3[22],ymm0[22],ymm3[23],ymm0[23]
3186; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
3187; AVX512DQ-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
3188; AVX512DQ-NEXT:    vpand %ymm4, %ymm1, %ymm1
3189; AVX512DQ-NEXT:    vpackuswb %ymm2, %ymm1, %ymm1
3190; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
3191; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
3192; AVX512DQ-NEXT:    vpmullw %ymm2, %ymm3, %ymm2
3193; AVX512DQ-NEXT:    vpand %ymm4, %ymm2, %ymm2
3194; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
3195; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
3196; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
3197; AVX512DQ-NEXT:    vpand %ymm4, %ymm0, %ymm0
3198; AVX512DQ-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
3199; AVX512DQ-NEXT:    vextracti128 $1, %ymm0, %xmm1
3200; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
3201; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
3202; AVX512DQ-NEXT:    vpmullw %ymm3, %ymm2, %ymm2
3203; AVX512DQ-NEXT:    vpand %ymm4, %ymm2, %ymm2
3204; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
3205; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
3206; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
3207; AVX512DQ-NEXT:    vpand %ymm4, %ymm0, %ymm0
3208; AVX512DQ-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
3209; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
3210; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
3211; AVX512DQ-NEXT:    vpmullw %ymm0, %ymm1, %ymm0
3212; AVX512DQ-NEXT:    vpand %ymm4, %ymm0, %ymm0
3213; AVX512DQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3214; AVX512DQ-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
3215; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
3216; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3217; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3218; AVX512DQ-NEXT:    vpmullw %ymm0, %ymm2, %ymm0
3219; AVX512DQ-NEXT:    vpand %ymm4, %ymm0, %ymm0
3220; AVX512DQ-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
3221; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
3222; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3223; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
3224; AVX512DQ-NEXT:    vpmullw %ymm0, %ymm2, %ymm0
3225; AVX512DQ-NEXT:    vpand %ymm4, %ymm0, %ymm0
3226; AVX512DQ-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
3227; AVX512DQ-NEXT:    vpsrlw $8, %xmm0, %xmm2
3228; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
3229; AVX512DQ-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
3230; AVX512DQ-NEXT:    vpand %ymm4, %ymm0, %ymm0
3231; AVX512DQ-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
3232; AVX512DQ-NEXT:    vpextrb $0, %xmm0, %eax
3233; AVX512DQ-NEXT:    # kill: def $al killed $al killed $eax
3234; AVX512DQ-NEXT:    vzeroupper
3235; AVX512DQ-NEXT:    retq
3236;
3237; AVX512DQVL-LABEL: test_v128i8:
3238; AVX512DQVL:       # %bb.0:
3239; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15],ymm2[24],ymm0[24],ymm2[25],ymm0[25],ymm2[26],ymm0[26],ymm2[27],ymm0[27],ymm2[28],ymm0[28],ymm2[29],ymm0[29],ymm2[30],ymm0[30],ymm2[31],ymm0[31]
3240; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} ymm5 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
3241; AVX512DQVL-NEXT:    vpmullw %ymm4, %ymm5, %ymm5
3242; AVX512DQVL-NEXT:    vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3243; AVX512DQVL-NEXT:    vpand %ymm4, %ymm5, %ymm5
3244; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[16],ymm0[16],ymm2[17],ymm0[17],ymm2[18],ymm0[18],ymm2[19],ymm0[19],ymm2[20],ymm0[20],ymm2[21],ymm0[21],ymm2[22],ymm0[22],ymm2[23],ymm0[23]
3245; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
3246; AVX512DQVL-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
3247; AVX512DQVL-NEXT:    vpand %ymm4, %ymm0, %ymm0
3248; AVX512DQVL-NEXT:    vpackuswb %ymm5, %ymm0, %ymm0
3249; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm3[8],ymm0[8],ymm3[9],ymm0[9],ymm3[10],ymm0[10],ymm3[11],ymm0[11],ymm3[12],ymm0[12],ymm3[13],ymm0[13],ymm3[14],ymm0[14],ymm3[15],ymm0[15],ymm3[24],ymm0[24],ymm3[25],ymm0[25],ymm3[26],ymm0[26],ymm3[27],ymm0[27],ymm3[28],ymm0[28],ymm3[29],ymm0[29],ymm3[30],ymm0[30],ymm3[31],ymm0[31]
3250; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} ymm5 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
3251; AVX512DQVL-NEXT:    vpmullw %ymm2, %ymm5, %ymm2
3252; AVX512DQVL-NEXT:    vpand %ymm4, %ymm2, %ymm2
3253; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm3 = ymm3[0],ymm0[0],ymm3[1],ymm0[1],ymm3[2],ymm0[2],ymm3[3],ymm0[3],ymm3[4],ymm0[4],ymm3[5],ymm0[5],ymm3[6],ymm0[6],ymm3[7],ymm0[7],ymm3[16],ymm0[16],ymm3[17],ymm0[17],ymm3[18],ymm0[18],ymm3[19],ymm0[19],ymm3[20],ymm0[20],ymm3[21],ymm0[21],ymm3[22],ymm0[22],ymm3[23],ymm0[23]
3254; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
3255; AVX512DQVL-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
3256; AVX512DQVL-NEXT:    vpand %ymm4, %ymm1, %ymm1
3257; AVX512DQVL-NEXT:    vpackuswb %ymm2, %ymm1, %ymm1
3258; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
3259; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
3260; AVX512DQVL-NEXT:    vpmullw %ymm2, %ymm3, %ymm2
3261; AVX512DQVL-NEXT:    vpand %ymm4, %ymm2, %ymm2
3262; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
3263; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
3264; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
3265; AVX512DQVL-NEXT:    vpand %ymm4, %ymm0, %ymm0
3266; AVX512DQVL-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
3267; AVX512DQVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
3268; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
3269; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
3270; AVX512DQVL-NEXT:    vpmullw %ymm3, %ymm2, %ymm2
3271; AVX512DQVL-NEXT:    vpand %ymm4, %ymm2, %ymm2
3272; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
3273; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
3274; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
3275; AVX512DQVL-NEXT:    vpand %ymm4, %ymm0, %ymm0
3276; AVX512DQVL-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
3277; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
3278; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
3279; AVX512DQVL-NEXT:    vpmullw %ymm0, %ymm1, %ymm0
3280; AVX512DQVL-NEXT:    vpand %ymm4, %ymm0, %ymm0
3281; AVX512DQVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3282; AVX512DQVL-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
3283; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
3284; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3285; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
3286; AVX512DQVL-NEXT:    vpmullw %ymm0, %ymm2, %ymm0
3287; AVX512DQVL-NEXT:    vpand %ymm4, %ymm0, %ymm0
3288; AVX512DQVL-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
3289; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
3290; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3291; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
3292; AVX512DQVL-NEXT:    vpmullw %ymm0, %ymm2, %ymm0
3293; AVX512DQVL-NEXT:    vpand %ymm4, %ymm0, %ymm0
3294; AVX512DQVL-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
3295; AVX512DQVL-NEXT:    vpsrlw $8, %xmm0, %xmm2
3296; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
3297; AVX512DQVL-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
3298; AVX512DQVL-NEXT:    vpand %ymm4, %ymm0, %ymm0
3299; AVX512DQVL-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
3300; AVX512DQVL-NEXT:    vpextrb $0, %xmm0, %eax
3301; AVX512DQVL-NEXT:    # kill: def $al killed $al killed $eax
3302; AVX512DQVL-NEXT:    vzeroupper
3303; AVX512DQVL-NEXT:    retq
3304  %1 = call i8 @llvm.experimental.vector.reduce.mul.i8.v128i8(<128 x i8> %a0)
3305  ret i8 %1
3306}
3307
3308declare i64 @llvm.experimental.vector.reduce.mul.i64.v2i64(<2 x i64>)
3309declare i64 @llvm.experimental.vector.reduce.mul.i64.v4i64(<4 x i64>)
3310declare i64 @llvm.experimental.vector.reduce.mul.i64.v8i64(<8 x i64>)
3311declare i64 @llvm.experimental.vector.reduce.mul.i64.v16i64(<16 x i64>)
3312
3313declare i32 @llvm.experimental.vector.reduce.mul.i32.v2i32(<2 x i32>)
3314declare i32 @llvm.experimental.vector.reduce.mul.i32.v4i32(<4 x i32>)
3315declare i32 @llvm.experimental.vector.reduce.mul.i32.v8i32(<8 x i32>)
3316declare i32 @llvm.experimental.vector.reduce.mul.i32.v16i32(<16 x i32>)
3317declare i32 @llvm.experimental.vector.reduce.mul.i32.v32i32(<32 x i32>)
3318
3319declare i16 @llvm.experimental.vector.reduce.mul.i16.v2i16(<2 x i16>)
3320declare i16 @llvm.experimental.vector.reduce.mul.i16.v4i16(<4 x i16>)
3321declare i16 @llvm.experimental.vector.reduce.mul.i16.v8i16(<8 x i16>)
3322declare i16 @llvm.experimental.vector.reduce.mul.i16.v16i16(<16 x i16>)
3323declare i16 @llvm.experimental.vector.reduce.mul.i16.v32i16(<32 x i16>)
3324declare i16 @llvm.experimental.vector.reduce.mul.i16.v64i16(<64 x i16>)
3325
3326declare i8 @llvm.experimental.vector.reduce.mul.i8.v2i8(<2 x i8>)
3327declare i8 @llvm.experimental.vector.reduce.mul.i8.v4i8(<4 x i8>)
3328declare i8 @llvm.experimental.vector.reduce.mul.i8.v8i8(<8 x i8>)
3329declare i8 @llvm.experimental.vector.reduce.mul.i8.v16i8(<16 x i8>)
3330declare i8 @llvm.experimental.vector.reduce.mul.i8.v32i8(<32 x i8>)
3331declare i8 @llvm.experimental.vector.reduce.mul.i8.v64i8(<64 x i8>)
3332declare i8 @llvm.experimental.vector.reduce.mul.i8.v128i8(<128 x i8>)
3333