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