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