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 {
45 ; SSE-NEXT: psubsb %xmm1, %xmm0
50 ; AVX-NEXT: vpsubsb %xmm1, %xmm0, %xmm0
52 %z = call <16 x i8> @llvm.ssub.sat.v16i8(<16 x i8> %x, <16 x i8> %y)
56 define <32 x i8> @v32i8(<32 x i8> %x, <32 x i8> %y) nounwind {
59 ; SSE-NEXT: psubsb %xmm2, %xmm0
60 ; SSE-NEXT: psubsb %xmm3, %xmm1
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
74 ; AVX2-NEXT: vpsubsb %ymm1, %ymm0, %ymm0
77 ; AVX512-LABEL: v32i8:
79 ; AVX512-NEXT: vpsubsb %ymm1, %ymm0, %ymm0
81 %z = call <32 x i8> @llvm.ssub.sat.v32i8(<32 x i8> %x, <32 x i8> %y)
85 define <64 x i8> @v64i8(<64 x i8> %x, <64 x i8> %y) nounwind {
88 ; SSE-NEXT: psubsb %xmm4, %xmm0
89 ; SSE-NEXT: psubsb %xmm5, %xmm1
90 ; SSE-NEXT: psubsb %xmm6, %xmm2
91 ; SSE-NEXT: psubsb %xmm7, %xmm3
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
110 ; AVX2-NEXT: vpsubsb %ymm2, %ymm0, %ymm0
111 ; AVX2-NEXT: vpsubsb %ymm3, %ymm1, %ymm1
114 ; AVX512-LABEL: v64i8:
116 ; AVX512-NEXT: vpsubsb %zmm1, %zmm0, %zmm0
118 %z = call <64 x i8> @llvm.ssub.sat.v64i8(<64 x i8> %x, <64 x i8> %y)
122 define <8 x i16> @v8i16(<8 x i16> %x, <8 x i16> %y) nounwind {
125 ; SSE-NEXT: psubsw %xmm1, %xmm0
130 ; AVX-NEXT: vpsubsw %xmm1, %xmm0, %xmm0
132 %z = call <8 x i16> @llvm.ssub.sat.v8i16(<8 x i16> %x, <8 x i16> %y)
136 define <16 x i16> @v16i16(<16 x i16> %x, <16 x i16> %y) nounwind {
139 ; SSE-NEXT: psubsw %xmm2, %xmm0
140 ; SSE-NEXT: psubsw %xmm3, %xmm1
143 ; AVX1-LABEL: v16i16:
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
152 ; AVX2-LABEL: v16i16:
154 ; AVX2-NEXT: vpsubsw %ymm1, %ymm0, %ymm0
157 ; AVX512-LABEL: v16i16:
159 ; AVX512-NEXT: vpsubsw %ymm1, %ymm0, %ymm0
161 %z = call <16 x i16> @llvm.ssub.sat.v16i16(<16 x i16> %x, <16 x i16> %y)
165 define <32 x i16> @v32i16(<32 x i16> %x, <32 x i16> %y) nounwind {
168 ; SSE-NEXT: psubsw %xmm4, %xmm0
169 ; SSE-NEXT: psubsw %xmm5, %xmm1
170 ; SSE-NEXT: psubsw %xmm6, %xmm2
171 ; SSE-NEXT: psubsw %xmm7, %xmm3
174 ; AVX1-LABEL: v32i16:
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
188 ; AVX2-LABEL: v32i16:
190 ; AVX2-NEXT: vpsubsw %ymm2, %ymm0, %ymm0
191 ; AVX2-NEXT: vpsubsw %ymm3, %ymm1, %ymm1
194 ; AVX512-LABEL: v32i16:
196 ; AVX512-NEXT: vpsubsw %zmm1, %zmm0, %zmm0
198 %z = call <32 x i16> @llvm.ssub.sat.v32i16(<32 x i16> %x, <32 x i16> %y)
202 ; Too narrow vectors, legalized by widening.
204 define void @v8i8(<8 x i8>* %px, <8 x i8>* %py, <8 x i8>* %pz) nounwind {
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)
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)
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
227 define void @v4i8(<4 x i8>* %px, <4 x i8>* %py, <4 x i8>* %pz) nounwind {
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)
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)
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
250 define void @v2i8(<2 x i8>* %px, <2 x i8>* %py, <2 x i8>* %pz) nounwind {
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)
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)
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)
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)
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
299 define void @v4i16(<4 x i16>* %px, <4 x i16>* %py, <4 x i16>* %pz) nounwind {
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)
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)
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
322 define void @v2i16(<2 x i16>* %px, <2 x i16>* %py, <2 x i16>* %pz) nounwind {
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)
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)
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
345 define <12 x i8> @v12i8(<12 x i8> %x, <12 x i8> %y) nounwind {
348 ; SSE-NEXT: psubsb %xmm1, %xmm0
353 ; AVX-NEXT: vpsubsb %xmm1, %xmm0, %xmm0
355 %z = call <12 x i8> @llvm.ssub.sat.v12i8(<12 x i8> %x, <12 x i8> %y)
359 define void @v12i16(<12 x i16>* %px, <12 x i16>* %py, <12 x i16>* %pz) nounwind {
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)
370 ; AVX1-LABEL: v12i16:
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)
380 ; AVX2-LABEL: v12i16:
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
390 ; AVX512-LABEL: v12i16:
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
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
408 define void @v1i8(<1 x i8>* %px, <1 x i8>* %py, <1 x i8>* %pz) nounwind {
411 ; SSE-NEXT: movb (%rdi), %al
412 ; SSE-NEXT: movb (%rsi), %cl
413 ; SSE-NEXT: xorl %esi, %esi
414 ; SSE-NEXT: cmpb %cl, %al
415 ; SSE-NEXT: setns %sil
416 ; SSE-NEXT: addl $127, %esi
417 ; SSE-NEXT: subb %cl, %al
418 ; SSE-NEXT: movzbl %al, %eax
419 ; SSE-NEXT: cmovol %esi, %eax
420 ; SSE-NEXT: movb %al, (%rdx)
425 ; AVX-NEXT: movb (%rdi), %al
426 ; AVX-NEXT: movb (%rsi), %cl
427 ; AVX-NEXT: xorl %esi, %esi
428 ; AVX-NEXT: cmpb %cl, %al
429 ; AVX-NEXT: setns %sil
430 ; AVX-NEXT: addl $127, %esi
431 ; AVX-NEXT: subb %cl, %al
432 ; AVX-NEXT: movzbl %al, %eax
433 ; AVX-NEXT: cmovol %esi, %eax
434 ; AVX-NEXT: movb %al, (%rdx)
436 %x = load <1 x i8>, <1 x i8>* %px
437 %y = load <1 x i8>, <1 x i8>* %py
438 %z = call <1 x i8> @llvm.ssub.sat.v1i8(<1 x i8> %x, <1 x i8> %y)
439 store <1 x i8> %z, <1 x i8>* %pz
443 define void @v1i16(<1 x i16>* %px, <1 x i16>* %py, <1 x i16>* %pz) nounwind {
446 ; SSE-NEXT: movzwl (%rdi), %eax
447 ; SSE-NEXT: movzwl (%rsi), %ecx
448 ; SSE-NEXT: xorl %esi, %esi
449 ; SSE-NEXT: cmpw %cx, %ax
450 ; SSE-NEXT: setns %sil
451 ; SSE-NEXT: addl $32767, %esi # imm = 0x7FFF
452 ; SSE-NEXT: subw %cx, %ax
453 ; SSE-NEXT: cmovol %esi, %eax
454 ; SSE-NEXT: movw %ax, (%rdx)
459 ; AVX-NEXT: movzwl (%rdi), %eax
460 ; AVX-NEXT: movzwl (%rsi), %ecx
461 ; AVX-NEXT: xorl %esi, %esi
462 ; AVX-NEXT: cmpw %cx, %ax
463 ; AVX-NEXT: setns %sil
464 ; AVX-NEXT: addl $32767, %esi # imm = 0x7FFF
465 ; AVX-NEXT: subw %cx, %ax
466 ; AVX-NEXT: cmovol %esi, %eax
467 ; AVX-NEXT: movw %ax, (%rdx)
469 %x = load <1 x i16>, <1 x i16>* %px
470 %y = load <1 x i16>, <1 x i16>* %py
471 %z = call <1 x i16> @llvm.ssub.sat.v1i16(<1 x i16> %x, <1 x i16> %y)
472 store <1 x i16> %z, <1 x i16>* %pz
478 define <16 x i4> @v16i4(<16 x i4> %x, <16 x i4> %y) nounwind {
481 ; SSE-NEXT: psllw $4, %xmm1
482 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
483 ; SSE-NEXT: pand %xmm2, %xmm1
484 ; SSE-NEXT: psllw $4, %xmm0
485 ; SSE-NEXT: pand %xmm2, %xmm0
486 ; SSE-NEXT: psubsb %xmm1, %xmm0
487 ; SSE-NEXT: psrlw $4, %xmm0
488 ; SSE-NEXT: pand {{.*}}(%rip), %xmm0
489 ; SSE-NEXT: movdqa {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
490 ; SSE-NEXT: pxor %xmm1, %xmm0
491 ; SSE-NEXT: psubb %xmm1, %xmm0
496 ; AVX-NEXT: vpsllw $4, %xmm1, %xmm1
497 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
498 ; AVX-NEXT: vpand %xmm2, %xmm1, %xmm1
499 ; AVX-NEXT: vpsllw $4, %xmm0, %xmm0
500 ; AVX-NEXT: vpand %xmm2, %xmm0, %xmm0
501 ; AVX-NEXT: vpsubsb %xmm1, %xmm0, %xmm0
502 ; AVX-NEXT: vpsrlw $4, %xmm0, %xmm0
503 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
504 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
505 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
506 ; AVX-NEXT: vpsubb %xmm1, %xmm0, %xmm0
508 %z = call <16 x i4> @llvm.ssub.sat.v16i4(<16 x i4> %x, <16 x i4> %y)
512 define <16 x i1> @v16i1(<16 x i1> %x, <16 x i1> %y) nounwind {
515 ; SSE-NEXT: psllw $7, %xmm1
516 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
517 ; SSE-NEXT: pand %xmm2, %xmm1
518 ; SSE-NEXT: psllw $7, %xmm0
519 ; SSE-NEXT: pand %xmm2, %xmm0
520 ; SSE-NEXT: psubsb %xmm1, %xmm0
521 ; SSE-NEXT: pxor %xmm1, %xmm1
522 ; SSE-NEXT: pcmpgtb %xmm0, %xmm1
523 ; SSE-NEXT: movdqa %xmm1, %xmm0
528 ; AVX1-NEXT: vpsllw $7, %xmm1, %xmm1
529 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
530 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
531 ; AVX1-NEXT: vpsllw $7, %xmm0, %xmm0
532 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
533 ; AVX1-NEXT: vpsubsb %xmm1, %xmm0, %xmm0
534 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
535 ; AVX1-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm0
540 ; AVX2-NEXT: vpsllw $7, %xmm1, %xmm1
541 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
542 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1
543 ; AVX2-NEXT: vpsllw $7, %xmm0, %xmm0
544 ; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
545 ; AVX2-NEXT: vpsubsb %xmm1, %xmm0, %xmm0
546 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
547 ; AVX2-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm0
550 ; AVX512-LABEL: v16i1:
552 ; AVX512-NEXT: vpsllw $7, %xmm0, %xmm0
553 ; AVX512-NEXT: vpmovb2m %xmm0, %k0
554 ; AVX512-NEXT: vpsllw $7, %xmm1, %xmm0
555 ; AVX512-NEXT: vpmovb2m %xmm0, %k1
556 ; AVX512-NEXT: kandnw %k0, %k1, %k0
557 ; AVX512-NEXT: vpmovm2b %k0, %xmm0
559 %z = call <16 x i1> @llvm.ssub.sat.v16i1(<16 x i1> %x, <16 x i1> %y)
565 define <2 x i32> @v2i32(<2 x i32> %x, <2 x i32> %y) nounwind {
568 ; SSE2-NEXT: pxor %xmm2, %xmm2
569 ; SSE2-NEXT: movdqa %xmm0, %xmm3
570 ; SSE2-NEXT: psubd %xmm1, %xmm3
571 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm1
572 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm0
573 ; SSE2-NEXT: pxor %xmm1, %xmm0
574 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm2
575 ; SSE2-NEXT: movdqa %xmm2, %xmm1
576 ; SSE2-NEXT: pandn {{.*}}(%rip), %xmm1
577 ; SSE2-NEXT: psrld $1, %xmm2
578 ; SSE2-NEXT: por %xmm1, %xmm2
579 ; SSE2-NEXT: pand %xmm0, %xmm2
580 ; SSE2-NEXT: pandn %xmm3, %xmm0
581 ; SSE2-NEXT: por %xmm2, %xmm0
584 ; SSSE3-LABEL: v2i32:
586 ; SSSE3-NEXT: pxor %xmm2, %xmm2
587 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
588 ; SSSE3-NEXT: psubd %xmm1, %xmm3
589 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm1
590 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm0
591 ; SSSE3-NEXT: pxor %xmm1, %xmm0
592 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm2
593 ; SSSE3-NEXT: movdqa %xmm2, %xmm1
594 ; SSSE3-NEXT: pandn {{.*}}(%rip), %xmm1
595 ; SSSE3-NEXT: psrld $1, %xmm2
596 ; SSSE3-NEXT: por %xmm1, %xmm2
597 ; SSSE3-NEXT: pand %xmm0, %xmm2
598 ; SSSE3-NEXT: pandn %xmm3, %xmm0
599 ; SSSE3-NEXT: por %xmm2, %xmm0
602 ; SSE41-LABEL: v2i32:
604 ; SSE41-NEXT: movdqa %xmm0, %xmm2
605 ; SSE41-NEXT: pxor %xmm0, %xmm0
606 ; SSE41-NEXT: movdqa %xmm2, %xmm3
607 ; SSE41-NEXT: psubd %xmm1, %xmm3
608 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
609 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm2
610 ; SSE41-NEXT: pxor %xmm1, %xmm2
611 ; SSE41-NEXT: movaps {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
612 ; SSE41-NEXT: movdqa %xmm3, %xmm0
613 ; SSE41-NEXT: blendvps %xmm0, {{.*}}(%rip), %xmm1
614 ; SSE41-NEXT: movdqa %xmm2, %xmm0
615 ; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm3
616 ; SSE41-NEXT: movaps %xmm3, %xmm0
621 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
622 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2
623 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
624 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
625 ; AVX1-NEXT: vpxor %xmm0, %xmm2, %xmm0
626 ; AVX1-NEXT: vmovaps {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
627 ; AVX1-NEXT: vblendvps %xmm1, {{.*}}(%rip), %xmm2, %xmm2
628 ; AVX1-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0
633 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
634 ; AVX2-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2
635 ; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm1
636 ; AVX2-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
637 ; AVX2-NEXT: vpxor %xmm0, %xmm2, %xmm0
638 ; AVX2-NEXT: vbroadcastss {{.*#+}} xmm2 = [2147483647,2147483647,2147483647,2147483647]
639 ; AVX2-NEXT: vbroadcastss {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
640 ; AVX2-NEXT: vblendvps %xmm1, %xmm2, %xmm3, %xmm2
641 ; AVX2-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0
644 ; AVX512-LABEL: v2i32:
646 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
647 ; AVX512-NEXT: vpcmpgtd %xmm2, %xmm1, %k0
648 ; AVX512-NEXT: vpsubd %xmm1, %xmm0, %xmm1
649 ; AVX512-NEXT: vpcmpgtd %xmm1, %xmm0, %k1
650 ; AVX512-NEXT: kxorw %k1, %k0, %k1
651 ; AVX512-NEXT: vpcmpgtd %xmm1, %xmm2, %k2
652 ; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
653 ; AVX512-NEXT: vpbroadcastd {{.*}}(%rip), %xmm0 {%k2}
654 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm1 {%k1}
655 ; AVX512-NEXT: vmovdqa %xmm1, %xmm0
657 %z = call <2 x i32> @llvm.ssub.sat.v2i32(<2 x i32> %x, <2 x i32> %y)
661 define <4 x i32> @v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {
664 ; SSE2-NEXT: pxor %xmm2, %xmm2
665 ; SSE2-NEXT: movdqa %xmm0, %xmm3
666 ; SSE2-NEXT: psubd %xmm1, %xmm3
667 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm1
668 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm0
669 ; SSE2-NEXT: pxor %xmm1, %xmm0
670 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm2
671 ; SSE2-NEXT: movdqa %xmm2, %xmm1
672 ; SSE2-NEXT: pandn {{.*}}(%rip), %xmm1
673 ; SSE2-NEXT: psrld $1, %xmm2
674 ; SSE2-NEXT: por %xmm1, %xmm2
675 ; SSE2-NEXT: pand %xmm0, %xmm2
676 ; SSE2-NEXT: pandn %xmm3, %xmm0
677 ; SSE2-NEXT: por %xmm2, %xmm0
680 ; SSSE3-LABEL: v4i32:
682 ; SSSE3-NEXT: pxor %xmm2, %xmm2
683 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
684 ; SSSE3-NEXT: psubd %xmm1, %xmm3
685 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm1
686 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm0
687 ; SSSE3-NEXT: pxor %xmm1, %xmm0
688 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm2
689 ; SSSE3-NEXT: movdqa %xmm2, %xmm1
690 ; SSSE3-NEXT: pandn {{.*}}(%rip), %xmm1
691 ; SSSE3-NEXT: psrld $1, %xmm2
692 ; SSSE3-NEXT: por %xmm1, %xmm2
693 ; SSSE3-NEXT: pand %xmm0, %xmm2
694 ; SSSE3-NEXT: pandn %xmm3, %xmm0
695 ; SSSE3-NEXT: por %xmm2, %xmm0
698 ; SSE41-LABEL: v4i32:
700 ; SSE41-NEXT: movdqa %xmm0, %xmm2
701 ; SSE41-NEXT: pxor %xmm0, %xmm0
702 ; SSE41-NEXT: movdqa %xmm2, %xmm3
703 ; SSE41-NEXT: psubd %xmm1, %xmm3
704 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
705 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm2
706 ; SSE41-NEXT: pxor %xmm1, %xmm2
707 ; SSE41-NEXT: movaps {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
708 ; SSE41-NEXT: movdqa %xmm3, %xmm0
709 ; SSE41-NEXT: blendvps %xmm0, {{.*}}(%rip), %xmm1
710 ; SSE41-NEXT: movdqa %xmm2, %xmm0
711 ; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm3
712 ; SSE41-NEXT: movaps %xmm3, %xmm0
717 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
718 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2
719 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
720 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
721 ; AVX1-NEXT: vpxor %xmm0, %xmm2, %xmm0
722 ; AVX1-NEXT: vmovaps {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
723 ; AVX1-NEXT: vblendvps %xmm1, {{.*}}(%rip), %xmm2, %xmm2
724 ; AVX1-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0
729 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
730 ; AVX2-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2
731 ; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm1
732 ; AVX2-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
733 ; AVX2-NEXT: vpxor %xmm0, %xmm2, %xmm0
734 ; AVX2-NEXT: vbroadcastss {{.*#+}} xmm2 = [2147483647,2147483647,2147483647,2147483647]
735 ; AVX2-NEXT: vbroadcastss {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
736 ; AVX2-NEXT: vblendvps %xmm1, %xmm2, %xmm3, %xmm2
737 ; AVX2-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0
740 ; AVX512-LABEL: v4i32:
742 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
743 ; AVX512-NEXT: vpcmpgtd %xmm2, %xmm1, %k0
744 ; AVX512-NEXT: vpsubd %xmm1, %xmm0, %xmm1
745 ; AVX512-NEXT: vpcmpgtd %xmm1, %xmm0, %k1
746 ; AVX512-NEXT: kxorw %k1, %k0, %k1
747 ; AVX512-NEXT: vpcmpgtd %xmm1, %xmm2, %k2
748 ; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
749 ; AVX512-NEXT: vpbroadcastd {{.*}}(%rip), %xmm0 {%k2}
750 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm1 {%k1}
751 ; AVX512-NEXT: vmovdqa %xmm1, %xmm0
753 %z = call <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32> %x, <4 x i32> %y)
757 define <8 x i32> @v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
760 ; SSE2-NEXT: pxor %xmm4, %xmm4
761 ; SSE2-NEXT: movdqa %xmm0, %xmm5
762 ; SSE2-NEXT: psubd %xmm2, %xmm5
763 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm2
764 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm0
765 ; SSE2-NEXT: pxor %xmm2, %xmm0
766 ; SSE2-NEXT: pxor %xmm2, %xmm2
767 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm2
768 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
769 ; SSE2-NEXT: movdqa %xmm2, %xmm7
770 ; SSE2-NEXT: pandn %xmm6, %xmm7
771 ; SSE2-NEXT: psrld $1, %xmm2
772 ; SSE2-NEXT: por %xmm7, %xmm2
773 ; SSE2-NEXT: pand %xmm0, %xmm2
774 ; SSE2-NEXT: pandn %xmm5, %xmm0
775 ; SSE2-NEXT: por %xmm2, %xmm0
776 ; SSE2-NEXT: movdqa %xmm1, %xmm2
777 ; SSE2-NEXT: psubd %xmm3, %xmm2
778 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm3
779 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm1
780 ; SSE2-NEXT: pxor %xmm3, %xmm1
781 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
782 ; SSE2-NEXT: movdqa %xmm4, %xmm3
783 ; SSE2-NEXT: pandn %xmm6, %xmm3
784 ; SSE2-NEXT: psrld $1, %xmm4
785 ; SSE2-NEXT: por %xmm3, %xmm4
786 ; SSE2-NEXT: pand %xmm1, %xmm4
787 ; SSE2-NEXT: pandn %xmm2, %xmm1
788 ; SSE2-NEXT: por %xmm4, %xmm1
791 ; SSSE3-LABEL: v8i32:
793 ; SSSE3-NEXT: pxor %xmm4, %xmm4
794 ; SSSE3-NEXT: movdqa %xmm0, %xmm5
795 ; SSSE3-NEXT: psubd %xmm2, %xmm5
796 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm2
797 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm0
798 ; SSSE3-NEXT: pxor %xmm2, %xmm0
799 ; SSSE3-NEXT: pxor %xmm2, %xmm2
800 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm2
801 ; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
802 ; SSSE3-NEXT: movdqa %xmm2, %xmm7
803 ; SSSE3-NEXT: pandn %xmm6, %xmm7
804 ; SSSE3-NEXT: psrld $1, %xmm2
805 ; SSSE3-NEXT: por %xmm7, %xmm2
806 ; SSSE3-NEXT: pand %xmm0, %xmm2
807 ; SSSE3-NEXT: pandn %xmm5, %xmm0
808 ; SSSE3-NEXT: por %xmm2, %xmm0
809 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
810 ; SSSE3-NEXT: psubd %xmm3, %xmm2
811 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm3
812 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm1
813 ; SSSE3-NEXT: pxor %xmm3, %xmm1
814 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
815 ; SSSE3-NEXT: movdqa %xmm4, %xmm3
816 ; SSSE3-NEXT: pandn %xmm6, %xmm3
817 ; SSSE3-NEXT: psrld $1, %xmm4
818 ; SSSE3-NEXT: por %xmm3, %xmm4
819 ; SSSE3-NEXT: pand %xmm1, %xmm4
820 ; SSSE3-NEXT: pandn %xmm2, %xmm1
821 ; SSSE3-NEXT: por %xmm4, %xmm1
824 ; SSE41-LABEL: v8i32:
826 ; SSE41-NEXT: movdqa %xmm0, %xmm4
827 ; SSE41-NEXT: pxor %xmm8, %xmm8
828 ; SSE41-NEXT: movdqa %xmm0, %xmm5
829 ; SSE41-NEXT: psubd %xmm2, %xmm5
830 ; SSE41-NEXT: pcmpgtd %xmm8, %xmm2
831 ; SSE41-NEXT: pcmpgtd %xmm5, %xmm4
832 ; SSE41-NEXT: pxor %xmm2, %xmm4
833 ; SSE41-NEXT: movaps {{.*#+}} xmm7 = [2147483647,2147483647,2147483647,2147483647]
834 ; SSE41-NEXT: movaps {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
835 ; SSE41-NEXT: movaps %xmm6, %xmm2
836 ; SSE41-NEXT: movdqa %xmm5, %xmm0
837 ; SSE41-NEXT: blendvps %xmm0, %xmm7, %xmm2
838 ; SSE41-NEXT: movdqa %xmm4, %xmm0
839 ; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm5
840 ; SSE41-NEXT: movdqa %xmm1, %xmm2
841 ; SSE41-NEXT: psubd %xmm3, %xmm2
842 ; SSE41-NEXT: pcmpgtd %xmm8, %xmm3
843 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm1
844 ; SSE41-NEXT: pxor %xmm3, %xmm1
845 ; SSE41-NEXT: movdqa %xmm2, %xmm0
846 ; SSE41-NEXT: blendvps %xmm0, %xmm7, %xmm6
847 ; SSE41-NEXT: movdqa %xmm1, %xmm0
848 ; SSE41-NEXT: blendvps %xmm0, %xmm6, %xmm2
849 ; SSE41-NEXT: movaps %xmm5, %xmm0
850 ; SSE41-NEXT: movaps %xmm2, %xmm1
855 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
856 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
857 ; AVX1-NEXT: vpcmpgtd %xmm3, %xmm2, %xmm4
858 ; AVX1-NEXT: vpcmpgtd %xmm3, %xmm1, %xmm3
859 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3
860 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
861 ; AVX1-NEXT: vpsubd %xmm2, %xmm4, %xmm2
862 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm4, %xmm4
863 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1
864 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
865 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0
866 ; AVX1-NEXT: vxorps %ymm0, %ymm3, %ymm0
867 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
868 ; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
869 ; AVX1-NEXT: vblendvps %ymm1, {{.*}}(%rip), %ymm2, %ymm2
870 ; AVX1-NEXT: vblendvps %ymm0, %ymm2, %ymm1, %ymm0
875 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
876 ; AVX2-NEXT: vpcmpgtd %ymm2, %ymm1, %ymm2
877 ; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm1
878 ; AVX2-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm0
879 ; AVX2-NEXT: vpxor %ymm0, %ymm2, %ymm0
880 ; AVX2-NEXT: vbroadcastss {{.*#+}} ymm2 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
881 ; AVX2-NEXT: vbroadcastss {{.*#+}} ymm3 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
882 ; AVX2-NEXT: vblendvps %ymm1, %ymm2, %ymm3, %ymm2
883 ; AVX2-NEXT: vblendvps %ymm0, %ymm2, %ymm1, %ymm0
886 ; AVX512-LABEL: v8i32:
888 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
889 ; AVX512-NEXT: vpcmpgtd %ymm2, %ymm1, %k0
890 ; AVX512-NEXT: vpsubd %ymm1, %ymm0, %ymm1
891 ; AVX512-NEXT: vpcmpgtd %ymm1, %ymm0, %k1
892 ; AVX512-NEXT: kxorw %k1, %k0, %k1
893 ; AVX512-NEXT: vpcmpgtd %ymm1, %ymm2, %k2
894 ; AVX512-NEXT: vpbroadcastd {{.*#+}} ymm0 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
895 ; AVX512-NEXT: vpbroadcastd {{.*}}(%rip), %ymm0 {%k2}
896 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm1 {%k1}
897 ; AVX512-NEXT: vmovdqa %ymm1, %ymm0
899 %z = call <8 x i32> @llvm.ssub.sat.v8i32(<8 x i32> %x, <8 x i32> %y)
903 define <16 x i32> @v16i32(<16 x i32> %x, <16 x i32> %y) nounwind {
904 ; SSE2-LABEL: v16i32:
906 ; SSE2-NEXT: pxor %xmm8, %xmm8
907 ; SSE2-NEXT: movdqa %xmm0, %xmm9
908 ; SSE2-NEXT: psubd %xmm4, %xmm9
909 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm4
910 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm0
911 ; SSE2-NEXT: pxor %xmm4, %xmm0
912 ; SSE2-NEXT: pxor %xmm4, %xmm4
913 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm4
914 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [2147483648,2147483648,2147483648,2147483648]
915 ; SSE2-NEXT: movdqa %xmm4, %xmm11
916 ; SSE2-NEXT: pandn %xmm10, %xmm11
917 ; SSE2-NEXT: psrld $1, %xmm4
918 ; SSE2-NEXT: por %xmm11, %xmm4
919 ; SSE2-NEXT: pand %xmm0, %xmm4
920 ; SSE2-NEXT: pandn %xmm9, %xmm0
921 ; SSE2-NEXT: por %xmm4, %xmm0
922 ; SSE2-NEXT: movdqa %xmm1, %xmm4
923 ; SSE2-NEXT: psubd %xmm5, %xmm4
924 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm5
925 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm1
926 ; SSE2-NEXT: pxor %xmm5, %xmm1
927 ; SSE2-NEXT: pxor %xmm5, %xmm5
928 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm5
929 ; SSE2-NEXT: movdqa %xmm5, %xmm9
930 ; SSE2-NEXT: pandn %xmm10, %xmm9
931 ; SSE2-NEXT: psrld $1, %xmm5
932 ; SSE2-NEXT: por %xmm9, %xmm5
933 ; SSE2-NEXT: pand %xmm1, %xmm5
934 ; SSE2-NEXT: pandn %xmm4, %xmm1
935 ; SSE2-NEXT: por %xmm5, %xmm1
936 ; SSE2-NEXT: movdqa %xmm2, %xmm4
937 ; SSE2-NEXT: psubd %xmm6, %xmm4
938 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm6
939 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm2
940 ; SSE2-NEXT: pxor %xmm6, %xmm2
941 ; SSE2-NEXT: pxor %xmm5, %xmm5
942 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm5
943 ; SSE2-NEXT: movdqa %xmm5, %xmm6
944 ; SSE2-NEXT: pandn %xmm10, %xmm6
945 ; SSE2-NEXT: psrld $1, %xmm5
946 ; SSE2-NEXT: por %xmm6, %xmm5
947 ; SSE2-NEXT: pand %xmm2, %xmm5
948 ; SSE2-NEXT: pandn %xmm4, %xmm2
949 ; SSE2-NEXT: por %xmm5, %xmm2
950 ; SSE2-NEXT: movdqa %xmm3, %xmm4
951 ; SSE2-NEXT: psubd %xmm7, %xmm4
952 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm7
953 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm3
954 ; SSE2-NEXT: pxor %xmm7, %xmm3
955 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm8
956 ; SSE2-NEXT: movdqa %xmm8, %xmm5
957 ; SSE2-NEXT: pandn %xmm10, %xmm5
958 ; SSE2-NEXT: psrld $1, %xmm8
959 ; SSE2-NEXT: por %xmm5, %xmm8
960 ; SSE2-NEXT: pand %xmm3, %xmm8
961 ; SSE2-NEXT: pandn %xmm4, %xmm3
962 ; SSE2-NEXT: por %xmm8, %xmm3
965 ; SSSE3-LABEL: v16i32:
967 ; SSSE3-NEXT: pxor %xmm8, %xmm8
968 ; SSSE3-NEXT: movdqa %xmm0, %xmm9
969 ; SSSE3-NEXT: psubd %xmm4, %xmm9
970 ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm4
971 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm0
972 ; SSSE3-NEXT: pxor %xmm4, %xmm0
973 ; SSSE3-NEXT: pxor %xmm4, %xmm4
974 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm4
975 ; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [2147483648,2147483648,2147483648,2147483648]
976 ; SSSE3-NEXT: movdqa %xmm4, %xmm11
977 ; SSSE3-NEXT: pandn %xmm10, %xmm11
978 ; SSSE3-NEXT: psrld $1, %xmm4
979 ; SSSE3-NEXT: por %xmm11, %xmm4
980 ; SSSE3-NEXT: pand %xmm0, %xmm4
981 ; SSSE3-NEXT: pandn %xmm9, %xmm0
982 ; SSSE3-NEXT: por %xmm4, %xmm0
983 ; SSSE3-NEXT: movdqa %xmm1, %xmm4
984 ; SSSE3-NEXT: psubd %xmm5, %xmm4
985 ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm5
986 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm1
987 ; SSSE3-NEXT: pxor %xmm5, %xmm1
988 ; SSSE3-NEXT: pxor %xmm5, %xmm5
989 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm5
990 ; SSSE3-NEXT: movdqa %xmm5, %xmm9
991 ; SSSE3-NEXT: pandn %xmm10, %xmm9
992 ; SSSE3-NEXT: psrld $1, %xmm5
993 ; SSSE3-NEXT: por %xmm9, %xmm5
994 ; SSSE3-NEXT: pand %xmm1, %xmm5
995 ; SSSE3-NEXT: pandn %xmm4, %xmm1
996 ; SSSE3-NEXT: por %xmm5, %xmm1
997 ; SSSE3-NEXT: movdqa %xmm2, %xmm4
998 ; SSSE3-NEXT: psubd %xmm6, %xmm4
999 ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm6
1000 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm2
1001 ; SSSE3-NEXT: pxor %xmm6, %xmm2
1002 ; SSSE3-NEXT: pxor %xmm5, %xmm5
1003 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm5
1004 ; SSSE3-NEXT: movdqa %xmm5, %xmm6
1005 ; SSSE3-NEXT: pandn %xmm10, %xmm6
1006 ; SSSE3-NEXT: psrld $1, %xmm5
1007 ; SSSE3-NEXT: por %xmm6, %xmm5
1008 ; SSSE3-NEXT: pand %xmm2, %xmm5
1009 ; SSSE3-NEXT: pandn %xmm4, %xmm2
1010 ; SSSE3-NEXT: por %xmm5, %xmm2
1011 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
1012 ; SSSE3-NEXT: psubd %xmm7, %xmm4
1013 ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm7
1014 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm3
1015 ; SSSE3-NEXT: pxor %xmm7, %xmm3
1016 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm8
1017 ; SSSE3-NEXT: movdqa %xmm8, %xmm5
1018 ; SSSE3-NEXT: pandn %xmm10, %xmm5
1019 ; SSSE3-NEXT: psrld $1, %xmm8
1020 ; SSSE3-NEXT: por %xmm5, %xmm8
1021 ; SSSE3-NEXT: pand %xmm3, %xmm8
1022 ; SSSE3-NEXT: pandn %xmm4, %xmm3
1023 ; SSSE3-NEXT: por %xmm8, %xmm3
1026 ; SSE41-LABEL: v16i32:
1028 ; SSE41-NEXT: movdqa %xmm3, %xmm8
1029 ; SSE41-NEXT: movdqa %xmm0, %xmm3
1030 ; SSE41-NEXT: pxor %xmm10, %xmm10
1031 ; SSE41-NEXT: movdqa %xmm0, %xmm9
1032 ; SSE41-NEXT: psubd %xmm4, %xmm9
1033 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm4
1034 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm3
1035 ; SSE41-NEXT: pxor %xmm4, %xmm3
1036 ; SSE41-NEXT: movaps {{.*#+}} xmm12 = [2147483647,2147483647,2147483647,2147483647]
1037 ; SSE41-NEXT: movaps {{.*#+}} xmm11 = [2147483648,2147483648,2147483648,2147483648]
1038 ; SSE41-NEXT: movaps %xmm11, %xmm4
1039 ; SSE41-NEXT: movdqa %xmm9, %xmm0
1040 ; SSE41-NEXT: blendvps %xmm0, %xmm12, %xmm4
1041 ; SSE41-NEXT: movdqa %xmm3, %xmm0
1042 ; SSE41-NEXT: blendvps %xmm0, %xmm4, %xmm9
1043 ; SSE41-NEXT: movdqa %xmm1, %xmm4
1044 ; SSE41-NEXT: psubd %xmm5, %xmm4
1045 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm5
1046 ; SSE41-NEXT: pcmpgtd %xmm4, %xmm1
1047 ; SSE41-NEXT: pxor %xmm5, %xmm1
1048 ; SSE41-NEXT: movaps %xmm11, %xmm3
1049 ; SSE41-NEXT: movdqa %xmm4, %xmm0
1050 ; SSE41-NEXT: blendvps %xmm0, %xmm12, %xmm3
1051 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1052 ; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm4
1053 ; SSE41-NEXT: movdqa %xmm2, %xmm3
1054 ; SSE41-NEXT: psubd %xmm6, %xmm3
1055 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm6
1056 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm2
1057 ; SSE41-NEXT: pxor %xmm6, %xmm2
1058 ; SSE41-NEXT: movaps %xmm11, %xmm1
1059 ; SSE41-NEXT: movdqa %xmm3, %xmm0
1060 ; SSE41-NEXT: blendvps %xmm0, %xmm12, %xmm1
1061 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1062 ; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm3
1063 ; SSE41-NEXT: movdqa %xmm8, %xmm5
1064 ; SSE41-NEXT: psubd %xmm7, %xmm5
1065 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm7
1066 ; SSE41-NEXT: pcmpgtd %xmm5, %xmm8
1067 ; SSE41-NEXT: pxor %xmm7, %xmm8
1068 ; SSE41-NEXT: movdqa %xmm5, %xmm0
1069 ; SSE41-NEXT: blendvps %xmm0, %xmm12, %xmm11
1070 ; SSE41-NEXT: movdqa %xmm8, %xmm0
1071 ; SSE41-NEXT: blendvps %xmm0, %xmm11, %xmm5
1072 ; SSE41-NEXT: movaps %xmm9, %xmm0
1073 ; SSE41-NEXT: movaps %xmm4, %xmm1
1074 ; SSE41-NEXT: movaps %xmm3, %xmm2
1075 ; SSE41-NEXT: movaps %xmm5, %xmm3
1078 ; AVX1-LABEL: v16i32:
1080 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
1081 ; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5
1082 ; AVX1-NEXT: vpcmpgtd %xmm5, %xmm4, %xmm6
1083 ; AVX1-NEXT: vpcmpgtd %xmm5, %xmm2, %xmm7
1084 ; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm7, %ymm6
1085 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7
1086 ; AVX1-NEXT: vpsubd %xmm4, %xmm7, %xmm4
1087 ; AVX1-NEXT: vpcmpgtd %xmm4, %xmm7, %xmm7
1088 ; AVX1-NEXT: vpsubd %xmm2, %xmm0, %xmm2
1089 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm0, %xmm0
1090 ; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm0, %ymm0
1091 ; AVX1-NEXT: vxorps %ymm0, %ymm6, %ymm0
1092 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm2, %ymm2
1093 ; AVX1-NEXT: vmovaps {{.*#+}} ymm4 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
1094 ; AVX1-NEXT: vmovaps {{.*#+}} ymm6 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1095 ; AVX1-NEXT: vblendvps %ymm2, %ymm4, %ymm6, %ymm7
1096 ; AVX1-NEXT: vblendvps %ymm0, %ymm7, %ymm2, %ymm0
1097 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2
1098 ; AVX1-NEXT: vpcmpgtd %xmm5, %xmm2, %xmm7
1099 ; AVX1-NEXT: vpcmpgtd %xmm5, %xmm3, %xmm5
1100 ; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm5, %ymm5
1101 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7
1102 ; AVX1-NEXT: vpsubd %xmm2, %xmm7, %xmm2
1103 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm7, %xmm7
1104 ; AVX1-NEXT: vpsubd %xmm3, %xmm1, %xmm3
1105 ; AVX1-NEXT: vpcmpgtd %xmm3, %xmm1, %xmm1
1106 ; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm1, %ymm1
1107 ; AVX1-NEXT: vxorps %ymm1, %ymm5, %ymm1
1108 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
1109 ; AVX1-NEXT: vblendvps %ymm2, %ymm4, %ymm6, %ymm3
1110 ; AVX1-NEXT: vblendvps %ymm1, %ymm3, %ymm2, %ymm1
1113 ; AVX2-LABEL: v16i32:
1115 ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4
1116 ; AVX2-NEXT: vpcmpgtd %ymm4, %ymm2, %ymm5
1117 ; AVX2-NEXT: vpsubd %ymm2, %ymm0, %ymm2
1118 ; AVX2-NEXT: vpcmpgtd %ymm2, %ymm0, %ymm0
1119 ; AVX2-NEXT: vpxor %ymm0, %ymm5, %ymm0
1120 ; AVX2-NEXT: vbroadcastss {{.*#+}} ymm5 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
1121 ; AVX2-NEXT: vbroadcastss {{.*#+}} ymm6 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1122 ; AVX2-NEXT: vblendvps %ymm2, %ymm5, %ymm6, %ymm7
1123 ; AVX2-NEXT: vblendvps %ymm0, %ymm7, %ymm2, %ymm0
1124 ; AVX2-NEXT: vpcmpgtd %ymm4, %ymm3, %ymm2
1125 ; AVX2-NEXT: vpsubd %ymm3, %ymm1, %ymm3
1126 ; AVX2-NEXT: vpcmpgtd %ymm3, %ymm1, %ymm1
1127 ; AVX2-NEXT: vpxor %ymm1, %ymm2, %ymm1
1128 ; AVX2-NEXT: vblendvps %ymm3, %ymm5, %ymm6, %ymm2
1129 ; AVX2-NEXT: vblendvps %ymm1, %ymm2, %ymm3, %ymm1
1132 ; AVX512-LABEL: v16i32:
1134 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
1135 ; AVX512-NEXT: vpcmpgtd %zmm2, %zmm1, %k0
1136 ; AVX512-NEXT: vpsubd %zmm1, %zmm0, %zmm1
1137 ; AVX512-NEXT: vpcmpgtd %zmm1, %zmm0, %k1
1138 ; AVX512-NEXT: kxorw %k1, %k0, %k1
1139 ; AVX512-NEXT: vpcmpgtd %zmm1, %zmm2, %k2
1140 ; AVX512-NEXT: vpbroadcastd {{.*#+}} zmm0 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1141 ; AVX512-NEXT: vpbroadcastd {{.*}}(%rip), %zmm0 {%k2}
1142 ; AVX512-NEXT: vmovdqa32 %zmm0, %zmm1 {%k1}
1143 ; AVX512-NEXT: vmovdqa64 %zmm1, %zmm0
1145 %z = call <16 x i32> @llvm.ssub.sat.v16i32(<16 x i32> %x, <16 x i32> %y)
1149 define <2 x i64> @v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {
1150 ; SSE2-LABEL: v2i64:
1152 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1153 ; SSE2-NEXT: movdqa %xmm0, %xmm4
1154 ; SSE2-NEXT: pxor %xmm2, %xmm4
1155 ; SSE2-NEXT: psubq %xmm1, %xmm0
1156 ; SSE2-NEXT: movdqa %xmm0, %xmm3
1157 ; SSE2-NEXT: pxor %xmm2, %xmm3
1158 ; SSE2-NEXT: movdqa %xmm4, %xmm5
1159 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
1160 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1161 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm4
1162 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1163 ; SSE2-NEXT: pand %xmm6, %xmm4
1164 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1165 ; SSE2-NEXT: por %xmm4, %xmm5
1166 ; SSE2-NEXT: pxor %xmm2, %xmm1
1167 ; SSE2-NEXT: movdqa %xmm1, %xmm4
1168 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
1169 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1170 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm1
1171 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
1172 ; SSE2-NEXT: pand %xmm6, %xmm7
1173 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
1174 ; SSE2-NEXT: por %xmm7, %xmm1
1175 ; SSE2-NEXT: pxor %xmm5, %xmm1
1176 ; SSE2-NEXT: movdqa %xmm2, %xmm4
1177 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
1178 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1179 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3
1180 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1181 ; SSE2-NEXT: pand %xmm5, %xmm2
1182 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1183 ; SSE2-NEXT: por %xmm2, %xmm3
1184 ; SSE2-NEXT: movdqa %xmm3, %xmm2
1185 ; SSE2-NEXT: pandn {{.*}}(%rip), %xmm2
1186 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm3
1187 ; SSE2-NEXT: por %xmm2, %xmm3
1188 ; SSE2-NEXT: pand %xmm1, %xmm3
1189 ; SSE2-NEXT: pandn %xmm0, %xmm1
1190 ; SSE2-NEXT: por %xmm3, %xmm1
1191 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1194 ; SSSE3-LABEL: v2i64:
1196 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1197 ; SSSE3-NEXT: movdqa %xmm0, %xmm4
1198 ; SSSE3-NEXT: pxor %xmm2, %xmm4
1199 ; SSSE3-NEXT: psubq %xmm1, %xmm0
1200 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
1201 ; SSSE3-NEXT: pxor %xmm2, %xmm3
1202 ; SSSE3-NEXT: movdqa %xmm4, %xmm5
1203 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
1204 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1205 ; SSSE3-NEXT: pcmpeqd %xmm3, %xmm4
1206 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1207 ; SSSE3-NEXT: pand %xmm6, %xmm4
1208 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1209 ; SSSE3-NEXT: por %xmm4, %xmm5
1210 ; SSSE3-NEXT: pxor %xmm2, %xmm1
1211 ; SSSE3-NEXT: movdqa %xmm1, %xmm4
1212 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
1213 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1214 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm1
1215 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
1216 ; SSSE3-NEXT: pand %xmm6, %xmm7
1217 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
1218 ; SSSE3-NEXT: por %xmm7, %xmm1
1219 ; SSSE3-NEXT: pxor %xmm5, %xmm1
1220 ; SSSE3-NEXT: movdqa %xmm2, %xmm4
1221 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm4
1222 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1223 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm3
1224 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1225 ; SSSE3-NEXT: pand %xmm5, %xmm2
1226 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1227 ; SSSE3-NEXT: por %xmm2, %xmm3
1228 ; SSSE3-NEXT: movdqa %xmm3, %xmm2
1229 ; SSSE3-NEXT: pandn {{.*}}(%rip), %xmm2
1230 ; SSSE3-NEXT: pand {{.*}}(%rip), %xmm3
1231 ; SSSE3-NEXT: por %xmm2, %xmm3
1232 ; SSSE3-NEXT: pand %xmm1, %xmm3
1233 ; SSSE3-NEXT: pandn %xmm0, %xmm1
1234 ; SSSE3-NEXT: por %xmm3, %xmm1
1235 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
1238 ; SSE41-LABEL: v2i64:
1240 ; SSE41-NEXT: movdqa %xmm0, %xmm2
1241 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
1242 ; SSE41-NEXT: pxor %xmm3, %xmm0
1243 ; SSE41-NEXT: psubq %xmm1, %xmm2
1244 ; SSE41-NEXT: movdqa %xmm2, %xmm4
1245 ; SSE41-NEXT: pxor %xmm3, %xmm4
1246 ; SSE41-NEXT: movdqa %xmm0, %xmm5
1247 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm5
1248 ; SSE41-NEXT: pcmpgtd %xmm4, %xmm0
1249 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[0,0,2,2]
1250 ; SSE41-NEXT: pand %xmm5, %xmm6
1251 ; SSE41-NEXT: por %xmm0, %xmm6
1252 ; SSE41-NEXT: pxor %xmm3, %xmm1
1253 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1254 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm0
1255 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2]
1256 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm1
1257 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1258 ; SSE41-NEXT: pand %xmm5, %xmm1
1259 ; SSE41-NEXT: por %xmm0, %xmm1
1260 ; SSE41-NEXT: pxor %xmm6, %xmm1
1261 ; SSE41-NEXT: movdqa %xmm3, %xmm5
1262 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm5
1263 ; SSE41-NEXT: pcmpgtd %xmm4, %xmm3
1264 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1265 ; SSE41-NEXT: pand %xmm5, %xmm0
1266 ; SSE41-NEXT: por %xmm3, %xmm0
1267 ; SSE41-NEXT: movapd {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1268 ; SSE41-NEXT: blendvpd %xmm0, {{.*}}(%rip), %xmm3
1269 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1270 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm2
1271 ; SSE41-NEXT: movapd %xmm2, %xmm0
1274 ; AVX1-LABEL: v2i64:
1276 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
1277 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm1, %xmm2
1278 ; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm1
1279 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0
1280 ; AVX1-NEXT: vpxor %xmm0, %xmm2, %xmm0
1281 ; AVX1-NEXT: vmovapd {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1282 ; AVX1-NEXT: vblendvpd %xmm1, {{.*}}(%rip), %xmm2, %xmm2
1283 ; AVX1-NEXT: vblendvpd %xmm0, %xmm2, %xmm1, %xmm0
1286 ; AVX2-LABEL: v2i64:
1288 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
1289 ; AVX2-NEXT: vpcmpgtq %xmm2, %xmm1, %xmm2
1290 ; AVX2-NEXT: vpsubq %xmm1, %xmm0, %xmm1
1291 ; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0
1292 ; AVX2-NEXT: vpxor %xmm0, %xmm2, %xmm0
1293 ; AVX2-NEXT: vmovapd {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1294 ; AVX2-NEXT: vblendvpd %xmm1, {{.*}}(%rip), %xmm2, %xmm2
1295 ; AVX2-NEXT: vblendvpd %xmm0, %xmm2, %xmm1, %xmm0
1298 ; AVX512-LABEL: v2i64:
1300 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
1301 ; AVX512-NEXT: vpcmpgtq %xmm2, %xmm1, %k0
1302 ; AVX512-NEXT: vpsubq %xmm1, %xmm0, %xmm1
1303 ; AVX512-NEXT: vpcmpgtq %xmm1, %xmm0, %k1
1304 ; AVX512-NEXT: kxorw %k1, %k0, %k1
1305 ; AVX512-NEXT: vpcmpgtq %xmm1, %xmm2, %k2
1306 ; AVX512-NEXT: vmovdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
1307 ; AVX512-NEXT: vmovdqa64 {{.*}}(%rip), %xmm0 {%k2}
1308 ; AVX512-NEXT: vmovdqa64 %xmm0, %xmm1 {%k1}
1309 ; AVX512-NEXT: vmovdqa %xmm1, %xmm0
1311 %z = call <2 x i64> @llvm.ssub.sat.v2i64(<2 x i64> %x, <2 x i64> %y)
1315 define <4 x i64> @v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
1316 ; SSE2-LABEL: v4i64:
1318 ; SSE2-NEXT: movdqa %xmm0, %xmm4
1319 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648]
1320 ; SSE2-NEXT: pxor %xmm8, %xmm0
1321 ; SSE2-NEXT: psubq %xmm2, %xmm4
1322 ; SSE2-NEXT: movdqa %xmm4, %xmm6
1323 ; SSE2-NEXT: pxor %xmm8, %xmm6
1324 ; SSE2-NEXT: movdqa %xmm0, %xmm7
1325 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm7
1326 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]
1327 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm0
1328 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1329 ; SSE2-NEXT: pand %xmm5, %xmm0
1330 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1331 ; SSE2-NEXT: por %xmm0, %xmm5
1332 ; SSE2-NEXT: pxor %xmm8, %xmm2
1333 ; SSE2-NEXT: movdqa %xmm2, %xmm0
1334 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm0
1335 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[0,0,2,2]
1336 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm2
1337 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1338 ; SSE2-NEXT: pand %xmm7, %xmm2
1339 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1340 ; SSE2-NEXT: por %xmm2, %xmm0
1341 ; SSE2-NEXT: pxor %xmm5, %xmm0
1342 ; SSE2-NEXT: movdqa %xmm8, %xmm2
1343 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm2
1344 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
1345 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm6
1346 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1347 ; SSE2-NEXT: pand %xmm5, %xmm6
1348 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1349 ; SSE2-NEXT: por %xmm6, %xmm2
1350 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [9223372036854775808,9223372036854775808]
1351 ; SSE2-NEXT: movdqa %xmm2, %xmm5
1352 ; SSE2-NEXT: pandn %xmm9, %xmm5
1353 ; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [9223372036854775807,9223372036854775807]
1354 ; SSE2-NEXT: pand %xmm7, %xmm2
1355 ; SSE2-NEXT: por %xmm5, %xmm2
1356 ; SSE2-NEXT: pand %xmm0, %xmm2
1357 ; SSE2-NEXT: pandn %xmm4, %xmm0
1358 ; SSE2-NEXT: por %xmm2, %xmm0
1359 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1360 ; SSE2-NEXT: pxor %xmm8, %xmm2
1361 ; SSE2-NEXT: psubq %xmm3, %xmm1
1362 ; SSE2-NEXT: movdqa %xmm1, %xmm4
1363 ; SSE2-NEXT: pxor %xmm8, %xmm4
1364 ; SSE2-NEXT: movdqa %xmm2, %xmm5
1365 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm5
1366 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1367 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm2
1368 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1369 ; SSE2-NEXT: pand %xmm6, %xmm2
1370 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1371 ; SSE2-NEXT: por %xmm2, %xmm5
1372 ; SSE2-NEXT: pxor %xmm8, %xmm3
1373 ; SSE2-NEXT: movdqa %xmm3, %xmm2
1374 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm2
1375 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
1376 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm3
1377 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1378 ; SSE2-NEXT: pand %xmm6, %xmm3
1379 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1380 ; SSE2-NEXT: por %xmm3, %xmm2
1381 ; SSE2-NEXT: pxor %xmm5, %xmm2
1382 ; SSE2-NEXT: movdqa %xmm8, %xmm3
1383 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm3
1384 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
1385 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm4
1386 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1387 ; SSE2-NEXT: pand %xmm5, %xmm4
1388 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1389 ; SSE2-NEXT: por %xmm4, %xmm3
1390 ; SSE2-NEXT: movdqa %xmm3, %xmm4
1391 ; SSE2-NEXT: pandn %xmm9, %xmm4
1392 ; SSE2-NEXT: pand %xmm7, %xmm3
1393 ; SSE2-NEXT: por %xmm4, %xmm3
1394 ; SSE2-NEXT: pand %xmm2, %xmm3
1395 ; SSE2-NEXT: pandn %xmm1, %xmm2
1396 ; SSE2-NEXT: por %xmm3, %xmm2
1397 ; SSE2-NEXT: movdqa %xmm2, %xmm1
1400 ; SSSE3-LABEL: v4i64:
1402 ; SSSE3-NEXT: movdqa %xmm0, %xmm4
1403 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648]
1404 ; SSSE3-NEXT: pxor %xmm8, %xmm0
1405 ; SSSE3-NEXT: psubq %xmm2, %xmm4
1406 ; SSSE3-NEXT: movdqa %xmm4, %xmm6
1407 ; SSSE3-NEXT: pxor %xmm8, %xmm6
1408 ; SSSE3-NEXT: movdqa %xmm0, %xmm7
1409 ; SSSE3-NEXT: pcmpgtd %xmm6, %xmm7
1410 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]
1411 ; SSSE3-NEXT: pcmpeqd %xmm6, %xmm0
1412 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1413 ; SSSE3-NEXT: pand %xmm5, %xmm0
1414 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1415 ; SSSE3-NEXT: por %xmm0, %xmm5
1416 ; SSSE3-NEXT: pxor %xmm8, %xmm2
1417 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
1418 ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm0
1419 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm0[0,0,2,2]
1420 ; SSSE3-NEXT: pcmpeqd %xmm8, %xmm2
1421 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1422 ; SSSE3-NEXT: pand %xmm7, %xmm2
1423 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1424 ; SSSE3-NEXT: por %xmm2, %xmm0
1425 ; SSSE3-NEXT: pxor %xmm5, %xmm0
1426 ; SSSE3-NEXT: movdqa %xmm8, %xmm2
1427 ; SSSE3-NEXT: pcmpgtd %xmm6, %xmm2
1428 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
1429 ; SSSE3-NEXT: pcmpeqd %xmm8, %xmm6
1430 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1431 ; SSSE3-NEXT: pand %xmm5, %xmm6
1432 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1433 ; SSSE3-NEXT: por %xmm6, %xmm2
1434 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [9223372036854775808,9223372036854775808]
1435 ; SSSE3-NEXT: movdqa %xmm2, %xmm5
1436 ; SSSE3-NEXT: pandn %xmm9, %xmm5
1437 ; SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [9223372036854775807,9223372036854775807]
1438 ; SSSE3-NEXT: pand %xmm7, %xmm2
1439 ; SSSE3-NEXT: por %xmm5, %xmm2
1440 ; SSSE3-NEXT: pand %xmm0, %xmm2
1441 ; SSSE3-NEXT: pandn %xmm4, %xmm0
1442 ; SSSE3-NEXT: por %xmm2, %xmm0
1443 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
1444 ; SSSE3-NEXT: pxor %xmm8, %xmm2
1445 ; SSSE3-NEXT: psubq %xmm3, %xmm1
1446 ; SSSE3-NEXT: movdqa %xmm1, %xmm4
1447 ; SSSE3-NEXT: pxor %xmm8, %xmm4
1448 ; SSSE3-NEXT: movdqa %xmm2, %xmm5
1449 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm5
1450 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1451 ; SSSE3-NEXT: pcmpeqd %xmm4, %xmm2
1452 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1453 ; SSSE3-NEXT: pand %xmm6, %xmm2
1454 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1455 ; SSSE3-NEXT: por %xmm2, %xmm5
1456 ; SSSE3-NEXT: pxor %xmm8, %xmm3
1457 ; SSSE3-NEXT: movdqa %xmm3, %xmm2
1458 ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm2
1459 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
1460 ; SSSE3-NEXT: pcmpeqd %xmm8, %xmm3
1461 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1462 ; SSSE3-NEXT: pand %xmm6, %xmm3
1463 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1464 ; SSSE3-NEXT: por %xmm3, %xmm2
1465 ; SSSE3-NEXT: pxor %xmm5, %xmm2
1466 ; SSSE3-NEXT: movdqa %xmm8, %xmm3
1467 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm3
1468 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
1469 ; SSSE3-NEXT: pcmpeqd %xmm8, %xmm4
1470 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1471 ; SSSE3-NEXT: pand %xmm5, %xmm4
1472 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1473 ; SSSE3-NEXT: por %xmm4, %xmm3
1474 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
1475 ; SSSE3-NEXT: pandn %xmm9, %xmm4
1476 ; SSSE3-NEXT: pand %xmm7, %xmm3
1477 ; SSSE3-NEXT: por %xmm4, %xmm3
1478 ; SSSE3-NEXT: pand %xmm2, %xmm3
1479 ; SSSE3-NEXT: pandn %xmm1, %xmm2
1480 ; SSSE3-NEXT: por %xmm3, %xmm2
1481 ; SSSE3-NEXT: movdqa %xmm2, %xmm1
1484 ; SSE41-LABEL: v4i64:
1486 ; SSE41-NEXT: movdqa %xmm0, %xmm8
1487 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [2147483648,2147483648]
1488 ; SSE41-NEXT: pxor %xmm5, %xmm0
1489 ; SSE41-NEXT: psubq %xmm2, %xmm8
1490 ; SSE41-NEXT: movdqa %xmm8, %xmm6
1491 ; SSE41-NEXT: pxor %xmm5, %xmm6
1492 ; SSE41-NEXT: movdqa %xmm0, %xmm7
1493 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm7
1494 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm0
1495 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1496 ; SSE41-NEXT: pand %xmm7, %xmm4
1497 ; SSE41-NEXT: por %xmm0, %xmm4
1498 ; SSE41-NEXT: pxor %xmm5, %xmm2
1499 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1500 ; SSE41-NEXT: pcmpgtd %xmm5, %xmm0
1501 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm0[0,0,2,2]
1502 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm2
1503 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1504 ; SSE41-NEXT: pand %xmm7, %xmm2
1505 ; SSE41-NEXT: por %xmm0, %xmm2
1506 ; SSE41-NEXT: pxor %xmm4, %xmm2
1507 ; SSE41-NEXT: movdqa %xmm5, %xmm4
1508 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm4
1509 ; SSE41-NEXT: movdqa %xmm5, %xmm7
1510 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm7
1511 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1512 ; SSE41-NEXT: pand %xmm4, %xmm0
1513 ; SSE41-NEXT: por %xmm7, %xmm0
1514 ; SSE41-NEXT: movapd {{.*#+}} xmm9 = [9223372036854775807,9223372036854775807]
1515 ; SSE41-NEXT: movapd {{.*#+}} xmm6 = [9223372036854775808,9223372036854775808]
1516 ; SSE41-NEXT: movapd %xmm6, %xmm4
1517 ; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm4
1518 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1519 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm8
1520 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1521 ; SSE41-NEXT: pxor %xmm5, %xmm0
1522 ; SSE41-NEXT: psubq %xmm3, %xmm1
1523 ; SSE41-NEXT: movdqa %xmm1, %xmm4
1524 ; SSE41-NEXT: pxor %xmm5, %xmm4
1525 ; SSE41-NEXT: movdqa %xmm0, %xmm2
1526 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm2
1527 ; SSE41-NEXT: pcmpgtd %xmm4, %xmm0
1528 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm0[0,0,2,2]
1529 ; SSE41-NEXT: pand %xmm2, %xmm7
1530 ; SSE41-NEXT: por %xmm0, %xmm7
1531 ; SSE41-NEXT: pxor %xmm5, %xmm3
1532 ; SSE41-NEXT: movdqa %xmm3, %xmm0
1533 ; SSE41-NEXT: pcmpgtd %xmm5, %xmm0
1534 ; SSE41-NEXT: pshufd {{.*#+}} xmm10 = xmm0[0,0,2,2]
1535 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm3
1536 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1537 ; SSE41-NEXT: pand %xmm10, %xmm2
1538 ; SSE41-NEXT: por %xmm0, %xmm2
1539 ; SSE41-NEXT: pxor %xmm7, %xmm2
1540 ; SSE41-NEXT: movdqa %xmm5, %xmm3
1541 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm3
1542 ; SSE41-NEXT: pcmpgtd %xmm4, %xmm5
1543 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1544 ; SSE41-NEXT: pand %xmm3, %xmm0
1545 ; SSE41-NEXT: por %xmm5, %xmm0
1546 ; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm6
1547 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1548 ; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm1
1549 ; SSE41-NEXT: movapd %xmm8, %xmm0
1552 ; AVX1-LABEL: v4i64:
1554 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1555 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
1556 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm4
1557 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm1, %xmm3
1558 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3
1559 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
1560 ; AVX1-NEXT: vpsubq %xmm2, %xmm4, %xmm2
1561 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm4
1562 ; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm1
1563 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0
1564 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0
1565 ; AVX1-NEXT: vxorpd %ymm0, %ymm3, %ymm0
1566 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
1567 ; AVX1-NEXT: vmovapd {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1568 ; AVX1-NEXT: vblendvpd %ymm1, {{.*}}(%rip), %ymm2, %ymm2
1569 ; AVX1-NEXT: vblendvpd %ymm0, %ymm2, %ymm1, %ymm0
1572 ; AVX2-LABEL: v4i64:
1574 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
1575 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm2
1576 ; AVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm1
1577 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm0
1578 ; AVX2-NEXT: vpxor %ymm0, %ymm2, %ymm0
1579 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
1580 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1581 ; AVX2-NEXT: vblendvpd %ymm1, %ymm2, %ymm3, %ymm2
1582 ; AVX2-NEXT: vblendvpd %ymm0, %ymm2, %ymm1, %ymm0
1585 ; AVX512-LABEL: v4i64:
1587 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
1588 ; AVX512-NEXT: vpcmpgtq %ymm2, %ymm1, %k0
1589 ; AVX512-NEXT: vpsubq %ymm1, %ymm0, %ymm1
1590 ; AVX512-NEXT: vpcmpgtq %ymm1, %ymm0, %k1
1591 ; AVX512-NEXT: kxorw %k1, %k0, %k1
1592 ; AVX512-NEXT: vpcmpgtq %ymm1, %ymm2, %k2
1593 ; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm0 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1594 ; AVX512-NEXT: vpbroadcastq {{.*}}(%rip), %ymm0 {%k2}
1595 ; AVX512-NEXT: vmovdqa64 %ymm0, %ymm1 {%k1}
1596 ; AVX512-NEXT: vmovdqa %ymm1, %ymm0
1598 %z = call <4 x i64> @llvm.ssub.sat.v4i64(<4 x i64> %x, <4 x i64> %y)
1602 define <8 x i64> @v8i64(<8 x i64> %x, <8 x i64> %y) nounwind {
1603 ; SSE2-LABEL: v8i64:
1605 ; SSE2-NEXT: movdqa %xmm1, %xmm8
1606 ; SSE2-NEXT: movdqa %xmm0, %xmm12
1607 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [2147483648,2147483648]
1608 ; SSE2-NEXT: pxor %xmm9, %xmm0
1609 ; SSE2-NEXT: psubq %xmm4, %xmm12
1610 ; SSE2-NEXT: movdqa %xmm12, %xmm1
1611 ; SSE2-NEXT: pxor %xmm9, %xmm1
1612 ; SSE2-NEXT: movdqa %xmm0, %xmm10
1613 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm10
1614 ; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
1615 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
1616 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1617 ; SSE2-NEXT: pand %xmm11, %xmm0
1618 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
1619 ; SSE2-NEXT: por %xmm0, %xmm10
1620 ; SSE2-NEXT: pxor %xmm9, %xmm4
1621 ; SSE2-NEXT: movdqa %xmm4, %xmm0
1622 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm0
1623 ; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm0[0,0,2,2]
1624 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm4
1625 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1626 ; SSE2-NEXT: pand %xmm11, %xmm4
1627 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1628 ; SSE2-NEXT: por %xmm4, %xmm0
1629 ; SSE2-NEXT: pxor %xmm10, %xmm0
1630 ; SSE2-NEXT: movdqa %xmm9, %xmm4
1631 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm4
1632 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
1633 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm1
1634 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1635 ; SSE2-NEXT: pand %xmm10, %xmm1
1636 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1637 ; SSE2-NEXT: por %xmm1, %xmm4
1638 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [9223372036854775808,9223372036854775808]
1639 ; SSE2-NEXT: movdqa %xmm4, %xmm1
1640 ; SSE2-NEXT: pandn %xmm10, %xmm1
1641 ; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [9223372036854775807,9223372036854775807]
1642 ; SSE2-NEXT: pand %xmm11, %xmm4
1643 ; SSE2-NEXT: por %xmm1, %xmm4
1644 ; SSE2-NEXT: pand %xmm0, %xmm4
1645 ; SSE2-NEXT: pandn %xmm12, %xmm0
1646 ; SSE2-NEXT: por %xmm4, %xmm0
1647 ; SSE2-NEXT: movdqa %xmm8, %xmm1
1648 ; SSE2-NEXT: pxor %xmm9, %xmm1
1649 ; SSE2-NEXT: psubq %xmm5, %xmm8
1650 ; SSE2-NEXT: movdqa %xmm8, %xmm4
1651 ; SSE2-NEXT: pxor %xmm9, %xmm4
1652 ; SSE2-NEXT: movdqa %xmm1, %xmm12
1653 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm12
1654 ; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
1655 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm1
1656 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1657 ; SSE2-NEXT: pand %xmm13, %xmm1
1658 ; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3]
1659 ; SSE2-NEXT: por %xmm1, %xmm12
1660 ; SSE2-NEXT: pxor %xmm9, %xmm5
1661 ; SSE2-NEXT: movdqa %xmm5, %xmm1
1662 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm1
1663 ; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm1[0,0,2,2]
1664 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm5
1665 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1666 ; SSE2-NEXT: pand %xmm13, %xmm5
1667 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1668 ; SSE2-NEXT: por %xmm5, %xmm1
1669 ; SSE2-NEXT: pxor %xmm12, %xmm1
1670 ; SSE2-NEXT: movdqa %xmm9, %xmm5
1671 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm5
1672 ; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm5[0,0,2,2]
1673 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm4
1674 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1675 ; SSE2-NEXT: pand %xmm12, %xmm4
1676 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1677 ; SSE2-NEXT: por %xmm4, %xmm5
1678 ; SSE2-NEXT: movdqa %xmm5, %xmm4
1679 ; SSE2-NEXT: pandn %xmm10, %xmm4
1680 ; SSE2-NEXT: pand %xmm11, %xmm5
1681 ; SSE2-NEXT: por %xmm4, %xmm5
1682 ; SSE2-NEXT: pand %xmm1, %xmm5
1683 ; SSE2-NEXT: pandn %xmm8, %xmm1
1684 ; SSE2-NEXT: por %xmm5, %xmm1
1685 ; SSE2-NEXT: movdqa %xmm2, %xmm4
1686 ; SSE2-NEXT: pxor %xmm9, %xmm4
1687 ; SSE2-NEXT: psubq %xmm6, %xmm2
1688 ; SSE2-NEXT: movdqa %xmm2, %xmm5
1689 ; SSE2-NEXT: pxor %xmm9, %xmm5
1690 ; SSE2-NEXT: movdqa %xmm4, %xmm8
1691 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm8
1692 ; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm8[0,0,2,2]
1693 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm4
1694 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1695 ; SSE2-NEXT: pand %xmm12, %xmm4
1696 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
1697 ; SSE2-NEXT: por %xmm4, %xmm8
1698 ; SSE2-NEXT: pxor %xmm9, %xmm6
1699 ; SSE2-NEXT: movdqa %xmm6, %xmm4
1700 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm4
1701 ; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm4[0,0,2,2]
1702 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm6
1703 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1704 ; SSE2-NEXT: pand %xmm12, %xmm6
1705 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1706 ; SSE2-NEXT: por %xmm6, %xmm4
1707 ; SSE2-NEXT: pxor %xmm8, %xmm4
1708 ; SSE2-NEXT: movdqa %xmm9, %xmm6
1709 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm6
1710 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
1711 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm5
1712 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1713 ; SSE2-NEXT: pand %xmm8, %xmm5
1714 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1715 ; SSE2-NEXT: por %xmm5, %xmm6
1716 ; SSE2-NEXT: movdqa %xmm6, %xmm5
1717 ; SSE2-NEXT: pandn %xmm10, %xmm5
1718 ; SSE2-NEXT: pand %xmm11, %xmm6
1719 ; SSE2-NEXT: por %xmm5, %xmm6
1720 ; SSE2-NEXT: pand %xmm4, %xmm6
1721 ; SSE2-NEXT: pandn %xmm2, %xmm4
1722 ; SSE2-NEXT: por %xmm6, %xmm4
1723 ; SSE2-NEXT: movdqa %xmm3, %xmm5
1724 ; SSE2-NEXT: pxor %xmm9, %xmm5
1725 ; SSE2-NEXT: psubq %xmm7, %xmm3
1726 ; SSE2-NEXT: movdqa %xmm3, %xmm2
1727 ; SSE2-NEXT: pxor %xmm9, %xmm2
1728 ; SSE2-NEXT: movdqa %xmm5, %xmm6
1729 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm6
1730 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
1731 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm5
1732 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1733 ; SSE2-NEXT: pand %xmm8, %xmm5
1734 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1735 ; SSE2-NEXT: por %xmm5, %xmm6
1736 ; SSE2-NEXT: pxor %xmm9, %xmm7
1737 ; SSE2-NEXT: movdqa %xmm7, %xmm5
1738 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm5
1739 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm5[0,0,2,2]
1740 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm7
1741 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1742 ; SSE2-NEXT: pand %xmm8, %xmm7
1743 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1744 ; SSE2-NEXT: por %xmm7, %xmm5
1745 ; SSE2-NEXT: pxor %xmm6, %xmm5
1746 ; SSE2-NEXT: movdqa %xmm9, %xmm6
1747 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm6
1748 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1749 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm2
1750 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1751 ; SSE2-NEXT: pand %xmm7, %xmm2
1752 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1753 ; SSE2-NEXT: por %xmm2, %xmm6
1754 ; SSE2-NEXT: movdqa %xmm6, %xmm2
1755 ; SSE2-NEXT: pandn %xmm10, %xmm2
1756 ; SSE2-NEXT: pand %xmm11, %xmm6
1757 ; SSE2-NEXT: por %xmm2, %xmm6
1758 ; SSE2-NEXT: pand %xmm5, %xmm6
1759 ; SSE2-NEXT: pandn %xmm3, %xmm5
1760 ; SSE2-NEXT: por %xmm6, %xmm5
1761 ; SSE2-NEXT: movdqa %xmm4, %xmm2
1762 ; SSE2-NEXT: movdqa %xmm5, %xmm3
1765 ; SSSE3-LABEL: v8i64:
1767 ; SSSE3-NEXT: movdqa %xmm1, %xmm8
1768 ; SSSE3-NEXT: movdqa %xmm0, %xmm12
1769 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [2147483648,2147483648]
1770 ; SSSE3-NEXT: pxor %xmm9, %xmm0
1771 ; SSSE3-NEXT: psubq %xmm4, %xmm12
1772 ; SSSE3-NEXT: movdqa %xmm12, %xmm1
1773 ; SSSE3-NEXT: pxor %xmm9, %xmm1
1774 ; SSSE3-NEXT: movdqa %xmm0, %xmm10
1775 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm10
1776 ; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
1777 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm0
1778 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1779 ; SSSE3-NEXT: pand %xmm11, %xmm0
1780 ; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
1781 ; SSSE3-NEXT: por %xmm0, %xmm10
1782 ; SSSE3-NEXT: pxor %xmm9, %xmm4
1783 ; SSSE3-NEXT: movdqa %xmm4, %xmm0
1784 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm0
1785 ; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm0[0,0,2,2]
1786 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm4
1787 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1788 ; SSSE3-NEXT: pand %xmm11, %xmm4
1789 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1790 ; SSSE3-NEXT: por %xmm4, %xmm0
1791 ; SSSE3-NEXT: pxor %xmm10, %xmm0
1792 ; SSSE3-NEXT: movdqa %xmm9, %xmm4
1793 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4
1794 ; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
1795 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm1
1796 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1797 ; SSSE3-NEXT: pand %xmm10, %xmm1
1798 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1799 ; SSSE3-NEXT: por %xmm1, %xmm4
1800 ; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [9223372036854775808,9223372036854775808]
1801 ; SSSE3-NEXT: movdqa %xmm4, %xmm1
1802 ; SSSE3-NEXT: pandn %xmm10, %xmm1
1803 ; SSSE3-NEXT: movdqa {{.*#+}} xmm11 = [9223372036854775807,9223372036854775807]
1804 ; SSSE3-NEXT: pand %xmm11, %xmm4
1805 ; SSSE3-NEXT: por %xmm1, %xmm4
1806 ; SSSE3-NEXT: pand %xmm0, %xmm4
1807 ; SSSE3-NEXT: pandn %xmm12, %xmm0
1808 ; SSSE3-NEXT: por %xmm4, %xmm0
1809 ; SSSE3-NEXT: movdqa %xmm8, %xmm1
1810 ; SSSE3-NEXT: pxor %xmm9, %xmm1
1811 ; SSSE3-NEXT: psubq %xmm5, %xmm8
1812 ; SSSE3-NEXT: movdqa %xmm8, %xmm4
1813 ; SSSE3-NEXT: pxor %xmm9, %xmm4
1814 ; SSSE3-NEXT: movdqa %xmm1, %xmm12
1815 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm12
1816 ; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
1817 ; SSSE3-NEXT: pcmpeqd %xmm4, %xmm1
1818 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1819 ; SSSE3-NEXT: pand %xmm13, %xmm1
1820 ; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3]
1821 ; SSSE3-NEXT: por %xmm1, %xmm12
1822 ; SSSE3-NEXT: pxor %xmm9, %xmm5
1823 ; SSSE3-NEXT: movdqa %xmm5, %xmm1
1824 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm1
1825 ; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm1[0,0,2,2]
1826 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm5
1827 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1828 ; SSSE3-NEXT: pand %xmm13, %xmm5
1829 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1830 ; SSSE3-NEXT: por %xmm5, %xmm1
1831 ; SSSE3-NEXT: pxor %xmm12, %xmm1
1832 ; SSSE3-NEXT: movdqa %xmm9, %xmm5
1833 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm5
1834 ; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm5[0,0,2,2]
1835 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm4
1836 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1837 ; SSSE3-NEXT: pand %xmm12, %xmm4
1838 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1839 ; SSSE3-NEXT: por %xmm4, %xmm5
1840 ; SSSE3-NEXT: movdqa %xmm5, %xmm4
1841 ; SSSE3-NEXT: pandn %xmm10, %xmm4
1842 ; SSSE3-NEXT: pand %xmm11, %xmm5
1843 ; SSSE3-NEXT: por %xmm4, %xmm5
1844 ; SSSE3-NEXT: pand %xmm1, %xmm5
1845 ; SSSE3-NEXT: pandn %xmm8, %xmm1
1846 ; SSSE3-NEXT: por %xmm5, %xmm1
1847 ; SSSE3-NEXT: movdqa %xmm2, %xmm4
1848 ; SSSE3-NEXT: pxor %xmm9, %xmm4
1849 ; SSSE3-NEXT: psubq %xmm6, %xmm2
1850 ; SSSE3-NEXT: movdqa %xmm2, %xmm5
1851 ; SSSE3-NEXT: pxor %xmm9, %xmm5
1852 ; SSSE3-NEXT: movdqa %xmm4, %xmm8
1853 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm8
1854 ; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm8[0,0,2,2]
1855 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm4
1856 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1857 ; SSSE3-NEXT: pand %xmm12, %xmm4
1858 ; SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
1859 ; SSSE3-NEXT: por %xmm4, %xmm8
1860 ; SSSE3-NEXT: pxor %xmm9, %xmm6
1861 ; SSSE3-NEXT: movdqa %xmm6, %xmm4
1862 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm4
1863 ; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm4[0,0,2,2]
1864 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm6
1865 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1866 ; SSSE3-NEXT: pand %xmm12, %xmm6
1867 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1868 ; SSSE3-NEXT: por %xmm6, %xmm4
1869 ; SSSE3-NEXT: pxor %xmm8, %xmm4
1870 ; SSSE3-NEXT: movdqa %xmm9, %xmm6
1871 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm6
1872 ; SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
1873 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm5
1874 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1875 ; SSSE3-NEXT: pand %xmm8, %xmm5
1876 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1877 ; SSSE3-NEXT: por %xmm5, %xmm6
1878 ; SSSE3-NEXT: movdqa %xmm6, %xmm5
1879 ; SSSE3-NEXT: pandn %xmm10, %xmm5
1880 ; SSSE3-NEXT: pand %xmm11, %xmm6
1881 ; SSSE3-NEXT: por %xmm5, %xmm6
1882 ; SSSE3-NEXT: pand %xmm4, %xmm6
1883 ; SSSE3-NEXT: pandn %xmm2, %xmm4
1884 ; SSSE3-NEXT: por %xmm6, %xmm4
1885 ; SSSE3-NEXT: movdqa %xmm3, %xmm5
1886 ; SSSE3-NEXT: pxor %xmm9, %xmm5
1887 ; SSSE3-NEXT: psubq %xmm7, %xmm3
1888 ; SSSE3-NEXT: movdqa %xmm3, %xmm2
1889 ; SSSE3-NEXT: pxor %xmm9, %xmm2
1890 ; SSSE3-NEXT: movdqa %xmm5, %xmm6
1891 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm6
1892 ; SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
1893 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm5
1894 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1895 ; SSSE3-NEXT: pand %xmm8, %xmm5
1896 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1897 ; SSSE3-NEXT: por %xmm5, %xmm6
1898 ; SSSE3-NEXT: pxor %xmm9, %xmm7
1899 ; SSSE3-NEXT: movdqa %xmm7, %xmm5
1900 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm5
1901 ; SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm5[0,0,2,2]
1902 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm7
1903 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1904 ; SSSE3-NEXT: pand %xmm8, %xmm7
1905 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1906 ; SSSE3-NEXT: por %xmm7, %xmm5
1907 ; SSSE3-NEXT: pxor %xmm6, %xmm5
1908 ; SSSE3-NEXT: movdqa %xmm9, %xmm6
1909 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm6
1910 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1911 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm2
1912 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1913 ; SSSE3-NEXT: pand %xmm7, %xmm2
1914 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1915 ; SSSE3-NEXT: por %xmm2, %xmm6
1916 ; SSSE3-NEXT: movdqa %xmm6, %xmm2
1917 ; SSSE3-NEXT: pandn %xmm10, %xmm2
1918 ; SSSE3-NEXT: pand %xmm11, %xmm6
1919 ; SSSE3-NEXT: por %xmm2, %xmm6
1920 ; SSSE3-NEXT: pand %xmm5, %xmm6
1921 ; SSSE3-NEXT: pandn %xmm3, %xmm5
1922 ; SSSE3-NEXT: por %xmm6, %xmm5
1923 ; SSSE3-NEXT: movdqa %xmm4, %xmm2
1924 ; SSSE3-NEXT: movdqa %xmm5, %xmm3
1927 ; SSE41-LABEL: v8i64:
1929 ; SSE41-NEXT: movdqa %xmm0, %xmm8
1930 ; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [2147483648,2147483648]
1931 ; SSE41-NEXT: pxor %xmm9, %xmm0
1932 ; SSE41-NEXT: psubq %xmm4, %xmm8
1933 ; SSE41-NEXT: movdqa %xmm8, %xmm10
1934 ; SSE41-NEXT: pxor %xmm9, %xmm10
1935 ; SSE41-NEXT: movdqa %xmm0, %xmm11
1936 ; SSE41-NEXT: pcmpeqd %xmm10, %xmm11
1937 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm0
1938 ; SSE41-NEXT: pshufd {{.*#+}} xmm12 = xmm0[0,0,2,2]
1939 ; SSE41-NEXT: pand %xmm11, %xmm12
1940 ; SSE41-NEXT: por %xmm0, %xmm12
1941 ; SSE41-NEXT: pxor %xmm9, %xmm4
1942 ; SSE41-NEXT: movdqa %xmm4, %xmm0
1943 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm0
1944 ; SSE41-NEXT: pshufd {{.*#+}} xmm11 = xmm0[0,0,2,2]
1945 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm4
1946 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1947 ; SSE41-NEXT: pand %xmm11, %xmm4
1948 ; SSE41-NEXT: por %xmm0, %xmm4
1949 ; SSE41-NEXT: pxor %xmm12, %xmm4
1950 ; SSE41-NEXT: movdqa %xmm9, %xmm11
1951 ; SSE41-NEXT: pcmpeqd %xmm10, %xmm11
1952 ; SSE41-NEXT: movdqa %xmm9, %xmm12
1953 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm12
1954 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm12[0,0,2,2]
1955 ; SSE41-NEXT: pand %xmm11, %xmm0
1956 ; SSE41-NEXT: por %xmm12, %xmm0
1957 ; SSE41-NEXT: movapd {{.*#+}} xmm11 = [9223372036854775807,9223372036854775807]
1958 ; SSE41-NEXT: movapd {{.*#+}} xmm10 = [9223372036854775808,9223372036854775808]
1959 ; SSE41-NEXT: movapd %xmm10, %xmm12
1960 ; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm12
1961 ; SSE41-NEXT: movdqa %xmm4, %xmm0
1962 ; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm8
1963 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1964 ; SSE41-NEXT: pxor %xmm9, %xmm0
1965 ; SSE41-NEXT: psubq %xmm5, %xmm1
1966 ; SSE41-NEXT: movdqa %xmm1, %xmm12
1967 ; SSE41-NEXT: pxor %xmm9, %xmm12
1968 ; SSE41-NEXT: movdqa %xmm0, %xmm4
1969 ; SSE41-NEXT: pcmpeqd %xmm12, %xmm4
1970 ; SSE41-NEXT: pcmpgtd %xmm12, %xmm0
1971 ; SSE41-NEXT: pshufd {{.*#+}} xmm13 = xmm0[0,0,2,2]
1972 ; SSE41-NEXT: pand %xmm4, %xmm13
1973 ; SSE41-NEXT: por %xmm0, %xmm13
1974 ; SSE41-NEXT: pxor %xmm9, %xmm5
1975 ; SSE41-NEXT: movdqa %xmm5, %xmm0
1976 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm0
1977 ; SSE41-NEXT: pshufd {{.*#+}} xmm14 = xmm0[0,0,2,2]
1978 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm5
1979 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1980 ; SSE41-NEXT: pand %xmm14, %xmm4
1981 ; SSE41-NEXT: por %xmm0, %xmm4
1982 ; SSE41-NEXT: pxor %xmm13, %xmm4
1983 ; SSE41-NEXT: movdqa %xmm9, %xmm13
1984 ; SSE41-NEXT: pcmpeqd %xmm12, %xmm13
1985 ; SSE41-NEXT: movdqa %xmm9, %xmm5
1986 ; SSE41-NEXT: pcmpgtd %xmm12, %xmm5
1987 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1988 ; SSE41-NEXT: pand %xmm13, %xmm0
1989 ; SSE41-NEXT: por %xmm5, %xmm0
1990 ; SSE41-NEXT: movapd %xmm10, %xmm5
1991 ; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm5
1992 ; SSE41-NEXT: movdqa %xmm4, %xmm0
1993 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1
1994 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1995 ; SSE41-NEXT: pxor %xmm9, %xmm0
1996 ; SSE41-NEXT: psubq %xmm6, %xmm2
1997 ; SSE41-NEXT: movdqa %xmm2, %xmm12
1998 ; SSE41-NEXT: pxor %xmm9, %xmm12
1999 ; SSE41-NEXT: movdqa %xmm0, %xmm4
2000 ; SSE41-NEXT: pcmpeqd %xmm12, %xmm4
2001 ; SSE41-NEXT: pcmpgtd %xmm12, %xmm0
2002 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2]
2003 ; SSE41-NEXT: pand %xmm4, %xmm5
2004 ; SSE41-NEXT: por %xmm0, %xmm5
2005 ; SSE41-NEXT: pxor %xmm9, %xmm6
2006 ; SSE41-NEXT: movdqa %xmm6, %xmm0
2007 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm0
2008 ; SSE41-NEXT: pshufd {{.*#+}} xmm13 = xmm0[0,0,2,2]
2009 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm6
2010 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
2011 ; SSE41-NEXT: pand %xmm13, %xmm4
2012 ; SSE41-NEXT: por %xmm0, %xmm4
2013 ; SSE41-NEXT: pxor %xmm5, %xmm4
2014 ; SSE41-NEXT: movdqa %xmm9, %xmm5
2015 ; SSE41-NEXT: pcmpeqd %xmm12, %xmm5
2016 ; SSE41-NEXT: movdqa %xmm9, %xmm6
2017 ; SSE41-NEXT: pcmpgtd %xmm12, %xmm6
2018 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2019 ; SSE41-NEXT: pand %xmm5, %xmm0
2020 ; SSE41-NEXT: por %xmm6, %xmm0
2021 ; SSE41-NEXT: movapd %xmm10, %xmm5
2022 ; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm5
2023 ; SSE41-NEXT: movdqa %xmm4, %xmm0
2024 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm2
2025 ; SSE41-NEXT: movdqa %xmm3, %xmm0
2026 ; SSE41-NEXT: pxor %xmm9, %xmm0
2027 ; SSE41-NEXT: psubq %xmm7, %xmm3
2028 ; SSE41-NEXT: movdqa %xmm3, %xmm5
2029 ; SSE41-NEXT: pxor %xmm9, %xmm5
2030 ; SSE41-NEXT: movdqa %xmm0, %xmm4
2031 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm4
2032 ; SSE41-NEXT: pcmpgtd %xmm5, %xmm0
2033 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[0,0,2,2]
2034 ; SSE41-NEXT: pand %xmm4, %xmm6
2035 ; SSE41-NEXT: por %xmm0, %xmm6
2036 ; SSE41-NEXT: pxor %xmm9, %xmm7
2037 ; SSE41-NEXT: movdqa %xmm7, %xmm0
2038 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm0
2039 ; SSE41-NEXT: pshufd {{.*#+}} xmm12 = xmm0[0,0,2,2]
2040 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm7
2041 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3]
2042 ; SSE41-NEXT: pand %xmm12, %xmm4
2043 ; SSE41-NEXT: por %xmm0, %xmm4
2044 ; SSE41-NEXT: pxor %xmm6, %xmm4
2045 ; SSE41-NEXT: movdqa %xmm9, %xmm6
2046 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
2047 ; SSE41-NEXT: pcmpgtd %xmm5, %xmm9
2048 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
2049 ; SSE41-NEXT: pand %xmm6, %xmm0
2050 ; SSE41-NEXT: por %xmm9, %xmm0
2051 ; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm10
2052 ; SSE41-NEXT: movdqa %xmm4, %xmm0
2053 ; SSE41-NEXT: blendvpd %xmm0, %xmm10, %xmm3
2054 ; SSE41-NEXT: movapd %xmm8, %xmm0
2057 ; AVX1-LABEL: v8i64:
2059 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
2060 ; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5
2061 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm4, %xmm6
2062 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm2, %xmm7
2063 ; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm7, %ymm6
2064 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7
2065 ; AVX1-NEXT: vpsubq %xmm4, %xmm7, %xmm4
2066 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm7, %xmm7
2067 ; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm2
2068 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm0
2069 ; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm0, %ymm0
2070 ; AVX1-NEXT: vxorpd %ymm0, %ymm6, %ymm0
2071 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm2, %ymm2
2072 ; AVX1-NEXT: vmovapd {{.*#+}} ymm4 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
2073 ; AVX1-NEXT: vmovapd {{.*#+}} ymm6 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2074 ; AVX1-NEXT: vblendvpd %ymm2, %ymm4, %ymm6, %ymm7
2075 ; AVX1-NEXT: vblendvpd %ymm0, %ymm7, %ymm2, %ymm0
2076 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2
2077 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm2, %xmm7
2078 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm3, %xmm5
2079 ; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm5, %ymm5
2080 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7
2081 ; AVX1-NEXT: vpsubq %xmm2, %xmm7, %xmm2
2082 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm7, %xmm7
2083 ; AVX1-NEXT: vpsubq %xmm3, %xmm1, %xmm3
2084 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm1, %xmm1
2085 ; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm1, %ymm1
2086 ; AVX1-NEXT: vxorpd %ymm1, %ymm5, %ymm1
2087 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
2088 ; AVX1-NEXT: vblendvpd %ymm2, %ymm4, %ymm6, %ymm3
2089 ; AVX1-NEXT: vblendvpd %ymm1, %ymm3, %ymm2, %ymm1
2092 ; AVX2-LABEL: v8i64:
2094 ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4
2095 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm2, %ymm5
2096 ; AVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm2
2097 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm0
2098 ; AVX2-NEXT: vpxor %ymm0, %ymm5, %ymm0
2099 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm5 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
2100 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm6 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2101 ; AVX2-NEXT: vblendvpd %ymm2, %ymm5, %ymm6, %ymm7
2102 ; AVX2-NEXT: vblendvpd %ymm0, %ymm7, %ymm2, %ymm0
2103 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm3, %ymm2
2104 ; AVX2-NEXT: vpsubq %ymm3, %ymm1, %ymm3
2105 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm1, %ymm1
2106 ; AVX2-NEXT: vpxor %ymm1, %ymm2, %ymm1
2107 ; AVX2-NEXT: vblendvpd %ymm3, %ymm5, %ymm6, %ymm2
2108 ; AVX2-NEXT: vblendvpd %ymm1, %ymm2, %ymm3, %ymm1
2111 ; AVX512-LABEL: v8i64:
2113 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
2114 ; AVX512-NEXT: vpcmpgtq %zmm2, %zmm1, %k0
2115 ; AVX512-NEXT: vpsubq %zmm1, %zmm0, %zmm1
2116 ; AVX512-NEXT: vpcmpgtq %zmm1, %zmm0, %k1
2117 ; AVX512-NEXT: kxorw %k1, %k0, %k1
2118 ; AVX512-NEXT: vpcmpgtq %zmm1, %zmm2, %k2
2119 ; AVX512-NEXT: vpbroadcastq {{.*#+}} zmm0 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2120 ; AVX512-NEXT: vpbroadcastq {{.*}}(%rip), %zmm0 {%k2}
2121 ; AVX512-NEXT: vmovdqa64 %zmm0, %zmm1 {%k1}
2122 ; AVX512-NEXT: vmovdqa64 %zmm1, %zmm0
2124 %z = call <8 x i64> @llvm.ssub.sat.v8i64(<8 x i64> %x, <8 x i64> %y)
2128 define <2 x i128> @v2i128(<2 x i128> %x, <2 x i128> %y) nounwind {
2129 ; SSE-LABEL: v2i128:
2131 ; SSE-NEXT: pushq %r15
2132 ; SSE-NEXT: pushq %r14
2133 ; SSE-NEXT: pushq %r13
2134 ; SSE-NEXT: pushq %r12
2135 ; SSE-NEXT: pushq %rbx
2136 ; SSE-NEXT: movq %rdi, %rax
2137 ; SSE-NEXT: movq {{[0-9]+}}(%rsp), %r11
2138 ; SSE-NEXT: movq {{[0-9]+}}(%rsp), %r14
2139 ; SSE-NEXT: subq {{[0-9]+}}(%rsp), %rcx
2140 ; SSE-NEXT: movq %r8, %r13
2141 ; SSE-NEXT: sbbq %r14, %r13
2142 ; SSE-NEXT: movq %r13, %r10
2143 ; SSE-NEXT: sarq $63, %r10
2144 ; SSE-NEXT: xorl %edi, %edi
2145 ; SSE-NEXT: testq %r13, %r13
2146 ; SSE-NEXT: setns %dil
2147 ; SSE-NEXT: movabsq $9223372036854775807, %r12 # imm = 0x7FFFFFFFFFFFFFFF
2148 ; SSE-NEXT: leaq (%rdi,%r12), %r15
2149 ; SSE-NEXT: testq %r8, %r8
2150 ; SSE-NEXT: setns %r8b
2151 ; SSE-NEXT: cmpb %dil, %r8b
2152 ; SSE-NEXT: setne %dil
2153 ; SSE-NEXT: testq %r14, %r14
2154 ; SSE-NEXT: setns %bl
2155 ; SSE-NEXT: cmpb %bl, %r8b
2156 ; SSE-NEXT: setne %bl
2157 ; SSE-NEXT: testb %dil, %bl
2158 ; SSE-NEXT: cmoveq %r13, %r15
2159 ; SSE-NEXT: cmoveq %rcx, %r10
2160 ; SSE-NEXT: subq %r9, %rsi
2161 ; SSE-NEXT: movq %rdx, %rdi
2162 ; SSE-NEXT: sbbq %r11, %rdi
2163 ; SSE-NEXT: setns %bl
2164 ; SSE-NEXT: movzbl %bl, %ebx
2165 ; SSE-NEXT: addq %rbx, %r12
2166 ; SSE-NEXT: movq %rdi, %rcx
2167 ; SSE-NEXT: sarq $63, %rcx
2168 ; SSE-NEXT: testq %r11, %r11
2169 ; SSE-NEXT: setns %r8b
2170 ; SSE-NEXT: testq %rdx, %rdx
2171 ; SSE-NEXT: setns %dl
2172 ; SSE-NEXT: cmpb %r8b, %dl
2173 ; SSE-NEXT: setne %r8b
2174 ; SSE-NEXT: cmpb %bl, %dl
2175 ; SSE-NEXT: setne %dl
2176 ; SSE-NEXT: testb %dl, %r8b
2177 ; SSE-NEXT: cmoveq %rsi, %rcx
2178 ; SSE-NEXT: cmoveq %rdi, %r12
2179 ; SSE-NEXT: movq %r15, 24(%rax)
2180 ; SSE-NEXT: movq %r10, 16(%rax)
2181 ; SSE-NEXT: movq %r12, 8(%rax)
2182 ; SSE-NEXT: movq %rcx, (%rax)
2183 ; SSE-NEXT: popq %rbx
2184 ; SSE-NEXT: popq %r12
2185 ; SSE-NEXT: popq %r13
2186 ; SSE-NEXT: popq %r14
2187 ; SSE-NEXT: popq %r15
2190 ; AVX-LABEL: v2i128:
2192 ; AVX-NEXT: pushq %r15
2193 ; AVX-NEXT: pushq %r14
2194 ; AVX-NEXT: pushq %r13
2195 ; AVX-NEXT: pushq %r12
2196 ; AVX-NEXT: pushq %rbx
2197 ; AVX-NEXT: movq %rdi, %rax
2198 ; AVX-NEXT: movq {{[0-9]+}}(%rsp), %r11
2199 ; AVX-NEXT: movq {{[0-9]+}}(%rsp), %r14
2200 ; AVX-NEXT: subq {{[0-9]+}}(%rsp), %rcx
2201 ; AVX-NEXT: movq %r8, %r13
2202 ; AVX-NEXT: sbbq %r14, %r13
2203 ; AVX-NEXT: movq %r13, %r10
2204 ; AVX-NEXT: sarq $63, %r10
2205 ; AVX-NEXT: xorl %edi, %edi
2206 ; AVX-NEXT: testq %r13, %r13
2207 ; AVX-NEXT: setns %dil
2208 ; AVX-NEXT: movabsq $9223372036854775807, %r12 # imm = 0x7FFFFFFFFFFFFFFF
2209 ; AVX-NEXT: leaq (%rdi,%r12), %r15
2210 ; AVX-NEXT: testq %r8, %r8
2211 ; AVX-NEXT: setns %r8b
2212 ; AVX-NEXT: cmpb %dil, %r8b
2213 ; AVX-NEXT: setne %dil
2214 ; AVX-NEXT: testq %r14, %r14
2215 ; AVX-NEXT: setns %bl
2216 ; AVX-NEXT: cmpb %bl, %r8b
2217 ; AVX-NEXT: setne %bl
2218 ; AVX-NEXT: testb %dil, %bl
2219 ; AVX-NEXT: cmoveq %r13, %r15
2220 ; AVX-NEXT: cmoveq %rcx, %r10
2221 ; AVX-NEXT: subq %r9, %rsi
2222 ; AVX-NEXT: movq %rdx, %rdi
2223 ; AVX-NEXT: sbbq %r11, %rdi
2224 ; AVX-NEXT: setns %bl
2225 ; AVX-NEXT: movzbl %bl, %ebx
2226 ; AVX-NEXT: addq %rbx, %r12
2227 ; AVX-NEXT: movq %rdi, %rcx
2228 ; AVX-NEXT: sarq $63, %rcx
2229 ; AVX-NEXT: testq %r11, %r11
2230 ; AVX-NEXT: setns %r8b
2231 ; AVX-NEXT: testq %rdx, %rdx
2232 ; AVX-NEXT: setns %dl
2233 ; AVX-NEXT: cmpb %r8b, %dl
2234 ; AVX-NEXT: setne %r8b
2235 ; AVX-NEXT: cmpb %bl, %dl
2236 ; AVX-NEXT: setne %dl
2237 ; AVX-NEXT: testb %dl, %r8b
2238 ; AVX-NEXT: cmoveq %rsi, %rcx
2239 ; AVX-NEXT: cmoveq %rdi, %r12
2240 ; AVX-NEXT: movq %r15, 24(%rax)
2241 ; AVX-NEXT: movq %r10, 16(%rax)
2242 ; AVX-NEXT: movq %r12, 8(%rax)
2243 ; AVX-NEXT: movq %rcx, (%rax)
2244 ; AVX-NEXT: popq %rbx
2245 ; AVX-NEXT: popq %r12
2246 ; AVX-NEXT: popq %r13
2247 ; AVX-NEXT: popq %r14
2248 ; AVX-NEXT: popq %r15
2250 %z = call <2 x i128> @llvm.ssub.sat.v2i128(<2 x i128> %x, <2 x i128> %y)