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:    vpsrldq {{.*#+}} xmm3 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
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.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:    vpsrldq {{.*#+}} xmm3 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
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, %xmm0, %xmm2
148; AVX2-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
149; AVX2-NEXT:    vpsrlq $32, %xmm1, %xmm3
150; AVX2-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
151; AVX2-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
152; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
153; AVX2-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
154; AVX2-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
155; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
156; AVX2-NEXT:    vpsrlq $32, %xmm0, %xmm2
157; AVX2-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
158; AVX2-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
159; AVX2-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
160; AVX2-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
161; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
162; AVX2-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
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, %xmm0, %xmm2
172; AVX512BW-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
173; AVX512BW-NEXT:    vpsrlq $32, %xmm1, %xmm3
174; AVX512BW-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
175; AVX512BW-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
176; AVX512BW-NEXT:    vpsllq $32, %xmm2, %xmm2
177; AVX512BW-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
178; AVX512BW-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
179; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
180; AVX512BW-NEXT:    vpsrlq $32, %xmm0, %xmm2
181; AVX512BW-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
182; AVX512BW-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
183; AVX512BW-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
184; AVX512BW-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
185; AVX512BW-NEXT:    vpsllq $32, %xmm2, %xmm2
186; AVX512BW-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
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, %xmm0, %xmm2
196; AVX512BWVL-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
197; AVX512BWVL-NEXT:    vpsrlq $32, %xmm1, %xmm3
198; AVX512BWVL-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
199; AVX512BWVL-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
200; AVX512BWVL-NEXT:    vpsllq $32, %xmm2, %xmm2
201; AVX512BWVL-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
202; AVX512BWVL-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
203; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
204; AVX512BWVL-NEXT:    vpsrlq $32, %xmm0, %xmm2
205; AVX512BWVL-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
206; AVX512BWVL-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
207; AVX512BWVL-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
208; AVX512BWVL-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
209; AVX512BWVL-NEXT:    vpsllq $32, %xmm2, %xmm2
210; AVX512BWVL-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
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 %xmm1, %xmm0, %xmm0
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.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:    vpsrldq {{.*#+}} xmm3 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
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, %xmm0, %xmm2
340; AVX2-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
341; AVX2-NEXT:    vpsrlq $32, %xmm1, %xmm3
342; AVX2-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
343; AVX2-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
344; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
345; AVX2-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
346; AVX2-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
347; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
348; AVX2-NEXT:    vpsrlq $32, %xmm0, %xmm2
349; AVX2-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
350; AVX2-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
351; AVX2-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
352; AVX2-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
353; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
354; AVX2-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
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, %xmm0, %xmm2
373; AVX512BW-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
374; AVX512BW-NEXT:    vpsrlq $32, %xmm1, %xmm3
375; AVX512BW-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
376; AVX512BW-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
377; AVX512BW-NEXT:    vpsllq $32, %xmm2, %xmm2
378; AVX512BW-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
379; AVX512BW-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
380; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
381; AVX512BW-NEXT:    vpsrlq $32, %xmm0, %xmm2
382; AVX512BW-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
383; AVX512BW-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
384; AVX512BW-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
385; AVX512BW-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
386; AVX512BW-NEXT:    vpsllq $32, %xmm2, %xmm2
387; AVX512BW-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
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, %xmm0, %xmm2
406; AVX512BWVL-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
407; AVX512BWVL-NEXT:    vpsrlq $32, %xmm1, %xmm3
408; AVX512BWVL-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
409; AVX512BWVL-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
410; AVX512BWVL-NEXT:    vpsllq $32, %xmm2, %xmm2
411; AVX512BWVL-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
412; AVX512BWVL-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
413; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
414; AVX512BWVL-NEXT:    vpsrlq $32, %xmm0, %xmm2
415; AVX512BWVL-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
416; AVX512BWVL-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
417; AVX512BWVL-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
418; AVX512BWVL-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
419; AVX512BWVL-NEXT:    vpsllq $32, %xmm2, %xmm2
420; AVX512BWVL-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
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 %xmm1, %xmm0, %xmm0
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.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:    vpsrldq {{.*#+}} xmm3 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
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, %xmm0, %xmm2
643; AVX2-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
644; AVX2-NEXT:    vpsrlq $32, %xmm1, %xmm3
645; AVX2-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
646; AVX2-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
647; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
648; AVX2-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
649; AVX2-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
650; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
651; AVX2-NEXT:    vpsrlq $32, %xmm0, %xmm2
652; AVX2-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
653; AVX2-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
654; AVX2-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
655; AVX2-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
656; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
657; AVX2-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
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, %xmm0, %xmm2
684; AVX512BW-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
685; AVX512BW-NEXT:    vpsrlq $32, %xmm1, %xmm3
686; AVX512BW-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
687; AVX512BW-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
688; AVX512BW-NEXT:    vpsllq $32, %xmm2, %xmm2
689; AVX512BW-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
690; AVX512BW-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
691; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
692; AVX512BW-NEXT:    vpsrlq $32, %xmm0, %xmm2
693; AVX512BW-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
694; AVX512BW-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
695; AVX512BW-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
696; AVX512BW-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
697; AVX512BW-NEXT:    vpsllq $32, %xmm2, %xmm2
698; AVX512BW-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
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, %xmm0, %xmm2
725; AVX512BWVL-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
726; AVX512BWVL-NEXT:    vpsrlq $32, %xmm1, %xmm3
727; AVX512BWVL-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
728; AVX512BWVL-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
729; AVX512BWVL-NEXT:    vpsllq $32, %xmm2, %xmm2
730; AVX512BWVL-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
731; AVX512BWVL-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
732; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
733; AVX512BWVL-NEXT:    vpsrlq $32, %xmm0, %xmm2
734; AVX512BWVL-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
735; AVX512BWVL-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
736; AVX512BWVL-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
737; AVX512BWVL-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
738; AVX512BWVL-NEXT:    vpsllq $32, %xmm2, %xmm2
739; AVX512BWVL-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
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 %xmm1, %xmm0, %xmm0
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.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; SSE2-LABEL: test_v2i32:
780; SSE2:       # %bb.0:
781; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
782; SSE2-NEXT:    pmuludq %xmm0, %xmm1
783; SSE2-NEXT:    movd %xmm1, %eax
784; SSE2-NEXT:    retq
785;
786; SSE41-LABEL: test_v2i32:
787; SSE41:       # %bb.0:
788; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
789; SSE41-NEXT:    pmulld %xmm0, %xmm1
790; SSE41-NEXT:    movd %xmm1, %eax
791; SSE41-NEXT:    retq
792;
793; AVX-LABEL: test_v2i32:
794; AVX:       # %bb.0:
795; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
796; AVX-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
797; AVX-NEXT:    vmovd %xmm0, %eax
798; AVX-NEXT:    retq
799;
800; AVX512-LABEL: test_v2i32:
801; AVX512:       # %bb.0:
802; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
803; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
804; AVX512-NEXT:    vmovd %xmm0, %eax
805; AVX512-NEXT:    retq
806  %1 = call i32 @llvm.experimental.vector.reduce.mul.v2i32(<2 x i32> %a0)
807  ret i32 %1
808}
809
810define i32 @test_v4i32(<4 x i32> %a0) {
811; SSE2-LABEL: test_v4i32:
812; SSE2:       # %bb.0:
813; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
814; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[3,1,2,3]
815; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
816; SSE2-NEXT:    pmuludq %xmm2, %xmm3
817; SSE2-NEXT:    pmuludq %xmm0, %xmm1
818; SSE2-NEXT:    pmuludq %xmm3, %xmm1
819; SSE2-NEXT:    movd %xmm1, %eax
820; SSE2-NEXT:    retq
821;
822; SSE41-LABEL: test_v4i32:
823; SSE41:       # %bb.0:
824; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
825; SSE41-NEXT:    pmulld %xmm0, %xmm1
826; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
827; SSE41-NEXT:    pmulld %xmm1, %xmm0
828; SSE41-NEXT:    movd %xmm0, %eax
829; SSE41-NEXT:    retq
830;
831; AVX-LABEL: test_v4i32:
832; AVX:       # %bb.0:
833; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
834; AVX-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
835; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
836; AVX-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
837; AVX-NEXT:    vmovd %xmm0, %eax
838; AVX-NEXT:    retq
839;
840; AVX512-LABEL: test_v4i32:
841; AVX512:       # %bb.0:
842; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
843; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
844; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
845; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
846; AVX512-NEXT:    vmovd %xmm0, %eax
847; AVX512-NEXT:    retq
848  %1 = call i32 @llvm.experimental.vector.reduce.mul.v4i32(<4 x i32> %a0)
849  ret i32 %1
850}
851
852define i32 @test_v8i32(<8 x i32> %a0) {
853; SSE2-LABEL: test_v8i32:
854; SSE2:       # %bb.0:
855; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
856; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
857; SSE2-NEXT:    pmuludq %xmm2, %xmm3
858; SSE2-NEXT:    pmuludq %xmm1, %xmm0
859; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
860; SSE2-NEXT:    pmuludq %xmm0, %xmm1
861; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,0,2,2]
862; SSE2-NEXT:    pmuludq %xmm3, %xmm0
863; SSE2-NEXT:    pmuludq %xmm1, %xmm0
864; SSE2-NEXT:    movd %xmm0, %eax
865; SSE2-NEXT:    retq
866;
867; SSE41-LABEL: test_v8i32:
868; SSE41:       # %bb.0:
869; SSE41-NEXT:    pmulld %xmm1, %xmm0
870; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
871; SSE41-NEXT:    pmulld %xmm0, %xmm1
872; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
873; SSE41-NEXT:    pmulld %xmm1, %xmm0
874; SSE41-NEXT:    movd %xmm0, %eax
875; SSE41-NEXT:    retq
876;
877; AVX1-LABEL: test_v8i32:
878; AVX1:       # %bb.0:
879; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
880; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
881; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
882; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
883; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
884; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
885; AVX1-NEXT:    vmovd %xmm0, %eax
886; AVX1-NEXT:    vzeroupper
887; AVX1-NEXT:    retq
888;
889; AVX2-LABEL: test_v8i32:
890; AVX2:       # %bb.0:
891; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
892; AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
893; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
894; AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
895; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
896; AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
897; AVX2-NEXT:    vmovd %xmm0, %eax
898; AVX2-NEXT:    vzeroupper
899; AVX2-NEXT:    retq
900;
901; AVX512-LABEL: test_v8i32:
902; AVX512:       # %bb.0:
903; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
904; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
905; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
906; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
907; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
908; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
909; AVX512-NEXT:    vmovd %xmm0, %eax
910; AVX512-NEXT:    vzeroupper
911; AVX512-NEXT:    retq
912  %1 = call i32 @llvm.experimental.vector.reduce.mul.v8i32(<8 x i32> %a0)
913  ret i32 %1
914}
915
916define i32 @test_v16i32(<16 x i32> %a0) {
917; SSE2-LABEL: test_v16i32:
918; SSE2:       # %bb.0:
919; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
920; SSE2-NEXT:    pmuludq %xmm3, %xmm1
921; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
922; SSE2-NEXT:    pmuludq %xmm2, %xmm0
923; SSE2-NEXT:    pmuludq %xmm1, %xmm0
924; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
925; SSE2-NEXT:    pmuludq %xmm4, %xmm1
926; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
927; SSE2-NEXT:    pmuludq %xmm5, %xmm2
928; SSE2-NEXT:    pmuludq %xmm1, %xmm2
929; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
930; SSE2-NEXT:    pmuludq %xmm0, %xmm1
931; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,0,2,2]
932; SSE2-NEXT:    pmuludq %xmm2, %xmm0
933; SSE2-NEXT:    pmuludq %xmm1, %xmm0
934; SSE2-NEXT:    movd %xmm0, %eax
935; SSE2-NEXT:    retq
936;
937; SSE41-LABEL: test_v16i32:
938; SSE41:       # %bb.0:
939; SSE41-NEXT:    pmulld %xmm3, %xmm1
940; SSE41-NEXT:    pmulld %xmm2, %xmm1
941; SSE41-NEXT:    pmulld %xmm0, %xmm1
942; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
943; SSE41-NEXT:    pmulld %xmm1, %xmm0
944; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
945; SSE41-NEXT:    pmulld %xmm0, %xmm1
946; SSE41-NEXT:    movd %xmm1, %eax
947; SSE41-NEXT:    retq
948;
949; AVX1-LABEL: test_v16i32:
950; AVX1:       # %bb.0:
951; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
952; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
953; AVX1-NEXT:    vpmulld %xmm2, %xmm3, %xmm2
954; AVX1-NEXT:    vpmulld %xmm2, %xmm1, %xmm1
955; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
956; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
957; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
958; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
959; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
960; AVX1-NEXT:    vmovd %xmm0, %eax
961; AVX1-NEXT:    vzeroupper
962; AVX1-NEXT:    retq
963;
964; AVX2-LABEL: test_v16i32:
965; AVX2:       # %bb.0:
966; AVX2-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
967; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
968; AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
969; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
970; AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
971; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
972; AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
973; AVX2-NEXT:    vmovd %xmm0, %eax
974; AVX2-NEXT:    vzeroupper
975; AVX2-NEXT:    retq
976;
977; AVX512-LABEL: test_v16i32:
978; AVX512:       # %bb.0:
979; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
980; AVX512-NEXT:    vpmulld %zmm1, %zmm0, %zmm0
981; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
982; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
983; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
984; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
985; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
986; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
987; AVX512-NEXT:    vmovd %xmm0, %eax
988; AVX512-NEXT:    vzeroupper
989; AVX512-NEXT:    retq
990  %1 = call i32 @llvm.experimental.vector.reduce.mul.v16i32(<16 x i32> %a0)
991  ret i32 %1
992}
993
994define i32 @test_v32i32(<32 x i32> %a0) {
995; SSE2-LABEL: test_v32i32:
996; SSE2:       # %bb.0:
997; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[1,1,3,3]
998; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm2[1,1,3,3]
999; SSE2-NEXT:    pmuludq %xmm8, %xmm9
1000; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm4[1,1,3,3]
1001; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm0[1,1,3,3]
1002; SSE2-NEXT:    pmuludq %xmm8, %xmm10
1003; SSE2-NEXT:    pmuludq %xmm9, %xmm10
1004; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[1,1,3,3]
1005; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm3[1,1,3,3]
1006; SSE2-NEXT:    pmuludq %xmm8, %xmm9
1007; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm5[1,1,3,3]
1008; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm1[1,1,3,3]
1009; SSE2-NEXT:    pmuludq %xmm8, %xmm11
1010; SSE2-NEXT:    pmuludq %xmm9, %xmm11
1011; SSE2-NEXT:    pmuludq %xmm10, %xmm11
1012; SSE2-NEXT:    pmuludq %xmm6, %xmm2
1013; SSE2-NEXT:    pmuludq %xmm4, %xmm0
1014; SSE2-NEXT:    pmuludq %xmm2, %xmm0
1015; SSE2-NEXT:    pmuludq %xmm7, %xmm3
1016; SSE2-NEXT:    pmuludq %xmm5, %xmm1
1017; SSE2-NEXT:    pmuludq %xmm3, %xmm1
1018; SSE2-NEXT:    pmuludq %xmm0, %xmm1
1019; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1020; SSE2-NEXT:    pmuludq %xmm1, %xmm0
1021; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm11[2,0,2,2]
1022; SSE2-NEXT:    pmuludq %xmm11, %xmm1
1023; SSE2-NEXT:    pmuludq %xmm0, %xmm1
1024; SSE2-NEXT:    movd %xmm1, %eax
1025; SSE2-NEXT:    retq
1026;
1027; SSE41-LABEL: test_v32i32:
1028; SSE41:       # %bb.0:
1029; SSE41-NEXT:    pmulld %xmm6, %xmm2
1030; SSE41-NEXT:    pmulld %xmm7, %xmm3
1031; SSE41-NEXT:    pmulld %xmm5, %xmm3
1032; SSE41-NEXT:    pmulld %xmm1, %xmm3
1033; SSE41-NEXT:    pmulld %xmm4, %xmm2
1034; SSE41-NEXT:    pmulld %xmm3, %xmm2
1035; SSE41-NEXT:    pmulld %xmm0, %xmm2
1036; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
1037; SSE41-NEXT:    pmulld %xmm2, %xmm0
1038; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1039; SSE41-NEXT:    pmulld %xmm0, %xmm1
1040; SSE41-NEXT:    movd %xmm1, %eax
1041; SSE41-NEXT:    retq
1042;
1043; AVX1-LABEL: test_v32i32:
1044; AVX1:       # %bb.0:
1045; AVX1-NEXT:    vpmulld %xmm3, %xmm1, %xmm4
1046; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
1047; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1048; AVX1-NEXT:    vpmulld %xmm3, %xmm1, %xmm1
1049; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
1050; AVX1-NEXT:    vpmulld %xmm1, %xmm3, %xmm1
1051; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1052; AVX1-NEXT:    vpmulld %xmm1, %xmm3, %xmm1
1053; AVX1-NEXT:    vpmulld %xmm4, %xmm2, %xmm2
1054; AVX1-NEXT:    vpmulld %xmm1, %xmm2, %xmm1
1055; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1056; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1057; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1058; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1059; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1060; AVX1-NEXT:    vmovd %xmm0, %eax
1061; AVX1-NEXT:    vzeroupper
1062; AVX1-NEXT:    retq
1063;
1064; AVX2-LABEL: test_v32i32:
1065; AVX2:       # %bb.0:
1066; AVX2-NEXT:    vpmulld %ymm3, %ymm1, %ymm1
1067; AVX2-NEXT:    vpmulld %ymm1, %ymm2, %ymm1
1068; AVX2-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
1069; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1070; AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1071; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1072; AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1073; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1074; AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1075; AVX2-NEXT:    vmovd %xmm0, %eax
1076; AVX2-NEXT:    vzeroupper
1077; AVX2-NEXT:    retq
1078;
1079; AVX512-LABEL: test_v32i32:
1080; AVX512:       # %bb.0:
1081; AVX512-NEXT:    vpmulld %zmm1, %zmm0, %zmm0
1082; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1083; AVX512-NEXT:    vpmulld %zmm1, %zmm0, %zmm0
1084; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1085; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1086; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1087; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1088; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1089; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1090; AVX512-NEXT:    vmovd %xmm0, %eax
1091; AVX512-NEXT:    vzeroupper
1092; AVX512-NEXT:    retq
1093  %1 = call i32 @llvm.experimental.vector.reduce.mul.v32i32(<32 x i32> %a0)
1094  ret i32 %1
1095}
1096
1097;
1098; vXi16
1099;
1100
1101define i16 @test_v2i16(<2 x i16> %a0) {
1102; SSE-LABEL: test_v2i16:
1103; SSE:       # %bb.0:
1104; SSE-NEXT:    movdqa %xmm0, %xmm1
1105; SSE-NEXT:    psrld $16, %xmm1
1106; SSE-NEXT:    pmullw %xmm0, %xmm1
1107; SSE-NEXT:    movd %xmm1, %eax
1108; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
1109; SSE-NEXT:    retq
1110;
1111; AVX-LABEL: test_v2i16:
1112; AVX:       # %bb.0:
1113; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
1114; AVX-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1115; AVX-NEXT:    vmovd %xmm0, %eax
1116; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
1117; AVX-NEXT:    retq
1118;
1119; AVX512-LABEL: test_v2i16:
1120; AVX512:       # %bb.0:
1121; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1122; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1123; AVX512-NEXT:    vmovd %xmm0, %eax
1124; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1125; AVX512-NEXT:    retq
1126  %1 = call i16 @llvm.experimental.vector.reduce.mul.v2i16(<2 x i16> %a0)
1127  ret i16 %1
1128}
1129
1130define i16 @test_v4i16(<4 x i16> %a0) {
1131; SSE-LABEL: test_v4i16:
1132; SSE:       # %bb.0:
1133; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1134; SSE-NEXT:    pmullw %xmm0, %xmm1
1135; SSE-NEXT:    movdqa %xmm1, %xmm0
1136; SSE-NEXT:    psrld $16, %xmm0
1137; SSE-NEXT:    pmullw %xmm1, %xmm0
1138; SSE-NEXT:    movd %xmm0, %eax
1139; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
1140; SSE-NEXT:    retq
1141;
1142; AVX-LABEL: test_v4i16:
1143; AVX:       # %bb.0:
1144; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1145; AVX-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1146; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
1147; AVX-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1148; AVX-NEXT:    vmovd %xmm0, %eax
1149; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
1150; AVX-NEXT:    retq
1151;
1152; AVX512-LABEL: test_v4i16:
1153; AVX512:       # %bb.0:
1154; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1155; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1156; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1157; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1158; AVX512-NEXT:    vmovd %xmm0, %eax
1159; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1160; AVX512-NEXT:    retq
1161  %1 = call i16 @llvm.experimental.vector.reduce.mul.v4i16(<4 x i16> %a0)
1162  ret i16 %1
1163}
1164
1165define i16 @test_v8i16(<8 x i16> %a0) {
1166; SSE-LABEL: test_v8i16:
1167; SSE:       # %bb.0:
1168; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1169; SSE-NEXT:    pmullw %xmm0, %xmm1
1170; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1171; SSE-NEXT:    pmullw %xmm1, %xmm0
1172; SSE-NEXT:    movdqa %xmm0, %xmm1
1173; SSE-NEXT:    psrld $16, %xmm1
1174; SSE-NEXT:    pmullw %xmm0, %xmm1
1175; SSE-NEXT:    movd %xmm1, %eax
1176; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
1177; SSE-NEXT:    retq
1178;
1179; AVX-LABEL: test_v8i16:
1180; AVX:       # %bb.0:
1181; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1182; AVX-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1183; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1184; AVX-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1185; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
1186; AVX-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1187; AVX-NEXT:    vmovd %xmm0, %eax
1188; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
1189; AVX-NEXT:    retq
1190;
1191; AVX512-LABEL: test_v8i16:
1192; AVX512:       # %bb.0:
1193; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1194; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1195; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1196; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1197; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1198; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1199; AVX512-NEXT:    vmovd %xmm0, %eax
1200; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1201; AVX512-NEXT:    retq
1202  %1 = call i16 @llvm.experimental.vector.reduce.mul.v8i16(<8 x i16> %a0)
1203  ret i16 %1
1204}
1205
1206define i16 @test_v16i16(<16 x i16> %a0) {
1207; SSE-LABEL: test_v16i16:
1208; SSE:       # %bb.0:
1209; SSE-NEXT:    pmullw %xmm1, %xmm0
1210; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1211; SSE-NEXT:    pmullw %xmm0, %xmm1
1212; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1213; SSE-NEXT:    pmullw %xmm1, %xmm0
1214; SSE-NEXT:    movdqa %xmm0, %xmm1
1215; SSE-NEXT:    psrld $16, %xmm1
1216; SSE-NEXT:    pmullw %xmm0, %xmm1
1217; SSE-NEXT:    movd %xmm1, %eax
1218; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
1219; SSE-NEXT:    retq
1220;
1221; AVX1-LABEL: test_v16i16:
1222; AVX1:       # %bb.0:
1223; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1224; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1225; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1226; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1227; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1228; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1229; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
1230; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1231; AVX1-NEXT:    vmovd %xmm0, %eax
1232; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
1233; AVX1-NEXT:    vzeroupper
1234; AVX1-NEXT:    retq
1235;
1236; AVX2-LABEL: test_v16i16:
1237; AVX2:       # %bb.0:
1238; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1239; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1240; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1241; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1242; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1243; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1244; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
1245; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1246; AVX2-NEXT:    vmovd %xmm0, %eax
1247; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
1248; AVX2-NEXT:    vzeroupper
1249; AVX2-NEXT:    retq
1250;
1251; AVX512-LABEL: test_v16i16:
1252; AVX512:       # %bb.0:
1253; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1254; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1255; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1256; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1257; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1258; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1259; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1260; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1261; AVX512-NEXT:    vmovd %xmm0, %eax
1262; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1263; AVX512-NEXT:    vzeroupper
1264; AVX512-NEXT:    retq
1265  %1 = call i16 @llvm.experimental.vector.reduce.mul.v16i16(<16 x i16> %a0)
1266  ret i16 %1
1267}
1268
1269define i16 @test_v32i16(<32 x i16> %a0) {
1270; SSE-LABEL: test_v32i16:
1271; SSE:       # %bb.0:
1272; SSE-NEXT:    pmullw %xmm3, %xmm1
1273; SSE-NEXT:    pmullw %xmm2, %xmm1
1274; SSE-NEXT:    pmullw %xmm0, %xmm1
1275; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1276; SSE-NEXT:    pmullw %xmm1, %xmm0
1277; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1278; SSE-NEXT:    pmullw %xmm0, %xmm1
1279; SSE-NEXT:    movdqa %xmm1, %xmm0
1280; SSE-NEXT:    psrld $16, %xmm0
1281; SSE-NEXT:    pmullw %xmm1, %xmm0
1282; SSE-NEXT:    movd %xmm0, %eax
1283; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
1284; SSE-NEXT:    retq
1285;
1286; AVX1-LABEL: test_v32i16:
1287; AVX1:       # %bb.0:
1288; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1289; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1290; AVX1-NEXT:    vpmullw %xmm2, %xmm3, %xmm2
1291; AVX1-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
1292; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1293; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1294; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1295; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1296; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1297; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
1298; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1299; AVX1-NEXT:    vmovd %xmm0, %eax
1300; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
1301; AVX1-NEXT:    vzeroupper
1302; AVX1-NEXT:    retq
1303;
1304; AVX2-LABEL: test_v32i16:
1305; AVX2:       # %bb.0:
1306; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1307; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1308; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1309; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1310; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1311; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1312; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1313; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
1314; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1315; AVX2-NEXT:    vmovd %xmm0, %eax
1316; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
1317; AVX2-NEXT:    vzeroupper
1318; AVX2-NEXT:    retq
1319;
1320; AVX512BW-LABEL: test_v32i16:
1321; AVX512BW:       # %bb.0:
1322; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1323; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1324; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
1325; AVX512BW-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1326; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1327; AVX512BW-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1328; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1329; AVX512BW-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1330; AVX512BW-NEXT:    vpsrld $16, %xmm0, %xmm1
1331; AVX512BW-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1332; AVX512BW-NEXT:    vmovd %xmm0, %eax
1333; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
1334; AVX512BW-NEXT:    vzeroupper
1335; AVX512BW-NEXT:    retq
1336;
1337; AVX512BWVL-LABEL: test_v32i16:
1338; AVX512BWVL:       # %bb.0:
1339; AVX512BWVL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1340; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1341; AVX512BWVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
1342; AVX512BWVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1343; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1344; AVX512BWVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1345; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1346; AVX512BWVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1347; AVX512BWVL-NEXT:    vpsrld $16, %xmm0, %xmm1
1348; AVX512BWVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1349; AVX512BWVL-NEXT:    vmovd %xmm0, %eax
1350; AVX512BWVL-NEXT:    # kill: def $ax killed $ax killed $eax
1351; AVX512BWVL-NEXT:    vzeroupper
1352; AVX512BWVL-NEXT:    retq
1353;
1354; AVX512DQ-LABEL: test_v32i16:
1355; AVX512DQ:       # %bb.0:
1356; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1357; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1358; AVX512DQ-NEXT:    vextracti128 $1, %ymm0, %xmm1
1359; AVX512DQ-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1360; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1361; AVX512DQ-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1362; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1363; AVX512DQ-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1364; AVX512DQ-NEXT:    vpsrld $16, %xmm0, %xmm1
1365; AVX512DQ-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1366; AVX512DQ-NEXT:    vmovd %xmm0, %eax
1367; AVX512DQ-NEXT:    # kill: def $ax killed $ax killed $eax
1368; AVX512DQ-NEXT:    vzeroupper
1369; AVX512DQ-NEXT:    retq
1370;
1371; AVX512DQVL-LABEL: test_v32i16:
1372; AVX512DQVL:       # %bb.0:
1373; AVX512DQVL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1374; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1375; AVX512DQVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
1376; AVX512DQVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1377; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1378; AVX512DQVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1379; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1380; AVX512DQVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1381; AVX512DQVL-NEXT:    vpsrld $16, %xmm0, %xmm1
1382; AVX512DQVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1383; AVX512DQVL-NEXT:    vmovd %xmm0, %eax
1384; AVX512DQVL-NEXT:    # kill: def $ax killed $ax killed $eax
1385; AVX512DQVL-NEXT:    vzeroupper
1386; AVX512DQVL-NEXT:    retq
1387  %1 = call i16 @llvm.experimental.vector.reduce.mul.v32i16(<32 x i16> %a0)
1388  ret i16 %1
1389}
1390
1391define i16 @test_v64i16(<64 x i16> %a0) {
1392; SSE-LABEL: test_v64i16:
1393; SSE:       # %bb.0:
1394; SSE-NEXT:    pmullw %xmm6, %xmm2
1395; SSE-NEXT:    pmullw %xmm7, %xmm3
1396; SSE-NEXT:    pmullw %xmm5, %xmm3
1397; SSE-NEXT:    pmullw %xmm1, %xmm3
1398; SSE-NEXT:    pmullw %xmm4, %xmm2
1399; SSE-NEXT:    pmullw %xmm3, %xmm2
1400; SSE-NEXT:    pmullw %xmm0, %xmm2
1401; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
1402; SSE-NEXT:    pmullw %xmm2, %xmm0
1403; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1404; SSE-NEXT:    pmullw %xmm0, %xmm1
1405; SSE-NEXT:    movdqa %xmm1, %xmm0
1406; SSE-NEXT:    psrld $16, %xmm0
1407; SSE-NEXT:    pmullw %xmm1, %xmm0
1408; SSE-NEXT:    movd %xmm0, %eax
1409; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
1410; SSE-NEXT:    retq
1411;
1412; AVX1-LABEL: test_v64i16:
1413; AVX1:       # %bb.0:
1414; AVX1-NEXT:    vpmullw %xmm3, %xmm1, %xmm4
1415; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
1416; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1417; AVX1-NEXT:    vpmullw %xmm3, %xmm1, %xmm1
1418; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
1419; AVX1-NEXT:    vpmullw %xmm1, %xmm3, %xmm1
1420; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1421; AVX1-NEXT:    vpmullw %xmm1, %xmm3, %xmm1
1422; AVX1-NEXT:    vpmullw %xmm4, %xmm2, %xmm2
1423; AVX1-NEXT:    vpmullw %xmm1, %xmm2, %xmm1
1424; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1425; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1426; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1427; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1428; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1429; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
1430; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1431; AVX1-NEXT:    vmovd %xmm0, %eax
1432; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
1433; AVX1-NEXT:    vzeroupper
1434; AVX1-NEXT:    retq
1435;
1436; AVX2-LABEL: test_v64i16:
1437; AVX2:       # %bb.0:
1438; AVX2-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
1439; AVX2-NEXT:    vpmullw %ymm1, %ymm2, %ymm1
1440; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1441; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1442; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1443; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1444; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1445; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1446; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1447; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
1448; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1449; AVX2-NEXT:    vmovd %xmm0, %eax
1450; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
1451; AVX2-NEXT:    vzeroupper
1452; AVX2-NEXT:    retq
1453;
1454; AVX512BW-LABEL: test_v64i16:
1455; AVX512BW:       # %bb.0:
1456; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1457; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1458; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1459; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
1460; AVX512BW-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1461; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1462; AVX512BW-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1463; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1464; AVX512BW-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1465; AVX512BW-NEXT:    vpsrld $16, %xmm0, %xmm1
1466; AVX512BW-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1467; AVX512BW-NEXT:    vmovd %xmm0, %eax
1468; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
1469; AVX512BW-NEXT:    vzeroupper
1470; AVX512BW-NEXT:    retq
1471;
1472; AVX512BWVL-LABEL: test_v64i16:
1473; AVX512BWVL:       # %bb.0:
1474; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1475; AVX512BWVL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1476; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1477; AVX512BWVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
1478; AVX512BWVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1479; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1480; AVX512BWVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1481; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1482; AVX512BWVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1483; AVX512BWVL-NEXT:    vpsrld $16, %xmm0, %xmm1
1484; AVX512BWVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1485; AVX512BWVL-NEXT:    vmovd %xmm0, %eax
1486; AVX512BWVL-NEXT:    # kill: def $ax killed $ax killed $eax
1487; AVX512BWVL-NEXT:    vzeroupper
1488; AVX512BWVL-NEXT:    retq
1489;
1490; AVX512DQ-LABEL: test_v64i16:
1491; AVX512DQ:       # %bb.0:
1492; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm1, %ymm2
1493; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm3
1494; AVX512DQ-NEXT:    vpmullw %ymm2, %ymm3, %ymm2
1495; AVX512DQ-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
1496; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1497; AVX512DQ-NEXT:    vextracti128 $1, %ymm0, %xmm1
1498; AVX512DQ-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1499; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1500; AVX512DQ-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1501; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1502; AVX512DQ-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1503; AVX512DQ-NEXT:    vpsrld $16, %xmm0, %xmm1
1504; AVX512DQ-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1505; AVX512DQ-NEXT:    vmovd %xmm0, %eax
1506; AVX512DQ-NEXT:    # kill: def $ax killed $ax killed $eax
1507; AVX512DQ-NEXT:    vzeroupper
1508; AVX512DQ-NEXT:    retq
1509;
1510; AVX512DQVL-LABEL: test_v64i16:
1511; AVX512DQVL:       # %bb.0:
1512; AVX512DQVL-NEXT:    vextracti64x4 $1, %zmm1, %ymm2
1513; AVX512DQVL-NEXT:    vextracti64x4 $1, %zmm0, %ymm3
1514; AVX512DQVL-NEXT:    vpmullw %ymm2, %ymm3, %ymm2
1515; AVX512DQVL-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
1516; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1517; AVX512DQVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
1518; AVX512DQVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1519; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1520; AVX512DQVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1521; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1522; AVX512DQVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1523; AVX512DQVL-NEXT:    vpsrld $16, %xmm0, %xmm1
1524; AVX512DQVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1525; AVX512DQVL-NEXT:    vmovd %xmm0, %eax
1526; AVX512DQVL-NEXT:    # kill: def $ax killed $ax killed $eax
1527; AVX512DQVL-NEXT:    vzeroupper
1528; AVX512DQVL-NEXT:    retq
1529  %1 = call i16 @llvm.experimental.vector.reduce.mul.v64i16(<64 x i16> %a0)
1530  ret i16 %1
1531}
1532
1533;
1534; vXi8
1535;
1536
1537define i8 @test_v2i8(<2 x i8> %a0) {
1538; SSE-LABEL: test_v2i8:
1539; SSE:       # %bb.0:
1540; SSE-NEXT:    movdqa %xmm0, %xmm1
1541; SSE-NEXT:    psrlw $8, %xmm1
1542; SSE-NEXT:    pmullw %xmm0, %xmm1
1543; SSE-NEXT:    movd %xmm1, %eax
1544; SSE-NEXT:    # kill: def $al killed $al killed $eax
1545; SSE-NEXT:    retq
1546;
1547; AVX-LABEL: test_v2i8:
1548; AVX:       # %bb.0:
1549; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
1550; AVX-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1551; AVX-NEXT:    vmovd %xmm0, %eax
1552; AVX-NEXT:    # kill: def $al killed $al killed $eax
1553; AVX-NEXT:    retq
1554;
1555; AVX512-LABEL: test_v2i8:
1556; AVX512:       # %bb.0:
1557; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1558; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1559; AVX512-NEXT:    vmovd %xmm0, %eax
1560; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1561; AVX512-NEXT:    retq
1562  %1 = call i8 @llvm.experimental.vector.reduce.mul.v2i8(<2 x i8> %a0)
1563  ret i8 %1
1564}
1565
1566define i8 @test_v4i8(<4 x i8> %a0) {
1567; SSE2-LABEL: test_v4i8:
1568; SSE2:       # %bb.0:
1569; SSE2-NEXT:    movdqa %xmm0, %xmm1
1570; 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]
1571; SSE2-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
1572; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1573; SSE2-NEXT:    pmullw %xmm1, %xmm0
1574; SSE2-NEXT:    movdqa %xmm0, %xmm1
1575; SSE2-NEXT:    psrld $16, %xmm1
1576; SSE2-NEXT:    pmullw %xmm0, %xmm1
1577; SSE2-NEXT:    movd %xmm1, %eax
1578; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1579; SSE2-NEXT:    retq
1580;
1581; SSE41-LABEL: test_v4i8:
1582; SSE41:       # %bb.0:
1583; SSE41-NEXT:    pmovzxbw {{.*#+}} 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
1584; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1585; SSE41-NEXT:    pmullw %xmm0, %xmm1
1586; SSE41-NEXT:    movdqa %xmm1, %xmm0
1587; SSE41-NEXT:    psrld $16, %xmm0
1588; SSE41-NEXT:    pmullw %xmm1, %xmm0
1589; SSE41-NEXT:    movd %xmm0, %eax
1590; SSE41-NEXT:    # kill: def $al killed $al killed $eax
1591; SSE41-NEXT:    retq
1592;
1593; AVX-LABEL: test_v4i8:
1594; AVX:       # %bb.0:
1595; AVX-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
1596; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1597; AVX-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1598; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
1599; AVX-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1600; AVX-NEXT:    vmovd %xmm0, %eax
1601; AVX-NEXT:    # kill: def $al killed $al killed $eax
1602; AVX-NEXT:    retq
1603;
1604; AVX512-LABEL: test_v4i8:
1605; AVX512:       # %bb.0:
1606; AVX512-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
1607; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1608; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1609; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1610; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1611; AVX512-NEXT:    vmovd %xmm0, %eax
1612; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1613; AVX512-NEXT:    retq
1614  %1 = call i8 @llvm.experimental.vector.reduce.mul.v4i8(<4 x i8> %a0)
1615  ret i8 %1
1616}
1617
1618define i8 @test_v8i8(<8 x i8> %a0) {
1619; SSE2-LABEL: test_v8i8:
1620; SSE2:       # %bb.0:
1621; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,2,3,3]
1622; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1623; 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]
1624; SSE2-NEXT:    pmullw %xmm0, %xmm1
1625; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,2,3,0]
1626; SSE2-NEXT:    pmullw %xmm1, %xmm0
1627; SSE2-NEXT:    movdqa %xmm0, %xmm1
1628; SSE2-NEXT:    psrld $16, %xmm1
1629; SSE2-NEXT:    pmullw %xmm0, %xmm1
1630; SSE2-NEXT:    movd %xmm1, %eax
1631; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1632; SSE2-NEXT:    retq
1633;
1634; SSE41-LABEL: test_v8i8:
1635; SSE41:       # %bb.0:
1636; SSE41-NEXT:    pmovzxbw {{.*#+}} 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
1637; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1638; SSE41-NEXT:    pmullw %xmm0, %xmm1
1639; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1640; SSE41-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
1641; SSE41-NEXT:    pmovzxbw {{.*#+}} 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
1642; SSE41-NEXT:    pmullw %xmm0, %xmm1
1643; SSE41-NEXT:    movdqa %xmm1, %xmm0
1644; SSE41-NEXT:    psrld $16, %xmm0
1645; SSE41-NEXT:    pmullw %xmm1, %xmm0
1646; SSE41-NEXT:    movd %xmm0, %eax
1647; SSE41-NEXT:    # kill: def $al killed $al killed $eax
1648; SSE41-NEXT:    retq
1649;
1650; AVX-LABEL: test_v8i8:
1651; AVX:       # %bb.0:
1652; AVX-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
1653; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1654; AVX-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1655; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1656; AVX-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1657; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
1658; AVX-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1659; AVX-NEXT:    vmovd %xmm0, %eax
1660; AVX-NEXT:    # kill: def $al killed $al killed $eax
1661; AVX-NEXT:    retq
1662;
1663; AVX512-LABEL: test_v8i8:
1664; AVX512:       # %bb.0:
1665; AVX512-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
1666; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1667; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1668; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1669; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1670; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1671; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1672; AVX512-NEXT:    vmovd %xmm0, %eax
1673; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1674; AVX512-NEXT:    retq
1675  %1 = call i8 @llvm.experimental.vector.reduce.mul.v8i8(<8 x i8> %a0)
1676  ret i8 %1
1677}
1678
1679define i8 @test_v16i8(<16 x i8> %a0) {
1680; SSE2-LABEL: test_v16i8:
1681; SSE2:       # %bb.0:
1682; SSE2-NEXT:    movdqa %xmm0, %xmm1
1683; 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]
1684; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1685; SSE2-NEXT:    pmullw %xmm1, %xmm0
1686; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
1687; SSE2-NEXT:    movdqa %xmm0, %xmm2
1688; SSE2-NEXT:    pand %xmm1, %xmm2
1689; SSE2-NEXT:    pxor %xmm3, %xmm3
1690; SSE2-NEXT:    packuswb %xmm3, %xmm2
1691; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,2,3,3]
1692; 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]
1693; SSE2-NEXT:    pmullw %xmm0, %xmm2
1694; SSE2-NEXT:    movdqa %xmm2, %xmm0
1695; SSE2-NEXT:    pand %xmm1, %xmm0
1696; SSE2-NEXT:    packuswb %xmm3, %xmm0
1697; SSE2-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
1698; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1699; SSE2-NEXT:    pmullw %xmm2, %xmm0
1700; SSE2-NEXT:    pand %xmm1, %xmm0
1701; SSE2-NEXT:    packuswb %xmm3, %xmm0
1702; SSE2-NEXT:    movdqa %xmm0, %xmm1
1703; SSE2-NEXT:    psrlw $8, %xmm1
1704; SSE2-NEXT:    pmullw %xmm0, %xmm1
1705; SSE2-NEXT:    movd %xmm1, %eax
1706; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1707; SSE2-NEXT:    retq
1708;
1709; SSE41-LABEL: test_v16i8:
1710; SSE41:       # %bb.0:
1711; 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
1712; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1713; SSE41-NEXT:    pmullw %xmm1, %xmm0
1714; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
1715; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
1716; SSE41-NEXT:    pand %xmm1, %xmm0
1717; SSE41-NEXT:    pxor %xmm3, %xmm3
1718; SSE41-NEXT:    packuswb %xmm3, %xmm0
1719; SSE41-NEXT:    pmovzxbw {{.*#+}} 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
1720; SSE41-NEXT:    pmullw %xmm2, %xmm0
1721; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
1722; SSE41-NEXT:    pand %xmm1, %xmm0
1723; SSE41-NEXT:    packuswb %xmm3, %xmm0
1724; SSE41-NEXT:    pmovzxbw {{.*#+}} 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
1725; SSE41-NEXT:    pmullw %xmm2, %xmm0
1726; SSE41-NEXT:    pand %xmm1, %xmm0
1727; SSE41-NEXT:    packuswb %xmm3, %xmm0
1728; SSE41-NEXT:    movdqa %xmm0, %xmm1
1729; SSE41-NEXT:    psrlw $8, %xmm1
1730; SSE41-NEXT:    pmullw %xmm0, %xmm1
1731; SSE41-NEXT:    movd %xmm1, %eax
1732; SSE41-NEXT:    # kill: def $al killed $al killed $eax
1733; SSE41-NEXT:    retq
1734;
1735; AVX1-LABEL: test_v16i8:
1736; AVX1:       # %bb.0:
1737; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1738; 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
1739; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1740; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1741; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1742; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1743; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1744; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1745; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1746; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
1747; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
1748; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1749; AVX1-NEXT:    vmovd %xmm0, %eax
1750; AVX1-NEXT:    # kill: def $al killed $al killed $eax
1751; AVX1-NEXT:    retq
1752;
1753; AVX2-LABEL: test_v16i8:
1754; AVX2:       # %bb.0:
1755; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1756; AVX2-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
1757; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1758; AVX2-NEXT:    vpshufb {{.*#+}} xmm1 = xmm0[8],zero,xmm0[10],zero,xmm0[12],zero,xmm0[14],zero,xmm0[8],zero,xmm0[10],zero,xmm0[12],zero,xmm0[14],zero
1759; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1760; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1761; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1762; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1763; AVX2-NEXT:    vpshufb {{.*#+}} xmm1 = xmm0[2],zero,xmm0[2],zero,xmm0[4],zero,xmm0[6],zero,xmm0[8],zero,xmm0[10],zero,xmm0[12],zero,xmm0[14],zero
1764; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1765; AVX2-NEXT:    vmovd %xmm0, %eax
1766; AVX2-NEXT:    # kill: def $al killed $al killed $eax
1767; AVX2-NEXT:    retq
1768;
1769; AVX512BW-LABEL: test_v16i8:
1770; AVX512BW:       # %bb.0:
1771; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1772; 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
1773; 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
1774; AVX512BW-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1775; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm1
1776; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
1777; 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
1778; AVX512BW-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1779; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm1
1780; AVX512BW-NEXT:    vpsrld $16, %xmm1, %xmm1
1781; 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
1782; AVX512BW-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1783; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm1
1784; AVX512BW-NEXT:    vpsrlw $8, %xmm1, %xmm1
1785; AVX512BW-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1786; AVX512BW-NEXT:    vmovd %xmm0, %eax
1787; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
1788; AVX512BW-NEXT:    vzeroupper
1789; AVX512BW-NEXT:    retq
1790;
1791; AVX512BWVL-LABEL: test_v16i8:
1792; AVX512BWVL:       # %bb.0:
1793; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1794; 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
1795; 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
1796; AVX512BWVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1797; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm1
1798; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
1799; 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
1800; AVX512BWVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1801; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm1
1802; AVX512BWVL-NEXT:    vpsrld $16, %xmm1, %xmm1
1803; 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
1804; AVX512BWVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1805; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm1
1806; AVX512BWVL-NEXT:    vpsrlw $8, %xmm1, %xmm1
1807; AVX512BWVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1808; AVX512BWVL-NEXT:    vmovd %xmm0, %eax
1809; AVX512BWVL-NEXT:    # kill: def $al killed $al killed $eax
1810; AVX512BWVL-NEXT:    vzeroupper
1811; AVX512BWVL-NEXT:    retq
1812;
1813; AVX512DQ-LABEL: test_v16i8:
1814; AVX512DQ:       # %bb.0:
1815; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1816; 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
1817; 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
1818; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1819; 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
1820; AVX512DQ-NEXT:    vpmovdb %zmm1, %xmm1
1821; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
1822; 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
1823; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1824; 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
1825; AVX512DQ-NEXT:    vpmovdb %zmm1, %xmm1
1826; AVX512DQ-NEXT:    vpsrld $16, %xmm1, %xmm1
1827; 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
1828; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1829; 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
1830; AVX512DQ-NEXT:    vpmovdb %zmm1, %xmm1
1831; AVX512DQ-NEXT:    vpsrlw $8, %xmm1, %xmm1
1832; AVX512DQ-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1833; AVX512DQ-NEXT:    vmovd %xmm0, %eax
1834; AVX512DQ-NEXT:    # kill: def $al killed $al killed $eax
1835; AVX512DQ-NEXT:    vzeroupper
1836; AVX512DQ-NEXT:    retq
1837;
1838; AVX512DQVL-LABEL: test_v16i8:
1839; AVX512DQVL:       # %bb.0:
1840; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1841; 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
1842; 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
1843; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1844; 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
1845; AVX512DQVL-NEXT:    vpmovdb %zmm1, %xmm1
1846; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
1847; 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
1848; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1849; 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
1850; AVX512DQVL-NEXT:    vpmovdb %zmm1, %xmm1
1851; AVX512DQVL-NEXT:    vpsrld $16, %xmm1, %xmm1
1852; 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
1853; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1854; 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
1855; AVX512DQVL-NEXT:    vpmovdb %zmm1, %xmm1
1856; AVX512DQVL-NEXT:    vpsrlw $8, %xmm1, %xmm1
1857; AVX512DQVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1858; AVX512DQVL-NEXT:    vmovd %xmm0, %eax
1859; AVX512DQVL-NEXT:    # kill: def $al killed $al killed $eax
1860; AVX512DQVL-NEXT:    vzeroupper
1861; AVX512DQVL-NEXT:    retq
1862  %1 = call i8 @llvm.experimental.vector.reduce.mul.v16i8(<16 x i8> %a0)
1863  ret i8 %1
1864}
1865
1866define i8 @test_v32i8(<32 x i8> %a0) {
1867; SSE2-LABEL: test_v32i8:
1868; SSE2:       # %bb.0:
1869; SSE2-NEXT:    movdqa %xmm1, %xmm2
1870; 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]
1871; SSE2-NEXT:    movdqa %xmm0, %xmm3
1872; 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]
1873; SSE2-NEXT:    pmullw %xmm2, %xmm3
1874; 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]
1875; SSE2-NEXT:    pmullw %xmm3, %xmm1
1876; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1877; SSE2-NEXT:    pmullw %xmm1, %xmm0
1878; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
1879; SSE2-NEXT:    movdqa %xmm0, %xmm2
1880; SSE2-NEXT:    pand %xmm1, %xmm2
1881; SSE2-NEXT:    pxor %xmm3, %xmm3
1882; SSE2-NEXT:    packuswb %xmm3, %xmm2
1883; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,2,3,3]
1884; 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]
1885; SSE2-NEXT:    pmullw %xmm0, %xmm2
1886; SSE2-NEXT:    movdqa %xmm2, %xmm0
1887; SSE2-NEXT:    pand %xmm1, %xmm0
1888; SSE2-NEXT:    packuswb %xmm3, %xmm0
1889; SSE2-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
1890; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1891; SSE2-NEXT:    pmullw %xmm2, %xmm0
1892; SSE2-NEXT:    pand %xmm1, %xmm0
1893; SSE2-NEXT:    packuswb %xmm3, %xmm0
1894; SSE2-NEXT:    movdqa %xmm0, %xmm1
1895; SSE2-NEXT:    psrlw $8, %xmm1
1896; SSE2-NEXT:    pmullw %xmm0, %xmm1
1897; SSE2-NEXT:    movd %xmm1, %eax
1898; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1899; SSE2-NEXT:    retq
1900;
1901; SSE41-LABEL: test_v32i8:
1902; SSE41:       # %bb.0:
1903; 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
1904; 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]
1905; 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
1906; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1907; SSE41-NEXT:    pmullw %xmm1, %xmm0
1908; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
1909; SSE41-NEXT:    movdqa %xmm0, %xmm4
1910; SSE41-NEXT:    pand %xmm1, %xmm4
1911; SSE41-NEXT:    pmullw %xmm2, %xmm3
1912; SSE41-NEXT:    pand %xmm1, %xmm3
1913; SSE41-NEXT:    packuswb %xmm4, %xmm3
1914; 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
1915; SSE41-NEXT:    pmullw %xmm0, %xmm2
1916; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
1917; SSE41-NEXT:    pand %xmm1, %xmm2
1918; SSE41-NEXT:    pxor %xmm3, %xmm3
1919; SSE41-NEXT:    packuswb %xmm3, %xmm2
1920; SSE41-NEXT:    pmovzxbw {{.*#+}} 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
1921; SSE41-NEXT:    pmullw %xmm0, %xmm2
1922; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
1923; SSE41-NEXT:    pand %xmm1, %xmm2
1924; SSE41-NEXT:    packuswb %xmm3, %xmm2
1925; SSE41-NEXT:    pmovzxbw {{.*#+}} 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
1926; SSE41-NEXT:    pmullw %xmm0, %xmm2
1927; SSE41-NEXT:    pand %xmm1, %xmm2
1928; SSE41-NEXT:    packuswb %xmm3, %xmm2
1929; SSE41-NEXT:    movdqa %xmm2, %xmm0
1930; SSE41-NEXT:    psrlw $8, %xmm0
1931; SSE41-NEXT:    pmullw %xmm2, %xmm0
1932; SSE41-NEXT:    movd %xmm0, %eax
1933; SSE41-NEXT:    # kill: def $al killed $al killed $eax
1934; SSE41-NEXT:    retq
1935;
1936; AVX1-LABEL: test_v32i8:
1937; AVX1:       # %bb.0:
1938; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1939; 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]
1940; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1941; AVX1-NEXT:    vpmullw %xmm2, %xmm3, %xmm2
1942; 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
1943; AVX1-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
1944; 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
1945; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1946; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1947; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1948; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1949; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1950; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1951; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1952; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
1953; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
1954; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1955; AVX1-NEXT:    vmovd %xmm0, %eax
1956; AVX1-NEXT:    # kill: def $al killed $al killed $eax
1957; AVX1-NEXT:    vzeroupper
1958; AVX1-NEXT:    retq
1959;
1960; AVX2-LABEL: test_v32i8:
1961; AVX2:       # %bb.0:
1962; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1963; AVX2-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]
1964; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1965; AVX2-NEXT:    vpmullw %xmm2, %xmm3, %xmm2
1966; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
1967; AVX2-NEXT:    vpand %xmm3, %xmm2, %xmm2
1968; AVX2-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
1969; AVX2-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
1970; AVX2-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
1971; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1972; AVX2-NEXT:    vpand %xmm3, %xmm0, %xmm1
1973; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1974; AVX2-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
1975; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
1976; AVX2-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
1977; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1978; AVX2-NEXT:    vpand %xmm3, %xmm0, %xmm1
1979; AVX2-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
1980; AVX2-NEXT:    vpsrld $16, %xmm1, %xmm1
1981; AVX2-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
1982; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1983; AVX2-NEXT:    vpand %xmm3, %xmm0, %xmm0
1984; AVX2-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
1985; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
1986; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1987; AVX2-NEXT:    vmovd %xmm0, %eax
1988; AVX2-NEXT:    # kill: def $al killed $al killed $eax
1989; AVX2-NEXT:    vzeroupper
1990; AVX2-NEXT:    retq
1991;
1992; AVX512BW-LABEL: test_v32i8:
1993; AVX512BW:       # %bb.0:
1994; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
1995; 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
1996; 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
1997; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
1998; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm1
1999; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
2000; 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
2001; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2002; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm1
2003; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
2004; 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
2005; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2006; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm1
2007; AVX512BW-NEXT:    vpsrld $16, %xmm1, %xmm1
2008; 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
2009; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2010; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm1
2011; AVX512BW-NEXT:    vpsrlw $8, %xmm1, %xmm1
2012; 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
2013; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2014; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
2015; AVX512BW-NEXT:    vmovd %xmm0, %eax
2016; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
2017; AVX512BW-NEXT:    vzeroupper
2018; AVX512BW-NEXT:    retq
2019;
2020; AVX512BWVL-LABEL: test_v32i8:
2021; AVX512BWVL:       # %bb.0:
2022; AVX512BWVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
2023; 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
2024; 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
2025; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2026; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm1
2027; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
2028; 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
2029; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2030; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm1
2031; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
2032; 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
2033; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2034; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm1
2035; AVX512BWVL-NEXT:    vpsrld $16, %xmm1, %xmm1
2036; 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
2037; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2038; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm1
2039; AVX512BWVL-NEXT:    vpsrlw $8, %xmm1, %xmm1
2040; 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
2041; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2042; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm0
2043; AVX512BWVL-NEXT:    vmovd %xmm0, %eax
2044; AVX512BWVL-NEXT:    # kill: def $al killed $al killed $eax
2045; AVX512BWVL-NEXT:    vzeroupper
2046; AVX512BWVL-NEXT:    retq
2047;
2048; AVX512DQ-LABEL: test_v32i8:
2049; AVX512DQ:       # %bb.0:
2050; AVX512DQ-NEXT:    vextracti128 $1, %ymm0, %xmm1
2051; AVX512DQ-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]
2052; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2053; AVX512DQ-NEXT:    vpmullw %xmm2, %xmm3, %xmm2
2054; AVX512DQ-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
2055; AVX512DQ-NEXT:    vpand %xmm3, %xmm2, %xmm2
2056; AVX512DQ-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
2057; AVX512DQ-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
2058; AVX512DQ-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
2059; AVX512DQ-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2060; AVX512DQ-NEXT:    vpand %xmm3, %xmm0, %xmm1
2061; AVX512DQ-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2062; AVX512DQ-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
2063; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
2064; AVX512DQ-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
2065; AVX512DQ-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2066; AVX512DQ-NEXT:    vpand %xmm3, %xmm0, %xmm1
2067; AVX512DQ-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
2068; AVX512DQ-NEXT:    vpsrld $16, %xmm1, %xmm1
2069; AVX512DQ-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
2070; AVX512DQ-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2071; AVX512DQ-NEXT:    vpand %xmm3, %xmm0, %xmm0
2072; AVX512DQ-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
2073; AVX512DQ-NEXT:    vpsrlw $8, %xmm0, %xmm1
2074; AVX512DQ-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2075; AVX512DQ-NEXT:    vmovd %xmm0, %eax
2076; AVX512DQ-NEXT:    # kill: def $al killed $al killed $eax
2077; AVX512DQ-NEXT:    vzeroupper
2078; AVX512DQ-NEXT:    retq
2079;
2080; AVX512DQVL-LABEL: test_v32i8:
2081; AVX512DQVL:       # %bb.0:
2082; AVX512DQVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
2083; AVX512DQVL-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]
2084; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2085; AVX512DQVL-NEXT:    vpmullw %xmm2, %xmm3, %xmm2
2086; AVX512DQVL-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
2087; AVX512DQVL-NEXT:    vpand %xmm3, %xmm2, %xmm2
2088; AVX512DQVL-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
2089; AVX512DQVL-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
2090; AVX512DQVL-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
2091; AVX512DQVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2092; AVX512DQVL-NEXT:    vpand %xmm3, %xmm0, %xmm1
2093; AVX512DQVL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2094; AVX512DQVL-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
2095; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
2096; AVX512DQVL-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
2097; AVX512DQVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2098; AVX512DQVL-NEXT:    vpand %xmm3, %xmm0, %xmm1
2099; AVX512DQVL-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
2100; AVX512DQVL-NEXT:    vpsrld $16, %xmm1, %xmm1
2101; AVX512DQVL-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
2102; AVX512DQVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2103; AVX512DQVL-NEXT:    vpand %xmm3, %xmm0, %xmm0
2104; AVX512DQVL-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
2105; AVX512DQVL-NEXT:    vpsrlw $8, %xmm0, %xmm1
2106; AVX512DQVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2107; AVX512DQVL-NEXT:    vmovd %xmm0, %eax
2108; AVX512DQVL-NEXT:    # kill: def $al killed $al killed $eax
2109; AVX512DQVL-NEXT:    vzeroupper
2110; AVX512DQVL-NEXT:    retq
2111  %1 = call i8 @llvm.experimental.vector.reduce.mul.v32i8(<32 x i8> %a0)
2112  ret i8 %1
2113}
2114
2115define i8 @test_v64i8(<64 x i8> %a0) {
2116; SSE2-LABEL: test_v64i8:
2117; SSE2:       # %bb.0:
2118; SSE2-NEXT:    movdqa %xmm3, %xmm4
2119; 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]
2120; SSE2-NEXT:    movdqa %xmm1, %xmm5
2121; 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]
2122; SSE2-NEXT:    pmullw %xmm4, %xmm5
2123; SSE2-NEXT:    movdqa %xmm2, %xmm4
2124; 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]
2125; SSE2-NEXT:    pmullw %xmm5, %xmm4
2126; SSE2-NEXT:    movdqa %xmm0, %xmm5
2127; 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]
2128; 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]
2129; 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]
2130; SSE2-NEXT:    pmullw %xmm3, %xmm1
2131; 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]
2132; SSE2-NEXT:    pmullw %xmm1, %xmm2
2133; SSE2-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2134; SSE2-NEXT:    pmullw %xmm2, %xmm0
2135; SSE2-NEXT:    pmullw %xmm4, %xmm0
2136; SSE2-NEXT:    pmullw %xmm5, %xmm0
2137; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
2138; SSE2-NEXT:    movdqa %xmm0, %xmm2
2139; SSE2-NEXT:    pand %xmm1, %xmm2
2140; SSE2-NEXT:    pxor %xmm3, %xmm3
2141; SSE2-NEXT:    packuswb %xmm3, %xmm2
2142; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,2,3,3]
2143; 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]
2144; SSE2-NEXT:    pmullw %xmm0, %xmm2
2145; SSE2-NEXT:    movdqa %xmm2, %xmm0
2146; SSE2-NEXT:    pand %xmm1, %xmm0
2147; SSE2-NEXT:    packuswb %xmm3, %xmm0
2148; SSE2-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
2149; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2150; SSE2-NEXT:    pmullw %xmm2, %xmm0
2151; SSE2-NEXT:    pand %xmm1, %xmm0
2152; SSE2-NEXT:    packuswb %xmm3, %xmm0
2153; SSE2-NEXT:    movdqa %xmm0, %xmm1
2154; SSE2-NEXT:    psrlw $8, %xmm1
2155; SSE2-NEXT:    pmullw %xmm0, %xmm1
2156; SSE2-NEXT:    movd %xmm1, %eax
2157; SSE2-NEXT:    # kill: def $al killed $al killed $eax
2158; SSE2-NEXT:    retq
2159;
2160; SSE41-LABEL: test_v64i8:
2161; SSE41:       # %bb.0:
2162; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm4 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
2163; 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]
2164; 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
2165; 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]
2166; SSE41-NEXT:    pmullw %xmm3, %xmm1
2167; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
2168; 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]
2169; SSE41-NEXT:    pmullw %xmm1, %xmm2
2170; 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
2171; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2172; SSE41-NEXT:    pmullw %xmm2, %xmm0
2173; SSE41-NEXT:    pmullw %xmm3, %xmm1
2174; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
2175; SSE41-NEXT:    pshufb %xmm2, %xmm1
2176; SSE41-NEXT:    pmullw %xmm4, %xmm5
2177; SSE41-NEXT:    pshufb %xmm2, %xmm5
2178; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
2179; SSE41-NEXT:    movdqa %xmm0, %xmm3
2180; SSE41-NEXT:    pand %xmm2, %xmm3
2181; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm4 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
2182; SSE41-NEXT:    pmovzxbw {{.*#+}} 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
2183; SSE41-NEXT:    pmullw %xmm4, %xmm1
2184; SSE41-NEXT:    pand %xmm2, %xmm1
2185; SSE41-NEXT:    packuswb %xmm3, %xmm1
2186; SSE41-NEXT:    pmovzxbw {{.*#+}} 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
2187; SSE41-NEXT:    pmullw %xmm0, %xmm1
2188; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
2189; SSE41-NEXT:    pand %xmm2, %xmm1
2190; SSE41-NEXT:    pxor %xmm3, %xmm3
2191; SSE41-NEXT:    packuswb %xmm3, %xmm1
2192; SSE41-NEXT:    pmovzxbw {{.*#+}} 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
2193; SSE41-NEXT:    pmullw %xmm0, %xmm1
2194; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
2195; SSE41-NEXT:    pand %xmm2, %xmm1
2196; SSE41-NEXT:    packuswb %xmm3, %xmm1
2197; SSE41-NEXT:    pmovzxbw {{.*#+}} 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
2198; SSE41-NEXT:    pmullw %xmm0, %xmm1
2199; SSE41-NEXT:    pand %xmm2, %xmm1
2200; SSE41-NEXT:    packuswb %xmm3, %xmm1
2201; SSE41-NEXT:    movdqa %xmm1, %xmm0
2202; SSE41-NEXT:    psrlw $8, %xmm0
2203; SSE41-NEXT:    pmullw %xmm1, %xmm0
2204; SSE41-NEXT:    movd %xmm0, %eax
2205; SSE41-NEXT:    # kill: def $al killed $al killed $eax
2206; SSE41-NEXT:    retq
2207;
2208; AVX1-LABEL: test_v64i8:
2209; AVX1:       # %bb.0:
2210; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2211; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = 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]
2212; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
2213; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = 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]
2214; AVX1-NEXT:    vpmullw %xmm3, %xmm5, %xmm3
2215; 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]
2216; AVX1-NEXT:    vpmullw %xmm3, %xmm5, %xmm3
2217; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2218; AVX1-NEXT:    vpmullw %xmm3, %xmm5, %xmm3
2219; 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
2220; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero
2221; AVX1-NEXT:    vpmullw %xmm2, %xmm4, %xmm2
2222; 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
2223; AVX1-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
2224; AVX1-NEXT:    vpmullw %xmm3, %xmm1, %xmm1
2225; 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
2226; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2227; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
2228; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2229; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
2230; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2231; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
2232; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2233; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2234; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
2235; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2236; AVX1-NEXT:    vmovd %xmm0, %eax
2237; AVX1-NEXT:    # kill: def $al killed $al killed $eax
2238; AVX1-NEXT:    vzeroupper
2239; AVX1-NEXT:    retq
2240;
2241; AVX2-LABEL: test_v64i8:
2242; AVX2:       # %bb.0:
2243; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm2 = 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]
2244; 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]
2245; AVX2-NEXT:    vpmullw %ymm2, %ymm3, %ymm2
2246; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm1 = 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]
2247; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm0 = 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]
2248; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
2249; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2250; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2251; AVX2-NEXT:    vmovdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
2252; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
2253; AVX2-NEXT:    vextracti128 $1, %ymm2, %xmm3
2254; AVX2-NEXT:    vpmullw %xmm0, %xmm3, %xmm0
2255; AVX2-NEXT:    vpmullw %xmm0, %xmm2, %xmm0
2256; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm2
2257; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
2258; AVX2-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
2259; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,2,3]
2260; AVX2-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
2261; AVX2-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
2262; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm2
2263; AVX2-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
2264; AVX2-NEXT:    vpsrld $16, %xmm2, %xmm2
2265; AVX2-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
2266; AVX2-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
2267; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
2268; AVX2-NEXT:    vpackuswb %xmm3, %xmm0, %xmm0
2269; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
2270; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2271; AVX2-NEXT:    vmovd %xmm0, %eax
2272; AVX2-NEXT:    # kill: def $al killed $al killed $eax
2273; AVX2-NEXT:    vzeroupper
2274; AVX2-NEXT:    retq
2275;
2276; AVX512BW-LABEL: test_v64i8:
2277; AVX512BW:       # %bb.0:
2278; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2279; 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]
2280; 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]
2281; AVX512BW-NEXT:    vpmullw %zmm3, %zmm2, %zmm2
2282; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2283; AVX512BW-NEXT:    vpand %ymm3, %ymm2, %ymm4
2284; 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]
2285; 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]
2286; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2287; AVX512BW-NEXT:    vpand %ymm3, %ymm0, %ymm1
2288; AVX512BW-NEXT:    vpackuswb %ymm4, %ymm1, %ymm1
2289; AVX512BW-NEXT:    vextracti128 $1, %ymm1, %xmm1
2290; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} xmm3 = 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]
2291; AVX512BW-NEXT:    vpmullw %xmm3, %xmm2, %xmm2
2292; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
2293; AVX512BW-NEXT:    vpand %xmm3, %xmm2, %xmm2
2294; AVX512BW-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
2295; AVX512BW-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
2296; AVX512BW-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2297; AVX512BW-NEXT:    vpand %xmm3, %xmm0, %xmm1
2298; AVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2299; AVX512BW-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
2300; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
2301; AVX512BW-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
2302; AVX512BW-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2303; AVX512BW-NEXT:    vpand %xmm3, %xmm0, %xmm1
2304; AVX512BW-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
2305; AVX512BW-NEXT:    vpsrld $16, %xmm1, %xmm1
2306; AVX512BW-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
2307; AVX512BW-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2308; AVX512BW-NEXT:    vpand %xmm3, %xmm0, %xmm0
2309; AVX512BW-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
2310; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
2311; AVX512BW-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2312; AVX512BW-NEXT:    vmovd %xmm0, %eax
2313; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
2314; AVX512BW-NEXT:    vzeroupper
2315; AVX512BW-NEXT:    retq
2316;
2317; AVX512BWVL-LABEL: test_v64i8:
2318; AVX512BWVL:       # %bb.0:
2319; AVX512BWVL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2320; 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]
2321; 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]
2322; AVX512BWVL-NEXT:    vpmullw %zmm3, %zmm2, %zmm2
2323; AVX512BWVL-NEXT:    vmovdqa {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2324; AVX512BWVL-NEXT:    vpand %ymm3, %ymm2, %ymm4
2325; 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]
2326; 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]
2327; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2328; AVX512BWVL-NEXT:    vpand %ymm3, %ymm0, %ymm1
2329; AVX512BWVL-NEXT:    vpackuswb %ymm4, %ymm1, %ymm1
2330; AVX512BWVL-NEXT:    vextracti128 $1, %ymm1, %xmm1
2331; AVX512BWVL-NEXT:    vpunpckhbw {{.*#+}} xmm3 = 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]
2332; AVX512BWVL-NEXT:    vpmullw %xmm3, %xmm2, %xmm2
2333; AVX512BWVL-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm2
2334; AVX512BWVL-NEXT:    vpmovwb %ymm2, %xmm2
2335; AVX512BWVL-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
2336; AVX512BWVL-NEXT:    vpunpckhbw {{.*#+}} 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]
2337; AVX512BWVL-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
2338; AVX512BWVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2339; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm1
2340; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
2341; AVX512BWVL-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
2342; AVX512BWVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2343; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm1
2344; AVX512BWVL-NEXT:    vpsrld $16, %xmm1, %xmm1
2345; AVX512BWVL-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
2346; AVX512BWVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2347; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm0
2348; AVX512BWVL-NEXT:    vpsrlw $8, %xmm0, %xmm1
2349; AVX512BWVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2350; AVX512BWVL-NEXT:    vmovd %xmm0, %eax
2351; AVX512BWVL-NEXT:    # kill: def $al killed $al killed $eax
2352; AVX512BWVL-NEXT:    vzeroupper
2353; AVX512BWVL-NEXT:    retq
2354;
2355; AVX512DQ-LABEL: test_v64i8:
2356; AVX512DQ:       # %bb.0:
2357; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2358; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm2 = 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]
2359; 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]
2360; AVX512DQ-NEXT:    vpmullw %ymm2, %ymm3, %ymm2
2361; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} ymm1 = 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]
2362; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} ymm0 = 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]
2363; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
2364; AVX512DQ-NEXT:    vextracti128 $1, %ymm0, %xmm1
2365; AVX512DQ-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2366; AVX512DQ-NEXT:    vextracti128 $1, %ymm2, %xmm1
2367; AVX512DQ-NEXT:    vpmullw %xmm0, %xmm1, %xmm0
2368; AVX512DQ-NEXT:    vpmullw %xmm0, %xmm2, %xmm0
2369; AVX512DQ-NEXT:    vmovdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
2370; AVX512DQ-NEXT:    vpand %xmm1, %xmm0, %xmm2
2371; AVX512DQ-NEXT:    vpxor %xmm3, %xmm3, %xmm3
2372; AVX512DQ-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
2373; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,2,3]
2374; AVX512DQ-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
2375; AVX512DQ-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
2376; AVX512DQ-NEXT:    vpand %xmm1, %xmm0, %xmm2
2377; AVX512DQ-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
2378; AVX512DQ-NEXT:    vpsrld $16, %xmm2, %xmm2
2379; AVX512DQ-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
2380; AVX512DQ-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
2381; AVX512DQ-NEXT:    vpand %xmm1, %xmm0, %xmm0
2382; AVX512DQ-NEXT:    vpackuswb %xmm3, %xmm0, %xmm0
2383; AVX512DQ-NEXT:    vpsrlw $8, %xmm0, %xmm1
2384; AVX512DQ-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2385; AVX512DQ-NEXT:    vmovd %xmm0, %eax
2386; AVX512DQ-NEXT:    # kill: def $al killed $al killed $eax
2387; AVX512DQ-NEXT:    vzeroupper
2388; AVX512DQ-NEXT:    retq
2389;
2390; AVX512DQVL-LABEL: test_v64i8:
2391; AVX512DQVL:       # %bb.0:
2392; AVX512DQVL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2393; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm2 = 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]
2394; AVX512DQVL-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]
2395; AVX512DQVL-NEXT:    vpmullw %ymm2, %ymm3, %ymm2
2396; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} ymm1 = 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]
2397; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} ymm0 = 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]
2398; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
2399; AVX512DQVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
2400; AVX512DQVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2401; AVX512DQVL-NEXT:    vextracti128 $1, %ymm2, %xmm1
2402; AVX512DQVL-NEXT:    vpmullw %xmm0, %xmm1, %xmm0
2403; AVX512DQVL-NEXT:    vpmullw %xmm0, %xmm2, %xmm0
2404; AVX512DQVL-NEXT:    vmovdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
2405; AVX512DQVL-NEXT:    vpand %xmm1, %xmm0, %xmm2
2406; AVX512DQVL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
2407; AVX512DQVL-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
2408; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,2,3]
2409; AVX512DQVL-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
2410; AVX512DQVL-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
2411; AVX512DQVL-NEXT:    vpand %xmm1, %xmm0, %xmm2
2412; AVX512DQVL-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
2413; AVX512DQVL-NEXT:    vpsrld $16, %xmm2, %xmm2
2414; AVX512DQVL-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
2415; AVX512DQVL-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
2416; AVX512DQVL-NEXT:    vpand %xmm1, %xmm0, %xmm0
2417; AVX512DQVL-NEXT:    vpackuswb %xmm3, %xmm0, %xmm0
2418; AVX512DQVL-NEXT:    vpsrlw $8, %xmm0, %xmm1
2419; AVX512DQVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2420; AVX512DQVL-NEXT:    vmovd %xmm0, %eax
2421; AVX512DQVL-NEXT:    # kill: def $al killed $al killed $eax
2422; AVX512DQVL-NEXT:    vzeroupper
2423; AVX512DQVL-NEXT:    retq
2424  %1 = call i8 @llvm.experimental.vector.reduce.mul.v64i8(<64 x i8> %a0)
2425  ret i8 %1
2426}
2427
2428define i8 @test_v128i8(<128 x i8> %a0) {
2429; SSE2-LABEL: test_v128i8:
2430; SSE2:       # %bb.0:
2431; SSE2-NEXT:    movdqa %xmm6, %xmm8
2432; 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]
2433; SSE2-NEXT:    movdqa %xmm2, %xmm9
2434; 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]
2435; SSE2-NEXT:    pmullw %xmm8, %xmm9
2436; SSE2-NEXT:    movdqa %xmm4, %xmm10
2437; SSE2-NEXT:    punpckhbw {{.*#+}} xmm10 = xmm10[8],xmm0[8],xmm10[9],xmm0[9],xmm10[10],xmm0[10],xmm10[11],xmm0[11],xmm10[12],xmm0[12],xmm10[13],xmm0[13],xmm10[14],xmm0[14],xmm10[15],xmm0[15]
2438; SSE2-NEXT:    pmullw %xmm9, %xmm10
2439; SSE2-NEXT:    movdqa %xmm0, %xmm9
2440; 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]
2441; SSE2-NEXT:    movdqa %xmm7, %xmm8
2442; 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]
2443; SSE2-NEXT:    movdqa %xmm3, %xmm11
2444; SSE2-NEXT:    punpckhbw {{.*#+}} xmm11 = xmm11[8],xmm0[8],xmm11[9],xmm0[9],xmm11[10],xmm0[10],xmm11[11],xmm0[11],xmm11[12],xmm0[12],xmm11[13],xmm0[13],xmm11[14],xmm0[14],xmm11[15],xmm0[15]
2445; SSE2-NEXT:    pmullw %xmm8, %xmm11
2446; SSE2-NEXT:    movdqa %xmm5, %xmm12
2447; SSE2-NEXT:    punpckhbw {{.*#+}} xmm12 = xmm12[8],xmm0[8],xmm12[9],xmm0[9],xmm12[10],xmm0[10],xmm12[11],xmm0[11],xmm12[12],xmm0[12],xmm12[13],xmm0[13],xmm12[14],xmm0[14],xmm12[15],xmm0[15]
2448; SSE2-NEXT:    pmullw %xmm11, %xmm12
2449; SSE2-NEXT:    movdqa %xmm1, %xmm8
2450; 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]
2451; SSE2-NEXT:    pmullw %xmm12, %xmm8
2452; SSE2-NEXT:    pmullw %xmm10, %xmm8
2453; SSE2-NEXT:    pmullw %xmm9, %xmm8
2454; 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]
2455; 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]
2456; SSE2-NEXT:    pmullw %xmm6, %xmm2
2457; 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]
2458; SSE2-NEXT:    pmullw %xmm2, %xmm4
2459; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2460; 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]
2461; 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]
2462; SSE2-NEXT:    pmullw %xmm7, %xmm3
2463; 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]
2464; SSE2-NEXT:    pmullw %xmm3, %xmm5
2465; 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]
2466; SSE2-NEXT:    pmullw %xmm5, %xmm1
2467; SSE2-NEXT:    pmullw %xmm4, %xmm1
2468; SSE2-NEXT:    pmullw %xmm8, %xmm1
2469; SSE2-NEXT:    pmullw %xmm0, %xmm1
2470; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255]
2471; SSE2-NEXT:    movdqa %xmm1, %xmm2
2472; SSE2-NEXT:    pand %xmm0, %xmm2
2473; SSE2-NEXT:    pxor %xmm3, %xmm3
2474; SSE2-NEXT:    packuswb %xmm3, %xmm2
2475; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,2,3,3]
2476; 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]
2477; SSE2-NEXT:    pmullw %xmm1, %xmm2
2478; SSE2-NEXT:    movdqa %xmm2, %xmm1
2479; SSE2-NEXT:    pand %xmm0, %xmm1
2480; SSE2-NEXT:    packuswb %xmm3, %xmm1
2481; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
2482; 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]
2483; SSE2-NEXT:    pmullw %xmm2, %xmm1
2484; SSE2-NEXT:    pand %xmm0, %xmm1
2485; SSE2-NEXT:    packuswb %xmm3, %xmm1
2486; SSE2-NEXT:    movdqa %xmm1, %xmm0
2487; SSE2-NEXT:    psrlw $8, %xmm0
2488; SSE2-NEXT:    pmullw %xmm1, %xmm0
2489; SSE2-NEXT:    movd %xmm0, %eax
2490; SSE2-NEXT:    # kill: def $al killed $al killed $eax
2491; SSE2-NEXT:    retq
2492;
2493; SSE41-LABEL: test_v128i8:
2494; SSE41:       # %bb.0:
2495; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm10 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
2496; 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]
2497; 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
2498; 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]
2499; SSE41-NEXT:    pmullw %xmm5, %xmm1
2500; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [255,255,255,255,255,255,255,255]
2501; SSE41-NEXT:    pmullw %xmm10, %xmm8
2502; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm10 = xmm7[0],zero,xmm7[1],zero,xmm7[2],zero,xmm7[3],zero,xmm7[4],zero,xmm7[5],zero,xmm7[6],zero,xmm7[7],zero
2503; 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]
2504; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm5 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
2505; 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]
2506; SSE41-NEXT:    pmullw %xmm7, %xmm3
2507; SSE41-NEXT:    movdqa %xmm3, %xmm7
2508; SSE41-NEXT:    pmullw %xmm1, %xmm3
2509; SSE41-NEXT:    pand %xmm9, %xmm1
2510; SSE41-NEXT:    pand %xmm9, %xmm8
2511; SSE41-NEXT:    packuswb %xmm1, %xmm8
2512; SSE41-NEXT:    pand %xmm9, %xmm7
2513; SSE41-NEXT:    pmullw %xmm10, %xmm5
2514; SSE41-NEXT:    pand %xmm9, %xmm5
2515; SSE41-NEXT:    packuswb %xmm7, %xmm5
2516; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm10 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero
2517; 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]
2518; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm7 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2519; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2520; SSE41-NEXT:    pmullw %xmm4, %xmm0
2521; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm4 = xmm6[0],zero,xmm6[1],zero,xmm6[2],zero,xmm6[3],zero,xmm6[4],zero,xmm6[5],zero,xmm6[6],zero,xmm6[7],zero
2522; 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]
2523; 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
2524; 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]
2525; SSE41-NEXT:    pmullw %xmm6, %xmm2
2526; SSE41-NEXT:    pmullw %xmm2, %xmm3
2527; SSE41-NEXT:    pmullw %xmm0, %xmm3
2528; SSE41-NEXT:    pand %xmm9, %xmm0
2529; SSE41-NEXT:    pmullw %xmm10, %xmm7
2530; SSE41-NEXT:    pand %xmm9, %xmm7
2531; SSE41-NEXT:    packuswb %xmm0, %xmm7
2532; SSE41-NEXT:    pand %xmm9, %xmm2
2533; SSE41-NEXT:    pmullw %xmm4, %xmm1
2534; SSE41-NEXT:    pand %xmm9, %xmm1
2535; SSE41-NEXT:    packuswb %xmm2, %xmm1
2536; 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
2537; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm1 = xmm7[0],zero,xmm7[1],zero,xmm7[2],zero,xmm7[3],zero,xmm7[4],zero,xmm7[5],zero,xmm7[6],zero,xmm7[7],zero
2538; SSE41-NEXT:    pmullw %xmm0, %xmm1
2539; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
2540; SSE41-NEXT:    pshufb %xmm0, %xmm1
2541; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm2 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
2542; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm4 = xmm8[0],zero,xmm8[1],zero,xmm8[2],zero,xmm8[3],zero,xmm8[4],zero,xmm8[5],zero,xmm8[6],zero,xmm8[7],zero
2543; SSE41-NEXT:    pmullw %xmm2, %xmm4
2544; SSE41-NEXT:    pshufb %xmm0, %xmm4
2545; SSE41-NEXT:    movdqa %xmm3, %xmm0
2546; SSE41-NEXT:    pand %xmm9, %xmm0
2547; 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
2548; SSE41-NEXT:    pmovzxbw {{.*#+}} 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
2549; SSE41-NEXT:    pmullw %xmm2, %xmm1
2550; SSE41-NEXT:    pand %xmm9, %xmm1
2551; SSE41-NEXT:    packuswb %xmm0, %xmm1
2552; 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
2553; SSE41-NEXT:    pmullw %xmm3, %xmm0
2554; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
2555; SSE41-NEXT:    pand %xmm9, %xmm0
2556; SSE41-NEXT:    pxor %xmm2, %xmm2
2557; SSE41-NEXT:    packuswb %xmm2, %xmm0
2558; SSE41-NEXT:    pmovzxbw {{.*#+}} 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
2559; SSE41-NEXT:    pmullw %xmm1, %xmm0
2560; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
2561; SSE41-NEXT:    pand %xmm9, %xmm0
2562; SSE41-NEXT:    packuswb %xmm2, %xmm0
2563; SSE41-NEXT:    pmovzxbw {{.*#+}} 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
2564; SSE41-NEXT:    pmullw %xmm1, %xmm0
2565; SSE41-NEXT:    pand %xmm9, %xmm0
2566; SSE41-NEXT:    packuswb %xmm2, %xmm0
2567; SSE41-NEXT:    movdqa %xmm0, %xmm1
2568; SSE41-NEXT:    psrlw $8, %xmm1
2569; SSE41-NEXT:    pmullw %xmm0, %xmm1
2570; SSE41-NEXT:    movd %xmm1, %eax
2571; SSE41-NEXT:    # kill: def $al killed $al killed $eax
2572; SSE41-NEXT:    retq
2573;
2574; AVX1-LABEL: test_v128i8:
2575; AVX1:       # %bb.0:
2576; 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]
2577; 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]
2578; AVX1-NEXT:    vpmullw %xmm4, %xmm5, %xmm4
2579; 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]
2580; AVX1-NEXT:    vpmullw %xmm4, %xmm5, %xmm8
2581; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm9 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2582; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm10
2583; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm10[8],xmm0[8],xmm10[9],xmm0[9],xmm10[10],xmm0[10],xmm10[11],xmm0[11],xmm10[12],xmm0[12],xmm10[13],xmm0[13],xmm10[14],xmm0[14],xmm10[15],xmm0[15]
2584; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm11
2585; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm11[8],xmm0[8],xmm11[9],xmm0[9],xmm11[10],xmm0[10],xmm11[11],xmm0[11],xmm11[12],xmm0[12],xmm11[13],xmm0[13],xmm11[14],xmm0[14],xmm11[15],xmm0[15]
2586; AVX1-NEXT:    vpmullw %xmm7, %xmm5, %xmm5
2587; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm7
2588; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm6 = 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]
2589; AVX1-NEXT:    vpmullw %xmm5, %xmm6, %xmm5
2590; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
2591; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = 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]
2592; AVX1-NEXT:    vpmullw %xmm5, %xmm4, %xmm4
2593; AVX1-NEXT:    vpmullw %xmm4, %xmm8, %xmm4
2594; AVX1-NEXT:    vpmullw %xmm4, %xmm9, %xmm4
2595; 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
2596; 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
2597; AVX1-NEXT:    vpmullw %xmm3, %xmm1, %xmm1
2598; 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
2599; AVX1-NEXT:    vpmullw %xmm1, %xmm2, %xmm1
2600; 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
2601; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm10[0],zero,xmm10[1],zero,xmm10[2],zero,xmm10[3],zero,xmm10[4],zero,xmm10[5],zero,xmm10[6],zero,xmm10[7],zero
2602; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm11[0],zero,xmm11[1],zero,xmm11[2],zero,xmm11[3],zero,xmm11[4],zero,xmm11[5],zero,xmm11[6],zero,xmm11[7],zero
2603; AVX1-NEXT:    vpmullw %xmm2, %xmm3, %xmm2
2604; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm7[0],zero,xmm7[1],zero,xmm7[2],zero,xmm7[3],zero,xmm7[4],zero,xmm7[5],zero,xmm7[6],zero,xmm7[7],zero
2605; AVX1-NEXT:    vpmullw %xmm2, %xmm3, %xmm2
2606; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm6[0],zero,xmm6[1],zero,xmm6[2],zero,xmm6[3],zero,xmm6[4],zero,xmm6[5],zero,xmm6[6],zero,xmm6[7],zero
2607; AVX1-NEXT:    vpmullw %xmm2, %xmm3, %xmm2
2608; AVX1-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
2609; AVX1-NEXT:    vpmullw %xmm4, %xmm1, %xmm1
2610; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2611; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
2612; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2613; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
2614; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2615; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
2616; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2617; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2618; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
2619; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2620; AVX1-NEXT:    vmovd %xmm0, %eax
2621; AVX1-NEXT:    # kill: def $al killed $al killed $eax
2622; AVX1-NEXT:    vzeroupper
2623; AVX1-NEXT:    retq
2624;
2625; AVX2-LABEL: test_v128i8:
2626; AVX2:       # %bb.0:
2627; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm4 = 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]
2628; 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]
2629; AVX2-NEXT:    vpmullw %ymm4, %ymm5, %ymm4
2630; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm5 = 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]
2631; AVX2-NEXT:    vpmullw %ymm4, %ymm5, %ymm4
2632; 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]
2633; AVX2-NEXT:    vpmullw %ymm4, %ymm5, %ymm4
2634; 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]
2635; 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]
2636; AVX2-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
2637; 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]
2638; AVX2-NEXT:    vpmullw %ymm1, %ymm2, %ymm1
2639; 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]
2640; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
2641; AVX2-NEXT:    vextracti128 $1, %ymm4, %xmm1
2642; AVX2-NEXT:    vpmullw %xmm1, %xmm4, %xmm1
2643; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
2644; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
2645; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
2646; AVX2-NEXT:    vpmullw %xmm1, %xmm3, %xmm1
2647; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2648; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm1
2649; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
2650; AVX2-NEXT:    vpackuswb %xmm3, %xmm1, %xmm1
2651; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
2652; AVX2-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
2653; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2654; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm1
2655; AVX2-NEXT:    vpackuswb %xmm3, %xmm1, %xmm1
2656; AVX2-NEXT:    vpsrld $16, %xmm1, %xmm1
2657; AVX2-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
2658; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2659; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
2660; AVX2-NEXT:    vpackuswb %xmm3, %xmm0, %xmm0
2661; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
2662; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2663; AVX2-NEXT:    vmovd %xmm0, %eax
2664; AVX2-NEXT:    # kill: def $al killed $al killed $eax
2665; AVX2-NEXT:    vzeroupper
2666; AVX2-NEXT:    retq
2667;
2668; AVX512BW-LABEL: test_v128i8:
2669; AVX512BW:       # %bb.0:
2670; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm2 = 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]
2671; 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]
2672; AVX512BW-NEXT:    vpmullw %zmm2, %zmm3, %zmm2
2673; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm1 = 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]
2674; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm0 = 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]
2675; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2676; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2677; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2678; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2679; AVX512BW-NEXT:    vpand %ymm1, %ymm0, %ymm3
2680; AVX512BW-NEXT:    vextracti64x4 $1, %zmm2, %ymm4
2681; AVX512BW-NEXT:    vpmullw %zmm4, %zmm2, %zmm2
2682; AVX512BW-NEXT:    vpand %ymm1, %ymm2, %ymm1
2683; AVX512BW-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
2684; AVX512BW-NEXT:    vextracti128 $1, %ymm1, %xmm1
2685; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} xmm3 = 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]
2686; AVX512BW-NEXT:    vpmullw %xmm3, %xmm0, %xmm0
2687; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
2688; AVX512BW-NEXT:    vpand %xmm3, %xmm0, %xmm0
2689; AVX512BW-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
2690; AVX512BW-NEXT:    vpmullw %xmm0, %xmm1, %xmm0
2691; AVX512BW-NEXT:    vpmullw %xmm0, %xmm2, %xmm0
2692; AVX512BW-NEXT:    vpand %xmm3, %xmm0, %xmm1
2693; AVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2694; AVX512BW-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
2695; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
2696; AVX512BW-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
2697; AVX512BW-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2698; AVX512BW-NEXT:    vpand %xmm3, %xmm0, %xmm1
2699; AVX512BW-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
2700; AVX512BW-NEXT:    vpsrld $16, %xmm1, %xmm1
2701; AVX512BW-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
2702; AVX512BW-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2703; AVX512BW-NEXT:    vpand %xmm3, %xmm0, %xmm0
2704; AVX512BW-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
2705; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
2706; AVX512BW-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2707; AVX512BW-NEXT:    vmovd %xmm0, %eax
2708; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
2709; AVX512BW-NEXT:    vzeroupper
2710; AVX512BW-NEXT:    retq
2711;
2712; AVX512BWVL-LABEL: test_v128i8:
2713; AVX512BWVL:       # %bb.0:
2714; AVX512BWVL-NEXT:    vpunpcklbw {{.*#+}} zmm2 = 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]
2715; 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]
2716; AVX512BWVL-NEXT:    vpmullw %zmm2, %zmm3, %zmm2
2717; AVX512BWVL-NEXT:    vpunpckhbw {{.*#+}} zmm1 = 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]
2718; AVX512BWVL-NEXT:    vpunpckhbw {{.*#+}} zmm0 = 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]
2719; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2720; AVX512BWVL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2721; AVX512BWVL-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
2722; AVX512BWVL-NEXT:    vmovdqa {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2723; AVX512BWVL-NEXT:    vpand %ymm1, %ymm0, %ymm3
2724; AVX512BWVL-NEXT:    vextracti64x4 $1, %zmm2, %ymm4
2725; AVX512BWVL-NEXT:    vpmullw %zmm4, %zmm2, %zmm2
2726; AVX512BWVL-NEXT:    vpand %ymm1, %ymm2, %ymm1
2727; AVX512BWVL-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
2728; AVX512BWVL-NEXT:    vextracti128 $1, %ymm1, %xmm1
2729; AVX512BWVL-NEXT:    vpunpckhbw {{.*#+}} xmm3 = 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]
2730; AVX512BWVL-NEXT:    vpmullw %xmm3, %xmm0, %xmm0
2731; AVX512BWVL-NEXT:    vinserti128 $1, %xmm0, %ymm0, %ymm0
2732; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm0
2733; AVX512BWVL-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
2734; AVX512BWVL-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2735; AVX512BWVL-NEXT:    vpmullw %xmm0, %xmm1, %xmm0
2736; AVX512BWVL-NEXT:    vpmullw %xmm0, %xmm2, %xmm0
2737; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm1
2738; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
2739; AVX512BWVL-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
2740; AVX512BWVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2741; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm1
2742; AVX512BWVL-NEXT:    vpsrld $16, %xmm1, %xmm1
2743; AVX512BWVL-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
2744; AVX512BWVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2745; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm0
2746; AVX512BWVL-NEXT:    vpsrlw $8, %xmm0, %xmm1
2747; AVX512BWVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2748; AVX512BWVL-NEXT:    vmovd %xmm0, %eax
2749; AVX512BWVL-NEXT:    # kill: def $al killed $al killed $eax
2750; AVX512BWVL-NEXT:    vzeroupper
2751; AVX512BWVL-NEXT:    retq
2752;
2753; AVX512DQ-LABEL: test_v128i8:
2754; AVX512DQ:       # %bb.0:
2755; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm1, %ymm2
2756; 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]
2757; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm4
2758; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} ymm5 = ymm4[8],ymm0[8],ymm4[9],ymm0[9],ymm4[10],ymm0[10],ymm4[11],ymm0[11],ymm4[12],ymm0[12],ymm4[13],ymm0[13],ymm4[14],ymm0[14],ymm4[15],ymm0[15],ymm4[24],ymm0[24],ymm4[25],ymm0[25],ymm4[26],ymm0[26],ymm4[27],ymm0[27],ymm4[28],ymm0[28],ymm4[29],ymm0[29],ymm4[30],ymm0[30],ymm4[31],ymm0[31]
2759; AVX512DQ-NEXT:    vpmullw %ymm3, %ymm5, %ymm3
2760; 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]
2761; AVX512DQ-NEXT:    vpmullw %ymm3, %ymm5, %ymm3
2762; 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]
2763; AVX512DQ-NEXT:    vpmullw %ymm3, %ymm5, %ymm3
2764; 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]
2765; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm4 = ymm4[0],ymm0[0],ymm4[1],ymm0[1],ymm4[2],ymm0[2],ymm4[3],ymm0[3],ymm4[4],ymm0[4],ymm4[5],ymm0[5],ymm4[6],ymm0[6],ymm4[7],ymm0[7],ymm4[16],ymm0[16],ymm4[17],ymm0[17],ymm4[18],ymm0[18],ymm4[19],ymm0[19],ymm4[20],ymm0[20],ymm4[21],ymm0[21],ymm4[22],ymm0[22],ymm4[23],ymm0[23]
2766; AVX512DQ-NEXT:    vpmullw %ymm2, %ymm4, %ymm2
2767; 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]
2768; AVX512DQ-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
2769; 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]
2770; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
2771; AVX512DQ-NEXT:    vextracti128 $1, %ymm3, %xmm1
2772; AVX512DQ-NEXT:    vpmullw %xmm1, %xmm3, %xmm1
2773; AVX512DQ-NEXT:    vextracti128 $1, %ymm0, %xmm2
2774; AVX512DQ-NEXT:    vpmullw %xmm1, %xmm2, %xmm1
2775; AVX512DQ-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2776; AVX512DQ-NEXT:    vmovdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
2777; AVX512DQ-NEXT:    vpand %xmm1, %xmm0, %xmm2
2778; AVX512DQ-NEXT:    vpxor %xmm3, %xmm3, %xmm3
2779; AVX512DQ-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
2780; AVX512DQ-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,2,3]
2781; AVX512DQ-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
2782; AVX512DQ-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
2783; AVX512DQ-NEXT:    vpand %xmm1, %xmm0, %xmm2
2784; AVX512DQ-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
2785; AVX512DQ-NEXT:    vpsrld $16, %xmm2, %xmm2
2786; AVX512DQ-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
2787; AVX512DQ-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
2788; AVX512DQ-NEXT:    vpand %xmm1, %xmm0, %xmm0
2789; AVX512DQ-NEXT:    vpackuswb %xmm3, %xmm0, %xmm0
2790; AVX512DQ-NEXT:    vpsrlw $8, %xmm0, %xmm1
2791; AVX512DQ-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2792; AVX512DQ-NEXT:    vmovd %xmm0, %eax
2793; AVX512DQ-NEXT:    # kill: def $al killed $al killed $eax
2794; AVX512DQ-NEXT:    vzeroupper
2795; AVX512DQ-NEXT:    retq
2796;
2797; AVX512DQVL-LABEL: test_v128i8:
2798; AVX512DQVL:       # %bb.0:
2799; AVX512DQVL-NEXT:    vextracti64x4 $1, %zmm1, %ymm2
2800; AVX512DQVL-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]
2801; AVX512DQVL-NEXT:    vextracti64x4 $1, %zmm0, %ymm4
2802; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} ymm5 = ymm4[8],ymm0[8],ymm4[9],ymm0[9],ymm4[10],ymm0[10],ymm4[11],ymm0[11],ymm4[12],ymm0[12],ymm4[13],ymm0[13],ymm4[14],ymm0[14],ymm4[15],ymm0[15],ymm4[24],ymm0[24],ymm4[25],ymm0[25],ymm4[26],ymm0[26],ymm4[27],ymm0[27],ymm4[28],ymm0[28],ymm4[29],ymm0[29],ymm4[30],ymm0[30],ymm4[31],ymm0[31]
2803; AVX512DQVL-NEXT:    vpmullw %ymm3, %ymm5, %ymm3
2804; 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]
2805; AVX512DQVL-NEXT:    vpmullw %ymm3, %ymm5, %ymm3
2806; 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]
2807; AVX512DQVL-NEXT:    vpmullw %ymm3, %ymm5, %ymm3
2808; 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]
2809; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm4 = ymm4[0],ymm0[0],ymm4[1],ymm0[1],ymm4[2],ymm0[2],ymm4[3],ymm0[3],ymm4[4],ymm0[4],ymm4[5],ymm0[5],ymm4[6],ymm0[6],ymm4[7],ymm0[7],ymm4[16],ymm0[16],ymm4[17],ymm0[17],ymm4[18],ymm0[18],ymm4[19],ymm0[19],ymm4[20],ymm0[20],ymm4[21],ymm0[21],ymm4[22],ymm0[22],ymm4[23],ymm0[23]
2810; AVX512DQVL-NEXT:    vpmullw %ymm2, %ymm4, %ymm2
2811; 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]
2812; AVX512DQVL-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
2813; 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]
2814; AVX512DQVL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
2815; AVX512DQVL-NEXT:    vextracti128 $1, %ymm3, %xmm1
2816; AVX512DQVL-NEXT:    vpmullw %xmm1, %xmm3, %xmm1
2817; AVX512DQVL-NEXT:    vextracti128 $1, %ymm0, %xmm2
2818; AVX512DQVL-NEXT:    vpmullw %xmm1, %xmm2, %xmm1
2819; AVX512DQVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2820; AVX512DQVL-NEXT:    vmovdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
2821; AVX512DQVL-NEXT:    vpand %xmm1, %xmm0, %xmm2
2822; AVX512DQVL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
2823; AVX512DQVL-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
2824; AVX512DQVL-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,2,3]
2825; AVX512DQVL-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
2826; AVX512DQVL-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
2827; AVX512DQVL-NEXT:    vpand %xmm1, %xmm0, %xmm2
2828; AVX512DQVL-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
2829; AVX512DQVL-NEXT:    vpsrld $16, %xmm2, %xmm2
2830; AVX512DQVL-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
2831; AVX512DQVL-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
2832; AVX512DQVL-NEXT:    vpand %xmm1, %xmm0, %xmm0
2833; AVX512DQVL-NEXT:    vpackuswb %xmm3, %xmm0, %xmm0
2834; AVX512DQVL-NEXT:    vpsrlw $8, %xmm0, %xmm1
2835; AVX512DQVL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2836; AVX512DQVL-NEXT:    vmovd %xmm0, %eax
2837; AVX512DQVL-NEXT:    # kill: def $al killed $al killed $eax
2838; AVX512DQVL-NEXT:    vzeroupper
2839; AVX512DQVL-NEXT:    retq
2840  %1 = call i8 @llvm.experimental.vector.reduce.mul.v128i8(<128 x i8> %a0)
2841  ret i8 %1
2842}
2843
2844declare i64 @llvm.experimental.vector.reduce.mul.v2i64(<2 x i64>)
2845declare i64 @llvm.experimental.vector.reduce.mul.v4i64(<4 x i64>)
2846declare i64 @llvm.experimental.vector.reduce.mul.v8i64(<8 x i64>)
2847declare i64 @llvm.experimental.vector.reduce.mul.v16i64(<16 x i64>)
2848
2849declare i32 @llvm.experimental.vector.reduce.mul.v2i32(<2 x i32>)
2850declare i32 @llvm.experimental.vector.reduce.mul.v4i32(<4 x i32>)
2851declare i32 @llvm.experimental.vector.reduce.mul.v8i32(<8 x i32>)
2852declare i32 @llvm.experimental.vector.reduce.mul.v16i32(<16 x i32>)
2853declare i32 @llvm.experimental.vector.reduce.mul.v32i32(<32 x i32>)
2854
2855declare i16 @llvm.experimental.vector.reduce.mul.v2i16(<2 x i16>)
2856declare i16 @llvm.experimental.vector.reduce.mul.v4i16(<4 x i16>)
2857declare i16 @llvm.experimental.vector.reduce.mul.v8i16(<8 x i16>)
2858declare i16 @llvm.experimental.vector.reduce.mul.v16i16(<16 x i16>)
2859declare i16 @llvm.experimental.vector.reduce.mul.v32i16(<32 x i16>)
2860declare i16 @llvm.experimental.vector.reduce.mul.v64i16(<64 x i16>)
2861
2862declare i8 @llvm.experimental.vector.reduce.mul.v2i8(<2 x i8>)
2863declare i8 @llvm.experimental.vector.reduce.mul.v4i8(<4 x i8>)
2864declare i8 @llvm.experimental.vector.reduce.mul.v8i8(<8 x i8>)
2865declare i8 @llvm.experimental.vector.reduce.mul.v16i8(<16 x i8>)
2866declare i8 @llvm.experimental.vector.reduce.mul.v32i8(<32 x i8>)
2867declare i8 @llvm.experimental.vector.reduce.mul.v64i8(<64 x i8>)
2868declare i8 @llvm.experimental.vector.reduce.mul.v128i8(<128 x i8>)
2869