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