1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE,SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE41
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX,AVX512
9 declare {<1 x i32>, <1 x i1>} @llvm.sadd.with.overflow.v1i32(<1 x i32>, <1 x i32>)
10 declare {<2 x i32>, <2 x i1>} @llvm.sadd.with.overflow.v2i32(<2 x i32>, <2 x i32>)
11 declare {<3 x i32>, <3 x i1>} @llvm.sadd.with.overflow.v3i32(<3 x i32>, <3 x i32>)
12 declare {<4 x i32>, <4 x i1>} @llvm.sadd.with.overflow.v4i32(<4 x i32>, <4 x i32>)
13 declare {<6 x i32>, <6 x i1>} @llvm.sadd.with.overflow.v6i32(<6 x i32>, <6 x i32>)
14 declare {<8 x i32>, <8 x i1>} @llvm.sadd.with.overflow.v8i32(<8 x i32>, <8 x i32>)
15 declare {<16 x i32>, <16 x i1>} @llvm.sadd.with.overflow.v16i32(<16 x i32>, <16 x i32>)
17 declare {<16 x i8>, <16 x i1>} @llvm.sadd.with.overflow.v16i8(<16 x i8>, <16 x i8>)
18 declare {<8 x i16>, <8 x i1>} @llvm.sadd.with.overflow.v8i16(<8 x i16>, <8 x i16>)
19 declare {<2 x i64>, <2 x i1>} @llvm.sadd.with.overflow.v2i64(<2 x i64>, <2 x i64>)
21 declare {<4 x i24>, <4 x i1>} @llvm.sadd.with.overflow.v4i24(<4 x i24>, <4 x i24>)
22 declare {<4 x i1>, <4 x i1>} @llvm.sadd.with.overflow.v4i1(<4 x i1>, <4 x i1>)
23 declare {<2 x i128>, <2 x i1>} @llvm.sadd.with.overflow.v2i128(<2 x i128>, <2 x i128>)
25 define <1 x i32> @saddo_v1i32(<1 x i32> %a0, <1 x i32> %a1, <1 x i32>* %p2) nounwind {
26 ; SSE-LABEL: saddo_v1i32:
28 ; SSE-NEXT: xorl %eax, %eax
29 ; SSE-NEXT: addl %esi, %edi
32 ; SSE-NEXT: movl %edi, (%rdx)
35 ; AVX-LABEL: saddo_v1i32:
37 ; AVX-NEXT: xorl %eax, %eax
38 ; AVX-NEXT: addl %esi, %edi
41 ; AVX-NEXT: movl %edi, (%rdx)
43 %t = call {<1 x i32>, <1 x i1>} @llvm.sadd.with.overflow.v1i32(<1 x i32> %a0, <1 x i32> %a1)
44 %val = extractvalue {<1 x i32>, <1 x i1>} %t, 0
45 %obit = extractvalue {<1 x i32>, <1 x i1>} %t, 1
46 %res = sext <1 x i1> %obit to <1 x i32>
47 store <1 x i32> %val, <1 x i32>* %p2
51 define <2 x i32> @saddo_v2i32(<2 x i32> %a0, <2 x i32> %a1, <2 x i32>* %p2) nounwind {
52 ; SSE2-LABEL: saddo_v2i32:
54 ; SSE2-NEXT: psllq $32, %xmm1
55 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]
56 ; SSE2-NEXT: psrad $31, %xmm1
57 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
58 ; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
59 ; SSE2-NEXT: psllq $32, %xmm0
60 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]
61 ; SSE2-NEXT: psrad $31, %xmm0
62 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
63 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
64 ; SSE2-NEXT: paddq %xmm2, %xmm1
65 ; SSE2-NEXT: movdqa %xmm1, %xmm0
66 ; SSE2-NEXT: psllq $32, %xmm0
67 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,3,2,3]
68 ; SSE2-NEXT: psrad $31, %xmm0
69 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
70 ; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
71 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2
72 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,0,3,2]
73 ; SSE2-NEXT: pand %xmm2, %xmm3
74 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
75 ; SSE2-NEXT: pxor %xmm3, %xmm0
76 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
77 ; SSE2-NEXT: movq %xmm1, (%rdi)
80 ; SSSE3-LABEL: saddo_v2i32:
82 ; SSSE3-NEXT: psllq $32, %xmm1
83 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]
84 ; SSSE3-NEXT: psrad $31, %xmm1
85 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
86 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
87 ; SSSE3-NEXT: psllq $32, %xmm0
88 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]
89 ; SSSE3-NEXT: psrad $31, %xmm0
90 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
91 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
92 ; SSSE3-NEXT: paddq %xmm2, %xmm1
93 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
94 ; SSSE3-NEXT: psllq $32, %xmm0
95 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,3,2,3]
96 ; SSSE3-NEXT: psrad $31, %xmm0
97 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
98 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
99 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm2
100 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,0,3,2]
101 ; SSSE3-NEXT: pand %xmm2, %xmm3
102 ; SSSE3-NEXT: pcmpeqd %xmm0, %xmm0
103 ; SSSE3-NEXT: pxor %xmm3, %xmm0
104 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
105 ; SSSE3-NEXT: movq %xmm1, (%rdi)
108 ; SSE41-LABEL: saddo_v2i32:
110 ; SSE41-NEXT: movdqa %xmm1, %xmm2
111 ; SSE41-NEXT: psllq $32, %xmm2
112 ; SSE41-NEXT: psrad $31, %xmm2
113 ; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
114 ; SSE41-NEXT: movdqa %xmm0, %xmm1
115 ; SSE41-NEXT: psllq $32, %xmm1
116 ; SSE41-NEXT: psrad $31, %xmm1
117 ; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
118 ; SSE41-NEXT: paddq %xmm2, %xmm1
119 ; SSE41-NEXT: movdqa %xmm1, %xmm0
120 ; SSE41-NEXT: psllq $32, %xmm0
121 ; SSE41-NEXT: psrad $31, %xmm0
122 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5],xmm0[6,7]
123 ; SSE41-NEXT: pcmpeqq %xmm1, %xmm0
124 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm2
125 ; SSE41-NEXT: pxor %xmm2, %xmm0
126 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
127 ; SSE41-NEXT: movq %xmm1, (%rdi)
130 ; AVX1-LABEL: saddo_v2i32:
132 ; AVX1-NEXT: vpsllq $32, %xmm1, %xmm2
133 ; AVX1-NEXT: vpsrad $31, %xmm2, %xmm2
134 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
135 ; AVX1-NEXT: vpsllq $32, %xmm0, %xmm2
136 ; AVX1-NEXT: vpsrad $31, %xmm2, %xmm2
137 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
138 ; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm1
139 ; AVX1-NEXT: vpsllq $32, %xmm1, %xmm0
140 ; AVX1-NEXT: vpsrad $31, %xmm0, %xmm0
141 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5],xmm0[6,7]
142 ; AVX1-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
143 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
144 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
145 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
146 ; AVX1-NEXT: vmovq %xmm1, (%rdi)
149 ; AVX2-LABEL: saddo_v2i32:
151 ; AVX2-NEXT: vpsllq $32, %xmm1, %xmm2
152 ; AVX2-NEXT: vpsrad $31, %xmm2, %xmm2
153 ; AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]
154 ; AVX2-NEXT: vpsllq $32, %xmm0, %xmm2
155 ; AVX2-NEXT: vpsrad $31, %xmm2, %xmm2
156 ; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
157 ; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm1
158 ; AVX2-NEXT: vpsllq $32, %xmm1, %xmm0
159 ; AVX2-NEXT: vpsrad $31, %xmm0, %xmm0
160 ; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2],xmm0[3]
161 ; AVX2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
162 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
163 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
164 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
165 ; AVX2-NEXT: vmovq %xmm1, (%rdi)
168 ; AVX512-LABEL: saddo_v2i32:
170 ; AVX512-NEXT: vpsllq $32, %xmm1, %xmm1
171 ; AVX512-NEXT: vpsraq $32, %xmm1, %xmm1
172 ; AVX512-NEXT: vpsllq $32, %xmm0, %xmm0
173 ; AVX512-NEXT: vpsraq $32, %xmm0, %xmm0
174 ; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm0
175 ; AVX512-NEXT: vpsllq $32, %xmm0, %xmm1
176 ; AVX512-NEXT: vpsraq $32, %xmm1, %xmm1
177 ; AVX512-NEXT: vpmovqd %xmm0, (%rdi)
178 ; AVX512-NEXT: vpcmpeqq %xmm0, %xmm1, %xmm0
179 ; AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
181 %t = call {<2 x i32>, <2 x i1>} @llvm.sadd.with.overflow.v2i32(<2 x i32> %a0, <2 x i32> %a1)
182 %val = extractvalue {<2 x i32>, <2 x i1>} %t, 0
183 %obit = extractvalue {<2 x i32>, <2 x i1>} %t, 1
184 %res = sext <2 x i1> %obit to <2 x i32>
185 store <2 x i32> %val, <2 x i32>* %p2
189 define <3 x i32> @saddo_v3i32(<3 x i32> %a0, <3 x i32> %a1, <3 x i32>* %p2) nounwind {
190 ; SSE2-LABEL: saddo_v3i32:
192 ; SSE2-NEXT: pxor %xmm2, %xmm2
193 ; SSE2-NEXT: pxor %xmm3, %xmm3
194 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
195 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm4
196 ; SSE2-NEXT: pxor %xmm4, %xmm3
197 ; SSE2-NEXT: pxor %xmm5, %xmm5
198 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm5
199 ; SSE2-NEXT: pxor %xmm4, %xmm5
200 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm3
201 ; SSE2-NEXT: paddd %xmm1, %xmm0
202 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
203 ; SSE2-NEXT: pxor %xmm4, %xmm2
204 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm2
205 ; SSE2-NEXT: pandn %xmm3, %xmm2
206 ; SSE2-NEXT: movq %xmm0, (%rdi)
207 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
208 ; SSE2-NEXT: movd %xmm0, 8(%rdi)
209 ; SSE2-NEXT: movdqa %xmm2, %xmm0
212 ; SSSE3-LABEL: saddo_v3i32:
214 ; SSSE3-NEXT: pxor %xmm2, %xmm2
215 ; SSSE3-NEXT: pxor %xmm3, %xmm3
216 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3
217 ; SSSE3-NEXT: pcmpeqd %xmm4, %xmm4
218 ; SSSE3-NEXT: pxor %xmm4, %xmm3
219 ; SSSE3-NEXT: pxor %xmm5, %xmm5
220 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm5
221 ; SSSE3-NEXT: pxor %xmm4, %xmm5
222 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm3
223 ; SSSE3-NEXT: paddd %xmm1, %xmm0
224 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2
225 ; SSSE3-NEXT: pxor %xmm4, %xmm2
226 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm2
227 ; SSSE3-NEXT: pandn %xmm3, %xmm2
228 ; SSSE3-NEXT: movq %xmm0, (%rdi)
229 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
230 ; SSSE3-NEXT: movd %xmm0, 8(%rdi)
231 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
234 ; SSE41-LABEL: saddo_v3i32:
236 ; SSE41-NEXT: pxor %xmm2, %xmm2
237 ; SSE41-NEXT: pxor %xmm3, %xmm3
238 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm3
239 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm4
240 ; SSE41-NEXT: pxor %xmm4, %xmm3
241 ; SSE41-NEXT: pxor %xmm5, %xmm5
242 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm5
243 ; SSE41-NEXT: pxor %xmm4, %xmm5
244 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm3
245 ; SSE41-NEXT: paddd %xmm1, %xmm0
246 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2
247 ; SSE41-NEXT: pxor %xmm4, %xmm2
248 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm2
249 ; SSE41-NEXT: pandn %xmm3, %xmm2
250 ; SSE41-NEXT: pextrd $2, %xmm0, 8(%rdi)
251 ; SSE41-NEXT: movq %xmm0, (%rdi)
252 ; SSE41-NEXT: movdqa %xmm2, %xmm0
255 ; AVX1-LABEL: saddo_v3i32:
257 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
258 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm3
259 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
260 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
261 ; AVX1-NEXT: vpcmpgtd %xmm0, %xmm2, %xmm5
262 ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5
263 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm5, %xmm3
264 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1
265 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm0
266 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
267 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm5, %xmm0
268 ; AVX1-NEXT: vpandn %xmm3, %xmm0, %xmm0
269 ; AVX1-NEXT: vpextrd $2, %xmm1, 8(%rdi)
270 ; AVX1-NEXT: vmovq %xmm1, (%rdi)
273 ; AVX2-LABEL: saddo_v3i32:
275 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
276 ; AVX2-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm3
277 ; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
278 ; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm3
279 ; AVX2-NEXT: vpcmpgtd %xmm0, %xmm2, %xmm5
280 ; AVX2-NEXT: vpxor %xmm4, %xmm5, %xmm5
281 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm5, %xmm3
282 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm1
283 ; AVX2-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm0
284 ; AVX2-NEXT: vpxor %xmm4, %xmm0, %xmm0
285 ; AVX2-NEXT: vpcmpeqd %xmm0, %xmm5, %xmm0
286 ; AVX2-NEXT: vpandn %xmm3, %xmm0, %xmm0
287 ; AVX2-NEXT: vpextrd $2, %xmm1, 8(%rdi)
288 ; AVX2-NEXT: vmovq %xmm1, (%rdi)
291 ; AVX512-LABEL: saddo_v3i32:
293 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
294 ; AVX512-NEXT: vpcmpnltd %xmm2, %xmm1, %k0
295 ; AVX512-NEXT: vpcmpnltd %xmm2, %xmm0, %k1
296 ; AVX512-NEXT: kxorw %k0, %k1, %k0
297 ; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm1
298 ; AVX512-NEXT: vpcmpnltd %xmm2, %xmm1, %k2
299 ; AVX512-NEXT: kxorw %k2, %k1, %k1
300 ; AVX512-NEXT: kandnw %k1, %k0, %k1
301 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
302 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
303 ; AVX512-NEXT: vpextrd $2, %xmm1, 8(%rdi)
304 ; AVX512-NEXT: vmovq %xmm1, (%rdi)
306 %t = call {<3 x i32>, <3 x i1>} @llvm.sadd.with.overflow.v3i32(<3 x i32> %a0, <3 x i32> %a1)
307 %val = extractvalue {<3 x i32>, <3 x i1>} %t, 0
308 %obit = extractvalue {<3 x i32>, <3 x i1>} %t, 1
309 %res = sext <3 x i1> %obit to <3 x i32>
310 store <3 x i32> %val, <3 x i32>* %p2
314 define <4 x i32> @saddo_v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i32>* %p2) nounwind {
315 ; SSE-LABEL: saddo_v4i32:
317 ; SSE-NEXT: pxor %xmm2, %xmm2
318 ; SSE-NEXT: pxor %xmm3, %xmm3
319 ; SSE-NEXT: pcmpgtd %xmm1, %xmm3
320 ; SSE-NEXT: pcmpeqd %xmm4, %xmm4
321 ; SSE-NEXT: pxor %xmm4, %xmm3
322 ; SSE-NEXT: pxor %xmm5, %xmm5
323 ; SSE-NEXT: pcmpgtd %xmm0, %xmm5
324 ; SSE-NEXT: pxor %xmm4, %xmm5
325 ; SSE-NEXT: pcmpeqd %xmm5, %xmm3
326 ; SSE-NEXT: paddd %xmm1, %xmm0
327 ; SSE-NEXT: pcmpgtd %xmm0, %xmm2
328 ; SSE-NEXT: pxor %xmm4, %xmm2
329 ; SSE-NEXT: pcmpeqd %xmm5, %xmm2
330 ; SSE-NEXT: pandn %xmm3, %xmm2
331 ; SSE-NEXT: movdqa %xmm0, (%rdi)
332 ; SSE-NEXT: movdqa %xmm2, %xmm0
335 ; AVX1-LABEL: saddo_v4i32:
337 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
338 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm3
339 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
340 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
341 ; AVX1-NEXT: vpcmpgtd %xmm0, %xmm2, %xmm5
342 ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5
343 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm5, %xmm3
344 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1
345 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm0
346 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
347 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm5, %xmm0
348 ; AVX1-NEXT: vpandn %xmm3, %xmm0, %xmm0
349 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
352 ; AVX2-LABEL: saddo_v4i32:
354 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
355 ; AVX2-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm3
356 ; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
357 ; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm3
358 ; AVX2-NEXT: vpcmpgtd %xmm0, %xmm2, %xmm5
359 ; AVX2-NEXT: vpxor %xmm4, %xmm5, %xmm5
360 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm5, %xmm3
361 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm1
362 ; AVX2-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm0
363 ; AVX2-NEXT: vpxor %xmm4, %xmm0, %xmm0
364 ; AVX2-NEXT: vpcmpeqd %xmm0, %xmm5, %xmm0
365 ; AVX2-NEXT: vpandn %xmm3, %xmm0, %xmm0
366 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
369 ; AVX512-LABEL: saddo_v4i32:
371 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
372 ; AVX512-NEXT: vpcmpnltd %xmm2, %xmm1, %k0
373 ; AVX512-NEXT: vpcmpnltd %xmm2, %xmm0, %k1
374 ; AVX512-NEXT: kxorw %k0, %k1, %k0
375 ; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm1
376 ; AVX512-NEXT: vpcmpnltd %xmm2, %xmm1, %k2
377 ; AVX512-NEXT: kxorw %k2, %k1, %k1
378 ; AVX512-NEXT: kandnw %k1, %k0, %k1
379 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
380 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
381 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
383 %t = call {<4 x i32>, <4 x i1>} @llvm.sadd.with.overflow.v4i32(<4 x i32> %a0, <4 x i32> %a1)
384 %val = extractvalue {<4 x i32>, <4 x i1>} %t, 0
385 %obit = extractvalue {<4 x i32>, <4 x i1>} %t, 1
386 %res = sext <4 x i1> %obit to <4 x i32>
387 store <4 x i32> %val, <4 x i32>* %p2
391 define <6 x i32> @saddo_v6i32(<6 x i32> %a0, <6 x i32> %a1, <6 x i32>* %p2) nounwind {
392 ; SSE2-LABEL: saddo_v6i32:
394 ; SSE2-NEXT: movq %rdi, %rax
395 ; SSE2-NEXT: movd %r8d, %xmm0
396 ; SSE2-NEXT: movd %ecx, %xmm1
397 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
398 ; SSE2-NEXT: movd %edx, %xmm0
399 ; SSE2-NEXT: movd %esi, %xmm4
400 ; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1]
401 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm1[0]
402 ; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
403 ; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
404 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
405 ; SSE2-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
406 ; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
407 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
408 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
409 ; SSE2-NEXT: movd %r9d, %xmm3
410 ; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
411 ; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
412 ; SSE2-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
413 ; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
414 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
415 ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %rcx
416 ; SSE2-NEXT: pxor %xmm2, %xmm2
417 ; SSE2-NEXT: pxor %xmm6, %xmm6
418 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm6
419 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm5
420 ; SSE2-NEXT: pxor %xmm5, %xmm6
421 ; SSE2-NEXT: pxor %xmm7, %xmm7
422 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm7
423 ; SSE2-NEXT: pxor %xmm5, %xmm7
424 ; SSE2-NEXT: pcmpeqd %xmm7, %xmm6
425 ; SSE2-NEXT: paddd %xmm4, %xmm0
426 ; SSE2-NEXT: pxor %xmm4, %xmm4
427 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
428 ; SSE2-NEXT: pxor %xmm5, %xmm4
429 ; SSE2-NEXT: pcmpeqd %xmm7, %xmm4
430 ; SSE2-NEXT: pandn %xmm6, %xmm4
431 ; SSE2-NEXT: pxor %xmm6, %xmm6
432 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm6
433 ; SSE2-NEXT: pxor %xmm5, %xmm6
434 ; SSE2-NEXT: pxor %xmm7, %xmm7
435 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm7
436 ; SSE2-NEXT: pxor %xmm5, %xmm7
437 ; SSE2-NEXT: pcmpeqd %xmm7, %xmm6
438 ; SSE2-NEXT: paddd %xmm3, %xmm1
439 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
440 ; SSE2-NEXT: pxor %xmm5, %xmm2
441 ; SSE2-NEXT: pcmpeqd %xmm7, %xmm2
442 ; SSE2-NEXT: pandn %xmm6, %xmm2
443 ; SSE2-NEXT: movq %xmm1, 16(%rcx)
444 ; SSE2-NEXT: movdqa %xmm0, (%rcx)
445 ; SSE2-NEXT: movq %xmm2, 16(%rdi)
446 ; SSE2-NEXT: movdqa %xmm4, (%rdi)
449 ; SSSE3-LABEL: saddo_v6i32:
451 ; SSSE3-NEXT: movq %rdi, %rax
452 ; SSSE3-NEXT: movd %r8d, %xmm0
453 ; SSSE3-NEXT: movd %ecx, %xmm1
454 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
455 ; SSSE3-NEXT: movd %edx, %xmm0
456 ; SSSE3-NEXT: movd %esi, %xmm4
457 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1]
458 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm1[0]
459 ; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
460 ; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
461 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
462 ; SSSE3-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
463 ; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
464 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
465 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
466 ; SSSE3-NEXT: movd %r9d, %xmm3
467 ; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
468 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
469 ; SSSE3-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
470 ; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
471 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
472 ; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %rcx
473 ; SSSE3-NEXT: pxor %xmm2, %xmm2
474 ; SSSE3-NEXT: pxor %xmm6, %xmm6
475 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm6
476 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm5
477 ; SSSE3-NEXT: pxor %xmm5, %xmm6
478 ; SSSE3-NEXT: pxor %xmm7, %xmm7
479 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm7
480 ; SSSE3-NEXT: pxor %xmm5, %xmm7
481 ; SSSE3-NEXT: pcmpeqd %xmm7, %xmm6
482 ; SSSE3-NEXT: paddd %xmm4, %xmm0
483 ; SSSE3-NEXT: pxor %xmm4, %xmm4
484 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
485 ; SSSE3-NEXT: pxor %xmm5, %xmm4
486 ; SSSE3-NEXT: pcmpeqd %xmm7, %xmm4
487 ; SSSE3-NEXT: pandn %xmm6, %xmm4
488 ; SSSE3-NEXT: pxor %xmm6, %xmm6
489 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm6
490 ; SSSE3-NEXT: pxor %xmm5, %xmm6
491 ; SSSE3-NEXT: pxor %xmm7, %xmm7
492 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm7
493 ; SSSE3-NEXT: pxor %xmm5, %xmm7
494 ; SSSE3-NEXT: pcmpeqd %xmm7, %xmm6
495 ; SSSE3-NEXT: paddd %xmm3, %xmm1
496 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
497 ; SSSE3-NEXT: pxor %xmm5, %xmm2
498 ; SSSE3-NEXT: pcmpeqd %xmm7, %xmm2
499 ; SSSE3-NEXT: pandn %xmm6, %xmm2
500 ; SSSE3-NEXT: movq %xmm1, 16(%rcx)
501 ; SSSE3-NEXT: movdqa %xmm0, (%rcx)
502 ; SSSE3-NEXT: movq %xmm2, 16(%rdi)
503 ; SSSE3-NEXT: movdqa %xmm4, (%rdi)
506 ; SSE41-LABEL: saddo_v6i32:
508 ; SSE41-NEXT: movq %rdi, %rax
509 ; SSE41-NEXT: movd %esi, %xmm4
510 ; SSE41-NEXT: pinsrd $1, %edx, %xmm4
511 ; SSE41-NEXT: pinsrd $2, %ecx, %xmm4
512 ; SSE41-NEXT: pinsrd $3, %r8d, %xmm4
513 ; SSE41-NEXT: movd %r9d, %xmm2
514 ; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm2
515 ; SSE41-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
516 ; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm0
517 ; SSE41-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
518 ; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm1
519 ; SSE41-NEXT: pinsrd $2, {{[0-9]+}}(%rsp), %xmm1
520 ; SSE41-NEXT: pinsrd $3, {{[0-9]+}}(%rsp), %xmm1
521 ; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %rcx
522 ; SSE41-NEXT: pxor %xmm3, %xmm3
523 ; SSE41-NEXT: pxor %xmm6, %xmm6
524 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm6
525 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm5
526 ; SSE41-NEXT: pxor %xmm5, %xmm6
527 ; SSE41-NEXT: pxor %xmm7, %xmm7
528 ; SSE41-NEXT: pcmpgtd %xmm4, %xmm7
529 ; SSE41-NEXT: pxor %xmm5, %xmm7
530 ; SSE41-NEXT: pcmpeqd %xmm7, %xmm6
531 ; SSE41-NEXT: paddd %xmm4, %xmm1
532 ; SSE41-NEXT: pxor %xmm4, %xmm4
533 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm4
534 ; SSE41-NEXT: pxor %xmm5, %xmm4
535 ; SSE41-NEXT: pcmpeqd %xmm7, %xmm4
536 ; SSE41-NEXT: pandn %xmm6, %xmm4
537 ; SSE41-NEXT: pxor %xmm6, %xmm6
538 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
539 ; SSE41-NEXT: pxor %xmm5, %xmm6
540 ; SSE41-NEXT: pxor %xmm7, %xmm7
541 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm7
542 ; SSE41-NEXT: pxor %xmm5, %xmm7
543 ; SSE41-NEXT: pcmpeqd %xmm7, %xmm6
544 ; SSE41-NEXT: paddd %xmm2, %xmm0
545 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
546 ; SSE41-NEXT: pxor %xmm5, %xmm3
547 ; SSE41-NEXT: pcmpeqd %xmm7, %xmm3
548 ; SSE41-NEXT: pandn %xmm6, %xmm3
549 ; SSE41-NEXT: movq %xmm0, 16(%rcx)
550 ; SSE41-NEXT: movdqa %xmm1, (%rcx)
551 ; SSE41-NEXT: movq %xmm3, 16(%rdi)
552 ; SSE41-NEXT: movdqa %xmm4, (%rdi)
555 ; AVX1-LABEL: saddo_v6i32:
557 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
558 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
559 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm4
560 ; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5
561 ; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4
562 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6
563 ; AVX1-NEXT: vpcmpgtd %xmm6, %xmm3, %xmm7
564 ; AVX1-NEXT: vpxor %xmm5, %xmm7, %xmm7
565 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm7, %xmm8
566 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm3, %xmm4
567 ; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm9
568 ; AVX1-NEXT: vpcmpgtd %xmm0, %xmm3, %xmm4
569 ; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4
570 ; AVX1-NEXT: vpcmpeqd %xmm9, %xmm4, %xmm9
571 ; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm9, %ymm8
572 ; AVX1-NEXT: vpaddd %xmm2, %xmm6, %xmm2
573 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm6
574 ; AVX1-NEXT: vpxor %xmm5, %xmm6, %xmm6
575 ; AVX1-NEXT: vpcmpeqd %xmm6, %xmm7, %xmm6
576 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1
577 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm3, %xmm0
578 ; AVX1-NEXT: vpxor %xmm5, %xmm0, %xmm0
579 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm4, %xmm0
580 ; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm0, %ymm0
581 ; AVX1-NEXT: vandnps %ymm8, %ymm0, %ymm0
582 ; AVX1-NEXT: vmovq %xmm2, 16(%rdi)
583 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
586 ; AVX2-LABEL: saddo_v6i32:
588 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
589 ; AVX2-NEXT: vpcmpgtd %ymm1, %ymm2, %ymm3
590 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4
591 ; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm3
592 ; AVX2-NEXT: vpcmpgtd %ymm0, %ymm2, %ymm5
593 ; AVX2-NEXT: vpxor %ymm4, %ymm5, %ymm5
594 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm5, %ymm3
595 ; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm1
596 ; AVX2-NEXT: vpcmpgtd %ymm1, %ymm2, %ymm0
597 ; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm0
598 ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm5, %ymm0
599 ; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0
600 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
601 ; AVX2-NEXT: vmovq %xmm2, 16(%rdi)
602 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
605 ; AVX512-LABEL: saddo_v6i32:
607 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
608 ; AVX512-NEXT: vpcmpnltd %ymm2, %ymm1, %k0
609 ; AVX512-NEXT: vpcmpnltd %ymm2, %ymm0, %k1
610 ; AVX512-NEXT: kxorw %k0, %k1, %k0
611 ; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm1
612 ; AVX512-NEXT: vpcmpnltd %ymm2, %ymm1, %k2
613 ; AVX512-NEXT: kxorw %k2, %k1, %k1
614 ; AVX512-NEXT: kandnw %k1, %k0, %k1
615 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
616 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
617 ; AVX512-NEXT: vextracti128 $1, %ymm1, %xmm2
618 ; AVX512-NEXT: vmovq %xmm2, 16(%rdi)
619 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
621 %t = call {<6 x i32>, <6 x i1>} @llvm.sadd.with.overflow.v6i32(<6 x i32> %a0, <6 x i32> %a1)
622 %val = extractvalue {<6 x i32>, <6 x i1>} %t, 0
623 %obit = extractvalue {<6 x i32>, <6 x i1>} %t, 1
624 %res = sext <6 x i1> %obit to <6 x i32>
625 store <6 x i32> %val, <6 x i32>* %p2
629 define <8 x i32> @saddo_v8i32(<8 x i32> %a0, <8 x i32> %a1, <8 x i32>* %p2) nounwind {
630 ; SSE-LABEL: saddo_v8i32:
632 ; SSE-NEXT: movdqa %xmm1, %xmm4
633 ; SSE-NEXT: pxor %xmm1, %xmm1
634 ; SSE-NEXT: pxor %xmm6, %xmm6
635 ; SSE-NEXT: pcmpgtd %xmm2, %xmm6
636 ; SSE-NEXT: pcmpeqd %xmm5, %xmm5
637 ; SSE-NEXT: pxor %xmm5, %xmm6
638 ; SSE-NEXT: pxor %xmm7, %xmm7
639 ; SSE-NEXT: pcmpgtd %xmm0, %xmm7
640 ; SSE-NEXT: pxor %xmm5, %xmm7
641 ; SSE-NEXT: pcmpeqd %xmm7, %xmm6
642 ; SSE-NEXT: paddd %xmm2, %xmm0
643 ; SSE-NEXT: pxor %xmm2, %xmm2
644 ; SSE-NEXT: pcmpgtd %xmm0, %xmm2
645 ; SSE-NEXT: pxor %xmm5, %xmm2
646 ; SSE-NEXT: pcmpeqd %xmm7, %xmm2
647 ; SSE-NEXT: pandn %xmm6, %xmm2
648 ; SSE-NEXT: pxor %xmm6, %xmm6
649 ; SSE-NEXT: pcmpgtd %xmm3, %xmm6
650 ; SSE-NEXT: pxor %xmm5, %xmm6
651 ; SSE-NEXT: pxor %xmm7, %xmm7
652 ; SSE-NEXT: pcmpgtd %xmm4, %xmm7
653 ; SSE-NEXT: pxor %xmm5, %xmm7
654 ; SSE-NEXT: pcmpeqd %xmm7, %xmm6
655 ; SSE-NEXT: paddd %xmm3, %xmm4
656 ; SSE-NEXT: pcmpgtd %xmm4, %xmm1
657 ; SSE-NEXT: pxor %xmm5, %xmm1
658 ; SSE-NEXT: pcmpeqd %xmm7, %xmm1
659 ; SSE-NEXT: pandn %xmm6, %xmm1
660 ; SSE-NEXT: movdqa %xmm4, 16(%rdi)
661 ; SSE-NEXT: movdqa %xmm0, (%rdi)
662 ; SSE-NEXT: movdqa %xmm2, %xmm0
665 ; AVX1-LABEL: saddo_v8i32:
667 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
668 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
669 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm4
670 ; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5
671 ; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4
672 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6
673 ; AVX1-NEXT: vpcmpgtd %xmm6, %xmm3, %xmm7
674 ; AVX1-NEXT: vpxor %xmm5, %xmm7, %xmm7
675 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm7, %xmm8
676 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm3, %xmm4
677 ; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm9
678 ; AVX1-NEXT: vpcmpgtd %xmm0, %xmm3, %xmm4
679 ; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4
680 ; AVX1-NEXT: vpcmpeqd %xmm9, %xmm4, %xmm9
681 ; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm9, %ymm8
682 ; AVX1-NEXT: vpaddd %xmm2, %xmm6, %xmm2
683 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm6
684 ; AVX1-NEXT: vpxor %xmm5, %xmm6, %xmm6
685 ; AVX1-NEXT: vpcmpeqd %xmm6, %xmm7, %xmm6
686 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1
687 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm3, %xmm0
688 ; AVX1-NEXT: vpxor %xmm5, %xmm0, %xmm0
689 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm4, %xmm0
690 ; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm0, %ymm0
691 ; AVX1-NEXT: vandnps %ymm8, %ymm0, %ymm0
692 ; AVX1-NEXT: vmovdqa %xmm2, 16(%rdi)
693 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
696 ; AVX2-LABEL: saddo_v8i32:
698 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
699 ; AVX2-NEXT: vpcmpgtd %ymm1, %ymm2, %ymm3
700 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4
701 ; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm3
702 ; AVX2-NEXT: vpcmpgtd %ymm0, %ymm2, %ymm5
703 ; AVX2-NEXT: vpxor %ymm4, %ymm5, %ymm5
704 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm5, %ymm3
705 ; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm1
706 ; AVX2-NEXT: vpcmpgtd %ymm1, %ymm2, %ymm0
707 ; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm0
708 ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm5, %ymm0
709 ; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0
710 ; AVX2-NEXT: vmovdqa %ymm1, (%rdi)
713 ; AVX512-LABEL: saddo_v8i32:
715 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
716 ; AVX512-NEXT: vpcmpnltd %ymm2, %ymm1, %k0
717 ; AVX512-NEXT: vpcmpnltd %ymm2, %ymm0, %k1
718 ; AVX512-NEXT: kxorw %k0, %k1, %k0
719 ; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm1
720 ; AVX512-NEXT: vpcmpnltd %ymm2, %ymm1, %k2
721 ; AVX512-NEXT: kxorw %k2, %k1, %k1
722 ; AVX512-NEXT: kandnw %k1, %k0, %k1
723 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
724 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
725 ; AVX512-NEXT: vmovdqa %ymm1, (%rdi)
727 %t = call {<8 x i32>, <8 x i1>} @llvm.sadd.with.overflow.v8i32(<8 x i32> %a0, <8 x i32> %a1)
728 %val = extractvalue {<8 x i32>, <8 x i1>} %t, 0
729 %obit = extractvalue {<8 x i32>, <8 x i1>} %t, 1
730 %res = sext <8 x i1> %obit to <8 x i32>
731 store <8 x i32> %val, <8 x i32>* %p2
735 define <16 x i32> @saddo_v16i32(<16 x i32> %a0, <16 x i32> %a1, <16 x i32>* %p2) nounwind {
736 ; SSE-LABEL: saddo_v16i32:
738 ; SSE-NEXT: movdqa %xmm3, %xmm8
739 ; SSE-NEXT: pxor %xmm3, %xmm3
740 ; SSE-NEXT: pxor %xmm11, %xmm11
741 ; SSE-NEXT: pcmpgtd %xmm4, %xmm11
742 ; SSE-NEXT: pcmpeqd %xmm10, %xmm10
743 ; SSE-NEXT: pxor %xmm10, %xmm11
744 ; SSE-NEXT: pxor %xmm12, %xmm12
745 ; SSE-NEXT: pcmpgtd %xmm0, %xmm12
746 ; SSE-NEXT: pxor %xmm10, %xmm12
747 ; SSE-NEXT: pcmpeqd %xmm12, %xmm11
748 ; SSE-NEXT: paddd %xmm4, %xmm0
749 ; SSE-NEXT: pxor %xmm9, %xmm9
750 ; SSE-NEXT: pcmpgtd %xmm0, %xmm9
751 ; SSE-NEXT: pxor %xmm10, %xmm9
752 ; SSE-NEXT: pcmpeqd %xmm12, %xmm9
753 ; SSE-NEXT: pandn %xmm11, %xmm9
754 ; SSE-NEXT: pxor %xmm12, %xmm12
755 ; SSE-NEXT: pcmpgtd %xmm5, %xmm12
756 ; SSE-NEXT: pxor %xmm10, %xmm12
757 ; SSE-NEXT: pxor %xmm4, %xmm4
758 ; SSE-NEXT: pcmpgtd %xmm1, %xmm4
759 ; SSE-NEXT: pxor %xmm10, %xmm4
760 ; SSE-NEXT: pcmpeqd %xmm4, %xmm12
761 ; SSE-NEXT: paddd %xmm5, %xmm1
762 ; SSE-NEXT: pxor %xmm11, %xmm11
763 ; SSE-NEXT: pcmpgtd %xmm1, %xmm11
764 ; SSE-NEXT: pxor %xmm10, %xmm11
765 ; SSE-NEXT: pcmpeqd %xmm4, %xmm11
766 ; SSE-NEXT: pandn %xmm12, %xmm11
767 ; SSE-NEXT: pxor %xmm4, %xmm4
768 ; SSE-NEXT: pcmpgtd %xmm6, %xmm4
769 ; SSE-NEXT: pxor %xmm10, %xmm4
770 ; SSE-NEXT: pxor %xmm5, %xmm5
771 ; SSE-NEXT: pcmpgtd %xmm2, %xmm5
772 ; SSE-NEXT: pxor %xmm10, %xmm5
773 ; SSE-NEXT: pcmpeqd %xmm5, %xmm4
774 ; SSE-NEXT: paddd %xmm6, %xmm2
775 ; SSE-NEXT: pxor %xmm6, %xmm6
776 ; SSE-NEXT: pcmpgtd %xmm2, %xmm6
777 ; SSE-NEXT: pxor %xmm10, %xmm6
778 ; SSE-NEXT: pcmpeqd %xmm5, %xmm6
779 ; SSE-NEXT: pandn %xmm4, %xmm6
780 ; SSE-NEXT: pxor %xmm4, %xmm4
781 ; SSE-NEXT: pcmpgtd %xmm7, %xmm4
782 ; SSE-NEXT: pxor %xmm10, %xmm4
783 ; SSE-NEXT: pxor %xmm5, %xmm5
784 ; SSE-NEXT: pcmpgtd %xmm8, %xmm5
785 ; SSE-NEXT: pxor %xmm10, %xmm5
786 ; SSE-NEXT: pcmpeqd %xmm5, %xmm4
787 ; SSE-NEXT: paddd %xmm7, %xmm8
788 ; SSE-NEXT: pcmpgtd %xmm8, %xmm3
789 ; SSE-NEXT: pxor %xmm10, %xmm3
790 ; SSE-NEXT: pcmpeqd %xmm5, %xmm3
791 ; SSE-NEXT: pandn %xmm4, %xmm3
792 ; SSE-NEXT: movdqa %xmm8, 48(%rdi)
793 ; SSE-NEXT: movdqa %xmm2, 32(%rdi)
794 ; SSE-NEXT: movdqa %xmm1, 16(%rdi)
795 ; SSE-NEXT: movdqa %xmm0, (%rdi)
796 ; SSE-NEXT: movdqa %xmm9, %xmm0
797 ; SSE-NEXT: movdqa %xmm11, %xmm1
798 ; SSE-NEXT: movdqa %xmm6, %xmm2
801 ; AVX1-LABEL: saddo_v16i32:
803 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm9
804 ; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5
805 ; AVX1-NEXT: vpcmpgtd %xmm9, %xmm5, %xmm7
806 ; AVX1-NEXT: vpcmpeqd %xmm6, %xmm6, %xmm6
807 ; AVX1-NEXT: vpxor %xmm6, %xmm7, %xmm8
808 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7
809 ; AVX1-NEXT: vpcmpgtd %xmm7, %xmm5, %xmm4
810 ; AVX1-NEXT: vpxor %xmm6, %xmm4, %xmm4
811 ; AVX1-NEXT: vpcmpeqd %xmm8, %xmm4, %xmm8
812 ; AVX1-NEXT: vpaddd %xmm9, %xmm7, %xmm9
813 ; AVX1-NEXT: vpcmpgtd %xmm9, %xmm5, %xmm7
814 ; AVX1-NEXT: vpxor %xmm6, %xmm7, %xmm7
815 ; AVX1-NEXT: vpcmpeqd %xmm7, %xmm4, %xmm4
816 ; AVX1-NEXT: vpandn %xmm8, %xmm4, %xmm8
817 ; AVX1-NEXT: vpcmpgtd %xmm3, %xmm5, %xmm7
818 ; AVX1-NEXT: vpxor %xmm6, %xmm7, %xmm7
819 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm5, %xmm4
820 ; AVX1-NEXT: vpxor %xmm6, %xmm4, %xmm4
821 ; AVX1-NEXT: vpcmpeqd %xmm7, %xmm4, %xmm7
822 ; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm10
823 ; AVX1-NEXT: vpcmpgtd %xmm10, %xmm5, %xmm1
824 ; AVX1-NEXT: vpxor %xmm6, %xmm1, %xmm1
825 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm4, %xmm1
826 ; AVX1-NEXT: vpandn %xmm7, %xmm1, %xmm1
827 ; AVX1-NEXT: vpackssdw %xmm8, %xmm1, %xmm8
828 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
829 ; AVX1-NEXT: vpcmpgtd %xmm4, %xmm5, %xmm7
830 ; AVX1-NEXT: vpxor %xmm6, %xmm7, %xmm7
831 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
832 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm5, %xmm3
833 ; AVX1-NEXT: vpxor %xmm6, %xmm3, %xmm3
834 ; AVX1-NEXT: vpcmpeqd %xmm7, %xmm3, %xmm7
835 ; AVX1-NEXT: vpaddd %xmm4, %xmm1, %xmm4
836 ; AVX1-NEXT: vpcmpgtd %xmm4, %xmm5, %xmm1
837 ; AVX1-NEXT: vpxor %xmm6, %xmm1, %xmm1
838 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm3, %xmm1
839 ; AVX1-NEXT: vpandn %xmm7, %xmm1, %xmm1
840 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm5, %xmm3
841 ; AVX1-NEXT: vpxor %xmm6, %xmm3, %xmm3
842 ; AVX1-NEXT: vpcmpgtd %xmm0, %xmm5, %xmm7
843 ; AVX1-NEXT: vpxor %xmm6, %xmm7, %xmm7
844 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm7, %xmm3
845 ; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm2
846 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm5, %xmm0
847 ; AVX1-NEXT: vpxor %xmm6, %xmm0, %xmm0
848 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm7, %xmm0
849 ; AVX1-NEXT: vpandn %xmm3, %xmm0, %xmm0
850 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
851 ; AVX1-NEXT: vpacksswb %xmm8, %xmm0, %xmm1
852 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0
853 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[1,1,2,3]
854 ; AVX1-NEXT: vpmovsxbd %xmm3, %xmm3
855 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
856 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
857 ; AVX1-NEXT: vpmovsxbd %xmm3, %xmm3
858 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,0,1]
859 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
860 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm1
861 ; AVX1-NEXT: vmovdqa %xmm9, 48(%rdi)
862 ; AVX1-NEXT: vmovdqa %xmm10, 32(%rdi)
863 ; AVX1-NEXT: vmovdqa %xmm4, 16(%rdi)
864 ; AVX1-NEXT: vmovdqa %xmm2, (%rdi)
867 ; AVX2-LABEL: saddo_v16i32:
869 ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4
870 ; AVX2-NEXT: vpcmpgtd %ymm3, %ymm4, %ymm5
871 ; AVX2-NEXT: vpcmpeqd %ymm6, %ymm6, %ymm6
872 ; AVX2-NEXT: vpxor %ymm6, %ymm5, %ymm5
873 ; AVX2-NEXT: vpcmpgtd %ymm1, %ymm4, %ymm7
874 ; AVX2-NEXT: vpxor %ymm6, %ymm7, %ymm7
875 ; AVX2-NEXT: vpcmpeqd %ymm5, %ymm7, %ymm5
876 ; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm3
877 ; AVX2-NEXT: vpcmpgtd %ymm3, %ymm4, %ymm1
878 ; AVX2-NEXT: vpxor %ymm6, %ymm1, %ymm1
879 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm7, %ymm1
880 ; AVX2-NEXT: vpandn %ymm5, %ymm1, %ymm1
881 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5
882 ; AVX2-NEXT: vpackssdw %xmm5, %xmm1, %xmm1
883 ; AVX2-NEXT: vpcmpgtd %ymm2, %ymm4, %ymm5
884 ; AVX2-NEXT: vpxor %ymm6, %ymm5, %ymm5
885 ; AVX2-NEXT: vpcmpgtd %ymm0, %ymm4, %ymm7
886 ; AVX2-NEXT: vpxor %ymm6, %ymm7, %ymm7
887 ; AVX2-NEXT: vpcmpeqd %ymm5, %ymm7, %ymm5
888 ; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm2
889 ; AVX2-NEXT: vpcmpgtd %ymm2, %ymm4, %ymm0
890 ; AVX2-NEXT: vpxor %ymm6, %ymm0, %ymm0
891 ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm7, %ymm0
892 ; AVX2-NEXT: vpandn %ymm5, %ymm0, %ymm0
893 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4
894 ; AVX2-NEXT: vpackssdw %xmm4, %xmm0, %xmm0
895 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1
896 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0
897 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
898 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1
899 ; AVX2-NEXT: vmovdqa %ymm3, 32(%rdi)
900 ; AVX2-NEXT: vmovdqa %ymm2, (%rdi)
903 ; AVX512-LABEL: saddo_v16i32:
905 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
906 ; AVX512-NEXT: vpcmpnltd %zmm2, %zmm1, %k0
907 ; AVX512-NEXT: vpcmpnltd %zmm2, %zmm0, %k1
908 ; AVX512-NEXT: kxorw %k0, %k1, %k0
909 ; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm1
910 ; AVX512-NEXT: vpcmpnltd %zmm2, %zmm1, %k2
911 ; AVX512-NEXT: kxorw %k2, %k1, %k1
912 ; AVX512-NEXT: kandnw %k1, %k0, %k1
913 ; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
914 ; AVX512-NEXT: vmovdqa64 %zmm1, (%rdi)
916 %t = call {<16 x i32>, <16 x i1>} @llvm.sadd.with.overflow.v16i32(<16 x i32> %a0, <16 x i32> %a1)
917 %val = extractvalue {<16 x i32>, <16 x i1>} %t, 0
918 %obit = extractvalue {<16 x i32>, <16 x i1>} %t, 1
919 %res = sext <16 x i1> %obit to <16 x i32>
920 store <16 x i32> %val, <16 x i32>* %p2
924 define <16 x i32> @saddo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nounwind {
925 ; SSE2-LABEL: saddo_v16i8:
927 ; SSE2-NEXT: movdqa %xmm0, %xmm2
928 ; SSE2-NEXT: paddsb %xmm1, %xmm2
929 ; SSE2-NEXT: paddb %xmm1, %xmm0
930 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm2
931 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm3
932 ; SSE2-NEXT: pxor %xmm2, %xmm3
933 ; SSE2-NEXT: movdqa %xmm3, %xmm1
934 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
935 ; SSE2-NEXT: movdqa %xmm1, %xmm4
936 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]
937 ; SSE2-NEXT: pslld $31, %xmm4
938 ; SSE2-NEXT: psrad $31, %xmm4
939 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
940 ; SSE2-NEXT: pslld $31, %xmm1
941 ; SSE2-NEXT: psrad $31, %xmm1
942 ; 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]
943 ; SSE2-NEXT: movdqa %xmm3, %xmm2
944 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
945 ; SSE2-NEXT: pslld $31, %xmm2
946 ; SSE2-NEXT: psrad $31, %xmm2
947 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
948 ; SSE2-NEXT: pslld $31, %xmm3
949 ; SSE2-NEXT: psrad $31, %xmm3
950 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
951 ; SSE2-NEXT: movdqa %xmm4, %xmm0
954 ; SSSE3-LABEL: saddo_v16i8:
956 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
957 ; SSSE3-NEXT: paddsb %xmm1, %xmm2
958 ; SSSE3-NEXT: paddb %xmm1, %xmm0
959 ; SSSE3-NEXT: pcmpeqb %xmm0, %xmm2
960 ; SSSE3-NEXT: pcmpeqd %xmm3, %xmm3
961 ; SSSE3-NEXT: pxor %xmm2, %xmm3
962 ; SSSE3-NEXT: movdqa %xmm3, %xmm1
963 ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
964 ; SSSE3-NEXT: movdqa %xmm1, %xmm4
965 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]
966 ; SSSE3-NEXT: pslld $31, %xmm4
967 ; SSSE3-NEXT: psrad $31, %xmm4
968 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
969 ; SSSE3-NEXT: pslld $31, %xmm1
970 ; SSSE3-NEXT: psrad $31, %xmm1
971 ; 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]
972 ; SSSE3-NEXT: movdqa %xmm3, %xmm2
973 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
974 ; SSSE3-NEXT: pslld $31, %xmm2
975 ; SSSE3-NEXT: psrad $31, %xmm2
976 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
977 ; SSSE3-NEXT: pslld $31, %xmm3
978 ; SSSE3-NEXT: psrad $31, %xmm3
979 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
980 ; SSSE3-NEXT: movdqa %xmm4, %xmm0
983 ; SSE41-LABEL: saddo_v16i8:
985 ; SSE41-NEXT: movdqa %xmm0, %xmm2
986 ; SSE41-NEXT: paddsb %xmm1, %xmm2
987 ; SSE41-NEXT: paddb %xmm1, %xmm0
988 ; SSE41-NEXT: pcmpeqb %xmm0, %xmm2
989 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm3
990 ; SSE41-NEXT: pxor %xmm2, %xmm3
991 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm4 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
992 ; SSE41-NEXT: pslld $31, %xmm4
993 ; SSE41-NEXT: psrad $31, %xmm4
994 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,2,3]
995 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
996 ; SSE41-NEXT: pslld $31, %xmm1
997 ; SSE41-NEXT: psrad $31, %xmm1
998 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[2,3,0,1]
999 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
1000 ; SSE41-NEXT: pslld $31, %xmm2
1001 ; SSE41-NEXT: psrad $31, %xmm2
1002 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[3,1,2,3]
1003 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
1004 ; SSE41-NEXT: pslld $31, %xmm3
1005 ; SSE41-NEXT: psrad $31, %xmm3
1006 ; SSE41-NEXT: movdqa %xmm0, (%rdi)
1007 ; SSE41-NEXT: movdqa %xmm4, %xmm0
1010 ; AVX1-LABEL: saddo_v16i8:
1012 ; AVX1-NEXT: vpaddsb %xmm1, %xmm0, %xmm2
1013 ; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm3
1014 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm3, %xmm0
1015 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1016 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm1
1017 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0
1018 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,2,3]
1019 ; AVX1-NEXT: vpmovsxbd %xmm2, %xmm2
1020 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1021 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[2,3,0,1]
1022 ; AVX1-NEXT: vpmovsxbd %xmm2, %xmm2
1023 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,0,1]
1024 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
1025 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
1026 ; AVX1-NEXT: vmovdqa %xmm3, (%rdi)
1029 ; AVX2-LABEL: saddo_v16i8:
1031 ; AVX2-NEXT: vpaddsb %xmm1, %xmm0, %xmm2
1032 ; AVX2-NEXT: vpaddb %xmm1, %xmm0, %xmm3
1033 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm3, %xmm0
1034 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1035 ; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm1
1036 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0
1037 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1038 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1
1039 ; AVX2-NEXT: vmovdqa %xmm3, (%rdi)
1042 ; AVX512-LABEL: saddo_v16i8:
1044 ; AVX512-NEXT: vpaddsb %xmm1, %xmm0, %xmm2
1045 ; AVX512-NEXT: vpaddb %xmm1, %xmm0, %xmm1
1046 ; AVX512-NEXT: vpcmpneqb %xmm2, %xmm1, %k1
1047 ; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1048 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
1050 %t = call {<16 x i8>, <16 x i1>} @llvm.sadd.with.overflow.v16i8(<16 x i8> %a0, <16 x i8> %a1)
1051 %val = extractvalue {<16 x i8>, <16 x i1>} %t, 0
1052 %obit = extractvalue {<16 x i8>, <16 x i1>} %t, 1
1053 %res = sext <16 x i1> %obit to <16 x i32>
1054 store <16 x i8> %val, <16 x i8>* %p2
1058 define <8 x i32> @saddo_v8i16(<8 x i16> %a0, <8 x i16> %a1, <8 x i16>* %p2) nounwind {
1059 ; SSE2-LABEL: saddo_v8i16:
1061 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1062 ; SSE2-NEXT: paddsw %xmm1, %xmm2
1063 ; SSE2-NEXT: paddw %xmm1, %xmm0
1064 ; SSE2-NEXT: pcmpeqw %xmm0, %xmm2
1065 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
1066 ; SSE2-NEXT: pxor %xmm2, %xmm1
1067 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1068 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1069 ; SSE2-NEXT: pslld $31, %xmm2
1070 ; SSE2-NEXT: psrad $31, %xmm2
1071 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1072 ; SSE2-NEXT: pslld $31, %xmm1
1073 ; SSE2-NEXT: psrad $31, %xmm1
1074 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
1075 ; SSE2-NEXT: movdqa %xmm2, %xmm0
1078 ; SSSE3-LABEL: saddo_v8i16:
1080 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
1081 ; SSSE3-NEXT: paddsw %xmm1, %xmm2
1082 ; SSSE3-NEXT: paddw %xmm1, %xmm0
1083 ; SSSE3-NEXT: pcmpeqw %xmm0, %xmm2
1084 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1
1085 ; SSSE3-NEXT: pxor %xmm2, %xmm1
1086 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
1087 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1088 ; SSSE3-NEXT: pslld $31, %xmm2
1089 ; SSSE3-NEXT: psrad $31, %xmm2
1090 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1091 ; SSSE3-NEXT: pslld $31, %xmm1
1092 ; SSSE3-NEXT: psrad $31, %xmm1
1093 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
1094 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
1097 ; SSE41-LABEL: saddo_v8i16:
1099 ; SSE41-NEXT: movdqa %xmm0, %xmm2
1100 ; SSE41-NEXT: paddsw %xmm1, %xmm2
1101 ; SSE41-NEXT: paddw %xmm1, %xmm0
1102 ; SSE41-NEXT: pcmpeqw %xmm0, %xmm2
1103 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1104 ; SSE41-NEXT: pxor %xmm2, %xmm1
1105 ; SSE41-NEXT: pmovzxwd {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
1106 ; SSE41-NEXT: pslld $31, %xmm2
1107 ; SSE41-NEXT: psrad $31, %xmm2
1108 ; SSE41-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1109 ; SSE41-NEXT: pslld $31, %xmm1
1110 ; SSE41-NEXT: psrad $31, %xmm1
1111 ; SSE41-NEXT: movdqa %xmm0, (%rdi)
1112 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1115 ; AVX1-LABEL: saddo_v8i16:
1117 ; AVX1-NEXT: vpaddsw %xmm1, %xmm0, %xmm2
1118 ; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm1
1119 ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm0
1120 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1121 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
1122 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm2
1123 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1124 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm0
1125 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
1126 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
1129 ; AVX2-LABEL: saddo_v8i16:
1131 ; AVX2-NEXT: vpaddsw %xmm1, %xmm0, %xmm2
1132 ; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm1
1133 ; AVX2-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm0
1134 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1135 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
1136 ; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0
1137 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
1140 ; AVX512-LABEL: saddo_v8i16:
1142 ; AVX512-NEXT: vpaddsw %xmm1, %xmm0, %xmm2
1143 ; AVX512-NEXT: vpaddw %xmm1, %xmm0, %xmm1
1144 ; AVX512-NEXT: vpcmpneqw %xmm2, %xmm1, %k1
1145 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
1146 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
1147 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
1149 %t = call {<8 x i16>, <8 x i1>} @llvm.sadd.with.overflow.v8i16(<8 x i16> %a0, <8 x i16> %a1)
1150 %val = extractvalue {<8 x i16>, <8 x i1>} %t, 0
1151 %obit = extractvalue {<8 x i16>, <8 x i1>} %t, 1
1152 %res = sext <8 x i1> %obit to <8 x i32>
1153 store <8 x i16> %val, <8 x i16>* %p2
1157 define <2 x i32> @saddo_v2i64(<2 x i64> %a0, <2 x i64> %a1, <2 x i64>* %p2) nounwind {
1158 ; SSE2-LABEL: saddo_v2i64:
1160 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1161 ; SSE2-NEXT: movdqa %xmm0, %xmm3
1162 ; SSE2-NEXT: paddq %xmm1, %xmm0
1163 ; SSE2-NEXT: pxor %xmm2, %xmm1
1164 ; SSE2-NEXT: movdqa %xmm2, %xmm4
1165 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm4
1166 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1167 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm1
1168 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1169 ; SSE2-NEXT: pand %xmm5, %xmm1
1170 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1171 ; SSE2-NEXT: por %xmm1, %xmm4
1172 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
1173 ; SSE2-NEXT: pxor %xmm1, %xmm4
1174 ; SSE2-NEXT: pxor %xmm2, %xmm3
1175 ; SSE2-NEXT: movdqa %xmm2, %xmm5
1176 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
1177 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1178 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3
1179 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1180 ; SSE2-NEXT: pand %xmm6, %xmm3
1181 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1182 ; SSE2-NEXT: por %xmm3, %xmm5
1183 ; SSE2-NEXT: pxor %xmm1, %xmm5
1184 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm4
1185 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,0,3,2]
1186 ; SSE2-NEXT: pand %xmm4, %xmm3
1187 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
1188 ; SSE2-NEXT: pxor %xmm2, %xmm0
1189 ; SSE2-NEXT: movdqa %xmm2, %xmm4
1190 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
1191 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1192 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm0
1193 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1194 ; SSE2-NEXT: pand %xmm6, %xmm0
1195 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
1196 ; SSE2-NEXT: por %xmm0, %xmm2
1197 ; SSE2-NEXT: pxor %xmm1, %xmm2
1198 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm2
1199 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,0,3,2]
1200 ; SSE2-NEXT: pand %xmm2, %xmm0
1201 ; SSE2-NEXT: pandn %xmm3, %xmm0
1204 ; SSSE3-LABEL: saddo_v2i64:
1206 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1207 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
1208 ; SSSE3-NEXT: paddq %xmm1, %xmm0
1209 ; SSSE3-NEXT: pxor %xmm2, %xmm1
1210 ; SSSE3-NEXT: movdqa %xmm2, %xmm4
1211 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4
1212 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1213 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm1
1214 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1215 ; SSSE3-NEXT: pand %xmm5, %xmm1
1216 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1217 ; SSSE3-NEXT: por %xmm1, %xmm4
1218 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1
1219 ; SSSE3-NEXT: pxor %xmm1, %xmm4
1220 ; SSSE3-NEXT: pxor %xmm2, %xmm3
1221 ; SSSE3-NEXT: movdqa %xmm2, %xmm5
1222 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
1223 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1224 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm3
1225 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1226 ; SSSE3-NEXT: pand %xmm6, %xmm3
1227 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1228 ; SSSE3-NEXT: por %xmm3, %xmm5
1229 ; SSSE3-NEXT: pxor %xmm1, %xmm5
1230 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm4
1231 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,0,3,2]
1232 ; SSSE3-NEXT: pand %xmm4, %xmm3
1233 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
1234 ; SSSE3-NEXT: pxor %xmm2, %xmm0
1235 ; SSSE3-NEXT: movdqa %xmm2, %xmm4
1236 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
1237 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1238 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm0
1239 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1240 ; SSSE3-NEXT: pand %xmm6, %xmm0
1241 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
1242 ; SSSE3-NEXT: por %xmm0, %xmm2
1243 ; SSSE3-NEXT: pxor %xmm1, %xmm2
1244 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm2
1245 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,0,3,2]
1246 ; SSSE3-NEXT: pand %xmm2, %xmm0
1247 ; SSSE3-NEXT: pandn %xmm3, %xmm0
1250 ; SSE41-LABEL: saddo_v2i64:
1252 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1253 ; SSE41-NEXT: movdqa %xmm0, %xmm3
1254 ; SSE41-NEXT: paddq %xmm1, %xmm0
1255 ; SSE41-NEXT: pxor %xmm2, %xmm1
1256 ; SSE41-NEXT: movdqa %xmm2, %xmm4
1257 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm4
1258 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1259 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm1
1260 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1261 ; SSE41-NEXT: pand %xmm5, %xmm1
1262 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1263 ; SSE41-NEXT: por %xmm1, %xmm4
1264 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1265 ; SSE41-NEXT: pxor %xmm1, %xmm4
1266 ; SSE41-NEXT: pxor %xmm2, %xmm3
1267 ; SSE41-NEXT: movdqa %xmm2, %xmm5
1268 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm5
1269 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1270 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm3
1271 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1272 ; SSE41-NEXT: pand %xmm6, %xmm3
1273 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1274 ; SSE41-NEXT: por %xmm3, %xmm5
1275 ; SSE41-NEXT: pxor %xmm1, %xmm5
1276 ; SSE41-NEXT: pcmpeqq %xmm5, %xmm4
1277 ; SSE41-NEXT: movdqa %xmm0, (%rdi)
1278 ; SSE41-NEXT: pxor %xmm2, %xmm0
1279 ; SSE41-NEXT: movdqa %xmm2, %xmm3
1280 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
1281 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
1282 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm0
1283 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
1284 ; SSE41-NEXT: pand %xmm6, %xmm2
1285 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
1286 ; SSE41-NEXT: por %xmm2, %xmm0
1287 ; SSE41-NEXT: pxor %xmm1, %xmm0
1288 ; SSE41-NEXT: pcmpeqq %xmm5, %xmm0
1289 ; SSE41-NEXT: pandn %xmm4, %xmm0
1292 ; AVX1-LABEL: saddo_v2i64:
1294 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
1295 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm3
1296 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
1297 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
1298 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm5
1299 ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5
1300 ; AVX1-NEXT: vpcmpeqq %xmm3, %xmm5, %xmm3
1301 ; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm1
1302 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm0
1303 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
1304 ; AVX1-NEXT: vpcmpeqq %xmm0, %xmm5, %xmm0
1305 ; AVX1-NEXT: vpandn %xmm3, %xmm0, %xmm0
1306 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
1309 ; AVX2-LABEL: saddo_v2i64:
1311 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
1312 ; AVX2-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm3
1313 ; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
1314 ; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm3
1315 ; AVX2-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm5
1316 ; AVX2-NEXT: vpxor %xmm4, %xmm5, %xmm5
1317 ; AVX2-NEXT: vpcmpeqq %xmm3, %xmm5, %xmm3
1318 ; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm1
1319 ; AVX2-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm0
1320 ; AVX2-NEXT: vpxor %xmm4, %xmm0, %xmm0
1321 ; AVX2-NEXT: vpcmpeqq %xmm0, %xmm5, %xmm0
1322 ; AVX2-NEXT: vpandn %xmm3, %xmm0, %xmm0
1323 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
1326 ; AVX512-LABEL: saddo_v2i64:
1328 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
1329 ; AVX512-NEXT: vpcmpnltq %xmm2, %xmm1, %k0
1330 ; AVX512-NEXT: vpcmpnltq %xmm2, %xmm0, %k1
1331 ; AVX512-NEXT: kxorw %k0, %k1, %k0
1332 ; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm0
1333 ; AVX512-NEXT: vpcmpnltq %xmm2, %xmm0, %k2
1334 ; AVX512-NEXT: kxorw %k2, %k1, %k1
1335 ; AVX512-NEXT: kandnw %k1, %k0, %k1
1336 ; AVX512-NEXT: vmovdqa %xmm0, (%rdi)
1337 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1338 ; AVX512-NEXT: vmovdqa64 %xmm0, %xmm0 {%k1} {z}
1340 %t = call {<2 x i64>, <2 x i1>} @llvm.sadd.with.overflow.v2i64(<2 x i64> %a0, <2 x i64> %a1)
1341 %val = extractvalue {<2 x i64>, <2 x i1>} %t, 0
1342 %obit = extractvalue {<2 x i64>, <2 x i1>} %t, 1
1343 %res = sext <2 x i1> %obit to <2 x i32>
1344 store <2 x i64> %val, <2 x i64>* %p2
1348 define <4 x i32> @saddo_v4i24(<4 x i24> %a0, <4 x i24> %a1, <4 x i24>* %p2) nounwind {
1349 ; SSE2-LABEL: saddo_v4i24:
1351 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1352 ; SSE2-NEXT: pslld $8, %xmm1
1353 ; SSE2-NEXT: psrad $8, %xmm1
1354 ; SSE2-NEXT: pslld $8, %xmm2
1355 ; SSE2-NEXT: psrad $8, %xmm2
1356 ; SSE2-NEXT: paddd %xmm1, %xmm2
1357 ; SSE2-NEXT: movdqa %xmm2, %xmm0
1358 ; SSE2-NEXT: pslld $8, %xmm0
1359 ; SSE2-NEXT: psrad $8, %xmm0
1360 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm0
1361 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
1362 ; SSE2-NEXT: pxor %xmm1, %xmm0
1363 ; SSE2-NEXT: movd %xmm2, %eax
1364 ; SSE2-NEXT: movw %ax, (%rdi)
1365 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[3,1,2,3]
1366 ; SSE2-NEXT: movd %xmm1, %ecx
1367 ; SSE2-NEXT: movw %cx, 9(%rdi)
1368 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
1369 ; SSE2-NEXT: movd %xmm1, %edx
1370 ; SSE2-NEXT: movw %dx, 6(%rdi)
1371 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,2,3]
1372 ; SSE2-NEXT: movd %xmm1, %esi
1373 ; SSE2-NEXT: movw %si, 3(%rdi)
1374 ; SSE2-NEXT: shrl $16, %eax
1375 ; SSE2-NEXT: movb %al, 2(%rdi)
1376 ; SSE2-NEXT: shrl $16, %ecx
1377 ; SSE2-NEXT: movb %cl, 11(%rdi)
1378 ; SSE2-NEXT: shrl $16, %edx
1379 ; SSE2-NEXT: movb %dl, 8(%rdi)
1380 ; SSE2-NEXT: shrl $16, %esi
1381 ; SSE2-NEXT: movb %sil, 5(%rdi)
1384 ; SSSE3-LABEL: saddo_v4i24:
1386 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
1387 ; SSSE3-NEXT: pslld $8, %xmm1
1388 ; SSSE3-NEXT: psrad $8, %xmm1
1389 ; SSSE3-NEXT: pslld $8, %xmm2
1390 ; SSSE3-NEXT: psrad $8, %xmm2
1391 ; SSSE3-NEXT: paddd %xmm1, %xmm2
1392 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
1393 ; SSSE3-NEXT: pslld $8, %xmm0
1394 ; SSSE3-NEXT: psrad $8, %xmm0
1395 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm0
1396 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1
1397 ; SSSE3-NEXT: pxor %xmm1, %xmm0
1398 ; SSSE3-NEXT: movd %xmm2, %eax
1399 ; SSSE3-NEXT: movw %ax, (%rdi)
1400 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[3,1,2,3]
1401 ; SSSE3-NEXT: movd %xmm1, %ecx
1402 ; SSSE3-NEXT: movw %cx, 9(%rdi)
1403 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
1404 ; SSSE3-NEXT: movd %xmm1, %edx
1405 ; SSSE3-NEXT: movw %dx, 6(%rdi)
1406 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,2,3]
1407 ; SSSE3-NEXT: movd %xmm1, %esi
1408 ; SSSE3-NEXT: movw %si, 3(%rdi)
1409 ; SSSE3-NEXT: shrl $16, %eax
1410 ; SSSE3-NEXT: movb %al, 2(%rdi)
1411 ; SSSE3-NEXT: shrl $16, %ecx
1412 ; SSSE3-NEXT: movb %cl, 11(%rdi)
1413 ; SSSE3-NEXT: shrl $16, %edx
1414 ; SSSE3-NEXT: movb %dl, 8(%rdi)
1415 ; SSSE3-NEXT: shrl $16, %esi
1416 ; SSSE3-NEXT: movb %sil, 5(%rdi)
1419 ; SSE41-LABEL: saddo_v4i24:
1421 ; SSE41-NEXT: movdqa %xmm0, %xmm2
1422 ; SSE41-NEXT: pslld $8, %xmm1
1423 ; SSE41-NEXT: psrad $8, %xmm1
1424 ; SSE41-NEXT: pslld $8, %xmm2
1425 ; SSE41-NEXT: psrad $8, %xmm2
1426 ; SSE41-NEXT: paddd %xmm1, %xmm2
1427 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1428 ; SSE41-NEXT: pslld $8, %xmm0
1429 ; SSE41-NEXT: psrad $8, %xmm0
1430 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm0
1431 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1432 ; SSE41-NEXT: pxor %xmm1, %xmm0
1433 ; SSE41-NEXT: pextrd $3, %xmm2, %eax
1434 ; SSE41-NEXT: movw %ax, 9(%rdi)
1435 ; SSE41-NEXT: pextrd $2, %xmm2, %ecx
1436 ; SSE41-NEXT: movw %cx, 6(%rdi)
1437 ; SSE41-NEXT: pextrd $1, %xmm2, %edx
1438 ; SSE41-NEXT: movw %dx, 3(%rdi)
1439 ; SSE41-NEXT: movd %xmm2, %esi
1440 ; SSE41-NEXT: movw %si, (%rdi)
1441 ; SSE41-NEXT: shrl $16, %eax
1442 ; SSE41-NEXT: movb %al, 11(%rdi)
1443 ; SSE41-NEXT: shrl $16, %ecx
1444 ; SSE41-NEXT: movb %cl, 8(%rdi)
1445 ; SSE41-NEXT: shrl $16, %edx
1446 ; SSE41-NEXT: movb %dl, 5(%rdi)
1447 ; SSE41-NEXT: shrl $16, %esi
1448 ; SSE41-NEXT: movb %sil, 2(%rdi)
1451 ; AVX1-LABEL: saddo_v4i24:
1453 ; AVX1-NEXT: vpslld $8, %xmm1, %xmm1
1454 ; AVX1-NEXT: vpsrad $8, %xmm1, %xmm1
1455 ; AVX1-NEXT: vpslld $8, %xmm0, %xmm0
1456 ; AVX1-NEXT: vpsrad $8, %xmm0, %xmm0
1457 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1
1458 ; AVX1-NEXT: vpslld $8, %xmm1, %xmm0
1459 ; AVX1-NEXT: vpsrad $8, %xmm0, %xmm0
1460 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1461 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1462 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
1463 ; AVX1-NEXT: vpextrd $3, %xmm1, %eax
1464 ; AVX1-NEXT: movw %ax, 9(%rdi)
1465 ; AVX1-NEXT: vpextrd $2, %xmm1, %ecx
1466 ; AVX1-NEXT: movw %cx, 6(%rdi)
1467 ; AVX1-NEXT: vpextrd $1, %xmm1, %edx
1468 ; AVX1-NEXT: movw %dx, 3(%rdi)
1469 ; AVX1-NEXT: vmovd %xmm1, %esi
1470 ; AVX1-NEXT: movw %si, (%rdi)
1471 ; AVX1-NEXT: shrl $16, %eax
1472 ; AVX1-NEXT: movb %al, 11(%rdi)
1473 ; AVX1-NEXT: shrl $16, %ecx
1474 ; AVX1-NEXT: movb %cl, 8(%rdi)
1475 ; AVX1-NEXT: shrl $16, %edx
1476 ; AVX1-NEXT: movb %dl, 5(%rdi)
1477 ; AVX1-NEXT: shrl $16, %esi
1478 ; AVX1-NEXT: movb %sil, 2(%rdi)
1481 ; AVX2-LABEL: saddo_v4i24:
1483 ; AVX2-NEXT: vpslld $8, %xmm1, %xmm1
1484 ; AVX2-NEXT: vpsrad $8, %xmm1, %xmm1
1485 ; AVX2-NEXT: vpslld $8, %xmm0, %xmm0
1486 ; AVX2-NEXT: vpsrad $8, %xmm0, %xmm0
1487 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm1
1488 ; AVX2-NEXT: vpslld $8, %xmm1, %xmm0
1489 ; AVX2-NEXT: vpsrad $8, %xmm0, %xmm0
1490 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1491 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1492 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
1493 ; AVX2-NEXT: vpextrd $3, %xmm1, %eax
1494 ; AVX2-NEXT: movw %ax, 9(%rdi)
1495 ; AVX2-NEXT: vpextrd $2, %xmm1, %ecx
1496 ; AVX2-NEXT: movw %cx, 6(%rdi)
1497 ; AVX2-NEXT: vpextrd $1, %xmm1, %edx
1498 ; AVX2-NEXT: movw %dx, 3(%rdi)
1499 ; AVX2-NEXT: vmovd %xmm1, %esi
1500 ; AVX2-NEXT: movw %si, (%rdi)
1501 ; AVX2-NEXT: shrl $16, %eax
1502 ; AVX2-NEXT: movb %al, 11(%rdi)
1503 ; AVX2-NEXT: shrl $16, %ecx
1504 ; AVX2-NEXT: movb %cl, 8(%rdi)
1505 ; AVX2-NEXT: shrl $16, %edx
1506 ; AVX2-NEXT: movb %dl, 5(%rdi)
1507 ; AVX2-NEXT: shrl $16, %esi
1508 ; AVX2-NEXT: movb %sil, 2(%rdi)
1511 ; AVX512-LABEL: saddo_v4i24:
1513 ; AVX512-NEXT: vpslld $8, %xmm1, %xmm1
1514 ; AVX512-NEXT: vpsrad $8, %xmm1, %xmm1
1515 ; AVX512-NEXT: vpslld $8, %xmm0, %xmm0
1516 ; AVX512-NEXT: vpsrad $8, %xmm0, %xmm0
1517 ; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm1
1518 ; AVX512-NEXT: vpslld $8, %xmm1, %xmm0
1519 ; AVX512-NEXT: vpsrad $8, %xmm0, %xmm0
1520 ; AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1521 ; AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
1522 ; AVX512-NEXT: vpextrd $3, %xmm1, %eax
1523 ; AVX512-NEXT: movw %ax, 9(%rdi)
1524 ; AVX512-NEXT: vpextrd $2, %xmm1, %ecx
1525 ; AVX512-NEXT: movw %cx, 6(%rdi)
1526 ; AVX512-NEXT: vpextrd $1, %xmm1, %edx
1527 ; AVX512-NEXT: movw %dx, 3(%rdi)
1528 ; AVX512-NEXT: vmovd %xmm1, %esi
1529 ; AVX512-NEXT: movw %si, (%rdi)
1530 ; AVX512-NEXT: shrl $16, %eax
1531 ; AVX512-NEXT: movb %al, 11(%rdi)
1532 ; AVX512-NEXT: shrl $16, %ecx
1533 ; AVX512-NEXT: movb %cl, 8(%rdi)
1534 ; AVX512-NEXT: shrl $16, %edx
1535 ; AVX512-NEXT: movb %dl, 5(%rdi)
1536 ; AVX512-NEXT: shrl $16, %esi
1537 ; AVX512-NEXT: movb %sil, 2(%rdi)
1539 %t = call {<4 x i24>, <4 x i1>} @llvm.sadd.with.overflow.v4i24(<4 x i24> %a0, <4 x i24> %a1)
1540 %val = extractvalue {<4 x i24>, <4 x i1>} %t, 0
1541 %obit = extractvalue {<4 x i24>, <4 x i1>} %t, 1
1542 %res = sext <4 x i1> %obit to <4 x i32>
1543 store <4 x i24> %val, <4 x i24>* %p2
1547 define <4 x i32> @saddo_v4i1(<4 x i1> %a0, <4 x i1> %a1, <4 x i1>* %p2) nounwind {
1548 ; SSE-LABEL: saddo_v4i1:
1550 ; SSE-NEXT: pslld $31, %xmm1
1551 ; SSE-NEXT: psrad $31, %xmm1
1552 ; SSE-NEXT: pslld $31, %xmm0
1553 ; SSE-NEXT: psrad $31, %xmm0
1554 ; SSE-NEXT: paddd %xmm1, %xmm0
1555 ; SSE-NEXT: movdqa %xmm0, %xmm1
1556 ; SSE-NEXT: pslld $31, %xmm1
1557 ; SSE-NEXT: psrad $31, %xmm1
1558 ; SSE-NEXT: pcmpeqd %xmm1, %xmm0
1559 ; SSE-NEXT: pcmpeqd %xmm2, %xmm2
1560 ; SSE-NEXT: pxor %xmm2, %xmm0
1561 ; SSE-NEXT: movmskps %xmm1, %eax
1562 ; SSE-NEXT: movb %al, (%rdi)
1565 ; AVX1-LABEL: saddo_v4i1:
1567 ; AVX1-NEXT: vpslld $31, %xmm1, %xmm1
1568 ; AVX1-NEXT: vpsrad $31, %xmm1, %xmm1
1569 ; AVX1-NEXT: vpslld $31, %xmm0, %xmm0
1570 ; AVX1-NEXT: vpsrad $31, %xmm0, %xmm0
1571 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0
1572 ; AVX1-NEXT: vpslld $31, %xmm0, %xmm1
1573 ; AVX1-NEXT: vpsrad $31, %xmm1, %xmm1
1574 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
1575 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1576 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
1577 ; AVX1-NEXT: vmovmskps %xmm1, %eax
1578 ; AVX1-NEXT: movb %al, (%rdi)
1581 ; AVX2-LABEL: saddo_v4i1:
1583 ; AVX2-NEXT: vpslld $31, %xmm1, %xmm1
1584 ; AVX2-NEXT: vpsrad $31, %xmm1, %xmm1
1585 ; AVX2-NEXT: vpslld $31, %xmm0, %xmm0
1586 ; AVX2-NEXT: vpsrad $31, %xmm0, %xmm0
1587 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0
1588 ; AVX2-NEXT: vpslld $31, %xmm0, %xmm1
1589 ; AVX2-NEXT: vpsrad $31, %xmm1, %xmm1
1590 ; AVX2-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
1591 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1592 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
1593 ; AVX2-NEXT: vmovmskps %xmm1, %eax
1594 ; AVX2-NEXT: movb %al, (%rdi)
1597 ; AVX512-LABEL: saddo_v4i1:
1599 ; AVX512-NEXT: vpslld $31, %xmm1, %xmm1
1600 ; AVX512-NEXT: vpslld $31, %xmm0, %xmm0
1601 ; AVX512-NEXT: vpor %xmm1, %xmm0, %xmm2
1602 ; AVX512-NEXT: vptestmd %xmm0, %xmm0, %k0
1603 ; AVX512-NEXT: vptestmd %xmm1, %xmm1, %k1
1604 ; AVX512-NEXT: vptestmd %xmm2, %xmm2, %k2
1605 ; AVX512-NEXT: kxorw %k1, %k0, %k0
1606 ; AVX512-NEXT: kxorw %k2, %k0, %k1
1607 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1608 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
1609 ; AVX512-NEXT: kmovd %k0, %eax
1610 ; AVX512-NEXT: movb %al, (%rdi)
1612 %t = call {<4 x i1>, <4 x i1>} @llvm.sadd.with.overflow.v4i1(<4 x i1> %a0, <4 x i1> %a1)
1613 %val = extractvalue {<4 x i1>, <4 x i1>} %t, 0
1614 %obit = extractvalue {<4 x i1>, <4 x i1>} %t, 1
1615 %res = sext <4 x i1> %obit to <4 x i32>
1616 store <4 x i1> %val, <4 x i1>* %p2
1620 define <2 x i32> @saddo_v2i128(<2 x i128> %a0, <2 x i128> %a1, <2 x i128>* %p2) nounwind {
1621 ; SSE2-LABEL: saddo_v2i128:
1623 ; SSE2-NEXT: pushq %rbp
1624 ; SSE2-NEXT: pushq %rbx
1625 ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %r10
1626 ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %r11
1627 ; SSE2-NEXT: addq {{[0-9]+}}(%rsp), %rdx
1628 ; SSE2-NEXT: movq %rcx, %rax
1629 ; SSE2-NEXT: adcq %r11, %rax
1630 ; SSE2-NEXT: setns %bl
1631 ; SSE2-NEXT: testq %rcx, %rcx
1632 ; SSE2-NEXT: setns %cl
1633 ; SSE2-NEXT: cmpb %bl, %cl
1634 ; SSE2-NEXT: setne %bpl
1635 ; SSE2-NEXT: testq %r11, %r11
1636 ; SSE2-NEXT: setns %bl
1637 ; SSE2-NEXT: cmpb %bl, %cl
1638 ; SSE2-NEXT: sete %cl
1639 ; SSE2-NEXT: andb %bpl, %cl
1640 ; SSE2-NEXT: movzbl %cl, %ebp
1641 ; SSE2-NEXT: testq %r9, %r9
1642 ; SSE2-NEXT: setns %bl
1643 ; SSE2-NEXT: testq %rsi, %rsi
1644 ; SSE2-NEXT: setns %cl
1645 ; SSE2-NEXT: cmpb %bl, %cl
1646 ; SSE2-NEXT: sete %r11b
1647 ; SSE2-NEXT: addq %r8, %rdi
1648 ; SSE2-NEXT: adcq %r9, %rsi
1649 ; SSE2-NEXT: setns %bl
1650 ; SSE2-NEXT: cmpb %bl, %cl
1651 ; SSE2-NEXT: setne %cl
1652 ; SSE2-NEXT: andb %r11b, %cl
1653 ; SSE2-NEXT: movzbl %cl, %ecx
1654 ; SSE2-NEXT: movd %ecx, %xmm0
1655 ; SSE2-NEXT: pinsrw $4, %ebp, %xmm0
1656 ; SSE2-NEXT: movq %rdx, 16(%r10)
1657 ; SSE2-NEXT: movq %rdi, (%r10)
1658 ; SSE2-NEXT: movq %rax, 24(%r10)
1659 ; SSE2-NEXT: movq %rsi, 8(%r10)
1660 ; SSE2-NEXT: psllq $63, %xmm0
1661 ; SSE2-NEXT: psrad $31, %xmm0
1662 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1663 ; SSE2-NEXT: popq %rbx
1664 ; SSE2-NEXT: popq %rbp
1667 ; SSSE3-LABEL: saddo_v2i128:
1669 ; SSSE3-NEXT: pushq %rbp
1670 ; SSSE3-NEXT: pushq %rbx
1671 ; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %r10
1672 ; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %r11
1673 ; SSSE3-NEXT: addq {{[0-9]+}}(%rsp), %rdx
1674 ; SSSE3-NEXT: movq %rcx, %rax
1675 ; SSSE3-NEXT: adcq %r11, %rax
1676 ; SSSE3-NEXT: setns %bl
1677 ; SSSE3-NEXT: testq %rcx, %rcx
1678 ; SSSE3-NEXT: setns %cl
1679 ; SSSE3-NEXT: cmpb %bl, %cl
1680 ; SSSE3-NEXT: setne %bpl
1681 ; SSSE3-NEXT: testq %r11, %r11
1682 ; SSSE3-NEXT: setns %bl
1683 ; SSSE3-NEXT: cmpb %bl, %cl
1684 ; SSSE3-NEXT: sete %cl
1685 ; SSSE3-NEXT: andb %bpl, %cl
1686 ; SSSE3-NEXT: movzbl %cl, %ebp
1687 ; SSSE3-NEXT: testq %r9, %r9
1688 ; SSSE3-NEXT: setns %bl
1689 ; SSSE3-NEXT: testq %rsi, %rsi
1690 ; SSSE3-NEXT: setns %cl
1691 ; SSSE3-NEXT: cmpb %bl, %cl
1692 ; SSSE3-NEXT: sete %r11b
1693 ; SSSE3-NEXT: addq %r8, %rdi
1694 ; SSSE3-NEXT: adcq %r9, %rsi
1695 ; SSSE3-NEXT: setns %bl
1696 ; SSSE3-NEXT: cmpb %bl, %cl
1697 ; SSSE3-NEXT: setne %cl
1698 ; SSSE3-NEXT: andb %r11b, %cl
1699 ; SSSE3-NEXT: movzbl %cl, %ecx
1700 ; SSSE3-NEXT: movd %ecx, %xmm0
1701 ; SSSE3-NEXT: pinsrw $4, %ebp, %xmm0
1702 ; SSSE3-NEXT: movq %rdx, 16(%r10)
1703 ; SSSE3-NEXT: movq %rdi, (%r10)
1704 ; SSSE3-NEXT: movq %rax, 24(%r10)
1705 ; SSSE3-NEXT: movq %rsi, 8(%r10)
1706 ; SSSE3-NEXT: psllq $63, %xmm0
1707 ; SSSE3-NEXT: psrad $31, %xmm0
1708 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1709 ; SSSE3-NEXT: popq %rbx
1710 ; SSSE3-NEXT: popq %rbp
1713 ; SSE41-LABEL: saddo_v2i128:
1715 ; SSE41-NEXT: pushq %rbp
1716 ; SSE41-NEXT: pushq %rbx
1717 ; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %r10
1718 ; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %r11
1719 ; SSE41-NEXT: addq {{[0-9]+}}(%rsp), %rdx
1720 ; SSE41-NEXT: movq %rcx, %rax
1721 ; SSE41-NEXT: adcq %r11, %rax
1722 ; SSE41-NEXT: setns %bl
1723 ; SSE41-NEXT: testq %rcx, %rcx
1724 ; SSE41-NEXT: setns %cl
1725 ; SSE41-NEXT: cmpb %bl, %cl
1726 ; SSE41-NEXT: setne %bpl
1727 ; SSE41-NEXT: testq %r11, %r11
1728 ; SSE41-NEXT: setns %bl
1729 ; SSE41-NEXT: cmpb %bl, %cl
1730 ; SSE41-NEXT: sete %cl
1731 ; SSE41-NEXT: andb %bpl, %cl
1732 ; SSE41-NEXT: movzbl %cl, %ebp
1733 ; SSE41-NEXT: testq %r9, %r9
1734 ; SSE41-NEXT: setns %bl
1735 ; SSE41-NEXT: testq %rsi, %rsi
1736 ; SSE41-NEXT: setns %cl
1737 ; SSE41-NEXT: cmpb %bl, %cl
1738 ; SSE41-NEXT: sete %r11b
1739 ; SSE41-NEXT: addq %r8, %rdi
1740 ; SSE41-NEXT: adcq %r9, %rsi
1741 ; SSE41-NEXT: setns %bl
1742 ; SSE41-NEXT: cmpb %bl, %cl
1743 ; SSE41-NEXT: setne %cl
1744 ; SSE41-NEXT: andb %r11b, %cl
1745 ; SSE41-NEXT: movzbl %cl, %ecx
1746 ; SSE41-NEXT: movd %ecx, %xmm0
1747 ; SSE41-NEXT: pinsrb $8, %ebp, %xmm0
1748 ; SSE41-NEXT: movq %rdx, 16(%r10)
1749 ; SSE41-NEXT: movq %rdi, (%r10)
1750 ; SSE41-NEXT: movq %rax, 24(%r10)
1751 ; SSE41-NEXT: movq %rsi, 8(%r10)
1752 ; SSE41-NEXT: psllq $63, %xmm0
1753 ; SSE41-NEXT: psrad $31, %xmm0
1754 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1755 ; SSE41-NEXT: popq %rbx
1756 ; SSE41-NEXT: popq %rbp
1759 ; AVX1-LABEL: saddo_v2i128:
1761 ; AVX1-NEXT: pushq %rbp
1762 ; AVX1-NEXT: pushq %rbx
1763 ; AVX1-NEXT: movq {{[0-9]+}}(%rsp), %r10
1764 ; AVX1-NEXT: movq {{[0-9]+}}(%rsp), %r11
1765 ; AVX1-NEXT: addq {{[0-9]+}}(%rsp), %rdx
1766 ; AVX1-NEXT: movq %rcx, %rax
1767 ; AVX1-NEXT: adcq %r11, %rax
1768 ; AVX1-NEXT: setns %bl
1769 ; AVX1-NEXT: testq %rcx, %rcx
1770 ; AVX1-NEXT: setns %cl
1771 ; AVX1-NEXT: cmpb %bl, %cl
1772 ; AVX1-NEXT: setne %bpl
1773 ; AVX1-NEXT: testq %r11, %r11
1774 ; AVX1-NEXT: setns %bl
1775 ; AVX1-NEXT: cmpb %bl, %cl
1776 ; AVX1-NEXT: sete %cl
1777 ; AVX1-NEXT: andb %bpl, %cl
1778 ; AVX1-NEXT: movzbl %cl, %ebp
1779 ; AVX1-NEXT: testq %r9, %r9
1780 ; AVX1-NEXT: setns %bl
1781 ; AVX1-NEXT: testq %rsi, %rsi
1782 ; AVX1-NEXT: setns %cl
1783 ; AVX1-NEXT: cmpb %bl, %cl
1784 ; AVX1-NEXT: sete %r11b
1785 ; AVX1-NEXT: addq %r8, %rdi
1786 ; AVX1-NEXT: adcq %r9, %rsi
1787 ; AVX1-NEXT: setns %bl
1788 ; AVX1-NEXT: cmpb %bl, %cl
1789 ; AVX1-NEXT: setne %cl
1790 ; AVX1-NEXT: andb %r11b, %cl
1791 ; AVX1-NEXT: movzbl %cl, %ecx
1792 ; AVX1-NEXT: vmovd %ecx, %xmm0
1793 ; AVX1-NEXT: vpinsrb $8, %ebp, %xmm0, %xmm0
1794 ; AVX1-NEXT: movq %rdx, 16(%r10)
1795 ; AVX1-NEXT: movq %rdi, (%r10)
1796 ; AVX1-NEXT: movq %rax, 24(%r10)
1797 ; AVX1-NEXT: movq %rsi, 8(%r10)
1798 ; AVX1-NEXT: vpsllq $63, %xmm0, %xmm0
1799 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
1800 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0
1801 ; AVX1-NEXT: popq %rbx
1802 ; AVX1-NEXT: popq %rbp
1805 ; AVX2-LABEL: saddo_v2i128:
1807 ; AVX2-NEXT: pushq %rbp
1808 ; AVX2-NEXT: pushq %rbx
1809 ; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %r10
1810 ; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %r11
1811 ; AVX2-NEXT: addq {{[0-9]+}}(%rsp), %rdx
1812 ; AVX2-NEXT: movq %rcx, %rax
1813 ; AVX2-NEXT: adcq %r11, %rax
1814 ; AVX2-NEXT: setns %bl
1815 ; AVX2-NEXT: testq %rcx, %rcx
1816 ; AVX2-NEXT: setns %cl
1817 ; AVX2-NEXT: cmpb %bl, %cl
1818 ; AVX2-NEXT: setne %bpl
1819 ; AVX2-NEXT: testq %r11, %r11
1820 ; AVX2-NEXT: setns %bl
1821 ; AVX2-NEXT: cmpb %bl, %cl
1822 ; AVX2-NEXT: sete %cl
1823 ; AVX2-NEXT: andb %bpl, %cl
1824 ; AVX2-NEXT: movzbl %cl, %ebp
1825 ; AVX2-NEXT: testq %r9, %r9
1826 ; AVX2-NEXT: setns %bl
1827 ; AVX2-NEXT: testq %rsi, %rsi
1828 ; AVX2-NEXT: setns %cl
1829 ; AVX2-NEXT: cmpb %bl, %cl
1830 ; AVX2-NEXT: sete %r11b
1831 ; AVX2-NEXT: addq %r8, %rdi
1832 ; AVX2-NEXT: adcq %r9, %rsi
1833 ; AVX2-NEXT: setns %bl
1834 ; AVX2-NEXT: cmpb %bl, %cl
1835 ; AVX2-NEXT: setne %cl
1836 ; AVX2-NEXT: andb %r11b, %cl
1837 ; AVX2-NEXT: movzbl %cl, %ecx
1838 ; AVX2-NEXT: vmovd %ecx, %xmm0
1839 ; AVX2-NEXT: vpinsrb $8, %ebp, %xmm0, %xmm0
1840 ; AVX2-NEXT: movq %rdx, 16(%r10)
1841 ; AVX2-NEXT: movq %rdi, (%r10)
1842 ; AVX2-NEXT: movq %rax, 24(%r10)
1843 ; AVX2-NEXT: movq %rsi, 8(%r10)
1844 ; AVX2-NEXT: vpsllq $63, %xmm0, %xmm0
1845 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
1846 ; AVX2-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0
1847 ; AVX2-NEXT: popq %rbx
1848 ; AVX2-NEXT: popq %rbp
1851 ; AVX512-LABEL: saddo_v2i128:
1853 ; AVX512-NEXT: pushq %r14
1854 ; AVX512-NEXT: pushq %rbx
1855 ; AVX512-NEXT: movq {{[0-9]+}}(%rsp), %r10
1856 ; AVX512-NEXT: movq {{[0-9]+}}(%rsp), %r11
1857 ; AVX512-NEXT: addq {{[0-9]+}}(%rsp), %rdx
1858 ; AVX512-NEXT: movq %rcx, %r14
1859 ; AVX512-NEXT: adcq %r11, %r14
1860 ; AVX512-NEXT: setns %bl
1861 ; AVX512-NEXT: testq %rcx, %rcx
1862 ; AVX512-NEXT: setns %cl
1863 ; AVX512-NEXT: cmpb %bl, %cl
1864 ; AVX512-NEXT: setne %bl
1865 ; AVX512-NEXT: testq %r11, %r11
1866 ; AVX512-NEXT: setns %al
1867 ; AVX512-NEXT: cmpb %al, %cl
1868 ; AVX512-NEXT: sete %al
1869 ; AVX512-NEXT: andb %bl, %al
1870 ; AVX512-NEXT: kmovd %eax, %k0
1871 ; AVX512-NEXT: kshiftlw $1, %k0, %k0
1872 ; AVX512-NEXT: testq %r9, %r9
1873 ; AVX512-NEXT: setns %al
1874 ; AVX512-NEXT: testq %rsi, %rsi
1875 ; AVX512-NEXT: setns %cl
1876 ; AVX512-NEXT: cmpb %al, %cl
1877 ; AVX512-NEXT: sete %al
1878 ; AVX512-NEXT: addq %r8, %rdi
1879 ; AVX512-NEXT: adcq %r9, %rsi
1880 ; AVX512-NEXT: setns %bl
1881 ; AVX512-NEXT: cmpb %bl, %cl
1882 ; AVX512-NEXT: setne %cl
1883 ; AVX512-NEXT: andb %al, %cl
1884 ; AVX512-NEXT: andl $1, %ecx
1885 ; AVX512-NEXT: kmovw %ecx, %k1
1886 ; AVX512-NEXT: korw %k0, %k1, %k1
1887 ; AVX512-NEXT: movq %rdx, 16(%r10)
1888 ; AVX512-NEXT: movq %rdi, (%r10)
1889 ; AVX512-NEXT: movq %r14, 24(%r10)
1890 ; AVX512-NEXT: movq %rsi, 8(%r10)
1891 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1892 ; AVX512-NEXT: vmovdqa64 %xmm0, %xmm0 {%k1} {z}
1893 ; AVX512-NEXT: popq %rbx
1894 ; AVX512-NEXT: popq %r14
1896 %t = call {<2 x i128>, <2 x i1>} @llvm.sadd.with.overflow.v2i128(<2 x i128> %a0, <2 x i128> %a1)
1897 %val = extractvalue {<2 x i128>, <2 x i1>} %t, 0
1898 %obit = extractvalue {<2 x i128>, <2 x i1>} %t, 1
1899 %res = sext <2 x i1> %obit to <2 x i32>
1900 store <2 x i128> %val, <2 x i128>* %p2