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 ; SSE-LABEL: saddo_v2i32:
54 ; SSE-NEXT: pxor %xmm2, %xmm2
55 ; SSE-NEXT: pxor %xmm3, %xmm3
56 ; SSE-NEXT: pcmpgtd %xmm1, %xmm3
57 ; SSE-NEXT: pcmpeqd %xmm4, %xmm4
58 ; SSE-NEXT: pxor %xmm4, %xmm3
59 ; SSE-NEXT: pxor %xmm5, %xmm5
60 ; SSE-NEXT: pcmpgtd %xmm0, %xmm5
61 ; SSE-NEXT: pxor %xmm4, %xmm5
62 ; SSE-NEXT: pcmpeqd %xmm5, %xmm3
63 ; SSE-NEXT: paddd %xmm1, %xmm0
64 ; SSE-NEXT: pcmpgtd %xmm0, %xmm2
65 ; SSE-NEXT: pxor %xmm4, %xmm2
66 ; SSE-NEXT: pcmpeqd %xmm5, %xmm2
67 ; SSE-NEXT: pandn %xmm3, %xmm2
68 ; SSE-NEXT: movq %xmm0, (%rdi)
69 ; SSE-NEXT: movdqa %xmm2, %xmm0
72 ; AVX1-LABEL: saddo_v2i32:
74 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
75 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm3
76 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
77 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
78 ; AVX1-NEXT: vpcmpgtd %xmm0, %xmm2, %xmm5
79 ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5
80 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm5, %xmm3
81 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1
82 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm0
83 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
84 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm5, %xmm0
85 ; AVX1-NEXT: vpandn %xmm3, %xmm0, %xmm0
86 ; AVX1-NEXT: vmovq %xmm1, (%rdi)
89 ; AVX2-LABEL: saddo_v2i32:
91 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
92 ; AVX2-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm3
93 ; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
94 ; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm3
95 ; AVX2-NEXT: vpcmpgtd %xmm0, %xmm2, %xmm5
96 ; AVX2-NEXT: vpxor %xmm4, %xmm5, %xmm5
97 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm5, %xmm3
98 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm1
99 ; AVX2-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm0
100 ; AVX2-NEXT: vpxor %xmm4, %xmm0, %xmm0
101 ; AVX2-NEXT: vpcmpeqd %xmm0, %xmm5, %xmm0
102 ; AVX2-NEXT: vpandn %xmm3, %xmm0, %xmm0
103 ; AVX2-NEXT: vmovq %xmm1, (%rdi)
106 ; AVX512-LABEL: saddo_v2i32:
108 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
109 ; AVX512-NEXT: vpcmpnltd %xmm2, %xmm1, %k0
110 ; AVX512-NEXT: vpcmpnltd %xmm2, %xmm0, %k1
111 ; AVX512-NEXT: kxorw %k0, %k1, %k0
112 ; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm1
113 ; AVX512-NEXT: vpcmpnltd %xmm2, %xmm1, %k2
114 ; AVX512-NEXT: kxorw %k2, %k1, %k1
115 ; AVX512-NEXT: kandnw %k1, %k0, %k1
116 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
117 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
118 ; AVX512-NEXT: vmovq %xmm1, (%rdi)
120 %t = call {<2 x i32>, <2 x i1>} @llvm.sadd.with.overflow.v2i32(<2 x i32> %a0, <2 x i32> %a1)
121 %val = extractvalue {<2 x i32>, <2 x i1>} %t, 0
122 %obit = extractvalue {<2 x i32>, <2 x i1>} %t, 1
123 %res = sext <2 x i1> %obit to <2 x i32>
124 store <2 x i32> %val, <2 x i32>* %p2
128 define <3 x i32> @saddo_v3i32(<3 x i32> %a0, <3 x i32> %a1, <3 x i32>* %p2) nounwind {
129 ; SSE2-LABEL: saddo_v3i32:
131 ; SSE2-NEXT: pxor %xmm2, %xmm2
132 ; SSE2-NEXT: pxor %xmm3, %xmm3
133 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
134 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm4
135 ; SSE2-NEXT: pxor %xmm4, %xmm3
136 ; SSE2-NEXT: pxor %xmm5, %xmm5
137 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm5
138 ; SSE2-NEXT: pxor %xmm4, %xmm5
139 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm3
140 ; SSE2-NEXT: paddd %xmm1, %xmm0
141 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
142 ; SSE2-NEXT: pxor %xmm4, %xmm2
143 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm2
144 ; SSE2-NEXT: pandn %xmm3, %xmm2
145 ; SSE2-NEXT: movq %xmm0, (%rdi)
146 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
147 ; SSE2-NEXT: movd %xmm0, 8(%rdi)
148 ; SSE2-NEXT: movdqa %xmm2, %xmm0
151 ; SSSE3-LABEL: saddo_v3i32:
153 ; SSSE3-NEXT: pxor %xmm2, %xmm2
154 ; SSSE3-NEXT: pxor %xmm3, %xmm3
155 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3
156 ; SSSE3-NEXT: pcmpeqd %xmm4, %xmm4
157 ; SSSE3-NEXT: pxor %xmm4, %xmm3
158 ; SSSE3-NEXT: pxor %xmm5, %xmm5
159 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm5
160 ; SSSE3-NEXT: pxor %xmm4, %xmm5
161 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm3
162 ; SSSE3-NEXT: paddd %xmm1, %xmm0
163 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2
164 ; SSSE3-NEXT: pxor %xmm4, %xmm2
165 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm2
166 ; SSSE3-NEXT: pandn %xmm3, %xmm2
167 ; SSSE3-NEXT: movq %xmm0, (%rdi)
168 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
169 ; SSSE3-NEXT: movd %xmm0, 8(%rdi)
170 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
173 ; SSE41-LABEL: saddo_v3i32:
175 ; SSE41-NEXT: pxor %xmm2, %xmm2
176 ; SSE41-NEXT: pxor %xmm3, %xmm3
177 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm3
178 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm4
179 ; SSE41-NEXT: pxor %xmm4, %xmm3
180 ; SSE41-NEXT: pxor %xmm5, %xmm5
181 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm5
182 ; SSE41-NEXT: pxor %xmm4, %xmm5
183 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm3
184 ; SSE41-NEXT: paddd %xmm1, %xmm0
185 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2
186 ; SSE41-NEXT: pxor %xmm4, %xmm2
187 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm2
188 ; SSE41-NEXT: pandn %xmm3, %xmm2
189 ; SSE41-NEXT: pextrd $2, %xmm0, 8(%rdi)
190 ; SSE41-NEXT: movq %xmm0, (%rdi)
191 ; SSE41-NEXT: movdqa %xmm2, %xmm0
194 ; AVX1-LABEL: saddo_v3i32:
196 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
197 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm3
198 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
199 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
200 ; AVX1-NEXT: vpcmpgtd %xmm0, %xmm2, %xmm5
201 ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5
202 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm5, %xmm3
203 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1
204 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm0
205 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
206 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm5, %xmm0
207 ; AVX1-NEXT: vpandn %xmm3, %xmm0, %xmm0
208 ; AVX1-NEXT: vpextrd $2, %xmm1, 8(%rdi)
209 ; AVX1-NEXT: vmovq %xmm1, (%rdi)
212 ; AVX2-LABEL: saddo_v3i32:
214 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
215 ; AVX2-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm3
216 ; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
217 ; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm3
218 ; AVX2-NEXT: vpcmpgtd %xmm0, %xmm2, %xmm5
219 ; AVX2-NEXT: vpxor %xmm4, %xmm5, %xmm5
220 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm5, %xmm3
221 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm1
222 ; AVX2-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm0
223 ; AVX2-NEXT: vpxor %xmm4, %xmm0, %xmm0
224 ; AVX2-NEXT: vpcmpeqd %xmm0, %xmm5, %xmm0
225 ; AVX2-NEXT: vpandn %xmm3, %xmm0, %xmm0
226 ; AVX2-NEXT: vpextrd $2, %xmm1, 8(%rdi)
227 ; AVX2-NEXT: vmovq %xmm1, (%rdi)
230 ; AVX512-LABEL: saddo_v3i32:
232 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
233 ; AVX512-NEXT: vpcmpnltd %xmm2, %xmm1, %k0
234 ; AVX512-NEXT: vpcmpnltd %xmm2, %xmm0, %k1
235 ; AVX512-NEXT: kxorw %k0, %k1, %k0
236 ; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm1
237 ; AVX512-NEXT: vpcmpnltd %xmm2, %xmm1, %k2
238 ; AVX512-NEXT: kxorw %k2, %k1, %k1
239 ; AVX512-NEXT: kandnw %k1, %k0, %k1
240 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
241 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
242 ; AVX512-NEXT: vpextrd $2, %xmm1, 8(%rdi)
243 ; AVX512-NEXT: vmovq %xmm1, (%rdi)
245 %t = call {<3 x i32>, <3 x i1>} @llvm.sadd.with.overflow.v3i32(<3 x i32> %a0, <3 x i32> %a1)
246 %val = extractvalue {<3 x i32>, <3 x i1>} %t, 0
247 %obit = extractvalue {<3 x i32>, <3 x i1>} %t, 1
248 %res = sext <3 x i1> %obit to <3 x i32>
249 store <3 x i32> %val, <3 x i32>* %p2
253 define <4 x i32> @saddo_v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i32>* %p2) nounwind {
254 ; SSE-LABEL: saddo_v4i32:
256 ; SSE-NEXT: pxor %xmm2, %xmm2
257 ; SSE-NEXT: pxor %xmm3, %xmm3
258 ; SSE-NEXT: pcmpgtd %xmm1, %xmm3
259 ; SSE-NEXT: pcmpeqd %xmm4, %xmm4
260 ; SSE-NEXT: pxor %xmm4, %xmm3
261 ; SSE-NEXT: pxor %xmm5, %xmm5
262 ; SSE-NEXT: pcmpgtd %xmm0, %xmm5
263 ; SSE-NEXT: pxor %xmm4, %xmm5
264 ; SSE-NEXT: pcmpeqd %xmm5, %xmm3
265 ; SSE-NEXT: paddd %xmm1, %xmm0
266 ; SSE-NEXT: pcmpgtd %xmm0, %xmm2
267 ; SSE-NEXT: pxor %xmm4, %xmm2
268 ; SSE-NEXT: pcmpeqd %xmm5, %xmm2
269 ; SSE-NEXT: pandn %xmm3, %xmm2
270 ; SSE-NEXT: movdqa %xmm0, (%rdi)
271 ; SSE-NEXT: movdqa %xmm2, %xmm0
274 ; AVX1-LABEL: saddo_v4i32:
276 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
277 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm3
278 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
279 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
280 ; AVX1-NEXT: vpcmpgtd %xmm0, %xmm2, %xmm5
281 ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5
282 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm5, %xmm3
283 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1
284 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm0
285 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
286 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm5, %xmm0
287 ; AVX1-NEXT: vpandn %xmm3, %xmm0, %xmm0
288 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
291 ; AVX2-LABEL: saddo_v4i32:
293 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
294 ; AVX2-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm3
295 ; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
296 ; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm3
297 ; AVX2-NEXT: vpcmpgtd %xmm0, %xmm2, %xmm5
298 ; AVX2-NEXT: vpxor %xmm4, %xmm5, %xmm5
299 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm5, %xmm3
300 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm1
301 ; AVX2-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm0
302 ; AVX2-NEXT: vpxor %xmm4, %xmm0, %xmm0
303 ; AVX2-NEXT: vpcmpeqd %xmm0, %xmm5, %xmm0
304 ; AVX2-NEXT: vpandn %xmm3, %xmm0, %xmm0
305 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
308 ; AVX512-LABEL: saddo_v4i32:
310 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
311 ; AVX512-NEXT: vpcmpnltd %xmm2, %xmm1, %k0
312 ; AVX512-NEXT: vpcmpnltd %xmm2, %xmm0, %k1
313 ; AVX512-NEXT: kxorw %k0, %k1, %k0
314 ; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm1
315 ; AVX512-NEXT: vpcmpnltd %xmm2, %xmm1, %k2
316 ; AVX512-NEXT: kxorw %k2, %k1, %k1
317 ; AVX512-NEXT: kandnw %k1, %k0, %k1
318 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
319 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
320 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
322 %t = call {<4 x i32>, <4 x i1>} @llvm.sadd.with.overflow.v4i32(<4 x i32> %a0, <4 x i32> %a1)
323 %val = extractvalue {<4 x i32>, <4 x i1>} %t, 0
324 %obit = extractvalue {<4 x i32>, <4 x i1>} %t, 1
325 %res = sext <4 x i1> %obit to <4 x i32>
326 store <4 x i32> %val, <4 x i32>* %p2
330 define <6 x i32> @saddo_v6i32(<6 x i32> %a0, <6 x i32> %a1, <6 x i32>* %p2) nounwind {
331 ; SSE2-LABEL: saddo_v6i32:
333 ; SSE2-NEXT: movq %rdi, %rax
334 ; SSE2-NEXT: movd %r8d, %xmm0
335 ; SSE2-NEXT: movd %ecx, %xmm1
336 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
337 ; SSE2-NEXT: movd %edx, %xmm0
338 ; SSE2-NEXT: movd %esi, %xmm4
339 ; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1]
340 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm1[0]
341 ; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
342 ; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
343 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
344 ; SSE2-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
345 ; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
346 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
347 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
348 ; SSE2-NEXT: movd %r9d, %xmm3
349 ; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
350 ; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
351 ; SSE2-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
352 ; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
353 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
354 ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %rcx
355 ; SSE2-NEXT: pxor %xmm2, %xmm2
356 ; SSE2-NEXT: pxor %xmm6, %xmm6
357 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm6
358 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm5
359 ; SSE2-NEXT: pxor %xmm5, %xmm6
360 ; SSE2-NEXT: pxor %xmm7, %xmm7
361 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm7
362 ; SSE2-NEXT: pxor %xmm5, %xmm7
363 ; SSE2-NEXT: pcmpeqd %xmm7, %xmm6
364 ; SSE2-NEXT: paddd %xmm4, %xmm0
365 ; SSE2-NEXT: pxor %xmm4, %xmm4
366 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
367 ; SSE2-NEXT: pxor %xmm5, %xmm4
368 ; SSE2-NEXT: pcmpeqd %xmm7, %xmm4
369 ; SSE2-NEXT: pandn %xmm6, %xmm4
370 ; SSE2-NEXT: pxor %xmm6, %xmm6
371 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm6
372 ; SSE2-NEXT: pxor %xmm5, %xmm6
373 ; SSE2-NEXT: pxor %xmm7, %xmm7
374 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm7
375 ; SSE2-NEXT: pxor %xmm5, %xmm7
376 ; SSE2-NEXT: pcmpeqd %xmm7, %xmm6
377 ; SSE2-NEXT: paddd %xmm3, %xmm1
378 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
379 ; SSE2-NEXT: pxor %xmm5, %xmm2
380 ; SSE2-NEXT: pcmpeqd %xmm7, %xmm2
381 ; SSE2-NEXT: pandn %xmm6, %xmm2
382 ; SSE2-NEXT: movq %xmm1, 16(%rcx)
383 ; SSE2-NEXT: movdqa %xmm0, (%rcx)
384 ; SSE2-NEXT: movq %xmm2, 16(%rdi)
385 ; SSE2-NEXT: movdqa %xmm4, (%rdi)
388 ; SSSE3-LABEL: saddo_v6i32:
390 ; SSSE3-NEXT: movq %rdi, %rax
391 ; SSSE3-NEXT: movd %r8d, %xmm0
392 ; SSSE3-NEXT: movd %ecx, %xmm1
393 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
394 ; SSSE3-NEXT: movd %edx, %xmm0
395 ; SSSE3-NEXT: movd %esi, %xmm4
396 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1]
397 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm1[0]
398 ; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
399 ; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
400 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
401 ; SSSE3-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
402 ; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
403 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
404 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
405 ; SSSE3-NEXT: movd %r9d, %xmm3
406 ; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
407 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
408 ; SSSE3-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
409 ; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
410 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
411 ; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %rcx
412 ; SSSE3-NEXT: pxor %xmm2, %xmm2
413 ; SSSE3-NEXT: pxor %xmm6, %xmm6
414 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm6
415 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm5
416 ; SSSE3-NEXT: pxor %xmm5, %xmm6
417 ; SSSE3-NEXT: pxor %xmm7, %xmm7
418 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm7
419 ; SSSE3-NEXT: pxor %xmm5, %xmm7
420 ; SSSE3-NEXT: pcmpeqd %xmm7, %xmm6
421 ; SSSE3-NEXT: paddd %xmm4, %xmm0
422 ; SSSE3-NEXT: pxor %xmm4, %xmm4
423 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
424 ; SSSE3-NEXT: pxor %xmm5, %xmm4
425 ; SSSE3-NEXT: pcmpeqd %xmm7, %xmm4
426 ; SSSE3-NEXT: pandn %xmm6, %xmm4
427 ; SSSE3-NEXT: pxor %xmm6, %xmm6
428 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm6
429 ; SSSE3-NEXT: pxor %xmm5, %xmm6
430 ; SSSE3-NEXT: pxor %xmm7, %xmm7
431 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm7
432 ; SSSE3-NEXT: pxor %xmm5, %xmm7
433 ; SSSE3-NEXT: pcmpeqd %xmm7, %xmm6
434 ; SSSE3-NEXT: paddd %xmm3, %xmm1
435 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
436 ; SSSE3-NEXT: pxor %xmm5, %xmm2
437 ; SSSE3-NEXT: pcmpeqd %xmm7, %xmm2
438 ; SSSE3-NEXT: pandn %xmm6, %xmm2
439 ; SSSE3-NEXT: movq %xmm1, 16(%rcx)
440 ; SSSE3-NEXT: movdqa %xmm0, (%rcx)
441 ; SSSE3-NEXT: movq %xmm2, 16(%rdi)
442 ; SSSE3-NEXT: movdqa %xmm4, (%rdi)
445 ; SSE41-LABEL: saddo_v6i32:
447 ; SSE41-NEXT: movq %rdi, %rax
448 ; SSE41-NEXT: movd %esi, %xmm4
449 ; SSE41-NEXT: pinsrd $1, %edx, %xmm4
450 ; SSE41-NEXT: pinsrd $2, %ecx, %xmm4
451 ; SSE41-NEXT: pinsrd $3, %r8d, %xmm4
452 ; SSE41-NEXT: movd %r9d, %xmm2
453 ; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm2
454 ; SSE41-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
455 ; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm0
456 ; SSE41-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
457 ; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm1
458 ; SSE41-NEXT: pinsrd $2, {{[0-9]+}}(%rsp), %xmm1
459 ; SSE41-NEXT: pinsrd $3, {{[0-9]+}}(%rsp), %xmm1
460 ; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %rcx
461 ; SSE41-NEXT: pxor %xmm3, %xmm3
462 ; SSE41-NEXT: pxor %xmm6, %xmm6
463 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm6
464 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm5
465 ; SSE41-NEXT: pxor %xmm5, %xmm6
466 ; SSE41-NEXT: pxor %xmm7, %xmm7
467 ; SSE41-NEXT: pcmpgtd %xmm4, %xmm7
468 ; SSE41-NEXT: pxor %xmm5, %xmm7
469 ; SSE41-NEXT: pcmpeqd %xmm7, %xmm6
470 ; SSE41-NEXT: paddd %xmm4, %xmm1
471 ; SSE41-NEXT: pxor %xmm4, %xmm4
472 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm4
473 ; SSE41-NEXT: pxor %xmm5, %xmm4
474 ; SSE41-NEXT: pcmpeqd %xmm7, %xmm4
475 ; SSE41-NEXT: pandn %xmm6, %xmm4
476 ; SSE41-NEXT: pxor %xmm6, %xmm6
477 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
478 ; SSE41-NEXT: pxor %xmm5, %xmm6
479 ; SSE41-NEXT: pxor %xmm7, %xmm7
480 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm7
481 ; SSE41-NEXT: pxor %xmm5, %xmm7
482 ; SSE41-NEXT: pcmpeqd %xmm7, %xmm6
483 ; SSE41-NEXT: paddd %xmm2, %xmm0
484 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
485 ; SSE41-NEXT: pxor %xmm5, %xmm3
486 ; SSE41-NEXT: pcmpeqd %xmm7, %xmm3
487 ; SSE41-NEXT: pandn %xmm6, %xmm3
488 ; SSE41-NEXT: movq %xmm0, 16(%rcx)
489 ; SSE41-NEXT: movdqa %xmm1, (%rcx)
490 ; SSE41-NEXT: movq %xmm3, 16(%rdi)
491 ; SSE41-NEXT: movdqa %xmm4, (%rdi)
494 ; AVX1-LABEL: saddo_v6i32:
496 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
497 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
498 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm4
499 ; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5
500 ; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4
501 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6
502 ; AVX1-NEXT: vpcmpgtd %xmm6, %xmm3, %xmm7
503 ; AVX1-NEXT: vpxor %xmm5, %xmm7, %xmm7
504 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm7, %xmm8
505 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm3, %xmm4
506 ; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm9
507 ; AVX1-NEXT: vpcmpgtd %xmm0, %xmm3, %xmm4
508 ; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4
509 ; AVX1-NEXT: vpcmpeqd %xmm9, %xmm4, %xmm9
510 ; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm9, %ymm8
511 ; AVX1-NEXT: vpaddd %xmm2, %xmm6, %xmm2
512 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm6
513 ; AVX1-NEXT: vpxor %xmm5, %xmm6, %xmm6
514 ; AVX1-NEXT: vpcmpeqd %xmm6, %xmm7, %xmm6
515 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1
516 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm3, %xmm0
517 ; AVX1-NEXT: vpxor %xmm5, %xmm0, %xmm0
518 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm4, %xmm0
519 ; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm0, %ymm0
520 ; AVX1-NEXT: vandnps %ymm8, %ymm0, %ymm0
521 ; AVX1-NEXT: vmovq %xmm2, 16(%rdi)
522 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
525 ; AVX2-LABEL: saddo_v6i32:
527 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
528 ; AVX2-NEXT: vpcmpgtd %ymm1, %ymm2, %ymm3
529 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4
530 ; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm3
531 ; AVX2-NEXT: vpcmpgtd %ymm0, %ymm2, %ymm5
532 ; AVX2-NEXT: vpxor %ymm4, %ymm5, %ymm5
533 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm5, %ymm3
534 ; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm1
535 ; AVX2-NEXT: vpcmpgtd %ymm1, %ymm2, %ymm0
536 ; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm0
537 ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm5, %ymm0
538 ; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0
539 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
540 ; AVX2-NEXT: vmovq %xmm2, 16(%rdi)
541 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
544 ; AVX512-LABEL: saddo_v6i32:
546 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
547 ; AVX512-NEXT: vpcmpnltd %ymm2, %ymm1, %k0
548 ; AVX512-NEXT: vpcmpnltd %ymm2, %ymm0, %k1
549 ; AVX512-NEXT: kxorw %k0, %k1, %k0
550 ; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm1
551 ; AVX512-NEXT: vpcmpnltd %ymm2, %ymm1, %k2
552 ; AVX512-NEXT: kxorw %k2, %k1, %k1
553 ; AVX512-NEXT: kandnw %k1, %k0, %k1
554 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
555 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
556 ; AVX512-NEXT: vextracti128 $1, %ymm1, %xmm2
557 ; AVX512-NEXT: vmovq %xmm2, 16(%rdi)
558 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
560 %t = call {<6 x i32>, <6 x i1>} @llvm.sadd.with.overflow.v6i32(<6 x i32> %a0, <6 x i32> %a1)
561 %val = extractvalue {<6 x i32>, <6 x i1>} %t, 0
562 %obit = extractvalue {<6 x i32>, <6 x i1>} %t, 1
563 %res = sext <6 x i1> %obit to <6 x i32>
564 store <6 x i32> %val, <6 x i32>* %p2
568 define <8 x i32> @saddo_v8i32(<8 x i32> %a0, <8 x i32> %a1, <8 x i32>* %p2) nounwind {
569 ; SSE-LABEL: saddo_v8i32:
571 ; SSE-NEXT: movdqa %xmm1, %xmm4
572 ; SSE-NEXT: pxor %xmm1, %xmm1
573 ; SSE-NEXT: pxor %xmm6, %xmm6
574 ; SSE-NEXT: pcmpgtd %xmm2, %xmm6
575 ; SSE-NEXT: pcmpeqd %xmm5, %xmm5
576 ; SSE-NEXT: pxor %xmm5, %xmm6
577 ; SSE-NEXT: pxor %xmm7, %xmm7
578 ; SSE-NEXT: pcmpgtd %xmm0, %xmm7
579 ; SSE-NEXT: pxor %xmm5, %xmm7
580 ; SSE-NEXT: pcmpeqd %xmm7, %xmm6
581 ; SSE-NEXT: paddd %xmm2, %xmm0
582 ; SSE-NEXT: pxor %xmm2, %xmm2
583 ; SSE-NEXT: pcmpgtd %xmm0, %xmm2
584 ; SSE-NEXT: pxor %xmm5, %xmm2
585 ; SSE-NEXT: pcmpeqd %xmm7, %xmm2
586 ; SSE-NEXT: pandn %xmm6, %xmm2
587 ; SSE-NEXT: pxor %xmm6, %xmm6
588 ; SSE-NEXT: pcmpgtd %xmm3, %xmm6
589 ; SSE-NEXT: pxor %xmm5, %xmm6
590 ; SSE-NEXT: pxor %xmm7, %xmm7
591 ; SSE-NEXT: pcmpgtd %xmm4, %xmm7
592 ; SSE-NEXT: pxor %xmm5, %xmm7
593 ; SSE-NEXT: pcmpeqd %xmm7, %xmm6
594 ; SSE-NEXT: paddd %xmm3, %xmm4
595 ; SSE-NEXT: pcmpgtd %xmm4, %xmm1
596 ; SSE-NEXT: pxor %xmm5, %xmm1
597 ; SSE-NEXT: pcmpeqd %xmm7, %xmm1
598 ; SSE-NEXT: pandn %xmm6, %xmm1
599 ; SSE-NEXT: movdqa %xmm4, 16(%rdi)
600 ; SSE-NEXT: movdqa %xmm0, (%rdi)
601 ; SSE-NEXT: movdqa %xmm2, %xmm0
604 ; AVX1-LABEL: saddo_v8i32:
606 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
607 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
608 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm4
609 ; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5
610 ; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4
611 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6
612 ; AVX1-NEXT: vpcmpgtd %xmm6, %xmm3, %xmm7
613 ; AVX1-NEXT: vpxor %xmm5, %xmm7, %xmm7
614 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm7, %xmm8
615 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm3, %xmm4
616 ; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm9
617 ; AVX1-NEXT: vpcmpgtd %xmm0, %xmm3, %xmm4
618 ; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4
619 ; AVX1-NEXT: vpcmpeqd %xmm9, %xmm4, %xmm9
620 ; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm9, %ymm8
621 ; AVX1-NEXT: vpaddd %xmm2, %xmm6, %xmm2
622 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm6
623 ; AVX1-NEXT: vpxor %xmm5, %xmm6, %xmm6
624 ; AVX1-NEXT: vpcmpeqd %xmm6, %xmm7, %xmm6
625 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1
626 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm3, %xmm0
627 ; AVX1-NEXT: vpxor %xmm5, %xmm0, %xmm0
628 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm4, %xmm0
629 ; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm0, %ymm0
630 ; AVX1-NEXT: vandnps %ymm8, %ymm0, %ymm0
631 ; AVX1-NEXT: vmovdqa %xmm2, 16(%rdi)
632 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
635 ; AVX2-LABEL: saddo_v8i32:
637 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
638 ; AVX2-NEXT: vpcmpgtd %ymm1, %ymm2, %ymm3
639 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4
640 ; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm3
641 ; AVX2-NEXT: vpcmpgtd %ymm0, %ymm2, %ymm5
642 ; AVX2-NEXT: vpxor %ymm4, %ymm5, %ymm5
643 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm5, %ymm3
644 ; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm1
645 ; AVX2-NEXT: vpcmpgtd %ymm1, %ymm2, %ymm0
646 ; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm0
647 ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm5, %ymm0
648 ; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0
649 ; AVX2-NEXT: vmovdqa %ymm1, (%rdi)
652 ; AVX512-LABEL: saddo_v8i32:
654 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
655 ; AVX512-NEXT: vpcmpnltd %ymm2, %ymm1, %k0
656 ; AVX512-NEXT: vpcmpnltd %ymm2, %ymm0, %k1
657 ; AVX512-NEXT: kxorw %k0, %k1, %k0
658 ; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm1
659 ; AVX512-NEXT: vpcmpnltd %ymm2, %ymm1, %k2
660 ; AVX512-NEXT: kxorw %k2, %k1, %k1
661 ; AVX512-NEXT: kandnw %k1, %k0, %k1
662 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
663 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
664 ; AVX512-NEXT: vmovdqa %ymm1, (%rdi)
666 %t = call {<8 x i32>, <8 x i1>} @llvm.sadd.with.overflow.v8i32(<8 x i32> %a0, <8 x i32> %a1)
667 %val = extractvalue {<8 x i32>, <8 x i1>} %t, 0
668 %obit = extractvalue {<8 x i32>, <8 x i1>} %t, 1
669 %res = sext <8 x i1> %obit to <8 x i32>
670 store <8 x i32> %val, <8 x i32>* %p2
674 define <16 x i32> @saddo_v16i32(<16 x i32> %a0, <16 x i32> %a1, <16 x i32>* %p2) nounwind {
675 ; SSE-LABEL: saddo_v16i32:
677 ; SSE-NEXT: movdqa %xmm3, %xmm8
678 ; SSE-NEXT: pxor %xmm3, %xmm3
679 ; SSE-NEXT: pxor %xmm11, %xmm11
680 ; SSE-NEXT: pcmpgtd %xmm4, %xmm11
681 ; SSE-NEXT: pcmpeqd %xmm10, %xmm10
682 ; SSE-NEXT: pxor %xmm10, %xmm11
683 ; SSE-NEXT: pxor %xmm12, %xmm12
684 ; SSE-NEXT: pcmpgtd %xmm0, %xmm12
685 ; SSE-NEXT: pxor %xmm10, %xmm12
686 ; SSE-NEXT: pcmpeqd %xmm12, %xmm11
687 ; SSE-NEXT: paddd %xmm4, %xmm0
688 ; SSE-NEXT: pxor %xmm9, %xmm9
689 ; SSE-NEXT: pcmpgtd %xmm0, %xmm9
690 ; SSE-NEXT: pxor %xmm10, %xmm9
691 ; SSE-NEXT: pcmpeqd %xmm12, %xmm9
692 ; SSE-NEXT: pandn %xmm11, %xmm9
693 ; SSE-NEXT: pxor %xmm12, %xmm12
694 ; SSE-NEXT: pcmpgtd %xmm5, %xmm12
695 ; SSE-NEXT: pxor %xmm10, %xmm12
696 ; SSE-NEXT: pxor %xmm4, %xmm4
697 ; SSE-NEXT: pcmpgtd %xmm1, %xmm4
698 ; SSE-NEXT: pxor %xmm10, %xmm4
699 ; SSE-NEXT: pcmpeqd %xmm4, %xmm12
700 ; SSE-NEXT: paddd %xmm5, %xmm1
701 ; SSE-NEXT: pxor %xmm11, %xmm11
702 ; SSE-NEXT: pcmpgtd %xmm1, %xmm11
703 ; SSE-NEXT: pxor %xmm10, %xmm11
704 ; SSE-NEXT: pcmpeqd %xmm4, %xmm11
705 ; SSE-NEXT: pandn %xmm12, %xmm11
706 ; SSE-NEXT: pxor %xmm4, %xmm4
707 ; SSE-NEXT: pcmpgtd %xmm6, %xmm4
708 ; SSE-NEXT: pxor %xmm10, %xmm4
709 ; SSE-NEXT: pxor %xmm5, %xmm5
710 ; SSE-NEXT: pcmpgtd %xmm2, %xmm5
711 ; SSE-NEXT: pxor %xmm10, %xmm5
712 ; SSE-NEXT: pcmpeqd %xmm5, %xmm4
713 ; SSE-NEXT: paddd %xmm6, %xmm2
714 ; SSE-NEXT: pxor %xmm6, %xmm6
715 ; SSE-NEXT: pcmpgtd %xmm2, %xmm6
716 ; SSE-NEXT: pxor %xmm10, %xmm6
717 ; SSE-NEXT: pcmpeqd %xmm5, %xmm6
718 ; SSE-NEXT: pandn %xmm4, %xmm6
719 ; SSE-NEXT: pxor %xmm4, %xmm4
720 ; SSE-NEXT: pcmpgtd %xmm7, %xmm4
721 ; SSE-NEXT: pxor %xmm10, %xmm4
722 ; SSE-NEXT: pxor %xmm5, %xmm5
723 ; SSE-NEXT: pcmpgtd %xmm8, %xmm5
724 ; SSE-NEXT: pxor %xmm10, %xmm5
725 ; SSE-NEXT: pcmpeqd %xmm5, %xmm4
726 ; SSE-NEXT: paddd %xmm7, %xmm8
727 ; SSE-NEXT: pcmpgtd %xmm8, %xmm3
728 ; SSE-NEXT: pxor %xmm10, %xmm3
729 ; SSE-NEXT: pcmpeqd %xmm5, %xmm3
730 ; SSE-NEXT: pandn %xmm4, %xmm3
731 ; SSE-NEXT: movdqa %xmm8, 48(%rdi)
732 ; SSE-NEXT: movdqa %xmm2, 32(%rdi)
733 ; SSE-NEXT: movdqa %xmm1, 16(%rdi)
734 ; SSE-NEXT: movdqa %xmm0, (%rdi)
735 ; SSE-NEXT: movdqa %xmm9, %xmm0
736 ; SSE-NEXT: movdqa %xmm11, %xmm1
737 ; SSE-NEXT: movdqa %xmm6, %xmm2
740 ; AVX1-LABEL: saddo_v16i32:
742 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm9
743 ; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5
744 ; AVX1-NEXT: vpcmpgtd %xmm9, %xmm5, %xmm7
745 ; AVX1-NEXT: vpcmpeqd %xmm6, %xmm6, %xmm6
746 ; AVX1-NEXT: vpxor %xmm6, %xmm7, %xmm8
747 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7
748 ; AVX1-NEXT: vpcmpgtd %xmm7, %xmm5, %xmm4
749 ; AVX1-NEXT: vpxor %xmm6, %xmm4, %xmm4
750 ; AVX1-NEXT: vpcmpeqd %xmm8, %xmm4, %xmm8
751 ; AVX1-NEXT: vpaddd %xmm9, %xmm7, %xmm9
752 ; AVX1-NEXT: vpcmpgtd %xmm9, %xmm5, %xmm7
753 ; AVX1-NEXT: vpxor %xmm6, %xmm7, %xmm7
754 ; AVX1-NEXT: vpcmpeqd %xmm7, %xmm4, %xmm4
755 ; AVX1-NEXT: vpandn %xmm8, %xmm4, %xmm8
756 ; AVX1-NEXT: vpcmpgtd %xmm3, %xmm5, %xmm7
757 ; AVX1-NEXT: vpxor %xmm6, %xmm7, %xmm7
758 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm5, %xmm4
759 ; AVX1-NEXT: vpxor %xmm6, %xmm4, %xmm4
760 ; AVX1-NEXT: vpcmpeqd %xmm7, %xmm4, %xmm7
761 ; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm10
762 ; AVX1-NEXT: vpcmpgtd %xmm10, %xmm5, %xmm1
763 ; AVX1-NEXT: vpxor %xmm6, %xmm1, %xmm1
764 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm4, %xmm1
765 ; AVX1-NEXT: vpandn %xmm7, %xmm1, %xmm1
766 ; AVX1-NEXT: vpackssdw %xmm8, %xmm1, %xmm8
767 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
768 ; AVX1-NEXT: vpcmpgtd %xmm4, %xmm5, %xmm7
769 ; AVX1-NEXT: vpxor %xmm6, %xmm7, %xmm7
770 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
771 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm5, %xmm3
772 ; AVX1-NEXT: vpxor %xmm6, %xmm3, %xmm3
773 ; AVX1-NEXT: vpcmpeqd %xmm7, %xmm3, %xmm7
774 ; AVX1-NEXT: vpaddd %xmm4, %xmm1, %xmm4
775 ; AVX1-NEXT: vpcmpgtd %xmm4, %xmm5, %xmm1
776 ; AVX1-NEXT: vpxor %xmm6, %xmm1, %xmm1
777 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm3, %xmm1
778 ; AVX1-NEXT: vpandn %xmm7, %xmm1, %xmm1
779 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm5, %xmm3
780 ; AVX1-NEXT: vpxor %xmm6, %xmm3, %xmm3
781 ; AVX1-NEXT: vpcmpgtd %xmm0, %xmm5, %xmm7
782 ; AVX1-NEXT: vpxor %xmm6, %xmm7, %xmm7
783 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm7, %xmm3
784 ; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm2
785 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm5, %xmm0
786 ; AVX1-NEXT: vpxor %xmm6, %xmm0, %xmm0
787 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm7, %xmm0
788 ; AVX1-NEXT: vpandn %xmm3, %xmm0, %xmm0
789 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
790 ; AVX1-NEXT: vpacksswb %xmm8, %xmm0, %xmm1
791 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0
792 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[1,1,2,3]
793 ; AVX1-NEXT: vpmovsxbd %xmm3, %xmm3
794 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
795 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
796 ; AVX1-NEXT: vpmovsxbd %xmm3, %xmm3
797 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,0,1]
798 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
799 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm1
800 ; AVX1-NEXT: vmovdqa %xmm9, 48(%rdi)
801 ; AVX1-NEXT: vmovdqa %xmm10, 32(%rdi)
802 ; AVX1-NEXT: vmovdqa %xmm4, 16(%rdi)
803 ; AVX1-NEXT: vmovdqa %xmm2, (%rdi)
806 ; AVX2-LABEL: saddo_v16i32:
808 ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4
809 ; AVX2-NEXT: vpcmpgtd %ymm3, %ymm4, %ymm5
810 ; AVX2-NEXT: vpcmpeqd %ymm6, %ymm6, %ymm6
811 ; AVX2-NEXT: vpxor %ymm6, %ymm5, %ymm5
812 ; AVX2-NEXT: vpcmpgtd %ymm1, %ymm4, %ymm7
813 ; AVX2-NEXT: vpxor %ymm6, %ymm7, %ymm7
814 ; AVX2-NEXT: vpcmpeqd %ymm5, %ymm7, %ymm5
815 ; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm3
816 ; AVX2-NEXT: vpcmpgtd %ymm3, %ymm4, %ymm1
817 ; AVX2-NEXT: vpxor %ymm6, %ymm1, %ymm1
818 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm7, %ymm1
819 ; AVX2-NEXT: vpandn %ymm5, %ymm1, %ymm1
820 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5
821 ; AVX2-NEXT: vpackssdw %xmm5, %xmm1, %xmm1
822 ; AVX2-NEXT: vpcmpgtd %ymm2, %ymm4, %ymm5
823 ; AVX2-NEXT: vpxor %ymm6, %ymm5, %ymm5
824 ; AVX2-NEXT: vpcmpgtd %ymm0, %ymm4, %ymm7
825 ; AVX2-NEXT: vpxor %ymm6, %ymm7, %ymm7
826 ; AVX2-NEXT: vpcmpeqd %ymm5, %ymm7, %ymm5
827 ; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm2
828 ; AVX2-NEXT: vpcmpgtd %ymm2, %ymm4, %ymm0
829 ; AVX2-NEXT: vpxor %ymm6, %ymm0, %ymm0
830 ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm7, %ymm0
831 ; AVX2-NEXT: vpandn %ymm5, %ymm0, %ymm0
832 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4
833 ; AVX2-NEXT: vpackssdw %xmm4, %xmm0, %xmm0
834 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1
835 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0
836 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
837 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1
838 ; AVX2-NEXT: vmovdqa %ymm3, 32(%rdi)
839 ; AVX2-NEXT: vmovdqa %ymm2, (%rdi)
842 ; AVX512-LABEL: saddo_v16i32:
844 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
845 ; AVX512-NEXT: vpcmpnltd %zmm2, %zmm1, %k0
846 ; AVX512-NEXT: vpcmpnltd %zmm2, %zmm0, %k1
847 ; AVX512-NEXT: kxorw %k0, %k1, %k0
848 ; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm1
849 ; AVX512-NEXT: vpcmpnltd %zmm2, %zmm1, %k2
850 ; AVX512-NEXT: kxorw %k2, %k1, %k1
851 ; AVX512-NEXT: kandnw %k1, %k0, %k1
852 ; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
853 ; AVX512-NEXT: vmovdqa64 %zmm1, (%rdi)
855 %t = call {<16 x i32>, <16 x i1>} @llvm.sadd.with.overflow.v16i32(<16 x i32> %a0, <16 x i32> %a1)
856 %val = extractvalue {<16 x i32>, <16 x i1>} %t, 0
857 %obit = extractvalue {<16 x i32>, <16 x i1>} %t, 1
858 %res = sext <16 x i1> %obit to <16 x i32>
859 store <16 x i32> %val, <16 x i32>* %p2
863 define <16 x i32> @saddo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nounwind {
864 ; SSE2-LABEL: saddo_v16i8:
866 ; SSE2-NEXT: movdqa %xmm0, %xmm2
867 ; SSE2-NEXT: paddsb %xmm1, %xmm2
868 ; SSE2-NEXT: paddb %xmm1, %xmm0
869 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm2
870 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm3
871 ; SSE2-NEXT: pxor %xmm2, %xmm3
872 ; SSE2-NEXT: movdqa %xmm3, %xmm1
873 ; 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]
874 ; SSE2-NEXT: movdqa %xmm1, %xmm4
875 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]
876 ; SSE2-NEXT: pslld $31, %xmm4
877 ; SSE2-NEXT: psrad $31, %xmm4
878 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
879 ; SSE2-NEXT: pslld $31, %xmm1
880 ; SSE2-NEXT: psrad $31, %xmm1
881 ; 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]
882 ; SSE2-NEXT: movdqa %xmm3, %xmm2
883 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
884 ; SSE2-NEXT: pslld $31, %xmm2
885 ; SSE2-NEXT: psrad $31, %xmm2
886 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
887 ; SSE2-NEXT: pslld $31, %xmm3
888 ; SSE2-NEXT: psrad $31, %xmm3
889 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
890 ; SSE2-NEXT: movdqa %xmm4, %xmm0
893 ; SSSE3-LABEL: saddo_v16i8:
895 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
896 ; SSSE3-NEXT: paddsb %xmm1, %xmm2
897 ; SSSE3-NEXT: paddb %xmm1, %xmm0
898 ; SSSE3-NEXT: pcmpeqb %xmm0, %xmm2
899 ; SSSE3-NEXT: pcmpeqd %xmm3, %xmm3
900 ; SSSE3-NEXT: pxor %xmm2, %xmm3
901 ; SSSE3-NEXT: movdqa %xmm3, %xmm1
902 ; 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]
903 ; SSSE3-NEXT: movdqa %xmm1, %xmm4
904 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]
905 ; SSSE3-NEXT: pslld $31, %xmm4
906 ; SSSE3-NEXT: psrad $31, %xmm4
907 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
908 ; SSSE3-NEXT: pslld $31, %xmm1
909 ; SSSE3-NEXT: psrad $31, %xmm1
910 ; 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]
911 ; SSSE3-NEXT: movdqa %xmm3, %xmm2
912 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
913 ; SSSE3-NEXT: pslld $31, %xmm2
914 ; SSSE3-NEXT: psrad $31, %xmm2
915 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
916 ; SSSE3-NEXT: pslld $31, %xmm3
917 ; SSSE3-NEXT: psrad $31, %xmm3
918 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
919 ; SSSE3-NEXT: movdqa %xmm4, %xmm0
922 ; SSE41-LABEL: saddo_v16i8:
924 ; SSE41-NEXT: movdqa %xmm0, %xmm2
925 ; SSE41-NEXT: paddsb %xmm1, %xmm2
926 ; SSE41-NEXT: paddb %xmm1, %xmm0
927 ; SSE41-NEXT: pcmpeqb %xmm0, %xmm2
928 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm3
929 ; SSE41-NEXT: pxor %xmm2, %xmm3
930 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm4 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
931 ; SSE41-NEXT: pslld $31, %xmm4
932 ; SSE41-NEXT: psrad $31, %xmm4
933 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,2,3]
934 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
935 ; SSE41-NEXT: pslld $31, %xmm1
936 ; SSE41-NEXT: psrad $31, %xmm1
937 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[2,3,0,1]
938 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
939 ; SSE41-NEXT: pslld $31, %xmm2
940 ; SSE41-NEXT: psrad $31, %xmm2
941 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[3,1,2,3]
942 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
943 ; SSE41-NEXT: pslld $31, %xmm3
944 ; SSE41-NEXT: psrad $31, %xmm3
945 ; SSE41-NEXT: movdqa %xmm0, (%rdi)
946 ; SSE41-NEXT: movdqa %xmm4, %xmm0
949 ; AVX1-LABEL: saddo_v16i8:
951 ; AVX1-NEXT: vpaddsb %xmm1, %xmm0, %xmm2
952 ; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm3
953 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm3, %xmm0
954 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
955 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm1
956 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0
957 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,2,3]
958 ; AVX1-NEXT: vpmovsxbd %xmm2, %xmm2
959 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
960 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[2,3,0,1]
961 ; AVX1-NEXT: vpmovsxbd %xmm2, %xmm2
962 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,0,1]
963 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
964 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
965 ; AVX1-NEXT: vmovdqa %xmm3, (%rdi)
968 ; AVX2-LABEL: saddo_v16i8:
970 ; AVX2-NEXT: vpaddsb %xmm1, %xmm0, %xmm2
971 ; AVX2-NEXT: vpaddb %xmm1, %xmm0, %xmm3
972 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm3, %xmm0
973 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
974 ; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm1
975 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0
976 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
977 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1
978 ; AVX2-NEXT: vmovdqa %xmm3, (%rdi)
981 ; AVX512-LABEL: saddo_v16i8:
983 ; AVX512-NEXT: vpaddsb %xmm1, %xmm0, %xmm2
984 ; AVX512-NEXT: vpaddb %xmm1, %xmm0, %xmm1
985 ; AVX512-NEXT: vpcmpneqb %xmm2, %xmm1, %k1
986 ; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
987 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
989 %t = call {<16 x i8>, <16 x i1>} @llvm.sadd.with.overflow.v16i8(<16 x i8> %a0, <16 x i8> %a1)
990 %val = extractvalue {<16 x i8>, <16 x i1>} %t, 0
991 %obit = extractvalue {<16 x i8>, <16 x i1>} %t, 1
992 %res = sext <16 x i1> %obit to <16 x i32>
993 store <16 x i8> %val, <16 x i8>* %p2
997 define <8 x i32> @saddo_v8i16(<8 x i16> %a0, <8 x i16> %a1, <8 x i16>* %p2) nounwind {
998 ; SSE2-LABEL: saddo_v8i16:
1000 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1001 ; SSE2-NEXT: paddsw %xmm1, %xmm2
1002 ; SSE2-NEXT: paddw %xmm1, %xmm0
1003 ; SSE2-NEXT: pcmpeqw %xmm0, %xmm2
1004 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
1005 ; SSE2-NEXT: pxor %xmm2, %xmm1
1006 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1007 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1008 ; SSE2-NEXT: pslld $31, %xmm2
1009 ; SSE2-NEXT: psrad $31, %xmm2
1010 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1011 ; SSE2-NEXT: pslld $31, %xmm1
1012 ; SSE2-NEXT: psrad $31, %xmm1
1013 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
1014 ; SSE2-NEXT: movdqa %xmm2, %xmm0
1017 ; SSSE3-LABEL: saddo_v8i16:
1019 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
1020 ; SSSE3-NEXT: paddsw %xmm1, %xmm2
1021 ; SSSE3-NEXT: paddw %xmm1, %xmm0
1022 ; SSSE3-NEXT: pcmpeqw %xmm0, %xmm2
1023 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1
1024 ; SSSE3-NEXT: pxor %xmm2, %xmm1
1025 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
1026 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1027 ; SSSE3-NEXT: pslld $31, %xmm2
1028 ; SSSE3-NEXT: psrad $31, %xmm2
1029 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1030 ; SSSE3-NEXT: pslld $31, %xmm1
1031 ; SSSE3-NEXT: psrad $31, %xmm1
1032 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
1033 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
1036 ; SSE41-LABEL: saddo_v8i16:
1038 ; SSE41-NEXT: movdqa %xmm0, %xmm2
1039 ; SSE41-NEXT: paddsw %xmm1, %xmm2
1040 ; SSE41-NEXT: paddw %xmm1, %xmm0
1041 ; SSE41-NEXT: pcmpeqw %xmm0, %xmm2
1042 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1043 ; SSE41-NEXT: pxor %xmm2, %xmm1
1044 ; SSE41-NEXT: pmovzxwd {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
1045 ; SSE41-NEXT: pslld $31, %xmm2
1046 ; SSE41-NEXT: psrad $31, %xmm2
1047 ; SSE41-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1048 ; SSE41-NEXT: pslld $31, %xmm1
1049 ; SSE41-NEXT: psrad $31, %xmm1
1050 ; SSE41-NEXT: movdqa %xmm0, (%rdi)
1051 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1054 ; AVX1-LABEL: saddo_v8i16:
1056 ; AVX1-NEXT: vpaddsw %xmm1, %xmm0, %xmm2
1057 ; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm1
1058 ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm0
1059 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1060 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
1061 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm2
1062 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1063 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm0
1064 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
1065 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
1068 ; AVX2-LABEL: saddo_v8i16:
1070 ; AVX2-NEXT: vpaddsw %xmm1, %xmm0, %xmm2
1071 ; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm1
1072 ; AVX2-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm0
1073 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1074 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
1075 ; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0
1076 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
1079 ; AVX512-LABEL: saddo_v8i16:
1081 ; AVX512-NEXT: vpaddsw %xmm1, %xmm0, %xmm2
1082 ; AVX512-NEXT: vpaddw %xmm1, %xmm0, %xmm1
1083 ; AVX512-NEXT: vpcmpneqw %xmm2, %xmm1, %k1
1084 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
1085 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
1086 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
1088 %t = call {<8 x i16>, <8 x i1>} @llvm.sadd.with.overflow.v8i16(<8 x i16> %a0, <8 x i16> %a1)
1089 %val = extractvalue {<8 x i16>, <8 x i1>} %t, 0
1090 %obit = extractvalue {<8 x i16>, <8 x i1>} %t, 1
1091 %res = sext <8 x i1> %obit to <8 x i32>
1092 store <8 x i16> %val, <8 x i16>* %p2
1096 define <2 x i32> @saddo_v2i64(<2 x i64> %a0, <2 x i64> %a1, <2 x i64>* %p2) nounwind {
1097 ; SSE2-LABEL: saddo_v2i64:
1099 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1100 ; SSE2-NEXT: movdqa %xmm0, %xmm3
1101 ; SSE2-NEXT: paddq %xmm1, %xmm0
1102 ; SSE2-NEXT: pxor %xmm2, %xmm1
1103 ; SSE2-NEXT: movdqa %xmm2, %xmm4
1104 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm4
1105 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1106 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm1
1107 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1108 ; SSE2-NEXT: pand %xmm5, %xmm1
1109 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1110 ; SSE2-NEXT: por %xmm1, %xmm4
1111 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
1112 ; SSE2-NEXT: pxor %xmm1, %xmm4
1113 ; SSE2-NEXT: pxor %xmm2, %xmm3
1114 ; SSE2-NEXT: movdqa %xmm2, %xmm5
1115 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
1116 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1117 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3
1118 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1119 ; SSE2-NEXT: pand %xmm6, %xmm3
1120 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1121 ; SSE2-NEXT: por %xmm3, %xmm5
1122 ; SSE2-NEXT: pxor %xmm1, %xmm5
1123 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm4
1124 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,0,3,2]
1125 ; SSE2-NEXT: pand %xmm4, %xmm3
1126 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
1127 ; SSE2-NEXT: pxor %xmm2, %xmm0
1128 ; SSE2-NEXT: movdqa %xmm2, %xmm4
1129 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
1130 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1131 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm0
1132 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1133 ; SSE2-NEXT: pand %xmm6, %xmm0
1134 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
1135 ; SSE2-NEXT: por %xmm0, %xmm2
1136 ; SSE2-NEXT: pxor %xmm1, %xmm2
1137 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm2
1138 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,0,3,2]
1139 ; SSE2-NEXT: pand %xmm2, %xmm0
1140 ; SSE2-NEXT: pandn %xmm3, %xmm0
1141 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1144 ; SSSE3-LABEL: saddo_v2i64:
1146 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1147 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
1148 ; SSSE3-NEXT: paddq %xmm1, %xmm0
1149 ; SSSE3-NEXT: pxor %xmm2, %xmm1
1150 ; SSSE3-NEXT: movdqa %xmm2, %xmm4
1151 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4
1152 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1153 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm1
1154 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1155 ; SSSE3-NEXT: pand %xmm5, %xmm1
1156 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1157 ; SSSE3-NEXT: por %xmm1, %xmm4
1158 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1
1159 ; SSSE3-NEXT: pxor %xmm1, %xmm4
1160 ; SSSE3-NEXT: pxor %xmm2, %xmm3
1161 ; SSSE3-NEXT: movdqa %xmm2, %xmm5
1162 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
1163 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1164 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm3
1165 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1166 ; SSSE3-NEXT: pand %xmm6, %xmm3
1167 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1168 ; SSSE3-NEXT: por %xmm3, %xmm5
1169 ; SSSE3-NEXT: pxor %xmm1, %xmm5
1170 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm4
1171 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,0,3,2]
1172 ; SSSE3-NEXT: pand %xmm4, %xmm3
1173 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
1174 ; SSSE3-NEXT: pxor %xmm2, %xmm0
1175 ; SSSE3-NEXT: movdqa %xmm2, %xmm4
1176 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
1177 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1178 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm0
1179 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1180 ; SSSE3-NEXT: pand %xmm6, %xmm0
1181 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
1182 ; SSSE3-NEXT: por %xmm0, %xmm2
1183 ; SSSE3-NEXT: pxor %xmm1, %xmm2
1184 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm2
1185 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,0,3,2]
1186 ; SSSE3-NEXT: pand %xmm2, %xmm0
1187 ; SSSE3-NEXT: pandn %xmm3, %xmm0
1188 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1191 ; SSE41-LABEL: saddo_v2i64:
1193 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1194 ; SSE41-NEXT: movdqa %xmm0, %xmm3
1195 ; SSE41-NEXT: paddq %xmm1, %xmm0
1196 ; SSE41-NEXT: pxor %xmm2, %xmm1
1197 ; SSE41-NEXT: movdqa %xmm2, %xmm4
1198 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm4
1199 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1200 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm1
1201 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1202 ; SSE41-NEXT: pand %xmm5, %xmm1
1203 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1204 ; SSE41-NEXT: por %xmm1, %xmm4
1205 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1206 ; SSE41-NEXT: pxor %xmm1, %xmm4
1207 ; SSE41-NEXT: pxor %xmm2, %xmm3
1208 ; SSE41-NEXT: movdqa %xmm2, %xmm5
1209 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm5
1210 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1211 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm3
1212 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1213 ; SSE41-NEXT: pand %xmm6, %xmm3
1214 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1215 ; SSE41-NEXT: por %xmm3, %xmm5
1216 ; SSE41-NEXT: pxor %xmm1, %xmm5
1217 ; SSE41-NEXT: pcmpeqq %xmm5, %xmm4
1218 ; SSE41-NEXT: movdqa %xmm0, (%rdi)
1219 ; SSE41-NEXT: pxor %xmm2, %xmm0
1220 ; SSE41-NEXT: movdqa %xmm2, %xmm3
1221 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
1222 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
1223 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm0
1224 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1225 ; SSE41-NEXT: pand %xmm6, %xmm0
1226 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1227 ; SSE41-NEXT: por %xmm0, %xmm2
1228 ; SSE41-NEXT: pxor %xmm1, %xmm2
1229 ; SSE41-NEXT: pcmpeqq %xmm5, %xmm2
1230 ; SSE41-NEXT: pandn %xmm4, %xmm2
1231 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
1234 ; AVX1-LABEL: saddo_v2i64:
1236 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
1237 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm3
1238 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
1239 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
1240 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm5
1241 ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5
1242 ; AVX1-NEXT: vpcmpeqq %xmm3, %xmm5, %xmm3
1243 ; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm1
1244 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm0
1245 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
1246 ; AVX1-NEXT: vpcmpeqq %xmm0, %xmm5, %xmm0
1247 ; AVX1-NEXT: vpandn %xmm3, %xmm0, %xmm0
1248 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1249 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
1252 ; AVX2-LABEL: saddo_v2i64:
1254 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
1255 ; AVX2-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm3
1256 ; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
1257 ; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm3
1258 ; AVX2-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm5
1259 ; AVX2-NEXT: vpxor %xmm4, %xmm5, %xmm5
1260 ; AVX2-NEXT: vpcmpeqq %xmm3, %xmm5, %xmm3
1261 ; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm1
1262 ; AVX2-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm0
1263 ; AVX2-NEXT: vpxor %xmm4, %xmm0, %xmm0
1264 ; AVX2-NEXT: vpcmpeqq %xmm0, %xmm5, %xmm0
1265 ; AVX2-NEXT: vpandn %xmm3, %xmm0, %xmm0
1266 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1267 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
1270 ; AVX512-LABEL: saddo_v2i64:
1272 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
1273 ; AVX512-NEXT: vpcmpnltq %xmm2, %xmm1, %k0
1274 ; AVX512-NEXT: vpcmpnltq %xmm2, %xmm0, %k1
1275 ; AVX512-NEXT: kxorw %k0, %k1, %k0
1276 ; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm1
1277 ; AVX512-NEXT: vpcmpnltq %xmm2, %xmm1, %k2
1278 ; AVX512-NEXT: kxorw %k2, %k1, %k1
1279 ; AVX512-NEXT: kandnw %k1, %k0, %k1
1280 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1281 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
1282 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
1284 %t = call {<2 x i64>, <2 x i1>} @llvm.sadd.with.overflow.v2i64(<2 x i64> %a0, <2 x i64> %a1)
1285 %val = extractvalue {<2 x i64>, <2 x i1>} %t, 0
1286 %obit = extractvalue {<2 x i64>, <2 x i1>} %t, 1
1287 %res = sext <2 x i1> %obit to <2 x i32>
1288 store <2 x i64> %val, <2 x i64>* %p2
1292 define <4 x i32> @saddo_v4i24(<4 x i24> %a0, <4 x i24> %a1, <4 x i24>* %p2) nounwind {
1293 ; SSE2-LABEL: saddo_v4i24:
1295 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1296 ; SSE2-NEXT: pslld $8, %xmm1
1297 ; SSE2-NEXT: psrad $8, %xmm1
1298 ; SSE2-NEXT: pslld $8, %xmm2
1299 ; SSE2-NEXT: psrad $8, %xmm2
1300 ; SSE2-NEXT: paddd %xmm1, %xmm2
1301 ; SSE2-NEXT: movdqa %xmm2, %xmm0
1302 ; SSE2-NEXT: pslld $8, %xmm0
1303 ; SSE2-NEXT: psrad $8, %xmm0
1304 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm0
1305 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
1306 ; SSE2-NEXT: pxor %xmm1, %xmm0
1307 ; SSE2-NEXT: movd %xmm2, %eax
1308 ; SSE2-NEXT: movw %ax, (%rdi)
1309 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[3,1,2,3]
1310 ; SSE2-NEXT: movd %xmm1, %ecx
1311 ; SSE2-NEXT: movw %cx, 9(%rdi)
1312 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
1313 ; SSE2-NEXT: movd %xmm1, %edx
1314 ; SSE2-NEXT: movw %dx, 6(%rdi)
1315 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,2,3]
1316 ; SSE2-NEXT: movd %xmm1, %esi
1317 ; SSE2-NEXT: movw %si, 3(%rdi)
1318 ; SSE2-NEXT: shrl $16, %eax
1319 ; SSE2-NEXT: movb %al, 2(%rdi)
1320 ; SSE2-NEXT: shrl $16, %ecx
1321 ; SSE2-NEXT: movb %cl, 11(%rdi)
1322 ; SSE2-NEXT: shrl $16, %edx
1323 ; SSE2-NEXT: movb %dl, 8(%rdi)
1324 ; SSE2-NEXT: shrl $16, %esi
1325 ; SSE2-NEXT: movb %sil, 5(%rdi)
1328 ; SSSE3-LABEL: saddo_v4i24:
1330 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
1331 ; SSSE3-NEXT: pslld $8, %xmm1
1332 ; SSSE3-NEXT: psrad $8, %xmm1
1333 ; SSSE3-NEXT: pslld $8, %xmm2
1334 ; SSSE3-NEXT: psrad $8, %xmm2
1335 ; SSSE3-NEXT: paddd %xmm1, %xmm2
1336 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
1337 ; SSSE3-NEXT: pslld $8, %xmm0
1338 ; SSSE3-NEXT: psrad $8, %xmm0
1339 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm0
1340 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1
1341 ; SSSE3-NEXT: pxor %xmm1, %xmm0
1342 ; SSSE3-NEXT: movd %xmm2, %eax
1343 ; SSSE3-NEXT: movw %ax, (%rdi)
1344 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[3,1,2,3]
1345 ; SSSE3-NEXT: movd %xmm1, %ecx
1346 ; SSSE3-NEXT: movw %cx, 9(%rdi)
1347 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
1348 ; SSSE3-NEXT: movd %xmm1, %edx
1349 ; SSSE3-NEXT: movw %dx, 6(%rdi)
1350 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,2,3]
1351 ; SSSE3-NEXT: movd %xmm1, %esi
1352 ; SSSE3-NEXT: movw %si, 3(%rdi)
1353 ; SSSE3-NEXT: shrl $16, %eax
1354 ; SSSE3-NEXT: movb %al, 2(%rdi)
1355 ; SSSE3-NEXT: shrl $16, %ecx
1356 ; SSSE3-NEXT: movb %cl, 11(%rdi)
1357 ; SSSE3-NEXT: shrl $16, %edx
1358 ; SSSE3-NEXT: movb %dl, 8(%rdi)
1359 ; SSSE3-NEXT: shrl $16, %esi
1360 ; SSSE3-NEXT: movb %sil, 5(%rdi)
1363 ; SSE41-LABEL: saddo_v4i24:
1365 ; SSE41-NEXT: movdqa %xmm0, %xmm2
1366 ; SSE41-NEXT: pslld $8, %xmm1
1367 ; SSE41-NEXT: psrad $8, %xmm1
1368 ; SSE41-NEXT: pslld $8, %xmm2
1369 ; SSE41-NEXT: psrad $8, %xmm2
1370 ; SSE41-NEXT: paddd %xmm1, %xmm2
1371 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1372 ; SSE41-NEXT: pslld $8, %xmm0
1373 ; SSE41-NEXT: psrad $8, %xmm0
1374 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm0
1375 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1376 ; SSE41-NEXT: pxor %xmm1, %xmm0
1377 ; SSE41-NEXT: pextrd $3, %xmm2, %eax
1378 ; SSE41-NEXT: movw %ax, 9(%rdi)
1379 ; SSE41-NEXT: pextrd $2, %xmm2, %ecx
1380 ; SSE41-NEXT: movw %cx, 6(%rdi)
1381 ; SSE41-NEXT: pextrd $1, %xmm2, %edx
1382 ; SSE41-NEXT: movw %dx, 3(%rdi)
1383 ; SSE41-NEXT: movd %xmm2, %esi
1384 ; SSE41-NEXT: movw %si, (%rdi)
1385 ; SSE41-NEXT: shrl $16, %eax
1386 ; SSE41-NEXT: movb %al, 11(%rdi)
1387 ; SSE41-NEXT: shrl $16, %ecx
1388 ; SSE41-NEXT: movb %cl, 8(%rdi)
1389 ; SSE41-NEXT: shrl $16, %edx
1390 ; SSE41-NEXT: movb %dl, 5(%rdi)
1391 ; SSE41-NEXT: shrl $16, %esi
1392 ; SSE41-NEXT: movb %sil, 2(%rdi)
1395 ; AVX1-LABEL: saddo_v4i24:
1397 ; AVX1-NEXT: vpslld $8, %xmm1, %xmm1
1398 ; AVX1-NEXT: vpsrad $8, %xmm1, %xmm1
1399 ; AVX1-NEXT: vpslld $8, %xmm0, %xmm0
1400 ; AVX1-NEXT: vpsrad $8, %xmm0, %xmm0
1401 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1
1402 ; AVX1-NEXT: vpslld $8, %xmm1, %xmm0
1403 ; AVX1-NEXT: vpsrad $8, %xmm0, %xmm0
1404 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1405 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1406 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
1407 ; AVX1-NEXT: vpextrd $3, %xmm1, %eax
1408 ; AVX1-NEXT: movw %ax, 9(%rdi)
1409 ; AVX1-NEXT: vpextrd $2, %xmm1, %ecx
1410 ; AVX1-NEXT: movw %cx, 6(%rdi)
1411 ; AVX1-NEXT: vpextrd $1, %xmm1, %edx
1412 ; AVX1-NEXT: movw %dx, 3(%rdi)
1413 ; AVX1-NEXT: vmovd %xmm1, %esi
1414 ; AVX1-NEXT: movw %si, (%rdi)
1415 ; AVX1-NEXT: shrl $16, %eax
1416 ; AVX1-NEXT: movb %al, 11(%rdi)
1417 ; AVX1-NEXT: shrl $16, %ecx
1418 ; AVX1-NEXT: movb %cl, 8(%rdi)
1419 ; AVX1-NEXT: shrl $16, %edx
1420 ; AVX1-NEXT: movb %dl, 5(%rdi)
1421 ; AVX1-NEXT: shrl $16, %esi
1422 ; AVX1-NEXT: movb %sil, 2(%rdi)
1425 ; AVX2-LABEL: saddo_v4i24:
1427 ; AVX2-NEXT: vpslld $8, %xmm1, %xmm1
1428 ; AVX2-NEXT: vpsrad $8, %xmm1, %xmm1
1429 ; AVX2-NEXT: vpslld $8, %xmm0, %xmm0
1430 ; AVX2-NEXT: vpsrad $8, %xmm0, %xmm0
1431 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm1
1432 ; AVX2-NEXT: vpslld $8, %xmm1, %xmm0
1433 ; AVX2-NEXT: vpsrad $8, %xmm0, %xmm0
1434 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1435 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1436 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
1437 ; AVX2-NEXT: vpextrd $3, %xmm1, %eax
1438 ; AVX2-NEXT: movw %ax, 9(%rdi)
1439 ; AVX2-NEXT: vpextrd $2, %xmm1, %ecx
1440 ; AVX2-NEXT: movw %cx, 6(%rdi)
1441 ; AVX2-NEXT: vpextrd $1, %xmm1, %edx
1442 ; AVX2-NEXT: movw %dx, 3(%rdi)
1443 ; AVX2-NEXT: vmovd %xmm1, %esi
1444 ; AVX2-NEXT: movw %si, (%rdi)
1445 ; AVX2-NEXT: shrl $16, %eax
1446 ; AVX2-NEXT: movb %al, 11(%rdi)
1447 ; AVX2-NEXT: shrl $16, %ecx
1448 ; AVX2-NEXT: movb %cl, 8(%rdi)
1449 ; AVX2-NEXT: shrl $16, %edx
1450 ; AVX2-NEXT: movb %dl, 5(%rdi)
1451 ; AVX2-NEXT: shrl $16, %esi
1452 ; AVX2-NEXT: movb %sil, 2(%rdi)
1455 ; AVX512-LABEL: saddo_v4i24:
1457 ; AVX512-NEXT: vpslld $8, %xmm1, %xmm1
1458 ; AVX512-NEXT: vpsrad $8, %xmm1, %xmm1
1459 ; AVX512-NEXT: vpslld $8, %xmm0, %xmm0
1460 ; AVX512-NEXT: vpsrad $8, %xmm0, %xmm0
1461 ; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm1
1462 ; AVX512-NEXT: vpslld $8, %xmm1, %xmm0
1463 ; AVX512-NEXT: vpsrad $8, %xmm0, %xmm0
1464 ; AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1465 ; AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
1466 ; AVX512-NEXT: vpextrd $3, %xmm1, %eax
1467 ; AVX512-NEXT: movw %ax, 9(%rdi)
1468 ; AVX512-NEXT: vpextrd $2, %xmm1, %ecx
1469 ; AVX512-NEXT: movw %cx, 6(%rdi)
1470 ; AVX512-NEXT: vpextrd $1, %xmm1, %edx
1471 ; AVX512-NEXT: movw %dx, 3(%rdi)
1472 ; AVX512-NEXT: vmovd %xmm1, %esi
1473 ; AVX512-NEXT: movw %si, (%rdi)
1474 ; AVX512-NEXT: shrl $16, %eax
1475 ; AVX512-NEXT: movb %al, 11(%rdi)
1476 ; AVX512-NEXT: shrl $16, %ecx
1477 ; AVX512-NEXT: movb %cl, 8(%rdi)
1478 ; AVX512-NEXT: shrl $16, %edx
1479 ; AVX512-NEXT: movb %dl, 5(%rdi)
1480 ; AVX512-NEXT: shrl $16, %esi
1481 ; AVX512-NEXT: movb %sil, 2(%rdi)
1483 %t = call {<4 x i24>, <4 x i1>} @llvm.sadd.with.overflow.v4i24(<4 x i24> %a0, <4 x i24> %a1)
1484 %val = extractvalue {<4 x i24>, <4 x i1>} %t, 0
1485 %obit = extractvalue {<4 x i24>, <4 x i1>} %t, 1
1486 %res = sext <4 x i1> %obit to <4 x i32>
1487 store <4 x i24> %val, <4 x i24>* %p2
1491 define <4 x i32> @saddo_v4i1(<4 x i1> %a0, <4 x i1> %a1, <4 x i1>* %p2) nounwind {
1492 ; SSE-LABEL: saddo_v4i1:
1494 ; SSE-NEXT: pslld $31, %xmm1
1495 ; SSE-NEXT: psrad $31, %xmm1
1496 ; SSE-NEXT: pslld $31, %xmm0
1497 ; SSE-NEXT: psrad $31, %xmm0
1498 ; SSE-NEXT: paddd %xmm1, %xmm0
1499 ; SSE-NEXT: movdqa %xmm0, %xmm1
1500 ; SSE-NEXT: pslld $31, %xmm1
1501 ; SSE-NEXT: psrad $31, %xmm1
1502 ; SSE-NEXT: pcmpeqd %xmm1, %xmm0
1503 ; SSE-NEXT: pcmpeqd %xmm2, %xmm2
1504 ; SSE-NEXT: pxor %xmm2, %xmm0
1505 ; SSE-NEXT: movmskps %xmm1, %eax
1506 ; SSE-NEXT: movb %al, (%rdi)
1509 ; AVX1-LABEL: saddo_v4i1:
1511 ; AVX1-NEXT: vpslld $31, %xmm1, %xmm1
1512 ; AVX1-NEXT: vpsrad $31, %xmm1, %xmm1
1513 ; AVX1-NEXT: vpslld $31, %xmm0, %xmm0
1514 ; AVX1-NEXT: vpsrad $31, %xmm0, %xmm0
1515 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0
1516 ; AVX1-NEXT: vpslld $31, %xmm0, %xmm1
1517 ; AVX1-NEXT: vpsrad $31, %xmm1, %xmm1
1518 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
1519 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1520 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
1521 ; AVX1-NEXT: vmovmskps %xmm1, %eax
1522 ; AVX1-NEXT: movb %al, (%rdi)
1525 ; AVX2-LABEL: saddo_v4i1:
1527 ; AVX2-NEXT: vpslld $31, %xmm1, %xmm1
1528 ; AVX2-NEXT: vpsrad $31, %xmm1, %xmm1
1529 ; AVX2-NEXT: vpslld $31, %xmm0, %xmm0
1530 ; AVX2-NEXT: vpsrad $31, %xmm0, %xmm0
1531 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0
1532 ; AVX2-NEXT: vpslld $31, %xmm0, %xmm1
1533 ; AVX2-NEXT: vpsrad $31, %xmm1, %xmm1
1534 ; AVX2-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
1535 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1536 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
1537 ; AVX2-NEXT: vmovmskps %xmm1, %eax
1538 ; AVX2-NEXT: movb %al, (%rdi)
1541 ; AVX512-LABEL: saddo_v4i1:
1543 ; AVX512-NEXT: vpslld $31, %xmm1, %xmm1
1544 ; AVX512-NEXT: vpslld $31, %xmm0, %xmm0
1545 ; AVX512-NEXT: vpor %xmm1, %xmm0, %xmm2
1546 ; AVX512-NEXT: vptestmd %xmm0, %xmm0, %k0
1547 ; AVX512-NEXT: vptestmd %xmm1, %xmm1, %k1
1548 ; AVX512-NEXT: vptestmd %xmm2, %xmm2, %k2
1549 ; AVX512-NEXT: kxorw %k1, %k0, %k0
1550 ; AVX512-NEXT: kxorw %k2, %k0, %k1
1551 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1552 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
1553 ; AVX512-NEXT: kmovd %k0, %eax
1554 ; AVX512-NEXT: movb %al, (%rdi)
1556 %t = call {<4 x i1>, <4 x i1>} @llvm.sadd.with.overflow.v4i1(<4 x i1> %a0, <4 x i1> %a1)
1557 %val = extractvalue {<4 x i1>, <4 x i1>} %t, 0
1558 %obit = extractvalue {<4 x i1>, <4 x i1>} %t, 1
1559 %res = sext <4 x i1> %obit to <4 x i32>
1560 store <4 x i1> %val, <4 x i1>* %p2
1564 define <2 x i32> @saddo_v2i128(<2 x i128> %a0, <2 x i128> %a1, <2 x i128>* %p2) nounwind {
1565 ; SSE2-LABEL: saddo_v2i128:
1567 ; SSE2-NEXT: pushq %rbp
1568 ; SSE2-NEXT: pushq %rbx
1569 ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %r11
1570 ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %r10
1571 ; SSE2-NEXT: testq %r9, %r9
1572 ; SSE2-NEXT: setns %al
1573 ; SSE2-NEXT: testq %rsi, %rsi
1574 ; SSE2-NEXT: setns %bl
1575 ; SSE2-NEXT: cmpb %al, %bl
1576 ; SSE2-NEXT: sete %bpl
1577 ; SSE2-NEXT: addq %r8, %rdi
1578 ; SSE2-NEXT: adcq %r9, %rsi
1579 ; SSE2-NEXT: setns %al
1580 ; SSE2-NEXT: cmpb %al, %bl
1581 ; SSE2-NEXT: setne %al
1582 ; SSE2-NEXT: andb %bpl, %al
1583 ; SSE2-NEXT: addq {{[0-9]+}}(%rsp), %rdx
1584 ; SSE2-NEXT: movq %rcx, %rbp
1585 ; SSE2-NEXT: adcq %r10, %rbp
1586 ; SSE2-NEXT: setns %bl
1587 ; SSE2-NEXT: testq %rcx, %rcx
1588 ; SSE2-NEXT: setns %cl
1589 ; SSE2-NEXT: cmpb %bl, %cl
1590 ; SSE2-NEXT: setne %r8b
1591 ; SSE2-NEXT: testq %r10, %r10
1592 ; SSE2-NEXT: setns %bl
1593 ; SSE2-NEXT: cmpb %bl, %cl
1594 ; SSE2-NEXT: sete %cl
1595 ; SSE2-NEXT: andb %r8b, %cl
1596 ; SSE2-NEXT: movzbl %cl, %ecx
1597 ; SSE2-NEXT: negl %ecx
1598 ; SSE2-NEXT: movd %ecx, %xmm1
1599 ; SSE2-NEXT: movzbl %al, %eax
1600 ; SSE2-NEXT: negl %eax
1601 ; SSE2-NEXT: movd %eax, %xmm0
1602 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1603 ; SSE2-NEXT: movq %rdx, 16(%r11)
1604 ; SSE2-NEXT: movq %rdi, (%r11)
1605 ; SSE2-NEXT: movq %rbp, 24(%r11)
1606 ; SSE2-NEXT: movq %rsi, 8(%r11)
1607 ; SSE2-NEXT: popq %rbx
1608 ; SSE2-NEXT: popq %rbp
1611 ; SSSE3-LABEL: saddo_v2i128:
1613 ; SSSE3-NEXT: pushq %rbp
1614 ; SSSE3-NEXT: pushq %rbx
1615 ; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %r11
1616 ; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %r10
1617 ; SSSE3-NEXT: testq %r9, %r9
1618 ; SSSE3-NEXT: setns %al
1619 ; SSSE3-NEXT: testq %rsi, %rsi
1620 ; SSSE3-NEXT: setns %bl
1621 ; SSSE3-NEXT: cmpb %al, %bl
1622 ; SSSE3-NEXT: sete %bpl
1623 ; SSSE3-NEXT: addq %r8, %rdi
1624 ; SSSE3-NEXT: adcq %r9, %rsi
1625 ; SSSE3-NEXT: setns %al
1626 ; SSSE3-NEXT: cmpb %al, %bl
1627 ; SSSE3-NEXT: setne %al
1628 ; SSSE3-NEXT: andb %bpl, %al
1629 ; SSSE3-NEXT: addq {{[0-9]+}}(%rsp), %rdx
1630 ; SSSE3-NEXT: movq %rcx, %rbp
1631 ; SSSE3-NEXT: adcq %r10, %rbp
1632 ; SSSE3-NEXT: setns %bl
1633 ; SSSE3-NEXT: testq %rcx, %rcx
1634 ; SSSE3-NEXT: setns %cl
1635 ; SSSE3-NEXT: cmpb %bl, %cl
1636 ; SSSE3-NEXT: setne %r8b
1637 ; SSSE3-NEXT: testq %r10, %r10
1638 ; SSSE3-NEXT: setns %bl
1639 ; SSSE3-NEXT: cmpb %bl, %cl
1640 ; SSSE3-NEXT: sete %cl
1641 ; SSSE3-NEXT: andb %r8b, %cl
1642 ; SSSE3-NEXT: movzbl %cl, %ecx
1643 ; SSSE3-NEXT: negl %ecx
1644 ; SSSE3-NEXT: movd %ecx, %xmm1
1645 ; SSSE3-NEXT: movzbl %al, %eax
1646 ; SSSE3-NEXT: negl %eax
1647 ; SSSE3-NEXT: movd %eax, %xmm0
1648 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1649 ; SSSE3-NEXT: movq %rdx, 16(%r11)
1650 ; SSSE3-NEXT: movq %rdi, (%r11)
1651 ; SSSE3-NEXT: movq %rbp, 24(%r11)
1652 ; SSSE3-NEXT: movq %rsi, 8(%r11)
1653 ; SSSE3-NEXT: popq %rbx
1654 ; SSSE3-NEXT: popq %rbp
1657 ; SSE41-LABEL: saddo_v2i128:
1659 ; SSE41-NEXT: pushq %rbp
1660 ; SSE41-NEXT: pushq %rbx
1661 ; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %r11
1662 ; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %r10
1663 ; SSE41-NEXT: testq %r9, %r9
1664 ; SSE41-NEXT: setns %al
1665 ; SSE41-NEXT: testq %rsi, %rsi
1666 ; SSE41-NEXT: setns %bl
1667 ; SSE41-NEXT: cmpb %al, %bl
1668 ; SSE41-NEXT: sete %bpl
1669 ; SSE41-NEXT: addq %r8, %rdi
1670 ; SSE41-NEXT: adcq %r9, %rsi
1671 ; SSE41-NEXT: setns %al
1672 ; SSE41-NEXT: cmpb %al, %bl
1673 ; SSE41-NEXT: setne %al
1674 ; SSE41-NEXT: andb %bpl, %al
1675 ; SSE41-NEXT: addq {{[0-9]+}}(%rsp), %rdx
1676 ; SSE41-NEXT: movq %rcx, %rbp
1677 ; SSE41-NEXT: adcq %r10, %rbp
1678 ; SSE41-NEXT: setns %bl
1679 ; SSE41-NEXT: testq %rcx, %rcx
1680 ; SSE41-NEXT: setns %cl
1681 ; SSE41-NEXT: cmpb %bl, %cl
1682 ; SSE41-NEXT: setne %r8b
1683 ; SSE41-NEXT: testq %r10, %r10
1684 ; SSE41-NEXT: setns %bl
1685 ; SSE41-NEXT: cmpb %bl, %cl
1686 ; SSE41-NEXT: sete %cl
1687 ; SSE41-NEXT: andb %r8b, %cl
1688 ; SSE41-NEXT: movzbl %cl, %ecx
1689 ; SSE41-NEXT: negl %ecx
1690 ; SSE41-NEXT: movzbl %al, %eax
1691 ; SSE41-NEXT: negl %eax
1692 ; SSE41-NEXT: movd %eax, %xmm0
1693 ; SSE41-NEXT: pinsrd $1, %ecx, %xmm0
1694 ; SSE41-NEXT: movq %rdx, 16(%r11)
1695 ; SSE41-NEXT: movq %rdi, (%r11)
1696 ; SSE41-NEXT: movq %rbp, 24(%r11)
1697 ; SSE41-NEXT: movq %rsi, 8(%r11)
1698 ; SSE41-NEXT: popq %rbx
1699 ; SSE41-NEXT: popq %rbp
1702 ; AVX1-LABEL: saddo_v2i128:
1704 ; AVX1-NEXT: pushq %rbp
1705 ; AVX1-NEXT: pushq %rbx
1706 ; AVX1-NEXT: movq {{[0-9]+}}(%rsp), %r11
1707 ; AVX1-NEXT: movq {{[0-9]+}}(%rsp), %r10
1708 ; AVX1-NEXT: testq %r9, %r9
1709 ; AVX1-NEXT: setns %al
1710 ; AVX1-NEXT: testq %rsi, %rsi
1711 ; AVX1-NEXT: setns %bl
1712 ; AVX1-NEXT: cmpb %al, %bl
1713 ; AVX1-NEXT: sete %bpl
1714 ; AVX1-NEXT: addq %r8, %rdi
1715 ; AVX1-NEXT: adcq %r9, %rsi
1716 ; AVX1-NEXT: setns %al
1717 ; AVX1-NEXT: cmpb %al, %bl
1718 ; AVX1-NEXT: setne %al
1719 ; AVX1-NEXT: andb %bpl, %al
1720 ; AVX1-NEXT: addq {{[0-9]+}}(%rsp), %rdx
1721 ; AVX1-NEXT: movq %rcx, %rbp
1722 ; AVX1-NEXT: adcq %r10, %rbp
1723 ; AVX1-NEXT: setns %bl
1724 ; AVX1-NEXT: testq %rcx, %rcx
1725 ; AVX1-NEXT: setns %cl
1726 ; AVX1-NEXT: cmpb %bl, %cl
1727 ; AVX1-NEXT: setne %r8b
1728 ; AVX1-NEXT: testq %r10, %r10
1729 ; AVX1-NEXT: setns %bl
1730 ; AVX1-NEXT: cmpb %bl, %cl
1731 ; AVX1-NEXT: sete %cl
1732 ; AVX1-NEXT: andb %r8b, %cl
1733 ; AVX1-NEXT: movzbl %cl, %ecx
1734 ; AVX1-NEXT: negl %ecx
1735 ; AVX1-NEXT: movzbl %al, %eax
1736 ; AVX1-NEXT: negl %eax
1737 ; AVX1-NEXT: vmovd %eax, %xmm0
1738 ; AVX1-NEXT: vpinsrd $1, %ecx, %xmm0, %xmm0
1739 ; AVX1-NEXT: movq %rdx, 16(%r11)
1740 ; AVX1-NEXT: movq %rdi, (%r11)
1741 ; AVX1-NEXT: movq %rbp, 24(%r11)
1742 ; AVX1-NEXT: movq %rsi, 8(%r11)
1743 ; AVX1-NEXT: popq %rbx
1744 ; AVX1-NEXT: popq %rbp
1747 ; AVX2-LABEL: saddo_v2i128:
1749 ; AVX2-NEXT: pushq %rbp
1750 ; AVX2-NEXT: pushq %rbx
1751 ; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %r11
1752 ; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %r10
1753 ; AVX2-NEXT: testq %r9, %r9
1754 ; AVX2-NEXT: setns %al
1755 ; AVX2-NEXT: testq %rsi, %rsi
1756 ; AVX2-NEXT: setns %bl
1757 ; AVX2-NEXT: cmpb %al, %bl
1758 ; AVX2-NEXT: sete %bpl
1759 ; AVX2-NEXT: addq %r8, %rdi
1760 ; AVX2-NEXT: adcq %r9, %rsi
1761 ; AVX2-NEXT: setns %al
1762 ; AVX2-NEXT: cmpb %al, %bl
1763 ; AVX2-NEXT: setne %al
1764 ; AVX2-NEXT: andb %bpl, %al
1765 ; AVX2-NEXT: addq {{[0-9]+}}(%rsp), %rdx
1766 ; AVX2-NEXT: movq %rcx, %rbp
1767 ; AVX2-NEXT: adcq %r10, %rbp
1768 ; AVX2-NEXT: setns %bl
1769 ; AVX2-NEXT: testq %rcx, %rcx
1770 ; AVX2-NEXT: setns %cl
1771 ; AVX2-NEXT: cmpb %bl, %cl
1772 ; AVX2-NEXT: setne %r8b
1773 ; AVX2-NEXT: testq %r10, %r10
1774 ; AVX2-NEXT: setns %bl
1775 ; AVX2-NEXT: cmpb %bl, %cl
1776 ; AVX2-NEXT: sete %cl
1777 ; AVX2-NEXT: andb %r8b, %cl
1778 ; AVX2-NEXT: movzbl %cl, %ecx
1779 ; AVX2-NEXT: negl %ecx
1780 ; AVX2-NEXT: movzbl %al, %eax
1781 ; AVX2-NEXT: negl %eax
1782 ; AVX2-NEXT: vmovd %eax, %xmm0
1783 ; AVX2-NEXT: vpinsrd $1, %ecx, %xmm0, %xmm0
1784 ; AVX2-NEXT: movq %rdx, 16(%r11)
1785 ; AVX2-NEXT: movq %rdi, (%r11)
1786 ; AVX2-NEXT: movq %rbp, 24(%r11)
1787 ; AVX2-NEXT: movq %rsi, 8(%r11)
1788 ; AVX2-NEXT: popq %rbx
1789 ; AVX2-NEXT: popq %rbp
1792 ; AVX512-LABEL: saddo_v2i128:
1794 ; AVX512-NEXT: pushq %rbp
1795 ; AVX512-NEXT: pushq %rbx
1796 ; AVX512-NEXT: movq {{[0-9]+}}(%rsp), %r11
1797 ; AVX512-NEXT: movq {{[0-9]+}}(%rsp), %r10
1798 ; AVX512-NEXT: testq %r9, %r9
1799 ; AVX512-NEXT: setns %al
1800 ; AVX512-NEXT: testq %rsi, %rsi
1801 ; AVX512-NEXT: setns %bl
1802 ; AVX512-NEXT: cmpb %al, %bl
1803 ; AVX512-NEXT: sete %bpl
1804 ; AVX512-NEXT: addq %r8, %rdi
1805 ; AVX512-NEXT: adcq %r9, %rsi
1806 ; AVX512-NEXT: setns %al
1807 ; AVX512-NEXT: cmpb %al, %bl
1808 ; AVX512-NEXT: setne %al
1809 ; AVX512-NEXT: andb %bpl, %al
1810 ; AVX512-NEXT: addq {{[0-9]+}}(%rsp), %rdx
1811 ; AVX512-NEXT: movq %rcx, %rbp
1812 ; AVX512-NEXT: adcq %r10, %rbp
1813 ; AVX512-NEXT: setns %bl
1814 ; AVX512-NEXT: testq %rcx, %rcx
1815 ; AVX512-NEXT: setns %cl
1816 ; AVX512-NEXT: cmpb %bl, %cl
1817 ; AVX512-NEXT: setne %r8b
1818 ; AVX512-NEXT: testq %r10, %r10
1819 ; AVX512-NEXT: setns %bl
1820 ; AVX512-NEXT: cmpb %bl, %cl
1821 ; AVX512-NEXT: sete %cl
1822 ; AVX512-NEXT: andb %r8b, %cl
1823 ; AVX512-NEXT: kmovd %ecx, %k0
1824 ; AVX512-NEXT: kshiftlw $1, %k0, %k0
1825 ; AVX512-NEXT: andl $1, %eax
1826 ; AVX512-NEXT: kmovw %eax, %k1
1827 ; AVX512-NEXT: korw %k0, %k1, %k1
1828 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1829 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
1830 ; AVX512-NEXT: movq %rdx, 16(%r11)
1831 ; AVX512-NEXT: movq %rdi, (%r11)
1832 ; AVX512-NEXT: movq %rbp, 24(%r11)
1833 ; AVX512-NEXT: movq %rsi, 8(%r11)
1834 ; AVX512-NEXT: popq %rbx
1835 ; AVX512-NEXT: popq %rbp
1837 %t = call {<2 x i128>, <2 x i1>} @llvm.sadd.with.overflow.v2i128(<2 x i128> %a0, <2 x i128> %a1)
1838 %val = extractvalue {<2 x i128>, <2 x i1>} %t, 0
1839 %obit = extractvalue {<2 x i128>, <2 x i1>} %t, 1
1840 %res = sext <2 x i1> %obit to <2 x i32>
1841 store <2 x i128> %val, <2 x i128>* %p2