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