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