xref: /llvm-project/llvm/test/CodeGen/X86/vec_uaddo.ll (revision ce6251540d7af30585d4ca753ca2a0ab34d32be2)
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
9
10declare {<1 x i32>, <1 x i1>} @llvm.uadd.with.overflow.v1i32(<1 x i32>, <1 x i32>)
11declare {<2 x i32>, <2 x i1>} @llvm.uadd.with.overflow.v2i32(<2 x i32>, <2 x i32>)
12declare {<3 x i32>, <3 x i1>} @llvm.uadd.with.overflow.v3i32(<3 x i32>, <3 x i32>)
13declare {<4 x i32>, <4 x i1>} @llvm.uadd.with.overflow.v4i32(<4 x i32>, <4 x i32>)
14declare {<6 x i32>, <6 x i1>} @llvm.uadd.with.overflow.v6i32(<6 x i32>, <6 x i32>)
15declare {<8 x i32>, <8 x i1>} @llvm.uadd.with.overflow.v8i32(<8 x i32>, <8 x i32>)
16declare {<16 x i32>, <16 x i1>} @llvm.uadd.with.overflow.v16i32(<16 x i32>, <16 x i32>)
17
18declare {<16 x i8>, <16 x i1>} @llvm.uadd.with.overflow.v16i8(<16 x i8>, <16 x i8>)
19declare {<8 x i16>, <8 x i1>} @llvm.uadd.with.overflow.v8i16(<8 x i16>, <8 x i16>)
20declare {<2 x i64>, <2 x i1>} @llvm.uadd.with.overflow.v2i64(<2 x i64>, <2 x i64>)
21
22declare {<4 x i24>, <4 x i1>} @llvm.uadd.with.overflow.v4i24(<4 x i24>, <4 x i24>)
23declare {<4 x i1>, <4 x i1>} @llvm.uadd.with.overflow.v4i1(<4 x i1>, <4 x i1>)
24declare {<2 x i128>, <2 x i1>} @llvm.uadd.with.overflow.v2i128(<2 x i128>, <2 x i128>)
25
26define <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
40}
41
42define <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
52;
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
62;
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
72;
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
82;
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
97}
98
99define <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
111;
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
123;
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
134;
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
145;
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
161}
162
163define <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
173;
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
183;
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
193;
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
203;
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
218}
219
220define <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
259;
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
298;
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
329;
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
347;
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
359;
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
376}
377
378define <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
393;
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
408;
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
423;
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
441;
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
451;
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
466}
467
468define <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
493;
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
518;
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
543;
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
582;
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
602;
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 {{.*#+}} zmm0 {%k1} {z} = -1
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
616}
617
618define <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
645;
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
672;
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
696;
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
715;
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
728;
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 {{.*#+}} zmm0 {%k1} {z} = -1
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
742}
743
744define <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
761;
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
778;
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
793;
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
806;
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
817;
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
832}
833
834define <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
851;
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
863;
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
874;
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
889}
890
891define <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
923;
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
955;
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
984;
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
1012;
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
1040;
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 {{.*#+}} 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
1073}
1074
1075define <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
1087;
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
1098;
1099; AVX512-LABEL: uaddo_v4i1:
1100; AVX512:       # %bb.0:
1101; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm2
1102; AVX512-NEXT:    vpslld $31, %xmm2, %xmm2
1103; AVX512-NEXT:    vptestmd %xmm2, %xmm2, %k0
1104; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
1105; AVX512-NEXT:    vpslld $31, %xmm0, %xmm0
1106; AVX512-NEXT:    vpsrad $31, %xmm0, %xmm0
1107; AVX512-NEXT:    kmovd %k0, %eax
1108; AVX512-NEXT:    movb %al, (%rdi)
1109; AVX512-NEXT:    retq
1110  %t = call {<4 x i1>, <4 x i1>} @llvm.uadd.with.overflow.v4i1(<4 x i1> %a0, <4 x i1> %a1)
1111  %val = extractvalue {<4 x i1>, <4 x i1>} %t, 0
1112  %obit = extractvalue {<4 x i1>, <4 x i1>} %t, 1
1113  %res = sext <4 x i1> %obit to <4 x i32>
1114  store <4 x i1> %val, ptr %p2
1115  ret <4 x i32> %res
1116}
1117
1118define <2 x i32> @uaddo_v2i128(<2 x i128> %a0, <2 x i128> %a1, ptr %p2) nounwind {
1119; SSE2-LABEL: uaddo_v2i128:
1120; SSE2:       # %bb.0:
1121; SSE2-NEXT:    movq {{[0-9]+}}(%rsp), %rax
1122; SSE2-NEXT:    xorl %r10d, %r10d
1123; SSE2-NEXT:    addq {{[0-9]+}}(%rsp), %rdx
1124; SSE2-NEXT:    adcq {{[0-9]+}}(%rsp), %rcx
1125; SSE2-NEXT:    movl $0, %r11d
1126; SSE2-NEXT:    sbbl %r11d, %r11d
1127; SSE2-NEXT:    addq %r8, %rdi
1128; SSE2-NEXT:    adcq %r9, %rsi
1129; SSE2-NEXT:    movd %r11d, %xmm1
1130; SSE2-NEXT:    sbbl %r10d, %r10d
1131; SSE2-NEXT:    movd %r10d, %xmm0
1132; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1133; SSE2-NEXT:    movq %rdx, 16(%rax)
1134; SSE2-NEXT:    movq %rdi, (%rax)
1135; SSE2-NEXT:    movq %rcx, 24(%rax)
1136; SSE2-NEXT:    movq %rsi, 8(%rax)
1137; SSE2-NEXT:    retq
1138;
1139; SSSE3-LABEL: uaddo_v2i128:
1140; SSSE3:       # %bb.0:
1141; SSSE3-NEXT:    movq {{[0-9]+}}(%rsp), %rax
1142; SSSE3-NEXT:    xorl %r10d, %r10d
1143; SSSE3-NEXT:    addq {{[0-9]+}}(%rsp), %rdx
1144; SSSE3-NEXT:    adcq {{[0-9]+}}(%rsp), %rcx
1145; SSSE3-NEXT:    movl $0, %r11d
1146; SSSE3-NEXT:    sbbl %r11d, %r11d
1147; SSSE3-NEXT:    addq %r8, %rdi
1148; SSSE3-NEXT:    adcq %r9, %rsi
1149; SSSE3-NEXT:    movd %r11d, %xmm1
1150; SSSE3-NEXT:    sbbl %r10d, %r10d
1151; SSSE3-NEXT:    movd %r10d, %xmm0
1152; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1153; SSSE3-NEXT:    movq %rdx, 16(%rax)
1154; SSSE3-NEXT:    movq %rdi, (%rax)
1155; SSSE3-NEXT:    movq %rcx, 24(%rax)
1156; SSSE3-NEXT:    movq %rsi, 8(%rax)
1157; SSSE3-NEXT:    retq
1158;
1159; SSE41-LABEL: uaddo_v2i128:
1160; SSE41:       # %bb.0:
1161; SSE41-NEXT:    movq {{[0-9]+}}(%rsp), %rax
1162; SSE41-NEXT:    xorl %r10d, %r10d
1163; SSE41-NEXT:    addq {{[0-9]+}}(%rsp), %rdx
1164; SSE41-NEXT:    adcq {{[0-9]+}}(%rsp), %rcx
1165; SSE41-NEXT:    movl $0, %r11d
1166; SSE41-NEXT:    sbbl %r11d, %r11d
1167; SSE41-NEXT:    addq %r8, %rdi
1168; SSE41-NEXT:    adcq %r9, %rsi
1169; SSE41-NEXT:    sbbl %r10d, %r10d
1170; SSE41-NEXT:    movd %r10d, %xmm0
1171; SSE41-NEXT:    pinsrd $1, %r11d, %xmm0
1172; SSE41-NEXT:    movq %rdx, 16(%rax)
1173; SSE41-NEXT:    movq %rdi, (%rax)
1174; SSE41-NEXT:    movq %rcx, 24(%rax)
1175; SSE41-NEXT:    movq %rsi, 8(%rax)
1176; SSE41-NEXT:    retq
1177;
1178; AVX-LABEL: uaddo_v2i128:
1179; AVX:       # %bb.0:
1180; AVX-NEXT:    movq {{[0-9]+}}(%rsp), %rax
1181; AVX-NEXT:    xorl %r10d, %r10d
1182; AVX-NEXT:    addq {{[0-9]+}}(%rsp), %rdx
1183; AVX-NEXT:    adcq {{[0-9]+}}(%rsp), %rcx
1184; AVX-NEXT:    movl $0, %r11d
1185; AVX-NEXT:    sbbl %r11d, %r11d
1186; AVX-NEXT:    addq %r8, %rdi
1187; AVX-NEXT:    adcq %r9, %rsi
1188; AVX-NEXT:    sbbl %r10d, %r10d
1189; AVX-NEXT:    vmovd %r10d, %xmm0
1190; AVX-NEXT:    vpinsrd $1, %r11d, %xmm0, %xmm0
1191; AVX-NEXT:    movq %rdx, 16(%rax)
1192; AVX-NEXT:    movq %rdi, (%rax)
1193; AVX-NEXT:    movq %rcx, 24(%rax)
1194; AVX-NEXT:    movq %rsi, 8(%rax)
1195; AVX-NEXT:    retq
1196;
1197; AVX512-LABEL: uaddo_v2i128:
1198; AVX512:       # %bb.0:
1199; AVX512-NEXT:    movq {{[0-9]+}}(%rsp), %rax
1200; AVX512-NEXT:    addq {{[0-9]+}}(%rsp), %rdx
1201; AVX512-NEXT:    adcq {{[0-9]+}}(%rsp), %rcx
1202; AVX512-NEXT:    setb %r10b
1203; AVX512-NEXT:    kmovd %r10d, %k0
1204; AVX512-NEXT:    addq %r8, %rdi
1205; AVX512-NEXT:    adcq %r9, %rsi
1206; AVX512-NEXT:    setb %r8b
1207; AVX512-NEXT:    andl $1, %r8d
1208; AVX512-NEXT:    kmovw %r8d, %k1
1209; AVX512-NEXT:    kshiftlw $1, %k0, %k0
1210; AVX512-NEXT:    korw %k0, %k1, %k1
1211; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
1212; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
1213; AVX512-NEXT:    movq %rdx, 16(%rax)
1214; AVX512-NEXT:    movq %rdi, (%rax)
1215; AVX512-NEXT:    movq %rcx, 24(%rax)
1216; AVX512-NEXT:    movq %rsi, 8(%rax)
1217; AVX512-NEXT:    retq
1218  %t = call {<2 x i128>, <2 x i1>} @llvm.uadd.with.overflow.v2i128(<2 x i128> %a0, <2 x i128> %a1)
1219  %val = extractvalue {<2 x i128>, <2 x i1>} %t, 0
1220  %obit = extractvalue {<2 x i128>, <2 x i1>} %t, 1
1221  %res = sext <2 x i1> %obit to <2 x i32>
1222  store <2 x i128> %val, ptr %p2
1223  ret <2 x i32> %res
1224}
1225