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