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.ssub.with.overflow.v1i32(<1 x i32>, <1 x i32>)
10 declare {<2 x i32>, <2 x i1>} @llvm.ssub.with.overflow.v2i32(<2 x i32>, <2 x i32>)
11 declare {<3 x i32>, <3 x i1>} @llvm.ssub.with.overflow.v3i32(<3 x i32>, <3 x i32>)
12 declare {<4 x i32>, <4 x i1>} @llvm.ssub.with.overflow.v4i32(<4 x i32>, <4 x i32>)
13 declare {<6 x i32>, <6 x i1>} @llvm.ssub.with.overflow.v6i32(<6 x i32>, <6 x i32>)
14 declare {<8 x i32>, <8 x i1>} @llvm.ssub.with.overflow.v8i32(<8 x i32>, <8 x i32>)
15 declare {<16 x i32>, <16 x i1>} @llvm.ssub.with.overflow.v16i32(<16 x i32>, <16 x i32>)
17 declare {<16 x i8>, <16 x i1>} @llvm.ssub.with.overflow.v16i8(<16 x i8>, <16 x i8>)
18 declare {<8 x i16>, <8 x i1>} @llvm.ssub.with.overflow.v8i16(<8 x i16>, <8 x i16>)
19 declare {<2 x i64>, <2 x i1>} @llvm.ssub.with.overflow.v2i64(<2 x i64>, <2 x i64>)
21 declare {<4 x i24>, <4 x i1>} @llvm.ssub.with.overflow.v4i24(<4 x i24>, <4 x i24>)
22 declare {<4 x i1>, <4 x i1>} @llvm.ssub.with.overflow.v4i1(<4 x i1>, <4 x i1>)
23 declare {<2 x i128>, <2 x i1>} @llvm.ssub.with.overflow.v2i128(<2 x i128>, <2 x i128>)
25 define <1 x i32> @ssubo_v1i32(<1 x i32> %a0, <1 x i32> %a1, <1 x i32>* %p2) nounwind {
26 ; SSE-LABEL: ssubo_v1i32:
28 ; SSE-NEXT: xorl %eax, %eax
29 ; SSE-NEXT: subl %esi, %edi
32 ; SSE-NEXT: movl %edi, (%rdx)
35 ; AVX-LABEL: ssubo_v1i32:
37 ; AVX-NEXT: xorl %eax, %eax
38 ; AVX-NEXT: subl %esi, %edi
41 ; AVX-NEXT: movl %edi, (%rdx)
43 %t = call {<1 x i32>, <1 x i1>} @llvm.ssub.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> @ssubo_v2i32(<2 x i32> %a0, <2 x i32> %a1, <2 x i32>* %p2) nounwind {
52 ; SSE-LABEL: ssubo_v2i32:
54 ; SSE-NEXT: pxor %xmm2, %xmm2
55 ; SSE-NEXT: movdqa %xmm0, %xmm3
56 ; SSE-NEXT: psubd %xmm1, %xmm3
57 ; SSE-NEXT: pcmpgtd %xmm2, %xmm1
58 ; SSE-NEXT: pcmpgtd %xmm3, %xmm0
59 ; SSE-NEXT: pxor %xmm1, %xmm0
60 ; SSE-NEXT: movq %xmm3, (%rdi)
63 ; AVX1-LABEL: ssubo_v2i32:
65 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
66 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2
67 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
68 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
69 ; AVX1-NEXT: vpxor %xmm0, %xmm2, %xmm0
70 ; AVX1-NEXT: vmovq %xmm1, (%rdi)
73 ; AVX2-LABEL: ssubo_v2i32:
75 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
76 ; AVX2-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2
77 ; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm1
78 ; AVX2-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
79 ; AVX2-NEXT: vpxor %xmm0, %xmm2, %xmm0
80 ; AVX2-NEXT: vmovq %xmm1, (%rdi)
83 ; AVX512-LABEL: ssubo_v2i32:
85 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
86 ; AVX512-NEXT: vpcmpgtd %xmm2, %xmm1, %k0
87 ; AVX512-NEXT: vpsubd %xmm1, %xmm0, %xmm1
88 ; AVX512-NEXT: vpcmpgtd %xmm1, %xmm0, %k1
89 ; AVX512-NEXT: kxorw %k1, %k0, %k1
90 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
91 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
92 ; AVX512-NEXT: vmovq %xmm1, (%rdi)
94 %t = call {<2 x i32>, <2 x i1>} @llvm.ssub.with.overflow.v2i32(<2 x i32> %a0, <2 x i32> %a1)
95 %val = extractvalue {<2 x i32>, <2 x i1>} %t, 0
96 %obit = extractvalue {<2 x i32>, <2 x i1>} %t, 1
97 %res = sext <2 x i1> %obit to <2 x i32>
98 store <2 x i32> %val, <2 x i32>* %p2
102 define <3 x i32> @ssubo_v3i32(<3 x i32> %a0, <3 x i32> %a1, <3 x i32>* %p2) nounwind {
103 ; SSE2-LABEL: ssubo_v3i32:
105 ; SSE2-NEXT: pxor %xmm2, %xmm2
106 ; SSE2-NEXT: movdqa %xmm0, %xmm3
107 ; SSE2-NEXT: psubd %xmm1, %xmm3
108 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm1
109 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm0
110 ; SSE2-NEXT: pxor %xmm1, %xmm0
111 ; SSE2-NEXT: movq %xmm3, (%rdi)
112 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[2,3,0,1]
113 ; SSE2-NEXT: movd %xmm1, 8(%rdi)
116 ; SSSE3-LABEL: ssubo_v3i32:
118 ; SSSE3-NEXT: pxor %xmm2, %xmm2
119 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
120 ; SSSE3-NEXT: psubd %xmm1, %xmm3
121 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm1
122 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm0
123 ; SSSE3-NEXT: pxor %xmm1, %xmm0
124 ; SSSE3-NEXT: movq %xmm3, (%rdi)
125 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm3[2,3,0,1]
126 ; SSSE3-NEXT: movd %xmm1, 8(%rdi)
129 ; SSE41-LABEL: ssubo_v3i32:
131 ; SSE41-NEXT: pxor %xmm2, %xmm2
132 ; SSE41-NEXT: movdqa %xmm0, %xmm3
133 ; SSE41-NEXT: psubd %xmm1, %xmm3
134 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm1
135 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm0
136 ; SSE41-NEXT: pxor %xmm1, %xmm0
137 ; SSE41-NEXT: pextrd $2, %xmm3, 8(%rdi)
138 ; SSE41-NEXT: movq %xmm3, (%rdi)
141 ; AVX1-LABEL: ssubo_v3i32:
143 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
144 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2
145 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
146 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
147 ; AVX1-NEXT: vpxor %xmm0, %xmm2, %xmm0
148 ; AVX1-NEXT: vpextrd $2, %xmm1, 8(%rdi)
149 ; AVX1-NEXT: vmovq %xmm1, (%rdi)
152 ; AVX2-LABEL: ssubo_v3i32:
154 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
155 ; AVX2-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2
156 ; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm1
157 ; AVX2-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
158 ; AVX2-NEXT: vpxor %xmm0, %xmm2, %xmm0
159 ; AVX2-NEXT: vpextrd $2, %xmm1, 8(%rdi)
160 ; AVX2-NEXT: vmovq %xmm1, (%rdi)
163 ; AVX512-LABEL: ssubo_v3i32:
165 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
166 ; AVX512-NEXT: vpcmpgtd %xmm2, %xmm1, %k0
167 ; AVX512-NEXT: vpsubd %xmm1, %xmm0, %xmm1
168 ; AVX512-NEXT: vpcmpgtd %xmm1, %xmm0, %k1
169 ; AVX512-NEXT: kxorw %k1, %k0, %k1
170 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
171 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
172 ; AVX512-NEXT: vpextrd $2, %xmm1, 8(%rdi)
173 ; AVX512-NEXT: vmovq %xmm1, (%rdi)
175 %t = call {<3 x i32>, <3 x i1>} @llvm.ssub.with.overflow.v3i32(<3 x i32> %a0, <3 x i32> %a1)
176 %val = extractvalue {<3 x i32>, <3 x i1>} %t, 0
177 %obit = extractvalue {<3 x i32>, <3 x i1>} %t, 1
178 %res = sext <3 x i1> %obit to <3 x i32>
179 store <3 x i32> %val, <3 x i32>* %p2
183 define <4 x i32> @ssubo_v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i32>* %p2) nounwind {
184 ; SSE-LABEL: ssubo_v4i32:
186 ; SSE-NEXT: pxor %xmm2, %xmm2
187 ; SSE-NEXT: movdqa %xmm0, %xmm3
188 ; SSE-NEXT: psubd %xmm1, %xmm3
189 ; SSE-NEXT: pcmpgtd %xmm2, %xmm1
190 ; SSE-NEXT: pcmpgtd %xmm3, %xmm0
191 ; SSE-NEXT: pxor %xmm1, %xmm0
192 ; SSE-NEXT: movdqa %xmm3, (%rdi)
195 ; AVX1-LABEL: ssubo_v4i32:
197 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
198 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2
199 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
200 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
201 ; AVX1-NEXT: vpxor %xmm0, %xmm2, %xmm0
202 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
205 ; AVX2-LABEL: ssubo_v4i32:
207 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
208 ; AVX2-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2
209 ; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm1
210 ; AVX2-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
211 ; AVX2-NEXT: vpxor %xmm0, %xmm2, %xmm0
212 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
215 ; AVX512-LABEL: ssubo_v4i32:
217 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
218 ; AVX512-NEXT: vpcmpgtd %xmm2, %xmm1, %k0
219 ; AVX512-NEXT: vpsubd %xmm1, %xmm0, %xmm1
220 ; AVX512-NEXT: vpcmpgtd %xmm1, %xmm0, %k1
221 ; AVX512-NEXT: kxorw %k1, %k0, %k1
222 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
223 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
224 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
226 %t = call {<4 x i32>, <4 x i1>} @llvm.ssub.with.overflow.v4i32(<4 x i32> %a0, <4 x i32> %a1)
227 %val = extractvalue {<4 x i32>, <4 x i1>} %t, 0
228 %obit = extractvalue {<4 x i32>, <4 x i1>} %t, 1
229 %res = sext <4 x i1> %obit to <4 x i32>
230 store <4 x i32> %val, <4 x i32>* %p2
234 define <6 x i32> @ssubo_v6i32(<6 x i32> %a0, <6 x i32> %a1, <6 x i32>* %p2) nounwind {
235 ; SSE2-LABEL: ssubo_v6i32:
237 ; SSE2-NEXT: movq %rdi, %rax
238 ; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
239 ; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
240 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
241 ; SSE2-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
242 ; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
243 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
244 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
245 ; SSE2-NEXT: movd %r8d, %xmm1
246 ; SSE2-NEXT: movd %ecx, %xmm2
247 ; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
248 ; SSE2-NEXT: movd %edx, %xmm1
249 ; SSE2-NEXT: movd %esi, %xmm3
250 ; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
251 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm2[0]
252 ; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
253 ; SSE2-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
254 ; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
255 ; SSE2-NEXT: movd %r9d, %xmm1
256 ; SSE2-NEXT: movd {{.*#+}} xmm4 = mem[0],zero,zero,zero
257 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]
258 ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %rcx
259 ; SSE2-NEXT: movdqa %xmm3, %xmm4
260 ; SSE2-NEXT: psubd %xmm0, %xmm4
261 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm3
262 ; SSE2-NEXT: pxor %xmm5, %xmm5
263 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm0
264 ; SSE2-NEXT: pxor %xmm3, %xmm0
265 ; SSE2-NEXT: movdqa %xmm1, %xmm3
266 ; SSE2-NEXT: psubd %xmm2, %xmm3
267 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm1
268 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm2
269 ; SSE2-NEXT: pxor %xmm1, %xmm2
270 ; SSE2-NEXT: movq %xmm3, 16(%rcx)
271 ; SSE2-NEXT: movdqa %xmm4, (%rcx)
272 ; SSE2-NEXT: movq %xmm2, 16(%rdi)
273 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
276 ; SSSE3-LABEL: ssubo_v6i32:
278 ; SSSE3-NEXT: movq %rdi, %rax
279 ; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
280 ; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
281 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
282 ; SSSE3-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
283 ; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
284 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
285 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
286 ; SSSE3-NEXT: movd %r8d, %xmm1
287 ; SSSE3-NEXT: movd %ecx, %xmm2
288 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
289 ; SSSE3-NEXT: movd %edx, %xmm1
290 ; SSSE3-NEXT: movd %esi, %xmm3
291 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
292 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm2[0]
293 ; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
294 ; SSSE3-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
295 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
296 ; SSSE3-NEXT: movd %r9d, %xmm1
297 ; SSSE3-NEXT: movd {{.*#+}} xmm4 = mem[0],zero,zero,zero
298 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]
299 ; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %rcx
300 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
301 ; SSSE3-NEXT: psubd %xmm0, %xmm4
302 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm3
303 ; SSSE3-NEXT: pxor %xmm5, %xmm5
304 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm0
305 ; SSSE3-NEXT: pxor %xmm3, %xmm0
306 ; SSSE3-NEXT: movdqa %xmm1, %xmm3
307 ; SSSE3-NEXT: psubd %xmm2, %xmm3
308 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm1
309 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm2
310 ; SSSE3-NEXT: pxor %xmm1, %xmm2
311 ; SSSE3-NEXT: movq %xmm3, 16(%rcx)
312 ; SSSE3-NEXT: movdqa %xmm4, (%rcx)
313 ; SSSE3-NEXT: movq %xmm2, 16(%rdi)
314 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
317 ; SSE41-LABEL: ssubo_v6i32:
319 ; SSE41-NEXT: movq %rdi, %rax
320 ; SSE41-NEXT: movd %esi, %xmm1
321 ; SSE41-NEXT: pinsrd $1, %edx, %xmm1
322 ; SSE41-NEXT: pinsrd $2, %ecx, %xmm1
323 ; SSE41-NEXT: pinsrd $3, %r8d, %xmm1
324 ; SSE41-NEXT: movd %r9d, %xmm0
325 ; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm0
326 ; SSE41-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
327 ; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm2
328 ; SSE41-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
329 ; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm3
330 ; SSE41-NEXT: pinsrd $2, {{[0-9]+}}(%rsp), %xmm3
331 ; SSE41-NEXT: pinsrd $3, {{[0-9]+}}(%rsp), %xmm3
332 ; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %rcx
333 ; SSE41-NEXT: movdqa %xmm1, %xmm4
334 ; SSE41-NEXT: psubd %xmm3, %xmm4
335 ; SSE41-NEXT: pcmpgtd %xmm4, %xmm1
336 ; SSE41-NEXT: pxor %xmm5, %xmm5
337 ; SSE41-NEXT: pcmpgtd %xmm5, %xmm3
338 ; SSE41-NEXT: pxor %xmm1, %xmm3
339 ; SSE41-NEXT: movdqa %xmm0, %xmm1
340 ; SSE41-NEXT: psubd %xmm2, %xmm1
341 ; SSE41-NEXT: pcmpgtd %xmm5, %xmm2
342 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm0
343 ; SSE41-NEXT: pxor %xmm2, %xmm0
344 ; SSE41-NEXT: movq %xmm1, 16(%rcx)
345 ; SSE41-NEXT: movdqa %xmm4, (%rcx)
346 ; SSE41-NEXT: movq %xmm0, 16(%rdi)
347 ; SSE41-NEXT: movdqa %xmm3, (%rdi)
350 ; AVX1-LABEL: ssubo_v6i32:
352 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
353 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
354 ; AVX1-NEXT: vpcmpgtd %xmm3, %xmm2, %xmm4
355 ; AVX1-NEXT: vpcmpgtd %xmm3, %xmm1, %xmm3
356 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3
357 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
358 ; AVX1-NEXT: vpsubd %xmm2, %xmm4, %xmm2
359 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm4, %xmm4
360 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
361 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
362 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0
363 ; AVX1-NEXT: vxorps %ymm0, %ymm3, %ymm0
364 ; AVX1-NEXT: vmovq %xmm2, 16(%rdi)
365 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
368 ; AVX2-LABEL: ssubo_v6i32:
370 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
371 ; AVX2-NEXT: vpcmpgtd %ymm2, %ymm1, %ymm2
372 ; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm1
373 ; AVX2-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm0
374 ; AVX2-NEXT: vpxor %ymm0, %ymm2, %ymm0
375 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
376 ; AVX2-NEXT: vmovq %xmm2, 16(%rdi)
377 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
380 ; AVX512-LABEL: ssubo_v6i32:
382 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
383 ; AVX512-NEXT: vpcmpgtd %ymm2, %ymm1, %k0
384 ; AVX512-NEXT: vpsubd %ymm1, %ymm0, %ymm1
385 ; AVX512-NEXT: vpcmpgtd %ymm1, %ymm0, %k1
386 ; AVX512-NEXT: kxorw %k1, %k0, %k1
387 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
388 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
389 ; AVX512-NEXT: vextracti128 $1, %ymm1, %xmm2
390 ; AVX512-NEXT: vmovq %xmm2, 16(%rdi)
391 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
393 %t = call {<6 x i32>, <6 x i1>} @llvm.ssub.with.overflow.v6i32(<6 x i32> %a0, <6 x i32> %a1)
394 %val = extractvalue {<6 x i32>, <6 x i1>} %t, 0
395 %obit = extractvalue {<6 x i32>, <6 x i1>} %t, 1
396 %res = sext <6 x i1> %obit to <6 x i32>
397 store <6 x i32> %val, <6 x i32>* %p2
401 define <8 x i32> @ssubo_v8i32(<8 x i32> %a0, <8 x i32> %a1, <8 x i32>* %p2) nounwind {
402 ; SSE-LABEL: ssubo_v8i32:
404 ; SSE-NEXT: pxor %xmm4, %xmm4
405 ; SSE-NEXT: movdqa %xmm0, %xmm5
406 ; SSE-NEXT: psubd %xmm2, %xmm5
407 ; SSE-NEXT: pcmpgtd %xmm4, %xmm2
408 ; SSE-NEXT: pcmpgtd %xmm5, %xmm0
409 ; SSE-NEXT: pxor %xmm2, %xmm0
410 ; SSE-NEXT: movdqa %xmm1, %xmm2
411 ; SSE-NEXT: psubd %xmm3, %xmm2
412 ; SSE-NEXT: pcmpgtd %xmm4, %xmm3
413 ; SSE-NEXT: pcmpgtd %xmm2, %xmm1
414 ; SSE-NEXT: pxor %xmm3, %xmm1
415 ; SSE-NEXT: movdqa %xmm2, 16(%rdi)
416 ; SSE-NEXT: movdqa %xmm5, (%rdi)
419 ; AVX1-LABEL: ssubo_v8i32:
421 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
422 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
423 ; AVX1-NEXT: vpcmpgtd %xmm3, %xmm2, %xmm4
424 ; AVX1-NEXT: vpcmpgtd %xmm3, %xmm1, %xmm3
425 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3
426 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
427 ; AVX1-NEXT: vpsubd %xmm2, %xmm4, %xmm2
428 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm4, %xmm4
429 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
430 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
431 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0
432 ; AVX1-NEXT: vxorps %ymm0, %ymm3, %ymm0
433 ; AVX1-NEXT: vmovdqa %xmm2, 16(%rdi)
434 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
437 ; AVX2-LABEL: ssubo_v8i32:
439 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
440 ; AVX2-NEXT: vpcmpgtd %ymm2, %ymm1, %ymm2
441 ; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm1
442 ; AVX2-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm0
443 ; AVX2-NEXT: vpxor %ymm0, %ymm2, %ymm0
444 ; AVX2-NEXT: vmovdqa %ymm1, (%rdi)
447 ; AVX512-LABEL: ssubo_v8i32:
449 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
450 ; AVX512-NEXT: vpcmpgtd %ymm2, %ymm1, %k0
451 ; AVX512-NEXT: vpsubd %ymm1, %ymm0, %ymm1
452 ; AVX512-NEXT: vpcmpgtd %ymm1, %ymm0, %k1
453 ; AVX512-NEXT: kxorw %k1, %k0, %k1
454 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
455 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
456 ; AVX512-NEXT: vmovdqa %ymm1, (%rdi)
458 %t = call {<8 x i32>, <8 x i1>} @llvm.ssub.with.overflow.v8i32(<8 x i32> %a0, <8 x i32> %a1)
459 %val = extractvalue {<8 x i32>, <8 x i1>} %t, 0
460 %obit = extractvalue {<8 x i32>, <8 x i1>} %t, 1
461 %res = sext <8 x i1> %obit to <8 x i32>
462 store <8 x i32> %val, <8 x i32>* %p2
466 define <16 x i32> @ssubo_v16i32(<16 x i32> %a0, <16 x i32> %a1, <16 x i32>* %p2) nounwind {
467 ; SSE-LABEL: ssubo_v16i32:
469 ; SSE-NEXT: pxor %xmm9, %xmm9
470 ; SSE-NEXT: movdqa %xmm0, %xmm8
471 ; SSE-NEXT: psubd %xmm4, %xmm8
472 ; SSE-NEXT: pcmpgtd %xmm9, %xmm4
473 ; SSE-NEXT: pcmpgtd %xmm8, %xmm0
474 ; SSE-NEXT: pxor %xmm4, %xmm0
475 ; SSE-NEXT: movdqa %xmm1, %xmm4
476 ; SSE-NEXT: psubd %xmm5, %xmm4
477 ; SSE-NEXT: pcmpgtd %xmm9, %xmm5
478 ; SSE-NEXT: pcmpgtd %xmm4, %xmm1
479 ; SSE-NEXT: pxor %xmm5, %xmm1
480 ; SSE-NEXT: movdqa %xmm2, %xmm5
481 ; SSE-NEXT: psubd %xmm6, %xmm5
482 ; SSE-NEXT: pcmpgtd %xmm9, %xmm6
483 ; SSE-NEXT: pcmpgtd %xmm5, %xmm2
484 ; SSE-NEXT: pxor %xmm6, %xmm2
485 ; SSE-NEXT: movdqa %xmm3, %xmm6
486 ; SSE-NEXT: psubd %xmm7, %xmm6
487 ; SSE-NEXT: pcmpgtd %xmm9, %xmm7
488 ; SSE-NEXT: pcmpgtd %xmm6, %xmm3
489 ; SSE-NEXT: pxor %xmm7, %xmm3
490 ; SSE-NEXT: movdqa %xmm6, 48(%rdi)
491 ; SSE-NEXT: movdqa %xmm5, 32(%rdi)
492 ; SSE-NEXT: movdqa %xmm4, 16(%rdi)
493 ; SSE-NEXT: movdqa %xmm8, (%rdi)
496 ; AVX1-LABEL: ssubo_v16i32:
498 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
499 ; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5
500 ; AVX1-NEXT: vpcmpgtd %xmm5, %xmm4, %xmm6
501 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7
502 ; AVX1-NEXT: vpsubd %xmm4, %xmm7, %xmm8
503 ; AVX1-NEXT: vpcmpgtd %xmm8, %xmm7, %xmm7
504 ; AVX1-NEXT: vpxor %xmm7, %xmm6, %xmm6
505 ; AVX1-NEXT: vpcmpgtd %xmm5, %xmm3, %xmm7
506 ; AVX1-NEXT: vpsubd %xmm3, %xmm1, %xmm3
507 ; AVX1-NEXT: vpcmpgtd %xmm3, %xmm1, %xmm1
508 ; AVX1-NEXT: vpxor %xmm1, %xmm7, %xmm1
509 ; AVX1-NEXT: vpackssdw %xmm6, %xmm1, %xmm1
510 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm6
511 ; AVX1-NEXT: vpcmpgtd %xmm5, %xmm6, %xmm7
512 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
513 ; AVX1-NEXT: vpsubd %xmm6, %xmm4, %xmm6
514 ; AVX1-NEXT: vpcmpgtd %xmm6, %xmm4, %xmm4
515 ; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm4
516 ; AVX1-NEXT: vpcmpgtd %xmm5, %xmm2, %xmm5
517 ; AVX1-NEXT: vpsubd %xmm2, %xmm0, %xmm2
518 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm0, %xmm0
519 ; AVX1-NEXT: vpxor %xmm0, %xmm5, %xmm0
520 ; AVX1-NEXT: vpackssdw %xmm4, %xmm0, %xmm0
521 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm1
522 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0
523 ; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm1[1,1,2,3]
524 ; AVX1-NEXT: vpmovsxbd %xmm4, %xmm4
525 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0
526 ; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm1[2,3,0,1]
527 ; AVX1-NEXT: vpmovsxbd %xmm4, %xmm4
528 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,0,1]
529 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
530 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm4, %ymm1
531 ; AVX1-NEXT: vmovdqa %xmm8, 48(%rdi)
532 ; AVX1-NEXT: vmovdqa %xmm3, 32(%rdi)
533 ; AVX1-NEXT: vmovdqa %xmm6, 16(%rdi)
534 ; AVX1-NEXT: vmovdqa %xmm2, (%rdi)
537 ; AVX2-LABEL: ssubo_v16i32:
539 ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4
540 ; AVX2-NEXT: vpcmpgtd %ymm4, %ymm3, %ymm5
541 ; AVX2-NEXT: vpsubd %ymm3, %ymm1, %ymm3
542 ; AVX2-NEXT: vpcmpgtd %ymm3, %ymm1, %ymm1
543 ; AVX2-NEXT: vpxor %ymm1, %ymm5, %ymm1
544 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5
545 ; AVX2-NEXT: vpackssdw %xmm5, %xmm1, %xmm1
546 ; AVX2-NEXT: vpcmpgtd %ymm4, %ymm2, %ymm4
547 ; AVX2-NEXT: vpsubd %ymm2, %ymm0, %ymm2
548 ; AVX2-NEXT: vpcmpgtd %ymm2, %ymm0, %ymm0
549 ; AVX2-NEXT: vpxor %ymm0, %ymm4, %ymm0
550 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4
551 ; AVX2-NEXT: vpackssdw %xmm4, %xmm0, %xmm0
552 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1
553 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0
554 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
555 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1
556 ; AVX2-NEXT: vmovdqa %ymm3, 32(%rdi)
557 ; AVX2-NEXT: vmovdqa %ymm2, (%rdi)
560 ; AVX512-LABEL: ssubo_v16i32:
562 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
563 ; AVX512-NEXT: vpcmpgtd %zmm2, %zmm1, %k0
564 ; AVX512-NEXT: vpsubd %zmm1, %zmm0, %zmm1
565 ; AVX512-NEXT: vpcmpgtd %zmm1, %zmm0, %k1
566 ; AVX512-NEXT: kxorw %k1, %k0, %k1
567 ; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
568 ; AVX512-NEXT: vmovdqa64 %zmm1, (%rdi)
570 %t = call {<16 x i32>, <16 x i1>} @llvm.ssub.with.overflow.v16i32(<16 x i32> %a0, <16 x i32> %a1)
571 %val = extractvalue {<16 x i32>, <16 x i1>} %t, 0
572 %obit = extractvalue {<16 x i32>, <16 x i1>} %t, 1
573 %res = sext <16 x i1> %obit to <16 x i32>
574 store <16 x i32> %val, <16 x i32>* %p2
578 define <16 x i32> @ssubo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nounwind {
579 ; SSE2-LABEL: ssubo_v16i8:
581 ; SSE2-NEXT: movdqa %xmm0, %xmm2
582 ; SSE2-NEXT: psubsb %xmm1, %xmm2
583 ; SSE2-NEXT: psubb %xmm1, %xmm0
584 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm2
585 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm3
586 ; SSE2-NEXT: pxor %xmm2, %xmm3
587 ; SSE2-NEXT: movdqa %xmm3, %xmm1
588 ; 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]
589 ; SSE2-NEXT: movdqa %xmm1, %xmm4
590 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]
591 ; SSE2-NEXT: pslld $31, %xmm4
592 ; SSE2-NEXT: psrad $31, %xmm4
593 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
594 ; SSE2-NEXT: pslld $31, %xmm1
595 ; SSE2-NEXT: psrad $31, %xmm1
596 ; 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]
597 ; SSE2-NEXT: movdqa %xmm3, %xmm2
598 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
599 ; SSE2-NEXT: pslld $31, %xmm2
600 ; SSE2-NEXT: psrad $31, %xmm2
601 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
602 ; SSE2-NEXT: pslld $31, %xmm3
603 ; SSE2-NEXT: psrad $31, %xmm3
604 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
605 ; SSE2-NEXT: movdqa %xmm4, %xmm0
608 ; SSSE3-LABEL: ssubo_v16i8:
610 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
611 ; SSSE3-NEXT: psubsb %xmm1, %xmm2
612 ; SSSE3-NEXT: psubb %xmm1, %xmm0
613 ; SSSE3-NEXT: pcmpeqb %xmm0, %xmm2
614 ; SSSE3-NEXT: pcmpeqd %xmm3, %xmm3
615 ; SSSE3-NEXT: pxor %xmm2, %xmm3
616 ; SSSE3-NEXT: movdqa %xmm3, %xmm1
617 ; 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]
618 ; SSSE3-NEXT: movdqa %xmm1, %xmm4
619 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]
620 ; SSSE3-NEXT: pslld $31, %xmm4
621 ; SSSE3-NEXT: psrad $31, %xmm4
622 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
623 ; SSSE3-NEXT: pslld $31, %xmm1
624 ; SSSE3-NEXT: psrad $31, %xmm1
625 ; 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]
626 ; SSSE3-NEXT: movdqa %xmm3, %xmm2
627 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
628 ; SSSE3-NEXT: pslld $31, %xmm2
629 ; SSSE3-NEXT: psrad $31, %xmm2
630 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
631 ; SSSE3-NEXT: pslld $31, %xmm3
632 ; SSSE3-NEXT: psrad $31, %xmm3
633 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
634 ; SSSE3-NEXT: movdqa %xmm4, %xmm0
637 ; SSE41-LABEL: ssubo_v16i8:
639 ; SSE41-NEXT: movdqa %xmm0, %xmm2
640 ; SSE41-NEXT: psubsb %xmm1, %xmm2
641 ; SSE41-NEXT: psubb %xmm1, %xmm0
642 ; SSE41-NEXT: pcmpeqb %xmm0, %xmm2
643 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm3
644 ; SSE41-NEXT: pxor %xmm2, %xmm3
645 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm4 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
646 ; SSE41-NEXT: pslld $31, %xmm4
647 ; SSE41-NEXT: psrad $31, %xmm4
648 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,2,3]
649 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
650 ; SSE41-NEXT: pslld $31, %xmm1
651 ; SSE41-NEXT: psrad $31, %xmm1
652 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[2,3,0,1]
653 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
654 ; SSE41-NEXT: pslld $31, %xmm2
655 ; SSE41-NEXT: psrad $31, %xmm2
656 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[3,1,2,3]
657 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
658 ; SSE41-NEXT: pslld $31, %xmm3
659 ; SSE41-NEXT: psrad $31, %xmm3
660 ; SSE41-NEXT: movdqa %xmm0, (%rdi)
661 ; SSE41-NEXT: movdqa %xmm4, %xmm0
664 ; AVX1-LABEL: ssubo_v16i8:
666 ; AVX1-NEXT: vpsubsb %xmm1, %xmm0, %xmm2
667 ; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm3
668 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm3, %xmm0
669 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
670 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm1
671 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0
672 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,2,3]
673 ; AVX1-NEXT: vpmovsxbd %xmm2, %xmm2
674 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
675 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[2,3,0,1]
676 ; AVX1-NEXT: vpmovsxbd %xmm2, %xmm2
677 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,0,1]
678 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
679 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
680 ; AVX1-NEXT: vmovdqa %xmm3, (%rdi)
683 ; AVX2-LABEL: ssubo_v16i8:
685 ; AVX2-NEXT: vpsubsb %xmm1, %xmm0, %xmm2
686 ; AVX2-NEXT: vpsubb %xmm1, %xmm0, %xmm3
687 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm3, %xmm0
688 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
689 ; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm1
690 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0
691 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
692 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1
693 ; AVX2-NEXT: vmovdqa %xmm3, (%rdi)
696 ; AVX512-LABEL: ssubo_v16i8:
698 ; AVX512-NEXT: vpsubsb %xmm1, %xmm0, %xmm2
699 ; AVX512-NEXT: vpsubb %xmm1, %xmm0, %xmm1
700 ; AVX512-NEXT: vpcmpneqb %xmm2, %xmm1, %k1
701 ; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
702 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
704 %t = call {<16 x i8>, <16 x i1>} @llvm.ssub.with.overflow.v16i8(<16 x i8> %a0, <16 x i8> %a1)
705 %val = extractvalue {<16 x i8>, <16 x i1>} %t, 0
706 %obit = extractvalue {<16 x i8>, <16 x i1>} %t, 1
707 %res = sext <16 x i1> %obit to <16 x i32>
708 store <16 x i8> %val, <16 x i8>* %p2
712 define <8 x i32> @ssubo_v8i16(<8 x i16> %a0, <8 x i16> %a1, <8 x i16>* %p2) nounwind {
713 ; SSE2-LABEL: ssubo_v8i16:
715 ; SSE2-NEXT: movdqa %xmm0, %xmm2
716 ; SSE2-NEXT: psubsw %xmm1, %xmm2
717 ; SSE2-NEXT: psubw %xmm1, %xmm0
718 ; SSE2-NEXT: pcmpeqw %xmm0, %xmm2
719 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
720 ; SSE2-NEXT: pxor %xmm2, %xmm1
721 ; SSE2-NEXT: movdqa %xmm1, %xmm2
722 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
723 ; SSE2-NEXT: pslld $31, %xmm2
724 ; SSE2-NEXT: psrad $31, %xmm2
725 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
726 ; SSE2-NEXT: pslld $31, %xmm1
727 ; SSE2-NEXT: psrad $31, %xmm1
728 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
729 ; SSE2-NEXT: movdqa %xmm2, %xmm0
732 ; SSSE3-LABEL: ssubo_v8i16:
734 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
735 ; SSSE3-NEXT: psubsw %xmm1, %xmm2
736 ; SSSE3-NEXT: psubw %xmm1, %xmm0
737 ; SSSE3-NEXT: pcmpeqw %xmm0, %xmm2
738 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1
739 ; SSSE3-NEXT: pxor %xmm2, %xmm1
740 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
741 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
742 ; SSSE3-NEXT: pslld $31, %xmm2
743 ; SSSE3-NEXT: psrad $31, %xmm2
744 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
745 ; SSSE3-NEXT: pslld $31, %xmm1
746 ; SSSE3-NEXT: psrad $31, %xmm1
747 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
748 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
751 ; SSE41-LABEL: ssubo_v8i16:
753 ; SSE41-NEXT: movdqa %xmm0, %xmm2
754 ; SSE41-NEXT: psubsw %xmm1, %xmm2
755 ; SSE41-NEXT: psubw %xmm1, %xmm0
756 ; SSE41-NEXT: pcmpeqw %xmm0, %xmm2
757 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
758 ; SSE41-NEXT: pxor %xmm2, %xmm1
759 ; SSE41-NEXT: pmovzxwd {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
760 ; SSE41-NEXT: pslld $31, %xmm2
761 ; SSE41-NEXT: psrad $31, %xmm2
762 ; SSE41-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
763 ; SSE41-NEXT: pslld $31, %xmm1
764 ; SSE41-NEXT: psrad $31, %xmm1
765 ; SSE41-NEXT: movdqa %xmm0, (%rdi)
766 ; SSE41-NEXT: movdqa %xmm2, %xmm0
769 ; AVX1-LABEL: ssubo_v8i16:
771 ; AVX1-NEXT: vpsubsw %xmm1, %xmm0, %xmm2
772 ; AVX1-NEXT: vpsubw %xmm1, %xmm0, %xmm1
773 ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm0
774 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
775 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
776 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm2
777 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
778 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm0
779 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
780 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
783 ; AVX2-LABEL: ssubo_v8i16:
785 ; AVX2-NEXT: vpsubsw %xmm1, %xmm0, %xmm2
786 ; AVX2-NEXT: vpsubw %xmm1, %xmm0, %xmm1
787 ; AVX2-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm0
788 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
789 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
790 ; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0
791 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
794 ; AVX512-LABEL: ssubo_v8i16:
796 ; AVX512-NEXT: vpsubsw %xmm1, %xmm0, %xmm2
797 ; AVX512-NEXT: vpsubw %xmm1, %xmm0, %xmm1
798 ; AVX512-NEXT: vpcmpneqw %xmm2, %xmm1, %k1
799 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
800 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
801 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
803 %t = call {<8 x i16>, <8 x i1>} @llvm.ssub.with.overflow.v8i16(<8 x i16> %a0, <8 x i16> %a1)
804 %val = extractvalue {<8 x i16>, <8 x i1>} %t, 0
805 %obit = extractvalue {<8 x i16>, <8 x i1>} %t, 1
806 %res = sext <8 x i1> %obit to <8 x i32>
807 store <8 x i16> %val, <8 x i16>* %p2
811 define <2 x i32> @ssubo_v2i64(<2 x i64> %a0, <2 x i64> %a1, <2 x i64>* %p2) nounwind {
812 ; SSE-LABEL: ssubo_v2i64:
814 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
815 ; SSE-NEXT: movdqa %xmm0, %xmm3
816 ; SSE-NEXT: pxor %xmm2, %xmm3
817 ; SSE-NEXT: psubq %xmm1, %xmm0
818 ; SSE-NEXT: movdqa %xmm0, (%rdi)
819 ; SSE-NEXT: pxor %xmm2, %xmm0
820 ; SSE-NEXT: movdqa %xmm3, %xmm4
821 ; SSE-NEXT: pcmpgtd %xmm0, %xmm4
822 ; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
823 ; SSE-NEXT: pcmpeqd %xmm3, %xmm0
824 ; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
825 ; SSE-NEXT: pand %xmm5, %xmm0
826 ; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
827 ; SSE-NEXT: por %xmm0, %xmm3
828 ; SSE-NEXT: pxor %xmm2, %xmm1
829 ; SSE-NEXT: movdqa %xmm1, %xmm0
830 ; SSE-NEXT: pcmpgtd %xmm2, %xmm0
831 ; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
832 ; SSE-NEXT: pcmpeqd %xmm2, %xmm1
833 ; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
834 ; SSE-NEXT: pand %xmm4, %xmm1
835 ; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
836 ; SSE-NEXT: por %xmm1, %xmm0
837 ; SSE-NEXT: pxor %xmm3, %xmm0
838 ; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
841 ; AVX1-LABEL: ssubo_v2i64:
843 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
844 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm1, %xmm2
845 ; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm1
846 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0
847 ; AVX1-NEXT: vpxor %xmm0, %xmm2, %xmm0
848 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
849 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
852 ; AVX2-LABEL: ssubo_v2i64:
854 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
855 ; AVX2-NEXT: vpcmpgtq %xmm2, %xmm1, %xmm2
856 ; AVX2-NEXT: vpsubq %xmm1, %xmm0, %xmm1
857 ; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0
858 ; AVX2-NEXT: vpxor %xmm0, %xmm2, %xmm0
859 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
860 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
863 ; AVX512-LABEL: ssubo_v2i64:
865 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
866 ; AVX512-NEXT: vpcmpgtq %xmm2, %xmm1, %k0
867 ; AVX512-NEXT: vpsubq %xmm1, %xmm0, %xmm1
868 ; AVX512-NEXT: vpcmpgtq %xmm1, %xmm0, %k1
869 ; AVX512-NEXT: kxorw %k1, %k0, %k1
870 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
871 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
872 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
874 %t = call {<2 x i64>, <2 x i1>} @llvm.ssub.with.overflow.v2i64(<2 x i64> %a0, <2 x i64> %a1)
875 %val = extractvalue {<2 x i64>, <2 x i1>} %t, 0
876 %obit = extractvalue {<2 x i64>, <2 x i1>} %t, 1
877 %res = sext <2 x i1> %obit to <2 x i32>
878 store <2 x i64> %val, <2 x i64>* %p2
882 define <4 x i32> @ssubo_v4i24(<4 x i24> %a0, <4 x i24> %a1, <4 x i24>* %p2) nounwind {
883 ; SSE2-LABEL: ssubo_v4i24:
885 ; SSE2-NEXT: movdqa %xmm0, %xmm2
886 ; SSE2-NEXT: pslld $8, %xmm1
887 ; SSE2-NEXT: psrad $8, %xmm1
888 ; SSE2-NEXT: pslld $8, %xmm2
889 ; SSE2-NEXT: psrad $8, %xmm2
890 ; SSE2-NEXT: psubd %xmm1, %xmm2
891 ; SSE2-NEXT: movdqa %xmm2, %xmm0
892 ; SSE2-NEXT: pslld $8, %xmm0
893 ; SSE2-NEXT: psrad $8, %xmm0
894 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm0
895 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
896 ; SSE2-NEXT: pxor %xmm1, %xmm0
897 ; SSE2-NEXT: movd %xmm2, %eax
898 ; SSE2-NEXT: movw %ax, (%rdi)
899 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[3,1,2,3]
900 ; SSE2-NEXT: movd %xmm1, %ecx
901 ; SSE2-NEXT: movw %cx, 9(%rdi)
902 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
903 ; SSE2-NEXT: movd %xmm1, %edx
904 ; SSE2-NEXT: movw %dx, 6(%rdi)
905 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,2,3]
906 ; SSE2-NEXT: movd %xmm1, %esi
907 ; SSE2-NEXT: movw %si, 3(%rdi)
908 ; SSE2-NEXT: shrl $16, %eax
909 ; SSE2-NEXT: movb %al, 2(%rdi)
910 ; SSE2-NEXT: shrl $16, %ecx
911 ; SSE2-NEXT: movb %cl, 11(%rdi)
912 ; SSE2-NEXT: shrl $16, %edx
913 ; SSE2-NEXT: movb %dl, 8(%rdi)
914 ; SSE2-NEXT: shrl $16, %esi
915 ; SSE2-NEXT: movb %sil, 5(%rdi)
918 ; SSSE3-LABEL: ssubo_v4i24:
920 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
921 ; SSSE3-NEXT: pslld $8, %xmm1
922 ; SSSE3-NEXT: psrad $8, %xmm1
923 ; SSSE3-NEXT: pslld $8, %xmm2
924 ; SSSE3-NEXT: psrad $8, %xmm2
925 ; SSSE3-NEXT: psubd %xmm1, %xmm2
926 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
927 ; SSSE3-NEXT: pslld $8, %xmm0
928 ; SSSE3-NEXT: psrad $8, %xmm0
929 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm0
930 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1
931 ; SSSE3-NEXT: pxor %xmm1, %xmm0
932 ; SSSE3-NEXT: movd %xmm2, %eax
933 ; SSSE3-NEXT: movw %ax, (%rdi)
934 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[3,1,2,3]
935 ; SSSE3-NEXT: movd %xmm1, %ecx
936 ; SSSE3-NEXT: movw %cx, 9(%rdi)
937 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
938 ; SSSE3-NEXT: movd %xmm1, %edx
939 ; SSSE3-NEXT: movw %dx, 6(%rdi)
940 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,2,3]
941 ; SSSE3-NEXT: movd %xmm1, %esi
942 ; SSSE3-NEXT: movw %si, 3(%rdi)
943 ; SSSE3-NEXT: shrl $16, %eax
944 ; SSSE3-NEXT: movb %al, 2(%rdi)
945 ; SSSE3-NEXT: shrl $16, %ecx
946 ; SSSE3-NEXT: movb %cl, 11(%rdi)
947 ; SSSE3-NEXT: shrl $16, %edx
948 ; SSSE3-NEXT: movb %dl, 8(%rdi)
949 ; SSSE3-NEXT: shrl $16, %esi
950 ; SSSE3-NEXT: movb %sil, 5(%rdi)
953 ; SSE41-LABEL: ssubo_v4i24:
955 ; SSE41-NEXT: movdqa %xmm0, %xmm2
956 ; SSE41-NEXT: pslld $8, %xmm1
957 ; SSE41-NEXT: psrad $8, %xmm1
958 ; SSE41-NEXT: pslld $8, %xmm2
959 ; SSE41-NEXT: psrad $8, %xmm2
960 ; SSE41-NEXT: psubd %xmm1, %xmm2
961 ; SSE41-NEXT: movdqa %xmm2, %xmm0
962 ; SSE41-NEXT: pslld $8, %xmm0
963 ; SSE41-NEXT: psrad $8, %xmm0
964 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm0
965 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
966 ; SSE41-NEXT: pxor %xmm1, %xmm0
967 ; SSE41-NEXT: pextrd $3, %xmm2, %eax
968 ; SSE41-NEXT: movw %ax, 9(%rdi)
969 ; SSE41-NEXT: pextrd $2, %xmm2, %ecx
970 ; SSE41-NEXT: movw %cx, 6(%rdi)
971 ; SSE41-NEXT: pextrd $1, %xmm2, %edx
972 ; SSE41-NEXT: movw %dx, 3(%rdi)
973 ; SSE41-NEXT: movd %xmm2, %esi
974 ; SSE41-NEXT: movw %si, (%rdi)
975 ; SSE41-NEXT: shrl $16, %eax
976 ; SSE41-NEXT: movb %al, 11(%rdi)
977 ; SSE41-NEXT: shrl $16, %ecx
978 ; SSE41-NEXT: movb %cl, 8(%rdi)
979 ; SSE41-NEXT: shrl $16, %edx
980 ; SSE41-NEXT: movb %dl, 5(%rdi)
981 ; SSE41-NEXT: shrl $16, %esi
982 ; SSE41-NEXT: movb %sil, 2(%rdi)
985 ; AVX1-LABEL: ssubo_v4i24:
987 ; AVX1-NEXT: vpslld $8, %xmm1, %xmm1
988 ; AVX1-NEXT: vpsrad $8, %xmm1, %xmm1
989 ; AVX1-NEXT: vpslld $8, %xmm0, %xmm0
990 ; AVX1-NEXT: vpsrad $8, %xmm0, %xmm0
991 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
992 ; AVX1-NEXT: vpslld $8, %xmm1, %xmm0
993 ; AVX1-NEXT: vpsrad $8, %xmm0, %xmm0
994 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
995 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
996 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
997 ; AVX1-NEXT: vpextrd $3, %xmm1, %eax
998 ; AVX1-NEXT: movw %ax, 9(%rdi)
999 ; AVX1-NEXT: vpextrd $2, %xmm1, %ecx
1000 ; AVX1-NEXT: movw %cx, 6(%rdi)
1001 ; AVX1-NEXT: vpextrd $1, %xmm1, %edx
1002 ; AVX1-NEXT: movw %dx, 3(%rdi)
1003 ; AVX1-NEXT: vmovd %xmm1, %esi
1004 ; AVX1-NEXT: movw %si, (%rdi)
1005 ; AVX1-NEXT: shrl $16, %eax
1006 ; AVX1-NEXT: movb %al, 11(%rdi)
1007 ; AVX1-NEXT: shrl $16, %ecx
1008 ; AVX1-NEXT: movb %cl, 8(%rdi)
1009 ; AVX1-NEXT: shrl $16, %edx
1010 ; AVX1-NEXT: movb %dl, 5(%rdi)
1011 ; AVX1-NEXT: shrl $16, %esi
1012 ; AVX1-NEXT: movb %sil, 2(%rdi)
1015 ; AVX2-LABEL: ssubo_v4i24:
1017 ; AVX2-NEXT: vpslld $8, %xmm1, %xmm1
1018 ; AVX2-NEXT: vpsrad $8, %xmm1, %xmm1
1019 ; AVX2-NEXT: vpslld $8, %xmm0, %xmm0
1020 ; AVX2-NEXT: vpsrad $8, %xmm0, %xmm0
1021 ; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm1
1022 ; AVX2-NEXT: vpslld $8, %xmm1, %xmm0
1023 ; AVX2-NEXT: vpsrad $8, %xmm0, %xmm0
1024 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1025 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1026 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
1027 ; AVX2-NEXT: vpextrd $3, %xmm1, %eax
1028 ; AVX2-NEXT: movw %ax, 9(%rdi)
1029 ; AVX2-NEXT: vpextrd $2, %xmm1, %ecx
1030 ; AVX2-NEXT: movw %cx, 6(%rdi)
1031 ; AVX2-NEXT: vpextrd $1, %xmm1, %edx
1032 ; AVX2-NEXT: movw %dx, 3(%rdi)
1033 ; AVX2-NEXT: vmovd %xmm1, %esi
1034 ; AVX2-NEXT: movw %si, (%rdi)
1035 ; AVX2-NEXT: shrl $16, %eax
1036 ; AVX2-NEXT: movb %al, 11(%rdi)
1037 ; AVX2-NEXT: shrl $16, %ecx
1038 ; AVX2-NEXT: movb %cl, 8(%rdi)
1039 ; AVX2-NEXT: shrl $16, %edx
1040 ; AVX2-NEXT: movb %dl, 5(%rdi)
1041 ; AVX2-NEXT: shrl $16, %esi
1042 ; AVX2-NEXT: movb %sil, 2(%rdi)
1045 ; AVX512-LABEL: ssubo_v4i24:
1047 ; AVX512-NEXT: vpslld $8, %xmm1, %xmm1
1048 ; AVX512-NEXT: vpsrad $8, %xmm1, %xmm1
1049 ; AVX512-NEXT: vpslld $8, %xmm0, %xmm0
1050 ; AVX512-NEXT: vpsrad $8, %xmm0, %xmm0
1051 ; AVX512-NEXT: vpsubd %xmm1, %xmm0, %xmm1
1052 ; AVX512-NEXT: vpslld $8, %xmm1, %xmm0
1053 ; AVX512-NEXT: vpsrad $8, %xmm0, %xmm0
1054 ; AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1055 ; AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
1056 ; AVX512-NEXT: vpextrd $3, %xmm1, %eax
1057 ; AVX512-NEXT: movw %ax, 9(%rdi)
1058 ; AVX512-NEXT: vpextrd $2, %xmm1, %ecx
1059 ; AVX512-NEXT: movw %cx, 6(%rdi)
1060 ; AVX512-NEXT: vpextrd $1, %xmm1, %edx
1061 ; AVX512-NEXT: movw %dx, 3(%rdi)
1062 ; AVX512-NEXT: vmovd %xmm1, %esi
1063 ; AVX512-NEXT: movw %si, (%rdi)
1064 ; AVX512-NEXT: shrl $16, %eax
1065 ; AVX512-NEXT: movb %al, 11(%rdi)
1066 ; AVX512-NEXT: shrl $16, %ecx
1067 ; AVX512-NEXT: movb %cl, 8(%rdi)
1068 ; AVX512-NEXT: shrl $16, %edx
1069 ; AVX512-NEXT: movb %dl, 5(%rdi)
1070 ; AVX512-NEXT: shrl $16, %esi
1071 ; AVX512-NEXT: movb %sil, 2(%rdi)
1073 %t = call {<4 x i24>, <4 x i1>} @llvm.ssub.with.overflow.v4i24(<4 x i24> %a0, <4 x i24> %a1)
1074 %val = extractvalue {<4 x i24>, <4 x i1>} %t, 0
1075 %obit = extractvalue {<4 x i24>, <4 x i1>} %t, 1
1076 %res = sext <4 x i1> %obit to <4 x i32>
1077 store <4 x i24> %val, <4 x i24>* %p2
1081 define <4 x i32> @ssubo_v4i1(<4 x i1> %a0, <4 x i1> %a1, <4 x i1>* %p2) nounwind {
1082 ; SSE-LABEL: ssubo_v4i1:
1084 ; SSE-NEXT: pslld $31, %xmm1
1085 ; SSE-NEXT: psrad $31, %xmm1
1086 ; SSE-NEXT: pslld $31, %xmm0
1087 ; SSE-NEXT: psrad $31, %xmm0
1088 ; SSE-NEXT: psubd %xmm1, %xmm0
1089 ; SSE-NEXT: movdqa %xmm0, %xmm1
1090 ; SSE-NEXT: pslld $31, %xmm1
1091 ; SSE-NEXT: psrad $31, %xmm1
1092 ; SSE-NEXT: pcmpeqd %xmm1, %xmm0
1093 ; SSE-NEXT: pcmpeqd %xmm2, %xmm2
1094 ; SSE-NEXT: pxor %xmm2, %xmm0
1095 ; SSE-NEXT: movmskps %xmm1, %eax
1096 ; SSE-NEXT: movb %al, (%rdi)
1099 ; AVX1-LABEL: ssubo_v4i1:
1101 ; AVX1-NEXT: vpslld $31, %xmm1, %xmm1
1102 ; AVX1-NEXT: vpsrad $31, %xmm1, %xmm1
1103 ; AVX1-NEXT: vpslld $31, %xmm0, %xmm0
1104 ; AVX1-NEXT: vpsrad $31, %xmm0, %xmm0
1105 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm0
1106 ; AVX1-NEXT: vpslld $31, %xmm0, %xmm1
1107 ; AVX1-NEXT: vpsrad $31, %xmm1, %xmm1
1108 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
1109 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1110 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
1111 ; AVX1-NEXT: vmovmskps %xmm1, %eax
1112 ; AVX1-NEXT: movb %al, (%rdi)
1115 ; AVX2-LABEL: ssubo_v4i1:
1117 ; AVX2-NEXT: vpslld $31, %xmm1, %xmm1
1118 ; AVX2-NEXT: vpsrad $31, %xmm1, %xmm1
1119 ; AVX2-NEXT: vpslld $31, %xmm0, %xmm0
1120 ; AVX2-NEXT: vpsrad $31, %xmm0, %xmm0
1121 ; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm0
1122 ; AVX2-NEXT: vpslld $31, %xmm0, %xmm1
1123 ; AVX2-NEXT: vpsrad $31, %xmm1, %xmm1
1124 ; AVX2-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
1125 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1126 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
1127 ; AVX2-NEXT: vmovmskps %xmm1, %eax
1128 ; AVX2-NEXT: movb %al, (%rdi)
1131 ; AVX512-LABEL: ssubo_v4i1:
1133 ; AVX512-NEXT: vpslld $31, %xmm1, %xmm1
1134 ; AVX512-NEXT: vptestmd %xmm1, %xmm1, %k0
1135 ; AVX512-NEXT: vpslld $31, %xmm0, %xmm0
1136 ; AVX512-NEXT: vptestmd %xmm0, %xmm0, %k1
1137 ; AVX512-NEXT: vptestnmd %xmm1, %xmm1, %k2 {%k1}
1138 ; AVX512-NEXT: kxorw %k0, %k1, %k0
1139 ; AVX512-NEXT: kxorw %k2, %k0, %k1
1140 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1141 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
1142 ; AVX512-NEXT: kmovd %k0, %eax
1143 ; AVX512-NEXT: movb %al, (%rdi)
1145 %t = call {<4 x i1>, <4 x i1>} @llvm.ssub.with.overflow.v4i1(<4 x i1> %a0, <4 x i1> %a1)
1146 %val = extractvalue {<4 x i1>, <4 x i1>} %t, 0
1147 %obit = extractvalue {<4 x i1>, <4 x i1>} %t, 1
1148 %res = sext <4 x i1> %obit to <4 x i32>
1149 store <4 x i1> %val, <4 x i1>* %p2
1153 define <2 x i32> @ssubo_v2i128(<2 x i128> %a0, <2 x i128> %a1, <2 x i128>* %p2) nounwind {
1154 ; SSE2-LABEL: ssubo_v2i128:
1156 ; SSE2-NEXT: pushq %rbp
1157 ; SSE2-NEXT: pushq %rbx
1158 ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %r11
1159 ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %r10
1160 ; SSE2-NEXT: testq %r9, %r9
1161 ; SSE2-NEXT: setns %al
1162 ; SSE2-NEXT: testq %rsi, %rsi
1163 ; SSE2-NEXT: setns %bl
1164 ; SSE2-NEXT: cmpb %al, %bl
1165 ; SSE2-NEXT: setne %bpl
1166 ; SSE2-NEXT: subq %r8, %rdi
1167 ; SSE2-NEXT: sbbq %r9, %rsi
1168 ; SSE2-NEXT: setns %al
1169 ; SSE2-NEXT: cmpb %al, %bl
1170 ; SSE2-NEXT: setne %al
1171 ; SSE2-NEXT: andb %bpl, %al
1172 ; SSE2-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1173 ; SSE2-NEXT: movq %rcx, %rbp
1174 ; SSE2-NEXT: sbbq %r10, %rbp
1175 ; SSE2-NEXT: setns %bl
1176 ; SSE2-NEXT: testq %rcx, %rcx
1177 ; SSE2-NEXT: setns %cl
1178 ; SSE2-NEXT: cmpb %bl, %cl
1179 ; SSE2-NEXT: setne %r8b
1180 ; SSE2-NEXT: testq %r10, %r10
1181 ; SSE2-NEXT: setns %bl
1182 ; SSE2-NEXT: cmpb %bl, %cl
1183 ; SSE2-NEXT: setne %cl
1184 ; SSE2-NEXT: andb %r8b, %cl
1185 ; SSE2-NEXT: movzbl %cl, %ecx
1186 ; SSE2-NEXT: negl %ecx
1187 ; SSE2-NEXT: movd %ecx, %xmm1
1188 ; SSE2-NEXT: movzbl %al, %eax
1189 ; SSE2-NEXT: negl %eax
1190 ; SSE2-NEXT: movd %eax, %xmm0
1191 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1192 ; SSE2-NEXT: movq %rdx, 16(%r11)
1193 ; SSE2-NEXT: movq %rdi, (%r11)
1194 ; SSE2-NEXT: movq %rbp, 24(%r11)
1195 ; SSE2-NEXT: movq %rsi, 8(%r11)
1196 ; SSE2-NEXT: popq %rbx
1197 ; SSE2-NEXT: popq %rbp
1200 ; SSSE3-LABEL: ssubo_v2i128:
1202 ; SSSE3-NEXT: pushq %rbp
1203 ; SSSE3-NEXT: pushq %rbx
1204 ; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %r11
1205 ; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %r10
1206 ; SSSE3-NEXT: testq %r9, %r9
1207 ; SSSE3-NEXT: setns %al
1208 ; SSSE3-NEXT: testq %rsi, %rsi
1209 ; SSSE3-NEXT: setns %bl
1210 ; SSSE3-NEXT: cmpb %al, %bl
1211 ; SSSE3-NEXT: setne %bpl
1212 ; SSSE3-NEXT: subq %r8, %rdi
1213 ; SSSE3-NEXT: sbbq %r9, %rsi
1214 ; SSSE3-NEXT: setns %al
1215 ; SSSE3-NEXT: cmpb %al, %bl
1216 ; SSSE3-NEXT: setne %al
1217 ; SSSE3-NEXT: andb %bpl, %al
1218 ; SSSE3-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1219 ; SSSE3-NEXT: movq %rcx, %rbp
1220 ; SSSE3-NEXT: sbbq %r10, %rbp
1221 ; SSSE3-NEXT: setns %bl
1222 ; SSSE3-NEXT: testq %rcx, %rcx
1223 ; SSSE3-NEXT: setns %cl
1224 ; SSSE3-NEXT: cmpb %bl, %cl
1225 ; SSSE3-NEXT: setne %r8b
1226 ; SSSE3-NEXT: testq %r10, %r10
1227 ; SSSE3-NEXT: setns %bl
1228 ; SSSE3-NEXT: cmpb %bl, %cl
1229 ; SSSE3-NEXT: setne %cl
1230 ; SSSE3-NEXT: andb %r8b, %cl
1231 ; SSSE3-NEXT: movzbl %cl, %ecx
1232 ; SSSE3-NEXT: negl %ecx
1233 ; SSSE3-NEXT: movd %ecx, %xmm1
1234 ; SSSE3-NEXT: movzbl %al, %eax
1235 ; SSSE3-NEXT: negl %eax
1236 ; SSSE3-NEXT: movd %eax, %xmm0
1237 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1238 ; SSSE3-NEXT: movq %rdx, 16(%r11)
1239 ; SSSE3-NEXT: movq %rdi, (%r11)
1240 ; SSSE3-NEXT: movq %rbp, 24(%r11)
1241 ; SSSE3-NEXT: movq %rsi, 8(%r11)
1242 ; SSSE3-NEXT: popq %rbx
1243 ; SSSE3-NEXT: popq %rbp
1246 ; SSE41-LABEL: ssubo_v2i128:
1248 ; SSE41-NEXT: pushq %rbp
1249 ; SSE41-NEXT: pushq %rbx
1250 ; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %r11
1251 ; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %r10
1252 ; SSE41-NEXT: testq %r9, %r9
1253 ; SSE41-NEXT: setns %al
1254 ; SSE41-NEXT: testq %rsi, %rsi
1255 ; SSE41-NEXT: setns %bl
1256 ; SSE41-NEXT: cmpb %al, %bl
1257 ; SSE41-NEXT: setne %bpl
1258 ; SSE41-NEXT: subq %r8, %rdi
1259 ; SSE41-NEXT: sbbq %r9, %rsi
1260 ; SSE41-NEXT: setns %al
1261 ; SSE41-NEXT: cmpb %al, %bl
1262 ; SSE41-NEXT: setne %al
1263 ; SSE41-NEXT: andb %bpl, %al
1264 ; SSE41-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1265 ; SSE41-NEXT: movq %rcx, %rbp
1266 ; SSE41-NEXT: sbbq %r10, %rbp
1267 ; SSE41-NEXT: setns %bl
1268 ; SSE41-NEXT: testq %rcx, %rcx
1269 ; SSE41-NEXT: setns %cl
1270 ; SSE41-NEXT: cmpb %bl, %cl
1271 ; SSE41-NEXT: setne %r8b
1272 ; SSE41-NEXT: testq %r10, %r10
1273 ; SSE41-NEXT: setns %bl
1274 ; SSE41-NEXT: cmpb %bl, %cl
1275 ; SSE41-NEXT: setne %cl
1276 ; SSE41-NEXT: andb %r8b, %cl
1277 ; SSE41-NEXT: movzbl %cl, %ecx
1278 ; SSE41-NEXT: negl %ecx
1279 ; SSE41-NEXT: movzbl %al, %eax
1280 ; SSE41-NEXT: negl %eax
1281 ; SSE41-NEXT: movd %eax, %xmm0
1282 ; SSE41-NEXT: pinsrd $1, %ecx, %xmm0
1283 ; SSE41-NEXT: movq %rdx, 16(%r11)
1284 ; SSE41-NEXT: movq %rdi, (%r11)
1285 ; SSE41-NEXT: movq %rbp, 24(%r11)
1286 ; SSE41-NEXT: movq %rsi, 8(%r11)
1287 ; SSE41-NEXT: popq %rbx
1288 ; SSE41-NEXT: popq %rbp
1291 ; AVX1-LABEL: ssubo_v2i128:
1293 ; AVX1-NEXT: pushq %rbp
1294 ; AVX1-NEXT: pushq %rbx
1295 ; AVX1-NEXT: movq {{[0-9]+}}(%rsp), %r11
1296 ; AVX1-NEXT: movq {{[0-9]+}}(%rsp), %r10
1297 ; AVX1-NEXT: testq %r9, %r9
1298 ; AVX1-NEXT: setns %al
1299 ; AVX1-NEXT: testq %rsi, %rsi
1300 ; AVX1-NEXT: setns %bl
1301 ; AVX1-NEXT: cmpb %al, %bl
1302 ; AVX1-NEXT: setne %bpl
1303 ; AVX1-NEXT: subq %r8, %rdi
1304 ; AVX1-NEXT: sbbq %r9, %rsi
1305 ; AVX1-NEXT: setns %al
1306 ; AVX1-NEXT: cmpb %al, %bl
1307 ; AVX1-NEXT: setne %al
1308 ; AVX1-NEXT: andb %bpl, %al
1309 ; AVX1-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1310 ; AVX1-NEXT: movq %rcx, %rbp
1311 ; AVX1-NEXT: sbbq %r10, %rbp
1312 ; AVX1-NEXT: setns %bl
1313 ; AVX1-NEXT: testq %rcx, %rcx
1314 ; AVX1-NEXT: setns %cl
1315 ; AVX1-NEXT: cmpb %bl, %cl
1316 ; AVX1-NEXT: setne %r8b
1317 ; AVX1-NEXT: testq %r10, %r10
1318 ; AVX1-NEXT: setns %bl
1319 ; AVX1-NEXT: cmpb %bl, %cl
1320 ; AVX1-NEXT: setne %cl
1321 ; AVX1-NEXT: andb %r8b, %cl
1322 ; AVX1-NEXT: movzbl %cl, %ecx
1323 ; AVX1-NEXT: negl %ecx
1324 ; AVX1-NEXT: movzbl %al, %eax
1325 ; AVX1-NEXT: negl %eax
1326 ; AVX1-NEXT: vmovd %eax, %xmm0
1327 ; AVX1-NEXT: vpinsrd $1, %ecx, %xmm0, %xmm0
1328 ; AVX1-NEXT: movq %rdx, 16(%r11)
1329 ; AVX1-NEXT: movq %rdi, (%r11)
1330 ; AVX1-NEXT: movq %rbp, 24(%r11)
1331 ; AVX1-NEXT: movq %rsi, 8(%r11)
1332 ; AVX1-NEXT: popq %rbx
1333 ; AVX1-NEXT: popq %rbp
1336 ; AVX2-LABEL: ssubo_v2i128:
1338 ; AVX2-NEXT: pushq %rbp
1339 ; AVX2-NEXT: pushq %rbx
1340 ; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %r11
1341 ; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %r10
1342 ; AVX2-NEXT: testq %r9, %r9
1343 ; AVX2-NEXT: setns %al
1344 ; AVX2-NEXT: testq %rsi, %rsi
1345 ; AVX2-NEXT: setns %bl
1346 ; AVX2-NEXT: cmpb %al, %bl
1347 ; AVX2-NEXT: setne %bpl
1348 ; AVX2-NEXT: subq %r8, %rdi
1349 ; AVX2-NEXT: sbbq %r9, %rsi
1350 ; AVX2-NEXT: setns %al
1351 ; AVX2-NEXT: cmpb %al, %bl
1352 ; AVX2-NEXT: setne %al
1353 ; AVX2-NEXT: andb %bpl, %al
1354 ; AVX2-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1355 ; AVX2-NEXT: movq %rcx, %rbp
1356 ; AVX2-NEXT: sbbq %r10, %rbp
1357 ; AVX2-NEXT: setns %bl
1358 ; AVX2-NEXT: testq %rcx, %rcx
1359 ; AVX2-NEXT: setns %cl
1360 ; AVX2-NEXT: cmpb %bl, %cl
1361 ; AVX2-NEXT: setne %r8b
1362 ; AVX2-NEXT: testq %r10, %r10
1363 ; AVX2-NEXT: setns %bl
1364 ; AVX2-NEXT: cmpb %bl, %cl
1365 ; AVX2-NEXT: setne %cl
1366 ; AVX2-NEXT: andb %r8b, %cl
1367 ; AVX2-NEXT: movzbl %cl, %ecx
1368 ; AVX2-NEXT: negl %ecx
1369 ; AVX2-NEXT: movzbl %al, %eax
1370 ; AVX2-NEXT: negl %eax
1371 ; AVX2-NEXT: vmovd %eax, %xmm0
1372 ; AVX2-NEXT: vpinsrd $1, %ecx, %xmm0, %xmm0
1373 ; AVX2-NEXT: movq %rdx, 16(%r11)
1374 ; AVX2-NEXT: movq %rdi, (%r11)
1375 ; AVX2-NEXT: movq %rbp, 24(%r11)
1376 ; AVX2-NEXT: movq %rsi, 8(%r11)
1377 ; AVX2-NEXT: popq %rbx
1378 ; AVX2-NEXT: popq %rbp
1381 ; AVX512-LABEL: ssubo_v2i128:
1383 ; AVX512-NEXT: pushq %rbp
1384 ; AVX512-NEXT: pushq %rbx
1385 ; AVX512-NEXT: movq {{[0-9]+}}(%rsp), %r11
1386 ; AVX512-NEXT: movq {{[0-9]+}}(%rsp), %r10
1387 ; AVX512-NEXT: testq %r9, %r9
1388 ; AVX512-NEXT: setns %al
1389 ; AVX512-NEXT: testq %rsi, %rsi
1390 ; AVX512-NEXT: setns %bl
1391 ; AVX512-NEXT: cmpb %al, %bl
1392 ; AVX512-NEXT: setne %bpl
1393 ; AVX512-NEXT: subq %r8, %rdi
1394 ; AVX512-NEXT: sbbq %r9, %rsi
1395 ; AVX512-NEXT: setns %al
1396 ; AVX512-NEXT: cmpb %al, %bl
1397 ; AVX512-NEXT: setne %al
1398 ; AVX512-NEXT: andb %bpl, %al
1399 ; AVX512-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1400 ; AVX512-NEXT: movq %rcx, %rbp
1401 ; AVX512-NEXT: sbbq %r10, %rbp
1402 ; AVX512-NEXT: setns %bl
1403 ; AVX512-NEXT: testq %rcx, %rcx
1404 ; AVX512-NEXT: setns %cl
1405 ; AVX512-NEXT: cmpb %bl, %cl
1406 ; AVX512-NEXT: setne %r8b
1407 ; AVX512-NEXT: testq %r10, %r10
1408 ; AVX512-NEXT: setns %bl
1409 ; AVX512-NEXT: cmpb %bl, %cl
1410 ; AVX512-NEXT: setne %cl
1411 ; AVX512-NEXT: andb %r8b, %cl
1412 ; AVX512-NEXT: kmovd %ecx, %k0
1413 ; AVX512-NEXT: kshiftlw $1, %k0, %k0
1414 ; AVX512-NEXT: andl $1, %eax
1415 ; AVX512-NEXT: kmovw %eax, %k1
1416 ; AVX512-NEXT: korw %k0, %k1, %k1
1417 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1418 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
1419 ; AVX512-NEXT: movq %rdx, 16(%r11)
1420 ; AVX512-NEXT: movq %rdi, (%r11)
1421 ; AVX512-NEXT: movq %rbp, 24(%r11)
1422 ; AVX512-NEXT: movq %rsi, 8(%r11)
1423 ; AVX512-NEXT: popq %rbx
1424 ; AVX512-NEXT: popq %rbp
1426 %t = call {<2 x i128>, <2 x i1>} @llvm.ssub.with.overflow.v2i128(<2 x i128> %a0, <2 x i128> %a1)
1427 %val = extractvalue {<2 x i128>, <2 x i1>} %t, 0
1428 %obit = extractvalue {<2 x i128>, <2 x i1>} %t, 1
1429 %res = sext <2 x i1> %obit to <2 x i32>
1430 store <2 x i128> %val, <2 x i128>* %p2