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