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:
28 ; SSE-NEXT: addl %esi, %edi
29 ; SSE-NEXT: sbbl %eax, %eax
30 ; SSE-NEXT: movl %edi, (%rdx)
33 ; AVX-LABEL: uaddo_v1i32:
35 ; AVX-NEXT: addl %esi, %edi
36 ; AVX-NEXT: sbbl %eax, %eax
37 ; AVX-NEXT: movl %edi, (%rdx)
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
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:
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
65 ; SSSE3-LABEL: uaddo_v2i32:
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
82 ; SSE41-LABEL: uaddo_v2i32:
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
97 ; AVX1-LABEL: uaddo_v2i32:
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)
111 ; AVX2-LABEL: uaddo_v2i32:
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)
125 ; AVX512-LABEL: uaddo_v2i32:
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
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
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:
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)
157 ; SSSE3-LABEL: uaddo_v3i32:
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)
169 ; SSE41-LABEL: uaddo_v3i32:
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)
180 ; AVX1-LABEL: uaddo_v3i32:
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)
191 ; AVX2-LABEL: uaddo_v3i32:
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)
202 ; AVX512-LABEL: uaddo_v3i32:
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)
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
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:
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)
230 ; SSSE3-LABEL: uaddo_v4i32:
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)
240 ; SSE41-LABEL: uaddo_v4i32:
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)
250 ; AVX1-LABEL: uaddo_v4i32:
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)
260 ; AVX2-LABEL: uaddo_v4i32:
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)
270 ; AVX512-LABEL: uaddo_v4i32:
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)
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
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:
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)
326 ; SSSE3-LABEL: uaddo_v6i32:
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)
365 ; SSE41-LABEL: uaddo_v6i32:
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)
396 ; AVX1-LABEL: uaddo_v6i32:
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: vinsertf128 $1, %xmm3, %ymm0, %ymm0
410 ; AVX1-NEXT: vmovq %xmm2, 16(%rdi)
411 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
414 ; AVX2-LABEL: uaddo_v6i32:
416 ; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm1
417 ; AVX2-NEXT: vpmaxud %ymm0, %ymm1, %ymm0
418 ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm1, %ymm0
419 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2
420 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
421 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
422 ; AVX2-NEXT: vmovq %xmm2, 16(%rdi)
423 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
426 ; AVX512-LABEL: uaddo_v6i32:
428 ; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm1
429 ; AVX512-NEXT: vpcmpltud %ymm0, %ymm1, %k1
430 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
431 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
432 ; AVX512-NEXT: vextracti128 $1, %ymm1, %xmm2
433 ; AVX512-NEXT: vmovq %xmm2, 16(%rdi)
434 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
436 %t = call {<6 x i32>, <6 x i1>} @llvm.uadd.with.overflow.v6i32(<6 x i32> %a0, <6 x i32> %a1)
437 %val = extractvalue {<6 x i32>, <6 x i1>} %t, 0
438 %obit = extractvalue {<6 x i32>, <6 x i1>} %t, 1
439 %res = sext <6 x i1> %obit to <6 x i32>
440 store <6 x i32> %val, <6 x i32>* %p2
444 define <8 x i32> @uaddo_v8i32(<8 x i32> %a0, <8 x i32> %a1, <8 x i32>* %p2) nounwind {
445 ; SSE2-LABEL: uaddo_v8i32:
447 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
448 ; SSE2-NEXT: paddd %xmm0, %xmm2
449 ; SSE2-NEXT: pxor %xmm4, %xmm0
450 ; SSE2-NEXT: movdqa %xmm2, (%rdi)
451 ; SSE2-NEXT: pxor %xmm4, %xmm2
452 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm0
453 ; SSE2-NEXT: paddd %xmm1, %xmm3
454 ; SSE2-NEXT: pxor %xmm4, %xmm1
455 ; SSE2-NEXT: pxor %xmm3, %xmm4
456 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm1
457 ; SSE2-NEXT: movdqa %xmm3, 16(%rdi)
460 ; SSSE3-LABEL: uaddo_v8i32:
462 ; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
463 ; SSSE3-NEXT: paddd %xmm0, %xmm2
464 ; SSSE3-NEXT: pxor %xmm4, %xmm0
465 ; SSSE3-NEXT: movdqa %xmm2, (%rdi)
466 ; SSSE3-NEXT: pxor %xmm4, %xmm2
467 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm0
468 ; SSSE3-NEXT: paddd %xmm1, %xmm3
469 ; SSSE3-NEXT: pxor %xmm4, %xmm1
470 ; SSSE3-NEXT: pxor %xmm3, %xmm4
471 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm1
472 ; SSSE3-NEXT: movdqa %xmm3, 16(%rdi)
475 ; SSE41-LABEL: uaddo_v8i32:
477 ; SSE41-NEXT: paddd %xmm0, %xmm2
478 ; SSE41-NEXT: pmaxud %xmm2, %xmm0
479 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm0
480 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm4
481 ; SSE41-NEXT: pxor %xmm4, %xmm0
482 ; SSE41-NEXT: paddd %xmm1, %xmm3
483 ; SSE41-NEXT: pmaxud %xmm3, %xmm1
484 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm1
485 ; SSE41-NEXT: pxor %xmm4, %xmm1
486 ; SSE41-NEXT: movdqa %xmm3, 16(%rdi)
487 ; SSE41-NEXT: movdqa %xmm2, (%rdi)
490 ; AVX1-LABEL: uaddo_v8i32:
492 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
493 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
494 ; AVX1-NEXT: vpaddd %xmm2, %xmm3, %xmm2
495 ; AVX1-NEXT: vpmaxud %xmm3, %xmm2, %xmm3
496 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm3
497 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
498 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
499 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1
500 ; AVX1-NEXT: vpmaxud %xmm0, %xmm1, %xmm0
501 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
502 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
503 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
504 ; AVX1-NEXT: vmovdqa %xmm2, 16(%rdi)
505 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
508 ; AVX2-LABEL: uaddo_v8i32:
510 ; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm1
511 ; AVX2-NEXT: vpmaxud %ymm0, %ymm1, %ymm0
512 ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm1, %ymm0
513 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2
514 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
515 ; AVX2-NEXT: vmovdqa %ymm1, (%rdi)
518 ; AVX512-LABEL: uaddo_v8i32:
520 ; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm1
521 ; AVX512-NEXT: vpcmpltud %ymm0, %ymm1, %k1
522 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
523 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
524 ; AVX512-NEXT: vmovdqa %ymm1, (%rdi)
526 %t = call {<8 x i32>, <8 x i1>} @llvm.uadd.with.overflow.v8i32(<8 x i32> %a0, <8 x i32> %a1)
527 %val = extractvalue {<8 x i32>, <8 x i1>} %t, 0
528 %obit = extractvalue {<8 x i32>, <8 x i1>} %t, 1
529 %res = sext <8 x i1> %obit to <8 x i32>
530 store <8 x i32> %val, <8 x i32>* %p2
534 define <16 x i32> @uaddo_v16i32(<16 x i32> %a0, <16 x i32> %a1, <16 x i32>* %p2) nounwind {
535 ; SSE2-LABEL: uaddo_v16i32:
537 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
538 ; SSE2-NEXT: paddd %xmm0, %xmm4
539 ; SSE2-NEXT: pxor %xmm8, %xmm0
540 ; SSE2-NEXT: movdqa %xmm4, (%rdi)
541 ; SSE2-NEXT: pxor %xmm8, %xmm4
542 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm0
543 ; SSE2-NEXT: paddd %xmm1, %xmm5
544 ; SSE2-NEXT: pxor %xmm8, %xmm1
545 ; SSE2-NEXT: movdqa %xmm5, 16(%rdi)
546 ; SSE2-NEXT: pxor %xmm8, %xmm5
547 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm1
548 ; SSE2-NEXT: paddd %xmm2, %xmm6
549 ; SSE2-NEXT: pxor %xmm8, %xmm2
550 ; SSE2-NEXT: movdqa %xmm6, 32(%rdi)
551 ; SSE2-NEXT: pxor %xmm8, %xmm6
552 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm2
553 ; SSE2-NEXT: paddd %xmm3, %xmm7
554 ; SSE2-NEXT: pxor %xmm8, %xmm3
555 ; SSE2-NEXT: pxor %xmm7, %xmm8
556 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm3
557 ; SSE2-NEXT: movdqa %xmm7, 48(%rdi)
560 ; SSSE3-LABEL: uaddo_v16i32:
562 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
563 ; SSSE3-NEXT: paddd %xmm0, %xmm4
564 ; SSSE3-NEXT: pxor %xmm8, %xmm0
565 ; SSSE3-NEXT: movdqa %xmm4, (%rdi)
566 ; SSSE3-NEXT: pxor %xmm8, %xmm4
567 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm0
568 ; SSSE3-NEXT: paddd %xmm1, %xmm5
569 ; SSSE3-NEXT: pxor %xmm8, %xmm1
570 ; SSSE3-NEXT: movdqa %xmm5, 16(%rdi)
571 ; SSSE3-NEXT: pxor %xmm8, %xmm5
572 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm1
573 ; SSSE3-NEXT: paddd %xmm2, %xmm6
574 ; SSSE3-NEXT: pxor %xmm8, %xmm2
575 ; SSSE3-NEXT: movdqa %xmm6, 32(%rdi)
576 ; SSSE3-NEXT: pxor %xmm8, %xmm6
577 ; SSSE3-NEXT: pcmpgtd %xmm6, %xmm2
578 ; SSSE3-NEXT: paddd %xmm3, %xmm7
579 ; SSSE3-NEXT: pxor %xmm8, %xmm3
580 ; SSSE3-NEXT: pxor %xmm7, %xmm8
581 ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm3
582 ; SSSE3-NEXT: movdqa %xmm7, 48(%rdi)
585 ; SSE41-LABEL: uaddo_v16i32:
587 ; SSE41-NEXT: paddd %xmm0, %xmm4
588 ; SSE41-NEXT: pmaxud %xmm4, %xmm0
589 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm0
590 ; SSE41-NEXT: pcmpeqd %xmm8, %xmm8
591 ; SSE41-NEXT: pxor %xmm8, %xmm0
592 ; SSE41-NEXT: paddd %xmm1, %xmm5
593 ; SSE41-NEXT: pmaxud %xmm5, %xmm1
594 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm1
595 ; SSE41-NEXT: pxor %xmm8, %xmm1
596 ; SSE41-NEXT: paddd %xmm2, %xmm6
597 ; SSE41-NEXT: pmaxud %xmm6, %xmm2
598 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm2
599 ; SSE41-NEXT: pxor %xmm8, %xmm2
600 ; SSE41-NEXT: paddd %xmm3, %xmm7
601 ; SSE41-NEXT: pmaxud %xmm7, %xmm3
602 ; SSE41-NEXT: pcmpeqd %xmm7, %xmm3
603 ; SSE41-NEXT: pxor %xmm8, %xmm3
604 ; SSE41-NEXT: movdqa %xmm7, 48(%rdi)
605 ; SSE41-NEXT: movdqa %xmm6, 32(%rdi)
606 ; SSE41-NEXT: movdqa %xmm5, 16(%rdi)
607 ; SSE41-NEXT: movdqa %xmm4, (%rdi)
610 ; AVX1-LABEL: uaddo_v16i32:
612 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
613 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
614 ; AVX1-NEXT: vpaddd %xmm4, %xmm5, %xmm4
615 ; AVX1-NEXT: vpmaxud %xmm5, %xmm4, %xmm5
616 ; AVX1-NEXT: vpcmpeqd %xmm5, %xmm4, %xmm5
617 ; AVX1-NEXT: vpcmpeqd %xmm6, %xmm6, %xmm6
618 ; AVX1-NEXT: vpxor %xmm6, %xmm5, %xmm5
619 ; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm3
620 ; AVX1-NEXT: vpmaxud %xmm1, %xmm3, %xmm1
621 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm3, %xmm1
622 ; AVX1-NEXT: vpxor %xmm6, %xmm1, %xmm1
623 ; AVX1-NEXT: vpackssdw %xmm5, %xmm1, %xmm1
624 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5
625 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7
626 ; AVX1-NEXT: vpaddd %xmm5, %xmm7, %xmm5
627 ; AVX1-NEXT: vpmaxud %xmm7, %xmm5, %xmm7
628 ; AVX1-NEXT: vpcmpeqd %xmm7, %xmm5, %xmm7
629 ; AVX1-NEXT: vpxor %xmm6, %xmm7, %xmm7
630 ; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm2
631 ; AVX1-NEXT: vpmaxud %xmm0, %xmm2, %xmm0
632 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm2, %xmm0
633 ; AVX1-NEXT: vpxor %xmm6, %xmm0, %xmm0
634 ; AVX1-NEXT: vpackssdw %xmm7, %xmm0, %xmm0
635 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm1
636 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0
637 ; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm1[1,1,2,3]
638 ; AVX1-NEXT: vpmovsxbd %xmm6, %xmm6
639 ; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm0, %ymm0
640 ; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm1[2,3,0,1]
641 ; AVX1-NEXT: vpmovsxbd %xmm6, %xmm6
642 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,0,1]
643 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
644 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm6, %ymm1
645 ; AVX1-NEXT: vmovdqa %xmm4, 48(%rdi)
646 ; AVX1-NEXT: vmovdqa %xmm3, 32(%rdi)
647 ; AVX1-NEXT: vmovdqa %xmm5, 16(%rdi)
648 ; AVX1-NEXT: vmovdqa %xmm2, (%rdi)
651 ; AVX2-LABEL: uaddo_v16i32:
653 ; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm3
654 ; AVX2-NEXT: vpmaxud %ymm1, %ymm3, %ymm1
655 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1
656 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4
657 ; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1
658 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5
659 ; AVX2-NEXT: vpackssdw %xmm5, %xmm1, %xmm1
660 ; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm2
661 ; AVX2-NEXT: vpmaxud %ymm0, %ymm2, %ymm0
662 ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm2, %ymm0
663 ; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm0
664 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4
665 ; AVX2-NEXT: vpackssdw %xmm4, %xmm0, %xmm0
666 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1
667 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0
668 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
669 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1
670 ; AVX2-NEXT: vmovdqa %ymm3, 32(%rdi)
671 ; AVX2-NEXT: vmovdqa %ymm2, (%rdi)
674 ; AVX512-LABEL: uaddo_v16i32:
676 ; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm1
677 ; AVX512-NEXT: vpcmpltud %zmm0, %zmm1, %k1
678 ; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
679 ; AVX512-NEXT: vmovdqa64 %zmm1, (%rdi)
681 %t = call {<16 x i32>, <16 x i1>} @llvm.uadd.with.overflow.v16i32(<16 x i32> %a0, <16 x i32> %a1)
682 %val = extractvalue {<16 x i32>, <16 x i1>} %t, 0
683 %obit = extractvalue {<16 x i32>, <16 x i1>} %t, 1
684 %res = sext <16 x i1> %obit to <16 x i32>
685 store <16 x i32> %val, <16 x i32>* %p2
689 define <16 x i32> @uaddo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nounwind {
690 ; SSE2-LABEL: uaddo_v16i8:
692 ; SSE2-NEXT: paddb %xmm0, %xmm1
693 ; SSE2-NEXT: pmaxub %xmm1, %xmm0
694 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm0
695 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm3
696 ; SSE2-NEXT: pxor %xmm0, %xmm3
697 ; SSE2-NEXT: movdqa %xmm3, %xmm4
698 ; 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]
699 ; SSE2-NEXT: movdqa %xmm4, %xmm0
700 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
701 ; SSE2-NEXT: pslld $31, %xmm0
702 ; SSE2-NEXT: psrad $31, %xmm0
703 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]
704 ; SSE2-NEXT: pslld $31, %xmm4
705 ; SSE2-NEXT: psrad $31, %xmm4
706 ; 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]
707 ; SSE2-NEXT: movdqa %xmm3, %xmm2
708 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
709 ; SSE2-NEXT: pslld $31, %xmm2
710 ; SSE2-NEXT: psrad $31, %xmm2
711 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
712 ; SSE2-NEXT: pslld $31, %xmm3
713 ; SSE2-NEXT: psrad $31, %xmm3
714 ; SSE2-NEXT: movdqa %xmm1, (%rdi)
715 ; SSE2-NEXT: movdqa %xmm4, %xmm1
718 ; SSSE3-LABEL: uaddo_v16i8:
720 ; SSSE3-NEXT: paddb %xmm0, %xmm1
721 ; SSSE3-NEXT: pmaxub %xmm1, %xmm0
722 ; SSSE3-NEXT: pcmpeqb %xmm1, %xmm0
723 ; SSSE3-NEXT: pcmpeqd %xmm3, %xmm3
724 ; SSSE3-NEXT: pxor %xmm0, %xmm3
725 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
726 ; 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]
727 ; SSSE3-NEXT: movdqa %xmm4, %xmm0
728 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
729 ; SSSE3-NEXT: pslld $31, %xmm0
730 ; SSSE3-NEXT: psrad $31, %xmm0
731 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]
732 ; SSSE3-NEXT: pslld $31, %xmm4
733 ; SSSE3-NEXT: psrad $31, %xmm4
734 ; 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]
735 ; SSSE3-NEXT: movdqa %xmm3, %xmm2
736 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
737 ; SSSE3-NEXT: pslld $31, %xmm2
738 ; SSSE3-NEXT: psrad $31, %xmm2
739 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
740 ; SSSE3-NEXT: pslld $31, %xmm3
741 ; SSSE3-NEXT: psrad $31, %xmm3
742 ; SSSE3-NEXT: movdqa %xmm1, (%rdi)
743 ; SSSE3-NEXT: movdqa %xmm4, %xmm1
746 ; SSE41-LABEL: uaddo_v16i8:
748 ; SSE41-NEXT: paddb %xmm0, %xmm1
749 ; SSE41-NEXT: pmaxub %xmm1, %xmm0
750 ; SSE41-NEXT: pcmpeqb %xmm1, %xmm0
751 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm3
752 ; SSE41-NEXT: pxor %xmm0, %xmm3
753 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
754 ; SSE41-NEXT: pslld $31, %xmm0
755 ; SSE41-NEXT: psrad $31, %xmm0
756 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,2,3]
757 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm4 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
758 ; SSE41-NEXT: pslld $31, %xmm4
759 ; SSE41-NEXT: psrad $31, %xmm4
760 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[2,3,0,1]
761 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
762 ; SSE41-NEXT: pslld $31, %xmm2
763 ; SSE41-NEXT: psrad $31, %xmm2
764 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[3,1,2,3]
765 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
766 ; SSE41-NEXT: pslld $31, %xmm3
767 ; SSE41-NEXT: psrad $31, %xmm3
768 ; SSE41-NEXT: movdqa %xmm1, (%rdi)
769 ; SSE41-NEXT: movdqa %xmm4, %xmm1
772 ; AVX1-LABEL: uaddo_v16i8:
774 ; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm2
775 ; AVX1-NEXT: vpmaxub %xmm0, %xmm2, %xmm0
776 ; AVX1-NEXT: vpcmpeqb %xmm0, %xmm2, %xmm0
777 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
778 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm1
779 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0
780 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[1,1,2,3]
781 ; AVX1-NEXT: vpmovsxbd %xmm3, %xmm3
782 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
783 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
784 ; AVX1-NEXT: vpmovsxbd %xmm3, %xmm3
785 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,0,1]
786 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
787 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm1
788 ; AVX1-NEXT: vmovdqa %xmm2, (%rdi)
791 ; AVX2-LABEL: uaddo_v16i8:
793 ; AVX2-NEXT: vpaddb %xmm1, %xmm0, %xmm2
794 ; AVX2-NEXT: vpmaxub %xmm0, %xmm2, %xmm0
795 ; AVX2-NEXT: vpcmpeqb %xmm0, %xmm2, %xmm0
796 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
797 ; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm1
798 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0
799 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
800 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1
801 ; AVX2-NEXT: vmovdqa %xmm2, (%rdi)
804 ; AVX512-LABEL: uaddo_v16i8:
806 ; AVX512-NEXT: vpaddb %xmm1, %xmm0, %xmm1
807 ; AVX512-NEXT: vpcmpltub %xmm0, %xmm1, %k1
808 ; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
809 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
811 %t = call {<16 x i8>, <16 x i1>} @llvm.uadd.with.overflow.v16i8(<16 x i8> %a0, <16 x i8> %a1)
812 %val = extractvalue {<16 x i8>, <16 x i1>} %t, 0
813 %obit = extractvalue {<16 x i8>, <16 x i1>} %t, 1
814 %res = sext <16 x i1> %obit to <16 x i32>
815 store <16 x i8> %val, <16 x i8>* %p2
819 define <8 x i32> @uaddo_v8i16(<8 x i16> %a0, <8 x i16> %a1, <8 x i16>* %p2) nounwind {
820 ; SSE2-LABEL: uaddo_v8i16:
822 ; SSE2-NEXT: movdqa %xmm0, %xmm2
823 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [32768,32768,32768,32768,32768,32768,32768,32768]
824 ; SSE2-NEXT: paddw %xmm0, %xmm1
825 ; SSE2-NEXT: pxor %xmm3, %xmm2
826 ; SSE2-NEXT: pxor %xmm1, %xmm3
827 ; SSE2-NEXT: pcmpgtw %xmm3, %xmm2
828 ; SSE2-NEXT: movdqa %xmm2, %xmm0
829 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
830 ; SSE2-NEXT: pslld $31, %xmm0
831 ; SSE2-NEXT: psrad $31, %xmm0
832 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
833 ; SSE2-NEXT: pslld $31, %xmm2
834 ; SSE2-NEXT: psrad $31, %xmm2
835 ; SSE2-NEXT: movdqa %xmm1, (%rdi)
836 ; SSE2-NEXT: movdqa %xmm2, %xmm1
839 ; SSSE3-LABEL: uaddo_v8i16:
841 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
842 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [32768,32768,32768,32768,32768,32768,32768,32768]
843 ; SSSE3-NEXT: paddw %xmm0, %xmm1
844 ; SSSE3-NEXT: pxor %xmm3, %xmm2
845 ; SSSE3-NEXT: pxor %xmm1, %xmm3
846 ; SSSE3-NEXT: pcmpgtw %xmm3, %xmm2
847 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
848 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
849 ; SSSE3-NEXT: pslld $31, %xmm0
850 ; SSSE3-NEXT: psrad $31, %xmm0
851 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
852 ; SSSE3-NEXT: pslld $31, %xmm2
853 ; SSSE3-NEXT: psrad $31, %xmm2
854 ; SSSE3-NEXT: movdqa %xmm1, (%rdi)
855 ; SSSE3-NEXT: movdqa %xmm2, %xmm1
858 ; SSE41-LABEL: uaddo_v8i16:
860 ; SSE41-NEXT: paddw %xmm0, %xmm1
861 ; SSE41-NEXT: pmaxuw %xmm1, %xmm0
862 ; SSE41-NEXT: pcmpeqw %xmm1, %xmm0
863 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm2
864 ; SSE41-NEXT: pxor %xmm0, %xmm2
865 ; SSE41-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero
866 ; SSE41-NEXT: pslld $31, %xmm0
867 ; SSE41-NEXT: psrad $31, %xmm0
868 ; SSE41-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
869 ; SSE41-NEXT: pslld $31, %xmm2
870 ; SSE41-NEXT: psrad $31, %xmm2
871 ; SSE41-NEXT: movdqa %xmm1, (%rdi)
872 ; SSE41-NEXT: movdqa %xmm2, %xmm1
875 ; AVX1-LABEL: uaddo_v8i16:
877 ; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm1
878 ; AVX1-NEXT: vpmaxuw %xmm0, %xmm1, %xmm0
879 ; AVX1-NEXT: vpcmpeqw %xmm0, %xmm1, %xmm0
880 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
881 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
882 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm2
883 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
884 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm0
885 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
886 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
889 ; AVX2-LABEL: uaddo_v8i16:
891 ; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm1
892 ; AVX2-NEXT: vpmaxuw %xmm0, %xmm1, %xmm0
893 ; AVX2-NEXT: vpcmpeqw %xmm0, %xmm1, %xmm0
894 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
895 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
896 ; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0
897 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
900 ; AVX512-LABEL: uaddo_v8i16:
902 ; AVX512-NEXT: vpaddw %xmm1, %xmm0, %xmm1
903 ; AVX512-NEXT: vpcmpltuw %xmm0, %xmm1, %k1
904 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
905 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
906 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
908 %t = call {<8 x i16>, <8 x i1>} @llvm.uadd.with.overflow.v8i16(<8 x i16> %a0, <8 x i16> %a1)
909 %val = extractvalue {<8 x i16>, <8 x i1>} %t, 0
910 %obit = extractvalue {<8 x i16>, <8 x i1>} %t, 1
911 %res = sext <8 x i1> %obit to <8 x i32>
912 store <8 x i16> %val, <8 x i16>* %p2
916 define <2 x i32> @uaddo_v2i64(<2 x i64> %a0, <2 x i64> %a1, <2 x i64>* %p2) nounwind {
917 ; SSE-LABEL: uaddo_v2i64:
919 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
920 ; SSE-NEXT: paddq %xmm0, %xmm1
921 ; SSE-NEXT: pxor %xmm2, %xmm0
922 ; SSE-NEXT: pxor %xmm1, %xmm2
923 ; SSE-NEXT: movdqa %xmm0, %xmm3
924 ; SSE-NEXT: pcmpgtd %xmm2, %xmm3
925 ; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
926 ; SSE-NEXT: pcmpeqd %xmm0, %xmm2
927 ; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
928 ; SSE-NEXT: pand %xmm4, %xmm2
929 ; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
930 ; SSE-NEXT: por %xmm2, %xmm0
931 ; SSE-NEXT: movdqa %xmm1, (%rdi)
934 ; AVX1-LABEL: uaddo_v2i64:
936 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
937 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm3
938 ; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm1
939 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm0
940 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm0
941 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
944 ; AVX2-LABEL: uaddo_v2i64:
946 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
947 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm3
948 ; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm1
949 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm0
950 ; AVX2-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm0
951 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
954 ; AVX512-LABEL: uaddo_v2i64:
956 ; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm1
957 ; AVX512-NEXT: vpcmpltuq %xmm0, %xmm1, %k1
958 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
959 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
960 ; AVX512-NEXT: vmovdqa64 %xmm0, %xmm0 {%k1} {z}
962 %t = call {<2 x i64>, <2 x i1>} @llvm.uadd.with.overflow.v2i64(<2 x i64> %a0, <2 x i64> %a1)
963 %val = extractvalue {<2 x i64>, <2 x i1>} %t, 0
964 %obit = extractvalue {<2 x i64>, <2 x i1>} %t, 1
965 %res = sext <2 x i1> %obit to <2 x i32>
966 store <2 x i64> %val, <2 x i64>* %p2
970 define <4 x i32> @uaddo_v4i24(<4 x i24> %a0, <4 x i24> %a1, <4 x i24>* %p2) nounwind {
971 ; SSE2-LABEL: uaddo_v4i24:
973 ; SSE2-NEXT: movdqa %xmm0, %xmm2
974 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
975 ; SSE2-NEXT: pand %xmm3, %xmm1
976 ; SSE2-NEXT: pand %xmm3, %xmm2
977 ; SSE2-NEXT: paddd %xmm1, %xmm2
978 ; SSE2-NEXT: pand %xmm2, %xmm3
979 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3
980 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
981 ; SSE2-NEXT: pxor %xmm3, %xmm0
982 ; SSE2-NEXT: movd %xmm2, %eax
983 ; SSE2-NEXT: movw %ax, (%rdi)
984 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[3,1,2,3]
985 ; SSE2-NEXT: movd %xmm1, %ecx
986 ; SSE2-NEXT: movw %cx, 9(%rdi)
987 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
988 ; SSE2-NEXT: movd %xmm1, %edx
989 ; SSE2-NEXT: movw %dx, 6(%rdi)
990 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,2,3]
991 ; SSE2-NEXT: movd %xmm1, %esi
992 ; SSE2-NEXT: movw %si, 3(%rdi)
993 ; SSE2-NEXT: shrl $16, %eax
994 ; SSE2-NEXT: movb %al, 2(%rdi)
995 ; SSE2-NEXT: shrl $16, %ecx
996 ; SSE2-NEXT: movb %cl, 11(%rdi)
997 ; SSE2-NEXT: shrl $16, %edx
998 ; SSE2-NEXT: movb %dl, 8(%rdi)
999 ; SSE2-NEXT: shrl $16, %esi
1000 ; SSE2-NEXT: movb %sil, 5(%rdi)
1003 ; SSSE3-LABEL: uaddo_v4i24:
1005 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
1006 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
1007 ; SSSE3-NEXT: pand %xmm3, %xmm1
1008 ; SSSE3-NEXT: pand %xmm3, %xmm2
1009 ; SSSE3-NEXT: paddd %xmm1, %xmm2
1010 ; SSSE3-NEXT: pand %xmm2, %xmm3
1011 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm3
1012 ; SSSE3-NEXT: pcmpeqd %xmm0, %xmm0
1013 ; SSSE3-NEXT: pxor %xmm3, %xmm0
1014 ; SSSE3-NEXT: movd %xmm2, %eax
1015 ; SSSE3-NEXT: movw %ax, (%rdi)
1016 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[3,1,2,3]
1017 ; SSSE3-NEXT: movd %xmm1, %ecx
1018 ; SSSE3-NEXT: movw %cx, 9(%rdi)
1019 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
1020 ; SSSE3-NEXT: movd %xmm1, %edx
1021 ; SSSE3-NEXT: movw %dx, 6(%rdi)
1022 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,2,3]
1023 ; SSSE3-NEXT: movd %xmm1, %esi
1024 ; SSSE3-NEXT: movw %si, 3(%rdi)
1025 ; SSSE3-NEXT: shrl $16, %eax
1026 ; SSSE3-NEXT: movb %al, 2(%rdi)
1027 ; SSSE3-NEXT: shrl $16, %ecx
1028 ; SSSE3-NEXT: movb %cl, 11(%rdi)
1029 ; SSSE3-NEXT: shrl $16, %edx
1030 ; SSSE3-NEXT: movb %dl, 8(%rdi)
1031 ; SSSE3-NEXT: shrl $16, %esi
1032 ; SSSE3-NEXT: movb %sil, 5(%rdi)
1035 ; SSE41-LABEL: uaddo_v4i24:
1037 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
1038 ; SSE41-NEXT: pand %xmm2, %xmm1
1039 ; SSE41-NEXT: pand %xmm2, %xmm0
1040 ; SSE41-NEXT: paddd %xmm1, %xmm0
1041 ; SSE41-NEXT: pand %xmm0, %xmm2
1042 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
1043 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1044 ; SSE41-NEXT: pxor %xmm2, %xmm1
1045 ; SSE41-NEXT: pextrd $3, %xmm0, %eax
1046 ; SSE41-NEXT: movw %ax, 9(%rdi)
1047 ; SSE41-NEXT: pextrd $2, %xmm0, %ecx
1048 ; SSE41-NEXT: movw %cx, 6(%rdi)
1049 ; SSE41-NEXT: pextrd $1, %xmm0, %edx
1050 ; SSE41-NEXT: movw %dx, 3(%rdi)
1051 ; SSE41-NEXT: movd %xmm0, %esi
1052 ; SSE41-NEXT: movw %si, (%rdi)
1053 ; SSE41-NEXT: shrl $16, %eax
1054 ; SSE41-NEXT: movb %al, 11(%rdi)
1055 ; SSE41-NEXT: shrl $16, %ecx
1056 ; SSE41-NEXT: movb %cl, 8(%rdi)
1057 ; SSE41-NEXT: shrl $16, %edx
1058 ; SSE41-NEXT: movb %dl, 5(%rdi)
1059 ; SSE41-NEXT: shrl $16, %esi
1060 ; SSE41-NEXT: movb %sil, 2(%rdi)
1061 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1064 ; AVX1-LABEL: uaddo_v4i24:
1066 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [2.35098856E-38,2.35098856E-38,2.35098856E-38,2.35098856E-38]
1067 ; AVX1-NEXT: vandps %xmm2, %xmm1, %xmm1
1068 ; AVX1-NEXT: vandps %xmm2, %xmm0, %xmm0
1069 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1
1070 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm0
1071 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1072 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1073 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
1074 ; AVX1-NEXT: vpextrd $3, %xmm1, %eax
1075 ; AVX1-NEXT: movw %ax, 9(%rdi)
1076 ; AVX1-NEXT: vpextrd $2, %xmm1, %ecx
1077 ; AVX1-NEXT: movw %cx, 6(%rdi)
1078 ; AVX1-NEXT: vpextrd $1, %xmm1, %edx
1079 ; AVX1-NEXT: movw %dx, 3(%rdi)
1080 ; AVX1-NEXT: vmovd %xmm1, %esi
1081 ; AVX1-NEXT: movw %si, (%rdi)
1082 ; AVX1-NEXT: shrl $16, %eax
1083 ; AVX1-NEXT: movb %al, 11(%rdi)
1084 ; AVX1-NEXT: shrl $16, %ecx
1085 ; AVX1-NEXT: movb %cl, 8(%rdi)
1086 ; AVX1-NEXT: shrl $16, %edx
1087 ; AVX1-NEXT: movb %dl, 5(%rdi)
1088 ; AVX1-NEXT: shrl $16, %esi
1089 ; AVX1-NEXT: movb %sil, 2(%rdi)
1092 ; AVX2-LABEL: uaddo_v4i24:
1094 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [16777215,16777215,16777215,16777215]
1095 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1
1096 ; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
1097 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm1
1098 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm0
1099 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1100 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1101 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
1102 ; AVX2-NEXT: vpextrd $3, %xmm1, %eax
1103 ; AVX2-NEXT: movw %ax, 9(%rdi)
1104 ; AVX2-NEXT: vpextrd $2, %xmm1, %ecx
1105 ; AVX2-NEXT: movw %cx, 6(%rdi)
1106 ; AVX2-NEXT: vpextrd $1, %xmm1, %edx
1107 ; AVX2-NEXT: movw %dx, 3(%rdi)
1108 ; AVX2-NEXT: vmovd %xmm1, %esi
1109 ; AVX2-NEXT: movw %si, (%rdi)
1110 ; AVX2-NEXT: shrl $16, %eax
1111 ; AVX2-NEXT: movb %al, 11(%rdi)
1112 ; AVX2-NEXT: shrl $16, %ecx
1113 ; AVX2-NEXT: movb %cl, 8(%rdi)
1114 ; AVX2-NEXT: shrl $16, %edx
1115 ; AVX2-NEXT: movb %dl, 5(%rdi)
1116 ; AVX2-NEXT: shrl $16, %esi
1117 ; AVX2-NEXT: movb %sil, 2(%rdi)
1120 ; AVX512-LABEL: uaddo_v4i24:
1122 ; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm2 = [16777215,16777215,16777215,16777215]
1123 ; AVX512-NEXT: vpand %xmm2, %xmm1, %xmm1
1124 ; AVX512-NEXT: vpand %xmm2, %xmm0, %xmm0
1125 ; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm1
1126 ; AVX512-NEXT: vpand %xmm2, %xmm1, %xmm0
1127 ; AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1128 ; AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
1129 ; AVX512-NEXT: vpextrd $3, %xmm1, %eax
1130 ; AVX512-NEXT: movw %ax, 9(%rdi)
1131 ; AVX512-NEXT: vpextrd $2, %xmm1, %ecx
1132 ; AVX512-NEXT: movw %cx, 6(%rdi)
1133 ; AVX512-NEXT: vpextrd $1, %xmm1, %edx
1134 ; AVX512-NEXT: movw %dx, 3(%rdi)
1135 ; AVX512-NEXT: vmovd %xmm1, %esi
1136 ; AVX512-NEXT: movw %si, (%rdi)
1137 ; AVX512-NEXT: shrl $16, %eax
1138 ; AVX512-NEXT: movb %al, 11(%rdi)
1139 ; AVX512-NEXT: shrl $16, %ecx
1140 ; AVX512-NEXT: movb %cl, 8(%rdi)
1141 ; AVX512-NEXT: shrl $16, %edx
1142 ; AVX512-NEXT: movb %dl, 5(%rdi)
1143 ; AVX512-NEXT: shrl $16, %esi
1144 ; AVX512-NEXT: movb %sil, 2(%rdi)
1146 %t = call {<4 x i24>, <4 x i1>} @llvm.uadd.with.overflow.v4i24(<4 x i24> %a0, <4 x i24> %a1)
1147 %val = extractvalue {<4 x i24>, <4 x i1>} %t, 0
1148 %obit = extractvalue {<4 x i24>, <4 x i1>} %t, 1
1149 %res = sext <4 x i1> %obit to <4 x i32>
1150 store <4 x i24> %val, <4 x i24>* %p2
1154 define <4 x i32> @uaddo_v4i1(<4 x i1> %a0, <4 x i1> %a1, <4 x i1>* %p2) nounwind {
1155 ; SSE-LABEL: uaddo_v4i1:
1157 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [1,1,1,1]
1158 ; SSE-NEXT: pand %xmm2, %xmm1
1159 ; SSE-NEXT: pand %xmm2, %xmm0
1160 ; SSE-NEXT: paddd %xmm1, %xmm0
1161 ; SSE-NEXT: pand %xmm0, %xmm2
1162 ; SSE-NEXT: pcmpeqd %xmm0, %xmm2
1163 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1
1164 ; SSE-NEXT: pxor %xmm2, %xmm1
1165 ; SSE-NEXT: pslld $31, %xmm0
1166 ; SSE-NEXT: movmskps %xmm0, %eax
1167 ; SSE-NEXT: movb %al, (%rdi)
1168 ; SSE-NEXT: movdqa %xmm1, %xmm0
1171 ; AVX1-LABEL: uaddo_v4i1:
1173 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [1,1,1,1]
1174 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
1175 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
1176 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1
1177 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm0
1178 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1179 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1180 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
1181 ; AVX1-NEXT: vpslld $31, %xmm1, %xmm1
1182 ; AVX1-NEXT: vmovmskps %xmm1, %eax
1183 ; AVX1-NEXT: movb %al, (%rdi)
1186 ; AVX2-LABEL: uaddo_v4i1:
1188 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [1,1,1,1]
1189 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1
1190 ; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
1191 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm1
1192 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm0
1193 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1194 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1195 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
1196 ; AVX2-NEXT: vpslld $31, %xmm1, %xmm1
1197 ; AVX2-NEXT: vmovmskps %xmm1, %eax
1198 ; AVX2-NEXT: movb %al, (%rdi)
1201 ; AVX512-LABEL: uaddo_v4i1:
1203 ; AVX512-NEXT: vpslld $31, %xmm0, %xmm0
1204 ; AVX512-NEXT: vptestmd %xmm0, %xmm0, %k0
1205 ; AVX512-NEXT: vpslld $31, %xmm1, %xmm0
1206 ; AVX512-NEXT: vptestmd %xmm0, %xmm0, %k1
1207 ; AVX512-NEXT: kxorw %k1, %k0, %k1
1208 ; AVX512-NEXT: kandnw %k0, %k1, %k2
1209 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1210 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k2} {z}
1211 ; AVX512-NEXT: kmovd %k1, %eax
1212 ; AVX512-NEXT: movb %al, (%rdi)
1214 %t = call {<4 x i1>, <4 x i1>} @llvm.uadd.with.overflow.v4i1(<4 x i1> %a0, <4 x i1> %a1)
1215 %val = extractvalue {<4 x i1>, <4 x i1>} %t, 0
1216 %obit = extractvalue {<4 x i1>, <4 x i1>} %t, 1
1217 %res = sext <4 x i1> %obit to <4 x i32>
1218 store <4 x i1> %val, <4 x i1>* %p2
1222 define <2 x i32> @uaddo_v2i128(<2 x i128> %a0, <2 x i128> %a1, <2 x i128>* %p2) nounwind {
1223 ; SSE2-LABEL: uaddo_v2i128:
1225 ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %r10
1226 ; SSE2-NEXT: addq {{[0-9]+}}(%rsp), %rdx
1227 ; SSE2-NEXT: adcq {{[0-9]+}}(%rsp), %rcx
1228 ; SSE2-NEXT: setb %al
1229 ; SSE2-NEXT: movzbl %al, %r11d
1230 ; SSE2-NEXT: addq %r8, %rdi
1231 ; SSE2-NEXT: adcq %r9, %rsi
1232 ; SSE2-NEXT: setb %al
1233 ; SSE2-NEXT: movzbl %al, %eax
1234 ; SSE2-NEXT: movd %eax, %xmm0
1235 ; SSE2-NEXT: pinsrw $4, %r11d, %xmm0
1236 ; SSE2-NEXT: movq %rdx, 16(%r10)
1237 ; SSE2-NEXT: movq %rdi, (%r10)
1238 ; SSE2-NEXT: movq %rcx, 24(%r10)
1239 ; SSE2-NEXT: movq %rsi, 8(%r10)
1240 ; SSE2-NEXT: psllq $63, %xmm0
1241 ; SSE2-NEXT: psrad $31, %xmm0
1242 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1245 ; SSSE3-LABEL: uaddo_v2i128:
1247 ; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %r10
1248 ; SSSE3-NEXT: addq {{[0-9]+}}(%rsp), %rdx
1249 ; SSSE3-NEXT: adcq {{[0-9]+}}(%rsp), %rcx
1250 ; SSSE3-NEXT: setb %al
1251 ; SSSE3-NEXT: movzbl %al, %r11d
1252 ; SSSE3-NEXT: addq %r8, %rdi
1253 ; SSSE3-NEXT: adcq %r9, %rsi
1254 ; SSSE3-NEXT: setb %al
1255 ; SSSE3-NEXT: movzbl %al, %eax
1256 ; SSSE3-NEXT: movd %eax, %xmm0
1257 ; SSSE3-NEXT: pinsrw $4, %r11d, %xmm0
1258 ; SSSE3-NEXT: movq %rdx, 16(%r10)
1259 ; SSSE3-NEXT: movq %rdi, (%r10)
1260 ; SSSE3-NEXT: movq %rcx, 24(%r10)
1261 ; SSSE3-NEXT: movq %rsi, 8(%r10)
1262 ; SSSE3-NEXT: psllq $63, %xmm0
1263 ; SSSE3-NEXT: psrad $31, %xmm0
1264 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1267 ; SSE41-LABEL: uaddo_v2i128:
1269 ; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %r10
1270 ; SSE41-NEXT: addq {{[0-9]+}}(%rsp), %rdx
1271 ; SSE41-NEXT: adcq {{[0-9]+}}(%rsp), %rcx
1272 ; SSE41-NEXT: setb %al
1273 ; SSE41-NEXT: movzbl %al, %r11d
1274 ; SSE41-NEXT: addq %r8, %rdi
1275 ; SSE41-NEXT: adcq %r9, %rsi
1276 ; SSE41-NEXT: setb %al
1277 ; SSE41-NEXT: movzbl %al, %eax
1278 ; SSE41-NEXT: movd %eax, %xmm0
1279 ; SSE41-NEXT: pinsrb $8, %r11d, %xmm0
1280 ; SSE41-NEXT: movq %rdx, 16(%r10)
1281 ; SSE41-NEXT: movq %rdi, (%r10)
1282 ; SSE41-NEXT: movq %rcx, 24(%r10)
1283 ; SSE41-NEXT: movq %rsi, 8(%r10)
1284 ; SSE41-NEXT: psllq $63, %xmm0
1285 ; SSE41-NEXT: psrad $31, %xmm0
1286 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1289 ; AVX1-LABEL: uaddo_v2i128:
1291 ; AVX1-NEXT: movq {{[0-9]+}}(%rsp), %r10
1292 ; AVX1-NEXT: addq {{[0-9]+}}(%rsp), %rdx
1293 ; AVX1-NEXT: adcq {{[0-9]+}}(%rsp), %rcx
1294 ; AVX1-NEXT: setb %al
1295 ; AVX1-NEXT: movzbl %al, %r11d
1296 ; AVX1-NEXT: addq %r8, %rdi
1297 ; AVX1-NEXT: adcq %r9, %rsi
1298 ; AVX1-NEXT: setb %al
1299 ; AVX1-NEXT: movzbl %al, %eax
1300 ; AVX1-NEXT: vmovd %eax, %xmm0
1301 ; AVX1-NEXT: vpinsrb $8, %r11d, %xmm0, %xmm0
1302 ; AVX1-NEXT: movq %rdx, 16(%r10)
1303 ; AVX1-NEXT: movq %rdi, (%r10)
1304 ; AVX1-NEXT: movq %rcx, 24(%r10)
1305 ; AVX1-NEXT: movq %rsi, 8(%r10)
1306 ; AVX1-NEXT: vpsllq $63, %xmm0, %xmm0
1307 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
1308 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0
1311 ; AVX2-LABEL: uaddo_v2i128:
1313 ; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %r10
1314 ; AVX2-NEXT: addq {{[0-9]+}}(%rsp), %rdx
1315 ; AVX2-NEXT: adcq {{[0-9]+}}(%rsp), %rcx
1316 ; AVX2-NEXT: setb %al
1317 ; AVX2-NEXT: movzbl %al, %r11d
1318 ; AVX2-NEXT: addq %r8, %rdi
1319 ; AVX2-NEXT: adcq %r9, %rsi
1320 ; AVX2-NEXT: setb %al
1321 ; AVX2-NEXT: movzbl %al, %eax
1322 ; AVX2-NEXT: vmovd %eax, %xmm0
1323 ; AVX2-NEXT: vpinsrb $8, %r11d, %xmm0, %xmm0
1324 ; AVX2-NEXT: movq %rdx, 16(%r10)
1325 ; AVX2-NEXT: movq %rdi, (%r10)
1326 ; AVX2-NEXT: movq %rcx, 24(%r10)
1327 ; AVX2-NEXT: movq %rsi, 8(%r10)
1328 ; AVX2-NEXT: vpsllq $63, %xmm0, %xmm0
1329 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
1330 ; AVX2-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0
1333 ; AVX512-LABEL: uaddo_v2i128:
1335 ; AVX512-NEXT: movq {{[0-9]+}}(%rsp), %r10
1336 ; AVX512-NEXT: addq {{[0-9]+}}(%rsp), %rdx
1337 ; AVX512-NEXT: adcq {{[0-9]+}}(%rsp), %rcx
1338 ; AVX512-NEXT: setb %al
1339 ; AVX512-NEXT: kmovd %eax, %k0
1340 ; AVX512-NEXT: kshiftlw $1, %k0, %k0
1341 ; AVX512-NEXT: addq %r8, %rdi
1342 ; AVX512-NEXT: adcq %r9, %rsi
1343 ; AVX512-NEXT: setb %al
1344 ; AVX512-NEXT: andl $1, %eax
1345 ; AVX512-NEXT: kmovw %eax, %k1
1346 ; AVX512-NEXT: korw %k0, %k1, %k1
1347 ; AVX512-NEXT: movq %rdx, 16(%r10)
1348 ; AVX512-NEXT: movq %rdi, (%r10)
1349 ; AVX512-NEXT: movq %rcx, 24(%r10)
1350 ; AVX512-NEXT: movq %rsi, 8(%r10)
1351 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1352 ; AVX512-NEXT: vmovdqa64 %xmm0, %xmm0 {%k1} {z}
1354 %t = call {<2 x i128>, <2 x i1>} @llvm.uadd.with.overflow.v2i128(<2 x i128> %a0, <2 x i128> %a1)
1355 %val = extractvalue {<2 x i128>, <2 x i1>} %t, 0
1356 %obit = extractvalue {<2 x i128>, <2 x i1>} %t, 1
1357 %res = sext <2 x i1> %obit to <2 x i32>
1358 store <2 x i128> %val, <2 x i128>* %p2