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 = [2147483648,2147483648,2147483648,2147483648]
51 ; SSE2-NEXT: movdqa %xmm0, %xmm3
52 ; SSE2-NEXT: pxor %xmm2, %xmm3
53 ; SSE2-NEXT: psubd %xmm1, %xmm0
54 ; SSE2-NEXT: pxor %xmm0, %xmm2
55 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm2
56 ; SSE2-NEXT: movq %xmm0, (%rdi)
57 ; SSE2-NEXT: movdqa %xmm2, %xmm0
60 ; SSSE3-LABEL: usubo_v2i32:
62 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
63 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
64 ; SSSE3-NEXT: pxor %xmm2, %xmm3
65 ; SSSE3-NEXT: psubd %xmm1, %xmm0
66 ; SSSE3-NEXT: pxor %xmm0, %xmm2
67 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm2
68 ; SSSE3-NEXT: movq %xmm0, (%rdi)
69 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
72 ; SSE41-LABEL: usubo_v2i32:
74 ; SSE41-NEXT: movdqa %xmm0, %xmm2
75 ; SSE41-NEXT: psubd %xmm1, %xmm2
76 ; SSE41-NEXT: pminud %xmm2, %xmm0
77 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm0
78 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
79 ; SSE41-NEXT: pxor %xmm1, %xmm0
80 ; SSE41-NEXT: movq %xmm2, (%rdi)
83 ; AVX1-LABEL: usubo_v2i32:
85 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
86 ; AVX1-NEXT: vpminud %xmm0, %xmm1, %xmm0
87 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
88 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
89 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
90 ; AVX1-NEXT: vmovq %xmm1, (%rdi)
93 ; AVX2-LABEL: usubo_v2i32:
95 ; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm1
96 ; AVX2-NEXT: vpminud %xmm0, %xmm1, %xmm0
97 ; AVX2-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
98 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
99 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
100 ; AVX2-NEXT: vmovq %xmm1, (%rdi)
103 ; AVX512-LABEL: usubo_v2i32:
105 ; AVX512-NEXT: vpsubd %xmm1, %xmm0, %xmm1
106 ; AVX512-NEXT: vpcmpnleud %xmm0, %xmm1, %k1
107 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
108 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
109 ; AVX512-NEXT: vmovq %xmm1, (%rdi)
111 %t = call {<2 x i32>, <2 x i1>} @llvm.usub.with.overflow.v2i32(<2 x i32> %a0, <2 x i32> %a1)
112 %val = extractvalue {<2 x i32>, <2 x i1>} %t, 0
113 %obit = extractvalue {<2 x i32>, <2 x i1>} %t, 1
114 %res = sext <2 x i1> %obit to <2 x i32>
115 store <2 x i32> %val, <2 x i32>* %p2
119 define <3 x i32> @usubo_v3i32(<3 x i32> %a0, <3 x i32> %a1, <3 x i32>* %p2) nounwind {
120 ; SSE2-LABEL: usubo_v3i32:
122 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
123 ; SSE2-NEXT: movdqa %xmm0, %xmm3
124 ; SSE2-NEXT: pxor %xmm2, %xmm3
125 ; SSE2-NEXT: psubd %xmm1, %xmm0
126 ; SSE2-NEXT: pxor %xmm0, %xmm2
127 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm2
128 ; SSE2-NEXT: movq %xmm0, (%rdi)
129 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
130 ; SSE2-NEXT: movd %xmm0, 8(%rdi)
131 ; SSE2-NEXT: movdqa %xmm2, %xmm0
134 ; SSSE3-LABEL: usubo_v3i32:
136 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
137 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
138 ; SSSE3-NEXT: pxor %xmm2, %xmm3
139 ; SSSE3-NEXT: psubd %xmm1, %xmm0
140 ; SSSE3-NEXT: pxor %xmm0, %xmm2
141 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm2
142 ; SSSE3-NEXT: movq %xmm0, (%rdi)
143 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
144 ; SSSE3-NEXT: movd %xmm0, 8(%rdi)
145 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
148 ; SSE41-LABEL: usubo_v3i32:
150 ; SSE41-NEXT: movdqa %xmm0, %xmm2
151 ; SSE41-NEXT: psubd %xmm1, %xmm2
152 ; SSE41-NEXT: pminud %xmm2, %xmm0
153 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm0
154 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
155 ; SSE41-NEXT: pxor %xmm1, %xmm0
156 ; SSE41-NEXT: pextrd $2, %xmm2, 8(%rdi)
157 ; SSE41-NEXT: movq %xmm2, (%rdi)
160 ; AVX1-LABEL: usubo_v3i32:
162 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
163 ; AVX1-NEXT: vpminud %xmm0, %xmm1, %xmm0
164 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
165 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
166 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
167 ; AVX1-NEXT: vpextrd $2, %xmm1, 8(%rdi)
168 ; AVX1-NEXT: vmovq %xmm1, (%rdi)
171 ; AVX2-LABEL: usubo_v3i32:
173 ; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm1
174 ; AVX2-NEXT: vpminud %xmm0, %xmm1, %xmm0
175 ; AVX2-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
176 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
177 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
178 ; AVX2-NEXT: vpextrd $2, %xmm1, 8(%rdi)
179 ; AVX2-NEXT: vmovq %xmm1, (%rdi)
182 ; AVX512-LABEL: usubo_v3i32:
184 ; AVX512-NEXT: vpsubd %xmm1, %xmm0, %xmm1
185 ; AVX512-NEXT: vpcmpnleud %xmm0, %xmm1, %k1
186 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
187 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
188 ; AVX512-NEXT: vpextrd $2, %xmm1, 8(%rdi)
189 ; AVX512-NEXT: vmovq %xmm1, (%rdi)
191 %t = call {<3 x i32>, <3 x i1>} @llvm.usub.with.overflow.v3i32(<3 x i32> %a0, <3 x i32> %a1)
192 %val = extractvalue {<3 x i32>, <3 x i1>} %t, 0
193 %obit = extractvalue {<3 x i32>, <3 x i1>} %t, 1
194 %res = sext <3 x i1> %obit to <3 x i32>
195 store <3 x i32> %val, <3 x i32>* %p2
199 define <4 x i32> @usubo_v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i32>* %p2) nounwind {
200 ; SSE2-LABEL: usubo_v4i32:
202 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
203 ; SSE2-NEXT: movdqa %xmm0, %xmm3
204 ; SSE2-NEXT: pxor %xmm2, %xmm3
205 ; SSE2-NEXT: psubd %xmm1, %xmm0
206 ; SSE2-NEXT: pxor %xmm0, %xmm2
207 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm2
208 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
209 ; SSE2-NEXT: movdqa %xmm2, %xmm0
212 ; SSSE3-LABEL: usubo_v4i32:
214 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
215 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
216 ; SSSE3-NEXT: pxor %xmm2, %xmm3
217 ; SSSE3-NEXT: psubd %xmm1, %xmm0
218 ; SSSE3-NEXT: pxor %xmm0, %xmm2
219 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm2
220 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
221 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
224 ; SSE41-LABEL: usubo_v4i32:
226 ; SSE41-NEXT: movdqa %xmm0, %xmm2
227 ; SSE41-NEXT: psubd %xmm1, %xmm2
228 ; SSE41-NEXT: pminud %xmm2, %xmm0
229 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm0
230 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
231 ; SSE41-NEXT: pxor %xmm1, %xmm0
232 ; SSE41-NEXT: movdqa %xmm2, (%rdi)
235 ; AVX1-LABEL: usubo_v4i32:
237 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
238 ; AVX1-NEXT: vpminud %xmm0, %xmm1, %xmm0
239 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
240 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
241 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
242 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
245 ; AVX2-LABEL: usubo_v4i32:
247 ; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm1
248 ; AVX2-NEXT: vpminud %xmm0, %xmm1, %xmm0
249 ; AVX2-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
250 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
251 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
252 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
255 ; AVX512-LABEL: usubo_v4i32:
257 ; AVX512-NEXT: vpsubd %xmm1, %xmm0, %xmm1
258 ; AVX512-NEXT: vpcmpnleud %xmm0, %xmm1, %k1
259 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
260 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
261 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
263 %t = call {<4 x i32>, <4 x i1>} @llvm.usub.with.overflow.v4i32(<4 x i32> %a0, <4 x i32> %a1)
264 %val = extractvalue {<4 x i32>, <4 x i1>} %t, 0
265 %obit = extractvalue {<4 x i32>, <4 x i1>} %t, 1
266 %res = sext <4 x i1> %obit to <4 x i32>
267 store <4 x i32> %val, <4 x i32>* %p2
271 define <6 x i32> @usubo_v6i32(<6 x i32> %a0, <6 x i32> %a1, <6 x i32>* %p2) nounwind {
272 ; SSE2-LABEL: usubo_v6i32:
274 ; SSE2-NEXT: movq %rdi, %rax
275 ; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
276 ; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
277 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
278 ; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
279 ; SSE2-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
280 ; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
281 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
282 ; SSE2-NEXT: movd %r8d, %xmm0
283 ; SSE2-NEXT: movd %ecx, %xmm1
284 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
285 ; SSE2-NEXT: movd %edx, %xmm3
286 ; SSE2-NEXT: movd %esi, %xmm0
287 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
288 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
289 ; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
290 ; SSE2-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
291 ; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
292 ; SSE2-NEXT: movd %r9d, %xmm1
293 ; SSE2-NEXT: movd {{.*#+}} xmm4 = mem[0],zero,zero,zero
294 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]
295 ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %rcx
296 ; SSE2-NEXT: movdqa %xmm0, %xmm4
297 ; SSE2-NEXT: psubd %xmm2, %xmm4
298 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
299 ; SSE2-NEXT: movdqa %xmm4, (%rcx)
300 ; SSE2-NEXT: pxor %xmm2, %xmm4
301 ; SSE2-NEXT: pxor %xmm2, %xmm0
302 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
303 ; SSE2-NEXT: movdqa %xmm1, %xmm0
304 ; SSE2-NEXT: psubd %xmm3, %xmm0
305 ; SSE2-NEXT: movq %xmm0, 16(%rcx)
306 ; SSE2-NEXT: pxor %xmm2, %xmm0
307 ; SSE2-NEXT: pxor %xmm2, %xmm1
308 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm0
309 ; SSE2-NEXT: movq %xmm0, 16(%rdi)
310 ; SSE2-NEXT: movdqa %xmm4, (%rdi)
313 ; SSSE3-LABEL: usubo_v6i32:
315 ; SSSE3-NEXT: movq %rdi, %rax
316 ; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
317 ; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
318 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
319 ; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
320 ; SSSE3-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
321 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
322 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
323 ; SSSE3-NEXT: movd %r8d, %xmm0
324 ; SSSE3-NEXT: movd %ecx, %xmm1
325 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
326 ; SSSE3-NEXT: movd %edx, %xmm3
327 ; SSSE3-NEXT: movd %esi, %xmm0
328 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
329 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
330 ; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
331 ; SSSE3-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
332 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
333 ; SSSE3-NEXT: movd %r9d, %xmm1
334 ; SSSE3-NEXT: movd {{.*#+}} xmm4 = mem[0],zero,zero,zero
335 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]
336 ; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %rcx
337 ; SSSE3-NEXT: movdqa %xmm0, %xmm4
338 ; SSSE3-NEXT: psubd %xmm2, %xmm4
339 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
340 ; SSSE3-NEXT: movdqa %xmm4, (%rcx)
341 ; SSSE3-NEXT: pxor %xmm2, %xmm4
342 ; SSSE3-NEXT: pxor %xmm2, %xmm0
343 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
344 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
345 ; SSSE3-NEXT: psubd %xmm3, %xmm0
346 ; SSSE3-NEXT: movq %xmm0, 16(%rcx)
347 ; SSSE3-NEXT: pxor %xmm2, %xmm0
348 ; SSSE3-NEXT: pxor %xmm2, %xmm1
349 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm0
350 ; SSSE3-NEXT: movq %xmm0, 16(%rdi)
351 ; SSSE3-NEXT: movdqa %xmm4, (%rdi)
354 ; SSE41-LABEL: usubo_v6i32:
356 ; SSE41-NEXT: movq %rdi, %rax
357 ; SSE41-NEXT: movd %esi, %xmm0
358 ; SSE41-NEXT: pinsrd $1, %edx, %xmm0
359 ; SSE41-NEXT: pinsrd $2, %ecx, %xmm0
360 ; SSE41-NEXT: pinsrd $3, %r8d, %xmm0
361 ; SSE41-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
362 ; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm1
363 ; SSE41-NEXT: movd %r9d, %xmm2
364 ; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm2
365 ; SSE41-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
366 ; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm3
367 ; SSE41-NEXT: pinsrd $2, {{[0-9]+}}(%rsp), %xmm3
368 ; SSE41-NEXT: pinsrd $3, {{[0-9]+}}(%rsp), %xmm3
369 ; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %rcx
370 ; SSE41-NEXT: movdqa %xmm0, %xmm4
371 ; SSE41-NEXT: psubd %xmm3, %xmm4
372 ; SSE41-NEXT: pminud %xmm4, %xmm0
373 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm0
374 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm3
375 ; SSE41-NEXT: pxor %xmm3, %xmm0
376 ; SSE41-NEXT: movdqa %xmm2, %xmm5
377 ; SSE41-NEXT: psubd %xmm1, %xmm5
378 ; SSE41-NEXT: pminud %xmm5, %xmm2
379 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm2
380 ; SSE41-NEXT: pxor %xmm3, %xmm2
381 ; SSE41-NEXT: movq %xmm5, 16(%rcx)
382 ; SSE41-NEXT: movdqa %xmm4, (%rcx)
383 ; SSE41-NEXT: movq %xmm2, 16(%rdi)
384 ; SSE41-NEXT: movdqa %xmm0, (%rdi)
387 ; AVX1-LABEL: usubo_v6i32:
389 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
390 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
391 ; AVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm2
392 ; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm3
393 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm3
394 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
395 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
396 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
397 ; AVX1-NEXT: vpminud %xmm0, %xmm1, %xmm0
398 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
399 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
400 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
401 ; AVX1-NEXT: vmovq %xmm2, 16(%rdi)
402 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
405 ; AVX2-LABEL: usubo_v6i32:
407 ; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm1
408 ; AVX2-NEXT: vpminud %ymm0, %ymm1, %ymm0
409 ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm1, %ymm0
410 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2
411 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
412 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
413 ; AVX2-NEXT: vmovq %xmm2, 16(%rdi)
414 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
417 ; AVX512-LABEL: usubo_v6i32:
419 ; AVX512-NEXT: vpsubd %ymm1, %ymm0, %ymm1
420 ; AVX512-NEXT: vpcmpnleud %ymm0, %ymm1, %k1
421 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
422 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
423 ; AVX512-NEXT: vextracti128 $1, %ymm1, %xmm2
424 ; AVX512-NEXT: vmovq %xmm2, 16(%rdi)
425 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
427 %t = call {<6 x i32>, <6 x i1>} @llvm.usub.with.overflow.v6i32(<6 x i32> %a0, <6 x i32> %a1)
428 %val = extractvalue {<6 x i32>, <6 x i1>} %t, 0
429 %obit = extractvalue {<6 x i32>, <6 x i1>} %t, 1
430 %res = sext <6 x i1> %obit to <6 x i32>
431 store <6 x i32> %val, <6 x i32>* %p2
435 define <8 x i32> @usubo_v8i32(<8 x i32> %a0, <8 x i32> %a1, <8 x i32>* %p2) nounwind {
436 ; SSE2-LABEL: usubo_v8i32:
438 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
439 ; SSE2-NEXT: movdqa %xmm0, %xmm5
440 ; SSE2-NEXT: pxor %xmm4, %xmm5
441 ; SSE2-NEXT: psubd %xmm2, %xmm0
442 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
443 ; SSE2-NEXT: pxor %xmm4, %xmm0
444 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm0
445 ; SSE2-NEXT: movdqa %xmm1, %xmm2
446 ; SSE2-NEXT: pxor %xmm4, %xmm2
447 ; SSE2-NEXT: psubd %xmm3, %xmm1
448 ; SSE2-NEXT: pxor %xmm1, %xmm4
449 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
450 ; SSE2-NEXT: movdqa %xmm1, 16(%rdi)
451 ; SSE2-NEXT: movdqa %xmm4, %xmm1
454 ; SSSE3-LABEL: usubo_v8i32:
456 ; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
457 ; SSSE3-NEXT: movdqa %xmm0, %xmm5
458 ; SSSE3-NEXT: pxor %xmm4, %xmm5
459 ; SSSE3-NEXT: psubd %xmm2, %xmm0
460 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
461 ; SSSE3-NEXT: pxor %xmm4, %xmm0
462 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm0
463 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
464 ; SSSE3-NEXT: pxor %xmm4, %xmm2
465 ; SSSE3-NEXT: psubd %xmm3, %xmm1
466 ; SSSE3-NEXT: pxor %xmm1, %xmm4
467 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
468 ; SSSE3-NEXT: movdqa %xmm1, 16(%rdi)
469 ; SSSE3-NEXT: movdqa %xmm4, %xmm1
472 ; SSE41-LABEL: usubo_v8i32:
474 ; SSE41-NEXT: movdqa %xmm0, %xmm4
475 ; SSE41-NEXT: psubd %xmm2, %xmm4
476 ; SSE41-NEXT: pminud %xmm4, %xmm0
477 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm0
478 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm2
479 ; SSE41-NEXT: pxor %xmm2, %xmm0
480 ; SSE41-NEXT: movdqa %xmm1, %xmm5
481 ; SSE41-NEXT: psubd %xmm3, %xmm5
482 ; SSE41-NEXT: pminud %xmm5, %xmm1
483 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm1
484 ; SSE41-NEXT: pxor %xmm2, %xmm1
485 ; SSE41-NEXT: movdqa %xmm5, 16(%rdi)
486 ; SSE41-NEXT: movdqa %xmm4, (%rdi)
489 ; AVX1-LABEL: usubo_v8i32:
491 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
492 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
493 ; AVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm2
494 ; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm3
495 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm3
496 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
497 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
498 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
499 ; AVX1-NEXT: vpminud %xmm0, %xmm1, %xmm0
500 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
501 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
502 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
503 ; AVX1-NEXT: vmovdqa %xmm2, 16(%rdi)
504 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
507 ; AVX2-LABEL: usubo_v8i32:
509 ; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm1
510 ; AVX2-NEXT: vpminud %ymm0, %ymm1, %ymm0
511 ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm1, %ymm0
512 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2
513 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
514 ; AVX2-NEXT: vmovdqa %ymm1, (%rdi)
517 ; AVX512-LABEL: usubo_v8i32:
519 ; AVX512-NEXT: vpsubd %ymm1, %ymm0, %ymm1
520 ; AVX512-NEXT: vpcmpnleud %ymm0, %ymm1, %k1
521 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
522 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
523 ; AVX512-NEXT: vmovdqa %ymm1, (%rdi)
525 %t = call {<8 x i32>, <8 x i1>} @llvm.usub.with.overflow.v8i32(<8 x i32> %a0, <8 x i32> %a1)
526 %val = extractvalue {<8 x i32>, <8 x i1>} %t, 0
527 %obit = extractvalue {<8 x i32>, <8 x i1>} %t, 1
528 %res = sext <8 x i1> %obit to <8 x i32>
529 store <8 x i32> %val, <8 x i32>* %p2
533 define <16 x i32> @usubo_v16i32(<16 x i32> %a0, <16 x i32> %a1, <16 x i32>* %p2) nounwind {
534 ; SSE2-LABEL: usubo_v16i32:
536 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
537 ; SSE2-NEXT: movdqa %xmm0, %xmm9
538 ; SSE2-NEXT: pxor %xmm8, %xmm9
539 ; SSE2-NEXT: psubd %xmm4, %xmm0
540 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
541 ; SSE2-NEXT: pxor %xmm8, %xmm0
542 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm0
543 ; SSE2-NEXT: movdqa %xmm1, %xmm4
544 ; SSE2-NEXT: pxor %xmm8, %xmm4
545 ; SSE2-NEXT: psubd %xmm5, %xmm1
546 ; SSE2-NEXT: movdqa %xmm1, 16(%rdi)
547 ; SSE2-NEXT: pxor %xmm8, %xmm1
548 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm1
549 ; SSE2-NEXT: movdqa %xmm2, %xmm4
550 ; SSE2-NEXT: pxor %xmm8, %xmm4
551 ; SSE2-NEXT: psubd %xmm6, %xmm2
552 ; SSE2-NEXT: movdqa %xmm2, 32(%rdi)
553 ; SSE2-NEXT: pxor %xmm8, %xmm2
554 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm2
555 ; SSE2-NEXT: movdqa %xmm3, %xmm4
556 ; SSE2-NEXT: pxor %xmm8, %xmm4
557 ; SSE2-NEXT: psubd %xmm7, %xmm3
558 ; SSE2-NEXT: pxor %xmm3, %xmm8
559 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm8
560 ; SSE2-NEXT: movdqa %xmm3, 48(%rdi)
561 ; SSE2-NEXT: movdqa %xmm8, %xmm3
564 ; SSSE3-LABEL: usubo_v16i32:
566 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
567 ; SSSE3-NEXT: movdqa %xmm0, %xmm9
568 ; SSSE3-NEXT: pxor %xmm8, %xmm9
569 ; SSSE3-NEXT: psubd %xmm4, %xmm0
570 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
571 ; SSSE3-NEXT: pxor %xmm8, %xmm0
572 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm0
573 ; SSSE3-NEXT: movdqa %xmm1, %xmm4
574 ; SSSE3-NEXT: pxor %xmm8, %xmm4
575 ; SSSE3-NEXT: psubd %xmm5, %xmm1
576 ; SSSE3-NEXT: movdqa %xmm1, 16(%rdi)
577 ; SSSE3-NEXT: pxor %xmm8, %xmm1
578 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm1
579 ; SSSE3-NEXT: movdqa %xmm2, %xmm4
580 ; SSSE3-NEXT: pxor %xmm8, %xmm4
581 ; SSSE3-NEXT: psubd %xmm6, %xmm2
582 ; SSSE3-NEXT: movdqa %xmm2, 32(%rdi)
583 ; SSSE3-NEXT: pxor %xmm8, %xmm2
584 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm2
585 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
586 ; SSSE3-NEXT: pxor %xmm8, %xmm4
587 ; SSSE3-NEXT: psubd %xmm7, %xmm3
588 ; SSSE3-NEXT: pxor %xmm3, %xmm8
589 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm8
590 ; SSSE3-NEXT: movdqa %xmm3, 48(%rdi)
591 ; SSSE3-NEXT: movdqa %xmm8, %xmm3
594 ; SSE41-LABEL: usubo_v16i32:
596 ; SSE41-NEXT: movdqa %xmm0, %xmm8
597 ; SSE41-NEXT: psubd %xmm4, %xmm8
598 ; SSE41-NEXT: pminud %xmm8, %xmm0
599 ; SSE41-NEXT: pcmpeqd %xmm8, %xmm0
600 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm9
601 ; SSE41-NEXT: pxor %xmm9, %xmm0
602 ; SSE41-NEXT: movdqa %xmm1, %xmm4
603 ; SSE41-NEXT: psubd %xmm5, %xmm4
604 ; SSE41-NEXT: pminud %xmm4, %xmm1
605 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm1
606 ; SSE41-NEXT: pxor %xmm9, %xmm1
607 ; SSE41-NEXT: movdqa %xmm2, %xmm5
608 ; SSE41-NEXT: psubd %xmm6, %xmm5
609 ; SSE41-NEXT: pminud %xmm5, %xmm2
610 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm2
611 ; SSE41-NEXT: pxor %xmm9, %xmm2
612 ; SSE41-NEXT: movdqa %xmm3, %xmm6
613 ; SSE41-NEXT: psubd %xmm7, %xmm6
614 ; SSE41-NEXT: pminud %xmm6, %xmm3
615 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm3
616 ; SSE41-NEXT: pxor %xmm9, %xmm3
617 ; SSE41-NEXT: movdqa %xmm6, 48(%rdi)
618 ; SSE41-NEXT: movdqa %xmm5, 32(%rdi)
619 ; SSE41-NEXT: movdqa %xmm4, 16(%rdi)
620 ; SSE41-NEXT: movdqa %xmm8, (%rdi)
623 ; AVX1-LABEL: usubo_v16i32:
625 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
626 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
627 ; AVX1-NEXT: vpsubd %xmm4, %xmm5, %xmm4
628 ; AVX1-NEXT: vpminud %xmm5, %xmm4, %xmm5
629 ; AVX1-NEXT: vpcmpeqd %xmm5, %xmm4, %xmm5
630 ; AVX1-NEXT: vpcmpeqd %xmm6, %xmm6, %xmm6
631 ; AVX1-NEXT: vpxor %xmm6, %xmm5, %xmm5
632 ; AVX1-NEXT: vpsubd %xmm3, %xmm1, %xmm3
633 ; AVX1-NEXT: vpminud %xmm1, %xmm3, %xmm1
634 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm3, %xmm1
635 ; AVX1-NEXT: vpxor %xmm6, %xmm1, %xmm1
636 ; AVX1-NEXT: vpackssdw %xmm5, %xmm1, %xmm1
637 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5
638 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7
639 ; AVX1-NEXT: vpsubd %xmm5, %xmm7, %xmm5
640 ; AVX1-NEXT: vpminud %xmm7, %xmm5, %xmm7
641 ; AVX1-NEXT: vpcmpeqd %xmm7, %xmm5, %xmm7
642 ; AVX1-NEXT: vpxor %xmm6, %xmm7, %xmm7
643 ; AVX1-NEXT: vpsubd %xmm2, %xmm0, %xmm2
644 ; AVX1-NEXT: vpminud %xmm0, %xmm2, %xmm0
645 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm2, %xmm0
646 ; AVX1-NEXT: vpxor %xmm6, %xmm0, %xmm0
647 ; AVX1-NEXT: vpackssdw %xmm7, %xmm0, %xmm0
648 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm1
649 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0
650 ; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm1[1,1,2,3]
651 ; AVX1-NEXT: vpmovsxbd %xmm6, %xmm6
652 ; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm0, %ymm0
653 ; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm1[2,3,0,1]
654 ; AVX1-NEXT: vpmovsxbd %xmm6, %xmm6
655 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,0,1]
656 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
657 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm6, %ymm1
658 ; AVX1-NEXT: vmovdqa %xmm4, 48(%rdi)
659 ; AVX1-NEXT: vmovdqa %xmm3, 32(%rdi)
660 ; AVX1-NEXT: vmovdqa %xmm5, 16(%rdi)
661 ; AVX1-NEXT: vmovdqa %xmm2, (%rdi)
664 ; AVX2-LABEL: usubo_v16i32:
666 ; AVX2-NEXT: vpsubd %ymm3, %ymm1, %ymm3
667 ; AVX2-NEXT: vpminud %ymm1, %ymm3, %ymm1
668 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1
669 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4
670 ; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1
671 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5
672 ; AVX2-NEXT: vpackssdw %xmm5, %xmm1, %xmm1
673 ; AVX2-NEXT: vpsubd %ymm2, %ymm0, %ymm2
674 ; AVX2-NEXT: vpminud %ymm0, %ymm2, %ymm0
675 ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm2, %ymm0
676 ; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm0
677 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4
678 ; AVX2-NEXT: vpackssdw %xmm4, %xmm0, %xmm0
679 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1
680 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0
681 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
682 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1
683 ; AVX2-NEXT: vmovdqa %ymm3, 32(%rdi)
684 ; AVX2-NEXT: vmovdqa %ymm2, (%rdi)
687 ; AVX512-LABEL: usubo_v16i32:
689 ; AVX512-NEXT: vpsubd %zmm1, %zmm0, %zmm1
690 ; AVX512-NEXT: vpcmpnleud %zmm0, %zmm1, %k1
691 ; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
692 ; AVX512-NEXT: vmovdqa64 %zmm1, (%rdi)
694 %t = call {<16 x i32>, <16 x i1>} @llvm.usub.with.overflow.v16i32(<16 x i32> %a0, <16 x i32> %a1)
695 %val = extractvalue {<16 x i32>, <16 x i1>} %t, 0
696 %obit = extractvalue {<16 x i32>, <16 x i1>} %t, 1
697 %res = sext <16 x i1> %obit to <16 x i32>
698 store <16 x i32> %val, <16 x i32>* %p2
702 define <16 x i32> @usubo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nounwind {
703 ; SSE2-LABEL: usubo_v16i8:
705 ; SSE2-NEXT: movdqa %xmm0, %xmm4
706 ; SSE2-NEXT: psubb %xmm1, %xmm4
707 ; SSE2-NEXT: pminub %xmm4, %xmm0
708 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm0
709 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm3
710 ; SSE2-NEXT: pxor %xmm0, %xmm3
711 ; SSE2-NEXT: movdqa %xmm3, %xmm1
712 ; 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]
713 ; SSE2-NEXT: movdqa %xmm1, %xmm0
714 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
715 ; SSE2-NEXT: pslld $31, %xmm0
716 ; SSE2-NEXT: psrad $31, %xmm0
717 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
718 ; SSE2-NEXT: pslld $31, %xmm1
719 ; SSE2-NEXT: psrad $31, %xmm1
720 ; 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]
721 ; SSE2-NEXT: movdqa %xmm3, %xmm2
722 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
723 ; SSE2-NEXT: pslld $31, %xmm2
724 ; SSE2-NEXT: psrad $31, %xmm2
725 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
726 ; SSE2-NEXT: pslld $31, %xmm3
727 ; SSE2-NEXT: psrad $31, %xmm3
728 ; SSE2-NEXT: movdqa %xmm4, (%rdi)
731 ; SSSE3-LABEL: usubo_v16i8:
733 ; SSSE3-NEXT: movdqa %xmm0, %xmm4
734 ; SSSE3-NEXT: psubb %xmm1, %xmm4
735 ; SSSE3-NEXT: pminub %xmm4, %xmm0
736 ; SSSE3-NEXT: pcmpeqb %xmm4, %xmm0
737 ; SSSE3-NEXT: pcmpeqd %xmm3, %xmm3
738 ; SSSE3-NEXT: pxor %xmm0, %xmm3
739 ; SSSE3-NEXT: movdqa %xmm3, %xmm1
740 ; 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]
741 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
742 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
743 ; SSSE3-NEXT: pslld $31, %xmm0
744 ; SSSE3-NEXT: psrad $31, %xmm0
745 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
746 ; SSSE3-NEXT: pslld $31, %xmm1
747 ; SSSE3-NEXT: psrad $31, %xmm1
748 ; 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]
749 ; SSSE3-NEXT: movdqa %xmm3, %xmm2
750 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
751 ; SSSE3-NEXT: pslld $31, %xmm2
752 ; SSSE3-NEXT: psrad $31, %xmm2
753 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
754 ; SSSE3-NEXT: pslld $31, %xmm3
755 ; SSSE3-NEXT: psrad $31, %xmm3
756 ; SSSE3-NEXT: movdqa %xmm4, (%rdi)
759 ; SSE41-LABEL: usubo_v16i8:
761 ; SSE41-NEXT: movdqa %xmm0, %xmm4
762 ; SSE41-NEXT: psubb %xmm1, %xmm4
763 ; SSE41-NEXT: pminub %xmm4, %xmm0
764 ; SSE41-NEXT: pcmpeqb %xmm4, %xmm0
765 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm3
766 ; SSE41-NEXT: pxor %xmm0, %xmm3
767 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
768 ; SSE41-NEXT: pslld $31, %xmm0
769 ; SSE41-NEXT: psrad $31, %xmm0
770 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,2,3]
771 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
772 ; SSE41-NEXT: pslld $31, %xmm1
773 ; SSE41-NEXT: psrad $31, %xmm1
774 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[2,3,0,1]
775 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
776 ; SSE41-NEXT: pslld $31, %xmm2
777 ; SSE41-NEXT: psrad $31, %xmm2
778 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[3,1,2,3]
779 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
780 ; SSE41-NEXT: pslld $31, %xmm3
781 ; SSE41-NEXT: psrad $31, %xmm3
782 ; SSE41-NEXT: movdqa %xmm4, (%rdi)
785 ; AVX1-LABEL: usubo_v16i8:
787 ; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm2
788 ; AVX1-NEXT: vpminub %xmm0, %xmm2, %xmm0
789 ; AVX1-NEXT: vpcmpeqb %xmm0, %xmm2, %xmm0
790 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
791 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm1
792 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0
793 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[1,1,2,3]
794 ; AVX1-NEXT: vpmovsxbd %xmm3, %xmm3
795 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
796 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
797 ; AVX1-NEXT: vpmovsxbd %xmm3, %xmm3
798 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,0,1]
799 ; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1
800 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm1
801 ; AVX1-NEXT: vmovdqa %xmm2, (%rdi)
804 ; AVX2-LABEL: usubo_v16i8:
806 ; AVX2-NEXT: vpsubb %xmm1, %xmm0, %xmm2
807 ; AVX2-NEXT: vpminub %xmm0, %xmm2, %xmm0
808 ; AVX2-NEXT: vpcmpeqb %xmm0, %xmm2, %xmm0
809 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
810 ; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm1
811 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0
812 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
813 ; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1
814 ; AVX2-NEXT: vmovdqa %xmm2, (%rdi)
817 ; AVX512-LABEL: usubo_v16i8:
819 ; AVX512-NEXT: vpsubb %xmm1, %xmm0, %xmm1
820 ; AVX512-NEXT: vpcmpnleub %xmm0, %xmm1, %k1
821 ; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
822 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
824 %t = call {<16 x i8>, <16 x i1>} @llvm.usub.with.overflow.v16i8(<16 x i8> %a0, <16 x i8> %a1)
825 %val = extractvalue {<16 x i8>, <16 x i1>} %t, 0
826 %obit = extractvalue {<16 x i8>, <16 x i1>} %t, 1
827 %res = sext <16 x i1> %obit to <16 x i32>
828 store <16 x i8> %val, <16 x i8>* %p2
832 define <8 x i32> @usubo_v8i16(<8 x i16> %a0, <8 x i16> %a1, <8 x i16>* %p2) nounwind {
833 ; SSE2-LABEL: usubo_v8i16:
835 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
836 ; SSE2-NEXT: movdqa %xmm0, %xmm3
837 ; SSE2-NEXT: pxor %xmm2, %xmm3
838 ; SSE2-NEXT: psubw %xmm1, %xmm0
839 ; SSE2-NEXT: pxor %xmm0, %xmm2
840 ; SSE2-NEXT: pcmpgtw %xmm3, %xmm2
841 ; SSE2-NEXT: movdqa %xmm2, %xmm1
842 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
843 ; SSE2-NEXT: pslld $31, %xmm1
844 ; SSE2-NEXT: psrad $31, %xmm1
845 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
846 ; SSE2-NEXT: pslld $31, %xmm2
847 ; SSE2-NEXT: psrad $31, %xmm2
848 ; SSE2-NEXT: movdqa %xmm0, (%rdi)
849 ; SSE2-NEXT: movdqa %xmm1, %xmm0
850 ; SSE2-NEXT: movdqa %xmm2, %xmm1
853 ; SSSE3-LABEL: usubo_v8i16:
855 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
856 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
857 ; SSSE3-NEXT: pxor %xmm2, %xmm3
858 ; SSSE3-NEXT: psubw %xmm1, %xmm0
859 ; SSSE3-NEXT: pxor %xmm0, %xmm2
860 ; SSSE3-NEXT: pcmpgtw %xmm3, %xmm2
861 ; SSSE3-NEXT: movdqa %xmm2, %xmm1
862 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
863 ; SSSE3-NEXT: pslld $31, %xmm1
864 ; SSSE3-NEXT: psrad $31, %xmm1
865 ; SSSE3-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
866 ; SSSE3-NEXT: pslld $31, %xmm2
867 ; SSSE3-NEXT: psrad $31, %xmm2
868 ; SSSE3-NEXT: movdqa %xmm0, (%rdi)
869 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
870 ; SSSE3-NEXT: movdqa %xmm2, %xmm1
873 ; SSE41-LABEL: usubo_v8i16:
875 ; SSE41-NEXT: movdqa %xmm0, %xmm2
876 ; SSE41-NEXT: psubw %xmm1, %xmm2
877 ; SSE41-NEXT: pminuw %xmm2, %xmm0
878 ; SSE41-NEXT: pcmpeqw %xmm2, %xmm0
879 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
880 ; SSE41-NEXT: pxor %xmm0, %xmm1
881 ; SSE41-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
882 ; SSE41-NEXT: pslld $31, %xmm0
883 ; SSE41-NEXT: psrad $31, %xmm0
884 ; SSE41-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
885 ; SSE41-NEXT: pslld $31, %xmm1
886 ; SSE41-NEXT: psrad $31, %xmm1
887 ; SSE41-NEXT: movdqa %xmm2, (%rdi)
890 ; AVX1-LABEL: usubo_v8i16:
892 ; AVX1-NEXT: vpsubw %xmm1, %xmm0, %xmm1
893 ; AVX1-NEXT: vpminuw %xmm0, %xmm1, %xmm0
894 ; AVX1-NEXT: vpcmpeqw %xmm0, %xmm1, %xmm0
895 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
896 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
897 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm2
898 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
899 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm0
900 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
901 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
904 ; AVX2-LABEL: usubo_v8i16:
906 ; AVX2-NEXT: vpsubw %xmm1, %xmm0, %xmm1
907 ; AVX2-NEXT: vpminuw %xmm0, %xmm1, %xmm0
908 ; AVX2-NEXT: vpcmpeqw %xmm0, %xmm1, %xmm0
909 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
910 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
911 ; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0
912 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
915 ; AVX512-LABEL: usubo_v8i16:
917 ; AVX512-NEXT: vpsubw %xmm1, %xmm0, %xmm1
918 ; AVX512-NEXT: vpcmpnleuw %xmm0, %xmm1, %k1
919 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
920 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
921 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
923 %t = call {<8 x i16>, <8 x i1>} @llvm.usub.with.overflow.v8i16(<8 x i16> %a0, <8 x i16> %a1)
924 %val = extractvalue {<8 x i16>, <8 x i1>} %t, 0
925 %obit = extractvalue {<8 x i16>, <8 x i1>} %t, 1
926 %res = sext <8 x i1> %obit to <8 x i32>
927 store <8 x i16> %val, <8 x i16>* %p2
931 define <2 x i32> @usubo_v2i64(<2 x i64> %a0, <2 x i64> %a1, <2 x i64>* %p2) nounwind {
932 ; SSE-LABEL: usubo_v2i64:
934 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
935 ; SSE-NEXT: movdqa %xmm0, %xmm3
936 ; SSE-NEXT: pxor %xmm2, %xmm3
937 ; SSE-NEXT: psubq %xmm1, %xmm0
938 ; SSE-NEXT: pxor %xmm0, %xmm2
939 ; SSE-NEXT: movdqa %xmm2, %xmm1
940 ; SSE-NEXT: pcmpgtd %xmm3, %xmm1
941 ; SSE-NEXT: pcmpeqd %xmm3, %xmm2
942 ; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
943 ; SSE-NEXT: pand %xmm1, %xmm2
944 ; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
945 ; SSE-NEXT: por %xmm2, %xmm1
946 ; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
947 ; SSE-NEXT: movdqa %xmm0, (%rdi)
948 ; SSE-NEXT: movdqa %xmm1, %xmm0
951 ; AVX1-LABEL: usubo_v2i64:
953 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
954 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm3
955 ; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm1
956 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm0
957 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm0, %xmm0
958 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
959 ; AVX1-NEXT: vmovdqa %xmm1, (%rdi)
962 ; AVX2-LABEL: usubo_v2i64:
964 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
965 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm3
966 ; AVX2-NEXT: vpsubq %xmm1, %xmm0, %xmm1
967 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm0
968 ; AVX2-NEXT: vpcmpgtq %xmm3, %xmm0, %xmm0
969 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
970 ; AVX2-NEXT: vmovdqa %xmm1, (%rdi)
973 ; AVX512-LABEL: usubo_v2i64:
975 ; AVX512-NEXT: vpsubq %xmm1, %xmm0, %xmm1
976 ; AVX512-NEXT: vpcmpnleuq %xmm0, %xmm1, %k1
977 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
978 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
979 ; AVX512-NEXT: vmovdqa %xmm1, (%rdi)
981 %t = call {<2 x i64>, <2 x i1>} @llvm.usub.with.overflow.v2i64(<2 x i64> %a0, <2 x i64> %a1)
982 %val = extractvalue {<2 x i64>, <2 x i1>} %t, 0
983 %obit = extractvalue {<2 x i64>, <2 x i1>} %t, 1
984 %res = sext <2 x i1> %obit to <2 x i32>
985 store <2 x i64> %val, <2 x i64>* %p2
989 define <4 x i32> @usubo_v4i24(<4 x i24> %a0, <4 x i24> %a1, <4 x i24>* %p2) nounwind {
990 ; SSE2-LABEL: usubo_v4i24:
992 ; SSE2-NEXT: movdqa %xmm0, %xmm2
993 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
994 ; SSE2-NEXT: pand %xmm3, %xmm1
995 ; SSE2-NEXT: pand %xmm3, %xmm2
996 ; SSE2-NEXT: psubd %xmm1, %xmm2
997 ; SSE2-NEXT: pand %xmm2, %xmm3
998 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3
999 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
1000 ; SSE2-NEXT: pxor %xmm3, %xmm0
1001 ; SSE2-NEXT: movd %xmm2, %eax
1002 ; SSE2-NEXT: movw %ax, (%rdi)
1003 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[3,1,2,3]
1004 ; SSE2-NEXT: movd %xmm1, %ecx
1005 ; SSE2-NEXT: movw %cx, 9(%rdi)
1006 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
1007 ; SSE2-NEXT: movd %xmm1, %edx
1008 ; SSE2-NEXT: movw %dx, 6(%rdi)
1009 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,2,3]
1010 ; SSE2-NEXT: movd %xmm1, %esi
1011 ; SSE2-NEXT: movw %si, 3(%rdi)
1012 ; SSE2-NEXT: shrl $16, %eax
1013 ; SSE2-NEXT: movb %al, 2(%rdi)
1014 ; SSE2-NEXT: shrl $16, %ecx
1015 ; SSE2-NEXT: movb %cl, 11(%rdi)
1016 ; SSE2-NEXT: shrl $16, %edx
1017 ; SSE2-NEXT: movb %dl, 8(%rdi)
1018 ; SSE2-NEXT: shrl $16, %esi
1019 ; SSE2-NEXT: movb %sil, 5(%rdi)
1022 ; SSSE3-LABEL: usubo_v4i24:
1024 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
1025 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
1026 ; SSSE3-NEXT: pand %xmm3, %xmm1
1027 ; SSSE3-NEXT: pand %xmm3, %xmm2
1028 ; SSSE3-NEXT: psubd %xmm1, %xmm2
1029 ; SSSE3-NEXT: pand %xmm2, %xmm3
1030 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm3
1031 ; SSSE3-NEXT: pcmpeqd %xmm0, %xmm0
1032 ; SSSE3-NEXT: pxor %xmm3, %xmm0
1033 ; SSSE3-NEXT: movd %xmm2, %eax
1034 ; SSSE3-NEXT: movw %ax, (%rdi)
1035 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[3,1,2,3]
1036 ; SSSE3-NEXT: movd %xmm1, %ecx
1037 ; SSSE3-NEXT: movw %cx, 9(%rdi)
1038 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
1039 ; SSSE3-NEXT: movd %xmm1, %edx
1040 ; SSSE3-NEXT: movw %dx, 6(%rdi)
1041 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,2,3]
1042 ; SSSE3-NEXT: movd %xmm1, %esi
1043 ; SSSE3-NEXT: movw %si, 3(%rdi)
1044 ; SSSE3-NEXT: shrl $16, %eax
1045 ; SSSE3-NEXT: movb %al, 2(%rdi)
1046 ; SSSE3-NEXT: shrl $16, %ecx
1047 ; SSSE3-NEXT: movb %cl, 11(%rdi)
1048 ; SSSE3-NEXT: shrl $16, %edx
1049 ; SSSE3-NEXT: movb %dl, 8(%rdi)
1050 ; SSSE3-NEXT: shrl $16, %esi
1051 ; SSSE3-NEXT: movb %sil, 5(%rdi)
1054 ; SSE41-LABEL: usubo_v4i24:
1056 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]
1057 ; SSE41-NEXT: pand %xmm2, %xmm1
1058 ; SSE41-NEXT: pand %xmm2, %xmm0
1059 ; SSE41-NEXT: psubd %xmm1, %xmm0
1060 ; SSE41-NEXT: pand %xmm0, %xmm2
1061 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
1062 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1063 ; SSE41-NEXT: pxor %xmm2, %xmm1
1064 ; SSE41-NEXT: pextrd $3, %xmm0, %eax
1065 ; SSE41-NEXT: movw %ax, 9(%rdi)
1066 ; SSE41-NEXT: pextrd $2, %xmm0, %ecx
1067 ; SSE41-NEXT: movw %cx, 6(%rdi)
1068 ; SSE41-NEXT: pextrd $1, %xmm0, %edx
1069 ; SSE41-NEXT: movw %dx, 3(%rdi)
1070 ; SSE41-NEXT: movd %xmm0, %esi
1071 ; SSE41-NEXT: movw %si, (%rdi)
1072 ; SSE41-NEXT: shrl $16, %eax
1073 ; SSE41-NEXT: movb %al, 11(%rdi)
1074 ; SSE41-NEXT: shrl $16, %ecx
1075 ; SSE41-NEXT: movb %cl, 8(%rdi)
1076 ; SSE41-NEXT: shrl $16, %edx
1077 ; SSE41-NEXT: movb %dl, 5(%rdi)
1078 ; SSE41-NEXT: shrl $16, %esi
1079 ; SSE41-NEXT: movb %sil, 2(%rdi)
1080 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1083 ; AVX1-LABEL: usubo_v4i24:
1085 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [2.35098856E-38,2.35098856E-38,2.35098856E-38,2.35098856E-38]
1086 ; AVX1-NEXT: vandps %xmm2, %xmm1, %xmm1
1087 ; AVX1-NEXT: vandps %xmm2, %xmm0, %xmm0
1088 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
1089 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm0
1090 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1091 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1092 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
1093 ; AVX1-NEXT: vpextrd $3, %xmm1, %eax
1094 ; AVX1-NEXT: movw %ax, 9(%rdi)
1095 ; AVX1-NEXT: vpextrd $2, %xmm1, %ecx
1096 ; AVX1-NEXT: movw %cx, 6(%rdi)
1097 ; AVX1-NEXT: vpextrd $1, %xmm1, %edx
1098 ; AVX1-NEXT: movw %dx, 3(%rdi)
1099 ; AVX1-NEXT: vmovd %xmm1, %esi
1100 ; AVX1-NEXT: movw %si, (%rdi)
1101 ; AVX1-NEXT: shrl $16, %eax
1102 ; AVX1-NEXT: movb %al, 11(%rdi)
1103 ; AVX1-NEXT: shrl $16, %ecx
1104 ; AVX1-NEXT: movb %cl, 8(%rdi)
1105 ; AVX1-NEXT: shrl $16, %edx
1106 ; AVX1-NEXT: movb %dl, 5(%rdi)
1107 ; AVX1-NEXT: shrl $16, %esi
1108 ; AVX1-NEXT: movb %sil, 2(%rdi)
1111 ; AVX2-LABEL: usubo_v4i24:
1113 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [16777215,16777215,16777215,16777215]
1114 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1
1115 ; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
1116 ; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm1
1117 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm0
1118 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1119 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1120 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
1121 ; AVX2-NEXT: vpextrd $3, %xmm1, %eax
1122 ; AVX2-NEXT: movw %ax, 9(%rdi)
1123 ; AVX2-NEXT: vpextrd $2, %xmm1, %ecx
1124 ; AVX2-NEXT: movw %cx, 6(%rdi)
1125 ; AVX2-NEXT: vpextrd $1, %xmm1, %edx
1126 ; AVX2-NEXT: movw %dx, 3(%rdi)
1127 ; AVX2-NEXT: vmovd %xmm1, %esi
1128 ; AVX2-NEXT: movw %si, (%rdi)
1129 ; AVX2-NEXT: shrl $16, %eax
1130 ; AVX2-NEXT: movb %al, 11(%rdi)
1131 ; AVX2-NEXT: shrl $16, %ecx
1132 ; AVX2-NEXT: movb %cl, 8(%rdi)
1133 ; AVX2-NEXT: shrl $16, %edx
1134 ; AVX2-NEXT: movb %dl, 5(%rdi)
1135 ; AVX2-NEXT: shrl $16, %esi
1136 ; AVX2-NEXT: movb %sil, 2(%rdi)
1139 ; AVX512-LABEL: usubo_v4i24:
1141 ; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm2 = [16777215,16777215,16777215,16777215]
1142 ; AVX512-NEXT: vpand %xmm2, %xmm1, %xmm1
1143 ; AVX512-NEXT: vpand %xmm2, %xmm0, %xmm0
1144 ; AVX512-NEXT: vpsubd %xmm1, %xmm0, %xmm1
1145 ; AVX512-NEXT: vpand %xmm2, %xmm1, %xmm0
1146 ; AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1147 ; AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
1148 ; AVX512-NEXT: vpextrd $3, %xmm1, %eax
1149 ; AVX512-NEXT: movw %ax, 9(%rdi)
1150 ; AVX512-NEXT: vpextrd $2, %xmm1, %ecx
1151 ; AVX512-NEXT: movw %cx, 6(%rdi)
1152 ; AVX512-NEXT: vpextrd $1, %xmm1, %edx
1153 ; AVX512-NEXT: movw %dx, 3(%rdi)
1154 ; AVX512-NEXT: vmovd %xmm1, %esi
1155 ; AVX512-NEXT: movw %si, (%rdi)
1156 ; AVX512-NEXT: shrl $16, %eax
1157 ; AVX512-NEXT: movb %al, 11(%rdi)
1158 ; AVX512-NEXT: shrl $16, %ecx
1159 ; AVX512-NEXT: movb %cl, 8(%rdi)
1160 ; AVX512-NEXT: shrl $16, %edx
1161 ; AVX512-NEXT: movb %dl, 5(%rdi)
1162 ; AVX512-NEXT: shrl $16, %esi
1163 ; AVX512-NEXT: movb %sil, 2(%rdi)
1165 %t = call {<4 x i24>, <4 x i1>} @llvm.usub.with.overflow.v4i24(<4 x i24> %a0, <4 x i24> %a1)
1166 %val = extractvalue {<4 x i24>, <4 x i1>} %t, 0
1167 %obit = extractvalue {<4 x i24>, <4 x i1>} %t, 1
1168 %res = sext <4 x i1> %obit to <4 x i32>
1169 store <4 x i24> %val, <4 x i24>* %p2
1173 define <4 x i32> @usubo_v4i1(<4 x i1> %a0, <4 x i1> %a1, <4 x i1>* %p2) nounwind {
1174 ; SSE-LABEL: usubo_v4i1:
1176 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [1,1,1,1]
1177 ; SSE-NEXT: pand %xmm2, %xmm1
1178 ; SSE-NEXT: pand %xmm2, %xmm0
1179 ; SSE-NEXT: psubd %xmm1, %xmm0
1180 ; SSE-NEXT: pand %xmm0, %xmm2
1181 ; SSE-NEXT: pcmpeqd %xmm0, %xmm2
1182 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1
1183 ; SSE-NEXT: pxor %xmm2, %xmm1
1184 ; SSE-NEXT: pslld $31, %xmm0
1185 ; SSE-NEXT: movmskps %xmm0, %eax
1186 ; SSE-NEXT: movb %al, (%rdi)
1187 ; SSE-NEXT: movdqa %xmm1, %xmm0
1190 ; AVX1-LABEL: usubo_v4i1:
1192 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [1,1,1,1]
1193 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
1194 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
1195 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
1196 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm0
1197 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1198 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1199 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
1200 ; AVX1-NEXT: vpslld $31, %xmm1, %xmm1
1201 ; AVX1-NEXT: vmovmskps %xmm1, %eax
1202 ; AVX1-NEXT: movb %al, (%rdi)
1205 ; AVX2-LABEL: usubo_v4i1:
1207 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [1,1,1,1]
1208 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1
1209 ; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
1210 ; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm1
1211 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm0
1212 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1213 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1214 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
1215 ; AVX2-NEXT: vpslld $31, %xmm1, %xmm1
1216 ; AVX2-NEXT: vmovmskps %xmm1, %eax
1217 ; AVX2-NEXT: movb %al, (%rdi)
1220 ; AVX512-LABEL: usubo_v4i1:
1222 ; AVX512-NEXT: vpslld $31, %xmm0, %xmm0
1223 ; AVX512-NEXT: vptestmd %xmm0, %xmm0, %k0
1224 ; AVX512-NEXT: vpslld $31, %xmm1, %xmm1
1225 ; AVX512-NEXT: vptestmd %xmm1, %xmm1, %k1
1226 ; AVX512-NEXT: kxorw %k1, %k0, %k1
1227 ; AVX512-NEXT: vptestnmd %xmm0, %xmm0, %k2 {%k1}
1228 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1229 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k2} {z}
1230 ; AVX512-NEXT: kmovd %k1, %eax
1231 ; AVX512-NEXT: movb %al, (%rdi)
1233 %t = call {<4 x i1>, <4 x i1>} @llvm.usub.with.overflow.v4i1(<4 x i1> %a0, <4 x i1> %a1)
1234 %val = extractvalue {<4 x i1>, <4 x i1>} %t, 0
1235 %obit = extractvalue {<4 x i1>, <4 x i1>} %t, 1
1236 %res = sext <4 x i1> %obit to <4 x i32>
1237 store <4 x i1> %val, <4 x i1>* %p2
1241 define <2 x i32> @usubo_v2i128(<2 x i128> %a0, <2 x i128> %a1, <2 x i128>* %p2) nounwind {
1242 ; SSE2-LABEL: usubo_v2i128:
1244 ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %r10
1245 ; SSE2-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1246 ; SSE2-NEXT: sbbq {{[0-9]+}}(%rsp), %rcx
1247 ; SSE2-NEXT: sbbl %eax, %eax
1248 ; SSE2-NEXT: subq %r8, %rdi
1249 ; SSE2-NEXT: sbbq %r9, %rsi
1250 ; SSE2-NEXT: movd %eax, %xmm1
1251 ; SSE2-NEXT: sbbl %eax, %eax
1252 ; SSE2-NEXT: movd %eax, %xmm0
1253 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1254 ; SSE2-NEXT: movq %rdx, 16(%r10)
1255 ; SSE2-NEXT: movq %rdi, (%r10)
1256 ; SSE2-NEXT: movq %rcx, 24(%r10)
1257 ; SSE2-NEXT: movq %rsi, 8(%r10)
1260 ; SSSE3-LABEL: usubo_v2i128:
1262 ; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %r10
1263 ; SSSE3-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1264 ; SSSE3-NEXT: sbbq {{[0-9]+}}(%rsp), %rcx
1265 ; SSSE3-NEXT: sbbl %eax, %eax
1266 ; SSSE3-NEXT: subq %r8, %rdi
1267 ; SSSE3-NEXT: sbbq %r9, %rsi
1268 ; SSSE3-NEXT: movd %eax, %xmm1
1269 ; SSSE3-NEXT: sbbl %eax, %eax
1270 ; SSSE3-NEXT: movd %eax, %xmm0
1271 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1272 ; SSSE3-NEXT: movq %rdx, 16(%r10)
1273 ; SSSE3-NEXT: movq %rdi, (%r10)
1274 ; SSSE3-NEXT: movq %rcx, 24(%r10)
1275 ; SSSE3-NEXT: movq %rsi, 8(%r10)
1278 ; SSE41-LABEL: usubo_v2i128:
1280 ; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %r10
1281 ; SSE41-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1282 ; SSE41-NEXT: sbbq {{[0-9]+}}(%rsp), %rcx
1283 ; SSE41-NEXT: sbbl %r11d, %r11d
1284 ; SSE41-NEXT: subq %r8, %rdi
1285 ; SSE41-NEXT: sbbq %r9, %rsi
1286 ; SSE41-NEXT: sbbl %eax, %eax
1287 ; SSE41-NEXT: movd %eax, %xmm0
1288 ; SSE41-NEXT: pinsrd $1, %r11d, %xmm0
1289 ; SSE41-NEXT: movq %rdx, 16(%r10)
1290 ; SSE41-NEXT: movq %rdi, (%r10)
1291 ; SSE41-NEXT: movq %rcx, 24(%r10)
1292 ; SSE41-NEXT: movq %rsi, 8(%r10)
1295 ; AVX1-LABEL: usubo_v2i128:
1297 ; AVX1-NEXT: movq {{[0-9]+}}(%rsp), %r10
1298 ; AVX1-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1299 ; AVX1-NEXT: sbbq {{[0-9]+}}(%rsp), %rcx
1300 ; AVX1-NEXT: sbbl %r11d, %r11d
1301 ; AVX1-NEXT: subq %r8, %rdi
1302 ; AVX1-NEXT: sbbq %r9, %rsi
1303 ; AVX1-NEXT: sbbl %eax, %eax
1304 ; AVX1-NEXT: vmovd %eax, %xmm0
1305 ; AVX1-NEXT: vpinsrd $1, %r11d, %xmm0, %xmm0
1306 ; AVX1-NEXT: movq %rdx, 16(%r10)
1307 ; AVX1-NEXT: movq %rdi, (%r10)
1308 ; AVX1-NEXT: movq %rcx, 24(%r10)
1309 ; AVX1-NEXT: movq %rsi, 8(%r10)
1312 ; AVX2-LABEL: usubo_v2i128:
1314 ; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %r10
1315 ; AVX2-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1316 ; AVX2-NEXT: sbbq {{[0-9]+}}(%rsp), %rcx
1317 ; AVX2-NEXT: sbbl %r11d, %r11d
1318 ; AVX2-NEXT: subq %r8, %rdi
1319 ; AVX2-NEXT: sbbq %r9, %rsi
1320 ; AVX2-NEXT: sbbl %eax, %eax
1321 ; AVX2-NEXT: vmovd %eax, %xmm0
1322 ; AVX2-NEXT: vpinsrd $1, %r11d, %xmm0, %xmm0
1323 ; AVX2-NEXT: movq %rdx, 16(%r10)
1324 ; AVX2-NEXT: movq %rdi, (%r10)
1325 ; AVX2-NEXT: movq %rcx, 24(%r10)
1326 ; AVX2-NEXT: movq %rsi, 8(%r10)
1329 ; AVX512-LABEL: usubo_v2i128:
1331 ; AVX512-NEXT: movq {{[0-9]+}}(%rsp), %r10
1332 ; AVX512-NEXT: subq %r8, %rdi
1333 ; AVX512-NEXT: sbbq %r9, %rsi
1334 ; AVX512-NEXT: setb %r8b
1335 ; AVX512-NEXT: subq {{[0-9]+}}(%rsp), %rdx
1336 ; AVX512-NEXT: sbbq {{[0-9]+}}(%rsp), %rcx
1337 ; AVX512-NEXT: setb %al
1338 ; AVX512-NEXT: kmovd %eax, %k0
1339 ; AVX512-NEXT: kshiftlw $1, %k0, %k0
1340 ; AVX512-NEXT: andl $1, %r8d
1341 ; AVX512-NEXT: kmovw %r8d, %k1
1342 ; AVX512-NEXT: korw %k0, %k1, %k1
1343 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1344 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
1345 ; AVX512-NEXT: movq %rdx, 16(%r10)
1346 ; AVX512-NEXT: movq %rdi, (%r10)
1347 ; AVX512-NEXT: movq %rcx, 24(%r10)
1348 ; AVX512-NEXT: movq %rsi, 8(%r10)
1350 %t = call {<2 x i128>, <2 x i1>} @llvm.usub.with.overflow.v2i128(<2 x i128> %a0, <2 x i128> %a1)
1351 %val = extractvalue {<2 x i128>, <2 x i1>} %t, 0
1352 %obit = extractvalue {<2 x i128>, <2 x i1>} %t, 1
1353 %res = sext <2 x i1> %obit to <2 x i32>
1354 store <2 x i128> %val, <2 x i128>* %p2