[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / X86 / vec_umulo.ll
blobc859ce7b74bb8ba01f5159e0406cf13f23af4719
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=SSE,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE,SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE41
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX,AVX512
9 declare {<1 x i32>, <1 x i1>} @llvm.umul.with.overflow.v1i32(<1 x i32>, <1 x i32>)
10 declare {<2 x i32>, <2 x i1>} @llvm.umul.with.overflow.v2i32(<2 x i32>, <2 x i32>)
11 declare {<3 x i32>, <3 x i1>} @llvm.umul.with.overflow.v3i32(<3 x i32>, <3 x i32>)
12 declare {<4 x i32>, <4 x i1>} @llvm.umul.with.overflow.v4i32(<4 x i32>, <4 x i32>)
13 declare {<6 x i32>, <6 x i1>} @llvm.umul.with.overflow.v6i32(<6 x i32>, <6 x i32>)
14 declare {<8 x i32>, <8 x i1>} @llvm.umul.with.overflow.v8i32(<8 x i32>, <8 x i32>)
15 declare {<16 x i32>, <16 x i1>} @llvm.umul.with.overflow.v16i32(<16 x i32>, <16 x i32>)
17 declare {<16 x i8>, <16 x i1>} @llvm.umul.with.overflow.v16i8(<16 x i8>, <16 x i8>)
18 declare {<8 x i16>, <8 x i1>} @llvm.umul.with.overflow.v8i16(<8 x i16>, <8 x i16>)
19 declare {<2 x i64>, <2 x i1>} @llvm.umul.with.overflow.v2i64(<2 x i64>, <2 x i64>)
21 declare {<4 x i24>, <4 x i1>} @llvm.umul.with.overflow.v4i24(<4 x i24>, <4 x i24>)
22 declare {<4 x i1>, <4 x i1>} @llvm.umul.with.overflow.v4i1(<4 x i1>, <4 x i1>)
23 declare {<2 x i128>, <2 x i1>} @llvm.umul.with.overflow.v2i128(<2 x i128>, <2 x i128>)
25 define <1 x i32> @umulo_v1i32(<1 x i32> %a0, <1 x i32> %a1, <1 x i32>* %p2) nounwind {
26 ; SSE-LABEL: umulo_v1i32:
27 ; SSE:       # %bb.0:
28 ; SSE-NEXT:    movq %rdx, %rcx
29 ; SSE-NEXT:    movl %edi, %eax
30 ; SSE-NEXT:    xorl %edi, %edi
31 ; SSE-NEXT:    mull %esi
32 ; SSE-NEXT:    seto %dil
33 ; SSE-NEXT:    negl %edi
34 ; SSE-NEXT:    movl %eax, (%rcx)
35 ; SSE-NEXT:    movl %edi, %eax
36 ; SSE-NEXT:    retq
38 ; AVX-LABEL: umulo_v1i32:
39 ; AVX:       # %bb.0:
40 ; AVX-NEXT:    movq %rdx, %rcx
41 ; AVX-NEXT:    movl %edi, %eax
42 ; AVX-NEXT:    xorl %edi, %edi
43 ; AVX-NEXT:    mull %esi
44 ; AVX-NEXT:    seto %dil
45 ; AVX-NEXT:    negl %edi
46 ; AVX-NEXT:    movl %eax, (%rcx)
47 ; AVX-NEXT:    movl %edi, %eax
48 ; AVX-NEXT:    retq
49   %t = call {<1 x i32>, <1 x i1>} @llvm.umul.with.overflow.v1i32(<1 x i32> %a0, <1 x i32> %a1)
50   %val = extractvalue {<1 x i32>, <1 x i1>} %t, 0
51   %obit = extractvalue {<1 x i32>, <1 x i1>} %t, 1
52   %res = sext <1 x i1> %obit to <1 x i32>
53   store <1 x i32> %val, <1 x i32>* %p2
54   ret <1 x i32> %res
57 define <2 x i32> @umulo_v2i32(<2 x i32> %a0, <2 x i32> %a1, <2 x i32>* %p2) nounwind {
58 ; SSE2-LABEL: umulo_v2i32:
59 ; SSE2:       # %bb.0:
60 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
61 ; SSE2-NEXT:    pmuludq %xmm1, %xmm0
62 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]
63 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
64 ; SSE2-NEXT:    pmuludq %xmm2, %xmm4
65 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,3,2,3]
66 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
67 ; SSE2-NEXT:    pxor %xmm2, %xmm2
68 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
69 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
70 ; SSE2-NEXT:    pxor %xmm2, %xmm1
71 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
72 ; SSE2-NEXT:    movq %xmm0, (%rdi)
73 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
74 ; SSE2-NEXT:    retq
76 ; SSSE3-LABEL: umulo_v2i32:
77 ; SSSE3:       # %bb.0:
78 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
79 ; SSSE3-NEXT:    pmuludq %xmm1, %xmm0
80 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]
81 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
82 ; SSSE3-NEXT:    pmuludq %xmm2, %xmm4
83 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,3,2,3]
84 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
85 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
86 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm2
87 ; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm1
88 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
89 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
90 ; SSSE3-NEXT:    movq %xmm0, (%rdi)
91 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
92 ; SSSE3-NEXT:    retq
94 ; SSE41-LABEL: umulo_v2i32:
95 ; SSE41:       # %bb.0:
96 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
97 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
98 ; SSE41-NEXT:    pmuludq %xmm2, %xmm3
99 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
100 ; SSE41-NEXT:    pmuludq %xmm1, %xmm2
101 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
102 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
103 ; SSE41-NEXT:    pxor %xmm3, %xmm3
104 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm3
105 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
106 ; SSE41-NEXT:    pxor %xmm3, %xmm2
107 ; SSE41-NEXT:    pmulld %xmm1, %xmm0
108 ; SSE41-NEXT:    movq %xmm0, (%rdi)
109 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
110 ; SSE41-NEXT:    retq
112 ; AVX1-LABEL: umulo_v2i32:
113 ; AVX1:       # %bb.0:
114 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
115 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
116 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm3, %xmm2
117 ; AVX1-NEXT:    vpmuludq %xmm1, %xmm0, %xmm3
118 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
119 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
120 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
121 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
122 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
123 ; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm2
124 ; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
125 ; AVX1-NEXT:    vmovq %xmm0, (%rdi)
126 ; AVX1-NEXT:    vmovdqa %xmm2, %xmm0
127 ; AVX1-NEXT:    retq
129 ; AVX2-LABEL: umulo_v2i32:
130 ; AVX2:       # %bb.0:
131 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
132 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
133 ; AVX2-NEXT:    vpmuludq %xmm2, %xmm3, %xmm2
134 ; AVX2-NEXT:    vpmuludq %xmm1, %xmm0, %xmm3
135 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
136 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm2 = xmm3[0],xmm2[1],xmm3[2],xmm2[3]
137 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
138 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
139 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
140 ; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
141 ; AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
142 ; AVX2-NEXT:    vmovq %xmm0, (%rdi)
143 ; AVX2-NEXT:    vmovdqa %xmm2, %xmm0
144 ; AVX2-NEXT:    retq
146 ; AVX512-LABEL: umulo_v2i32:
147 ; AVX512:       # %bb.0:
148 ; AVX512-NEXT:    vpmuludq %xmm1, %xmm0, %xmm2
149 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
150 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
151 ; AVX512-NEXT:    vpmuludq %xmm3, %xmm4, %xmm3
152 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm4 = [1,5,3,7]
153 ; AVX512-NEXT:    vpermi2d %xmm3, %xmm2, %xmm4
154 ; AVX512-NEXT:    vptestmd %xmm4, %xmm4, %k1
155 ; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm1
156 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
157 ; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
158 ; AVX512-NEXT:    vmovq %xmm1, (%rdi)
159 ; AVX512-NEXT:    retq
160   %t = call {<2 x i32>, <2 x i1>} @llvm.umul.with.overflow.v2i32(<2 x i32> %a0, <2 x i32> %a1)
161   %val = extractvalue {<2 x i32>, <2 x i1>} %t, 0
162   %obit = extractvalue {<2 x i32>, <2 x i1>} %t, 1
163   %res = sext <2 x i1> %obit to <2 x i32>
164   store <2 x i32> %val, <2 x i32>* %p2
165   ret <2 x i32> %res
168 define <3 x i32> @umulo_v3i32(<3 x i32> %a0, <3 x i32> %a1, <3 x i32>* %p2) nounwind {
169 ; SSE2-LABEL: umulo_v3i32:
170 ; SSE2:       # %bb.0:
171 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
172 ; SSE2-NEXT:    pmuludq %xmm1, %xmm0
173 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]
174 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
175 ; SSE2-NEXT:    pmuludq %xmm2, %xmm4
176 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,3,2,3]
177 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
178 ; SSE2-NEXT:    pxor %xmm2, %xmm2
179 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
180 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
181 ; SSE2-NEXT:    pxor %xmm2, %xmm1
182 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
183 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[0,2,2,3]
184 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
185 ; SSE2-NEXT:    movq %xmm0, (%rdi)
186 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
187 ; SSE2-NEXT:    movd %xmm0, 8(%rdi)
188 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
189 ; SSE2-NEXT:    retq
191 ; SSSE3-LABEL: umulo_v3i32:
192 ; SSSE3:       # %bb.0:
193 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
194 ; SSSE3-NEXT:    pmuludq %xmm1, %xmm0
195 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]
196 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
197 ; SSSE3-NEXT:    pmuludq %xmm2, %xmm4
198 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,3,2,3]
199 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
200 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
201 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm2
202 ; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm1
203 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
204 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
205 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[0,2,2,3]
206 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
207 ; SSSE3-NEXT:    movq %xmm0, (%rdi)
208 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
209 ; SSSE3-NEXT:    movd %xmm0, 8(%rdi)
210 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
211 ; SSSE3-NEXT:    retq
213 ; SSE41-LABEL: umulo_v3i32:
214 ; SSE41:       # %bb.0:
215 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
216 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
217 ; SSE41-NEXT:    pmuludq %xmm2, %xmm3
218 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
219 ; SSE41-NEXT:    pmuludq %xmm1, %xmm2
220 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
221 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
222 ; SSE41-NEXT:    pxor %xmm3, %xmm3
223 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm3
224 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
225 ; SSE41-NEXT:    pxor %xmm3, %xmm2
226 ; SSE41-NEXT:    pmulld %xmm1, %xmm0
227 ; SSE41-NEXT:    pextrd $2, %xmm0, 8(%rdi)
228 ; SSE41-NEXT:    movq %xmm0, (%rdi)
229 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
230 ; SSE41-NEXT:    retq
232 ; AVX1-LABEL: umulo_v3i32:
233 ; AVX1:       # %bb.0:
234 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
235 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
236 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm3, %xmm2
237 ; AVX1-NEXT:    vpmuludq %xmm1, %xmm0, %xmm3
238 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
239 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
240 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
241 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
242 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
243 ; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm2
244 ; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
245 ; AVX1-NEXT:    vpextrd $2, %xmm0, 8(%rdi)
246 ; AVX1-NEXT:    vmovq %xmm0, (%rdi)
247 ; AVX1-NEXT:    vmovdqa %xmm2, %xmm0
248 ; AVX1-NEXT:    retq
250 ; AVX2-LABEL: umulo_v3i32:
251 ; AVX2:       # %bb.0:
252 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
253 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
254 ; AVX2-NEXT:    vpmuludq %xmm2, %xmm3, %xmm2
255 ; AVX2-NEXT:    vpmuludq %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:    vpxor %xmm3, %xmm3, %xmm3
259 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
260 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
261 ; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
262 ; AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
263 ; AVX2-NEXT:    vpextrd $2, %xmm0, 8(%rdi)
264 ; AVX2-NEXT:    vmovq %xmm0, (%rdi)
265 ; AVX2-NEXT:    vmovdqa %xmm2, %xmm0
266 ; AVX2-NEXT:    retq
268 ; AVX512-LABEL: umulo_v3i32:
269 ; AVX512:       # %bb.0:
270 ; AVX512-NEXT:    vpmuludq %xmm1, %xmm0, %xmm2
271 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
272 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
273 ; AVX512-NEXT:    vpmuludq %xmm3, %xmm4, %xmm3
274 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm4 = [1,5,3,7]
275 ; AVX512-NEXT:    vpermi2d %xmm3, %xmm2, %xmm4
276 ; AVX512-NEXT:    vptestmd %xmm4, %xmm4, %k1
277 ; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm1
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)
282 ; AVX512-NEXT:    retq
283   %t = call {<3 x i32>, <3 x i1>} @llvm.umul.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, <3 x i32>* %p2
288   ret <3 x i32> %res
291 define <4 x i32> @umulo_v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i32>* %p2) nounwind {
292 ; SSE2-LABEL: umulo_v4i32:
293 ; SSE2:       # %bb.0:
294 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
295 ; SSE2-NEXT:    pmuludq %xmm1, %xmm0
296 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]
297 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
298 ; SSE2-NEXT:    pmuludq %xmm2, %xmm4
299 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,3,2,3]
300 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
301 ; SSE2-NEXT:    pxor %xmm2, %xmm2
302 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
303 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
304 ; SSE2-NEXT:    pxor %xmm2, %xmm1
305 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
306 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[0,2,2,3]
307 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
308 ; SSE2-NEXT:    movdqa %xmm0, (%rdi)
309 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
310 ; SSE2-NEXT:    retq
312 ; SSSE3-LABEL: umulo_v4i32:
313 ; SSSE3:       # %bb.0:
314 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
315 ; SSSE3-NEXT:    pmuludq %xmm1, %xmm0
316 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]
317 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
318 ; SSSE3-NEXT:    pmuludq %xmm2, %xmm4
319 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,3,2,3]
320 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
321 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
322 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm2
323 ; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm1
324 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
325 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
326 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[0,2,2,3]
327 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
328 ; SSSE3-NEXT:    movdqa %xmm0, (%rdi)
329 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
330 ; SSSE3-NEXT:    retq
332 ; SSE41-LABEL: umulo_v4i32:
333 ; SSE41:       # %bb.0:
334 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
335 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
336 ; SSE41-NEXT:    pmuludq %xmm2, %xmm3
337 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
338 ; SSE41-NEXT:    pmuludq %xmm1, %xmm2
339 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
340 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
341 ; SSE41-NEXT:    pxor %xmm3, %xmm3
342 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm3
343 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
344 ; SSE41-NEXT:    pxor %xmm3, %xmm2
345 ; SSE41-NEXT:    pmulld %xmm1, %xmm0
346 ; SSE41-NEXT:    movdqa %xmm0, (%rdi)
347 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
348 ; SSE41-NEXT:    retq
350 ; AVX1-LABEL: umulo_v4i32:
351 ; AVX1:       # %bb.0:
352 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
353 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
354 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm3, %xmm2
355 ; AVX1-NEXT:    vpmuludq %xmm1, %xmm0, %xmm3
356 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
357 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
358 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
359 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
360 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
361 ; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm2
362 ; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
363 ; AVX1-NEXT:    vmovdqa %xmm0, (%rdi)
364 ; AVX1-NEXT:    vmovdqa %xmm2, %xmm0
365 ; AVX1-NEXT:    retq
367 ; AVX2-LABEL: umulo_v4i32:
368 ; AVX2:       # %bb.0:
369 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
370 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
371 ; AVX2-NEXT:    vpmuludq %xmm2, %xmm3, %xmm2
372 ; AVX2-NEXT:    vpmuludq %xmm1, %xmm0, %xmm3
373 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
374 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm2 = xmm3[0],xmm2[1],xmm3[2],xmm2[3]
375 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
376 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
377 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
378 ; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
379 ; AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
380 ; AVX2-NEXT:    vmovdqa %xmm0, (%rdi)
381 ; AVX2-NEXT:    vmovdqa %xmm2, %xmm0
382 ; AVX2-NEXT:    retq
384 ; AVX512-LABEL: umulo_v4i32:
385 ; AVX512:       # %bb.0:
386 ; AVX512-NEXT:    vpmuludq %xmm1, %xmm0, %xmm2
387 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
388 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
389 ; AVX512-NEXT:    vpmuludq %xmm3, %xmm4, %xmm3
390 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm4 = [1,5,3,7]
391 ; AVX512-NEXT:    vpermi2d %xmm3, %xmm2, %xmm4
392 ; AVX512-NEXT:    vptestmd %xmm4, %xmm4, %k1
393 ; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm1
394 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
395 ; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
396 ; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)
397 ; AVX512-NEXT:    retq
398   %t = call {<4 x i32>, <4 x i1>} @llvm.umul.with.overflow.v4i32(<4 x i32> %a0, <4 x i32> %a1)
399   %val = extractvalue {<4 x i32>, <4 x i1>} %t, 0
400   %obit = extractvalue {<4 x i32>, <4 x i1>} %t, 1
401   %res = sext <4 x i1> %obit to <4 x i32>
402   store <4 x i32> %val, <4 x i32>* %p2
403   ret <4 x i32> %res
406 define <6 x i32> @umulo_v6i32(<6 x i32> %a0, <6 x i32> %a1, <6 x i32>* %p2) nounwind {
407 ; SSE2-LABEL: umulo_v6i32:
408 ; SSE2:       # %bb.0:
409 ; SSE2-NEXT:    movq %rdi, %rax
410 ; SSE2-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
411 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
412 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
413 ; SSE2-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
414 ; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
415 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
416 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
417 ; SSE2-NEXT:    movd %r8d, %xmm4
418 ; SSE2-NEXT:    movd %ecx, %xmm0
419 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
420 ; SSE2-NEXT:    movd %edx, %xmm5
421 ; SSE2-NEXT:    movd %esi, %xmm6
422 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1]
423 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm6 = xmm6[0],xmm0[0]
424 ; SSE2-NEXT:    pmuludq %xmm1, %xmm6
425 ; SSE2-NEXT:    movd %r9d, %xmm0
426 ; SSE2-NEXT:    movq {{[0-9]+}}(%rsp), %rcx
427 ; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
428 ; SSE2-NEXT:    pmuludq %xmm0, %xmm1
429 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,3,2,3]
430 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,0],xmm2[0,0]
431 ; SSE2-NEXT:    shufps {{.*#+}} xmm5 = xmm5[0,0],xmm4[0,0]
432 ; SSE2-NEXT:    pmuludq %xmm3, %xmm5
433 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,3,2,3]
434 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
435 ; SSE2-NEXT:    pxor %xmm2, %xmm2
436 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm0
437 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm3
438 ; SSE2-NEXT:    pxor %xmm3, %xmm0
439 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[0,2,2,3]
440 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
441 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1]
442 ; SSE2-NEXT:    movd {{.*#+}} xmm5 = mem[0],zero,zero,zero
443 ; SSE2-NEXT:    movd {{.*#+}} xmm6 = mem[0],zero,zero,zero
444 ; SSE2-NEXT:    pmuludq %xmm5, %xmm6
445 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,3,2,3]
446 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[1,3,2,3]
447 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm7 = xmm7[0],xmm5[0],xmm7[1],xmm5[1]
448 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm7
449 ; SSE2-NEXT:    pxor %xmm3, %xmm7
450 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm6[0],xmm1[1],xmm6[1]
451 ; SSE2-NEXT:    movq %xmm1, 16(%rcx)
452 ; SSE2-NEXT:    movdqa %xmm4, (%rcx)
453 ; SSE2-NEXT:    movq %xmm7, 16(%rdi)
454 ; SSE2-NEXT:    movdqa %xmm0, (%rdi)
455 ; SSE2-NEXT:    retq
457 ; SSSE3-LABEL: umulo_v6i32:
458 ; SSSE3:       # %bb.0:
459 ; SSSE3-NEXT:    movq %rdi, %rax
460 ; SSSE3-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
461 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
462 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
463 ; SSSE3-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
464 ; SSSE3-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
465 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
466 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
467 ; SSSE3-NEXT:    movd %r8d, %xmm4
468 ; SSSE3-NEXT:    movd %ecx, %xmm0
469 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
470 ; SSSE3-NEXT:    movd %edx, %xmm5
471 ; SSSE3-NEXT:    movd %esi, %xmm6
472 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1]
473 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm6 = xmm6[0],xmm0[0]
474 ; SSSE3-NEXT:    pmuludq %xmm1, %xmm6
475 ; SSSE3-NEXT:    movd %r9d, %xmm0
476 ; SSSE3-NEXT:    movq {{[0-9]+}}(%rsp), %rcx
477 ; SSSE3-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
478 ; SSSE3-NEXT:    pmuludq %xmm0, %xmm1
479 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,3,2,3]
480 ; SSSE3-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,0],xmm2[0,0]
481 ; SSSE3-NEXT:    shufps {{.*#+}} xmm5 = xmm5[0,0],xmm4[0,0]
482 ; SSSE3-NEXT:    pmuludq %xmm3, %xmm5
483 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,3,2,3]
484 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
485 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
486 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm0
487 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm3
488 ; SSSE3-NEXT:    pxor %xmm3, %xmm0
489 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[0,2,2,3]
490 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
491 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1]
492 ; SSSE3-NEXT:    movd {{.*#+}} xmm5 = mem[0],zero,zero,zero
493 ; SSSE3-NEXT:    movd {{.*#+}} xmm6 = mem[0],zero,zero,zero
494 ; SSSE3-NEXT:    pmuludq %xmm5, %xmm6
495 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,3,2,3]
496 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[1,3,2,3]
497 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm7 = xmm7[0],xmm5[0],xmm7[1],xmm5[1]
498 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm7
499 ; SSSE3-NEXT:    pxor %xmm3, %xmm7
500 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm6[0],xmm1[1],xmm6[1]
501 ; SSSE3-NEXT:    movq %xmm1, 16(%rcx)
502 ; SSSE3-NEXT:    movdqa %xmm4, (%rcx)
503 ; SSSE3-NEXT:    movq %xmm7, 16(%rdi)
504 ; SSSE3-NEXT:    movdqa %xmm0, (%rdi)
505 ; SSSE3-NEXT:    retq
507 ; SSE41-LABEL: umulo_v6i32:
508 ; SSE41:       # %bb.0:
509 ; SSE41-NEXT:    movq %rdi, %rax
510 ; SSE41-NEXT:    movd %esi, %xmm2
511 ; SSE41-NEXT:    pinsrd $1, %edx, %xmm2
512 ; SSE41-NEXT:    pinsrd $2, %ecx, %xmm2
513 ; SSE41-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
514 ; SSE41-NEXT:    pinsrd $1, {{[0-9]+}}(%rsp), %xmm1
515 ; SSE41-NEXT:    pinsrd $2, {{[0-9]+}}(%rsp), %xmm1
516 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
517 ; SSE41-NEXT:    pmuludq %xmm2, %xmm1
518 ; SSE41-NEXT:    pinsrd $3, %r8d, %xmm2
519 ; SSE41-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
520 ; SSE41-NEXT:    movd %r9d, %xmm4
521 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
522 ; SSE41-NEXT:    pmuludq %xmm3, %xmm4
523 ; SSE41-NEXT:    pinsrd $1, {{[0-9]+}}(%rsp), %xmm3
524 ; SSE41-NEXT:    pinsrd $1, {{[0-9]+}}(%rsp), %xmm5
525 ; SSE41-NEXT:    pmulld %xmm3, %xmm5
526 ; SSE41-NEXT:    pinsrd $3, {{[0-9]+}}(%rsp), %xmm0
527 ; SSE41-NEXT:    movq {{[0-9]+}}(%rsp), %rcx
528 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
529 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
530 ; SSE41-NEXT:    pmuludq %xmm3, %xmm6
531 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
532 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm6[2,3],xmm1[4,5],xmm6[6,7]
533 ; SSE41-NEXT:    pxor %xmm8, %xmm8
534 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm1
535 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm6
536 ; SSE41-NEXT:    pxor %xmm6, %xmm1
537 ; SSE41-NEXT:    movd {{.*#+}} xmm7 = mem[0],zero,zero,zero
538 ; SSE41-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
539 ; SSE41-NEXT:    pmuludq %xmm7, %xmm3
540 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
541 ; SSE41-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm3[2,3],xmm4[4,5],xmm3[6,7]
542 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm4
543 ; SSE41-NEXT:    pxor %xmm6, %xmm4
544 ; SSE41-NEXT:    pmulld %xmm2, %xmm0
545 ; SSE41-NEXT:    movq %xmm5, 16(%rcx)
546 ; SSE41-NEXT:    movdqa %xmm0, (%rcx)
547 ; SSE41-NEXT:    movq %xmm4, 16(%rdi)
548 ; SSE41-NEXT:    movdqa %xmm1, (%rdi)
549 ; SSE41-NEXT:    retq
551 ; AVX1-LABEL: umulo_v6i32:
552 ; AVX1:       # %bb.0:
553 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
554 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
555 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
556 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
557 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm5, %xmm2
558 ; AVX1-NEXT:    vpmuludq %xmm3, %xmm4, %xmm5
559 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
560 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm5[0,1],xmm2[2,3],xmm5[4,5],xmm2[6,7]
561 ; AVX1-NEXT:    vpxor %xmm8, %xmm8, %xmm8
562 ; AVX1-NEXT:    vpcmpeqd %xmm8, %xmm2, %xmm2
563 ; AVX1-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
564 ; AVX1-NEXT:    vpxor %xmm6, %xmm2, %xmm2
565 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
566 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
567 ; AVX1-NEXT:    vpmuludq %xmm7, %xmm5, %xmm5
568 ; AVX1-NEXT:    vpmuludq %xmm1, %xmm0, %xmm7
569 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
570 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm5 = xmm7[0,1],xmm5[2,3],xmm7[4,5],xmm5[6,7]
571 ; AVX1-NEXT:    vpcmpeqd %xmm8, %xmm5, %xmm5
572 ; AVX1-NEXT:    vpxor %xmm6, %xmm5, %xmm5
573 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm5, %ymm2
574 ; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
575 ; AVX1-NEXT:    vpmulld %xmm3, %xmm4, %xmm1
576 ; AVX1-NEXT:    vmovq %xmm1, 16(%rdi)
577 ; AVX1-NEXT:    vmovdqa %xmm0, (%rdi)
578 ; AVX1-NEXT:    vmovaps %ymm2, %ymm0
579 ; AVX1-NEXT:    retq
581 ; AVX2-LABEL: umulo_v6i32:
582 ; AVX2:       # %bb.0:
583 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm2 = ymm1[1,1,3,3,5,5,7,7]
584 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm3 = ymm0[1,1,3,3,5,5,7,7]
585 ; AVX2-NEXT:    vpmuludq %ymm2, %ymm3, %ymm2
586 ; AVX2-NEXT:    vpmuludq %ymm1, %ymm0, %ymm3
587 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm3 = ymm3[1,1,3,3,5,5,7,7]
588 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2],ymm2[3],ymm3[4],ymm2[5],ymm3[6],ymm2[7]
589 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
590 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm2
591 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
592 ; AVX2-NEXT:    vpxor %ymm3, %ymm2, %ymm2
593 ; AVX2-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
594 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
595 ; AVX2-NEXT:    vmovq %xmm1, 16(%rdi)
596 ; AVX2-NEXT:    vmovdqa %xmm0, (%rdi)
597 ; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
598 ; AVX2-NEXT:    retq
600 ; AVX512-LABEL: umulo_v6i32:
601 ; AVX512:       # %bb.0:
602 ; AVX512-NEXT:    vpmuludq %ymm1, %ymm0, %ymm2
603 ; AVX512-NEXT:    vpshufd {{.*#+}} ymm3 = ymm1[1,1,3,3,5,5,7,7]
604 ; AVX512-NEXT:    vpshufd {{.*#+}} ymm4 = ymm0[1,1,3,3,5,5,7,7]
605 ; AVX512-NEXT:    vpmuludq %ymm3, %ymm4, %ymm3
606 ; AVX512-NEXT:    vmovdqa {{.*#+}} ymm4 = [1,9,3,11,5,13,7,15]
607 ; AVX512-NEXT:    vpermi2d %ymm3, %ymm2, %ymm4
608 ; AVX512-NEXT:    vptestmd %ymm4, %ymm4, %k1
609 ; AVX512-NEXT:    vpmulld %ymm1, %ymm0, %ymm1
610 ; AVX512-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
611 ; AVX512-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}
612 ; AVX512-NEXT:    vextracti128 $1, %ymm1, %xmm2
613 ; AVX512-NEXT:    vmovq %xmm2, 16(%rdi)
614 ; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)
615 ; AVX512-NEXT:    retq
616   %t = call {<6 x i32>, <6 x i1>} @llvm.umul.with.overflow.v6i32(<6 x i32> %a0, <6 x i32> %a1)
617   %val = extractvalue {<6 x i32>, <6 x i1>} %t, 0
618   %obit = extractvalue {<6 x i32>, <6 x i1>} %t, 1
619   %res = sext <6 x i1> %obit to <6 x i32>
620   store <6 x i32> %val, <6 x i32>* %p2
621   ret <6 x i32> %res
624 define <8 x i32> @umulo_v8i32(<8 x i32> %a0, <8 x i32> %a1, <8 x i32>* %p2) nounwind {
625 ; SSE2-LABEL: umulo_v8i32:
626 ; SSE2:       # %bb.0:
627 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
628 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
629 ; SSE2-NEXT:    pmuludq %xmm2, %xmm4
630 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,3,2,3]
631 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[1,1,3,3]
632 ; SSE2-NEXT:    pmuludq %xmm5, %xmm6
633 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,3,2,3]
634 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
635 ; SSE2-NEXT:    pxor %xmm8, %xmm8
636 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm0
637 ; SSE2-NEXT:    pcmpeqd %xmm7, %xmm7
638 ; SSE2-NEXT:    pxor %xmm7, %xmm0
639 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
640 ; SSE2-NEXT:    pmuludq %xmm3, %xmm1
641 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]
642 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
643 ; SSE2-NEXT:    pmuludq %xmm5, %xmm3
644 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[1,3,2,3]
645 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
646 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm2
647 ; SSE2-NEXT:    pxor %xmm7, %xmm2
648 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
649 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[0,2,2,3]
650 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1]
651 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
652 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
653 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
654 ; SSE2-NEXT:    movdqa %xmm1, 16(%rdi)
655 ; SSE2-NEXT:    movdqa %xmm4, (%rdi)
656 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
657 ; SSE2-NEXT:    retq
659 ; SSSE3-LABEL: umulo_v8i32:
660 ; SSSE3:       # %bb.0:
661 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
662 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
663 ; SSSE3-NEXT:    pmuludq %xmm2, %xmm4
664 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,3,2,3]
665 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[1,1,3,3]
666 ; SSSE3-NEXT:    pmuludq %xmm5, %xmm6
667 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,3,2,3]
668 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
669 ; SSSE3-NEXT:    pxor %xmm8, %xmm8
670 ; SSSE3-NEXT:    pcmpeqd %xmm8, %xmm0
671 ; SSSE3-NEXT:    pcmpeqd %xmm7, %xmm7
672 ; SSSE3-NEXT:    pxor %xmm7, %xmm0
673 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
674 ; SSSE3-NEXT:    pmuludq %xmm3, %xmm1
675 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]
676 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
677 ; SSSE3-NEXT:    pmuludq %xmm5, %xmm3
678 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[1,3,2,3]
679 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
680 ; SSSE3-NEXT:    pcmpeqd %xmm8, %xmm2
681 ; SSSE3-NEXT:    pxor %xmm7, %xmm2
682 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
683 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[0,2,2,3]
684 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1]
685 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
686 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
687 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
688 ; SSSE3-NEXT:    movdqa %xmm1, 16(%rdi)
689 ; SSSE3-NEXT:    movdqa %xmm4, (%rdi)
690 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
691 ; SSSE3-NEXT:    retq
693 ; SSE41-LABEL: umulo_v8i32:
694 ; SSE41:       # %bb.0:
695 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
696 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
697 ; SSE41-NEXT:    pmuludq %xmm4, %xmm5
698 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
699 ; SSE41-NEXT:    pmuludq %xmm2, %xmm4
700 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
701 ; SSE41-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7]
702 ; SSE41-NEXT:    pxor %xmm8, %xmm8
703 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm4
704 ; SSE41-NEXT:    pcmpeqd %xmm7, %xmm7
705 ; SSE41-NEXT:    pxor %xmm7, %xmm4
706 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]
707 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
708 ; SSE41-NEXT:    pmuludq %xmm5, %xmm6
709 ; SSE41-NEXT:    movdqa %xmm1, %xmm5
710 ; SSE41-NEXT:    pmuludq %xmm3, %xmm5
711 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
712 ; SSE41-NEXT:    pblendw {{.*#+}} xmm5 = xmm5[0,1],xmm6[2,3],xmm5[4,5],xmm6[6,7]
713 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm5
714 ; SSE41-NEXT:    pxor %xmm7, %xmm5
715 ; SSE41-NEXT:    pmulld %xmm2, %xmm0
716 ; SSE41-NEXT:    pmulld %xmm3, %xmm1
717 ; SSE41-NEXT:    movdqa %xmm1, 16(%rdi)
718 ; SSE41-NEXT:    movdqa %xmm0, (%rdi)
719 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
720 ; SSE41-NEXT:    movdqa %xmm5, %xmm1
721 ; SSE41-NEXT:    retq
723 ; AVX1-LABEL: umulo_v8i32:
724 ; AVX1:       # %bb.0:
725 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
726 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
727 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
728 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
729 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm5, %xmm2
730 ; AVX1-NEXT:    vpmuludq %xmm3, %xmm4, %xmm5
731 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
732 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm5[0,1],xmm2[2,3],xmm5[4,5],xmm2[6,7]
733 ; AVX1-NEXT:    vpxor %xmm8, %xmm8, %xmm8
734 ; AVX1-NEXT:    vpcmpeqd %xmm8, %xmm2, %xmm2
735 ; AVX1-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
736 ; AVX1-NEXT:    vpxor %xmm6, %xmm2, %xmm2
737 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
738 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
739 ; AVX1-NEXT:    vpmuludq %xmm7, %xmm5, %xmm5
740 ; AVX1-NEXT:    vpmuludq %xmm1, %xmm0, %xmm7
741 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
742 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm5 = xmm7[0,1],xmm5[2,3],xmm7[4,5],xmm5[6,7]
743 ; AVX1-NEXT:    vpcmpeqd %xmm8, %xmm5, %xmm5
744 ; AVX1-NEXT:    vpxor %xmm6, %xmm5, %xmm5
745 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm5, %ymm2
746 ; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
747 ; AVX1-NEXT:    vpmulld %xmm3, %xmm4, %xmm1
748 ; AVX1-NEXT:    vmovdqa %xmm1, 16(%rdi)
749 ; AVX1-NEXT:    vmovdqa %xmm0, (%rdi)
750 ; AVX1-NEXT:    vmovaps %ymm2, %ymm0
751 ; AVX1-NEXT:    retq
753 ; AVX2-LABEL: umulo_v8i32:
754 ; AVX2:       # %bb.0:
755 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm2 = ymm1[1,1,3,3,5,5,7,7]
756 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm3 = ymm0[1,1,3,3,5,5,7,7]
757 ; AVX2-NEXT:    vpmuludq %ymm2, %ymm3, %ymm2
758 ; AVX2-NEXT:    vpmuludq %ymm1, %ymm0, %ymm3
759 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm3 = ymm3[1,1,3,3,5,5,7,7]
760 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2],ymm2[3],ymm3[4],ymm2[5],ymm3[6],ymm2[7]
761 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
762 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm2
763 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
764 ; AVX2-NEXT:    vpxor %ymm3, %ymm2, %ymm2
765 ; AVX2-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
766 ; AVX2-NEXT:    vmovdqa %ymm0, (%rdi)
767 ; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
768 ; AVX2-NEXT:    retq
770 ; AVX512-LABEL: umulo_v8i32:
771 ; AVX512:       # %bb.0:
772 ; AVX512-NEXT:    vpmuludq %ymm1, %ymm0, %ymm2
773 ; AVX512-NEXT:    vpshufd {{.*#+}} ymm3 = ymm1[1,1,3,3,5,5,7,7]
774 ; AVX512-NEXT:    vpshufd {{.*#+}} ymm4 = ymm0[1,1,3,3,5,5,7,7]
775 ; AVX512-NEXT:    vpmuludq %ymm3, %ymm4, %ymm3
776 ; AVX512-NEXT:    vmovdqa {{.*#+}} ymm4 = [1,9,3,11,5,13,7,15]
777 ; AVX512-NEXT:    vpermi2d %ymm3, %ymm2, %ymm4
778 ; AVX512-NEXT:    vptestmd %ymm4, %ymm4, %k1
779 ; AVX512-NEXT:    vpmulld %ymm1, %ymm0, %ymm1
780 ; AVX512-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
781 ; AVX512-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}
782 ; AVX512-NEXT:    vmovdqa %ymm1, (%rdi)
783 ; AVX512-NEXT:    retq
784   %t = call {<8 x i32>, <8 x i1>} @llvm.umul.with.overflow.v8i32(<8 x i32> %a0, <8 x i32> %a1)
785   %val = extractvalue {<8 x i32>, <8 x i1>} %t, 0
786   %obit = extractvalue {<8 x i32>, <8 x i1>} %t, 1
787   %res = sext <8 x i1> %obit to <8 x i32>
788   store <8 x i32> %val, <8 x i32>* %p2
789   ret <8 x i32> %res
792 define <16 x i32> @umulo_v16i32(<16 x i32> %a0, <16 x i32> %a1, <16 x i32>* %p2) nounwind {
793 ; SSE2-LABEL: umulo_v16i32:
794 ; SSE2:       # %bb.0:
795 ; SSE2-NEXT:    movdqa %xmm0, %xmm8
796 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm0[1,1,3,3]
797 ; SSE2-NEXT:    pmuludq %xmm4, %xmm8
798 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm8[1,3,2,3]
799 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm4[1,1,3,3]
800 ; SSE2-NEXT:    pmuludq %xmm10, %xmm9
801 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm9[1,3,2,3]
802 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
803 ; SSE2-NEXT:    pxor %xmm10, %xmm10
804 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
805 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm11
806 ; SSE2-NEXT:    pxor %xmm11, %xmm0
807 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm1[1,1,3,3]
808 ; SSE2-NEXT:    pmuludq %xmm5, %xmm1
809 ; SSE2-NEXT:    pshufd {{.*#+}} xmm15 = xmm1[1,3,2,3]
810 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm5[1,1,3,3]
811 ; SSE2-NEXT:    pmuludq %xmm13, %xmm12
812 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm12[1,3,2,3]
813 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm15 = xmm15[0],xmm5[0],xmm15[1],xmm5[1]
814 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm15
815 ; SSE2-NEXT:    pxor %xmm11, %xmm15
816 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm2[1,1,3,3]
817 ; SSE2-NEXT:    pmuludq %xmm6, %xmm2
818 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[1,3,2,3]
819 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm6[1,1,3,3]
820 ; SSE2-NEXT:    pmuludq %xmm14, %xmm13
821 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm13[1,3,2,3]
822 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm6[0],xmm5[1],xmm6[1]
823 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm5
824 ; SSE2-NEXT:    pxor %xmm11, %xmm5
825 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm3[1,1,3,3]
826 ; SSE2-NEXT:    pmuludq %xmm7, %xmm3
827 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[1,3,2,3]
828 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
829 ; SSE2-NEXT:    pmuludq %xmm14, %xmm7
830 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[1,3,2,3]
831 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm6 = xmm6[0],xmm4[0],xmm6[1],xmm4[1]
832 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm6
833 ; SSE2-NEXT:    pxor %xmm11, %xmm6
834 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[0,2,2,3]
835 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm9[0,2,2,3]
836 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm8 = xmm8[0],xmm4[0],xmm8[1],xmm4[1]
837 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
838 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm12[0,2,2,3]
839 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]
840 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
841 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm13[0,2,2,3]
842 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
843 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
844 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[0,2,2,3]
845 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
846 ; SSE2-NEXT:    movdqa %xmm3, 48(%rdi)
847 ; SSE2-NEXT:    movdqa %xmm2, 32(%rdi)
848 ; SSE2-NEXT:    movdqa %xmm1, 16(%rdi)
849 ; SSE2-NEXT:    movdqa %xmm8, (%rdi)
850 ; SSE2-NEXT:    movdqa %xmm15, %xmm1
851 ; SSE2-NEXT:    movdqa %xmm5, %xmm2
852 ; SSE2-NEXT:    movdqa %xmm6, %xmm3
853 ; SSE2-NEXT:    retq
855 ; SSSE3-LABEL: umulo_v16i32:
856 ; SSSE3:       # %bb.0:
857 ; SSSE3-NEXT:    movdqa %xmm0, %xmm8
858 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm0[1,1,3,3]
859 ; SSSE3-NEXT:    pmuludq %xmm4, %xmm8
860 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm8[1,3,2,3]
861 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm4[1,1,3,3]
862 ; SSSE3-NEXT:    pmuludq %xmm10, %xmm9
863 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm9[1,3,2,3]
864 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
865 ; SSSE3-NEXT:    pxor %xmm10, %xmm10
866 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm0
867 ; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm11
868 ; SSSE3-NEXT:    pxor %xmm11, %xmm0
869 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm1[1,1,3,3]
870 ; SSSE3-NEXT:    pmuludq %xmm5, %xmm1
871 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm15 = xmm1[1,3,2,3]
872 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm5[1,1,3,3]
873 ; SSSE3-NEXT:    pmuludq %xmm13, %xmm12
874 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm12[1,3,2,3]
875 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm15 = xmm15[0],xmm5[0],xmm15[1],xmm5[1]
876 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm15
877 ; SSSE3-NEXT:    pxor %xmm11, %xmm15
878 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm14 = xmm2[1,1,3,3]
879 ; SSSE3-NEXT:    pmuludq %xmm6, %xmm2
880 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[1,3,2,3]
881 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm6[1,1,3,3]
882 ; SSSE3-NEXT:    pmuludq %xmm14, %xmm13
883 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm13[1,3,2,3]
884 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm6[0],xmm5[1],xmm6[1]
885 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm5
886 ; SSSE3-NEXT:    pxor %xmm11, %xmm5
887 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm14 = xmm3[1,1,3,3]
888 ; SSSE3-NEXT:    pmuludq %xmm7, %xmm3
889 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[1,3,2,3]
890 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
891 ; SSSE3-NEXT:    pmuludq %xmm14, %xmm7
892 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[1,3,2,3]
893 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm6 = xmm6[0],xmm4[0],xmm6[1],xmm4[1]
894 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm6
895 ; SSSE3-NEXT:    pxor %xmm11, %xmm6
896 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[0,2,2,3]
897 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm9[0,2,2,3]
898 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm8 = xmm8[0],xmm4[0],xmm8[1],xmm4[1]
899 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
900 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm12[0,2,2,3]
901 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]
902 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
903 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm13[0,2,2,3]
904 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
905 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
906 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[0,2,2,3]
907 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
908 ; SSSE3-NEXT:    movdqa %xmm3, 48(%rdi)
909 ; SSSE3-NEXT:    movdqa %xmm2, 32(%rdi)
910 ; SSSE3-NEXT:    movdqa %xmm1, 16(%rdi)
911 ; SSSE3-NEXT:    movdqa %xmm8, (%rdi)
912 ; SSSE3-NEXT:    movdqa %xmm15, %xmm1
913 ; SSSE3-NEXT:    movdqa %xmm5, %xmm2
914 ; SSSE3-NEXT:    movdqa %xmm6, %xmm3
915 ; SSSE3-NEXT:    retq
917 ; SSE41-LABEL: umulo_v16i32:
918 ; SSE41:       # %bb.0:
919 ; SSE41-NEXT:    pshufd {{.*#+}} xmm8 = xmm4[1,1,3,3]
920 ; SSE41-NEXT:    pshufd {{.*#+}} xmm9 = xmm0[1,1,3,3]
921 ; SSE41-NEXT:    pmuludq %xmm8, %xmm9
922 ; SSE41-NEXT:    movdqa %xmm0, %xmm8
923 ; SSE41-NEXT:    pmuludq %xmm4, %xmm8
924 ; SSE41-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
925 ; SSE41-NEXT:    pblendw {{.*#+}} xmm8 = xmm8[0,1],xmm9[2,3],xmm8[4,5],xmm9[6,7]
926 ; SSE41-NEXT:    pxor %xmm12, %xmm12
927 ; SSE41-NEXT:    pcmpeqd %xmm12, %xmm8
928 ; SSE41-NEXT:    pcmpeqd %xmm13, %xmm13
929 ; SSE41-NEXT:    pxor %xmm13, %xmm8
930 ; SSE41-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[1,1,3,3]
931 ; SSE41-NEXT:    pshufd {{.*#+}} xmm10 = xmm1[1,1,3,3]
932 ; SSE41-NEXT:    pmuludq %xmm9, %xmm10
933 ; SSE41-NEXT:    movdqa %xmm1, %xmm9
934 ; SSE41-NEXT:    pmuludq %xmm5, %xmm9
935 ; SSE41-NEXT:    pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
936 ; SSE41-NEXT:    pblendw {{.*#+}} xmm9 = xmm9[0,1],xmm10[2,3],xmm9[4,5],xmm10[6,7]
937 ; SSE41-NEXT:    pcmpeqd %xmm12, %xmm9
938 ; SSE41-NEXT:    pxor %xmm13, %xmm9
939 ; SSE41-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[1,1,3,3]
940 ; SSE41-NEXT:    pshufd {{.*#+}} xmm11 = xmm2[1,1,3,3]
941 ; SSE41-NEXT:    pmuludq %xmm10, %xmm11
942 ; SSE41-NEXT:    movdqa %xmm2, %xmm10
943 ; SSE41-NEXT:    pmuludq %xmm6, %xmm10
944 ; SSE41-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
945 ; SSE41-NEXT:    pblendw {{.*#+}} xmm10 = xmm10[0,1],xmm11[2,3],xmm10[4,5],xmm11[6,7]
946 ; SSE41-NEXT:    pcmpeqd %xmm12, %xmm10
947 ; SSE41-NEXT:    pxor %xmm13, %xmm10
948 ; SSE41-NEXT:    pshufd {{.*#+}} xmm11 = xmm7[1,1,3,3]
949 ; SSE41-NEXT:    pshufd {{.*#+}} xmm14 = xmm3[1,1,3,3]
950 ; SSE41-NEXT:    pmuludq %xmm11, %xmm14
951 ; SSE41-NEXT:    movdqa %xmm3, %xmm11
952 ; SSE41-NEXT:    pmuludq %xmm7, %xmm11
953 ; SSE41-NEXT:    pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3]
954 ; SSE41-NEXT:    pblendw {{.*#+}} xmm11 = xmm11[0,1],xmm14[2,3],xmm11[4,5],xmm14[6,7]
955 ; SSE41-NEXT:    pcmpeqd %xmm12, %xmm11
956 ; SSE41-NEXT:    pxor %xmm13, %xmm11
957 ; SSE41-NEXT:    pmulld %xmm4, %xmm0
958 ; SSE41-NEXT:    pmulld %xmm5, %xmm1
959 ; SSE41-NEXT:    pmulld %xmm6, %xmm2
960 ; SSE41-NEXT:    pmulld %xmm7, %xmm3
961 ; SSE41-NEXT:    movdqa %xmm3, 48(%rdi)
962 ; SSE41-NEXT:    movdqa %xmm2, 32(%rdi)
963 ; SSE41-NEXT:    movdqa %xmm1, 16(%rdi)
964 ; SSE41-NEXT:    movdqa %xmm0, (%rdi)
965 ; SSE41-NEXT:    movdqa %xmm8, %xmm0
966 ; SSE41-NEXT:    movdqa %xmm9, %xmm1
967 ; SSE41-NEXT:    movdqa %xmm10, %xmm2
968 ; SSE41-NEXT:    movdqa %xmm11, %xmm3
969 ; SSE41-NEXT:    retq
971 ; AVX1-LABEL: umulo_v16i32:
972 ; AVX1:       # %bb.0:
973 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm10
974 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm10[1,1,3,3]
975 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm12
976 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm7 = xmm12[1,1,3,3]
977 ; AVX1-NEXT:    vpmuludq %xmm6, %xmm7, %xmm6
978 ; AVX1-NEXT:    vpmuludq %xmm10, %xmm12, %xmm7
979 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
980 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm7 = xmm7[0,1],xmm6[2,3],xmm7[4,5],xmm6[6,7]
981 ; AVX1-NEXT:    vpxor %xmm8, %xmm8, %xmm8
982 ; AVX1-NEXT:    vpcmpeqd %xmm8, %xmm7, %xmm7
983 ; AVX1-NEXT:    vpcmpeqd %xmm9, %xmm9, %xmm9
984 ; AVX1-NEXT:    vpxor %xmm9, %xmm7, %xmm7
985 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm3[1,1,3,3]
986 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
987 ; AVX1-NEXT:    vpmuludq %xmm6, %xmm4, %xmm4
988 ; AVX1-NEXT:    vpmuludq %xmm3, %xmm1, %xmm6
989 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
990 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm6[0,1],xmm4[2,3],xmm6[4,5],xmm4[6,7]
991 ; AVX1-NEXT:    vpcmpeqd %xmm8, %xmm4, %xmm4
992 ; AVX1-NEXT:    vpxor %xmm9, %xmm4, %xmm4
993 ; AVX1-NEXT:    vpackssdw %xmm7, %xmm4, %xmm11
994 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm6
995 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
996 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
997 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
998 ; AVX1-NEXT:    vpmuludq %xmm7, %xmm5, %xmm5
999 ; AVX1-NEXT:    vpmuludq %xmm6, %xmm4, %xmm7
1000 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1001 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm5 = xmm7[0,1],xmm5[2,3],xmm7[4,5],xmm5[6,7]
1002 ; AVX1-NEXT:    vpcmpeqd %xmm8, %xmm5, %xmm5
1003 ; AVX1-NEXT:    vpxor %xmm9, %xmm5, %xmm13
1004 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
1005 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
1006 ; AVX1-NEXT:    vpmuludq %xmm7, %xmm5, %xmm5
1007 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm0, %xmm7
1008 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1009 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm5 = xmm7[0,1],xmm5[2,3],xmm7[4,5],xmm5[6,7]
1010 ; AVX1-NEXT:    vpcmpeqd %xmm8, %xmm5, %xmm5
1011 ; AVX1-NEXT:    vpxor %xmm9, %xmm5, %xmm5
1012 ; AVX1-NEXT:    vpackssdw %xmm13, %xmm5, %xmm5
1013 ; AVX1-NEXT:    vpacksswb %xmm11, %xmm5, %xmm5
1014 ; AVX1-NEXT:    vpmulld %xmm2, %xmm0, %xmm2
1015 ; AVX1-NEXT:    vpmulld %xmm6, %xmm4, %xmm4
1016 ; AVX1-NEXT:    vpmulld %xmm3, %xmm1, %xmm3
1017 ; AVX1-NEXT:    vpmulld %xmm10, %xmm12, %xmm6
1018 ; AVX1-NEXT:    vpmovsxbd %xmm5, %xmm0
1019 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm5[1,1,2,3]
1020 ; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1
1021 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1022 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm5[2,3,0,1]
1023 ; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1
1024 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm5[3,3,0,1]
1025 ; AVX1-NEXT:    vpmovsxbd %xmm5, %xmm5
1026 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm1, %ymm1
1027 ; AVX1-NEXT:    vmovdqa %xmm6, 48(%rdi)
1028 ; AVX1-NEXT:    vmovdqa %xmm3, 32(%rdi)
1029 ; AVX1-NEXT:    vmovdqa %xmm4, 16(%rdi)
1030 ; AVX1-NEXT:    vmovdqa %xmm2, (%rdi)
1031 ; AVX1-NEXT:    retq
1033 ; AVX2-LABEL: umulo_v16i32:
1034 ; AVX2:       # %bb.0:
1035 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm4 = ymm3[1,1,3,3,5,5,7,7]
1036 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm5 = ymm1[1,1,3,3,5,5,7,7]
1037 ; AVX2-NEXT:    vpmuludq %ymm4, %ymm5, %ymm4
1038 ; AVX2-NEXT:    vpmuludq %ymm3, %ymm1, %ymm5
1039 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm5 = ymm5[1,1,3,3,5,5,7,7]
1040 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm4 = ymm5[0],ymm4[1],ymm5[2],ymm4[3],ymm5[4],ymm4[5],ymm5[6],ymm4[7]
1041 ; AVX2-NEXT:    vpxor %xmm5, %xmm5, %xmm5
1042 ; AVX2-NEXT:    vpcmpeqd %ymm5, %ymm4, %ymm4
1043 ; AVX2-NEXT:    vpcmpeqd %ymm6, %ymm6, %ymm6
1044 ; AVX2-NEXT:    vpxor %ymm6, %ymm4, %ymm4
1045 ; AVX2-NEXT:    vextracti128 $1, %ymm4, %xmm7
1046 ; AVX2-NEXT:    vpackssdw %xmm7, %xmm4, %xmm4
1047 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm7 = ymm2[1,1,3,3,5,5,7,7]
1048 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm8 = ymm0[1,1,3,3,5,5,7,7]
1049 ; AVX2-NEXT:    vpmuludq %ymm7, %ymm8, %ymm7
1050 ; AVX2-NEXT:    vpmuludq %ymm2, %ymm0, %ymm8
1051 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm8 = ymm8[1,1,3,3,5,5,7,7]
1052 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm7 = ymm8[0],ymm7[1],ymm8[2],ymm7[3],ymm8[4],ymm7[5],ymm8[6],ymm7[7]
1053 ; AVX2-NEXT:    vpcmpeqd %ymm5, %ymm7, %ymm5
1054 ; AVX2-NEXT:    vpxor %ymm6, %ymm5, %ymm5
1055 ; AVX2-NEXT:    vextracti128 $1, %ymm5, %xmm6
1056 ; AVX2-NEXT:    vpackssdw %xmm6, %xmm5, %xmm5
1057 ; AVX2-NEXT:    vpacksswb %xmm4, %xmm5, %xmm4
1058 ; AVX2-NEXT:    vpmulld %ymm2, %ymm0, %ymm2
1059 ; AVX2-NEXT:    vpmulld %ymm3, %ymm1, %ymm3
1060 ; AVX2-NEXT:    vpmovsxbd %xmm4, %ymm0
1061 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm4[2,3,0,1]
1062 ; AVX2-NEXT:    vpmovsxbd %xmm1, %ymm1
1063 ; AVX2-NEXT:    vmovdqa %ymm3, 32(%rdi)
1064 ; AVX2-NEXT:    vmovdqa %ymm2, (%rdi)
1065 ; AVX2-NEXT:    retq
1067 ; AVX512-LABEL: umulo_v16i32:
1068 ; AVX512:       # %bb.0:
1069 ; AVX512-NEXT:    vpmuludq %zmm1, %zmm0, %zmm2
1070 ; AVX512-NEXT:    vpshufd {{.*#+}} zmm3 = zmm1[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]
1071 ; AVX512-NEXT:    vpshufd {{.*#+}} zmm4 = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]
1072 ; AVX512-NEXT:    vpmuludq %zmm3, %zmm4, %zmm3
1073 ; AVX512-NEXT:    vmovdqa64 {{.*#+}} zmm4 = [1,17,3,19,5,21,7,23,9,25,11,27,13,29,15,31]
1074 ; AVX512-NEXT:    vpermi2d %zmm3, %zmm2, %zmm4
1075 ; AVX512-NEXT:    vptestmd %zmm4, %zmm4, %k1
1076 ; AVX512-NEXT:    vpmulld %zmm1, %zmm0, %zmm1
1077 ; AVX512-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1078 ; AVX512-NEXT:    vmovdqa64 %zmm1, (%rdi)
1079 ; AVX512-NEXT:    retq
1080   %t = call {<16 x i32>, <16 x i1>} @llvm.umul.with.overflow.v16i32(<16 x i32> %a0, <16 x i32> %a1)
1081   %val = extractvalue {<16 x i32>, <16 x i1>} %t, 0
1082   %obit = extractvalue {<16 x i32>, <16 x i1>} %t, 1
1083   %res = sext <16 x i1> %obit to <16 x i32>
1084   store <16 x i32> %val, <16 x i32>* %p2
1085   ret <16 x i32> %res
1088 define <16 x i32> @umulo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nounwind {
1089 ; SSE2-LABEL: umulo_v16i8:
1090 ; SSE2:       # %bb.0:
1091 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1092 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
1093 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1094 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]
1095 ; SSE2-NEXT:    pmullw %xmm2, %xmm3
1096 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
1097 ; SSE2-NEXT:    pand %xmm2, %xmm3
1098 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
1099 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1],xmm5[2],xmm0[2],xmm5[3],xmm0[3],xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7]
1100 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
1101 ; 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]
1102 ; SSE2-NEXT:    pmullw %xmm5, %xmm4
1103 ; SSE2-NEXT:    pand %xmm2, %xmm4
1104 ; SSE2-NEXT:    packuswb %xmm3, %xmm4
1105 ; SSE2-NEXT:    pxor %xmm2, %xmm2
1106 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
1107 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15]
1108 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
1109 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = 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]
1110 ; SSE2-NEXT:    pmullw %xmm3, %xmm5
1111 ; SSE2-NEXT:    psrlw $8, %xmm5
1112 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1113 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
1114 ; SSE2-NEXT:    pmullw %xmm1, %xmm0
1115 ; SSE2-NEXT:    psrlw $8, %xmm0
1116 ; SSE2-NEXT:    packuswb %xmm5, %xmm0
1117 ; SSE2-NEXT:    pcmpeqb %xmm2, %xmm0
1118 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm3
1119 ; SSE2-NEXT:    pxor %xmm0, %xmm3
1120 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
1121 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1122 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1123 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1124 ; SSE2-NEXT:    pslld $31, %xmm0
1125 ; SSE2-NEXT:    psrad $31, %xmm0
1126 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1127 ; SSE2-NEXT:    pslld $31, %xmm1
1128 ; SSE2-NEXT:    psrad $31, %xmm1
1129 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]
1130 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
1131 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1132 ; SSE2-NEXT:    pslld $31, %xmm2
1133 ; SSE2-NEXT:    psrad $31, %xmm2
1134 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1135 ; SSE2-NEXT:    pslld $31, %xmm3
1136 ; SSE2-NEXT:    psrad $31, %xmm3
1137 ; SSE2-NEXT:    movdqa %xmm4, (%rdi)
1138 ; SSE2-NEXT:    retq
1140 ; SSSE3-LABEL: umulo_v16i8:
1141 ; SSSE3:       # %bb.0:
1142 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1143 ; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
1144 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
1145 ; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]
1146 ; SSSE3-NEXT:    pmullw %xmm2, %xmm3
1147 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
1148 ; SSSE3-NEXT:    pand %xmm2, %xmm3
1149 ; SSSE3-NEXT:    movdqa %xmm1, %xmm5
1150 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1],xmm5[2],xmm0[2],xmm5[3],xmm0[3],xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7]
1151 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
1152 ; 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]
1153 ; SSSE3-NEXT:    pmullw %xmm5, %xmm4
1154 ; SSSE3-NEXT:    pand %xmm2, %xmm4
1155 ; SSSE3-NEXT:    packuswb %xmm3, %xmm4
1156 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
1157 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
1158 ; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15]
1159 ; SSSE3-NEXT:    movdqa %xmm0, %xmm5
1160 ; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm5 = 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]
1161 ; SSSE3-NEXT:    pmullw %xmm3, %xmm5
1162 ; SSSE3-NEXT:    psrlw $8, %xmm5
1163 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1164 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
1165 ; SSSE3-NEXT:    pmullw %xmm1, %xmm0
1166 ; SSSE3-NEXT:    psrlw $8, %xmm0
1167 ; SSSE3-NEXT:    packuswb %xmm5, %xmm0
1168 ; SSSE3-NEXT:    pcmpeqb %xmm2, %xmm0
1169 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm3
1170 ; SSSE3-NEXT:    pxor %xmm0, %xmm3
1171 ; SSSE3-NEXT:    movdqa %xmm3, %xmm1
1172 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1173 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1174 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1175 ; SSSE3-NEXT:    pslld $31, %xmm0
1176 ; SSSE3-NEXT:    psrad $31, %xmm0
1177 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1178 ; SSSE3-NEXT:    pslld $31, %xmm1
1179 ; SSSE3-NEXT:    psrad $31, %xmm1
1180 ; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]
1181 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
1182 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1183 ; SSSE3-NEXT:    pslld $31, %xmm2
1184 ; SSSE3-NEXT:    psrad $31, %xmm2
1185 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1186 ; SSSE3-NEXT:    pslld $31, %xmm3
1187 ; SSSE3-NEXT:    psrad $31, %xmm3
1188 ; SSSE3-NEXT:    movdqa %xmm4, (%rdi)
1189 ; SSSE3-NEXT:    retq
1191 ; SSE41-LABEL: umulo_v16i8:
1192 ; SSE41:       # %bb.0:
1193 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
1194 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
1195 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
1196 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]
1197 ; SSE41-NEXT:    pmullw %xmm2, %xmm3
1198 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
1199 ; SSE41-NEXT:    pand %xmm4, %xmm3
1200 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
1201 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1202 ; SSE41-NEXT:    pmullw %xmm2, %xmm5
1203 ; SSE41-NEXT:    pand %xmm5, %xmm4
1204 ; SSE41-NEXT:    packuswb %xmm3, %xmm4
1205 ; SSE41-NEXT:    pxor %xmm2, %xmm2
1206 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]
1207 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm2[8],xmm0[9],xmm2[9],xmm0[10],xmm2[10],xmm0[11],xmm2[11],xmm0[12],xmm2[12],xmm0[13],xmm2[13],xmm0[14],xmm2[14],xmm0[15],xmm2[15]
1208 ; SSE41-NEXT:    pmullw %xmm1, %xmm0
1209 ; SSE41-NEXT:    psrlw $8, %xmm0
1210 ; SSE41-NEXT:    psrlw $8, %xmm5
1211 ; SSE41-NEXT:    packuswb %xmm0, %xmm5
1212 ; SSE41-NEXT:    pcmpeqb %xmm2, %xmm5
1213 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm3
1214 ; SSE41-NEXT:    pxor %xmm5, %xmm3
1215 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
1216 ; SSE41-NEXT:    pslld $31, %xmm0
1217 ; SSE41-NEXT:    psrad $31, %xmm0
1218 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,2,3]
1219 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
1220 ; SSE41-NEXT:    pslld $31, %xmm1
1221 ; SSE41-NEXT:    psrad $31, %xmm1
1222 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,0,1]
1223 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
1224 ; SSE41-NEXT:    pslld $31, %xmm2
1225 ; SSE41-NEXT:    psrad $31, %xmm2
1226 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[3,1,2,3]
1227 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
1228 ; SSE41-NEXT:    pslld $31, %xmm3
1229 ; SSE41-NEXT:    psrad $31, %xmm3
1230 ; SSE41-NEXT:    movdqa %xmm4, (%rdi)
1231 ; SSE41-NEXT:    retq
1233 ; AVX1-LABEL: umulo_v16i8:
1234 ; AVX1:       # %bb.0:
1235 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
1236 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1237 ; AVX1-NEXT:    vpmullw %xmm2, %xmm3, %xmm2
1238 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
1239 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
1240 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm4 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
1241 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1242 ; AVX1-NEXT:    vpmullw %xmm4, %xmm5, %xmm4
1243 ; AVX1-NEXT:    vpand %xmm3, %xmm4, %xmm3
1244 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm3, %xmm2
1245 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1246 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm1[8],xmm3[8],xmm1[9],xmm3[9],xmm1[10],xmm3[10],xmm1[11],xmm3[11],xmm1[12],xmm3[12],xmm1[13],xmm3[13],xmm1[14],xmm3[14],xmm1[15],xmm3[15]
1247 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8],xmm3[8],xmm0[9],xmm3[9],xmm0[10],xmm3[10],xmm0[11],xmm3[11],xmm0[12],xmm3[12],xmm0[13],xmm3[13],xmm0[14],xmm3[14],xmm0[15],xmm3[15]
1248 ; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1249 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
1250 ; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm1
1251 ; AVX1-NEXT:    vpackuswb %xmm0, %xmm1, %xmm0
1252 ; AVX1-NEXT:    vpcmpeqb %xmm3, %xmm0, %xmm0
1253 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1254 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm1
1255 ; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm0
1256 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[1,1,2,3]
1257 ; AVX1-NEXT:    vpmovsxbd %xmm3, %xmm3
1258 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
1259 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
1260 ; AVX1-NEXT:    vpmovsxbd %xmm3, %xmm3
1261 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[3,3,0,1]
1262 ; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1
1263 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm3, %ymm1
1264 ; AVX1-NEXT:    vmovdqa %xmm2, (%rdi)
1265 ; AVX1-NEXT:    retq
1267 ; AVX2-LABEL: umulo_v16i8:
1268 ; AVX2:       # %bb.0:
1269 ; AVX2-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1270 ; AVX2-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
1271 ; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1272 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm1
1273 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
1274 ; AVX2-NEXT:    vpackuswb %xmm2, %xmm1, %xmm2
1275 ; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
1276 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1277 ; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
1278 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1279 ; AVX2-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
1280 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1281 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm1
1282 ; AVX2-NEXT:    vpmovsxbd %xmm1, %ymm0
1283 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1284 ; AVX2-NEXT:    vpmovsxbd %xmm1, %ymm1
1285 ; AVX2-NEXT:    vmovdqa %xmm2, (%rdi)
1286 ; AVX2-NEXT:    retq
1288 ; AVX512-LABEL: umulo_v16i8:
1289 ; AVX512:       # %bb.0:
1290 ; AVX512-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1291 ; AVX512-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
1292 ; AVX512-NEXT:    vpmullw %ymm1, %ymm0, %ymm1
1293 ; AVX512-NEXT:    vpsrlw $8, %ymm1, %ymm0
1294 ; AVX512-NEXT:    vpmovwb %ymm0, %xmm0
1295 ; AVX512-NEXT:    vptestmb %xmm0, %xmm0, %k1
1296 ; AVX512-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1297 ; AVX512-NEXT:    vpmovwb %ymm1, (%rdi)
1298 ; AVX512-NEXT:    retq
1299   %t = call {<16 x i8>, <16 x i1>} @llvm.umul.with.overflow.v16i8(<16 x i8> %a0, <16 x i8> %a1)
1300   %val = extractvalue {<16 x i8>, <16 x i1>} %t, 0
1301   %obit = extractvalue {<16 x i8>, <16 x i1>} %t, 1
1302   %res = sext <16 x i1> %obit to <16 x i32>
1303   store <16 x i8> %val, <16 x i8>* %p2
1304   ret <16 x i32> %res
1307 define <8 x i32> @umulo_v8i16(<8 x i16> %a0, <8 x i16> %a1, <8 x i16>* %p2) nounwind {
1308 ; SSE2-LABEL: umulo_v8i16:
1309 ; SSE2:       # %bb.0:
1310 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1311 ; SSE2-NEXT:    pmullw %xmm1, %xmm2
1312 ; SSE2-NEXT:    pmulhuw %xmm1, %xmm0
1313 ; SSE2-NEXT:    pxor %xmm3, %xmm3
1314 ; SSE2-NEXT:    pcmpeqw %xmm0, %xmm3
1315 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
1316 ; SSE2-NEXT:    pxor %xmm3, %xmm1
1317 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1318 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1319 ; SSE2-NEXT:    pslld $31, %xmm0
1320 ; SSE2-NEXT:    psrad $31, %xmm0
1321 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1322 ; SSE2-NEXT:    pslld $31, %xmm1
1323 ; SSE2-NEXT:    psrad $31, %xmm1
1324 ; SSE2-NEXT:    movdqa %xmm2, (%rdi)
1325 ; SSE2-NEXT:    retq
1327 ; SSSE3-LABEL: umulo_v8i16:
1328 ; SSSE3:       # %bb.0:
1329 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
1330 ; SSSE3-NEXT:    pmullw %xmm1, %xmm2
1331 ; SSSE3-NEXT:    pmulhuw %xmm1, %xmm0
1332 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
1333 ; SSSE3-NEXT:    pcmpeqw %xmm0, %xmm3
1334 ; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm1
1335 ; SSSE3-NEXT:    pxor %xmm3, %xmm1
1336 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1337 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1338 ; SSSE3-NEXT:    pslld $31, %xmm0
1339 ; SSSE3-NEXT:    psrad $31, %xmm0
1340 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1341 ; SSSE3-NEXT:    pslld $31, %xmm1
1342 ; SSSE3-NEXT:    psrad $31, %xmm1
1343 ; SSSE3-NEXT:    movdqa %xmm2, (%rdi)
1344 ; SSSE3-NEXT:    retq
1346 ; SSE41-LABEL: umulo_v8i16:
1347 ; SSE41:       # %bb.0:
1348 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1349 ; SSE41-NEXT:    pmullw %xmm1, %xmm2
1350 ; SSE41-NEXT:    pmulhuw %xmm1, %xmm0
1351 ; SSE41-NEXT:    pxor %xmm3, %xmm3
1352 ; SSE41-NEXT:    pcmpeqw %xmm0, %xmm3
1353 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
1354 ; SSE41-NEXT:    pxor %xmm3, %xmm1
1355 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
1356 ; SSE41-NEXT:    pslld $31, %xmm0
1357 ; SSE41-NEXT:    psrad $31, %xmm0
1358 ; SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1359 ; SSE41-NEXT:    pslld $31, %xmm1
1360 ; SSE41-NEXT:    psrad $31, %xmm1
1361 ; SSE41-NEXT:    movdqa %xmm2, (%rdi)
1362 ; SSE41-NEXT:    retq
1364 ; AVX1-LABEL: umulo_v8i16:
1365 ; AVX1:       # %bb.0:
1366 ; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm2
1367 ; AVX1-NEXT:    vpmulhuw %xmm1, %xmm0, %xmm0
1368 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1369 ; AVX1-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
1370 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1371 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1372 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
1373 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1374 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
1375 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1376 ; AVX1-NEXT:    vmovdqa %xmm2, (%rdi)
1377 ; AVX1-NEXT:    retq
1379 ; AVX2-LABEL: umulo_v8i16:
1380 ; AVX2:       # %bb.0:
1381 ; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm2
1382 ; AVX2-NEXT:    vpmulhuw %xmm1, %xmm0, %xmm0
1383 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1384 ; AVX2-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
1385 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1386 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1387 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
1388 ; AVX2-NEXT:    vmovdqa %xmm2, (%rdi)
1389 ; AVX2-NEXT:    retq
1391 ; AVX512-LABEL: umulo_v8i16:
1392 ; AVX512:       # %bb.0:
1393 ; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm2
1394 ; AVX512-NEXT:    vpmulhuw %xmm1, %xmm0, %xmm0
1395 ; AVX512-NEXT:    vptestmw %xmm0, %xmm0, %k1
1396 ; AVX512-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
1397 ; AVX512-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}
1398 ; AVX512-NEXT:    vmovdqa %xmm2, (%rdi)
1399 ; AVX512-NEXT:    retq
1400   %t = call {<8 x i16>, <8 x i1>} @llvm.umul.with.overflow.v8i16(<8 x i16> %a0, <8 x i16> %a1)
1401   %val = extractvalue {<8 x i16>, <8 x i1>} %t, 0
1402   %obit = extractvalue {<8 x i16>, <8 x i1>} %t, 1
1403   %res = sext <8 x i1> %obit to <8 x i32>
1404   store <8 x i16> %val, <8 x i16>* %p2
1405   ret <8 x i32> %res
1408 define <2 x i32> @umulo_v2i64(<2 x i64> %a0, <2 x i64> %a1, <2 x i64>* %p2) nounwind {
1409 ; SSE2-LABEL: umulo_v2i64:
1410 ; SSE2:       # %bb.0:
1411 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
1412 ; SSE2-NEXT:    movq %xmm2, %r8
1413 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,0,1]
1414 ; SSE2-NEXT:    movq %xmm2, %r10
1415 ; SSE2-NEXT:    movq %xmm0, %rax
1416 ; SSE2-NEXT:    movq %xmm1, %rdx
1417 ; SSE2-NEXT:    xorl %ecx, %ecx
1418 ; SSE2-NEXT:    mulq %rdx
1419 ; SSE2-NEXT:    movq $-1, %r9
1420 ; SSE2-NEXT:    movl $0, %esi
1421 ; SSE2-NEXT:    cmovoq %r9, %rsi
1422 ; SSE2-NEXT:    movq %rax, %xmm1
1423 ; SSE2-NEXT:    movq %r8, %rax
1424 ; SSE2-NEXT:    mulq %r10
1425 ; SSE2-NEXT:    movq %rax, %xmm0
1426 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1427 ; SSE2-NEXT:    movq %rsi, %xmm0
1428 ; SSE2-NEXT:    cmovoq %r9, %rcx
1429 ; SSE2-NEXT:    movq %rcx, %xmm2
1430 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
1431 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1432 ; SSE2-NEXT:    movdqa %xmm1, (%rdi)
1433 ; SSE2-NEXT:    retq
1435 ; SSSE3-LABEL: umulo_v2i64:
1436 ; SSSE3:       # %bb.0:
1437 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
1438 ; SSSE3-NEXT:    movq %xmm2, %r8
1439 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,0,1]
1440 ; SSSE3-NEXT:    movq %xmm2, %r10
1441 ; SSSE3-NEXT:    movq %xmm0, %rax
1442 ; SSSE3-NEXT:    movq %xmm1, %rdx
1443 ; SSSE3-NEXT:    xorl %ecx, %ecx
1444 ; SSSE3-NEXT:    mulq %rdx
1445 ; SSSE3-NEXT:    movq $-1, %r9
1446 ; SSSE3-NEXT:    movl $0, %esi
1447 ; SSSE3-NEXT:    cmovoq %r9, %rsi
1448 ; SSSE3-NEXT:    movq %rax, %xmm1
1449 ; SSSE3-NEXT:    movq %r8, %rax
1450 ; SSSE3-NEXT:    mulq %r10
1451 ; SSSE3-NEXT:    movq %rax, %xmm0
1452 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1453 ; SSSE3-NEXT:    movq %rsi, %xmm0
1454 ; SSSE3-NEXT:    cmovoq %r9, %rcx
1455 ; SSSE3-NEXT:    movq %rcx, %xmm2
1456 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
1457 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1458 ; SSSE3-NEXT:    movdqa %xmm1, (%rdi)
1459 ; SSSE3-NEXT:    retq
1461 ; SSE41-LABEL: umulo_v2i64:
1462 ; SSE41:       # %bb.0:
1463 ; SSE41-NEXT:    movq %xmm0, %r10
1464 ; SSE41-NEXT:    movq %xmm1, %r8
1465 ; SSE41-NEXT:    pextrq $1, %xmm0, %rax
1466 ; SSE41-NEXT:    pextrq $1, %xmm1, %rdx
1467 ; SSE41-NEXT:    xorl %esi, %esi
1468 ; SSE41-NEXT:    mulq %rdx
1469 ; SSE41-NEXT:    movq $-1, %r9
1470 ; SSE41-NEXT:    movl $0, %ecx
1471 ; SSE41-NEXT:    cmovoq %r9, %rcx
1472 ; SSE41-NEXT:    movq %rax, %xmm0
1473 ; SSE41-NEXT:    movq %r10, %rax
1474 ; SSE41-NEXT:    mulq %r8
1475 ; SSE41-NEXT:    movq %rax, %xmm1
1476 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1477 ; SSE41-NEXT:    movq %rcx, %xmm0
1478 ; SSE41-NEXT:    cmovoq %r9, %rsi
1479 ; SSE41-NEXT:    movq %rsi, %xmm2
1480 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
1481 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
1482 ; SSE41-NEXT:    movdqa %xmm1, (%rdi)
1483 ; SSE41-NEXT:    retq
1485 ; AVX1-LABEL: umulo_v2i64:
1486 ; AVX1:       # %bb.0:
1487 ; AVX1-NEXT:    vmovq %xmm0, %r10
1488 ; AVX1-NEXT:    vmovq %xmm1, %r8
1489 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
1490 ; AVX1-NEXT:    vpextrq $1, %xmm1, %rdx
1491 ; AVX1-NEXT:    xorl %esi, %esi
1492 ; AVX1-NEXT:    mulq %rdx
1493 ; AVX1-NEXT:    movq $-1, %r9
1494 ; AVX1-NEXT:    movl $0, %ecx
1495 ; AVX1-NEXT:    cmovoq %r9, %rcx
1496 ; AVX1-NEXT:    vmovq %rax, %xmm0
1497 ; AVX1-NEXT:    movq %r10, %rax
1498 ; AVX1-NEXT:    mulq %r8
1499 ; AVX1-NEXT:    vmovq %rax, %xmm1
1500 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1501 ; AVX1-NEXT:    vmovq %rcx, %xmm0
1502 ; AVX1-NEXT:    cmovoq %r9, %rsi
1503 ; AVX1-NEXT:    vmovq %rsi, %xmm2
1504 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1505 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1506 ; AVX1-NEXT:    vmovdqa %xmm1, (%rdi)
1507 ; AVX1-NEXT:    retq
1509 ; AVX2-LABEL: umulo_v2i64:
1510 ; AVX2:       # %bb.0:
1511 ; AVX2-NEXT:    vmovq %xmm0, %r10
1512 ; AVX2-NEXT:    vmovq %xmm1, %r8
1513 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
1514 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rdx
1515 ; AVX2-NEXT:    xorl %esi, %esi
1516 ; AVX2-NEXT:    mulq %rdx
1517 ; AVX2-NEXT:    movq $-1, %r9
1518 ; AVX2-NEXT:    movl $0, %ecx
1519 ; AVX2-NEXT:    cmovoq %r9, %rcx
1520 ; AVX2-NEXT:    vmovq %rax, %xmm0
1521 ; AVX2-NEXT:    movq %r10, %rax
1522 ; AVX2-NEXT:    mulq %r8
1523 ; AVX2-NEXT:    vmovq %rax, %xmm1
1524 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1525 ; AVX2-NEXT:    vmovq %rcx, %xmm0
1526 ; AVX2-NEXT:    cmovoq %r9, %rsi
1527 ; AVX2-NEXT:    vmovq %rsi, %xmm2
1528 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1529 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1530 ; AVX2-NEXT:    vmovdqa %xmm1, (%rdi)
1531 ; AVX2-NEXT:    retq
1533 ; AVX512-LABEL: umulo_v2i64:
1534 ; AVX512:       # %bb.0:
1535 ; AVX512-NEXT:    vpextrq $1, %xmm0, %rcx
1536 ; AVX512-NEXT:    vpextrq $1, %xmm1, %r8
1537 ; AVX512-NEXT:    vmovq %xmm0, %rax
1538 ; AVX512-NEXT:    vmovq %xmm1, %rdx
1539 ; AVX512-NEXT:    mulq %rdx
1540 ; AVX512-NEXT:    movq %rax, %rsi
1541 ; AVX512-NEXT:    seto %r9b
1542 ; AVX512-NEXT:    movq %rcx, %rax
1543 ; AVX512-NEXT:    mulq %r8
1544 ; AVX512-NEXT:    vmovq %rax, %xmm0
1545 ; AVX512-NEXT:    vmovq %rsi, %xmm1
1546 ; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1547 ; AVX512-NEXT:    seto %al
1548 ; AVX512-NEXT:    kmovd %eax, %k0
1549 ; AVX512-NEXT:    kshiftlw $15, %k0, %k0
1550 ; AVX512-NEXT:    kshiftrw $14, %k0, %k0
1551 ; AVX512-NEXT:    kmovd %r9d, %k1
1552 ; AVX512-NEXT:    kshiftlw $15, %k1, %k1
1553 ; AVX512-NEXT:    kshiftrw $15, %k1, %k1
1554 ; AVX512-NEXT:    kshiftlw $2, %k0, %k2
1555 ; AVX512-NEXT:    korw %k2, %k1, %k1
1556 ; AVX512-NEXT:    korw %k1, %k0, %k1
1557 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
1558 ; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
1559 ; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)
1560 ; AVX512-NEXT:    retq
1561   %t = call {<2 x i64>, <2 x i1>} @llvm.umul.with.overflow.v2i64(<2 x i64> %a0, <2 x i64> %a1)
1562   %val = extractvalue {<2 x i64>, <2 x i1>} %t, 0
1563   %obit = extractvalue {<2 x i64>, <2 x i1>} %t, 1
1564   %res = sext <2 x i1> %obit to <2 x i32>
1565   store <2 x i64> %val, <2 x i64>* %p2
1566   ret <2 x i32> %res
1569 define <4 x i32> @umulo_v4i24(<4 x i24> %a0, <4 x i24> %a1, <4 x i24>* %p2) nounwind {
1570 ; SSE2-LABEL: umulo_v4i24:
1571 ; SSE2:       # %bb.0:
1572 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
1573 ; SSE2-NEXT:    pand %xmm2, %xmm1
1574 ; SSE2-NEXT:    pand %xmm2, %xmm0
1575 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
1576 ; SSE2-NEXT:    pmuludq %xmm1, %xmm0
1577 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]
1578 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1579 ; SSE2-NEXT:    pmuludq %xmm4, %xmm2
1580 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3]
1581 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
1582 ; SSE2-NEXT:    pxor %xmm4, %xmm4
1583 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm3
1584 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]
1585 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,2,2,3]
1586 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm5[0],xmm1[1],xmm5[1]
1587 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[3,1,2,3]
1588 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[2,3,0,1]
1589 ; SSE2-NEXT:    psrld $24, %xmm1
1590 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm1
1591 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
1592 ; SSE2-NEXT:    pxor %xmm4, %xmm3
1593 ; SSE2-NEXT:    pxor %xmm4, %xmm1
1594 ; SSE2-NEXT:    por %xmm3, %xmm1
1595 ; SSE2-NEXT:    movd %xmm0, %eax
1596 ; SSE2-NEXT:    movw %ax, (%rdi)
1597 ; SSE2-NEXT:    movd %xmm2, %ecx
1598 ; SSE2-NEXT:    movw %cx, 3(%rdi)
1599 ; SSE2-NEXT:    shrl $16, %eax
1600 ; SSE2-NEXT:    movb %al, 2(%rdi)
1601 ; SSE2-NEXT:    shrl $16, %ecx
1602 ; SSE2-NEXT:    movb %cl, 5(%rdi)
1603 ; SSE2-NEXT:    movd %xmm5, %eax
1604 ; SSE2-NEXT:    movw %ax, 9(%rdi)
1605 ; SSE2-NEXT:    movd %xmm6, %ecx
1606 ; SSE2-NEXT:    movw %cx, 6(%rdi)
1607 ; SSE2-NEXT:    shrl $16, %eax
1608 ; SSE2-NEXT:    movb %al, 11(%rdi)
1609 ; SSE2-NEXT:    shrl $16, %ecx
1610 ; SSE2-NEXT:    movb %cl, 8(%rdi)
1611 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1612 ; SSE2-NEXT:    retq
1614 ; SSSE3-LABEL: umulo_v4i24:
1615 ; SSSE3:       # %bb.0:
1616 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
1617 ; SSSE3-NEXT:    pand %xmm2, %xmm1
1618 ; SSSE3-NEXT:    pand %xmm2, %xmm0
1619 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
1620 ; SSSE3-NEXT:    pmuludq %xmm1, %xmm0
1621 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]
1622 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1623 ; SSSE3-NEXT:    pmuludq %xmm4, %xmm2
1624 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3]
1625 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
1626 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
1627 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm3
1628 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]
1629 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,2,2,3]
1630 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm5[0],xmm1[1],xmm5[1]
1631 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[3,1,2,3]
1632 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[2,3,0,1]
1633 ; SSSE3-NEXT:    psrld $24, %xmm1
1634 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm1
1635 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm4
1636 ; SSSE3-NEXT:    pxor %xmm4, %xmm3
1637 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
1638 ; SSSE3-NEXT:    por %xmm3, %xmm1
1639 ; SSSE3-NEXT:    movd %xmm0, %eax
1640 ; SSSE3-NEXT:    movw %ax, (%rdi)
1641 ; SSSE3-NEXT:    movd %xmm2, %ecx
1642 ; SSSE3-NEXT:    movw %cx, 3(%rdi)
1643 ; SSSE3-NEXT:    shrl $16, %eax
1644 ; SSSE3-NEXT:    movb %al, 2(%rdi)
1645 ; SSSE3-NEXT:    shrl $16, %ecx
1646 ; SSSE3-NEXT:    movb %cl, 5(%rdi)
1647 ; SSSE3-NEXT:    movd %xmm5, %eax
1648 ; SSSE3-NEXT:    movw %ax, 9(%rdi)
1649 ; SSSE3-NEXT:    movd %xmm6, %ecx
1650 ; SSSE3-NEXT:    movw %cx, 6(%rdi)
1651 ; SSSE3-NEXT:    shrl $16, %eax
1652 ; SSSE3-NEXT:    movb %al, 11(%rdi)
1653 ; SSSE3-NEXT:    shrl $16, %ecx
1654 ; SSSE3-NEXT:    movb %cl, 8(%rdi)
1655 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1656 ; SSSE3-NEXT:    retq
1658 ; SSE41-LABEL: umulo_v4i24:
1659 ; SSE41:       # %bb.0:
1660 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1661 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
1662 ; SSE41-NEXT:    pand %xmm0, %xmm2
1663 ; SSE41-NEXT:    pand %xmm0, %xmm1
1664 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1665 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
1666 ; SSE41-NEXT:    pmuludq %xmm0, %xmm3
1667 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1668 ; SSE41-NEXT:    pmuludq %xmm1, %xmm0
1669 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
1670 ; SSE41-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm3[2,3],xmm4[4,5],xmm3[6,7]
1671 ; SSE41-NEXT:    pxor %xmm0, %xmm0
1672 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
1673 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm3
1674 ; SSE41-NEXT:    pxor %xmm3, %xmm4
1675 ; SSE41-NEXT:    pmulld %xmm2, %xmm1
1676 ; SSE41-NEXT:    pextrd $3, %xmm1, %eax
1677 ; SSE41-NEXT:    pextrd $2, %xmm1, %ecx
1678 ; SSE41-NEXT:    pextrd $1, %xmm1, %edx
1679 ; SSE41-NEXT:    movd %xmm1, %esi
1680 ; SSE41-NEXT:    psrld $24, %xmm1
1681 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
1682 ; SSE41-NEXT:    pxor %xmm3, %xmm0
1683 ; SSE41-NEXT:    por %xmm4, %xmm0
1684 ; SSE41-NEXT:    movw %ax, 9(%rdi)
1685 ; SSE41-NEXT:    movw %cx, 6(%rdi)
1686 ; SSE41-NEXT:    movw %dx, 3(%rdi)
1687 ; SSE41-NEXT:    movw %si, (%rdi)
1688 ; SSE41-NEXT:    shrl $16, %eax
1689 ; SSE41-NEXT:    movb %al, 11(%rdi)
1690 ; SSE41-NEXT:    shrl $16, %ecx
1691 ; SSE41-NEXT:    movb %cl, 8(%rdi)
1692 ; SSE41-NEXT:    shrl $16, %edx
1693 ; SSE41-NEXT:    movb %dl, 5(%rdi)
1694 ; SSE41-NEXT:    shrl $16, %esi
1695 ; SSE41-NEXT:    movb %sil, 2(%rdi)
1696 ; SSE41-NEXT:    retq
1698 ; AVX1-LABEL: umulo_v4i24:
1699 ; AVX1:       # %bb.0:
1700 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [2.35098856E-38,2.35098856E-38,2.35098856E-38,2.35098856E-38]
1701 ; AVX1-NEXT:    vandps %xmm2, %xmm0, %xmm0
1702 ; AVX1-NEXT:    vandps %xmm2, %xmm1, %xmm1
1703 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm2 = xmm1[1,1,3,3]
1704 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm3 = xmm0[1,1,3,3]
1705 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm3, %xmm2
1706 ; AVX1-NEXT:    vpmuludq %xmm1, %xmm0, %xmm3
1707 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1708 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
1709 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1710 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
1711 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
1712 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
1713 ; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm1
1714 ; AVX1-NEXT:    vpsrld $24, %xmm1, %xmm0
1715 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm0, %xmm0
1716 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
1717 ; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
1718 ; AVX1-NEXT:    vpextrd $3, %xmm1, %eax
1719 ; AVX1-NEXT:    movw %ax, 9(%rdi)
1720 ; AVX1-NEXT:    vpextrd $2, %xmm1, %ecx
1721 ; AVX1-NEXT:    movw %cx, 6(%rdi)
1722 ; AVX1-NEXT:    vpextrd $1, %xmm1, %edx
1723 ; AVX1-NEXT:    movw %dx, 3(%rdi)
1724 ; AVX1-NEXT:    vmovd %xmm1, %esi
1725 ; AVX1-NEXT:    movw %si, (%rdi)
1726 ; AVX1-NEXT:    shrl $16, %eax
1727 ; AVX1-NEXT:    movb %al, 11(%rdi)
1728 ; AVX1-NEXT:    shrl $16, %ecx
1729 ; AVX1-NEXT:    movb %cl, 8(%rdi)
1730 ; AVX1-NEXT:    shrl $16, %edx
1731 ; AVX1-NEXT:    movb %dl, 5(%rdi)
1732 ; AVX1-NEXT:    shrl $16, %esi
1733 ; AVX1-NEXT:    movb %sil, 2(%rdi)
1734 ; AVX1-NEXT:    retq
1736 ; AVX2-LABEL: umulo_v4i24:
1737 ; AVX2:       # %bb.0:
1738 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [16777215,16777215,16777215,16777215]
1739 ; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
1740 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
1741 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1742 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
1743 ; AVX2-NEXT:    vpmuludq %xmm2, %xmm3, %xmm2
1744 ; AVX2-NEXT:    vpmuludq %xmm1, %xmm0, %xmm3
1745 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1746 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm2 = xmm3[0],xmm2[1],xmm3[2],xmm2[3]
1747 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1748 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
1749 ; AVX2-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
1750 ; AVX2-NEXT:    vpxor %xmm4, %xmm2, %xmm2
1751 ; AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm1
1752 ; AVX2-NEXT:    vpsrld $24, %xmm1, %xmm0
1753 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm0, %xmm0
1754 ; AVX2-NEXT:    vpxor %xmm4, %xmm0, %xmm0
1755 ; AVX2-NEXT:    vpor %xmm2, %xmm0, %xmm0
1756 ; AVX2-NEXT:    vpextrd $3, %xmm1, %eax
1757 ; AVX2-NEXT:    movw %ax, 9(%rdi)
1758 ; AVX2-NEXT:    vpextrd $2, %xmm1, %ecx
1759 ; AVX2-NEXT:    movw %cx, 6(%rdi)
1760 ; AVX2-NEXT:    vpextrd $1, %xmm1, %edx
1761 ; AVX2-NEXT:    movw %dx, 3(%rdi)
1762 ; AVX2-NEXT:    vmovd %xmm1, %esi
1763 ; AVX2-NEXT:    movw %si, (%rdi)
1764 ; AVX2-NEXT:    shrl $16, %eax
1765 ; AVX2-NEXT:    movb %al, 11(%rdi)
1766 ; AVX2-NEXT:    shrl $16, %ecx
1767 ; AVX2-NEXT:    movb %cl, 8(%rdi)
1768 ; AVX2-NEXT:    shrl $16, %edx
1769 ; AVX2-NEXT:    movb %dl, 5(%rdi)
1770 ; AVX2-NEXT:    shrl $16, %esi
1771 ; AVX2-NEXT:    movb %sil, 2(%rdi)
1772 ; AVX2-NEXT:    retq
1774 ; AVX512-LABEL: umulo_v4i24:
1775 ; AVX512:       # %bb.0:
1776 ; AVX512-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [16777215,16777215,16777215,16777215]
1777 ; AVX512-NEXT:    vpand %xmm2, %xmm1, %xmm1
1778 ; AVX512-NEXT:    vpand %xmm2, %xmm0, %xmm0
1779 ; AVX512-NEXT:    vpmuludq %xmm1, %xmm0, %xmm2
1780 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
1781 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
1782 ; AVX512-NEXT:    vpmuludq %xmm3, %xmm4, %xmm3
1783 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm4 = [1,5,3,7]
1784 ; AVX512-NEXT:    vpermi2d %xmm3, %xmm2, %xmm4
1785 ; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm1
1786 ; AVX512-NEXT:    vpsrld $24, %xmm1, %xmm0
1787 ; AVX512-NEXT:    vpor %xmm4, %xmm0, %xmm0
1788 ; AVX512-NEXT:    vptestmd %xmm0, %xmm0, %k1
1789 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
1790 ; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
1791 ; AVX512-NEXT:    vpextrd $3, %xmm1, %eax
1792 ; AVX512-NEXT:    movw %ax, 9(%rdi)
1793 ; AVX512-NEXT:    vpextrd $2, %xmm1, %ecx
1794 ; AVX512-NEXT:    movw %cx, 6(%rdi)
1795 ; AVX512-NEXT:    vpextrd $1, %xmm1, %edx
1796 ; AVX512-NEXT:    movw %dx, 3(%rdi)
1797 ; AVX512-NEXT:    vmovd %xmm1, %esi
1798 ; AVX512-NEXT:    movw %si, (%rdi)
1799 ; AVX512-NEXT:    shrl $16, %eax
1800 ; AVX512-NEXT:    movb %al, 11(%rdi)
1801 ; AVX512-NEXT:    shrl $16, %ecx
1802 ; AVX512-NEXT:    movb %cl, 8(%rdi)
1803 ; AVX512-NEXT:    shrl $16, %edx
1804 ; AVX512-NEXT:    movb %dl, 5(%rdi)
1805 ; AVX512-NEXT:    shrl $16, %esi
1806 ; AVX512-NEXT:    movb %sil, 2(%rdi)
1807 ; AVX512-NEXT:    retq
1808   %t = call {<4 x i24>, <4 x i1>} @llvm.umul.with.overflow.v4i24(<4 x i24> %a0, <4 x i24> %a1)
1809   %val = extractvalue {<4 x i24>, <4 x i1>} %t, 0
1810   %obit = extractvalue {<4 x i24>, <4 x i1>} %t, 1
1811   %res = sext <4 x i1> %obit to <4 x i32>
1812   store <4 x i24> %val, <4 x i24>* %p2
1813   ret <4 x i32> %res
1816 define <4 x i32> @umulo_v4i1(<4 x i1> %a0, <4 x i1> %a1, <4 x i1>* %p2) nounwind {
1817 ; SSE2-LABEL: umulo_v4i1:
1818 ; SSE2:       # %bb.0:
1819 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [1,1,1,1]
1820 ; SSE2-NEXT:    pand %xmm2, %xmm1
1821 ; SSE2-NEXT:    pand %xmm2, %xmm0
1822 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
1823 ; SSE2-NEXT:    pmuludq %xmm1, %xmm0
1824 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]
1825 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1826 ; SSE2-NEXT:    pmuludq %xmm2, %xmm1
1827 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]
1828 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
1829 ; SSE2-NEXT:    pxor %xmm2, %xmm2
1830 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
1831 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
1832 ; SSE2-NEXT:    pxor %xmm4, %xmm3
1833 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,2,2,3]
1834 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1835 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1]
1836 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
1837 ; SSE2-NEXT:    psrld $1, %xmm0
1838 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm0
1839 ; SSE2-NEXT:    pxor %xmm4, %xmm0
1840 ; SSE2-NEXT:    por %xmm3, %xmm0
1841 ; SSE2-NEXT:    pslld $31, %xmm5
1842 ; SSE2-NEXT:    movmskps %xmm5, %eax
1843 ; SSE2-NEXT:    movb %al, (%rdi)
1844 ; SSE2-NEXT:    retq
1846 ; SSSE3-LABEL: umulo_v4i1:
1847 ; SSSE3:       # %bb.0:
1848 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [1,1,1,1]
1849 ; SSSE3-NEXT:    pand %xmm2, %xmm1
1850 ; SSSE3-NEXT:    pand %xmm2, %xmm0
1851 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
1852 ; SSSE3-NEXT:    pmuludq %xmm1, %xmm0
1853 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]
1854 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1855 ; SSSE3-NEXT:    pmuludq %xmm2, %xmm1
1856 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]
1857 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
1858 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
1859 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm3
1860 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm4
1861 ; SSSE3-NEXT:    pxor %xmm4, %xmm3
1862 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,2,2,3]
1863 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1864 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1]
1865 ; SSSE3-NEXT:    movdqa %xmm5, %xmm0
1866 ; SSSE3-NEXT:    psrld $1, %xmm0
1867 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm0
1868 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
1869 ; SSSE3-NEXT:    por %xmm3, %xmm0
1870 ; SSSE3-NEXT:    pslld $31, %xmm5
1871 ; SSSE3-NEXT:    movmskps %xmm5, %eax
1872 ; SSSE3-NEXT:    movb %al, (%rdi)
1873 ; SSSE3-NEXT:    retq
1875 ; SSE41-LABEL: umulo_v4i1:
1876 ; SSE41:       # %bb.0:
1877 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [1,1,1,1]
1878 ; SSE41-NEXT:    pand %xmm2, %xmm0
1879 ; SSE41-NEXT:    pand %xmm2, %xmm1
1880 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1881 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
1882 ; SSE41-NEXT:    pmuludq %xmm2, %xmm3
1883 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1884 ; SSE41-NEXT:    pmuludq %xmm1, %xmm2
1885 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
1886 ; SSE41-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm3[2,3],xmm4[4,5],xmm3[6,7]
1887 ; SSE41-NEXT:    pxor %xmm2, %xmm2
1888 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm4
1889 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm3
1890 ; SSE41-NEXT:    pxor %xmm3, %xmm4
1891 ; SSE41-NEXT:    pmaddwd %xmm0, %xmm1
1892 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1893 ; SSE41-NEXT:    psrld $1, %xmm0
1894 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
1895 ; SSE41-NEXT:    pxor %xmm3, %xmm2
1896 ; SSE41-NEXT:    por %xmm4, %xmm2
1897 ; SSE41-NEXT:    pslld $31, %xmm1
1898 ; SSE41-NEXT:    movmskps %xmm1, %eax
1899 ; SSE41-NEXT:    movb %al, (%rdi)
1900 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1901 ; SSE41-NEXT:    retq
1903 ; AVX1-LABEL: umulo_v4i1:
1904 ; AVX1:       # %bb.0:
1905 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [1,1,1,1]
1906 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
1907 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
1908 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1909 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
1910 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm3, %xmm2
1911 ; AVX1-NEXT:    vpmuludq %xmm1, %xmm0, %xmm3
1912 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1913 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
1914 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1915 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
1916 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
1917 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
1918 ; AVX1-NEXT:    vpmaddwd %xmm1, %xmm0, %xmm1
1919 ; AVX1-NEXT:    vpsrld $1, %xmm1, %xmm0
1920 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm0, %xmm0
1921 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
1922 ; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
1923 ; AVX1-NEXT:    vpslld $31, %xmm1, %xmm1
1924 ; AVX1-NEXT:    vmovmskps %xmm1, %eax
1925 ; AVX1-NEXT:    movb %al, (%rdi)
1926 ; AVX1-NEXT:    retq
1928 ; AVX2-LABEL: umulo_v4i1:
1929 ; AVX2:       # %bb.0:
1930 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [1,1,1,1]
1931 ; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
1932 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
1933 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1934 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
1935 ; AVX2-NEXT:    vpmuludq %xmm2, %xmm3, %xmm2
1936 ; AVX2-NEXT:    vpmuludq %xmm1, %xmm0, %xmm3
1937 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1938 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm2 = xmm3[0],xmm2[1],xmm3[2],xmm2[3]
1939 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1940 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
1941 ; AVX2-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
1942 ; AVX2-NEXT:    vpxor %xmm4, %xmm2, %xmm2
1943 ; AVX2-NEXT:    vpmaddwd %xmm1, %xmm0, %xmm1
1944 ; AVX2-NEXT:    vpsrld $1, %xmm1, %xmm0
1945 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm0, %xmm0
1946 ; AVX2-NEXT:    vpxor %xmm4, %xmm0, %xmm0
1947 ; AVX2-NEXT:    vpor %xmm2, %xmm0, %xmm0
1948 ; AVX2-NEXT:    vpslld $31, %xmm1, %xmm1
1949 ; AVX2-NEXT:    vmovmskps %xmm1, %eax
1950 ; AVX2-NEXT:    movb %al, (%rdi)
1951 ; AVX2-NEXT:    retq
1953 ; AVX512-LABEL: umulo_v4i1:
1954 ; AVX512:       # %bb.0:
1955 ; AVX512-NEXT:    pushq %rbx
1956 ; AVX512-NEXT:    vpslld $31, %xmm0, %xmm0
1957 ; AVX512-NEXT:    vptestmd %xmm0, %xmm0, %k0
1958 ; AVX512-NEXT:    kshiftrw $3, %k0, %k1
1959 ; AVX512-NEXT:    kmovd %k1, %r9d
1960 ; AVX512-NEXT:    andb $1, %r9b
1961 ; AVX512-NEXT:    vpslld $31, %xmm1, %xmm0
1962 ; AVX512-NEXT:    vptestmd %xmm0, %xmm0, %k1
1963 ; AVX512-NEXT:    kshiftrw $3, %k1, %k2
1964 ; AVX512-NEXT:    kmovd %k2, %r10d
1965 ; AVX512-NEXT:    andb $1, %r10b
1966 ; AVX512-NEXT:    kshiftrw $2, %k0, %k2
1967 ; AVX512-NEXT:    kmovd %k2, %r11d
1968 ; AVX512-NEXT:    andb $1, %r11b
1969 ; AVX512-NEXT:    kshiftrw $2, %k1, %k2
1970 ; AVX512-NEXT:    kmovd %k2, %ebx
1971 ; AVX512-NEXT:    andb $1, %bl
1972 ; AVX512-NEXT:    kshiftrw $1, %k0, %k2
1973 ; AVX512-NEXT:    kmovd %k2, %edx
1974 ; AVX512-NEXT:    andb $1, %dl
1975 ; AVX512-NEXT:    kshiftrw $1, %k1, %k2
1976 ; AVX512-NEXT:    kmovd %k2, %esi
1977 ; AVX512-NEXT:    andb $1, %sil
1978 ; AVX512-NEXT:    kmovd %k0, %eax
1979 ; AVX512-NEXT:    andb $1, %al
1980 ; AVX512-NEXT:    kmovd %k1, %ecx
1981 ; AVX512-NEXT:    andb $1, %cl
1982 ; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1983 ; AVX512-NEXT:    mulb %cl
1984 ; AVX512-NEXT:    movl %eax, %r8d
1985 ; AVX512-NEXT:    seto %al
1986 ; AVX512-NEXT:    testb $-2, %r8b
1987 ; AVX512-NEXT:    setne %cl
1988 ; AVX512-NEXT:    orb %al, %cl
1989 ; AVX512-NEXT:    setne %al
1990 ; AVX512-NEXT:    kmovd %eax, %k0
1991 ; AVX512-NEXT:    kshiftlw $15, %k0, %k0
1992 ; AVX512-NEXT:    kshiftrw $15, %k0, %k1
1993 ; AVX512-NEXT:    kshiftlw $2, %k0, %k0
1994 ; AVX512-NEXT:    movl %edx, %eax
1995 ; AVX512-NEXT:    mulb %sil
1996 ; AVX512-NEXT:    movl %eax, %edx
1997 ; AVX512-NEXT:    seto %al
1998 ; AVX512-NEXT:    testb $-2, %dl
1999 ; AVX512-NEXT:    setne %cl
2000 ; AVX512-NEXT:    orb %al, %cl
2001 ; AVX512-NEXT:    setne %al
2002 ; AVX512-NEXT:    kmovd %eax, %k2
2003 ; AVX512-NEXT:    kshiftlw $1, %k2, %k2
2004 ; AVX512-NEXT:    korw %k2, %k0, %k2
2005 ; AVX512-NEXT:    korw %k2, %k1, %k1
2006 ; AVX512-NEXT:    kshiftlw $14, %k1, %k1
2007 ; AVX512-NEXT:    kshiftrw $14, %k1, %k1
2008 ; AVX512-NEXT:    kshiftlw $3, %k0, %k2
2009 ; AVX512-NEXT:    movl %r11d, %eax
2010 ; AVX512-NEXT:    mulb %bl
2011 ; AVX512-NEXT:    movl %eax, %esi
2012 ; AVX512-NEXT:    seto %al
2013 ; AVX512-NEXT:    testb $-2, %sil
2014 ; AVX512-NEXT:    setne %cl
2015 ; AVX512-NEXT:    orb %al, %cl
2016 ; AVX512-NEXT:    setne %al
2017 ; AVX512-NEXT:    kmovd %eax, %k3
2018 ; AVX512-NEXT:    kshiftlw $2, %k3, %k3
2019 ; AVX512-NEXT:    korw %k3, %k2, %k2
2020 ; AVX512-NEXT:    korw %k2, %k1, %k1
2021 ; AVX512-NEXT:    kshiftlw $13, %k1, %k1
2022 ; AVX512-NEXT:    kshiftrw $13, %k1, %k1
2023 ; AVX512-NEXT:    movl %r9d, %eax
2024 ; AVX512-NEXT:    mulb %r10b
2025 ; AVX512-NEXT:    # kill: def $al killed $al def $eax
2026 ; AVX512-NEXT:    seto %cl
2027 ; AVX512-NEXT:    testb $-2, %al
2028 ; AVX512-NEXT:    setne %bl
2029 ; AVX512-NEXT:    orb %cl, %bl
2030 ; AVX512-NEXT:    setne %cl
2031 ; AVX512-NEXT:    kmovd %ecx, %k2
2032 ; AVX512-NEXT:    kshiftlw $3, %k2, %k2
2033 ; AVX512-NEXT:    korw %k2, %k1, %k1
2034 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
2035 ; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
2036 ; AVX512-NEXT:    kmovd %r8d, %k1
2037 ; AVX512-NEXT:    kshiftlw $15, %k1, %k1
2038 ; AVX512-NEXT:    kshiftrw $15, %k1, %k1
2039 ; AVX512-NEXT:    kmovd %edx, %k2
2040 ; AVX512-NEXT:    kshiftlw $15, %k2, %k2
2041 ; AVX512-NEXT:    kshiftrw $14, %k2, %k2
2042 ; AVX512-NEXT:    korw %k2, %k0, %k0
2043 ; AVX512-NEXT:    korw %k0, %k1, %k0
2044 ; AVX512-NEXT:    kshiftrw $3, %k0, %k1
2045 ; AVX512-NEXT:    kshiftlw $3, %k1, %k1
2046 ; AVX512-NEXT:    kshiftlw $14, %k0, %k0
2047 ; AVX512-NEXT:    kshiftrw $14, %k0, %k0
2048 ; AVX512-NEXT:    kmovd %esi, %k2
2049 ; AVX512-NEXT:    kshiftlw $15, %k2, %k2
2050 ; AVX512-NEXT:    kshiftrw $13, %k2, %k2
2051 ; AVX512-NEXT:    korw %k2, %k1, %k1
2052 ; AVX512-NEXT:    korw %k1, %k0, %k0
2053 ; AVX512-NEXT:    kshiftrw $4, %k0, %k1
2054 ; AVX512-NEXT:    kshiftlw $4, %k1, %k1
2055 ; AVX512-NEXT:    kshiftlw $13, %k0, %k0
2056 ; AVX512-NEXT:    kshiftrw $13, %k0, %k0
2057 ; AVX512-NEXT:    korw %k1, %k0, %k0
2058 ; AVX512-NEXT:    kmovd %eax, %k1
2059 ; AVX512-NEXT:    kshiftlw $15, %k1, %k1
2060 ; AVX512-NEXT:    kshiftrw $12, %k1, %k1
2061 ; AVX512-NEXT:    korw %k0, %k1, %k0
2062 ; AVX512-NEXT:    kmovd %k0, %eax
2063 ; AVX512-NEXT:    movb %al, (%rdi)
2064 ; AVX512-NEXT:    popq %rbx
2065 ; AVX512-NEXT:    retq
2066   %t = call {<4 x i1>, <4 x i1>} @llvm.umul.with.overflow.v4i1(<4 x i1> %a0, <4 x i1> %a1)
2067   %val = extractvalue {<4 x i1>, <4 x i1>} %t, 0
2068   %obit = extractvalue {<4 x i1>, <4 x i1>} %t, 1
2069   %res = sext <4 x i1> %obit to <4 x i32>
2070   store <4 x i1> %val, <4 x i1>* %p2
2071   ret <4 x i32> %res
2074 define <2 x i32> @umulo_v2i128(<2 x i128> %a0, <2 x i128> %a1, <2 x i128>* %p2) nounwind {
2075 ; SSE2-LABEL: umulo_v2i128:
2076 ; SSE2:       # %bb.0:
2077 ; SSE2-NEXT:    pushq %rbp
2078 ; SSE2-NEXT:    pushq %r15
2079 ; SSE2-NEXT:    pushq %r14
2080 ; SSE2-NEXT:    pushq %r13
2081 ; SSE2-NEXT:    pushq %r12
2082 ; SSE2-NEXT:    pushq %rbx
2083 ; SSE2-NEXT:    movq %r9, %r10
2084 ; SSE2-NEXT:    movq %rcx, %r12
2085 ; SSE2-NEXT:    movq %rdx, %r11
2086 ; SSE2-NEXT:    movq %rsi, %rax
2087 ; SSE2-NEXT:    movq {{[0-9]+}}(%rsp), %r14
2088 ; SSE2-NEXT:    movq {{[0-9]+}}(%rsp), %r15
2089 ; SSE2-NEXT:    movq {{[0-9]+}}(%rsp), %r9
2090 ; SSE2-NEXT:    testq %r10, %r10
2091 ; SSE2-NEXT:    setne %cl
2092 ; SSE2-NEXT:    testq %rsi, %rsi
2093 ; SSE2-NEXT:    setne %r13b
2094 ; SSE2-NEXT:    andb %cl, %r13b
2095 ; SSE2-NEXT:    mulq %r8
2096 ; SSE2-NEXT:    movq %rax, %rsi
2097 ; SSE2-NEXT:    seto %bpl
2098 ; SSE2-NEXT:    movq %r10, %rax
2099 ; SSE2-NEXT:    mulq %rdi
2100 ; SSE2-NEXT:    movq %rax, %rcx
2101 ; SSE2-NEXT:    seto %bl
2102 ; SSE2-NEXT:    orb %bpl, %bl
2103 ; SSE2-NEXT:    addq %rsi, %rcx
2104 ; SSE2-NEXT:    movq %rdi, %rax
2105 ; SSE2-NEXT:    mulq %r8
2106 ; SSE2-NEXT:    movq %rax, %rdi
2107 ; SSE2-NEXT:    movq %rdx, %rsi
2108 ; SSE2-NEXT:    addq %rcx, %rsi
2109 ; SSE2-NEXT:    setb %cl
2110 ; SSE2-NEXT:    orb %bl, %cl
2111 ; SSE2-NEXT:    orb %r13b, %cl
2112 ; SSE2-NEXT:    testq %r9, %r9
2113 ; SSE2-NEXT:    setne %al
2114 ; SSE2-NEXT:    testq %r12, %r12
2115 ; SSE2-NEXT:    setne %r8b
2116 ; SSE2-NEXT:    andb %al, %r8b
2117 ; SSE2-NEXT:    movq %r12, %rax
2118 ; SSE2-NEXT:    mulq %r15
2119 ; SSE2-NEXT:    movq %rax, %rbp
2120 ; SSE2-NEXT:    seto %r10b
2121 ; SSE2-NEXT:    movq %r9, %rax
2122 ; SSE2-NEXT:    mulq %r11
2123 ; SSE2-NEXT:    movq %rax, %rbx
2124 ; SSE2-NEXT:    seto %r9b
2125 ; SSE2-NEXT:    orb %r10b, %r9b
2126 ; SSE2-NEXT:    addq %rbp, %rbx
2127 ; SSE2-NEXT:    movq %r11, %rax
2128 ; SSE2-NEXT:    mulq %r15
2129 ; SSE2-NEXT:    addq %rbx, %rdx
2130 ; SSE2-NEXT:    setb %bl
2131 ; SSE2-NEXT:    orb %r9b, %bl
2132 ; SSE2-NEXT:    orb %r8b, %bl
2133 ; SSE2-NEXT:    movzbl %bl, %ebp
2134 ; SSE2-NEXT:    negl %ebp
2135 ; SSE2-NEXT:    movd %ebp, %xmm1
2136 ; SSE2-NEXT:    movzbl %cl, %ecx
2137 ; SSE2-NEXT:    negl %ecx
2138 ; SSE2-NEXT:    movd %ecx, %xmm0
2139 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2140 ; SSE2-NEXT:    movq %rax, 16(%r14)
2141 ; SSE2-NEXT:    movq %rdi, (%r14)
2142 ; SSE2-NEXT:    movq %rdx, 24(%r14)
2143 ; SSE2-NEXT:    movq %rsi, 8(%r14)
2144 ; SSE2-NEXT:    popq %rbx
2145 ; SSE2-NEXT:    popq %r12
2146 ; SSE2-NEXT:    popq %r13
2147 ; SSE2-NEXT:    popq %r14
2148 ; SSE2-NEXT:    popq %r15
2149 ; SSE2-NEXT:    popq %rbp
2150 ; SSE2-NEXT:    retq
2152 ; SSSE3-LABEL: umulo_v2i128:
2153 ; SSSE3:       # %bb.0:
2154 ; SSSE3-NEXT:    pushq %rbp
2155 ; SSSE3-NEXT:    pushq %r15
2156 ; SSSE3-NEXT:    pushq %r14
2157 ; SSSE3-NEXT:    pushq %r13
2158 ; SSSE3-NEXT:    pushq %r12
2159 ; SSSE3-NEXT:    pushq %rbx
2160 ; SSSE3-NEXT:    movq %r9, %r10
2161 ; SSSE3-NEXT:    movq %rcx, %r12
2162 ; SSSE3-NEXT:    movq %rdx, %r11
2163 ; SSSE3-NEXT:    movq %rsi, %rax
2164 ; SSSE3-NEXT:    movq {{[0-9]+}}(%rsp), %r14
2165 ; SSSE3-NEXT:    movq {{[0-9]+}}(%rsp), %r15
2166 ; SSSE3-NEXT:    movq {{[0-9]+}}(%rsp), %r9
2167 ; SSSE3-NEXT:    testq %r10, %r10
2168 ; SSSE3-NEXT:    setne %cl
2169 ; SSSE3-NEXT:    testq %rsi, %rsi
2170 ; SSSE3-NEXT:    setne %r13b
2171 ; SSSE3-NEXT:    andb %cl, %r13b
2172 ; SSSE3-NEXT:    mulq %r8
2173 ; SSSE3-NEXT:    movq %rax, %rsi
2174 ; SSSE3-NEXT:    seto %bpl
2175 ; SSSE3-NEXT:    movq %r10, %rax
2176 ; SSSE3-NEXT:    mulq %rdi
2177 ; SSSE3-NEXT:    movq %rax, %rcx
2178 ; SSSE3-NEXT:    seto %bl
2179 ; SSSE3-NEXT:    orb %bpl, %bl
2180 ; SSSE3-NEXT:    addq %rsi, %rcx
2181 ; SSSE3-NEXT:    movq %rdi, %rax
2182 ; SSSE3-NEXT:    mulq %r8
2183 ; SSSE3-NEXT:    movq %rax, %rdi
2184 ; SSSE3-NEXT:    movq %rdx, %rsi
2185 ; SSSE3-NEXT:    addq %rcx, %rsi
2186 ; SSSE3-NEXT:    setb %cl
2187 ; SSSE3-NEXT:    orb %bl, %cl
2188 ; SSSE3-NEXT:    orb %r13b, %cl
2189 ; SSSE3-NEXT:    testq %r9, %r9
2190 ; SSSE3-NEXT:    setne %al
2191 ; SSSE3-NEXT:    testq %r12, %r12
2192 ; SSSE3-NEXT:    setne %r8b
2193 ; SSSE3-NEXT:    andb %al, %r8b
2194 ; SSSE3-NEXT:    movq %r12, %rax
2195 ; SSSE3-NEXT:    mulq %r15
2196 ; SSSE3-NEXT:    movq %rax, %rbp
2197 ; SSSE3-NEXT:    seto %r10b
2198 ; SSSE3-NEXT:    movq %r9, %rax
2199 ; SSSE3-NEXT:    mulq %r11
2200 ; SSSE3-NEXT:    movq %rax, %rbx
2201 ; SSSE3-NEXT:    seto %r9b
2202 ; SSSE3-NEXT:    orb %r10b, %r9b
2203 ; SSSE3-NEXT:    addq %rbp, %rbx
2204 ; SSSE3-NEXT:    movq %r11, %rax
2205 ; SSSE3-NEXT:    mulq %r15
2206 ; SSSE3-NEXT:    addq %rbx, %rdx
2207 ; SSSE3-NEXT:    setb %bl
2208 ; SSSE3-NEXT:    orb %r9b, %bl
2209 ; SSSE3-NEXT:    orb %r8b, %bl
2210 ; SSSE3-NEXT:    movzbl %bl, %ebp
2211 ; SSSE3-NEXT:    negl %ebp
2212 ; SSSE3-NEXT:    movd %ebp, %xmm1
2213 ; SSSE3-NEXT:    movzbl %cl, %ecx
2214 ; SSSE3-NEXT:    negl %ecx
2215 ; SSSE3-NEXT:    movd %ecx, %xmm0
2216 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2217 ; SSSE3-NEXT:    movq %rax, 16(%r14)
2218 ; SSSE3-NEXT:    movq %rdi, (%r14)
2219 ; SSSE3-NEXT:    movq %rdx, 24(%r14)
2220 ; SSSE3-NEXT:    movq %rsi, 8(%r14)
2221 ; SSSE3-NEXT:    popq %rbx
2222 ; SSSE3-NEXT:    popq %r12
2223 ; SSSE3-NEXT:    popq %r13
2224 ; SSSE3-NEXT:    popq %r14
2225 ; SSSE3-NEXT:    popq %r15
2226 ; SSSE3-NEXT:    popq %rbp
2227 ; SSSE3-NEXT:    retq
2229 ; SSE41-LABEL: umulo_v2i128:
2230 ; SSE41:       # %bb.0:
2231 ; SSE41-NEXT:    pushq %rbp
2232 ; SSE41-NEXT:    pushq %r15
2233 ; SSE41-NEXT:    pushq %r14
2234 ; SSE41-NEXT:    pushq %r13
2235 ; SSE41-NEXT:    pushq %r12
2236 ; SSE41-NEXT:    pushq %rbx
2237 ; SSE41-NEXT:    movq %r9, %r10
2238 ; SSE41-NEXT:    movq %rcx, %r12
2239 ; SSE41-NEXT:    movq %rdx, %r11
2240 ; SSE41-NEXT:    movq %rsi, %rax
2241 ; SSE41-NEXT:    movq {{[0-9]+}}(%rsp), %r14
2242 ; SSE41-NEXT:    movq {{[0-9]+}}(%rsp), %r15
2243 ; SSE41-NEXT:    movq {{[0-9]+}}(%rsp), %r9
2244 ; SSE41-NEXT:    testq %r10, %r10
2245 ; SSE41-NEXT:    setne %cl
2246 ; SSE41-NEXT:    testq %rsi, %rsi
2247 ; SSE41-NEXT:    setne %r13b
2248 ; SSE41-NEXT:    andb %cl, %r13b
2249 ; SSE41-NEXT:    mulq %r8
2250 ; SSE41-NEXT:    movq %rax, %rsi
2251 ; SSE41-NEXT:    seto %bpl
2252 ; SSE41-NEXT:    movq %r10, %rax
2253 ; SSE41-NEXT:    mulq %rdi
2254 ; SSE41-NEXT:    movq %rax, %rcx
2255 ; SSE41-NEXT:    seto %bl
2256 ; SSE41-NEXT:    orb %bpl, %bl
2257 ; SSE41-NEXT:    addq %rsi, %rcx
2258 ; SSE41-NEXT:    movq %rdi, %rax
2259 ; SSE41-NEXT:    mulq %r8
2260 ; SSE41-NEXT:    movq %rax, %rdi
2261 ; SSE41-NEXT:    movq %rdx, %rsi
2262 ; SSE41-NEXT:    addq %rcx, %rsi
2263 ; SSE41-NEXT:    setb %cl
2264 ; SSE41-NEXT:    orb %bl, %cl
2265 ; SSE41-NEXT:    orb %r13b, %cl
2266 ; SSE41-NEXT:    testq %r9, %r9
2267 ; SSE41-NEXT:    setne %al
2268 ; SSE41-NEXT:    testq %r12, %r12
2269 ; SSE41-NEXT:    setne %r8b
2270 ; SSE41-NEXT:    andb %al, %r8b
2271 ; SSE41-NEXT:    movq %r12, %rax
2272 ; SSE41-NEXT:    mulq %r15
2273 ; SSE41-NEXT:    movq %rax, %rbp
2274 ; SSE41-NEXT:    seto %r10b
2275 ; SSE41-NEXT:    movq %r9, %rax
2276 ; SSE41-NEXT:    mulq %r11
2277 ; SSE41-NEXT:    movq %rax, %rbx
2278 ; SSE41-NEXT:    seto %r9b
2279 ; SSE41-NEXT:    orb %r10b, %r9b
2280 ; SSE41-NEXT:    addq %rbp, %rbx
2281 ; SSE41-NEXT:    movq %r11, %rax
2282 ; SSE41-NEXT:    mulq %r15
2283 ; SSE41-NEXT:    addq %rbx, %rdx
2284 ; SSE41-NEXT:    setb %bl
2285 ; SSE41-NEXT:    orb %r9b, %bl
2286 ; SSE41-NEXT:    orb %r8b, %bl
2287 ; SSE41-NEXT:    movzbl %bl, %ebp
2288 ; SSE41-NEXT:    negl %ebp
2289 ; SSE41-NEXT:    movzbl %cl, %ecx
2290 ; SSE41-NEXT:    negl %ecx
2291 ; SSE41-NEXT:    movd %ecx, %xmm0
2292 ; SSE41-NEXT:    pinsrd $1, %ebp, %xmm0
2293 ; SSE41-NEXT:    movq %rax, 16(%r14)
2294 ; SSE41-NEXT:    movq %rdi, (%r14)
2295 ; SSE41-NEXT:    movq %rdx, 24(%r14)
2296 ; SSE41-NEXT:    movq %rsi, 8(%r14)
2297 ; SSE41-NEXT:    popq %rbx
2298 ; SSE41-NEXT:    popq %r12
2299 ; SSE41-NEXT:    popq %r13
2300 ; SSE41-NEXT:    popq %r14
2301 ; SSE41-NEXT:    popq %r15
2302 ; SSE41-NEXT:    popq %rbp
2303 ; SSE41-NEXT:    retq
2305 ; AVX1-LABEL: umulo_v2i128:
2306 ; AVX1:       # %bb.0:
2307 ; AVX1-NEXT:    pushq %rbp
2308 ; AVX1-NEXT:    pushq %r15
2309 ; AVX1-NEXT:    pushq %r14
2310 ; AVX1-NEXT:    pushq %r13
2311 ; AVX1-NEXT:    pushq %r12
2312 ; AVX1-NEXT:    pushq %rbx
2313 ; AVX1-NEXT:    movq %r9, %r10
2314 ; AVX1-NEXT:    movq %rcx, %r12
2315 ; AVX1-NEXT:    movq %rdx, %r11
2316 ; AVX1-NEXT:    movq %rsi, %rax
2317 ; AVX1-NEXT:    movq {{[0-9]+}}(%rsp), %r14
2318 ; AVX1-NEXT:    movq {{[0-9]+}}(%rsp), %r15
2319 ; AVX1-NEXT:    movq {{[0-9]+}}(%rsp), %r9
2320 ; AVX1-NEXT:    testq %r10, %r10
2321 ; AVX1-NEXT:    setne %cl
2322 ; AVX1-NEXT:    testq %rsi, %rsi
2323 ; AVX1-NEXT:    setne %r13b
2324 ; AVX1-NEXT:    andb %cl, %r13b
2325 ; AVX1-NEXT:    mulq %r8
2326 ; AVX1-NEXT:    movq %rax, %rsi
2327 ; AVX1-NEXT:    seto %bpl
2328 ; AVX1-NEXT:    movq %r10, %rax
2329 ; AVX1-NEXT:    mulq %rdi
2330 ; AVX1-NEXT:    movq %rax, %rcx
2331 ; AVX1-NEXT:    seto %bl
2332 ; AVX1-NEXT:    orb %bpl, %bl
2333 ; AVX1-NEXT:    addq %rsi, %rcx
2334 ; AVX1-NEXT:    movq %rdi, %rax
2335 ; AVX1-NEXT:    mulq %r8
2336 ; AVX1-NEXT:    movq %rax, %rdi
2337 ; AVX1-NEXT:    movq %rdx, %rsi
2338 ; AVX1-NEXT:    addq %rcx, %rsi
2339 ; AVX1-NEXT:    setb %cl
2340 ; AVX1-NEXT:    orb %bl, %cl
2341 ; AVX1-NEXT:    orb %r13b, %cl
2342 ; AVX1-NEXT:    testq %r9, %r9
2343 ; AVX1-NEXT:    setne %al
2344 ; AVX1-NEXT:    testq %r12, %r12
2345 ; AVX1-NEXT:    setne %r8b
2346 ; AVX1-NEXT:    andb %al, %r8b
2347 ; AVX1-NEXT:    movq %r12, %rax
2348 ; AVX1-NEXT:    mulq %r15
2349 ; AVX1-NEXT:    movq %rax, %rbp
2350 ; AVX1-NEXT:    seto %r10b
2351 ; AVX1-NEXT:    movq %r9, %rax
2352 ; AVX1-NEXT:    mulq %r11
2353 ; AVX1-NEXT:    movq %rax, %rbx
2354 ; AVX1-NEXT:    seto %r9b
2355 ; AVX1-NEXT:    orb %r10b, %r9b
2356 ; AVX1-NEXT:    addq %rbp, %rbx
2357 ; AVX1-NEXT:    movq %r11, %rax
2358 ; AVX1-NEXT:    mulq %r15
2359 ; AVX1-NEXT:    addq %rbx, %rdx
2360 ; AVX1-NEXT:    setb %bl
2361 ; AVX1-NEXT:    orb %r9b, %bl
2362 ; AVX1-NEXT:    orb %r8b, %bl
2363 ; AVX1-NEXT:    movzbl %bl, %ebp
2364 ; AVX1-NEXT:    negl %ebp
2365 ; AVX1-NEXT:    movzbl %cl, %ecx
2366 ; AVX1-NEXT:    negl %ecx
2367 ; AVX1-NEXT:    vmovd %ecx, %xmm0
2368 ; AVX1-NEXT:    vpinsrd $1, %ebp, %xmm0, %xmm0
2369 ; AVX1-NEXT:    movq %rax, 16(%r14)
2370 ; AVX1-NEXT:    movq %rdi, (%r14)
2371 ; AVX1-NEXT:    movq %rdx, 24(%r14)
2372 ; AVX1-NEXT:    movq %rsi, 8(%r14)
2373 ; AVX1-NEXT:    popq %rbx
2374 ; AVX1-NEXT:    popq %r12
2375 ; AVX1-NEXT:    popq %r13
2376 ; AVX1-NEXT:    popq %r14
2377 ; AVX1-NEXT:    popq %r15
2378 ; AVX1-NEXT:    popq %rbp
2379 ; AVX1-NEXT:    retq
2381 ; AVX2-LABEL: umulo_v2i128:
2382 ; AVX2:       # %bb.0:
2383 ; AVX2-NEXT:    pushq %rbp
2384 ; AVX2-NEXT:    pushq %r15
2385 ; AVX2-NEXT:    pushq %r14
2386 ; AVX2-NEXT:    pushq %r13
2387 ; AVX2-NEXT:    pushq %r12
2388 ; AVX2-NEXT:    pushq %rbx
2389 ; AVX2-NEXT:    movq %r9, %r10
2390 ; AVX2-NEXT:    movq %rcx, %r12
2391 ; AVX2-NEXT:    movq %rdx, %r11
2392 ; AVX2-NEXT:    movq %rsi, %rax
2393 ; AVX2-NEXT:    movq {{[0-9]+}}(%rsp), %r14
2394 ; AVX2-NEXT:    movq {{[0-9]+}}(%rsp), %r15
2395 ; AVX2-NEXT:    movq {{[0-9]+}}(%rsp), %r9
2396 ; AVX2-NEXT:    testq %r10, %r10
2397 ; AVX2-NEXT:    setne %cl
2398 ; AVX2-NEXT:    testq %rsi, %rsi
2399 ; AVX2-NEXT:    setne %r13b
2400 ; AVX2-NEXT:    andb %cl, %r13b
2401 ; AVX2-NEXT:    mulq %r8
2402 ; AVX2-NEXT:    movq %rax, %rsi
2403 ; AVX2-NEXT:    seto %bpl
2404 ; AVX2-NEXT:    movq %r10, %rax
2405 ; AVX2-NEXT:    mulq %rdi
2406 ; AVX2-NEXT:    movq %rax, %rcx
2407 ; AVX2-NEXT:    seto %bl
2408 ; AVX2-NEXT:    orb %bpl, %bl
2409 ; AVX2-NEXT:    addq %rsi, %rcx
2410 ; AVX2-NEXT:    movq %rdi, %rax
2411 ; AVX2-NEXT:    mulq %r8
2412 ; AVX2-NEXT:    movq %rax, %rdi
2413 ; AVX2-NEXT:    movq %rdx, %rsi
2414 ; AVX2-NEXT:    addq %rcx, %rsi
2415 ; AVX2-NEXT:    setb %cl
2416 ; AVX2-NEXT:    orb %bl, %cl
2417 ; AVX2-NEXT:    orb %r13b, %cl
2418 ; AVX2-NEXT:    testq %r9, %r9
2419 ; AVX2-NEXT:    setne %al
2420 ; AVX2-NEXT:    testq %r12, %r12
2421 ; AVX2-NEXT:    setne %r8b
2422 ; AVX2-NEXT:    andb %al, %r8b
2423 ; AVX2-NEXT:    movq %r12, %rax
2424 ; AVX2-NEXT:    mulq %r15
2425 ; AVX2-NEXT:    movq %rax, %rbp
2426 ; AVX2-NEXT:    seto %r10b
2427 ; AVX2-NEXT:    movq %r9, %rax
2428 ; AVX2-NEXT:    mulq %r11
2429 ; AVX2-NEXT:    movq %rax, %rbx
2430 ; AVX2-NEXT:    seto %r9b
2431 ; AVX2-NEXT:    orb %r10b, %r9b
2432 ; AVX2-NEXT:    addq %rbp, %rbx
2433 ; AVX2-NEXT:    movq %r11, %rax
2434 ; AVX2-NEXT:    mulq %r15
2435 ; AVX2-NEXT:    addq %rbx, %rdx
2436 ; AVX2-NEXT:    setb %bl
2437 ; AVX2-NEXT:    orb %r9b, %bl
2438 ; AVX2-NEXT:    orb %r8b, %bl
2439 ; AVX2-NEXT:    movzbl %bl, %ebp
2440 ; AVX2-NEXT:    negl %ebp
2441 ; AVX2-NEXT:    movzbl %cl, %ecx
2442 ; AVX2-NEXT:    negl %ecx
2443 ; AVX2-NEXT:    vmovd %ecx, %xmm0
2444 ; AVX2-NEXT:    vpinsrd $1, %ebp, %xmm0, %xmm0
2445 ; AVX2-NEXT:    movq %rax, 16(%r14)
2446 ; AVX2-NEXT:    movq %rdi, (%r14)
2447 ; AVX2-NEXT:    movq %rdx, 24(%r14)
2448 ; AVX2-NEXT:    movq %rsi, 8(%r14)
2449 ; AVX2-NEXT:    popq %rbx
2450 ; AVX2-NEXT:    popq %r12
2451 ; AVX2-NEXT:    popq %r13
2452 ; AVX2-NEXT:    popq %r14
2453 ; AVX2-NEXT:    popq %r15
2454 ; AVX2-NEXT:    popq %rbp
2455 ; AVX2-NEXT:    retq
2457 ; AVX512-LABEL: umulo_v2i128:
2458 ; AVX512:       # %bb.0:
2459 ; AVX512-NEXT:    pushq %rbp
2460 ; AVX512-NEXT:    pushq %r15
2461 ; AVX512-NEXT:    pushq %r14
2462 ; AVX512-NEXT:    pushq %r13
2463 ; AVX512-NEXT:    pushq %r12
2464 ; AVX512-NEXT:    pushq %rbx
2465 ; AVX512-NEXT:    movq %r9, %r10
2466 ; AVX512-NEXT:    movq %rcx, %r9
2467 ; AVX512-NEXT:    movq %rdx, %r11
2468 ; AVX512-NEXT:    movq %rsi, %rax
2469 ; AVX512-NEXT:    movq %rdi, %rsi
2470 ; AVX512-NEXT:    movq {{[0-9]+}}(%rsp), %r14
2471 ; AVX512-NEXT:    movq {{[0-9]+}}(%rsp), %r15
2472 ; AVX512-NEXT:    movq {{[0-9]+}}(%rsp), %r12
2473 ; AVX512-NEXT:    testq %r10, %r10
2474 ; AVX512-NEXT:    setne %dl
2475 ; AVX512-NEXT:    testq %rax, %rax
2476 ; AVX512-NEXT:    setne %bl
2477 ; AVX512-NEXT:    andb %dl, %bl
2478 ; AVX512-NEXT:    mulq %r8
2479 ; AVX512-NEXT:    movq %rax, %r13
2480 ; AVX512-NEXT:    seto %bpl
2481 ; AVX512-NEXT:    movq %r10, %rax
2482 ; AVX512-NEXT:    mulq %rdi
2483 ; AVX512-NEXT:    movq %rax, %rdi
2484 ; AVX512-NEXT:    seto %cl
2485 ; AVX512-NEXT:    orb %bpl, %cl
2486 ; AVX512-NEXT:    addq %r13, %rdi
2487 ; AVX512-NEXT:    movq %rsi, %rax
2488 ; AVX512-NEXT:    mulq %r8
2489 ; AVX512-NEXT:    movq %rax, %r8
2490 ; AVX512-NEXT:    movq %rdx, %r10
2491 ; AVX512-NEXT:    addq %rdi, %r10
2492 ; AVX512-NEXT:    setb %sil
2493 ; AVX512-NEXT:    orb %cl, %sil
2494 ; AVX512-NEXT:    orb %bl, %sil
2495 ; AVX512-NEXT:    testq %r12, %r12
2496 ; AVX512-NEXT:    setne %al
2497 ; AVX512-NEXT:    testq %r9, %r9
2498 ; AVX512-NEXT:    setne %bpl
2499 ; AVX512-NEXT:    andb %al, %bpl
2500 ; AVX512-NEXT:    movq %r9, %rax
2501 ; AVX512-NEXT:    mulq %r15
2502 ; AVX512-NEXT:    movq %rax, %rdi
2503 ; AVX512-NEXT:    seto %r9b
2504 ; AVX512-NEXT:    movq %r12, %rax
2505 ; AVX512-NEXT:    mulq %r11
2506 ; AVX512-NEXT:    movq %rax, %rbx
2507 ; AVX512-NEXT:    seto %cl
2508 ; AVX512-NEXT:    orb %r9b, %cl
2509 ; AVX512-NEXT:    addq %rdi, %rbx
2510 ; AVX512-NEXT:    movq %r11, %rax
2511 ; AVX512-NEXT:    mulq %r15
2512 ; AVX512-NEXT:    addq %rbx, %rdx
2513 ; AVX512-NEXT:    setb %dil
2514 ; AVX512-NEXT:    orb %cl, %dil
2515 ; AVX512-NEXT:    orb %bpl, %dil
2516 ; AVX512-NEXT:    kmovd %edi, %k0
2517 ; AVX512-NEXT:    kshiftlw $1, %k0, %k0
2518 ; AVX512-NEXT:    andl $1, %esi
2519 ; AVX512-NEXT:    kmovw %esi, %k1
2520 ; AVX512-NEXT:    korw %k0, %k1, %k1
2521 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
2522 ; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
2523 ; AVX512-NEXT:    movq %rax, 16(%r14)
2524 ; AVX512-NEXT:    movq %r8, (%r14)
2525 ; AVX512-NEXT:    movq %rdx, 24(%r14)
2526 ; AVX512-NEXT:    movq %r10, 8(%r14)
2527 ; AVX512-NEXT:    popq %rbx
2528 ; AVX512-NEXT:    popq %r12
2529 ; AVX512-NEXT:    popq %r13
2530 ; AVX512-NEXT:    popq %r14
2531 ; AVX512-NEXT:    popq %r15
2532 ; AVX512-NEXT:    popq %rbp
2533 ; AVX512-NEXT:    retq
2534   %t = call {<2 x i128>, <2 x i1>} @llvm.umul.with.overflow.v2i128(<2 x i128> %a0, <2 x i128> %a1)
2535   %val = extractvalue {<2 x i128>, <2 x i1>} %t, 0
2536   %obit = extractvalue {<2 x i128>, <2 x i1>} %t, 1
2537   %res = sext <2 x i1> %obit to <2 x i32>
2538   store <2 x i128> %val, <2 x i128>* %p2
2539   ret <2 x i32> %res