[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / vec_usubo.ll
blob136449776c7355106de398d67235c48393450dec
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:
27 ; SSE:       # %bb.0:
28 ; SSE-NEXT:    subl %esi, %edi
29 ; SSE-NEXT:    sbbl %eax, %eax
30 ; SSE-NEXT:    movl %edi, (%rdx)
31 ; SSE-NEXT:    retq
33 ; AVX-LABEL: usubo_v1i32:
34 ; AVX:       # %bb.0:
35 ; AVX-NEXT:    subl %esi, %edi
36 ; AVX-NEXT:    sbbl %eax, %eax
37 ; AVX-NEXT:    movl %edi, (%rdx)
38 ; AVX-NEXT:    retq
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
44   ret <1 x i32> %res
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:
49 ; SSE2:       # %bb.0:
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
58 ; SSE2-NEXT:    retq
60 ; SSSE3-LABEL: usubo_v2i32:
61 ; SSSE3:       # %bb.0:
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
70 ; SSSE3-NEXT:    retq
72 ; SSE41-LABEL: usubo_v2i32:
73 ; SSE41:       # %bb.0:
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)
81 ; SSE41-NEXT:    retq
83 ; AVX1-LABEL: usubo_v2i32:
84 ; AVX1:       # %bb.0:
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)
91 ; AVX1-NEXT:    retq
93 ; AVX2-LABEL: usubo_v2i32:
94 ; AVX2:       # %bb.0:
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)
101 ; AVX2-NEXT:    retq
103 ; AVX512-LABEL: usubo_v2i32:
104 ; AVX512:       # %bb.0:
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)
110 ; AVX512-NEXT:    retq
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
116   ret <2 x i32> %res
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:
121 ; SSE2:       # %bb.0:
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
132 ; SSE2-NEXT:    retq
134 ; SSSE3-LABEL: usubo_v3i32:
135 ; SSSE3:       # %bb.0:
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
146 ; SSSE3-NEXT:    retq
148 ; SSE41-LABEL: usubo_v3i32:
149 ; SSE41:       # %bb.0:
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)
158 ; SSE41-NEXT:    retq
160 ; AVX1-LABEL: usubo_v3i32:
161 ; AVX1:       # %bb.0:
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)
169 ; AVX1-NEXT:    retq
171 ; AVX2-LABEL: usubo_v3i32:
172 ; AVX2:       # %bb.0:
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)
180 ; AVX2-NEXT:    retq
182 ; AVX512-LABEL: usubo_v3i32:
183 ; AVX512:       # %bb.0:
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)
190 ; AVX512-NEXT:    retq
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
196   ret <3 x i32> %res
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:
201 ; SSE2:       # %bb.0:
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
210 ; SSE2-NEXT:    retq
212 ; SSSE3-LABEL: usubo_v4i32:
213 ; SSSE3:       # %bb.0:
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
222 ; SSSE3-NEXT:    retq
224 ; SSE41-LABEL: usubo_v4i32:
225 ; SSE41:       # %bb.0:
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)
233 ; SSE41-NEXT:    retq
235 ; AVX1-LABEL: usubo_v4i32:
236 ; AVX1:       # %bb.0:
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)
243 ; AVX1-NEXT:    retq
245 ; AVX2-LABEL: usubo_v4i32:
246 ; AVX2:       # %bb.0:
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)
253 ; AVX2-NEXT:    retq
255 ; AVX512-LABEL: usubo_v4i32:
256 ; AVX512:       # %bb.0:
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)
262 ; AVX512-NEXT:    retq
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
268   ret <4 x i32> %res
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:
273 ; SSE2:       # %bb.0:
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)
311 ; SSE2-NEXT:    retq
313 ; SSSE3-LABEL: usubo_v6i32:
314 ; SSSE3:       # %bb.0:
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)
352 ; SSSE3-NEXT:    retq
354 ; SSE41-LABEL: usubo_v6i32:
355 ; SSE41:       # %bb.0:
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)
385 ; SSE41-NEXT:    retq
387 ; AVX1-LABEL: usubo_v6i32:
388 ; AVX1:       # %bb.0:
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)
403 ; AVX1-NEXT:    retq
405 ; AVX2-LABEL: usubo_v6i32:
406 ; AVX2:       # %bb.0:
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)
415 ; AVX2-NEXT:    retq
417 ; AVX512-LABEL: usubo_v6i32:
418 ; AVX512:       # %bb.0:
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)
426 ; AVX512-NEXT:    retq
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
432   ret <6 x i32> %res
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:
437 ; SSE2:       # %bb.0:
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
452 ; SSE2-NEXT:    retq
454 ; SSSE3-LABEL: usubo_v8i32:
455 ; SSSE3:       # %bb.0:
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
470 ; SSSE3-NEXT:    retq
472 ; SSE41-LABEL: usubo_v8i32:
473 ; SSE41:       # %bb.0:
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)
487 ; SSE41-NEXT:    retq
489 ; AVX1-LABEL: usubo_v8i32:
490 ; AVX1:       # %bb.0:
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)
505 ; AVX1-NEXT:    retq
507 ; AVX2-LABEL: usubo_v8i32:
508 ; AVX2:       # %bb.0:
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)
515 ; AVX2-NEXT:    retq
517 ; AVX512-LABEL: usubo_v8i32:
518 ; AVX512:       # %bb.0:
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)
524 ; AVX512-NEXT:    retq
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
530   ret <8 x i32> %res
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:
535 ; SSE2:       # %bb.0:
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
562 ; SSE2-NEXT:    retq
564 ; SSSE3-LABEL: usubo_v16i32:
565 ; SSSE3:       # %bb.0:
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
592 ; SSSE3-NEXT:    retq
594 ; SSE41-LABEL: usubo_v16i32:
595 ; SSE41:       # %bb.0:
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)
621 ; SSE41-NEXT:    retq
623 ; AVX1-LABEL: usubo_v16i32:
624 ; AVX1:       # %bb.0:
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)
662 ; AVX1-NEXT:    retq
664 ; AVX2-LABEL: usubo_v16i32:
665 ; AVX2:       # %bb.0:
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)
685 ; AVX2-NEXT:    retq
687 ; AVX512-LABEL: usubo_v16i32:
688 ; AVX512:       # %bb.0:
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)
693 ; AVX512-NEXT:    retq
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
699   ret <16 x i32> %res
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:
704 ; SSE2:       # %bb.0:
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)
729 ; SSE2-NEXT:    retq
731 ; SSSE3-LABEL: usubo_v16i8:
732 ; SSSE3:       # %bb.0:
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)
757 ; SSSE3-NEXT:    retq
759 ; SSE41-LABEL: usubo_v16i8:
760 ; SSE41:       # %bb.0:
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)
783 ; SSE41-NEXT:    retq
785 ; AVX1-LABEL: usubo_v16i8:
786 ; AVX1:       # %bb.0:
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)
802 ; AVX1-NEXT:    retq
804 ; AVX2-LABEL: usubo_v16i8:
805 ; AVX2:       # %bb.0:
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)
815 ; AVX2-NEXT:    retq
817 ; AVX512-LABEL: usubo_v16i8:
818 ; AVX512:       # %bb.0:
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)
823 ; AVX512-NEXT:    retq
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
829   ret <16 x i32> %res
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:
834 ; SSE2:       # %bb.0:
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
851 ; SSE2-NEXT:    retq
853 ; SSSE3-LABEL: usubo_v8i16:
854 ; SSSE3:       # %bb.0:
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
871 ; SSSE3-NEXT:    retq
873 ; SSE41-LABEL: usubo_v8i16:
874 ; SSE41:       # %bb.0:
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)
888 ; SSE41-NEXT:    retq
890 ; AVX1-LABEL: usubo_v8i16:
891 ; AVX1:       # %bb.0:
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)
902 ; AVX1-NEXT:    retq
904 ; AVX2-LABEL: usubo_v8i16:
905 ; AVX2:       # %bb.0:
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)
913 ; AVX2-NEXT:    retq
915 ; AVX512-LABEL: usubo_v8i16:
916 ; AVX512:       # %bb.0:
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)
922 ; AVX512-NEXT:    retq
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
928   ret <8 x i32> %res
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:
933 ; SSE:       # %bb.0:
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
949 ; SSE-NEXT:    retq
951 ; AVX1-LABEL: usubo_v2i64:
952 ; AVX1:       # %bb.0:
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)
960 ; AVX1-NEXT:    retq
962 ; AVX2-LABEL: usubo_v2i64:
963 ; AVX2:       # %bb.0:
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)
971 ; AVX2-NEXT:    retq
973 ; AVX512-LABEL: usubo_v2i64:
974 ; AVX512:       # %bb.0:
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)
980 ; AVX512-NEXT:    retq
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
986   ret <2 x i32> %res
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:
991 ; SSE2:       # %bb.0:
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)
1020 ; SSE2-NEXT:    retq
1022 ; SSSE3-LABEL: usubo_v4i24:
1023 ; SSSE3:       # %bb.0:
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)
1052 ; SSSE3-NEXT:    retq
1054 ; SSE41-LABEL: usubo_v4i24:
1055 ; SSE41:       # %bb.0:
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
1081 ; SSE41-NEXT:    retq
1083 ; AVX1-LABEL: usubo_v4i24:
1084 ; AVX1:       # %bb.0:
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)
1109 ; AVX1-NEXT:    retq
1111 ; AVX2-LABEL: usubo_v4i24:
1112 ; AVX2:       # %bb.0:
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)
1137 ; AVX2-NEXT:    retq
1139 ; AVX512-LABEL: usubo_v4i24:
1140 ; AVX512:       # %bb.0:
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)
1164 ; AVX512-NEXT:    retq
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
1170   ret <4 x i32> %res
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:
1175 ; SSE:       # %bb.0:
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
1188 ; SSE-NEXT:    retq
1190 ; AVX1-LABEL: usubo_v4i1:
1191 ; AVX1:       # %bb.0:
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)
1203 ; AVX1-NEXT:    retq
1205 ; AVX2-LABEL: usubo_v4i1:
1206 ; AVX2:       # %bb.0:
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)
1218 ; AVX2-NEXT:    retq
1220 ; AVX512-LABEL: usubo_v4i1:
1221 ; AVX512:       # %bb.0:
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)
1232 ; AVX512-NEXT:    retq
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
1238   ret <4 x i32> %res
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:
1243 ; SSE2:       # %bb.0:
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)
1258 ; SSE2-NEXT:    retq
1260 ; SSSE3-LABEL: usubo_v2i128:
1261 ; SSSE3:       # %bb.0:
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)
1276 ; SSSE3-NEXT:    retq
1278 ; SSE41-LABEL: usubo_v2i128:
1279 ; SSE41:       # %bb.0:
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)
1293 ; SSE41-NEXT:    retq
1295 ; AVX1-LABEL: usubo_v2i128:
1296 ; AVX1:       # %bb.0:
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)
1310 ; AVX1-NEXT:    retq
1312 ; AVX2-LABEL: usubo_v2i128:
1313 ; AVX2:       # %bb.0:
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)
1327 ; AVX2-NEXT:    retq
1329 ; AVX512-LABEL: usubo_v2i128:
1330 ; AVX512:       # %bb.0:
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)
1349 ; AVX512-NEXT:    retq
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
1355   ret <2 x i32> %res