Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / X86 / vec_uaddo.ll
blobb040cd9916fee221bb7029e4181723d589ef79ab
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.uadd.with.overflow.v1i32(<1 x i32>, <1 x i32>)
10 declare {<2 x i32>, <2 x i1>} @llvm.uadd.with.overflow.v2i32(<2 x i32>, <2 x i32>)
11 declare {<3 x i32>, <3 x i1>} @llvm.uadd.with.overflow.v3i32(<3 x i32>, <3 x i32>)
12 declare {<4 x i32>, <4 x i1>} @llvm.uadd.with.overflow.v4i32(<4 x i32>, <4 x i32>)
13 declare {<6 x i32>, <6 x i1>} @llvm.uadd.with.overflow.v6i32(<6 x i32>, <6 x i32>)
14 declare {<8 x i32>, <8 x i1>} @llvm.uadd.with.overflow.v8i32(<8 x i32>, <8 x i32>)
15 declare {<16 x i32>, <16 x i1>} @llvm.uadd.with.overflow.v16i32(<16 x i32>, <16 x i32>)
17 declare {<16 x i8>, <16 x i1>} @llvm.uadd.with.overflow.v16i8(<16 x i8>, <16 x i8>)
18 declare {<8 x i16>, <8 x i1>} @llvm.uadd.with.overflow.v8i16(<8 x i16>, <8 x i16>)
19 declare {<2 x i64>, <2 x i1>} @llvm.uadd.with.overflow.v2i64(<2 x i64>, <2 x i64>)
21 declare {<4 x i24>, <4 x i1>} @llvm.uadd.with.overflow.v4i24(<4 x i24>, <4 x i24>)
22 declare {<4 x i1>, <4 x i1>} @llvm.uadd.with.overflow.v4i1(<4 x i1>, <4 x i1>)
23 declare {<2 x i128>, <2 x i1>} @llvm.uadd.with.overflow.v2i128(<2 x i128>, <2 x i128>)
25 define <1 x i32> @uaddo_v1i32(<1 x i32> %a0, <1 x i32> %a1, <1 x i32>* %p2) nounwind {
26 ; SSE-LABEL: uaddo_v1i32:
27 ; SSE:       # %bb.0:
28 ; SSE-NEXT:    addl %esi, %edi
29 ; SSE-NEXT:    sbbl %eax, %eax
30 ; SSE-NEXT:    movl %edi, (%rdx)
31 ; SSE-NEXT:    retq
33 ; AVX-LABEL: uaddo_v1i32:
34 ; AVX:       # %bb.0:
35 ; AVX-NEXT:    addl %esi, %edi
36 ; AVX-NEXT:    sbbl %eax, %eax
37 ; AVX-NEXT:    movl %edi, (%rdx)
38 ; AVX-NEXT:    retq
39   %t = call {<1 x i32>, <1 x i1>} @llvm.uadd.with.overflow.v1i32(<1 x i32> %a0, <1 x i32> %a1)
40   %val = extractvalue {<1 x i32>, <1 x i1>} %t, 0
41   %obit = extractvalue {<1 x i32>, <1 x i1>} %t, 1
42   %res = sext <1 x i1> %obit to <1 x i32>
43   store <1 x i32> %val, <1 x i32>* %p2
44   ret <1 x i32> %res
47 define <2 x i32> @uaddo_v2i32(<2 x i32> %a0, <2 x i32> %a1, <2 x i32>* %p2) nounwind {
48 ; SSE2-LABEL: uaddo_v2i32:
49 ; SSE2:       # %bb.0:
50 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [4294967295,0,4294967295,0]
51 ; SSE2-NEXT:    pand %xmm2, %xmm1
52 ; SSE2-NEXT:    pand %xmm2, %xmm0
53 ; SSE2-NEXT:    paddq %xmm1, %xmm0
54 ; SSE2-NEXT:    pand %xmm0, %xmm2
55 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
56 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,0,3,2]
57 ; SSE2-NEXT:    pand %xmm2, %xmm3
58 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
59 ; SSE2-NEXT:    pxor %xmm3, %xmm1
60 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
61 ; SSE2-NEXT:    movq %xmm0, (%rdi)
62 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
63 ; SSE2-NEXT:    retq
65 ; SSSE3-LABEL: uaddo_v2i32:
66 ; SSSE3:       # %bb.0:
67 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [4294967295,0,4294967295,0]
68 ; SSSE3-NEXT:    pand %xmm2, %xmm1
69 ; SSSE3-NEXT:    pand %xmm2, %xmm0
70 ; SSSE3-NEXT:    paddq %xmm1, %xmm0
71 ; SSSE3-NEXT:    pand %xmm0, %xmm2
72 ; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm2
73 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,0,3,2]
74 ; SSSE3-NEXT:    pand %xmm2, %xmm3
75 ; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm1
76 ; SSSE3-NEXT:    pxor %xmm3, %xmm1
77 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
78 ; SSSE3-NEXT:    movq %xmm0, (%rdi)
79 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
80 ; SSSE3-NEXT:    retq
82 ; SSE41-LABEL: uaddo_v2i32:
83 ; SSE41:       # %bb.0:
84 ; SSE41-NEXT:    pxor %xmm2, %xmm2
85 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
86 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
87 ; SSE41-NEXT:    paddq %xmm1, %xmm0
88 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
89 ; SSE41-NEXT:    pcmpeqq %xmm0, %xmm2
90 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
91 ; SSE41-NEXT:    pxor %xmm2, %xmm1
92 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
93 ; SSE41-NEXT:    movq %xmm0, (%rdi)
94 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
95 ; SSE41-NEXT:    retq
97 ; AVX1-LABEL: uaddo_v2i32:
98 ; AVX1:       # %bb.0:
99 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
100 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
101 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
102 ; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm1
103 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
104 ; AVX1-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
105 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
106 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
107 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
108 ; AVX1-NEXT:    vmovq %xmm1, (%rdi)
109 ; AVX1-NEXT:    retq
111 ; AVX2-LABEL: uaddo_v2i32:
112 ; AVX2:       # %bb.0:
113 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
114 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]
115 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
116 ; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm1
117 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]
118 ; AVX2-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
119 ; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
120 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
121 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
122 ; AVX2-NEXT:    vmovq %xmm1, (%rdi)
123 ; AVX2-NEXT:    retq
125 ; AVX512-LABEL: uaddo_v2i32:
126 ; AVX512:       # %bb.0:
127 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
128 ; AVX512-NEXT:    vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]
129 ; AVX512-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
130 ; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
131 ; AVX512-NEXT:    vpblendd {{.*#+}} xmm1 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
132 ; AVX512-NEXT:    vpmovqd %xmm0, (%rdi)
133 ; AVX512-NEXT:    vpcmpeqq %xmm0, %xmm1, %xmm0
134 ; AVX512-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
135 ; AVX512-NEXT:    retq
136   %t = call {<2 x i32>, <2 x i1>} @llvm.uadd.with.overflow.v2i32(<2 x i32> %a0, <2 x i32> %a1)
137   %val = extractvalue {<2 x i32>, <2 x i1>} %t, 0
138   %obit = extractvalue {<2 x i32>, <2 x i1>} %t, 1
139   %res = sext <2 x i1> %obit to <2 x i32>
140   store <2 x i32> %val, <2 x i32>* %p2
141   ret <2 x i32> %res
144 define <3 x i32> @uaddo_v3i32(<3 x i32> %a0, <3 x i32> %a1, <3 x i32>* %p2) nounwind {
145 ; SSE2-LABEL: uaddo_v3i32:
146 ; SSE2:       # %bb.0:
147 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
148 ; SSE2-NEXT:    paddd %xmm0, %xmm1
149 ; SSE2-NEXT:    pxor %xmm2, %xmm0
150 ; SSE2-NEXT:    pxor %xmm1, %xmm2
151 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
152 ; SSE2-NEXT:    movq %xmm1, (%rdi)
153 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
154 ; SSE2-NEXT:    movd %xmm1, 8(%rdi)
155 ; SSE2-NEXT:    retq
157 ; SSSE3-LABEL: uaddo_v3i32:
158 ; SSSE3:       # %bb.0:
159 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
160 ; SSSE3-NEXT:    paddd %xmm0, %xmm1
161 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
162 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
163 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm0
164 ; SSSE3-NEXT:    movq %xmm1, (%rdi)
165 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
166 ; SSSE3-NEXT:    movd %xmm1, 8(%rdi)
167 ; SSSE3-NEXT:    retq
169 ; SSE41-LABEL: uaddo_v3i32:
170 ; SSE41:       # %bb.0:
171 ; SSE41-NEXT:    paddd %xmm0, %xmm1
172 ; SSE41-NEXT:    pmaxud %xmm1, %xmm0
173 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
174 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
175 ; SSE41-NEXT:    pxor %xmm2, %xmm0
176 ; SSE41-NEXT:    pextrd $2, %xmm1, 8(%rdi)
177 ; SSE41-NEXT:    movq %xmm1, (%rdi)
178 ; SSE41-NEXT:    retq
180 ; AVX1-LABEL: uaddo_v3i32:
181 ; AVX1:       # %bb.0:
182 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
183 ; AVX1-NEXT:    vpmaxud %xmm0, %xmm1, %xmm0
184 ; AVX1-NEXT:    vpcmpeqd %xmm0, %xmm1, %xmm0
185 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
186 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
187 ; AVX1-NEXT:    vpextrd $2, %xmm1, 8(%rdi)
188 ; AVX1-NEXT:    vmovq %xmm1, (%rdi)
189 ; AVX1-NEXT:    retq
191 ; AVX2-LABEL: uaddo_v3i32:
192 ; AVX2:       # %bb.0:
193 ; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
194 ; AVX2-NEXT:    vpmaxud %xmm0, %xmm1, %xmm0
195 ; AVX2-NEXT:    vpcmpeqd %xmm0, %xmm1, %xmm0
196 ; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
197 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
198 ; AVX2-NEXT:    vpextrd $2, %xmm1, 8(%rdi)
199 ; AVX2-NEXT:    vmovq %xmm1, (%rdi)
200 ; AVX2-NEXT:    retq
202 ; AVX512-LABEL: uaddo_v3i32:
203 ; AVX512:       # %bb.0:
204 ; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
205 ; AVX512-NEXT:    vpcmpltud %xmm0, %xmm1, %k1
206 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
207 ; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
208 ; AVX512-NEXT:    vpextrd $2, %xmm1, 8(%rdi)
209 ; AVX512-NEXT:    vmovq %xmm1, (%rdi)
210 ; AVX512-NEXT:    retq
211   %t = call {<3 x i32>, <3 x i1>} @llvm.uadd.with.overflow.v3i32(<3 x i32> %a0, <3 x i32> %a1)
212   %val = extractvalue {<3 x i32>, <3 x i1>} %t, 0
213   %obit = extractvalue {<3 x i32>, <3 x i1>} %t, 1
214   %res = sext <3 x i1> %obit to <3 x i32>
215   store <3 x i32> %val, <3 x i32>* %p2
216   ret <3 x i32> %res
219 define <4 x i32> @uaddo_v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i32>* %p2) nounwind {
220 ; SSE2-LABEL: uaddo_v4i32:
221 ; SSE2:       # %bb.0:
222 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
223 ; SSE2-NEXT:    paddd %xmm0, %xmm1
224 ; SSE2-NEXT:    pxor %xmm2, %xmm0
225 ; SSE2-NEXT:    pxor %xmm1, %xmm2
226 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
227 ; SSE2-NEXT:    movdqa %xmm1, (%rdi)
228 ; SSE2-NEXT:    retq
230 ; SSSE3-LABEL: uaddo_v4i32:
231 ; SSSE3:       # %bb.0:
232 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
233 ; SSSE3-NEXT:    paddd %xmm0, %xmm1
234 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
235 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
236 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm0
237 ; SSSE3-NEXT:    movdqa %xmm1, (%rdi)
238 ; SSSE3-NEXT:    retq
240 ; SSE41-LABEL: uaddo_v4i32:
241 ; SSE41:       # %bb.0:
242 ; SSE41-NEXT:    paddd %xmm0, %xmm1
243 ; SSE41-NEXT:    pmaxud %xmm1, %xmm0
244 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
245 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
246 ; SSE41-NEXT:    pxor %xmm2, %xmm0
247 ; SSE41-NEXT:    movdqa %xmm1, (%rdi)
248 ; SSE41-NEXT:    retq
250 ; AVX1-LABEL: uaddo_v4i32:
251 ; AVX1:       # %bb.0:
252 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
253 ; AVX1-NEXT:    vpmaxud %xmm0, %xmm1, %xmm0
254 ; AVX1-NEXT:    vpcmpeqd %xmm0, %xmm1, %xmm0
255 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
256 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
257 ; AVX1-NEXT:    vmovdqa %xmm1, (%rdi)
258 ; AVX1-NEXT:    retq
260 ; AVX2-LABEL: uaddo_v4i32:
261 ; AVX2:       # %bb.0:
262 ; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
263 ; AVX2-NEXT:    vpmaxud %xmm0, %xmm1, %xmm0
264 ; AVX2-NEXT:    vpcmpeqd %xmm0, %xmm1, %xmm0
265 ; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
266 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
267 ; AVX2-NEXT:    vmovdqa %xmm1, (%rdi)
268 ; AVX2-NEXT:    retq
270 ; AVX512-LABEL: uaddo_v4i32:
271 ; AVX512:       # %bb.0:
272 ; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
273 ; AVX512-NEXT:    vpcmpltud %xmm0, %xmm1, %k1
274 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
275 ; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
276 ; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)
277 ; AVX512-NEXT:    retq
278   %t = call {<4 x i32>, <4 x i1>} @llvm.uadd.with.overflow.v4i32(<4 x i32> %a0, <4 x i32> %a1)
279   %val = extractvalue {<4 x i32>, <4 x i1>} %t, 0
280   %obit = extractvalue {<4 x i32>, <4 x i1>} %t, 1
281   %res = sext <4 x i1> %obit to <4 x i32>
282   store <4 x i32> %val, <4 x i32>* %p2
283   ret <4 x i32> %res
286 define <6 x i32> @uaddo_v6i32(<6 x i32> %a0, <6 x i32> %a1, <6 x i32>* %p2) nounwind {
287 ; SSE2-LABEL: uaddo_v6i32:
288 ; SSE2:       # %bb.0:
289 ; SSE2-NEXT:    movq %rdi, %rax
290 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
291 ; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
292 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
293 ; SSE2-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
294 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
295 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
296 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
297 ; SSE2-NEXT:    movd %r8d, %xmm1
298 ; SSE2-NEXT:    movd %ecx, %xmm2
299 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
300 ; SSE2-NEXT:    movd %edx, %xmm3
301 ; SSE2-NEXT:    movd %esi, %xmm1
302 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
303 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
304 ; SSE2-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
305 ; SSE2-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
306 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
307 ; SSE2-NEXT:    movd %r9d, %xmm2
308 ; SSE2-NEXT:    movd {{.*#+}} xmm4 = mem[0],zero,zero,zero
309 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
310 ; SSE2-NEXT:    movq {{[0-9]+}}(%rsp), %rcx
311 ; SSE2-NEXT:    paddd %xmm1, %xmm0
312 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
313 ; SSE2-NEXT:    movdqa %xmm0, (%rcx)
314 ; SSE2-NEXT:    pxor %xmm4, %xmm0
315 ; SSE2-NEXT:    pxor %xmm4, %xmm1
316 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
317 ; SSE2-NEXT:    paddd %xmm2, %xmm3
318 ; SSE2-NEXT:    movq %xmm3, 16(%rcx)
319 ; SSE2-NEXT:    pxor %xmm4, %xmm3
320 ; SSE2-NEXT:    pxor %xmm4, %xmm2
321 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
322 ; SSE2-NEXT:    movq %xmm2, 16(%rdi)
323 ; SSE2-NEXT:    movdqa %xmm1, (%rdi)
324 ; SSE2-NEXT:    retq
326 ; SSSE3-LABEL: uaddo_v6i32:
327 ; SSSE3:       # %bb.0:
328 ; SSSE3-NEXT:    movq %rdi, %rax
329 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
330 ; SSSE3-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
331 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
332 ; SSSE3-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
333 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
334 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
335 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
336 ; SSSE3-NEXT:    movd %r8d, %xmm1
337 ; SSSE3-NEXT:    movd %ecx, %xmm2
338 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
339 ; SSSE3-NEXT:    movd %edx, %xmm3
340 ; SSSE3-NEXT:    movd %esi, %xmm1
341 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
342 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
343 ; SSSE3-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
344 ; SSSE3-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
345 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
346 ; SSSE3-NEXT:    movd %r9d, %xmm2
347 ; SSSE3-NEXT:    movd {{.*#+}} xmm4 = mem[0],zero,zero,zero
348 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
349 ; SSSE3-NEXT:    movq {{[0-9]+}}(%rsp), %rcx
350 ; SSSE3-NEXT:    paddd %xmm1, %xmm0
351 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
352 ; SSSE3-NEXT:    movdqa %xmm0, (%rcx)
353 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
354 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
355 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
356 ; SSSE3-NEXT:    paddd %xmm2, %xmm3
357 ; SSSE3-NEXT:    movq %xmm3, 16(%rcx)
358 ; SSSE3-NEXT:    pxor %xmm4, %xmm3
359 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
360 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm2
361 ; SSSE3-NEXT:    movq %xmm2, 16(%rdi)
362 ; SSSE3-NEXT:    movdqa %xmm1, (%rdi)
363 ; SSSE3-NEXT:    retq
365 ; SSE41-LABEL: uaddo_v6i32:
366 ; SSE41:       # %bb.0:
367 ; SSE41-NEXT:    movq %rdi, %rax
368 ; SSE41-NEXT:    movd %esi, %xmm0
369 ; SSE41-NEXT:    pinsrd $1, %edx, %xmm0
370 ; SSE41-NEXT:    pinsrd $2, %ecx, %xmm0
371 ; SSE41-NEXT:    pinsrd $3, %r8d, %xmm0
372 ; SSE41-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
373 ; SSE41-NEXT:    pinsrd $1, {{[0-9]+}}(%rsp), %xmm1
374 ; SSE41-NEXT:    movd %r9d, %xmm2
375 ; SSE41-NEXT:    pinsrd $1, {{[0-9]+}}(%rsp), %xmm2
376 ; SSE41-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
377 ; SSE41-NEXT:    pinsrd $1, {{[0-9]+}}(%rsp), %xmm3
378 ; SSE41-NEXT:    pinsrd $2, {{[0-9]+}}(%rsp), %xmm3
379 ; SSE41-NEXT:    pinsrd $3, {{[0-9]+}}(%rsp), %xmm3
380 ; SSE41-NEXT:    movq {{[0-9]+}}(%rsp), %rcx
381 ; SSE41-NEXT:    paddd %xmm0, %xmm3
382 ; SSE41-NEXT:    pmaxud %xmm3, %xmm0
383 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
384 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm4
385 ; SSE41-NEXT:    pxor %xmm4, %xmm0
386 ; SSE41-NEXT:    paddd %xmm2, %xmm1
387 ; SSE41-NEXT:    pmaxud %xmm1, %xmm2
388 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm2
389 ; SSE41-NEXT:    pxor %xmm4, %xmm2
390 ; SSE41-NEXT:    movq %xmm1, 16(%rcx)
391 ; SSE41-NEXT:    movdqa %xmm3, (%rcx)
392 ; SSE41-NEXT:    movq %xmm2, 16(%rdi)
393 ; SSE41-NEXT:    movdqa %xmm0, (%rdi)
394 ; SSE41-NEXT:    retq
396 ; AVX1-LABEL: uaddo_v6i32:
397 ; AVX1:       # %bb.0:
398 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
399 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
400 ; AVX1-NEXT:    vpaddd %xmm2, %xmm3, %xmm2
401 ; AVX1-NEXT:    vpmaxud %xmm3, %xmm2, %xmm3
402 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm3
403 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
404 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
405 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
406 ; AVX1-NEXT:    vpmaxud %xmm0, %xmm1, %xmm0
407 ; AVX1-NEXT:    vpcmpeqd %xmm0, %xmm1, %xmm0
408 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
409 ; AVX1-NEXT:    vpackssdw %xmm3, %xmm0, %xmm0
410 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm3
411 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
412 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
413 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm3, %ymm0
414 ; AVX1-NEXT:    vmovq %xmm2, 16(%rdi)
415 ; AVX1-NEXT:    vmovdqa %xmm1, (%rdi)
416 ; AVX1-NEXT:    retq
418 ; AVX2-LABEL: uaddo_v6i32:
419 ; AVX2:       # %bb.0:
420 ; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm1
421 ; AVX2-NEXT:    vpmaxud %ymm0, %ymm1, %ymm0
422 ; AVX2-NEXT:    vpcmpeqd %ymm0, %ymm1, %ymm0
423 ; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
424 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
425 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
426 ; AVX2-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0
427 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
428 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
429 ; AVX2-NEXT:    vmovq %xmm2, 16(%rdi)
430 ; AVX2-NEXT:    vmovdqa %xmm1, (%rdi)
431 ; AVX2-NEXT:    retq
433 ; AVX512-LABEL: uaddo_v6i32:
434 ; AVX512:       # %bb.0:
435 ; AVX512-NEXT:    vpaddd %ymm1, %ymm0, %ymm1
436 ; AVX512-NEXT:    vpcmpltud %ymm0, %ymm1, %k1
437 ; AVX512-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
438 ; AVX512-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}
439 ; AVX512-NEXT:    vextracti128 $1, %ymm1, %xmm2
440 ; AVX512-NEXT:    vmovq %xmm2, 16(%rdi)
441 ; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)
442 ; AVX512-NEXT:    retq
443   %t = call {<6 x i32>, <6 x i1>} @llvm.uadd.with.overflow.v6i32(<6 x i32> %a0, <6 x i32> %a1)
444   %val = extractvalue {<6 x i32>, <6 x i1>} %t, 0
445   %obit = extractvalue {<6 x i32>, <6 x i1>} %t, 1
446   %res = sext <6 x i1> %obit to <6 x i32>
447   store <6 x i32> %val, <6 x i32>* %p2
448   ret <6 x i32> %res
451 define <8 x i32> @uaddo_v8i32(<8 x i32> %a0, <8 x i32> %a1, <8 x i32>* %p2) nounwind {
452 ; SSE2-LABEL: uaddo_v8i32:
453 ; SSE2:       # %bb.0:
454 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
455 ; SSE2-NEXT:    paddd %xmm0, %xmm2
456 ; SSE2-NEXT:    pxor %xmm4, %xmm0
457 ; SSE2-NEXT:    movdqa %xmm2, (%rdi)
458 ; SSE2-NEXT:    pxor %xmm4, %xmm2
459 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
460 ; SSE2-NEXT:    paddd %xmm1, %xmm3
461 ; SSE2-NEXT:    pxor %xmm4, %xmm1
462 ; SSE2-NEXT:    pxor %xmm3, %xmm4
463 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm1
464 ; SSE2-NEXT:    movdqa %xmm3, 16(%rdi)
465 ; SSE2-NEXT:    retq
467 ; SSSE3-LABEL: uaddo_v8i32:
468 ; SSSE3:       # %bb.0:
469 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
470 ; SSSE3-NEXT:    paddd %xmm0, %xmm2
471 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
472 ; SSSE3-NEXT:    movdqa %xmm2, (%rdi)
473 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
474 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm0
475 ; SSSE3-NEXT:    paddd %xmm1, %xmm3
476 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
477 ; SSSE3-NEXT:    pxor %xmm3, %xmm4
478 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm1
479 ; SSSE3-NEXT:    movdqa %xmm3, 16(%rdi)
480 ; SSSE3-NEXT:    retq
482 ; SSE41-LABEL: uaddo_v8i32:
483 ; SSE41:       # %bb.0:
484 ; SSE41-NEXT:    paddd %xmm0, %xmm2
485 ; SSE41-NEXT:    pmaxud %xmm2, %xmm0
486 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm0
487 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm4
488 ; SSE41-NEXT:    pxor %xmm4, %xmm0
489 ; SSE41-NEXT:    paddd %xmm1, %xmm3
490 ; SSE41-NEXT:    pmaxud %xmm3, %xmm1
491 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm1
492 ; SSE41-NEXT:    pxor %xmm4, %xmm1
493 ; SSE41-NEXT:    movdqa %xmm3, 16(%rdi)
494 ; SSE41-NEXT:    movdqa %xmm2, (%rdi)
495 ; SSE41-NEXT:    retq
497 ; AVX1-LABEL: uaddo_v8i32:
498 ; AVX1:       # %bb.0:
499 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
500 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
501 ; AVX1-NEXT:    vpaddd %xmm2, %xmm3, %xmm2
502 ; AVX1-NEXT:    vpmaxud %xmm3, %xmm2, %xmm3
503 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm3
504 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
505 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
506 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
507 ; AVX1-NEXT:    vpmaxud %xmm0, %xmm1, %xmm0
508 ; AVX1-NEXT:    vpcmpeqd %xmm0, %xmm1, %xmm0
509 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
510 ; AVX1-NEXT:    vpackssdw %xmm3, %xmm0, %xmm0
511 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
512 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm2
513 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
514 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
515 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
516 ; AVX1-NEXT:    vmovaps %ymm1, (%rdi)
517 ; AVX1-NEXT:    retq
519 ; AVX2-LABEL: uaddo_v8i32:
520 ; AVX2:       # %bb.0:
521 ; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm1
522 ; AVX2-NEXT:    vpmaxud %ymm0, %ymm1, %ymm0
523 ; AVX2-NEXT:    vpcmpeqd %ymm0, %ymm1, %ymm0
524 ; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
525 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
526 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
527 ; AVX2-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0
528 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
529 ; AVX2-NEXT:    vmovdqa %ymm1, (%rdi)
530 ; AVX2-NEXT:    retq
532 ; AVX512-LABEL: uaddo_v8i32:
533 ; AVX512:       # %bb.0:
534 ; AVX512-NEXT:    vpaddd %ymm1, %ymm0, %ymm1
535 ; AVX512-NEXT:    vpcmpltud %ymm0, %ymm1, %k1
536 ; AVX512-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
537 ; AVX512-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}
538 ; AVX512-NEXT:    vmovdqa %ymm1, (%rdi)
539 ; AVX512-NEXT:    retq
540   %t = call {<8 x i32>, <8 x i1>} @llvm.uadd.with.overflow.v8i32(<8 x i32> %a0, <8 x i32> %a1)
541   %val = extractvalue {<8 x i32>, <8 x i1>} %t, 0
542   %obit = extractvalue {<8 x i32>, <8 x i1>} %t, 1
543   %res = sext <8 x i1> %obit to <8 x i32>
544   store <8 x i32> %val, <8 x i32>* %p2
545   ret <8 x i32> %res
548 define <16 x i32> @uaddo_v16i32(<16 x i32> %a0, <16 x i32> %a1, <16 x i32>* %p2) nounwind {
549 ; SSE2-LABEL: uaddo_v16i32:
550 ; SSE2:       # %bb.0:
551 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
552 ; SSE2-NEXT:    paddd %xmm0, %xmm4
553 ; SSE2-NEXT:    pxor %xmm8, %xmm0
554 ; SSE2-NEXT:    movdqa %xmm4, (%rdi)
555 ; SSE2-NEXT:    pxor %xmm8, %xmm4
556 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm0
557 ; SSE2-NEXT:    paddd %xmm1, %xmm5
558 ; SSE2-NEXT:    pxor %xmm8, %xmm1
559 ; SSE2-NEXT:    movdqa %xmm5, 16(%rdi)
560 ; SSE2-NEXT:    pxor %xmm8, %xmm5
561 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm1
562 ; SSE2-NEXT:    paddd %xmm2, %xmm6
563 ; SSE2-NEXT:    pxor %xmm8, %xmm2
564 ; SSE2-NEXT:    movdqa %xmm6, 32(%rdi)
565 ; SSE2-NEXT:    pxor %xmm8, %xmm6
566 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm2
567 ; SSE2-NEXT:    paddd %xmm3, %xmm7
568 ; SSE2-NEXT:    pxor %xmm8, %xmm3
569 ; SSE2-NEXT:    pxor %xmm7, %xmm8
570 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm3
571 ; SSE2-NEXT:    movdqa %xmm7, 48(%rdi)
572 ; SSE2-NEXT:    retq
574 ; SSSE3-LABEL: uaddo_v16i32:
575 ; SSSE3:       # %bb.0:
576 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
577 ; SSSE3-NEXT:    paddd %xmm0, %xmm4
578 ; SSSE3-NEXT:    pxor %xmm8, %xmm0
579 ; SSSE3-NEXT:    movdqa %xmm4, (%rdi)
580 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
581 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm0
582 ; SSSE3-NEXT:    paddd %xmm1, %xmm5
583 ; SSSE3-NEXT:    pxor %xmm8, %xmm1
584 ; SSSE3-NEXT:    movdqa %xmm5, 16(%rdi)
585 ; SSSE3-NEXT:    pxor %xmm8, %xmm5
586 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm1
587 ; SSSE3-NEXT:    paddd %xmm2, %xmm6
588 ; SSSE3-NEXT:    pxor %xmm8, %xmm2
589 ; SSSE3-NEXT:    movdqa %xmm6, 32(%rdi)
590 ; SSSE3-NEXT:    pxor %xmm8, %xmm6
591 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm2
592 ; SSSE3-NEXT:    paddd %xmm3, %xmm7
593 ; SSSE3-NEXT:    pxor %xmm8, %xmm3
594 ; SSSE3-NEXT:    pxor %xmm7, %xmm8
595 ; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm3
596 ; SSSE3-NEXT:    movdqa %xmm7, 48(%rdi)
597 ; SSSE3-NEXT:    retq
599 ; SSE41-LABEL: uaddo_v16i32:
600 ; SSE41:       # %bb.0:
601 ; SSE41-NEXT:    paddd %xmm0, %xmm4
602 ; SSE41-NEXT:    pmaxud %xmm4, %xmm0
603 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm0
604 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm8
605 ; SSE41-NEXT:    pxor %xmm8, %xmm0
606 ; SSE41-NEXT:    paddd %xmm1, %xmm5
607 ; SSE41-NEXT:    pmaxud %xmm5, %xmm1
608 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm1
609 ; SSE41-NEXT:    pxor %xmm8, %xmm1
610 ; SSE41-NEXT:    paddd %xmm2, %xmm6
611 ; SSE41-NEXT:    pmaxud %xmm6, %xmm2
612 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm2
613 ; SSE41-NEXT:    pxor %xmm8, %xmm2
614 ; SSE41-NEXT:    paddd %xmm3, %xmm7
615 ; SSE41-NEXT:    pmaxud %xmm7, %xmm3
616 ; SSE41-NEXT:    pcmpeqd %xmm7, %xmm3
617 ; SSE41-NEXT:    pxor %xmm8, %xmm3
618 ; SSE41-NEXT:    movdqa %xmm7, 48(%rdi)
619 ; SSE41-NEXT:    movdqa %xmm6, 32(%rdi)
620 ; SSE41-NEXT:    movdqa %xmm5, 16(%rdi)
621 ; SSE41-NEXT:    movdqa %xmm4, (%rdi)
622 ; SSE41-NEXT:    retq
624 ; AVX1-LABEL: uaddo_v16i32:
625 ; AVX1:       # %bb.0:
626 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
627 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
628 ; AVX1-NEXT:    vpaddd %xmm4, %xmm5, %xmm4
629 ; AVX1-NEXT:    vpmaxud %xmm5, %xmm4, %xmm5
630 ; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm4, %xmm5
631 ; AVX1-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
632 ; AVX1-NEXT:    vpxor %xmm6, %xmm5, %xmm5
633 ; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm3
634 ; AVX1-NEXT:    vpmaxud %xmm1, %xmm3, %xmm1
635 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm3, %xmm1
636 ; AVX1-NEXT:    vpxor %xmm6, %xmm1, %xmm1
637 ; AVX1-NEXT:    vpackssdw %xmm5, %xmm1, %xmm1
638 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
639 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
640 ; AVX1-NEXT:    vpaddd %xmm5, %xmm7, %xmm5
641 ; AVX1-NEXT:    vpmaxud %xmm7, %xmm5, %xmm7
642 ; AVX1-NEXT:    vpcmpeqd %xmm7, %xmm5, %xmm7
643 ; AVX1-NEXT:    vpxor %xmm6, %xmm7, %xmm7
644 ; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm2
645 ; AVX1-NEXT:    vpmaxud %xmm0, %xmm2, %xmm0
646 ; AVX1-NEXT:    vpcmpeqd %xmm0, %xmm2, %xmm0
647 ; AVX1-NEXT:    vpxor %xmm6, %xmm0, %xmm0
648 ; AVX1-NEXT:    vpackssdw %xmm7, %xmm0, %xmm0
649 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm2, %ymm2
650 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm3
651 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm4
652 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
653 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
654 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm4, %ymm0
655 ; AVX1-NEXT:    vpmovsxwd %xmm1, %xmm4
656 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
657 ; AVX1-NEXT:    vpmovsxwd %xmm1, %xmm1
658 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm4, %ymm1
659 ; AVX1-NEXT:    vmovaps %ymm3, 32(%rdi)
660 ; AVX1-NEXT:    vmovaps %ymm2, (%rdi)
661 ; AVX1-NEXT:    retq
663 ; AVX2-LABEL: uaddo_v16i32:
664 ; AVX2:       # %bb.0:
665 ; AVX2-NEXT:    vpaddd %ymm3, %ymm1, %ymm3
666 ; AVX2-NEXT:    vpmaxud %ymm1, %ymm3, %ymm1
667 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm3, %ymm1
668 ; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm4, %ymm4
669 ; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm1
670 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm5
671 ; AVX2-NEXT:    vpackssdw %xmm5, %xmm1, %xmm1
672 ; AVX2-NEXT:    vpaddd %ymm2, %ymm0, %ymm2
673 ; AVX2-NEXT:    vpmaxud %ymm0, %ymm2, %ymm0
674 ; AVX2-NEXT:    vpcmpeqd %ymm0, %ymm2, %ymm0
675 ; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm0
676 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4
677 ; AVX2-NEXT:    vpackssdw %xmm4, %xmm0, %xmm0
678 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
679 ; AVX2-NEXT:    vpmovsxwd %xmm1, %ymm1
680 ; AVX2-NEXT:    vmovdqa %ymm3, 32(%rdi)
681 ; AVX2-NEXT:    vmovdqa %ymm2, (%rdi)
682 ; AVX2-NEXT:    retq
684 ; AVX512-LABEL: uaddo_v16i32:
685 ; AVX512:       # %bb.0:
686 ; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm1
687 ; AVX512-NEXT:    vpcmpltud %zmm0, %zmm1, %k1
688 ; AVX512-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
689 ; AVX512-NEXT:    vmovdqa64 %zmm1, (%rdi)
690 ; AVX512-NEXT:    retq
691   %t = call {<16 x i32>, <16 x i1>} @llvm.uadd.with.overflow.v16i32(<16 x i32> %a0, <16 x i32> %a1)
692   %val = extractvalue {<16 x i32>, <16 x i1>} %t, 0
693   %obit = extractvalue {<16 x i32>, <16 x i1>} %t, 1
694   %res = sext <16 x i1> %obit to <16 x i32>
695   store <16 x i32> %val, <16 x i32>* %p2
696   ret <16 x i32> %res
699 define <16 x i32> @uaddo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nounwind {
700 ; SSE2-LABEL: uaddo_v16i8:
701 ; SSE2:       # %bb.0:
702 ; SSE2-NEXT:    paddb %xmm0, %xmm1
703 ; SSE2-NEXT:    pmaxub %xmm1, %xmm0
704 ; SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
705 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm3
706 ; SSE2-NEXT:    pxor %xmm0, %xmm3
707 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
708 ; 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]
709 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
710 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
711 ; SSE2-NEXT:    pslld $31, %xmm0
712 ; SSE2-NEXT:    psrad $31, %xmm0
713 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm4 = xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]
714 ; SSE2-NEXT:    pslld $31, %xmm4
715 ; SSE2-NEXT:    psrad $31, %xmm4
716 ; 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]
717 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
718 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
719 ; SSE2-NEXT:    pslld $31, %xmm2
720 ; SSE2-NEXT:    psrad $31, %xmm2
721 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
722 ; SSE2-NEXT:    pslld $31, %xmm3
723 ; SSE2-NEXT:    psrad $31, %xmm3
724 ; SSE2-NEXT:    movdqa %xmm1, (%rdi)
725 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
726 ; SSE2-NEXT:    retq
728 ; SSSE3-LABEL: uaddo_v16i8:
729 ; SSSE3:       # %bb.0:
730 ; SSSE3-NEXT:    paddb %xmm0, %xmm1
731 ; SSSE3-NEXT:    pmaxub %xmm1, %xmm0
732 ; SSSE3-NEXT:    pcmpeqb %xmm1, %xmm0
733 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm3
734 ; SSSE3-NEXT:    pxor %xmm0, %xmm3
735 ; SSSE3-NEXT:    movdqa %xmm3, %xmm4
736 ; 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]
737 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
738 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
739 ; SSSE3-NEXT:    pslld $31, %xmm0
740 ; SSSE3-NEXT:    psrad $31, %xmm0
741 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm4 = xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]
742 ; SSSE3-NEXT:    pslld $31, %xmm4
743 ; SSSE3-NEXT:    psrad $31, %xmm4
744 ; 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]
745 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
746 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
747 ; SSSE3-NEXT:    pslld $31, %xmm2
748 ; SSSE3-NEXT:    psrad $31, %xmm2
749 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
750 ; SSSE3-NEXT:    pslld $31, %xmm3
751 ; SSSE3-NEXT:    psrad $31, %xmm3
752 ; SSSE3-NEXT:    movdqa %xmm1, (%rdi)
753 ; SSSE3-NEXT:    movdqa %xmm4, %xmm1
754 ; SSSE3-NEXT:    retq
756 ; SSE41-LABEL: uaddo_v16i8:
757 ; SSE41:       # %bb.0:
758 ; SSE41-NEXT:    paddb %xmm0, %xmm1
759 ; SSE41-NEXT:    pmaxub %xmm1, %xmm0
760 ; SSE41-NEXT:    pcmpeqb %xmm1, %xmm0
761 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm3
762 ; SSE41-NEXT:    pxor %xmm0, %xmm3
763 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
764 ; SSE41-NEXT:    pslld $31, %xmm0
765 ; SSE41-NEXT:    psrad $31, %xmm0
766 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,2,3]
767 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm4 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
768 ; SSE41-NEXT:    pslld $31, %xmm4
769 ; SSE41-NEXT:    psrad $31, %xmm4
770 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,0,1]
771 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
772 ; SSE41-NEXT:    pslld $31, %xmm2
773 ; SSE41-NEXT:    psrad $31, %xmm2
774 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[3,1,2,3]
775 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
776 ; SSE41-NEXT:    pslld $31, %xmm3
777 ; SSE41-NEXT:    psrad $31, %xmm3
778 ; SSE41-NEXT:    movdqa %xmm1, (%rdi)
779 ; SSE41-NEXT:    movdqa %xmm4, %xmm1
780 ; SSE41-NEXT:    retq
782 ; AVX1-LABEL: uaddo_v16i8:
783 ; AVX1:       # %bb.0:
784 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm2
785 ; AVX1-NEXT:    vpmaxub %xmm0, %xmm2, %xmm0
786 ; AVX1-NEXT:    vpcmpeqb %xmm0, %xmm2, %xmm0
787 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
788 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm1
789 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
790 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
791 ; AVX1-NEXT:    vpslld $31, %xmm3, %xmm3
792 ; AVX1-NEXT:    vpsrad $31, %xmm3, %xmm3
793 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
794 ; AVX1-NEXT:    vpslld $31, %xmm0, %xmm0
795 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm0
796 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm3, %ymm0
797 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
798 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm3 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
799 ; AVX1-NEXT:    vpslld $31, %xmm3, %xmm3
800 ; AVX1-NEXT:    vpsrad $31, %xmm3, %xmm3
801 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
802 ; AVX1-NEXT:    vpslld $31, %xmm1, %xmm1
803 ; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm1
804 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm3, %ymm1
805 ; AVX1-NEXT:    vmovdqa %xmm2, (%rdi)
806 ; AVX1-NEXT:    retq
808 ; AVX2-LABEL: uaddo_v16i8:
809 ; AVX2:       # %bb.0:
810 ; AVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm2
811 ; AVX2-NEXT:    vpmaxub %xmm0, %xmm2, %xmm0
812 ; AVX2-NEXT:    vpcmpeqb %xmm0, %xmm2, %xmm0
813 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
814 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm1
815 ; AVX2-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
816 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} 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
817 ; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
818 ; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm0
819 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
820 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} 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
821 ; AVX2-NEXT:    vpslld $31, %ymm1, %ymm1
822 ; AVX2-NEXT:    vpsrad $31, %ymm1, %ymm1
823 ; AVX2-NEXT:    vmovdqa %xmm2, (%rdi)
824 ; AVX2-NEXT:    retq
826 ; AVX512-LABEL: uaddo_v16i8:
827 ; AVX512:       # %bb.0:
828 ; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm1
829 ; AVX512-NEXT:    vpcmpltub %xmm0, %xmm1, %k1
830 ; AVX512-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
831 ; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)
832 ; AVX512-NEXT:    retq
833   %t = call {<16 x i8>, <16 x i1>} @llvm.uadd.with.overflow.v16i8(<16 x i8> %a0, <16 x i8> %a1)
834   %val = extractvalue {<16 x i8>, <16 x i1>} %t, 0
835   %obit = extractvalue {<16 x i8>, <16 x i1>} %t, 1
836   %res = sext <16 x i1> %obit to <16 x i32>
837   store <16 x i8> %val, <16 x i8>* %p2
838   ret <16 x i32> %res
841 define <8 x i32> @uaddo_v8i16(<8 x i16> %a0, <8 x i16> %a1, <8 x i16>* %p2) nounwind {
842 ; SSE2-LABEL: uaddo_v8i16:
843 ; SSE2:       # %bb.0:
844 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
845 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [32768,32768,32768,32768,32768,32768,32768,32768]
846 ; SSE2-NEXT:    paddw %xmm0, %xmm1
847 ; SSE2-NEXT:    pxor %xmm3, %xmm2
848 ; SSE2-NEXT:    pxor %xmm1, %xmm3
849 ; SSE2-NEXT:    pcmpgtw %xmm3, %xmm2
850 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
851 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
852 ; SSE2-NEXT:    pslld $31, %xmm0
853 ; SSE2-NEXT:    psrad $31, %xmm0
854 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
855 ; SSE2-NEXT:    pslld $31, %xmm2
856 ; SSE2-NEXT:    psrad $31, %xmm2
857 ; SSE2-NEXT:    movdqa %xmm1, (%rdi)
858 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
859 ; SSE2-NEXT:    retq
861 ; SSSE3-LABEL: uaddo_v8i16:
862 ; SSSE3:       # %bb.0:
863 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
864 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [32768,32768,32768,32768,32768,32768,32768,32768]
865 ; SSSE3-NEXT:    paddw %xmm0, %xmm1
866 ; SSSE3-NEXT:    pxor %xmm3, %xmm2
867 ; SSSE3-NEXT:    pxor %xmm1, %xmm3
868 ; SSSE3-NEXT:    pcmpgtw %xmm3, %xmm2
869 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
870 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
871 ; SSSE3-NEXT:    pslld $31, %xmm0
872 ; SSSE3-NEXT:    psrad $31, %xmm0
873 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
874 ; SSSE3-NEXT:    pslld $31, %xmm2
875 ; SSSE3-NEXT:    psrad $31, %xmm2
876 ; SSSE3-NEXT:    movdqa %xmm1, (%rdi)
877 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
878 ; SSSE3-NEXT:    retq
880 ; SSE41-LABEL: uaddo_v8i16:
881 ; SSE41:       # %bb.0:
882 ; SSE41-NEXT:    paddw %xmm0, %xmm1
883 ; SSE41-NEXT:    pmaxuw %xmm1, %xmm0
884 ; SSE41-NEXT:    pcmpeqw %xmm1, %xmm0
885 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
886 ; SSE41-NEXT:    pxor %xmm0, %xmm2
887 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero
888 ; SSE41-NEXT:    pslld $31, %xmm0
889 ; SSE41-NEXT:    psrad $31, %xmm0
890 ; SSE41-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
891 ; SSE41-NEXT:    pslld $31, %xmm2
892 ; SSE41-NEXT:    psrad $31, %xmm2
893 ; SSE41-NEXT:    movdqa %xmm1, (%rdi)
894 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
895 ; SSE41-NEXT:    retq
897 ; AVX1-LABEL: uaddo_v8i16:
898 ; AVX1:       # %bb.0:
899 ; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm1
900 ; AVX1-NEXT:    vpmaxuw %xmm0, %xmm1, %xmm0
901 ; AVX1-NEXT:    vpcmpeqw %xmm0, %xmm1, %xmm0
902 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
903 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
904 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm2
905 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
906 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
907 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
908 ; AVX1-NEXT:    vmovdqa %xmm1, (%rdi)
909 ; AVX1-NEXT:    retq
911 ; AVX2-LABEL: uaddo_v8i16:
912 ; AVX2:       # %bb.0:
913 ; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm1
914 ; AVX2-NEXT:    vpmaxuw %xmm0, %xmm1, %xmm0
915 ; AVX2-NEXT:    vpcmpeqw %xmm0, %xmm1, %xmm0
916 ; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
917 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
918 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
919 ; AVX2-NEXT:    vmovdqa %xmm1, (%rdi)
920 ; AVX2-NEXT:    retq
922 ; AVX512-LABEL: uaddo_v8i16:
923 ; AVX512:       # %bb.0:
924 ; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm1
925 ; AVX512-NEXT:    vpcmpltuw %xmm0, %xmm1, %k1
926 ; AVX512-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
927 ; AVX512-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}
928 ; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)
929 ; AVX512-NEXT:    retq
930   %t = call {<8 x i16>, <8 x i1>} @llvm.uadd.with.overflow.v8i16(<8 x i16> %a0, <8 x i16> %a1)
931   %val = extractvalue {<8 x i16>, <8 x i1>} %t, 0
932   %obit = extractvalue {<8 x i16>, <8 x i1>} %t, 1
933   %res = sext <8 x i1> %obit to <8 x i32>
934   store <8 x i16> %val, <8 x i16>* %p2
935   ret <8 x i32> %res
938 define <2 x i32> @uaddo_v2i64(<2 x i64> %a0, <2 x i64> %a1, <2 x i64>* %p2) nounwind {
939 ; SSE-LABEL: uaddo_v2i64:
940 ; SSE:       # %bb.0:
941 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
942 ; SSE-NEXT:    paddq %xmm0, %xmm1
943 ; SSE-NEXT:    pxor %xmm2, %xmm0
944 ; SSE-NEXT:    pxor %xmm1, %xmm2
945 ; SSE-NEXT:    movdqa %xmm0, %xmm3
946 ; SSE-NEXT:    pcmpgtd %xmm2, %xmm3
947 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
948 ; SSE-NEXT:    pcmpeqd %xmm0, %xmm2
949 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
950 ; SSE-NEXT:    pand %xmm4, %xmm2
951 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
952 ; SSE-NEXT:    por %xmm2, %xmm0
953 ; SSE-NEXT:    movdqa %xmm1, (%rdi)
954 ; SSE-NEXT:    retq
956 ; AVX1-LABEL: uaddo_v2i64:
957 ; AVX1:       # %bb.0:
958 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
959 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm3
960 ; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm1
961 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm0
962 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm3, %xmm0
963 ; AVX1-NEXT:    vmovdqa %xmm1, (%rdi)
964 ; AVX1-NEXT:    retq
966 ; AVX2-LABEL: uaddo_v2i64:
967 ; AVX2:       # %bb.0:
968 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
969 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm3
970 ; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm1
971 ; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm0
972 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm3, %xmm0
973 ; AVX2-NEXT:    vmovdqa %xmm1, (%rdi)
974 ; AVX2-NEXT:    retq
976 ; AVX512-LABEL: uaddo_v2i64:
977 ; AVX512:       # %bb.0:
978 ; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm1
979 ; AVX512-NEXT:    vpcmpltuq %xmm0, %xmm1, %k1
980 ; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)
981 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
982 ; AVX512-NEXT:    vmovdqa64 %xmm0, %xmm0 {%k1} {z}
983 ; AVX512-NEXT:    retq
984   %t = call {<2 x i64>, <2 x i1>} @llvm.uadd.with.overflow.v2i64(<2 x i64> %a0, <2 x i64> %a1)
985   %val = extractvalue {<2 x i64>, <2 x i1>} %t, 0
986   %obit = extractvalue {<2 x i64>, <2 x i1>} %t, 1
987   %res = sext <2 x i1> %obit to <2 x i32>
988   store <2 x i64> %val, <2 x i64>* %p2
989   ret <2 x i32> %res
992 define <4 x i32> @uaddo_v4i24(<4 x i24> %a0, <4 x i24> %a1, <4 x i24>* %p2) nounwind {
993 ; SSE2-LABEL: uaddo_v4i24:
994 ; SSE2:       # %bb.0:
995 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
996 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
997 ; SSE2-NEXT:    pand %xmm3, %xmm1
998 ; SSE2-NEXT:    pand %xmm3, %xmm2
999 ; SSE2-NEXT:    paddd %xmm1, %xmm2
1000 ; SSE2-NEXT:    pand %xmm2, %xmm3
1001 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
1002 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0
1003 ; SSE2-NEXT:    pxor %xmm3, %xmm0
1004 ; SSE2-NEXT:    movd %xmm2, %eax
1005 ; SSE2-NEXT:    movw %ax, (%rdi)
1006 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[3,1,2,3]
1007 ; SSE2-NEXT:    movd %xmm1, %ecx
1008 ; SSE2-NEXT:    movw %cx, 9(%rdi)
1009 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
1010 ; SSE2-NEXT:    movd %xmm1, %edx
1011 ; SSE2-NEXT:    movw %dx, 6(%rdi)
1012 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,2,3]
1013 ; SSE2-NEXT:    movd %xmm1, %esi
1014 ; SSE2-NEXT:    movw %si, 3(%rdi)
1015 ; SSE2-NEXT:    shrl $16, %eax
1016 ; SSE2-NEXT:    movb %al, 2(%rdi)
1017 ; SSE2-NEXT:    shrl $16, %ecx
1018 ; SSE2-NEXT:    movb %cl, 11(%rdi)
1019 ; SSE2-NEXT:    shrl $16, %edx
1020 ; SSE2-NEXT:    movb %dl, 8(%rdi)
1021 ; SSE2-NEXT:    shrl $16, %esi
1022 ; SSE2-NEXT:    movb %sil, 5(%rdi)
1023 ; SSE2-NEXT:    retq
1025 ; SSSE3-LABEL: uaddo_v4i24:
1026 ; SSSE3:       # %bb.0:
1027 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
1028 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
1029 ; SSSE3-NEXT:    pand %xmm3, %xmm1
1030 ; SSSE3-NEXT:    pand %xmm3, %xmm2
1031 ; SSSE3-NEXT:    paddd %xmm1, %xmm2
1032 ; SSSE3-NEXT:    pand %xmm2, %xmm3
1033 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm3
1034 ; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm0
1035 ; SSSE3-NEXT:    pxor %xmm3, %xmm0
1036 ; SSSE3-NEXT:    movd %xmm2, %eax
1037 ; SSSE3-NEXT:    movw %ax, (%rdi)
1038 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[3,1,2,3]
1039 ; SSSE3-NEXT:    movd %xmm1, %ecx
1040 ; SSSE3-NEXT:    movw %cx, 9(%rdi)
1041 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
1042 ; SSSE3-NEXT:    movd %xmm1, %edx
1043 ; SSSE3-NEXT:    movw %dx, 6(%rdi)
1044 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,2,3]
1045 ; SSSE3-NEXT:    movd %xmm1, %esi
1046 ; SSSE3-NEXT:    movw %si, 3(%rdi)
1047 ; SSSE3-NEXT:    shrl $16, %eax
1048 ; SSSE3-NEXT:    movb %al, 2(%rdi)
1049 ; SSSE3-NEXT:    shrl $16, %ecx
1050 ; SSSE3-NEXT:    movb %cl, 11(%rdi)
1051 ; SSSE3-NEXT:    shrl $16, %edx
1052 ; SSSE3-NEXT:    movb %dl, 8(%rdi)
1053 ; SSSE3-NEXT:    shrl $16, %esi
1054 ; SSSE3-NEXT:    movb %sil, 5(%rdi)
1055 ; SSSE3-NEXT:    retq
1057 ; SSE41-LABEL: uaddo_v4i24:
1058 ; SSE41:       # %bb.0:
1059 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
1060 ; SSE41-NEXT:    pand %xmm2, %xmm1
1061 ; SSE41-NEXT:    pand %xmm2, %xmm0
1062 ; SSE41-NEXT:    paddd %xmm1, %xmm0
1063 ; SSE41-NEXT:    pand %xmm0, %xmm2
1064 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
1065 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
1066 ; SSE41-NEXT:    pxor %xmm2, %xmm1
1067 ; SSE41-NEXT:    pextrd $3, %xmm0, %eax
1068 ; SSE41-NEXT:    movw %ax, 9(%rdi)
1069 ; SSE41-NEXT:    pextrd $2, %xmm0, %ecx
1070 ; SSE41-NEXT:    movw %cx, 6(%rdi)
1071 ; SSE41-NEXT:    pextrd $1, %xmm0, %edx
1072 ; SSE41-NEXT:    movw %dx, 3(%rdi)
1073 ; SSE41-NEXT:    movd %xmm0, %esi
1074 ; SSE41-NEXT:    movw %si, (%rdi)
1075 ; SSE41-NEXT:    shrl $16, %eax
1076 ; SSE41-NEXT:    movb %al, 11(%rdi)
1077 ; SSE41-NEXT:    shrl $16, %ecx
1078 ; SSE41-NEXT:    movb %cl, 8(%rdi)
1079 ; SSE41-NEXT:    shrl $16, %edx
1080 ; SSE41-NEXT:    movb %dl, 5(%rdi)
1081 ; SSE41-NEXT:    shrl $16, %esi
1082 ; SSE41-NEXT:    movb %sil, 2(%rdi)
1083 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1084 ; SSE41-NEXT:    retq
1086 ; AVX1-LABEL: uaddo_v4i24:
1087 ; AVX1:       # %bb.0:
1088 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [2.35098856E-38,2.35098856E-38,2.35098856E-38,2.35098856E-38]
1089 ; AVX1-NEXT:    vandps %xmm2, %xmm1, %xmm1
1090 ; AVX1-NEXT:    vandps %xmm2, %xmm0, %xmm0
1091 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
1092 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm0
1093 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
1094 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1095 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
1096 ; AVX1-NEXT:    vpextrd $3, %xmm1, %eax
1097 ; AVX1-NEXT:    movw %ax, 9(%rdi)
1098 ; AVX1-NEXT:    vpextrd $2, %xmm1, %ecx
1099 ; AVX1-NEXT:    movw %cx, 6(%rdi)
1100 ; AVX1-NEXT:    vpextrd $1, %xmm1, %edx
1101 ; AVX1-NEXT:    movw %dx, 3(%rdi)
1102 ; AVX1-NEXT:    vmovd %xmm1, %esi
1103 ; AVX1-NEXT:    movw %si, (%rdi)
1104 ; AVX1-NEXT:    shrl $16, %eax
1105 ; AVX1-NEXT:    movb %al, 11(%rdi)
1106 ; AVX1-NEXT:    shrl $16, %ecx
1107 ; AVX1-NEXT:    movb %cl, 8(%rdi)
1108 ; AVX1-NEXT:    shrl $16, %edx
1109 ; AVX1-NEXT:    movb %dl, 5(%rdi)
1110 ; AVX1-NEXT:    shrl $16, %esi
1111 ; AVX1-NEXT:    movb %sil, 2(%rdi)
1112 ; AVX1-NEXT:    retq
1114 ; AVX2-LABEL: uaddo_v4i24:
1115 ; AVX2:       # %bb.0:
1116 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [16777215,16777215,16777215,16777215]
1117 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
1118 ; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
1119 ; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
1120 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm0
1121 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
1122 ; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1123 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
1124 ; AVX2-NEXT:    vpextrd $3, %xmm1, %eax
1125 ; AVX2-NEXT:    movw %ax, 9(%rdi)
1126 ; AVX2-NEXT:    vpextrd $2, %xmm1, %ecx
1127 ; AVX2-NEXT:    movw %cx, 6(%rdi)
1128 ; AVX2-NEXT:    vpextrd $1, %xmm1, %edx
1129 ; AVX2-NEXT:    movw %dx, 3(%rdi)
1130 ; AVX2-NEXT:    vmovd %xmm1, %esi
1131 ; AVX2-NEXT:    movw %si, (%rdi)
1132 ; AVX2-NEXT:    shrl $16, %eax
1133 ; AVX2-NEXT:    movb %al, 11(%rdi)
1134 ; AVX2-NEXT:    shrl $16, %ecx
1135 ; AVX2-NEXT:    movb %cl, 8(%rdi)
1136 ; AVX2-NEXT:    shrl $16, %edx
1137 ; AVX2-NEXT:    movb %dl, 5(%rdi)
1138 ; AVX2-NEXT:    shrl $16, %esi
1139 ; AVX2-NEXT:    movb %sil, 2(%rdi)
1140 ; AVX2-NEXT:    retq
1142 ; AVX512-LABEL: uaddo_v4i24:
1143 ; AVX512:       # %bb.0:
1144 ; AVX512-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [16777215,16777215,16777215,16777215]
1145 ; AVX512-NEXT:    vpand %xmm2, %xmm1, %xmm1
1146 ; AVX512-NEXT:    vpand %xmm2, %xmm0, %xmm0
1147 ; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
1148 ; AVX512-NEXT:    vpand %xmm2, %xmm1, %xmm0
1149 ; AVX512-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
1150 ; AVX512-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
1151 ; AVX512-NEXT:    vpextrd $3, %xmm1, %eax
1152 ; AVX512-NEXT:    movw %ax, 9(%rdi)
1153 ; AVX512-NEXT:    vpextrd $2, %xmm1, %ecx
1154 ; AVX512-NEXT:    movw %cx, 6(%rdi)
1155 ; AVX512-NEXT:    vpextrd $1, %xmm1, %edx
1156 ; AVX512-NEXT:    movw %dx, 3(%rdi)
1157 ; AVX512-NEXT:    vmovd %xmm1, %esi
1158 ; AVX512-NEXT:    movw %si, (%rdi)
1159 ; AVX512-NEXT:    shrl $16, %eax
1160 ; AVX512-NEXT:    movb %al, 11(%rdi)
1161 ; AVX512-NEXT:    shrl $16, %ecx
1162 ; AVX512-NEXT:    movb %cl, 8(%rdi)
1163 ; AVX512-NEXT:    shrl $16, %edx
1164 ; AVX512-NEXT:    movb %dl, 5(%rdi)
1165 ; AVX512-NEXT:    shrl $16, %esi
1166 ; AVX512-NEXT:    movb %sil, 2(%rdi)
1167 ; AVX512-NEXT:    retq
1168   %t = call {<4 x i24>, <4 x i1>} @llvm.uadd.with.overflow.v4i24(<4 x i24> %a0, <4 x i24> %a1)
1169   %val = extractvalue {<4 x i24>, <4 x i1>} %t, 0
1170   %obit = extractvalue {<4 x i24>, <4 x i1>} %t, 1
1171   %res = sext <4 x i1> %obit to <4 x i32>
1172   store <4 x i24> %val, <4 x i24>* %p2
1173   ret <4 x i32> %res
1176 define <4 x i32> @uaddo_v4i1(<4 x i1> %a0, <4 x i1> %a1, <4 x i1>* %p2) nounwind {
1177 ; SSE-LABEL: uaddo_v4i1:
1178 ; SSE:       # %bb.0:
1179 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [1,1,1,1]
1180 ; SSE-NEXT:    pand %xmm2, %xmm1
1181 ; SSE-NEXT:    pand %xmm2, %xmm0
1182 ; SSE-NEXT:    paddd %xmm1, %xmm0
1183 ; SSE-NEXT:    pand %xmm0, %xmm2
1184 ; SSE-NEXT:    pcmpeqd %xmm0, %xmm2
1185 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
1186 ; SSE-NEXT:    pxor %xmm2, %xmm1
1187 ; SSE-NEXT:    pslld $31, %xmm0
1188 ; SSE-NEXT:    movmskps %xmm0, %eax
1189 ; SSE-NEXT:    movb %al, (%rdi)
1190 ; SSE-NEXT:    movdqa %xmm1, %xmm0
1191 ; SSE-NEXT:    retq
1193 ; AVX1-LABEL: uaddo_v4i1:
1194 ; AVX1:       # %bb.0:
1195 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [1,1,1,1]
1196 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
1197 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
1198 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
1199 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm0
1200 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
1201 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1202 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
1203 ; AVX1-NEXT:    vpslld $31, %xmm1, %xmm1
1204 ; AVX1-NEXT:    vmovmskps %xmm1, %eax
1205 ; AVX1-NEXT:    movb %al, (%rdi)
1206 ; AVX1-NEXT:    retq
1208 ; AVX2-LABEL: uaddo_v4i1:
1209 ; AVX2:       # %bb.0:
1210 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [1,1,1,1]
1211 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
1212 ; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
1213 ; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
1214 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm0
1215 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
1216 ; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1217 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
1218 ; AVX2-NEXT:    vpslld $31, %xmm1, %xmm1
1219 ; AVX2-NEXT:    vmovmskps %xmm1, %eax
1220 ; AVX2-NEXT:    movb %al, (%rdi)
1221 ; AVX2-NEXT:    retq
1223 ; AVX512-LABEL: uaddo_v4i1:
1224 ; AVX512:       # %bb.0:
1225 ; AVX512-NEXT:    vpslld $31, %xmm0, %xmm0
1226 ; AVX512-NEXT:    vptestmd %xmm0, %xmm0, %k0
1227 ; AVX512-NEXT:    vpslld $31, %xmm1, %xmm1
1228 ; AVX512-NEXT:    vptestmd %xmm1, %xmm1, %k1
1229 ; AVX512-NEXT:    kxorw %k1, %k0, %k2
1230 ; AVX512-NEXT:    kxnorw %k1, %k0, %k1
1231 ; AVX512-NEXT:    vptestmd %xmm0, %xmm0, %k1 {%k1}
1232 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
1233 ; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
1234 ; AVX512-NEXT:    kmovd %k2, %eax
1235 ; AVX512-NEXT:    movb %al, (%rdi)
1236 ; AVX512-NEXT:    retq
1237   %t = call {<4 x i1>, <4 x i1>} @llvm.uadd.with.overflow.v4i1(<4 x i1> %a0, <4 x i1> %a1)
1238   %val = extractvalue {<4 x i1>, <4 x i1>} %t, 0
1239   %obit = extractvalue {<4 x i1>, <4 x i1>} %t, 1
1240   %res = sext <4 x i1> %obit to <4 x i32>
1241   store <4 x i1> %val, <4 x i1>* %p2
1242   ret <4 x i32> %res
1245 define <2 x i32> @uaddo_v2i128(<2 x i128> %a0, <2 x i128> %a1, <2 x i128>* %p2) nounwind {
1246 ; SSE2-LABEL: uaddo_v2i128:
1247 ; SSE2:       # %bb.0:
1248 ; SSE2-NEXT:    movq {{[0-9]+}}(%rsp), %r10
1249 ; SSE2-NEXT:    addq {{[0-9]+}}(%rsp), %rdx
1250 ; SSE2-NEXT:    adcq {{[0-9]+}}(%rsp), %rcx
1251 ; SSE2-NEXT:    setb %al
1252 ; SSE2-NEXT:    movzbl %al, %r11d
1253 ; SSE2-NEXT:    addq %r8, %rdi
1254 ; SSE2-NEXT:    adcq %r9, %rsi
1255 ; SSE2-NEXT:    setb %al
1256 ; SSE2-NEXT:    movzbl %al, %eax
1257 ; SSE2-NEXT:    movd %eax, %xmm0
1258 ; SSE2-NEXT:    pinsrw $4, %r11d, %xmm0
1259 ; SSE2-NEXT:    movq %rdx, 16(%r10)
1260 ; SSE2-NEXT:    movq %rdi, (%r10)
1261 ; SSE2-NEXT:    movq %rcx, 24(%r10)
1262 ; SSE2-NEXT:    movq %rsi, 8(%r10)
1263 ; SSE2-NEXT:    psllq $63, %xmm0
1264 ; SSE2-NEXT:    psrad $31, %xmm0
1265 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1266 ; SSE2-NEXT:    retq
1268 ; SSSE3-LABEL: uaddo_v2i128:
1269 ; SSSE3:       # %bb.0:
1270 ; SSSE3-NEXT:    movq {{[0-9]+}}(%rsp), %r10
1271 ; SSSE3-NEXT:    addq {{[0-9]+}}(%rsp), %rdx
1272 ; SSSE3-NEXT:    adcq {{[0-9]+}}(%rsp), %rcx
1273 ; SSSE3-NEXT:    setb %al
1274 ; SSSE3-NEXT:    movzbl %al, %r11d
1275 ; SSSE3-NEXT:    addq %r8, %rdi
1276 ; SSSE3-NEXT:    adcq %r9, %rsi
1277 ; SSSE3-NEXT:    setb %al
1278 ; SSSE3-NEXT:    movzbl %al, %eax
1279 ; SSSE3-NEXT:    movd %eax, %xmm0
1280 ; SSSE3-NEXT:    pinsrw $4, %r11d, %xmm0
1281 ; SSSE3-NEXT:    movq %rdx, 16(%r10)
1282 ; SSSE3-NEXT:    movq %rdi, (%r10)
1283 ; SSSE3-NEXT:    movq %rcx, 24(%r10)
1284 ; SSSE3-NEXT:    movq %rsi, 8(%r10)
1285 ; SSSE3-NEXT:    psllq $63, %xmm0
1286 ; SSSE3-NEXT:    psrad $31, %xmm0
1287 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1288 ; SSSE3-NEXT:    retq
1290 ; SSE41-LABEL: uaddo_v2i128:
1291 ; SSE41:       # %bb.0:
1292 ; SSE41-NEXT:    movq {{[0-9]+}}(%rsp), %r10
1293 ; SSE41-NEXT:    addq {{[0-9]+}}(%rsp), %rdx
1294 ; SSE41-NEXT:    adcq {{[0-9]+}}(%rsp), %rcx
1295 ; SSE41-NEXT:    setb %al
1296 ; SSE41-NEXT:    movzbl %al, %r11d
1297 ; SSE41-NEXT:    addq %r8, %rdi
1298 ; SSE41-NEXT:    adcq %r9, %rsi
1299 ; SSE41-NEXT:    setb %al
1300 ; SSE41-NEXT:    movzbl %al, %eax
1301 ; SSE41-NEXT:    movd %eax, %xmm0
1302 ; SSE41-NEXT:    pinsrb $8, %r11d, %xmm0
1303 ; SSE41-NEXT:    movq %rdx, 16(%r10)
1304 ; SSE41-NEXT:    movq %rdi, (%r10)
1305 ; SSE41-NEXT:    movq %rcx, 24(%r10)
1306 ; SSE41-NEXT:    movq %rsi, 8(%r10)
1307 ; SSE41-NEXT:    psllq $63, %xmm0
1308 ; SSE41-NEXT:    psrad $31, %xmm0
1309 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1310 ; SSE41-NEXT:    retq
1312 ; AVX1-LABEL: uaddo_v2i128:
1313 ; AVX1:       # %bb.0:
1314 ; AVX1-NEXT:    movq {{[0-9]+}}(%rsp), %r10
1315 ; AVX1-NEXT:    addq {{[0-9]+}}(%rsp), %rdx
1316 ; AVX1-NEXT:    adcq {{[0-9]+}}(%rsp), %rcx
1317 ; AVX1-NEXT:    setb %al
1318 ; AVX1-NEXT:    movzbl %al, %r11d
1319 ; AVX1-NEXT:    addq %r8, %rdi
1320 ; AVX1-NEXT:    adcq %r9, %rsi
1321 ; AVX1-NEXT:    setb %al
1322 ; AVX1-NEXT:    movzbl %al, %eax
1323 ; AVX1-NEXT:    vmovd %eax, %xmm0
1324 ; AVX1-NEXT:    vpinsrb $8, %r11d, %xmm0, %xmm0
1325 ; AVX1-NEXT:    movq %rdx, 16(%r10)
1326 ; AVX1-NEXT:    movq %rdi, (%r10)
1327 ; AVX1-NEXT:    movq %rcx, 24(%r10)
1328 ; AVX1-NEXT:    movq %rsi, 8(%r10)
1329 ; AVX1-NEXT:    vpsllq $63, %xmm0, %xmm0
1330 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1331 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm0
1332 ; AVX1-NEXT:    retq
1334 ; AVX2-LABEL: uaddo_v2i128:
1335 ; AVX2:       # %bb.0:
1336 ; AVX2-NEXT:    movq {{[0-9]+}}(%rsp), %r10
1337 ; AVX2-NEXT:    addq {{[0-9]+}}(%rsp), %rdx
1338 ; AVX2-NEXT:    adcq {{[0-9]+}}(%rsp), %rcx
1339 ; AVX2-NEXT:    setb %al
1340 ; AVX2-NEXT:    movzbl %al, %r11d
1341 ; AVX2-NEXT:    addq %r8, %rdi
1342 ; AVX2-NEXT:    adcq %r9, %rsi
1343 ; AVX2-NEXT:    setb %al
1344 ; AVX2-NEXT:    movzbl %al, %eax
1345 ; AVX2-NEXT:    vmovd %eax, %xmm0
1346 ; AVX2-NEXT:    vpinsrb $8, %r11d, %xmm0, %xmm0
1347 ; AVX2-NEXT:    movq %rdx, 16(%r10)
1348 ; AVX2-NEXT:    movq %rdi, (%r10)
1349 ; AVX2-NEXT:    movq %rcx, 24(%r10)
1350 ; AVX2-NEXT:    movq %rsi, 8(%r10)
1351 ; AVX2-NEXT:    vpsllq $63, %xmm0, %xmm0
1352 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1353 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm0
1354 ; AVX2-NEXT:    retq
1356 ; AVX512-LABEL: uaddo_v2i128:
1357 ; AVX512:       # %bb.0:
1358 ; AVX512-NEXT:    movq {{[0-9]+}}(%rsp), %r10
1359 ; AVX512-NEXT:    addq {{[0-9]+}}(%rsp), %rdx
1360 ; AVX512-NEXT:    adcq {{[0-9]+}}(%rsp), %rcx
1361 ; AVX512-NEXT:    setb %al
1362 ; AVX512-NEXT:    movb %al, -{{[0-9]+}}(%rsp)
1363 ; AVX512-NEXT:    addq %r8, %rdi
1364 ; AVX512-NEXT:    adcq %r9, %rsi
1365 ; AVX512-NEXT:    setb %al
1366 ; AVX512-NEXT:    movb %al, -{{[0-9]+}}(%rsp)
1367 ; AVX512-NEXT:    kmovw -{{[0-9]+}}(%rsp), %k1
1368 ; AVX512-NEXT:    movq %rdx, 16(%r10)
1369 ; AVX512-NEXT:    movq %rdi, (%r10)
1370 ; AVX512-NEXT:    movq %rcx, 24(%r10)
1371 ; AVX512-NEXT:    movq %rsi, 8(%r10)
1372 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
1373 ; AVX512-NEXT:    vmovdqa64 %xmm0, %xmm0 {%k1} {z}
1374 ; AVX512-NEXT:    retq
1375   %t = call {<2 x i128>, <2 x i1>} @llvm.uadd.with.overflow.v2i128(<2 x i128> %a0, <2 x i128> %a1)
1376   %val = extractvalue {<2 x i128>, <2 x i1>} %t, 0
1377   %obit = extractvalue {<2 x i128>, <2 x i1>} %t, 1
1378   %res = sext <2 x i1> %obit to <2 x i32>
1379   store <2 x i128> %val, <2 x i128>* %p2
1380   ret <2 x i32> %res