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.usub.with.overflow.v1i32(<1 x i32>, <1 x i32>)
10 declare {<2 x i32>, <2 x i1>} @llvm.usub.with.overflow.v2i32(<2 x i32>, <2 x i32>)
11 declare {<3 x i32>, <3 x i1>} @llvm.usub.with.overflow.v3i32(<3 x i32>, <3 x i32>)
12 declare {<4 x i32>, <4 x i1>} @llvm.usub.with.overflow.v4i32(<4 x i32>, <4 x i32>)
13 declare {<6 x i32>, <6 x i1>} @llvm.usub.with.overflow.v6i32(<6 x i32>, <6 x i32>)
14 declare {<8 x i32>, <8 x i1>} @llvm.usub.with.overflow.v8i32(<8 x i32>, <8 x i32>)
15 declare {<16 x i32>, <16 x i1>} @llvm.usub.with.overflow.v16i32(<16 x i32>, <16 x i32>)
17 declare {<16 x i8>, <16 x i1>} @llvm.usub.with.overflow.v16i8(<16 x i8>, <16 x i8>)
18 declare {<8 x i16>, <8 x i1>} @llvm.usub.with.overflow.v8i16(<8 x i16>, <8 x i16>)
19 declare {<2 x i64>, <2 x i1>} @llvm.usub.with.overflow.v2i64(<2 x i64>, <2 x i64>)
21 declare {<4 x i24>, <4 x i1>} @llvm.usub.with.overflow.v4i24(<4 x i24>, <4 x i24>)
22 declare {<4 x i1>, <4 x i1>} @llvm.usub.with.overflow.v4i1(<4 x i1>, <4 x i1>)
23 declare {<2 x i128>, <2 x i1>} @llvm.usub.with.overflow.v2i128(<2 x i128>, <2 x i128>)
25 define <1 x i32> @usubo_v1i32(<1 x i32> %a0, <1 x i32> %a1, <1 x i32>* %p2) nounwind {
26 ; SSE-LABEL: usubo_v1i32:
28 ; SSE-NEXT: subl %esi, %edi
29 ; SSE-NEXT: sbbl %eax, %eax
30 ; SSE-NEXT: movl %edi, (%rdx)
33 ; AVX-LABEL: usubo_v1i32:
35 ; AVX-NEXT: subl %esi, %edi
36 ; AVX-NEXT: sbbl %eax, %eax
37 ; AVX-NEXT: movl %edi, (%rdx)
39 %t = call {<1 x i32>, <1 x i1>} @llvm.usub.with.overflow.v1i32(<1 x i32> %a0, <1 x i32> %a1)
40 %val = extractvalue {<1 x i32>, <1 x i1>} %t, 0
41 %obit = extractvalue {<1 x i32>, <1 x i1>} %t, 1
42 %res = sext <1 x i1> %obit to <1 x i32>
43 store <1 x i32> %val, <1 x i32>* %p2
47 define <2 x i32> @usubo_v2i32(<2 x i32> %a0, <2 x i32> %a1, <2 x i32>* %p2) nounwind {
48 ; SSE2-LABEL: usubo_v2i32:
50 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [4294967295,0,4294967295,0]
51 ; SSE2-NEXT: pand %xmm2, %xmm1
52 ; SSE2-NEXT: pand %xmm2, %xmm0
53 ; SSE2-NEXT: psubq %xmm1, %xmm0
54 ; SSE2-NEXT: pand %xmm0, %xmm2
55 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm2
56 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,0,3,2]
57 ; SSE2-NEXT: pand %xmm2, %xmm3
58 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
59 ; SSE2-NEXT: pxor %xmm3, %xmm1
60 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
61 ; SSE2-NEXT: movq %xmm0, (%rdi)
62 ; SSE2-NEXT: movdqa %xmm1, %xmm0
65 ; SSSE3-LABEL: usubo_v2i32:
67 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [4294967295,0,4294967295,0]
68 ; SSSE3-NEXT: pand %xmm2, %xmm1
69 ; SSSE3-NEXT: pand %xmm2, %xmm0
70 ; SSSE3-NEXT: psubq %xmm1, %xmm0
71 ; SSSE3-NEXT: pand %xmm0, %xmm2
72 ; SSSE3-NEXT: pcmpeqd %xmm0, %xmm2
73 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,0,3,2]
74 ; SSSE3-NEXT: pand %xmm2, %xmm3
75 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1
76 ; SSSE3-NEXT: pxor %xmm3, %xmm1
77 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
78 ; SSSE3-NEXT: movq %xmm0, (%rdi)
79 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
82 ; SSE41-LABEL: usubo_v2i32:
84 ; SSE41-NEXT: pxor %xmm2, %xmm2
85 ; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
86 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
87 ; SSE41-NEXT: psubq %xmm1, %xmm0
88 ; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
89 ; SSE41-NEXT: pcmpeqq %xmm0, %xmm2
90 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
91 ; SSE41-NEXT: pxor %xmm2, %xmm1
92 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
93 ; SSE41-NEXT: movq %xmm0, (%rdi)
94 ; SSE41-NEXT: movdqa %xmm1, %xmm0
97 ; AVX1-LABEL: usubo_v2i32:
99 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
100 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
101 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
102 ; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm1
103 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
104 ; AVX1-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
105 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
106 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
107 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
108 ; AVX1-NEXT: vmovq %xmm1, (%rdi)
111 ; AVX2-LABEL: usubo_v2i32:
113 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
114 ; AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]
115 ; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
116 ; AVX2-NEXT: vpsubq %xmm1, %xmm0, %xmm1
117 ; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]
118 ; AVX2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
119 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
120 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
121 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
122 ; AVX2-NEXT: vmovq %xmm1, (%rdi)
125 ; AVX512-LABEL: usubo_v2i32:
127 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
128 ; AVX512-NEXT: vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]
129 ; AVX512-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
130 ; AVX512-NEXT: vpsubq %xmm1, %xmm0, %xmm0
131 ; AVX512-NEXT: vpblendd {{.*#+}} xmm1 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
132 ; AVX512-NEXT: vpmovqd %xmm0, (%rdi)
133 ; AVX512-NEXT: vpcmpeqq %xmm0, %xmm1, %xmm0
134 ; AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
136 %t = call {<2 x i32>, <2 x i1>} @llvm.usub.with.overflow.v2i32(<2 x i32> %a0, <2 x i32> %a1)
137 %val = extractvalue {<2 x i32>, <2 x i1>} %t, 0
138 %obit = extractvalue {<2 x i32>, <2 x i1>} %t, 1
139 %res = sext <2 x i1> %obit to <2 x i32>
140 store <2 x i32> %val, <2 x i32>* %p2
144 define <3 x i32> @usubo_v3i32(<3 x i32> %a0, <3 x i32> %a1, <3 x i32>* %p2) nounwind {
145 ; SSE2-LABEL: usubo_v3i32:
147 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
148 ; SSE2-NEXT: movdqa %xmm0, %xmm3
149 ; SSE2-NEXT: pxor %xmm2, %xmm3
150 ; SSE2-NEXT: psubd %xmm1, %xmm0
151 ; SSE2-NEXT: pxor %xmm0, %xmm2
152 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm2
153 ; SSE2-NEXT: movq %xmm0, (%rdi)
154 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
155 ; SSE2-NEXT: movd %xmm0, 8(%rdi)
156 ; SSE2-NEXT: movdqa %xmm2, %xmm0
159 ; SSSE3-LABEL: usubo_v3i32:
161 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
162 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
163 ; SSSE3-NEXT: pxor %xmm2, %xmm3
164 ; SSSE3-NEXT: psubd %xmm1, %xmm0
165 ; SSSE3-NEXT: pxor %xmm0, %xmm2
166 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm2
167 ; SSSE3-NEXT: movq %xmm0, (%rdi)
168 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
169 ; SSSE3-NEXT: movd %xmm0, 8(%rdi)
170 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
173 ; SSE41-LABEL: usubo_v3i32:
175 ; SSE41-NEXT: movdqa %xmm0, %xmm2
176 ; SSE41-NEXT: psubd %xmm1, %xmm2
177 ; SSE41-NEXT: pminud %xmm2, %xmm0
178 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm0
179 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
180 ; SSE41-NEXT: pxor %xmm1, %xmm0
181 ; SSE41-NEXT: pextrd $2, %xmm2, 8(%rdi)
182 ; SSE41-NEXT: movq %xmm2, (%rdi)
185 ; AVX1-LABEL: usubo_v3i32:
187 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
188 ; AVX1-NEXT: vpminud %xmm0, %xmm1, %xmm0
189 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
190 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
191 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
192 ; AVX1-NEXT: vpextrd $2, %xmm1, 8(%rdi)
193 ; AVX1-NEXT: vmovq %xmm1, (%rdi)
196 ; AVX2-LABEL: usubo_v3i32:
198 ; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm1
199 ; AVX2-NEXT: vpminud %xmm0, %xmm1, %xmm0
200 ; AVX2-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
201 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
202 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
203 ; AVX2-NEXT: vpextrd $2, %xmm1, 8(%rdi)
204 ; AVX2-NEXT: vmovq %xmm1, (%rdi)
207 ; AVX512-LABEL: usubo_v3i32:
209 ; AVX512-NEXT: vpsubd %xmm1, %xmm0, %xmm1
210 ; AVX512-NEXT: vpcmpnleud %xmm0, %xmm1, %k1
211 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
212 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
213 ; AVX512-NEXT: vpextrd $2, %xmm1, 8(%rdi)
214 ; AVX512-NEXT: vmovq %xmm1, (%rdi)
216 %t = call {<3 x i32>, <3 x i1>} @llvm.usub.with.overflow.v3i32(<3 x i32> %a0, <3 x i32> %a1)
217 %val = extractvalue {<3 x i32>, <3 x i1>} %t, 0
218 %obit = extractvalue {<3 x i32>, <3 x i1>} %t, 1
219 %res = sext <3 x i1> %obit to <3 x i32>
220 store <3 x i32> %val, <3 x i32>* %p2
224 define <4 x i32> @usubo_v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i32>* %p2) nounwind {
225 ; SSE2-LABEL: usubo_v4i32:
227 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
228 ; SSE2-NEXT: movdqa %xmm0, %xmm3
229 ; SSE2-NEXT: pxor %xmm2, %xmm3
230 ; SSE2-NEXT: psubd %xmm1, %xmm0
231 ; SSE2-NEXT: pxor %xmm0, %xmm2
232 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm2
233 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
234 ; SSE2-NEXT: movdqa %xmm2, %xmm0
237 ; SSSE3-LABEL: usubo_v4i32:
239 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
240 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
241 ; SSSE3-NEXT: pxor %xmm2, %xmm3
242 ; SSSE3-NEXT: psubd %xmm1, %xmm0
243 ; SSSE3-NEXT: pxor %xmm0, %xmm2
244 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm2
245 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
246 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
249 ; SSE41-LABEL: usubo_v4i32:
251 ; SSE41-NEXT: movdqa %xmm0, %xmm2
252 ; SSE41-NEXT: psubd %xmm1, %xmm2
253 ; SSE41-NEXT: pminud %xmm2, %xmm0
254 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm0
255 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
256 ; SSE41-NEXT: pxor %xmm1, %xmm0
257 ; SSE41-NEXT: movdqa %xmm2, (%rdi)
260 ; AVX1-LABEL: usubo_v4i32:
262 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
263 ; AVX1-NEXT: vpminud %xmm0, %xmm1, %xmm0
264 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
265 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
266 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
267 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
270 ; AVX2-LABEL: usubo_v4i32:
272 ; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm1
273 ; AVX2-NEXT: vpminud %xmm0, %xmm1, %xmm0
274 ; AVX2-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
275 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
276 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
277 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
280 ; AVX512-LABEL: usubo_v4i32:
282 ; AVX512-NEXT: vpsubd %xmm1, %xmm0, %xmm1
283 ; AVX512-NEXT: vpcmpnleud %xmm0, %xmm1, %k1
284 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
285 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
286 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
288 %t = call {<4 x i32>, <4 x i1>} @llvm.usub.with.overflow.v4i32(<4 x i32> %a0, <4 x i32> %a1)
289 %val = extractvalue {<4 x i32>, <4 x i1>} %t, 0
290 %obit = extractvalue {<4 x i32>, <4 x i1>} %t, 1
291 %res = sext <4 x i1> %obit to <4 x i32>
292 store <4 x i32> %val, <4 x i32>* %p2
296 define <6 x i32> @usubo_v6i32(<6 x i32> %a0, <6 x i32> %a1, <6 x i32>* %p2) nounwind {
297 ; SSE2-LABEL: usubo_v6i32:
299 ; SSE2-NEXT: movq %rdi, %rax
300 ; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
301 ; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
302 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
303 ; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
304 ; SSE2-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
305 ; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
306 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
307 ; SSE2-NEXT: movd %r8d, %xmm0
308 ; SSE2-NEXT: movd %ecx, %xmm1
309 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
310 ; SSE2-NEXT: movd %edx, %xmm3
311 ; SSE2-NEXT: movd %esi, %xmm0
312 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
313 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
314 ; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
315 ; SSE2-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
316 ; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
317 ; SSE2-NEXT: movd %r9d, %xmm1
318 ; SSE2-NEXT: movd {{.*#+}} xmm4 = mem[0],zero,zero,zero
319 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]
320 ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %rcx
321 ; SSE2-NEXT: movdqa %xmm0, %xmm4
322 ; SSE2-NEXT: psubd %xmm2, %xmm4
323 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
324 ; SSE2-NEXT: movdqa %xmm4, (%rcx)
325 ; SSE2-NEXT: pxor %xmm2, %xmm4
326 ; SSE2-NEXT: pxor %xmm2, %xmm0
327 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
328 ; SSE2-NEXT: movdqa %xmm1, %xmm0
329 ; SSE2-NEXT: psubd %xmm3, %xmm0
330 ; SSE2-NEXT: movq %xmm0, 16(%rcx)
331 ; SSE2-NEXT: pxor %xmm2, %xmm0
332 ; SSE2-NEXT: pxor %xmm2, %xmm1
333 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm0
334 ; SSE2-NEXT: movq %xmm0, 16(%rdi)
335 ; SSE2-NEXT: movdqa %xmm4, (%rdi)
338 ; SSSE3-LABEL: usubo_v6i32:
340 ; SSSE3-NEXT: movq %rdi, %rax
341 ; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
342 ; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
343 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
344 ; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
345 ; SSSE3-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
346 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
347 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
348 ; SSSE3-NEXT: movd %r8d, %xmm0
349 ; SSSE3-NEXT: movd %ecx, %xmm1
350 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
351 ; SSSE3-NEXT: movd %edx, %xmm3
352 ; SSSE3-NEXT: movd %esi, %xmm0
353 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
354 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
355 ; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
356 ; SSSE3-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
357 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
358 ; SSSE3-NEXT: movd %r9d, %xmm1
359 ; SSSE3-NEXT: movd {{.*#+}} xmm4 = mem[0],zero,zero,zero
360 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]
361 ; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %rcx
362 ; SSSE3-NEXT: movdqa %xmm0, %xmm4
363 ; SSSE3-NEXT: psubd %xmm2, %xmm4
364 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
365 ; SSSE3-NEXT: movdqa %xmm4, (%rcx)
366 ; SSSE3-NEXT: pxor %xmm2, %xmm4
367 ; SSSE3-NEXT: pxor %xmm2, %xmm0
368 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
369 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
370 ; SSSE3-NEXT: psubd %xmm3, %xmm0
371 ; SSSE3-NEXT: movq %xmm0, 16(%rcx)
372 ; SSSE3-NEXT: pxor %xmm2, %xmm0
373 ; SSSE3-NEXT: pxor %xmm2, %xmm1
374 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm0
375 ; SSSE3-NEXT: movq %xmm0, 16(%rdi)
376 ; SSSE3-NEXT: movdqa %xmm4, (%rdi)
379 ; SSE41-LABEL: usubo_v6i32:
381 ; SSE41-NEXT: movq %rdi, %rax
382 ; SSE41-NEXT: movd %esi, %xmm0
383 ; SSE41-NEXT: pinsrd $1, %edx, %xmm0
384 ; SSE41-NEXT: pinsrd $2, %ecx, %xmm0
385 ; SSE41-NEXT: pinsrd $3, %r8d, %xmm0
386 ; SSE41-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
387 ; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm1
388 ; SSE41-NEXT: movd %r9d, %xmm2
389 ; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm2
390 ; SSE41-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
391 ; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm3
392 ; SSE41-NEXT: pinsrd $2, {{[0-9]+}}(%rsp), %xmm3
393 ; SSE41-NEXT: pinsrd $3, {{[0-9]+}}(%rsp), %xmm3
394 ; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %rcx
395 ; SSE41-NEXT: movdqa %xmm0, %xmm4
396 ; SSE41-NEXT: psubd %xmm3, %xmm4
397 ; SSE41-NEXT: pminud %xmm4, %xmm0
398 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm0
399 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm3
400 ; SSE41-NEXT: pxor %xmm3, %xmm0
401 ; SSE41-NEXT: movdqa %xmm2, %xmm5
402 ; SSE41-NEXT: psubd %xmm1, %xmm5
403 ; SSE41-NEXT: pminud %xmm5, %xmm2
404 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm2
405 ; SSE41-NEXT: pxor %xmm3, %xmm2
406 ; SSE41-NEXT: movq %xmm5, 16(%rcx)
407 ; SSE41-NEXT: movdqa %xmm4, (%rcx)
408 ; SSE41-NEXT: movq %xmm2, 16(%rdi)
409 ; SSE41-NEXT: movdqa %xmm0, (%rdi)
412 ; AVX1-LABEL: usubo_v6i32:
414 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
415 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
416 ; AVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm2
417 ; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm3
418 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm3
419 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
420 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
421 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
422 ; AVX1-NEXT: vpminud %xmm0, %xmm1, %xmm0
423 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
424 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
425 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
426 ; AVX1-NEXT: vmovq %xmm2, 16(%rdi)
427 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
430 ; AVX2-LABEL: usubo_v6i32:
432 ; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm1
433 ; AVX2-NEXT: vpminud %ymm0, %ymm1, %ymm0
434 ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm1, %ymm0
435 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2
436 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
437 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
438 ; AVX2-NEXT: vmovq %xmm2, 16(%rdi)
439 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
442 ; AVX512-LABEL: usubo_v6i32:
444 ; AVX512-NEXT: vpsubd %ymm1, %ymm0, %ymm1
445 ; AVX512-NEXT: vpcmpnleud %ymm0, %ymm1, %k1
446 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
447 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
448 ; AVX512-NEXT: vextracti128 $1, %ymm1, %xmm2
449 ; AVX512-NEXT: vmovq %xmm2, 16(%rdi)
450 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
452 %t = call {<6 x i32>, <6 x i1>} @llvm.usub.with.overflow.v6i32(<6 x i32> %a0, <6 x i32> %a1)
453 %val = extractvalue {<6 x i32>, <6 x i1>} %t, 0
454 %obit = extractvalue {<6 x i32>, <6 x i1>} %t, 1
455 %res = sext <6 x i1> %obit to <6 x i32>
456 store <6 x i32> %val, <6 x i32>* %p2
460 define <8 x i32> @usubo_v8i32(<8 x i32> %a0, <8 x i32> %a1, <8 x i32>* %p2) nounwind {
461 ; SSE2-LABEL: usubo_v8i32:
463 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
464 ; SSE2-NEXT: movdqa %xmm0, %xmm5
465 ; SSE2-NEXT: pxor %xmm4, %xmm5
466 ; SSE2-NEXT: psubd %xmm2, %xmm0
467 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
468 ; SSE2-NEXT: pxor %xmm4, %xmm0
469 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm0
470 ; SSE2-NEXT: movdqa %xmm1, %xmm2
471 ; SSE2-NEXT: pxor %xmm4, %xmm2
472 ; SSE2-NEXT: psubd %xmm3, %xmm1
473 ; SSE2-NEXT: pxor %xmm1, %xmm4
474 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
475 ; SSE2-NEXT: movdqa %xmm1, 16(%rdi)
476 ; SSE2-NEXT: movdqa %xmm4, %xmm1
479 ; SSSE3-LABEL: usubo_v8i32:
481 ; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
482 ; SSSE3-NEXT: movdqa %xmm0, %xmm5
483 ; SSSE3-NEXT: pxor %xmm4, %xmm5
484 ; SSSE3-NEXT: psubd %xmm2, %xmm0
485 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
486 ; SSSE3-NEXT: pxor %xmm4, %xmm0
487 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm0
488 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
489 ; SSSE3-NEXT: pxor %xmm4, %xmm2
490 ; SSSE3-NEXT: psubd %xmm3, %xmm1
491 ; SSSE3-NEXT: pxor %xmm1, %xmm4
492 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
493 ; SSSE3-NEXT: movdqa %xmm1, 16(%rdi)
494 ; SSSE3-NEXT: movdqa %xmm4, %xmm1
497 ; SSE41-LABEL: usubo_v8i32:
499 ; SSE41-NEXT: movdqa %xmm0, %xmm4
500 ; SSE41-NEXT: psubd %xmm2, %xmm4
501 ; SSE41-NEXT: pminud %xmm4, %xmm0
502 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm0
503 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm2
504 ; SSE41-NEXT: pxor %xmm2, %xmm0
505 ; SSE41-NEXT: movdqa %xmm1, %xmm5
506 ; SSE41-NEXT: psubd %xmm3, %xmm5
507 ; SSE41-NEXT: pminud %xmm5, %xmm1
508 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm1
509 ; SSE41-NEXT: pxor %xmm2, %xmm1
510 ; SSE41-NEXT: movdqa %xmm5, 16(%rdi)
511 ; SSE41-NEXT: movdqa %xmm4, (%rdi)
514 ; AVX1-LABEL: usubo_v8i32:
516 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
517 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
518 ; AVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm2
519 ; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm3
520 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm3
521 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
522 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
523 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
524 ; AVX1-NEXT: vpminud %xmm0, %xmm1, %xmm0
525 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
526 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
527 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
528 ; AVX1-NEXT: vmovdqa %xmm2, 16(%rdi)
529 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
532 ; AVX2-LABEL: usubo_v8i32:
534 ; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm1
535 ; AVX2-NEXT: vpminud %ymm0, %ymm1, %ymm0
536 ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm1, %ymm0
537 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2
538 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
539 ; AVX2-NEXT: vmovdqa %ymm1, (%rdi)
542 ; AVX512-LABEL: usubo_v8i32:
544 ; AVX512-NEXT: vpsubd %ymm1, %ymm0, %ymm1
545 ; AVX512-NEXT: vpcmpnleud %ymm0, %ymm1, %k1
546 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
547 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
548 ; AVX512-NEXT: vmovdqa %ymm1, (%rdi)
550 %t = call {<8 x i32>, <8 x i1>} @llvm.usub.with.overflow.v8i32(<8 x i32> %a0, <8 x i32> %a1)
551 %val = extractvalue {<8 x i32>, <8 x i1>} %t, 0
552 %obit = extractvalue {<8 x i32>, <8 x i1>} %t, 1
553 %res = sext <8 x i1> %obit to <8 x i32>
554 store <8 x i32> %val, <8 x i32>* %p2
558 define <16 x i32> @usubo_v16i32(<16 x i32> %a0, <16 x i32> %a1, <16 x i32>* %p2) nounwind {
559 ; SSE2-LABEL: usubo_v16i32:
561 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
562 ; SSE2-NEXT: movdqa %xmm0, %xmm9
563 ; SSE2-NEXT: pxor %xmm8, %xmm9
564 ; SSE2-NEXT: psubd %xmm4, %xmm0
565 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
566 ; SSE2-NEXT: pxor %xmm8, %xmm0
567 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm0
568 ; SSE2-NEXT: movdqa %xmm1, %xmm4
569 ; SSE2-NEXT: pxor %xmm8, %xmm4
570 ; SSE2-NEXT: psubd %xmm5, %xmm1
571 ; SSE2-NEXT: movdqa %xmm1, 16(%rdi)
572 ; SSE2-NEXT: pxor %xmm8, %xmm1
573 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm1
574 ; SSE2-NEXT: movdqa %xmm2, %xmm4
575 ; SSE2-NEXT: pxor %xmm8, %xmm4
576 ; SSE2-NEXT: psubd %xmm6, %xmm2
577 ; SSE2-NEXT: movdqa %xmm2, 32(%rdi)
578 ; SSE2-NEXT: pxor %xmm8, %xmm2
579 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm2
580 ; SSE2-NEXT: movdqa %xmm3, %xmm4
581 ; SSE2-NEXT: pxor %xmm8, %xmm4
582 ; SSE2-NEXT: psubd %xmm7, %xmm3
583 ; SSE2-NEXT: pxor %xmm3, %xmm8
584 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm8
585 ; SSE2-NEXT: movdqa %xmm3, 48(%rdi)
586 ; SSE2-NEXT: movdqa %xmm8, %xmm3
589 ; SSSE3-LABEL: usubo_v16i32:
591 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
592 ; SSSE3-NEXT: movdqa %xmm0, %xmm9
593 ; SSSE3-NEXT: pxor %xmm8, %xmm9
594 ; SSSE3-NEXT: psubd %xmm4, %xmm0
595 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
596 ; SSSE3-NEXT: pxor %xmm8, %xmm0
597 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm0
598 ; SSSE3-NEXT: movdqa %xmm1, %xmm4
599 ; SSSE3-NEXT: pxor %xmm8, %xmm4
600 ; SSSE3-NEXT: psubd %xmm5, %xmm1
601 ; SSSE3-NEXT: movdqa %xmm1, 16(%rdi)
602 ; SSSE3-NEXT: pxor %xmm8, %xmm1
603 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm1
604 ; SSSE3-NEXT: movdqa %xmm2, %xmm4
605 ; SSSE3-NEXT: pxor %xmm8, %xmm4
606 ; SSSE3-NEXT: psubd %xmm6, %xmm2
607 ; SSSE3-NEXT: movdqa %xmm2, 32(%rdi)
608 ; SSSE3-NEXT: pxor %xmm8, %xmm2
609 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm2
610 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
611 ; SSSE3-NEXT: pxor %xmm8, %xmm4
612 ; SSSE3-NEXT: psubd %xmm7, %xmm3
613 ; SSSE3-NEXT: pxor %xmm3, %xmm8
614 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm8
615 ; SSSE3-NEXT: movdqa %xmm3, 48(%rdi)
616 ; SSSE3-NEXT: movdqa %xmm8, %xmm3
619 ; SSE41-LABEL: usubo_v16i32:
621 ; SSE41-NEXT: movdqa %xmm0, %xmm8
622 ; SSE41-NEXT: psubd %xmm4, %xmm8
623 ; SSE41-NEXT: pminud %xmm8, %xmm0
624 ; SSE41-NEXT: pcmpeqd %xmm8, %xmm0
625 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm9
626 ; SSE41-NEXT: pxor %xmm9, %xmm0
627 ; SSE41-NEXT: movdqa %xmm1, %xmm4
628 ; SSE41-NEXT: psubd %xmm5, %xmm4
629 ; SSE41-NEXT: pminud %xmm4, %xmm1
630 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm1
631 ; SSE41-NEXT: pxor %xmm9, %xmm1
632 ; SSE41-NEXT: movdqa %xmm2, %xmm5
633 ; SSE41-NEXT: psubd %xmm6, %xmm5
634 ; SSE41-NEXT: pminud %xmm5, %xmm2
635 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm2
636 ; SSE41-NEXT: pxor %xmm9, %xmm2
637 ; SSE41-NEXT: movdqa %xmm3, %xmm6
638 ; SSE41-NEXT: psubd %xmm7, %xmm6
639 ; SSE41-NEXT: pminud %xmm6, %xmm3
640 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm3
641 ; SSE41-NEXT: pxor %xmm9, %xmm3
642 ; SSE41-NEXT: movdqa %xmm6, 48(%rdi)
643 ; SSE41-NEXT: movdqa %xmm5, 32(%rdi)
644 ; SSE41-NEXT: movdqa %xmm4, 16(%rdi)
645 ; SSE41-NEXT: movdqa %xmm8, (%rdi)
648 ; AVX1-LABEL: usubo_v16i32:
650 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
651 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
652 ; AVX1-NEXT: vpsubd %xmm4, %xmm5, %xmm4
653 ; AVX1-NEXT: vpminud %xmm5, %xmm4, %xmm5
654 ; AVX1-NEXT: vpcmpeqd %xmm5, %xmm4, %xmm5
655 ; AVX1-NEXT: vpcmpeqd %xmm6, %xmm6, %xmm6
656 ; AVX1-NEXT: vpxor %xmm6, %xmm5, %xmm5
657 ; AVX1-NEXT: vpsubd %xmm3, %xmm1, %xmm3
658 ; AVX1-NEXT: vpminud %xmm1, %xmm3, %xmm1
659 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm3, %xmm1
660 ; AVX1-NEXT: vpxor %xmm6, %xmm1, %xmm1
661 ; AVX1-NEXT: vpackssdw %xmm5, %xmm1, %xmm1
662 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5
663 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7
664 ; AVX1-NEXT: vpsubd %xmm5, %xmm7, %xmm5
665 ; AVX1-NEXT: vpminud %xmm7, %xmm5, %xmm7
666 ; AVX1-NEXT: vpcmpeqd %xmm7, %xmm5, %xmm7
667 ; AVX1-NEXT: vpxor %xmm6, %xmm7, %xmm7
668 ; AVX1-NEXT: vpsubd %xmm2, %xmm0, %xmm2
669 ; AVX1-NEXT: vpminud %xmm0, %xmm2, %xmm0
670 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm2, %xmm0
671 ; AVX1-NEXT: vpxor %xmm6, %xmm0, %xmm0
672 ; AVX1-NEXT: vpackssdw %xmm7, %xmm0, %xmm0
673 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm1
674 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0
675 ; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm1[1,1,2,3]
676 ; AVX1-NEXT: vpmovsxbd %xmm6, %xmm6
677 ; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm0, %ymm0
678 ; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm1[2,3,0,1]
679 ; AVX1-NEXT: vpmovsxbd %xmm6, %xmm6
680 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,0,1]
681 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
682 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm6, %ymm1
683 ; AVX1-NEXT: vmovdqa %xmm4, 48(%rdi)
684 ; AVX1-NEXT: vmovdqa %xmm3, 32(%rdi)
685 ; AVX1-NEXT: vmovdqa %xmm5, 16(%rdi)
686 ; AVX1-NEXT: vmovdqa %xmm2, (%rdi)
689 ; AVX2-LABEL: usubo_v16i32:
691 ; AVX2-NEXT: vpsubd %ymm3, %ymm1, %ymm3
692 ; AVX2-NEXT: vpminud %ymm1, %ymm3, %ymm1
693 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1
694 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4
695 ; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1
696 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5
697 ; AVX2-NEXT: vpackssdw %xmm5, %xmm1, %xmm1
698 ; AVX2-NEXT: vpsubd %ymm2, %ymm0, %ymm2
699 ; AVX2-NEXT: vpminud %ymm0, %ymm2, %ymm0
700 ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm2, %ymm0
701 ; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm0
702 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4
703 ; AVX2-NEXT: vpackssdw %xmm4, %xmm0, %xmm0
704 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1
705 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0
706 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
707 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1
708 ; AVX2-NEXT: vmovdqa %ymm3, 32(%rdi)
709 ; AVX2-NEXT: vmovdqa %ymm2, (%rdi)
712 ; AVX512-LABEL: usubo_v16i32:
714 ; AVX512-NEXT: vpsubd %zmm1, %zmm0, %zmm1
715 ; AVX512-NEXT: vpcmpnleud %zmm0, %zmm1, %k1
716 ; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
717 ; AVX512-NEXT: vmovdqa64 %zmm1, (%rdi)
719 %t = call {<16 x i32>, <16 x i1>} @llvm.usub.with.overflow.v16i32(<16 x i32> %a0, <16 x i32> %a1)
720 %val = extractvalue {<16 x i32>, <16 x i1>} %t, 0
721 %obit = extractvalue {<16 x i32>, <16 x i1>} %t, 1
722 %res = sext <16 x i1> %obit to <16 x i32>
723 store <16 x i32> %val, <16 x i32>* %p2
727 define <16 x i32> @usubo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nounwind {
728 ; SSE2-LABEL: usubo_v16i8:
730 ; SSE2-NEXT: movdqa %xmm0, %xmm4
731 ; SSE2-NEXT: psubb %xmm1, %xmm4
732 ; SSE2-NEXT: pminub %xmm4, %xmm0
733 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm0
734 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm3
735 ; SSE2-NEXT: pxor %xmm0, %xmm3
736 ; SSE2-NEXT: movdqa %xmm3, %xmm1
737 ; 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]
738 ; SSE2-NEXT: movdqa %xmm1, %xmm0
739 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
740 ; SSE2-NEXT: pslld $31, %xmm0
741 ; SSE2-NEXT: psrad $31, %xmm0
742 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
743 ; SSE2-NEXT: pslld $31, %xmm1
744 ; SSE2-NEXT: psrad $31, %xmm1
745 ; 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]
746 ; SSE2-NEXT: movdqa %xmm3, %xmm2
747 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
748 ; SSE2-NEXT: pslld $31, %xmm2
749 ; SSE2-NEXT: psrad $31, %xmm2
750 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
751 ; SSE2-NEXT: pslld $31, %xmm3
752 ; SSE2-NEXT: psrad $31, %xmm3
753 ; SSE2-NEXT: movdqa %xmm4, (%rdi)
756 ; SSSE3-LABEL: usubo_v16i8:
758 ; SSSE3-NEXT: movdqa %xmm0, %xmm4
759 ; SSSE3-NEXT: psubb %xmm1, %xmm4
760 ; SSSE3-NEXT: pminub %xmm4, %xmm0
761 ; SSSE3-NEXT: pcmpeqb %xmm4, %xmm0
762 ; SSSE3-NEXT: pcmpeqd %xmm3, %xmm3
763 ; SSSE3-NEXT: pxor %xmm0, %xmm3
764 ; SSSE3-NEXT: movdqa %xmm3, %xmm1
765 ; 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]
766 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
767 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
768 ; SSSE3-NEXT: pslld $31, %xmm0
769 ; SSSE3-NEXT: psrad $31, %xmm0
770 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
771 ; SSSE3-NEXT: pslld $31, %xmm1
772 ; SSSE3-NEXT: psrad $31, %xmm1
773 ; 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]
774 ; SSSE3-NEXT: movdqa %xmm3, %xmm2
775 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
776 ; SSSE3-NEXT: pslld $31, %xmm2
777 ; SSSE3-NEXT: psrad $31, %xmm2
778 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
779 ; SSSE3-NEXT: pslld $31, %xmm3
780 ; SSSE3-NEXT: psrad $31, %xmm3
781 ; SSSE3-NEXT: movdqa %xmm4, (%rdi)
784 ; SSE41-LABEL: usubo_v16i8:
786 ; SSE41-NEXT: movdqa %xmm0, %xmm4
787 ; SSE41-NEXT: psubb %xmm1, %xmm4
788 ; SSE41-NEXT: pminub %xmm4, %xmm0
789 ; SSE41-NEXT: pcmpeqb %xmm4, %xmm0
790 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm3
791 ; SSE41-NEXT: pxor %xmm0, %xmm3
792 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
793 ; SSE41-NEXT: pslld $31, %xmm0
794 ; SSE41-NEXT: psrad $31, %xmm0
795 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,2,3]
796 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
797 ; SSE41-NEXT: pslld $31, %xmm1
798 ; SSE41-NEXT: psrad $31, %xmm1
799 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[2,3,0,1]
800 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
801 ; SSE41-NEXT: pslld $31, %xmm2
802 ; SSE41-NEXT: psrad $31, %xmm2
803 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[3,1,2,3]
804 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
805 ; SSE41-NEXT: pslld $31, %xmm3
806 ; SSE41-NEXT: psrad $31, %xmm3
807 ; SSE41-NEXT: movdqa %xmm4, (%rdi)
810 ; AVX1-LABEL: usubo_v16i8:
812 ; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm2
813 ; AVX1-NEXT: vpminub %xmm0, %xmm2, %xmm0
814 ; AVX1-NEXT: vpcmpeqb %xmm0, %xmm2, %xmm0
815 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
816 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm1
817 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0
818 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[1,1,2,3]
819 ; AVX1-NEXT: vpmovsxbd %xmm3, %xmm3
820 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
821 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
822 ; AVX1-NEXT: vpmovsxbd %xmm3, %xmm3
823 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,0,1]
824 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
825 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm1
826 ; AVX1-NEXT: vmovdqa %xmm2, (%rdi)
829 ; AVX2-LABEL: usubo_v16i8:
831 ; AVX2-NEXT: vpsubb %xmm1, %xmm0, %xmm2
832 ; AVX2-NEXT: vpminub %xmm0, %xmm2, %xmm0
833 ; AVX2-NEXT: vpcmpeqb %xmm0, %xmm2, %xmm0
834 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
835 ; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm1
836 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0
837 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
838 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1
839 ; AVX2-NEXT: vmovdqa %xmm2, (%rdi)
842 ; AVX512-LABEL: usubo_v16i8:
844 ; AVX512-NEXT: vpsubb %xmm1, %xmm0, %xmm1
845 ; AVX512-NEXT: vpcmpnleub %xmm0, %xmm1, %k1
846 ; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
847 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
849 %t = call {<16 x i8>, <16 x i1>} @llvm.usub.with.overflow.v16i8(<16 x i8> %a0, <16 x i8> %a1)
850 %val = extractvalue {<16 x i8>, <16 x i1>} %t, 0
851 %obit = extractvalue {<16 x i8>, <16 x i1>} %t, 1
852 %res = sext <16 x i1> %obit to <16 x i32>
853 store <16 x i8> %val, <16 x i8>* %p2
857 define <8 x i32> @usubo_v8i16(<8 x i16> %a0, <8 x i16> %a1, <8 x i16>* %p2) nounwind {
858 ; SSE2-LABEL: usubo_v8i16:
860 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
861 ; SSE2-NEXT: movdqa %xmm0, %xmm3
862 ; SSE2-NEXT: pxor %xmm2, %xmm3
863 ; SSE2-NEXT: psubw %xmm1, %xmm0
864 ; SSE2-NEXT: pxor %xmm0, %xmm2
865 ; SSE2-NEXT: pcmpgtw %xmm3, %xmm2
866 ; SSE2-NEXT: movdqa %xmm2, %xmm1
867 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
868 ; SSE2-NEXT: pslld $31, %xmm1
869 ; SSE2-NEXT: psrad $31, %xmm1
870 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
871 ; SSE2-NEXT: pslld $31, %xmm2
872 ; SSE2-NEXT: psrad $31, %xmm2
873 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
874 ; SSE2-NEXT: movdqa %xmm1, %xmm0
875 ; SSE2-NEXT: movdqa %xmm2, %xmm1
878 ; SSSE3-LABEL: usubo_v8i16:
880 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
881 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
882 ; SSSE3-NEXT: pxor %xmm2, %xmm3
883 ; SSSE3-NEXT: psubw %xmm1, %xmm0
884 ; SSSE3-NEXT: pxor %xmm0, %xmm2
885 ; SSSE3-NEXT: pcmpgtw %xmm3, %xmm2
886 ; SSSE3-NEXT: movdqa %xmm2, %xmm1
887 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
888 ; SSSE3-NEXT: pslld $31, %xmm1
889 ; SSSE3-NEXT: psrad $31, %xmm1
890 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
891 ; SSSE3-NEXT: pslld $31, %xmm2
892 ; SSSE3-NEXT: psrad $31, %xmm2
893 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
894 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
895 ; SSSE3-NEXT: movdqa %xmm2, %xmm1
898 ; SSE41-LABEL: usubo_v8i16:
900 ; SSE41-NEXT: movdqa %xmm0, %xmm2
901 ; SSE41-NEXT: psubw %xmm1, %xmm2
902 ; SSE41-NEXT: pminuw %xmm2, %xmm0
903 ; SSE41-NEXT: pcmpeqw %xmm2, %xmm0
904 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
905 ; SSE41-NEXT: pxor %xmm0, %xmm1
906 ; SSE41-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
907 ; SSE41-NEXT: pslld $31, %xmm0
908 ; SSE41-NEXT: psrad $31, %xmm0
909 ; SSE41-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
910 ; SSE41-NEXT: pslld $31, %xmm1
911 ; SSE41-NEXT: psrad $31, %xmm1
912 ; SSE41-NEXT: movdqa %xmm2, (%rdi)
915 ; AVX1-LABEL: usubo_v8i16:
917 ; AVX1-NEXT: vpsubw %xmm1, %xmm0, %xmm1
918 ; AVX1-NEXT: vpminuw %xmm0, %xmm1, %xmm0
919 ; AVX1-NEXT: vpcmpeqw %xmm0, %xmm1, %xmm0
920 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
921 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
922 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm2
923 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
924 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm0
925 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
926 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
929 ; AVX2-LABEL: usubo_v8i16:
931 ; AVX2-NEXT: vpsubw %xmm1, %xmm0, %xmm1
932 ; AVX2-NEXT: vpminuw %xmm0, %xmm1, %xmm0
933 ; AVX2-NEXT: vpcmpeqw %xmm0, %xmm1, %xmm0
934 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
935 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
936 ; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0
937 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
940 ; AVX512-LABEL: usubo_v8i16:
942 ; AVX512-NEXT: vpsubw %xmm1, %xmm0, %xmm1
943 ; AVX512-NEXT: vpcmpnleuw %xmm0, %xmm1, %k1
944 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
945 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
946 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
948 %t = call {<8 x i16>, <8 x i1>} @llvm.usub.with.overflow.v8i16(<8 x i16> %a0, <8 x i16> %a1)
949 %val = extractvalue {<8 x i16>, <8 x i1>} %t, 0
950 %obit = extractvalue {<8 x i16>, <8 x i1>} %t, 1
951 %res = sext <8 x i1> %obit to <8 x i32>
952 store <8 x i16> %val, <8 x i16>* %p2
956 define <2 x i32> @usubo_v2i64(<2 x i64> %a0, <2 x i64> %a1, <2 x i64>* %p2) nounwind {
957 ; SSE-LABEL: usubo_v2i64:
959 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
960 ; SSE-NEXT: movdqa %xmm0, %xmm3
961 ; SSE-NEXT: pxor %xmm2, %xmm3
962 ; SSE-NEXT: psubq %xmm1, %xmm0
963 ; SSE-NEXT: pxor %xmm0, %xmm2
964 ; SSE-NEXT: movdqa %xmm2, %xmm1
965 ; SSE-NEXT: pcmpgtd %xmm3, %xmm1
966 ; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
967 ; SSE-NEXT: pcmpeqd %xmm3, %xmm2
968 ; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
969 ; SSE-NEXT: pand %xmm4, %xmm2
970 ; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
971 ; SSE-NEXT: por %xmm2, %xmm1
972 ; SSE-NEXT: movdqa %xmm0, (%rdi)
973 ; SSE-NEXT: movdqa %xmm1, %xmm0
976 ; AVX1-LABEL: usubo_v2i64:
978 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
979 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm3
980 ; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm1
981 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm0
982 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm0, %xmm0
983 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
986 ; AVX2-LABEL: usubo_v2i64:
988 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
989 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm3
990 ; AVX2-NEXT: vpsubq %xmm1, %xmm0, %xmm1
991 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm0
992 ; AVX2-NEXT: vpcmpgtq %xmm3, %xmm0, %xmm0
993 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
996 ; AVX512-LABEL: usubo_v2i64:
998 ; AVX512-NEXT: vpsubq %xmm1, %xmm0, %xmm1
999 ; AVX512-NEXT: vpcmpnleuq %xmm0, %xmm1, %k1
1000 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
1001 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1002 ; AVX512-NEXT: vmovdqa64 %xmm0, %xmm0 {%k1} {z}
1004 %t = call {<2 x i64>, <2 x i1>} @llvm.usub.with.overflow.v2i64(<2 x i64> %a0, <2 x i64> %a1)
1005 %val = extractvalue {<2 x i64>, <2 x i1>} %t, 0
1006 %obit = extractvalue {<2 x i64>, <2 x i1>} %t, 1
1007 %res = sext <2 x i1> %obit to <2 x i32>
1008 store <2 x i64> %val, <2 x i64>* %p2
1012 define <4 x i32> @usubo_v4i24(<4 x i24> %a0, <4 x i24> %a1, <4 x i24>* %p2) nounwind {
1013 ; SSE2-LABEL: usubo_v4i24:
1015 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1016 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
1017 ; SSE2-NEXT: pand %xmm3, %xmm1
1018 ; SSE2-NEXT: pand %xmm3, %xmm2
1019 ; SSE2-NEXT: psubd %xmm1, %xmm2
1020 ; SSE2-NEXT: pand %xmm2, %xmm3
1021 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3
1022 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
1023 ; SSE2-NEXT: pxor %xmm3, %xmm0
1024 ; SSE2-NEXT: movd %xmm2, %eax
1025 ; SSE2-NEXT: movw %ax, (%rdi)
1026 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[3,1,2,3]
1027 ; SSE2-NEXT: movd %xmm1, %ecx
1028 ; SSE2-NEXT: movw %cx, 9(%rdi)
1029 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
1030 ; SSE2-NEXT: movd %xmm1, %edx
1031 ; SSE2-NEXT: movw %dx, 6(%rdi)
1032 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,2,3]
1033 ; SSE2-NEXT: movd %xmm1, %esi
1034 ; SSE2-NEXT: movw %si, 3(%rdi)
1035 ; SSE2-NEXT: shrl $16, %eax
1036 ; SSE2-NEXT: movb %al, 2(%rdi)
1037 ; SSE2-NEXT: shrl $16, %ecx
1038 ; SSE2-NEXT: movb %cl, 11(%rdi)
1039 ; SSE2-NEXT: shrl $16, %edx
1040 ; SSE2-NEXT: movb %dl, 8(%rdi)
1041 ; SSE2-NEXT: shrl $16, %esi
1042 ; SSE2-NEXT: movb %sil, 5(%rdi)
1045 ; SSSE3-LABEL: usubo_v4i24:
1047 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
1048 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
1049 ; SSSE3-NEXT: pand %xmm3, %xmm1
1050 ; SSSE3-NEXT: pand %xmm3, %xmm2
1051 ; SSSE3-NEXT: psubd %xmm1, %xmm2
1052 ; SSSE3-NEXT: pand %xmm2, %xmm3
1053 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm3
1054 ; SSSE3-NEXT: pcmpeqd %xmm0, %xmm0
1055 ; SSSE3-NEXT: pxor %xmm3, %xmm0
1056 ; SSSE3-NEXT: movd %xmm2, %eax
1057 ; SSSE3-NEXT: movw %ax, (%rdi)
1058 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[3,1,2,3]
1059 ; SSSE3-NEXT: movd %xmm1, %ecx
1060 ; SSSE3-NEXT: movw %cx, 9(%rdi)
1061 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
1062 ; SSSE3-NEXT: movd %xmm1, %edx
1063 ; SSSE3-NEXT: movw %dx, 6(%rdi)
1064 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,2,3]
1065 ; SSSE3-NEXT: movd %xmm1, %esi
1066 ; SSSE3-NEXT: movw %si, 3(%rdi)
1067 ; SSSE3-NEXT: shrl $16, %eax
1068 ; SSSE3-NEXT: movb %al, 2(%rdi)
1069 ; SSSE3-NEXT: shrl $16, %ecx
1070 ; SSSE3-NEXT: movb %cl, 11(%rdi)
1071 ; SSSE3-NEXT: shrl $16, %edx
1072 ; SSSE3-NEXT: movb %dl, 8(%rdi)
1073 ; SSSE3-NEXT: shrl $16, %esi
1074 ; SSSE3-NEXT: movb %sil, 5(%rdi)
1077 ; SSE41-LABEL: usubo_v4i24:
1079 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
1080 ; SSE41-NEXT: pand %xmm2, %xmm1
1081 ; SSE41-NEXT: pand %xmm2, %xmm0
1082 ; SSE41-NEXT: psubd %xmm1, %xmm0
1083 ; SSE41-NEXT: pand %xmm0, %xmm2
1084 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
1085 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1086 ; SSE41-NEXT: pxor %xmm2, %xmm1
1087 ; SSE41-NEXT: pextrd $3, %xmm0, %eax
1088 ; SSE41-NEXT: movw %ax, 9(%rdi)
1089 ; SSE41-NEXT: pextrd $2, %xmm0, %ecx
1090 ; SSE41-NEXT: movw %cx, 6(%rdi)
1091 ; SSE41-NEXT: pextrd $1, %xmm0, %edx
1092 ; SSE41-NEXT: movw %dx, 3(%rdi)
1093 ; SSE41-NEXT: movd %xmm0, %esi
1094 ; SSE41-NEXT: movw %si, (%rdi)
1095 ; SSE41-NEXT: shrl $16, %eax
1096 ; SSE41-NEXT: movb %al, 11(%rdi)
1097 ; SSE41-NEXT: shrl $16, %ecx
1098 ; SSE41-NEXT: movb %cl, 8(%rdi)
1099 ; SSE41-NEXT: shrl $16, %edx
1100 ; SSE41-NEXT: movb %dl, 5(%rdi)
1101 ; SSE41-NEXT: shrl $16, %esi
1102 ; SSE41-NEXT: movb %sil, 2(%rdi)
1103 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1106 ; AVX1-LABEL: usubo_v4i24:
1108 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [2.35098856E-38,2.35098856E-38,2.35098856E-38,2.35098856E-38]
1109 ; AVX1-NEXT: vandps %xmm2, %xmm1, %xmm1
1110 ; AVX1-NEXT: vandps %xmm2, %xmm0, %xmm0
1111 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
1112 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm0
1113 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1114 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1115 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
1116 ; AVX1-NEXT: vpextrd $3, %xmm1, %eax
1117 ; AVX1-NEXT: movw %ax, 9(%rdi)
1118 ; AVX1-NEXT: vpextrd $2, %xmm1, %ecx
1119 ; AVX1-NEXT: movw %cx, 6(%rdi)
1120 ; AVX1-NEXT: vpextrd $1, %xmm1, %edx
1121 ; AVX1-NEXT: movw %dx, 3(%rdi)
1122 ; AVX1-NEXT: vmovd %xmm1, %esi
1123 ; AVX1-NEXT: movw %si, (%rdi)
1124 ; AVX1-NEXT: shrl $16, %eax
1125 ; AVX1-NEXT: movb %al, 11(%rdi)
1126 ; AVX1-NEXT: shrl $16, %ecx
1127 ; AVX1-NEXT: movb %cl, 8(%rdi)
1128 ; AVX1-NEXT: shrl $16, %edx
1129 ; AVX1-NEXT: movb %dl, 5(%rdi)
1130 ; AVX1-NEXT: shrl $16, %esi
1131 ; AVX1-NEXT: movb %sil, 2(%rdi)
1134 ; AVX2-LABEL: usubo_v4i24:
1136 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [16777215,16777215,16777215,16777215]
1137 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1
1138 ; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
1139 ; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm1
1140 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm0
1141 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1142 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1143 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
1144 ; AVX2-NEXT: vpextrd $3, %xmm1, %eax
1145 ; AVX2-NEXT: movw %ax, 9(%rdi)
1146 ; AVX2-NEXT: vpextrd $2, %xmm1, %ecx
1147 ; AVX2-NEXT: movw %cx, 6(%rdi)
1148 ; AVX2-NEXT: vpextrd $1, %xmm1, %edx
1149 ; AVX2-NEXT: movw %dx, 3(%rdi)
1150 ; AVX2-NEXT: vmovd %xmm1, %esi
1151 ; AVX2-NEXT: movw %si, (%rdi)
1152 ; AVX2-NEXT: shrl $16, %eax
1153 ; AVX2-NEXT: movb %al, 11(%rdi)
1154 ; AVX2-NEXT: shrl $16, %ecx
1155 ; AVX2-NEXT: movb %cl, 8(%rdi)
1156 ; AVX2-NEXT: shrl $16, %edx
1157 ; AVX2-NEXT: movb %dl, 5(%rdi)
1158 ; AVX2-NEXT: shrl $16, %esi
1159 ; AVX2-NEXT: movb %sil, 2(%rdi)
1162 ; AVX512-LABEL: usubo_v4i24:
1164 ; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm2 = [16777215,16777215,16777215,16777215]
1165 ; AVX512-NEXT: vpand %xmm2, %xmm1, %xmm1
1166 ; AVX512-NEXT: vpand %xmm2, %xmm0, %xmm0
1167 ; AVX512-NEXT: vpsubd %xmm1, %xmm0, %xmm1
1168 ; AVX512-NEXT: vpand %xmm2, %xmm1, %xmm0
1169 ; AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1170 ; AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
1171 ; AVX512-NEXT: vpextrd $3, %xmm1, %eax
1172 ; AVX512-NEXT: movw %ax, 9(%rdi)
1173 ; AVX512-NEXT: vpextrd $2, %xmm1, %ecx
1174 ; AVX512-NEXT: movw %cx, 6(%rdi)
1175 ; AVX512-NEXT: vpextrd $1, %xmm1, %edx
1176 ; AVX512-NEXT: movw %dx, 3(%rdi)
1177 ; AVX512-NEXT: vmovd %xmm1, %esi
1178 ; AVX512-NEXT: movw %si, (%rdi)
1179 ; AVX512-NEXT: shrl $16, %eax
1180 ; AVX512-NEXT: movb %al, 11(%rdi)
1181 ; AVX512-NEXT: shrl $16, %ecx
1182 ; AVX512-NEXT: movb %cl, 8(%rdi)
1183 ; AVX512-NEXT: shrl $16, %edx
1184 ; AVX512-NEXT: movb %dl, 5(%rdi)
1185 ; AVX512-NEXT: shrl $16, %esi
1186 ; AVX512-NEXT: movb %sil, 2(%rdi)
1188 %t = call {<4 x i24>, <4 x i1>} @llvm.usub.with.overflow.v4i24(<4 x i24> %a0, <4 x i24> %a1)
1189 %val = extractvalue {<4 x i24>, <4 x i1>} %t, 0
1190 %obit = extractvalue {<4 x i24>, <4 x i1>} %t, 1
1191 %res = sext <4 x i1> %obit to <4 x i32>
1192 store <4 x i24> %val, <4 x i24>* %p2
1196 define <4 x i32> @usubo_v4i1(<4 x i1> %a0, <4 x i1> %a1, <4 x i1>* %p2) nounwind {
1197 ; SSE-LABEL: usubo_v4i1:
1199 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [1,1,1,1]
1200 ; SSE-NEXT: pand %xmm2, %xmm1
1201 ; SSE-NEXT: pand %xmm2, %xmm0
1202 ; SSE-NEXT: psubd %xmm1, %xmm0
1203 ; SSE-NEXT: pand %xmm0, %xmm2
1204 ; SSE-NEXT: pcmpeqd %xmm0, %xmm2
1205 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1
1206 ; SSE-NEXT: pxor %xmm2, %xmm1
1207 ; SSE-NEXT: pslld $31, %xmm0
1208 ; SSE-NEXT: movmskps %xmm0, %eax
1209 ; SSE-NEXT: movb %al, (%rdi)
1210 ; SSE-NEXT: movdqa %xmm1, %xmm0
1213 ; AVX1-LABEL: usubo_v4i1:
1215 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [1,1,1,1]
1216 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
1217 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
1218 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
1219 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm0
1220 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1221 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1222 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
1223 ; AVX1-NEXT: vpslld $31, %xmm1, %xmm1
1224 ; AVX1-NEXT: vmovmskps %xmm1, %eax
1225 ; AVX1-NEXT: movb %al, (%rdi)
1228 ; AVX2-LABEL: usubo_v4i1:
1230 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [1,1,1,1]
1231 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1
1232 ; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
1233 ; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm1
1234 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm0
1235 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1236 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1237 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
1238 ; AVX2-NEXT: vpslld $31, %xmm1, %xmm1
1239 ; AVX2-NEXT: vmovmskps %xmm1, %eax
1240 ; AVX2-NEXT: movb %al, (%rdi)
1243 ; AVX512-LABEL: usubo_v4i1:
1245 ; AVX512-NEXT: vpslld $31, %xmm0, %xmm0
1246 ; AVX512-NEXT: vptestmd %xmm0, %xmm0, %k0
1247 ; AVX512-NEXT: vpslld $31, %xmm1, %xmm1
1248 ; AVX512-NEXT: vptestmd %xmm1, %xmm1, %k1
1249 ; AVX512-NEXT: kxorw %k1, %k0, %k1
1250 ; AVX512-NEXT: vptestnmd %xmm0, %xmm0, %k2 {%k1}
1251 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1252 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k2} {z}
1253 ; AVX512-NEXT: kmovd %k1, %eax
1254 ; AVX512-NEXT: movb %al, (%rdi)
1256 %t = call {<4 x i1>, <4 x i1>} @llvm.usub.with.overflow.v4i1(<4 x i1> %a0, <4 x i1> %a1)
1257 %val = extractvalue {<4 x i1>, <4 x i1>} %t, 0
1258 %obit = extractvalue {<4 x i1>, <4 x i1>} %t, 1
1259 %res = sext <4 x i1> %obit to <4 x i32>
1260 store <4 x i1> %val, <4 x i1>* %p2
1264 define <2 x i32> @usubo_v2i128(<2 x i128> %a0, <2 x i128> %a1, <2 x i128>* %p2) nounwind {
1265 ; SSE2-LABEL: usubo_v2i128:
1267 ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %r10
1268 ; SSE2-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1269 ; SSE2-NEXT: sbbq {{[0-9]+}}(%rsp), %rcx
1270 ; SSE2-NEXT: setb %al
1271 ; SSE2-NEXT: movzbl %al, %r11d
1272 ; SSE2-NEXT: subq %r8, %rdi
1273 ; SSE2-NEXT: sbbq %r9, %rsi
1274 ; SSE2-NEXT: setb %al
1275 ; SSE2-NEXT: movzbl %al, %eax
1276 ; SSE2-NEXT: movd %eax, %xmm0
1277 ; SSE2-NEXT: pinsrw $4, %r11d, %xmm0
1278 ; SSE2-NEXT: movq %rdx, 16(%r10)
1279 ; SSE2-NEXT: movq %rdi, (%r10)
1280 ; SSE2-NEXT: movq %rcx, 24(%r10)
1281 ; SSE2-NEXT: movq %rsi, 8(%r10)
1282 ; SSE2-NEXT: psllq $63, %xmm0
1283 ; SSE2-NEXT: psrad $31, %xmm0
1284 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1287 ; SSSE3-LABEL: usubo_v2i128:
1289 ; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %r10
1290 ; SSSE3-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1291 ; SSSE3-NEXT: sbbq {{[0-9]+}}(%rsp), %rcx
1292 ; SSSE3-NEXT: setb %al
1293 ; SSSE3-NEXT: movzbl %al, %r11d
1294 ; SSSE3-NEXT: subq %r8, %rdi
1295 ; SSSE3-NEXT: sbbq %r9, %rsi
1296 ; SSSE3-NEXT: setb %al
1297 ; SSSE3-NEXT: movzbl %al, %eax
1298 ; SSSE3-NEXT: movd %eax, %xmm0
1299 ; SSSE3-NEXT: pinsrw $4, %r11d, %xmm0
1300 ; SSSE3-NEXT: movq %rdx, 16(%r10)
1301 ; SSSE3-NEXT: movq %rdi, (%r10)
1302 ; SSSE3-NEXT: movq %rcx, 24(%r10)
1303 ; SSSE3-NEXT: movq %rsi, 8(%r10)
1304 ; SSSE3-NEXT: psllq $63, %xmm0
1305 ; SSSE3-NEXT: psrad $31, %xmm0
1306 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1309 ; SSE41-LABEL: usubo_v2i128:
1311 ; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %r10
1312 ; SSE41-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1313 ; SSE41-NEXT: sbbq {{[0-9]+}}(%rsp), %rcx
1314 ; SSE41-NEXT: setb %al
1315 ; SSE41-NEXT: movzbl %al, %r11d
1316 ; SSE41-NEXT: subq %r8, %rdi
1317 ; SSE41-NEXT: sbbq %r9, %rsi
1318 ; SSE41-NEXT: setb %al
1319 ; SSE41-NEXT: movzbl %al, %eax
1320 ; SSE41-NEXT: movd %eax, %xmm0
1321 ; SSE41-NEXT: pinsrb $8, %r11d, %xmm0
1322 ; SSE41-NEXT: movq %rdx, 16(%r10)
1323 ; SSE41-NEXT: movq %rdi, (%r10)
1324 ; SSE41-NEXT: movq %rcx, 24(%r10)
1325 ; SSE41-NEXT: movq %rsi, 8(%r10)
1326 ; SSE41-NEXT: psllq $63, %xmm0
1327 ; SSE41-NEXT: psrad $31, %xmm0
1328 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1331 ; AVX1-LABEL: usubo_v2i128:
1333 ; AVX1-NEXT: movq {{[0-9]+}}(%rsp), %r10
1334 ; AVX1-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1335 ; AVX1-NEXT: sbbq {{[0-9]+}}(%rsp), %rcx
1336 ; AVX1-NEXT: setb %al
1337 ; AVX1-NEXT: movzbl %al, %r11d
1338 ; AVX1-NEXT: subq %r8, %rdi
1339 ; AVX1-NEXT: sbbq %r9, %rsi
1340 ; AVX1-NEXT: setb %al
1341 ; AVX1-NEXT: movzbl %al, %eax
1342 ; AVX1-NEXT: vmovd %eax, %xmm0
1343 ; AVX1-NEXT: vpinsrb $8, %r11d, %xmm0, %xmm0
1344 ; AVX1-NEXT: movq %rdx, 16(%r10)
1345 ; AVX1-NEXT: movq %rdi, (%r10)
1346 ; AVX1-NEXT: movq %rcx, 24(%r10)
1347 ; AVX1-NEXT: movq %rsi, 8(%r10)
1348 ; AVX1-NEXT: vpsllq $63, %xmm0, %xmm0
1349 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
1350 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0
1353 ; AVX2-LABEL: usubo_v2i128:
1355 ; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %r10
1356 ; AVX2-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1357 ; AVX2-NEXT: sbbq {{[0-9]+}}(%rsp), %rcx
1358 ; AVX2-NEXT: setb %al
1359 ; AVX2-NEXT: movzbl %al, %r11d
1360 ; AVX2-NEXT: subq %r8, %rdi
1361 ; AVX2-NEXT: sbbq %r9, %rsi
1362 ; AVX2-NEXT: setb %al
1363 ; AVX2-NEXT: movzbl %al, %eax
1364 ; AVX2-NEXT: vmovd %eax, %xmm0
1365 ; AVX2-NEXT: vpinsrb $8, %r11d, %xmm0, %xmm0
1366 ; AVX2-NEXT: movq %rdx, 16(%r10)
1367 ; AVX2-NEXT: movq %rdi, (%r10)
1368 ; AVX2-NEXT: movq %rcx, 24(%r10)
1369 ; AVX2-NEXT: movq %rsi, 8(%r10)
1370 ; AVX2-NEXT: vpsllq $63, %xmm0, %xmm0
1371 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
1372 ; AVX2-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0
1375 ; AVX512-LABEL: usubo_v2i128:
1377 ; AVX512-NEXT: movq {{[0-9]+}}(%rsp), %r10
1378 ; AVX512-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1379 ; AVX512-NEXT: sbbq {{[0-9]+}}(%rsp), %rcx
1380 ; AVX512-NEXT: setb %al
1381 ; AVX512-NEXT: kmovd %eax, %k0
1382 ; AVX512-NEXT: kshiftlw $1, %k0, %k0
1383 ; AVX512-NEXT: subq %r8, %rdi
1384 ; AVX512-NEXT: sbbq %r9, %rsi
1385 ; AVX512-NEXT: setb %al
1386 ; AVX512-NEXT: andl $1, %eax
1387 ; AVX512-NEXT: kmovw %eax, %k1
1388 ; AVX512-NEXT: korw %k0, %k1, %k1
1389 ; AVX512-NEXT: movq %rdx, 16(%r10)
1390 ; AVX512-NEXT: movq %rdi, (%r10)
1391 ; AVX512-NEXT: movq %rcx, 24(%r10)
1392 ; AVX512-NEXT: movq %rsi, 8(%r10)
1393 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1394 ; AVX512-NEXT: vmovdqa64 %xmm0, %xmm0 {%k1} {z}
1396 %t = call {<2 x i128>, <2 x i1>} @llvm.usub.with.overflow.v2i128(<2 x i128> %a0, <2 x i128> %a1)
1397 %val = extractvalue {<2 x i128>, <2 x i1>} %t, 0
1398 %obit = extractvalue {<2 x i128>, <2 x i1>} %t, 1
1399 %res = sext <2 x i1> %obit to <2 x i32>
1400 store <2 x i128> %val, <2 x i128>* %p2