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