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, ptr %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, ptr %p2
47 define <2 x i32> @smulo_v2i32(<2 x i32> %a0, <2 x i32> %a1, ptr %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: pmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
107 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
108 ; SSE41-NEXT: pmuldq %xmm1, %xmm0
109 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]
110 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
111 ; SSE41-NEXT: movq %xmm0, (%rdi)
112 ; SSE41-NEXT: movdqa %xmm0, %xmm2
113 ; SSE41-NEXT: psrad $31, %xmm2
114 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm2
115 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm0
116 ; SSE41-NEXT: pxor %xmm2, %xmm0
119 ; AVX-LABEL: smulo_v2i32:
121 ; AVX-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
122 ; AVX-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
123 ; AVX-NEXT: vpmuldq %xmm1, %xmm0, %xmm0
124 ; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]
125 ; AVX-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]
126 ; AVX-NEXT: vpsrad $31, %xmm2, %xmm0
127 ; AVX-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
128 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
129 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
130 ; AVX-NEXT: vmovq %xmm2, (%rdi)
133 ; AVX512-LABEL: smulo_v2i32:
135 ; AVX512-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
136 ; AVX512-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
137 ; AVX512-NEXT: vpmuldq %xmm1, %xmm0, %xmm0
138 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]
139 ; AVX512-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]
140 ; AVX512-NEXT: vpsrad $31, %xmm2, %xmm0
141 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
142 ; AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
143 ; AVX512-NEXT: vmovq %xmm2, (%rdi)
145 %t = call {<2 x i32>, <2 x i1>} @llvm.smul.with.overflow.v2i32(<2 x i32> %a0, <2 x i32> %a1)
146 %val = extractvalue {<2 x i32>, <2 x i1>} %t, 0
147 %obit = extractvalue {<2 x i32>, <2 x i1>} %t, 1
148 %res = sext <2 x i1> %obit to <2 x i32>
149 store <2 x i32> %val, ptr %p2
153 define <3 x i32> @smulo_v3i32(<3 x i32> %a0, <3 x i32> %a1, ptr %p2) nounwind {
154 ; SSE2-LABEL: smulo_v3i32:
156 ; SSE2-NEXT: pxor %xmm2, %xmm2
157 ; SSE2-NEXT: pxor %xmm3, %xmm3
158 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
159 ; SSE2-NEXT: pand %xmm0, %xmm3
160 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
161 ; SSE2-NEXT: pand %xmm1, %xmm2
162 ; SSE2-NEXT: paddd %xmm3, %xmm2
163 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
164 ; SSE2-NEXT: pmuludq %xmm1, %xmm0
165 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,3,2,3]
166 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
167 ; SSE2-NEXT: pmuludq %xmm3, %xmm1
168 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3]
169 ; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
170 ; SSE2-NEXT: psubd %xmm2, %xmm4
171 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]
172 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
173 ; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
174 ; SSE2-NEXT: movq %xmm2, (%rdi)
175 ; SSE2-NEXT: psrad $31, %xmm2
176 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm2
177 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
178 ; SSE2-NEXT: pxor %xmm2, %xmm1
179 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
180 ; SSE2-NEXT: movd %xmm0, 8(%rdi)
181 ; SSE2-NEXT: movdqa %xmm1, %xmm0
184 ; SSSE3-LABEL: smulo_v3i32:
186 ; SSSE3-NEXT: pxor %xmm2, %xmm2
187 ; SSSE3-NEXT: pxor %xmm3, %xmm3
188 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3
189 ; SSSE3-NEXT: pand %xmm0, %xmm3
190 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2
191 ; SSSE3-NEXT: pand %xmm1, %xmm2
192 ; SSSE3-NEXT: paddd %xmm3, %xmm2
193 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
194 ; SSSE3-NEXT: pmuludq %xmm1, %xmm0
195 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,3,2,3]
196 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
197 ; SSSE3-NEXT: pmuludq %xmm3, %xmm1
198 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3]
199 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
200 ; SSSE3-NEXT: psubd %xmm2, %xmm4
201 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]
202 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
203 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
204 ; SSSE3-NEXT: movq %xmm2, (%rdi)
205 ; SSSE3-NEXT: psrad $31, %xmm2
206 ; SSSE3-NEXT: pcmpeqd %xmm4, %xmm2
207 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1
208 ; SSSE3-NEXT: pxor %xmm2, %xmm1
209 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
210 ; SSSE3-NEXT: movd %xmm0, 8(%rdi)
211 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
214 ; SSE41-LABEL: smulo_v3i32:
216 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
217 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
218 ; SSE41-NEXT: pmuldq %xmm2, %xmm3
219 ; SSE41-NEXT: movdqa %xmm0, %xmm2
220 ; SSE41-NEXT: pmuldq %xmm1, %xmm2
221 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
222 ; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
223 ; SSE41-NEXT: pmulld %xmm1, %xmm0
224 ; SSE41-NEXT: pextrd $2, %xmm0, 8(%rdi)
225 ; SSE41-NEXT: movq %xmm0, (%rdi)
226 ; SSE41-NEXT: movdqa %xmm0, %xmm1
227 ; SSE41-NEXT: psrad $31, %xmm1
228 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm1
229 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm0
230 ; SSE41-NEXT: pxor %xmm1, %xmm0
233 ; AVX1-LABEL: smulo_v3i32:
235 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
236 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
237 ; AVX1-NEXT: vpmuldq %xmm2, %xmm3, %xmm2
238 ; AVX1-NEXT: vpmuldq %xmm1, %xmm0, %xmm3
239 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
240 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
241 ; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm1
242 ; AVX1-NEXT: vpsrad $31, %xmm1, %xmm0
243 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm2, %xmm0
244 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
245 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
246 ; AVX1-NEXT: vpextrd $2, %xmm1, 8(%rdi)
247 ; AVX1-NEXT: vmovq %xmm1, (%rdi)
250 ; AVX2-LABEL: smulo_v3i32:
252 ; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
253 ; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
254 ; AVX2-NEXT: vpmuldq %xmm2, %xmm3, %xmm2
255 ; AVX2-NEXT: vpmuldq %xmm1, %xmm0, %xmm3
256 ; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
257 ; AVX2-NEXT: vpblendd {{.*#+}} xmm2 = xmm3[0],xmm2[1],xmm3[2],xmm2[3]
258 ; AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm1
259 ; AVX2-NEXT: vpsrad $31, %xmm1, %xmm0
260 ; AVX2-NEXT: vpcmpeqd %xmm0, %xmm2, %xmm0
261 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
262 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
263 ; AVX2-NEXT: vpextrd $2, %xmm1, 8(%rdi)
264 ; AVX2-NEXT: vmovq %xmm1, (%rdi)
267 ; AVX512-LABEL: smulo_v3i32:
269 ; AVX512-NEXT: vpmuldq %xmm1, %xmm0, %xmm2
270 ; AVX512-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
271 ; AVX512-NEXT: vpshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
272 ; AVX512-NEXT: vpmuldq %xmm3, %xmm4, %xmm3
273 ; AVX512-NEXT: vpmovsxbd {{.*#+}} xmm4 = [1,5,3,7]
274 ; AVX512-NEXT: vpermi2d %xmm3, %xmm2, %xmm4
275 ; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm1
276 ; AVX512-NEXT: vpsrad $31, %xmm1, %xmm0
277 ; AVX512-NEXT: vpcmpneqd %xmm0, %xmm4, %k1
278 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
279 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
280 ; AVX512-NEXT: vpextrd $2, %xmm1, 8(%rdi)
281 ; AVX512-NEXT: vmovq %xmm1, (%rdi)
283 %t = call {<3 x i32>, <3 x i1>} @llvm.smul.with.overflow.v3i32(<3 x i32> %a0, <3 x i32> %a1)
284 %val = extractvalue {<3 x i32>, <3 x i1>} %t, 0
285 %obit = extractvalue {<3 x i32>, <3 x i1>} %t, 1
286 %res = sext <3 x i1> %obit to <3 x i32>
287 store <3 x i32> %val, ptr %p2
291 define <4 x i32> @smulo_v4i32(<4 x i32> %a0, <4 x i32> %a1, ptr %p2) nounwind {
292 ; SSE2-LABEL: smulo_v4i32:
294 ; SSE2-NEXT: pxor %xmm2, %xmm2
295 ; SSE2-NEXT: pxor %xmm3, %xmm3
296 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
297 ; SSE2-NEXT: pand %xmm0, %xmm3
298 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
299 ; SSE2-NEXT: pand %xmm1, %xmm2
300 ; SSE2-NEXT: paddd %xmm3, %xmm2
301 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
302 ; SSE2-NEXT: pmuludq %xmm1, %xmm0
303 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,3,2,3]
304 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
305 ; SSE2-NEXT: pmuludq %xmm3, %xmm1
306 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3]
307 ; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
308 ; SSE2-NEXT: psubd %xmm2, %xmm4
309 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
310 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
311 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
312 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
313 ; SSE2-NEXT: movdqa %xmm0, %xmm1
314 ; SSE2-NEXT: psrad $31, %xmm1
315 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm1
316 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
317 ; SSE2-NEXT: pxor %xmm1, %xmm0
320 ; SSSE3-LABEL: smulo_v4i32:
322 ; SSSE3-NEXT: pxor %xmm2, %xmm2
323 ; SSSE3-NEXT: pxor %xmm3, %xmm3
324 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3
325 ; SSSE3-NEXT: pand %xmm0, %xmm3
326 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2
327 ; SSSE3-NEXT: pand %xmm1, %xmm2
328 ; SSSE3-NEXT: paddd %xmm3, %xmm2
329 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
330 ; SSSE3-NEXT: pmuludq %xmm1, %xmm0
331 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,3,2,3]
332 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
333 ; SSSE3-NEXT: pmuludq %xmm3, %xmm1
334 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3]
335 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
336 ; SSSE3-NEXT: psubd %xmm2, %xmm4
337 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
338 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
339 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
340 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
341 ; SSSE3-NEXT: movdqa %xmm0, %xmm1
342 ; SSSE3-NEXT: psrad $31, %xmm1
343 ; SSSE3-NEXT: pcmpeqd %xmm4, %xmm1
344 ; SSSE3-NEXT: pcmpeqd %xmm0, %xmm0
345 ; SSSE3-NEXT: pxor %xmm1, %xmm0
348 ; SSE41-LABEL: smulo_v4i32:
350 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
351 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
352 ; SSE41-NEXT: pmuldq %xmm2, %xmm3
353 ; SSE41-NEXT: movdqa %xmm0, %xmm2
354 ; SSE41-NEXT: pmuldq %xmm1, %xmm2
355 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
356 ; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
357 ; SSE41-NEXT: pmulld %xmm1, %xmm0
358 ; SSE41-NEXT: movdqa %xmm0, (%rdi)
359 ; SSE41-NEXT: movdqa %xmm0, %xmm1
360 ; SSE41-NEXT: psrad $31, %xmm1
361 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm1
362 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm0
363 ; SSE41-NEXT: pxor %xmm1, %xmm0
366 ; AVX1-LABEL: smulo_v4i32:
368 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
369 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
370 ; AVX1-NEXT: vpmuldq %xmm2, %xmm3, %xmm2
371 ; AVX1-NEXT: vpmuldq %xmm1, %xmm0, %xmm3
372 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
373 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
374 ; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm1
375 ; AVX1-NEXT: vpsrad $31, %xmm1, %xmm0
376 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm2, %xmm0
377 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
378 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
379 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
382 ; AVX2-LABEL: smulo_v4i32:
384 ; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
385 ; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
386 ; AVX2-NEXT: vpmuldq %xmm2, %xmm3, %xmm2
387 ; AVX2-NEXT: vpmuldq %xmm1, %xmm0, %xmm3
388 ; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
389 ; AVX2-NEXT: vpblendd {{.*#+}} xmm2 = xmm3[0],xmm2[1],xmm3[2],xmm2[3]
390 ; AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm1
391 ; AVX2-NEXT: vpsrad $31, %xmm1, %xmm0
392 ; AVX2-NEXT: vpcmpeqd %xmm0, %xmm2, %xmm0
393 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
394 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
395 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
398 ; AVX512-LABEL: smulo_v4i32:
400 ; AVX512-NEXT: vpmuldq %xmm1, %xmm0, %xmm2
401 ; AVX512-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
402 ; AVX512-NEXT: vpshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
403 ; AVX512-NEXT: vpmuldq %xmm3, %xmm4, %xmm3
404 ; AVX512-NEXT: vpmovsxbd {{.*#+}} xmm4 = [1,5,3,7]
405 ; AVX512-NEXT: vpermi2d %xmm3, %xmm2, %xmm4
406 ; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm1
407 ; AVX512-NEXT: vpsrad $31, %xmm1, %xmm0
408 ; AVX512-NEXT: vpcmpneqd %xmm0, %xmm4, %k1
409 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
410 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
411 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
413 %t = call {<4 x i32>, <4 x i1>} @llvm.smul.with.overflow.v4i32(<4 x i32> %a0, <4 x i32> %a1)
414 %val = extractvalue {<4 x i32>, <4 x i1>} %t, 0
415 %obit = extractvalue {<4 x i32>, <4 x i1>} %t, 1
416 %res = sext <4 x i1> %obit to <4 x i32>
417 store <4 x i32> %val, ptr %p2
421 define <6 x i32> @smulo_v6i32(<6 x i32> %a0, <6 x i32> %a1, ptr %p2) nounwind {
422 ; SSE2-LABEL: smulo_v6i32:
424 ; SSE2-NEXT: movq %rdi, %rax
425 ; SSE2-NEXT: movd %r8d, %xmm0
426 ; SSE2-NEXT: movd %ecx, %xmm1
427 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
428 ; SSE2-NEXT: movd %edx, %xmm0
429 ; SSE2-NEXT: movd %esi, %xmm4
430 ; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1]
431 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm1[0]
432 ; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
433 ; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
434 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
435 ; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
436 ; SSE2-NEXT: movd {{.*#+}} xmm5 = mem[0],zero,zero,zero
437 ; SSE2-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1]
438 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm1[0]
439 ; SSE2-NEXT: movd %r9d, %xmm0
440 ; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
441 ; SSE2-NEXT: movdqa %xmm0, %xmm3
442 ; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
443 ; SSE2-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
444 ; SSE2-NEXT: movd {{.*#+}} xmm6 = mem[0],zero,zero,zero
445 ; SSE2-NEXT: pmuludq %xmm6, %xmm0
446 ; SSE2-NEXT: movdqa %xmm6, %xmm7
447 ; SSE2-NEXT: punpckldq {{.*#+}} xmm7 = xmm7[0],xmm2[0],xmm7[1],xmm2[1]
448 ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %rcx
449 ; SSE2-NEXT: pxor %xmm6, %xmm6
450 ; SSE2-NEXT: pxor %xmm8, %xmm8
451 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm8
452 ; SSE2-NEXT: pand %xmm4, %xmm8
453 ; SSE2-NEXT: pxor %xmm9, %xmm9
454 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm9
455 ; SSE2-NEXT: pand %xmm5, %xmm9
456 ; SSE2-NEXT: paddd %xmm8, %xmm9
457 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm4[1,1,3,3]
458 ; SSE2-NEXT: pmuludq %xmm5, %xmm4
459 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm4[1,3,2,3]
460 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
461 ; SSE2-NEXT: pmuludq %xmm8, %xmm5
462 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm5[1,3,2,3]
463 ; SSE2-NEXT: punpckldq {{.*#+}} xmm10 = xmm10[0],xmm8[0],xmm10[1],xmm8[1]
464 ; SSE2-NEXT: psubd %xmm9, %xmm10
465 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
466 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
467 ; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1]
468 ; SSE2-NEXT: movdqa %xmm4, (%rcx)
469 ; SSE2-NEXT: psrad $31, %xmm4
470 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm4
471 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm5
472 ; SSE2-NEXT: pxor %xmm5, %xmm4
473 ; SSE2-NEXT: pxor %xmm8, %xmm8
474 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm8
475 ; SSE2-NEXT: pand %xmm3, %xmm8
476 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm6
477 ; SSE2-NEXT: pand %xmm7, %xmm6
478 ; SSE2-NEXT: paddd %xmm8, %xmm6
479 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]
480 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
481 ; SSE2-NEXT: pmuludq %xmm2, %xmm1
482 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]
483 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]
484 ; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
485 ; SSE2-NEXT: psubd %xmm6, %xmm3
486 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
487 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
488 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
489 ; SSE2-NEXT: movq %xmm0, 16(%rcx)
490 ; SSE2-NEXT: psrad $31, %xmm0
491 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm0
492 ; SSE2-NEXT: pxor %xmm5, %xmm0
493 ; SSE2-NEXT: movq %xmm0, 16(%rdi)
494 ; SSE2-NEXT: movdqa %xmm4, (%rdi)
497 ; SSSE3-LABEL: smulo_v6i32:
499 ; SSSE3-NEXT: movq %rdi, %rax
500 ; SSSE3-NEXT: movd %r8d, %xmm0
501 ; SSSE3-NEXT: movd %ecx, %xmm1
502 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
503 ; SSSE3-NEXT: movd %edx, %xmm0
504 ; SSSE3-NEXT: movd %esi, %xmm4
505 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1]
506 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm1[0]
507 ; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
508 ; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
509 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
510 ; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
511 ; SSSE3-NEXT: movd {{.*#+}} xmm5 = mem[0],zero,zero,zero
512 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1]
513 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm1[0]
514 ; SSSE3-NEXT: movd %r9d, %xmm0
515 ; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
516 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
517 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
518 ; SSSE3-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
519 ; SSSE3-NEXT: movd {{.*#+}} xmm6 = mem[0],zero,zero,zero
520 ; SSSE3-NEXT: pmuludq %xmm6, %xmm0
521 ; SSSE3-NEXT: movdqa %xmm6, %xmm7
522 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm7 = xmm7[0],xmm2[0],xmm7[1],xmm2[1]
523 ; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %rcx
524 ; SSSE3-NEXT: pxor %xmm6, %xmm6
525 ; SSSE3-NEXT: pxor %xmm8, %xmm8
526 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm8
527 ; SSSE3-NEXT: pand %xmm4, %xmm8
528 ; SSSE3-NEXT: pxor %xmm9, %xmm9
529 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm9
530 ; SSSE3-NEXT: pand %xmm5, %xmm9
531 ; SSSE3-NEXT: paddd %xmm8, %xmm9
532 ; SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm4[1,1,3,3]
533 ; SSSE3-NEXT: pmuludq %xmm5, %xmm4
534 ; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm4[1,3,2,3]
535 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
536 ; SSSE3-NEXT: pmuludq %xmm8, %xmm5
537 ; SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm5[1,3,2,3]
538 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm10 = xmm10[0],xmm8[0],xmm10[1],xmm8[1]
539 ; SSSE3-NEXT: psubd %xmm9, %xmm10
540 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
541 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
542 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1]
543 ; SSSE3-NEXT: movdqa %xmm4, (%rcx)
544 ; SSSE3-NEXT: psrad $31, %xmm4
545 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm4
546 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm5
547 ; SSSE3-NEXT: pxor %xmm5, %xmm4
548 ; SSSE3-NEXT: pxor %xmm8, %xmm8
549 ; SSSE3-NEXT: pcmpgtd %xmm7, %xmm8
550 ; SSSE3-NEXT: pand %xmm3, %xmm8
551 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm6
552 ; SSSE3-NEXT: pand %xmm7, %xmm6
553 ; SSSE3-NEXT: paddd %xmm8, %xmm6
554 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]
555 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
556 ; SSSE3-NEXT: pmuludq %xmm2, %xmm1
557 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]
558 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]
559 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
560 ; SSSE3-NEXT: psubd %xmm6, %xmm3
561 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
562 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
563 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
564 ; SSSE3-NEXT: movq %xmm0, 16(%rcx)
565 ; SSSE3-NEXT: psrad $31, %xmm0
566 ; SSSE3-NEXT: pcmpeqd %xmm3, %xmm0
567 ; SSSE3-NEXT: pxor %xmm5, %xmm0
568 ; SSSE3-NEXT: movq %xmm0, 16(%rdi)
569 ; SSSE3-NEXT: movdqa %xmm4, (%rdi)
572 ; SSE41-LABEL: smulo_v6i32:
574 ; SSE41-NEXT: movq %rdi, %rax
575 ; SSE41-NEXT: movd %esi, %xmm2
576 ; SSE41-NEXT: pinsrd $1, %edx, %xmm2
577 ; SSE41-NEXT: pinsrd $2, %ecx, %xmm2
578 ; SSE41-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
579 ; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm0
580 ; SSE41-NEXT: pinsrd $2, {{[0-9]+}}(%rsp), %xmm0
581 ; SSE41-NEXT: movdqa %xmm0, %xmm1
582 ; SSE41-NEXT: pmuldq %xmm2, %xmm0
583 ; SSE41-NEXT: pinsrd $3, %r8d, %xmm2
584 ; SSE41-NEXT: movl {{[0-9]+}}(%rsp), %edx
585 ; SSE41-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
586 ; SSE41-NEXT: movd %r9d, %xmm4
587 ; SSE41-NEXT: movdqa %xmm4, %xmm5
588 ; SSE41-NEXT: pmuldq %xmm3, %xmm4
589 ; SSE41-NEXT: pinsrd $1, %edx, %xmm3
590 ; SSE41-NEXT: movl {{[0-9]+}}(%rsp), %esi
591 ; SSE41-NEXT: pinsrd $1, %esi, %xmm5
592 ; SSE41-NEXT: pmulld %xmm3, %xmm5
593 ; SSE41-NEXT: pinsrd $3, {{[0-9]+}}(%rsp), %xmm1
594 ; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %rcx
595 ; SSE41-NEXT: movd %edx, %xmm3
596 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,0,0,0]
597 ; SSE41-NEXT: movd %esi, %xmm6
598 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,0,0,0]
599 ; SSE41-NEXT: pmuldq %xmm3, %xmm6
600 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
601 ; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm6[2,3],xmm3[4,5],xmm6[6,7]
602 ; SSE41-NEXT: movq %xmm5, 16(%rcx)
603 ; SSE41-NEXT: psrad $31, %xmm5
604 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm5
605 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm3
606 ; SSE41-NEXT: pxor %xmm3, %xmm5
607 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
608 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
609 ; SSE41-NEXT: pmuldq %xmm4, %xmm6
610 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
611 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm6[2,3],xmm0[4,5],xmm6[6,7]
612 ; SSE41-NEXT: pmulld %xmm2, %xmm1
613 ; SSE41-NEXT: movdqa %xmm1, (%rcx)
614 ; SSE41-NEXT: psrad $31, %xmm1
615 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
616 ; SSE41-NEXT: pxor %xmm3, %xmm1
617 ; SSE41-NEXT: movq %xmm5, 16(%rdi)
618 ; SSE41-NEXT: movdqa %xmm1, (%rdi)
621 ; AVX1-LABEL: smulo_v6i32:
623 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
624 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
625 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
626 ; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
627 ; AVX1-NEXT: vpmuldq %xmm3, %xmm5, %xmm3
628 ; AVX1-NEXT: vpmuldq %xmm2, %xmm4, %xmm5
629 ; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
630 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm5[0,1],xmm3[2,3],xmm5[4,5],xmm3[6,7]
631 ; AVX1-NEXT: vpmulld %xmm2, %xmm4, %xmm2
632 ; AVX1-NEXT: vpsrad $31, %xmm2, %xmm4
633 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm3, %xmm3
634 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
635 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
636 ; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
637 ; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
638 ; AVX1-NEXT: vpmuldq %xmm5, %xmm6, %xmm5
639 ; AVX1-NEXT: vpmuldq %xmm1, %xmm0, %xmm6
640 ; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
641 ; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm6[0,1],xmm5[2,3],xmm6[4,5],xmm5[6,7]
642 ; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm1
643 ; AVX1-NEXT: vpsrad $31, %xmm1, %xmm0
644 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm5, %xmm0
645 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
646 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
647 ; AVX1-NEXT: vmovq %xmm2, 16(%rdi)
648 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
651 ; AVX2-LABEL: smulo_v6i32:
653 ; AVX2-NEXT: vpshufd {{.*#+}} ymm2 = ymm1[1,1,3,3,5,5,7,7]
654 ; AVX2-NEXT: vpshufd {{.*#+}} ymm3 = ymm0[1,1,3,3,5,5,7,7]
655 ; AVX2-NEXT: vpmuldq %ymm2, %ymm3, %ymm2
656 ; AVX2-NEXT: vpmuldq %ymm1, %ymm0, %ymm3
657 ; AVX2-NEXT: vpshufd {{.*#+}} ymm3 = ymm3[1,1,3,3,5,5,7,7]
658 ; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2],ymm2[3],ymm3[4],ymm2[5],ymm3[6],ymm2[7]
659 ; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm1
660 ; AVX2-NEXT: vpsrad $31, %ymm1, %ymm0
661 ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm2, %ymm0
662 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2
663 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
664 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
665 ; AVX2-NEXT: vmovq %xmm2, 16(%rdi)
666 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
669 ; AVX512-LABEL: smulo_v6i32:
671 ; AVX512-NEXT: vpmuldq %ymm1, %ymm0, %ymm2
672 ; AVX512-NEXT: vpshufd {{.*#+}} ymm3 = ymm1[1,1,3,3,5,5,7,7]
673 ; AVX512-NEXT: vpshufd {{.*#+}} ymm4 = ymm0[1,1,3,3,5,5,7,7]
674 ; AVX512-NEXT: vpmuldq %ymm3, %ymm4, %ymm3
675 ; AVX512-NEXT: vpmovsxbd {{.*#+}} ymm4 = [1,9,3,11,5,13,7,15]
676 ; AVX512-NEXT: vpermi2d %ymm3, %ymm2, %ymm4
677 ; AVX512-NEXT: vpmulld %ymm1, %ymm0, %ymm1
678 ; AVX512-NEXT: vpsrad $31, %ymm1, %ymm0
679 ; AVX512-NEXT: vpcmpneqd %ymm0, %ymm4, %k1
680 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
681 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
682 ; AVX512-NEXT: vextracti128 $1, %ymm1, %xmm2
683 ; AVX512-NEXT: vmovq %xmm2, 16(%rdi)
684 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
686 %t = call {<6 x i32>, <6 x i1>} @llvm.smul.with.overflow.v6i32(<6 x i32> %a0, <6 x i32> %a1)
687 %val = extractvalue {<6 x i32>, <6 x i1>} %t, 0
688 %obit = extractvalue {<6 x i32>, <6 x i1>} %t, 1
689 %res = sext <6 x i1> %obit to <6 x i32>
690 store <6 x i32> %val, ptr %p2
694 define <8 x i32> @smulo_v8i32(<8 x i32> %a0, <8 x i32> %a1, ptr %p2) nounwind {
695 ; SSE2-LABEL: smulo_v8i32:
697 ; SSE2-NEXT: pxor %xmm4, %xmm4
698 ; SSE2-NEXT: pxor %xmm5, %xmm5
699 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm5
700 ; SSE2-NEXT: pand %xmm0, %xmm5
701 ; SSE2-NEXT: pxor %xmm6, %xmm6
702 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm6
703 ; SSE2-NEXT: pand %xmm2, %xmm6
704 ; SSE2-NEXT: paddd %xmm5, %xmm6
705 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
706 ; SSE2-NEXT: pmuludq %xmm2, %xmm0
707 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,3,2,3]
708 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
709 ; SSE2-NEXT: pmuludq %xmm7, %xmm2
710 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,3,2,3]
711 ; SSE2-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
712 ; SSE2-NEXT: psubd %xmm6, %xmm5
713 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
714 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
715 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
716 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
717 ; SSE2-NEXT: psrad $31, %xmm0
718 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm0
719 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2
720 ; SSE2-NEXT: pxor %xmm2, %xmm0
721 ; SSE2-NEXT: pxor %xmm5, %xmm5
722 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
723 ; SSE2-NEXT: pand %xmm1, %xmm5
724 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm4
725 ; SSE2-NEXT: pand %xmm3, %xmm4
726 ; SSE2-NEXT: paddd %xmm5, %xmm4
727 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
728 ; SSE2-NEXT: pmuludq %xmm3, %xmm1
729 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm1[1,3,2,3]
730 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
731 ; SSE2-NEXT: pmuludq %xmm5, %xmm3
732 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,3,2,3]
733 ; SSE2-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1]
734 ; SSE2-NEXT: psubd %xmm4, %xmm6
735 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
736 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
737 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
738 ; SSE2-NEXT: movdqa %xmm1, 16(%rdi)
739 ; SSE2-NEXT: psrad $31, %xmm1
740 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm1
741 ; SSE2-NEXT: pxor %xmm2, %xmm1
744 ; SSSE3-LABEL: smulo_v8i32:
746 ; SSSE3-NEXT: pxor %xmm4, %xmm4
747 ; SSSE3-NEXT: pxor %xmm5, %xmm5
748 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm5
749 ; SSSE3-NEXT: pand %xmm0, %xmm5
750 ; SSSE3-NEXT: pxor %xmm6, %xmm6
751 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm6
752 ; SSSE3-NEXT: pand %xmm2, %xmm6
753 ; SSSE3-NEXT: paddd %xmm5, %xmm6
754 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
755 ; SSSE3-NEXT: pmuludq %xmm2, %xmm0
756 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,3,2,3]
757 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
758 ; SSSE3-NEXT: pmuludq %xmm7, %xmm2
759 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,3,2,3]
760 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
761 ; SSSE3-NEXT: psubd %xmm6, %xmm5
762 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
763 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
764 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
765 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
766 ; SSSE3-NEXT: psrad $31, %xmm0
767 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm0
768 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm2
769 ; SSSE3-NEXT: pxor %xmm2, %xmm0
770 ; SSSE3-NEXT: pxor %xmm5, %xmm5
771 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
772 ; SSSE3-NEXT: pand %xmm1, %xmm5
773 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4
774 ; SSSE3-NEXT: pand %xmm3, %xmm4
775 ; SSSE3-NEXT: paddd %xmm5, %xmm4
776 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
777 ; SSSE3-NEXT: pmuludq %xmm3, %xmm1
778 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm1[1,3,2,3]
779 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
780 ; SSSE3-NEXT: pmuludq %xmm5, %xmm3
781 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,3,2,3]
782 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1]
783 ; SSSE3-NEXT: psubd %xmm4, %xmm6
784 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
785 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
786 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
787 ; SSSE3-NEXT: movdqa %xmm1, 16(%rdi)
788 ; SSSE3-NEXT: psrad $31, %xmm1
789 ; SSSE3-NEXT: pcmpeqd %xmm6, %xmm1
790 ; SSSE3-NEXT: pxor %xmm2, %xmm1
793 ; SSE41-LABEL: smulo_v8i32:
795 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
796 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
797 ; SSE41-NEXT: pmuldq %xmm4, %xmm5
798 ; SSE41-NEXT: movdqa %xmm0, %xmm4
799 ; SSE41-NEXT: pmuldq %xmm2, %xmm4
800 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
801 ; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7]
802 ; SSE41-NEXT: pmulld %xmm2, %xmm0
803 ; SSE41-NEXT: movdqa %xmm0, (%rdi)
804 ; SSE41-NEXT: psrad $31, %xmm0
805 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm0
806 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm2
807 ; SSE41-NEXT: pxor %xmm2, %xmm0
808 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
809 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
810 ; SSE41-NEXT: pmuldq %xmm4, %xmm5
811 ; SSE41-NEXT: movdqa %xmm1, %xmm4
812 ; SSE41-NEXT: pmuldq %xmm3, %xmm4
813 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
814 ; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7]
815 ; SSE41-NEXT: pmulld %xmm3, %xmm1
816 ; SSE41-NEXT: movdqa %xmm1, 16(%rdi)
817 ; SSE41-NEXT: psrad $31, %xmm1
818 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm1
819 ; SSE41-NEXT: pxor %xmm2, %xmm1
822 ; AVX1-LABEL: smulo_v8i32:
824 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
825 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
826 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
827 ; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
828 ; AVX1-NEXT: vpmuldq %xmm3, %xmm5, %xmm3
829 ; AVX1-NEXT: vpmuldq %xmm2, %xmm4, %xmm5
830 ; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
831 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm5[0,1],xmm3[2,3],xmm5[4,5],xmm3[6,7]
832 ; AVX1-NEXT: vpmulld %xmm2, %xmm4, %xmm2
833 ; AVX1-NEXT: vpsrad $31, %xmm2, %xmm4
834 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm3, %xmm3
835 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
836 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
837 ; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
838 ; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
839 ; AVX1-NEXT: vpmuldq %xmm5, %xmm6, %xmm5
840 ; AVX1-NEXT: vpmuldq %xmm1, %xmm0, %xmm6
841 ; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
842 ; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm6[0,1],xmm5[2,3],xmm6[4,5],xmm5[6,7]
843 ; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm1
844 ; AVX1-NEXT: vpsrad $31, %xmm1, %xmm0
845 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm5, %xmm0
846 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
847 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
848 ; AVX1-NEXT: vmovdqa %xmm2, 16(%rdi)
849 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
852 ; AVX2-LABEL: smulo_v8i32:
854 ; AVX2-NEXT: vpshufd {{.*#+}} ymm2 = ymm1[1,1,3,3,5,5,7,7]
855 ; AVX2-NEXT: vpshufd {{.*#+}} ymm3 = ymm0[1,1,3,3,5,5,7,7]
856 ; AVX2-NEXT: vpmuldq %ymm2, %ymm3, %ymm2
857 ; AVX2-NEXT: vpmuldq %ymm1, %ymm0, %ymm3
858 ; AVX2-NEXT: vpshufd {{.*#+}} ymm3 = ymm3[1,1,3,3,5,5,7,7]
859 ; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2],ymm2[3],ymm3[4],ymm2[5],ymm3[6],ymm2[7]
860 ; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm1
861 ; AVX2-NEXT: vpsrad $31, %ymm1, %ymm0
862 ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm2, %ymm0
863 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2
864 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
865 ; AVX2-NEXT: vmovdqa %ymm1, (%rdi)
868 ; AVX512-LABEL: smulo_v8i32:
870 ; AVX512-NEXT: vpmuldq %ymm1, %ymm0, %ymm2
871 ; AVX512-NEXT: vpshufd {{.*#+}} ymm3 = ymm1[1,1,3,3,5,5,7,7]
872 ; AVX512-NEXT: vpshufd {{.*#+}} ymm4 = ymm0[1,1,3,3,5,5,7,7]
873 ; AVX512-NEXT: vpmuldq %ymm3, %ymm4, %ymm3
874 ; AVX512-NEXT: vpmovsxbd {{.*#+}} ymm4 = [1,9,3,11,5,13,7,15]
875 ; AVX512-NEXT: vpermi2d %ymm3, %ymm2, %ymm4
876 ; AVX512-NEXT: vpmulld %ymm1, %ymm0, %ymm1
877 ; AVX512-NEXT: vpsrad $31, %ymm1, %ymm0
878 ; AVX512-NEXT: vpcmpneqd %ymm0, %ymm4, %k1
879 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
880 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
881 ; AVX512-NEXT: vmovdqa %ymm1, (%rdi)
883 %t = call {<8 x i32>, <8 x i1>} @llvm.smul.with.overflow.v8i32(<8 x i32> %a0, <8 x i32> %a1)
884 %val = extractvalue {<8 x i32>, <8 x i1>} %t, 0
885 %obit = extractvalue {<8 x i32>, <8 x i1>} %t, 1
886 %res = sext <8 x i1> %obit to <8 x i32>
887 store <8 x i32> %val, ptr %p2
891 define <16 x i32> @smulo_v16i32(<16 x i32> %a0, <16 x i32> %a1, ptr %p2) nounwind {
892 ; SSE2-LABEL: smulo_v16i32:
894 ; SSE2-NEXT: pxor %xmm8, %xmm8
895 ; SSE2-NEXT: pxor %xmm9, %xmm9
896 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm9
897 ; SSE2-NEXT: pand %xmm0, %xmm9
898 ; SSE2-NEXT: pxor %xmm10, %xmm10
899 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm10
900 ; SSE2-NEXT: pand %xmm4, %xmm10
901 ; SSE2-NEXT: paddd %xmm9, %xmm10
902 ; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm0[1,1,3,3]
903 ; SSE2-NEXT: pmuludq %xmm4, %xmm0
904 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm0[1,3,2,3]
905 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
906 ; SSE2-NEXT: pmuludq %xmm11, %xmm4
907 ; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm4[1,3,2,3]
908 ; SSE2-NEXT: punpckldq {{.*#+}} xmm9 = xmm9[0],xmm11[0],xmm9[1],xmm11[1]
909 ; SSE2-NEXT: psubd %xmm10, %xmm9
910 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
911 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
912 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
913 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
914 ; SSE2-NEXT: psrad $31, %xmm0
915 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm0
916 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm4
917 ; SSE2-NEXT: pxor %xmm4, %xmm0
918 ; SSE2-NEXT: pxor %xmm9, %xmm9
919 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm9
920 ; SSE2-NEXT: pand %xmm1, %xmm9
921 ; SSE2-NEXT: pxor %xmm10, %xmm10
922 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm10
923 ; SSE2-NEXT: pand %xmm5, %xmm10
924 ; SSE2-NEXT: paddd %xmm9, %xmm10
925 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm1[1,1,3,3]
926 ; SSE2-NEXT: pmuludq %xmm5, %xmm1
927 ; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm1[1,3,2,3]
928 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
929 ; SSE2-NEXT: pmuludq %xmm9, %xmm5
930 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm5[1,3,2,3]
931 ; SSE2-NEXT: punpckldq {{.*#+}} xmm11 = xmm11[0],xmm9[0],xmm11[1],xmm9[1]
932 ; SSE2-NEXT: psubd %xmm10, %xmm11
933 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
934 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
935 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm5[0],xmm1[1],xmm5[1]
936 ; SSE2-NEXT: movdqa %xmm1, 16(%rdi)
937 ; SSE2-NEXT: psrad $31, %xmm1
938 ; SSE2-NEXT: pcmpeqd %xmm11, %xmm1
939 ; SSE2-NEXT: pxor %xmm4, %xmm1
940 ; SSE2-NEXT: pxor %xmm5, %xmm5
941 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm5
942 ; SSE2-NEXT: pand %xmm2, %xmm5
943 ; SSE2-NEXT: pxor %xmm9, %xmm9
944 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm9
945 ; SSE2-NEXT: pand %xmm6, %xmm9
946 ; SSE2-NEXT: paddd %xmm5, %xmm9
947 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]
948 ; SSE2-NEXT: pmuludq %xmm6, %xmm2
949 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm2[1,3,2,3]
950 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
951 ; SSE2-NEXT: pmuludq %xmm5, %xmm6
952 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,3,2,3]
953 ; SSE2-NEXT: punpckldq {{.*#+}} xmm10 = xmm10[0],xmm5[0],xmm10[1],xmm5[1]
954 ; SSE2-NEXT: psubd %xmm9, %xmm10
955 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
956 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm6[0,2,2,3]
957 ; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
958 ; SSE2-NEXT: movdqa %xmm2, 32(%rdi)
959 ; SSE2-NEXT: psrad $31, %xmm2
960 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm2
961 ; SSE2-NEXT: pxor %xmm4, %xmm2
962 ; SSE2-NEXT: pxor %xmm5, %xmm5
963 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm5
964 ; SSE2-NEXT: pand %xmm3, %xmm5
965 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm8
966 ; SSE2-NEXT: pand %xmm7, %xmm8
967 ; SSE2-NEXT: paddd %xmm5, %xmm8
968 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]
969 ; SSE2-NEXT: pmuludq %xmm7, %xmm3
970 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[1,3,2,3]
971 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
972 ; SSE2-NEXT: pmuludq %xmm5, %xmm7
973 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,3,2,3]
974 ; SSE2-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1]
975 ; SSE2-NEXT: psubd %xmm8, %xmm6
976 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
977 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[0,2,2,3]
978 ; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1]
979 ; SSE2-NEXT: movdqa %xmm3, 48(%rdi)
980 ; SSE2-NEXT: psrad $31, %xmm3
981 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm3
982 ; SSE2-NEXT: pxor %xmm4, %xmm3
985 ; SSSE3-LABEL: smulo_v16i32:
987 ; SSSE3-NEXT: pxor %xmm8, %xmm8
988 ; SSSE3-NEXT: pxor %xmm9, %xmm9
989 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm9
990 ; SSSE3-NEXT: pand %xmm0, %xmm9
991 ; SSSE3-NEXT: pxor %xmm10, %xmm10
992 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm10
993 ; SSSE3-NEXT: pand %xmm4, %xmm10
994 ; SSSE3-NEXT: paddd %xmm9, %xmm10
995 ; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm0[1,1,3,3]
996 ; SSSE3-NEXT: pmuludq %xmm4, %xmm0
997 ; SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm0[1,3,2,3]
998 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
999 ; SSSE3-NEXT: pmuludq %xmm11, %xmm4
1000 ; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm4[1,3,2,3]
1001 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm9 = xmm9[0],xmm11[0],xmm9[1],xmm11[1]
1002 ; SSSE3-NEXT: psubd %xmm10, %xmm9
1003 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1004 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
1005 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
1006 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
1007 ; SSSE3-NEXT: psrad $31, %xmm0
1008 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm0
1009 ; SSSE3-NEXT: pcmpeqd %xmm4, %xmm4
1010 ; SSSE3-NEXT: pxor %xmm4, %xmm0
1011 ; SSSE3-NEXT: pxor %xmm9, %xmm9
1012 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm9
1013 ; SSSE3-NEXT: pand %xmm1, %xmm9
1014 ; SSSE3-NEXT: pxor %xmm10, %xmm10
1015 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm10
1016 ; SSSE3-NEXT: pand %xmm5, %xmm10
1017 ; SSSE3-NEXT: paddd %xmm9, %xmm10
1018 ; SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm1[1,1,3,3]
1019 ; SSSE3-NEXT: pmuludq %xmm5, %xmm1
1020 ; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm1[1,3,2,3]
1021 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1022 ; SSSE3-NEXT: pmuludq %xmm9, %xmm5
1023 ; SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm5[1,3,2,3]
1024 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm11 = xmm11[0],xmm9[0],xmm11[1],xmm9[1]
1025 ; SSSE3-NEXT: psubd %xmm10, %xmm11
1026 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
1027 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
1028 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm5[0],xmm1[1],xmm5[1]
1029 ; SSSE3-NEXT: movdqa %xmm1, 16(%rdi)
1030 ; SSSE3-NEXT: psrad $31, %xmm1
1031 ; SSSE3-NEXT: pcmpeqd %xmm11, %xmm1
1032 ; SSSE3-NEXT: pxor %xmm4, %xmm1
1033 ; SSSE3-NEXT: pxor %xmm5, %xmm5
1034 ; SSSE3-NEXT: pcmpgtd %xmm6, %xmm5
1035 ; SSSE3-NEXT: pand %xmm2, %xmm5
1036 ; SSSE3-NEXT: pxor %xmm9, %xmm9
1037 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm9
1038 ; SSSE3-NEXT: pand %xmm6, %xmm9
1039 ; SSSE3-NEXT: paddd %xmm5, %xmm9
1040 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]
1041 ; SSSE3-NEXT: pmuludq %xmm6, %xmm2
1042 ; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm2[1,3,2,3]
1043 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1044 ; SSSE3-NEXT: pmuludq %xmm5, %xmm6
1045 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,3,2,3]
1046 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm10 = xmm10[0],xmm5[0],xmm10[1],xmm5[1]
1047 ; SSSE3-NEXT: psubd %xmm9, %xmm10
1048 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
1049 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm6[0,2,2,3]
1050 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
1051 ; SSSE3-NEXT: movdqa %xmm2, 32(%rdi)
1052 ; SSSE3-NEXT: psrad $31, %xmm2
1053 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm2
1054 ; SSSE3-NEXT: pxor %xmm4, %xmm2
1055 ; SSSE3-NEXT: pxor %xmm5, %xmm5
1056 ; SSSE3-NEXT: pcmpgtd %xmm7, %xmm5
1057 ; SSSE3-NEXT: pand %xmm3, %xmm5
1058 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm8
1059 ; SSSE3-NEXT: pand %xmm7, %xmm8
1060 ; SSSE3-NEXT: paddd %xmm5, %xmm8
1061 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]
1062 ; SSSE3-NEXT: pmuludq %xmm7, %xmm3
1063 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm3[1,3,2,3]
1064 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1065 ; SSSE3-NEXT: pmuludq %xmm5, %xmm7
1066 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,3,2,3]
1067 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1]
1068 ; SSSE3-NEXT: psubd %xmm8, %xmm6
1069 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
1070 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[0,2,2,3]
1071 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1]
1072 ; SSSE3-NEXT: movdqa %xmm3, 48(%rdi)
1073 ; SSSE3-NEXT: psrad $31, %xmm3
1074 ; SSSE3-NEXT: pcmpeqd %xmm6, %xmm3
1075 ; SSSE3-NEXT: pxor %xmm4, %xmm3
1078 ; SSE41-LABEL: smulo_v16i32:
1080 ; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm4[1,1,3,3]
1081 ; SSE41-NEXT: pshufd {{.*#+}} xmm9 = xmm0[1,1,3,3]
1082 ; SSE41-NEXT: pmuldq %xmm8, %xmm9
1083 ; SSE41-NEXT: movdqa %xmm0, %xmm8
1084 ; SSE41-NEXT: pmuldq %xmm4, %xmm8
1085 ; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
1086 ; SSE41-NEXT: pblendw {{.*#+}} xmm8 = xmm8[0,1],xmm9[2,3],xmm8[4,5],xmm9[6,7]
1087 ; SSE41-NEXT: pmulld %xmm4, %xmm0
1088 ; SSE41-NEXT: movdqa %xmm0, (%rdi)
1089 ; SSE41-NEXT: psrad $31, %xmm0
1090 ; SSE41-NEXT: pcmpeqd %xmm8, %xmm0
1091 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm4
1092 ; SSE41-NEXT: pxor %xmm4, %xmm0
1093 ; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm5[1,1,3,3]
1094 ; SSE41-NEXT: pshufd {{.*#+}} xmm9 = xmm1[1,1,3,3]
1095 ; SSE41-NEXT: pmuldq %xmm8, %xmm9
1096 ; SSE41-NEXT: movdqa %xmm1, %xmm8
1097 ; SSE41-NEXT: pmuldq %xmm5, %xmm8
1098 ; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
1099 ; SSE41-NEXT: pblendw {{.*#+}} xmm8 = xmm8[0,1],xmm9[2,3],xmm8[4,5],xmm9[6,7]
1100 ; SSE41-NEXT: pmulld %xmm5, %xmm1
1101 ; SSE41-NEXT: movdqa %xmm1, 16(%rdi)
1102 ; SSE41-NEXT: psrad $31, %xmm1
1103 ; SSE41-NEXT: pcmpeqd %xmm8, %xmm1
1104 ; SSE41-NEXT: pxor %xmm4, %xmm1
1105 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
1106 ; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm2[1,1,3,3]
1107 ; SSE41-NEXT: pmuldq %xmm5, %xmm8
1108 ; SSE41-NEXT: movdqa %xmm2, %xmm5
1109 ; SSE41-NEXT: pmuldq %xmm6, %xmm5
1110 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1111 ; SSE41-NEXT: pblendw {{.*#+}} xmm5 = xmm5[0,1],xmm8[2,3],xmm5[4,5],xmm8[6,7]
1112 ; SSE41-NEXT: pmulld %xmm6, %xmm2
1113 ; SSE41-NEXT: movdqa %xmm2, 32(%rdi)
1114 ; SSE41-NEXT: psrad $31, %xmm2
1115 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm2
1116 ; SSE41-NEXT: pxor %xmm4, %xmm2
1117 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1118 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm3[1,1,3,3]
1119 ; SSE41-NEXT: pmuldq %xmm5, %xmm6
1120 ; SSE41-NEXT: movdqa %xmm3, %xmm5
1121 ; SSE41-NEXT: pmuldq %xmm7, %xmm5
1122 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1123 ; SSE41-NEXT: pblendw {{.*#+}} xmm5 = xmm5[0,1],xmm6[2,3],xmm5[4,5],xmm6[6,7]
1124 ; SSE41-NEXT: pmulld %xmm7, %xmm3
1125 ; SSE41-NEXT: movdqa %xmm3, 48(%rdi)
1126 ; SSE41-NEXT: psrad $31, %xmm3
1127 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm3
1128 ; SSE41-NEXT: pxor %xmm4, %xmm3
1131 ; AVX1-LABEL: smulo_v16i32:
1133 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
1134 ; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
1135 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6
1136 ; AVX1-NEXT: vpshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
1137 ; AVX1-NEXT: vpmuldq %xmm5, %xmm7, %xmm5
1138 ; AVX1-NEXT: vpmuldq %xmm4, %xmm6, %xmm7
1139 ; AVX1-NEXT: vpshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1140 ; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm7[0,1],xmm5[2,3],xmm7[4,5],xmm5[6,7]
1141 ; AVX1-NEXT: vpmulld %xmm4, %xmm6, %xmm4
1142 ; AVX1-NEXT: vpsrad $31, %xmm4, %xmm6
1143 ; AVX1-NEXT: vpcmpeqd %xmm6, %xmm5, %xmm5
1144 ; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm3[1,1,3,3]
1145 ; AVX1-NEXT: vpshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
1146 ; AVX1-NEXT: vpmuldq %xmm6, %xmm7, %xmm6
1147 ; AVX1-NEXT: vpmuldq %xmm3, %xmm1, %xmm7
1148 ; AVX1-NEXT: vpshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1149 ; AVX1-NEXT: vpblendw {{.*#+}} xmm6 = xmm7[0,1],xmm6[2,3],xmm7[4,5],xmm6[6,7]
1150 ; AVX1-NEXT: vpmulld %xmm3, %xmm1, %xmm3
1151 ; AVX1-NEXT: vpsrad $31, %xmm3, %xmm1
1152 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm6, %xmm1
1153 ; AVX1-NEXT: vpackssdw %xmm5, %xmm1, %xmm1
1154 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5
1155 ; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
1156 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7
1157 ; AVX1-NEXT: vpshufd {{.*#+}} xmm8 = xmm7[1,1,3,3]
1158 ; AVX1-NEXT: vpmuldq %xmm6, %xmm8, %xmm6
1159 ; AVX1-NEXT: vpmuldq %xmm5, %xmm7, %xmm8
1160 ; AVX1-NEXT: vpshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
1161 ; AVX1-NEXT: vpblendw {{.*#+}} xmm6 = xmm8[0,1],xmm6[2,3],xmm8[4,5],xmm6[6,7]
1162 ; AVX1-NEXT: vpmulld %xmm5, %xmm7, %xmm5
1163 ; AVX1-NEXT: vpsrad $31, %xmm5, %xmm7
1164 ; AVX1-NEXT: vpcmpeqd %xmm7, %xmm6, %xmm6
1165 ; AVX1-NEXT: vpshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
1166 ; AVX1-NEXT: vpshufd {{.*#+}} xmm8 = xmm0[1,1,3,3]
1167 ; AVX1-NEXT: vpmuldq %xmm7, %xmm8, %xmm7
1168 ; AVX1-NEXT: vpmuldq %xmm2, %xmm0, %xmm8
1169 ; AVX1-NEXT: vpshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
1170 ; AVX1-NEXT: vpblendw {{.*#+}} xmm7 = xmm8[0,1],xmm7[2,3],xmm8[4,5],xmm7[6,7]
1171 ; AVX1-NEXT: vpmulld %xmm2, %xmm0, %xmm2
1172 ; AVX1-NEXT: vpsrad $31, %xmm2, %xmm0
1173 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm7, %xmm0
1174 ; AVX1-NEXT: vpackssdw %xmm6, %xmm0, %xmm0
1175 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
1176 ; AVX1-NEXT: vpcmpeqd %xmm6, %xmm6, %xmm6
1177 ; AVX1-NEXT: vpxor %xmm6, %xmm0, %xmm0
1178 ; AVX1-NEXT: vpmovsxbd %xmm0, %xmm7
1179 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
1180 ; AVX1-NEXT: vpmovsxbd %xmm0, %xmm0
1181 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm7, %ymm0
1182 ; AVX1-NEXT: vpacksswb %xmm1, %xmm1, %xmm1
1183 ; AVX1-NEXT: vpxor %xmm6, %xmm1, %xmm1
1184 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm6
1185 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]
1186 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
1187 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm6, %ymm1
1188 ; AVX1-NEXT: vmovdqa %xmm4, 48(%rdi)
1189 ; AVX1-NEXT: vmovdqa %xmm3, 32(%rdi)
1190 ; AVX1-NEXT: vmovdqa %xmm5, 16(%rdi)
1191 ; AVX1-NEXT: vmovdqa %xmm2, (%rdi)
1194 ; AVX2-LABEL: smulo_v16i32:
1196 ; AVX2-NEXT: vpshufd {{.*#+}} ymm4 = ymm3[1,1,3,3,5,5,7,7]
1197 ; AVX2-NEXT: vpshufd {{.*#+}} ymm5 = ymm1[1,1,3,3,5,5,7,7]
1198 ; AVX2-NEXT: vpmuldq %ymm4, %ymm5, %ymm4
1199 ; AVX2-NEXT: vpmuldq %ymm3, %ymm1, %ymm5
1200 ; AVX2-NEXT: vpshufd {{.*#+}} ymm5 = ymm5[1,1,3,3,5,5,7,7]
1201 ; AVX2-NEXT: vpblendd {{.*#+}} ymm4 = ymm5[0],ymm4[1],ymm5[2],ymm4[3],ymm5[4],ymm4[5],ymm5[6],ymm4[7]
1202 ; AVX2-NEXT: vpmulld %ymm3, %ymm1, %ymm3
1203 ; AVX2-NEXT: vpsrad $31, %ymm3, %ymm1
1204 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm4, %ymm1
1205 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4
1206 ; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1
1207 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5
1208 ; AVX2-NEXT: vpackssdw %xmm5, %xmm1, %xmm1
1209 ; AVX2-NEXT: vpshufd {{.*#+}} ymm5 = ymm2[1,1,3,3,5,5,7,7]
1210 ; AVX2-NEXT: vpshufd {{.*#+}} ymm6 = ymm0[1,1,3,3,5,5,7,7]
1211 ; AVX2-NEXT: vpmuldq %ymm5, %ymm6, %ymm5
1212 ; AVX2-NEXT: vpmuldq %ymm2, %ymm0, %ymm6
1213 ; AVX2-NEXT: vpshufd {{.*#+}} ymm6 = ymm6[1,1,3,3,5,5,7,7]
1214 ; AVX2-NEXT: vpblendd {{.*#+}} ymm5 = ymm6[0],ymm5[1],ymm6[2],ymm5[3],ymm6[4],ymm5[5],ymm6[6],ymm5[7]
1215 ; AVX2-NEXT: vpmulld %ymm2, %ymm0, %ymm2
1216 ; AVX2-NEXT: vpsrad $31, %ymm2, %ymm0
1217 ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm5, %ymm0
1218 ; AVX2-NEXT: vpacksswb %xmm1, %xmm1, %xmm1
1219 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1
1220 ; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,0,0,0,4,4,4,4,8,8,8,8,12,12,12,12,16,16,16,16,20,20,20,20,24,24,24,24,28,28,28,28]
1221 ; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm0
1222 ; AVX2-NEXT: vmovdqa %ymm3, 32(%rdi)
1223 ; AVX2-NEXT: vmovdqa %ymm2, (%rdi)
1226 ; AVX512-LABEL: smulo_v16i32:
1228 ; AVX512-NEXT: vpmuldq %zmm1, %zmm0, %zmm2
1229 ; AVX512-NEXT: vpshufd {{.*#+}} zmm3 = zmm1[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]
1230 ; AVX512-NEXT: vpshufd {{.*#+}} zmm4 = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]
1231 ; AVX512-NEXT: vpmuldq %zmm3, %zmm4, %zmm3
1232 ; AVX512-NEXT: vpmovsxbd {{.*#+}} zmm4 = [1,17,3,19,5,21,7,23,9,25,11,27,13,29,15,31]
1233 ; AVX512-NEXT: vpermi2d %zmm3, %zmm2, %zmm4
1234 ; AVX512-NEXT: vpmulld %zmm1, %zmm0, %zmm1
1235 ; AVX512-NEXT: vpsrad $31, %zmm1, %zmm0
1236 ; AVX512-NEXT: vpcmpneqd %zmm0, %zmm4, %k1
1237 ; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1238 ; AVX512-NEXT: vmovdqa64 %zmm1, (%rdi)
1240 %t = call {<16 x i32>, <16 x i1>} @llvm.smul.with.overflow.v16i32(<16 x i32> %a0, <16 x i32> %a1)
1241 %val = extractvalue {<16 x i32>, <16 x i1>} %t, 0
1242 %obit = extractvalue {<16 x i32>, <16 x i1>} %t, 1
1243 %res = sext <16 x i1> %obit to <16 x i32>
1244 store <16 x i32> %val, ptr %p2
1248 define <16 x i32> @smulo_v16i8(<16 x i8> %a0, <16 x i8> %a1, ptr %p2) nounwind {
1249 ; SSE2-LABEL: smulo_v16i8:
1251 ; SSE2-NEXT: pxor %xmm2, %xmm2
1252 ; SSE2-NEXT: pxor %xmm3, %xmm3
1253 ; 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]
1254 ; SSE2-NEXT: pxor %xmm5, %xmm5
1255 ; 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]
1256 ; SSE2-NEXT: pmulhw %xmm3, %xmm5
1257 ; SSE2-NEXT: movdqa %xmm5, %xmm3
1258 ; SSE2-NEXT: psrlw $8, %xmm3
1259 ; SSE2-NEXT: pxor %xmm6, %xmm6
1260 ; 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]
1261 ; SSE2-NEXT: pxor %xmm4, %xmm4
1262 ; 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]
1263 ; SSE2-NEXT: pmulhw %xmm6, %xmm4
1264 ; SSE2-NEXT: movdqa %xmm4, %xmm0
1265 ; SSE2-NEXT: psrlw $8, %xmm0
1266 ; SSE2-NEXT: packuswb %xmm3, %xmm0
1267 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
1268 ; SSE2-NEXT: pand %xmm1, %xmm5
1269 ; SSE2-NEXT: pand %xmm1, %xmm4
1270 ; SSE2-NEXT: packuswb %xmm5, %xmm4
1271 ; SSE2-NEXT: pcmpgtb %xmm4, %xmm2
1272 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm2
1273 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm3
1274 ; SSE2-NEXT: pxor %xmm2, %xmm3
1275 ; SSE2-NEXT: movdqa %xmm3, %xmm0
1276 ; 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]
1277 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1278 ; SSE2-NEXT: movdqa %xmm3, %xmm1
1279 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1280 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
1281 ; SSE2-NEXT: pslld $31, %xmm1
1282 ; SSE2-NEXT: psrad $31, %xmm1
1283 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1284 ; SSE2-NEXT: movdqa %xmm3, %xmm2
1285 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
1286 ; SSE2-NEXT: pslld $31, %xmm2
1287 ; SSE2-NEXT: psrad $31, %xmm2
1288 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]
1289 ; SSE2-NEXT: pslld $31, %xmm3
1290 ; SSE2-NEXT: psrad $31, %xmm3
1291 ; SSE2-NEXT: movdqa %xmm4, (%rdi)
1294 ; SSSE3-LABEL: smulo_v16i8:
1296 ; SSSE3-NEXT: pxor %xmm2, %xmm2
1297 ; SSSE3-NEXT: pxor %xmm3, %xmm3
1298 ; 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]
1299 ; SSSE3-NEXT: pxor %xmm5, %xmm5
1300 ; 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]
1301 ; SSSE3-NEXT: pmulhw %xmm3, %xmm5
1302 ; SSSE3-NEXT: movdqa %xmm5, %xmm3
1303 ; SSSE3-NEXT: psrlw $8, %xmm3
1304 ; SSSE3-NEXT: pxor %xmm6, %xmm6
1305 ; 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]
1306 ; SSSE3-NEXT: pxor %xmm4, %xmm4
1307 ; 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]
1308 ; SSSE3-NEXT: pmulhw %xmm6, %xmm4
1309 ; SSSE3-NEXT: movdqa %xmm4, %xmm0
1310 ; SSSE3-NEXT: psrlw $8, %xmm0
1311 ; SSSE3-NEXT: packuswb %xmm3, %xmm0
1312 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
1313 ; SSSE3-NEXT: pand %xmm1, %xmm5
1314 ; SSSE3-NEXT: pand %xmm1, %xmm4
1315 ; SSSE3-NEXT: packuswb %xmm5, %xmm4
1316 ; SSSE3-NEXT: pcmpgtb %xmm4, %xmm2
1317 ; SSSE3-NEXT: pcmpeqb %xmm0, %xmm2
1318 ; SSSE3-NEXT: pcmpeqd %xmm3, %xmm3
1319 ; SSSE3-NEXT: pxor %xmm2, %xmm3
1320 ; SSSE3-NEXT: movdqa %xmm3, %xmm0
1321 ; 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]
1322 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1323 ; SSSE3-NEXT: movdqa %xmm3, %xmm1
1324 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1325 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
1326 ; SSSE3-NEXT: pslld $31, %xmm1
1327 ; SSSE3-NEXT: psrad $31, %xmm1
1328 ; SSSE3-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1329 ; SSSE3-NEXT: movdqa %xmm3, %xmm2
1330 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
1331 ; SSSE3-NEXT: pslld $31, %xmm2
1332 ; SSSE3-NEXT: psrad $31, %xmm2
1333 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]
1334 ; SSSE3-NEXT: pslld $31, %xmm3
1335 ; SSSE3-NEXT: psrad $31, %xmm3
1336 ; SSSE3-NEXT: movdqa %xmm4, (%rdi)
1339 ; SSE41-LABEL: smulo_v16i8:
1341 ; SSE41-NEXT: pxor %xmm2, %xmm2
1342 ; SSE41-NEXT: pxor %xmm3, %xmm3
1343 ; 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]
1344 ; SSE41-NEXT: pxor %xmm5, %xmm5
1345 ; 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]
1346 ; SSE41-NEXT: pmulhw %xmm3, %xmm5
1347 ; SSE41-NEXT: movdqa %xmm5, %xmm3
1348 ; SSE41-NEXT: psrlw $8, %xmm3
1349 ; SSE41-NEXT: pxor %xmm6, %xmm6
1350 ; 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]
1351 ; SSE41-NEXT: pxor %xmm4, %xmm4
1352 ; 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]
1353 ; SSE41-NEXT: pmulhw %xmm6, %xmm4
1354 ; SSE41-NEXT: movdqa %xmm4, %xmm0
1355 ; SSE41-NEXT: psrlw $8, %xmm0
1356 ; SSE41-NEXT: packuswb %xmm3, %xmm0
1357 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
1358 ; SSE41-NEXT: pand %xmm1, %xmm5
1359 ; SSE41-NEXT: pand %xmm1, %xmm4
1360 ; SSE41-NEXT: packuswb %xmm5, %xmm4
1361 ; SSE41-NEXT: pcmpgtb %xmm4, %xmm2
1362 ; SSE41-NEXT: pcmpeqb %xmm0, %xmm2
1363 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm3
1364 ; SSE41-NEXT: pxor %xmm2, %xmm3
1365 ; SSE41-NEXT: pmovsxbd %xmm3, %xmm0
1366 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,1,1]
1367 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
1368 ; SSE41-NEXT: pslld $31, %xmm1
1369 ; SSE41-NEXT: psrad $31, %xmm1
1370 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[2,3,2,3]
1371 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
1372 ; SSE41-NEXT: pslld $31, %xmm2
1373 ; SSE41-NEXT: psrad $31, %xmm2
1374 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[3,3,3,3]
1375 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
1376 ; SSE41-NEXT: pslld $31, %xmm3
1377 ; SSE41-NEXT: psrad $31, %xmm3
1378 ; SSE41-NEXT: movdqa %xmm4, (%rdi)
1381 ; AVX1-LABEL: smulo_v16i8:
1383 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
1384 ; 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]
1385 ; 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]
1386 ; AVX1-NEXT: vpmulhw %xmm3, %xmm4, %xmm3
1387 ; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm4
1388 ; 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]
1389 ; 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]
1390 ; AVX1-NEXT: vpmulhw %xmm1, %xmm0, %xmm0
1391 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
1392 ; AVX1-NEXT: vpackuswb %xmm4, %xmm1, %xmm1
1393 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
1394 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
1395 ; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0
1396 ; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm3
1397 ; AVX1-NEXT: vpcmpgtb %xmm3, %xmm2, %xmm0
1398 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
1399 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1400 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm1
1401 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0
1402 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]
1403 ; AVX1-NEXT: vpmovsxbd %xmm2, %xmm2
1404 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1405 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
1406 ; AVX1-NEXT: vpmovsxbd %xmm2, %xmm2
1407 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,3,3]
1408 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
1409 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
1410 ; AVX1-NEXT: vmovdqa %xmm3, (%rdi)
1413 ; AVX2-LABEL: smulo_v16i8:
1415 ; AVX2-NEXT: vpmovsxbw %xmm1, %ymm1
1416 ; AVX2-NEXT: vpmovsxbw %xmm0, %ymm0
1417 ; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0
1418 ; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm1
1419 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
1420 ; AVX2-NEXT: vpackuswb %xmm2, %xmm1, %xmm1
1421 ; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1422 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2
1423 ; AVX2-NEXT: vpackuswb %xmm2, %xmm0, %xmm2
1424 ; AVX2-NEXT: vpxor %xmm0, %xmm0, %xmm0
1425 ; AVX2-NEXT: vpcmpgtb %xmm2, %xmm0, %xmm0
1426 ; AVX2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
1427 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1428 ; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm1
1429 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0
1430 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
1431 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1
1432 ; AVX2-NEXT: vmovdqa %xmm2, (%rdi)
1435 ; AVX512F-LABEL: smulo_v16i8:
1437 ; AVX512F-NEXT: vpmovsxbw %xmm1, %ymm1
1438 ; AVX512F-NEXT: vpmovsxbw %xmm0, %ymm0
1439 ; AVX512F-NEXT: vpmullw %ymm1, %ymm0, %ymm1
1440 ; AVX512F-NEXT: vpsraw $8, %ymm1, %ymm0
1441 ; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0
1442 ; AVX512F-NEXT: vpsllw $8, %ymm1, %ymm2
1443 ; AVX512F-NEXT: vpsraw $15, %ymm2, %ymm2
1444 ; AVX512F-NEXT: vpmovsxwd %ymm2, %zmm2
1445 ; AVX512F-NEXT: vpcmpneqd %zmm0, %zmm2, %k1
1446 ; AVX512F-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1447 ; 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
1448 ; AVX512F-NEXT: vpmovdb %zmm1, (%rdi)
1449 ; AVX512F-NEXT: retq
1451 ; AVX512BW-LABEL: smulo_v16i8:
1452 ; AVX512BW: # %bb.0:
1453 ; AVX512BW-NEXT: vpmovsxbw %xmm1, %ymm1
1454 ; AVX512BW-NEXT: vpmovsxbw %xmm0, %ymm0
1455 ; AVX512BW-NEXT: vpmullw %ymm1, %ymm0, %ymm1
1456 ; AVX512BW-NEXT: vpsraw $8, %ymm1, %ymm0
1457 ; AVX512BW-NEXT: vpsllw $8, %ymm1, %ymm2
1458 ; AVX512BW-NEXT: vpsraw $15, %ymm2, %ymm2
1459 ; AVX512BW-NEXT: vpcmpneqw %ymm0, %ymm2, %k1
1460 ; AVX512BW-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1461 ; AVX512BW-NEXT: vpmovwb %ymm1, (%rdi)
1462 ; AVX512BW-NEXT: retq
1463 %t = call {<16 x i8>, <16 x i1>} @llvm.smul.with.overflow.v16i8(<16 x i8> %a0, <16 x i8> %a1)
1464 %val = extractvalue {<16 x i8>, <16 x i1>} %t, 0
1465 %obit = extractvalue {<16 x i8>, <16 x i1>} %t, 1
1466 %res = sext <16 x i1> %obit to <16 x i32>
1467 store <16 x i8> %val, ptr %p2
1471 define <32 x i32> @smulo_v32i8(<32 x i8> %a0, <32 x i8> %a1, ptr %p2) nounwind {
1472 ; SSE2-LABEL: smulo_v32i8:
1474 ; SSE2-NEXT: movq %rdi, %rax
1475 ; SSE2-NEXT: pxor %xmm4, %xmm4
1476 ; SSE2-NEXT: pxor %xmm5, %xmm5
1477 ; 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]
1478 ; SSE2-NEXT: pxor %xmm6, %xmm6
1479 ; 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]
1480 ; SSE2-NEXT: pmulhw %xmm5, %xmm6
1481 ; SSE2-NEXT: movdqa %xmm6, %xmm5
1482 ; SSE2-NEXT: psrlw $8, %xmm5
1483 ; SSE2-NEXT: pxor %xmm7, %xmm7
1484 ; 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]
1485 ; SSE2-NEXT: pxor %xmm3, %xmm3
1486 ; SSE2-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]
1487 ; SSE2-NEXT: pmulhw %xmm7, %xmm3
1488 ; SSE2-NEXT: movdqa %xmm3, %xmm7
1489 ; SSE2-NEXT: psrlw $8, %xmm7
1490 ; SSE2-NEXT: packuswb %xmm5, %xmm7
1491 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255]
1492 ; SSE2-NEXT: pand %xmm5, %xmm6
1493 ; SSE2-NEXT: pand %xmm5, %xmm3
1494 ; SSE2-NEXT: packuswb %xmm6, %xmm3
1495 ; SSE2-NEXT: pxor %xmm1, %xmm1
1496 ; SSE2-NEXT: pcmpgtb %xmm3, %xmm1
1497 ; SSE2-NEXT: pcmpeqb %xmm7, %xmm1
1498 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm6
1499 ; SSE2-NEXT: pxor %xmm6, %xmm1
1500 ; SSE2-NEXT: pxor %xmm7, %xmm7
1501 ; 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]
1502 ; SSE2-NEXT: pxor %xmm8, %xmm8
1503 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm0[8],xmm8[9],xmm0[9],xmm8[10],xmm0[10],xmm8[11],xmm0[11],xmm8[12],xmm0[12],xmm8[13],xmm0[13],xmm8[14],xmm0[14],xmm8[15],xmm0[15]
1504 ; SSE2-NEXT: pmulhw %xmm7, %xmm8
1505 ; SSE2-NEXT: movdqa %xmm8, %xmm7
1506 ; SSE2-NEXT: psrlw $8, %xmm7
1507 ; SSE2-NEXT: pxor %xmm9, %xmm9
1508 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm9 = xmm9[0],xmm2[0],xmm9[1],xmm2[1],xmm9[2],xmm2[2],xmm9[3],xmm2[3],xmm9[4],xmm2[4],xmm9[5],xmm2[5],xmm9[6],xmm2[6],xmm9[7],xmm2[7]
1509 ; SSE2-NEXT: pxor %xmm2, %xmm2
1510 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
1511 ; SSE2-NEXT: pmulhw %xmm9, %xmm2
1512 ; SSE2-NEXT: movdqa %xmm2, %xmm0
1513 ; SSE2-NEXT: psrlw $8, %xmm0
1514 ; SSE2-NEXT: packuswb %xmm7, %xmm0
1515 ; SSE2-NEXT: pand %xmm5, %xmm8
1516 ; SSE2-NEXT: pand %xmm5, %xmm2
1517 ; SSE2-NEXT: packuswb %xmm8, %xmm2
1518 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm4
1519 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm4
1520 ; SSE2-NEXT: pxor %xmm6, %xmm4
1521 ; SSE2-NEXT: movdqa %xmm4, %xmm0
1522 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1523 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
1524 ; SSE2-NEXT: pslld $31, %xmm0
1525 ; SSE2-NEXT: psrad $31, %xmm0
1526 ; SSE2-NEXT: movdqa %xmm4, %xmm5
1527 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1528 ; SSE2-NEXT: movdqa %xmm5, %xmm6
1529 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm6 = xmm6[0,0,1,1,2,2,3,3]
1530 ; SSE2-NEXT: pslld $31, %xmm6
1531 ; SSE2-NEXT: psrad $31, %xmm6
1532 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]
1533 ; SSE2-NEXT: pslld $31, %xmm5
1534 ; SSE2-NEXT: psrad $31, %xmm5
1535 ; SSE2-NEXT: movdqa %xmm1, %xmm7
1536 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm7 = xmm7[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1537 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm7 = xmm7[4,4,5,5,6,6,7,7]
1538 ; SSE2-NEXT: pslld $31, %xmm7
1539 ; SSE2-NEXT: psrad $31, %xmm7
1540 ; SSE2-NEXT: movdqa %xmm1, %xmm8
1541 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1542 ; SSE2-NEXT: movdqa %xmm8, %xmm9
1543 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm9 = xmm9[0,0,1,1,2,2,3,3]
1544 ; SSE2-NEXT: pslld $31, %xmm9
1545 ; SSE2-NEXT: psrad $31, %xmm9
1546 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm8 = xmm8[4,4,5,5,6,6,7,7]
1547 ; SSE2-NEXT: pslld $31, %xmm8
1548 ; SSE2-NEXT: psrad $31, %xmm8
1549 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1550 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3]
1551 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1552 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
1553 ; SSE2-NEXT: movdqa %xmm3, 16(%rsi)
1554 ; SSE2-NEXT: movdqa %xmm2, (%rsi)
1555 ; SSE2-NEXT: movdqa %xmm1, 64(%rdi)
1556 ; SSE2-NEXT: movdqa %xmm4, (%rdi)
1557 ; SSE2-NEXT: movdqa %xmm8, 112(%rdi)
1558 ; SSE2-NEXT: movdqa %xmm9, 96(%rdi)
1559 ; SSE2-NEXT: movdqa %xmm7, 80(%rdi)
1560 ; SSE2-NEXT: movdqa %xmm5, 48(%rdi)
1561 ; SSE2-NEXT: movdqa %xmm6, 32(%rdi)
1562 ; SSE2-NEXT: movdqa %xmm0, 16(%rdi)
1565 ; SSSE3-LABEL: smulo_v32i8:
1567 ; SSSE3-NEXT: movq %rdi, %rax
1568 ; SSSE3-NEXT: pxor %xmm4, %xmm4
1569 ; SSSE3-NEXT: pxor %xmm5, %xmm5
1570 ; 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]
1571 ; SSSE3-NEXT: pxor %xmm6, %xmm6
1572 ; 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]
1573 ; SSSE3-NEXT: pmulhw %xmm5, %xmm6
1574 ; SSSE3-NEXT: movdqa %xmm6, %xmm5
1575 ; SSSE3-NEXT: psrlw $8, %xmm5
1576 ; SSSE3-NEXT: pxor %xmm7, %xmm7
1577 ; 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]
1578 ; SSSE3-NEXT: pxor %xmm3, %xmm3
1579 ; SSSE3-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]
1580 ; SSSE3-NEXT: pmulhw %xmm7, %xmm3
1581 ; SSSE3-NEXT: movdqa %xmm3, %xmm7
1582 ; SSSE3-NEXT: psrlw $8, %xmm7
1583 ; SSSE3-NEXT: packuswb %xmm5, %xmm7
1584 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255]
1585 ; SSSE3-NEXT: pand %xmm5, %xmm6
1586 ; SSSE3-NEXT: pand %xmm5, %xmm3
1587 ; SSSE3-NEXT: packuswb %xmm6, %xmm3
1588 ; SSSE3-NEXT: pxor %xmm1, %xmm1
1589 ; SSSE3-NEXT: pcmpgtb %xmm3, %xmm1
1590 ; SSSE3-NEXT: pcmpeqb %xmm7, %xmm1
1591 ; SSSE3-NEXT: pcmpeqd %xmm6, %xmm6
1592 ; SSSE3-NEXT: pxor %xmm6, %xmm1
1593 ; SSSE3-NEXT: pxor %xmm7, %xmm7
1594 ; 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]
1595 ; SSSE3-NEXT: pxor %xmm8, %xmm8
1596 ; SSSE3-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm0[8],xmm8[9],xmm0[9],xmm8[10],xmm0[10],xmm8[11],xmm0[11],xmm8[12],xmm0[12],xmm8[13],xmm0[13],xmm8[14],xmm0[14],xmm8[15],xmm0[15]
1597 ; SSSE3-NEXT: pmulhw %xmm7, %xmm8
1598 ; SSSE3-NEXT: movdqa %xmm8, %xmm7
1599 ; SSSE3-NEXT: psrlw $8, %xmm7
1600 ; SSSE3-NEXT: pxor %xmm9, %xmm9
1601 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm9 = xmm9[0],xmm2[0],xmm9[1],xmm2[1],xmm9[2],xmm2[2],xmm9[3],xmm2[3],xmm9[4],xmm2[4],xmm9[5],xmm2[5],xmm9[6],xmm2[6],xmm9[7],xmm2[7]
1602 ; SSSE3-NEXT: pxor %xmm2, %xmm2
1603 ; SSSE3-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]
1604 ; SSSE3-NEXT: pmulhw %xmm9, %xmm2
1605 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
1606 ; SSSE3-NEXT: psrlw $8, %xmm0
1607 ; SSSE3-NEXT: packuswb %xmm7, %xmm0
1608 ; SSSE3-NEXT: pand %xmm5, %xmm8
1609 ; SSSE3-NEXT: pand %xmm5, %xmm2
1610 ; SSSE3-NEXT: packuswb %xmm8, %xmm2
1611 ; SSSE3-NEXT: pcmpgtb %xmm2, %xmm4
1612 ; SSSE3-NEXT: pcmpeqb %xmm0, %xmm4
1613 ; SSSE3-NEXT: pxor %xmm6, %xmm4
1614 ; SSSE3-NEXT: movdqa %xmm4, %xmm0
1615 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1616 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
1617 ; SSSE3-NEXT: pslld $31, %xmm0
1618 ; SSSE3-NEXT: psrad $31, %xmm0
1619 ; SSSE3-NEXT: movdqa %xmm4, %xmm5
1620 ; SSSE3-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1621 ; SSSE3-NEXT: movdqa %xmm5, %xmm6
1622 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm6 = xmm6[0,0,1,1,2,2,3,3]
1623 ; SSSE3-NEXT: pslld $31, %xmm6
1624 ; SSSE3-NEXT: psrad $31, %xmm6
1625 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]
1626 ; SSSE3-NEXT: pslld $31, %xmm5
1627 ; SSSE3-NEXT: psrad $31, %xmm5
1628 ; SSSE3-NEXT: movdqa %xmm1, %xmm7
1629 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm7 = xmm7[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1630 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm7 = xmm7[4,4,5,5,6,6,7,7]
1631 ; SSSE3-NEXT: pslld $31, %xmm7
1632 ; SSSE3-NEXT: psrad $31, %xmm7
1633 ; SSSE3-NEXT: movdqa %xmm1, %xmm8
1634 ; SSSE3-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1635 ; SSSE3-NEXT: movdqa %xmm8, %xmm9
1636 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm9 = xmm9[0,0,1,1,2,2,3,3]
1637 ; SSSE3-NEXT: pslld $31, %xmm9
1638 ; SSSE3-NEXT: psrad $31, %xmm9
1639 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm8 = xmm8[4,4,5,5,6,6,7,7]
1640 ; SSSE3-NEXT: pslld $31, %xmm8
1641 ; SSSE3-NEXT: psrad $31, %xmm8
1642 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1643 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3]
1644 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1645 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
1646 ; SSSE3-NEXT: movdqa %xmm3, 16(%rsi)
1647 ; SSSE3-NEXT: movdqa %xmm2, (%rsi)
1648 ; SSSE3-NEXT: movdqa %xmm1, 64(%rdi)
1649 ; SSSE3-NEXT: movdqa %xmm4, (%rdi)
1650 ; SSSE3-NEXT: movdqa %xmm8, 112(%rdi)
1651 ; SSSE3-NEXT: movdqa %xmm9, 96(%rdi)
1652 ; SSSE3-NEXT: movdqa %xmm7, 80(%rdi)
1653 ; SSSE3-NEXT: movdqa %xmm5, 48(%rdi)
1654 ; SSSE3-NEXT: movdqa %xmm6, 32(%rdi)
1655 ; SSSE3-NEXT: movdqa %xmm0, 16(%rdi)
1658 ; SSE41-LABEL: smulo_v32i8:
1660 ; SSE41-NEXT: movq %rdi, %rax
1661 ; SSE41-NEXT: pxor %xmm4, %xmm4
1662 ; SSE41-NEXT: pxor %xmm5, %xmm5
1663 ; 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]
1664 ; SSE41-NEXT: pxor %xmm6, %xmm6
1665 ; 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]
1666 ; SSE41-NEXT: pmulhw %xmm5, %xmm6
1667 ; SSE41-NEXT: movdqa %xmm6, %xmm5
1668 ; SSE41-NEXT: psrlw $8, %xmm5
1669 ; SSE41-NEXT: pxor %xmm7, %xmm7
1670 ; 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]
1671 ; SSE41-NEXT: pxor %xmm3, %xmm3
1672 ; 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]
1673 ; SSE41-NEXT: pmulhw %xmm7, %xmm3
1674 ; SSE41-NEXT: movdqa %xmm3, %xmm7
1675 ; SSE41-NEXT: psrlw $8, %xmm7
1676 ; SSE41-NEXT: packuswb %xmm5, %xmm7
1677 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255]
1678 ; SSE41-NEXT: pand %xmm5, %xmm6
1679 ; SSE41-NEXT: pand %xmm5, %xmm3
1680 ; SSE41-NEXT: packuswb %xmm6, %xmm3
1681 ; SSE41-NEXT: pxor %xmm1, %xmm1
1682 ; SSE41-NEXT: pcmpgtb %xmm3, %xmm1
1683 ; SSE41-NEXT: pcmpeqb %xmm7, %xmm1
1684 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm6
1685 ; SSE41-NEXT: pxor %xmm6, %xmm1
1686 ; SSE41-NEXT: pxor %xmm7, %xmm7
1687 ; 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]
1688 ; SSE41-NEXT: pxor %xmm8, %xmm8
1689 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm0[8],xmm8[9],xmm0[9],xmm8[10],xmm0[10],xmm8[11],xmm0[11],xmm8[12],xmm0[12],xmm8[13],xmm0[13],xmm8[14],xmm0[14],xmm8[15],xmm0[15]
1690 ; SSE41-NEXT: pmulhw %xmm7, %xmm8
1691 ; SSE41-NEXT: movdqa %xmm8, %xmm7
1692 ; SSE41-NEXT: psrlw $8, %xmm7
1693 ; SSE41-NEXT: pxor %xmm9, %xmm9
1694 ; SSE41-NEXT: punpcklbw {{.*#+}} xmm9 = xmm9[0],xmm2[0],xmm9[1],xmm2[1],xmm9[2],xmm2[2],xmm9[3],xmm2[3],xmm9[4],xmm2[4],xmm9[5],xmm2[5],xmm9[6],xmm2[6],xmm9[7],xmm2[7]
1695 ; SSE41-NEXT: pxor %xmm2, %xmm2
1696 ; 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]
1697 ; SSE41-NEXT: pmulhw %xmm9, %xmm2
1698 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1699 ; SSE41-NEXT: psrlw $8, %xmm0
1700 ; SSE41-NEXT: packuswb %xmm7, %xmm0
1701 ; SSE41-NEXT: pand %xmm5, %xmm8
1702 ; SSE41-NEXT: pand %xmm5, %xmm2
1703 ; SSE41-NEXT: packuswb %xmm8, %xmm2
1704 ; SSE41-NEXT: pcmpgtb %xmm2, %xmm4
1705 ; SSE41-NEXT: pcmpeqb %xmm0, %xmm4
1706 ; SSE41-NEXT: pxor %xmm6, %xmm4
1707 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,1,1]
1708 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1709 ; SSE41-NEXT: pslld $31, %xmm0
1710 ; SSE41-NEXT: psrad $31, %xmm0
1711 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[2,3,2,3]
1712 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm5 = xmm5[0],zero,zero,zero,xmm5[1],zero,zero,zero,xmm5[2],zero,zero,zero,xmm5[3],zero,zero,zero
1713 ; SSE41-NEXT: pslld $31, %xmm5
1714 ; SSE41-NEXT: psrad $31, %xmm5
1715 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm4[3,3,3,3]
1716 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm6 = xmm6[0],zero,zero,zero,xmm6[1],zero,zero,zero,xmm6[2],zero,zero,zero,xmm6[3],zero,zero,zero
1717 ; SSE41-NEXT: pslld $31, %xmm6
1718 ; SSE41-NEXT: psrad $31, %xmm6
1719 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm1[1,1,1,1]
1720 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm7 = xmm7[0],zero,zero,zero,xmm7[1],zero,zero,zero,xmm7[2],zero,zero,zero,xmm7[3],zero,zero,zero
1721 ; SSE41-NEXT: pslld $31, %xmm7
1722 ; SSE41-NEXT: psrad $31, %xmm7
1723 ; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm1[2,3,2,3]
1724 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm8 = xmm8[0],zero,zero,zero,xmm8[1],zero,zero,zero,xmm8[2],zero,zero,zero,xmm8[3],zero,zero,zero
1725 ; SSE41-NEXT: pslld $31, %xmm8
1726 ; SSE41-NEXT: psrad $31, %xmm8
1727 ; SSE41-NEXT: pshufd {{.*#+}} xmm9 = xmm1[3,3,3,3]
1728 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm9 = xmm9[0],zero,zero,zero,xmm9[1],zero,zero,zero,xmm9[2],zero,zero,zero,xmm9[3],zero,zero,zero
1729 ; SSE41-NEXT: pslld $31, %xmm9
1730 ; SSE41-NEXT: psrad $31, %xmm9
1731 ; SSE41-NEXT: pmovsxbd %xmm4, %xmm4
1732 ; SSE41-NEXT: pmovsxbd %xmm1, %xmm1
1733 ; SSE41-NEXT: movdqa %xmm3, 16(%rsi)
1734 ; SSE41-NEXT: movdqa %xmm2, (%rsi)
1735 ; SSE41-NEXT: movdqa %xmm1, 64(%rdi)
1736 ; SSE41-NEXT: movdqa %xmm4, (%rdi)
1737 ; SSE41-NEXT: movdqa %xmm9, 112(%rdi)
1738 ; SSE41-NEXT: movdqa %xmm8, 96(%rdi)
1739 ; SSE41-NEXT: movdqa %xmm7, 80(%rdi)
1740 ; SSE41-NEXT: movdqa %xmm6, 48(%rdi)
1741 ; SSE41-NEXT: movdqa %xmm5, 32(%rdi)
1742 ; SSE41-NEXT: movdqa %xmm0, 16(%rdi)
1745 ; AVX1-LABEL: smulo_v32i8:
1747 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
1748 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
1749 ; 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]
1750 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
1751 ; 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]
1752 ; AVX1-NEXT: vpmulhw %xmm4, %xmm6, %xmm4
1753 ; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm6
1754 ; 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]
1755 ; 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]
1756 ; AVX1-NEXT: vpmulhw %xmm3, %xmm5, %xmm3
1757 ; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm5
1758 ; AVX1-NEXT: vpackuswb %xmm6, %xmm5, %xmm5
1759 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [255,255,255,255,255,255,255,255]
1760 ; AVX1-NEXT: vpand %xmm6, %xmm4, %xmm4
1761 ; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
1762 ; AVX1-NEXT: vpackuswb %xmm4, %xmm3, %xmm4
1763 ; AVX1-NEXT: vpcmpgtb %xmm4, %xmm2, %xmm3
1764 ; AVX1-NEXT: vpcmpeqb %xmm5, %xmm3, %xmm3
1765 ; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5
1766 ; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3
1767 ; 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]
1768 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm8 = 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]
1769 ; AVX1-NEXT: vpmulhw %xmm7, %xmm8, %xmm7
1770 ; AVX1-NEXT: vpsrlw $8, %xmm7, %xmm8
1771 ; 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]
1772 ; 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]
1773 ; AVX1-NEXT: vpmulhw %xmm1, %xmm0, %xmm0
1774 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
1775 ; AVX1-NEXT: vpackuswb %xmm8, %xmm1, %xmm1
1776 ; AVX1-NEXT: vpand %xmm6, %xmm7, %xmm7
1777 ; AVX1-NEXT: vpand %xmm6, %xmm0, %xmm0
1778 ; AVX1-NEXT: vpackuswb %xmm7, %xmm0, %xmm6
1779 ; AVX1-NEXT: vpcmpgtb %xmm6, %xmm2, %xmm0
1780 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
1781 ; AVX1-NEXT: vpxor %xmm5, %xmm0, %xmm1
1782 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0
1783 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]
1784 ; AVX1-NEXT: vpmovsxbd %xmm2, %xmm2
1785 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1786 ; AVX1-NEXT: vpmovsxbd %xmm3, %xmm2
1787 ; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm3[1,1,1,1]
1788 ; AVX1-NEXT: vpmovsxbd %xmm5, %xmm5
1789 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm2, %ymm2
1790 ; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm1[2,3,2,3]
1791 ; AVX1-NEXT: vpmovsxbd %xmm5, %xmm5
1792 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,3,3]
1793 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
1794 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm5, %ymm1
1795 ; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm3[2,3,2,3]
1796 ; AVX1-NEXT: vpmovsxbd %xmm5, %xmm5
1797 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[3,3,3,3]
1798 ; AVX1-NEXT: vpmovsxbd %xmm3, %xmm3
1799 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm5, %ymm3
1800 ; AVX1-NEXT: vmovdqa %xmm4, 16(%rdi)
1801 ; AVX1-NEXT: vmovdqa %xmm6, (%rdi)
1804 ; AVX2-LABEL: smulo_v32i8:
1806 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
1807 ; 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]
1808 ; 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]
1809 ; AVX2-NEXT: vpmulhw %ymm3, %ymm4, %ymm3
1810 ; AVX2-NEXT: vpsrlw $8, %ymm3, %ymm4
1811 ; 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]
1812 ; 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]
1813 ; AVX2-NEXT: vpmulhw %ymm1, %ymm0, %ymm0
1814 ; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm1
1815 ; AVX2-NEXT: vpackuswb %ymm4, %ymm1, %ymm1
1816 ; AVX2-NEXT: vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1817 ; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm3
1818 ; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0
1819 ; AVX2-NEXT: vpackuswb %ymm3, %ymm0, %ymm4
1820 ; AVX2-NEXT: vpcmpgtb %ymm4, %ymm2, %ymm0
1821 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0
1822 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1823 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1
1824 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0
1825 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3
1826 ; AVX2-NEXT: vpmovsxbd %xmm3, %ymm2
1827 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
1828 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1
1829 ; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]
1830 ; AVX2-NEXT: vpmovsxbd %xmm3, %ymm3
1831 ; AVX2-NEXT: vmovdqa %ymm4, (%rdi)
1834 ; AVX512F-LABEL: smulo_v32i8:
1836 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2
1837 ; AVX512F-NEXT: vpmovsxbw %xmm2, %ymm2
1838 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3
1839 ; AVX512F-NEXT: vpmovsxbw %xmm3, %ymm3
1840 ; AVX512F-NEXT: vpmullw %ymm2, %ymm3, %ymm2
1841 ; AVX512F-NEXT: vpsraw $8, %ymm2, %ymm3
1842 ; AVX512F-NEXT: vpmovsxwd %ymm3, %zmm3
1843 ; AVX512F-NEXT: vpsllw $8, %ymm2, %ymm4
1844 ; AVX512F-NEXT: vpsraw $15, %ymm4, %ymm4
1845 ; AVX512F-NEXT: vpmovsxwd %ymm4, %zmm4
1846 ; AVX512F-NEXT: vpcmpneqd %zmm3, %zmm4, %k1
1847 ; AVX512F-NEXT: vpmovsxbw %xmm1, %ymm1
1848 ; AVX512F-NEXT: vpmovsxbw %xmm0, %ymm0
1849 ; AVX512F-NEXT: vpmullw %ymm1, %ymm0, %ymm3
1850 ; AVX512F-NEXT: vpsraw $8, %ymm3, %ymm0
1851 ; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0
1852 ; AVX512F-NEXT: vpsllw $8, %ymm3, %ymm1
1853 ; AVX512F-NEXT: vpsraw $15, %ymm1, %ymm1
1854 ; AVX512F-NEXT: vpmovsxwd %ymm1, %zmm1
1855 ; AVX512F-NEXT: vpcmpneqd %zmm0, %zmm1, %k2
1856 ; AVX512F-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k2} {z}
1857 ; AVX512F-NEXT: vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k1} {z}
1858 ; 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
1859 ; AVX512F-NEXT: vpmovdb %zmm2, 16(%rdi)
1860 ; 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
1861 ; AVX512F-NEXT: vpmovdb %zmm2, (%rdi)
1862 ; AVX512F-NEXT: retq
1864 ; AVX512BW-LABEL: smulo_v32i8:
1865 ; AVX512BW: # %bb.0:
1866 ; AVX512BW-NEXT: vpmovsxbw %ymm1, %zmm1
1867 ; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm0
1868 ; AVX512BW-NEXT: vpmullw %zmm1, %zmm0, %zmm2
1869 ; AVX512BW-NEXT: vpsraw $8, %zmm2, %zmm0
1870 ; AVX512BW-NEXT: vpsllw $8, %zmm2, %zmm1
1871 ; AVX512BW-NEXT: vpsraw $15, %zmm1, %zmm1
1872 ; AVX512BW-NEXT: vpcmpneqw %zmm0, %zmm1, %k1
1873 ; AVX512BW-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1874 ; AVX512BW-NEXT: kshiftrd $16, %k1, %k1
1875 ; AVX512BW-NEXT: vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k1} {z}
1876 ; AVX512BW-NEXT: vpmovwb %zmm2, (%rdi)
1877 ; AVX512BW-NEXT: retq
1878 %t = call {<32 x i8>, <32 x i1>} @llvm.smul.with.overflow.v32i8(<32 x i8> %a0, <32 x i8> %a1)
1879 %val = extractvalue {<32 x i8>, <32 x i1>} %t, 0
1880 %obit = extractvalue {<32 x i8>, <32 x i1>} %t, 1
1881 %res = sext <32 x i1> %obit to <32 x i32>
1882 store <32 x i8> %val, ptr %p2
1886 define <64 x i32> @smulo_v64i8(<64 x i8> %a0, <64 x i8> %a1, ptr %p2) nounwind {
1887 ; SSE2-LABEL: smulo_v64i8:
1889 ; SSE2-NEXT: movq %rdi, %rax
1890 ; SSE2-NEXT: pxor %xmm8, %xmm8
1891 ; 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]
1892 ; SSE2-NEXT: pxor %xmm10, %xmm10
1893 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm10 = xmm10[8],xmm3[8],xmm10[9],xmm3[9],xmm10[10],xmm3[10],xmm10[11],xmm3[11],xmm10[12],xmm3[12],xmm10[13],xmm3[13],xmm10[14],xmm3[14],xmm10[15],xmm3[15]
1894 ; SSE2-NEXT: pmulhw %xmm8, %xmm10
1895 ; SSE2-NEXT: movdqa %xmm10, %xmm8
1896 ; SSE2-NEXT: psrlw $8, %xmm8
1897 ; SSE2-NEXT: pxor %xmm9, %xmm9
1898 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm9 = xmm9[0],xmm7[0],xmm9[1],xmm7[1],xmm9[2],xmm7[2],xmm9[3],xmm7[3],xmm9[4],xmm7[4],xmm9[5],xmm7[5],xmm9[6],xmm7[6],xmm9[7],xmm7[7]
1899 ; SSE2-NEXT: pxor %xmm7, %xmm7
1900 ; 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]
1901 ; SSE2-NEXT: pmulhw %xmm9, %xmm7
1902 ; SSE2-NEXT: movdqa %xmm7, %xmm11
1903 ; SSE2-NEXT: psrlw $8, %xmm11
1904 ; SSE2-NEXT: packuswb %xmm8, %xmm11
1905 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [255,255,255,255,255,255,255,255]
1906 ; SSE2-NEXT: pand %xmm9, %xmm10
1907 ; SSE2-NEXT: pand %xmm9, %xmm7
1908 ; SSE2-NEXT: packuswb %xmm10, %xmm7
1909 ; SSE2-NEXT: pxor %xmm3, %xmm3
1910 ; SSE2-NEXT: pcmpgtb %xmm7, %xmm3
1911 ; SSE2-NEXT: pcmpeqb %xmm11, %xmm3
1912 ; SSE2-NEXT: pxor %xmm8, %xmm8
1913 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm6[8],xmm8[9],xmm6[9],xmm8[10],xmm6[10],xmm8[11],xmm6[11],xmm8[12],xmm6[12],xmm8[13],xmm6[13],xmm8[14],xmm6[14],xmm8[15],xmm6[15]
1914 ; SSE2-NEXT: pxor %xmm10, %xmm10
1915 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm10 = xmm10[8],xmm2[8],xmm10[9],xmm2[9],xmm10[10],xmm2[10],xmm10[11],xmm2[11],xmm10[12],xmm2[12],xmm10[13],xmm2[13],xmm10[14],xmm2[14],xmm10[15],xmm2[15]
1916 ; SSE2-NEXT: pmulhw %xmm8, %xmm10
1917 ; SSE2-NEXT: pxor %xmm8, %xmm8
1918 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm8 = xmm8[0],xmm6[0],xmm8[1],xmm6[1],xmm8[2],xmm6[2],xmm8[3],xmm6[3],xmm8[4],xmm6[4],xmm8[5],xmm6[5],xmm8[6],xmm6[6],xmm8[7],xmm6[7]
1919 ; SSE2-NEXT: pxor %xmm6, %xmm6
1920 ; 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]
1921 ; SSE2-NEXT: movdqa %xmm10, %xmm2
1922 ; SSE2-NEXT: psrlw $8, %xmm2
1923 ; SSE2-NEXT: pmulhw %xmm8, %xmm6
1924 ; SSE2-NEXT: movdqa %xmm6, %xmm8
1925 ; SSE2-NEXT: psrlw $8, %xmm8
1926 ; SSE2-NEXT: packuswb %xmm2, %xmm8
1927 ; SSE2-NEXT: pand %xmm9, %xmm10
1928 ; SSE2-NEXT: pand %xmm9, %xmm6
1929 ; SSE2-NEXT: packuswb %xmm10, %xmm6
1930 ; SSE2-NEXT: pxor %xmm2, %xmm2
1931 ; SSE2-NEXT: pcmpgtb %xmm6, %xmm2
1932 ; SSE2-NEXT: pcmpeqb %xmm8, %xmm2
1933 ; SSE2-NEXT: pxor %xmm8, %xmm8
1934 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm5[8],xmm8[9],xmm5[9],xmm8[10],xmm5[10],xmm8[11],xmm5[11],xmm8[12],xmm5[12],xmm8[13],xmm5[13],xmm8[14],xmm5[14],xmm8[15],xmm5[15]
1935 ; SSE2-NEXT: pxor %xmm10, %xmm10
1936 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm10 = xmm10[8],xmm1[8],xmm10[9],xmm1[9],xmm10[10],xmm1[10],xmm10[11],xmm1[11],xmm10[12],xmm1[12],xmm10[13],xmm1[13],xmm10[14],xmm1[14],xmm10[15],xmm1[15]
1937 ; SSE2-NEXT: pmulhw %xmm8, %xmm10
1938 ; SSE2-NEXT: pxor %xmm8, %xmm8
1939 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm8 = xmm8[0],xmm5[0],xmm8[1],xmm5[1],xmm8[2],xmm5[2],xmm8[3],xmm5[3],xmm8[4],xmm5[4],xmm8[5],xmm5[5],xmm8[6],xmm5[6],xmm8[7],xmm5[7]
1940 ; SSE2-NEXT: pxor %xmm5, %xmm5
1941 ; 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]
1942 ; SSE2-NEXT: movdqa %xmm10, %xmm1
1943 ; SSE2-NEXT: psrlw $8, %xmm1
1944 ; SSE2-NEXT: pmulhw %xmm8, %xmm5
1945 ; SSE2-NEXT: movdqa %xmm5, %xmm8
1946 ; SSE2-NEXT: psrlw $8, %xmm8
1947 ; SSE2-NEXT: packuswb %xmm1, %xmm8
1948 ; SSE2-NEXT: pand %xmm9, %xmm10
1949 ; SSE2-NEXT: pand %xmm9, %xmm5
1950 ; SSE2-NEXT: packuswb %xmm10, %xmm5
1951 ; SSE2-NEXT: pxor %xmm1, %xmm1
1952 ; SSE2-NEXT: pcmpgtb %xmm5, %xmm1
1953 ; SSE2-NEXT: pcmpeqb %xmm8, %xmm1
1954 ; SSE2-NEXT: pxor %xmm8, %xmm8
1955 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm4[8],xmm8[9],xmm4[9],xmm8[10],xmm4[10],xmm8[11],xmm4[11],xmm8[12],xmm4[12],xmm8[13],xmm4[13],xmm8[14],xmm4[14],xmm8[15],xmm4[15]
1956 ; SSE2-NEXT: pxor %xmm10, %xmm10
1957 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm10 = xmm10[8],xmm0[8],xmm10[9],xmm0[9],xmm10[10],xmm0[10],xmm10[11],xmm0[11],xmm10[12],xmm0[12],xmm10[13],xmm0[13],xmm10[14],xmm0[14],xmm10[15],xmm0[15]
1958 ; SSE2-NEXT: pmulhw %xmm8, %xmm10
1959 ; SSE2-NEXT: pxor %xmm11, %xmm11
1960 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm11 = xmm11[0],xmm4[0],xmm11[1],xmm4[1],xmm11[2],xmm4[2],xmm11[3],xmm4[3],xmm11[4],xmm4[4],xmm11[5],xmm4[5],xmm11[6],xmm4[6],xmm11[7],xmm4[7]
1961 ; SSE2-NEXT: pxor %xmm8, %xmm8
1962 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm8 = xmm8[0],xmm0[0],xmm8[1],xmm0[1],xmm8[2],xmm0[2],xmm8[3],xmm0[3],xmm8[4],xmm0[4],xmm8[5],xmm0[5],xmm8[6],xmm0[6],xmm8[7],xmm0[7]
1963 ; SSE2-NEXT: movdqa %xmm10, %xmm0
1964 ; SSE2-NEXT: psrlw $8, %xmm0
1965 ; SSE2-NEXT: pmulhw %xmm11, %xmm8
1966 ; SSE2-NEXT: movdqa %xmm8, %xmm11
1967 ; SSE2-NEXT: psrlw $8, %xmm11
1968 ; SSE2-NEXT: packuswb %xmm0, %xmm11
1969 ; SSE2-NEXT: pand %xmm9, %xmm10
1970 ; SSE2-NEXT: pand %xmm9, %xmm8
1971 ; SSE2-NEXT: packuswb %xmm10, %xmm8
1972 ; SSE2-NEXT: pxor %xmm4, %xmm4
1973 ; SSE2-NEXT: pcmpgtb %xmm8, %xmm4
1974 ; SSE2-NEXT: pcmpeqb %xmm11, %xmm4
1975 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
1976 ; SSE2-NEXT: pxor %xmm0, %xmm3
1977 ; SSE2-NEXT: pxor %xmm0, %xmm2
1978 ; SSE2-NEXT: pxor %xmm0, %xmm1
1979 ; SSE2-NEXT: pxor %xmm0, %xmm4
1980 ; SSE2-NEXT: movdqa %xmm4, %xmm0
1981 ; SSE2-NEXT: movdqa %xmm7, 48(%rsi)
1982 ; SSE2-NEXT: movdqa %xmm1, %xmm7
1983 ; SSE2-NEXT: movdqa %xmm6, 32(%rsi)
1984 ; SSE2-NEXT: movdqa %xmm2, %xmm6
1985 ; SSE2-NEXT: movdqa %xmm5, 16(%rsi)
1986 ; SSE2-NEXT: movdqa %xmm3, %xmm5
1987 ; SSE2-NEXT: movdqa %xmm8, (%rsi)
1988 ; SSE2-NEXT: movdqa %xmm3, %xmm8
1989 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1990 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3]
1991 ; SSE2-NEXT: movdqa %xmm3, 192(%rdi)
1992 ; SSE2-NEXT: movdqa %xmm2, %xmm3
1993 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1994 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
1995 ; SSE2-NEXT: movdqa %xmm2, 128(%rdi)
1996 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1997 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1998 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
1999 ; SSE2-NEXT: movdqa %xmm1, 64(%rdi)
2000 ; SSE2-NEXT: movdqa %xmm4, %xmm1
2001 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2002 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2003 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3]
2004 ; SSE2-NEXT: movdqa %xmm4, (%rdi)
2005 ; SSE2-NEXT: movdqa %xmm8, %xmm4
2006 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm8 = xmm8[0,0,1,1,2,2,3,3]
2007 ; SSE2-NEXT: pslld $31, %xmm8
2008 ; SSE2-NEXT: psrad $31, %xmm8
2009 ; SSE2-NEXT: movdqa %xmm8, 224(%rdi)
2010 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7]
2011 ; SSE2-NEXT: pslld $31, %xmm4
2012 ; SSE2-NEXT: psrad $31, %xmm4
2013 ; SSE2-NEXT: movdqa %xmm4, 240(%rdi)
2014 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2015 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm5 = xmm5[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2016 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]
2017 ; SSE2-NEXT: pslld $31, %xmm5
2018 ; SSE2-NEXT: psrad $31, %xmm5
2019 ; SSE2-NEXT: movdqa %xmm5, 208(%rdi)
2020 ; SSE2-NEXT: movdqa %xmm3, %xmm4
2021 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3]
2022 ; SSE2-NEXT: pslld $31, %xmm3
2023 ; SSE2-NEXT: psrad $31, %xmm3
2024 ; SSE2-NEXT: movdqa %xmm3, 160(%rdi)
2025 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7]
2026 ; SSE2-NEXT: pslld $31, %xmm4
2027 ; SSE2-NEXT: psrad $31, %xmm4
2028 ; SSE2-NEXT: movdqa %xmm4, 176(%rdi)
2029 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2030 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm6 = xmm6[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2031 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm6 = xmm6[4,4,5,5,6,6,7,7]
2032 ; SSE2-NEXT: pslld $31, %xmm6
2033 ; SSE2-NEXT: psrad $31, %xmm6
2034 ; SSE2-NEXT: movdqa %xmm6, 144(%rdi)
2035 ; SSE2-NEXT: movdqa %xmm2, %xmm3
2036 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
2037 ; SSE2-NEXT: pslld $31, %xmm2
2038 ; SSE2-NEXT: psrad $31, %xmm2
2039 ; SSE2-NEXT: movdqa %xmm2, 96(%rdi)
2040 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]
2041 ; SSE2-NEXT: pslld $31, %xmm3
2042 ; SSE2-NEXT: psrad $31, %xmm3
2043 ; SSE2-NEXT: movdqa %xmm3, 112(%rdi)
2044 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2045 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm7 = xmm7[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2046 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm7 = xmm7[4,4,5,5,6,6,7,7]
2047 ; SSE2-NEXT: pslld $31, %xmm7
2048 ; SSE2-NEXT: psrad $31, %xmm7
2049 ; SSE2-NEXT: movdqa %xmm7, 80(%rdi)
2050 ; SSE2-NEXT: movdqa %xmm1, %xmm2
2051 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
2052 ; SSE2-NEXT: pslld $31, %xmm1
2053 ; SSE2-NEXT: psrad $31, %xmm1
2054 ; SSE2-NEXT: movdqa %xmm1, 32(%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, 48(%rdi)
2059 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2060 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
2061 ; SSE2-NEXT: pslld $31, %xmm0
2062 ; SSE2-NEXT: psrad $31, %xmm0
2063 ; SSE2-NEXT: movdqa %xmm0, 16(%rdi)
2066 ; SSSE3-LABEL: smulo_v64i8:
2068 ; SSSE3-NEXT: movq %rdi, %rax
2069 ; SSSE3-NEXT: pxor %xmm8, %xmm8
2070 ; 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]
2071 ; SSSE3-NEXT: pxor %xmm10, %xmm10
2072 ; SSSE3-NEXT: punpckhbw {{.*#+}} xmm10 = xmm10[8],xmm3[8],xmm10[9],xmm3[9],xmm10[10],xmm3[10],xmm10[11],xmm3[11],xmm10[12],xmm3[12],xmm10[13],xmm3[13],xmm10[14],xmm3[14],xmm10[15],xmm3[15]
2073 ; SSSE3-NEXT: pmulhw %xmm8, %xmm10
2074 ; SSSE3-NEXT: movdqa %xmm10, %xmm8
2075 ; SSSE3-NEXT: psrlw $8, %xmm8
2076 ; SSSE3-NEXT: pxor %xmm9, %xmm9
2077 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm9 = xmm9[0],xmm7[0],xmm9[1],xmm7[1],xmm9[2],xmm7[2],xmm9[3],xmm7[3],xmm9[4],xmm7[4],xmm9[5],xmm7[5],xmm9[6],xmm7[6],xmm9[7],xmm7[7]
2078 ; SSSE3-NEXT: pxor %xmm7, %xmm7
2079 ; 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]
2080 ; SSSE3-NEXT: pmulhw %xmm9, %xmm7
2081 ; SSSE3-NEXT: movdqa %xmm7, %xmm11
2082 ; SSSE3-NEXT: psrlw $8, %xmm11
2083 ; SSSE3-NEXT: packuswb %xmm8, %xmm11
2084 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [255,255,255,255,255,255,255,255]
2085 ; SSSE3-NEXT: pand %xmm9, %xmm10
2086 ; SSSE3-NEXT: pand %xmm9, %xmm7
2087 ; SSSE3-NEXT: packuswb %xmm10, %xmm7
2088 ; SSSE3-NEXT: pxor %xmm3, %xmm3
2089 ; SSSE3-NEXT: pcmpgtb %xmm7, %xmm3
2090 ; SSSE3-NEXT: pcmpeqb %xmm11, %xmm3
2091 ; SSSE3-NEXT: pxor %xmm8, %xmm8
2092 ; SSSE3-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm6[8],xmm8[9],xmm6[9],xmm8[10],xmm6[10],xmm8[11],xmm6[11],xmm8[12],xmm6[12],xmm8[13],xmm6[13],xmm8[14],xmm6[14],xmm8[15],xmm6[15]
2093 ; SSSE3-NEXT: pxor %xmm10, %xmm10
2094 ; SSSE3-NEXT: punpckhbw {{.*#+}} xmm10 = xmm10[8],xmm2[8],xmm10[9],xmm2[9],xmm10[10],xmm2[10],xmm10[11],xmm2[11],xmm10[12],xmm2[12],xmm10[13],xmm2[13],xmm10[14],xmm2[14],xmm10[15],xmm2[15]
2095 ; SSSE3-NEXT: pmulhw %xmm8, %xmm10
2096 ; SSSE3-NEXT: pxor %xmm8, %xmm8
2097 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm8 = xmm8[0],xmm6[0],xmm8[1],xmm6[1],xmm8[2],xmm6[2],xmm8[3],xmm6[3],xmm8[4],xmm6[4],xmm8[5],xmm6[5],xmm8[6],xmm6[6],xmm8[7],xmm6[7]
2098 ; SSSE3-NEXT: pxor %xmm6, %xmm6
2099 ; 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]
2100 ; SSSE3-NEXT: movdqa %xmm10, %xmm2
2101 ; SSSE3-NEXT: psrlw $8, %xmm2
2102 ; SSSE3-NEXT: pmulhw %xmm8, %xmm6
2103 ; SSSE3-NEXT: movdqa %xmm6, %xmm8
2104 ; SSSE3-NEXT: psrlw $8, %xmm8
2105 ; SSSE3-NEXT: packuswb %xmm2, %xmm8
2106 ; SSSE3-NEXT: pand %xmm9, %xmm10
2107 ; SSSE3-NEXT: pand %xmm9, %xmm6
2108 ; SSSE3-NEXT: packuswb %xmm10, %xmm6
2109 ; SSSE3-NEXT: pxor %xmm2, %xmm2
2110 ; SSSE3-NEXT: pcmpgtb %xmm6, %xmm2
2111 ; SSSE3-NEXT: pcmpeqb %xmm8, %xmm2
2112 ; SSSE3-NEXT: pxor %xmm8, %xmm8
2113 ; SSSE3-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm5[8],xmm8[9],xmm5[9],xmm8[10],xmm5[10],xmm8[11],xmm5[11],xmm8[12],xmm5[12],xmm8[13],xmm5[13],xmm8[14],xmm5[14],xmm8[15],xmm5[15]
2114 ; SSSE3-NEXT: pxor %xmm10, %xmm10
2115 ; SSSE3-NEXT: punpckhbw {{.*#+}} xmm10 = xmm10[8],xmm1[8],xmm10[9],xmm1[9],xmm10[10],xmm1[10],xmm10[11],xmm1[11],xmm10[12],xmm1[12],xmm10[13],xmm1[13],xmm10[14],xmm1[14],xmm10[15],xmm1[15]
2116 ; SSSE3-NEXT: pmulhw %xmm8, %xmm10
2117 ; SSSE3-NEXT: pxor %xmm8, %xmm8
2118 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm8 = xmm8[0],xmm5[0],xmm8[1],xmm5[1],xmm8[2],xmm5[2],xmm8[3],xmm5[3],xmm8[4],xmm5[4],xmm8[5],xmm5[5],xmm8[6],xmm5[6],xmm8[7],xmm5[7]
2119 ; SSSE3-NEXT: pxor %xmm5, %xmm5
2120 ; 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]
2121 ; SSSE3-NEXT: movdqa %xmm10, %xmm1
2122 ; SSSE3-NEXT: psrlw $8, %xmm1
2123 ; SSSE3-NEXT: pmulhw %xmm8, %xmm5
2124 ; SSSE3-NEXT: movdqa %xmm5, %xmm8
2125 ; SSSE3-NEXT: psrlw $8, %xmm8
2126 ; SSSE3-NEXT: packuswb %xmm1, %xmm8
2127 ; SSSE3-NEXT: pand %xmm9, %xmm10
2128 ; SSSE3-NEXT: pand %xmm9, %xmm5
2129 ; SSSE3-NEXT: packuswb %xmm10, %xmm5
2130 ; SSSE3-NEXT: pxor %xmm1, %xmm1
2131 ; SSSE3-NEXT: pcmpgtb %xmm5, %xmm1
2132 ; SSSE3-NEXT: pcmpeqb %xmm8, %xmm1
2133 ; SSSE3-NEXT: pxor %xmm8, %xmm8
2134 ; SSSE3-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm4[8],xmm8[9],xmm4[9],xmm8[10],xmm4[10],xmm8[11],xmm4[11],xmm8[12],xmm4[12],xmm8[13],xmm4[13],xmm8[14],xmm4[14],xmm8[15],xmm4[15]
2135 ; SSSE3-NEXT: pxor %xmm10, %xmm10
2136 ; SSSE3-NEXT: punpckhbw {{.*#+}} xmm10 = xmm10[8],xmm0[8],xmm10[9],xmm0[9],xmm10[10],xmm0[10],xmm10[11],xmm0[11],xmm10[12],xmm0[12],xmm10[13],xmm0[13],xmm10[14],xmm0[14],xmm10[15],xmm0[15]
2137 ; SSSE3-NEXT: pmulhw %xmm8, %xmm10
2138 ; SSSE3-NEXT: pxor %xmm11, %xmm11
2139 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm11 = xmm11[0],xmm4[0],xmm11[1],xmm4[1],xmm11[2],xmm4[2],xmm11[3],xmm4[3],xmm11[4],xmm4[4],xmm11[5],xmm4[5],xmm11[6],xmm4[6],xmm11[7],xmm4[7]
2140 ; SSSE3-NEXT: pxor %xmm8, %xmm8
2141 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm8 = xmm8[0],xmm0[0],xmm8[1],xmm0[1],xmm8[2],xmm0[2],xmm8[3],xmm0[3],xmm8[4],xmm0[4],xmm8[5],xmm0[5],xmm8[6],xmm0[6],xmm8[7],xmm0[7]
2142 ; SSSE3-NEXT: movdqa %xmm10, %xmm0
2143 ; SSSE3-NEXT: psrlw $8, %xmm0
2144 ; SSSE3-NEXT: pmulhw %xmm11, %xmm8
2145 ; SSSE3-NEXT: movdqa %xmm8, %xmm11
2146 ; SSSE3-NEXT: psrlw $8, %xmm11
2147 ; SSSE3-NEXT: packuswb %xmm0, %xmm11
2148 ; SSSE3-NEXT: pand %xmm9, %xmm10
2149 ; SSSE3-NEXT: pand %xmm9, %xmm8
2150 ; SSSE3-NEXT: packuswb %xmm10, %xmm8
2151 ; SSSE3-NEXT: pxor %xmm4, %xmm4
2152 ; SSSE3-NEXT: pcmpgtb %xmm8, %xmm4
2153 ; SSSE3-NEXT: pcmpeqb %xmm11, %xmm4
2154 ; SSSE3-NEXT: pcmpeqd %xmm0, %xmm0
2155 ; SSSE3-NEXT: pxor %xmm0, %xmm3
2156 ; SSSE3-NEXT: pxor %xmm0, %xmm2
2157 ; SSSE3-NEXT: pxor %xmm0, %xmm1
2158 ; SSSE3-NEXT: pxor %xmm0, %xmm4
2159 ; SSSE3-NEXT: movdqa %xmm4, %xmm0
2160 ; SSSE3-NEXT: movdqa %xmm7, 48(%rsi)
2161 ; SSSE3-NEXT: movdqa %xmm1, %xmm7
2162 ; SSSE3-NEXT: movdqa %xmm6, 32(%rsi)
2163 ; SSSE3-NEXT: movdqa %xmm2, %xmm6
2164 ; SSSE3-NEXT: movdqa %xmm5, 16(%rsi)
2165 ; SSSE3-NEXT: movdqa %xmm3, %xmm5
2166 ; SSSE3-NEXT: movdqa %xmm8, (%rsi)
2167 ; SSSE3-NEXT: movdqa %xmm3, %xmm8
2168 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2169 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3]
2170 ; SSSE3-NEXT: movdqa %xmm3, 192(%rdi)
2171 ; SSSE3-NEXT: movdqa %xmm2, %xmm3
2172 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2173 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
2174 ; SSSE3-NEXT: movdqa %xmm2, 128(%rdi)
2175 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
2176 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2177 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
2178 ; SSSE3-NEXT: movdqa %xmm1, 64(%rdi)
2179 ; SSSE3-NEXT: movdqa %xmm4, %xmm1
2180 ; SSSE3-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2181 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2182 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3]
2183 ; SSSE3-NEXT: movdqa %xmm4, (%rdi)
2184 ; SSSE3-NEXT: movdqa %xmm8, %xmm4
2185 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm8 = xmm8[0,0,1,1,2,2,3,3]
2186 ; SSSE3-NEXT: pslld $31, %xmm8
2187 ; SSSE3-NEXT: psrad $31, %xmm8
2188 ; SSSE3-NEXT: movdqa %xmm8, 224(%rdi)
2189 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7]
2190 ; SSSE3-NEXT: pslld $31, %xmm4
2191 ; SSSE3-NEXT: psrad $31, %xmm4
2192 ; SSSE3-NEXT: movdqa %xmm4, 240(%rdi)
2193 ; SSSE3-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2194 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm5 = xmm5[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2195 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]
2196 ; SSSE3-NEXT: pslld $31, %xmm5
2197 ; SSSE3-NEXT: psrad $31, %xmm5
2198 ; SSSE3-NEXT: movdqa %xmm5, 208(%rdi)
2199 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
2200 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3]
2201 ; SSSE3-NEXT: pslld $31, %xmm3
2202 ; SSSE3-NEXT: psrad $31, %xmm3
2203 ; SSSE3-NEXT: movdqa %xmm3, 160(%rdi)
2204 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7]
2205 ; SSSE3-NEXT: pslld $31, %xmm4
2206 ; SSSE3-NEXT: psrad $31, %xmm4
2207 ; SSSE3-NEXT: movdqa %xmm4, 176(%rdi)
2208 ; SSSE3-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2209 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm6 = xmm6[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2210 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm6 = xmm6[4,4,5,5,6,6,7,7]
2211 ; SSSE3-NEXT: pslld $31, %xmm6
2212 ; SSSE3-NEXT: psrad $31, %xmm6
2213 ; SSSE3-NEXT: movdqa %xmm6, 144(%rdi)
2214 ; SSSE3-NEXT: movdqa %xmm2, %xmm3
2215 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
2216 ; SSSE3-NEXT: pslld $31, %xmm2
2217 ; SSSE3-NEXT: psrad $31, %xmm2
2218 ; SSSE3-NEXT: movdqa %xmm2, 96(%rdi)
2219 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]
2220 ; SSSE3-NEXT: pslld $31, %xmm3
2221 ; SSSE3-NEXT: psrad $31, %xmm3
2222 ; SSSE3-NEXT: movdqa %xmm3, 112(%rdi)
2223 ; SSSE3-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2224 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm7 = xmm7[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2225 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm7 = xmm7[4,4,5,5,6,6,7,7]
2226 ; SSSE3-NEXT: pslld $31, %xmm7
2227 ; SSSE3-NEXT: psrad $31, %xmm7
2228 ; SSSE3-NEXT: movdqa %xmm7, 80(%rdi)
2229 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
2230 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
2231 ; SSSE3-NEXT: pslld $31, %xmm1
2232 ; SSSE3-NEXT: psrad $31, %xmm1
2233 ; SSSE3-NEXT: movdqa %xmm1, 32(%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, 48(%rdi)
2238 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2239 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
2240 ; SSSE3-NEXT: pslld $31, %xmm0
2241 ; SSSE3-NEXT: psrad $31, %xmm0
2242 ; SSSE3-NEXT: movdqa %xmm0, 16(%rdi)
2245 ; SSE41-LABEL: smulo_v64i8:
2247 ; SSE41-NEXT: movq %rdi, %rax
2248 ; SSE41-NEXT: pxor %xmm8, %xmm8
2249 ; 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]
2250 ; SSE41-NEXT: pxor %xmm9, %xmm9
2251 ; 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]
2252 ; SSE41-NEXT: pmulhw %xmm8, %xmm9
2253 ; SSE41-NEXT: movdqa %xmm9, %xmm8
2254 ; SSE41-NEXT: psrlw $8, %xmm8
2255 ; SSE41-NEXT: pxor %xmm10, %xmm10
2256 ; 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]
2257 ; SSE41-NEXT: pxor %xmm7, %xmm7
2258 ; 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]
2259 ; SSE41-NEXT: pmulhw %xmm10, %xmm7
2260 ; SSE41-NEXT: movdqa %xmm7, %xmm10
2261 ; SSE41-NEXT: psrlw $8, %xmm10
2262 ; SSE41-NEXT: packuswb %xmm8, %xmm10
2263 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm8 = [255,255,255,255,255,255,255,255]
2264 ; SSE41-NEXT: pand %xmm8, %xmm9
2265 ; SSE41-NEXT: pand %xmm8, %xmm7
2266 ; SSE41-NEXT: packuswb %xmm9, %xmm7
2267 ; SSE41-NEXT: pxor %xmm3, %xmm3
2268 ; SSE41-NEXT: pcmpgtb %xmm7, %xmm3
2269 ; SSE41-NEXT: pcmpeqb %xmm10, %xmm3
2270 ; SSE41-NEXT: pxor %xmm9, %xmm9
2271 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm9 = xmm9[8],xmm6[8],xmm9[9],xmm6[9],xmm9[10],xmm6[10],xmm9[11],xmm6[11],xmm9[12],xmm6[12],xmm9[13],xmm6[13],xmm9[14],xmm6[14],xmm9[15],xmm6[15]
2272 ; SSE41-NEXT: pxor %xmm10, %xmm10
2273 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm10 = xmm10[8],xmm2[8],xmm10[9],xmm2[9],xmm10[10],xmm2[10],xmm10[11],xmm2[11],xmm10[12],xmm2[12],xmm10[13],xmm2[13],xmm10[14],xmm2[14],xmm10[15],xmm2[15]
2274 ; SSE41-NEXT: pmulhw %xmm9, %xmm10
2275 ; SSE41-NEXT: pxor %xmm9, %xmm9
2276 ; SSE41-NEXT: punpcklbw {{.*#+}} xmm9 = xmm9[0],xmm6[0],xmm9[1],xmm6[1],xmm9[2],xmm6[2],xmm9[3],xmm6[3],xmm9[4],xmm6[4],xmm9[5],xmm6[5],xmm9[6],xmm6[6],xmm9[7],xmm6[7]
2277 ; SSE41-NEXT: pxor %xmm6, %xmm6
2278 ; 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]
2279 ; SSE41-NEXT: movdqa %xmm10, %xmm2
2280 ; SSE41-NEXT: psrlw $8, %xmm2
2281 ; SSE41-NEXT: pmulhw %xmm9, %xmm6
2282 ; SSE41-NEXT: movdqa %xmm6, %xmm9
2283 ; SSE41-NEXT: psrlw $8, %xmm9
2284 ; SSE41-NEXT: packuswb %xmm2, %xmm9
2285 ; SSE41-NEXT: pand %xmm8, %xmm10
2286 ; SSE41-NEXT: pand %xmm8, %xmm6
2287 ; SSE41-NEXT: packuswb %xmm10, %xmm6
2288 ; SSE41-NEXT: pxor %xmm2, %xmm2
2289 ; SSE41-NEXT: pcmpgtb %xmm6, %xmm2
2290 ; SSE41-NEXT: pcmpeqb %xmm9, %xmm2
2291 ; SSE41-NEXT: pxor %xmm9, %xmm9
2292 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm9 = xmm9[8],xmm5[8],xmm9[9],xmm5[9],xmm9[10],xmm5[10],xmm9[11],xmm5[11],xmm9[12],xmm5[12],xmm9[13],xmm5[13],xmm9[14],xmm5[14],xmm9[15],xmm5[15]
2293 ; SSE41-NEXT: pxor %xmm10, %xmm10
2294 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm10 = xmm10[8],xmm1[8],xmm10[9],xmm1[9],xmm10[10],xmm1[10],xmm10[11],xmm1[11],xmm10[12],xmm1[12],xmm10[13],xmm1[13],xmm10[14],xmm1[14],xmm10[15],xmm1[15]
2295 ; SSE41-NEXT: pmulhw %xmm9, %xmm10
2296 ; SSE41-NEXT: pxor %xmm9, %xmm9
2297 ; SSE41-NEXT: punpcklbw {{.*#+}} xmm9 = xmm9[0],xmm5[0],xmm9[1],xmm5[1],xmm9[2],xmm5[2],xmm9[3],xmm5[3],xmm9[4],xmm5[4],xmm9[5],xmm5[5],xmm9[6],xmm5[6],xmm9[7],xmm5[7]
2298 ; SSE41-NEXT: pxor %xmm5, %xmm5
2299 ; 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]
2300 ; SSE41-NEXT: movdqa %xmm10, %xmm1
2301 ; SSE41-NEXT: psrlw $8, %xmm1
2302 ; SSE41-NEXT: pmulhw %xmm9, %xmm5
2303 ; SSE41-NEXT: movdqa %xmm5, %xmm9
2304 ; SSE41-NEXT: psrlw $8, %xmm9
2305 ; SSE41-NEXT: packuswb %xmm1, %xmm9
2306 ; SSE41-NEXT: pand %xmm8, %xmm10
2307 ; SSE41-NEXT: pand %xmm8, %xmm5
2308 ; SSE41-NEXT: packuswb %xmm10, %xmm5
2309 ; SSE41-NEXT: pxor %xmm1, %xmm1
2310 ; SSE41-NEXT: pcmpgtb %xmm5, %xmm1
2311 ; SSE41-NEXT: pcmpeqb %xmm9, %xmm1
2312 ; SSE41-NEXT: pxor %xmm9, %xmm9
2313 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm9 = xmm9[8],xmm4[8],xmm9[9],xmm4[9],xmm9[10],xmm4[10],xmm9[11],xmm4[11],xmm9[12],xmm4[12],xmm9[13],xmm4[13],xmm9[14],xmm4[14],xmm9[15],xmm4[15]
2314 ; SSE41-NEXT: pxor %xmm10, %xmm10
2315 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm10 = xmm10[8],xmm0[8],xmm10[9],xmm0[9],xmm10[10],xmm0[10],xmm10[11],xmm0[11],xmm10[12],xmm0[12],xmm10[13],xmm0[13],xmm10[14],xmm0[14],xmm10[15],xmm0[15]
2316 ; SSE41-NEXT: pmulhw %xmm9, %xmm10
2317 ; SSE41-NEXT: pxor %xmm9, %xmm9
2318 ; SSE41-NEXT: punpcklbw {{.*#+}} xmm9 = xmm9[0],xmm4[0],xmm9[1],xmm4[1],xmm9[2],xmm4[2],xmm9[3],xmm4[3],xmm9[4],xmm4[4],xmm9[5],xmm4[5],xmm9[6],xmm4[6],xmm9[7],xmm4[7]
2319 ; SSE41-NEXT: pxor %xmm4, %xmm4
2320 ; 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]
2321 ; SSE41-NEXT: movdqa %xmm10, %xmm0
2322 ; SSE41-NEXT: psrlw $8, %xmm0
2323 ; SSE41-NEXT: pmulhw %xmm9, %xmm4
2324 ; SSE41-NEXT: movdqa %xmm4, %xmm9
2325 ; SSE41-NEXT: psrlw $8, %xmm9
2326 ; SSE41-NEXT: packuswb %xmm0, %xmm9
2327 ; SSE41-NEXT: pand %xmm8, %xmm10
2328 ; SSE41-NEXT: pand %xmm8, %xmm4
2329 ; SSE41-NEXT: packuswb %xmm10, %xmm4
2330 ; SSE41-NEXT: pxor %xmm0, %xmm0
2331 ; SSE41-NEXT: pcmpgtb %xmm4, %xmm0
2332 ; SSE41-NEXT: pcmpeqb %xmm9, %xmm0
2333 ; SSE41-NEXT: pcmpeqd %xmm8, %xmm8
2334 ; SSE41-NEXT: pxor %xmm8, %xmm3
2335 ; SSE41-NEXT: pxor %xmm8, %xmm2
2336 ; SSE41-NEXT: pxor %xmm8, %xmm1
2337 ; SSE41-NEXT: pxor %xmm8, %xmm0
2338 ; SSE41-NEXT: movdqa %xmm7, 48(%rsi)
2339 ; SSE41-NEXT: movdqa %xmm6, 32(%rsi)
2340 ; SSE41-NEXT: movdqa %xmm5, 16(%rsi)
2341 ; SSE41-NEXT: movdqa %xmm4, (%rsi)
2342 ; SSE41-NEXT: pmovsxbd %xmm3, %xmm4
2343 ; SSE41-NEXT: movdqa %xmm4, 192(%rdi)
2344 ; SSE41-NEXT: pmovsxbd %xmm2, %xmm4
2345 ; SSE41-NEXT: movdqa %xmm4, 128(%rdi)
2346 ; SSE41-NEXT: pmovsxbd %xmm1, %xmm4
2347 ; SSE41-NEXT: movdqa %xmm4, 64(%rdi)
2348 ; SSE41-NEXT: pmovsxbd %xmm0, %xmm4
2349 ; SSE41-NEXT: movdqa %xmm4, (%rdi)
2350 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[2,3,2,3]
2351 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero,xmm4[2],zero,zero,zero,xmm4[3],zero,zero,zero
2352 ; SSE41-NEXT: pslld $31, %xmm4
2353 ; SSE41-NEXT: psrad $31, %xmm4
2354 ; SSE41-NEXT: movdqa %xmm4, 224(%rdi)
2355 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[3,3,3,3]
2356 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero,xmm4[2],zero,zero,zero,xmm4[3],zero,zero,zero
2357 ; SSE41-NEXT: pslld $31, %xmm4
2358 ; SSE41-NEXT: psrad $31, %xmm4
2359 ; SSE41-NEXT: movdqa %xmm4, 240(%rdi)
2360 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,1,1]
2361 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
2362 ; SSE41-NEXT: pslld $31, %xmm3
2363 ; SSE41-NEXT: psrad $31, %xmm3
2364 ; SSE41-NEXT: movdqa %xmm3, 208(%rdi)
2365 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[2,3,2,3]
2366 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
2367 ; SSE41-NEXT: pslld $31, %xmm3
2368 ; SSE41-NEXT: psrad $31, %xmm3
2369 ; SSE41-NEXT: movdqa %xmm3, 160(%rdi)
2370 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[3,3,3,3]
2371 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
2372 ; SSE41-NEXT: pslld $31, %xmm3
2373 ; SSE41-NEXT: psrad $31, %xmm3
2374 ; SSE41-NEXT: movdqa %xmm3, 176(%rdi)
2375 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,1,1]
2376 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
2377 ; SSE41-NEXT: pslld $31, %xmm2
2378 ; SSE41-NEXT: psrad $31, %xmm2
2379 ; SSE41-NEXT: movdqa %xmm2, 144(%rdi)
2380 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
2381 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
2382 ; SSE41-NEXT: pslld $31, %xmm2
2383 ; SSE41-NEXT: psrad $31, %xmm2
2384 ; SSE41-NEXT: movdqa %xmm2, 96(%rdi)
2385 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]
2386 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
2387 ; SSE41-NEXT: pslld $31, %xmm2
2388 ; SSE41-NEXT: psrad $31, %xmm2
2389 ; SSE41-NEXT: movdqa %xmm2, 112(%rdi)
2390 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]
2391 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
2392 ; SSE41-NEXT: pslld $31, %xmm1
2393 ; SSE41-NEXT: psrad $31, %xmm1
2394 ; SSE41-NEXT: movdqa %xmm1, 80(%rdi)
2395 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
2396 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
2397 ; SSE41-NEXT: pslld $31, %xmm1
2398 ; SSE41-NEXT: psrad $31, %xmm1
2399 ; SSE41-NEXT: movdqa %xmm1, 32(%rdi)
2400 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[3,3,3,3]
2401 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
2402 ; SSE41-NEXT: pslld $31, %xmm1
2403 ; SSE41-NEXT: psrad $31, %xmm1
2404 ; SSE41-NEXT: movdqa %xmm1, 48(%rdi)
2405 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
2406 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2407 ; SSE41-NEXT: pslld $31, %xmm0
2408 ; SSE41-NEXT: psrad $31, %xmm0
2409 ; SSE41-NEXT: movdqa %xmm0, 16(%rdi)
2412 ; AVX1-LABEL: smulo_v64i8:
2414 ; AVX1-NEXT: movq %rdi, %rax
2415 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
2416 ; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5
2417 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm6 = 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]
2418 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7
2419 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm8 = 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]
2420 ; AVX1-NEXT: vpmulhw %xmm6, %xmm8, %xmm6
2421 ; AVX1-NEXT: vpsrlw $8, %xmm6, %xmm8
2422 ; 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]
2423 ; 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]
2424 ; AVX1-NEXT: vpmulhw %xmm4, %xmm7, %xmm4
2425 ; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm7
2426 ; AVX1-NEXT: vpackuswb %xmm8, %xmm7, %xmm8
2427 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm7 = [255,255,255,255,255,255,255,255]
2428 ; AVX1-NEXT: vpand %xmm7, %xmm6, %xmm6
2429 ; AVX1-NEXT: vpand %xmm7, %xmm4, %xmm4
2430 ; AVX1-NEXT: vpackuswb %xmm6, %xmm4, %xmm4
2431 ; AVX1-NEXT: vpcmpgtb %xmm4, %xmm5, %xmm6
2432 ; AVX1-NEXT: vpcmpeqb %xmm6, %xmm8, %xmm8
2433 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm6 = 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]
2434 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm9 = 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]
2435 ; AVX1-NEXT: vpmulhw %xmm6, %xmm9, %xmm6
2436 ; AVX1-NEXT: vpsrlw $8, %xmm6, %xmm9
2437 ; 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]
2438 ; 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]
2439 ; AVX1-NEXT: vpmulhw %xmm3, %xmm1, %xmm1
2440 ; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm3
2441 ; AVX1-NEXT: vpackuswb %xmm9, %xmm3, %xmm3
2442 ; AVX1-NEXT: vpand %xmm7, %xmm6, %xmm6
2443 ; AVX1-NEXT: vpand %xmm7, %xmm1, %xmm1
2444 ; AVX1-NEXT: vpackuswb %xmm6, %xmm1, %xmm1
2445 ; AVX1-NEXT: vpcmpgtb %xmm1, %xmm5, %xmm6
2446 ; AVX1-NEXT: vpcmpeqb %xmm3, %xmm6, %xmm3
2447 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm6
2448 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm9 = 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]
2449 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm10
2450 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm11 = xmm5[8],xmm10[8],xmm5[9],xmm10[9],xmm5[10],xmm10[10],xmm5[11],xmm10[11],xmm5[12],xmm10[12],xmm5[13],xmm10[13],xmm5[14],xmm10[14],xmm5[15],xmm10[15]
2451 ; AVX1-NEXT: vpmulhw %xmm9, %xmm11, %xmm9
2452 ; AVX1-NEXT: vpsrlw $8, %xmm9, %xmm11
2453 ; 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]
2454 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm10 = xmm5[0],xmm10[0],xmm5[1],xmm10[1],xmm5[2],xmm10[2],xmm5[3],xmm10[3],xmm5[4],xmm10[4],xmm5[5],xmm10[5],xmm5[6],xmm10[6],xmm5[7],xmm10[7]
2455 ; AVX1-NEXT: vpmulhw %xmm6, %xmm10, %xmm6
2456 ; AVX1-NEXT: vpsrlw $8, %xmm6, %xmm10
2457 ; AVX1-NEXT: vpackuswb %xmm11, %xmm10, %xmm10
2458 ; AVX1-NEXT: vpand %xmm7, %xmm9, %xmm9
2459 ; AVX1-NEXT: vpand %xmm7, %xmm6, %xmm6
2460 ; AVX1-NEXT: vpackuswb %xmm9, %xmm6, %xmm6
2461 ; AVX1-NEXT: vpcmpgtb %xmm6, %xmm5, %xmm9
2462 ; AVX1-NEXT: vpcmpeqb %xmm10, %xmm9, %xmm9
2463 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm10 = 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]
2464 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm11 = 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]
2465 ; AVX1-NEXT: vpmulhw %xmm10, %xmm11, %xmm10
2466 ; AVX1-NEXT: vpsrlw $8, %xmm10, %xmm11
2467 ; 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]
2468 ; 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]
2469 ; AVX1-NEXT: vpmulhw %xmm2, %xmm0, %xmm0
2470 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm2
2471 ; AVX1-NEXT: vpackuswb %xmm11, %xmm2, %xmm2
2472 ; AVX1-NEXT: vpand %xmm7, %xmm10, %xmm10
2473 ; AVX1-NEXT: vpand %xmm7, %xmm0, %xmm0
2474 ; AVX1-NEXT: vpackuswb %xmm10, %xmm0, %xmm7
2475 ; AVX1-NEXT: vpcmpgtb %xmm7, %xmm5, %xmm0
2476 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0
2477 ; AVX1-NEXT: vpcmpeqd %xmm10, %xmm10, %xmm10
2478 ; AVX1-NEXT: vpxor %xmm10, %xmm8, %xmm5
2479 ; AVX1-NEXT: vpxor %xmm3, %xmm10, %xmm3
2480 ; AVX1-NEXT: vpxor %xmm10, %xmm9, %xmm2
2481 ; AVX1-NEXT: vpxor %xmm0, %xmm10, %xmm0
2482 ; AVX1-NEXT: vmovdqa %xmm4, 48(%rsi)
2483 ; AVX1-NEXT: vmovdqa %xmm1, 32(%rsi)
2484 ; AVX1-NEXT: vmovdqa %xmm6, 16(%rsi)
2485 ; AVX1-NEXT: vmovdqa %xmm7, (%rsi)
2486 ; AVX1-NEXT: vpmovsxbd %xmm5, %xmm1
2487 ; AVX1-NEXT: vmovdqa %xmm1, 192(%rdi)
2488 ; AVX1-NEXT: vpmovsxbd %xmm3, %xmm1
2489 ; AVX1-NEXT: vmovdqa %xmm1, 128(%rdi)
2490 ; AVX1-NEXT: vpmovsxbd %xmm2, %xmm1
2491 ; AVX1-NEXT: vmovdqa %xmm1, 64(%rdi)
2492 ; AVX1-NEXT: vpmovsxbd %xmm0, %xmm1
2493 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
2494 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm5[2,3,2,3]
2495 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
2496 ; AVX1-NEXT: vmovdqa %xmm1, 224(%rdi)
2497 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm5[3,3,3,3]
2498 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
2499 ; AVX1-NEXT: vmovdqa %xmm1, 240(%rdi)
2500 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm5[1,1,1,1]
2501 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
2502 ; AVX1-NEXT: vmovdqa %xmm1, 208(%rdi)
2503 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]
2504 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
2505 ; AVX1-NEXT: vmovdqa %xmm1, 160(%rdi)
2506 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm3[3,3,3,3]
2507 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
2508 ; AVX1-NEXT: vmovdqa %xmm1, 176(%rdi)
2509 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm3[1,1,1,1]
2510 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
2511 ; AVX1-NEXT: vmovdqa %xmm1, 144(%rdi)
2512 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]
2513 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
2514 ; AVX1-NEXT: vmovdqa %xmm1, 96(%rdi)
2515 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm2[3,3,3,3]
2516 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
2517 ; AVX1-NEXT: vmovdqa %xmm1, 112(%rdi)
2518 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm2[1,1,1,1]
2519 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
2520 ; AVX1-NEXT: vmovdqa %xmm1, 80(%rdi)
2521 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
2522 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
2523 ; AVX1-NEXT: vmovdqa %xmm1, 32(%rdi)
2524 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[3,3,3,3]
2525 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
2526 ; AVX1-NEXT: vmovdqa %xmm1, 48(%rdi)
2527 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
2528 ; AVX1-NEXT: vpmovsxbd %xmm0, %xmm0
2529 ; AVX1-NEXT: vmovdqa %xmm0, 16(%rdi)
2530 ; AVX1-NEXT: vzeroupper
2533 ; AVX2-LABEL: smulo_v64i8:
2535 ; AVX2-NEXT: movq %rdi, %rax
2536 ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4
2537 ; 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]
2538 ; 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]
2539 ; AVX2-NEXT: vpmulhw %ymm5, %ymm6, %ymm5
2540 ; AVX2-NEXT: vpsrlw $8, %ymm5, %ymm6
2541 ; 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]
2542 ; 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]
2543 ; AVX2-NEXT: vpmulhw %ymm3, %ymm1, %ymm1
2544 ; AVX2-NEXT: vpsrlw $8, %ymm1, %ymm3
2545 ; AVX2-NEXT: vpackuswb %ymm6, %ymm3, %ymm3
2546 ; AVX2-NEXT: vpbroadcastw {{.*#+}} ymm6 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2547 ; AVX2-NEXT: vpand %ymm6, %ymm5, %ymm5
2548 ; AVX2-NEXT: vpand %ymm6, %ymm1, %ymm1
2549 ; AVX2-NEXT: vpackuswb %ymm5, %ymm1, %ymm1
2550 ; AVX2-NEXT: vpcmpgtb %ymm1, %ymm4, %ymm5
2551 ; AVX2-NEXT: vpcmpeqb %ymm3, %ymm5, %ymm3
2552 ; AVX2-NEXT: vpcmpeqd %ymm5, %ymm5, %ymm5
2553 ; AVX2-NEXT: vpxor %ymm5, %ymm3, %ymm3
2554 ; 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]
2555 ; 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]
2556 ; AVX2-NEXT: vpmulhw %ymm7, %ymm8, %ymm7
2557 ; AVX2-NEXT: vpsrlw $8, %ymm7, %ymm8
2558 ; 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]
2559 ; 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]
2560 ; AVX2-NEXT: vpmulhw %ymm2, %ymm0, %ymm0
2561 ; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm2
2562 ; AVX2-NEXT: vpackuswb %ymm8, %ymm2, %ymm2
2563 ; AVX2-NEXT: vpand %ymm6, %ymm7, %ymm7
2564 ; AVX2-NEXT: vpand %ymm6, %ymm0, %ymm0
2565 ; AVX2-NEXT: vpackuswb %ymm7, %ymm0, %ymm0
2566 ; AVX2-NEXT: vpcmpgtb %ymm0, %ymm4, %ymm4
2567 ; AVX2-NEXT: vpcmpeqb %ymm2, %ymm4, %ymm2
2568 ; AVX2-NEXT: vpxor %ymm5, %ymm2, %ymm2
2569 ; AVX2-NEXT: vpshufd {{.*#+}} xmm4 = xmm2[2,3,2,3]
2570 ; AVX2-NEXT: vpmovsxbd %xmm4, %ymm4
2571 ; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm5
2572 ; AVX2-NEXT: vpshufd {{.*#+}} xmm6 = xmm5[2,3,2,3]
2573 ; AVX2-NEXT: vpmovsxbd %xmm6, %ymm6
2574 ; AVX2-NEXT: vpshufd {{.*#+}} xmm7 = xmm3[2,3,2,3]
2575 ; AVX2-NEXT: vpmovsxbd %xmm7, %ymm7
2576 ; AVX2-NEXT: vextracti128 $1, %ymm3, %xmm8
2577 ; AVX2-NEXT: vpshufd {{.*#+}} xmm9 = xmm8[2,3,2,3]
2578 ; AVX2-NEXT: vpmovsxbd %xmm9, %ymm9
2579 ; AVX2-NEXT: vpmovsxbd %xmm2, %ymm2
2580 ; AVX2-NEXT: vpmovsxbd %xmm5, %ymm5
2581 ; AVX2-NEXT: vpmovsxbd %xmm3, %ymm3
2582 ; AVX2-NEXT: vpmovsxbd %xmm8, %ymm8
2583 ; AVX2-NEXT: vmovdqa %ymm1, 32(%rsi)
2584 ; AVX2-NEXT: vmovdqa %ymm0, (%rsi)
2585 ; AVX2-NEXT: vmovdqa %ymm8, 192(%rdi)
2586 ; AVX2-NEXT: vmovdqa %ymm3, 128(%rdi)
2587 ; AVX2-NEXT: vmovdqa %ymm5, 64(%rdi)
2588 ; AVX2-NEXT: vmovdqa %ymm2, (%rdi)
2589 ; AVX2-NEXT: vmovdqa %ymm9, 224(%rdi)
2590 ; AVX2-NEXT: vmovdqa %ymm7, 160(%rdi)
2591 ; AVX2-NEXT: vmovdqa %ymm6, 96(%rdi)
2592 ; AVX2-NEXT: vmovdqa %ymm4, 32(%rdi)
2593 ; AVX2-NEXT: vzeroupper
2596 ; AVX512F-LABEL: smulo_v64i8:
2598 ; AVX512F-NEXT: vextracti64x4 $1, %zmm1, %ymm2
2599 ; AVX512F-NEXT: vextracti128 $1, %ymm2, %xmm3
2600 ; AVX512F-NEXT: vpmovsxbw %xmm3, %ymm3
2601 ; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm5
2602 ; AVX512F-NEXT: vextracti128 $1, %ymm5, %xmm4
2603 ; AVX512F-NEXT: vpmovsxbw %xmm4, %ymm4
2604 ; AVX512F-NEXT: vpmullw %ymm3, %ymm4, %ymm4
2605 ; AVX512F-NEXT: vpsraw $8, %ymm4, %ymm3
2606 ; AVX512F-NEXT: vpmovsxwd %ymm3, %zmm3
2607 ; AVX512F-NEXT: vpsllw $8, %ymm4, %ymm6
2608 ; AVX512F-NEXT: vpsraw $15, %ymm6, %ymm6
2609 ; AVX512F-NEXT: vpmovsxwd %ymm6, %zmm6
2610 ; AVX512F-NEXT: vpcmpneqd %zmm3, %zmm6, %k1
2611 ; AVX512F-NEXT: vpmovsxbw %xmm2, %ymm2
2612 ; AVX512F-NEXT: vpmovsxbw %xmm5, %ymm3
2613 ; AVX512F-NEXT: vpmullw %ymm2, %ymm3, %ymm5
2614 ; AVX512F-NEXT: vpsraw $8, %ymm5, %ymm2
2615 ; AVX512F-NEXT: vpmovsxwd %ymm2, %zmm2
2616 ; AVX512F-NEXT: vpsllw $8, %ymm5, %ymm3
2617 ; AVX512F-NEXT: vpsraw $15, %ymm3, %ymm3
2618 ; AVX512F-NEXT: vpmovsxwd %ymm3, %zmm3
2619 ; AVX512F-NEXT: vpcmpneqd %zmm2, %zmm3, %k2
2620 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2
2621 ; AVX512F-NEXT: vpmovsxbw %xmm2, %ymm2
2622 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3
2623 ; AVX512F-NEXT: vpmovsxbw %xmm3, %ymm3
2624 ; AVX512F-NEXT: vpmullw %ymm2, %ymm3, %ymm6
2625 ; AVX512F-NEXT: vpsraw $8, %ymm6, %ymm2
2626 ; AVX512F-NEXT: vpmovsxwd %ymm2, %zmm2
2627 ; AVX512F-NEXT: vpsllw $8, %ymm6, %ymm3
2628 ; AVX512F-NEXT: vpsraw $15, %ymm3, %ymm3
2629 ; AVX512F-NEXT: vpmovsxwd %ymm3, %zmm3
2630 ; AVX512F-NEXT: vpcmpneqd %zmm2, %zmm3, %k3
2631 ; AVX512F-NEXT: vpmovsxbw %xmm1, %ymm1
2632 ; AVX512F-NEXT: vpmovsxbw %xmm0, %ymm0
2633 ; AVX512F-NEXT: vpmullw %ymm1, %ymm0, %ymm7
2634 ; AVX512F-NEXT: vpsraw $8, %ymm7, %ymm0
2635 ; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0
2636 ; AVX512F-NEXT: vpsllw $8, %ymm7, %ymm1
2637 ; AVX512F-NEXT: vpsraw $15, %ymm1, %ymm1
2638 ; AVX512F-NEXT: vpmovsxwd %ymm1, %zmm1
2639 ; AVX512F-NEXT: vpcmpneqd %zmm0, %zmm1, %k4
2640 ; AVX512F-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k4} {z}
2641 ; AVX512F-NEXT: vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k3} {z}
2642 ; AVX512F-NEXT: vpternlogd $255, %zmm2, %zmm2, %zmm2 {%k2} {z}
2643 ; AVX512F-NEXT: vpternlogd $255, %zmm3, %zmm3, %zmm3 {%k1} {z}
2644 ; 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
2645 ; AVX512F-NEXT: vpmovdb %zmm4, 48(%rdi)
2646 ; 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
2647 ; AVX512F-NEXT: vpmovdb %zmm4, 32(%rdi)
2648 ; 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
2649 ; AVX512F-NEXT: vpmovdb %zmm4, 16(%rdi)
2650 ; 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
2651 ; AVX512F-NEXT: vpmovdb %zmm4, (%rdi)
2652 ; AVX512F-NEXT: retq
2654 ; AVX512BW-LABEL: smulo_v64i8:
2655 ; AVX512BW: # %bb.0:
2656 ; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2
2657 ; 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]
2658 ; 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]
2659 ; AVX512BW-NEXT: vpmulhw %zmm3, %zmm4, %zmm3
2660 ; AVX512BW-NEXT: vpsrlw $8, %zmm3, %zmm4
2661 ; 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]
2662 ; 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]
2663 ; AVX512BW-NEXT: vpmulhw %zmm1, %zmm0, %zmm0
2664 ; AVX512BW-NEXT: vpsrlw $8, %zmm0, %zmm1
2665 ; AVX512BW-NEXT: vpackuswb %zmm4, %zmm1, %zmm1
2666 ; AVX512BW-NEXT: vpbroadcastw {{.*#+}} 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]
2667 ; AVX512BW-NEXT: vpandq %zmm2, %zmm3, %zmm3
2668 ; AVX512BW-NEXT: vpandq %zmm2, %zmm0, %zmm0
2669 ; AVX512BW-NEXT: vpackuswb %zmm3, %zmm0, %zmm4
2670 ; AVX512BW-NEXT: vpmovb2m %zmm4, %k0
2671 ; AVX512BW-NEXT: vpmovm2b %k0, %zmm0
2672 ; AVX512BW-NEXT: vpcmpneqb %zmm1, %zmm0, %k1
2673 ; AVX512BW-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2674 ; AVX512BW-NEXT: kshiftrd $16, %k1, %k2
2675 ; AVX512BW-NEXT: vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k2} {z}
2676 ; AVX512BW-NEXT: kshiftrq $32, %k1, %k1
2677 ; AVX512BW-NEXT: vpternlogd $255, %zmm2, %zmm2, %zmm2 {%k1} {z}
2678 ; AVX512BW-NEXT: kshiftrd $16, %k1, %k1
2679 ; AVX512BW-NEXT: vpternlogd $255, %zmm3, %zmm3, %zmm3 {%k1} {z}
2680 ; AVX512BW-NEXT: vmovdqa64 %zmm4, (%rdi)
2681 ; AVX512BW-NEXT: retq
2682 %t = call {<64 x i8>, <64 x i1>} @llvm.smul.with.overflow.v64i8(<64 x i8> %a0, <64 x i8> %a1)
2683 %val = extractvalue {<64 x i8>, <64 x i1>} %t, 0
2684 %obit = extractvalue {<64 x i8>, <64 x i1>} %t, 1
2685 %res = sext <64 x i1> %obit to <64 x i32>
2686 store <64 x i8> %val, ptr %p2
2690 define <8 x i32> @smulo_v8i16(<8 x i16> %a0, <8 x i16> %a1, ptr %p2) nounwind {
2691 ; SSE2-LABEL: smulo_v8i16:
2693 ; SSE2-NEXT: movdqa %xmm0, %xmm2
2694 ; SSE2-NEXT: pmulhw %xmm1, %xmm2
2695 ; SSE2-NEXT: pmullw %xmm1, %xmm0
2696 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
2697 ; SSE2-NEXT: psraw $15, %xmm0
2698 ; SSE2-NEXT: pcmpeqw %xmm2, %xmm0
2699 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
2700 ; SSE2-NEXT: pxor %xmm0, %xmm1
2701 ; SSE2-NEXT: movdqa %xmm1, %xmm0
2702 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2703 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2704 ; SSE2-NEXT: pslld $31, %xmm1
2705 ; SSE2-NEXT: psrad $31, %xmm1
2708 ; SSSE3-LABEL: smulo_v8i16:
2710 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
2711 ; SSSE3-NEXT: pmulhw %xmm1, %xmm2
2712 ; SSSE3-NEXT: pmullw %xmm1, %xmm0
2713 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
2714 ; SSSE3-NEXT: psraw $15, %xmm0
2715 ; SSSE3-NEXT: pcmpeqw %xmm2, %xmm0
2716 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1
2717 ; SSSE3-NEXT: pxor %xmm0, %xmm1
2718 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
2719 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2720 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2721 ; SSSE3-NEXT: pslld $31, %xmm1
2722 ; SSSE3-NEXT: psrad $31, %xmm1
2725 ; SSE41-LABEL: smulo_v8i16:
2727 ; SSE41-NEXT: movdqa %xmm0, %xmm2
2728 ; SSE41-NEXT: pmulhw %xmm1, %xmm2
2729 ; SSE41-NEXT: pmullw %xmm1, %xmm0
2730 ; SSE41-NEXT: movdqa %xmm0, (%rdi)
2731 ; SSE41-NEXT: psraw $15, %xmm0
2732 ; SSE41-NEXT: pcmpeqw %xmm2, %xmm0
2733 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
2734 ; SSE41-NEXT: pxor %xmm0, %xmm1
2735 ; SSE41-NEXT: pmovsxwd %xmm1, %xmm0
2736 ; SSE41-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2737 ; SSE41-NEXT: pslld $31, %xmm1
2738 ; SSE41-NEXT: psrad $31, %xmm1
2741 ; AVX1-LABEL: smulo_v8i16:
2743 ; AVX1-NEXT: vpmulhw %xmm1, %xmm0, %xmm2
2744 ; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm1
2745 ; AVX1-NEXT: vpsraw $15, %xmm1, %xmm0
2746 ; AVX1-NEXT: vpcmpeqw %xmm0, %xmm2, %xmm0
2747 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
2748 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
2749 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm2
2750 ; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
2751 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
2752 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
2755 ; AVX2-LABEL: smulo_v8i16:
2757 ; AVX2-NEXT: vpmulhw %xmm1, %xmm0, %xmm2
2758 ; AVX2-NEXT: vpmullw %xmm1, %xmm0, %xmm1
2759 ; AVX2-NEXT: vpsraw $15, %xmm1, %xmm0
2760 ; AVX2-NEXT: vpcmpeqw %xmm0, %xmm2, %xmm0
2761 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
2762 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
2763 ; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0
2764 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
2767 ; AVX512F-LABEL: smulo_v8i16:
2769 ; AVX512F-NEXT: vpmulhw %xmm1, %xmm0, %xmm2
2770 ; AVX512F-NEXT: vpmullw %xmm1, %xmm0, %xmm1
2771 ; AVX512F-NEXT: vpsraw $15, %xmm1, %xmm0
2772 ; AVX512F-NEXT: vpcmpeqw %xmm0, %xmm2, %xmm0
2773 ; AVX512F-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
2774 ; AVX512F-NEXT: vpmovsxwd %xmm0, %ymm0
2775 ; AVX512F-NEXT: vptestmd %ymm0, %ymm0, %k1
2776 ; AVX512F-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
2777 ; AVX512F-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
2778 ; AVX512F-NEXT: vmovdqa %xmm1, (%rdi)
2779 ; AVX512F-NEXT: retq
2781 ; AVX512BW-LABEL: smulo_v8i16:
2782 ; AVX512BW: # %bb.0:
2783 ; AVX512BW-NEXT: vpmulhw %xmm1, %xmm0, %xmm2
2784 ; AVX512BW-NEXT: vpmullw %xmm1, %xmm0, %xmm1
2785 ; AVX512BW-NEXT: vpsraw $15, %xmm1, %xmm0
2786 ; AVX512BW-NEXT: vpcmpneqw %xmm0, %xmm2, %k1
2787 ; AVX512BW-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
2788 ; AVX512BW-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
2789 ; AVX512BW-NEXT: vmovdqa %xmm1, (%rdi)
2790 ; AVX512BW-NEXT: retq
2791 %t = call {<8 x i16>, <8 x i1>} @llvm.smul.with.overflow.v8i16(<8 x i16> %a0, <8 x i16> %a1)
2792 %val = extractvalue {<8 x i16>, <8 x i1>} %t, 0
2793 %obit = extractvalue {<8 x i16>, <8 x i1>} %t, 1
2794 %res = sext <8 x i1> %obit to <8 x i32>
2795 store <8 x i16> %val, ptr %p2
2799 define <2 x i32> @smulo_v2i64(<2 x i64> %a0, <2 x i64> %a1, ptr %p2) nounwind {
2800 ; SSE2-LABEL: smulo_v2i64:
2802 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
2803 ; SSE2-NEXT: movq %xmm2, %rax
2804 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
2805 ; SSE2-NEXT: movq %xmm2, %rcx
2806 ; SSE2-NEXT: movq %xmm1, %rdx
2807 ; SSE2-NEXT: movq %xmm0, %rsi
2808 ; SSE2-NEXT: xorl %r8d, %r8d
2809 ; SSE2-NEXT: imulq %rdx, %rsi
2810 ; SSE2-NEXT: movq $-1, %rdx
2811 ; SSE2-NEXT: movl $0, %r9d
2812 ; SSE2-NEXT: cmovoq %rdx, %r9
2813 ; SSE2-NEXT: movq %rsi, %xmm1
2814 ; SSE2-NEXT: imulq %rax, %rcx
2815 ; SSE2-NEXT: movq %rcx, %xmm0
2816 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
2817 ; SSE2-NEXT: movq %r9, %xmm0
2818 ; SSE2-NEXT: cmovoq %rdx, %r8
2819 ; SSE2-NEXT: movq %r8, %xmm2
2820 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
2821 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2822 ; SSE2-NEXT: movdqa %xmm1, (%rdi)
2825 ; SSSE3-LABEL: smulo_v2i64:
2827 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
2828 ; SSSE3-NEXT: movq %xmm2, %rax
2829 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
2830 ; SSSE3-NEXT: movq %xmm2, %rcx
2831 ; SSSE3-NEXT: movq %xmm1, %rdx
2832 ; SSSE3-NEXT: movq %xmm0, %rsi
2833 ; SSSE3-NEXT: xorl %r8d, %r8d
2834 ; SSSE3-NEXT: imulq %rdx, %rsi
2835 ; SSSE3-NEXT: movq $-1, %rdx
2836 ; SSSE3-NEXT: movl $0, %r9d
2837 ; SSSE3-NEXT: cmovoq %rdx, %r9
2838 ; SSSE3-NEXT: movq %rsi, %xmm1
2839 ; SSSE3-NEXT: imulq %rax, %rcx
2840 ; SSSE3-NEXT: movq %rcx, %xmm0
2841 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
2842 ; SSSE3-NEXT: movq %r9, %xmm0
2843 ; SSSE3-NEXT: cmovoq %rdx, %r8
2844 ; SSSE3-NEXT: movq %r8, %xmm2
2845 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
2846 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2847 ; SSSE3-NEXT: movdqa %xmm1, (%rdi)
2850 ; SSE41-LABEL: smulo_v2i64:
2852 ; SSE41-NEXT: movq %xmm1, %rax
2853 ; SSE41-NEXT: movq %xmm0, %rcx
2854 ; SSE41-NEXT: pextrq $1, %xmm1, %rdx
2855 ; SSE41-NEXT: pextrq $1, %xmm0, %rsi
2856 ; SSE41-NEXT: xorl %r8d, %r8d
2857 ; SSE41-NEXT: imulq %rdx, %rsi
2858 ; SSE41-NEXT: movq $-1, %rdx
2859 ; SSE41-NEXT: movl $0, %r9d
2860 ; SSE41-NEXT: cmovoq %rdx, %r9
2861 ; SSE41-NEXT: movq %rsi, %xmm0
2862 ; SSE41-NEXT: imulq %rax, %rcx
2863 ; SSE41-NEXT: movq %rcx, %xmm1
2864 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
2865 ; SSE41-NEXT: movq %r9, %xmm0
2866 ; SSE41-NEXT: cmovoq %rdx, %r8
2867 ; SSE41-NEXT: movq %r8, %xmm2
2868 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
2869 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
2870 ; SSE41-NEXT: movdqa %xmm1, (%rdi)
2873 ; AVX-LABEL: smulo_v2i64:
2875 ; AVX-NEXT: vmovq %xmm1, %rax
2876 ; AVX-NEXT: vmovq %xmm0, %rcx
2877 ; AVX-NEXT: vpextrq $1, %xmm1, %rdx
2878 ; AVX-NEXT: vpextrq $1, %xmm0, %rsi
2879 ; AVX-NEXT: xorl %r8d, %r8d
2880 ; AVX-NEXT: imulq %rdx, %rsi
2881 ; AVX-NEXT: movq $-1, %rdx
2882 ; AVX-NEXT: movl $0, %r9d
2883 ; AVX-NEXT: cmovoq %rdx, %r9
2884 ; AVX-NEXT: vmovq %rsi, %xmm0
2885 ; AVX-NEXT: imulq %rax, %rcx
2886 ; AVX-NEXT: vmovq %rcx, %xmm1
2887 ; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
2888 ; AVX-NEXT: vmovq %r9, %xmm0
2889 ; AVX-NEXT: cmovoq %rdx, %r8
2890 ; AVX-NEXT: vmovq %r8, %xmm2
2891 ; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
2892 ; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2893 ; AVX-NEXT: vmovdqa %xmm1, (%rdi)
2896 ; AVX512F-LABEL: smulo_v2i64:
2898 ; AVX512F-NEXT: vmovq %xmm1, %rax
2899 ; AVX512F-NEXT: vmovq %xmm0, %rcx
2900 ; AVX512F-NEXT: vpextrq $1, %xmm1, %rdx
2901 ; AVX512F-NEXT: vpextrq $1, %xmm0, %rsi
2902 ; AVX512F-NEXT: imulq %rdx, %rsi
2903 ; AVX512F-NEXT: seto %dl
2904 ; AVX512F-NEXT: vmovq %rsi, %xmm0
2905 ; AVX512F-NEXT: imulq %rax, %rcx
2906 ; AVX512F-NEXT: vmovq %rcx, %xmm1
2907 ; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
2908 ; AVX512F-NEXT: seto %al
2909 ; AVX512F-NEXT: andl $1, %eax
2910 ; AVX512F-NEXT: kmovw %eax, %k0
2911 ; AVX512F-NEXT: kmovw %edx, %k1
2912 ; AVX512F-NEXT: kshiftlw $15, %k1, %k1
2913 ; AVX512F-NEXT: kshiftrw $14, %k1, %k1
2914 ; AVX512F-NEXT: korw %k1, %k0, %k1
2915 ; AVX512F-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
2916 ; AVX512F-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
2917 ; AVX512F-NEXT: vmovdqa %xmm1, (%rdi)
2918 ; AVX512F-NEXT: retq
2920 ; AVX512BW-LABEL: smulo_v2i64:
2921 ; AVX512BW: # %bb.0:
2922 ; AVX512BW-NEXT: vmovq %xmm1, %rax
2923 ; AVX512BW-NEXT: vmovq %xmm0, %rcx
2924 ; AVX512BW-NEXT: vpextrq $1, %xmm1, %rdx
2925 ; AVX512BW-NEXT: vpextrq $1, %xmm0, %rsi
2926 ; AVX512BW-NEXT: imulq %rdx, %rsi
2927 ; AVX512BW-NEXT: seto %dl
2928 ; AVX512BW-NEXT: vmovq %rsi, %xmm0
2929 ; AVX512BW-NEXT: imulq %rax, %rcx
2930 ; AVX512BW-NEXT: vmovq %rcx, %xmm1
2931 ; AVX512BW-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
2932 ; AVX512BW-NEXT: seto %al
2933 ; AVX512BW-NEXT: andl $1, %eax
2934 ; AVX512BW-NEXT: kmovw %eax, %k0
2935 ; AVX512BW-NEXT: kmovd %edx, %k1
2936 ; AVX512BW-NEXT: kshiftlw $15, %k1, %k1
2937 ; AVX512BW-NEXT: kshiftrw $14, %k1, %k1
2938 ; AVX512BW-NEXT: korw %k1, %k0, %k1
2939 ; AVX512BW-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
2940 ; AVX512BW-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
2941 ; AVX512BW-NEXT: vmovdqa %xmm1, (%rdi)
2942 ; AVX512BW-NEXT: retq
2943 %t = call {<2 x i64>, <2 x i1>} @llvm.smul.with.overflow.v2i64(<2 x i64> %a0, <2 x i64> %a1)
2944 %val = extractvalue {<2 x i64>, <2 x i1>} %t, 0
2945 %obit = extractvalue {<2 x i64>, <2 x i1>} %t, 1
2946 %res = sext <2 x i1> %obit to <2 x i32>
2947 store <2 x i64> %val, ptr %p2
2951 define <4 x i32> @smulo_v4i24(<4 x i24> %a0, <4 x i24> %a1, ptr %p2) nounwind {
2952 ; SSE2-LABEL: smulo_v4i24:
2954 ; SSE2-NEXT: pslld $8, %xmm0
2955 ; SSE2-NEXT: psrad $8, %xmm0
2956 ; SSE2-NEXT: pslld $8, %xmm1
2957 ; SSE2-NEXT: psrad $8, %xmm1
2958 ; SSE2-NEXT: pxor %xmm3, %xmm3
2959 ; SSE2-NEXT: pxor %xmm2, %xmm2
2960 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
2961 ; SSE2-NEXT: pand %xmm0, %xmm2
2962 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm3
2963 ; SSE2-NEXT: pand %xmm1, %xmm3
2964 ; SSE2-NEXT: paddd %xmm2, %xmm3
2965 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
2966 ; SSE2-NEXT: pmuludq %xmm1, %xmm0
2967 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,3,2,3]
2968 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
2969 ; SSE2-NEXT: pmuludq %xmm4, %xmm2
2970 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3]
2971 ; SSE2-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm1[0],xmm5[1],xmm1[1]
2972 ; SSE2-NEXT: psubd %xmm3, %xmm5
2973 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,2,2,3]
2974 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
2975 ; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
2976 ; SSE2-NEXT: movdqa %xmm3, %xmm1
2977 ; SSE2-NEXT: pslld $8, %xmm1
2978 ; SSE2-NEXT: psrad $8, %xmm1
2979 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm1
2980 ; SSE2-NEXT: psrad $31, %xmm3
2981 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm3
2982 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm4
2983 ; SSE2-NEXT: pxor %xmm4, %xmm3
2984 ; SSE2-NEXT: pxor %xmm4, %xmm1
2985 ; SSE2-NEXT: por %xmm3, %xmm1
2986 ; SSE2-NEXT: movd %xmm0, %eax
2987 ; SSE2-NEXT: movw %ax, (%rdi)
2988 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
2989 ; SSE2-NEXT: movd %xmm0, %ecx
2990 ; SSE2-NEXT: movw %cx, 6(%rdi)
2991 ; SSE2-NEXT: movd %xmm2, %edx
2992 ; SSE2-NEXT: movw %dx, 3(%rdi)
2993 ; SSE2-NEXT: shrl $16, %eax
2994 ; SSE2-NEXT: movb %al, 2(%rdi)
2995 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,2,2,2]
2996 ; SSE2-NEXT: movd %xmm0, %eax
2997 ; SSE2-NEXT: movw %ax, 9(%rdi)
2998 ; SSE2-NEXT: shrl $16, %ecx
2999 ; SSE2-NEXT: movb %cl, 8(%rdi)
3000 ; SSE2-NEXT: shrl $16, %edx
3001 ; SSE2-NEXT: movb %dl, 5(%rdi)
3002 ; SSE2-NEXT: shrl $16, %eax
3003 ; SSE2-NEXT: movb %al, 11(%rdi)
3004 ; SSE2-NEXT: movdqa %xmm1, %xmm0
3007 ; SSSE3-LABEL: smulo_v4i24:
3009 ; SSSE3-NEXT: pslld $8, %xmm0
3010 ; SSSE3-NEXT: psrad $8, %xmm0
3011 ; SSSE3-NEXT: pslld $8, %xmm1
3012 ; SSSE3-NEXT: psrad $8, %xmm1
3013 ; SSSE3-NEXT: pxor %xmm3, %xmm3
3014 ; SSSE3-NEXT: pxor %xmm2, %xmm2
3015 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
3016 ; SSSE3-NEXT: pand %xmm0, %xmm2
3017 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm3
3018 ; SSSE3-NEXT: pand %xmm1, %xmm3
3019 ; SSSE3-NEXT: paddd %xmm2, %xmm3
3020 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
3021 ; SSSE3-NEXT: pmuludq %xmm1, %xmm0
3022 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,3,2,3]
3023 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
3024 ; SSSE3-NEXT: pmuludq %xmm4, %xmm2
3025 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3]
3026 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm1[0],xmm5[1],xmm1[1]
3027 ; SSSE3-NEXT: psubd %xmm3, %xmm5
3028 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,2,2,3]
3029 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
3030 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
3031 ; SSSE3-NEXT: movdqa %xmm3, %xmm1
3032 ; SSSE3-NEXT: pslld $8, %xmm1
3033 ; SSSE3-NEXT: psrad $8, %xmm1
3034 ; SSSE3-NEXT: pcmpeqd %xmm3, %xmm1
3035 ; SSSE3-NEXT: psrad $31, %xmm3
3036 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm3
3037 ; SSSE3-NEXT: pcmpeqd %xmm4, %xmm4
3038 ; SSSE3-NEXT: pxor %xmm4, %xmm3
3039 ; SSSE3-NEXT: pxor %xmm4, %xmm1
3040 ; SSSE3-NEXT: por %xmm3, %xmm1
3041 ; SSSE3-NEXT: movd %xmm0, %eax
3042 ; SSSE3-NEXT: movw %ax, (%rdi)
3043 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
3044 ; SSSE3-NEXT: movd %xmm0, %ecx
3045 ; SSSE3-NEXT: movw %cx, 6(%rdi)
3046 ; SSSE3-NEXT: movd %xmm2, %edx
3047 ; SSSE3-NEXT: movw %dx, 3(%rdi)
3048 ; SSSE3-NEXT: shrl $16, %eax
3049 ; SSSE3-NEXT: movb %al, 2(%rdi)
3050 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,2,2,2]
3051 ; SSSE3-NEXT: movd %xmm0, %eax
3052 ; SSSE3-NEXT: movw %ax, 9(%rdi)
3053 ; SSSE3-NEXT: shrl $16, %ecx
3054 ; SSSE3-NEXT: movb %cl, 8(%rdi)
3055 ; SSSE3-NEXT: shrl $16, %edx
3056 ; SSSE3-NEXT: movb %dl, 5(%rdi)
3057 ; SSSE3-NEXT: shrl $16, %eax
3058 ; SSSE3-NEXT: movb %al, 11(%rdi)
3059 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
3062 ; SSE41-LABEL: smulo_v4i24:
3064 ; SSE41-NEXT: pslld $8, %xmm0
3065 ; SSE41-NEXT: psrad $8, %xmm0
3066 ; SSE41-NEXT: pslld $8, %xmm1
3067 ; SSE41-NEXT: psrad $8, %xmm1
3068 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
3069 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
3070 ; SSE41-NEXT: pmuldq %xmm2, %xmm3
3071 ; SSE41-NEXT: movdqa %xmm0, %xmm2
3072 ; SSE41-NEXT: pmuldq %xmm1, %xmm2
3073 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3074 ; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
3075 ; SSE41-NEXT: pmulld %xmm0, %xmm1
3076 ; SSE41-NEXT: movdqa %xmm1, %xmm0
3077 ; SSE41-NEXT: pslld $8, %xmm0
3078 ; SSE41-NEXT: psrad $8, %xmm0
3079 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm0
3080 ; SSE41-NEXT: pextrd $3, %xmm1, %eax
3081 ; SSE41-NEXT: pextrd $2, %xmm1, %ecx
3082 ; SSE41-NEXT: pextrd $1, %xmm1, %edx
3083 ; SSE41-NEXT: movd %xmm1, %esi
3084 ; SSE41-NEXT: psrad $31, %xmm1
3085 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm1
3086 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm2
3087 ; SSE41-NEXT: pxor %xmm2, %xmm1
3088 ; SSE41-NEXT: pxor %xmm2, %xmm0
3089 ; SSE41-NEXT: por %xmm1, %xmm0
3090 ; SSE41-NEXT: movw %ax, 9(%rdi)
3091 ; SSE41-NEXT: movw %cx, 6(%rdi)
3092 ; SSE41-NEXT: movw %dx, 3(%rdi)
3093 ; SSE41-NEXT: movw %si, (%rdi)
3094 ; SSE41-NEXT: shrl $16, %eax
3095 ; SSE41-NEXT: movb %al, 11(%rdi)
3096 ; SSE41-NEXT: shrl $16, %ecx
3097 ; SSE41-NEXT: movb %cl, 8(%rdi)
3098 ; SSE41-NEXT: shrl $16, %edx
3099 ; SSE41-NEXT: movb %dl, 5(%rdi)
3100 ; SSE41-NEXT: shrl $16, %esi
3101 ; SSE41-NEXT: movb %sil, 2(%rdi)
3104 ; AVX1-LABEL: smulo_v4i24:
3106 ; AVX1-NEXT: vpslld $8, %xmm0, %xmm0
3107 ; AVX1-NEXT: vpsrad $8, %xmm0, %xmm0
3108 ; AVX1-NEXT: vpslld $8, %xmm1, %xmm1
3109 ; AVX1-NEXT: vpsrad $8, %xmm1, %xmm1
3110 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
3111 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
3112 ; AVX1-NEXT: vpmuldq %xmm2, %xmm3, %xmm2
3113 ; AVX1-NEXT: vpmuldq %xmm1, %xmm0, %xmm3
3114 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3115 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
3116 ; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm1
3117 ; AVX1-NEXT: vpsrad $31, %xmm1, %xmm0
3118 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm2, %xmm0
3119 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
3120 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
3121 ; AVX1-NEXT: vpslld $8, %xmm1, %xmm3
3122 ; AVX1-NEXT: vpsrad $8, %xmm3, %xmm3
3123 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm3, %xmm3
3124 ; AVX1-NEXT: vpxor %xmm2, %xmm3, %xmm2
3125 ; AVX1-NEXT: vpor %xmm0, %xmm2, %xmm0
3126 ; AVX1-NEXT: vpextrd $3, %xmm1, %eax
3127 ; AVX1-NEXT: movw %ax, 9(%rdi)
3128 ; AVX1-NEXT: vpextrd $2, %xmm1, %ecx
3129 ; AVX1-NEXT: movw %cx, 6(%rdi)
3130 ; AVX1-NEXT: vpextrd $1, %xmm1, %edx
3131 ; AVX1-NEXT: movw %dx, 3(%rdi)
3132 ; AVX1-NEXT: vmovd %xmm1, %esi
3133 ; AVX1-NEXT: movw %si, (%rdi)
3134 ; AVX1-NEXT: shrl $16, %eax
3135 ; AVX1-NEXT: movb %al, 11(%rdi)
3136 ; AVX1-NEXT: shrl $16, %ecx
3137 ; AVX1-NEXT: movb %cl, 8(%rdi)
3138 ; AVX1-NEXT: shrl $16, %edx
3139 ; AVX1-NEXT: movb %dl, 5(%rdi)
3140 ; AVX1-NEXT: shrl $16, %esi
3141 ; AVX1-NEXT: movb %sil, 2(%rdi)
3144 ; AVX2-LABEL: smulo_v4i24:
3146 ; AVX2-NEXT: vpslld $8, %xmm0, %xmm0
3147 ; AVX2-NEXT: vpsrad $8, %xmm0, %xmm0
3148 ; AVX2-NEXT: vpslld $8, %xmm1, %xmm1
3149 ; AVX2-NEXT: vpsrad $8, %xmm1, %xmm1
3150 ; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
3151 ; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
3152 ; AVX2-NEXT: vpmuldq %xmm2, %xmm3, %xmm2
3153 ; AVX2-NEXT: vpmuldq %xmm1, %xmm0, %xmm3
3154 ; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3155 ; AVX2-NEXT: vpblendd {{.*#+}} xmm2 = xmm3[0],xmm2[1],xmm3[2],xmm2[3]
3156 ; AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm1
3157 ; AVX2-NEXT: vpsrad $31, %xmm1, %xmm0
3158 ; AVX2-NEXT: vpcmpeqd %xmm0, %xmm2, %xmm0
3159 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
3160 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
3161 ; AVX2-NEXT: vpslld $8, %xmm1, %xmm3
3162 ; AVX2-NEXT: vpsrad $8, %xmm3, %xmm3
3163 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm3, %xmm3
3164 ; AVX2-NEXT: vpxor %xmm2, %xmm3, %xmm2
3165 ; AVX2-NEXT: vpor %xmm0, %xmm2, %xmm0
3166 ; AVX2-NEXT: vpextrd $3, %xmm1, %eax
3167 ; AVX2-NEXT: movw %ax, 9(%rdi)
3168 ; AVX2-NEXT: vpextrd $2, %xmm1, %ecx
3169 ; AVX2-NEXT: movw %cx, 6(%rdi)
3170 ; AVX2-NEXT: vpextrd $1, %xmm1, %edx
3171 ; AVX2-NEXT: movw %dx, 3(%rdi)
3172 ; AVX2-NEXT: vmovd %xmm1, %esi
3173 ; AVX2-NEXT: movw %si, (%rdi)
3174 ; AVX2-NEXT: shrl $16, %eax
3175 ; AVX2-NEXT: movb %al, 11(%rdi)
3176 ; AVX2-NEXT: shrl $16, %ecx
3177 ; AVX2-NEXT: movb %cl, 8(%rdi)
3178 ; AVX2-NEXT: shrl $16, %edx
3179 ; AVX2-NEXT: movb %dl, 5(%rdi)
3180 ; AVX2-NEXT: shrl $16, %esi
3181 ; AVX2-NEXT: movb %sil, 2(%rdi)
3184 ; AVX512-LABEL: smulo_v4i24:
3186 ; AVX512-NEXT: vpslld $8, %xmm1, %xmm1
3187 ; AVX512-NEXT: vpsrad $8, %xmm1, %xmm1
3188 ; AVX512-NEXT: vpslld $8, %xmm0, %xmm0
3189 ; AVX512-NEXT: vpsrad $8, %xmm0, %xmm0
3190 ; AVX512-NEXT: vpmuldq %xmm1, %xmm0, %xmm2
3191 ; AVX512-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
3192 ; AVX512-NEXT: vpshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
3193 ; AVX512-NEXT: vpmuldq %xmm3, %xmm4, %xmm3
3194 ; AVX512-NEXT: vpmovsxbd {{.*#+}} xmm4 = [1,5,3,7]
3195 ; AVX512-NEXT: vpermi2d %xmm3, %xmm2, %xmm4
3196 ; AVX512-NEXT: vpmulld %xmm1, %xmm0, %xmm1
3197 ; AVX512-NEXT: vpsrad $31, %xmm1, %xmm0
3198 ; AVX512-NEXT: vpcmpneqd %xmm0, %xmm4, %k0
3199 ; AVX512-NEXT: vpslld $8, %xmm1, %xmm0
3200 ; AVX512-NEXT: vpsrad $8, %xmm0, %xmm0
3201 ; AVX512-NEXT: vpcmpneqd %xmm1, %xmm0, %k1
3202 ; AVX512-NEXT: korw %k0, %k1, %k1
3203 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
3204 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
3205 ; AVX512-NEXT: vpextrd $3, %xmm1, %eax
3206 ; AVX512-NEXT: movw %ax, 9(%rdi)
3207 ; AVX512-NEXT: vpextrd $2, %xmm1, %ecx
3208 ; AVX512-NEXT: movw %cx, 6(%rdi)
3209 ; AVX512-NEXT: vpextrd $1, %xmm1, %edx
3210 ; AVX512-NEXT: movw %dx, 3(%rdi)
3211 ; AVX512-NEXT: vmovd %xmm1, %esi
3212 ; AVX512-NEXT: movw %si, (%rdi)
3213 ; AVX512-NEXT: shrl $16, %eax
3214 ; AVX512-NEXT: movb %al, 11(%rdi)
3215 ; AVX512-NEXT: shrl $16, %ecx
3216 ; AVX512-NEXT: movb %cl, 8(%rdi)
3217 ; AVX512-NEXT: shrl $16, %edx
3218 ; AVX512-NEXT: movb %dl, 5(%rdi)
3219 ; AVX512-NEXT: shrl $16, %esi
3220 ; AVX512-NEXT: movb %sil, 2(%rdi)
3222 %t = call {<4 x i24>, <4 x i1>} @llvm.smul.with.overflow.v4i24(<4 x i24> %a0, <4 x i24> %a1)
3223 %val = extractvalue {<4 x i24>, <4 x i1>} %t, 0
3224 %obit = extractvalue {<4 x i24>, <4 x i1>} %t, 1
3225 %res = sext <4 x i1> %obit to <4 x i32>
3226 store <4 x i24> %val, ptr %p2
3230 define <4 x i32> @smulo_v4i1(<4 x i1> %a0, <4 x i1> %a1, ptr %p2) nounwind {
3231 ; SSE2-LABEL: smulo_v4i1:
3233 ; SSE2-NEXT: pand %xmm1, %xmm0
3234 ; SSE2-NEXT: pslld $31, %xmm0
3235 ; SSE2-NEXT: movmskps %xmm0, %eax
3236 ; SSE2-NEXT: psrad $31, %xmm0
3237 ; SSE2-NEXT: movb %al, (%rdi)
3240 ; SSSE3-LABEL: smulo_v4i1:
3242 ; SSSE3-NEXT: pand %xmm1, %xmm0
3243 ; SSSE3-NEXT: pslld $31, %xmm0
3244 ; SSSE3-NEXT: movmskps %xmm0, %eax
3245 ; SSSE3-NEXT: psrad $31, %xmm0
3246 ; SSSE3-NEXT: movb %al, (%rdi)
3249 ; SSE41-LABEL: smulo_v4i1:
3251 ; SSE41-NEXT: pand %xmm1, %xmm0
3252 ; SSE41-NEXT: pslld $31, %xmm0
3253 ; SSE41-NEXT: movmskps %xmm0, %eax
3254 ; SSE41-NEXT: psrad $31, %xmm0
3255 ; SSE41-NEXT: movb %al, (%rdi)
3258 ; AVX-LABEL: smulo_v4i1:
3260 ; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0
3261 ; AVX-NEXT: vpslld $31, %xmm0, %xmm1
3262 ; AVX-NEXT: vpsrad $31, %xmm1, %xmm0
3263 ; AVX-NEXT: vmovmskps %xmm1, %eax
3264 ; AVX-NEXT: movb %al, (%rdi)
3267 ; AVX512F-LABEL: smulo_v4i1:
3269 ; AVX512F-NEXT: vpand %xmm1, %xmm0, %xmm0
3270 ; AVX512F-NEXT: vpslld $31, %xmm0, %xmm0
3271 ; AVX512F-NEXT: vptestmd %xmm0, %xmm0, %k0
3272 ; AVX512F-NEXT: vpsrad $31, %xmm0, %xmm0
3273 ; AVX512F-NEXT: kmovw %k0, %eax
3274 ; AVX512F-NEXT: movb %al, (%rdi)
3275 ; AVX512F-NEXT: retq
3277 ; AVX512BW-LABEL: smulo_v4i1:
3278 ; AVX512BW: # %bb.0:
3279 ; AVX512BW-NEXT: vpand %xmm1, %xmm0, %xmm0
3280 ; AVX512BW-NEXT: vpslld $31, %xmm0, %xmm0
3281 ; AVX512BW-NEXT: vptestmd %xmm0, %xmm0, %k0
3282 ; AVX512BW-NEXT: vpsrad $31, %xmm0, %xmm0
3283 ; AVX512BW-NEXT: kmovd %k0, %eax
3284 ; AVX512BW-NEXT: movb %al, (%rdi)
3285 ; AVX512BW-NEXT: retq
3286 %t = call {<4 x i1>, <4 x i1>} @llvm.smul.with.overflow.v4i1(<4 x i1> %a0, <4 x i1> %a1)
3287 %val = extractvalue {<4 x i1>, <4 x i1>} %t, 0
3288 %obit = extractvalue {<4 x i1>, <4 x i1>} %t, 1
3289 %res = sext <4 x i1> %obit to <4 x i32>
3290 store <4 x i1> %val, ptr %p2
3294 define <2 x i32> @smulo_v2i128(<2 x i128> %a0, <2 x i128> %a1, ptr %p2) nounwind {
3295 ; SSE2-LABEL: smulo_v2i128:
3297 ; SSE2-NEXT: pushq %rbp
3298 ; SSE2-NEXT: pushq %r15
3299 ; SSE2-NEXT: pushq %r14
3300 ; SSE2-NEXT: pushq %r13
3301 ; SSE2-NEXT: pushq %r12
3302 ; SSE2-NEXT: pushq %rbx
3303 ; SSE2-NEXT: movq %r8, %r15
3304 ; SSE2-NEXT: movq %rdx, %r8
3305 ; SSE2-NEXT: movq %rsi, %r11
3306 ; SSE2-NEXT: movq %rdi, %r10
3307 ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %rdi
3308 ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %rbp
3309 ; SSE2-NEXT: movq %rsi, %rdx
3310 ; SSE2-NEXT: sarq $63, %rdx
3311 ; SSE2-NEXT: movq %r9, %rbx
3312 ; SSE2-NEXT: imulq %rdx, %rbx
3313 ; SSE2-NEXT: movq %r15, %rax
3314 ; SSE2-NEXT: mulq %rdx
3315 ; SSE2-NEXT: movq %rdx, %rsi
3316 ; SSE2-NEXT: movq %rax, %r12
3317 ; SSE2-NEXT: addq %rax, %rsi
3318 ; SSE2-NEXT: addq %rbx, %rsi
3319 ; SSE2-NEXT: movq %r9, %rax
3320 ; SSE2-NEXT: sarq $63, %rax
3321 ; SSE2-NEXT: movq %rax, %r13
3322 ; SSE2-NEXT: imulq %r11, %r13
3323 ; SSE2-NEXT: mulq %r10
3324 ; SSE2-NEXT: movq %rax, %r14
3325 ; SSE2-NEXT: movq %rdx, %rbx
3326 ; SSE2-NEXT: addq %r13, %rbx
3327 ; SSE2-NEXT: addq %rax, %rbx
3328 ; SSE2-NEXT: addq %r12, %r14
3329 ; SSE2-NEXT: adcq %rsi, %rbx
3330 ; SSE2-NEXT: movq %r10, %rax
3331 ; SSE2-NEXT: mulq %r15
3332 ; SSE2-NEXT: movq %rdx, %r12
3333 ; SSE2-NEXT: movq %rax, %rsi
3334 ; SSE2-NEXT: movq %r11, %rax
3335 ; SSE2-NEXT: mulq %r15
3336 ; SSE2-NEXT: movq %rdx, %r15
3337 ; SSE2-NEXT: movq %rax, %r13
3338 ; SSE2-NEXT: addq %r12, %r13
3339 ; SSE2-NEXT: adcq $0, %r15
3340 ; SSE2-NEXT: movq %r10, %rax
3341 ; SSE2-NEXT: mulq %r9
3342 ; SSE2-NEXT: movq %rdx, %r12
3343 ; SSE2-NEXT: movq %rax, %r10
3344 ; SSE2-NEXT: addq %r13, %r10
3345 ; SSE2-NEXT: adcq %r15, %r12
3346 ; SSE2-NEXT: setb %al
3347 ; SSE2-NEXT: movzbl %al, %r15d
3348 ; SSE2-NEXT: movq %r11, %rax
3349 ; SSE2-NEXT: mulq %r9
3350 ; SSE2-NEXT: addq %r12, %rax
3351 ; SSE2-NEXT: adcq %r15, %rdx
3352 ; SSE2-NEXT: addq %r14, %rax
3353 ; SSE2-NEXT: adcq %rbx, %rdx
3354 ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %r12
3355 ; SSE2-NEXT: movq %r10, 8(%r12)
3356 ; SSE2-NEXT: sarq $63, %r10
3357 ; SSE2-NEXT: xorq %r10, %rdx
3358 ; SSE2-NEXT: xorq %rax, %r10
3359 ; SSE2-NEXT: xorl %r15d, %r15d
3360 ; SSE2-NEXT: orq %rdx, %r10
3361 ; SSE2-NEXT: setne %r15b
3362 ; SSE2-NEXT: movq %rcx, %rdx
3363 ; SSE2-NEXT: sarq $63, %rdx
3364 ; SSE2-NEXT: movq %rbp, %r10
3365 ; SSE2-NEXT: imulq %rdx, %r10
3366 ; SSE2-NEXT: movq %rdi, %rax
3367 ; SSE2-NEXT: mulq %rdx
3368 ; SSE2-NEXT: movq %rdx, %r9
3369 ; SSE2-NEXT: movq %rax, %rbx
3370 ; SSE2-NEXT: addq %rax, %r9
3371 ; SSE2-NEXT: addq %r10, %r9
3372 ; SSE2-NEXT: movq %rbp, %rax
3373 ; SSE2-NEXT: sarq $63, %rax
3374 ; SSE2-NEXT: movq %rax, %r14
3375 ; SSE2-NEXT: imulq %rcx, %r14
3376 ; SSE2-NEXT: mulq %r8
3377 ; SSE2-NEXT: movq %rax, %r11
3378 ; SSE2-NEXT: movq %rdx, %r10
3379 ; SSE2-NEXT: addq %r14, %r10
3380 ; SSE2-NEXT: addq %rax, %r10
3381 ; SSE2-NEXT: addq %rbx, %r11
3382 ; SSE2-NEXT: adcq %r9, %r10
3383 ; SSE2-NEXT: movq %r8, %rax
3384 ; SSE2-NEXT: mulq %rdi
3385 ; SSE2-NEXT: movq %rdx, %rbx
3386 ; SSE2-NEXT: movq %rax, %r9
3387 ; SSE2-NEXT: movq %rcx, %rax
3388 ; SSE2-NEXT: mulq %rdi
3389 ; SSE2-NEXT: movq %rdx, %rdi
3390 ; SSE2-NEXT: movq %rax, %r14
3391 ; SSE2-NEXT: addq %rbx, %r14
3392 ; SSE2-NEXT: adcq $0, %rdi
3393 ; SSE2-NEXT: movq %r8, %rax
3394 ; SSE2-NEXT: mulq %rbp
3395 ; SSE2-NEXT: movq %rdx, %r8
3396 ; SSE2-NEXT: movq %rax, %rbx
3397 ; SSE2-NEXT: addq %r14, %rbx
3398 ; SSE2-NEXT: adcq %rdi, %r8
3399 ; SSE2-NEXT: setb %al
3400 ; SSE2-NEXT: movzbl %al, %edi
3401 ; SSE2-NEXT: movq %rcx, %rax
3402 ; SSE2-NEXT: mulq %rbp
3403 ; SSE2-NEXT: addq %r8, %rax
3404 ; SSE2-NEXT: adcq %rdi, %rdx
3405 ; SSE2-NEXT: addq %r11, %rax
3406 ; SSE2-NEXT: adcq %r10, %rdx
3407 ; SSE2-NEXT: movq %rbx, 24(%r12)
3408 ; SSE2-NEXT: sarq $63, %rbx
3409 ; SSE2-NEXT: xorq %rbx, %rdx
3410 ; SSE2-NEXT: xorq %rax, %rbx
3411 ; SSE2-NEXT: xorl %eax, %eax
3412 ; SSE2-NEXT: orq %rdx, %rbx
3413 ; SSE2-NEXT: setne %al
3414 ; SSE2-NEXT: negl %eax
3415 ; SSE2-NEXT: movd %eax, %xmm1
3416 ; SSE2-NEXT: negl %r15d
3417 ; SSE2-NEXT: movd %r15d, %xmm0
3418 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3419 ; SSE2-NEXT: movq %r9, 16(%r12)
3420 ; SSE2-NEXT: movq %rsi, (%r12)
3421 ; SSE2-NEXT: popq %rbx
3422 ; SSE2-NEXT: popq %r12
3423 ; SSE2-NEXT: popq %r13
3424 ; SSE2-NEXT: popq %r14
3425 ; SSE2-NEXT: popq %r15
3426 ; SSE2-NEXT: popq %rbp
3429 ; SSSE3-LABEL: smulo_v2i128:
3431 ; SSSE3-NEXT: pushq %rbp
3432 ; SSSE3-NEXT: pushq %r15
3433 ; SSSE3-NEXT: pushq %r14
3434 ; SSSE3-NEXT: pushq %r13
3435 ; SSSE3-NEXT: pushq %r12
3436 ; SSSE3-NEXT: pushq %rbx
3437 ; SSSE3-NEXT: movq %r8, %r15
3438 ; SSSE3-NEXT: movq %rdx, %r8
3439 ; SSSE3-NEXT: movq %rsi, %r11
3440 ; SSSE3-NEXT: movq %rdi, %r10
3441 ; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %rdi
3442 ; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %rbp
3443 ; SSSE3-NEXT: movq %rsi, %rdx
3444 ; SSSE3-NEXT: sarq $63, %rdx
3445 ; SSSE3-NEXT: movq %r9, %rbx
3446 ; SSSE3-NEXT: imulq %rdx, %rbx
3447 ; SSSE3-NEXT: movq %r15, %rax
3448 ; SSSE3-NEXT: mulq %rdx
3449 ; SSSE3-NEXT: movq %rdx, %rsi
3450 ; SSSE3-NEXT: movq %rax, %r12
3451 ; SSSE3-NEXT: addq %rax, %rsi
3452 ; SSSE3-NEXT: addq %rbx, %rsi
3453 ; SSSE3-NEXT: movq %r9, %rax
3454 ; SSSE3-NEXT: sarq $63, %rax
3455 ; SSSE3-NEXT: movq %rax, %r13
3456 ; SSSE3-NEXT: imulq %r11, %r13
3457 ; SSSE3-NEXT: mulq %r10
3458 ; SSSE3-NEXT: movq %rax, %r14
3459 ; SSSE3-NEXT: movq %rdx, %rbx
3460 ; SSSE3-NEXT: addq %r13, %rbx
3461 ; SSSE3-NEXT: addq %rax, %rbx
3462 ; SSSE3-NEXT: addq %r12, %r14
3463 ; SSSE3-NEXT: adcq %rsi, %rbx
3464 ; SSSE3-NEXT: movq %r10, %rax
3465 ; SSSE3-NEXT: mulq %r15
3466 ; SSSE3-NEXT: movq %rdx, %r12
3467 ; SSSE3-NEXT: movq %rax, %rsi
3468 ; SSSE3-NEXT: movq %r11, %rax
3469 ; SSSE3-NEXT: mulq %r15
3470 ; SSSE3-NEXT: movq %rdx, %r15
3471 ; SSSE3-NEXT: movq %rax, %r13
3472 ; SSSE3-NEXT: addq %r12, %r13
3473 ; SSSE3-NEXT: adcq $0, %r15
3474 ; SSSE3-NEXT: movq %r10, %rax
3475 ; SSSE3-NEXT: mulq %r9
3476 ; SSSE3-NEXT: movq %rdx, %r12
3477 ; SSSE3-NEXT: movq %rax, %r10
3478 ; SSSE3-NEXT: addq %r13, %r10
3479 ; SSSE3-NEXT: adcq %r15, %r12
3480 ; SSSE3-NEXT: setb %al
3481 ; SSSE3-NEXT: movzbl %al, %r15d
3482 ; SSSE3-NEXT: movq %r11, %rax
3483 ; SSSE3-NEXT: mulq %r9
3484 ; SSSE3-NEXT: addq %r12, %rax
3485 ; SSSE3-NEXT: adcq %r15, %rdx
3486 ; SSSE3-NEXT: addq %r14, %rax
3487 ; SSSE3-NEXT: adcq %rbx, %rdx
3488 ; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %r12
3489 ; SSSE3-NEXT: movq %r10, 8(%r12)
3490 ; SSSE3-NEXT: sarq $63, %r10
3491 ; SSSE3-NEXT: xorq %r10, %rdx
3492 ; SSSE3-NEXT: xorq %rax, %r10
3493 ; SSSE3-NEXT: xorl %r15d, %r15d
3494 ; SSSE3-NEXT: orq %rdx, %r10
3495 ; SSSE3-NEXT: setne %r15b
3496 ; SSSE3-NEXT: movq %rcx, %rdx
3497 ; SSSE3-NEXT: sarq $63, %rdx
3498 ; SSSE3-NEXT: movq %rbp, %r10
3499 ; SSSE3-NEXT: imulq %rdx, %r10
3500 ; SSSE3-NEXT: movq %rdi, %rax
3501 ; SSSE3-NEXT: mulq %rdx
3502 ; SSSE3-NEXT: movq %rdx, %r9
3503 ; SSSE3-NEXT: movq %rax, %rbx
3504 ; SSSE3-NEXT: addq %rax, %r9
3505 ; SSSE3-NEXT: addq %r10, %r9
3506 ; SSSE3-NEXT: movq %rbp, %rax
3507 ; SSSE3-NEXT: sarq $63, %rax
3508 ; SSSE3-NEXT: movq %rax, %r14
3509 ; SSSE3-NEXT: imulq %rcx, %r14
3510 ; SSSE3-NEXT: mulq %r8
3511 ; SSSE3-NEXT: movq %rax, %r11
3512 ; SSSE3-NEXT: movq %rdx, %r10
3513 ; SSSE3-NEXT: addq %r14, %r10
3514 ; SSSE3-NEXT: addq %rax, %r10
3515 ; SSSE3-NEXT: addq %rbx, %r11
3516 ; SSSE3-NEXT: adcq %r9, %r10
3517 ; SSSE3-NEXT: movq %r8, %rax
3518 ; SSSE3-NEXT: mulq %rdi
3519 ; SSSE3-NEXT: movq %rdx, %rbx
3520 ; SSSE3-NEXT: movq %rax, %r9
3521 ; SSSE3-NEXT: movq %rcx, %rax
3522 ; SSSE3-NEXT: mulq %rdi
3523 ; SSSE3-NEXT: movq %rdx, %rdi
3524 ; SSSE3-NEXT: movq %rax, %r14
3525 ; SSSE3-NEXT: addq %rbx, %r14
3526 ; SSSE3-NEXT: adcq $0, %rdi
3527 ; SSSE3-NEXT: movq %r8, %rax
3528 ; SSSE3-NEXT: mulq %rbp
3529 ; SSSE3-NEXT: movq %rdx, %r8
3530 ; SSSE3-NEXT: movq %rax, %rbx
3531 ; SSSE3-NEXT: addq %r14, %rbx
3532 ; SSSE3-NEXT: adcq %rdi, %r8
3533 ; SSSE3-NEXT: setb %al
3534 ; SSSE3-NEXT: movzbl %al, %edi
3535 ; SSSE3-NEXT: movq %rcx, %rax
3536 ; SSSE3-NEXT: mulq %rbp
3537 ; SSSE3-NEXT: addq %r8, %rax
3538 ; SSSE3-NEXT: adcq %rdi, %rdx
3539 ; SSSE3-NEXT: addq %r11, %rax
3540 ; SSSE3-NEXT: adcq %r10, %rdx
3541 ; SSSE3-NEXT: movq %rbx, 24(%r12)
3542 ; SSSE3-NEXT: sarq $63, %rbx
3543 ; SSSE3-NEXT: xorq %rbx, %rdx
3544 ; SSSE3-NEXT: xorq %rax, %rbx
3545 ; SSSE3-NEXT: xorl %eax, %eax
3546 ; SSSE3-NEXT: orq %rdx, %rbx
3547 ; SSSE3-NEXT: setne %al
3548 ; SSSE3-NEXT: negl %eax
3549 ; SSSE3-NEXT: movd %eax, %xmm1
3550 ; SSSE3-NEXT: negl %r15d
3551 ; SSSE3-NEXT: movd %r15d, %xmm0
3552 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3553 ; SSSE3-NEXT: movq %r9, 16(%r12)
3554 ; SSSE3-NEXT: movq %rsi, (%r12)
3555 ; SSSE3-NEXT: popq %rbx
3556 ; SSSE3-NEXT: popq %r12
3557 ; SSSE3-NEXT: popq %r13
3558 ; SSSE3-NEXT: popq %r14
3559 ; SSSE3-NEXT: popq %r15
3560 ; SSSE3-NEXT: popq %rbp
3563 ; SSE41-LABEL: smulo_v2i128:
3565 ; SSE41-NEXT: pushq %rbp
3566 ; SSE41-NEXT: pushq %r15
3567 ; SSE41-NEXT: pushq %r14
3568 ; SSE41-NEXT: pushq %r13
3569 ; SSE41-NEXT: pushq %r12
3570 ; SSE41-NEXT: pushq %rbx
3571 ; SSE41-NEXT: movq %r8, %r15
3572 ; SSE41-NEXT: movq %rdx, %r8
3573 ; SSE41-NEXT: movq %rsi, %r11
3574 ; SSE41-NEXT: movq %rdi, %r10
3575 ; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %rdi
3576 ; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %rbp
3577 ; SSE41-NEXT: movq %rsi, %rdx
3578 ; SSE41-NEXT: sarq $63, %rdx
3579 ; SSE41-NEXT: movq %r9, %rbx
3580 ; SSE41-NEXT: imulq %rdx, %rbx
3581 ; SSE41-NEXT: movq %r15, %rax
3582 ; SSE41-NEXT: mulq %rdx
3583 ; SSE41-NEXT: movq %rdx, %rsi
3584 ; SSE41-NEXT: movq %rax, %r12
3585 ; SSE41-NEXT: addq %rax, %rsi
3586 ; SSE41-NEXT: addq %rbx, %rsi
3587 ; SSE41-NEXT: movq %r9, %rax
3588 ; SSE41-NEXT: sarq $63, %rax
3589 ; SSE41-NEXT: movq %rax, %r13
3590 ; SSE41-NEXT: imulq %r11, %r13
3591 ; SSE41-NEXT: mulq %r10
3592 ; SSE41-NEXT: movq %rax, %r14
3593 ; SSE41-NEXT: movq %rdx, %rbx
3594 ; SSE41-NEXT: addq %r13, %rbx
3595 ; SSE41-NEXT: addq %rax, %rbx
3596 ; SSE41-NEXT: addq %r12, %r14
3597 ; SSE41-NEXT: adcq %rsi, %rbx
3598 ; SSE41-NEXT: movq %r10, %rax
3599 ; SSE41-NEXT: mulq %r15
3600 ; SSE41-NEXT: movq %rdx, %r12
3601 ; SSE41-NEXT: movq %rax, %rsi
3602 ; SSE41-NEXT: movq %r11, %rax
3603 ; SSE41-NEXT: mulq %r15
3604 ; SSE41-NEXT: movq %rdx, %r15
3605 ; SSE41-NEXT: movq %rax, %r13
3606 ; SSE41-NEXT: addq %r12, %r13
3607 ; SSE41-NEXT: adcq $0, %r15
3608 ; SSE41-NEXT: movq %r10, %rax
3609 ; SSE41-NEXT: mulq %r9
3610 ; SSE41-NEXT: movq %rdx, %r12
3611 ; SSE41-NEXT: movq %rax, %r10
3612 ; SSE41-NEXT: addq %r13, %r10
3613 ; SSE41-NEXT: adcq %r15, %r12
3614 ; SSE41-NEXT: setb %al
3615 ; SSE41-NEXT: movzbl %al, %r15d
3616 ; SSE41-NEXT: movq %r11, %rax
3617 ; SSE41-NEXT: mulq %r9
3618 ; SSE41-NEXT: addq %r12, %rax
3619 ; SSE41-NEXT: adcq %r15, %rdx
3620 ; SSE41-NEXT: addq %r14, %rax
3621 ; SSE41-NEXT: adcq %rbx, %rdx
3622 ; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %r12
3623 ; SSE41-NEXT: movq %r10, 8(%r12)
3624 ; SSE41-NEXT: sarq $63, %r10
3625 ; SSE41-NEXT: xorq %r10, %rdx
3626 ; SSE41-NEXT: xorq %rax, %r10
3627 ; SSE41-NEXT: xorl %r15d, %r15d
3628 ; SSE41-NEXT: orq %rdx, %r10
3629 ; SSE41-NEXT: setne %r15b
3630 ; SSE41-NEXT: movq %rcx, %rdx
3631 ; SSE41-NEXT: sarq $63, %rdx
3632 ; SSE41-NEXT: movq %rbp, %r10
3633 ; SSE41-NEXT: imulq %rdx, %r10
3634 ; SSE41-NEXT: movq %rdi, %rax
3635 ; SSE41-NEXT: mulq %rdx
3636 ; SSE41-NEXT: movq %rdx, %r9
3637 ; SSE41-NEXT: movq %rax, %rbx
3638 ; SSE41-NEXT: addq %rax, %r9
3639 ; SSE41-NEXT: addq %r10, %r9
3640 ; SSE41-NEXT: movq %rbp, %rax
3641 ; SSE41-NEXT: sarq $63, %rax
3642 ; SSE41-NEXT: movq %rax, %r14
3643 ; SSE41-NEXT: imulq %rcx, %r14
3644 ; SSE41-NEXT: mulq %r8
3645 ; SSE41-NEXT: movq %rax, %r11
3646 ; SSE41-NEXT: movq %rdx, %r10
3647 ; SSE41-NEXT: addq %r14, %r10
3648 ; SSE41-NEXT: addq %rax, %r10
3649 ; SSE41-NEXT: addq %rbx, %r11
3650 ; SSE41-NEXT: adcq %r9, %r10
3651 ; SSE41-NEXT: movq %r8, %rax
3652 ; SSE41-NEXT: mulq %rdi
3653 ; SSE41-NEXT: movq %rdx, %rbx
3654 ; SSE41-NEXT: movq %rax, %r9
3655 ; SSE41-NEXT: movq %rcx, %rax
3656 ; SSE41-NEXT: mulq %rdi
3657 ; SSE41-NEXT: movq %rdx, %rdi
3658 ; SSE41-NEXT: movq %rax, %r14
3659 ; SSE41-NEXT: addq %rbx, %r14
3660 ; SSE41-NEXT: adcq $0, %rdi
3661 ; SSE41-NEXT: movq %r8, %rax
3662 ; SSE41-NEXT: mulq %rbp
3663 ; SSE41-NEXT: movq %rdx, %r8
3664 ; SSE41-NEXT: movq %rax, %rbx
3665 ; SSE41-NEXT: addq %r14, %rbx
3666 ; SSE41-NEXT: adcq %rdi, %r8
3667 ; SSE41-NEXT: setb %al
3668 ; SSE41-NEXT: movzbl %al, %edi
3669 ; SSE41-NEXT: movq %rcx, %rax
3670 ; SSE41-NEXT: mulq %rbp
3671 ; SSE41-NEXT: addq %r8, %rax
3672 ; SSE41-NEXT: adcq %rdi, %rdx
3673 ; SSE41-NEXT: addq %r11, %rax
3674 ; SSE41-NEXT: adcq %r10, %rdx
3675 ; SSE41-NEXT: movq %rbx, 24(%r12)
3676 ; SSE41-NEXT: sarq $63, %rbx
3677 ; SSE41-NEXT: xorq %rbx, %rdx
3678 ; SSE41-NEXT: xorq %rax, %rbx
3679 ; SSE41-NEXT: xorl %eax, %eax
3680 ; SSE41-NEXT: orq %rdx, %rbx
3681 ; SSE41-NEXT: setne %al
3682 ; SSE41-NEXT: negl %eax
3683 ; SSE41-NEXT: negl %r15d
3684 ; SSE41-NEXT: movd %r15d, %xmm0
3685 ; SSE41-NEXT: pinsrd $1, %eax, %xmm0
3686 ; SSE41-NEXT: movq %r9, 16(%r12)
3687 ; SSE41-NEXT: movq %rsi, (%r12)
3688 ; SSE41-NEXT: popq %rbx
3689 ; SSE41-NEXT: popq %r12
3690 ; SSE41-NEXT: popq %r13
3691 ; SSE41-NEXT: popq %r14
3692 ; SSE41-NEXT: popq %r15
3693 ; SSE41-NEXT: popq %rbp
3696 ; AVX-LABEL: smulo_v2i128:
3698 ; AVX-NEXT: pushq %rbp
3699 ; AVX-NEXT: pushq %r15
3700 ; AVX-NEXT: pushq %r14
3701 ; AVX-NEXT: pushq %r13
3702 ; AVX-NEXT: pushq %r12
3703 ; AVX-NEXT: pushq %rbx
3704 ; AVX-NEXT: movq %r8, %r15
3705 ; AVX-NEXT: movq %rdx, %r8
3706 ; AVX-NEXT: movq %rsi, %r11
3707 ; AVX-NEXT: movq %rdi, %r10
3708 ; AVX-NEXT: movq {{[0-9]+}}(%rsp), %rdi
3709 ; AVX-NEXT: movq {{[0-9]+}}(%rsp), %rbp
3710 ; AVX-NEXT: movq %rsi, %rdx
3711 ; AVX-NEXT: sarq $63, %rdx
3712 ; AVX-NEXT: movq %r9, %rbx
3713 ; AVX-NEXT: imulq %rdx, %rbx
3714 ; AVX-NEXT: movq %r15, %rax
3715 ; AVX-NEXT: mulq %rdx
3716 ; AVX-NEXT: movq %rdx, %rsi
3717 ; AVX-NEXT: movq %rax, %r12
3718 ; AVX-NEXT: addq %rax, %rsi
3719 ; AVX-NEXT: addq %rbx, %rsi
3720 ; AVX-NEXT: movq %r9, %rax
3721 ; AVX-NEXT: sarq $63, %rax
3722 ; AVX-NEXT: movq %rax, %r13
3723 ; AVX-NEXT: imulq %r11, %r13
3724 ; AVX-NEXT: mulq %r10
3725 ; AVX-NEXT: movq %rax, %r14
3726 ; AVX-NEXT: movq %rdx, %rbx
3727 ; AVX-NEXT: addq %r13, %rbx
3728 ; AVX-NEXT: addq %rax, %rbx
3729 ; AVX-NEXT: addq %r12, %r14
3730 ; AVX-NEXT: adcq %rsi, %rbx
3731 ; AVX-NEXT: movq %r10, %rax
3732 ; AVX-NEXT: mulq %r15
3733 ; AVX-NEXT: movq %rdx, %r12
3734 ; AVX-NEXT: movq %rax, %rsi
3735 ; AVX-NEXT: movq %r11, %rax
3736 ; AVX-NEXT: mulq %r15
3737 ; AVX-NEXT: movq %rdx, %r15
3738 ; AVX-NEXT: movq %rax, %r13
3739 ; AVX-NEXT: addq %r12, %r13
3740 ; AVX-NEXT: adcq $0, %r15
3741 ; AVX-NEXT: movq %r10, %rax
3742 ; AVX-NEXT: mulq %r9
3743 ; AVX-NEXT: movq %rdx, %r12
3744 ; AVX-NEXT: movq %rax, %r10
3745 ; AVX-NEXT: addq %r13, %r10
3746 ; AVX-NEXT: adcq %r15, %r12
3747 ; AVX-NEXT: setb %al
3748 ; AVX-NEXT: movzbl %al, %r15d
3749 ; AVX-NEXT: movq %r11, %rax
3750 ; AVX-NEXT: mulq %r9
3751 ; AVX-NEXT: addq %r12, %rax
3752 ; AVX-NEXT: adcq %r15, %rdx
3753 ; AVX-NEXT: addq %r14, %rax
3754 ; AVX-NEXT: adcq %rbx, %rdx
3755 ; AVX-NEXT: movq {{[0-9]+}}(%rsp), %r12
3756 ; AVX-NEXT: movq %r10, 8(%r12)
3757 ; AVX-NEXT: sarq $63, %r10
3758 ; AVX-NEXT: xorq %r10, %rdx
3759 ; AVX-NEXT: xorq %rax, %r10
3760 ; AVX-NEXT: xorl %r15d, %r15d
3761 ; AVX-NEXT: orq %rdx, %r10
3762 ; AVX-NEXT: setne %r15b
3763 ; AVX-NEXT: movq %rcx, %rdx
3764 ; AVX-NEXT: sarq $63, %rdx
3765 ; AVX-NEXT: movq %rbp, %r10
3766 ; AVX-NEXT: imulq %rdx, %r10
3767 ; AVX-NEXT: movq %rdi, %rax
3768 ; AVX-NEXT: mulq %rdx
3769 ; AVX-NEXT: movq %rdx, %r9
3770 ; AVX-NEXT: movq %rax, %rbx
3771 ; AVX-NEXT: addq %rax, %r9
3772 ; AVX-NEXT: addq %r10, %r9
3773 ; AVX-NEXT: movq %rbp, %rax
3774 ; AVX-NEXT: sarq $63, %rax
3775 ; AVX-NEXT: movq %rax, %r14
3776 ; AVX-NEXT: imulq %rcx, %r14
3777 ; AVX-NEXT: mulq %r8
3778 ; AVX-NEXT: movq %rax, %r11
3779 ; AVX-NEXT: movq %rdx, %r10
3780 ; AVX-NEXT: addq %r14, %r10
3781 ; AVX-NEXT: addq %rax, %r10
3782 ; AVX-NEXT: addq %rbx, %r11
3783 ; AVX-NEXT: adcq %r9, %r10
3784 ; AVX-NEXT: movq %r8, %rax
3785 ; AVX-NEXT: mulq %rdi
3786 ; AVX-NEXT: movq %rdx, %rbx
3787 ; AVX-NEXT: movq %rax, %r9
3788 ; AVX-NEXT: movq %rcx, %rax
3789 ; AVX-NEXT: mulq %rdi
3790 ; AVX-NEXT: movq %rdx, %rdi
3791 ; AVX-NEXT: movq %rax, %r14
3792 ; AVX-NEXT: addq %rbx, %r14
3793 ; AVX-NEXT: adcq $0, %rdi
3794 ; AVX-NEXT: movq %r8, %rax
3795 ; AVX-NEXT: mulq %rbp
3796 ; AVX-NEXT: movq %rdx, %r8
3797 ; AVX-NEXT: movq %rax, %rbx
3798 ; AVX-NEXT: addq %r14, %rbx
3799 ; AVX-NEXT: adcq %rdi, %r8
3800 ; AVX-NEXT: setb %al
3801 ; AVX-NEXT: movzbl %al, %edi
3802 ; AVX-NEXT: movq %rcx, %rax
3803 ; AVX-NEXT: mulq %rbp
3804 ; AVX-NEXT: addq %r8, %rax
3805 ; AVX-NEXT: adcq %rdi, %rdx
3806 ; AVX-NEXT: addq %r11, %rax
3807 ; AVX-NEXT: adcq %r10, %rdx
3808 ; AVX-NEXT: movq %rbx, 24(%r12)
3809 ; AVX-NEXT: sarq $63, %rbx
3810 ; AVX-NEXT: xorq %rbx, %rdx
3811 ; AVX-NEXT: xorq %rax, %rbx
3812 ; AVX-NEXT: xorl %eax, %eax
3813 ; AVX-NEXT: orq %rdx, %rbx
3814 ; AVX-NEXT: setne %al
3815 ; AVX-NEXT: negl %eax
3816 ; AVX-NEXT: negl %r15d
3817 ; AVX-NEXT: vmovd %r15d, %xmm0
3818 ; AVX-NEXT: vpinsrd $1, %eax, %xmm0, %xmm0
3819 ; AVX-NEXT: movq %r9, 16(%r12)
3820 ; AVX-NEXT: movq %rsi, (%r12)
3821 ; AVX-NEXT: popq %rbx
3822 ; AVX-NEXT: popq %r12
3823 ; AVX-NEXT: popq %r13
3824 ; AVX-NEXT: popq %r14
3825 ; AVX-NEXT: popq %r15
3826 ; AVX-NEXT: popq %rbp
3829 ; AVX512F-LABEL: smulo_v2i128:
3831 ; AVX512F-NEXT: pushq %rbp
3832 ; AVX512F-NEXT: pushq %r15
3833 ; AVX512F-NEXT: pushq %r14
3834 ; AVX512F-NEXT: pushq %r13
3835 ; AVX512F-NEXT: pushq %r12
3836 ; AVX512F-NEXT: pushq %rbx
3837 ; AVX512F-NEXT: movq %r9, %rbp
3838 ; AVX512F-NEXT: movq %rcx, %r11
3839 ; AVX512F-NEXT: movq %rdx, %r10
3840 ; AVX512F-NEXT: movq %rsi, %r9
3841 ; AVX512F-NEXT: movq {{[0-9]+}}(%rsp), %r15
3842 ; AVX512F-NEXT: movq {{[0-9]+}}(%rsp), %rsi
3843 ; AVX512F-NEXT: sarq $63, %rcx
3844 ; AVX512F-NEXT: movq %rsi, %rbx
3845 ; AVX512F-NEXT: imulq %rcx, %rbx
3846 ; AVX512F-NEXT: movq %r15, %rax
3847 ; AVX512F-NEXT: mulq %rcx
3848 ; AVX512F-NEXT: movq %rdx, %rcx
3849 ; AVX512F-NEXT: movq %rax, %r12
3850 ; AVX512F-NEXT: addq %rax, %rcx
3851 ; AVX512F-NEXT: addq %rbx, %rcx
3852 ; AVX512F-NEXT: movq %rsi, %rax
3853 ; AVX512F-NEXT: sarq $63, %rax
3854 ; AVX512F-NEXT: movq %rax, %r13
3855 ; AVX512F-NEXT: imulq %r11, %r13
3856 ; AVX512F-NEXT: mulq %r10
3857 ; AVX512F-NEXT: movq %rax, %r14
3858 ; AVX512F-NEXT: movq %rdx, %rbx
3859 ; AVX512F-NEXT: addq %r13, %rbx
3860 ; AVX512F-NEXT: addq %rax, %rbx
3861 ; AVX512F-NEXT: addq %r12, %r14
3862 ; AVX512F-NEXT: adcq %rcx, %rbx
3863 ; AVX512F-NEXT: movq %r10, %rax
3864 ; AVX512F-NEXT: mulq %r15
3865 ; AVX512F-NEXT: movq %rdx, %r12
3866 ; AVX512F-NEXT: movq %rax, %rcx
3867 ; AVX512F-NEXT: movq %r11, %rax
3868 ; AVX512F-NEXT: mulq %r15
3869 ; AVX512F-NEXT: movq %rdx, %r15
3870 ; AVX512F-NEXT: movq %rax, %r13
3871 ; AVX512F-NEXT: addq %r12, %r13
3872 ; AVX512F-NEXT: adcq $0, %r15
3873 ; AVX512F-NEXT: movq %r10, %rax
3874 ; AVX512F-NEXT: mulq %rsi
3875 ; AVX512F-NEXT: movq %rdx, %r12
3876 ; AVX512F-NEXT: movq %rax, %r10
3877 ; AVX512F-NEXT: addq %r13, %r10
3878 ; AVX512F-NEXT: adcq %r15, %r12
3879 ; AVX512F-NEXT: setb %al
3880 ; AVX512F-NEXT: movzbl %al, %r15d
3881 ; AVX512F-NEXT: movq %r11, %rax
3882 ; AVX512F-NEXT: mulq %rsi
3883 ; AVX512F-NEXT: addq %r12, %rax
3884 ; AVX512F-NEXT: adcq %r15, %rdx
3885 ; AVX512F-NEXT: addq %r14, %rax
3886 ; AVX512F-NEXT: adcq %rbx, %rdx
3887 ; AVX512F-NEXT: movq {{[0-9]+}}(%rsp), %r12
3888 ; AVX512F-NEXT: movq %r10, 24(%r12)
3889 ; AVX512F-NEXT: sarq $63, %r10
3890 ; AVX512F-NEXT: xorq %r10, %rdx
3891 ; AVX512F-NEXT: xorq %rax, %r10
3892 ; AVX512F-NEXT: orq %rdx, %r10
3893 ; AVX512F-NEXT: setne %al
3894 ; AVX512F-NEXT: kmovw %eax, %k0
3895 ; AVX512F-NEXT: movq %r9, %rdx
3896 ; AVX512F-NEXT: sarq $63, %rdx
3897 ; AVX512F-NEXT: movq %rbp, %rsi
3898 ; AVX512F-NEXT: imulq %rdx, %rsi
3899 ; AVX512F-NEXT: movq %r8, %rax
3900 ; AVX512F-NEXT: mulq %rdx
3901 ; AVX512F-NEXT: movq %rdx, %r10
3902 ; AVX512F-NEXT: movq %rax, %r14
3903 ; AVX512F-NEXT: addq %rax, %r10
3904 ; AVX512F-NEXT: addq %rsi, %r10
3905 ; AVX512F-NEXT: movq %rbp, %rax
3906 ; AVX512F-NEXT: sarq $63, %rax
3907 ; AVX512F-NEXT: movq %rax, %rsi
3908 ; AVX512F-NEXT: imulq %r9, %rsi
3909 ; AVX512F-NEXT: mulq %rdi
3910 ; AVX512F-NEXT: movq %rax, %rbx
3911 ; AVX512F-NEXT: movq %rdx, %r11
3912 ; AVX512F-NEXT: addq %rsi, %r11
3913 ; AVX512F-NEXT: addq %rax, %r11
3914 ; AVX512F-NEXT: addq %r14, %rbx
3915 ; AVX512F-NEXT: adcq %r10, %r11
3916 ; AVX512F-NEXT: movq %rdi, %rax
3917 ; AVX512F-NEXT: mulq %r8
3918 ; AVX512F-NEXT: movq %rdx, %r14
3919 ; AVX512F-NEXT: movq %rax, %r10
3920 ; AVX512F-NEXT: movq %r9, %rax
3921 ; AVX512F-NEXT: mulq %r8
3922 ; AVX512F-NEXT: movq %rdx, %r8
3923 ; AVX512F-NEXT: movq %rax, %r15
3924 ; AVX512F-NEXT: addq %r14, %r15
3925 ; AVX512F-NEXT: adcq $0, %r8
3926 ; AVX512F-NEXT: movq %rdi, %rax
3927 ; AVX512F-NEXT: mulq %rbp
3928 ; AVX512F-NEXT: movq %rdx, %rdi
3929 ; AVX512F-NEXT: movq %rax, %r14
3930 ; AVX512F-NEXT: addq %r15, %r14
3931 ; AVX512F-NEXT: adcq %r8, %rdi
3932 ; AVX512F-NEXT: setb %al
3933 ; AVX512F-NEXT: movzbl %al, %esi
3934 ; AVX512F-NEXT: movq %r9, %rax
3935 ; AVX512F-NEXT: mulq %rbp
3936 ; AVX512F-NEXT: addq %rdi, %rax
3937 ; AVX512F-NEXT: adcq %rsi, %rdx
3938 ; AVX512F-NEXT: addq %rbx, %rax
3939 ; AVX512F-NEXT: adcq %r11, %rdx
3940 ; AVX512F-NEXT: movq %r14, 8(%r12)
3941 ; AVX512F-NEXT: sarq $63, %r14
3942 ; AVX512F-NEXT: xorq %r14, %rdx
3943 ; AVX512F-NEXT: xorq %rax, %r14
3944 ; AVX512F-NEXT: orq %rdx, %r14
3945 ; AVX512F-NEXT: setne %al
3946 ; AVX512F-NEXT: andl $1, %eax
3947 ; AVX512F-NEXT: kmovw %eax, %k1
3948 ; AVX512F-NEXT: kshiftlw $1, %k0, %k0
3949 ; AVX512F-NEXT: korw %k0, %k1, %k1
3950 ; AVX512F-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
3951 ; AVX512F-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
3952 ; AVX512F-NEXT: movq %rcx, 16(%r12)
3953 ; AVX512F-NEXT: movq %r10, (%r12)
3954 ; AVX512F-NEXT: popq %rbx
3955 ; AVX512F-NEXT: popq %r12
3956 ; AVX512F-NEXT: popq %r13
3957 ; AVX512F-NEXT: popq %r14
3958 ; AVX512F-NEXT: popq %r15
3959 ; AVX512F-NEXT: popq %rbp
3960 ; AVX512F-NEXT: retq
3962 ; AVX512BW-LABEL: smulo_v2i128:
3963 ; AVX512BW: # %bb.0:
3964 ; AVX512BW-NEXT: pushq %rbp
3965 ; AVX512BW-NEXT: pushq %r15
3966 ; AVX512BW-NEXT: pushq %r14
3967 ; AVX512BW-NEXT: pushq %r13
3968 ; AVX512BW-NEXT: pushq %r12
3969 ; AVX512BW-NEXT: pushq %rbx
3970 ; AVX512BW-NEXT: movq %r9, %rbp
3971 ; AVX512BW-NEXT: movq %rcx, %r11
3972 ; AVX512BW-NEXT: movq %rdx, %r10
3973 ; AVX512BW-NEXT: movq %rsi, %r9
3974 ; AVX512BW-NEXT: movq {{[0-9]+}}(%rsp), %r15
3975 ; AVX512BW-NEXT: movq {{[0-9]+}}(%rsp), %rsi
3976 ; AVX512BW-NEXT: sarq $63, %rcx
3977 ; AVX512BW-NEXT: movq %rsi, %rbx
3978 ; AVX512BW-NEXT: imulq %rcx, %rbx
3979 ; AVX512BW-NEXT: movq %r15, %rax
3980 ; AVX512BW-NEXT: mulq %rcx
3981 ; AVX512BW-NEXT: movq %rdx, %rcx
3982 ; AVX512BW-NEXT: movq %rax, %r12
3983 ; AVX512BW-NEXT: addq %rax, %rcx
3984 ; AVX512BW-NEXT: addq %rbx, %rcx
3985 ; AVX512BW-NEXT: movq %rsi, %rax
3986 ; AVX512BW-NEXT: sarq $63, %rax
3987 ; AVX512BW-NEXT: movq %rax, %r13
3988 ; AVX512BW-NEXT: imulq %r11, %r13
3989 ; AVX512BW-NEXT: mulq %r10
3990 ; AVX512BW-NEXT: movq %rax, %r14
3991 ; AVX512BW-NEXT: movq %rdx, %rbx
3992 ; AVX512BW-NEXT: addq %r13, %rbx
3993 ; AVX512BW-NEXT: addq %rax, %rbx
3994 ; AVX512BW-NEXT: addq %r12, %r14
3995 ; AVX512BW-NEXT: adcq %rcx, %rbx
3996 ; AVX512BW-NEXT: movq %r10, %rax
3997 ; AVX512BW-NEXT: mulq %r15
3998 ; AVX512BW-NEXT: movq %rdx, %r12
3999 ; AVX512BW-NEXT: movq %rax, %rcx
4000 ; AVX512BW-NEXT: movq %r11, %rax
4001 ; AVX512BW-NEXT: mulq %r15
4002 ; AVX512BW-NEXT: movq %rdx, %r15
4003 ; AVX512BW-NEXT: movq %rax, %r13
4004 ; AVX512BW-NEXT: addq %r12, %r13
4005 ; AVX512BW-NEXT: adcq $0, %r15
4006 ; AVX512BW-NEXT: movq %r10, %rax
4007 ; AVX512BW-NEXT: mulq %rsi
4008 ; AVX512BW-NEXT: movq %rdx, %r12
4009 ; AVX512BW-NEXT: movq %rax, %r10
4010 ; AVX512BW-NEXT: addq %r13, %r10
4011 ; AVX512BW-NEXT: adcq %r15, %r12
4012 ; AVX512BW-NEXT: setb %al
4013 ; AVX512BW-NEXT: movzbl %al, %r15d
4014 ; AVX512BW-NEXT: movq %r11, %rax
4015 ; AVX512BW-NEXT: mulq %rsi
4016 ; AVX512BW-NEXT: addq %r12, %rax
4017 ; AVX512BW-NEXT: adcq %r15, %rdx
4018 ; AVX512BW-NEXT: addq %r14, %rax
4019 ; AVX512BW-NEXT: adcq %rbx, %rdx
4020 ; AVX512BW-NEXT: movq {{[0-9]+}}(%rsp), %r12
4021 ; AVX512BW-NEXT: movq %r10, 24(%r12)
4022 ; AVX512BW-NEXT: sarq $63, %r10
4023 ; AVX512BW-NEXT: xorq %r10, %rdx
4024 ; AVX512BW-NEXT: xorq %rax, %r10
4025 ; AVX512BW-NEXT: orq %rdx, %r10
4026 ; AVX512BW-NEXT: setne %al
4027 ; AVX512BW-NEXT: kmovd %eax, %k0
4028 ; AVX512BW-NEXT: movq %r9, %rdx
4029 ; AVX512BW-NEXT: sarq $63, %rdx
4030 ; AVX512BW-NEXT: movq %rbp, %rsi
4031 ; AVX512BW-NEXT: imulq %rdx, %rsi
4032 ; AVX512BW-NEXT: movq %r8, %rax
4033 ; AVX512BW-NEXT: mulq %rdx
4034 ; AVX512BW-NEXT: movq %rdx, %r10
4035 ; AVX512BW-NEXT: movq %rax, %r14
4036 ; AVX512BW-NEXT: addq %rax, %r10
4037 ; AVX512BW-NEXT: addq %rsi, %r10
4038 ; AVX512BW-NEXT: movq %rbp, %rax
4039 ; AVX512BW-NEXT: sarq $63, %rax
4040 ; AVX512BW-NEXT: movq %rax, %rsi
4041 ; AVX512BW-NEXT: imulq %r9, %rsi
4042 ; AVX512BW-NEXT: mulq %rdi
4043 ; AVX512BW-NEXT: movq %rax, %rbx
4044 ; AVX512BW-NEXT: movq %rdx, %r11
4045 ; AVX512BW-NEXT: addq %rsi, %r11
4046 ; AVX512BW-NEXT: addq %rax, %r11
4047 ; AVX512BW-NEXT: addq %r14, %rbx
4048 ; AVX512BW-NEXT: adcq %r10, %r11
4049 ; AVX512BW-NEXT: movq %rdi, %rax
4050 ; AVX512BW-NEXT: mulq %r8
4051 ; AVX512BW-NEXT: movq %rdx, %r14
4052 ; AVX512BW-NEXT: movq %rax, %r10
4053 ; AVX512BW-NEXT: movq %r9, %rax
4054 ; AVX512BW-NEXT: mulq %r8
4055 ; AVX512BW-NEXT: movq %rdx, %r8
4056 ; AVX512BW-NEXT: movq %rax, %r15
4057 ; AVX512BW-NEXT: addq %r14, %r15
4058 ; AVX512BW-NEXT: adcq $0, %r8
4059 ; AVX512BW-NEXT: movq %rdi, %rax
4060 ; AVX512BW-NEXT: mulq %rbp
4061 ; AVX512BW-NEXT: movq %rdx, %rdi
4062 ; AVX512BW-NEXT: movq %rax, %r14
4063 ; AVX512BW-NEXT: addq %r15, %r14
4064 ; AVX512BW-NEXT: adcq %r8, %rdi
4065 ; AVX512BW-NEXT: setb %al
4066 ; AVX512BW-NEXT: movzbl %al, %esi
4067 ; AVX512BW-NEXT: movq %r9, %rax
4068 ; AVX512BW-NEXT: mulq %rbp
4069 ; AVX512BW-NEXT: addq %rdi, %rax
4070 ; AVX512BW-NEXT: adcq %rsi, %rdx
4071 ; AVX512BW-NEXT: addq %rbx, %rax
4072 ; AVX512BW-NEXT: adcq %r11, %rdx
4073 ; AVX512BW-NEXT: movq %r14, 8(%r12)
4074 ; AVX512BW-NEXT: sarq $63, %r14
4075 ; AVX512BW-NEXT: xorq %r14, %rdx
4076 ; AVX512BW-NEXT: xorq %rax, %r14
4077 ; AVX512BW-NEXT: orq %rdx, %r14
4078 ; AVX512BW-NEXT: setne %al
4079 ; AVX512BW-NEXT: andl $1, %eax
4080 ; AVX512BW-NEXT: kmovw %eax, %k1
4081 ; AVX512BW-NEXT: kshiftlw $1, %k0, %k0
4082 ; AVX512BW-NEXT: korw %k0, %k1, %k1
4083 ; AVX512BW-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
4084 ; AVX512BW-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
4085 ; AVX512BW-NEXT: movq %rcx, 16(%r12)
4086 ; AVX512BW-NEXT: movq %r10, (%r12)
4087 ; AVX512BW-NEXT: popq %rbx
4088 ; AVX512BW-NEXT: popq %r12
4089 ; AVX512BW-NEXT: popq %r13
4090 ; AVX512BW-NEXT: popq %r14
4091 ; AVX512BW-NEXT: popq %r15
4092 ; AVX512BW-NEXT: popq %rbp
4093 ; AVX512BW-NEXT: retq
4094 %t = call {<2 x i128>, <2 x i1>} @llvm.smul.with.overflow.v2i128(<2 x i128> %a0, <2 x i128> %a1)
4095 %val = extractvalue {<2 x i128>, <2 x i1>} %t, 0
4096 %obit = extractvalue {<2 x i128>, <2 x i1>} %t, 1
4097 %res = sext <2 x i1> %obit to <2 x i32>
4098 store <2 x i128> %val, ptr %p2