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: vpackssdw %xmm3, %xmm0, %xmm0
426 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm3
427 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
428 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm0
429 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm3, %ymm0
430 ; AVX1-NEXT: vmovq %xmm2, 16(%rdi)
431 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
434 ; AVX2-LABEL: usubo_v6i32:
436 ; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm1
437 ; AVX2-NEXT: vpminud %ymm0, %ymm1, %ymm0
438 ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm1, %ymm0
439 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2
440 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
441 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2
442 ; AVX2-NEXT: vpackssdw %xmm2, %xmm0, %xmm0
443 ; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0
444 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
445 ; AVX2-NEXT: vmovq %xmm2, 16(%rdi)
446 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
449 ; AVX512-LABEL: usubo_v6i32:
451 ; AVX512-NEXT: vpsubd %ymm1, %ymm0, %ymm1
452 ; AVX512-NEXT: vpcmpnleud %ymm0, %ymm1, %k1
453 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
454 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
455 ; AVX512-NEXT: vextracti128 $1, %ymm1, %xmm2
456 ; AVX512-NEXT: vmovq %xmm2, 16(%rdi)
457 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
459 %t = call {<6 x i32>, <6 x i1>} @llvm.usub.with.overflow.v6i32(<6 x i32> %a0, <6 x i32> %a1)
460 %val = extractvalue {<6 x i32>, <6 x i1>} %t, 0
461 %obit = extractvalue {<6 x i32>, <6 x i1>} %t, 1
462 %res = sext <6 x i1> %obit to <6 x i32>
463 store <6 x i32> %val, <6 x i32>* %p2
467 define <8 x i32> @usubo_v8i32(<8 x i32> %a0, <8 x i32> %a1, <8 x i32>* %p2) nounwind {
468 ; SSE2-LABEL: usubo_v8i32:
470 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
471 ; SSE2-NEXT: movdqa %xmm0, %xmm5
472 ; SSE2-NEXT: pxor %xmm4, %xmm5
473 ; SSE2-NEXT: psubd %xmm2, %xmm0
474 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
475 ; SSE2-NEXT: pxor %xmm4, %xmm0
476 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm0
477 ; SSE2-NEXT: movdqa %xmm1, %xmm2
478 ; SSE2-NEXT: pxor %xmm4, %xmm2
479 ; SSE2-NEXT: psubd %xmm3, %xmm1
480 ; SSE2-NEXT: pxor %xmm1, %xmm4
481 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
482 ; SSE2-NEXT: movdqa %xmm1, 16(%rdi)
483 ; SSE2-NEXT: movdqa %xmm4, %xmm1
486 ; SSSE3-LABEL: usubo_v8i32:
488 ; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
489 ; SSSE3-NEXT: movdqa %xmm0, %xmm5
490 ; SSSE3-NEXT: pxor %xmm4, %xmm5
491 ; SSSE3-NEXT: psubd %xmm2, %xmm0
492 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
493 ; SSSE3-NEXT: pxor %xmm4, %xmm0
494 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm0
495 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
496 ; SSSE3-NEXT: pxor %xmm4, %xmm2
497 ; SSSE3-NEXT: psubd %xmm3, %xmm1
498 ; SSSE3-NEXT: pxor %xmm1, %xmm4
499 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
500 ; SSSE3-NEXT: movdqa %xmm1, 16(%rdi)
501 ; SSSE3-NEXT: movdqa %xmm4, %xmm1
504 ; SSE41-LABEL: usubo_v8i32:
506 ; SSE41-NEXT: movdqa %xmm0, %xmm4
507 ; SSE41-NEXT: psubd %xmm2, %xmm4
508 ; SSE41-NEXT: pminud %xmm4, %xmm0
509 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm0
510 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm2
511 ; SSE41-NEXT: pxor %xmm2, %xmm0
512 ; SSE41-NEXT: movdqa %xmm1, %xmm5
513 ; SSE41-NEXT: psubd %xmm3, %xmm5
514 ; SSE41-NEXT: pminud %xmm5, %xmm1
515 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm1
516 ; SSE41-NEXT: pxor %xmm2, %xmm1
517 ; SSE41-NEXT: movdqa %xmm5, 16(%rdi)
518 ; SSE41-NEXT: movdqa %xmm4, (%rdi)
521 ; AVX1-LABEL: usubo_v8i32:
523 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
524 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
525 ; AVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm2
526 ; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm3
527 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm3
528 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
529 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
530 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
531 ; AVX1-NEXT: vpminud %xmm0, %xmm1, %xmm0
532 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
533 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
534 ; AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm0
535 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
536 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm2
537 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
538 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm0
539 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
540 ; AVX1-NEXT: vmovaps %ymm1, (%rdi)
543 ; AVX2-LABEL: usubo_v8i32:
545 ; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm1
546 ; AVX2-NEXT: vpminud %ymm0, %ymm1, %ymm0
547 ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm1, %ymm0
548 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2
549 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
550 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2
551 ; AVX2-NEXT: vpackssdw %xmm2, %xmm0, %xmm0
552 ; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0
553 ; AVX2-NEXT: vmovdqa %ymm1, (%rdi)
556 ; AVX512-LABEL: usubo_v8i32:
558 ; AVX512-NEXT: vpsubd %ymm1, %ymm0, %ymm1
559 ; AVX512-NEXT: vpcmpnleud %ymm0, %ymm1, %k1
560 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
561 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
562 ; AVX512-NEXT: vmovdqa %ymm1, (%rdi)
564 %t = call {<8 x i32>, <8 x i1>} @llvm.usub.with.overflow.v8i32(<8 x i32> %a0, <8 x i32> %a1)
565 %val = extractvalue {<8 x i32>, <8 x i1>} %t, 0
566 %obit = extractvalue {<8 x i32>, <8 x i1>} %t, 1
567 %res = sext <8 x i1> %obit to <8 x i32>
568 store <8 x i32> %val, <8 x i32>* %p2
572 define <16 x i32> @usubo_v16i32(<16 x i32> %a0, <16 x i32> %a1, <16 x i32>* %p2) nounwind {
573 ; SSE2-LABEL: usubo_v16i32:
575 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
576 ; SSE2-NEXT: movdqa %xmm0, %xmm9
577 ; SSE2-NEXT: pxor %xmm8, %xmm9
578 ; SSE2-NEXT: psubd %xmm4, %xmm0
579 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
580 ; SSE2-NEXT: pxor %xmm8, %xmm0
581 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm0
582 ; SSE2-NEXT: movdqa %xmm1, %xmm4
583 ; SSE2-NEXT: pxor %xmm8, %xmm4
584 ; SSE2-NEXT: psubd %xmm5, %xmm1
585 ; SSE2-NEXT: movdqa %xmm1, 16(%rdi)
586 ; SSE2-NEXT: pxor %xmm8, %xmm1
587 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm1
588 ; SSE2-NEXT: movdqa %xmm2, %xmm4
589 ; SSE2-NEXT: pxor %xmm8, %xmm4
590 ; SSE2-NEXT: psubd %xmm6, %xmm2
591 ; SSE2-NEXT: movdqa %xmm2, 32(%rdi)
592 ; SSE2-NEXT: pxor %xmm8, %xmm2
593 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm2
594 ; SSE2-NEXT: movdqa %xmm3, %xmm4
595 ; SSE2-NEXT: pxor %xmm8, %xmm4
596 ; SSE2-NEXT: psubd %xmm7, %xmm3
597 ; SSE2-NEXT: pxor %xmm3, %xmm8
598 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm8
599 ; SSE2-NEXT: movdqa %xmm3, 48(%rdi)
600 ; SSE2-NEXT: movdqa %xmm8, %xmm3
603 ; SSSE3-LABEL: usubo_v16i32:
605 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
606 ; SSSE3-NEXT: movdqa %xmm0, %xmm9
607 ; SSSE3-NEXT: pxor %xmm8, %xmm9
608 ; SSSE3-NEXT: psubd %xmm4, %xmm0
609 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
610 ; SSSE3-NEXT: pxor %xmm8, %xmm0
611 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm0
612 ; SSSE3-NEXT: movdqa %xmm1, %xmm4
613 ; SSSE3-NEXT: pxor %xmm8, %xmm4
614 ; SSSE3-NEXT: psubd %xmm5, %xmm1
615 ; SSSE3-NEXT: movdqa %xmm1, 16(%rdi)
616 ; SSSE3-NEXT: pxor %xmm8, %xmm1
617 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm1
618 ; SSSE3-NEXT: movdqa %xmm2, %xmm4
619 ; SSSE3-NEXT: pxor %xmm8, %xmm4
620 ; SSSE3-NEXT: psubd %xmm6, %xmm2
621 ; SSSE3-NEXT: movdqa %xmm2, 32(%rdi)
622 ; SSSE3-NEXT: pxor %xmm8, %xmm2
623 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm2
624 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
625 ; SSSE3-NEXT: pxor %xmm8, %xmm4
626 ; SSSE3-NEXT: psubd %xmm7, %xmm3
627 ; SSSE3-NEXT: pxor %xmm3, %xmm8
628 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm8
629 ; SSSE3-NEXT: movdqa %xmm3, 48(%rdi)
630 ; SSSE3-NEXT: movdqa %xmm8, %xmm3
633 ; SSE41-LABEL: usubo_v16i32:
635 ; SSE41-NEXT: movdqa %xmm0, %xmm8
636 ; SSE41-NEXT: psubd %xmm4, %xmm8
637 ; SSE41-NEXT: pminud %xmm8, %xmm0
638 ; SSE41-NEXT: pcmpeqd %xmm8, %xmm0
639 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm9
640 ; SSE41-NEXT: pxor %xmm9, %xmm0
641 ; SSE41-NEXT: movdqa %xmm1, %xmm4
642 ; SSE41-NEXT: psubd %xmm5, %xmm4
643 ; SSE41-NEXT: pminud %xmm4, %xmm1
644 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm1
645 ; SSE41-NEXT: pxor %xmm9, %xmm1
646 ; SSE41-NEXT: movdqa %xmm2, %xmm5
647 ; SSE41-NEXT: psubd %xmm6, %xmm5
648 ; SSE41-NEXT: pminud %xmm5, %xmm2
649 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm2
650 ; SSE41-NEXT: pxor %xmm9, %xmm2
651 ; SSE41-NEXT: movdqa %xmm3, %xmm6
652 ; SSE41-NEXT: psubd %xmm7, %xmm6
653 ; SSE41-NEXT: pminud %xmm6, %xmm3
654 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm3
655 ; SSE41-NEXT: pxor %xmm9, %xmm3
656 ; SSE41-NEXT: movdqa %xmm6, 48(%rdi)
657 ; SSE41-NEXT: movdqa %xmm5, 32(%rdi)
658 ; SSE41-NEXT: movdqa %xmm4, 16(%rdi)
659 ; SSE41-NEXT: movdqa %xmm8, (%rdi)
662 ; AVX1-LABEL: usubo_v16i32:
664 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
665 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
666 ; AVX1-NEXT: vpsubd %xmm4, %xmm5, %xmm4
667 ; AVX1-NEXT: vpminud %xmm5, %xmm4, %xmm5
668 ; AVX1-NEXT: vpcmpeqd %xmm5, %xmm4, %xmm5
669 ; AVX1-NEXT: vpcmpeqd %xmm6, %xmm6, %xmm6
670 ; AVX1-NEXT: vpxor %xmm6, %xmm5, %xmm5
671 ; AVX1-NEXT: vpsubd %xmm3, %xmm1, %xmm3
672 ; AVX1-NEXT: vpminud %xmm1, %xmm3, %xmm1
673 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm3, %xmm1
674 ; AVX1-NEXT: vpxor %xmm6, %xmm1, %xmm1
675 ; AVX1-NEXT: vpackssdw %xmm5, %xmm1, %xmm1
676 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5
677 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7
678 ; AVX1-NEXT: vpsubd %xmm5, %xmm7, %xmm5
679 ; AVX1-NEXT: vpminud %xmm7, %xmm5, %xmm7
680 ; AVX1-NEXT: vpcmpeqd %xmm7, %xmm5, %xmm7
681 ; AVX1-NEXT: vpxor %xmm6, %xmm7, %xmm7
682 ; AVX1-NEXT: vpsubd %xmm2, %xmm0, %xmm2
683 ; AVX1-NEXT: vpminud %xmm0, %xmm2, %xmm0
684 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm2, %xmm0
685 ; AVX1-NEXT: vpxor %xmm6, %xmm0, %xmm0
686 ; AVX1-NEXT: vpackssdw %xmm7, %xmm0, %xmm0
687 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm2, %ymm2
688 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3
689 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm4
690 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
691 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm0
692 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm4, %ymm0
693 ; AVX1-NEXT: vpmovsxwd %xmm1, %xmm4
694 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
695 ; AVX1-NEXT: vpmovsxwd %xmm1, %xmm1
696 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm4, %ymm1
697 ; AVX1-NEXT: vmovaps %ymm3, 32(%rdi)
698 ; AVX1-NEXT: vmovaps %ymm2, (%rdi)
701 ; AVX2-LABEL: usubo_v16i32:
703 ; AVX2-NEXT: vpsubd %ymm3, %ymm1, %ymm3
704 ; AVX2-NEXT: vpminud %ymm1, %ymm3, %ymm1
705 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1
706 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4
707 ; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1
708 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5
709 ; AVX2-NEXT: vpackssdw %xmm5, %xmm1, %xmm1
710 ; AVX2-NEXT: vpsubd %ymm2, %ymm0, %ymm2
711 ; AVX2-NEXT: vpminud %ymm0, %ymm2, %ymm0
712 ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm2, %ymm0
713 ; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm0
714 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4
715 ; AVX2-NEXT: vpackssdw %xmm4, %xmm0, %xmm0
716 ; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0
717 ; AVX2-NEXT: vpmovsxwd %xmm1, %ymm1
718 ; AVX2-NEXT: vmovdqa %ymm3, 32(%rdi)
719 ; AVX2-NEXT: vmovdqa %ymm2, (%rdi)
722 ; AVX512-LABEL: usubo_v16i32:
724 ; AVX512-NEXT: vpsubd %zmm1, %zmm0, %zmm1
725 ; AVX512-NEXT: vpcmpnleud %zmm0, %zmm1, %k1
726 ; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
727 ; AVX512-NEXT: vmovdqa64 %zmm1, (%rdi)
729 %t = call {<16 x i32>, <16 x i1>} @llvm.usub.with.overflow.v16i32(<16 x i32> %a0, <16 x i32> %a1)
730 %val = extractvalue {<16 x i32>, <16 x i1>} %t, 0
731 %obit = extractvalue {<16 x i32>, <16 x i1>} %t, 1
732 %res = sext <16 x i1> %obit to <16 x i32>
733 store <16 x i32> %val, <16 x i32>* %p2
737 define <16 x i32> @usubo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nounwind {
738 ; SSE2-LABEL: usubo_v16i8:
740 ; SSE2-NEXT: movdqa %xmm0, %xmm4
741 ; SSE2-NEXT: psubb %xmm1, %xmm4
742 ; SSE2-NEXT: pminub %xmm4, %xmm0
743 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm0
744 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm3
745 ; SSE2-NEXT: pxor %xmm0, %xmm3
746 ; SSE2-NEXT: movdqa %xmm3, %xmm1
747 ; 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]
748 ; SSE2-NEXT: movdqa %xmm1, %xmm0
749 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
750 ; SSE2-NEXT: pslld $31, %xmm0
751 ; SSE2-NEXT: psrad $31, %xmm0
752 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
753 ; SSE2-NEXT: pslld $31, %xmm1
754 ; SSE2-NEXT: psrad $31, %xmm1
755 ; 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]
756 ; SSE2-NEXT: movdqa %xmm3, %xmm2
757 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
758 ; SSE2-NEXT: pslld $31, %xmm2
759 ; SSE2-NEXT: psrad $31, %xmm2
760 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
761 ; SSE2-NEXT: pslld $31, %xmm3
762 ; SSE2-NEXT: psrad $31, %xmm3
763 ; SSE2-NEXT: movdqa %xmm4, (%rdi)
766 ; SSSE3-LABEL: usubo_v16i8:
768 ; SSSE3-NEXT: movdqa %xmm0, %xmm4
769 ; SSSE3-NEXT: psubb %xmm1, %xmm4
770 ; SSSE3-NEXT: pminub %xmm4, %xmm0
771 ; SSSE3-NEXT: pcmpeqb %xmm4, %xmm0
772 ; SSSE3-NEXT: pcmpeqd %xmm3, %xmm3
773 ; SSSE3-NEXT: pxor %xmm0, %xmm3
774 ; SSSE3-NEXT: movdqa %xmm3, %xmm1
775 ; 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]
776 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
777 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
778 ; SSSE3-NEXT: pslld $31, %xmm0
779 ; SSSE3-NEXT: psrad $31, %xmm0
780 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
781 ; SSSE3-NEXT: pslld $31, %xmm1
782 ; SSSE3-NEXT: psrad $31, %xmm1
783 ; 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]
784 ; SSSE3-NEXT: movdqa %xmm3, %xmm2
785 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
786 ; SSSE3-NEXT: pslld $31, %xmm2
787 ; SSSE3-NEXT: psrad $31, %xmm2
788 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
789 ; SSSE3-NEXT: pslld $31, %xmm3
790 ; SSSE3-NEXT: psrad $31, %xmm3
791 ; SSSE3-NEXT: movdqa %xmm4, (%rdi)
794 ; SSE41-LABEL: usubo_v16i8:
796 ; SSE41-NEXT: movdqa %xmm0, %xmm4
797 ; SSE41-NEXT: psubb %xmm1, %xmm4
798 ; SSE41-NEXT: pminub %xmm4, %xmm0
799 ; SSE41-NEXT: pcmpeqb %xmm4, %xmm0
800 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm3
801 ; SSE41-NEXT: pxor %xmm0, %xmm3
802 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
803 ; SSE41-NEXT: pslld $31, %xmm0
804 ; SSE41-NEXT: psrad $31, %xmm0
805 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,2,3]
806 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
807 ; SSE41-NEXT: pslld $31, %xmm1
808 ; SSE41-NEXT: psrad $31, %xmm1
809 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[2,3,0,1]
810 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
811 ; SSE41-NEXT: pslld $31, %xmm2
812 ; SSE41-NEXT: psrad $31, %xmm2
813 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[3,1,2,3]
814 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
815 ; SSE41-NEXT: pslld $31, %xmm3
816 ; SSE41-NEXT: psrad $31, %xmm3
817 ; SSE41-NEXT: movdqa %xmm4, (%rdi)
820 ; AVX1-LABEL: usubo_v16i8:
822 ; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm2
823 ; AVX1-NEXT: vpminub %xmm0, %xmm2, %xmm0
824 ; AVX1-NEXT: vpcmpeqb %xmm0, %xmm2, %xmm0
825 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
826 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm1
827 ; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
828 ; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
829 ; AVX1-NEXT: vpslld $31, %xmm3, %xmm3
830 ; AVX1-NEXT: vpsrad $31, %xmm3, %xmm3
831 ; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
832 ; AVX1-NEXT: vpslld $31, %xmm0, %xmm0
833 ; AVX1-NEXT: vpsrad $31, %xmm0, %xmm0
834 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm3, %ymm0
835 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
836 ; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm3 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
837 ; AVX1-NEXT: vpslld $31, %xmm3, %xmm3
838 ; AVX1-NEXT: vpsrad $31, %xmm3, %xmm3
839 ; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
840 ; AVX1-NEXT: vpslld $31, %xmm1, %xmm1
841 ; AVX1-NEXT: vpsrad $31, %xmm1, %xmm1
842 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm1
843 ; AVX1-NEXT: vmovdqa %xmm2, (%rdi)
846 ; AVX2-LABEL: usubo_v16i8:
848 ; AVX2-NEXT: vpsubb %xmm1, %xmm0, %xmm2
849 ; AVX2-NEXT: vpminub %xmm0, %xmm2, %xmm0
850 ; AVX2-NEXT: vpcmpeqb %xmm0, %xmm2, %xmm0
851 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
852 ; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm1
853 ; AVX2-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
854 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
855 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
856 ; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0
857 ; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
858 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
859 ; AVX2-NEXT: vpslld $31, %ymm1, %ymm1
860 ; AVX2-NEXT: vpsrad $31, %ymm1, %ymm1
861 ; AVX2-NEXT: vmovdqa %xmm2, (%rdi)
864 ; AVX512-LABEL: usubo_v16i8:
866 ; AVX512-NEXT: vpsubb %xmm1, %xmm0, %xmm1
867 ; AVX512-NEXT: vpcmpnleub %xmm0, %xmm1, %k1
868 ; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
869 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
871 %t = call {<16 x i8>, <16 x i1>} @llvm.usub.with.overflow.v16i8(<16 x i8> %a0, <16 x i8> %a1)
872 %val = extractvalue {<16 x i8>, <16 x i1>} %t, 0
873 %obit = extractvalue {<16 x i8>, <16 x i1>} %t, 1
874 %res = sext <16 x i1> %obit to <16 x i32>
875 store <16 x i8> %val, <16 x i8>* %p2
879 define <8 x i32> @usubo_v8i16(<8 x i16> %a0, <8 x i16> %a1, <8 x i16>* %p2) nounwind {
880 ; SSE2-LABEL: usubo_v8i16:
882 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
883 ; SSE2-NEXT: movdqa %xmm0, %xmm3
884 ; SSE2-NEXT: pxor %xmm2, %xmm3
885 ; SSE2-NEXT: psubw %xmm1, %xmm0
886 ; SSE2-NEXT: pxor %xmm0, %xmm2
887 ; SSE2-NEXT: pcmpgtw %xmm3, %xmm2
888 ; SSE2-NEXT: movdqa %xmm2, %xmm1
889 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
890 ; SSE2-NEXT: pslld $31, %xmm1
891 ; SSE2-NEXT: psrad $31, %xmm1
892 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
893 ; SSE2-NEXT: pslld $31, %xmm2
894 ; SSE2-NEXT: psrad $31, %xmm2
895 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
896 ; SSE2-NEXT: movdqa %xmm1, %xmm0
897 ; SSE2-NEXT: movdqa %xmm2, %xmm1
900 ; SSSE3-LABEL: usubo_v8i16:
902 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
903 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
904 ; SSSE3-NEXT: pxor %xmm2, %xmm3
905 ; SSSE3-NEXT: psubw %xmm1, %xmm0
906 ; SSSE3-NEXT: pxor %xmm0, %xmm2
907 ; SSSE3-NEXT: pcmpgtw %xmm3, %xmm2
908 ; SSSE3-NEXT: movdqa %xmm2, %xmm1
909 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
910 ; SSSE3-NEXT: pslld $31, %xmm1
911 ; SSSE3-NEXT: psrad $31, %xmm1
912 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
913 ; SSSE3-NEXT: pslld $31, %xmm2
914 ; SSSE3-NEXT: psrad $31, %xmm2
915 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
916 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
917 ; SSSE3-NEXT: movdqa %xmm2, %xmm1
920 ; SSE41-LABEL: usubo_v8i16:
922 ; SSE41-NEXT: movdqa %xmm0, %xmm2
923 ; SSE41-NEXT: psubw %xmm1, %xmm2
924 ; SSE41-NEXT: pminuw %xmm2, %xmm0
925 ; SSE41-NEXT: pcmpeqw %xmm2, %xmm0
926 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
927 ; SSE41-NEXT: pxor %xmm0, %xmm1
928 ; SSE41-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
929 ; SSE41-NEXT: pslld $31, %xmm0
930 ; SSE41-NEXT: psrad $31, %xmm0
931 ; SSE41-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
932 ; SSE41-NEXT: pslld $31, %xmm1
933 ; SSE41-NEXT: psrad $31, %xmm1
934 ; SSE41-NEXT: movdqa %xmm2, (%rdi)
937 ; AVX1-LABEL: usubo_v8i16:
939 ; AVX1-NEXT: vpsubw %xmm1, %xmm0, %xmm1
940 ; AVX1-NEXT: vpminuw %xmm0, %xmm1, %xmm0
941 ; AVX1-NEXT: vpcmpeqw %xmm0, %xmm1, %xmm0
942 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
943 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
944 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm2
945 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
946 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm0
947 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
948 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
951 ; AVX2-LABEL: usubo_v8i16:
953 ; AVX2-NEXT: vpsubw %xmm1, %xmm0, %xmm1
954 ; AVX2-NEXT: vpminuw %xmm0, %xmm1, %xmm0
955 ; AVX2-NEXT: vpcmpeqw %xmm0, %xmm1, %xmm0
956 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
957 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
958 ; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0
959 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
962 ; AVX512-LABEL: usubo_v8i16:
964 ; AVX512-NEXT: vpsubw %xmm1, %xmm0, %xmm1
965 ; AVX512-NEXT: vpcmpnleuw %xmm0, %xmm1, %k1
966 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
967 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
968 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
970 %t = call {<8 x i16>, <8 x i1>} @llvm.usub.with.overflow.v8i16(<8 x i16> %a0, <8 x i16> %a1)
971 %val = extractvalue {<8 x i16>, <8 x i1>} %t, 0
972 %obit = extractvalue {<8 x i16>, <8 x i1>} %t, 1
973 %res = sext <8 x i1> %obit to <8 x i32>
974 store <8 x i16> %val, <8 x i16>* %p2
978 define <2 x i32> @usubo_v2i64(<2 x i64> %a0, <2 x i64> %a1, <2 x i64>* %p2) nounwind {
979 ; SSE-LABEL: usubo_v2i64:
981 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
982 ; SSE-NEXT: movdqa %xmm0, %xmm3
983 ; SSE-NEXT: pxor %xmm2, %xmm3
984 ; SSE-NEXT: psubq %xmm1, %xmm0
985 ; SSE-NEXT: pxor %xmm0, %xmm2
986 ; SSE-NEXT: movdqa %xmm2, %xmm1
987 ; SSE-NEXT: pcmpgtd %xmm3, %xmm1
988 ; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
989 ; SSE-NEXT: pcmpeqd %xmm3, %xmm2
990 ; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
991 ; SSE-NEXT: pand %xmm4, %xmm2
992 ; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
993 ; SSE-NEXT: por %xmm2, %xmm1
994 ; SSE-NEXT: movdqa %xmm0, (%rdi)
995 ; SSE-NEXT: movdqa %xmm1, %xmm0
998 ; AVX1-LABEL: usubo_v2i64:
1000 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1001 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm3
1002 ; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm1
1003 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm0
1004 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm0, %xmm0
1005 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
1008 ; AVX2-LABEL: usubo_v2i64:
1010 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1011 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm3
1012 ; AVX2-NEXT: vpsubq %xmm1, %xmm0, %xmm1
1013 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm0
1014 ; AVX2-NEXT: vpcmpgtq %xmm3, %xmm0, %xmm0
1015 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
1018 ; AVX512-LABEL: usubo_v2i64:
1020 ; AVX512-NEXT: vpsubq %xmm1, %xmm0, %xmm1
1021 ; AVX512-NEXT: vpcmpnleuq %xmm0, %xmm1, %k1
1022 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
1023 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1024 ; AVX512-NEXT: vmovdqa64 %xmm0, %xmm0 {%k1} {z}
1026 %t = call {<2 x i64>, <2 x i1>} @llvm.usub.with.overflow.v2i64(<2 x i64> %a0, <2 x i64> %a1)
1027 %val = extractvalue {<2 x i64>, <2 x i1>} %t, 0
1028 %obit = extractvalue {<2 x i64>, <2 x i1>} %t, 1
1029 %res = sext <2 x i1> %obit to <2 x i32>
1030 store <2 x i64> %val, <2 x i64>* %p2
1034 define <4 x i32> @usubo_v4i24(<4 x i24> %a0, <4 x i24> %a1, <4 x i24>* %p2) nounwind {
1035 ; SSE2-LABEL: usubo_v4i24:
1037 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1038 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
1039 ; SSE2-NEXT: pand %xmm3, %xmm1
1040 ; SSE2-NEXT: pand %xmm3, %xmm2
1041 ; SSE2-NEXT: psubd %xmm1, %xmm2
1042 ; SSE2-NEXT: pand %xmm2, %xmm3
1043 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3
1044 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
1045 ; SSE2-NEXT: pxor %xmm3, %xmm0
1046 ; SSE2-NEXT: movd %xmm2, %eax
1047 ; SSE2-NEXT: movw %ax, (%rdi)
1048 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[3,1,2,3]
1049 ; SSE2-NEXT: movd %xmm1, %ecx
1050 ; SSE2-NEXT: movw %cx, 9(%rdi)
1051 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
1052 ; SSE2-NEXT: movd %xmm1, %edx
1053 ; SSE2-NEXT: movw %dx, 6(%rdi)
1054 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,2,3]
1055 ; SSE2-NEXT: movd %xmm1, %esi
1056 ; SSE2-NEXT: movw %si, 3(%rdi)
1057 ; SSE2-NEXT: shrl $16, %eax
1058 ; SSE2-NEXT: movb %al, 2(%rdi)
1059 ; SSE2-NEXT: shrl $16, %ecx
1060 ; SSE2-NEXT: movb %cl, 11(%rdi)
1061 ; SSE2-NEXT: shrl $16, %edx
1062 ; SSE2-NEXT: movb %dl, 8(%rdi)
1063 ; SSE2-NEXT: shrl $16, %esi
1064 ; SSE2-NEXT: movb %sil, 5(%rdi)
1067 ; SSSE3-LABEL: usubo_v4i24:
1069 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
1070 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
1071 ; SSSE3-NEXT: pand %xmm3, %xmm1
1072 ; SSSE3-NEXT: pand %xmm3, %xmm2
1073 ; SSSE3-NEXT: psubd %xmm1, %xmm2
1074 ; SSSE3-NEXT: pand %xmm2, %xmm3
1075 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm3
1076 ; SSSE3-NEXT: pcmpeqd %xmm0, %xmm0
1077 ; SSSE3-NEXT: pxor %xmm3, %xmm0
1078 ; SSSE3-NEXT: movd %xmm2, %eax
1079 ; SSSE3-NEXT: movw %ax, (%rdi)
1080 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[3,1,2,3]
1081 ; SSSE3-NEXT: movd %xmm1, %ecx
1082 ; SSSE3-NEXT: movw %cx, 9(%rdi)
1083 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
1084 ; SSSE3-NEXT: movd %xmm1, %edx
1085 ; SSSE3-NEXT: movw %dx, 6(%rdi)
1086 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,2,3]
1087 ; SSSE3-NEXT: movd %xmm1, %esi
1088 ; SSSE3-NEXT: movw %si, 3(%rdi)
1089 ; SSSE3-NEXT: shrl $16, %eax
1090 ; SSSE3-NEXT: movb %al, 2(%rdi)
1091 ; SSSE3-NEXT: shrl $16, %ecx
1092 ; SSSE3-NEXT: movb %cl, 11(%rdi)
1093 ; SSSE3-NEXT: shrl $16, %edx
1094 ; SSSE3-NEXT: movb %dl, 8(%rdi)
1095 ; SSSE3-NEXT: shrl $16, %esi
1096 ; SSSE3-NEXT: movb %sil, 5(%rdi)
1099 ; SSE41-LABEL: usubo_v4i24:
1101 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
1102 ; SSE41-NEXT: pand %xmm2, %xmm1
1103 ; SSE41-NEXT: pand %xmm2, %xmm0
1104 ; SSE41-NEXT: psubd %xmm1, %xmm0
1105 ; SSE41-NEXT: pand %xmm0, %xmm2
1106 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
1107 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1108 ; SSE41-NEXT: pxor %xmm2, %xmm1
1109 ; SSE41-NEXT: pextrd $3, %xmm0, %eax
1110 ; SSE41-NEXT: movw %ax, 9(%rdi)
1111 ; SSE41-NEXT: pextrd $2, %xmm0, %ecx
1112 ; SSE41-NEXT: movw %cx, 6(%rdi)
1113 ; SSE41-NEXT: pextrd $1, %xmm0, %edx
1114 ; SSE41-NEXT: movw %dx, 3(%rdi)
1115 ; SSE41-NEXT: movd %xmm0, %esi
1116 ; SSE41-NEXT: movw %si, (%rdi)
1117 ; SSE41-NEXT: shrl $16, %eax
1118 ; SSE41-NEXT: movb %al, 11(%rdi)
1119 ; SSE41-NEXT: shrl $16, %ecx
1120 ; SSE41-NEXT: movb %cl, 8(%rdi)
1121 ; SSE41-NEXT: shrl $16, %edx
1122 ; SSE41-NEXT: movb %dl, 5(%rdi)
1123 ; SSE41-NEXT: shrl $16, %esi
1124 ; SSE41-NEXT: movb %sil, 2(%rdi)
1125 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1128 ; AVX1-LABEL: usubo_v4i24:
1130 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [2.35098856E-38,2.35098856E-38,2.35098856E-38,2.35098856E-38]
1131 ; AVX1-NEXT: vandps %xmm2, %xmm1, %xmm1
1132 ; AVX1-NEXT: vandps %xmm2, %xmm0, %xmm0
1133 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
1134 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm0
1135 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1136 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1137 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
1138 ; AVX1-NEXT: vpextrd $3, %xmm1, %eax
1139 ; AVX1-NEXT: movw %ax, 9(%rdi)
1140 ; AVX1-NEXT: vpextrd $2, %xmm1, %ecx
1141 ; AVX1-NEXT: movw %cx, 6(%rdi)
1142 ; AVX1-NEXT: vpextrd $1, %xmm1, %edx
1143 ; AVX1-NEXT: movw %dx, 3(%rdi)
1144 ; AVX1-NEXT: vmovd %xmm1, %esi
1145 ; AVX1-NEXT: movw %si, (%rdi)
1146 ; AVX1-NEXT: shrl $16, %eax
1147 ; AVX1-NEXT: movb %al, 11(%rdi)
1148 ; AVX1-NEXT: shrl $16, %ecx
1149 ; AVX1-NEXT: movb %cl, 8(%rdi)
1150 ; AVX1-NEXT: shrl $16, %edx
1151 ; AVX1-NEXT: movb %dl, 5(%rdi)
1152 ; AVX1-NEXT: shrl $16, %esi
1153 ; AVX1-NEXT: movb %sil, 2(%rdi)
1156 ; AVX2-LABEL: usubo_v4i24:
1158 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [16777215,16777215,16777215,16777215]
1159 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1
1160 ; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
1161 ; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm1
1162 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm0
1163 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1164 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1165 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
1166 ; AVX2-NEXT: vpextrd $3, %xmm1, %eax
1167 ; AVX2-NEXT: movw %ax, 9(%rdi)
1168 ; AVX2-NEXT: vpextrd $2, %xmm1, %ecx
1169 ; AVX2-NEXT: movw %cx, 6(%rdi)
1170 ; AVX2-NEXT: vpextrd $1, %xmm1, %edx
1171 ; AVX2-NEXT: movw %dx, 3(%rdi)
1172 ; AVX2-NEXT: vmovd %xmm1, %esi
1173 ; AVX2-NEXT: movw %si, (%rdi)
1174 ; AVX2-NEXT: shrl $16, %eax
1175 ; AVX2-NEXT: movb %al, 11(%rdi)
1176 ; AVX2-NEXT: shrl $16, %ecx
1177 ; AVX2-NEXT: movb %cl, 8(%rdi)
1178 ; AVX2-NEXT: shrl $16, %edx
1179 ; AVX2-NEXT: movb %dl, 5(%rdi)
1180 ; AVX2-NEXT: shrl $16, %esi
1181 ; AVX2-NEXT: movb %sil, 2(%rdi)
1184 ; AVX512-LABEL: usubo_v4i24:
1186 ; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm2 = [16777215,16777215,16777215,16777215]
1187 ; AVX512-NEXT: vpand %xmm2, %xmm1, %xmm1
1188 ; AVX512-NEXT: vpand %xmm2, %xmm0, %xmm0
1189 ; AVX512-NEXT: vpsubd %xmm1, %xmm0, %xmm1
1190 ; AVX512-NEXT: vpand %xmm2, %xmm1, %xmm0
1191 ; AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1192 ; AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
1193 ; AVX512-NEXT: vpextrd $3, %xmm1, %eax
1194 ; AVX512-NEXT: movw %ax, 9(%rdi)
1195 ; AVX512-NEXT: vpextrd $2, %xmm1, %ecx
1196 ; AVX512-NEXT: movw %cx, 6(%rdi)
1197 ; AVX512-NEXT: vpextrd $1, %xmm1, %edx
1198 ; AVX512-NEXT: movw %dx, 3(%rdi)
1199 ; AVX512-NEXT: vmovd %xmm1, %esi
1200 ; AVX512-NEXT: movw %si, (%rdi)
1201 ; AVX512-NEXT: shrl $16, %eax
1202 ; AVX512-NEXT: movb %al, 11(%rdi)
1203 ; AVX512-NEXT: shrl $16, %ecx
1204 ; AVX512-NEXT: movb %cl, 8(%rdi)
1205 ; AVX512-NEXT: shrl $16, %edx
1206 ; AVX512-NEXT: movb %dl, 5(%rdi)
1207 ; AVX512-NEXT: shrl $16, %esi
1208 ; AVX512-NEXT: movb %sil, 2(%rdi)
1210 %t = call {<4 x i24>, <4 x i1>} @llvm.usub.with.overflow.v4i24(<4 x i24> %a0, <4 x i24> %a1)
1211 %val = extractvalue {<4 x i24>, <4 x i1>} %t, 0
1212 %obit = extractvalue {<4 x i24>, <4 x i1>} %t, 1
1213 %res = sext <4 x i1> %obit to <4 x i32>
1214 store <4 x i24> %val, <4 x i24>* %p2
1218 define <4 x i32> @usubo_v4i1(<4 x i1> %a0, <4 x i1> %a1, <4 x i1>* %p2) nounwind {
1219 ; SSE-LABEL: usubo_v4i1:
1221 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [1,1,1,1]
1222 ; SSE-NEXT: pand %xmm2, %xmm1
1223 ; SSE-NEXT: pand %xmm2, %xmm0
1224 ; SSE-NEXT: psubd %xmm1, %xmm0
1225 ; SSE-NEXT: pand %xmm0, %xmm2
1226 ; SSE-NEXT: pcmpeqd %xmm0, %xmm2
1227 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1
1228 ; SSE-NEXT: pxor %xmm2, %xmm1
1229 ; SSE-NEXT: pslld $31, %xmm0
1230 ; SSE-NEXT: movmskps %xmm0, %eax
1231 ; SSE-NEXT: movb %al, (%rdi)
1232 ; SSE-NEXT: movdqa %xmm1, %xmm0
1235 ; AVX1-LABEL: usubo_v4i1:
1237 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [1,1,1,1]
1238 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
1239 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
1240 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
1241 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm0
1242 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1243 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1244 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
1245 ; AVX1-NEXT: vpslld $31, %xmm1, %xmm1
1246 ; AVX1-NEXT: vmovmskps %xmm1, %eax
1247 ; AVX1-NEXT: movb %al, (%rdi)
1250 ; AVX2-LABEL: usubo_v4i1:
1252 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [1,1,1,1]
1253 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1
1254 ; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
1255 ; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm1
1256 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm0
1257 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1258 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1259 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
1260 ; AVX2-NEXT: vpslld $31, %xmm1, %xmm1
1261 ; AVX2-NEXT: vmovmskps %xmm1, %eax
1262 ; AVX2-NEXT: movb %al, (%rdi)
1265 ; AVX512-LABEL: usubo_v4i1:
1267 ; AVX512-NEXT: vpslld $31, %xmm0, %xmm0
1268 ; AVX512-NEXT: vptestmd %xmm0, %xmm0, %k0
1269 ; AVX512-NEXT: vpslld $31, %xmm1, %xmm1
1270 ; AVX512-NEXT: vptestmd %xmm1, %xmm1, %k1
1271 ; AVX512-NEXT: kxorw %k1, %k0, %k1
1272 ; AVX512-NEXT: vptestnmd %xmm0, %xmm0, %k2 {%k1}
1273 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1274 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k2} {z}
1275 ; AVX512-NEXT: kmovd %k1, %eax
1276 ; AVX512-NEXT: movb %al, (%rdi)
1278 %t = call {<4 x i1>, <4 x i1>} @llvm.usub.with.overflow.v4i1(<4 x i1> %a0, <4 x i1> %a1)
1279 %val = extractvalue {<4 x i1>, <4 x i1>} %t, 0
1280 %obit = extractvalue {<4 x i1>, <4 x i1>} %t, 1
1281 %res = sext <4 x i1> %obit to <4 x i32>
1282 store <4 x i1> %val, <4 x i1>* %p2
1286 define <2 x i32> @usubo_v2i128(<2 x i128> %a0, <2 x i128> %a1, <2 x i128>* %p2) nounwind {
1287 ; SSE2-LABEL: usubo_v2i128:
1289 ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %r10
1290 ; SSE2-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1291 ; SSE2-NEXT: sbbq {{[0-9]+}}(%rsp), %rcx
1292 ; SSE2-NEXT: setb %al
1293 ; SSE2-NEXT: movzbl %al, %r11d
1294 ; SSE2-NEXT: subq %r8, %rdi
1295 ; SSE2-NEXT: sbbq %r9, %rsi
1296 ; SSE2-NEXT: setb %al
1297 ; SSE2-NEXT: movzbl %al, %eax
1298 ; SSE2-NEXT: movd %eax, %xmm0
1299 ; SSE2-NEXT: pinsrw $4, %r11d, %xmm0
1300 ; SSE2-NEXT: movq %rdx, 16(%r10)
1301 ; SSE2-NEXT: movq %rdi, (%r10)
1302 ; SSE2-NEXT: movq %rcx, 24(%r10)
1303 ; SSE2-NEXT: movq %rsi, 8(%r10)
1304 ; SSE2-NEXT: psllq $63, %xmm0
1305 ; SSE2-NEXT: psrad $31, %xmm0
1306 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1309 ; SSSE3-LABEL: usubo_v2i128:
1311 ; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %r10
1312 ; SSSE3-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1313 ; SSSE3-NEXT: sbbq {{[0-9]+}}(%rsp), %rcx
1314 ; SSSE3-NEXT: setb %al
1315 ; SSSE3-NEXT: movzbl %al, %r11d
1316 ; SSSE3-NEXT: subq %r8, %rdi
1317 ; SSSE3-NEXT: sbbq %r9, %rsi
1318 ; SSSE3-NEXT: setb %al
1319 ; SSSE3-NEXT: movzbl %al, %eax
1320 ; SSSE3-NEXT: movd %eax, %xmm0
1321 ; SSSE3-NEXT: pinsrw $4, %r11d, %xmm0
1322 ; SSSE3-NEXT: movq %rdx, 16(%r10)
1323 ; SSSE3-NEXT: movq %rdi, (%r10)
1324 ; SSSE3-NEXT: movq %rcx, 24(%r10)
1325 ; SSSE3-NEXT: movq %rsi, 8(%r10)
1326 ; SSSE3-NEXT: psllq $63, %xmm0
1327 ; SSSE3-NEXT: psrad $31, %xmm0
1328 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1331 ; SSE41-LABEL: usubo_v2i128:
1333 ; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %r10
1334 ; SSE41-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1335 ; SSE41-NEXT: sbbq {{[0-9]+}}(%rsp), %rcx
1336 ; SSE41-NEXT: setb %al
1337 ; SSE41-NEXT: movzbl %al, %r11d
1338 ; SSE41-NEXT: subq %r8, %rdi
1339 ; SSE41-NEXT: sbbq %r9, %rsi
1340 ; SSE41-NEXT: setb %al
1341 ; SSE41-NEXT: movzbl %al, %eax
1342 ; SSE41-NEXT: movd %eax, %xmm0
1343 ; SSE41-NEXT: pinsrb $8, %r11d, %xmm0
1344 ; SSE41-NEXT: movq %rdx, 16(%r10)
1345 ; SSE41-NEXT: movq %rdi, (%r10)
1346 ; SSE41-NEXT: movq %rcx, 24(%r10)
1347 ; SSE41-NEXT: movq %rsi, 8(%r10)
1348 ; SSE41-NEXT: psllq $63, %xmm0
1349 ; SSE41-NEXT: psrad $31, %xmm0
1350 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1353 ; AVX1-LABEL: usubo_v2i128:
1355 ; AVX1-NEXT: movq {{[0-9]+}}(%rsp), %r10
1356 ; AVX1-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1357 ; AVX1-NEXT: sbbq {{[0-9]+}}(%rsp), %rcx
1358 ; AVX1-NEXT: setb %al
1359 ; AVX1-NEXT: movzbl %al, %r11d
1360 ; AVX1-NEXT: subq %r8, %rdi
1361 ; AVX1-NEXT: sbbq %r9, %rsi
1362 ; AVX1-NEXT: setb %al
1363 ; AVX1-NEXT: movzbl %al, %eax
1364 ; AVX1-NEXT: vmovd %eax, %xmm0
1365 ; AVX1-NEXT: vpinsrb $8, %r11d, %xmm0, %xmm0
1366 ; AVX1-NEXT: movq %rdx, 16(%r10)
1367 ; AVX1-NEXT: movq %rdi, (%r10)
1368 ; AVX1-NEXT: movq %rcx, 24(%r10)
1369 ; AVX1-NEXT: movq %rsi, 8(%r10)
1370 ; AVX1-NEXT: vpsllq $63, %xmm0, %xmm0
1371 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
1372 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0
1375 ; AVX2-LABEL: usubo_v2i128:
1377 ; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %r10
1378 ; AVX2-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1379 ; AVX2-NEXT: sbbq {{[0-9]+}}(%rsp), %rcx
1380 ; AVX2-NEXT: setb %al
1381 ; AVX2-NEXT: movzbl %al, %r11d
1382 ; AVX2-NEXT: subq %r8, %rdi
1383 ; AVX2-NEXT: sbbq %r9, %rsi
1384 ; AVX2-NEXT: setb %al
1385 ; AVX2-NEXT: movzbl %al, %eax
1386 ; AVX2-NEXT: vmovd %eax, %xmm0
1387 ; AVX2-NEXT: vpinsrb $8, %r11d, %xmm0, %xmm0
1388 ; AVX2-NEXT: movq %rdx, 16(%r10)
1389 ; AVX2-NEXT: movq %rdi, (%r10)
1390 ; AVX2-NEXT: movq %rcx, 24(%r10)
1391 ; AVX2-NEXT: movq %rsi, 8(%r10)
1392 ; AVX2-NEXT: vpsllq $63, %xmm0, %xmm0
1393 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
1394 ; AVX2-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0
1397 ; AVX512-LABEL: usubo_v2i128:
1399 ; AVX512-NEXT: movq {{[0-9]+}}(%rsp), %r10
1400 ; AVX512-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1401 ; AVX512-NEXT: sbbq {{[0-9]+}}(%rsp), %rcx
1402 ; AVX512-NEXT: setb %al
1403 ; AVX512-NEXT: movb %al, -{{[0-9]+}}(%rsp)
1404 ; AVX512-NEXT: subq %r8, %rdi
1405 ; AVX512-NEXT: sbbq %r9, %rsi
1406 ; AVX512-NEXT: setb %al
1407 ; AVX512-NEXT: movb %al, -{{[0-9]+}}(%rsp)
1408 ; AVX512-NEXT: kmovw -{{[0-9]+}}(%rsp), %k1
1409 ; AVX512-NEXT: movq %rdx, 16(%r10)
1410 ; AVX512-NEXT: movq %rdi, (%r10)
1411 ; AVX512-NEXT: movq %rcx, 24(%r10)
1412 ; AVX512-NEXT: movq %rsi, 8(%r10)
1413 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1414 ; AVX512-NEXT: vmovdqa64 %xmm0, %xmm0 {%k1} {z}
1416 %t = call {<2 x i128>, <2 x i1>} @llvm.usub.with.overflow.v2i128(<2 x i128> %a0, <2 x i128> %a1)
1417 %val = extractvalue {<2 x i128>, <2 x i1>} %t, 0
1418 %obit = extractvalue {<2 x i128>, <2 x i1>} %t, 1
1419 %res = sext <2 x i1> %obit to <2 x i32>
1420 store <2 x i128> %val, <2 x i128>* %p2