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