[AArch64,ELF] Restrict MOVZ/MOVK to non-PIC large code model (#70178)
[llvm-project.git] / llvm / test / CodeGen / X86 / vec_uaddo.ll
blob950e943bd90201397542b34e17f20900c2b7922e
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=CHECK,SSE,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=CHECK,SSE,SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=CHECK,SSE,SSE41
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=CHECK,AVX,AVX1
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=CHECK,AVX,AVX2
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=CHECK,AVX512
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=CHECK,AVX512
10 declare {<1 x i32>, <1 x i1>} @llvm.uadd.with.overflow.v1i32(<1 x i32>, <1 x i32>)
11 declare {<2 x i32>, <2 x i1>} @llvm.uadd.with.overflow.v2i32(<2 x i32>, <2 x i32>)
12 declare {<3 x i32>, <3 x i1>} @llvm.uadd.with.overflow.v3i32(<3 x i32>, <3 x i32>)
13 declare {<4 x i32>, <4 x i1>} @llvm.uadd.with.overflow.v4i32(<4 x i32>, <4 x i32>)
14 declare {<6 x i32>, <6 x i1>} @llvm.uadd.with.overflow.v6i32(<6 x i32>, <6 x i32>)
15 declare {<8 x i32>, <8 x i1>} @llvm.uadd.with.overflow.v8i32(<8 x i32>, <8 x i32>)
16 declare {<16 x i32>, <16 x i1>} @llvm.uadd.with.overflow.v16i32(<16 x i32>, <16 x i32>)
18 declare {<16 x i8>, <16 x i1>} @llvm.uadd.with.overflow.v16i8(<16 x i8>, <16 x i8>)
19 declare {<8 x i16>, <8 x i1>} @llvm.uadd.with.overflow.v8i16(<8 x i16>, <8 x i16>)
20 declare {<2 x i64>, <2 x i1>} @llvm.uadd.with.overflow.v2i64(<2 x i64>, <2 x i64>)
22 declare {<4 x i24>, <4 x i1>} @llvm.uadd.with.overflow.v4i24(<4 x i24>, <4 x i24>)
23 declare {<4 x i1>, <4 x i1>} @llvm.uadd.with.overflow.v4i1(<4 x i1>, <4 x i1>)
24 declare {<2 x i128>, <2 x i1>} @llvm.uadd.with.overflow.v2i128(<2 x i128>, <2 x i128>)
26 define <1 x i32> @uaddo_v1i32(<1 x i32> %a0, <1 x i32> %a1, ptr %p2) nounwind {
27 ; CHECK-LABEL: uaddo_v1i32:
28 ; CHECK:       # %bb.0:
29 ; CHECK-NEXT:    xorl %eax, %eax
30 ; CHECK-NEXT:    addl %esi, %edi
31 ; CHECK-NEXT:    sbbl %eax, %eax
32 ; CHECK-NEXT:    movl %edi, (%rdx)
33 ; CHECK-NEXT:    retq
34   %t = call {<1 x i32>, <1 x i1>} @llvm.uadd.with.overflow.v1i32(<1 x i32> %a0, <1 x i32> %a1)
35   %val = extractvalue {<1 x i32>, <1 x i1>} %t, 0
36   %obit = extractvalue {<1 x i32>, <1 x i1>} %t, 1
37   %res = sext <1 x i1> %obit to <1 x i32>
38   store <1 x i32> %val, ptr %p2
39   ret <1 x i32> %res
42 define <2 x i32> @uaddo_v2i32(<2 x i32> %a0, <2 x i32> %a1, ptr %p2) nounwind {
43 ; SSE2-LABEL: uaddo_v2i32:
44 ; SSE2:       # %bb.0:
45 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
46 ; SSE2-NEXT:    paddd %xmm0, %xmm1
47 ; SSE2-NEXT:    pxor %xmm2, %xmm0
48 ; SSE2-NEXT:    pxor %xmm1, %xmm2
49 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
50 ; SSE2-NEXT:    movq %xmm1, (%rdi)
51 ; SSE2-NEXT:    retq
53 ; SSSE3-LABEL: uaddo_v2i32:
54 ; SSSE3:       # %bb.0:
55 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
56 ; SSSE3-NEXT:    paddd %xmm0, %xmm1
57 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
58 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
59 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm0
60 ; SSSE3-NEXT:    movq %xmm1, (%rdi)
61 ; SSSE3-NEXT:    retq
63 ; SSE41-LABEL: uaddo_v2i32:
64 ; SSE41:       # %bb.0:
65 ; SSE41-NEXT:    paddd %xmm0, %xmm1
66 ; SSE41-NEXT:    pmaxud %xmm1, %xmm0
67 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
68 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
69 ; SSE41-NEXT:    pxor %xmm2, %xmm0
70 ; SSE41-NEXT:    movq %xmm1, (%rdi)
71 ; SSE41-NEXT:    retq
73 ; AVX-LABEL: uaddo_v2i32:
74 ; AVX:       # %bb.0:
75 ; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
76 ; AVX-NEXT:    vpmaxud %xmm0, %xmm1, %xmm0
77 ; AVX-NEXT:    vpcmpeqd %xmm0, %xmm1, %xmm0
78 ; AVX-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
79 ; AVX-NEXT:    vpxor %xmm2, %xmm0, %xmm0
80 ; AVX-NEXT:    vmovq %xmm1, (%rdi)
81 ; AVX-NEXT:    retq
83 ; AVX512-LABEL: uaddo_v2i32:
84 ; AVX512:       # %bb.0:
85 ; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
86 ; AVX512-NEXT:    vpcmpltud %xmm0, %xmm1, %k1
87 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
88 ; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
89 ; AVX512-NEXT:    vmovq %xmm1, (%rdi)
90 ; AVX512-NEXT:    retq
91   %t = call {<2 x i32>, <2 x i1>} @llvm.uadd.with.overflow.v2i32(<2 x i32> %a0, <2 x i32> %a1)
92   %val = extractvalue {<2 x i32>, <2 x i1>} %t, 0
93   %obit = extractvalue {<2 x i32>, <2 x i1>} %t, 1
94   %res = sext <2 x i1> %obit to <2 x i32>
95   store <2 x i32> %val, ptr %p2
96   ret <2 x i32> %res
99 define <3 x i32> @uaddo_v3i32(<3 x i32> %a0, <3 x i32> %a1, ptr %p2) nounwind {
100 ; SSE2-LABEL: uaddo_v3i32:
101 ; SSE2:       # %bb.0:
102 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
103 ; SSE2-NEXT:    paddd %xmm0, %xmm1
104 ; SSE2-NEXT:    pxor %xmm2, %xmm0
105 ; SSE2-NEXT:    pxor %xmm1, %xmm2
106 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
107 ; SSE2-NEXT:    movq %xmm1, (%rdi)
108 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
109 ; SSE2-NEXT:    movd %xmm1, 8(%rdi)
110 ; SSE2-NEXT:    retq
112 ; SSSE3-LABEL: uaddo_v3i32:
113 ; SSSE3:       # %bb.0:
114 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
115 ; SSSE3-NEXT:    paddd %xmm0, %xmm1
116 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
117 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
118 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm0
119 ; SSSE3-NEXT:    movq %xmm1, (%rdi)
120 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
121 ; SSSE3-NEXT:    movd %xmm1, 8(%rdi)
122 ; SSSE3-NEXT:    retq
124 ; SSE41-LABEL: uaddo_v3i32:
125 ; SSE41:       # %bb.0:
126 ; SSE41-NEXT:    paddd %xmm0, %xmm1
127 ; SSE41-NEXT:    pmaxud %xmm1, %xmm0
128 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
129 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
130 ; SSE41-NEXT:    pxor %xmm2, %xmm0
131 ; SSE41-NEXT:    pextrd $2, %xmm1, 8(%rdi)
132 ; SSE41-NEXT:    movq %xmm1, (%rdi)
133 ; SSE41-NEXT:    retq
135 ; AVX-LABEL: uaddo_v3i32:
136 ; AVX:       # %bb.0:
137 ; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
138 ; AVX-NEXT:    vpmaxud %xmm0, %xmm1, %xmm0
139 ; AVX-NEXT:    vpcmpeqd %xmm0, %xmm1, %xmm0
140 ; AVX-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
141 ; AVX-NEXT:    vpxor %xmm2, %xmm0, %xmm0
142 ; AVX-NEXT:    vpextrd $2, %xmm1, 8(%rdi)
143 ; AVX-NEXT:    vmovq %xmm1, (%rdi)
144 ; AVX-NEXT:    retq
146 ; AVX512-LABEL: uaddo_v3i32:
147 ; AVX512:       # %bb.0:
148 ; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
149 ; AVX512-NEXT:    vpcmpltud %xmm0, %xmm1, %k1
150 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
151 ; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
152 ; AVX512-NEXT:    vpextrd $2, %xmm1, 8(%rdi)
153 ; AVX512-NEXT:    vmovq %xmm1, (%rdi)
154 ; AVX512-NEXT:    retq
155   %t = call {<3 x i32>, <3 x i1>} @llvm.uadd.with.overflow.v3i32(<3 x i32> %a0, <3 x i32> %a1)
156   %val = extractvalue {<3 x i32>, <3 x i1>} %t, 0
157   %obit = extractvalue {<3 x i32>, <3 x i1>} %t, 1
158   %res = sext <3 x i1> %obit to <3 x i32>
159   store <3 x i32> %val, ptr %p2
160   ret <3 x i32> %res
163 define <4 x i32> @uaddo_v4i32(<4 x i32> %a0, <4 x i32> %a1, ptr %p2) nounwind {
164 ; SSE2-LABEL: uaddo_v4i32:
165 ; SSE2:       # %bb.0:
166 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
167 ; SSE2-NEXT:    paddd %xmm0, %xmm1
168 ; SSE2-NEXT:    pxor %xmm2, %xmm0
169 ; SSE2-NEXT:    pxor %xmm1, %xmm2
170 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
171 ; SSE2-NEXT:    movdqa %xmm1, (%rdi)
172 ; SSE2-NEXT:    retq
174 ; SSSE3-LABEL: uaddo_v4i32:
175 ; SSSE3:       # %bb.0:
176 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
177 ; SSSE3-NEXT:    paddd %xmm0, %xmm1
178 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
179 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
180 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm0
181 ; SSSE3-NEXT:    movdqa %xmm1, (%rdi)
182 ; SSSE3-NEXT:    retq
184 ; SSE41-LABEL: uaddo_v4i32:
185 ; SSE41:       # %bb.0:
186 ; SSE41-NEXT:    paddd %xmm0, %xmm1
187 ; SSE41-NEXT:    pmaxud %xmm1, %xmm0
188 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
189 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
190 ; SSE41-NEXT:    pxor %xmm2, %xmm0
191 ; SSE41-NEXT:    movdqa %xmm1, (%rdi)
192 ; SSE41-NEXT:    retq
194 ; AVX-LABEL: uaddo_v4i32:
195 ; AVX:       # %bb.0:
196 ; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
197 ; AVX-NEXT:    vpmaxud %xmm0, %xmm1, %xmm0
198 ; AVX-NEXT:    vpcmpeqd %xmm0, %xmm1, %xmm0
199 ; AVX-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
200 ; AVX-NEXT:    vpxor %xmm2, %xmm0, %xmm0
201 ; AVX-NEXT:    vmovdqa %xmm1, (%rdi)
202 ; AVX-NEXT:    retq
204 ; AVX512-LABEL: uaddo_v4i32:
205 ; AVX512:       # %bb.0:
206 ; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
207 ; AVX512-NEXT:    vpcmpltud %xmm0, %xmm1, %k1
208 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
209 ; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
210 ; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)
211 ; AVX512-NEXT:    retq
212   %t = call {<4 x i32>, <4 x i1>} @llvm.uadd.with.overflow.v4i32(<4 x i32> %a0, <4 x i32> %a1)
213   %val = extractvalue {<4 x i32>, <4 x i1>} %t, 0
214   %obit = extractvalue {<4 x i32>, <4 x i1>} %t, 1
215   %res = sext <4 x i1> %obit to <4 x i32>
216   store <4 x i32> %val, ptr %p2
217   ret <4 x i32> %res
220 define <6 x i32> @uaddo_v6i32(<6 x i32> %a0, <6 x i32> %a1, ptr %p2) nounwind {
221 ; SSE2-LABEL: uaddo_v6i32:
222 ; SSE2:       # %bb.0:
223 ; SSE2-NEXT:    movq %rdi, %rax
224 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
225 ; SSE2-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
226 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
227 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
228 ; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
229 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
230 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
231 ; SSE2-NEXT:    movd %r8d, %xmm0
232 ; SSE2-NEXT:    movd %ecx, %xmm2
233 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
234 ; SSE2-NEXT:    movd %edx, %xmm3
235 ; SSE2-NEXT:    movd %esi, %xmm0
236 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
237 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
238 ; SSE2-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
239 ; SSE2-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
240 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
241 ; SSE2-NEXT:    movd %r9d, %xmm2
242 ; SSE2-NEXT:    movd {{.*#+}} xmm4 = mem[0],zero,zero,zero
243 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
244 ; SSE2-NEXT:    movq {{[0-9]+}}(%rsp), %rcx
245 ; SSE2-NEXT:    paddd %xmm0, %xmm1
246 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
247 ; SSE2-NEXT:    movdqa %xmm1, (%rcx)
248 ; SSE2-NEXT:    pxor %xmm4, %xmm1
249 ; SSE2-NEXT:    pxor %xmm4, %xmm0
250 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm0
251 ; SSE2-NEXT:    paddd %xmm2, %xmm3
252 ; SSE2-NEXT:    movq %xmm3, 16(%rcx)
253 ; SSE2-NEXT:    pxor %xmm4, %xmm3
254 ; SSE2-NEXT:    pxor %xmm4, %xmm2
255 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
256 ; SSE2-NEXT:    movq %xmm2, 16(%rdi)
257 ; SSE2-NEXT:    movdqa %xmm0, (%rdi)
258 ; SSE2-NEXT:    retq
260 ; SSSE3-LABEL: uaddo_v6i32:
261 ; SSSE3:       # %bb.0:
262 ; SSSE3-NEXT:    movq %rdi, %rax
263 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
264 ; SSSE3-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
265 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
266 ; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
267 ; SSSE3-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
268 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
269 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
270 ; SSSE3-NEXT:    movd %r8d, %xmm0
271 ; SSSE3-NEXT:    movd %ecx, %xmm2
272 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
273 ; SSSE3-NEXT:    movd %edx, %xmm3
274 ; SSSE3-NEXT:    movd %esi, %xmm0
275 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
276 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
277 ; SSSE3-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
278 ; SSSE3-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
279 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
280 ; SSSE3-NEXT:    movd %r9d, %xmm2
281 ; SSSE3-NEXT:    movd {{.*#+}} xmm4 = mem[0],zero,zero,zero
282 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
283 ; SSSE3-NEXT:    movq {{[0-9]+}}(%rsp), %rcx
284 ; SSSE3-NEXT:    paddd %xmm0, %xmm1
285 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
286 ; SSSE3-NEXT:    movdqa %xmm1, (%rcx)
287 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
288 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
289 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm0
290 ; SSSE3-NEXT:    paddd %xmm2, %xmm3
291 ; SSSE3-NEXT:    movq %xmm3, 16(%rcx)
292 ; SSSE3-NEXT:    pxor %xmm4, %xmm3
293 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
294 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm2
295 ; SSSE3-NEXT:    movq %xmm2, 16(%rdi)
296 ; SSSE3-NEXT:    movdqa %xmm0, (%rdi)
297 ; SSSE3-NEXT:    retq
299 ; SSE41-LABEL: uaddo_v6i32:
300 ; SSE41:       # %bb.0:
301 ; SSE41-NEXT:    movq %rdi, %rax
302 ; SSE41-NEXT:    movd %esi, %xmm0
303 ; SSE41-NEXT:    pinsrd $1, %edx, %xmm0
304 ; SSE41-NEXT:    pinsrd $2, %ecx, %xmm0
305 ; SSE41-NEXT:    pinsrd $3, %r8d, %xmm0
306 ; SSE41-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
307 ; SSE41-NEXT:    pinsrd $1, {{[0-9]+}}(%rsp), %xmm1
308 ; SSE41-NEXT:    movd %r9d, %xmm2
309 ; SSE41-NEXT:    pinsrd $1, {{[0-9]+}}(%rsp), %xmm2
310 ; SSE41-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
311 ; SSE41-NEXT:    pinsrd $1, {{[0-9]+}}(%rsp), %xmm3
312 ; SSE41-NEXT:    pinsrd $2, {{[0-9]+}}(%rsp), %xmm3
313 ; SSE41-NEXT:    pinsrd $3, {{[0-9]+}}(%rsp), %xmm3
314 ; SSE41-NEXT:    movq {{[0-9]+}}(%rsp), %rcx
315 ; SSE41-NEXT:    paddd %xmm0, %xmm3
316 ; SSE41-NEXT:    pmaxud %xmm3, %xmm0
317 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
318 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm4
319 ; SSE41-NEXT:    pxor %xmm4, %xmm0
320 ; SSE41-NEXT:    paddd %xmm2, %xmm1
321 ; SSE41-NEXT:    pmaxud %xmm1, %xmm2
322 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm2
323 ; SSE41-NEXT:    pxor %xmm4, %xmm2
324 ; SSE41-NEXT:    movq %xmm1, 16(%rcx)
325 ; SSE41-NEXT:    movdqa %xmm3, (%rcx)
326 ; SSE41-NEXT:    movq %xmm2, 16(%rdi)
327 ; SSE41-NEXT:    movdqa %xmm0, (%rdi)
328 ; SSE41-NEXT:    retq
330 ; AVX1-LABEL: uaddo_v6i32:
331 ; AVX1:       # %bb.0:
332 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
333 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
334 ; AVX1-NEXT:    vpaddd %xmm2, %xmm3, %xmm2
335 ; AVX1-NEXT:    vpmaxud %xmm3, %xmm2, %xmm3
336 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm3
337 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
338 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
339 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
340 ; AVX1-NEXT:    vpmaxud %xmm0, %xmm1, %xmm0
341 ; AVX1-NEXT:    vpcmpeqd %xmm0, %xmm1, %xmm0
342 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
343 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
344 ; AVX1-NEXT:    vmovq %xmm2, 16(%rdi)
345 ; AVX1-NEXT:    vmovdqa %xmm1, (%rdi)
346 ; AVX1-NEXT:    retq
348 ; AVX2-LABEL: uaddo_v6i32:
349 ; AVX2:       # %bb.0:
350 ; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm1
351 ; AVX2-NEXT:    vpmaxud %ymm0, %ymm1, %ymm0
352 ; AVX2-NEXT:    vpcmpeqd %ymm0, %ymm1, %ymm0
353 ; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
354 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
355 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
356 ; AVX2-NEXT:    vmovq %xmm2, 16(%rdi)
357 ; AVX2-NEXT:    vmovdqa %xmm1, (%rdi)
358 ; AVX2-NEXT:    retq
360 ; AVX512-LABEL: uaddo_v6i32:
361 ; AVX512:       # %bb.0:
362 ; AVX512-NEXT:    vpaddd %ymm1, %ymm0, %ymm1
363 ; AVX512-NEXT:    vpcmpltud %ymm0, %ymm1, %k1
364 ; AVX512-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
365 ; AVX512-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}
366 ; AVX512-NEXT:    vextracti128 $1, %ymm1, %xmm2
367 ; AVX512-NEXT:    vmovq %xmm2, 16(%rdi)
368 ; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)
369 ; AVX512-NEXT:    retq
370   %t = call {<6 x i32>, <6 x i1>} @llvm.uadd.with.overflow.v6i32(<6 x i32> %a0, <6 x i32> %a1)
371   %val = extractvalue {<6 x i32>, <6 x i1>} %t, 0
372   %obit = extractvalue {<6 x i32>, <6 x i1>} %t, 1
373   %res = sext <6 x i1> %obit to <6 x i32>
374   store <6 x i32> %val, ptr %p2
375   ret <6 x i32> %res
378 define <8 x i32> @uaddo_v8i32(<8 x i32> %a0, <8 x i32> %a1, ptr %p2) nounwind {
379 ; SSE2-LABEL: uaddo_v8i32:
380 ; SSE2:       # %bb.0:
381 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
382 ; SSE2-NEXT:    paddd %xmm0, %xmm2
383 ; SSE2-NEXT:    pxor %xmm4, %xmm0
384 ; SSE2-NEXT:    movdqa %xmm2, (%rdi)
385 ; SSE2-NEXT:    pxor %xmm4, %xmm2
386 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
387 ; SSE2-NEXT:    paddd %xmm1, %xmm3
388 ; SSE2-NEXT:    pxor %xmm4, %xmm1
389 ; SSE2-NEXT:    pxor %xmm3, %xmm4
390 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm1
391 ; SSE2-NEXT:    movdqa %xmm3, 16(%rdi)
392 ; SSE2-NEXT:    retq
394 ; SSSE3-LABEL: uaddo_v8i32:
395 ; SSSE3:       # %bb.0:
396 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
397 ; SSSE3-NEXT:    paddd %xmm0, %xmm2
398 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
399 ; SSSE3-NEXT:    movdqa %xmm2, (%rdi)
400 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
401 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm0
402 ; SSSE3-NEXT:    paddd %xmm1, %xmm3
403 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
404 ; SSSE3-NEXT:    pxor %xmm3, %xmm4
405 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm1
406 ; SSSE3-NEXT:    movdqa %xmm3, 16(%rdi)
407 ; SSSE3-NEXT:    retq
409 ; SSE41-LABEL: uaddo_v8i32:
410 ; SSE41:       # %bb.0:
411 ; SSE41-NEXT:    paddd %xmm0, %xmm2
412 ; SSE41-NEXT:    pmaxud %xmm2, %xmm0
413 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm0
414 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm4
415 ; SSE41-NEXT:    pxor %xmm4, %xmm0
416 ; SSE41-NEXT:    paddd %xmm1, %xmm3
417 ; SSE41-NEXT:    pmaxud %xmm3, %xmm1
418 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm1
419 ; SSE41-NEXT:    pxor %xmm4, %xmm1
420 ; SSE41-NEXT:    movdqa %xmm3, 16(%rdi)
421 ; SSE41-NEXT:    movdqa %xmm2, (%rdi)
422 ; SSE41-NEXT:    retq
424 ; AVX1-LABEL: uaddo_v8i32:
425 ; AVX1:       # %bb.0:
426 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
427 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
428 ; AVX1-NEXT:    vpaddd %xmm2, %xmm3, %xmm2
429 ; AVX1-NEXT:    vpmaxud %xmm3, %xmm2, %xmm3
430 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm3
431 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
432 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
433 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
434 ; AVX1-NEXT:    vpmaxud %xmm0, %xmm1, %xmm0
435 ; AVX1-NEXT:    vpcmpeqd %xmm0, %xmm1, %xmm0
436 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
437 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
438 ; AVX1-NEXT:    vmovdqa %xmm2, 16(%rdi)
439 ; AVX1-NEXT:    vmovdqa %xmm1, (%rdi)
440 ; AVX1-NEXT:    retq
442 ; AVX2-LABEL: uaddo_v8i32:
443 ; AVX2:       # %bb.0:
444 ; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm1
445 ; AVX2-NEXT:    vpmaxud %ymm0, %ymm1, %ymm0
446 ; AVX2-NEXT:    vpcmpeqd %ymm0, %ymm1, %ymm0
447 ; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
448 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
449 ; AVX2-NEXT:    vmovdqa %ymm1, (%rdi)
450 ; AVX2-NEXT:    retq
452 ; AVX512-LABEL: uaddo_v8i32:
453 ; AVX512:       # %bb.0:
454 ; AVX512-NEXT:    vpaddd %ymm1, %ymm0, %ymm1
455 ; AVX512-NEXT:    vpcmpltud %ymm0, %ymm1, %k1
456 ; AVX512-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
457 ; AVX512-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}
458 ; AVX512-NEXT:    vmovdqa %ymm1, (%rdi)
459 ; AVX512-NEXT:    retq
460   %t = call {<8 x i32>, <8 x i1>} @llvm.uadd.with.overflow.v8i32(<8 x i32> %a0, <8 x i32> %a1)
461   %val = extractvalue {<8 x i32>, <8 x i1>} %t, 0
462   %obit = extractvalue {<8 x i32>, <8 x i1>} %t, 1
463   %res = sext <8 x i1> %obit to <8 x i32>
464   store <8 x i32> %val, ptr %p2
465   ret <8 x i32> %res
468 define <16 x i32> @uaddo_v16i32(<16 x i32> %a0, <16 x i32> %a1, ptr %p2) nounwind {
469 ; SSE2-LABEL: uaddo_v16i32:
470 ; SSE2:       # %bb.0:
471 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
472 ; SSE2-NEXT:    paddd %xmm0, %xmm4
473 ; SSE2-NEXT:    pxor %xmm8, %xmm0
474 ; SSE2-NEXT:    movdqa %xmm4, (%rdi)
475 ; SSE2-NEXT:    pxor %xmm8, %xmm4
476 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm0
477 ; SSE2-NEXT:    paddd %xmm1, %xmm5
478 ; SSE2-NEXT:    pxor %xmm8, %xmm1
479 ; SSE2-NEXT:    movdqa %xmm5, 16(%rdi)
480 ; SSE2-NEXT:    pxor %xmm8, %xmm5
481 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm1
482 ; SSE2-NEXT:    paddd %xmm2, %xmm6
483 ; SSE2-NEXT:    pxor %xmm8, %xmm2
484 ; SSE2-NEXT:    movdqa %xmm6, 32(%rdi)
485 ; SSE2-NEXT:    pxor %xmm8, %xmm6
486 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm2
487 ; SSE2-NEXT:    paddd %xmm3, %xmm7
488 ; SSE2-NEXT:    pxor %xmm8, %xmm3
489 ; SSE2-NEXT:    pxor %xmm7, %xmm8
490 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm3
491 ; SSE2-NEXT:    movdqa %xmm7, 48(%rdi)
492 ; SSE2-NEXT:    retq
494 ; SSSE3-LABEL: uaddo_v16i32:
495 ; SSSE3:       # %bb.0:
496 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
497 ; SSSE3-NEXT:    paddd %xmm0, %xmm4
498 ; SSSE3-NEXT:    pxor %xmm8, %xmm0
499 ; SSSE3-NEXT:    movdqa %xmm4, (%rdi)
500 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
501 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm0
502 ; SSSE3-NEXT:    paddd %xmm1, %xmm5
503 ; SSSE3-NEXT:    pxor %xmm8, %xmm1
504 ; SSSE3-NEXT:    movdqa %xmm5, 16(%rdi)
505 ; SSSE3-NEXT:    pxor %xmm8, %xmm5
506 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm1
507 ; SSSE3-NEXT:    paddd %xmm2, %xmm6
508 ; SSSE3-NEXT:    pxor %xmm8, %xmm2
509 ; SSSE3-NEXT:    movdqa %xmm6, 32(%rdi)
510 ; SSSE3-NEXT:    pxor %xmm8, %xmm6
511 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm2
512 ; SSSE3-NEXT:    paddd %xmm3, %xmm7
513 ; SSSE3-NEXT:    pxor %xmm8, %xmm3
514 ; SSSE3-NEXT:    pxor %xmm7, %xmm8
515 ; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm3
516 ; SSSE3-NEXT:    movdqa %xmm7, 48(%rdi)
517 ; SSSE3-NEXT:    retq
519 ; SSE41-LABEL: uaddo_v16i32:
520 ; SSE41:       # %bb.0:
521 ; SSE41-NEXT:    paddd %xmm0, %xmm4
522 ; SSE41-NEXT:    pmaxud %xmm4, %xmm0
523 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm0
524 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm8
525 ; SSE41-NEXT:    pxor %xmm8, %xmm0
526 ; SSE41-NEXT:    paddd %xmm1, %xmm5
527 ; SSE41-NEXT:    pmaxud %xmm5, %xmm1
528 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm1
529 ; SSE41-NEXT:    pxor %xmm8, %xmm1
530 ; SSE41-NEXT:    paddd %xmm2, %xmm6
531 ; SSE41-NEXT:    pmaxud %xmm6, %xmm2
532 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm2
533 ; SSE41-NEXT:    pxor %xmm8, %xmm2
534 ; SSE41-NEXT:    paddd %xmm3, %xmm7
535 ; SSE41-NEXT:    pmaxud %xmm7, %xmm3
536 ; SSE41-NEXT:    pcmpeqd %xmm7, %xmm3
537 ; SSE41-NEXT:    pxor %xmm8, %xmm3
538 ; SSE41-NEXT:    movdqa %xmm7, 48(%rdi)
539 ; SSE41-NEXT:    movdqa %xmm6, 32(%rdi)
540 ; SSE41-NEXT:    movdqa %xmm5, 16(%rdi)
541 ; SSE41-NEXT:    movdqa %xmm4, (%rdi)
542 ; SSE41-NEXT:    retq
544 ; AVX1-LABEL: uaddo_v16i32:
545 ; AVX1:       # %bb.0:
546 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
547 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
548 ; AVX1-NEXT:    vpaddd %xmm4, %xmm5, %xmm4
549 ; AVX1-NEXT:    vpmaxud %xmm5, %xmm4, %xmm5
550 ; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm4, %xmm5
551 ; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm3
552 ; AVX1-NEXT:    vpmaxud %xmm1, %xmm3, %xmm1
553 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm3, %xmm1
554 ; AVX1-NEXT:    vpackssdw %xmm5, %xmm1, %xmm1
555 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
556 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
557 ; AVX1-NEXT:    vpaddd %xmm5, %xmm6, %xmm5
558 ; AVX1-NEXT:    vpmaxud %xmm6, %xmm5, %xmm6
559 ; AVX1-NEXT:    vpcmpeqd %xmm6, %xmm5, %xmm6
560 ; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm2
561 ; AVX1-NEXT:    vpmaxud %xmm0, %xmm2, %xmm0
562 ; AVX1-NEXT:    vpcmpeqd %xmm0, %xmm2, %xmm0
563 ; AVX1-NEXT:    vpackssdw %xmm6, %xmm0, %xmm0
564 ; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
565 ; AVX1-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
566 ; AVX1-NEXT:    vpxor %xmm6, %xmm0, %xmm0
567 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm7
568 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
569 ; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
570 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm7, %ymm0
571 ; AVX1-NEXT:    vpacksswb %xmm1, %xmm1, %xmm1
572 ; AVX1-NEXT:    vpxor %xmm6, %xmm1, %xmm1
573 ; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm6
574 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]
575 ; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1
576 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm6, %ymm1
577 ; AVX1-NEXT:    vmovdqa %xmm4, 48(%rdi)
578 ; AVX1-NEXT:    vmovdqa %xmm3, 32(%rdi)
579 ; AVX1-NEXT:    vmovdqa %xmm5, 16(%rdi)
580 ; AVX1-NEXT:    vmovdqa %xmm2, (%rdi)
581 ; AVX1-NEXT:    retq
583 ; AVX2-LABEL: uaddo_v16i32:
584 ; AVX2:       # %bb.0:
585 ; AVX2-NEXT:    vpaddd %ymm3, %ymm1, %ymm3
586 ; AVX2-NEXT:    vpmaxud %ymm1, %ymm3, %ymm1
587 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm3, %ymm1
588 ; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm4, %ymm4
589 ; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm1
590 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm5
591 ; AVX2-NEXT:    vpackssdw %xmm5, %xmm1, %xmm1
592 ; AVX2-NEXT:    vpaddd %ymm2, %ymm0, %ymm2
593 ; AVX2-NEXT:    vpmaxud %ymm0, %ymm2, %ymm0
594 ; AVX2-NEXT:    vpcmpeqd %ymm0, %ymm2, %ymm0
595 ; AVX2-NEXT:    vpacksswb %xmm1, %xmm1, %xmm1
596 ; AVX2-NEXT:    vpmovsxbd %xmm1, %ymm1
597 ; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,0,0,0,4,4,4,4,8,8,8,8,12,12,12,12,16,16,16,16,20,20,20,20,24,24,24,24,28,28,28,28]
598 ; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm0
599 ; AVX2-NEXT:    vmovdqa %ymm3, 32(%rdi)
600 ; AVX2-NEXT:    vmovdqa %ymm2, (%rdi)
601 ; AVX2-NEXT:    retq
603 ; AVX512-LABEL: uaddo_v16i32:
604 ; AVX512:       # %bb.0:
605 ; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm1
606 ; AVX512-NEXT:    vpcmpltud %zmm0, %zmm1, %k1
607 ; AVX512-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
608 ; AVX512-NEXT:    vmovdqa64 %zmm1, (%rdi)
609 ; AVX512-NEXT:    retq
610   %t = call {<16 x i32>, <16 x i1>} @llvm.uadd.with.overflow.v16i32(<16 x i32> %a0, <16 x i32> %a1)
611   %val = extractvalue {<16 x i32>, <16 x i1>} %t, 0
612   %obit = extractvalue {<16 x i32>, <16 x i1>} %t, 1
613   %res = sext <16 x i1> %obit to <16 x i32>
614   store <16 x i32> %val, ptr %p2
615   ret <16 x i32> %res
618 define <16 x i32> @uaddo_v16i8(<16 x i8> %a0, <16 x i8> %a1, ptr %p2) nounwind {
619 ; SSE2-LABEL: uaddo_v16i8:
620 ; SSE2:       # %bb.0:
621 ; SSE2-NEXT:    paddb %xmm0, %xmm1
622 ; SSE2-NEXT:    pmaxub %xmm1, %xmm0
623 ; SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
624 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm3
625 ; SSE2-NEXT:    pxor %xmm0, %xmm3
626 ; SSE2-NEXT:    movdqa %xmm3, %xmm0
627 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
628 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
629 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
630 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
631 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7]
632 ; SSE2-NEXT:    pslld $31, %xmm4
633 ; SSE2-NEXT:    psrad $31, %xmm4
634 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
635 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
636 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
637 ; SSE2-NEXT:    pslld $31, %xmm2
638 ; SSE2-NEXT:    psrad $31, %xmm2
639 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]
640 ; SSE2-NEXT:    pslld $31, %xmm3
641 ; SSE2-NEXT:    psrad $31, %xmm3
642 ; SSE2-NEXT:    movdqa %xmm1, (%rdi)
643 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
644 ; SSE2-NEXT:    retq
646 ; SSSE3-LABEL: uaddo_v16i8:
647 ; SSSE3:       # %bb.0:
648 ; SSSE3-NEXT:    paddb %xmm0, %xmm1
649 ; SSSE3-NEXT:    pmaxub %xmm1, %xmm0
650 ; SSSE3-NEXT:    pcmpeqb %xmm1, %xmm0
651 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm3
652 ; SSSE3-NEXT:    pxor %xmm0, %xmm3
653 ; SSSE3-NEXT:    movdqa %xmm3, %xmm0
654 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
655 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
656 ; SSSE3-NEXT:    movdqa %xmm3, %xmm4
657 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
658 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7]
659 ; SSSE3-NEXT:    pslld $31, %xmm4
660 ; SSSE3-NEXT:    psrad $31, %xmm4
661 ; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
662 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
663 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
664 ; SSSE3-NEXT:    pslld $31, %xmm2
665 ; SSSE3-NEXT:    psrad $31, %xmm2
666 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]
667 ; SSSE3-NEXT:    pslld $31, %xmm3
668 ; SSSE3-NEXT:    psrad $31, %xmm3
669 ; SSSE3-NEXT:    movdqa %xmm1, (%rdi)
670 ; SSSE3-NEXT:    movdqa %xmm4, %xmm1
671 ; SSSE3-NEXT:    retq
673 ; SSE41-LABEL: uaddo_v16i8:
674 ; SSE41:       # %bb.0:
675 ; SSE41-NEXT:    paddb %xmm0, %xmm1
676 ; SSE41-NEXT:    pmaxub %xmm1, %xmm0
677 ; SSE41-NEXT:    pcmpeqb %xmm1, %xmm0
678 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm3
679 ; SSE41-NEXT:    pxor %xmm0, %xmm3
680 ; SSE41-NEXT:    pmovsxbd %xmm3, %xmm0
681 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,1,1]
682 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm4 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
683 ; SSE41-NEXT:    pslld $31, %xmm4
684 ; SSE41-NEXT:    psrad $31, %xmm4
685 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,2,3]
686 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
687 ; SSE41-NEXT:    pslld $31, %xmm2
688 ; SSE41-NEXT:    psrad $31, %xmm2
689 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[3,3,3,3]
690 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
691 ; SSE41-NEXT:    pslld $31, %xmm3
692 ; SSE41-NEXT:    psrad $31, %xmm3
693 ; SSE41-NEXT:    movdqa %xmm1, (%rdi)
694 ; SSE41-NEXT:    movdqa %xmm4, %xmm1
695 ; SSE41-NEXT:    retq
697 ; AVX1-LABEL: uaddo_v16i8:
698 ; AVX1:       # %bb.0:
699 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm2
700 ; AVX1-NEXT:    vpmaxub %xmm0, %xmm2, %xmm0
701 ; AVX1-NEXT:    vpcmpeqb %xmm0, %xmm2, %xmm0
702 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
703 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm1
704 ; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm0
705 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[1,1,1,1]
706 ; AVX1-NEXT:    vpmovsxbd %xmm3, %xmm3
707 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
708 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]
709 ; AVX1-NEXT:    vpmovsxbd %xmm3, %xmm3
710 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[3,3,3,3]
711 ; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1
712 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm3, %ymm1
713 ; AVX1-NEXT:    vmovdqa %xmm2, (%rdi)
714 ; AVX1-NEXT:    retq
716 ; AVX2-LABEL: uaddo_v16i8:
717 ; AVX2:       # %bb.0:
718 ; AVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm2
719 ; AVX2-NEXT:    vpmaxub %xmm0, %xmm2, %xmm0
720 ; AVX2-NEXT:    vpcmpeqb %xmm0, %xmm2, %xmm0
721 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
722 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm1
723 ; AVX2-NEXT:    vpmovsxbd %xmm1, %ymm0
724 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
725 ; AVX2-NEXT:    vpmovsxbd %xmm1, %ymm1
726 ; AVX2-NEXT:    vmovdqa %xmm2, (%rdi)
727 ; AVX2-NEXT:    retq
729 ; AVX512-LABEL: uaddo_v16i8:
730 ; AVX512:       # %bb.0:
731 ; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm1
732 ; AVX512-NEXT:    vpcmpltub %xmm0, %xmm1, %k1
733 ; AVX512-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
734 ; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)
735 ; AVX512-NEXT:    retq
736   %t = call {<16 x i8>, <16 x i1>} @llvm.uadd.with.overflow.v16i8(<16 x i8> %a0, <16 x i8> %a1)
737   %val = extractvalue {<16 x i8>, <16 x i1>} %t, 0
738   %obit = extractvalue {<16 x i8>, <16 x i1>} %t, 1
739   %res = sext <16 x i1> %obit to <16 x i32>
740   store <16 x i8> %val, ptr %p2
741   ret <16 x i32> %res
744 define <8 x i32> @uaddo_v8i16(<8 x i16> %a0, <8 x i16> %a1, ptr %p2) nounwind {
745 ; SSE2-LABEL: uaddo_v8i16:
746 ; SSE2:       # %bb.0:
747 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
748 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [32768,32768,32768,32768,32768,32768,32768,32768]
749 ; SSE2-NEXT:    paddw %xmm0, %xmm1
750 ; SSE2-NEXT:    pxor %xmm3, %xmm2
751 ; SSE2-NEXT:    pxor %xmm1, %xmm3
752 ; SSE2-NEXT:    pcmpgtw %xmm3, %xmm2
753 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
754 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
755 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]
756 ; SSE2-NEXT:    pslld $31, %xmm2
757 ; SSE2-NEXT:    psrad $31, %xmm2
758 ; SSE2-NEXT:    movdqa %xmm1, (%rdi)
759 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
760 ; SSE2-NEXT:    retq
762 ; SSSE3-LABEL: uaddo_v8i16:
763 ; SSSE3:       # %bb.0:
764 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
765 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [32768,32768,32768,32768,32768,32768,32768,32768]
766 ; SSSE3-NEXT:    paddw %xmm0, %xmm1
767 ; SSSE3-NEXT:    pxor %xmm3, %xmm2
768 ; SSSE3-NEXT:    pxor %xmm1, %xmm3
769 ; SSSE3-NEXT:    pcmpgtw %xmm3, %xmm2
770 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
771 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
772 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]
773 ; SSSE3-NEXT:    pslld $31, %xmm2
774 ; SSSE3-NEXT:    psrad $31, %xmm2
775 ; SSSE3-NEXT:    movdqa %xmm1, (%rdi)
776 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
777 ; SSSE3-NEXT:    retq
779 ; SSE41-LABEL: uaddo_v8i16:
780 ; SSE41:       # %bb.0:
781 ; SSE41-NEXT:    paddw %xmm0, %xmm1
782 ; SSE41-NEXT:    pmaxuw %xmm1, %xmm0
783 ; SSE41-NEXT:    pcmpeqw %xmm1, %xmm0
784 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
785 ; SSE41-NEXT:    pxor %xmm0, %xmm2
786 ; SSE41-NEXT:    pmovsxwd %xmm2, %xmm0
787 ; SSE41-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]
788 ; SSE41-NEXT:    pslld $31, %xmm2
789 ; SSE41-NEXT:    psrad $31, %xmm2
790 ; SSE41-NEXT:    movdqa %xmm1, (%rdi)
791 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
792 ; SSE41-NEXT:    retq
794 ; AVX1-LABEL: uaddo_v8i16:
795 ; AVX1:       # %bb.0:
796 ; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm1
797 ; AVX1-NEXT:    vpmaxuw %xmm0, %xmm1, %xmm0
798 ; AVX1-NEXT:    vpcmpeqw %xmm0, %xmm1, %xmm0
799 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
800 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
801 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm2
802 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
803 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
804 ; AVX1-NEXT:    vmovdqa %xmm1, (%rdi)
805 ; AVX1-NEXT:    retq
807 ; AVX2-LABEL: uaddo_v8i16:
808 ; AVX2:       # %bb.0:
809 ; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm1
810 ; AVX2-NEXT:    vpmaxuw %xmm0, %xmm1, %xmm0
811 ; AVX2-NEXT:    vpcmpeqw %xmm0, %xmm1, %xmm0
812 ; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
813 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
814 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
815 ; AVX2-NEXT:    vmovdqa %xmm1, (%rdi)
816 ; AVX2-NEXT:    retq
818 ; AVX512-LABEL: uaddo_v8i16:
819 ; AVX512:       # %bb.0:
820 ; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm1
821 ; AVX512-NEXT:    vpcmpltuw %xmm0, %xmm1, %k1
822 ; AVX512-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
823 ; AVX512-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}
824 ; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)
825 ; AVX512-NEXT:    retq
826   %t = call {<8 x i16>, <8 x i1>} @llvm.uadd.with.overflow.v8i16(<8 x i16> %a0, <8 x i16> %a1)
827   %val = extractvalue {<8 x i16>, <8 x i1>} %t, 0
828   %obit = extractvalue {<8 x i16>, <8 x i1>} %t, 1
829   %res = sext <8 x i1> %obit to <8 x i32>
830   store <8 x i16> %val, ptr %p2
831   ret <8 x i32> %res
834 define <2 x i32> @uaddo_v2i64(<2 x i64> %a0, <2 x i64> %a1, ptr %p2) nounwind {
835 ; SSE-LABEL: uaddo_v2i64:
836 ; SSE:       # %bb.0:
837 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
838 ; SSE-NEXT:    paddq %xmm0, %xmm1
839 ; SSE-NEXT:    pxor %xmm2, %xmm0
840 ; SSE-NEXT:    pxor %xmm1, %xmm2
841 ; SSE-NEXT:    movdqa %xmm0, %xmm3
842 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm3
843 ; SSE-NEXT:    pcmpgtd %xmm2, %xmm0
844 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]
845 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,3,3,3]
846 ; SSE-NEXT:    pand %xmm2, %xmm3
847 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,3,3,3]
848 ; SSE-NEXT:    por %xmm3, %xmm0
849 ; SSE-NEXT:    movdqa %xmm1, (%rdi)
850 ; SSE-NEXT:    retq
852 ; AVX1-LABEL: uaddo_v2i64:
853 ; AVX1:       # %bb.0:
854 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
855 ; AVX1-NEXT:    # xmm2 = mem[0,0]
856 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm3
857 ; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm1
858 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm0
859 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm3, %xmm0
860 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
861 ; AVX1-NEXT:    vmovdqa %xmm1, (%rdi)
862 ; AVX1-NEXT:    retq
864 ; AVX2-LABEL: uaddo_v2i64:
865 ; AVX2:       # %bb.0:
866 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
867 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm3
868 ; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm1
869 ; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm0
870 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm3, %xmm0
871 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
872 ; AVX2-NEXT:    vmovdqa %xmm1, (%rdi)
873 ; AVX2-NEXT:    retq
875 ; AVX512-LABEL: uaddo_v2i64:
876 ; AVX512:       # %bb.0:
877 ; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm1
878 ; AVX512-NEXT:    vpcmpltuq %xmm0, %xmm1, %k1
879 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
880 ; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
881 ; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)
882 ; AVX512-NEXT:    retq
883   %t = call {<2 x i64>, <2 x i1>} @llvm.uadd.with.overflow.v2i64(<2 x i64> %a0, <2 x i64> %a1)
884   %val = extractvalue {<2 x i64>, <2 x i1>} %t, 0
885   %obit = extractvalue {<2 x i64>, <2 x i1>} %t, 1
886   %res = sext <2 x i1> %obit to <2 x i32>
887   store <2 x i64> %val, ptr %p2
888   ret <2 x i32> %res
891 define <4 x i32> @uaddo_v4i24(<4 x i24> %a0, <4 x i24> %a1, ptr %p2) nounwind {
892 ; SSE2-LABEL: uaddo_v4i24:
893 ; SSE2:       # %bb.0:
894 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
895 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
896 ; SSE2-NEXT:    pand %xmm3, %xmm1
897 ; SSE2-NEXT:    pand %xmm3, %xmm2
898 ; SSE2-NEXT:    paddd %xmm1, %xmm2
899 ; SSE2-NEXT:    pand %xmm2, %xmm3
900 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
901 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0
902 ; SSE2-NEXT:    pxor %xmm3, %xmm0
903 ; SSE2-NEXT:    movd %xmm2, %eax
904 ; SSE2-NEXT:    movw %ax, (%rdi)
905 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[3,3,3,3]
906 ; SSE2-NEXT:    movd %xmm1, %ecx
907 ; SSE2-NEXT:    movw %cx, 9(%rdi)
908 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]
909 ; SSE2-NEXT:    movd %xmm1, %edx
910 ; SSE2-NEXT:    movw %dx, 6(%rdi)
911 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,1,1]
912 ; SSE2-NEXT:    movd %xmm1, %esi
913 ; SSE2-NEXT:    movw %si, 3(%rdi)
914 ; SSE2-NEXT:    shrl $16, %eax
915 ; SSE2-NEXT:    movb %al, 2(%rdi)
916 ; SSE2-NEXT:    shrl $16, %ecx
917 ; SSE2-NEXT:    movb %cl, 11(%rdi)
918 ; SSE2-NEXT:    shrl $16, %edx
919 ; SSE2-NEXT:    movb %dl, 8(%rdi)
920 ; SSE2-NEXT:    shrl $16, %esi
921 ; SSE2-NEXT:    movb %sil, 5(%rdi)
922 ; SSE2-NEXT:    retq
924 ; SSSE3-LABEL: uaddo_v4i24:
925 ; SSSE3:       # %bb.0:
926 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
927 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
928 ; SSSE3-NEXT:    pand %xmm3, %xmm1
929 ; SSSE3-NEXT:    pand %xmm3, %xmm2
930 ; SSSE3-NEXT:    paddd %xmm1, %xmm2
931 ; SSSE3-NEXT:    pand %xmm2, %xmm3
932 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm3
933 ; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm0
934 ; SSSE3-NEXT:    pxor %xmm3, %xmm0
935 ; SSSE3-NEXT:    movd %xmm2, %eax
936 ; SSSE3-NEXT:    movw %ax, (%rdi)
937 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[3,3,3,3]
938 ; SSSE3-NEXT:    movd %xmm1, %ecx
939 ; SSSE3-NEXT:    movw %cx, 9(%rdi)
940 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]
941 ; SSSE3-NEXT:    movd %xmm1, %edx
942 ; SSSE3-NEXT:    movw %dx, 6(%rdi)
943 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,1,1]
944 ; SSSE3-NEXT:    movd %xmm1, %esi
945 ; SSSE3-NEXT:    movw %si, 3(%rdi)
946 ; SSSE3-NEXT:    shrl $16, %eax
947 ; SSSE3-NEXT:    movb %al, 2(%rdi)
948 ; SSSE3-NEXT:    shrl $16, %ecx
949 ; SSSE3-NEXT:    movb %cl, 11(%rdi)
950 ; SSSE3-NEXT:    shrl $16, %edx
951 ; SSSE3-NEXT:    movb %dl, 8(%rdi)
952 ; SSSE3-NEXT:    shrl $16, %esi
953 ; SSSE3-NEXT:    movb %sil, 5(%rdi)
954 ; SSSE3-NEXT:    retq
956 ; SSE41-LABEL: uaddo_v4i24:
957 ; SSE41:       # %bb.0:
958 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
959 ; SSE41-NEXT:    pand %xmm2, %xmm1
960 ; SSE41-NEXT:    pand %xmm2, %xmm0
961 ; SSE41-NEXT:    paddd %xmm1, %xmm0
962 ; SSE41-NEXT:    pand %xmm0, %xmm2
963 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
964 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
965 ; SSE41-NEXT:    pxor %xmm2, %xmm1
966 ; SSE41-NEXT:    pextrd $3, %xmm0, %eax
967 ; SSE41-NEXT:    movw %ax, 9(%rdi)
968 ; SSE41-NEXT:    pextrd $2, %xmm0, %ecx
969 ; SSE41-NEXT:    movw %cx, 6(%rdi)
970 ; SSE41-NEXT:    pextrd $1, %xmm0, %edx
971 ; SSE41-NEXT:    movw %dx, 3(%rdi)
972 ; SSE41-NEXT:    movd %xmm0, %esi
973 ; SSE41-NEXT:    movw %si, (%rdi)
974 ; SSE41-NEXT:    shrl $16, %eax
975 ; SSE41-NEXT:    movb %al, 11(%rdi)
976 ; SSE41-NEXT:    shrl $16, %ecx
977 ; SSE41-NEXT:    movb %cl, 8(%rdi)
978 ; SSE41-NEXT:    shrl $16, %edx
979 ; SSE41-NEXT:    movb %dl, 5(%rdi)
980 ; SSE41-NEXT:    shrl $16, %esi
981 ; SSE41-NEXT:    movb %sil, 2(%rdi)
982 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
983 ; SSE41-NEXT:    retq
985 ; AVX1-LABEL: uaddo_v4i24:
986 ; AVX1:       # %bb.0:
987 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
988 ; AVX1-NEXT:    vandps %xmm2, %xmm1, %xmm1
989 ; AVX1-NEXT:    vandps %xmm2, %xmm0, %xmm0
990 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
991 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm0
992 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
993 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
994 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
995 ; AVX1-NEXT:    vpextrd $3, %xmm1, %eax
996 ; AVX1-NEXT:    movw %ax, 9(%rdi)
997 ; AVX1-NEXT:    vpextrd $2, %xmm1, %ecx
998 ; AVX1-NEXT:    movw %cx, 6(%rdi)
999 ; AVX1-NEXT:    vpextrd $1, %xmm1, %edx
1000 ; AVX1-NEXT:    movw %dx, 3(%rdi)
1001 ; AVX1-NEXT:    vmovd %xmm1, %esi
1002 ; AVX1-NEXT:    movw %si, (%rdi)
1003 ; AVX1-NEXT:    shrl $16, %eax
1004 ; AVX1-NEXT:    movb %al, 11(%rdi)
1005 ; AVX1-NEXT:    shrl $16, %ecx
1006 ; AVX1-NEXT:    movb %cl, 8(%rdi)
1007 ; AVX1-NEXT:    shrl $16, %edx
1008 ; AVX1-NEXT:    movb %dl, 5(%rdi)
1009 ; AVX1-NEXT:    shrl $16, %esi
1010 ; AVX1-NEXT:    movb %sil, 2(%rdi)
1011 ; AVX1-NEXT:    retq
1013 ; AVX2-LABEL: uaddo_v4i24:
1014 ; AVX2:       # %bb.0:
1015 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
1016 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
1017 ; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
1018 ; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
1019 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm0
1020 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
1021 ; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1022 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
1023 ; AVX2-NEXT:    vpextrd $3, %xmm1, %eax
1024 ; AVX2-NEXT:    movw %ax, 9(%rdi)
1025 ; AVX2-NEXT:    vpextrd $2, %xmm1, %ecx
1026 ; AVX2-NEXT:    movw %cx, 6(%rdi)
1027 ; AVX2-NEXT:    vpextrd $1, %xmm1, %edx
1028 ; AVX2-NEXT:    movw %dx, 3(%rdi)
1029 ; AVX2-NEXT:    vmovd %xmm1, %esi
1030 ; AVX2-NEXT:    movw %si, (%rdi)
1031 ; AVX2-NEXT:    shrl $16, %eax
1032 ; AVX2-NEXT:    movb %al, 11(%rdi)
1033 ; AVX2-NEXT:    shrl $16, %ecx
1034 ; AVX2-NEXT:    movb %cl, 8(%rdi)
1035 ; AVX2-NEXT:    shrl $16, %edx
1036 ; AVX2-NEXT:    movb %dl, 5(%rdi)
1037 ; AVX2-NEXT:    shrl $16, %esi
1038 ; AVX2-NEXT:    movb %sil, 2(%rdi)
1039 ; AVX2-NEXT:    retq
1041 ; AVX512-LABEL: uaddo_v4i24:
1042 ; AVX512:       # %bb.0:
1043 ; AVX512-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
1044 ; AVX512-NEXT:    vpand %xmm2, %xmm1, %xmm1
1045 ; AVX512-NEXT:    vpand %xmm2, %xmm0, %xmm0
1046 ; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
1047 ; AVX512-NEXT:    vpand %xmm2, %xmm1, %xmm0
1048 ; AVX512-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
1049 ; AVX512-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
1050 ; AVX512-NEXT:    vpextrd $3, %xmm1, %eax
1051 ; AVX512-NEXT:    movw %ax, 9(%rdi)
1052 ; AVX512-NEXT:    vpextrd $2, %xmm1, %ecx
1053 ; AVX512-NEXT:    movw %cx, 6(%rdi)
1054 ; AVX512-NEXT:    vpextrd $1, %xmm1, %edx
1055 ; AVX512-NEXT:    movw %dx, 3(%rdi)
1056 ; AVX512-NEXT:    vmovd %xmm1, %esi
1057 ; AVX512-NEXT:    movw %si, (%rdi)
1058 ; AVX512-NEXT:    shrl $16, %eax
1059 ; AVX512-NEXT:    movb %al, 11(%rdi)
1060 ; AVX512-NEXT:    shrl $16, %ecx
1061 ; AVX512-NEXT:    movb %cl, 8(%rdi)
1062 ; AVX512-NEXT:    shrl $16, %edx
1063 ; AVX512-NEXT:    movb %dl, 5(%rdi)
1064 ; AVX512-NEXT:    shrl $16, %esi
1065 ; AVX512-NEXT:    movb %sil, 2(%rdi)
1066 ; AVX512-NEXT:    retq
1067   %t = call {<4 x i24>, <4 x i1>} @llvm.uadd.with.overflow.v4i24(<4 x i24> %a0, <4 x i24> %a1)
1068   %val = extractvalue {<4 x i24>, <4 x i1>} %t, 0
1069   %obit = extractvalue {<4 x i24>, <4 x i1>} %t, 1
1070   %res = sext <4 x i1> %obit to <4 x i32>
1071   store <4 x i24> %val, ptr %p2
1072   ret <4 x i32> %res
1075 define <4 x i32> @uaddo_v4i1(<4 x i1> %a0, <4 x i1> %a1, ptr %p2) nounwind {
1076 ; SSE-LABEL: uaddo_v4i1:
1077 ; SSE:       # %bb.0:
1078 ; SSE-NEXT:    movdqa %xmm0, %xmm2
1079 ; SSE-NEXT:    pxor %xmm1, %xmm2
1080 ; SSE-NEXT:    pslld $31, %xmm2
1081 ; SSE-NEXT:    movmskps %xmm2, %eax
1082 ; SSE-NEXT:    pand %xmm1, %xmm0
1083 ; SSE-NEXT:    pslld $31, %xmm0
1084 ; SSE-NEXT:    psrad $31, %xmm0
1085 ; SSE-NEXT:    movb %al, (%rdi)
1086 ; SSE-NEXT:    retq
1088 ; AVX-LABEL: uaddo_v4i1:
1089 ; AVX:       # %bb.0:
1090 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm2
1091 ; AVX-NEXT:    vpslld $31, %xmm2, %xmm2
1092 ; AVX-NEXT:    vmovmskps %xmm2, %eax
1093 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
1094 ; AVX-NEXT:    vpslld $31, %xmm0, %xmm0
1095 ; AVX-NEXT:    vpsrad $31, %xmm0, %xmm0
1096 ; AVX-NEXT:    movb %al, (%rdi)
1097 ; AVX-NEXT:    retq
1099 ; AVX512-LABEL: uaddo_v4i1:
1100 ; AVX512:       # %bb.0:
1101 ; AVX512-NEXT:    vpslld $31, %xmm0, %xmm0
1102 ; AVX512-NEXT:    vptestmd %xmm0, %xmm0, %k0
1103 ; AVX512-NEXT:    vpslld $31, %xmm1, %xmm0
1104 ; AVX512-NEXT:    vptestmd %xmm0, %xmm0, %k1
1105 ; AVX512-NEXT:    kxorw %k1, %k0, %k2
1106 ; AVX512-NEXT:    kandw %k1, %k0, %k1
1107 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
1108 ; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
1109 ; AVX512-NEXT:    kshiftlw $12, %k2, %k0
1110 ; AVX512-NEXT:    kshiftrw $12, %k0, %k0
1111 ; AVX512-NEXT:    kmovd %k0, %eax
1112 ; AVX512-NEXT:    movb %al, (%rdi)
1113 ; AVX512-NEXT:    retq
1114   %t = call {<4 x i1>, <4 x i1>} @llvm.uadd.with.overflow.v4i1(<4 x i1> %a0, <4 x i1> %a1)
1115   %val = extractvalue {<4 x i1>, <4 x i1>} %t, 0
1116   %obit = extractvalue {<4 x i1>, <4 x i1>} %t, 1
1117   %res = sext <4 x i1> %obit to <4 x i32>
1118   store <4 x i1> %val, ptr %p2
1119   ret <4 x i32> %res
1122 define <2 x i32> @uaddo_v2i128(<2 x i128> %a0, <2 x i128> %a1, ptr %p2) nounwind {
1123 ; SSE2-LABEL: uaddo_v2i128:
1124 ; SSE2:       # %bb.0:
1125 ; SSE2-NEXT:    movq {{[0-9]+}}(%rsp), %rax
1126 ; SSE2-NEXT:    xorl %r10d, %r10d
1127 ; SSE2-NEXT:    addq {{[0-9]+}}(%rsp), %rdx
1128 ; SSE2-NEXT:    adcq {{[0-9]+}}(%rsp), %rcx
1129 ; SSE2-NEXT:    movl $0, %r11d
1130 ; SSE2-NEXT:    sbbl %r11d, %r11d
1131 ; SSE2-NEXT:    addq %r8, %rdi
1132 ; SSE2-NEXT:    adcq %r9, %rsi
1133 ; SSE2-NEXT:    movd %r11d, %xmm1
1134 ; SSE2-NEXT:    sbbl %r10d, %r10d
1135 ; SSE2-NEXT:    movd %r10d, %xmm0
1136 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1137 ; SSE2-NEXT:    movq %rdx, 16(%rax)
1138 ; SSE2-NEXT:    movq %rdi, (%rax)
1139 ; SSE2-NEXT:    movq %rcx, 24(%rax)
1140 ; SSE2-NEXT:    movq %rsi, 8(%rax)
1141 ; SSE2-NEXT:    retq
1143 ; SSSE3-LABEL: uaddo_v2i128:
1144 ; SSSE3:       # %bb.0:
1145 ; SSSE3-NEXT:    movq {{[0-9]+}}(%rsp), %rax
1146 ; SSSE3-NEXT:    xorl %r10d, %r10d
1147 ; SSSE3-NEXT:    addq {{[0-9]+}}(%rsp), %rdx
1148 ; SSSE3-NEXT:    adcq {{[0-9]+}}(%rsp), %rcx
1149 ; SSSE3-NEXT:    movl $0, %r11d
1150 ; SSSE3-NEXT:    sbbl %r11d, %r11d
1151 ; SSSE3-NEXT:    addq %r8, %rdi
1152 ; SSSE3-NEXT:    adcq %r9, %rsi
1153 ; SSSE3-NEXT:    movd %r11d, %xmm1
1154 ; SSSE3-NEXT:    sbbl %r10d, %r10d
1155 ; SSSE3-NEXT:    movd %r10d, %xmm0
1156 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1157 ; SSSE3-NEXT:    movq %rdx, 16(%rax)
1158 ; SSSE3-NEXT:    movq %rdi, (%rax)
1159 ; SSSE3-NEXT:    movq %rcx, 24(%rax)
1160 ; SSSE3-NEXT:    movq %rsi, 8(%rax)
1161 ; SSSE3-NEXT:    retq
1163 ; SSE41-LABEL: uaddo_v2i128:
1164 ; SSE41:       # %bb.0:
1165 ; SSE41-NEXT:    movq {{[0-9]+}}(%rsp), %rax
1166 ; SSE41-NEXT:    xorl %r10d, %r10d
1167 ; SSE41-NEXT:    addq {{[0-9]+}}(%rsp), %rdx
1168 ; SSE41-NEXT:    adcq {{[0-9]+}}(%rsp), %rcx
1169 ; SSE41-NEXT:    movl $0, %r11d
1170 ; SSE41-NEXT:    sbbl %r11d, %r11d
1171 ; SSE41-NEXT:    addq %r8, %rdi
1172 ; SSE41-NEXT:    adcq %r9, %rsi
1173 ; SSE41-NEXT:    sbbl %r10d, %r10d
1174 ; SSE41-NEXT:    movd %r10d, %xmm0
1175 ; SSE41-NEXT:    pinsrd $1, %r11d, %xmm0
1176 ; SSE41-NEXT:    movq %rdx, 16(%rax)
1177 ; SSE41-NEXT:    movq %rdi, (%rax)
1178 ; SSE41-NEXT:    movq %rcx, 24(%rax)
1179 ; SSE41-NEXT:    movq %rsi, 8(%rax)
1180 ; SSE41-NEXT:    retq
1182 ; AVX-LABEL: uaddo_v2i128:
1183 ; AVX:       # %bb.0:
1184 ; AVX-NEXT:    movq {{[0-9]+}}(%rsp), %rax
1185 ; AVX-NEXT:    xorl %r10d, %r10d
1186 ; AVX-NEXT:    addq {{[0-9]+}}(%rsp), %rdx
1187 ; AVX-NEXT:    adcq {{[0-9]+}}(%rsp), %rcx
1188 ; AVX-NEXT:    movl $0, %r11d
1189 ; AVX-NEXT:    sbbl %r11d, %r11d
1190 ; AVX-NEXT:    addq %r8, %rdi
1191 ; AVX-NEXT:    adcq %r9, %rsi
1192 ; AVX-NEXT:    sbbl %r10d, %r10d
1193 ; AVX-NEXT:    vmovd %r10d, %xmm0
1194 ; AVX-NEXT:    vpinsrd $1, %r11d, %xmm0, %xmm0
1195 ; AVX-NEXT:    movq %rdx, 16(%rax)
1196 ; AVX-NEXT:    movq %rdi, (%rax)
1197 ; AVX-NEXT:    movq %rcx, 24(%rax)
1198 ; AVX-NEXT:    movq %rsi, 8(%rax)
1199 ; AVX-NEXT:    retq
1201 ; AVX512-LABEL: uaddo_v2i128:
1202 ; AVX512:       # %bb.0:
1203 ; AVX512-NEXT:    movq {{[0-9]+}}(%rsp), %rax
1204 ; AVX512-NEXT:    addq {{[0-9]+}}(%rsp), %rdx
1205 ; AVX512-NEXT:    adcq {{[0-9]+}}(%rsp), %rcx
1206 ; AVX512-NEXT:    setb %r10b
1207 ; AVX512-NEXT:    kmovd %r10d, %k0
1208 ; AVX512-NEXT:    addq %r8, %rdi
1209 ; AVX512-NEXT:    adcq %r9, %rsi
1210 ; AVX512-NEXT:    setb %r8b
1211 ; AVX512-NEXT:    andl $1, %r8d
1212 ; AVX512-NEXT:    kmovw %r8d, %k1
1213 ; AVX512-NEXT:    kshiftlw $1, %k0, %k0
1214 ; AVX512-NEXT:    korw %k0, %k1, %k1
1215 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
1216 ; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
1217 ; AVX512-NEXT:    movq %rdx, 16(%rax)
1218 ; AVX512-NEXT:    movq %rdi, (%rax)
1219 ; AVX512-NEXT:    movq %rcx, 24(%rax)
1220 ; AVX512-NEXT:    movq %rsi, 8(%rax)
1221 ; AVX512-NEXT:    retq
1222   %t = call {<2 x i128>, <2 x i1>} @llvm.uadd.with.overflow.v2i128(<2 x i128> %a0, <2 x i128> %a1)
1223   %val = extractvalue {<2 x i128>, <2 x i1>} %t, 0
1224   %obit = extractvalue {<2 x i128>, <2 x i1>} %t, 1
1225   %res = sext <2 x i1> %obit to <2 x i32>
1226   store <2 x i128> %val, ptr %p2
1227   ret <2 x i32> %res