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