Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / X86 / vec_ssubo.ll
blob0e1354b939ea9e0fa0fc137cc1e25d16537bf1a8
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.ssub.with.overflow.v1i32(<1 x i32>, <1 x i32>)
10 declare {<2 x i32>, <2 x i1>} @llvm.ssub.with.overflow.v2i32(<2 x i32>, <2 x i32>)
11 declare {<3 x i32>, <3 x i1>} @llvm.ssub.with.overflow.v3i32(<3 x i32>, <3 x i32>)
12 declare {<4 x i32>, <4 x i1>} @llvm.ssub.with.overflow.v4i32(<4 x i32>, <4 x i32>)
13 declare {<6 x i32>, <6 x i1>} @llvm.ssub.with.overflow.v6i32(<6 x i32>, <6 x i32>)
14 declare {<8 x i32>, <8 x i1>} @llvm.ssub.with.overflow.v8i32(<8 x i32>, <8 x i32>)
15 declare {<16 x i32>, <16 x i1>} @llvm.ssub.with.overflow.v16i32(<16 x i32>, <16 x i32>)
17 declare {<16 x i8>, <16 x i1>} @llvm.ssub.with.overflow.v16i8(<16 x i8>, <16 x i8>)
18 declare {<8 x i16>, <8 x i1>} @llvm.ssub.with.overflow.v8i16(<8 x i16>, <8 x i16>)
19 declare {<2 x i64>, <2 x i1>} @llvm.ssub.with.overflow.v2i64(<2 x i64>, <2 x i64>)
21 declare {<4 x i24>, <4 x i1>} @llvm.ssub.with.overflow.v4i24(<4 x i24>, <4 x i24>)
22 declare {<4 x i1>, <4 x i1>} @llvm.ssub.with.overflow.v4i1(<4 x i1>, <4 x i1>)
23 declare {<2 x i128>, <2 x i1>} @llvm.ssub.with.overflow.v2i128(<2 x i128>, <2 x i128>)
25 define <1 x i32> @ssubo_v1i32(<1 x i32> %a0, <1 x i32> %a1, <1 x i32>* %p2) nounwind {
26 ; SSE-LABEL: ssubo_v1i32:
27 ; SSE:       # %bb.0:
28 ; SSE-NEXT:    xorl %eax, %eax
29 ; SSE-NEXT:    subl %esi, %edi
30 ; SSE-NEXT:    seto %al
31 ; SSE-NEXT:    negl %eax
32 ; SSE-NEXT:    movl %edi, (%rdx)
33 ; SSE-NEXT:    retq
35 ; AVX-LABEL: ssubo_v1i32:
36 ; AVX:       # %bb.0:
37 ; AVX-NEXT:    xorl %eax, %eax
38 ; AVX-NEXT:    subl %esi, %edi
39 ; AVX-NEXT:    seto %al
40 ; AVX-NEXT:    negl %eax
41 ; AVX-NEXT:    movl %edi, (%rdx)
42 ; AVX-NEXT:    retq
43   %t = call {<1 x i32>, <1 x i1>} @llvm.ssub.with.overflow.v1i32(<1 x i32> %a0, <1 x i32> %a1)
44   %val = extractvalue {<1 x i32>, <1 x i1>} %t, 0
45   %obit = extractvalue {<1 x i32>, <1 x i1>} %t, 1
46   %res = sext <1 x i1> %obit to <1 x i32>
47   store <1 x i32> %val, <1 x i32>* %p2
48   ret <1 x i32> %res
51 define <2 x i32> @ssubo_v2i32(<2 x i32> %a0, <2 x i32> %a1, <2 x i32>* %p2) nounwind {
52 ; SSE2-LABEL: ssubo_v2i32:
53 ; SSE2:       # %bb.0:
54 ; SSE2-NEXT:    psllq $32, %xmm1
55 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]
56 ; SSE2-NEXT:    psrad $31, %xmm1
57 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
58 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
59 ; SSE2-NEXT:    psllq $32, %xmm0
60 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]
61 ; SSE2-NEXT:    psrad $31, %xmm0
62 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
63 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
64 ; SSE2-NEXT:    psubq %xmm2, %xmm1
65 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
66 ; SSE2-NEXT:    psllq $32, %xmm0
67 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,3,2,3]
68 ; SSE2-NEXT:    psrad $31, %xmm0
69 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
70 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
71 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
72 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,0,3,2]
73 ; SSE2-NEXT:    pand %xmm2, %xmm3
74 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0
75 ; SSE2-NEXT:    pxor %xmm3, %xmm0
76 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
77 ; SSE2-NEXT:    movq %xmm1, (%rdi)
78 ; SSE2-NEXT:    retq
80 ; SSSE3-LABEL: ssubo_v2i32:
81 ; SSSE3:       # %bb.0:
82 ; SSSE3-NEXT:    psllq $32, %xmm1
83 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]
84 ; SSSE3-NEXT:    psrad $31, %xmm1
85 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
86 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
87 ; SSSE3-NEXT:    psllq $32, %xmm0
88 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]
89 ; SSSE3-NEXT:    psrad $31, %xmm0
90 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
91 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
92 ; SSSE3-NEXT:    psubq %xmm2, %xmm1
93 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
94 ; SSSE3-NEXT:    psllq $32, %xmm0
95 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,3,2,3]
96 ; SSSE3-NEXT:    psrad $31, %xmm0
97 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
98 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
99 ; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm2
100 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,0,3,2]
101 ; SSSE3-NEXT:    pand %xmm2, %xmm3
102 ; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm0
103 ; SSSE3-NEXT:    pxor %xmm3, %xmm0
104 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
105 ; SSSE3-NEXT:    movq %xmm1, (%rdi)
106 ; SSSE3-NEXT:    retq
108 ; SSE41-LABEL: ssubo_v2i32:
109 ; SSE41:       # %bb.0:
110 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
111 ; SSE41-NEXT:    psllq $32, %xmm2
112 ; SSE41-NEXT:    psrad $31, %xmm2
113 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
114 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
115 ; SSE41-NEXT:    psllq $32, %xmm1
116 ; SSE41-NEXT:    psrad $31, %xmm1
117 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
118 ; SSE41-NEXT:    psubq %xmm2, %xmm1
119 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
120 ; SSE41-NEXT:    psllq $32, %xmm0
121 ; SSE41-NEXT:    psrad $31, %xmm0
122 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5],xmm0[6,7]
123 ; SSE41-NEXT:    pcmpeqq %xmm1, %xmm0
124 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
125 ; SSE41-NEXT:    pxor %xmm2, %xmm0
126 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
127 ; SSE41-NEXT:    movq %xmm1, (%rdi)
128 ; SSE41-NEXT:    retq
130 ; AVX1-LABEL: ssubo_v2i32:
131 ; AVX1:       # %bb.0:
132 ; AVX1-NEXT:    vpsllq $32, %xmm1, %xmm2
133 ; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm2
134 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
135 ; AVX1-NEXT:    vpsllq $32, %xmm0, %xmm2
136 ; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm2
137 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
138 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm1
139 ; AVX1-NEXT:    vpsllq $32, %xmm1, %xmm0
140 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm0
141 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5],xmm0[6,7]
142 ; AVX1-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
143 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
144 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
145 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
146 ; AVX1-NEXT:    vmovq %xmm1, (%rdi)
147 ; AVX1-NEXT:    retq
149 ; AVX2-LABEL: ssubo_v2i32:
150 ; AVX2:       # %bb.0:
151 ; AVX2-NEXT:    vpsllq $32, %xmm1, %xmm2
152 ; AVX2-NEXT:    vpsrad $31, %xmm2, %xmm2
153 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]
154 ; AVX2-NEXT:    vpsllq $32, %xmm0, %xmm2
155 ; AVX2-NEXT:    vpsrad $31, %xmm2, %xmm2
156 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
157 ; AVX2-NEXT:    vpsubq %xmm1, %xmm0, %xmm1
158 ; AVX2-NEXT:    vpsllq $32, %xmm1, %xmm0
159 ; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm0
160 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2],xmm0[3]
161 ; AVX2-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
162 ; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
163 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
164 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
165 ; AVX2-NEXT:    vmovq %xmm1, (%rdi)
166 ; AVX2-NEXT:    retq
168 ; AVX512-LABEL: ssubo_v2i32:
169 ; AVX512:       # %bb.0:
170 ; AVX512-NEXT:    vpsllq $32, %xmm1, %xmm1
171 ; AVX512-NEXT:    vpsraq $32, %xmm1, %xmm1
172 ; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
173 ; AVX512-NEXT:    vpsraq $32, %xmm0, %xmm0
174 ; AVX512-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
175 ; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm1
176 ; AVX512-NEXT:    vpsraq $32, %xmm1, %xmm1
177 ; AVX512-NEXT:    vpmovqd %xmm0, (%rdi)
178 ; AVX512-NEXT:    vpcmpeqq %xmm0, %xmm1, %xmm0
179 ; AVX512-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
180 ; AVX512-NEXT:    retq
181   %t = call {<2 x i32>, <2 x i1>} @llvm.ssub.with.overflow.v2i32(<2 x i32> %a0, <2 x i32> %a1)
182   %val = extractvalue {<2 x i32>, <2 x i1>} %t, 0
183   %obit = extractvalue {<2 x i32>, <2 x i1>} %t, 1
184   %res = sext <2 x i1> %obit to <2 x i32>
185   store <2 x i32> %val, <2 x i32>* %p2
186   ret <2 x i32> %res
189 define <3 x i32> @ssubo_v3i32(<3 x i32> %a0, <3 x i32> %a1, <3 x i32>* %p2) nounwind {
190 ; SSE2-LABEL: ssubo_v3i32:
191 ; SSE2:       # %bb.0:
192 ; SSE2-NEXT:    pxor %xmm3, %xmm3
193 ; SSE2-NEXT:    pxor %xmm2, %xmm2
194 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
195 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
196 ; SSE2-NEXT:    pxor %xmm4, %xmm2
197 ; SSE2-NEXT:    pxor %xmm5, %xmm5
198 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
199 ; SSE2-NEXT:    pxor %xmm4, %xmm5
200 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm2
201 ; SSE2-NEXT:    psubd %xmm1, %xmm0
202 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
203 ; SSE2-NEXT:    pxor %xmm4, %xmm3
204 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm3
205 ; SSE2-NEXT:    pxor %xmm4, %xmm3
206 ; SSE2-NEXT:    pandn %xmm3, %xmm2
207 ; SSE2-NEXT:    movq %xmm0, (%rdi)
208 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
209 ; SSE2-NEXT:    movd %xmm0, 8(%rdi)
210 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
211 ; SSE2-NEXT:    retq
213 ; SSSE3-LABEL: ssubo_v3i32:
214 ; SSSE3:       # %bb.0:
215 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
216 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
217 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
218 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm4
219 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
220 ; SSSE3-NEXT:    pxor %xmm5, %xmm5
221 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm5
222 ; SSSE3-NEXT:    pxor %xmm4, %xmm5
223 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm2
224 ; SSSE3-NEXT:    psubd %xmm1, %xmm0
225 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm3
226 ; SSSE3-NEXT:    pxor %xmm4, %xmm3
227 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm3
228 ; SSSE3-NEXT:    pxor %xmm4, %xmm3
229 ; SSSE3-NEXT:    pandn %xmm3, %xmm2
230 ; SSSE3-NEXT:    movq %xmm0, (%rdi)
231 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
232 ; SSSE3-NEXT:    movd %xmm0, 8(%rdi)
233 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
234 ; SSSE3-NEXT:    retq
236 ; SSE41-LABEL: ssubo_v3i32:
237 ; SSE41:       # %bb.0:
238 ; SSE41-NEXT:    pxor %xmm3, %xmm3
239 ; SSE41-NEXT:    pxor %xmm2, %xmm2
240 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm2
241 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm4
242 ; SSE41-NEXT:    pxor %xmm4, %xmm2
243 ; SSE41-NEXT:    pxor %xmm5, %xmm5
244 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
245 ; SSE41-NEXT:    pxor %xmm4, %xmm5
246 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm2
247 ; SSE41-NEXT:    psubd %xmm1, %xmm0
248 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
249 ; SSE41-NEXT:    pxor %xmm4, %xmm3
250 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm3
251 ; SSE41-NEXT:    pxor %xmm4, %xmm3
252 ; SSE41-NEXT:    pandn %xmm3, %xmm2
253 ; SSE41-NEXT:    pextrd $2, %xmm0, 8(%rdi)
254 ; SSE41-NEXT:    movq %xmm0, (%rdi)
255 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
256 ; SSE41-NEXT:    retq
258 ; AVX1-LABEL: ssubo_v3i32:
259 ; AVX1:       # %bb.0:
260 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
261 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm2, %xmm3
262 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
263 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
264 ; AVX1-NEXT:    vpcmpgtd %xmm0, %xmm2, %xmm5
265 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm5
266 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm5, %xmm3
267 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
268 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm2, %xmm0
269 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
270 ; AVX1-NEXT:    vpcmpeqd %xmm0, %xmm5, %xmm0
271 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
272 ; AVX1-NEXT:    vpandn %xmm0, %xmm3, %xmm0
273 ; AVX1-NEXT:    vpextrd $2, %xmm1, 8(%rdi)
274 ; AVX1-NEXT:    vmovq %xmm1, (%rdi)
275 ; AVX1-NEXT:    retq
277 ; AVX2-LABEL: ssubo_v3i32:
278 ; AVX2:       # %bb.0:
279 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
280 ; AVX2-NEXT:    vpcmpgtd %xmm1, %xmm2, %xmm3
281 ; AVX2-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
282 ; AVX2-NEXT:    vpxor %xmm4, %xmm3, %xmm3
283 ; AVX2-NEXT:    vpcmpgtd %xmm0, %xmm2, %xmm5
284 ; AVX2-NEXT:    vpxor %xmm4, %xmm5, %xmm5
285 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm5, %xmm3
286 ; AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
287 ; AVX2-NEXT:    vpcmpgtd %xmm1, %xmm2, %xmm0
288 ; AVX2-NEXT:    vpxor %xmm4, %xmm0, %xmm0
289 ; AVX2-NEXT:    vpcmpeqd %xmm0, %xmm5, %xmm0
290 ; AVX2-NEXT:    vpxor %xmm4, %xmm0, %xmm0
291 ; AVX2-NEXT:    vpandn %xmm0, %xmm3, %xmm0
292 ; AVX2-NEXT:    vpextrd $2, %xmm1, 8(%rdi)
293 ; AVX2-NEXT:    vmovq %xmm1, (%rdi)
294 ; AVX2-NEXT:    retq
296 ; AVX512-LABEL: ssubo_v3i32:
297 ; AVX512:       # %bb.0:
298 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
299 ; AVX512-NEXT:    vpcmpnltd %xmm2, %xmm1, %k0
300 ; AVX512-NEXT:    vpcmpnltd %xmm2, %xmm0, %k1
301 ; AVX512-NEXT:    kxorw %k0, %k1, %k0
302 ; AVX512-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
303 ; AVX512-NEXT:    vpcmpnltd %xmm2, %xmm1, %k2
304 ; AVX512-NEXT:    kxorw %k2, %k1, %k1
305 ; AVX512-NEXT:    kandw %k1, %k0, %k1
306 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
307 ; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
308 ; AVX512-NEXT:    vpextrd $2, %xmm1, 8(%rdi)
309 ; AVX512-NEXT:    vmovq %xmm1, (%rdi)
310 ; AVX512-NEXT:    retq
311   %t = call {<3 x i32>, <3 x i1>} @llvm.ssub.with.overflow.v3i32(<3 x i32> %a0, <3 x i32> %a1)
312   %val = extractvalue {<3 x i32>, <3 x i1>} %t, 0
313   %obit = extractvalue {<3 x i32>, <3 x i1>} %t, 1
314   %res = sext <3 x i1> %obit to <3 x i32>
315   store <3 x i32> %val, <3 x i32>* %p2
316   ret <3 x i32> %res
319 define <4 x i32> @ssubo_v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i32>* %p2) nounwind {
320 ; SSE-LABEL: ssubo_v4i32:
321 ; SSE:       # %bb.0:
322 ; SSE-NEXT:    pxor %xmm3, %xmm3
323 ; SSE-NEXT:    pxor %xmm2, %xmm2
324 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm2
325 ; SSE-NEXT:    pcmpeqd %xmm4, %xmm4
326 ; SSE-NEXT:    pxor %xmm4, %xmm2
327 ; SSE-NEXT:    pxor %xmm5, %xmm5
328 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm5
329 ; SSE-NEXT:    pxor %xmm4, %xmm5
330 ; SSE-NEXT:    pcmpeqd %xmm5, %xmm2
331 ; SSE-NEXT:    psubd %xmm1, %xmm0
332 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm3
333 ; SSE-NEXT:    pxor %xmm4, %xmm3
334 ; SSE-NEXT:    pcmpeqd %xmm5, %xmm3
335 ; SSE-NEXT:    pxor %xmm4, %xmm3
336 ; SSE-NEXT:    pandn %xmm3, %xmm2
337 ; SSE-NEXT:    movdqa %xmm0, (%rdi)
338 ; SSE-NEXT:    movdqa %xmm2, %xmm0
339 ; SSE-NEXT:    retq
341 ; AVX1-LABEL: ssubo_v4i32:
342 ; AVX1:       # %bb.0:
343 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
344 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm2, %xmm3
345 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
346 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
347 ; AVX1-NEXT:    vpcmpgtd %xmm0, %xmm2, %xmm5
348 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm5
349 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm5, %xmm3
350 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
351 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm2, %xmm0
352 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
353 ; AVX1-NEXT:    vpcmpeqd %xmm0, %xmm5, %xmm0
354 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
355 ; AVX1-NEXT:    vpandn %xmm0, %xmm3, %xmm0
356 ; AVX1-NEXT:    vmovdqa %xmm1, (%rdi)
357 ; AVX1-NEXT:    retq
359 ; AVX2-LABEL: ssubo_v4i32:
360 ; AVX2:       # %bb.0:
361 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
362 ; AVX2-NEXT:    vpcmpgtd %xmm1, %xmm2, %xmm3
363 ; AVX2-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
364 ; AVX2-NEXT:    vpxor %xmm4, %xmm3, %xmm3
365 ; AVX2-NEXT:    vpcmpgtd %xmm0, %xmm2, %xmm5
366 ; AVX2-NEXT:    vpxor %xmm4, %xmm5, %xmm5
367 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm5, %xmm3
368 ; AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
369 ; AVX2-NEXT:    vpcmpgtd %xmm1, %xmm2, %xmm0
370 ; AVX2-NEXT:    vpxor %xmm4, %xmm0, %xmm0
371 ; AVX2-NEXT:    vpcmpeqd %xmm0, %xmm5, %xmm0
372 ; AVX2-NEXT:    vpxor %xmm4, %xmm0, %xmm0
373 ; AVX2-NEXT:    vpandn %xmm0, %xmm3, %xmm0
374 ; AVX2-NEXT:    vmovdqa %xmm1, (%rdi)
375 ; AVX2-NEXT:    retq
377 ; AVX512-LABEL: ssubo_v4i32:
378 ; AVX512:       # %bb.0:
379 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
380 ; AVX512-NEXT:    vpcmpnltd %xmm2, %xmm1, %k0
381 ; AVX512-NEXT:    vpcmpnltd %xmm2, %xmm0, %k1
382 ; AVX512-NEXT:    kxorw %k0, %k1, %k0
383 ; AVX512-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
384 ; AVX512-NEXT:    vpcmpnltd %xmm2, %xmm1, %k2
385 ; AVX512-NEXT:    kxorw %k2, %k1, %k1
386 ; AVX512-NEXT:    kandw %k1, %k0, %k1
387 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
388 ; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
389 ; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)
390 ; AVX512-NEXT:    retq
391   %t = call {<4 x i32>, <4 x i1>} @llvm.ssub.with.overflow.v4i32(<4 x i32> %a0, <4 x i32> %a1)
392   %val = extractvalue {<4 x i32>, <4 x i1>} %t, 0
393   %obit = extractvalue {<4 x i32>, <4 x i1>} %t, 1
394   %res = sext <4 x i1> %obit to <4 x i32>
395   store <4 x i32> %val, <4 x i32>* %p2
396   ret <4 x i32> %res
399 define <6 x i32> @ssubo_v6i32(<6 x i32> %a0, <6 x i32> %a1, <6 x i32>* %p2) nounwind {
400 ; SSE2-LABEL: ssubo_v6i32:
401 ; SSE2:       # %bb.0:
402 ; SSE2-NEXT:    movq %rdi, %rax
403 ; SSE2-NEXT:    movd %r8d, %xmm0
404 ; SSE2-NEXT:    movd %ecx, %xmm1
405 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
406 ; SSE2-NEXT:    movd %edx, %xmm2
407 ; SSE2-NEXT:    movd %esi, %xmm0
408 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
409 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
410 ; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
411 ; SSE2-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
412 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
413 ; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
414 ; SSE2-NEXT:    movd {{.*#+}} xmm6 = mem[0],zero,zero,zero
415 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm6 = xmm6[0],xmm1[0],xmm6[1],xmm1[1]
416 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm6 = xmm6[0],xmm2[0]
417 ; SSE2-NEXT:    movd %r9d, %xmm1
418 ; SSE2-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
419 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
420 ; SSE2-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
421 ; SSE2-NEXT:    movd {{.*#+}} xmm4 = mem[0],zero,zero,zero
422 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
423 ; SSE2-NEXT:    movq {{[0-9]+}}(%rsp), %rcx
424 ; SSE2-NEXT:    pxor %xmm3, %xmm3
425 ; SSE2-NEXT:    pxor %xmm2, %xmm2
426 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm2
427 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm5
428 ; SSE2-NEXT:    pxor %xmm5, %xmm2
429 ; SSE2-NEXT:    pxor %xmm7, %xmm7
430 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm7
431 ; SSE2-NEXT:    pxor %xmm5, %xmm7
432 ; SSE2-NEXT:    pcmpeqd %xmm7, %xmm2
433 ; SSE2-NEXT:    psubd %xmm6, %xmm0
434 ; SSE2-NEXT:    pxor %xmm6, %xmm6
435 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
436 ; SSE2-NEXT:    pxor %xmm5, %xmm6
437 ; SSE2-NEXT:    pcmpeqd %xmm7, %xmm6
438 ; SSE2-NEXT:    pxor %xmm5, %xmm6
439 ; SSE2-NEXT:    pandn %xmm6, %xmm2
440 ; SSE2-NEXT:    pxor %xmm6, %xmm6
441 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
442 ; SSE2-NEXT:    pxor %xmm5, %xmm6
443 ; SSE2-NEXT:    pxor %xmm7, %xmm7
444 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm7
445 ; SSE2-NEXT:    pxor %xmm5, %xmm7
446 ; SSE2-NEXT:    pcmpeqd %xmm7, %xmm6
447 ; SSE2-NEXT:    psubd %xmm4, %xmm1
448 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
449 ; SSE2-NEXT:    pxor %xmm5, %xmm3
450 ; SSE2-NEXT:    pcmpeqd %xmm7, %xmm3
451 ; SSE2-NEXT:    pxor %xmm5, %xmm3
452 ; SSE2-NEXT:    pandn %xmm3, %xmm6
453 ; SSE2-NEXT:    movq %xmm1, 16(%rcx)
454 ; SSE2-NEXT:    movdqa %xmm0, (%rcx)
455 ; SSE2-NEXT:    movq %xmm6, 16(%rdi)
456 ; SSE2-NEXT:    movdqa %xmm2, (%rdi)
457 ; SSE2-NEXT:    retq
459 ; SSSE3-LABEL: ssubo_v6i32:
460 ; SSSE3:       # %bb.0:
461 ; SSSE3-NEXT:    movq %rdi, %rax
462 ; SSSE3-NEXT:    movd %r8d, %xmm0
463 ; SSSE3-NEXT:    movd %ecx, %xmm1
464 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
465 ; SSSE3-NEXT:    movd %edx, %xmm2
466 ; SSSE3-NEXT:    movd %esi, %xmm0
467 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
468 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
469 ; SSSE3-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
470 ; SSSE3-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
471 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
472 ; SSSE3-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
473 ; SSSE3-NEXT:    movd {{.*#+}} xmm6 = mem[0],zero,zero,zero
474 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm6 = xmm6[0],xmm1[0],xmm6[1],xmm1[1]
475 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm6 = xmm6[0],xmm2[0]
476 ; SSSE3-NEXT:    movd %r9d, %xmm1
477 ; SSSE3-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
478 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
479 ; SSSE3-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
480 ; SSSE3-NEXT:    movd {{.*#+}} xmm4 = mem[0],zero,zero,zero
481 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
482 ; SSSE3-NEXT:    movq {{[0-9]+}}(%rsp), %rcx
483 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
484 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
485 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm2
486 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm5
487 ; SSSE3-NEXT:    pxor %xmm5, %xmm2
488 ; SSSE3-NEXT:    pxor %xmm7, %xmm7
489 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm7
490 ; SSSE3-NEXT:    pxor %xmm5, %xmm7
491 ; SSSE3-NEXT:    pcmpeqd %xmm7, %xmm2
492 ; SSSE3-NEXT:    psubd %xmm6, %xmm0
493 ; SSSE3-NEXT:    pxor %xmm6, %xmm6
494 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm6
495 ; SSSE3-NEXT:    pxor %xmm5, %xmm6
496 ; SSSE3-NEXT:    pcmpeqd %xmm7, %xmm6
497 ; SSSE3-NEXT:    pxor %xmm5, %xmm6
498 ; SSSE3-NEXT:    pandn %xmm6, %xmm2
499 ; SSSE3-NEXT:    pxor %xmm6, %xmm6
500 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
501 ; SSSE3-NEXT:    pxor %xmm5, %xmm6
502 ; SSSE3-NEXT:    pxor %xmm7, %xmm7
503 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm7
504 ; SSSE3-NEXT:    pxor %xmm5, %xmm7
505 ; SSSE3-NEXT:    pcmpeqd %xmm7, %xmm6
506 ; SSSE3-NEXT:    psubd %xmm4, %xmm1
507 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
508 ; SSSE3-NEXT:    pxor %xmm5, %xmm3
509 ; SSSE3-NEXT:    pcmpeqd %xmm7, %xmm3
510 ; SSSE3-NEXT:    pxor %xmm5, %xmm3
511 ; SSSE3-NEXT:    pandn %xmm3, %xmm6
512 ; SSSE3-NEXT:    movq %xmm1, 16(%rcx)
513 ; SSSE3-NEXT:    movdqa %xmm0, (%rcx)
514 ; SSSE3-NEXT:    movq %xmm6, 16(%rdi)
515 ; SSSE3-NEXT:    movdqa %xmm2, (%rdi)
516 ; SSSE3-NEXT:    retq
518 ; SSE41-LABEL: ssubo_v6i32:
519 ; SSE41:       # %bb.0:
520 ; SSE41-NEXT:    movq %rdi, %rax
521 ; SSE41-NEXT:    movd %esi, %xmm0
522 ; SSE41-NEXT:    pinsrd $1, %edx, %xmm0
523 ; SSE41-NEXT:    pinsrd $2, %ecx, %xmm0
524 ; SSE41-NEXT:    pinsrd $3, %r8d, %xmm0
525 ; SSE41-NEXT:    movd %r9d, %xmm1
526 ; SSE41-NEXT:    pinsrd $1, {{[0-9]+}}(%rsp), %xmm1
527 ; SSE41-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
528 ; SSE41-NEXT:    pinsrd $1, {{[0-9]+}}(%rsp), %xmm3
529 ; SSE41-NEXT:    movd {{.*#+}} xmm6 = mem[0],zero,zero,zero
530 ; SSE41-NEXT:    pinsrd $1, {{[0-9]+}}(%rsp), %xmm6
531 ; SSE41-NEXT:    pinsrd $2, {{[0-9]+}}(%rsp), %xmm6
532 ; SSE41-NEXT:    pinsrd $3, {{[0-9]+}}(%rsp), %xmm6
533 ; SSE41-NEXT:    movq {{[0-9]+}}(%rsp), %rcx
534 ; SSE41-NEXT:    pxor %xmm4, %xmm4
535 ; SSE41-NEXT:    pxor %xmm2, %xmm2
536 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm2
537 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm5
538 ; SSE41-NEXT:    pxor %xmm5, %xmm2
539 ; SSE41-NEXT:    pxor %xmm7, %xmm7
540 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
541 ; SSE41-NEXT:    pxor %xmm5, %xmm7
542 ; SSE41-NEXT:    pcmpeqd %xmm7, %xmm2
543 ; SSE41-NEXT:    psubd %xmm6, %xmm0
544 ; SSE41-NEXT:    pxor %xmm6, %xmm6
545 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
546 ; SSE41-NEXT:    pxor %xmm5, %xmm6
547 ; SSE41-NEXT:    pcmpeqd %xmm7, %xmm6
548 ; SSE41-NEXT:    pxor %xmm5, %xmm6
549 ; SSE41-NEXT:    pandn %xmm6, %xmm2
550 ; SSE41-NEXT:    pxor %xmm6, %xmm6
551 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm6
552 ; SSE41-NEXT:    pxor %xmm5, %xmm6
553 ; SSE41-NEXT:    pxor %xmm7, %xmm7
554 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm7
555 ; SSE41-NEXT:    pxor %xmm5, %xmm7
556 ; SSE41-NEXT:    pcmpeqd %xmm7, %xmm6
557 ; SSE41-NEXT:    psubd %xmm3, %xmm1
558 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm4
559 ; SSE41-NEXT:    pxor %xmm5, %xmm4
560 ; SSE41-NEXT:    pcmpeqd %xmm7, %xmm4
561 ; SSE41-NEXT:    pxor %xmm5, %xmm4
562 ; SSE41-NEXT:    pandn %xmm4, %xmm6
563 ; SSE41-NEXT:    movq %xmm1, 16(%rcx)
564 ; SSE41-NEXT:    movdqa %xmm0, (%rcx)
565 ; SSE41-NEXT:    movq %xmm6, 16(%rdi)
566 ; SSE41-NEXT:    movdqa %xmm2, (%rdi)
567 ; SSE41-NEXT:    retq
569 ; AVX1-LABEL: ssubo_v6i32:
570 ; AVX1:       # %bb.0:
571 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm9
572 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
573 ; AVX1-NEXT:    vpcmpgtd %xmm9, %xmm3, %xmm4
574 ; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
575 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
576 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
577 ; AVX1-NEXT:    vpcmpgtd %xmm6, %xmm3, %xmm7
578 ; AVX1-NEXT:    vpxor %xmm5, %xmm7, %xmm7
579 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm7, %xmm4
580 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm8
581 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm3, %xmm4
582 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
583 ; AVX1-NEXT:    vpcmpgtd %xmm0, %xmm3, %xmm2
584 ; AVX1-NEXT:    vpxor %xmm5, %xmm2, %xmm2
585 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm2, %xmm4
586 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
587 ; AVX1-NEXT:    vinsertf128 $1, %xmm8, %ymm4, %ymm8
588 ; AVX1-NEXT:    vpsubd %xmm9, %xmm6, %xmm6
589 ; AVX1-NEXT:    vpcmpgtd %xmm6, %xmm3, %xmm4
590 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
591 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm7, %xmm4
592 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
593 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
594 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm3, %xmm0
595 ; AVX1-NEXT:    vpxor %xmm5, %xmm0, %xmm0
596 ; AVX1-NEXT:    vpcmpeqd %xmm0, %xmm2, %xmm0
597 ; AVX1-NEXT:    vpxor %xmm5, %xmm0, %xmm0
598 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
599 ; AVX1-NEXT:    vandps %ymm0, %ymm8, %ymm0
600 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
601 ; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0
602 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm2
603 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
604 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
605 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
606 ; AVX1-NEXT:    vmovq %xmm6, 16(%rdi)
607 ; AVX1-NEXT:    vmovdqa %xmm1, (%rdi)
608 ; AVX1-NEXT:    retq
610 ; AVX2-LABEL: ssubo_v6i32:
611 ; AVX2:       # %bb.0:
612 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
613 ; AVX2-NEXT:    vpcmpgtd %ymm1, %ymm2, %ymm3
614 ; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm4, %ymm4
615 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm3
616 ; AVX2-NEXT:    vpcmpgtd %ymm0, %ymm2, %ymm5
617 ; AVX2-NEXT:    vpxor %ymm4, %ymm5, %ymm5
618 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm5, %ymm3
619 ; AVX2-NEXT:    vpsubd %ymm1, %ymm0, %ymm1
620 ; AVX2-NEXT:    vpcmpgtd %ymm1, %ymm2, %ymm0
621 ; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm0
622 ; AVX2-NEXT:    vpcmpeqd %ymm0, %ymm5, %ymm0
623 ; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm0
624 ; AVX2-NEXT:    vpandn %ymm0, %ymm3, %ymm0
625 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
626 ; AVX2-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0
627 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
628 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
629 ; AVX2-NEXT:    vmovq %xmm2, 16(%rdi)
630 ; AVX2-NEXT:    vmovdqa %xmm1, (%rdi)
631 ; AVX2-NEXT:    retq
633 ; AVX512-LABEL: ssubo_v6i32:
634 ; AVX512:       # %bb.0:
635 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
636 ; AVX512-NEXT:    vpcmpnltd %ymm2, %ymm1, %k0
637 ; AVX512-NEXT:    vpcmpnltd %ymm2, %ymm0, %k1
638 ; AVX512-NEXT:    kxorw %k0, %k1, %k0
639 ; AVX512-NEXT:    vpsubd %ymm1, %ymm0, %ymm1
640 ; AVX512-NEXT:    vpcmpnltd %ymm2, %ymm1, %k2
641 ; AVX512-NEXT:    kxorw %k2, %k1, %k1
642 ; AVX512-NEXT:    kandw %k1, %k0, %k1
643 ; AVX512-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
644 ; AVX512-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}
645 ; AVX512-NEXT:    vextracti128 $1, %ymm1, %xmm2
646 ; AVX512-NEXT:    vmovq %xmm2, 16(%rdi)
647 ; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)
648 ; AVX512-NEXT:    retq
649   %t = call {<6 x i32>, <6 x i1>} @llvm.ssub.with.overflow.v6i32(<6 x i32> %a0, <6 x i32> %a1)
650   %val = extractvalue {<6 x i32>, <6 x i1>} %t, 0
651   %obit = extractvalue {<6 x i32>, <6 x i1>} %t, 1
652   %res = sext <6 x i1> %obit to <6 x i32>
653   store <6 x i32> %val, <6 x i32>* %p2
654   ret <6 x i32> %res
657 define <8 x i32> @ssubo_v8i32(<8 x i32> %a0, <8 x i32> %a1, <8 x i32>* %p2) nounwind {
658 ; SSE-LABEL: ssubo_v8i32:
659 ; SSE:       # %bb.0:
660 ; SSE-NEXT:    pxor %xmm5, %xmm5
661 ; SSE-NEXT:    pxor %xmm4, %xmm4
662 ; SSE-NEXT:    pcmpgtd %xmm2, %xmm4
663 ; SSE-NEXT:    pcmpeqd %xmm6, %xmm6
664 ; SSE-NEXT:    pxor %xmm6, %xmm4
665 ; SSE-NEXT:    pxor %xmm7, %xmm7
666 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm7
667 ; SSE-NEXT:    pxor %xmm6, %xmm7
668 ; SSE-NEXT:    pcmpeqd %xmm7, %xmm4
669 ; SSE-NEXT:    psubd %xmm2, %xmm0
670 ; SSE-NEXT:    pxor %xmm2, %xmm2
671 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm2
672 ; SSE-NEXT:    pxor %xmm6, %xmm2
673 ; SSE-NEXT:    pcmpeqd %xmm7, %xmm2
674 ; SSE-NEXT:    pxor %xmm6, %xmm2
675 ; SSE-NEXT:    pandn %xmm2, %xmm4
676 ; SSE-NEXT:    pxor %xmm2, %xmm2
677 ; SSE-NEXT:    pcmpgtd %xmm3, %xmm2
678 ; SSE-NEXT:    pxor %xmm6, %xmm2
679 ; SSE-NEXT:    pxor %xmm7, %xmm7
680 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm7
681 ; SSE-NEXT:    pxor %xmm6, %xmm7
682 ; SSE-NEXT:    pcmpeqd %xmm7, %xmm2
683 ; SSE-NEXT:    psubd %xmm3, %xmm1
684 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm5
685 ; SSE-NEXT:    pxor %xmm6, %xmm5
686 ; SSE-NEXT:    pcmpeqd %xmm7, %xmm5
687 ; SSE-NEXT:    pxor %xmm6, %xmm5
688 ; SSE-NEXT:    pandn %xmm5, %xmm2
689 ; SSE-NEXT:    movdqa %xmm1, 16(%rdi)
690 ; SSE-NEXT:    movdqa %xmm0, (%rdi)
691 ; SSE-NEXT:    movdqa %xmm4, %xmm0
692 ; SSE-NEXT:    movdqa %xmm2, %xmm1
693 ; SSE-NEXT:    retq
695 ; AVX1-LABEL: ssubo_v8i32:
696 ; AVX1:       # %bb.0:
697 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm9
698 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
699 ; AVX1-NEXT:    vpcmpgtd %xmm9, %xmm3, %xmm4
700 ; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
701 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
702 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
703 ; AVX1-NEXT:    vpcmpgtd %xmm6, %xmm3, %xmm7
704 ; AVX1-NEXT:    vpxor %xmm5, %xmm7, %xmm7
705 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm7, %xmm4
706 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm8
707 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm3, %xmm4
708 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
709 ; AVX1-NEXT:    vpcmpgtd %xmm0, %xmm3, %xmm2
710 ; AVX1-NEXT:    vpxor %xmm5, %xmm2, %xmm2
711 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm2, %xmm4
712 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
713 ; AVX1-NEXT:    vinsertf128 $1, %xmm8, %ymm4, %ymm8
714 ; AVX1-NEXT:    vpsubd %xmm9, %xmm6, %xmm6
715 ; AVX1-NEXT:    vpcmpgtd %xmm6, %xmm3, %xmm4
716 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
717 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm7, %xmm4
718 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
719 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
720 ; AVX1-NEXT:    vpcmpgtd %xmm0, %xmm3, %xmm1
721 ; AVX1-NEXT:    vpxor %xmm5, %xmm1, %xmm1
722 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm2, %xmm1
723 ; AVX1-NEXT:    vpxor %xmm5, %xmm1, %xmm1
724 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm1
725 ; AVX1-NEXT:    vandps %ymm1, %ymm8, %ymm1
726 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
727 ; AVX1-NEXT:    vpackssdw %xmm2, %xmm1, %xmm1
728 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm0, %ymm2
729 ; AVX1-NEXT:    vpmovsxwd %xmm1, %xmm0
730 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
731 ; AVX1-NEXT:    vpmovsxwd %xmm1, %xmm1
732 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
733 ; AVX1-NEXT:    vmovaps %ymm2, (%rdi)
734 ; AVX1-NEXT:    retq
736 ; AVX2-LABEL: ssubo_v8i32:
737 ; AVX2:       # %bb.0:
738 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
739 ; AVX2-NEXT:    vpcmpgtd %ymm1, %ymm2, %ymm3
740 ; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm4, %ymm4
741 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm3
742 ; AVX2-NEXT:    vpcmpgtd %ymm0, %ymm2, %ymm5
743 ; AVX2-NEXT:    vpxor %ymm4, %ymm5, %ymm5
744 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm5, %ymm3
745 ; AVX2-NEXT:    vpsubd %ymm1, %ymm0, %ymm1
746 ; AVX2-NEXT:    vpcmpgtd %ymm1, %ymm2, %ymm0
747 ; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm0
748 ; AVX2-NEXT:    vpcmpeqd %ymm0, %ymm5, %ymm0
749 ; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm0
750 ; AVX2-NEXT:    vpandn %ymm0, %ymm3, %ymm0
751 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
752 ; AVX2-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0
753 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
754 ; AVX2-NEXT:    vmovdqa %ymm1, (%rdi)
755 ; AVX2-NEXT:    retq
757 ; AVX512-LABEL: ssubo_v8i32:
758 ; AVX512:       # %bb.0:
759 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
760 ; AVX512-NEXT:    vpcmpnltd %ymm2, %ymm1, %k0
761 ; AVX512-NEXT:    vpcmpnltd %ymm2, %ymm0, %k1
762 ; AVX512-NEXT:    kxorw %k0, %k1, %k0
763 ; AVX512-NEXT:    vpsubd %ymm1, %ymm0, %ymm1
764 ; AVX512-NEXT:    vpcmpnltd %ymm2, %ymm1, %k2
765 ; AVX512-NEXT:    kxorw %k2, %k1, %k1
766 ; AVX512-NEXT:    kandw %k1, %k0, %k1
767 ; AVX512-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
768 ; AVX512-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}
769 ; AVX512-NEXT:    vmovdqa %ymm1, (%rdi)
770 ; AVX512-NEXT:    retq
771   %t = call {<8 x i32>, <8 x i1>} @llvm.ssub.with.overflow.v8i32(<8 x i32> %a0, <8 x i32> %a1)
772   %val = extractvalue {<8 x i32>, <8 x i1>} %t, 0
773   %obit = extractvalue {<8 x i32>, <8 x i1>} %t, 1
774   %res = sext <8 x i1> %obit to <8 x i32>
775   store <8 x i32> %val, <8 x i32>* %p2
776   ret <8 x i32> %res
779 define <16 x i32> @ssubo_v16i32(<16 x i32> %a0, <16 x i32> %a1, <16 x i32>* %p2) nounwind {
780 ; SSE-LABEL: ssubo_v16i32:
781 ; SSE:       # %bb.0:
782 ; SSE-NEXT:    pxor %xmm10, %xmm10
783 ; SSE-NEXT:    pxor %xmm8, %xmm8
784 ; SSE-NEXT:    pcmpgtd %xmm4, %xmm8
785 ; SSE-NEXT:    pcmpeqd %xmm11, %xmm11
786 ; SSE-NEXT:    pxor %xmm11, %xmm8
787 ; SSE-NEXT:    pxor %xmm9, %xmm9
788 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm9
789 ; SSE-NEXT:    pxor %xmm11, %xmm9
790 ; SSE-NEXT:    pcmpeqd %xmm9, %xmm8
791 ; SSE-NEXT:    psubd %xmm4, %xmm0
792 ; SSE-NEXT:    pxor %xmm4, %xmm4
793 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm4
794 ; SSE-NEXT:    pxor %xmm11, %xmm4
795 ; SSE-NEXT:    pcmpeqd %xmm9, %xmm4
796 ; SSE-NEXT:    pxor %xmm11, %xmm4
797 ; SSE-NEXT:    pandn %xmm4, %xmm8
798 ; SSE-NEXT:    pxor %xmm9, %xmm9
799 ; SSE-NEXT:    pcmpgtd %xmm5, %xmm9
800 ; SSE-NEXT:    pxor %xmm11, %xmm9
801 ; SSE-NEXT:    pxor %xmm4, %xmm4
802 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm4
803 ; SSE-NEXT:    pxor %xmm11, %xmm4
804 ; SSE-NEXT:    pcmpeqd %xmm4, %xmm9
805 ; SSE-NEXT:    psubd %xmm5, %xmm1
806 ; SSE-NEXT:    pxor %xmm5, %xmm5
807 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm5
808 ; SSE-NEXT:    pxor %xmm11, %xmm5
809 ; SSE-NEXT:    pcmpeqd %xmm4, %xmm5
810 ; SSE-NEXT:    pxor %xmm11, %xmm5
811 ; SSE-NEXT:    pandn %xmm5, %xmm9
812 ; SSE-NEXT:    pxor %xmm4, %xmm4
813 ; SSE-NEXT:    pcmpgtd %xmm6, %xmm4
814 ; SSE-NEXT:    pxor %xmm11, %xmm4
815 ; SSE-NEXT:    pxor %xmm5, %xmm5
816 ; SSE-NEXT:    pcmpgtd %xmm2, %xmm5
817 ; SSE-NEXT:    pxor %xmm11, %xmm5
818 ; SSE-NEXT:    pcmpeqd %xmm5, %xmm4
819 ; SSE-NEXT:    psubd %xmm6, %xmm2
820 ; SSE-NEXT:    pxor %xmm6, %xmm6
821 ; SSE-NEXT:    pcmpgtd %xmm2, %xmm6
822 ; SSE-NEXT:    pxor %xmm11, %xmm6
823 ; SSE-NEXT:    pcmpeqd %xmm5, %xmm6
824 ; SSE-NEXT:    pxor %xmm11, %xmm6
825 ; SSE-NEXT:    pandn %xmm6, %xmm4
826 ; SSE-NEXT:    pxor %xmm5, %xmm5
827 ; SSE-NEXT:    pcmpgtd %xmm7, %xmm5
828 ; SSE-NEXT:    pxor %xmm11, %xmm5
829 ; SSE-NEXT:    pxor %xmm6, %xmm6
830 ; SSE-NEXT:    pcmpgtd %xmm3, %xmm6
831 ; SSE-NEXT:    pxor %xmm11, %xmm6
832 ; SSE-NEXT:    pcmpeqd %xmm6, %xmm5
833 ; SSE-NEXT:    psubd %xmm7, %xmm3
834 ; SSE-NEXT:    pcmpgtd %xmm3, %xmm10
835 ; SSE-NEXT:    pxor %xmm11, %xmm10
836 ; SSE-NEXT:    pcmpeqd %xmm6, %xmm10
837 ; SSE-NEXT:    pxor %xmm11, %xmm10
838 ; SSE-NEXT:    pandn %xmm10, %xmm5
839 ; SSE-NEXT:    movdqa %xmm3, 48(%rdi)
840 ; SSE-NEXT:    movdqa %xmm2, 32(%rdi)
841 ; SSE-NEXT:    movdqa %xmm1, 16(%rdi)
842 ; SSE-NEXT:    movdqa %xmm0, (%rdi)
843 ; SSE-NEXT:    movdqa %xmm8, %xmm0
844 ; SSE-NEXT:    movdqa %xmm9, %xmm1
845 ; SSE-NEXT:    movdqa %xmm4, %xmm2
846 ; SSE-NEXT:    movdqa %xmm5, %xmm3
847 ; SSE-NEXT:    retq
849 ; AVX1-LABEL: ssubo_v16i32:
850 ; AVX1:       # %bb.0:
851 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm8
852 ; AVX1-NEXT:    vpxor %xmm5, %xmm5, %xmm5
853 ; AVX1-NEXT:    vpcmpgtd %xmm8, %xmm5, %xmm7
854 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
855 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm9
856 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm12
857 ; AVX1-NEXT:    vpcmpgtd %xmm12, %xmm5, %xmm7
858 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm10
859 ; AVX1-NEXT:    vpcmpeqd %xmm9, %xmm10, %xmm7
860 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm9
861 ; AVX1-NEXT:    vpcmpgtd %xmm3, %xmm5, %xmm7
862 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm11
863 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm5, %xmm7
864 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm7
865 ; AVX1-NEXT:    vpcmpeqd %xmm11, %xmm7, %xmm6
866 ; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm6
867 ; AVX1-NEXT:    vinsertf128 $1, %xmm9, %ymm6, %ymm9
868 ; AVX1-NEXT:    vpsubd %xmm8, %xmm12, %xmm8
869 ; AVX1-NEXT:    vpcmpgtd %xmm8, %xmm5, %xmm6
870 ; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm6
871 ; AVX1-NEXT:    vpcmpeqd %xmm6, %xmm10, %xmm6
872 ; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm6
873 ; AVX1-NEXT:    vpsubd %xmm3, %xmm1, %xmm10
874 ; AVX1-NEXT:    vpcmpgtd %xmm10, %xmm5, %xmm3
875 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
876 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm7, %xmm3
877 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
878 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm3, %ymm3
879 ; AVX1-NEXT:    vandps %ymm3, %ymm9, %ymm3
880 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm6
881 ; AVX1-NEXT:    vpackssdw %xmm6, %xmm3, %xmm9
882 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm13
883 ; AVX1-NEXT:    vpcmpgtd %xmm13, %xmm5, %xmm7
884 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm7
885 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
886 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm5, %xmm3
887 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
888 ; AVX1-NEXT:    vpcmpeqd %xmm7, %xmm3, %xmm7
889 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm11
890 ; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm5, %xmm7
891 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm12
892 ; AVX1-NEXT:    vpcmpgtd %xmm0, %xmm5, %xmm7
893 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm7
894 ; AVX1-NEXT:    vpcmpeqd %xmm12, %xmm7, %xmm6
895 ; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm6
896 ; AVX1-NEXT:    vinsertf128 $1, %xmm11, %ymm6, %ymm11
897 ; AVX1-NEXT:    vpsubd %xmm13, %xmm1, %xmm1
898 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm5, %xmm6
899 ; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm6
900 ; AVX1-NEXT:    vpcmpeqd %xmm6, %xmm3, %xmm3
901 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
902 ; AVX1-NEXT:    vpsubd %xmm2, %xmm0, %xmm0
903 ; AVX1-NEXT:    vpcmpgtd %xmm0, %xmm5, %xmm2
904 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
905 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm7, %xmm2
906 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
907 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
908 ; AVX1-NEXT:    vandps %ymm2, %ymm11, %ymm2
909 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
910 ; AVX1-NEXT:    vpackssdw %xmm3, %xmm2, %xmm2
911 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm3
912 ; AVX1-NEXT:    vinsertf128 $1, %xmm8, %ymm10, %ymm4
913 ; AVX1-NEXT:    vpmovsxwd %xmm2, %xmm0
914 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
915 ; AVX1-NEXT:    vpmovsxwd %xmm1, %xmm1
916 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
917 ; AVX1-NEXT:    vpmovsxwd %xmm9, %xmm1
918 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm9[2,3,0,1]
919 ; AVX1-NEXT:    vpmovsxwd %xmm2, %xmm2
920 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
921 ; AVX1-NEXT:    vmovaps %ymm4, 32(%rdi)
922 ; AVX1-NEXT:    vmovaps %ymm3, (%rdi)
923 ; AVX1-NEXT:    retq
925 ; AVX2-LABEL: ssubo_v16i32:
926 ; AVX2:       # %bb.0:
927 ; AVX2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
928 ; AVX2-NEXT:    vpcmpgtd %ymm3, %ymm4, %ymm5
929 ; AVX2-NEXT:    vpcmpeqd %ymm6, %ymm6, %ymm6
930 ; AVX2-NEXT:    vpxor %ymm6, %ymm5, %ymm5
931 ; AVX2-NEXT:    vpcmpgtd %ymm1, %ymm4, %ymm7
932 ; AVX2-NEXT:    vpxor %ymm6, %ymm7, %ymm7
933 ; AVX2-NEXT:    vpcmpeqd %ymm5, %ymm7, %ymm5
934 ; AVX2-NEXT:    vpsubd %ymm3, %ymm1, %ymm3
935 ; AVX2-NEXT:    vpcmpgtd %ymm3, %ymm4, %ymm1
936 ; AVX2-NEXT:    vpxor %ymm6, %ymm1, %ymm1
937 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm7, %ymm1
938 ; AVX2-NEXT:    vpxor %ymm6, %ymm1, %ymm1
939 ; AVX2-NEXT:    vpandn %ymm1, %ymm5, %ymm1
940 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm5
941 ; AVX2-NEXT:    vpackssdw %xmm5, %xmm1, %xmm1
942 ; AVX2-NEXT:    vpcmpgtd %ymm2, %ymm4, %ymm5
943 ; AVX2-NEXT:    vpxor %ymm6, %ymm5, %ymm5
944 ; AVX2-NEXT:    vpcmpgtd %ymm0, %ymm4, %ymm7
945 ; AVX2-NEXT:    vpxor %ymm6, %ymm7, %ymm7
946 ; AVX2-NEXT:    vpcmpeqd %ymm5, %ymm7, %ymm5
947 ; AVX2-NEXT:    vpsubd %ymm2, %ymm0, %ymm2
948 ; AVX2-NEXT:    vpcmpgtd %ymm2, %ymm4, %ymm0
949 ; AVX2-NEXT:    vpxor %ymm6, %ymm0, %ymm0
950 ; AVX2-NEXT:    vpcmpeqd %ymm0, %ymm7, %ymm0
951 ; AVX2-NEXT:    vpxor %ymm6, %ymm0, %ymm0
952 ; AVX2-NEXT:    vpandn %ymm0, %ymm5, %ymm0
953 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4
954 ; AVX2-NEXT:    vpackssdw %xmm4, %xmm0, %xmm0
955 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
956 ; AVX2-NEXT:    vpmovsxwd %xmm1, %ymm1
957 ; AVX2-NEXT:    vmovdqa %ymm3, 32(%rdi)
958 ; AVX2-NEXT:    vmovdqa %ymm2, (%rdi)
959 ; AVX2-NEXT:    retq
961 ; AVX512-LABEL: ssubo_v16i32:
962 ; AVX512:       # %bb.0:
963 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
964 ; AVX512-NEXT:    vpcmpnltd %zmm2, %zmm1, %k0
965 ; AVX512-NEXT:    vpcmpnltd %zmm2, %zmm0, %k1
966 ; AVX512-NEXT:    kxorw %k0, %k1, %k0
967 ; AVX512-NEXT:    vpsubd %zmm1, %zmm0, %zmm1
968 ; AVX512-NEXT:    vpcmpnltd %zmm2, %zmm1, %k2
969 ; AVX512-NEXT:    kxorw %k2, %k1, %k1
970 ; AVX512-NEXT:    kandw %k1, %k0, %k1
971 ; AVX512-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
972 ; AVX512-NEXT:    vmovdqa64 %zmm1, (%rdi)
973 ; AVX512-NEXT:    retq
974   %t = call {<16 x i32>, <16 x i1>} @llvm.ssub.with.overflow.v16i32(<16 x i32> %a0, <16 x i32> %a1)
975   %val = extractvalue {<16 x i32>, <16 x i1>} %t, 0
976   %obit = extractvalue {<16 x i32>, <16 x i1>} %t, 1
977   %res = sext <16 x i1> %obit to <16 x i32>
978   store <16 x i32> %val, <16 x i32>* %p2
979   ret <16 x i32> %res
982 define <16 x i32> @ssubo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nounwind {
983 ; SSE2-LABEL: ssubo_v16i8:
984 ; SSE2:       # %bb.0:
985 ; SSE2-NEXT:    pxor %xmm2, %xmm2
986 ; SSE2-NEXT:    pxor %xmm3, %xmm3
987 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm3
988 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
989 ; SSE2-NEXT:    pxor %xmm4, %xmm3
990 ; SSE2-NEXT:    pxor %xmm5, %xmm5
991 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm5
992 ; SSE2-NEXT:    pxor %xmm4, %xmm5
993 ; SSE2-NEXT:    pcmpeqb %xmm5, %xmm3
994 ; SSE2-NEXT:    psubb %xmm1, %xmm0
995 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
996 ; SSE2-NEXT:    pxor %xmm4, %xmm2
997 ; SSE2-NEXT:    pcmpeqb %xmm5, %xmm2
998 ; SSE2-NEXT:    pxor %xmm4, %xmm2
999 ; SSE2-NEXT:    pandn %xmm2, %xmm3
1000 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
1001 ; 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]
1002 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1003 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]
1004 ; SSE2-NEXT:    pslld $31, %xmm4
1005 ; SSE2-NEXT:    psrad $31, %xmm4
1006 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1007 ; SSE2-NEXT:    pslld $31, %xmm1
1008 ; SSE2-NEXT:    psrad $31, %xmm1
1009 ; 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]
1010 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
1011 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1012 ; SSE2-NEXT:    pslld $31, %xmm2
1013 ; SSE2-NEXT:    psrad $31, %xmm2
1014 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1015 ; SSE2-NEXT:    pslld $31, %xmm3
1016 ; SSE2-NEXT:    psrad $31, %xmm3
1017 ; SSE2-NEXT:    movdqa %xmm0, (%rdi)
1018 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
1019 ; SSE2-NEXT:    retq
1021 ; SSSE3-LABEL: ssubo_v16i8:
1022 ; SSSE3:       # %bb.0:
1023 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
1024 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
1025 ; SSSE3-NEXT:    pcmpgtb %xmm1, %xmm3
1026 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm4
1027 ; SSSE3-NEXT:    pxor %xmm4, %xmm3
1028 ; SSSE3-NEXT:    pxor %xmm5, %xmm5
1029 ; SSSE3-NEXT:    pcmpgtb %xmm0, %xmm5
1030 ; SSSE3-NEXT:    pxor %xmm4, %xmm5
1031 ; SSSE3-NEXT:    pcmpeqb %xmm5, %xmm3
1032 ; SSSE3-NEXT:    psubb %xmm1, %xmm0
1033 ; SSSE3-NEXT:    pcmpgtb %xmm0, %xmm2
1034 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
1035 ; SSSE3-NEXT:    pcmpeqb %xmm5, %xmm2
1036 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
1037 ; SSSE3-NEXT:    pandn %xmm2, %xmm3
1038 ; SSSE3-NEXT:    movdqa %xmm3, %xmm1
1039 ; 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]
1040 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
1041 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]
1042 ; SSSE3-NEXT:    pslld $31, %xmm4
1043 ; SSSE3-NEXT:    psrad $31, %xmm4
1044 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1045 ; SSSE3-NEXT:    pslld $31, %xmm1
1046 ; SSSE3-NEXT:    psrad $31, %xmm1
1047 ; 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]
1048 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
1049 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1050 ; SSSE3-NEXT:    pslld $31, %xmm2
1051 ; SSSE3-NEXT:    psrad $31, %xmm2
1052 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
1053 ; SSSE3-NEXT:    pslld $31, %xmm3
1054 ; SSSE3-NEXT:    psrad $31, %xmm3
1055 ; SSSE3-NEXT:    movdqa %xmm0, (%rdi)
1056 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
1057 ; SSSE3-NEXT:    retq
1059 ; SSE41-LABEL: ssubo_v16i8:
1060 ; SSE41:       # %bb.0:
1061 ; SSE41-NEXT:    pxor %xmm2, %xmm2
1062 ; SSE41-NEXT:    pxor %xmm3, %xmm3
1063 ; SSE41-NEXT:    pcmpgtb %xmm1, %xmm3
1064 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm4
1065 ; SSE41-NEXT:    pxor %xmm4, %xmm3
1066 ; SSE41-NEXT:    pxor %xmm5, %xmm5
1067 ; SSE41-NEXT:    pcmpgtb %xmm0, %xmm5
1068 ; SSE41-NEXT:    pxor %xmm4, %xmm5
1069 ; SSE41-NEXT:    pcmpeqb %xmm5, %xmm3
1070 ; SSE41-NEXT:    psubb %xmm1, %xmm0
1071 ; SSE41-NEXT:    pcmpgtb %xmm0, %xmm2
1072 ; SSE41-NEXT:    pxor %xmm4, %xmm2
1073 ; SSE41-NEXT:    pcmpeqb %xmm5, %xmm2
1074 ; SSE41-NEXT:    pxor %xmm4, %xmm2
1075 ; SSE41-NEXT:    pandn %xmm2, %xmm3
1076 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm4 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
1077 ; SSE41-NEXT:    pslld $31, %xmm4
1078 ; SSE41-NEXT:    psrad $31, %xmm4
1079 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,2,3]
1080 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
1081 ; SSE41-NEXT:    pslld $31, %xmm1
1082 ; SSE41-NEXT:    psrad $31, %xmm1
1083 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,0,1]
1084 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
1085 ; SSE41-NEXT:    pslld $31, %xmm2
1086 ; SSE41-NEXT:    psrad $31, %xmm2
1087 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[3,1,2,3]
1088 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
1089 ; SSE41-NEXT:    pslld $31, %xmm3
1090 ; SSE41-NEXT:    psrad $31, %xmm3
1091 ; SSE41-NEXT:    movdqa %xmm0, (%rdi)
1092 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1093 ; SSE41-NEXT:    retq
1095 ; AVX1-LABEL: ssubo_v16i8:
1096 ; AVX1:       # %bb.0:
1097 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1098 ; AVX1-NEXT:    vpcmpgtb %xmm1, %xmm2, %xmm3
1099 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
1100 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
1101 ; AVX1-NEXT:    vpcmpgtb %xmm0, %xmm2, %xmm5
1102 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm5
1103 ; AVX1-NEXT:    vpcmpeqb %xmm3, %xmm5, %xmm3
1104 ; AVX1-NEXT:    vpsubb %xmm1, %xmm0, %xmm6
1105 ; AVX1-NEXT:    vpcmpgtb %xmm6, %xmm2, %xmm0
1106 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
1107 ; AVX1-NEXT:    vpcmpeqb %xmm0, %xmm5, %xmm0
1108 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
1109 ; AVX1-NEXT:    vpandn %xmm0, %xmm3, %xmm1
1110 ; 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
1111 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1112 ; AVX1-NEXT:    vpslld $31, %xmm2, %xmm2
1113 ; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm2
1114 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
1115 ; AVX1-NEXT:    vpslld $31, %xmm0, %xmm0
1116 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm0
1117 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
1118 ; 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]
1119 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
1120 ; AVX1-NEXT:    vpslld $31, %xmm2, %xmm2
1121 ; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm2
1122 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1123 ; AVX1-NEXT:    vpslld $31, %xmm1, %xmm1
1124 ; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm1
1125 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
1126 ; AVX1-NEXT:    vmovdqa %xmm6, (%rdi)
1127 ; AVX1-NEXT:    retq
1129 ; AVX2-LABEL: ssubo_v16i8:
1130 ; AVX2:       # %bb.0:
1131 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1132 ; AVX2-NEXT:    vpcmpgtb %xmm1, %xmm2, %xmm3
1133 ; AVX2-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
1134 ; AVX2-NEXT:    vpxor %xmm4, %xmm3, %xmm3
1135 ; AVX2-NEXT:    vpcmpgtb %xmm0, %xmm2, %xmm5
1136 ; AVX2-NEXT:    vpxor %xmm4, %xmm5, %xmm5
1137 ; AVX2-NEXT:    vpcmpeqb %xmm3, %xmm5, %xmm3
1138 ; AVX2-NEXT:    vpsubb %xmm1, %xmm0, %xmm6
1139 ; AVX2-NEXT:    vpcmpgtb %xmm6, %xmm2, %xmm0
1140 ; AVX2-NEXT:    vpxor %xmm4, %xmm0, %xmm0
1141 ; AVX2-NEXT:    vpcmpeqb %xmm0, %xmm5, %xmm0
1142 ; AVX2-NEXT:    vpxor %xmm4, %xmm0, %xmm0
1143 ; AVX2-NEXT:    vpandn %xmm0, %xmm3, %xmm1
1144 ; 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
1145 ; 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
1146 ; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
1147 ; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm0
1148 ; 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]
1149 ; 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
1150 ; AVX2-NEXT:    vpslld $31, %ymm1, %ymm1
1151 ; AVX2-NEXT:    vpsrad $31, %ymm1, %ymm1
1152 ; AVX2-NEXT:    vmovdqa %xmm6, (%rdi)
1153 ; AVX2-NEXT:    retq
1155 ; AVX512-LABEL: ssubo_v16i8:
1156 ; AVX512:       # %bb.0:
1157 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1158 ; AVX512-NEXT:    vpcmpnltb %xmm2, %xmm1, %k0
1159 ; AVX512-NEXT:    vpcmpnltb %xmm2, %xmm0, %k1
1160 ; AVX512-NEXT:    kxorw %k0, %k1, %k0
1161 ; AVX512-NEXT:    vpsubb %xmm1, %xmm0, %xmm1
1162 ; AVX512-NEXT:    vpcmpnltb %xmm2, %xmm1, %k2
1163 ; AVX512-NEXT:    kxorw %k2, %k1, %k1
1164 ; AVX512-NEXT:    kandw %k1, %k0, %k1
1165 ; AVX512-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1166 ; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)
1167 ; AVX512-NEXT:    retq
1168   %t = call {<16 x i8>, <16 x i1>} @llvm.ssub.with.overflow.v16i8(<16 x i8> %a0, <16 x i8> %a1)
1169   %val = extractvalue {<16 x i8>, <16 x i1>} %t, 0
1170   %obit = extractvalue {<16 x i8>, <16 x i1>} %t, 1
1171   %res = sext <16 x i1> %obit to <16 x i32>
1172   store <16 x i8> %val, <16 x i8>* %p2
1173   ret <16 x i32> %res
1176 define <8 x i32> @ssubo_v8i16(<8 x i16> %a0, <8 x i16> %a1, <8 x i16>* %p2) nounwind {
1177 ; SSE2-LABEL: ssubo_v8i16:
1178 ; SSE2:       # %bb.0:
1179 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1180 ; SSE2-NEXT:    pxor %xmm3, %xmm3
1181 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1182 ; SSE2-NEXT:    pcmpgtw %xmm2, %xmm1
1183 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
1184 ; SSE2-NEXT:    pxor %xmm4, %xmm1
1185 ; SSE2-NEXT:    pxor %xmm5, %xmm5
1186 ; SSE2-NEXT:    pcmpgtw %xmm0, %xmm5
1187 ; SSE2-NEXT:    pxor %xmm4, %xmm5
1188 ; SSE2-NEXT:    pcmpeqw %xmm5, %xmm1
1189 ; SSE2-NEXT:    psubw %xmm2, %xmm0
1190 ; SSE2-NEXT:    pcmpgtw %xmm0, %xmm3
1191 ; SSE2-NEXT:    pxor %xmm4, %xmm3
1192 ; SSE2-NEXT:    pcmpeqw %xmm5, %xmm3
1193 ; SSE2-NEXT:    pxor %xmm4, %xmm3
1194 ; SSE2-NEXT:    pandn %xmm3, %xmm1
1195 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1196 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1197 ; SSE2-NEXT:    pslld $31, %xmm2
1198 ; SSE2-NEXT:    psrad $31, %xmm2
1199 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1200 ; SSE2-NEXT:    pslld $31, %xmm1
1201 ; SSE2-NEXT:    psrad $31, %xmm1
1202 ; SSE2-NEXT:    movdqa %xmm0, (%rdi)
1203 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1204 ; SSE2-NEXT:    retq
1206 ; SSSE3-LABEL: ssubo_v8i16:
1207 ; SSSE3:       # %bb.0:
1208 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1209 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
1210 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1211 ; SSSE3-NEXT:    pcmpgtw %xmm2, %xmm1
1212 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm4
1213 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
1214 ; SSSE3-NEXT:    pxor %xmm5, %xmm5
1215 ; SSSE3-NEXT:    pcmpgtw %xmm0, %xmm5
1216 ; SSSE3-NEXT:    pxor %xmm4, %xmm5
1217 ; SSSE3-NEXT:    pcmpeqw %xmm5, %xmm1
1218 ; SSSE3-NEXT:    psubw %xmm2, %xmm0
1219 ; SSSE3-NEXT:    pcmpgtw %xmm0, %xmm3
1220 ; SSSE3-NEXT:    pxor %xmm4, %xmm3
1221 ; SSSE3-NEXT:    pcmpeqw %xmm5, %xmm3
1222 ; SSSE3-NEXT:    pxor %xmm4, %xmm3
1223 ; SSSE3-NEXT:    pandn %xmm3, %xmm1
1224 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1225 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
1226 ; SSSE3-NEXT:    pslld $31, %xmm2
1227 ; SSSE3-NEXT:    psrad $31, %xmm2
1228 ; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1229 ; SSSE3-NEXT:    pslld $31, %xmm1
1230 ; SSSE3-NEXT:    psrad $31, %xmm1
1231 ; SSSE3-NEXT:    movdqa %xmm0, (%rdi)
1232 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
1233 ; SSSE3-NEXT:    retq
1235 ; SSE41-LABEL: ssubo_v8i16:
1236 ; SSE41:       # %bb.0:
1237 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
1238 ; SSE41-NEXT:    pxor %xmm3, %xmm3
1239 ; SSE41-NEXT:    pxor %xmm1, %xmm1
1240 ; SSE41-NEXT:    pcmpgtw %xmm2, %xmm1
1241 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm4
1242 ; SSE41-NEXT:    pxor %xmm4, %xmm1
1243 ; SSE41-NEXT:    pxor %xmm5, %xmm5
1244 ; SSE41-NEXT:    pcmpgtw %xmm0, %xmm5
1245 ; SSE41-NEXT:    pxor %xmm4, %xmm5
1246 ; SSE41-NEXT:    pcmpeqw %xmm5, %xmm1
1247 ; SSE41-NEXT:    psubw %xmm2, %xmm0
1248 ; SSE41-NEXT:    pcmpgtw %xmm0, %xmm3
1249 ; SSE41-NEXT:    pxor %xmm4, %xmm3
1250 ; SSE41-NEXT:    pcmpeqw %xmm5, %xmm3
1251 ; SSE41-NEXT:    pxor %xmm4, %xmm3
1252 ; SSE41-NEXT:    pandn %xmm3, %xmm1
1253 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
1254 ; SSE41-NEXT:    pslld $31, %xmm2
1255 ; SSE41-NEXT:    psrad $31, %xmm2
1256 ; SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1257 ; SSE41-NEXT:    pslld $31, %xmm1
1258 ; SSE41-NEXT:    psrad $31, %xmm1
1259 ; SSE41-NEXT:    movdqa %xmm0, (%rdi)
1260 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1261 ; SSE41-NEXT:    retq
1263 ; AVX1-LABEL: ssubo_v8i16:
1264 ; AVX1:       # %bb.0:
1265 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1266 ; AVX1-NEXT:    vpcmpgtw %xmm1, %xmm2, %xmm3
1267 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
1268 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
1269 ; AVX1-NEXT:    vpcmpgtw %xmm0, %xmm2, %xmm5
1270 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm5
1271 ; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm5, %xmm3
1272 ; AVX1-NEXT:    vpsubw %xmm1, %xmm0, %xmm1
1273 ; AVX1-NEXT:    vpcmpgtw %xmm1, %xmm2, %xmm0
1274 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
1275 ; AVX1-NEXT:    vpcmpeqw %xmm0, %xmm5, %xmm0
1276 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
1277 ; AVX1-NEXT:    vpandn %xmm0, %xmm3, %xmm0
1278 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm2
1279 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1280 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
1281 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
1282 ; AVX1-NEXT:    vmovdqa %xmm1, (%rdi)
1283 ; AVX1-NEXT:    retq
1285 ; AVX2-LABEL: ssubo_v8i16:
1286 ; AVX2:       # %bb.0:
1287 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1288 ; AVX2-NEXT:    vpcmpgtw %xmm1, %xmm2, %xmm3
1289 ; AVX2-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
1290 ; AVX2-NEXT:    vpxor %xmm4, %xmm3, %xmm3
1291 ; AVX2-NEXT:    vpcmpgtw %xmm0, %xmm2, %xmm5
1292 ; AVX2-NEXT:    vpxor %xmm4, %xmm5, %xmm5
1293 ; AVX2-NEXT:    vpcmpeqw %xmm3, %xmm5, %xmm3
1294 ; AVX2-NEXT:    vpsubw %xmm1, %xmm0, %xmm1
1295 ; AVX2-NEXT:    vpcmpgtw %xmm1, %xmm2, %xmm0
1296 ; AVX2-NEXT:    vpxor %xmm4, %xmm0, %xmm0
1297 ; AVX2-NEXT:    vpcmpeqw %xmm0, %xmm5, %xmm0
1298 ; AVX2-NEXT:    vpxor %xmm4, %xmm0, %xmm0
1299 ; AVX2-NEXT:    vpandn %xmm0, %xmm3, %xmm0
1300 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
1301 ; AVX2-NEXT:    vmovdqa %xmm1, (%rdi)
1302 ; AVX2-NEXT:    retq
1304 ; AVX512-LABEL: ssubo_v8i16:
1305 ; AVX512:       # %bb.0:
1306 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1307 ; AVX512-NEXT:    vpcmpnltw %xmm2, %xmm1, %k0
1308 ; AVX512-NEXT:    vpcmpnltw %xmm2, %xmm0, %k1
1309 ; AVX512-NEXT:    kxorw %k0, %k1, %k0
1310 ; AVX512-NEXT:    vpsubw %xmm1, %xmm0, %xmm1
1311 ; AVX512-NEXT:    vpcmpnltw %xmm2, %xmm1, %k2
1312 ; AVX512-NEXT:    kxorw %k2, %k1, %k1
1313 ; AVX512-NEXT:    kandw %k1, %k0, %k1
1314 ; AVX512-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
1315 ; AVX512-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}
1316 ; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)
1317 ; AVX512-NEXT:    retq
1318   %t = call {<8 x i16>, <8 x i1>} @llvm.ssub.with.overflow.v8i16(<8 x i16> %a0, <8 x i16> %a1)
1319   %val = extractvalue {<8 x i16>, <8 x i1>} %t, 0
1320   %obit = extractvalue {<8 x i16>, <8 x i1>} %t, 1
1321   %res = sext <8 x i1> %obit to <8 x i32>
1322   store <8 x i16> %val, <8 x i16>* %p2
1323   ret <8 x i32> %res
1326 define <2 x i32> @ssubo_v2i64(<2 x i64> %a0, <2 x i64> %a1, <2 x i64>* %p2) nounwind {
1327 ; SSE2-LABEL: ssubo_v2i64:
1328 ; SSE2:       # %bb.0:
1329 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1330 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1331 ; SSE2-NEXT:    psubq %xmm1, %xmm0
1332 ; SSE2-NEXT:    pxor %xmm2, %xmm1
1333 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1334 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
1335 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1336 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm1
1337 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1338 ; SSE2-NEXT:    pand %xmm5, %xmm1
1339 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1340 ; SSE2-NEXT:    por %xmm1, %xmm4
1341 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm5
1342 ; SSE2-NEXT:    pxor %xmm5, %xmm4
1343 ; SSE2-NEXT:    pxor %xmm2, %xmm3
1344 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1345 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm1
1346 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
1347 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
1348 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1349 ; SSE2-NEXT:    pand %xmm6, %xmm3
1350 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
1351 ; SSE2-NEXT:    por %xmm3, %xmm6
1352 ; SSE2-NEXT:    pxor %xmm5, %xmm6
1353 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm4
1354 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,0,3,2]
1355 ; SSE2-NEXT:    pand %xmm4, %xmm1
1356 ; SSE2-NEXT:    movdqa %xmm0, (%rdi)
1357 ; SSE2-NEXT:    pxor %xmm2, %xmm0
1358 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
1359 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
1360 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1361 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm0
1362 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1363 ; SSE2-NEXT:    pand %xmm4, %xmm0
1364 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1365 ; SSE2-NEXT:    por %xmm0, %xmm2
1366 ; SSE2-NEXT:    pxor %xmm5, %xmm2
1367 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm2
1368 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,0,3,2]
1369 ; SSE2-NEXT:    pand %xmm2, %xmm0
1370 ; SSE2-NEXT:    pxor %xmm5, %xmm0
1371 ; SSE2-NEXT:    pandn %xmm0, %xmm1
1372 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1373 ; SSE2-NEXT:    retq
1375 ; SSSE3-LABEL: ssubo_v2i64:
1376 ; SSSE3:       # %bb.0:
1377 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1378 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
1379 ; SSSE3-NEXT:    psubq %xmm1, %xmm0
1380 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
1381 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
1382 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
1383 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1384 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm1
1385 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1386 ; SSSE3-NEXT:    pand %xmm5, %xmm1
1387 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1388 ; SSSE3-NEXT:    por %xmm1, %xmm4
1389 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm5
1390 ; SSSE3-NEXT:    pxor %xmm5, %xmm4
1391 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
1392 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1393 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm1
1394 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
1395 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm3
1396 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1397 ; SSSE3-NEXT:    pand %xmm6, %xmm3
1398 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
1399 ; SSSE3-NEXT:    por %xmm3, %xmm6
1400 ; SSSE3-NEXT:    pxor %xmm5, %xmm6
1401 ; SSSE3-NEXT:    pcmpeqd %xmm6, %xmm4
1402 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,0,3,2]
1403 ; SSSE3-NEXT:    pand %xmm4, %xmm1
1404 ; SSSE3-NEXT:    movdqa %xmm0, (%rdi)
1405 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
1406 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
1407 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm3
1408 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1409 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm0
1410 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1411 ; SSSE3-NEXT:    pand %xmm4, %xmm0
1412 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1413 ; SSSE3-NEXT:    por %xmm0, %xmm2
1414 ; SSSE3-NEXT:    pxor %xmm5, %xmm2
1415 ; SSSE3-NEXT:    pcmpeqd %xmm6, %xmm2
1416 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,0,3,2]
1417 ; SSSE3-NEXT:    pand %xmm2, %xmm0
1418 ; SSSE3-NEXT:    pxor %xmm5, %xmm0
1419 ; SSSE3-NEXT:    pandn %xmm0, %xmm1
1420 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1421 ; SSSE3-NEXT:    retq
1423 ; SSE41-LABEL: ssubo_v2i64:
1424 ; SSE41:       # %bb.0:
1425 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1426 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
1427 ; SSE41-NEXT:    psubq %xmm1, %xmm0
1428 ; SSE41-NEXT:    pxor %xmm2, %xmm1
1429 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
1430 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm4
1431 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1432 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm1
1433 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
1434 ; SSE41-NEXT:    pand %xmm5, %xmm6
1435 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
1436 ; SSE41-NEXT:    por %xmm6, %xmm1
1437 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm4
1438 ; SSE41-NEXT:    pxor %xmm4, %xmm1
1439 ; SSE41-NEXT:    pxor %xmm2, %xmm3
1440 ; SSE41-NEXT:    movdqa %xmm2, %xmm5
1441 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm5
1442 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1443 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm3
1444 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1445 ; SSE41-NEXT:    pand %xmm6, %xmm3
1446 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1447 ; SSE41-NEXT:    por %xmm3, %xmm5
1448 ; SSE41-NEXT:    pxor %xmm4, %xmm5
1449 ; SSE41-NEXT:    pcmpeqq %xmm5, %xmm1
1450 ; SSE41-NEXT:    movdqa %xmm0, (%rdi)
1451 ; SSE41-NEXT:    pxor %xmm2, %xmm0
1452 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
1453 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
1454 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
1455 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm0
1456 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1457 ; SSE41-NEXT:    pand %xmm6, %xmm0
1458 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1459 ; SSE41-NEXT:    por %xmm0, %xmm2
1460 ; SSE41-NEXT:    pxor %xmm4, %xmm2
1461 ; SSE41-NEXT:    pcmpeqq %xmm5, %xmm2
1462 ; SSE41-NEXT:    pxor %xmm4, %xmm2
1463 ; SSE41-NEXT:    pandn %xmm2, %xmm1
1464 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1465 ; SSE41-NEXT:    retq
1467 ; AVX1-LABEL: ssubo_v2i64:
1468 ; AVX1:       # %bb.0:
1469 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1470 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm3
1471 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
1472 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
1473 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm5
1474 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm5
1475 ; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm5, %xmm3
1476 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm1
1477 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm0
1478 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
1479 ; AVX1-NEXT:    vpcmpeqq %xmm0, %xmm5, %xmm0
1480 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
1481 ; AVX1-NEXT:    vpandn %xmm0, %xmm3, %xmm0
1482 ; AVX1-NEXT:    vmovdqa %xmm1, (%rdi)
1483 ; AVX1-NEXT:    retq
1485 ; AVX2-LABEL: ssubo_v2i64:
1486 ; AVX2:       # %bb.0:
1487 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1488 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm3
1489 ; AVX2-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
1490 ; AVX2-NEXT:    vpxor %xmm4, %xmm3, %xmm3
1491 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm5
1492 ; AVX2-NEXT:    vpxor %xmm4, %xmm5, %xmm5
1493 ; AVX2-NEXT:    vpcmpeqq %xmm3, %xmm5, %xmm3
1494 ; AVX2-NEXT:    vpsubq %xmm1, %xmm0, %xmm1
1495 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm0
1496 ; AVX2-NEXT:    vpxor %xmm4, %xmm0, %xmm0
1497 ; AVX2-NEXT:    vpcmpeqq %xmm0, %xmm5, %xmm0
1498 ; AVX2-NEXT:    vpxor %xmm4, %xmm0, %xmm0
1499 ; AVX2-NEXT:    vpandn %xmm0, %xmm3, %xmm0
1500 ; AVX2-NEXT:    vmovdqa %xmm1, (%rdi)
1501 ; AVX2-NEXT:    retq
1503 ; AVX512-LABEL: ssubo_v2i64:
1504 ; AVX512:       # %bb.0:
1505 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1506 ; AVX512-NEXT:    vpcmpnltq %xmm2, %xmm1, %k0
1507 ; AVX512-NEXT:    vpcmpnltq %xmm2, %xmm0, %k1
1508 ; AVX512-NEXT:    kxorw %k0, %k1, %k0
1509 ; AVX512-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
1510 ; AVX512-NEXT:    vpcmpnltq %xmm2, %xmm0, %k2
1511 ; AVX512-NEXT:    kxorw %k2, %k1, %k1
1512 ; AVX512-NEXT:    kandw %k1, %k0, %k1
1513 ; AVX512-NEXT:    vmovdqa %xmm0, (%rdi)
1514 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
1515 ; AVX512-NEXT:    vmovdqa64 %xmm0, %xmm0 {%k1} {z}
1516 ; AVX512-NEXT:    retq
1517   %t = call {<2 x i64>, <2 x i1>} @llvm.ssub.with.overflow.v2i64(<2 x i64> %a0, <2 x i64> %a1)
1518   %val = extractvalue {<2 x i64>, <2 x i1>} %t, 0
1519   %obit = extractvalue {<2 x i64>, <2 x i1>} %t, 1
1520   %res = sext <2 x i1> %obit to <2 x i32>
1521   store <2 x i64> %val, <2 x i64>* %p2
1522   ret <2 x i32> %res
1525 define <4 x i32> @ssubo_v4i24(<4 x i24> %a0, <4 x i24> %a1, <4 x i24>* %p2) nounwind {
1526 ; SSE2-LABEL: ssubo_v4i24:
1527 ; SSE2:       # %bb.0:
1528 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1529 ; SSE2-NEXT:    pslld $8, %xmm1
1530 ; SSE2-NEXT:    psrad $8, %xmm1
1531 ; SSE2-NEXT:    pslld $8, %xmm2
1532 ; SSE2-NEXT:    psrad $8, %xmm2
1533 ; SSE2-NEXT:    psubd %xmm1, %xmm2
1534 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1535 ; SSE2-NEXT:    pslld $8, %xmm0
1536 ; SSE2-NEXT:    psrad $8, %xmm0
1537 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm0
1538 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
1539 ; SSE2-NEXT:    pxor %xmm1, %xmm0
1540 ; SSE2-NEXT:    movd %xmm2, %eax
1541 ; SSE2-NEXT:    movw %ax, (%rdi)
1542 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[3,1,2,3]
1543 ; SSE2-NEXT:    movd %xmm1, %ecx
1544 ; SSE2-NEXT:    movw %cx, 9(%rdi)
1545 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
1546 ; SSE2-NEXT:    movd %xmm1, %edx
1547 ; SSE2-NEXT:    movw %dx, 6(%rdi)
1548 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,2,3]
1549 ; SSE2-NEXT:    movd %xmm1, %esi
1550 ; SSE2-NEXT:    movw %si, 3(%rdi)
1551 ; SSE2-NEXT:    shrl $16, %eax
1552 ; SSE2-NEXT:    movb %al, 2(%rdi)
1553 ; SSE2-NEXT:    shrl $16, %ecx
1554 ; SSE2-NEXT:    movb %cl, 11(%rdi)
1555 ; SSE2-NEXT:    shrl $16, %edx
1556 ; SSE2-NEXT:    movb %dl, 8(%rdi)
1557 ; SSE2-NEXT:    shrl $16, %esi
1558 ; SSE2-NEXT:    movb %sil, 5(%rdi)
1559 ; SSE2-NEXT:    retq
1561 ; SSSE3-LABEL: ssubo_v4i24:
1562 ; SSSE3:       # %bb.0:
1563 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
1564 ; SSSE3-NEXT:    pslld $8, %xmm1
1565 ; SSSE3-NEXT:    psrad $8, %xmm1
1566 ; SSSE3-NEXT:    pslld $8, %xmm2
1567 ; SSSE3-NEXT:    psrad $8, %xmm2
1568 ; SSSE3-NEXT:    psubd %xmm1, %xmm2
1569 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
1570 ; SSSE3-NEXT:    pslld $8, %xmm0
1571 ; SSSE3-NEXT:    psrad $8, %xmm0
1572 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm0
1573 ; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm1
1574 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
1575 ; SSSE3-NEXT:    movd %xmm2, %eax
1576 ; SSSE3-NEXT:    movw %ax, (%rdi)
1577 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[3,1,2,3]
1578 ; SSSE3-NEXT:    movd %xmm1, %ecx
1579 ; SSSE3-NEXT:    movw %cx, 9(%rdi)
1580 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1]
1581 ; SSSE3-NEXT:    movd %xmm1, %edx
1582 ; SSSE3-NEXT:    movw %dx, 6(%rdi)
1583 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,2,3]
1584 ; SSSE3-NEXT:    movd %xmm1, %esi
1585 ; SSSE3-NEXT:    movw %si, 3(%rdi)
1586 ; SSSE3-NEXT:    shrl $16, %eax
1587 ; SSSE3-NEXT:    movb %al, 2(%rdi)
1588 ; SSSE3-NEXT:    shrl $16, %ecx
1589 ; SSSE3-NEXT:    movb %cl, 11(%rdi)
1590 ; SSSE3-NEXT:    shrl $16, %edx
1591 ; SSSE3-NEXT:    movb %dl, 8(%rdi)
1592 ; SSSE3-NEXT:    shrl $16, %esi
1593 ; SSSE3-NEXT:    movb %sil, 5(%rdi)
1594 ; SSSE3-NEXT:    retq
1596 ; SSE41-LABEL: ssubo_v4i24:
1597 ; SSE41:       # %bb.0:
1598 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1599 ; SSE41-NEXT:    pslld $8, %xmm1
1600 ; SSE41-NEXT:    psrad $8, %xmm1
1601 ; SSE41-NEXT:    pslld $8, %xmm2
1602 ; SSE41-NEXT:    psrad $8, %xmm2
1603 ; SSE41-NEXT:    psubd %xmm1, %xmm2
1604 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1605 ; SSE41-NEXT:    pslld $8, %xmm0
1606 ; SSE41-NEXT:    psrad $8, %xmm0
1607 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm0
1608 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
1609 ; SSE41-NEXT:    pxor %xmm1, %xmm0
1610 ; SSE41-NEXT:    pextrd $3, %xmm2, %eax
1611 ; SSE41-NEXT:    movw %ax, 9(%rdi)
1612 ; SSE41-NEXT:    pextrd $2, %xmm2, %ecx
1613 ; SSE41-NEXT:    movw %cx, 6(%rdi)
1614 ; SSE41-NEXT:    pextrd $1, %xmm2, %edx
1615 ; SSE41-NEXT:    movw %dx, 3(%rdi)
1616 ; SSE41-NEXT:    movd %xmm2, %esi
1617 ; SSE41-NEXT:    movw %si, (%rdi)
1618 ; SSE41-NEXT:    shrl $16, %eax
1619 ; SSE41-NEXT:    movb %al, 11(%rdi)
1620 ; SSE41-NEXT:    shrl $16, %ecx
1621 ; SSE41-NEXT:    movb %cl, 8(%rdi)
1622 ; SSE41-NEXT:    shrl $16, %edx
1623 ; SSE41-NEXT:    movb %dl, 5(%rdi)
1624 ; SSE41-NEXT:    shrl $16, %esi
1625 ; SSE41-NEXT:    movb %sil, 2(%rdi)
1626 ; SSE41-NEXT:    retq
1628 ; AVX1-LABEL: ssubo_v4i24:
1629 ; AVX1:       # %bb.0:
1630 ; AVX1-NEXT:    vpslld $8, %xmm1, %xmm1
1631 ; AVX1-NEXT:    vpsrad $8, %xmm1, %xmm1
1632 ; AVX1-NEXT:    vpslld $8, %xmm0, %xmm0
1633 ; AVX1-NEXT:    vpsrad $8, %xmm0, %xmm0
1634 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
1635 ; AVX1-NEXT:    vpslld $8, %xmm1, %xmm0
1636 ; AVX1-NEXT:    vpsrad $8, %xmm0, %xmm0
1637 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
1638 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1639 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
1640 ; AVX1-NEXT:    vpextrd $3, %xmm1, %eax
1641 ; AVX1-NEXT:    movw %ax, 9(%rdi)
1642 ; AVX1-NEXT:    vpextrd $2, %xmm1, %ecx
1643 ; AVX1-NEXT:    movw %cx, 6(%rdi)
1644 ; AVX1-NEXT:    vpextrd $1, %xmm1, %edx
1645 ; AVX1-NEXT:    movw %dx, 3(%rdi)
1646 ; AVX1-NEXT:    vmovd %xmm1, %esi
1647 ; AVX1-NEXT:    movw %si, (%rdi)
1648 ; AVX1-NEXT:    shrl $16, %eax
1649 ; AVX1-NEXT:    movb %al, 11(%rdi)
1650 ; AVX1-NEXT:    shrl $16, %ecx
1651 ; AVX1-NEXT:    movb %cl, 8(%rdi)
1652 ; AVX1-NEXT:    shrl $16, %edx
1653 ; AVX1-NEXT:    movb %dl, 5(%rdi)
1654 ; AVX1-NEXT:    shrl $16, %esi
1655 ; AVX1-NEXT:    movb %sil, 2(%rdi)
1656 ; AVX1-NEXT:    retq
1658 ; AVX2-LABEL: ssubo_v4i24:
1659 ; AVX2:       # %bb.0:
1660 ; AVX2-NEXT:    vpslld $8, %xmm1, %xmm1
1661 ; AVX2-NEXT:    vpsrad $8, %xmm1, %xmm1
1662 ; AVX2-NEXT:    vpslld $8, %xmm0, %xmm0
1663 ; AVX2-NEXT:    vpsrad $8, %xmm0, %xmm0
1664 ; AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
1665 ; AVX2-NEXT:    vpslld $8, %xmm1, %xmm0
1666 ; AVX2-NEXT:    vpsrad $8, %xmm0, %xmm0
1667 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
1668 ; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1669 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
1670 ; AVX2-NEXT:    vpextrd $3, %xmm1, %eax
1671 ; AVX2-NEXT:    movw %ax, 9(%rdi)
1672 ; AVX2-NEXT:    vpextrd $2, %xmm1, %ecx
1673 ; AVX2-NEXT:    movw %cx, 6(%rdi)
1674 ; AVX2-NEXT:    vpextrd $1, %xmm1, %edx
1675 ; AVX2-NEXT:    movw %dx, 3(%rdi)
1676 ; AVX2-NEXT:    vmovd %xmm1, %esi
1677 ; AVX2-NEXT:    movw %si, (%rdi)
1678 ; AVX2-NEXT:    shrl $16, %eax
1679 ; AVX2-NEXT:    movb %al, 11(%rdi)
1680 ; AVX2-NEXT:    shrl $16, %ecx
1681 ; AVX2-NEXT:    movb %cl, 8(%rdi)
1682 ; AVX2-NEXT:    shrl $16, %edx
1683 ; AVX2-NEXT:    movb %dl, 5(%rdi)
1684 ; AVX2-NEXT:    shrl $16, %esi
1685 ; AVX2-NEXT:    movb %sil, 2(%rdi)
1686 ; AVX2-NEXT:    retq
1688 ; AVX512-LABEL: ssubo_v4i24:
1689 ; AVX512:       # %bb.0:
1690 ; AVX512-NEXT:    vpslld $8, %xmm1, %xmm1
1691 ; AVX512-NEXT:    vpsrad $8, %xmm1, %xmm1
1692 ; AVX512-NEXT:    vpslld $8, %xmm0, %xmm0
1693 ; AVX512-NEXT:    vpsrad $8, %xmm0, %xmm0
1694 ; AVX512-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
1695 ; AVX512-NEXT:    vpslld $8, %xmm1, %xmm0
1696 ; AVX512-NEXT:    vpsrad $8, %xmm0, %xmm0
1697 ; AVX512-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
1698 ; AVX512-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
1699 ; AVX512-NEXT:    vpextrd $3, %xmm1, %eax
1700 ; AVX512-NEXT:    movw %ax, 9(%rdi)
1701 ; AVX512-NEXT:    vpextrd $2, %xmm1, %ecx
1702 ; AVX512-NEXT:    movw %cx, 6(%rdi)
1703 ; AVX512-NEXT:    vpextrd $1, %xmm1, %edx
1704 ; AVX512-NEXT:    movw %dx, 3(%rdi)
1705 ; AVX512-NEXT:    vmovd %xmm1, %esi
1706 ; AVX512-NEXT:    movw %si, (%rdi)
1707 ; AVX512-NEXT:    shrl $16, %eax
1708 ; AVX512-NEXT:    movb %al, 11(%rdi)
1709 ; AVX512-NEXT:    shrl $16, %ecx
1710 ; AVX512-NEXT:    movb %cl, 8(%rdi)
1711 ; AVX512-NEXT:    shrl $16, %edx
1712 ; AVX512-NEXT:    movb %dl, 5(%rdi)
1713 ; AVX512-NEXT:    shrl $16, %esi
1714 ; AVX512-NEXT:    movb %sil, 2(%rdi)
1715 ; AVX512-NEXT:    retq
1716   %t = call {<4 x i24>, <4 x i1>} @llvm.ssub.with.overflow.v4i24(<4 x i24> %a0, <4 x i24> %a1)
1717   %val = extractvalue {<4 x i24>, <4 x i1>} %t, 0
1718   %obit = extractvalue {<4 x i24>, <4 x i1>} %t, 1
1719   %res = sext <4 x i1> %obit to <4 x i32>
1720   store <4 x i24> %val, <4 x i24>* %p2
1721   ret <4 x i32> %res
1724 define <4 x i32> @ssubo_v4i1(<4 x i1> %a0, <4 x i1> %a1, <4 x i1>* %p2) nounwind {
1725 ; SSE-LABEL: ssubo_v4i1:
1726 ; SSE:       # %bb.0:
1727 ; SSE-NEXT:    pslld $31, %xmm1
1728 ; SSE-NEXT:    psrad $31, %xmm1
1729 ; SSE-NEXT:    pslld $31, %xmm0
1730 ; SSE-NEXT:    psrad $31, %xmm0
1731 ; SSE-NEXT:    psubd %xmm1, %xmm0
1732 ; SSE-NEXT:    movdqa %xmm0, %xmm1
1733 ; SSE-NEXT:    pslld $31, %xmm1
1734 ; SSE-NEXT:    psrad $31, %xmm1
1735 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm0
1736 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm2
1737 ; SSE-NEXT:    pxor %xmm2, %xmm0
1738 ; SSE-NEXT:    movmskps %xmm1, %eax
1739 ; SSE-NEXT:    movb %al, (%rdi)
1740 ; SSE-NEXT:    retq
1742 ; AVX1-LABEL: ssubo_v4i1:
1743 ; AVX1:       # %bb.0:
1744 ; AVX1-NEXT:    vpslld $31, %xmm1, %xmm1
1745 ; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm1
1746 ; AVX1-NEXT:    vpslld $31, %xmm0, %xmm0
1747 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm0
1748 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
1749 ; AVX1-NEXT:    vpslld $31, %xmm0, %xmm1
1750 ; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm1
1751 ; AVX1-NEXT:    vpcmpeqd %xmm0, %xmm1, %xmm0
1752 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1753 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
1754 ; AVX1-NEXT:    vmovmskps %xmm1, %eax
1755 ; AVX1-NEXT:    movb %al, (%rdi)
1756 ; AVX1-NEXT:    retq
1758 ; AVX2-LABEL: ssubo_v4i1:
1759 ; AVX2:       # %bb.0:
1760 ; AVX2-NEXT:    vpslld $31, %xmm1, %xmm1
1761 ; AVX2-NEXT:    vpsrad $31, %xmm1, %xmm1
1762 ; AVX2-NEXT:    vpslld $31, %xmm0, %xmm0
1763 ; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm0
1764 ; AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
1765 ; AVX2-NEXT:    vpslld $31, %xmm0, %xmm1
1766 ; AVX2-NEXT:    vpsrad $31, %xmm1, %xmm1
1767 ; AVX2-NEXT:    vpcmpeqd %xmm0, %xmm1, %xmm0
1768 ; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1769 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
1770 ; AVX2-NEXT:    vmovmskps %xmm1, %eax
1771 ; AVX2-NEXT:    movb %al, (%rdi)
1772 ; AVX2-NEXT:    retq
1774 ; AVX512-LABEL: ssubo_v4i1:
1775 ; AVX512:       # %bb.0:
1776 ; AVX512-NEXT:    vpslld $31, %xmm0, %xmm0
1777 ; AVX512-NEXT:    vptestmd %xmm0, %xmm0, %k0
1778 ; AVX512-NEXT:    vptestnmd %xmm0, %xmm0, %k1
1779 ; AVX512-NEXT:    vpslld $31, %xmm1, %xmm0
1780 ; AVX512-NEXT:    vptestmd %xmm0, %xmm0, %k2
1781 ; AVX512-NEXT:    kxorw %k2, %k1, %k3
1782 ; AVX512-NEXT:    kxorw %k2, %k0, %k0
1783 ; AVX512-NEXT:    kxnorw %k0, %k1, %k1
1784 ; AVX512-NEXT:    kandnw %k1, %k3, %k1
1785 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
1786 ; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
1787 ; AVX512-NEXT:    kmovd %k0, %eax
1788 ; AVX512-NEXT:    movb %al, (%rdi)
1789 ; AVX512-NEXT:    retq
1790   %t = call {<4 x i1>, <4 x i1>} @llvm.ssub.with.overflow.v4i1(<4 x i1> %a0, <4 x i1> %a1)
1791   %val = extractvalue {<4 x i1>, <4 x i1>} %t, 0
1792   %obit = extractvalue {<4 x i1>, <4 x i1>} %t, 1
1793   %res = sext <4 x i1> %obit to <4 x i32>
1794   store <4 x i1> %val, <4 x i1>* %p2
1795   ret <4 x i32> %res
1798 define <2 x i32> @ssubo_v2i128(<2 x i128> %a0, <2 x i128> %a1, <2 x i128>* %p2) nounwind {
1799 ; SSE2-LABEL: ssubo_v2i128:
1800 ; SSE2:       # %bb.0:
1801 ; SSE2-NEXT:    pushq %rbp
1802 ; SSE2-NEXT:    pushq %rbx
1803 ; SSE2-NEXT:    movq {{[0-9]+}}(%rsp), %r10
1804 ; SSE2-NEXT:    movq {{[0-9]+}}(%rsp), %r11
1805 ; SSE2-NEXT:    subq {{[0-9]+}}(%rsp), %rdx
1806 ; SSE2-NEXT:    movq %rcx, %rax
1807 ; SSE2-NEXT:    sbbq %r11, %rax
1808 ; SSE2-NEXT:    setns %bl
1809 ; SSE2-NEXT:    testq %rcx, %rcx
1810 ; SSE2-NEXT:    setns %cl
1811 ; SSE2-NEXT:    cmpb %bl, %cl
1812 ; SSE2-NEXT:    setne %bpl
1813 ; SSE2-NEXT:    testq %r11, %r11
1814 ; SSE2-NEXT:    setns %bl
1815 ; SSE2-NEXT:    cmpb %bl, %cl
1816 ; SSE2-NEXT:    setne %cl
1817 ; SSE2-NEXT:    andb %bpl, %cl
1818 ; SSE2-NEXT:    movzbl %cl, %ebp
1819 ; SSE2-NEXT:    testq %r9, %r9
1820 ; SSE2-NEXT:    setns %bl
1821 ; SSE2-NEXT:    testq %rsi, %rsi
1822 ; SSE2-NEXT:    setns %cl
1823 ; SSE2-NEXT:    cmpb %bl, %cl
1824 ; SSE2-NEXT:    setne %r11b
1825 ; SSE2-NEXT:    subq %r8, %rdi
1826 ; SSE2-NEXT:    sbbq %r9, %rsi
1827 ; SSE2-NEXT:    setns %bl
1828 ; SSE2-NEXT:    cmpb %bl, %cl
1829 ; SSE2-NEXT:    setne %cl
1830 ; SSE2-NEXT:    andb %r11b, %cl
1831 ; SSE2-NEXT:    movzbl %cl, %ecx
1832 ; SSE2-NEXT:    movd %ecx, %xmm0
1833 ; SSE2-NEXT:    pinsrw $4, %ebp, %xmm0
1834 ; SSE2-NEXT:    movq %rdx, 16(%r10)
1835 ; SSE2-NEXT:    movq %rdi, (%r10)
1836 ; SSE2-NEXT:    movq %rax, 24(%r10)
1837 ; SSE2-NEXT:    movq %rsi, 8(%r10)
1838 ; SSE2-NEXT:    psllq $63, %xmm0
1839 ; SSE2-NEXT:    psrad $31, %xmm0
1840 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1841 ; SSE2-NEXT:    popq %rbx
1842 ; SSE2-NEXT:    popq %rbp
1843 ; SSE2-NEXT:    retq
1845 ; SSSE3-LABEL: ssubo_v2i128:
1846 ; SSSE3:       # %bb.0:
1847 ; SSSE3-NEXT:    pushq %rbp
1848 ; SSSE3-NEXT:    pushq %rbx
1849 ; SSSE3-NEXT:    movq {{[0-9]+}}(%rsp), %r10
1850 ; SSSE3-NEXT:    movq {{[0-9]+}}(%rsp), %r11
1851 ; SSSE3-NEXT:    subq {{[0-9]+}}(%rsp), %rdx
1852 ; SSSE3-NEXT:    movq %rcx, %rax
1853 ; SSSE3-NEXT:    sbbq %r11, %rax
1854 ; SSSE3-NEXT:    setns %bl
1855 ; SSSE3-NEXT:    testq %rcx, %rcx
1856 ; SSSE3-NEXT:    setns %cl
1857 ; SSSE3-NEXT:    cmpb %bl, %cl
1858 ; SSSE3-NEXT:    setne %bpl
1859 ; SSSE3-NEXT:    testq %r11, %r11
1860 ; SSSE3-NEXT:    setns %bl
1861 ; SSSE3-NEXT:    cmpb %bl, %cl
1862 ; SSSE3-NEXT:    setne %cl
1863 ; SSSE3-NEXT:    andb %bpl, %cl
1864 ; SSSE3-NEXT:    movzbl %cl, %ebp
1865 ; SSSE3-NEXT:    testq %r9, %r9
1866 ; SSSE3-NEXT:    setns %bl
1867 ; SSSE3-NEXT:    testq %rsi, %rsi
1868 ; SSSE3-NEXT:    setns %cl
1869 ; SSSE3-NEXT:    cmpb %bl, %cl
1870 ; SSSE3-NEXT:    setne %r11b
1871 ; SSSE3-NEXT:    subq %r8, %rdi
1872 ; SSSE3-NEXT:    sbbq %r9, %rsi
1873 ; SSSE3-NEXT:    setns %bl
1874 ; SSSE3-NEXT:    cmpb %bl, %cl
1875 ; SSSE3-NEXT:    setne %cl
1876 ; SSSE3-NEXT:    andb %r11b, %cl
1877 ; SSSE3-NEXT:    movzbl %cl, %ecx
1878 ; SSSE3-NEXT:    movd %ecx, %xmm0
1879 ; SSSE3-NEXT:    pinsrw $4, %ebp, %xmm0
1880 ; SSSE3-NEXT:    movq %rdx, 16(%r10)
1881 ; SSSE3-NEXT:    movq %rdi, (%r10)
1882 ; SSSE3-NEXT:    movq %rax, 24(%r10)
1883 ; SSSE3-NEXT:    movq %rsi, 8(%r10)
1884 ; SSSE3-NEXT:    psllq $63, %xmm0
1885 ; SSSE3-NEXT:    psrad $31, %xmm0
1886 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1887 ; SSSE3-NEXT:    popq %rbx
1888 ; SSSE3-NEXT:    popq %rbp
1889 ; SSSE3-NEXT:    retq
1891 ; SSE41-LABEL: ssubo_v2i128:
1892 ; SSE41:       # %bb.0:
1893 ; SSE41-NEXT:    pushq %rbp
1894 ; SSE41-NEXT:    pushq %rbx
1895 ; SSE41-NEXT:    movq {{[0-9]+}}(%rsp), %r10
1896 ; SSE41-NEXT:    movq {{[0-9]+}}(%rsp), %r11
1897 ; SSE41-NEXT:    subq {{[0-9]+}}(%rsp), %rdx
1898 ; SSE41-NEXT:    movq %rcx, %rax
1899 ; SSE41-NEXT:    sbbq %r11, %rax
1900 ; SSE41-NEXT:    setns %bl
1901 ; SSE41-NEXT:    testq %rcx, %rcx
1902 ; SSE41-NEXT:    setns %cl
1903 ; SSE41-NEXT:    cmpb %bl, %cl
1904 ; SSE41-NEXT:    setne %bpl
1905 ; SSE41-NEXT:    testq %r11, %r11
1906 ; SSE41-NEXT:    setns %bl
1907 ; SSE41-NEXT:    cmpb %bl, %cl
1908 ; SSE41-NEXT:    setne %cl
1909 ; SSE41-NEXT:    andb %bpl, %cl
1910 ; SSE41-NEXT:    movzbl %cl, %ebp
1911 ; SSE41-NEXT:    testq %r9, %r9
1912 ; SSE41-NEXT:    setns %bl
1913 ; SSE41-NEXT:    testq %rsi, %rsi
1914 ; SSE41-NEXT:    setns %cl
1915 ; SSE41-NEXT:    cmpb %bl, %cl
1916 ; SSE41-NEXT:    setne %r11b
1917 ; SSE41-NEXT:    subq %r8, %rdi
1918 ; SSE41-NEXT:    sbbq %r9, %rsi
1919 ; SSE41-NEXT:    setns %bl
1920 ; SSE41-NEXT:    cmpb %bl, %cl
1921 ; SSE41-NEXT:    setne %cl
1922 ; SSE41-NEXT:    andb %r11b, %cl
1923 ; SSE41-NEXT:    movzbl %cl, %ecx
1924 ; SSE41-NEXT:    movd %ecx, %xmm0
1925 ; SSE41-NEXT:    pinsrb $8, %ebp, %xmm0
1926 ; SSE41-NEXT:    movq %rdx, 16(%r10)
1927 ; SSE41-NEXT:    movq %rdi, (%r10)
1928 ; SSE41-NEXT:    movq %rax, 24(%r10)
1929 ; SSE41-NEXT:    movq %rsi, 8(%r10)
1930 ; SSE41-NEXT:    psllq $63, %xmm0
1931 ; SSE41-NEXT:    psrad $31, %xmm0
1932 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1933 ; SSE41-NEXT:    popq %rbx
1934 ; SSE41-NEXT:    popq %rbp
1935 ; SSE41-NEXT:    retq
1937 ; AVX1-LABEL: ssubo_v2i128:
1938 ; AVX1:       # %bb.0:
1939 ; AVX1-NEXT:    pushq %rbp
1940 ; AVX1-NEXT:    pushq %rbx
1941 ; AVX1-NEXT:    movq {{[0-9]+}}(%rsp), %r10
1942 ; AVX1-NEXT:    movq {{[0-9]+}}(%rsp), %r11
1943 ; AVX1-NEXT:    subq {{[0-9]+}}(%rsp), %rdx
1944 ; AVX1-NEXT:    movq %rcx, %rax
1945 ; AVX1-NEXT:    sbbq %r11, %rax
1946 ; AVX1-NEXT:    setns %bl
1947 ; AVX1-NEXT:    testq %rcx, %rcx
1948 ; AVX1-NEXT:    setns %cl
1949 ; AVX1-NEXT:    cmpb %bl, %cl
1950 ; AVX1-NEXT:    setne %bpl
1951 ; AVX1-NEXT:    testq %r11, %r11
1952 ; AVX1-NEXT:    setns %bl
1953 ; AVX1-NEXT:    cmpb %bl, %cl
1954 ; AVX1-NEXT:    setne %cl
1955 ; AVX1-NEXT:    andb %bpl, %cl
1956 ; AVX1-NEXT:    movzbl %cl, %ebp
1957 ; AVX1-NEXT:    testq %r9, %r9
1958 ; AVX1-NEXT:    setns %bl
1959 ; AVX1-NEXT:    testq %rsi, %rsi
1960 ; AVX1-NEXT:    setns %cl
1961 ; AVX1-NEXT:    cmpb %bl, %cl
1962 ; AVX1-NEXT:    setne %r11b
1963 ; AVX1-NEXT:    subq %r8, %rdi
1964 ; AVX1-NEXT:    sbbq %r9, %rsi
1965 ; AVX1-NEXT:    setns %bl
1966 ; AVX1-NEXT:    cmpb %bl, %cl
1967 ; AVX1-NEXT:    setne %cl
1968 ; AVX1-NEXT:    andb %r11b, %cl
1969 ; AVX1-NEXT:    movzbl %cl, %ecx
1970 ; AVX1-NEXT:    vmovd %ecx, %xmm0
1971 ; AVX1-NEXT:    vpinsrb $8, %ebp, %xmm0, %xmm0
1972 ; AVX1-NEXT:    movq %rdx, 16(%r10)
1973 ; AVX1-NEXT:    movq %rdi, (%r10)
1974 ; AVX1-NEXT:    movq %rax, 24(%r10)
1975 ; AVX1-NEXT:    movq %rsi, 8(%r10)
1976 ; AVX1-NEXT:    vpsllq $63, %xmm0, %xmm0
1977 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1978 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm0
1979 ; AVX1-NEXT:    popq %rbx
1980 ; AVX1-NEXT:    popq %rbp
1981 ; AVX1-NEXT:    retq
1983 ; AVX2-LABEL: ssubo_v2i128:
1984 ; AVX2:       # %bb.0:
1985 ; AVX2-NEXT:    pushq %rbp
1986 ; AVX2-NEXT:    pushq %rbx
1987 ; AVX2-NEXT:    movq {{[0-9]+}}(%rsp), %r10
1988 ; AVX2-NEXT:    movq {{[0-9]+}}(%rsp), %r11
1989 ; AVX2-NEXT:    subq {{[0-9]+}}(%rsp), %rdx
1990 ; AVX2-NEXT:    movq %rcx, %rax
1991 ; AVX2-NEXT:    sbbq %r11, %rax
1992 ; AVX2-NEXT:    setns %bl
1993 ; AVX2-NEXT:    testq %rcx, %rcx
1994 ; AVX2-NEXT:    setns %cl
1995 ; AVX2-NEXT:    cmpb %bl, %cl
1996 ; AVX2-NEXT:    setne %bpl
1997 ; AVX2-NEXT:    testq %r11, %r11
1998 ; AVX2-NEXT:    setns %bl
1999 ; AVX2-NEXT:    cmpb %bl, %cl
2000 ; AVX2-NEXT:    setne %cl
2001 ; AVX2-NEXT:    andb %bpl, %cl
2002 ; AVX2-NEXT:    movzbl %cl, %ebp
2003 ; AVX2-NEXT:    testq %r9, %r9
2004 ; AVX2-NEXT:    setns %bl
2005 ; AVX2-NEXT:    testq %rsi, %rsi
2006 ; AVX2-NEXT:    setns %cl
2007 ; AVX2-NEXT:    cmpb %bl, %cl
2008 ; AVX2-NEXT:    setne %r11b
2009 ; AVX2-NEXT:    subq %r8, %rdi
2010 ; AVX2-NEXT:    sbbq %r9, %rsi
2011 ; AVX2-NEXT:    setns %bl
2012 ; AVX2-NEXT:    cmpb %bl, %cl
2013 ; AVX2-NEXT:    setne %cl
2014 ; AVX2-NEXT:    andb %r11b, %cl
2015 ; AVX2-NEXT:    movzbl %cl, %ecx
2016 ; AVX2-NEXT:    vmovd %ecx, %xmm0
2017 ; AVX2-NEXT:    vpinsrb $8, %ebp, %xmm0, %xmm0
2018 ; AVX2-NEXT:    movq %rdx, 16(%r10)
2019 ; AVX2-NEXT:    movq %rdi, (%r10)
2020 ; AVX2-NEXT:    movq %rax, 24(%r10)
2021 ; AVX2-NEXT:    movq %rsi, 8(%r10)
2022 ; AVX2-NEXT:    vpsllq $63, %xmm0, %xmm0
2023 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2024 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm0
2025 ; AVX2-NEXT:    popq %rbx
2026 ; AVX2-NEXT:    popq %rbp
2027 ; AVX2-NEXT:    retq
2029 ; AVX512-LABEL: ssubo_v2i128:
2030 ; AVX512:       # %bb.0:
2031 ; AVX512-NEXT:    pushq %r14
2032 ; AVX512-NEXT:    pushq %rbx
2033 ; AVX512-NEXT:    movq {{[0-9]+}}(%rsp), %r10
2034 ; AVX512-NEXT:    movq {{[0-9]+}}(%rsp), %r11
2035 ; AVX512-NEXT:    subq {{[0-9]+}}(%rsp), %rdx
2036 ; AVX512-NEXT:    movq %rcx, %r14
2037 ; AVX512-NEXT:    sbbq %r11, %r14
2038 ; AVX512-NEXT:    setns %bl
2039 ; AVX512-NEXT:    testq %rcx, %rcx
2040 ; AVX512-NEXT:    setns %cl
2041 ; AVX512-NEXT:    cmpb %bl, %cl
2042 ; AVX512-NEXT:    setne %bl
2043 ; AVX512-NEXT:    testq %r11, %r11
2044 ; AVX512-NEXT:    setns %al
2045 ; AVX512-NEXT:    cmpb %al, %cl
2046 ; AVX512-NEXT:    setne %al
2047 ; AVX512-NEXT:    andb %bl, %al
2048 ; AVX512-NEXT:    movb %al, -{{[0-9]+}}(%rsp)
2049 ; AVX512-NEXT:    testq %r9, %r9
2050 ; AVX512-NEXT:    setns %al
2051 ; AVX512-NEXT:    testq %rsi, %rsi
2052 ; AVX512-NEXT:    setns %cl
2053 ; AVX512-NEXT:    cmpb %al, %cl
2054 ; AVX512-NEXT:    setne %al
2055 ; AVX512-NEXT:    subq %r8, %rdi
2056 ; AVX512-NEXT:    sbbq %r9, %rsi
2057 ; AVX512-NEXT:    setns %bl
2058 ; AVX512-NEXT:    cmpb %bl, %cl
2059 ; AVX512-NEXT:    setne %cl
2060 ; AVX512-NEXT:    andb %al, %cl
2061 ; AVX512-NEXT:    movb %cl, -{{[0-9]+}}(%rsp)
2062 ; AVX512-NEXT:    kmovw -{{[0-9]+}}(%rsp), %k1
2063 ; AVX512-NEXT:    movq %rdx, 16(%r10)
2064 ; AVX512-NEXT:    movq %rdi, (%r10)
2065 ; AVX512-NEXT:    movq %r14, 24(%r10)
2066 ; AVX512-NEXT:    movq %rsi, 8(%r10)
2067 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
2068 ; AVX512-NEXT:    vmovdqa64 %xmm0, %xmm0 {%k1} {z}
2069 ; AVX512-NEXT:    popq %rbx
2070 ; AVX512-NEXT:    popq %r14
2071 ; AVX512-NEXT:    retq
2072   %t = call {<2 x i128>, <2 x i1>} @llvm.ssub.with.overflow.v2i128(<2 x i128> %a0, <2 x i128> %a1)
2073   %val = extractvalue {<2 x i128>, <2 x i1>} %t, 0
2074   %obit = extractvalue {<2 x i128>, <2 x i1>} %t, 1
2075   %res = sext <2 x i1> %obit to <2 x i32>
2076   store <2 x i128> %val, <2 x i128>* %p2
2077   ret <2 x i32> %res