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