[x86] fix assert with horizontal math + broadcast of vector (PR43402)
[llvm-core.git] / test / CodeGen / X86 / ssub_sat_vec.ll
blobdd8d5465062069dcad6f93ca085427a56e868bc4
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 i8> @llvm.ssub.sat.v1i8(<1 x i8>, <1 x i8>)
10 declare <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8>, <2 x i8>)
11 declare <4 x i8> @llvm.ssub.sat.v4i8(<4 x i8>, <4 x i8>)
12 declare <8 x i8> @llvm.ssub.sat.v8i8(<8 x i8>, <8 x i8>)
13 declare <12 x i8> @llvm.ssub.sat.v12i8(<12 x i8>, <12 x i8>)
14 declare <16 x i8> @llvm.ssub.sat.v16i8(<16 x i8>, <16 x i8>)
15 declare <32 x i8> @llvm.ssub.sat.v32i8(<32 x i8>, <32 x i8>)
16 declare <64 x i8> @llvm.ssub.sat.v64i8(<64 x i8>, <64 x i8>)
18 declare <1 x i16> @llvm.ssub.sat.v1i16(<1 x i16>, <1 x i16>)
19 declare <2 x i16> @llvm.ssub.sat.v2i16(<2 x i16>, <2 x i16>)
20 declare <4 x i16> @llvm.ssub.sat.v4i16(<4 x i16>, <4 x i16>)
21 declare <8 x i16> @llvm.ssub.sat.v8i16(<8 x i16>, <8 x i16>)
22 declare <12 x i16> @llvm.ssub.sat.v12i16(<12 x i16>, <12 x i16>)
23 declare <16 x i16> @llvm.ssub.sat.v16i16(<16 x i16>, <16 x i16>)
24 declare <32 x i16> @llvm.ssub.sat.v32i16(<32 x i16>, <32 x i16>)
26 declare <16 x i1> @llvm.ssub.sat.v16i1(<16 x i1>, <16 x i1>)
27 declare <16 x i4> @llvm.ssub.sat.v16i4(<16 x i4>, <16 x i4>)
29 declare <2 x i32> @llvm.ssub.sat.v2i32(<2 x i32>, <2 x i32>)
30 declare <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32>, <4 x i32>)
31 declare <8 x i32> @llvm.ssub.sat.v8i32(<8 x i32>, <8 x i32>)
32 declare <16 x i32> @llvm.ssub.sat.v16i32(<16 x i32>, <16 x i32>)
33 declare <2 x i64> @llvm.ssub.sat.v2i64(<2 x i64>, <2 x i64>)
34 declare <4 x i64> @llvm.ssub.sat.v4i64(<4 x i64>, <4 x i64>)
35 declare <8 x i64> @llvm.ssub.sat.v8i64(<8 x i64>, <8 x i64>)
37 declare <4 x i24> @llvm.ssub.sat.v4i24(<4 x i24>, <4 x i24>)
38 declare <2 x i128> @llvm.ssub.sat.v2i128(<2 x i128>, <2 x i128>)
40 ; Legal types, depending on architecture.
42 define <16 x i8> @v16i8(<16 x i8> %x, <16 x i8> %y) nounwind {
43 ; SSE-LABEL: v16i8:
44 ; SSE:       # %bb.0:
45 ; SSE-NEXT:    psubsb %xmm1, %xmm0
46 ; SSE-NEXT:    retq
48 ; AVX-LABEL: v16i8:
49 ; AVX:       # %bb.0:
50 ; AVX-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
51 ; AVX-NEXT:    retq
52   %z = call <16 x i8> @llvm.ssub.sat.v16i8(<16 x i8> %x, <16 x i8> %y)
53   ret <16 x i8> %z
56 define <32 x i8> @v32i8(<32 x i8> %x, <32 x i8> %y) nounwind {
57 ; SSE-LABEL: v32i8:
58 ; SSE:       # %bb.0:
59 ; SSE-NEXT:    psubsb %xmm2, %xmm0
60 ; SSE-NEXT:    psubsb %xmm3, %xmm1
61 ; SSE-NEXT:    retq
63 ; AVX1-LABEL: v32i8:
64 ; AVX1:       # %bb.0:
65 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
66 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
67 ; AVX1-NEXT:    vpsubsb %xmm2, %xmm3, %xmm2
68 ; AVX1-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
69 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
70 ; AVX1-NEXT:    retq
72 ; AVX2-LABEL: v32i8:
73 ; AVX2:       # %bb.0:
74 ; AVX2-NEXT:    vpsubsb %ymm1, %ymm0, %ymm0
75 ; AVX2-NEXT:    retq
77 ; AVX512-LABEL: v32i8:
78 ; AVX512:       # %bb.0:
79 ; AVX512-NEXT:    vpsubsb %ymm1, %ymm0, %ymm0
80 ; AVX512-NEXT:    retq
81   %z = call <32 x i8> @llvm.ssub.sat.v32i8(<32 x i8> %x, <32 x i8> %y)
82   ret <32 x i8> %z
85 define <64 x i8> @v64i8(<64 x i8> %x, <64 x i8> %y) nounwind {
86 ; SSE-LABEL: v64i8:
87 ; SSE:       # %bb.0:
88 ; SSE-NEXT:    psubsb %xmm4, %xmm0
89 ; SSE-NEXT:    psubsb %xmm5, %xmm1
90 ; SSE-NEXT:    psubsb %xmm6, %xmm2
91 ; SSE-NEXT:    psubsb %xmm7, %xmm3
92 ; SSE-NEXT:    retq
94 ; AVX1-LABEL: v64i8:
95 ; AVX1:       # %bb.0:
96 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
97 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
98 ; AVX1-NEXT:    vpsubsb %xmm4, %xmm5, %xmm4
99 ; AVX1-NEXT:    vpsubsb %xmm2, %xmm0, %xmm0
100 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
101 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
102 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
103 ; AVX1-NEXT:    vpsubsb %xmm2, %xmm4, %xmm2
104 ; AVX1-NEXT:    vpsubsb %xmm3, %xmm1, %xmm1
105 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
106 ; AVX1-NEXT:    retq
108 ; AVX2-LABEL: v64i8:
109 ; AVX2:       # %bb.0:
110 ; AVX2-NEXT:    vpsubsb %ymm2, %ymm0, %ymm0
111 ; AVX2-NEXT:    vpsubsb %ymm3, %ymm1, %ymm1
112 ; AVX2-NEXT:    retq
114 ; AVX512-LABEL: v64i8:
115 ; AVX512:       # %bb.0:
116 ; AVX512-NEXT:    vpsubsb %zmm1, %zmm0, %zmm0
117 ; AVX512-NEXT:    retq
118   %z = call <64 x i8> @llvm.ssub.sat.v64i8(<64 x i8> %x, <64 x i8> %y)
119   ret <64 x i8> %z
122 define <8 x i16> @v8i16(<8 x i16> %x, <8 x i16> %y) nounwind {
123 ; SSE-LABEL: v8i16:
124 ; SSE:       # %bb.0:
125 ; SSE-NEXT:    psubsw %xmm1, %xmm0
126 ; SSE-NEXT:    retq
128 ; AVX-LABEL: v8i16:
129 ; AVX:       # %bb.0:
130 ; AVX-NEXT:    vpsubsw %xmm1, %xmm0, %xmm0
131 ; AVX-NEXT:    retq
132   %z = call <8 x i16> @llvm.ssub.sat.v8i16(<8 x i16> %x, <8 x i16> %y)
133   ret <8 x i16> %z
136 define <16 x i16> @v16i16(<16 x i16> %x, <16 x i16> %y) nounwind {
137 ; SSE-LABEL: v16i16:
138 ; SSE:       # %bb.0:
139 ; SSE-NEXT:    psubsw %xmm2, %xmm0
140 ; SSE-NEXT:    psubsw %xmm3, %xmm1
141 ; SSE-NEXT:    retq
143 ; AVX1-LABEL: v16i16:
144 ; AVX1:       # %bb.0:
145 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
146 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
147 ; AVX1-NEXT:    vpsubsw %xmm2, %xmm3, %xmm2
148 ; AVX1-NEXT:    vpsubsw %xmm1, %xmm0, %xmm0
149 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
150 ; AVX1-NEXT:    retq
152 ; AVX2-LABEL: v16i16:
153 ; AVX2:       # %bb.0:
154 ; AVX2-NEXT:    vpsubsw %ymm1, %ymm0, %ymm0
155 ; AVX2-NEXT:    retq
157 ; AVX512-LABEL: v16i16:
158 ; AVX512:       # %bb.0:
159 ; AVX512-NEXT:    vpsubsw %ymm1, %ymm0, %ymm0
160 ; AVX512-NEXT:    retq
161   %z = call <16 x i16> @llvm.ssub.sat.v16i16(<16 x i16> %x, <16 x i16> %y)
162   ret <16 x i16> %z
165 define <32 x i16> @v32i16(<32 x i16> %x, <32 x i16> %y) nounwind {
166 ; SSE-LABEL: v32i16:
167 ; SSE:       # %bb.0:
168 ; SSE-NEXT:    psubsw %xmm4, %xmm0
169 ; SSE-NEXT:    psubsw %xmm5, %xmm1
170 ; SSE-NEXT:    psubsw %xmm6, %xmm2
171 ; SSE-NEXT:    psubsw %xmm7, %xmm3
172 ; SSE-NEXT:    retq
174 ; AVX1-LABEL: v32i16:
175 ; AVX1:       # %bb.0:
176 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
177 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
178 ; AVX1-NEXT:    vpsubsw %xmm4, %xmm5, %xmm4
179 ; AVX1-NEXT:    vpsubsw %xmm2, %xmm0, %xmm0
180 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
181 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
182 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
183 ; AVX1-NEXT:    vpsubsw %xmm2, %xmm4, %xmm2
184 ; AVX1-NEXT:    vpsubsw %xmm3, %xmm1, %xmm1
185 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
186 ; AVX1-NEXT:    retq
188 ; AVX2-LABEL: v32i16:
189 ; AVX2:       # %bb.0:
190 ; AVX2-NEXT:    vpsubsw %ymm2, %ymm0, %ymm0
191 ; AVX2-NEXT:    vpsubsw %ymm3, %ymm1, %ymm1
192 ; AVX2-NEXT:    retq
194 ; AVX512-LABEL: v32i16:
195 ; AVX512:       # %bb.0:
196 ; AVX512-NEXT:    vpsubsw %zmm1, %zmm0, %zmm0
197 ; AVX512-NEXT:    retq
198   %z = call <32 x i16> @llvm.ssub.sat.v32i16(<32 x i16> %x, <32 x i16> %y)
199   ret <32 x i16> %z
202 ; Too narrow vectors, legalized by widening.
204 define void @v8i8(<8 x i8>* %px, <8 x i8>* %py, <8 x i8>* %pz) nounwind {
205 ; SSE-LABEL: v8i8:
206 ; SSE:       # %bb.0:
207 ; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
208 ; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
209 ; SSE-NEXT:    psubsb %xmm1, %xmm0
210 ; SSE-NEXT:    movq %xmm0, (%rdx)
211 ; SSE-NEXT:    retq
213 ; AVX-LABEL: v8i8:
214 ; AVX:       # %bb.0:
215 ; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
216 ; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
217 ; AVX-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
218 ; AVX-NEXT:    vmovq %xmm0, (%rdx)
219 ; AVX-NEXT:    retq
220   %x = load <8 x i8>, <8 x i8>* %px
221   %y = load <8 x i8>, <8 x i8>* %py
222   %z = call <8 x i8> @llvm.ssub.sat.v8i8(<8 x i8> %x, <8 x i8> %y)
223   store <8 x i8> %z, <8 x i8>* %pz
224   ret void
227 define void @v4i8(<4 x i8>* %px, <4 x i8>* %py, <4 x i8>* %pz) nounwind {
228 ; SSE-LABEL: v4i8:
229 ; SSE:       # %bb.0:
230 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
231 ; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
232 ; SSE-NEXT:    psubsb %xmm1, %xmm0
233 ; SSE-NEXT:    movd %xmm0, (%rdx)
234 ; SSE-NEXT:    retq
236 ; AVX-LABEL: v4i8:
237 ; AVX:       # %bb.0:
238 ; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
239 ; AVX-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
240 ; AVX-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
241 ; AVX-NEXT:    vmovd %xmm0, (%rdx)
242 ; AVX-NEXT:    retq
243   %x = load <4 x i8>, <4 x i8>* %px
244   %y = load <4 x i8>, <4 x i8>* %py
245   %z = call <4 x i8> @llvm.ssub.sat.v4i8(<4 x i8> %x, <4 x i8> %y)
246   store <4 x i8> %z, <4 x i8>* %pz
247   ret void
250 define void @v2i8(<2 x i8>* %px, <2 x i8>* %py, <2 x i8>* %pz) nounwind {
251 ; SSE2-LABEL: v2i8:
252 ; SSE2:       # %bb.0:
253 ; SSE2-NEXT:    movzwl (%rdi), %eax
254 ; SSE2-NEXT:    movd %eax, %xmm0
255 ; SSE2-NEXT:    movzwl (%rsi), %eax
256 ; SSE2-NEXT:    movd %eax, %xmm1
257 ; SSE2-NEXT:    psubsb %xmm1, %xmm0
258 ; SSE2-NEXT:    movd %xmm0, %eax
259 ; SSE2-NEXT:    movw %ax, (%rdx)
260 ; SSE2-NEXT:    retq
262 ; SSSE3-LABEL: v2i8:
263 ; SSSE3:       # %bb.0:
264 ; SSSE3-NEXT:    movzwl (%rdi), %eax
265 ; SSSE3-NEXT:    movd %eax, %xmm0
266 ; SSSE3-NEXT:    movzwl (%rsi), %eax
267 ; SSSE3-NEXT:    movd %eax, %xmm1
268 ; SSSE3-NEXT:    psubsb %xmm1, %xmm0
269 ; SSSE3-NEXT:    movd %xmm0, %eax
270 ; SSSE3-NEXT:    movw %ax, (%rdx)
271 ; SSSE3-NEXT:    retq
273 ; SSE41-LABEL: v2i8:
274 ; SSE41:       # %bb.0:
275 ; SSE41-NEXT:    movzwl (%rdi), %eax
276 ; SSE41-NEXT:    movd %eax, %xmm0
277 ; SSE41-NEXT:    movzwl (%rsi), %eax
278 ; SSE41-NEXT:    movd %eax, %xmm1
279 ; SSE41-NEXT:    psubsb %xmm1, %xmm0
280 ; SSE41-NEXT:    pextrw $0, %xmm0, (%rdx)
281 ; SSE41-NEXT:    retq
283 ; AVX-LABEL: v2i8:
284 ; AVX:       # %bb.0:
285 ; AVX-NEXT:    movzwl (%rdi), %eax
286 ; AVX-NEXT:    vmovd %eax, %xmm0
287 ; AVX-NEXT:    movzwl (%rsi), %eax
288 ; AVX-NEXT:    vmovd %eax, %xmm1
289 ; AVX-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
290 ; AVX-NEXT:    vpextrw $0, %xmm0, (%rdx)
291 ; AVX-NEXT:    retq
292   %x = load <2 x i8>, <2 x i8>* %px
293   %y = load <2 x i8>, <2 x i8>* %py
294   %z = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %x, <2 x i8> %y)
295   store <2 x i8> %z, <2 x i8>* %pz
296   ret void
299 define void @v4i16(<4 x i16>* %px, <4 x i16>* %py, <4 x i16>* %pz) nounwind {
300 ; SSE-LABEL: v4i16:
301 ; SSE:       # %bb.0:
302 ; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
303 ; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
304 ; SSE-NEXT:    psubsw %xmm1, %xmm0
305 ; SSE-NEXT:    movq %xmm0, (%rdx)
306 ; SSE-NEXT:    retq
308 ; AVX-LABEL: v4i16:
309 ; AVX:       # %bb.0:
310 ; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
311 ; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
312 ; AVX-NEXT:    vpsubsw %xmm1, %xmm0, %xmm0
313 ; AVX-NEXT:    vmovq %xmm0, (%rdx)
314 ; AVX-NEXT:    retq
315   %x = load <4 x i16>, <4 x i16>* %px
316   %y = load <4 x i16>, <4 x i16>* %py
317   %z = call <4 x i16> @llvm.ssub.sat.v4i16(<4 x i16> %x, <4 x i16> %y)
318   store <4 x i16> %z, <4 x i16>* %pz
319   ret void
322 define void @v2i16(<2 x i16>* %px, <2 x i16>* %py, <2 x i16>* %pz) nounwind {
323 ; SSE-LABEL: v2i16:
324 ; SSE:       # %bb.0:
325 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
326 ; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
327 ; SSE-NEXT:    psubsw %xmm1, %xmm0
328 ; SSE-NEXT:    movd %xmm0, (%rdx)
329 ; SSE-NEXT:    retq
331 ; AVX-LABEL: v2i16:
332 ; AVX:       # %bb.0:
333 ; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
334 ; AVX-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
335 ; AVX-NEXT:    vpsubsw %xmm1, %xmm0, %xmm0
336 ; AVX-NEXT:    vmovd %xmm0, (%rdx)
337 ; AVX-NEXT:    retq
338   %x = load <2 x i16>, <2 x i16>* %px
339   %y = load <2 x i16>, <2 x i16>* %py
340   %z = call <2 x i16> @llvm.ssub.sat.v2i16(<2 x i16> %x, <2 x i16> %y)
341   store <2 x i16> %z, <2 x i16>* %pz
342   ret void
345 define <12 x i8> @v12i8(<12 x i8> %x, <12 x i8> %y) nounwind {
346 ; SSE-LABEL: v12i8:
347 ; SSE:       # %bb.0:
348 ; SSE-NEXT:    psubsb %xmm1, %xmm0
349 ; SSE-NEXT:    retq
351 ; AVX-LABEL: v12i8:
352 ; AVX:       # %bb.0:
353 ; AVX-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
354 ; AVX-NEXT:    retq
355   %z = call <12 x i8> @llvm.ssub.sat.v12i8(<12 x i8> %x, <12 x i8> %y)
356   ret <12 x i8> %z
359 define void @v12i16(<12 x i16>* %px, <12 x i16>* %py, <12 x i16>* %pz) nounwind {
360 ; SSE-LABEL: v12i16:
361 ; SSE:       # %bb.0:
362 ; SSE-NEXT:    movdqa (%rdi), %xmm0
363 ; SSE-NEXT:    movdqa 16(%rdi), %xmm1
364 ; SSE-NEXT:    psubsw (%rsi), %xmm0
365 ; SSE-NEXT:    psubsw 16(%rsi), %xmm1
366 ; SSE-NEXT:    movq %xmm1, 16(%rdx)
367 ; SSE-NEXT:    movdqa %xmm0, (%rdx)
368 ; SSE-NEXT:    retq
370 ; AVX1-LABEL: v12i16:
371 ; AVX1:       # %bb.0:
372 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
373 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
374 ; AVX1-NEXT:    vpsubsw 16(%rsi), %xmm1, %xmm1
375 ; AVX1-NEXT:    vpsubsw (%rsi), %xmm0, %xmm0
376 ; AVX1-NEXT:    vmovdqa %xmm0, (%rdx)
377 ; AVX1-NEXT:    vmovq %xmm1, 16(%rdx)
378 ; AVX1-NEXT:    retq
380 ; AVX2-LABEL: v12i16:
381 ; AVX2:       # %bb.0:
382 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
383 ; AVX2-NEXT:    vpsubsw (%rsi), %ymm0, %ymm0
384 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
385 ; AVX2-NEXT:    vmovq %xmm1, 16(%rdx)
386 ; AVX2-NEXT:    vmovdqa %xmm0, (%rdx)
387 ; AVX2-NEXT:    vzeroupper
388 ; AVX2-NEXT:    retq
390 ; AVX512-LABEL: v12i16:
391 ; AVX512:       # %bb.0:
392 ; AVX512-NEXT:    vmovdqa (%rdi), %ymm0
393 ; AVX512-NEXT:    vpsubsw (%rsi), %ymm0, %ymm0
394 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
395 ; AVX512-NEXT:    vmovq %xmm1, 16(%rdx)
396 ; AVX512-NEXT:    vmovdqa %xmm0, (%rdx)
397 ; AVX512-NEXT:    vzeroupper
398 ; AVX512-NEXT:    retq
399   %x = load <12 x i16>, <12 x i16>* %px
400   %y = load <12 x i16>, <12 x i16>* %py
401   %z = call <12 x i16> @llvm.ssub.sat.v12i16(<12 x i16> %x, <12 x i16> %y)
402   store <12 x i16> %z, <12 x i16>* %pz
403   ret void
406 ; Scalarization
408 define void @v1i8(<1 x i8>* %px, <1 x i8>* %py, <1 x i8>* %pz) nounwind {
409 ; SSE-LABEL: v1i8:
410 ; SSE:       # %bb.0:
411 ; SSE-NEXT:    movb (%rdi), %cl
412 ; SSE-NEXT:    movb (%rsi), %dil
413 ; SSE-NEXT:    xorl %esi, %esi
414 ; SSE-NEXT:    movl %ecx, %eax
415 ; SSE-NEXT:    subb %dil, %al
416 ; SSE-NEXT:    setns %sil
417 ; SSE-NEXT:    addl $127, %esi
418 ; SSE-NEXT:    subb %dil, %cl
419 ; SSE-NEXT:    movzbl %cl, %eax
420 ; SSE-NEXT:    cmovol %esi, %eax
421 ; SSE-NEXT:    movb %al, (%rdx)
422 ; SSE-NEXT:    retq
424 ; AVX-LABEL: v1i8:
425 ; AVX:       # %bb.0:
426 ; AVX-NEXT:    movb (%rdi), %cl
427 ; AVX-NEXT:    movb (%rsi), %dil
428 ; AVX-NEXT:    xorl %esi, %esi
429 ; AVX-NEXT:    movl %ecx, %eax
430 ; AVX-NEXT:    subb %dil, %al
431 ; AVX-NEXT:    setns %sil
432 ; AVX-NEXT:    addl $127, %esi
433 ; AVX-NEXT:    subb %dil, %cl
434 ; AVX-NEXT:    movzbl %cl, %eax
435 ; AVX-NEXT:    cmovol %esi, %eax
436 ; AVX-NEXT:    movb %al, (%rdx)
437 ; AVX-NEXT:    retq
438   %x = load <1 x i8>, <1 x i8>* %px
439   %y = load <1 x i8>, <1 x i8>* %py
440   %z = call <1 x i8> @llvm.ssub.sat.v1i8(<1 x i8> %x, <1 x i8> %y)
441   store <1 x i8> %z, <1 x i8>* %pz
442   ret void
445 define void @v1i16(<1 x i16>* %px, <1 x i16>* %py, <1 x i16>* %pz) nounwind {
446 ; SSE-LABEL: v1i16:
447 ; SSE:       # %bb.0:
448 ; SSE-NEXT:    movzwl (%rdi), %eax
449 ; SSE-NEXT:    movzwl (%rsi), %ecx
450 ; SSE-NEXT:    xorl %esi, %esi
451 ; SSE-NEXT:    movl %eax, %edi
452 ; SSE-NEXT:    subw %cx, %di
453 ; SSE-NEXT:    setns %sil
454 ; SSE-NEXT:    addl $32767, %esi # imm = 0x7FFF
455 ; SSE-NEXT:    subw %cx, %ax
456 ; SSE-NEXT:    cmovol %esi, %eax
457 ; SSE-NEXT:    movw %ax, (%rdx)
458 ; SSE-NEXT:    retq
460 ; AVX-LABEL: v1i16:
461 ; AVX:       # %bb.0:
462 ; AVX-NEXT:    movzwl (%rdi), %eax
463 ; AVX-NEXT:    movzwl (%rsi), %ecx
464 ; AVX-NEXT:    xorl %esi, %esi
465 ; AVX-NEXT:    movl %eax, %edi
466 ; AVX-NEXT:    subw %cx, %di
467 ; AVX-NEXT:    setns %sil
468 ; AVX-NEXT:    addl $32767, %esi # imm = 0x7FFF
469 ; AVX-NEXT:    subw %cx, %ax
470 ; AVX-NEXT:    cmovol %esi, %eax
471 ; AVX-NEXT:    movw %ax, (%rdx)
472 ; AVX-NEXT:    retq
473   %x = load <1 x i16>, <1 x i16>* %px
474   %y = load <1 x i16>, <1 x i16>* %py
475   %z = call <1 x i16> @llvm.ssub.sat.v1i16(<1 x i16> %x, <1 x i16> %y)
476   store <1 x i16> %z, <1 x i16>* %pz
477   ret void
480 ; Promotion
482 define <16 x i4> @v16i4(<16 x i4> %x, <16 x i4> %y) nounwind {
483 ; SSE-LABEL: v16i4:
484 ; SSE:       # %bb.0:
485 ; SSE-NEXT:    psllw $4, %xmm1
486 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
487 ; SSE-NEXT:    pand %xmm2, %xmm1
488 ; SSE-NEXT:    psllw $4, %xmm0
489 ; SSE-NEXT:    pand %xmm2, %xmm0
490 ; SSE-NEXT:    psubsb %xmm1, %xmm0
491 ; SSE-NEXT:    psrlw $4, %xmm0
492 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
493 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
494 ; SSE-NEXT:    pxor %xmm1, %xmm0
495 ; SSE-NEXT:    psubb %xmm1, %xmm0
496 ; SSE-NEXT:    retq
498 ; AVX-LABEL: v16i4:
499 ; AVX:       # %bb.0:
500 ; AVX-NEXT:    vpsllw $4, %xmm1, %xmm1
501 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
502 ; AVX-NEXT:    vpand %xmm2, %xmm1, %xmm1
503 ; AVX-NEXT:    vpsllw $4, %xmm0, %xmm0
504 ; AVX-NEXT:    vpand %xmm2, %xmm0, %xmm0
505 ; AVX-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
506 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
507 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
508 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
509 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
510 ; AVX-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
511 ; AVX-NEXT:    retq
512   %z = call <16 x i4> @llvm.ssub.sat.v16i4(<16 x i4> %x, <16 x i4> %y)
513   ret <16 x i4> %z
516 define <16 x i1> @v16i1(<16 x i1> %x, <16 x i1> %y) nounwind {
517 ; SSE-LABEL: v16i1:
518 ; SSE:       # %bb.0:
519 ; SSE-NEXT:    psllw $7, %xmm1
520 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
521 ; SSE-NEXT:    pand %xmm2, %xmm1
522 ; SSE-NEXT:    psllw $7, %xmm0
523 ; SSE-NEXT:    pand %xmm2, %xmm0
524 ; SSE-NEXT:    psubsb %xmm1, %xmm0
525 ; SSE-NEXT:    pxor %xmm1, %xmm1
526 ; SSE-NEXT:    pcmpgtb %xmm0, %xmm1
527 ; SSE-NEXT:    movdqa %xmm1, %xmm0
528 ; SSE-NEXT:    retq
530 ; AVX1-LABEL: v16i1:
531 ; AVX1:       # %bb.0:
532 ; AVX1-NEXT:    vpsllw $7, %xmm1, %xmm1
533 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
534 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
535 ; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
536 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
537 ; AVX1-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
538 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
539 ; AVX1-NEXT:    vpcmpgtb %xmm0, %xmm1, %xmm0
540 ; AVX1-NEXT:    retq
542 ; AVX2-LABEL: v16i1:
543 ; AVX2:       # %bb.0:
544 ; AVX2-NEXT:    vpsllw $7, %xmm1, %xmm1
545 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
546 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
547 ; AVX2-NEXT:    vpsllw $7, %xmm0, %xmm0
548 ; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
549 ; AVX2-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
550 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
551 ; AVX2-NEXT:    vpcmpgtb %xmm0, %xmm1, %xmm0
552 ; AVX2-NEXT:    retq
554 ; AVX512-LABEL: v16i1:
555 ; AVX512:       # %bb.0:
556 ; AVX512-NEXT:    vpsllw $7, %xmm0, %xmm0
557 ; AVX512-NEXT:    vpmovb2m %xmm0, %k0
558 ; AVX512-NEXT:    vpsllw $7, %xmm1, %xmm0
559 ; AVX512-NEXT:    vpmovb2m %xmm0, %k1
560 ; AVX512-NEXT:    kandnw %k0, %k1, %k0
561 ; AVX512-NEXT:    vpmovm2b %k0, %xmm0
562 ; AVX512-NEXT:    retq
563   %z = call <16 x i1> @llvm.ssub.sat.v16i1(<16 x i1> %x, <16 x i1> %y)
564   ret <16 x i1> %z
567 ; Expanded
569 define <2 x i32> @v2i32(<2 x i32> %x, <2 x i32> %y) nounwind {
570 ; SSE2-LABEL: v2i32:
571 ; SSE2:       # %bb.0:
572 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
573 ; SSE2-NEXT:    pxor %xmm3, %xmm3
574 ; SSE2-NEXT:    pxor %xmm0, %xmm0
575 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm0
576 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
577 ; SSE2-NEXT:    pxor %xmm4, %xmm0
578 ; SSE2-NEXT:    pxor %xmm5, %xmm5
579 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
580 ; SSE2-NEXT:    pxor %xmm4, %xmm5
581 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm0
582 ; SSE2-NEXT:    psubd %xmm1, %xmm2
583 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
584 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
585 ; SSE2-NEXT:    pxor %xmm4, %xmm1
586 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm1
587 ; SSE2-NEXT:    pxor %xmm4, %xmm1
588 ; SSE2-NEXT:    pandn %xmm1, %xmm0
589 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
590 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm1
591 ; SSE2-NEXT:    psrld $1, %xmm3
592 ; SSE2-NEXT:    por %xmm1, %xmm3
593 ; SSE2-NEXT:    pand %xmm0, %xmm3
594 ; SSE2-NEXT:    pandn %xmm2, %xmm0
595 ; SSE2-NEXT:    por %xmm3, %xmm0
596 ; SSE2-NEXT:    retq
598 ; SSSE3-LABEL: v2i32:
599 ; SSSE3:       # %bb.0:
600 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
601 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
602 ; SSSE3-NEXT:    pxor %xmm0, %xmm0
603 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm0
604 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm4
605 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
606 ; SSSE3-NEXT:    pxor %xmm5, %xmm5
607 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm5
608 ; SSSE3-NEXT:    pxor %xmm4, %xmm5
609 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm0
610 ; SSSE3-NEXT:    psubd %xmm1, %xmm2
611 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
612 ; SSSE3-NEXT:    movdqa %xmm3, %xmm1
613 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
614 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm1
615 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
616 ; SSSE3-NEXT:    pandn %xmm1, %xmm0
617 ; SSSE3-NEXT:    movdqa %xmm3, %xmm1
618 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm1
619 ; SSSE3-NEXT:    psrld $1, %xmm3
620 ; SSSE3-NEXT:    por %xmm1, %xmm3
621 ; SSSE3-NEXT:    pand %xmm0, %xmm3
622 ; SSSE3-NEXT:    pandn %xmm2, %xmm0
623 ; SSSE3-NEXT:    por %xmm3, %xmm0
624 ; SSSE3-NEXT:    retq
626 ; SSE41-LABEL: v2i32:
627 ; SSE41:       # %bb.0:
628 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
629 ; SSE41-NEXT:    pxor %xmm0, %xmm0
630 ; SSE41-NEXT:    pxor %xmm3, %xmm3
631 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm3
632 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm4
633 ; SSE41-NEXT:    pxor %xmm4, %xmm3
634 ; SSE41-NEXT:    pxor %xmm5, %xmm5
635 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm5
636 ; SSE41-NEXT:    pxor %xmm4, %xmm5
637 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm3
638 ; SSE41-NEXT:    psubd %xmm1, %xmm2
639 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm0
640 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
641 ; SSE41-NEXT:    pxor %xmm4, %xmm1
642 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm1
643 ; SSE41-NEXT:    pxor %xmm4, %xmm1
644 ; SSE41-NEXT:    pandn %xmm1, %xmm3
645 ; SSE41-NEXT:    movaps {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
646 ; SSE41-NEXT:    blendvps %xmm0, {{.*}}(%rip), %xmm1
647 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
648 ; SSE41-NEXT:    blendvps %xmm0, %xmm1, %xmm2
649 ; SSE41-NEXT:    movaps %xmm2, %xmm0
650 ; SSE41-NEXT:    retq
652 ; AVX1-LABEL: v2i32:
653 ; AVX1:       # %bb.0:
654 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
655 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm2, %xmm3
656 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
657 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
658 ; AVX1-NEXT:    vpcmpgtd %xmm0, %xmm2, %xmm5
659 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm5
660 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm5, %xmm3
661 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
662 ; AVX1-NEXT:    vpcmpgtd %xmm0, %xmm2, %xmm1
663 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm2
664 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm5, %xmm2
665 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
666 ; AVX1-NEXT:    vpandn %xmm2, %xmm3, %xmm2
667 ; AVX1-NEXT:    vmovaps {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
668 ; AVX1-NEXT:    vblendvps %xmm1, {{.*}}(%rip), %xmm3, %xmm1
669 ; AVX1-NEXT:    vblendvps %xmm2, %xmm1, %xmm0, %xmm0
670 ; AVX1-NEXT:    retq
672 ; AVX2-LABEL: v2i32:
673 ; AVX2:       # %bb.0:
674 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
675 ; AVX2-NEXT:    vpcmpgtd %xmm1, %xmm2, %xmm3
676 ; AVX2-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
677 ; AVX2-NEXT:    vpxor %xmm4, %xmm3, %xmm3
678 ; AVX2-NEXT:    vpcmpgtd %xmm0, %xmm2, %xmm5
679 ; AVX2-NEXT:    vpxor %xmm4, %xmm5, %xmm5
680 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm5, %xmm3
681 ; AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
682 ; AVX2-NEXT:    vpcmpgtd %xmm0, %xmm2, %xmm1
683 ; AVX2-NEXT:    vpxor %xmm4, %xmm1, %xmm2
684 ; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm5, %xmm2
685 ; AVX2-NEXT:    vpxor %xmm4, %xmm2, %xmm2
686 ; AVX2-NEXT:    vpandn %xmm2, %xmm3, %xmm2
687 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm3 = [2147483647,2147483647,2147483647,2147483647]
688 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
689 ; AVX2-NEXT:    vblendvps %xmm1, %xmm3, %xmm4, %xmm1
690 ; AVX2-NEXT:    vblendvps %xmm2, %xmm1, %xmm0, %xmm0
691 ; AVX2-NEXT:    retq
693 ; AVX512-LABEL: v2i32:
694 ; AVX512:       # %bb.0:
695 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
696 ; AVX512-NEXT:    vpcmpnltd %xmm2, %xmm1, %k0
697 ; AVX512-NEXT:    vpcmpnltd %xmm2, %xmm0, %k1
698 ; AVX512-NEXT:    kxorw %k0, %k1, %k0
699 ; AVX512-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
700 ; AVX512-NEXT:    vpcmpnltd %xmm2, %xmm0, %k2
701 ; AVX512-NEXT:    kxorw %k2, %k1, %k1
702 ; AVX512-NEXT:    kandw %k1, %k0, %k1
703 ; AVX512-NEXT:    vpcmpgtd %xmm0, %xmm2, %k2
704 ; AVX512-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
705 ; AVX512-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm1 {%k2}
706 ; AVX512-NEXT:    vmovdqa32 %xmm1, %xmm0 {%k1}
707 ; AVX512-NEXT:    retq
708   %z = call <2 x i32> @llvm.ssub.sat.v2i32(<2 x i32> %x, <2 x i32> %y)
709   ret <2 x i32> %z
712 define <4 x i32> @v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {
713 ; SSE2-LABEL: v4i32:
714 ; SSE2:       # %bb.0:
715 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
716 ; SSE2-NEXT:    pxor %xmm3, %xmm3
717 ; SSE2-NEXT:    pxor %xmm0, %xmm0
718 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm0
719 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
720 ; SSE2-NEXT:    pxor %xmm4, %xmm0
721 ; SSE2-NEXT:    pxor %xmm5, %xmm5
722 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
723 ; SSE2-NEXT:    pxor %xmm4, %xmm5
724 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm0
725 ; SSE2-NEXT:    psubd %xmm1, %xmm2
726 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
727 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
728 ; SSE2-NEXT:    pxor %xmm4, %xmm1
729 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm1
730 ; SSE2-NEXT:    pxor %xmm4, %xmm1
731 ; SSE2-NEXT:    pandn %xmm1, %xmm0
732 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
733 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm1
734 ; SSE2-NEXT:    psrld $1, %xmm3
735 ; SSE2-NEXT:    por %xmm1, %xmm3
736 ; SSE2-NEXT:    pand %xmm0, %xmm3
737 ; SSE2-NEXT:    pandn %xmm2, %xmm0
738 ; SSE2-NEXT:    por %xmm3, %xmm0
739 ; SSE2-NEXT:    retq
741 ; SSSE3-LABEL: v4i32:
742 ; SSSE3:       # %bb.0:
743 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
744 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
745 ; SSSE3-NEXT:    pxor %xmm0, %xmm0
746 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm0
747 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm4
748 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
749 ; SSSE3-NEXT:    pxor %xmm5, %xmm5
750 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm5
751 ; SSSE3-NEXT:    pxor %xmm4, %xmm5
752 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm0
753 ; SSSE3-NEXT:    psubd %xmm1, %xmm2
754 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
755 ; SSSE3-NEXT:    movdqa %xmm3, %xmm1
756 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
757 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm1
758 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
759 ; SSSE3-NEXT:    pandn %xmm1, %xmm0
760 ; SSSE3-NEXT:    movdqa %xmm3, %xmm1
761 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm1
762 ; SSSE3-NEXT:    psrld $1, %xmm3
763 ; SSSE3-NEXT:    por %xmm1, %xmm3
764 ; SSSE3-NEXT:    pand %xmm0, %xmm3
765 ; SSSE3-NEXT:    pandn %xmm2, %xmm0
766 ; SSSE3-NEXT:    por %xmm3, %xmm0
767 ; SSSE3-NEXT:    retq
769 ; SSE41-LABEL: v4i32:
770 ; SSE41:       # %bb.0:
771 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
772 ; SSE41-NEXT:    pxor %xmm0, %xmm0
773 ; SSE41-NEXT:    pxor %xmm3, %xmm3
774 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm3
775 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm4
776 ; SSE41-NEXT:    pxor %xmm4, %xmm3
777 ; SSE41-NEXT:    pxor %xmm5, %xmm5
778 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm5
779 ; SSE41-NEXT:    pxor %xmm4, %xmm5
780 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm3
781 ; SSE41-NEXT:    psubd %xmm1, %xmm2
782 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm0
783 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
784 ; SSE41-NEXT:    pxor %xmm4, %xmm1
785 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm1
786 ; SSE41-NEXT:    pxor %xmm4, %xmm1
787 ; SSE41-NEXT:    pandn %xmm1, %xmm3
788 ; SSE41-NEXT:    movaps {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
789 ; SSE41-NEXT:    blendvps %xmm0, {{.*}}(%rip), %xmm1
790 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
791 ; SSE41-NEXT:    blendvps %xmm0, %xmm1, %xmm2
792 ; SSE41-NEXT:    movaps %xmm2, %xmm0
793 ; SSE41-NEXT:    retq
795 ; AVX1-LABEL: v4i32:
796 ; AVX1:       # %bb.0:
797 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
798 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm2, %xmm3
799 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
800 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
801 ; AVX1-NEXT:    vpcmpgtd %xmm0, %xmm2, %xmm5
802 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm5
803 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm5, %xmm3
804 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
805 ; AVX1-NEXT:    vpcmpgtd %xmm0, %xmm2, %xmm1
806 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm2
807 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm5, %xmm2
808 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
809 ; AVX1-NEXT:    vpandn %xmm2, %xmm3, %xmm2
810 ; AVX1-NEXT:    vmovaps {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
811 ; AVX1-NEXT:    vblendvps %xmm1, {{.*}}(%rip), %xmm3, %xmm1
812 ; AVX1-NEXT:    vblendvps %xmm2, %xmm1, %xmm0, %xmm0
813 ; AVX1-NEXT:    retq
815 ; AVX2-LABEL: v4i32:
816 ; AVX2:       # %bb.0:
817 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
818 ; AVX2-NEXT:    vpcmpgtd %xmm1, %xmm2, %xmm3
819 ; AVX2-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
820 ; AVX2-NEXT:    vpxor %xmm4, %xmm3, %xmm3
821 ; AVX2-NEXT:    vpcmpgtd %xmm0, %xmm2, %xmm5
822 ; AVX2-NEXT:    vpxor %xmm4, %xmm5, %xmm5
823 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm5, %xmm3
824 ; AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
825 ; AVX2-NEXT:    vpcmpgtd %xmm0, %xmm2, %xmm1
826 ; AVX2-NEXT:    vpxor %xmm4, %xmm1, %xmm2
827 ; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm5, %xmm2
828 ; AVX2-NEXT:    vpxor %xmm4, %xmm2, %xmm2
829 ; AVX2-NEXT:    vpandn %xmm2, %xmm3, %xmm2
830 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm3 = [2147483647,2147483647,2147483647,2147483647]
831 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
832 ; AVX2-NEXT:    vblendvps %xmm1, %xmm3, %xmm4, %xmm1
833 ; AVX2-NEXT:    vblendvps %xmm2, %xmm1, %xmm0, %xmm0
834 ; AVX2-NEXT:    retq
836 ; AVX512-LABEL: v4i32:
837 ; AVX512:       # %bb.0:
838 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
839 ; AVX512-NEXT:    vpcmpnltd %xmm2, %xmm1, %k0
840 ; AVX512-NEXT:    vpcmpnltd %xmm2, %xmm0, %k1
841 ; AVX512-NEXT:    kxorw %k0, %k1, %k0
842 ; AVX512-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
843 ; AVX512-NEXT:    vpcmpnltd %xmm2, %xmm0, %k2
844 ; AVX512-NEXT:    kxorw %k2, %k1, %k1
845 ; AVX512-NEXT:    kandw %k1, %k0, %k1
846 ; AVX512-NEXT:    vpcmpgtd %xmm0, %xmm2, %k2
847 ; AVX512-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
848 ; AVX512-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm1 {%k2}
849 ; AVX512-NEXT:    vmovdqa32 %xmm1, %xmm0 {%k1}
850 ; AVX512-NEXT:    retq
851   %z = call <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32> %x, <4 x i32> %y)
852   ret <4 x i32> %z
855 define <8 x i32> @v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
856 ; SSE2-LABEL: v8i32:
857 ; SSE2:       # %bb.0:
858 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
859 ; SSE2-NEXT:    pxor %xmm5, %xmm5
860 ; SSE2-NEXT:    pxor %xmm0, %xmm0
861 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
862 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm8
863 ; SSE2-NEXT:    pxor %xmm8, %xmm0
864 ; SSE2-NEXT:    pxor %xmm7, %xmm7
865 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm7
866 ; SSE2-NEXT:    pxor %xmm8, %xmm7
867 ; SSE2-NEXT:    pcmpeqd %xmm7, %xmm0
868 ; SSE2-NEXT:    psubd %xmm2, %xmm4
869 ; SSE2-NEXT:    pxor %xmm6, %xmm6
870 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
871 ; SSE2-NEXT:    movdqa %xmm6, %xmm2
872 ; SSE2-NEXT:    pxor %xmm8, %xmm2
873 ; SSE2-NEXT:    pcmpeqd %xmm7, %xmm2
874 ; SSE2-NEXT:    pxor %xmm8, %xmm2
875 ; SSE2-NEXT:    pandn %xmm2, %xmm0
876 ; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648]
877 ; SSE2-NEXT:    movdqa %xmm6, %xmm2
878 ; SSE2-NEXT:    pandn %xmm7, %xmm2
879 ; SSE2-NEXT:    psrld $1, %xmm6
880 ; SSE2-NEXT:    por %xmm2, %xmm6
881 ; SSE2-NEXT:    pand %xmm0, %xmm6
882 ; SSE2-NEXT:    pandn %xmm4, %xmm0
883 ; SSE2-NEXT:    por %xmm6, %xmm0
884 ; SSE2-NEXT:    pxor %xmm2, %xmm2
885 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
886 ; SSE2-NEXT:    pxor %xmm8, %xmm2
887 ; SSE2-NEXT:    pxor %xmm4, %xmm4
888 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
889 ; SSE2-NEXT:    pxor %xmm8, %xmm4
890 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm2
891 ; SSE2-NEXT:    psubd %xmm3, %xmm1
892 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm5
893 ; SSE2-NEXT:    movdqa %xmm5, %xmm3
894 ; SSE2-NEXT:    pxor %xmm8, %xmm3
895 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm3
896 ; SSE2-NEXT:    pxor %xmm8, %xmm3
897 ; SSE2-NEXT:    pandn %xmm3, %xmm2
898 ; SSE2-NEXT:    movdqa %xmm5, %xmm3
899 ; SSE2-NEXT:    pandn %xmm7, %xmm3
900 ; SSE2-NEXT:    psrld $1, %xmm5
901 ; SSE2-NEXT:    por %xmm3, %xmm5
902 ; SSE2-NEXT:    pand %xmm2, %xmm5
903 ; SSE2-NEXT:    pandn %xmm1, %xmm2
904 ; SSE2-NEXT:    por %xmm5, %xmm2
905 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
906 ; SSE2-NEXT:    retq
908 ; SSSE3-LABEL: v8i32:
909 ; SSSE3:       # %bb.0:
910 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
911 ; SSSE3-NEXT:    pxor %xmm5, %xmm5
912 ; SSSE3-NEXT:    pxor %xmm0, %xmm0
913 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm0
914 ; SSSE3-NEXT:    pcmpeqd %xmm8, %xmm8
915 ; SSSE3-NEXT:    pxor %xmm8, %xmm0
916 ; SSSE3-NEXT:    pxor %xmm7, %xmm7
917 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm7
918 ; SSSE3-NEXT:    pxor %xmm8, %xmm7
919 ; SSSE3-NEXT:    pcmpeqd %xmm7, %xmm0
920 ; SSSE3-NEXT:    psubd %xmm2, %xmm4
921 ; SSSE3-NEXT:    pxor %xmm6, %xmm6
922 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
923 ; SSSE3-NEXT:    movdqa %xmm6, %xmm2
924 ; SSSE3-NEXT:    pxor %xmm8, %xmm2
925 ; SSSE3-NEXT:    pcmpeqd %xmm7, %xmm2
926 ; SSSE3-NEXT:    pxor %xmm8, %xmm2
927 ; SSSE3-NEXT:    pandn %xmm2, %xmm0
928 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648]
929 ; SSSE3-NEXT:    movdqa %xmm6, %xmm2
930 ; SSSE3-NEXT:    pandn %xmm7, %xmm2
931 ; SSSE3-NEXT:    psrld $1, %xmm6
932 ; SSSE3-NEXT:    por %xmm2, %xmm6
933 ; SSSE3-NEXT:    pand %xmm0, %xmm6
934 ; SSSE3-NEXT:    pandn %xmm4, %xmm0
935 ; SSSE3-NEXT:    por %xmm6, %xmm0
936 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
937 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm2
938 ; SSSE3-NEXT:    pxor %xmm8, %xmm2
939 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
940 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
941 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
942 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm2
943 ; SSSE3-NEXT:    psubd %xmm3, %xmm1
944 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm5
945 ; SSSE3-NEXT:    movdqa %xmm5, %xmm3
946 ; SSSE3-NEXT:    pxor %xmm8, %xmm3
947 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm3
948 ; SSSE3-NEXT:    pxor %xmm8, %xmm3
949 ; SSSE3-NEXT:    pandn %xmm3, %xmm2
950 ; SSSE3-NEXT:    movdqa %xmm5, %xmm3
951 ; SSSE3-NEXT:    pandn %xmm7, %xmm3
952 ; SSSE3-NEXT:    psrld $1, %xmm5
953 ; SSSE3-NEXT:    por %xmm3, %xmm5
954 ; SSSE3-NEXT:    pand %xmm2, %xmm5
955 ; SSSE3-NEXT:    pandn %xmm1, %xmm2
956 ; SSSE3-NEXT:    por %xmm5, %xmm2
957 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
958 ; SSSE3-NEXT:    retq
960 ; SSE41-LABEL: v8i32:
961 ; SSE41:       # %bb.0:
962 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
963 ; SSE41-NEXT:    pxor %xmm4, %xmm4
964 ; SSE41-NEXT:    pxor %xmm6, %xmm6
965 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm6
966 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm8
967 ; SSE41-NEXT:    pxor %xmm8, %xmm6
968 ; SSE41-NEXT:    pxor %xmm7, %xmm7
969 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
970 ; SSE41-NEXT:    pxor %xmm8, %xmm7
971 ; SSE41-NEXT:    pcmpeqd %xmm7, %xmm6
972 ; SSE41-NEXT:    psubd %xmm2, %xmm5
973 ; SSE41-NEXT:    pxor %xmm0, %xmm0
974 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm0
975 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
976 ; SSE41-NEXT:    pxor %xmm8, %xmm2
977 ; SSE41-NEXT:    pcmpeqd %xmm7, %xmm2
978 ; SSE41-NEXT:    pxor %xmm8, %xmm2
979 ; SSE41-NEXT:    pandn %xmm2, %xmm6
980 ; SSE41-NEXT:    movaps {{.*#+}} xmm9 = [2147483647,2147483647,2147483647,2147483647]
981 ; SSE41-NEXT:    movaps {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648]
982 ; SSE41-NEXT:    movaps %xmm7, %xmm2
983 ; SSE41-NEXT:    blendvps %xmm0, %xmm9, %xmm2
984 ; SSE41-NEXT:    movdqa %xmm6, %xmm0
985 ; SSE41-NEXT:    blendvps %xmm0, %xmm2, %xmm5
986 ; SSE41-NEXT:    xorps %xmm2, %xmm2
987 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm2
988 ; SSE41-NEXT:    pxor %xmm8, %xmm2
989 ; SSE41-NEXT:    pxor %xmm0, %xmm0
990 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm0
991 ; SSE41-NEXT:    pxor %xmm8, %xmm0
992 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
993 ; SSE41-NEXT:    psubd %xmm3, %xmm1
994 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm4
995 ; SSE41-NEXT:    movdqa %xmm4, %xmm3
996 ; SSE41-NEXT:    pxor %xmm8, %xmm3
997 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
998 ; SSE41-NEXT:    pxor %xmm8, %xmm3
999 ; SSE41-NEXT:    pandn %xmm3, %xmm2
1000 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1001 ; SSE41-NEXT:    blendvps %xmm0, %xmm9, %xmm7
1002 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1003 ; SSE41-NEXT:    blendvps %xmm0, %xmm7, %xmm1
1004 ; SSE41-NEXT:    movaps %xmm5, %xmm0
1005 ; SSE41-NEXT:    retq
1007 ; AVX1-LABEL: v8i32:
1008 ; AVX1:       # %bb.0:
1009 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1010 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1011 ; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm3, %xmm4
1012 ; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
1013 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
1014 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
1015 ; AVX1-NEXT:    vpcmpgtd %xmm6, %xmm3, %xmm7
1016 ; AVX1-NEXT:    vpxor %xmm5, %xmm7, %xmm7
1017 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm7, %xmm8
1018 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm3, %xmm4
1019 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm9
1020 ; AVX1-NEXT:    vpcmpgtd %xmm0, %xmm3, %xmm4
1021 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
1022 ; AVX1-NEXT:    vpcmpeqd %xmm9, %xmm4, %xmm9
1023 ; AVX1-NEXT:    vinsertf128 $1, %xmm8, %ymm9, %ymm8
1024 ; AVX1-NEXT:    vpsubd %xmm2, %xmm6, %xmm9
1025 ; AVX1-NEXT:    vpcmpgtd %xmm9, %xmm3, %xmm6
1026 ; AVX1-NEXT:    vpxor %xmm5, %xmm6, %xmm2
1027 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm7, %xmm2
1028 ; AVX1-NEXT:    vpxor %xmm5, %xmm2, %xmm2
1029 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
1030 ; AVX1-NEXT:    vpcmpgtd %xmm0, %xmm3, %xmm1
1031 ; AVX1-NEXT:    vpxor %xmm5, %xmm1, %xmm3
1032 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm4, %xmm3
1033 ; AVX1-NEXT:    vpxor %xmm5, %xmm3, %xmm3
1034 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
1035 ; AVX1-NEXT:    vandnps %ymm2, %ymm8, %ymm2
1036 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
1037 ; AVX1-NEXT:    vmovaps {{.*#+}} ymm3 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1038 ; AVX1-NEXT:    vblendvps %ymm1, {{.*}}(%rip), %ymm3, %ymm1
1039 ; AVX1-NEXT:    vinsertf128 $1, %xmm9, %ymm0, %ymm0
1040 ; AVX1-NEXT:    vblendvps %ymm2, %ymm1, %ymm0, %ymm0
1041 ; AVX1-NEXT:    retq
1043 ; AVX2-LABEL: v8i32:
1044 ; AVX2:       # %bb.0:
1045 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1046 ; AVX2-NEXT:    vpcmpgtd %ymm1, %ymm2, %ymm3
1047 ; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm4, %ymm4
1048 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm3
1049 ; AVX2-NEXT:    vpcmpgtd %ymm0, %ymm2, %ymm5
1050 ; AVX2-NEXT:    vpxor %ymm4, %ymm5, %ymm5
1051 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm5, %ymm3
1052 ; AVX2-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
1053 ; AVX2-NEXT:    vpcmpgtd %ymm0, %ymm2, %ymm1
1054 ; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm2
1055 ; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm5, %ymm2
1056 ; AVX2-NEXT:    vpxor %ymm4, %ymm2, %ymm2
1057 ; AVX2-NEXT:    vpandn %ymm2, %ymm3, %ymm2
1058 ; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm3 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
1059 ; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm4 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1060 ; AVX2-NEXT:    vblendvps %ymm1, %ymm3, %ymm4, %ymm1
1061 ; AVX2-NEXT:    vblendvps %ymm2, %ymm1, %ymm0, %ymm0
1062 ; AVX2-NEXT:    retq
1064 ; AVX512-LABEL: v8i32:
1065 ; AVX512:       # %bb.0:
1066 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1067 ; AVX512-NEXT:    vpcmpnltd %ymm2, %ymm1, %k0
1068 ; AVX512-NEXT:    vpcmpnltd %ymm2, %ymm0, %k1
1069 ; AVX512-NEXT:    kxorw %k0, %k1, %k0
1070 ; AVX512-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
1071 ; AVX512-NEXT:    vpcmpnltd %ymm2, %ymm0, %k2
1072 ; AVX512-NEXT:    kxorw %k2, %k1, %k1
1073 ; AVX512-NEXT:    kandw %k1, %k0, %k1
1074 ; AVX512-NEXT:    vpcmpgtd %ymm0, %ymm2, %k2
1075 ; AVX512-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1076 ; AVX512-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm1 {%k2}
1077 ; AVX512-NEXT:    vmovdqa32 %ymm1, %ymm0 {%k1}
1078 ; AVX512-NEXT:    retq
1079   %z = call <8 x i32> @llvm.ssub.sat.v8i32(<8 x i32> %x, <8 x i32> %y)
1080   ret <8 x i32> %z
1083 define <16 x i32> @v16i32(<16 x i32> %x, <16 x i32> %y) nounwind {
1084 ; SSE2-LABEL: v16i32:
1085 ; SSE2:       # %bb.0:
1086 ; SSE2-NEXT:    movdqa %xmm1, %xmm8
1087 ; SSE2-NEXT:    movdqa %xmm0, %xmm12
1088 ; SSE2-NEXT:    pxor %xmm9, %xmm9
1089 ; SSE2-NEXT:    pxor %xmm0, %xmm0
1090 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm0
1091 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm10
1092 ; SSE2-NEXT:    pxor %xmm10, %xmm0
1093 ; SSE2-NEXT:    pxor %xmm11, %xmm11
1094 ; SSE2-NEXT:    pcmpgtd %xmm12, %xmm11
1095 ; SSE2-NEXT:    pxor %xmm10, %xmm11
1096 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm0
1097 ; SSE2-NEXT:    psubd %xmm4, %xmm12
1098 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1099 ; SSE2-NEXT:    pcmpgtd %xmm12, %xmm1
1100 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1101 ; SSE2-NEXT:    pxor %xmm10, %xmm4
1102 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm4
1103 ; SSE2-NEXT:    pxor %xmm10, %xmm4
1104 ; SSE2-NEXT:    pandn %xmm4, %xmm0
1105 ; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [2147483648,2147483648,2147483648,2147483648]
1106 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1107 ; SSE2-NEXT:    pandn %xmm11, %xmm4
1108 ; SSE2-NEXT:    psrld $1, %xmm1
1109 ; SSE2-NEXT:    por %xmm4, %xmm1
1110 ; SSE2-NEXT:    pand %xmm0, %xmm1
1111 ; SSE2-NEXT:    pandn %xmm12, %xmm0
1112 ; SSE2-NEXT:    por %xmm1, %xmm0
1113 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1114 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm1
1115 ; SSE2-NEXT:    pxor %xmm10, %xmm1
1116 ; SSE2-NEXT:    pxor %xmm12, %xmm12
1117 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm12
1118 ; SSE2-NEXT:    pxor %xmm10, %xmm12
1119 ; SSE2-NEXT:    pcmpeqd %xmm12, %xmm1
1120 ; SSE2-NEXT:    psubd %xmm5, %xmm8
1121 ; SSE2-NEXT:    pxor %xmm4, %xmm4
1122 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm4
1123 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
1124 ; SSE2-NEXT:    pxor %xmm10, %xmm5
1125 ; SSE2-NEXT:    pcmpeqd %xmm12, %xmm5
1126 ; SSE2-NEXT:    pxor %xmm10, %xmm5
1127 ; SSE2-NEXT:    pandn %xmm5, %xmm1
1128 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
1129 ; SSE2-NEXT:    pandn %xmm11, %xmm5
1130 ; SSE2-NEXT:    psrld $1, %xmm4
1131 ; SSE2-NEXT:    por %xmm5, %xmm4
1132 ; SSE2-NEXT:    pand %xmm1, %xmm4
1133 ; SSE2-NEXT:    pandn %xmm8, %xmm1
1134 ; SSE2-NEXT:    por %xmm4, %xmm1
1135 ; SSE2-NEXT:    pxor %xmm8, %xmm8
1136 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm8
1137 ; SSE2-NEXT:    pxor %xmm10, %xmm8
1138 ; SSE2-NEXT:    pxor %xmm5, %xmm5
1139 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
1140 ; SSE2-NEXT:    pxor %xmm10, %xmm5
1141 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm8
1142 ; SSE2-NEXT:    psubd %xmm6, %xmm2
1143 ; SSE2-NEXT:    pxor %xmm4, %xmm4
1144 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
1145 ; SSE2-NEXT:    movdqa %xmm4, %xmm6
1146 ; SSE2-NEXT:    pxor %xmm10, %xmm6
1147 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
1148 ; SSE2-NEXT:    pxor %xmm10, %xmm6
1149 ; SSE2-NEXT:    pandn %xmm6, %xmm8
1150 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
1151 ; SSE2-NEXT:    pandn %xmm11, %xmm5
1152 ; SSE2-NEXT:    psrld $1, %xmm4
1153 ; SSE2-NEXT:    por %xmm5, %xmm4
1154 ; SSE2-NEXT:    pand %xmm8, %xmm4
1155 ; SSE2-NEXT:    pandn %xmm2, %xmm8
1156 ; SSE2-NEXT:    por %xmm4, %xmm8
1157 ; SSE2-NEXT:    pxor %xmm5, %xmm5
1158 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm5
1159 ; SSE2-NEXT:    pxor %xmm10, %xmm5
1160 ; SSE2-NEXT:    pxor %xmm2, %xmm2
1161 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
1162 ; SSE2-NEXT:    pxor %xmm10, %xmm2
1163 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm5
1164 ; SSE2-NEXT:    psubd %xmm7, %xmm3
1165 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm9
1166 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
1167 ; SSE2-NEXT:    pxor %xmm10, %xmm4
1168 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
1169 ; SSE2-NEXT:    pxor %xmm10, %xmm4
1170 ; SSE2-NEXT:    pandn %xmm4, %xmm5
1171 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
1172 ; SSE2-NEXT:    pandn %xmm11, %xmm2
1173 ; SSE2-NEXT:    psrld $1, %xmm9
1174 ; SSE2-NEXT:    por %xmm2, %xmm9
1175 ; SSE2-NEXT:    pand %xmm5, %xmm9
1176 ; SSE2-NEXT:    pandn %xmm3, %xmm5
1177 ; SSE2-NEXT:    por %xmm9, %xmm5
1178 ; SSE2-NEXT:    movdqa %xmm8, %xmm2
1179 ; SSE2-NEXT:    movdqa %xmm5, %xmm3
1180 ; SSE2-NEXT:    retq
1182 ; SSSE3-LABEL: v16i32:
1183 ; SSSE3:       # %bb.0:
1184 ; SSSE3-NEXT:    movdqa %xmm1, %xmm8
1185 ; SSSE3-NEXT:    movdqa %xmm0, %xmm12
1186 ; SSSE3-NEXT:    pxor %xmm9, %xmm9
1187 ; SSSE3-NEXT:    pxor %xmm0, %xmm0
1188 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm0
1189 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm10
1190 ; SSSE3-NEXT:    pxor %xmm10, %xmm0
1191 ; SSSE3-NEXT:    pxor %xmm11, %xmm11
1192 ; SSSE3-NEXT:    pcmpgtd %xmm12, %xmm11
1193 ; SSSE3-NEXT:    pxor %xmm10, %xmm11
1194 ; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm0
1195 ; SSSE3-NEXT:    psubd %xmm4, %xmm12
1196 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1197 ; SSSE3-NEXT:    pcmpgtd %xmm12, %xmm1
1198 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
1199 ; SSSE3-NEXT:    pxor %xmm10, %xmm4
1200 ; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm4
1201 ; SSSE3-NEXT:    pxor %xmm10, %xmm4
1202 ; SSSE3-NEXT:    pandn %xmm4, %xmm0
1203 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm11 = [2147483648,2147483648,2147483648,2147483648]
1204 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
1205 ; SSSE3-NEXT:    pandn %xmm11, %xmm4
1206 ; SSSE3-NEXT:    psrld $1, %xmm1
1207 ; SSSE3-NEXT:    por %xmm4, %xmm1
1208 ; SSSE3-NEXT:    pand %xmm0, %xmm1
1209 ; SSSE3-NEXT:    pandn %xmm12, %xmm0
1210 ; SSSE3-NEXT:    por %xmm1, %xmm0
1211 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1212 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm1
1213 ; SSSE3-NEXT:    pxor %xmm10, %xmm1
1214 ; SSSE3-NEXT:    pxor %xmm12, %xmm12
1215 ; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm12
1216 ; SSSE3-NEXT:    pxor %xmm10, %xmm12
1217 ; SSSE3-NEXT:    pcmpeqd %xmm12, %xmm1
1218 ; SSSE3-NEXT:    psubd %xmm5, %xmm8
1219 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
1220 ; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm4
1221 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
1222 ; SSSE3-NEXT:    pxor %xmm10, %xmm5
1223 ; SSSE3-NEXT:    pcmpeqd %xmm12, %xmm5
1224 ; SSSE3-NEXT:    pxor %xmm10, %xmm5
1225 ; SSSE3-NEXT:    pandn %xmm5, %xmm1
1226 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
1227 ; SSSE3-NEXT:    pandn %xmm11, %xmm5
1228 ; SSSE3-NEXT:    psrld $1, %xmm4
1229 ; SSSE3-NEXT:    por %xmm5, %xmm4
1230 ; SSSE3-NEXT:    pand %xmm1, %xmm4
1231 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
1232 ; SSSE3-NEXT:    por %xmm4, %xmm1
1233 ; SSSE3-NEXT:    pxor %xmm8, %xmm8
1234 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm8
1235 ; SSSE3-NEXT:    pxor %xmm10, %xmm8
1236 ; SSSE3-NEXT:    pxor %xmm5, %xmm5
1237 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm5
1238 ; SSSE3-NEXT:    pxor %xmm10, %xmm5
1239 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm8
1240 ; SSSE3-NEXT:    psubd %xmm6, %xmm2
1241 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
1242 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
1243 ; SSSE3-NEXT:    movdqa %xmm4, %xmm6
1244 ; SSSE3-NEXT:    pxor %xmm10, %xmm6
1245 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm6
1246 ; SSSE3-NEXT:    pxor %xmm10, %xmm6
1247 ; SSSE3-NEXT:    pandn %xmm6, %xmm8
1248 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
1249 ; SSSE3-NEXT:    pandn %xmm11, %xmm5
1250 ; SSSE3-NEXT:    psrld $1, %xmm4
1251 ; SSSE3-NEXT:    por %xmm5, %xmm4
1252 ; SSSE3-NEXT:    pand %xmm8, %xmm4
1253 ; SSSE3-NEXT:    pandn %xmm2, %xmm8
1254 ; SSSE3-NEXT:    por %xmm4, %xmm8
1255 ; SSSE3-NEXT:    pxor %xmm5, %xmm5
1256 ; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm5
1257 ; SSSE3-NEXT:    pxor %xmm10, %xmm5
1258 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
1259 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm2
1260 ; SSSE3-NEXT:    pxor %xmm10, %xmm2
1261 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm5
1262 ; SSSE3-NEXT:    psubd %xmm7, %xmm3
1263 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm9
1264 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
1265 ; SSSE3-NEXT:    pxor %xmm10, %xmm4
1266 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm4
1267 ; SSSE3-NEXT:    pxor %xmm10, %xmm4
1268 ; SSSE3-NEXT:    pandn %xmm4, %xmm5
1269 ; SSSE3-NEXT:    movdqa %xmm9, %xmm2
1270 ; SSSE3-NEXT:    pandn %xmm11, %xmm2
1271 ; SSSE3-NEXT:    psrld $1, %xmm9
1272 ; SSSE3-NEXT:    por %xmm2, %xmm9
1273 ; SSSE3-NEXT:    pand %xmm5, %xmm9
1274 ; SSSE3-NEXT:    pandn %xmm3, %xmm5
1275 ; SSSE3-NEXT:    por %xmm9, %xmm5
1276 ; SSSE3-NEXT:    movdqa %xmm8, %xmm2
1277 ; SSSE3-NEXT:    movdqa %xmm5, %xmm3
1278 ; SSSE3-NEXT:    retq
1280 ; SSE41-LABEL: v16i32:
1281 ; SSE41:       # %bb.0:
1282 ; SSE41-NEXT:    movdqa %xmm0, %xmm9
1283 ; SSE41-NEXT:    pxor %xmm8, %xmm8
1284 ; SSE41-NEXT:    pxor %xmm10, %xmm10
1285 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm10
1286 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm11
1287 ; SSE41-NEXT:    pxor %xmm11, %xmm10
1288 ; SSE41-NEXT:    pxor %xmm12, %xmm12
1289 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm12
1290 ; SSE41-NEXT:    pxor %xmm11, %xmm12
1291 ; SSE41-NEXT:    pcmpeqd %xmm12, %xmm10
1292 ; SSE41-NEXT:    psubd %xmm4, %xmm9
1293 ; SSE41-NEXT:    pxor %xmm0, %xmm0
1294 ; SSE41-NEXT:    pcmpgtd %xmm9, %xmm0
1295 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
1296 ; SSE41-NEXT:    pxor %xmm11, %xmm4
1297 ; SSE41-NEXT:    pcmpeqd %xmm12, %xmm4
1298 ; SSE41-NEXT:    pxor %xmm11, %xmm4
1299 ; SSE41-NEXT:    pandn %xmm4, %xmm10
1300 ; SSE41-NEXT:    movaps {{.*#+}} xmm13 = [2147483647,2147483647,2147483647,2147483647]
1301 ; SSE41-NEXT:    movaps {{.*#+}} xmm12 = [2147483648,2147483648,2147483648,2147483648]
1302 ; SSE41-NEXT:    movaps %xmm12, %xmm4
1303 ; SSE41-NEXT:    blendvps %xmm0, %xmm13, %xmm4
1304 ; SSE41-NEXT:    movdqa %xmm10, %xmm0
1305 ; SSE41-NEXT:    blendvps %xmm0, %xmm4, %xmm9
1306 ; SSE41-NEXT:    xorps %xmm4, %xmm4
1307 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm4
1308 ; SSE41-NEXT:    pxor %xmm11, %xmm4
1309 ; SSE41-NEXT:    pxor %xmm10, %xmm10
1310 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm10
1311 ; SSE41-NEXT:    pxor %xmm11, %xmm10
1312 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm4
1313 ; SSE41-NEXT:    psubd %xmm5, %xmm1
1314 ; SSE41-NEXT:    pxor %xmm0, %xmm0
1315 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm0
1316 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
1317 ; SSE41-NEXT:    pxor %xmm11, %xmm5
1318 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm5
1319 ; SSE41-NEXT:    pxor %xmm11, %xmm5
1320 ; SSE41-NEXT:    pandn %xmm5, %xmm4
1321 ; SSE41-NEXT:    movaps %xmm12, %xmm5
1322 ; SSE41-NEXT:    blendvps %xmm0, %xmm13, %xmm5
1323 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1324 ; SSE41-NEXT:    blendvps %xmm0, %xmm5, %xmm1
1325 ; SSE41-NEXT:    pxor %xmm4, %xmm4
1326 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm4
1327 ; SSE41-NEXT:    pxor %xmm11, %xmm4
1328 ; SSE41-NEXT:    xorps %xmm5, %xmm5
1329 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm5
1330 ; SSE41-NEXT:    pxor %xmm11, %xmm5
1331 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm4
1332 ; SSE41-NEXT:    psubd %xmm6, %xmm2
1333 ; SSE41-NEXT:    pxor %xmm0, %xmm0
1334 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm0
1335 ; SSE41-NEXT:    movdqa %xmm0, %xmm6
1336 ; SSE41-NEXT:    pxor %xmm11, %xmm6
1337 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm6
1338 ; SSE41-NEXT:    pxor %xmm11, %xmm6
1339 ; SSE41-NEXT:    pandn %xmm6, %xmm4
1340 ; SSE41-NEXT:    movaps %xmm12, %xmm5
1341 ; SSE41-NEXT:    blendvps %xmm0, %xmm13, %xmm5
1342 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1343 ; SSE41-NEXT:    blendvps %xmm0, %xmm5, %xmm2
1344 ; SSE41-NEXT:    pxor %xmm4, %xmm4
1345 ; SSE41-NEXT:    pcmpgtd %xmm7, %xmm4
1346 ; SSE41-NEXT:    pxor %xmm11, %xmm4
1347 ; SSE41-NEXT:    pxor %xmm0, %xmm0
1348 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm0
1349 ; SSE41-NEXT:    pxor %xmm11, %xmm0
1350 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
1351 ; SSE41-NEXT:    psubd %xmm7, %xmm3
1352 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm8
1353 ; SSE41-NEXT:    movdqa %xmm8, %xmm5
1354 ; SSE41-NEXT:    pxor %xmm11, %xmm5
1355 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
1356 ; SSE41-NEXT:    pxor %xmm11, %xmm5
1357 ; SSE41-NEXT:    pandn %xmm5, %xmm4
1358 ; SSE41-NEXT:    movdqa %xmm8, %xmm0
1359 ; SSE41-NEXT:    blendvps %xmm0, %xmm13, %xmm12
1360 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1361 ; SSE41-NEXT:    blendvps %xmm0, %xmm12, %xmm3
1362 ; SSE41-NEXT:    movaps %xmm9, %xmm0
1363 ; SSE41-NEXT:    retq
1365 ; AVX1-LABEL: v16i32:
1366 ; AVX1:       # %bb.0:
1367 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm9
1368 ; AVX1-NEXT:    vpxor %xmm10, %xmm10, %xmm10
1369 ; AVX1-NEXT:    vpcmpgtd %xmm9, %xmm10, %xmm7
1370 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
1371 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm8
1372 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
1373 ; AVX1-NEXT:    vpcmpgtd %xmm7, %xmm10, %xmm6
1374 ; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm12
1375 ; AVX1-NEXT:    vpcmpeqd %xmm8, %xmm12, %xmm8
1376 ; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm10, %xmm5
1377 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm11
1378 ; AVX1-NEXT:    vpcmpgtd %xmm0, %xmm10, %xmm5
1379 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm5
1380 ; AVX1-NEXT:    vpcmpeqd %xmm11, %xmm5, %xmm11
1381 ; AVX1-NEXT:    vinsertf128 $1, %xmm8, %ymm11, %ymm8
1382 ; AVX1-NEXT:    vpsubd %xmm9, %xmm7, %xmm9
1383 ; AVX1-NEXT:    vpcmpgtd %xmm9, %xmm10, %xmm7
1384 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm6
1385 ; AVX1-NEXT:    vpcmpeqd %xmm6, %xmm12, %xmm6
1386 ; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm11
1387 ; AVX1-NEXT:    vpsubd %xmm2, %xmm0, %xmm0
1388 ; AVX1-NEXT:    vpcmpgtd %xmm0, %xmm10, %xmm2
1389 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm6
1390 ; AVX1-NEXT:    vpcmpeqd %xmm6, %xmm5, %xmm5
1391 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm5
1392 ; AVX1-NEXT:    vinsertf128 $1, %xmm11, %ymm5, %ymm5
1393 ; AVX1-NEXT:    vandnps %ymm5, %ymm8, %ymm5
1394 ; AVX1-NEXT:    vinsertf128 $1, %xmm7, %ymm2, %ymm7
1395 ; AVX1-NEXT:    vmovaps {{.*#+}} ymm8 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
1396 ; AVX1-NEXT:    vmovaps {{.*#+}} ymm11 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1397 ; AVX1-NEXT:    vblendvps %ymm7, %ymm8, %ymm11, %ymm7
1398 ; AVX1-NEXT:    vinsertf128 $1, %xmm9, %ymm0, %ymm0
1399 ; AVX1-NEXT:    vblendvps %ymm5, %ymm7, %ymm0, %ymm0
1400 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm5
1401 ; AVX1-NEXT:    vpcmpgtd %xmm5, %xmm10, %xmm7
1402 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm7
1403 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1404 ; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm10, %xmm6
1405 ; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm6
1406 ; AVX1-NEXT:    vpcmpeqd %xmm7, %xmm6, %xmm9
1407 ; AVX1-NEXT:    vpcmpgtd %xmm3, %xmm10, %xmm7
1408 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm12
1409 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm10, %xmm7
1410 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm7
1411 ; AVX1-NEXT:    vpcmpeqd %xmm12, %xmm7, %xmm12
1412 ; AVX1-NEXT:    vinsertf128 $1, %xmm9, %ymm12, %ymm9
1413 ; AVX1-NEXT:    vpsubd %xmm5, %xmm2, %xmm12
1414 ; AVX1-NEXT:    vpcmpgtd %xmm12, %xmm10, %xmm5
1415 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm2
1416 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm6, %xmm2
1417 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
1418 ; AVX1-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
1419 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm10, %xmm3
1420 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm6
1421 ; AVX1-NEXT:    vpcmpeqd %xmm6, %xmm7, %xmm6
1422 ; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm4
1423 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm4, %ymm2
1424 ; AVX1-NEXT:    vandnps %ymm2, %ymm9, %ymm2
1425 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm3, %ymm3
1426 ; AVX1-NEXT:    vblendvps %ymm3, %ymm8, %ymm11, %ymm3
1427 ; AVX1-NEXT:    vinsertf128 $1, %xmm12, %ymm1, %ymm1
1428 ; AVX1-NEXT:    vblendvps %ymm2, %ymm3, %ymm1, %ymm1
1429 ; AVX1-NEXT:    retq
1431 ; AVX2-LABEL: v16i32:
1432 ; AVX2:       # %bb.0:
1433 ; AVX2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
1434 ; AVX2-NEXT:    vpcmpgtd %ymm2, %ymm4, %ymm5
1435 ; AVX2-NEXT:    vpcmpeqd %ymm6, %ymm6, %ymm6
1436 ; AVX2-NEXT:    vpxor %ymm6, %ymm5, %ymm5
1437 ; AVX2-NEXT:    vpcmpgtd %ymm0, %ymm4, %ymm7
1438 ; AVX2-NEXT:    vpxor %ymm6, %ymm7, %ymm7
1439 ; AVX2-NEXT:    vpcmpeqd %ymm5, %ymm7, %ymm5
1440 ; AVX2-NEXT:    vpsubd %ymm2, %ymm0, %ymm0
1441 ; AVX2-NEXT:    vpcmpgtd %ymm0, %ymm4, %ymm2
1442 ; AVX2-NEXT:    vpxor %ymm6, %ymm2, %ymm8
1443 ; AVX2-NEXT:    vpcmpeqd %ymm8, %ymm7, %ymm7
1444 ; AVX2-NEXT:    vpxor %ymm6, %ymm7, %ymm7
1445 ; AVX2-NEXT:    vpandn %ymm7, %ymm5, %ymm5
1446 ; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm7 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
1447 ; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm8 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1448 ; AVX2-NEXT:    vblendvps %ymm2, %ymm7, %ymm8, %ymm2
1449 ; AVX2-NEXT:    vblendvps %ymm5, %ymm2, %ymm0, %ymm0
1450 ; AVX2-NEXT:    vpcmpgtd %ymm3, %ymm4, %ymm2
1451 ; AVX2-NEXT:    vpxor %ymm6, %ymm2, %ymm2
1452 ; AVX2-NEXT:    vpcmpgtd %ymm1, %ymm4, %ymm5
1453 ; AVX2-NEXT:    vpxor %ymm6, %ymm5, %ymm5
1454 ; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm5, %ymm2
1455 ; AVX2-NEXT:    vpsubd %ymm3, %ymm1, %ymm1
1456 ; AVX2-NEXT:    vpcmpgtd %ymm1, %ymm4, %ymm3
1457 ; AVX2-NEXT:    vpxor %ymm6, %ymm3, %ymm4
1458 ; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm5, %ymm4
1459 ; AVX2-NEXT:    vpxor %ymm6, %ymm4, %ymm4
1460 ; AVX2-NEXT:    vpandn %ymm4, %ymm2, %ymm2
1461 ; AVX2-NEXT:    vblendvps %ymm3, %ymm7, %ymm8, %ymm3
1462 ; AVX2-NEXT:    vblendvps %ymm2, %ymm3, %ymm1, %ymm1
1463 ; AVX2-NEXT:    retq
1465 ; AVX512-LABEL: v16i32:
1466 ; AVX512:       # %bb.0:
1467 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1468 ; AVX512-NEXT:    vpcmpnltd %zmm2, %zmm1, %k0
1469 ; AVX512-NEXT:    vpcmpnltd %zmm2, %zmm0, %k1
1470 ; AVX512-NEXT:    kxorw %k0, %k1, %k0
1471 ; AVX512-NEXT:    vpsubd %zmm1, %zmm0, %zmm0
1472 ; AVX512-NEXT:    vpcmpnltd %zmm2, %zmm0, %k2
1473 ; AVX512-NEXT:    kxorw %k2, %k1, %k1
1474 ; AVX512-NEXT:    kandw %k1, %k0, %k1
1475 ; AVX512-NEXT:    vpcmpgtd %zmm0, %zmm2, %k2
1476 ; AVX512-NEXT:    vpbroadcastd {{.*#+}} zmm1 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1477 ; AVX512-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm1 {%k2}
1478 ; AVX512-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1}
1479 ; AVX512-NEXT:    retq
1480   %z = call <16 x i32> @llvm.ssub.sat.v16i32(<16 x i32> %x, <16 x i32> %y)
1481   ret <16 x i32> %z
1484 define <2 x i64> @v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {
1485 ; SSE2-LABEL: v2i64:
1486 ; SSE2:       # %bb.0:
1487 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1488 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1489 ; SSE2-NEXT:    psubq %xmm1, %xmm0
1490 ; SSE2-NEXT:    pxor %xmm2, %xmm1
1491 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1492 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
1493 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1494 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm1
1495 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1496 ; SSE2-NEXT:    pand %xmm5, %xmm1
1497 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1498 ; SSE2-NEXT:    por %xmm1, %xmm4
1499 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm5
1500 ; SSE2-NEXT:    pxor %xmm5, %xmm4
1501 ; SSE2-NEXT:    pxor %xmm2, %xmm3
1502 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1503 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm1
1504 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
1505 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
1506 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1507 ; SSE2-NEXT:    pand %xmm6, %xmm3
1508 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
1509 ; SSE2-NEXT:    por %xmm3, %xmm6
1510 ; SSE2-NEXT:    pxor %xmm5, %xmm6
1511 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm4
1512 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,0,3,2]
1513 ; SSE2-NEXT:    pand %xmm4, %xmm1
1514 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1515 ; SSE2-NEXT:    pxor %xmm2, %xmm3
1516 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1517 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
1518 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
1519 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
1520 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1521 ; SSE2-NEXT:    pand %xmm7, %xmm2
1522 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1523 ; SSE2-NEXT:    por %xmm2, %xmm3
1524 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
1525 ; SSE2-NEXT:    pxor %xmm5, %xmm2
1526 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm2
1527 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,0,3,2]
1528 ; SSE2-NEXT:    pand %xmm2, %xmm4
1529 ; SSE2-NEXT:    pxor %xmm5, %xmm4
1530 ; SSE2-NEXT:    pandn %xmm4, %xmm1
1531 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
1532 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm2
1533 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1534 ; SSE2-NEXT:    por %xmm2, %xmm3
1535 ; SSE2-NEXT:    pand %xmm1, %xmm3
1536 ; SSE2-NEXT:    pandn %xmm0, %xmm1
1537 ; SSE2-NEXT:    por %xmm3, %xmm1
1538 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1539 ; SSE2-NEXT:    retq
1541 ; SSSE3-LABEL: v2i64:
1542 ; SSSE3:       # %bb.0:
1543 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1544 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
1545 ; SSSE3-NEXT:    psubq %xmm1, %xmm0
1546 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
1547 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
1548 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
1549 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1550 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm1
1551 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1552 ; SSSE3-NEXT:    pand %xmm5, %xmm1
1553 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1554 ; SSSE3-NEXT:    por %xmm1, %xmm4
1555 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm5
1556 ; SSSE3-NEXT:    pxor %xmm5, %xmm4
1557 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
1558 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1559 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm1
1560 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
1561 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm3
1562 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1563 ; SSSE3-NEXT:    pand %xmm6, %xmm3
1564 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
1565 ; SSSE3-NEXT:    por %xmm3, %xmm6
1566 ; SSSE3-NEXT:    pxor %xmm5, %xmm6
1567 ; SSSE3-NEXT:    pcmpeqd %xmm6, %xmm4
1568 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,0,3,2]
1569 ; SSSE3-NEXT:    pand %xmm4, %xmm1
1570 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
1571 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
1572 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
1573 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
1574 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
1575 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm3
1576 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1577 ; SSSE3-NEXT:    pand %xmm7, %xmm2
1578 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1579 ; SSSE3-NEXT:    por %xmm2, %xmm3
1580 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
1581 ; SSSE3-NEXT:    pxor %xmm5, %xmm2
1582 ; SSSE3-NEXT:    pcmpeqd %xmm6, %xmm2
1583 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,0,3,2]
1584 ; SSSE3-NEXT:    pand %xmm2, %xmm4
1585 ; SSSE3-NEXT:    pxor %xmm5, %xmm4
1586 ; SSSE3-NEXT:    pandn %xmm4, %xmm1
1587 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
1588 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm2
1589 ; SSSE3-NEXT:    pand {{.*}}(%rip), %xmm3
1590 ; SSSE3-NEXT:    por %xmm2, %xmm3
1591 ; SSSE3-NEXT:    pand %xmm1, %xmm3
1592 ; SSSE3-NEXT:    pandn %xmm0, %xmm1
1593 ; SSSE3-NEXT:    por %xmm3, %xmm1
1594 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1595 ; SSSE3-NEXT:    retq
1597 ; SSE41-LABEL: v2i64:
1598 ; SSE41:       # %bb.0:
1599 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1600 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
1601 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
1602 ; SSE41-NEXT:    psubq %xmm1, %xmm2
1603 ; SSE41-NEXT:    pxor %xmm0, %xmm1
1604 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
1605 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm4
1606 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1607 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
1608 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
1609 ; SSE41-NEXT:    pand %xmm5, %xmm6
1610 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
1611 ; SSE41-NEXT:    por %xmm6, %xmm1
1612 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm4
1613 ; SSE41-NEXT:    pxor %xmm4, %xmm1
1614 ; SSE41-NEXT:    pxor %xmm0, %xmm3
1615 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
1616 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm5
1617 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1618 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
1619 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1620 ; SSE41-NEXT:    pand %xmm6, %xmm3
1621 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1622 ; SSE41-NEXT:    por %xmm3, %xmm5
1623 ; SSE41-NEXT:    pxor %xmm4, %xmm5
1624 ; SSE41-NEXT:    pcmpeqq %xmm5, %xmm1
1625 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
1626 ; SSE41-NEXT:    pxor %xmm0, %xmm3
1627 ; SSE41-NEXT:    movdqa %xmm0, %xmm6
1628 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm6
1629 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1630 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
1631 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1632 ; SSE41-NEXT:    pand %xmm7, %xmm3
1633 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
1634 ; SSE41-NEXT:    por %xmm3, %xmm0
1635 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
1636 ; SSE41-NEXT:    pxor %xmm4, %xmm3
1637 ; SSE41-NEXT:    pcmpeqq %xmm5, %xmm3
1638 ; SSE41-NEXT:    pxor %xmm4, %xmm3
1639 ; SSE41-NEXT:    pandn %xmm3, %xmm1
1640 ; SSE41-NEXT:    movapd {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1641 ; SSE41-NEXT:    blendvpd %xmm0, {{.*}}(%rip), %xmm3
1642 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1643 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
1644 ; SSE41-NEXT:    movapd %xmm2, %xmm0
1645 ; SSE41-NEXT:    retq
1647 ; AVX1-LABEL: v2i64:
1648 ; AVX1:       # %bb.0:
1649 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1650 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm3
1651 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
1652 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
1653 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm5
1654 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm5
1655 ; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm5, %xmm3
1656 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
1657 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm1
1658 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm2
1659 ; AVX1-NEXT:    vpcmpeqq %xmm2, %xmm5, %xmm2
1660 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
1661 ; AVX1-NEXT:    vpandn %xmm2, %xmm3, %xmm2
1662 ; AVX1-NEXT:    vmovapd {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1663 ; AVX1-NEXT:    vblendvpd %xmm1, {{.*}}(%rip), %xmm3, %xmm1
1664 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
1665 ; AVX1-NEXT:    retq
1667 ; AVX2-LABEL: v2i64:
1668 ; AVX2:       # %bb.0:
1669 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1670 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm3
1671 ; AVX2-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
1672 ; AVX2-NEXT:    vpxor %xmm4, %xmm3, %xmm3
1673 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm5
1674 ; AVX2-NEXT:    vpxor %xmm4, %xmm5, %xmm5
1675 ; AVX2-NEXT:    vpcmpeqq %xmm3, %xmm5, %xmm3
1676 ; AVX2-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
1677 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm1
1678 ; AVX2-NEXT:    vpxor %xmm4, %xmm1, %xmm2
1679 ; AVX2-NEXT:    vpcmpeqq %xmm2, %xmm5, %xmm2
1680 ; AVX2-NEXT:    vpxor %xmm4, %xmm2, %xmm2
1681 ; AVX2-NEXT:    vpandn %xmm2, %xmm3, %xmm2
1682 ; AVX2-NEXT:    vmovapd {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1683 ; AVX2-NEXT:    vblendvpd %xmm1, {{.*}}(%rip), %xmm3, %xmm1
1684 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
1685 ; AVX2-NEXT:    retq
1687 ; AVX512-LABEL: v2i64:
1688 ; AVX512:       # %bb.0:
1689 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1690 ; AVX512-NEXT:    vpcmpnltq %xmm2, %xmm1, %k0
1691 ; AVX512-NEXT:    vpcmpnltq %xmm2, %xmm0, %k1
1692 ; AVX512-NEXT:    kxorw %k0, %k1, %k0
1693 ; AVX512-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
1694 ; AVX512-NEXT:    vpcmpnltq %xmm2, %xmm0, %k2
1695 ; AVX512-NEXT:    kxorw %k2, %k1, %k1
1696 ; AVX512-NEXT:    kandw %k1, %k0, %k1
1697 ; AVX512-NEXT:    vpcmpgtq %xmm0, %xmm2, %k2
1698 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
1699 ; AVX512-NEXT:    vmovdqa64 {{.*}}(%rip), %xmm1 {%k2}
1700 ; AVX512-NEXT:    vmovdqa64 %xmm1, %xmm0 {%k1}
1701 ; AVX512-NEXT:    retq
1702   %z = call <2 x i64> @llvm.ssub.sat.v2i64(<2 x i64> %x, <2 x i64> %y)
1703   ret <2 x i64> %z
1706 define <4 x i64> @v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
1707 ; SSE2-LABEL: v4i64:
1708 ; SSE2:       # %bb.0:
1709 ; SSE2-NEXT:    movdqa %xmm0, %xmm10
1710 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648]
1711 ; SSE2-NEXT:    psubq %xmm2, %xmm10
1712 ; SSE2-NEXT:    pxor %xmm5, %xmm2
1713 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
1714 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
1715 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1716 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm2
1717 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1718 ; SSE2-NEXT:    pand %xmm7, %xmm2
1719 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
1720 ; SSE2-NEXT:    por %xmm2, %xmm7
1721 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm9
1722 ; SSE2-NEXT:    pxor %xmm9, %xmm7
1723 ; SSE2-NEXT:    pxor %xmm5, %xmm0
1724 ; SSE2-NEXT:    movdqa %xmm5, %xmm2
1725 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
1726 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
1727 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm0
1728 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1729 ; SSE2-NEXT:    pand %xmm6, %xmm0
1730 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1731 ; SSE2-NEXT:    por %xmm0, %xmm2
1732 ; SSE2-NEXT:    pxor %xmm9, %xmm2
1733 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm7
1734 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,0,3,2]
1735 ; SSE2-NEXT:    pand %xmm7, %xmm0
1736 ; SSE2-NEXT:    movdqa %xmm10, %xmm6
1737 ; SSE2-NEXT:    pxor %xmm5, %xmm6
1738 ; SSE2-NEXT:    movdqa %xmm5, %xmm7
1739 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
1740 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
1741 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
1742 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1743 ; SSE2-NEXT:    pand %xmm4, %xmm6
1744 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3]
1745 ; SSE2-NEXT:    por %xmm6, %xmm4
1746 ; SSE2-NEXT:    movdqa %xmm4, %xmm6
1747 ; SSE2-NEXT:    pxor %xmm9, %xmm6
1748 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm6
1749 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,0,3,2]
1750 ; SSE2-NEXT:    pand %xmm6, %xmm2
1751 ; SSE2-NEXT:    pxor %xmm9, %xmm2
1752 ; SSE2-NEXT:    pandn %xmm2, %xmm0
1753 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [9223372036854775808,9223372036854775808]
1754 ; SSE2-NEXT:    movdqa %xmm4, %xmm2
1755 ; SSE2-NEXT:    pandn %xmm8, %xmm2
1756 ; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [9223372036854775807,9223372036854775807]
1757 ; SSE2-NEXT:    pand %xmm11, %xmm4
1758 ; SSE2-NEXT:    por %xmm2, %xmm4
1759 ; SSE2-NEXT:    pand %xmm0, %xmm4
1760 ; SSE2-NEXT:    pandn %xmm10, %xmm0
1761 ; SSE2-NEXT:    por %xmm4, %xmm0
1762 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1763 ; SSE2-NEXT:    psubq %xmm3, %xmm1
1764 ; SSE2-NEXT:    pxor %xmm5, %xmm3
1765 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
1766 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
1767 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1768 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm3
1769 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1770 ; SSE2-NEXT:    pand %xmm6, %xmm3
1771 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1772 ; SSE2-NEXT:    por %xmm3, %xmm4
1773 ; SSE2-NEXT:    pxor %xmm9, %xmm4
1774 ; SSE2-NEXT:    pxor %xmm5, %xmm2
1775 ; SSE2-NEXT:    movdqa %xmm5, %xmm3
1776 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
1777 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
1778 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm2
1779 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1780 ; SSE2-NEXT:    pand %xmm6, %xmm2
1781 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1782 ; SSE2-NEXT:    por %xmm2, %xmm3
1783 ; SSE2-NEXT:    pxor %xmm9, %xmm3
1784 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
1785 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,0,3,2]
1786 ; SSE2-NEXT:    pand %xmm4, %xmm2
1787 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1788 ; SSE2-NEXT:    pxor %xmm5, %xmm4
1789 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
1790 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
1791 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1792 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm4
1793 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1794 ; SSE2-NEXT:    pand %xmm7, %xmm4
1795 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
1796 ; SSE2-NEXT:    por %xmm4, %xmm5
1797 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
1798 ; SSE2-NEXT:    pxor %xmm9, %xmm4
1799 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
1800 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,0,3,2]
1801 ; SSE2-NEXT:    pand %xmm4, %xmm3
1802 ; SSE2-NEXT:    pxor %xmm9, %xmm3
1803 ; SSE2-NEXT:    pandn %xmm3, %xmm2
1804 ; SSE2-NEXT:    movdqa %xmm5, %xmm3
1805 ; SSE2-NEXT:    pandn %xmm8, %xmm3
1806 ; SSE2-NEXT:    pand %xmm11, %xmm5
1807 ; SSE2-NEXT:    por %xmm3, %xmm5
1808 ; SSE2-NEXT:    pand %xmm2, %xmm5
1809 ; SSE2-NEXT:    pandn %xmm1, %xmm2
1810 ; SSE2-NEXT:    por %xmm5, %xmm2
1811 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1812 ; SSE2-NEXT:    retq
1814 ; SSSE3-LABEL: v4i64:
1815 ; SSSE3:       # %bb.0:
1816 ; SSSE3-NEXT:    movdqa %xmm0, %xmm10
1817 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648]
1818 ; SSSE3-NEXT:    psubq %xmm2, %xmm10
1819 ; SSSE3-NEXT:    pxor %xmm5, %xmm2
1820 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
1821 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm6
1822 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1823 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm2
1824 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1825 ; SSSE3-NEXT:    pand %xmm7, %xmm2
1826 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
1827 ; SSSE3-NEXT:    por %xmm2, %xmm7
1828 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm9
1829 ; SSSE3-NEXT:    pxor %xmm9, %xmm7
1830 ; SSSE3-NEXT:    pxor %xmm5, %xmm0
1831 ; SSSE3-NEXT:    movdqa %xmm5, %xmm2
1832 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
1833 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
1834 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm0
1835 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1836 ; SSSE3-NEXT:    pand %xmm6, %xmm0
1837 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1838 ; SSSE3-NEXT:    por %xmm0, %xmm2
1839 ; SSSE3-NEXT:    pxor %xmm9, %xmm2
1840 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm7
1841 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,0,3,2]
1842 ; SSSE3-NEXT:    pand %xmm7, %xmm0
1843 ; SSSE3-NEXT:    movdqa %xmm10, %xmm6
1844 ; SSSE3-NEXT:    pxor %xmm5, %xmm6
1845 ; SSSE3-NEXT:    movdqa %xmm5, %xmm7
1846 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm7
1847 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
1848 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm6
1849 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1850 ; SSSE3-NEXT:    pand %xmm4, %xmm6
1851 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3]
1852 ; SSSE3-NEXT:    por %xmm6, %xmm4
1853 ; SSSE3-NEXT:    movdqa %xmm4, %xmm6
1854 ; SSSE3-NEXT:    pxor %xmm9, %xmm6
1855 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm6
1856 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,0,3,2]
1857 ; SSSE3-NEXT:    pand %xmm6, %xmm2
1858 ; SSSE3-NEXT:    pxor %xmm9, %xmm2
1859 ; SSSE3-NEXT:    pandn %xmm2, %xmm0
1860 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [9223372036854775808,9223372036854775808]
1861 ; SSSE3-NEXT:    movdqa %xmm4, %xmm2
1862 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
1863 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm11 = [9223372036854775807,9223372036854775807]
1864 ; SSSE3-NEXT:    pand %xmm11, %xmm4
1865 ; SSSE3-NEXT:    por %xmm2, %xmm4
1866 ; SSSE3-NEXT:    pand %xmm0, %xmm4
1867 ; SSSE3-NEXT:    pandn %xmm10, %xmm0
1868 ; SSSE3-NEXT:    por %xmm4, %xmm0
1869 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1870 ; SSSE3-NEXT:    psubq %xmm3, %xmm1
1871 ; SSSE3-NEXT:    pxor %xmm5, %xmm3
1872 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
1873 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
1874 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1875 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm3
1876 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1877 ; SSSE3-NEXT:    pand %xmm6, %xmm3
1878 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1879 ; SSSE3-NEXT:    por %xmm3, %xmm4
1880 ; SSSE3-NEXT:    pxor %xmm9, %xmm4
1881 ; SSSE3-NEXT:    pxor %xmm5, %xmm2
1882 ; SSSE3-NEXT:    movdqa %xmm5, %xmm3
1883 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
1884 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
1885 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm2
1886 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1887 ; SSSE3-NEXT:    pand %xmm6, %xmm2
1888 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1889 ; SSSE3-NEXT:    por %xmm2, %xmm3
1890 ; SSSE3-NEXT:    pxor %xmm9, %xmm3
1891 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm4
1892 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,0,3,2]
1893 ; SSSE3-NEXT:    pand %xmm4, %xmm2
1894 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
1895 ; SSSE3-NEXT:    pxor %xmm5, %xmm4
1896 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
1897 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
1898 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1899 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm4
1900 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1901 ; SSSE3-NEXT:    pand %xmm7, %xmm4
1902 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
1903 ; SSSE3-NEXT:    por %xmm4, %xmm5
1904 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
1905 ; SSSE3-NEXT:    pxor %xmm9, %xmm4
1906 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm4
1907 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,0,3,2]
1908 ; SSSE3-NEXT:    pand %xmm4, %xmm3
1909 ; SSSE3-NEXT:    pxor %xmm9, %xmm3
1910 ; SSSE3-NEXT:    pandn %xmm3, %xmm2
1911 ; SSSE3-NEXT:    movdqa %xmm5, %xmm3
1912 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
1913 ; SSSE3-NEXT:    pand %xmm11, %xmm5
1914 ; SSSE3-NEXT:    por %xmm3, %xmm5
1915 ; SSSE3-NEXT:    pand %xmm2, %xmm5
1916 ; SSSE3-NEXT:    pandn %xmm1, %xmm2
1917 ; SSSE3-NEXT:    por %xmm5, %xmm2
1918 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1919 ; SSSE3-NEXT:    retq
1921 ; SSE41-LABEL: v4i64:
1922 ; SSE41:       # %bb.0:
1923 ; SSE41-NEXT:    movdqa %xmm0, %xmm9
1924 ; SSE41-NEXT:    movdqa {{.*#+}} xmm11 = [2147483648,2147483648]
1925 ; SSE41-NEXT:    psubq %xmm2, %xmm9
1926 ; SSE41-NEXT:    pxor %xmm11, %xmm2
1927 ; SSE41-NEXT:    movdqa %xmm11, %xmm6
1928 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm6
1929 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1930 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm2
1931 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
1932 ; SSE41-NEXT:    pand %xmm7, %xmm4
1933 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
1934 ; SSE41-NEXT:    por %xmm4, %xmm2
1935 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm10
1936 ; SSE41-NEXT:    pxor %xmm10, %xmm2
1937 ; SSE41-NEXT:    pxor %xmm11, %xmm0
1938 ; SSE41-NEXT:    movdqa %xmm11, %xmm4
1939 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
1940 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
1941 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
1942 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1943 ; SSE41-NEXT:    pand %xmm7, %xmm0
1944 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1945 ; SSE41-NEXT:    por %xmm0, %xmm4
1946 ; SSE41-NEXT:    pxor %xmm10, %xmm4
1947 ; SSE41-NEXT:    pcmpeqq %xmm4, %xmm2
1948 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
1949 ; SSE41-NEXT:    pxor %xmm11, %xmm0
1950 ; SSE41-NEXT:    movdqa %xmm11, %xmm7
1951 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
1952 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[0,0,2,2]
1953 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
1954 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
1955 ; SSE41-NEXT:    pand %xmm6, %xmm5
1956 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
1957 ; SSE41-NEXT:    por %xmm5, %xmm0
1958 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
1959 ; SSE41-NEXT:    pxor %xmm10, %xmm5
1960 ; SSE41-NEXT:    pcmpeqq %xmm4, %xmm5
1961 ; SSE41-NEXT:    pxor %xmm10, %xmm5
1962 ; SSE41-NEXT:    pandn %xmm5, %xmm2
1963 ; SSE41-NEXT:    movapd {{.*#+}} xmm8 = [9223372036854775807,9223372036854775807]
1964 ; SSE41-NEXT:    movapd {{.*#+}} xmm7 = [9223372036854775808,9223372036854775808]
1965 ; SSE41-NEXT:    movapd %xmm7, %xmm4
1966 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm4
1967 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1968 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm9
1969 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1970 ; SSE41-NEXT:    psubq %xmm3, %xmm1
1971 ; SSE41-NEXT:    pxor %xmm11, %xmm3
1972 ; SSE41-NEXT:    movdqa %xmm11, %xmm2
1973 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm2
1974 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1975 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm3
1976 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1977 ; SSE41-NEXT:    pand %xmm4, %xmm3
1978 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1979 ; SSE41-NEXT:    por %xmm3, %xmm2
1980 ; SSE41-NEXT:    pxor %xmm10, %xmm2
1981 ; SSE41-NEXT:    pxor %xmm11, %xmm0
1982 ; SSE41-NEXT:    movdqa %xmm11, %xmm3
1983 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
1984 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1985 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
1986 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1987 ; SSE41-NEXT:    pand %xmm4, %xmm0
1988 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1989 ; SSE41-NEXT:    por %xmm0, %xmm3
1990 ; SSE41-NEXT:    pxor %xmm10, %xmm3
1991 ; SSE41-NEXT:    pcmpeqq %xmm3, %xmm2
1992 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1993 ; SSE41-NEXT:    pxor %xmm11, %xmm0
1994 ; SSE41-NEXT:    movdqa %xmm11, %xmm4
1995 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
1996 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1997 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
1998 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
1999 ; SSE41-NEXT:    pand %xmm5, %xmm6
2000 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
2001 ; SSE41-NEXT:    por %xmm6, %xmm0
2002 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
2003 ; SSE41-NEXT:    pxor %xmm10, %xmm4
2004 ; SSE41-NEXT:    pcmpeqq %xmm3, %xmm4
2005 ; SSE41-NEXT:    pxor %xmm10, %xmm4
2006 ; SSE41-NEXT:    pandn %xmm4, %xmm2
2007 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm7
2008 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
2009 ; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
2010 ; SSE41-NEXT:    movapd %xmm9, %xmm0
2011 ; SSE41-NEXT:    retq
2013 ; AVX1-LABEL: v4i64:
2014 ; AVX1:       # %bb.0:
2015 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2016 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
2017 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm4
2018 ; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
2019 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
2020 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
2021 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm3, %xmm7
2022 ; AVX1-NEXT:    vpxor %xmm5, %xmm7, %xmm7
2023 ; AVX1-NEXT:    vpcmpeqq %xmm4, %xmm7, %xmm8
2024 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm4
2025 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm9
2026 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm3, %xmm4
2027 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
2028 ; AVX1-NEXT:    vpcmpeqq %xmm9, %xmm4, %xmm9
2029 ; AVX1-NEXT:    vinsertf128 $1, %xmm8, %ymm9, %ymm8
2030 ; AVX1-NEXT:    vpsubq %xmm2, %xmm6, %xmm9
2031 ; AVX1-NEXT:    vpcmpgtq %xmm9, %xmm3, %xmm6
2032 ; AVX1-NEXT:    vpxor %xmm5, %xmm6, %xmm2
2033 ; AVX1-NEXT:    vpcmpeqq %xmm2, %xmm7, %xmm2
2034 ; AVX1-NEXT:    vpxor %xmm5, %xmm2, %xmm2
2035 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
2036 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm3, %xmm1
2037 ; AVX1-NEXT:    vpxor %xmm5, %xmm1, %xmm3
2038 ; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm4, %xmm3
2039 ; AVX1-NEXT:    vpxor %xmm5, %xmm3, %xmm3
2040 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
2041 ; AVX1-NEXT:    vandnpd %ymm2, %ymm8, %ymm2
2042 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
2043 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2044 ; AVX1-NEXT:    vblendvpd %ymm1, {{.*}}(%rip), %ymm3, %ymm1
2045 ; AVX1-NEXT:    vinsertf128 $1, %xmm9, %ymm0, %ymm0
2046 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
2047 ; AVX1-NEXT:    retq
2049 ; AVX2-LABEL: v4i64:
2050 ; AVX2:       # %bb.0:
2051 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2052 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm3
2053 ; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm4, %ymm4
2054 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm3
2055 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm5
2056 ; AVX2-NEXT:    vpxor %ymm4, %ymm5, %ymm5
2057 ; AVX2-NEXT:    vpcmpeqq %ymm3, %ymm5, %ymm3
2058 ; AVX2-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
2059 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm1
2060 ; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm2
2061 ; AVX2-NEXT:    vpcmpeqq %ymm2, %ymm5, %ymm2
2062 ; AVX2-NEXT:    vpxor %ymm4, %ymm2, %ymm2
2063 ; AVX2-NEXT:    vpandn %ymm2, %ymm3, %ymm2
2064 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm3 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
2065 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2066 ; AVX2-NEXT:    vblendvpd %ymm1, %ymm3, %ymm4, %ymm1
2067 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
2068 ; AVX2-NEXT:    retq
2070 ; AVX512-LABEL: v4i64:
2071 ; AVX512:       # %bb.0:
2072 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2073 ; AVX512-NEXT:    vpcmpnltq %ymm2, %ymm1, %k0
2074 ; AVX512-NEXT:    vpcmpnltq %ymm2, %ymm0, %k1
2075 ; AVX512-NEXT:    kxorw %k0, %k1, %k0
2076 ; AVX512-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
2077 ; AVX512-NEXT:    vpcmpnltq %ymm2, %ymm0, %k2
2078 ; AVX512-NEXT:    kxorw %k2, %k1, %k1
2079 ; AVX512-NEXT:    kandw %k1, %k0, %k1
2080 ; AVX512-NEXT:    vpcmpgtq %ymm0, %ymm2, %k2
2081 ; AVX512-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2082 ; AVX512-NEXT:    vpbroadcastq {{.*}}(%rip), %ymm1 {%k2}
2083 ; AVX512-NEXT:    vmovdqa64 %ymm1, %ymm0 {%k1}
2084 ; AVX512-NEXT:    retq
2085   %z = call <4 x i64> @llvm.ssub.sat.v4i64(<4 x i64> %x, <4 x i64> %y)
2086   ret <4 x i64> %z
2089 define <8 x i64> @v8i64(<8 x i64> %x, <8 x i64> %y) nounwind {
2090 ; SSE2-LABEL: v8i64:
2091 ; SSE2:       # %bb.0:
2092 ; SSE2-NEXT:    movdqa %xmm1, %xmm8
2093 ; SSE2-NEXT:    movdqa %xmm0, %xmm13
2094 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648]
2095 ; SSE2-NEXT:    psubq %xmm4, %xmm13
2096 ; SSE2-NEXT:    pxor %xmm9, %xmm4
2097 ; SSE2-NEXT:    movdqa %xmm9, %xmm1
2098 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm1
2099 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm1[0,0,2,2]
2100 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm4
2101 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2102 ; SSE2-NEXT:    pand %xmm10, %xmm4
2103 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2104 ; SSE2-NEXT:    por %xmm4, %xmm1
2105 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm10
2106 ; SSE2-NEXT:    pxor %xmm10, %xmm1
2107 ; SSE2-NEXT:    pxor %xmm9, %xmm0
2108 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
2109 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
2110 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm4[0,0,2,2]
2111 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm0
2112 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2113 ; SSE2-NEXT:    pand %xmm11, %xmm0
2114 ; SSE2-NEXT:    pshufd {{.*#+}} xmm15 = xmm4[1,1,3,3]
2115 ; SSE2-NEXT:    por %xmm0, %xmm15
2116 ; SSE2-NEXT:    pxor %xmm10, %xmm15
2117 ; SSE2-NEXT:    pcmpeqd %xmm15, %xmm1
2118 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]
2119 ; SSE2-NEXT:    pand %xmm1, %xmm0
2120 ; SSE2-NEXT:    movdqa %xmm13, %xmm1
2121 ; SSE2-NEXT:    pxor %xmm9, %xmm1
2122 ; SSE2-NEXT:    movdqa %xmm9, %xmm11
2123 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm11
2124 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
2125 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
2126 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm1[1,1,3,3]
2127 ; SSE2-NEXT:    pand %xmm12, %xmm14
2128 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3]
2129 ; SSE2-NEXT:    por %xmm14, %xmm1
2130 ; SSE2-NEXT:    movdqa %xmm1, %xmm11
2131 ; SSE2-NEXT:    pxor %xmm10, %xmm11
2132 ; SSE2-NEXT:    pcmpeqd %xmm15, %xmm11
2133 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm11[1,0,3,2]
2134 ; SSE2-NEXT:    pand %xmm11, %xmm4
2135 ; SSE2-NEXT:    pxor %xmm10, %xmm4
2136 ; SSE2-NEXT:    pandn %xmm4, %xmm0
2137 ; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [9223372036854775808,9223372036854775808]
2138 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
2139 ; SSE2-NEXT:    pandn %xmm11, %xmm4
2140 ; SSE2-NEXT:    movdqa {{.*#+}} xmm12 = [9223372036854775807,9223372036854775807]
2141 ; SSE2-NEXT:    pand %xmm12, %xmm1
2142 ; SSE2-NEXT:    por %xmm4, %xmm1
2143 ; SSE2-NEXT:    pand %xmm0, %xmm1
2144 ; SSE2-NEXT:    pandn %xmm13, %xmm0
2145 ; SSE2-NEXT:    por %xmm1, %xmm0
2146 ; SSE2-NEXT:    movdqa %xmm8, %xmm1
2147 ; SSE2-NEXT:    psubq %xmm5, %xmm8
2148 ; SSE2-NEXT:    pxor %xmm9, %xmm5
2149 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
2150 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm4
2151 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm4[0,0,2,2]
2152 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm5
2153 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2154 ; SSE2-NEXT:    pand %xmm13, %xmm5
2155 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2156 ; SSE2-NEXT:    por %xmm5, %xmm4
2157 ; SSE2-NEXT:    pxor %xmm10, %xmm4
2158 ; SSE2-NEXT:    pxor %xmm9, %xmm1
2159 ; SSE2-NEXT:    movdqa %xmm9, %xmm5
2160 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm5
2161 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm5[0,0,2,2]
2162 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
2163 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2164 ; SSE2-NEXT:    pand %xmm13, %xmm1
2165 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2166 ; SSE2-NEXT:    por %xmm1, %xmm5
2167 ; SSE2-NEXT:    pxor %xmm10, %xmm5
2168 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm4
2169 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,0,3,2]
2170 ; SSE2-NEXT:    pand %xmm4, %xmm1
2171 ; SSE2-NEXT:    movdqa %xmm8, %xmm4
2172 ; SSE2-NEXT:    pxor %xmm9, %xmm4
2173 ; SSE2-NEXT:    movdqa %xmm9, %xmm13
2174 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm13
2175 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm13[0,0,2,2]
2176 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm4
2177 ; SSE2-NEXT:    pshufd {{.*#+}} xmm15 = xmm4[1,1,3,3]
2178 ; SSE2-NEXT:    pand %xmm14, %xmm15
2179 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm13[1,1,3,3]
2180 ; SSE2-NEXT:    por %xmm15, %xmm4
2181 ; SSE2-NEXT:    movdqa %xmm4, %xmm13
2182 ; SSE2-NEXT:    pxor %xmm10, %xmm13
2183 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm13
2184 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm13[1,0,3,2]
2185 ; SSE2-NEXT:    pand %xmm13, %xmm5
2186 ; SSE2-NEXT:    pxor %xmm10, %xmm5
2187 ; SSE2-NEXT:    pandn %xmm5, %xmm1
2188 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
2189 ; SSE2-NEXT:    pandn %xmm11, %xmm5
2190 ; SSE2-NEXT:    pand %xmm12, %xmm4
2191 ; SSE2-NEXT:    por %xmm5, %xmm4
2192 ; SSE2-NEXT:    pand %xmm1, %xmm4
2193 ; SSE2-NEXT:    pandn %xmm8, %xmm1
2194 ; SSE2-NEXT:    por %xmm4, %xmm1
2195 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
2196 ; SSE2-NEXT:    psubq %xmm6, %xmm2
2197 ; SSE2-NEXT:    pxor %xmm9, %xmm6
2198 ; SSE2-NEXT:    movdqa %xmm9, %xmm5
2199 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
2200 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm5[0,0,2,2]
2201 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm6
2202 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2203 ; SSE2-NEXT:    pand %xmm8, %xmm6
2204 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2205 ; SSE2-NEXT:    por %xmm6, %xmm5
2206 ; SSE2-NEXT:    pxor %xmm10, %xmm5
2207 ; SSE2-NEXT:    pxor %xmm9, %xmm4
2208 ; SSE2-NEXT:    movdqa %xmm9, %xmm6
2209 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
2210 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
2211 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm4
2212 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2213 ; SSE2-NEXT:    pand %xmm8, %xmm4
2214 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2215 ; SSE2-NEXT:    por %xmm4, %xmm6
2216 ; SSE2-NEXT:    pxor %xmm10, %xmm6
2217 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm5
2218 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm5[1,0,3,2]
2219 ; SSE2-NEXT:    pand %xmm5, %xmm8
2220 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
2221 ; SSE2-NEXT:    pxor %xmm9, %xmm5
2222 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
2223 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm4
2224 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm4[0,0,2,2]
2225 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm5
2226 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2227 ; SSE2-NEXT:    pand %xmm13, %xmm5
2228 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2229 ; SSE2-NEXT:    por %xmm5, %xmm4
2230 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
2231 ; SSE2-NEXT:    pxor %xmm10, %xmm5
2232 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm5
2233 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,0,3,2]
2234 ; SSE2-NEXT:    pand %xmm5, %xmm6
2235 ; SSE2-NEXT:    pxor %xmm10, %xmm6
2236 ; SSE2-NEXT:    pandn %xmm6, %xmm8
2237 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
2238 ; SSE2-NEXT:    pandn %xmm11, %xmm5
2239 ; SSE2-NEXT:    pand %xmm12, %xmm4
2240 ; SSE2-NEXT:    por %xmm5, %xmm4
2241 ; SSE2-NEXT:    pand %xmm8, %xmm4
2242 ; SSE2-NEXT:    pandn %xmm2, %xmm8
2243 ; SSE2-NEXT:    por %xmm4, %xmm8
2244 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
2245 ; SSE2-NEXT:    psubq %xmm7, %xmm3
2246 ; SSE2-NEXT:    pxor %xmm9, %xmm7
2247 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
2248 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm4
2249 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2250 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm7
2251 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
2252 ; SSE2-NEXT:    pand %xmm5, %xmm6
2253 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2254 ; SSE2-NEXT:    por %xmm6, %xmm4
2255 ; SSE2-NEXT:    pxor %xmm10, %xmm4
2256 ; SSE2-NEXT:    pxor %xmm9, %xmm2
2257 ; SSE2-NEXT:    movdqa %xmm9, %xmm5
2258 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
2259 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
2260 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm2
2261 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2262 ; SSE2-NEXT:    pand %xmm6, %xmm2
2263 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
2264 ; SSE2-NEXT:    por %xmm2, %xmm6
2265 ; SSE2-NEXT:    pxor %xmm10, %xmm6
2266 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm4
2267 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[1,0,3,2]
2268 ; SSE2-NEXT:    pand %xmm4, %xmm5
2269 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
2270 ; SSE2-NEXT:    pxor %xmm9, %xmm2
2271 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
2272 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
2273 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
2274 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm2
2275 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2276 ; SSE2-NEXT:    pand %xmm7, %xmm2
2277 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2278 ; SSE2-NEXT:    por %xmm2, %xmm4
2279 ; SSE2-NEXT:    movdqa %xmm4, %xmm2
2280 ; SSE2-NEXT:    pxor %xmm10, %xmm2
2281 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm2
2282 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[1,0,3,2]
2283 ; SSE2-NEXT:    pand %xmm2, %xmm6
2284 ; SSE2-NEXT:    pxor %xmm10, %xmm6
2285 ; SSE2-NEXT:    pandn %xmm6, %xmm5
2286 ; SSE2-NEXT:    movdqa %xmm4, %xmm2
2287 ; SSE2-NEXT:    pandn %xmm11, %xmm2
2288 ; SSE2-NEXT:    pand %xmm12, %xmm4
2289 ; SSE2-NEXT:    por %xmm2, %xmm4
2290 ; SSE2-NEXT:    pand %xmm5, %xmm4
2291 ; SSE2-NEXT:    pandn %xmm3, %xmm5
2292 ; SSE2-NEXT:    por %xmm4, %xmm5
2293 ; SSE2-NEXT:    movdqa %xmm8, %xmm2
2294 ; SSE2-NEXT:    movdqa %xmm5, %xmm3
2295 ; SSE2-NEXT:    retq
2297 ; SSSE3-LABEL: v8i64:
2298 ; SSSE3:       # %bb.0:
2299 ; SSSE3-NEXT:    movdqa %xmm1, %xmm8
2300 ; SSSE3-NEXT:    movdqa %xmm0, %xmm13
2301 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648]
2302 ; SSSE3-NEXT:    psubq %xmm4, %xmm13
2303 ; SSSE3-NEXT:    pxor %xmm9, %xmm4
2304 ; SSSE3-NEXT:    movdqa %xmm9, %xmm1
2305 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm1
2306 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm1[0,0,2,2]
2307 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm4
2308 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2309 ; SSSE3-NEXT:    pand %xmm10, %xmm4
2310 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2311 ; SSSE3-NEXT:    por %xmm4, %xmm1
2312 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm10
2313 ; SSSE3-NEXT:    pxor %xmm10, %xmm1
2314 ; SSSE3-NEXT:    pxor %xmm9, %xmm0
2315 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
2316 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm4
2317 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm4[0,0,2,2]
2318 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm0
2319 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2320 ; SSSE3-NEXT:    pand %xmm11, %xmm0
2321 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm15 = xmm4[1,1,3,3]
2322 ; SSSE3-NEXT:    por %xmm0, %xmm15
2323 ; SSSE3-NEXT:    pxor %xmm10, %xmm15
2324 ; SSSE3-NEXT:    pcmpeqd %xmm15, %xmm1
2325 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]
2326 ; SSSE3-NEXT:    pand %xmm1, %xmm0
2327 ; SSSE3-NEXT:    movdqa %xmm13, %xmm1
2328 ; SSSE3-NEXT:    pxor %xmm9, %xmm1
2329 ; SSSE3-NEXT:    movdqa %xmm9, %xmm11
2330 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm11
2331 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
2332 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
2333 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm14 = xmm1[1,1,3,3]
2334 ; SSSE3-NEXT:    pand %xmm12, %xmm14
2335 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3]
2336 ; SSSE3-NEXT:    por %xmm14, %xmm1
2337 ; SSSE3-NEXT:    movdqa %xmm1, %xmm11
2338 ; SSSE3-NEXT:    pxor %xmm10, %xmm11
2339 ; SSSE3-NEXT:    pcmpeqd %xmm15, %xmm11
2340 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm11[1,0,3,2]
2341 ; SSSE3-NEXT:    pand %xmm11, %xmm4
2342 ; SSSE3-NEXT:    pxor %xmm10, %xmm4
2343 ; SSSE3-NEXT:    pandn %xmm4, %xmm0
2344 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm11 = [9223372036854775808,9223372036854775808]
2345 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
2346 ; SSSE3-NEXT:    pandn %xmm11, %xmm4
2347 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm12 = [9223372036854775807,9223372036854775807]
2348 ; SSSE3-NEXT:    pand %xmm12, %xmm1
2349 ; SSSE3-NEXT:    por %xmm4, %xmm1
2350 ; SSSE3-NEXT:    pand %xmm0, %xmm1
2351 ; SSSE3-NEXT:    pandn %xmm13, %xmm0
2352 ; SSSE3-NEXT:    por %xmm1, %xmm0
2353 ; SSSE3-NEXT:    movdqa %xmm8, %xmm1
2354 ; SSSE3-NEXT:    psubq %xmm5, %xmm8
2355 ; SSSE3-NEXT:    pxor %xmm9, %xmm5
2356 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
2357 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm4
2358 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm4[0,0,2,2]
2359 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm5
2360 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2361 ; SSSE3-NEXT:    pand %xmm13, %xmm5
2362 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2363 ; SSSE3-NEXT:    por %xmm5, %xmm4
2364 ; SSSE3-NEXT:    pxor %xmm10, %xmm4
2365 ; SSSE3-NEXT:    pxor %xmm9, %xmm1
2366 ; SSSE3-NEXT:    movdqa %xmm9, %xmm5
2367 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm5
2368 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm5[0,0,2,2]
2369 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
2370 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2371 ; SSSE3-NEXT:    pand %xmm13, %xmm1
2372 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2373 ; SSSE3-NEXT:    por %xmm1, %xmm5
2374 ; SSSE3-NEXT:    pxor %xmm10, %xmm5
2375 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm4
2376 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,0,3,2]
2377 ; SSSE3-NEXT:    pand %xmm4, %xmm1
2378 ; SSSE3-NEXT:    movdqa %xmm8, %xmm4
2379 ; SSSE3-NEXT:    pxor %xmm9, %xmm4
2380 ; SSSE3-NEXT:    movdqa %xmm9, %xmm13
2381 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm13
2382 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm14 = xmm13[0,0,2,2]
2383 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm4
2384 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm15 = xmm4[1,1,3,3]
2385 ; SSSE3-NEXT:    pand %xmm14, %xmm15
2386 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm13[1,1,3,3]
2387 ; SSSE3-NEXT:    por %xmm15, %xmm4
2388 ; SSSE3-NEXT:    movdqa %xmm4, %xmm13
2389 ; SSSE3-NEXT:    pxor %xmm10, %xmm13
2390 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm13
2391 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm13[1,0,3,2]
2392 ; SSSE3-NEXT:    pand %xmm13, %xmm5
2393 ; SSSE3-NEXT:    pxor %xmm10, %xmm5
2394 ; SSSE3-NEXT:    pandn %xmm5, %xmm1
2395 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
2396 ; SSSE3-NEXT:    pandn %xmm11, %xmm5
2397 ; SSSE3-NEXT:    pand %xmm12, %xmm4
2398 ; SSSE3-NEXT:    por %xmm5, %xmm4
2399 ; SSSE3-NEXT:    pand %xmm1, %xmm4
2400 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
2401 ; SSSE3-NEXT:    por %xmm4, %xmm1
2402 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
2403 ; SSSE3-NEXT:    psubq %xmm6, %xmm2
2404 ; SSSE3-NEXT:    pxor %xmm9, %xmm6
2405 ; SSSE3-NEXT:    movdqa %xmm9, %xmm5
2406 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm5
2407 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm5[0,0,2,2]
2408 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm6
2409 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2410 ; SSSE3-NEXT:    pand %xmm8, %xmm6
2411 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2412 ; SSSE3-NEXT:    por %xmm6, %xmm5
2413 ; SSSE3-NEXT:    pxor %xmm10, %xmm5
2414 ; SSSE3-NEXT:    pxor %xmm9, %xmm4
2415 ; SSSE3-NEXT:    movdqa %xmm9, %xmm6
2416 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
2417 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
2418 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm4
2419 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2420 ; SSSE3-NEXT:    pand %xmm8, %xmm4
2421 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2422 ; SSSE3-NEXT:    por %xmm4, %xmm6
2423 ; SSSE3-NEXT:    pxor %xmm10, %xmm6
2424 ; SSSE3-NEXT:    pcmpeqd %xmm6, %xmm5
2425 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm5[1,0,3,2]
2426 ; SSSE3-NEXT:    pand %xmm5, %xmm8
2427 ; SSSE3-NEXT:    movdqa %xmm2, %xmm5
2428 ; SSSE3-NEXT:    pxor %xmm9, %xmm5
2429 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
2430 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm4
2431 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm4[0,0,2,2]
2432 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm5
2433 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2434 ; SSSE3-NEXT:    pand %xmm13, %xmm5
2435 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2436 ; SSSE3-NEXT:    por %xmm5, %xmm4
2437 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
2438 ; SSSE3-NEXT:    pxor %xmm10, %xmm5
2439 ; SSSE3-NEXT:    pcmpeqd %xmm6, %xmm5
2440 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,0,3,2]
2441 ; SSSE3-NEXT:    pand %xmm5, %xmm6
2442 ; SSSE3-NEXT:    pxor %xmm10, %xmm6
2443 ; SSSE3-NEXT:    pandn %xmm6, %xmm8
2444 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
2445 ; SSSE3-NEXT:    pandn %xmm11, %xmm5
2446 ; SSSE3-NEXT:    pand %xmm12, %xmm4
2447 ; SSSE3-NEXT:    por %xmm5, %xmm4
2448 ; SSSE3-NEXT:    pand %xmm8, %xmm4
2449 ; SSSE3-NEXT:    pandn %xmm2, %xmm8
2450 ; SSSE3-NEXT:    por %xmm4, %xmm8
2451 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
2452 ; SSSE3-NEXT:    psubq %xmm7, %xmm3
2453 ; SSSE3-NEXT:    pxor %xmm9, %xmm7
2454 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
2455 ; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm4
2456 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2457 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm7
2458 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
2459 ; SSSE3-NEXT:    pand %xmm5, %xmm6
2460 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2461 ; SSSE3-NEXT:    por %xmm6, %xmm4
2462 ; SSSE3-NEXT:    pxor %xmm10, %xmm4
2463 ; SSSE3-NEXT:    pxor %xmm9, %xmm2
2464 ; SSSE3-NEXT:    movdqa %xmm9, %xmm5
2465 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm5
2466 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
2467 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm2
2468 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2469 ; SSSE3-NEXT:    pand %xmm6, %xmm2
2470 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
2471 ; SSSE3-NEXT:    por %xmm2, %xmm6
2472 ; SSSE3-NEXT:    pxor %xmm10, %xmm6
2473 ; SSSE3-NEXT:    pcmpeqd %xmm6, %xmm4
2474 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[1,0,3,2]
2475 ; SSSE3-NEXT:    pand %xmm4, %xmm5
2476 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
2477 ; SSSE3-NEXT:    pxor %xmm9, %xmm2
2478 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
2479 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
2480 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
2481 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm2
2482 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2483 ; SSSE3-NEXT:    pand %xmm7, %xmm2
2484 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2485 ; SSSE3-NEXT:    por %xmm2, %xmm4
2486 ; SSSE3-NEXT:    movdqa %xmm4, %xmm2
2487 ; SSSE3-NEXT:    pxor %xmm10, %xmm2
2488 ; SSSE3-NEXT:    pcmpeqd %xmm6, %xmm2
2489 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[1,0,3,2]
2490 ; SSSE3-NEXT:    pand %xmm2, %xmm6
2491 ; SSSE3-NEXT:    pxor %xmm10, %xmm6
2492 ; SSSE3-NEXT:    pandn %xmm6, %xmm5
2493 ; SSSE3-NEXT:    movdqa %xmm4, %xmm2
2494 ; SSSE3-NEXT:    pandn %xmm11, %xmm2
2495 ; SSSE3-NEXT:    pand %xmm12, %xmm4
2496 ; SSSE3-NEXT:    por %xmm2, %xmm4
2497 ; SSSE3-NEXT:    pand %xmm5, %xmm4
2498 ; SSSE3-NEXT:    pandn %xmm3, %xmm5
2499 ; SSSE3-NEXT:    por %xmm4, %xmm5
2500 ; SSSE3-NEXT:    movdqa %xmm8, %xmm2
2501 ; SSSE3-NEXT:    movdqa %xmm5, %xmm3
2502 ; SSSE3-NEXT:    retq
2504 ; SSE41-LABEL: v8i64:
2505 ; SSE41:       # %bb.0:
2506 ; SSE41-NEXT:    movdqa %xmm0, %xmm8
2507 ; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648]
2508 ; SSE41-NEXT:    movdqa %xmm0, %xmm11
2509 ; SSE41-NEXT:    psubq %xmm4, %xmm8
2510 ; SSE41-NEXT:    pxor %xmm9, %xmm4
2511 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
2512 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm0
2513 ; SSE41-NEXT:    pshufd {{.*#+}} xmm10 = xmm0[0,0,2,2]
2514 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm4
2515 ; SSE41-NEXT:    pshufd {{.*#+}} xmm12 = xmm4[1,1,3,3]
2516 ; SSE41-NEXT:    pand %xmm10, %xmm12
2517 ; SSE41-NEXT:    pshufd {{.*#+}} xmm15 = xmm0[1,1,3,3]
2518 ; SSE41-NEXT:    por %xmm12, %xmm15
2519 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm10
2520 ; SSE41-NEXT:    pxor %xmm10, %xmm15
2521 ; SSE41-NEXT:    pxor %xmm9, %xmm11
2522 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
2523 ; SSE41-NEXT:    pcmpgtd %xmm11, %xmm0
2524 ; SSE41-NEXT:    pshufd {{.*#+}} xmm12 = xmm0[0,0,2,2]
2525 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm11
2526 ; SSE41-NEXT:    pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3]
2527 ; SSE41-NEXT:    pand %xmm12, %xmm11
2528 ; SSE41-NEXT:    pshufd {{.*#+}} xmm12 = xmm0[1,1,3,3]
2529 ; SSE41-NEXT:    por %xmm11, %xmm12
2530 ; SSE41-NEXT:    pxor %xmm10, %xmm12
2531 ; SSE41-NEXT:    pcmpeqq %xmm12, %xmm15
2532 ; SSE41-NEXT:    movdqa %xmm8, %xmm0
2533 ; SSE41-NEXT:    pxor %xmm9, %xmm0
2534 ; SSE41-NEXT:    movdqa %xmm9, %xmm11
2535 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm11
2536 ; SSE41-NEXT:    pshufd {{.*#+}} xmm13 = xmm11[0,0,2,2]
2537 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
2538 ; SSE41-NEXT:    pshufd {{.*#+}} xmm14 = xmm0[1,1,3,3]
2539 ; SSE41-NEXT:    pand %xmm13, %xmm14
2540 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm11[1,1,3,3]
2541 ; SSE41-NEXT:    por %xmm14, %xmm0
2542 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
2543 ; SSE41-NEXT:    pxor %xmm10, %xmm4
2544 ; SSE41-NEXT:    pcmpeqq %xmm12, %xmm4
2545 ; SSE41-NEXT:    pxor %xmm10, %xmm4
2546 ; SSE41-NEXT:    pandn %xmm4, %xmm15
2547 ; SSE41-NEXT:    movapd {{.*#+}} xmm12 = [9223372036854775807,9223372036854775807]
2548 ; SSE41-NEXT:    movapd {{.*#+}} xmm11 = [9223372036854775808,9223372036854775808]
2549 ; SSE41-NEXT:    movapd %xmm11, %xmm4
2550 ; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm4
2551 ; SSE41-NEXT:    movdqa %xmm15, %xmm0
2552 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm8
2553 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
2554 ; SSE41-NEXT:    psubq %xmm5, %xmm1
2555 ; SSE41-NEXT:    pxor %xmm9, %xmm5
2556 ; SSE41-NEXT:    movdqa %xmm9, %xmm4
2557 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm4
2558 ; SSE41-NEXT:    pshufd {{.*#+}} xmm13 = xmm4[0,0,2,2]
2559 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm5
2560 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2561 ; SSE41-NEXT:    pand %xmm13, %xmm5
2562 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2563 ; SSE41-NEXT:    por %xmm5, %xmm4
2564 ; SSE41-NEXT:    pxor %xmm10, %xmm4
2565 ; SSE41-NEXT:    pxor %xmm9, %xmm0
2566 ; SSE41-NEXT:    movdqa %xmm9, %xmm5
2567 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
2568 ; SSE41-NEXT:    pshufd {{.*#+}} xmm13 = xmm5[0,0,2,2]
2569 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
2570 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2571 ; SSE41-NEXT:    pand %xmm13, %xmm0
2572 ; SSE41-NEXT:    pshufd {{.*#+}} xmm14 = xmm5[1,1,3,3]
2573 ; SSE41-NEXT:    por %xmm0, %xmm14
2574 ; SSE41-NEXT:    pxor %xmm10, %xmm14
2575 ; SSE41-NEXT:    pcmpeqq %xmm14, %xmm4
2576 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
2577 ; SSE41-NEXT:    pxor %xmm9, %xmm0
2578 ; SSE41-NEXT:    movdqa %xmm9, %xmm13
2579 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm13
2580 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm13[0,0,2,2]
2581 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
2582 ; SSE41-NEXT:    pshufd {{.*#+}} xmm15 = xmm0[1,1,3,3]
2583 ; SSE41-NEXT:    pand %xmm5, %xmm15
2584 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm13[1,1,3,3]
2585 ; SSE41-NEXT:    por %xmm15, %xmm0
2586 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
2587 ; SSE41-NEXT:    pxor %xmm10, %xmm5
2588 ; SSE41-NEXT:    pcmpeqq %xmm14, %xmm5
2589 ; SSE41-NEXT:    pxor %xmm10, %xmm5
2590 ; SSE41-NEXT:    pandn %xmm5, %xmm4
2591 ; SSE41-NEXT:    movapd %xmm11, %xmm5
2592 ; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm5
2593 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
2594 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
2595 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
2596 ; SSE41-NEXT:    psubq %xmm6, %xmm2
2597 ; SSE41-NEXT:    pxor %xmm9, %xmm6
2598 ; SSE41-NEXT:    movdqa %xmm9, %xmm4
2599 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm4
2600 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2601 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm6
2602 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2603 ; SSE41-NEXT:    pand %xmm5, %xmm6
2604 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2605 ; SSE41-NEXT:    por %xmm6, %xmm4
2606 ; SSE41-NEXT:    pxor %xmm10, %xmm4
2607 ; SSE41-NEXT:    pxor %xmm9, %xmm0
2608 ; SSE41-NEXT:    movdqa %xmm9, %xmm5
2609 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
2610 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
2611 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
2612 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2613 ; SSE41-NEXT:    pand %xmm6, %xmm0
2614 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2615 ; SSE41-NEXT:    por %xmm0, %xmm5
2616 ; SSE41-NEXT:    pxor %xmm10, %xmm5
2617 ; SSE41-NEXT:    pcmpeqq %xmm5, %xmm4
2618 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
2619 ; SSE41-NEXT:    pxor %xmm9, %xmm0
2620 ; SSE41-NEXT:    movdqa %xmm9, %xmm6
2621 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
2622 ; SSE41-NEXT:    pshufd {{.*#+}} xmm13 = xmm6[0,0,2,2]
2623 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
2624 ; SSE41-NEXT:    pshufd {{.*#+}} xmm14 = xmm0[1,1,3,3]
2625 ; SSE41-NEXT:    pand %xmm13, %xmm14
2626 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
2627 ; SSE41-NEXT:    por %xmm14, %xmm0
2628 ; SSE41-NEXT:    movdqa %xmm0, %xmm6
2629 ; SSE41-NEXT:    pxor %xmm10, %xmm6
2630 ; SSE41-NEXT:    pcmpeqq %xmm5, %xmm6
2631 ; SSE41-NEXT:    pxor %xmm10, %xmm6
2632 ; SSE41-NEXT:    pandn %xmm6, %xmm4
2633 ; SSE41-NEXT:    movapd %xmm11, %xmm5
2634 ; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm5
2635 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
2636 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm2
2637 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
2638 ; SSE41-NEXT:    psubq %xmm7, %xmm3
2639 ; SSE41-NEXT:    pxor %xmm9, %xmm7
2640 ; SSE41-NEXT:    movdqa %xmm9, %xmm4
2641 ; SSE41-NEXT:    pcmpgtd %xmm7, %xmm4
2642 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2643 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm7
2644 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
2645 ; SSE41-NEXT:    pand %xmm5, %xmm6
2646 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2647 ; SSE41-NEXT:    por %xmm6, %xmm4
2648 ; SSE41-NEXT:    pxor %xmm10, %xmm4
2649 ; SSE41-NEXT:    pxor %xmm9, %xmm0
2650 ; SSE41-NEXT:    movdqa %xmm9, %xmm5
2651 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
2652 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
2653 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
2654 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2655 ; SSE41-NEXT:    pand %xmm6, %xmm0
2656 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2657 ; SSE41-NEXT:    por %xmm0, %xmm5
2658 ; SSE41-NEXT:    pxor %xmm10, %xmm5
2659 ; SSE41-NEXT:    pcmpeqq %xmm5, %xmm4
2660 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
2661 ; SSE41-NEXT:    pxor %xmm9, %xmm0
2662 ; SSE41-NEXT:    movdqa %xmm9, %xmm6
2663 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
2664 ; SSE41-NEXT:    pshufd {{.*#+}} xmm13 = xmm6[0,0,2,2]
2665 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
2666 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
2667 ; SSE41-NEXT:    pand %xmm13, %xmm7
2668 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
2669 ; SSE41-NEXT:    por %xmm7, %xmm0
2670 ; SSE41-NEXT:    movdqa %xmm0, %xmm6
2671 ; SSE41-NEXT:    pxor %xmm10, %xmm6
2672 ; SSE41-NEXT:    pcmpeqq %xmm5, %xmm6
2673 ; SSE41-NEXT:    pxor %xmm10, %xmm6
2674 ; SSE41-NEXT:    pandn %xmm6, %xmm4
2675 ; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm11
2676 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
2677 ; SSE41-NEXT:    blendvpd %xmm0, %xmm11, %xmm3
2678 ; SSE41-NEXT:    movapd %xmm8, %xmm0
2679 ; SSE41-NEXT:    retq
2681 ; AVX1-LABEL: v8i64:
2682 ; AVX1:       # %bb.0:
2683 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm9
2684 ; AVX1-NEXT:    vpxor %xmm10, %xmm10, %xmm10
2685 ; AVX1-NEXT:    vpcmpgtq %xmm9, %xmm10, %xmm7
2686 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
2687 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm8
2688 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
2689 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm10, %xmm6
2690 ; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm12
2691 ; AVX1-NEXT:    vpcmpeqq %xmm8, %xmm12, %xmm8
2692 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm10, %xmm5
2693 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm11
2694 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm10, %xmm5
2695 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm5
2696 ; AVX1-NEXT:    vpcmpeqq %xmm11, %xmm5, %xmm11
2697 ; AVX1-NEXT:    vinsertf128 $1, %xmm8, %ymm11, %ymm8
2698 ; AVX1-NEXT:    vpsubq %xmm9, %xmm7, %xmm9
2699 ; AVX1-NEXT:    vpcmpgtq %xmm9, %xmm10, %xmm7
2700 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm6
2701 ; AVX1-NEXT:    vpcmpeqq %xmm6, %xmm12, %xmm6
2702 ; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm11
2703 ; AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
2704 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm10, %xmm2
2705 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm6
2706 ; AVX1-NEXT:    vpcmpeqq %xmm6, %xmm5, %xmm5
2707 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm5
2708 ; AVX1-NEXT:    vinsertf128 $1, %xmm11, %ymm5, %ymm5
2709 ; AVX1-NEXT:    vandnpd %ymm5, %ymm8, %ymm5
2710 ; AVX1-NEXT:    vinsertf128 $1, %xmm7, %ymm2, %ymm7
2711 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm8 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
2712 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm11 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2713 ; AVX1-NEXT:    vblendvpd %ymm7, %ymm8, %ymm11, %ymm7
2714 ; AVX1-NEXT:    vinsertf128 $1, %xmm9, %ymm0, %ymm0
2715 ; AVX1-NEXT:    vblendvpd %ymm5, %ymm7, %ymm0, %ymm0
2716 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm5
2717 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm10, %xmm7
2718 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm7
2719 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2720 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm10, %xmm6
2721 ; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm6
2722 ; AVX1-NEXT:    vpcmpeqq %xmm7, %xmm6, %xmm9
2723 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm10, %xmm7
2724 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm12
2725 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm10, %xmm7
2726 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm7
2727 ; AVX1-NEXT:    vpcmpeqq %xmm12, %xmm7, %xmm12
2728 ; AVX1-NEXT:    vinsertf128 $1, %xmm9, %ymm12, %ymm9
2729 ; AVX1-NEXT:    vpsubq %xmm5, %xmm2, %xmm12
2730 ; AVX1-NEXT:    vpcmpgtq %xmm12, %xmm10, %xmm5
2731 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm2
2732 ; AVX1-NEXT:    vpcmpeqq %xmm2, %xmm6, %xmm2
2733 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
2734 ; AVX1-NEXT:    vpsubq %xmm3, %xmm1, %xmm1
2735 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm10, %xmm3
2736 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm6
2737 ; AVX1-NEXT:    vpcmpeqq %xmm6, %xmm7, %xmm6
2738 ; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm4
2739 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm4, %ymm2
2740 ; AVX1-NEXT:    vandnpd %ymm2, %ymm9, %ymm2
2741 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm3, %ymm3
2742 ; AVX1-NEXT:    vblendvpd %ymm3, %ymm8, %ymm11, %ymm3
2743 ; AVX1-NEXT:    vinsertf128 $1, %xmm12, %ymm1, %ymm1
2744 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm3, %ymm1, %ymm1
2745 ; AVX1-NEXT:    retq
2747 ; AVX2-LABEL: v8i64:
2748 ; AVX2:       # %bb.0:
2749 ; AVX2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
2750 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm4, %ymm5
2751 ; AVX2-NEXT:    vpcmpeqd %ymm6, %ymm6, %ymm6
2752 ; AVX2-NEXT:    vpxor %ymm6, %ymm5, %ymm5
2753 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm4, %ymm7
2754 ; AVX2-NEXT:    vpxor %ymm6, %ymm7, %ymm7
2755 ; AVX2-NEXT:    vpcmpeqq %ymm5, %ymm7, %ymm5
2756 ; AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
2757 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm4, %ymm2
2758 ; AVX2-NEXT:    vpxor %ymm6, %ymm2, %ymm8
2759 ; AVX2-NEXT:    vpcmpeqq %ymm8, %ymm7, %ymm7
2760 ; AVX2-NEXT:    vpxor %ymm6, %ymm7, %ymm7
2761 ; AVX2-NEXT:    vpandn %ymm7, %ymm5, %ymm5
2762 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm7 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
2763 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm8 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2764 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm7, %ymm8, %ymm2
2765 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm2, %ymm0, %ymm0
2766 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm4, %ymm2
2767 ; AVX2-NEXT:    vpxor %ymm6, %ymm2, %ymm2
2768 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm4, %ymm5
2769 ; AVX2-NEXT:    vpxor %ymm6, %ymm5, %ymm5
2770 ; AVX2-NEXT:    vpcmpeqq %ymm2, %ymm5, %ymm2
2771 ; AVX2-NEXT:    vpsubq %ymm3, %ymm1, %ymm1
2772 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm4, %ymm3
2773 ; AVX2-NEXT:    vpxor %ymm6, %ymm3, %ymm4
2774 ; AVX2-NEXT:    vpcmpeqq %ymm4, %ymm5, %ymm4
2775 ; AVX2-NEXT:    vpxor %ymm6, %ymm4, %ymm4
2776 ; AVX2-NEXT:    vpandn %ymm4, %ymm2, %ymm2
2777 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm7, %ymm8, %ymm3
2778 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm3, %ymm1, %ymm1
2779 ; AVX2-NEXT:    retq
2781 ; AVX512-LABEL: v8i64:
2782 ; AVX512:       # %bb.0:
2783 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2784 ; AVX512-NEXT:    vpcmpnltq %zmm2, %zmm1, %k0
2785 ; AVX512-NEXT:    vpcmpnltq %zmm2, %zmm0, %k1
2786 ; AVX512-NEXT:    kxorw %k0, %k1, %k0
2787 ; AVX512-NEXT:    vpsubq %zmm1, %zmm0, %zmm0
2788 ; AVX512-NEXT:    vpcmpnltq %zmm2, %zmm0, %k2
2789 ; AVX512-NEXT:    kxorw %k2, %k1, %k1
2790 ; AVX512-NEXT:    kandw %k1, %k0, %k1
2791 ; AVX512-NEXT:    vpcmpgtq %zmm0, %zmm2, %k2
2792 ; AVX512-NEXT:    vpbroadcastq {{.*#+}} zmm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2793 ; AVX512-NEXT:    vpbroadcastq {{.*}}(%rip), %zmm1 {%k2}
2794 ; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1}
2795 ; AVX512-NEXT:    retq
2796   %z = call <8 x i64> @llvm.ssub.sat.v8i64(<8 x i64> %x, <8 x i64> %y)
2797   ret <8 x i64> %z
2800 define <2 x i128> @v2i128(<2 x i128> %x, <2 x i128> %y) nounwind {
2801 ; SSE-LABEL: v2i128:
2802 ; SSE:       # %bb.0:
2803 ; SSE-NEXT:    pushq %r15
2804 ; SSE-NEXT:    pushq %r14
2805 ; SSE-NEXT:    pushq %r13
2806 ; SSE-NEXT:    pushq %r12
2807 ; SSE-NEXT:    pushq %rbx
2808 ; SSE-NEXT:    movq %rdi, %rax
2809 ; SSE-NEXT:    movq {{[0-9]+}}(%rsp), %r11
2810 ; SSE-NEXT:    movq {{[0-9]+}}(%rsp), %r14
2811 ; SSE-NEXT:    subq {{[0-9]+}}(%rsp), %rcx
2812 ; SSE-NEXT:    movq %r8, %r13
2813 ; SSE-NEXT:    sbbq %r14, %r13
2814 ; SSE-NEXT:    movq %r13, %r10
2815 ; SSE-NEXT:    sarq $63, %r10
2816 ; SSE-NEXT:    xorl %edi, %edi
2817 ; SSE-NEXT:    testq %r13, %r13
2818 ; SSE-NEXT:    setns %dil
2819 ; SSE-NEXT:    movabsq $9223372036854775807, %r12 # imm = 0x7FFFFFFFFFFFFFFF
2820 ; SSE-NEXT:    leaq (%rdi,%r12), %r15
2821 ; SSE-NEXT:    testq %r8, %r8
2822 ; SSE-NEXT:    setns %r8b
2823 ; SSE-NEXT:    cmpb %dil, %r8b
2824 ; SSE-NEXT:    setne %dil
2825 ; SSE-NEXT:    testq %r14, %r14
2826 ; SSE-NEXT:    setns %bl
2827 ; SSE-NEXT:    cmpb %bl, %r8b
2828 ; SSE-NEXT:    setne %bl
2829 ; SSE-NEXT:    testb %dil, %bl
2830 ; SSE-NEXT:    cmoveq %r13, %r15
2831 ; SSE-NEXT:    cmoveq %rcx, %r10
2832 ; SSE-NEXT:    subq %r9, %rsi
2833 ; SSE-NEXT:    movq %rdx, %rdi
2834 ; SSE-NEXT:    sbbq %r11, %rdi
2835 ; SSE-NEXT:    setns %bl
2836 ; SSE-NEXT:    movzbl %bl, %ebx
2837 ; SSE-NEXT:    addq %rbx, %r12
2838 ; SSE-NEXT:    movq %rdi, %rcx
2839 ; SSE-NEXT:    sarq $63, %rcx
2840 ; SSE-NEXT:    testq %r11, %r11
2841 ; SSE-NEXT:    setns %r8b
2842 ; SSE-NEXT:    testq %rdx, %rdx
2843 ; SSE-NEXT:    setns %dl
2844 ; SSE-NEXT:    cmpb %r8b, %dl
2845 ; SSE-NEXT:    setne %r8b
2846 ; SSE-NEXT:    cmpb %bl, %dl
2847 ; SSE-NEXT:    setne %dl
2848 ; SSE-NEXT:    testb %dl, %r8b
2849 ; SSE-NEXT:    cmoveq %rsi, %rcx
2850 ; SSE-NEXT:    cmoveq %rdi, %r12
2851 ; SSE-NEXT:    movq %r15, 24(%rax)
2852 ; SSE-NEXT:    movq %r10, 16(%rax)
2853 ; SSE-NEXT:    movq %r12, 8(%rax)
2854 ; SSE-NEXT:    movq %rcx, (%rax)
2855 ; SSE-NEXT:    popq %rbx
2856 ; SSE-NEXT:    popq %r12
2857 ; SSE-NEXT:    popq %r13
2858 ; SSE-NEXT:    popq %r14
2859 ; SSE-NEXT:    popq %r15
2860 ; SSE-NEXT:    retq
2862 ; AVX-LABEL: v2i128:
2863 ; AVX:       # %bb.0:
2864 ; AVX-NEXT:    pushq %r15
2865 ; AVX-NEXT:    pushq %r14
2866 ; AVX-NEXT:    pushq %r13
2867 ; AVX-NEXT:    pushq %r12
2868 ; AVX-NEXT:    pushq %rbx
2869 ; AVX-NEXT:    movq %rdi, %rax
2870 ; AVX-NEXT:    movq {{[0-9]+}}(%rsp), %r11
2871 ; AVX-NEXT:    movq {{[0-9]+}}(%rsp), %r14
2872 ; AVX-NEXT:    subq {{[0-9]+}}(%rsp), %rcx
2873 ; AVX-NEXT:    movq %r8, %r13
2874 ; AVX-NEXT:    sbbq %r14, %r13
2875 ; AVX-NEXT:    movq %r13, %r10
2876 ; AVX-NEXT:    sarq $63, %r10
2877 ; AVX-NEXT:    xorl %edi, %edi
2878 ; AVX-NEXT:    testq %r13, %r13
2879 ; AVX-NEXT:    setns %dil
2880 ; AVX-NEXT:    movabsq $9223372036854775807, %r12 # imm = 0x7FFFFFFFFFFFFFFF
2881 ; AVX-NEXT:    leaq (%rdi,%r12), %r15
2882 ; AVX-NEXT:    testq %r8, %r8
2883 ; AVX-NEXT:    setns %r8b
2884 ; AVX-NEXT:    cmpb %dil, %r8b
2885 ; AVX-NEXT:    setne %dil
2886 ; AVX-NEXT:    testq %r14, %r14
2887 ; AVX-NEXT:    setns %bl
2888 ; AVX-NEXT:    cmpb %bl, %r8b
2889 ; AVX-NEXT:    setne %bl
2890 ; AVX-NEXT:    testb %dil, %bl
2891 ; AVX-NEXT:    cmoveq %r13, %r15
2892 ; AVX-NEXT:    cmoveq %rcx, %r10
2893 ; AVX-NEXT:    subq %r9, %rsi
2894 ; AVX-NEXT:    movq %rdx, %rdi
2895 ; AVX-NEXT:    sbbq %r11, %rdi
2896 ; AVX-NEXT:    setns %bl
2897 ; AVX-NEXT:    movzbl %bl, %ebx
2898 ; AVX-NEXT:    addq %rbx, %r12
2899 ; AVX-NEXT:    movq %rdi, %rcx
2900 ; AVX-NEXT:    sarq $63, %rcx
2901 ; AVX-NEXT:    testq %r11, %r11
2902 ; AVX-NEXT:    setns %r8b
2903 ; AVX-NEXT:    testq %rdx, %rdx
2904 ; AVX-NEXT:    setns %dl
2905 ; AVX-NEXT:    cmpb %r8b, %dl
2906 ; AVX-NEXT:    setne %r8b
2907 ; AVX-NEXT:    cmpb %bl, %dl
2908 ; AVX-NEXT:    setne %dl
2909 ; AVX-NEXT:    testb %dl, %r8b
2910 ; AVX-NEXT:    cmoveq %rsi, %rcx
2911 ; AVX-NEXT:    cmoveq %rdi, %r12
2912 ; AVX-NEXT:    movq %r15, 24(%rax)
2913 ; AVX-NEXT:    movq %r10, 16(%rax)
2914 ; AVX-NEXT:    movq %r12, 8(%rax)
2915 ; AVX-NEXT:    movq %rcx, (%rax)
2916 ; AVX-NEXT:    popq %rbx
2917 ; AVX-NEXT:    popq %r12
2918 ; AVX-NEXT:    popq %r13
2919 ; AVX-NEXT:    popq %r14
2920 ; AVX-NEXT:    popq %r15
2921 ; AVX-NEXT:    retq
2922   %z = call <2 x i128> @llvm.ssub.sat.v2i128(<2 x i128> %x, <2 x i128> %y)
2923   ret <2 x i128> %z