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=+avx512f,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
12 declare <1 x i8> @llvm.usub.sat.v1i8(<1 x i8>, <1 x i8>)
13 declare <2 x i8> @llvm.usub.sat.v2i8(<2 x i8>, <2 x i8>)
14 declare <4 x i8> @llvm.usub.sat.v4i8(<4 x i8>, <4 x i8>)
15 declare <8 x i8> @llvm.usub.sat.v8i8(<8 x i8>, <8 x i8>)
16 declare <12 x i8> @llvm.usub.sat.v12i8(<12 x i8>, <12 x i8>)
17 declare <16 x i8> @llvm.usub.sat.v16i8(<16 x i8>, <16 x i8>)
18 declare <32 x i8> @llvm.usub.sat.v32i8(<32 x i8>, <32 x i8>)
19 declare <64 x i8> @llvm.usub.sat.v64i8(<64 x i8>, <64 x i8>)
21 declare <1 x i16> @llvm.usub.sat.v1i16(<1 x i16>, <1 x i16>)
22 declare <2 x i16> @llvm.usub.sat.v2i16(<2 x i16>, <2 x i16>)
23 declare <4 x i16> @llvm.usub.sat.v4i16(<4 x i16>, <4 x i16>)
24 declare <8 x i16> @llvm.usub.sat.v8i16(<8 x i16>, <8 x i16>)
25 declare <12 x i16> @llvm.usub.sat.v12i16(<12 x i16>, <12 x i16>)
26 declare <16 x i16> @llvm.usub.sat.v16i16(<16 x i16>, <16 x i16>)
27 declare <32 x i16> @llvm.usub.sat.v32i16(<32 x i16>, <32 x i16>)
29 declare <16 x i1> @llvm.usub.sat.v16i1(<16 x i1>, <16 x i1>)
30 declare <16 x i4> @llvm.usub.sat.v16i4(<16 x i4>, <16 x i4>)
32 declare <2 x i32> @llvm.usub.sat.v2i32(<2 x i32>, <2 x i32>)
33 declare <4 x i32> @llvm.usub.sat.v4i32(<4 x i32>, <4 x i32>)
34 declare <8 x i32> @llvm.usub.sat.v8i32(<8 x i32>, <8 x i32>)
35 declare <16 x i32> @llvm.usub.sat.v16i32(<16 x i32>, <16 x i32>)
36 declare <2 x i64> @llvm.usub.sat.v2i64(<2 x i64>, <2 x i64>)
37 declare <4 x i64> @llvm.usub.sat.v4i64(<4 x i64>, <4 x i64>)
38 declare <8 x i64> @llvm.usub.sat.v8i64(<8 x i64>, <8 x i64>)
40 declare <4 x i24> @llvm.usub.sat.v4i24(<4 x i24>, <4 x i24>)
41 declare <2 x i128> @llvm.usub.sat.v2i128(<2 x i128>, <2 x i128>)
43 ; Legal types, depending on architecture.
45 define <16 x i8> @v16i8(<16 x i8> %x, <16 x i8> %y) nounwind {
48 ; SSE-NEXT: psubusb %xmm1, %xmm0
53 ; AVX-NEXT: vpsubusb %xmm1, %xmm0, %xmm0
55 %z = call <16 x i8> @llvm.usub.sat.v16i8(<16 x i8> %x, <16 x i8> %y)
59 define <32 x i8> @v32i8(<32 x i8> %x, <32 x i8> %y) nounwind {
62 ; SSE-NEXT: psubusb %xmm2, %xmm0
63 ; SSE-NEXT: psubusb %xmm3, %xmm1
68 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
69 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
70 ; AVX1-NEXT: vpsubusb %xmm2, %xmm3, %xmm2
71 ; AVX1-NEXT: vpsubusb %xmm1, %xmm0, %xmm0
72 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
77 ; AVX2-NEXT: vpsubusb %ymm1, %ymm0, %ymm0
80 ; AVX512-LABEL: v32i8:
82 ; AVX512-NEXT: vpsubusb %ymm1, %ymm0, %ymm0
84 %z = call <32 x i8> @llvm.usub.sat.v32i8(<32 x i8> %x, <32 x i8> %y)
88 define <64 x i8> @v64i8(<64 x i8> %x, <64 x i8> %y) nounwind {
91 ; SSE-NEXT: psubusb %xmm4, %xmm0
92 ; SSE-NEXT: psubusb %xmm5, %xmm1
93 ; SSE-NEXT: psubusb %xmm6, %xmm2
94 ; SSE-NEXT: psubusb %xmm7, %xmm3
99 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
100 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
101 ; AVX1-NEXT: vpsubusb %xmm4, %xmm5, %xmm4
102 ; AVX1-NEXT: vpsubusb %xmm2, %xmm0, %xmm0
103 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0
104 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2
105 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
106 ; AVX1-NEXT: vpsubusb %xmm2, %xmm4, %xmm2
107 ; AVX1-NEXT: vpsubusb %xmm3, %xmm1, %xmm1
108 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
113 ; AVX2-NEXT: vpsubusb %ymm2, %ymm0, %ymm0
114 ; AVX2-NEXT: vpsubusb %ymm3, %ymm1, %ymm1
117 ; AVX512F-LABEL: v64i8:
119 ; AVX512F-NEXT: vextracti64x4 $1, %zmm1, %ymm2
120 ; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm3
121 ; AVX512F-NEXT: vpsubusb %ymm2, %ymm3, %ymm2
122 ; AVX512F-NEXT: vpsubusb %ymm1, %ymm0, %ymm0
123 ; AVX512F-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm0
126 ; AVX512BW-LABEL: v64i8:
128 ; AVX512BW-NEXT: vpsubusb %zmm1, %zmm0, %zmm0
129 ; AVX512BW-NEXT: retq
130 %z = call <64 x i8> @llvm.usub.sat.v64i8(<64 x i8> %x, <64 x i8> %y)
134 define <8 x i16> @v8i16(<8 x i16> %x, <8 x i16> %y) nounwind {
137 ; SSE-NEXT: psubusw %xmm1, %xmm0
142 ; AVX-NEXT: vpsubusw %xmm1, %xmm0, %xmm0
144 %z = call <8 x i16> @llvm.usub.sat.v8i16(<8 x i16> %x, <8 x i16> %y)
148 define <16 x i16> @v16i16(<16 x i16> %x, <16 x i16> %y) nounwind {
151 ; SSE-NEXT: psubusw %xmm2, %xmm0
152 ; SSE-NEXT: psubusw %xmm3, %xmm1
155 ; AVX1-LABEL: v16i16:
157 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
158 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
159 ; AVX1-NEXT: vpsubusw %xmm2, %xmm3, %xmm2
160 ; AVX1-NEXT: vpsubusw %xmm1, %xmm0, %xmm0
161 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
164 ; AVX2-LABEL: v16i16:
166 ; AVX2-NEXT: vpsubusw %ymm1, %ymm0, %ymm0
169 ; AVX512-LABEL: v16i16:
171 ; AVX512-NEXT: vpsubusw %ymm1, %ymm0, %ymm0
173 %z = call <16 x i16> @llvm.usub.sat.v16i16(<16 x i16> %x, <16 x i16> %y)
177 define <32 x i16> @v32i16(<32 x i16> %x, <32 x i16> %y) nounwind {
180 ; SSE-NEXT: psubusw %xmm4, %xmm0
181 ; SSE-NEXT: psubusw %xmm5, %xmm1
182 ; SSE-NEXT: psubusw %xmm6, %xmm2
183 ; SSE-NEXT: psubusw %xmm7, %xmm3
186 ; AVX1-LABEL: v32i16:
188 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
189 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
190 ; AVX1-NEXT: vpsubusw %xmm4, %xmm5, %xmm4
191 ; AVX1-NEXT: vpsubusw %xmm2, %xmm0, %xmm0
192 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0
193 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2
194 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
195 ; AVX1-NEXT: vpsubusw %xmm2, %xmm4, %xmm2
196 ; AVX1-NEXT: vpsubusw %xmm3, %xmm1, %xmm1
197 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
200 ; AVX2-LABEL: v32i16:
202 ; AVX2-NEXT: vpsubusw %ymm2, %ymm0, %ymm0
203 ; AVX2-NEXT: vpsubusw %ymm3, %ymm1, %ymm1
206 ; AVX512F-LABEL: v32i16:
208 ; AVX512F-NEXT: vextracti64x4 $1, %zmm1, %ymm2
209 ; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm3
210 ; AVX512F-NEXT: vpsubusw %ymm2, %ymm3, %ymm2
211 ; AVX512F-NEXT: vpsubusw %ymm1, %ymm0, %ymm0
212 ; AVX512F-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm0
215 ; AVX512BW-LABEL: v32i16:
217 ; AVX512BW-NEXT: vpsubusw %zmm1, %zmm0, %zmm0
218 ; AVX512BW-NEXT: retq
219 %z = call <32 x i16> @llvm.usub.sat.v32i16(<32 x i16> %x, <32 x i16> %y)
223 ; Too narrow vectors, legalized by widening.
225 define void @v8i8(<8 x i8>* %px, <8 x i8>* %py, <8 x i8>* %pz) nounwind {
228 ; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
229 ; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero
230 ; SSE-NEXT: psubusb %xmm1, %xmm0
231 ; SSE-NEXT: movq %xmm0, (%rdx)
236 ; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero
237 ; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
238 ; AVX-NEXT: vpsubusb %xmm1, %xmm0, %xmm0
239 ; AVX-NEXT: vmovq %xmm0, (%rdx)
241 %x = load <8 x i8>, <8 x i8>* %px
242 %y = load <8 x i8>, <8 x i8>* %py
243 %z = call <8 x i8> @llvm.usub.sat.v8i8(<8 x i8> %x, <8 x i8> %y)
244 store <8 x i8> %z, <8 x i8>* %pz
248 define void @v4i8(<4 x i8>* %px, <4 x i8>* %py, <4 x i8>* %pz) nounwind {
251 ; SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
252 ; SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
253 ; SSE-NEXT: psubusb %xmm1, %xmm0
254 ; SSE-NEXT: movd %xmm0, (%rdx)
259 ; AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
260 ; AVX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
261 ; AVX-NEXT: vpsubusb %xmm1, %xmm0, %xmm0
262 ; AVX-NEXT: vmovd %xmm0, (%rdx)
264 %x = load <4 x i8>, <4 x i8>* %px
265 %y = load <4 x i8>, <4 x i8>* %py
266 %z = call <4 x i8> @llvm.usub.sat.v4i8(<4 x i8> %x, <4 x i8> %y)
267 store <4 x i8> %z, <4 x i8>* %pz
271 define void @v2i8(<2 x i8>* %px, <2 x i8>* %py, <2 x i8>* %pz) nounwind {
274 ; SSE2-NEXT: movzwl (%rdi), %eax
275 ; SSE2-NEXT: movd %eax, %xmm0
276 ; SSE2-NEXT: movzwl (%rsi), %eax
277 ; SSE2-NEXT: movd %eax, %xmm1
278 ; SSE2-NEXT: psubusb %xmm1, %xmm0
279 ; SSE2-NEXT: movd %xmm0, %eax
280 ; SSE2-NEXT: movw %ax, (%rdx)
285 ; SSSE3-NEXT: movzwl (%rdi), %eax
286 ; SSSE3-NEXT: movd %eax, %xmm0
287 ; SSSE3-NEXT: movzwl (%rsi), %eax
288 ; SSSE3-NEXT: movd %eax, %xmm1
289 ; SSSE3-NEXT: psubusb %xmm1, %xmm0
290 ; SSSE3-NEXT: movd %xmm0, %eax
291 ; SSSE3-NEXT: movw %ax, (%rdx)
296 ; SSE41-NEXT: movzwl (%rdi), %eax
297 ; SSE41-NEXT: movd %eax, %xmm0
298 ; SSE41-NEXT: movzwl (%rsi), %eax
299 ; SSE41-NEXT: movd %eax, %xmm1
300 ; SSE41-NEXT: psubusb %xmm1, %xmm0
301 ; SSE41-NEXT: pextrw $0, %xmm0, (%rdx)
306 ; AVX-NEXT: movzwl (%rdi), %eax
307 ; AVX-NEXT: vmovd %eax, %xmm0
308 ; AVX-NEXT: movzwl (%rsi), %eax
309 ; AVX-NEXT: vmovd %eax, %xmm1
310 ; AVX-NEXT: vpsubusb %xmm1, %xmm0, %xmm0
311 ; AVX-NEXT: vpextrw $0, %xmm0, (%rdx)
313 %x = load <2 x i8>, <2 x i8>* %px
314 %y = load <2 x i8>, <2 x i8>* %py
315 %z = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %x, <2 x i8> %y)
316 store <2 x i8> %z, <2 x i8>* %pz
320 define void @v4i16(<4 x i16>* %px, <4 x i16>* %py, <4 x i16>* %pz) nounwind {
323 ; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
324 ; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero
325 ; SSE-NEXT: psubusw %xmm1, %xmm0
326 ; SSE-NEXT: movq %xmm0, (%rdx)
331 ; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero
332 ; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
333 ; AVX-NEXT: vpsubusw %xmm1, %xmm0, %xmm0
334 ; AVX-NEXT: vmovq %xmm0, (%rdx)
336 %x = load <4 x i16>, <4 x i16>* %px
337 %y = load <4 x i16>, <4 x i16>* %py
338 %z = call <4 x i16> @llvm.usub.sat.v4i16(<4 x i16> %x, <4 x i16> %y)
339 store <4 x i16> %z, <4 x i16>* %pz
343 define void @v2i16(<2 x i16>* %px, <2 x i16>* %py, <2 x i16>* %pz) nounwind {
346 ; SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
347 ; SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
348 ; SSE-NEXT: psubusw %xmm1, %xmm0
349 ; SSE-NEXT: movd %xmm0, (%rdx)
354 ; AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
355 ; AVX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
356 ; AVX-NEXT: vpsubusw %xmm1, %xmm0, %xmm0
357 ; AVX-NEXT: vmovd %xmm0, (%rdx)
359 %x = load <2 x i16>, <2 x i16>* %px
360 %y = load <2 x i16>, <2 x i16>* %py
361 %z = call <2 x i16> @llvm.usub.sat.v2i16(<2 x i16> %x, <2 x i16> %y)
362 store <2 x i16> %z, <2 x i16>* %pz
366 define <12 x i8> @v12i8(<12 x i8> %x, <12 x i8> %y) nounwind {
369 ; SSE-NEXT: psubusb %xmm1, %xmm0
374 ; AVX-NEXT: vpsubusb %xmm1, %xmm0, %xmm0
376 %z = call <12 x i8> @llvm.usub.sat.v12i8(<12 x i8> %x, <12 x i8> %y)
380 define void @v12i16(<12 x i16>* %px, <12 x i16>* %py, <12 x i16>* %pz) nounwind {
383 ; SSE-NEXT: movdqa (%rdi), %xmm0
384 ; SSE-NEXT: movdqa 16(%rdi), %xmm1
385 ; SSE-NEXT: psubusw 16(%rsi), %xmm1
386 ; SSE-NEXT: psubusw (%rsi), %xmm0
387 ; SSE-NEXT: movdqa %xmm0, (%rdx)
388 ; SSE-NEXT: movq %xmm1, 16(%rdx)
391 ; AVX1-LABEL: v12i16:
393 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
394 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1
395 ; AVX1-NEXT: vpsubusw 16(%rsi), %xmm1, %xmm1
396 ; AVX1-NEXT: vpsubusw (%rsi), %xmm0, %xmm0
397 ; AVX1-NEXT: vmovdqa %xmm0, (%rdx)
398 ; AVX1-NEXT: vmovq %xmm1, 16(%rdx)
401 ; AVX2-LABEL: v12i16:
403 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
404 ; AVX2-NEXT: vpsubusw (%rsi), %ymm0, %ymm0
405 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
406 ; AVX2-NEXT: vmovq %xmm1, 16(%rdx)
407 ; AVX2-NEXT: vmovdqa %xmm0, (%rdx)
408 ; AVX2-NEXT: vzeroupper
411 ; AVX512-LABEL: v12i16:
413 ; AVX512-NEXT: vmovdqa (%rdi), %ymm0
414 ; AVX512-NEXT: vpsubusw (%rsi), %ymm0, %ymm0
415 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
416 ; AVX512-NEXT: vmovq %xmm1, 16(%rdx)
417 ; AVX512-NEXT: vmovdqa %xmm0, (%rdx)
418 ; AVX512-NEXT: vzeroupper
420 %x = load <12 x i16>, <12 x i16>* %px
421 %y = load <12 x i16>, <12 x i16>* %py
422 %z = call <12 x i16> @llvm.usub.sat.v12i16(<12 x i16> %x, <12 x i16> %y)
423 store <12 x i16> %z, <12 x i16>* %pz
429 define void @v1i8(<1 x i8>* %px, <1 x i8>* %py, <1 x i8>* %pz) nounwind {
432 ; SSE-NEXT: movb (%rdi), %al
433 ; SSE-NEXT: xorl %ecx, %ecx
434 ; SSE-NEXT: subb (%rsi), %al
435 ; SSE-NEXT: movzbl %al, %eax
436 ; SSE-NEXT: cmovbl %ecx, %eax
437 ; SSE-NEXT: movb %al, (%rdx)
442 ; AVX-NEXT: movb (%rdi), %al
443 ; AVX-NEXT: xorl %ecx, %ecx
444 ; AVX-NEXT: subb (%rsi), %al
445 ; AVX-NEXT: movzbl %al, %eax
446 ; AVX-NEXT: cmovbl %ecx, %eax
447 ; AVX-NEXT: movb %al, (%rdx)
449 %x = load <1 x i8>, <1 x i8>* %px
450 %y = load <1 x i8>, <1 x i8>* %py
451 %z = call <1 x i8> @llvm.usub.sat.v1i8(<1 x i8> %x, <1 x i8> %y)
452 store <1 x i8> %z, <1 x i8>* %pz
456 define void @v1i16(<1 x i16>* %px, <1 x i16>* %py, <1 x i16>* %pz) nounwind {
459 ; SSE-NEXT: movzwl (%rdi), %eax
460 ; SSE-NEXT: xorl %ecx, %ecx
461 ; SSE-NEXT: subw (%rsi), %ax
462 ; SSE-NEXT: cmovbl %ecx, %eax
463 ; SSE-NEXT: movw %ax, (%rdx)
468 ; AVX-NEXT: movzwl (%rdi), %eax
469 ; AVX-NEXT: xorl %ecx, %ecx
470 ; AVX-NEXT: subw (%rsi), %ax
471 ; AVX-NEXT: cmovbl %ecx, %eax
472 ; AVX-NEXT: movw %ax, (%rdx)
474 %x = load <1 x i16>, <1 x i16>* %px
475 %y = load <1 x i16>, <1 x i16>* %py
476 %z = call <1 x i16> @llvm.usub.sat.v1i16(<1 x i16> %x, <1 x i16> %y)
477 store <1 x i16> %z, <1 x i16>* %pz
483 define <16 x i4> @v16i4(<16 x i4> %x, <16 x i4> %y) nounwind {
486 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
487 ; SSE-NEXT: pand %xmm2, %xmm1
488 ; SSE-NEXT: pand %xmm2, %xmm0
489 ; SSE-NEXT: psubusb %xmm1, %xmm0
494 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
495 ; AVX-NEXT: vpand %xmm2, %xmm1, %xmm1
496 ; AVX-NEXT: vpand %xmm2, %xmm0, %xmm0
497 ; AVX-NEXT: vpsubusb %xmm1, %xmm0, %xmm0
499 %z = call <16 x i4> @llvm.usub.sat.v16i4(<16 x i4> %x, <16 x i4> %y)
503 define <16 x i1> @v16i1(<16 x i1> %x, <16 x i1> %y) nounwind {
506 ; SSE-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
507 ; SSE-NEXT: andps %xmm1, %xmm0
512 ; AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
513 ; AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
518 ; AVX2-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
519 ; AVX2-NEXT: vandps %xmm1, %xmm0, %xmm0
522 ; AVX512F-LABEL: v16i1:
524 ; AVX512F-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
525 ; AVX512F-NEXT: vandps %xmm1, %xmm0, %xmm0
528 ; AVX512BW-LABEL: v16i1:
530 ; AVX512BW-NEXT: vpternlogq $96, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm0
531 ; AVX512BW-NEXT: retq
532 %z = call <16 x i1> @llvm.usub.sat.v16i1(<16 x i1> %x, <16 x i1> %y)
538 define <2 x i32> @v2i32(<2 x i32> %x, <2 x i32> %y) nounwind {
541 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
542 ; SSE2-NEXT: movdqa %xmm1, %xmm3
543 ; SSE2-NEXT: pxor %xmm2, %xmm3
544 ; SSE2-NEXT: pxor %xmm0, %xmm2
545 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm2
546 ; SSE2-NEXT: psubd %xmm1, %xmm0
547 ; SSE2-NEXT: pand %xmm2, %xmm0
550 ; SSSE3-LABEL: v2i32:
552 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
553 ; SSSE3-NEXT: movdqa %xmm1, %xmm3
554 ; SSSE3-NEXT: pxor %xmm2, %xmm3
555 ; SSSE3-NEXT: pxor %xmm0, %xmm2
556 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm2
557 ; SSSE3-NEXT: psubd %xmm1, %xmm0
558 ; SSSE3-NEXT: pand %xmm2, %xmm0
561 ; SSE41-LABEL: v2i32:
563 ; SSE41-NEXT: pmaxud %xmm1, %xmm0
564 ; SSE41-NEXT: psubd %xmm1, %xmm0
569 ; AVX-NEXT: vpmaxud %xmm1, %xmm0, %xmm0
570 ; AVX-NEXT: vpsubd %xmm1, %xmm0, %xmm0
572 %z = call <2 x i32> @llvm.usub.sat.v2i32(<2 x i32> %x, <2 x i32> %y)
576 define <4 x i32> @v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {
579 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
580 ; SSE2-NEXT: movdqa %xmm1, %xmm3
581 ; SSE2-NEXT: pxor %xmm2, %xmm3
582 ; SSE2-NEXT: pxor %xmm0, %xmm2
583 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm2
584 ; SSE2-NEXT: psubd %xmm1, %xmm0
585 ; SSE2-NEXT: pand %xmm2, %xmm0
588 ; SSSE3-LABEL: v4i32:
590 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
591 ; SSSE3-NEXT: movdqa %xmm1, %xmm3
592 ; SSSE3-NEXT: pxor %xmm2, %xmm3
593 ; SSSE3-NEXT: pxor %xmm0, %xmm2
594 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm2
595 ; SSSE3-NEXT: psubd %xmm1, %xmm0
596 ; SSSE3-NEXT: pand %xmm2, %xmm0
599 ; SSE41-LABEL: v4i32:
601 ; SSE41-NEXT: pmaxud %xmm1, %xmm0
602 ; SSE41-NEXT: psubd %xmm1, %xmm0
607 ; AVX-NEXT: vpmaxud %xmm1, %xmm0, %xmm0
608 ; AVX-NEXT: vpsubd %xmm1, %xmm0, %xmm0
610 %z = call <4 x i32> @llvm.usub.sat.v4i32(<4 x i32> %x, <4 x i32> %y)
614 define <8 x i32> @v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
617 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
618 ; SSE2-NEXT: movdqa %xmm0, %xmm5
619 ; SSE2-NEXT: psubd %xmm2, %xmm0
620 ; SSE2-NEXT: pxor %xmm4, %xmm2
621 ; SSE2-NEXT: pxor %xmm4, %xmm5
622 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm5
623 ; SSE2-NEXT: pand %xmm5, %xmm0
624 ; SSE2-NEXT: movdqa %xmm3, %xmm2
625 ; SSE2-NEXT: pxor %xmm4, %xmm2
626 ; SSE2-NEXT: pxor %xmm1, %xmm4
627 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
628 ; SSE2-NEXT: psubd %xmm3, %xmm1
629 ; SSE2-NEXT: pand %xmm4, %xmm1
632 ; SSSE3-LABEL: v8i32:
634 ; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
635 ; SSSE3-NEXT: movdqa %xmm0, %xmm5
636 ; SSSE3-NEXT: psubd %xmm2, %xmm0
637 ; SSSE3-NEXT: pxor %xmm4, %xmm2
638 ; SSSE3-NEXT: pxor %xmm4, %xmm5
639 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm5
640 ; SSSE3-NEXT: pand %xmm5, %xmm0
641 ; SSSE3-NEXT: movdqa %xmm3, %xmm2
642 ; SSSE3-NEXT: pxor %xmm4, %xmm2
643 ; SSSE3-NEXT: pxor %xmm1, %xmm4
644 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
645 ; SSSE3-NEXT: psubd %xmm3, %xmm1
646 ; SSSE3-NEXT: pand %xmm4, %xmm1
649 ; SSE41-LABEL: v8i32:
651 ; SSE41-NEXT: pmaxud %xmm2, %xmm0
652 ; SSE41-NEXT: psubd %xmm2, %xmm0
653 ; SSE41-NEXT: pmaxud %xmm3, %xmm1
654 ; SSE41-NEXT: psubd %xmm3, %xmm1
659 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
660 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
661 ; AVX1-NEXT: vpmaxud %xmm2, %xmm3, %xmm3
662 ; AVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm2
663 ; AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm0
664 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm0
665 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
670 ; AVX2-NEXT: vpmaxud %ymm1, %ymm0, %ymm0
671 ; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm0
674 ; AVX512-LABEL: v8i32:
676 ; AVX512-NEXT: vpmaxud %ymm1, %ymm0, %ymm0
677 ; AVX512-NEXT: vpsubd %ymm1, %ymm0, %ymm0
679 %z = call <8 x i32> @llvm.usub.sat.v8i32(<8 x i32> %x, <8 x i32> %y)
683 define <16 x i32> @v16i32(<16 x i32> %x, <16 x i32> %y) nounwind {
684 ; SSE2-LABEL: v16i32:
686 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
687 ; SSE2-NEXT: movdqa %xmm0, %xmm9
688 ; SSE2-NEXT: psubd %xmm4, %xmm0
689 ; SSE2-NEXT: pxor %xmm8, %xmm4
690 ; SSE2-NEXT: pxor %xmm8, %xmm9
691 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm9
692 ; SSE2-NEXT: pand %xmm9, %xmm0
693 ; SSE2-NEXT: movdqa %xmm1, %xmm4
694 ; SSE2-NEXT: psubd %xmm5, %xmm1
695 ; SSE2-NEXT: pxor %xmm8, %xmm5
696 ; SSE2-NEXT: pxor %xmm8, %xmm4
697 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm4
698 ; SSE2-NEXT: pand %xmm4, %xmm1
699 ; SSE2-NEXT: movdqa %xmm2, %xmm4
700 ; SSE2-NEXT: psubd %xmm6, %xmm2
701 ; SSE2-NEXT: pxor %xmm8, %xmm6
702 ; SSE2-NEXT: pxor %xmm8, %xmm4
703 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm4
704 ; SSE2-NEXT: pand %xmm4, %xmm2
705 ; SSE2-NEXT: movdqa %xmm7, %xmm4
706 ; SSE2-NEXT: pxor %xmm8, %xmm4
707 ; SSE2-NEXT: pxor %xmm3, %xmm8
708 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm8
709 ; SSE2-NEXT: psubd %xmm7, %xmm3
710 ; SSE2-NEXT: pand %xmm8, %xmm3
713 ; SSSE3-LABEL: v16i32:
715 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
716 ; SSSE3-NEXT: movdqa %xmm0, %xmm9
717 ; SSSE3-NEXT: psubd %xmm4, %xmm0
718 ; SSSE3-NEXT: pxor %xmm8, %xmm4
719 ; SSSE3-NEXT: pxor %xmm8, %xmm9
720 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm9
721 ; SSSE3-NEXT: pand %xmm9, %xmm0
722 ; SSSE3-NEXT: movdqa %xmm1, %xmm4
723 ; SSSE3-NEXT: psubd %xmm5, %xmm1
724 ; SSSE3-NEXT: pxor %xmm8, %xmm5
725 ; SSSE3-NEXT: pxor %xmm8, %xmm4
726 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm4
727 ; SSSE3-NEXT: pand %xmm4, %xmm1
728 ; SSSE3-NEXT: movdqa %xmm2, %xmm4
729 ; SSSE3-NEXT: psubd %xmm6, %xmm2
730 ; SSSE3-NEXT: pxor %xmm8, %xmm6
731 ; SSSE3-NEXT: pxor %xmm8, %xmm4
732 ; SSSE3-NEXT: pcmpgtd %xmm6, %xmm4
733 ; SSSE3-NEXT: pand %xmm4, %xmm2
734 ; SSSE3-NEXT: movdqa %xmm7, %xmm4
735 ; SSSE3-NEXT: pxor %xmm8, %xmm4
736 ; SSSE3-NEXT: pxor %xmm3, %xmm8
737 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm8
738 ; SSSE3-NEXT: psubd %xmm7, %xmm3
739 ; SSSE3-NEXT: pand %xmm8, %xmm3
742 ; SSE41-LABEL: v16i32:
744 ; SSE41-NEXT: pmaxud %xmm4, %xmm0
745 ; SSE41-NEXT: psubd %xmm4, %xmm0
746 ; SSE41-NEXT: pmaxud %xmm5, %xmm1
747 ; SSE41-NEXT: psubd %xmm5, %xmm1
748 ; SSE41-NEXT: pmaxud %xmm6, %xmm2
749 ; SSE41-NEXT: psubd %xmm6, %xmm2
750 ; SSE41-NEXT: pmaxud %xmm7, %xmm3
751 ; SSE41-NEXT: psubd %xmm7, %xmm3
754 ; AVX1-LABEL: v16i32:
756 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
757 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
758 ; AVX1-NEXT: vpmaxud %xmm4, %xmm5, %xmm5
759 ; AVX1-NEXT: vpsubd %xmm4, %xmm5, %xmm4
760 ; AVX1-NEXT: vpmaxud %xmm2, %xmm0, %xmm0
761 ; AVX1-NEXT: vpsubd %xmm2, %xmm0, %xmm0
762 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0
763 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2
764 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
765 ; AVX1-NEXT: vpmaxud %xmm2, %xmm4, %xmm4
766 ; AVX1-NEXT: vpsubd %xmm2, %xmm4, %xmm2
767 ; AVX1-NEXT: vpmaxud %xmm3, %xmm1, %xmm1
768 ; AVX1-NEXT: vpsubd %xmm3, %xmm1, %xmm1
769 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
772 ; AVX2-LABEL: v16i32:
774 ; AVX2-NEXT: vpmaxud %ymm2, %ymm0, %ymm0
775 ; AVX2-NEXT: vpsubd %ymm2, %ymm0, %ymm0
776 ; AVX2-NEXT: vpmaxud %ymm3, %ymm1, %ymm1
777 ; AVX2-NEXT: vpsubd %ymm3, %ymm1, %ymm1
780 ; AVX512-LABEL: v16i32:
782 ; AVX512-NEXT: vpmaxud %zmm1, %zmm0, %zmm0
783 ; AVX512-NEXT: vpsubd %zmm1, %zmm0, %zmm0
785 %z = call <16 x i32> @llvm.usub.sat.v16i32(<16 x i32> %x, <16 x i32> %y)
789 define <2 x i64> @v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {
792 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
793 ; SSE-NEXT: movdqa %xmm1, %xmm3
794 ; SSE-NEXT: pxor %xmm2, %xmm3
795 ; SSE-NEXT: pxor %xmm0, %xmm2
796 ; SSE-NEXT: movdqa %xmm2, %xmm4
797 ; SSE-NEXT: pcmpgtd %xmm3, %xmm4
798 ; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
799 ; SSE-NEXT: pcmpeqd %xmm3, %xmm2
800 ; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
801 ; SSE-NEXT: pand %xmm5, %xmm2
802 ; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
803 ; SSE-NEXT: por %xmm2, %xmm3
804 ; SSE-NEXT: psubq %xmm1, %xmm0
805 ; SSE-NEXT: pand %xmm3, %xmm0
810 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
811 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm3
812 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm2
813 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
814 ; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm0
815 ; AVX1-NEXT: vpand %xmm0, %xmm2, %xmm0
820 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
821 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm3
822 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm2
823 ; AVX2-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
824 ; AVX2-NEXT: vpsubq %xmm1, %xmm0, %xmm0
825 ; AVX2-NEXT: vpand %xmm0, %xmm2, %xmm0
828 ; AVX512F-LABEL: v2i64:
830 ; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
831 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
832 ; AVX512F-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0
833 ; AVX512F-NEXT: vpsubq %xmm1, %xmm0, %xmm0
834 ; AVX512F-NEXT: vzeroupper
837 ; AVX512BW-LABEL: v2i64:
839 ; AVX512BW-NEXT: vpmaxuq %xmm1, %xmm0, %xmm0
840 ; AVX512BW-NEXT: vpsubq %xmm1, %xmm0, %xmm0
841 ; AVX512BW-NEXT: retq
842 %z = call <2 x i64> @llvm.usub.sat.v2i64(<2 x i64> %x, <2 x i64> %y)
846 define <4 x i64> @v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
849 ; SSE-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
850 ; SSE-NEXT: movdqa %xmm0, %xmm5
851 ; SSE-NEXT: psubq %xmm2, %xmm0
852 ; SSE-NEXT: pxor %xmm4, %xmm2
853 ; SSE-NEXT: pxor %xmm4, %xmm5
854 ; SSE-NEXT: movdqa %xmm5, %xmm6
855 ; SSE-NEXT: pcmpgtd %xmm2, %xmm6
856 ; SSE-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
857 ; SSE-NEXT: pcmpeqd %xmm2, %xmm5
858 ; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
859 ; SSE-NEXT: pand %xmm7, %xmm2
860 ; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
861 ; SSE-NEXT: por %xmm2, %xmm5
862 ; SSE-NEXT: pand %xmm5, %xmm0
863 ; SSE-NEXT: movdqa %xmm3, %xmm2
864 ; SSE-NEXT: pxor %xmm4, %xmm2
865 ; SSE-NEXT: pxor %xmm1, %xmm4
866 ; SSE-NEXT: movdqa %xmm4, %xmm5
867 ; SSE-NEXT: pcmpgtd %xmm2, %xmm5
868 ; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
869 ; SSE-NEXT: pcmpeqd %xmm2, %xmm4
870 ; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
871 ; SSE-NEXT: pand %xmm6, %xmm2
872 ; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
873 ; SSE-NEXT: por %xmm2, %xmm4
874 ; SSE-NEXT: psubq %xmm3, %xmm1
875 ; SSE-NEXT: pand %xmm4, %xmm1
880 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
881 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
882 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm4
883 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
884 ; AVX1-NEXT: vpxor %xmm3, %xmm5, %xmm6
885 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm4
886 ; AVX1-NEXT: vpsubq %xmm2, %xmm5, %xmm2
887 ; AVX1-NEXT: vpand %xmm2, %xmm4, %xmm2
888 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm4
889 ; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm3
890 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm3
891 ; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm0
892 ; AVX1-NEXT: vpand %xmm0, %xmm3, %xmm0
893 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
898 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
899 ; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm3
900 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm2
901 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2
902 ; AVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm0
903 ; AVX2-NEXT: vpand %ymm0, %ymm2, %ymm0
906 ; AVX512F-LABEL: v4i64:
908 ; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
909 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
910 ; AVX512F-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0
911 ; AVX512F-NEXT: vpsubq %ymm1, %ymm0, %ymm0
914 ; AVX512BW-LABEL: v4i64:
916 ; AVX512BW-NEXT: vpmaxuq %ymm1, %ymm0, %ymm0
917 ; AVX512BW-NEXT: vpsubq %ymm1, %ymm0, %ymm0
918 ; AVX512BW-NEXT: retq
919 %z = call <4 x i64> @llvm.usub.sat.v4i64(<4 x i64> %x, <4 x i64> %y)
923 define <8 x i64> @v8i64(<8 x i64> %x, <8 x i64> %y) nounwind {
926 ; SSE-NEXT: movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
927 ; SSE-NEXT: movdqa %xmm0, %xmm9
928 ; SSE-NEXT: psubq %xmm4, %xmm0
929 ; SSE-NEXT: pxor %xmm8, %xmm4
930 ; SSE-NEXT: pxor %xmm8, %xmm9
931 ; SSE-NEXT: movdqa %xmm9, %xmm10
932 ; SSE-NEXT: pcmpgtd %xmm4, %xmm10
933 ; SSE-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
934 ; SSE-NEXT: pcmpeqd %xmm4, %xmm9
935 ; SSE-NEXT: pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
936 ; SSE-NEXT: pand %xmm11, %xmm9
937 ; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm10[1,1,3,3]
938 ; SSE-NEXT: por %xmm9, %xmm4
939 ; SSE-NEXT: pand %xmm4, %xmm0
940 ; SSE-NEXT: movdqa %xmm1, %xmm9
941 ; SSE-NEXT: psubq %xmm5, %xmm1
942 ; SSE-NEXT: pxor %xmm8, %xmm5
943 ; SSE-NEXT: pxor %xmm8, %xmm9
944 ; SSE-NEXT: movdqa %xmm9, %xmm4
945 ; SSE-NEXT: pcmpgtd %xmm5, %xmm4
946 ; SSE-NEXT: pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
947 ; SSE-NEXT: pcmpeqd %xmm5, %xmm9
948 ; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm9[1,1,3,3]
949 ; SSE-NEXT: pand %xmm10, %xmm5
950 ; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
951 ; SSE-NEXT: por %xmm5, %xmm4
952 ; SSE-NEXT: pand %xmm4, %xmm1
953 ; SSE-NEXT: movdqa %xmm2, %xmm4
954 ; SSE-NEXT: psubq %xmm6, %xmm2
955 ; SSE-NEXT: pxor %xmm8, %xmm6
956 ; SSE-NEXT: pxor %xmm8, %xmm4
957 ; SSE-NEXT: movdqa %xmm4, %xmm5
958 ; SSE-NEXT: pcmpgtd %xmm6, %xmm5
959 ; SSE-NEXT: pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
960 ; SSE-NEXT: pcmpeqd %xmm6, %xmm4
961 ; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
962 ; SSE-NEXT: pand %xmm9, %xmm4
963 ; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
964 ; SSE-NEXT: por %xmm4, %xmm5
965 ; SSE-NEXT: pand %xmm5, %xmm2
966 ; SSE-NEXT: movdqa %xmm7, %xmm4
967 ; SSE-NEXT: pxor %xmm8, %xmm4
968 ; SSE-NEXT: pxor %xmm3, %xmm8
969 ; SSE-NEXT: movdqa %xmm8, %xmm5
970 ; SSE-NEXT: pcmpgtd %xmm4, %xmm5
971 ; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
972 ; SSE-NEXT: pcmpeqd %xmm4, %xmm8
973 ; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm8[1,1,3,3]
974 ; SSE-NEXT: pand %xmm6, %xmm4
975 ; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
976 ; SSE-NEXT: por %xmm4, %xmm5
977 ; SSE-NEXT: psubq %xmm7, %xmm3
978 ; SSE-NEXT: pand %xmm5, %xmm3
983 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
984 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808]
985 ; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm8
986 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7
987 ; AVX1-NEXT: vpxor %xmm5, %xmm7, %xmm6
988 ; AVX1-NEXT: vpcmpgtq %xmm8, %xmm6, %xmm6
989 ; AVX1-NEXT: vpsubq %xmm4, %xmm7, %xmm4
990 ; AVX1-NEXT: vpand %xmm4, %xmm6, %xmm4
991 ; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm6
992 ; AVX1-NEXT: vpxor %xmm5, %xmm0, %xmm7
993 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm7, %xmm6
994 ; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0
995 ; AVX1-NEXT: vpand %xmm0, %xmm6, %xmm0
996 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0
997 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2
998 ; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm4
999 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6
1000 ; AVX1-NEXT: vpxor %xmm5, %xmm6, %xmm7
1001 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm7, %xmm4
1002 ; AVX1-NEXT: vpsubq %xmm2, %xmm6, %xmm2
1003 ; AVX1-NEXT: vpand %xmm2, %xmm4, %xmm2
1004 ; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm4
1005 ; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm5
1006 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4
1007 ; AVX1-NEXT: vpsubq %xmm3, %xmm1, %xmm1
1008 ; AVX1-NEXT: vpand %xmm1, %xmm4, %xmm1
1009 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
1012 ; AVX2-LABEL: v8i64:
1014 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1015 ; AVX2-NEXT: vpxor %ymm4, %ymm2, %ymm5
1016 ; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm6
1017 ; AVX2-NEXT: vpcmpgtq %ymm5, %ymm6, %ymm5
1018 ; AVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm0
1019 ; AVX2-NEXT: vpand %ymm0, %ymm5, %ymm0
1020 ; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm2
1021 ; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm4
1022 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm4, %ymm2
1023 ; AVX2-NEXT: vpsubq %ymm3, %ymm1, %ymm1
1024 ; AVX2-NEXT: vpand %ymm1, %ymm2, %ymm1
1027 ; AVX512-LABEL: v8i64:
1029 ; AVX512-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0
1030 ; AVX512-NEXT: vpsubq %zmm1, %zmm0, %zmm0
1032 %z = call <8 x i64> @llvm.usub.sat.v8i64(<8 x i64> %x, <8 x i64> %y)
1036 define <2 x i128> @v2i128(<2 x i128> %x, <2 x i128> %y) nounwind {
1037 ; SSE-LABEL: v2i128:
1039 ; SSE-NEXT: movq %rdi, %rax
1040 ; SSE-NEXT: xorl %edi, %edi
1041 ; SSE-NEXT: subq %r9, %rsi
1042 ; SSE-NEXT: sbbq {{[0-9]+}}(%rsp), %rdx
1043 ; SSE-NEXT: cmovbq %rdi, %rsi
1044 ; SSE-NEXT: cmovbq %rdi, %rdx
1045 ; SSE-NEXT: subq {{[0-9]+}}(%rsp), %rcx
1046 ; SSE-NEXT: sbbq {{[0-9]+}}(%rsp), %r8
1047 ; SSE-NEXT: cmovbq %rdi, %r8
1048 ; SSE-NEXT: cmovbq %rdi, %rcx
1049 ; SSE-NEXT: movq %r8, 24(%rax)
1050 ; SSE-NEXT: movq %rcx, 16(%rax)
1051 ; SSE-NEXT: movq %rdx, 8(%rax)
1052 ; SSE-NEXT: movq %rsi, (%rax)
1055 ; AVX-LABEL: v2i128:
1057 ; AVX-NEXT: movq %rdi, %rax
1058 ; AVX-NEXT: xorl %edi, %edi
1059 ; AVX-NEXT: subq %r9, %rsi
1060 ; AVX-NEXT: sbbq {{[0-9]+}}(%rsp), %rdx
1061 ; AVX-NEXT: cmovbq %rdi, %rsi
1062 ; AVX-NEXT: cmovbq %rdi, %rdx
1063 ; AVX-NEXT: subq {{[0-9]+}}(%rsp), %rcx
1064 ; AVX-NEXT: sbbq {{[0-9]+}}(%rsp), %r8
1065 ; AVX-NEXT: cmovbq %rdi, %r8
1066 ; AVX-NEXT: cmovbq %rdi, %rcx
1067 ; AVX-NEXT: movq %r8, 24(%rax)
1068 ; AVX-NEXT: movq %rcx, 16(%rax)
1069 ; AVX-NEXT: movq %rdx, 8(%rax)
1070 ; AVX-NEXT: movq %rsi, (%rax)
1072 %z = call <2 x i128> @llvm.usub.sat.v2i128(<2 x i128> %x, <2 x i128> %y)
1076 define void @PR48223(<32 x i16>* %p0) {
1077 ; SSE-LABEL: PR48223:
1079 ; SSE-NEXT: movdqa (%rdi), %xmm0
1080 ; SSE-NEXT: movdqa 16(%rdi), %xmm1
1081 ; SSE-NEXT: movdqa 32(%rdi), %xmm2
1082 ; SSE-NEXT: movdqa 48(%rdi), %xmm3
1083 ; SSE-NEXT: movdqa {{.*#+}} xmm4 = [64,64,64,64,64,64,64,64]
1084 ; SSE-NEXT: psubusw %xmm4, %xmm1
1085 ; SSE-NEXT: psubusw %xmm4, %xmm0
1086 ; SSE-NEXT: psubusw %xmm4, %xmm3
1087 ; SSE-NEXT: psubusw %xmm4, %xmm2
1088 ; SSE-NEXT: movdqa %xmm2, 32(%rdi)
1089 ; SSE-NEXT: movdqa %xmm3, 48(%rdi)
1090 ; SSE-NEXT: movdqa %xmm0, (%rdi)
1091 ; SSE-NEXT: movdqa %xmm1, 16(%rdi)
1094 ; AVX1-LABEL: PR48223:
1096 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
1097 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1
1098 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2
1099 ; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3
1100 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [64,64,64,64,64,64,64,64]
1101 ; AVX1-NEXT: vpsubusw %xmm4, %xmm3, %xmm3
1102 ; AVX1-NEXT: vpsubusw %xmm4, %xmm2, %xmm2
1103 ; AVX1-NEXT: vpsubusw %xmm4, %xmm1, %xmm1
1104 ; AVX1-NEXT: vpsubusw %xmm4, %xmm0, %xmm0
1105 ; AVX1-NEXT: vmovdqa %xmm0, (%rdi)
1106 ; AVX1-NEXT: vmovdqa %xmm1, 16(%rdi)
1107 ; AVX1-NEXT: vmovdqa %xmm2, 32(%rdi)
1108 ; AVX1-NEXT: vmovdqa %xmm3, 48(%rdi)
1111 ; AVX2-LABEL: PR48223:
1113 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
1114 ; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1
1115 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64]
1116 ; AVX2-NEXT: vpsubusw %ymm2, %ymm1, %ymm1
1117 ; AVX2-NEXT: vpsubusw %ymm2, %ymm0, %ymm0
1118 ; AVX2-NEXT: vmovdqa %ymm0, (%rdi)
1119 ; AVX2-NEXT: vmovdqa %ymm1, 32(%rdi)
1120 ; AVX2-NEXT: vzeroupper
1123 ; AVX512F-LABEL: PR48223:
1125 ; AVX512F-NEXT: vmovdqa (%rdi), %ymm0
1126 ; AVX512F-NEXT: vmovdqa 32(%rdi), %ymm1
1127 ; AVX512F-NEXT: vmovdqa {{.*#+}} ymm2 = [64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64]
1128 ; AVX512F-NEXT: vpsubusw %ymm2, %ymm1, %ymm1
1129 ; AVX512F-NEXT: vpsubusw %ymm2, %ymm0, %ymm0
1130 ; AVX512F-NEXT: vmovdqa %ymm0, (%rdi)
1131 ; AVX512F-NEXT: vmovdqa %ymm1, 32(%rdi)
1132 ; AVX512F-NEXT: vzeroupper
1133 ; AVX512F-NEXT: retq
1135 ; AVX512BW-LABEL: PR48223:
1136 ; AVX512BW: # %bb.0:
1137 ; AVX512BW-NEXT: vmovdqa64 (%rdi), %zmm0
1138 ; AVX512BW-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
1139 ; AVX512BW-NEXT: vmovdqa64 %zmm0, (%rdi)
1140 ; AVX512BW-NEXT: vzeroupper
1141 ; AVX512BW-NEXT: retq
1142 %1 = load <32 x i16>, <32 x i16>* %p0, align 64
1143 %2 = icmp ugt <32 x i16> %1, <i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63>
1144 %3 = add <32 x i16> %1, <i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64>
1145 %4 = select <32 x i1> %2, <32 x i16> %3, <32 x i16> zeroinitializer
1146 store <32 x i16> %4, <32 x i16>* %p0, align 64