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(ptr %px, ptr %py, ptr %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>, ptr %px
242 %y = load <8 x i8>, ptr %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, ptr %pz
248 define void @v4i8(ptr %px, ptr %py, ptr %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>, ptr %px
265 %y = load <4 x i8>, ptr %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, ptr %pz
271 define void @v2i8(ptr %px, ptr %py, ptr %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>, ptr %px
314 %y = load <2 x i8>, ptr %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, ptr %pz
320 define void @v4i16(ptr %px, ptr %py, ptr %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>, ptr %px
337 %y = load <4 x i16>, ptr %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, ptr %pz
343 define void @v2i16(ptr %px, ptr %py, ptr %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>, ptr %px
360 %y = load <2 x i16>, ptr %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, ptr %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(ptr %px, ptr %py, ptr %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>, ptr %px
421 %y = load <12 x i16>, ptr %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, ptr %pz
429 define void @v1i8(ptr %px, ptr %py, ptr %pz) nounwind {
432 ; SSE-NEXT: movzbl (%rdi), %eax
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: movzbl (%rdi), %eax
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>, ptr %px
450 %y = load <1 x i8>, ptr %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, ptr %pz
456 define void @v1i16(ptr %px, ptr %py, ptr %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>, ptr %px
475 %y = load <1 x i16>, ptr %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, ptr %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 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
495 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
496 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
497 ; AVX1-NEXT: vpsubusb %xmm1, %xmm0, %xmm0
502 ; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
503 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1
504 ; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
505 ; AVX2-NEXT: vpsubusb %xmm1, %xmm0, %xmm0
508 ; AVX512-LABEL: v16i4:
510 ; AVX512-NEXT: vpbroadcastb {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
511 ; AVX512-NEXT: vpand %xmm2, %xmm1, %xmm1
512 ; AVX512-NEXT: vpand %xmm2, %xmm0, %xmm0
513 ; AVX512-NEXT: vpsubusb %xmm1, %xmm0, %xmm0
515 %z = call <16 x i4> @llvm.usub.sat.v16i4(<16 x i4> %x, <16 x i4> %y)
519 define <16 x i1> @v16i1(<16 x i1> %x, <16 x i1> %y) nounwind {
522 ; SSE-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
523 ; SSE-NEXT: andps %xmm1, %xmm0
528 ; AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
529 ; AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
534 ; AVX2-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
535 ; AVX2-NEXT: vandps %xmm1, %xmm0, %xmm0
538 ; AVX512F-LABEL: v16i1:
540 ; AVX512F-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
541 ; AVX512F-NEXT: vandps %xmm1, %xmm0, %xmm0
544 ; AVX512BW-LABEL: v16i1:
546 ; AVX512BW-NEXT: vpternlogd $96, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm0
547 ; AVX512BW-NEXT: retq
548 %z = call <16 x i1> @llvm.usub.sat.v16i1(<16 x i1> %x, <16 x i1> %y)
554 define <2 x i32> @v2i32(<2 x i32> %x, <2 x i32> %y) nounwind {
557 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
558 ; SSE2-NEXT: movdqa %xmm1, %xmm3
559 ; SSE2-NEXT: pxor %xmm2, %xmm3
560 ; SSE2-NEXT: pxor %xmm0, %xmm2
561 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm2
562 ; SSE2-NEXT: psubd %xmm1, %xmm0
563 ; SSE2-NEXT: pand %xmm2, %xmm0
566 ; SSSE3-LABEL: v2i32:
568 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
569 ; SSSE3-NEXT: movdqa %xmm1, %xmm3
570 ; SSSE3-NEXT: pxor %xmm2, %xmm3
571 ; SSSE3-NEXT: pxor %xmm0, %xmm2
572 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm2
573 ; SSSE3-NEXT: psubd %xmm1, %xmm0
574 ; SSSE3-NEXT: pand %xmm2, %xmm0
577 ; SSE41-LABEL: v2i32:
579 ; SSE41-NEXT: pmaxud %xmm1, %xmm0
580 ; SSE41-NEXT: psubd %xmm1, %xmm0
585 ; AVX-NEXT: vpmaxud %xmm1, %xmm0, %xmm0
586 ; AVX-NEXT: vpsubd %xmm1, %xmm0, %xmm0
588 %z = call <2 x i32> @llvm.usub.sat.v2i32(<2 x i32> %x, <2 x i32> %y)
592 define <4 x i32> @v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {
595 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
596 ; SSE2-NEXT: movdqa %xmm1, %xmm3
597 ; SSE2-NEXT: pxor %xmm2, %xmm3
598 ; SSE2-NEXT: pxor %xmm0, %xmm2
599 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm2
600 ; SSE2-NEXT: psubd %xmm1, %xmm0
601 ; SSE2-NEXT: pand %xmm2, %xmm0
604 ; SSSE3-LABEL: v4i32:
606 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
607 ; SSSE3-NEXT: movdqa %xmm1, %xmm3
608 ; SSSE3-NEXT: pxor %xmm2, %xmm3
609 ; SSSE3-NEXT: pxor %xmm0, %xmm2
610 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm2
611 ; SSSE3-NEXT: psubd %xmm1, %xmm0
612 ; SSSE3-NEXT: pand %xmm2, %xmm0
615 ; SSE41-LABEL: v4i32:
617 ; SSE41-NEXT: pmaxud %xmm1, %xmm0
618 ; SSE41-NEXT: psubd %xmm1, %xmm0
623 ; AVX-NEXT: vpmaxud %xmm1, %xmm0, %xmm0
624 ; AVX-NEXT: vpsubd %xmm1, %xmm0, %xmm0
626 %z = call <4 x i32> @llvm.usub.sat.v4i32(<4 x i32> %x, <4 x i32> %y)
630 define <8 x i32> @v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
633 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
634 ; SSE2-NEXT: movdqa %xmm0, %xmm5
635 ; SSE2-NEXT: psubd %xmm2, %xmm0
636 ; SSE2-NEXT: pxor %xmm4, %xmm2
637 ; SSE2-NEXT: pxor %xmm4, %xmm5
638 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm5
639 ; SSE2-NEXT: pand %xmm5, %xmm0
640 ; SSE2-NEXT: movdqa %xmm3, %xmm2
641 ; SSE2-NEXT: pxor %xmm4, %xmm2
642 ; SSE2-NEXT: pxor %xmm1, %xmm4
643 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
644 ; SSE2-NEXT: psubd %xmm3, %xmm1
645 ; SSE2-NEXT: pand %xmm4, %xmm1
648 ; SSSE3-LABEL: v8i32:
650 ; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
651 ; SSSE3-NEXT: movdqa %xmm0, %xmm5
652 ; SSSE3-NEXT: psubd %xmm2, %xmm0
653 ; SSSE3-NEXT: pxor %xmm4, %xmm2
654 ; SSSE3-NEXT: pxor %xmm4, %xmm5
655 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm5
656 ; SSSE3-NEXT: pand %xmm5, %xmm0
657 ; SSSE3-NEXT: movdqa %xmm3, %xmm2
658 ; SSSE3-NEXT: pxor %xmm4, %xmm2
659 ; SSSE3-NEXT: pxor %xmm1, %xmm4
660 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
661 ; SSSE3-NEXT: psubd %xmm3, %xmm1
662 ; SSSE3-NEXT: pand %xmm4, %xmm1
665 ; SSE41-LABEL: v8i32:
667 ; SSE41-NEXT: pmaxud %xmm2, %xmm0
668 ; SSE41-NEXT: psubd %xmm2, %xmm0
669 ; SSE41-NEXT: pmaxud %xmm3, %xmm1
670 ; SSE41-NEXT: psubd %xmm3, %xmm1
675 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
676 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
677 ; AVX1-NEXT: vpmaxud %xmm2, %xmm3, %xmm3
678 ; AVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm2
679 ; AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm0
680 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm0
681 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
686 ; AVX2-NEXT: vpmaxud %ymm1, %ymm0, %ymm0
687 ; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm0
690 ; AVX512-LABEL: v8i32:
692 ; AVX512-NEXT: vpmaxud %ymm1, %ymm0, %ymm0
693 ; AVX512-NEXT: vpsubd %ymm1, %ymm0, %ymm0
695 %z = call <8 x i32> @llvm.usub.sat.v8i32(<8 x i32> %x, <8 x i32> %y)
699 define <16 x i32> @v16i32(<16 x i32> %x, <16 x i32> %y) nounwind {
700 ; SSE2-LABEL: v16i32:
702 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
703 ; SSE2-NEXT: movdqa %xmm0, %xmm9
704 ; SSE2-NEXT: psubd %xmm4, %xmm0
705 ; SSE2-NEXT: pxor %xmm8, %xmm4
706 ; SSE2-NEXT: pxor %xmm8, %xmm9
707 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm9
708 ; SSE2-NEXT: pand %xmm9, %xmm0
709 ; SSE2-NEXT: movdqa %xmm1, %xmm4
710 ; SSE2-NEXT: psubd %xmm5, %xmm1
711 ; SSE2-NEXT: pxor %xmm8, %xmm5
712 ; SSE2-NEXT: pxor %xmm8, %xmm4
713 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm4
714 ; SSE2-NEXT: pand %xmm4, %xmm1
715 ; SSE2-NEXT: movdqa %xmm2, %xmm4
716 ; SSE2-NEXT: psubd %xmm6, %xmm2
717 ; SSE2-NEXT: pxor %xmm8, %xmm6
718 ; SSE2-NEXT: pxor %xmm8, %xmm4
719 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm4
720 ; SSE2-NEXT: pand %xmm4, %xmm2
721 ; SSE2-NEXT: movdqa %xmm7, %xmm4
722 ; SSE2-NEXT: pxor %xmm8, %xmm4
723 ; SSE2-NEXT: pxor %xmm3, %xmm8
724 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm8
725 ; SSE2-NEXT: psubd %xmm7, %xmm3
726 ; SSE2-NEXT: pand %xmm8, %xmm3
729 ; SSSE3-LABEL: v16i32:
731 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
732 ; SSSE3-NEXT: movdqa %xmm0, %xmm9
733 ; SSSE3-NEXT: psubd %xmm4, %xmm0
734 ; SSSE3-NEXT: pxor %xmm8, %xmm4
735 ; SSSE3-NEXT: pxor %xmm8, %xmm9
736 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm9
737 ; SSSE3-NEXT: pand %xmm9, %xmm0
738 ; SSSE3-NEXT: movdqa %xmm1, %xmm4
739 ; SSSE3-NEXT: psubd %xmm5, %xmm1
740 ; SSSE3-NEXT: pxor %xmm8, %xmm5
741 ; SSSE3-NEXT: pxor %xmm8, %xmm4
742 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm4
743 ; SSSE3-NEXT: pand %xmm4, %xmm1
744 ; SSSE3-NEXT: movdqa %xmm2, %xmm4
745 ; SSSE3-NEXT: psubd %xmm6, %xmm2
746 ; SSSE3-NEXT: pxor %xmm8, %xmm6
747 ; SSSE3-NEXT: pxor %xmm8, %xmm4
748 ; SSSE3-NEXT: pcmpgtd %xmm6, %xmm4
749 ; SSSE3-NEXT: pand %xmm4, %xmm2
750 ; SSSE3-NEXT: movdqa %xmm7, %xmm4
751 ; SSSE3-NEXT: pxor %xmm8, %xmm4
752 ; SSSE3-NEXT: pxor %xmm3, %xmm8
753 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm8
754 ; SSSE3-NEXT: psubd %xmm7, %xmm3
755 ; SSSE3-NEXT: pand %xmm8, %xmm3
758 ; SSE41-LABEL: v16i32:
760 ; SSE41-NEXT: pmaxud %xmm4, %xmm0
761 ; SSE41-NEXT: psubd %xmm4, %xmm0
762 ; SSE41-NEXT: pmaxud %xmm5, %xmm1
763 ; SSE41-NEXT: psubd %xmm5, %xmm1
764 ; SSE41-NEXT: pmaxud %xmm6, %xmm2
765 ; SSE41-NEXT: psubd %xmm6, %xmm2
766 ; SSE41-NEXT: pmaxud %xmm7, %xmm3
767 ; SSE41-NEXT: psubd %xmm7, %xmm3
770 ; AVX1-LABEL: v16i32:
772 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
773 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
774 ; AVX1-NEXT: vpmaxud %xmm4, %xmm5, %xmm5
775 ; AVX1-NEXT: vpsubd %xmm4, %xmm5, %xmm4
776 ; AVX1-NEXT: vpmaxud %xmm2, %xmm0, %xmm0
777 ; AVX1-NEXT: vpsubd %xmm2, %xmm0, %xmm0
778 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0
779 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2
780 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
781 ; AVX1-NEXT: vpmaxud %xmm2, %xmm4, %xmm4
782 ; AVX1-NEXT: vpsubd %xmm2, %xmm4, %xmm2
783 ; AVX1-NEXT: vpmaxud %xmm3, %xmm1, %xmm1
784 ; AVX1-NEXT: vpsubd %xmm3, %xmm1, %xmm1
785 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
788 ; AVX2-LABEL: v16i32:
790 ; AVX2-NEXT: vpmaxud %ymm2, %ymm0, %ymm0
791 ; AVX2-NEXT: vpsubd %ymm2, %ymm0, %ymm0
792 ; AVX2-NEXT: vpmaxud %ymm3, %ymm1, %ymm1
793 ; AVX2-NEXT: vpsubd %ymm3, %ymm1, %ymm1
796 ; AVX512-LABEL: v16i32:
798 ; AVX512-NEXT: vpmaxud %zmm1, %zmm0, %zmm0
799 ; AVX512-NEXT: vpsubd %zmm1, %zmm0, %zmm0
801 %z = call <16 x i32> @llvm.usub.sat.v16i32(<16 x i32> %x, <16 x i32> %y)
805 define <2 x i64> @v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {
808 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
809 ; SSE-NEXT: movdqa %xmm1, %xmm3
810 ; SSE-NEXT: pxor %xmm2, %xmm3
811 ; SSE-NEXT: pxor %xmm0, %xmm2
812 ; SSE-NEXT: movdqa %xmm2, %xmm4
813 ; SSE-NEXT: pcmpgtd %xmm3, %xmm4
814 ; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
815 ; SSE-NEXT: pcmpeqd %xmm3, %xmm2
816 ; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
817 ; SSE-NEXT: pand %xmm5, %xmm2
818 ; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
819 ; SSE-NEXT: por %xmm2, %xmm3
820 ; SSE-NEXT: psubq %xmm1, %xmm0
821 ; SSE-NEXT: pand %xmm3, %xmm0
826 ; AVX1-NEXT: vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
827 ; AVX1-NEXT: # xmm2 = mem[0,0]
828 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm3
829 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm2
830 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
831 ; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm0
832 ; AVX1-NEXT: vpand %xmm0, %xmm2, %xmm0
837 ; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
838 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm3
839 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm2
840 ; AVX2-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
841 ; AVX2-NEXT: vpsubq %xmm1, %xmm0, %xmm0
842 ; AVX2-NEXT: vpand %xmm0, %xmm2, %xmm0
845 ; AVX512F-LABEL: v2i64:
847 ; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
848 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
849 ; AVX512F-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0
850 ; AVX512F-NEXT: vpsubq %xmm1, %xmm0, %xmm0
851 ; AVX512F-NEXT: vzeroupper
854 ; AVX512BW-LABEL: v2i64:
856 ; AVX512BW-NEXT: vpmaxuq %xmm1, %xmm0, %xmm0
857 ; AVX512BW-NEXT: vpsubq %xmm1, %xmm0, %xmm0
858 ; AVX512BW-NEXT: retq
859 %z = call <2 x i64> @llvm.usub.sat.v2i64(<2 x i64> %x, <2 x i64> %y)
863 define <4 x i64> @v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
866 ; SSE-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
867 ; SSE-NEXT: movdqa %xmm0, %xmm5
868 ; SSE-NEXT: psubq %xmm2, %xmm0
869 ; SSE-NEXT: pxor %xmm4, %xmm2
870 ; SSE-NEXT: pxor %xmm4, %xmm5
871 ; SSE-NEXT: movdqa %xmm5, %xmm6
872 ; SSE-NEXT: pcmpgtd %xmm2, %xmm6
873 ; SSE-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
874 ; SSE-NEXT: pcmpeqd %xmm2, %xmm5
875 ; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
876 ; SSE-NEXT: pand %xmm7, %xmm2
877 ; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
878 ; SSE-NEXT: por %xmm2, %xmm5
879 ; SSE-NEXT: pand %xmm5, %xmm0
880 ; SSE-NEXT: movdqa %xmm3, %xmm2
881 ; SSE-NEXT: pxor %xmm4, %xmm2
882 ; SSE-NEXT: pxor %xmm1, %xmm4
883 ; SSE-NEXT: movdqa %xmm4, %xmm5
884 ; SSE-NEXT: pcmpgtd %xmm2, %xmm5
885 ; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
886 ; SSE-NEXT: pcmpeqd %xmm2, %xmm4
887 ; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
888 ; SSE-NEXT: pand %xmm6, %xmm2
889 ; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
890 ; SSE-NEXT: por %xmm2, %xmm4
891 ; SSE-NEXT: psubq %xmm3, %xmm1
892 ; SSE-NEXT: pand %xmm4, %xmm1
897 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
898 ; AVX1-NEXT: vmovddup {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
899 ; AVX1-NEXT: # xmm3 = mem[0,0]
900 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm4
901 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
902 ; AVX1-NEXT: vpxor %xmm3, %xmm5, %xmm6
903 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm4
904 ; AVX1-NEXT: vpsubq %xmm2, %xmm5, %xmm2
905 ; AVX1-NEXT: vpand %xmm2, %xmm4, %xmm2
906 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm4
907 ; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm3
908 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm3
909 ; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm0
910 ; AVX1-NEXT: vpand %xmm0, %xmm3, %xmm0
911 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
916 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
917 ; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm3
918 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm2
919 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2
920 ; AVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm0
921 ; AVX2-NEXT: vpand %ymm0, %ymm2, %ymm0
924 ; AVX512F-LABEL: v4i64:
926 ; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
927 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
928 ; AVX512F-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0
929 ; AVX512F-NEXT: vpsubq %ymm1, %ymm0, %ymm0
932 ; AVX512BW-LABEL: v4i64:
934 ; AVX512BW-NEXT: vpmaxuq %ymm1, %ymm0, %ymm0
935 ; AVX512BW-NEXT: vpsubq %ymm1, %ymm0, %ymm0
936 ; AVX512BW-NEXT: retq
937 %z = call <4 x i64> @llvm.usub.sat.v4i64(<4 x i64> %x, <4 x i64> %y)
941 define <8 x i64> @v8i64(<8 x i64> %x, <8 x i64> %y) nounwind {
944 ; SSE-NEXT: movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
945 ; SSE-NEXT: movdqa %xmm0, %xmm9
946 ; SSE-NEXT: psubq %xmm4, %xmm0
947 ; SSE-NEXT: pxor %xmm8, %xmm4
948 ; SSE-NEXT: pxor %xmm8, %xmm9
949 ; SSE-NEXT: movdqa %xmm9, %xmm10
950 ; SSE-NEXT: pcmpgtd %xmm4, %xmm10
951 ; SSE-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
952 ; SSE-NEXT: pcmpeqd %xmm4, %xmm9
953 ; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm9[1,1,3,3]
954 ; SSE-NEXT: pand %xmm11, %xmm4
955 ; SSE-NEXT: pshufd {{.*#+}} xmm9 = xmm10[1,1,3,3]
956 ; SSE-NEXT: por %xmm4, %xmm9
957 ; SSE-NEXT: pand %xmm9, %xmm0
958 ; SSE-NEXT: movdqa %xmm1, %xmm4
959 ; SSE-NEXT: psubq %xmm5, %xmm1
960 ; SSE-NEXT: pxor %xmm8, %xmm5
961 ; SSE-NEXT: pxor %xmm8, %xmm4
962 ; SSE-NEXT: movdqa %xmm4, %xmm9
963 ; SSE-NEXT: pcmpgtd %xmm5, %xmm9
964 ; SSE-NEXT: pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]
965 ; SSE-NEXT: pcmpeqd %xmm5, %xmm4
966 ; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
967 ; SSE-NEXT: pand %xmm10, %xmm4
968 ; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm9[1,1,3,3]
969 ; SSE-NEXT: por %xmm4, %xmm5
970 ; SSE-NEXT: pand %xmm5, %xmm1
971 ; SSE-NEXT: movdqa %xmm2, %xmm4
972 ; SSE-NEXT: psubq %xmm6, %xmm2
973 ; SSE-NEXT: pxor %xmm8, %xmm6
974 ; SSE-NEXT: pxor %xmm8, %xmm4
975 ; SSE-NEXT: movdqa %xmm4, %xmm5
976 ; SSE-NEXT: pcmpgtd %xmm6, %xmm5
977 ; SSE-NEXT: pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
978 ; SSE-NEXT: pcmpeqd %xmm6, %xmm4
979 ; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
980 ; SSE-NEXT: pand %xmm9, %xmm4
981 ; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
982 ; SSE-NEXT: por %xmm4, %xmm5
983 ; SSE-NEXT: pand %xmm5, %xmm2
984 ; SSE-NEXT: movdqa %xmm7, %xmm4
985 ; SSE-NEXT: pxor %xmm8, %xmm4
986 ; SSE-NEXT: pxor %xmm3, %xmm8
987 ; SSE-NEXT: movdqa %xmm8, %xmm5
988 ; SSE-NEXT: pcmpgtd %xmm4, %xmm5
989 ; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
990 ; SSE-NEXT: pcmpeqd %xmm4, %xmm8
991 ; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm8[1,1,3,3]
992 ; SSE-NEXT: pand %xmm6, %xmm4
993 ; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
994 ; SSE-NEXT: por %xmm4, %xmm5
995 ; SSE-NEXT: psubq %xmm7, %xmm3
996 ; SSE-NEXT: pand %xmm5, %xmm3
1001 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
1002 ; AVX1-NEXT: vmovddup {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808]
1003 ; AVX1-NEXT: # xmm5 = mem[0,0]
1004 ; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm6
1005 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7
1006 ; AVX1-NEXT: vpxor %xmm5, %xmm7, %xmm8
1007 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm8, %xmm6
1008 ; AVX1-NEXT: vpsubq %xmm4, %xmm7, %xmm4
1009 ; AVX1-NEXT: vpand %xmm4, %xmm6, %xmm4
1010 ; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm6
1011 ; AVX1-NEXT: vpxor %xmm5, %xmm0, %xmm7
1012 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm7, %xmm6
1013 ; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0
1014 ; AVX1-NEXT: vpand %xmm0, %xmm6, %xmm0
1015 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0
1016 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2
1017 ; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm4
1018 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6
1019 ; AVX1-NEXT: vpxor %xmm5, %xmm6, %xmm7
1020 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm7, %xmm4
1021 ; AVX1-NEXT: vpsubq %xmm2, %xmm6, %xmm2
1022 ; AVX1-NEXT: vpand %xmm2, %xmm4, %xmm2
1023 ; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm4
1024 ; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm5
1025 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4
1026 ; AVX1-NEXT: vpsubq %xmm3, %xmm1, %xmm1
1027 ; AVX1-NEXT: vpand %xmm1, %xmm4, %xmm1
1028 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
1031 ; AVX2-LABEL: v8i64:
1033 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1034 ; AVX2-NEXT: vpxor %ymm4, %ymm2, %ymm5
1035 ; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm6
1036 ; AVX2-NEXT: vpcmpgtq %ymm5, %ymm6, %ymm5
1037 ; AVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm0
1038 ; AVX2-NEXT: vpand %ymm0, %ymm5, %ymm0
1039 ; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm2
1040 ; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm4
1041 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm4, %ymm2
1042 ; AVX2-NEXT: vpsubq %ymm3, %ymm1, %ymm1
1043 ; AVX2-NEXT: vpand %ymm1, %ymm2, %ymm1
1046 ; AVX512-LABEL: v8i64:
1048 ; AVX512-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0
1049 ; AVX512-NEXT: vpsubq %zmm1, %zmm0, %zmm0
1051 %z = call <8 x i64> @llvm.usub.sat.v8i64(<8 x i64> %x, <8 x i64> %y)
1055 define <2 x i128> @v2i128(<2 x i128> %x, <2 x i128> %y) nounwind {
1056 ; SSE-LABEL: v2i128:
1058 ; SSE-NEXT: movq %rdi, %rax
1059 ; SSE-NEXT: xorl %edi, %edi
1060 ; SSE-NEXT: subq {{[0-9]+}}(%rsp), %rsi
1061 ; SSE-NEXT: sbbq {{[0-9]+}}(%rsp), %rdx
1062 ; SSE-NEXT: cmovbq %rdi, %rdx
1063 ; SSE-NEXT: cmovbq %rdi, %rsi
1064 ; SSE-NEXT: subq {{[0-9]+}}(%rsp), %rcx
1065 ; SSE-NEXT: sbbq {{[0-9]+}}(%rsp), %r8
1066 ; SSE-NEXT: cmovbq %rdi, %r8
1067 ; SSE-NEXT: cmovbq %rdi, %rcx
1068 ; SSE-NEXT: movq %r8, 24(%rax)
1069 ; SSE-NEXT: movq %rcx, 16(%rax)
1070 ; SSE-NEXT: movq %rdx, 8(%rax)
1071 ; SSE-NEXT: movq %rsi, (%rax)
1074 ; AVX-LABEL: v2i128:
1076 ; AVX-NEXT: movq %rdi, %rax
1077 ; AVX-NEXT: xorl %edi, %edi
1078 ; AVX-NEXT: subq {{[0-9]+}}(%rsp), %rsi
1079 ; AVX-NEXT: sbbq {{[0-9]+}}(%rsp), %rdx
1080 ; AVX-NEXT: cmovbq %rdi, %rdx
1081 ; AVX-NEXT: cmovbq %rdi, %rsi
1082 ; AVX-NEXT: subq {{[0-9]+}}(%rsp), %rcx
1083 ; AVX-NEXT: sbbq {{[0-9]+}}(%rsp), %r8
1084 ; AVX-NEXT: cmovbq %rdi, %r8
1085 ; AVX-NEXT: cmovbq %rdi, %rcx
1086 ; AVX-NEXT: movq %r8, 24(%rax)
1087 ; AVX-NEXT: movq %rcx, 16(%rax)
1088 ; AVX-NEXT: movq %rdx, 8(%rax)
1089 ; AVX-NEXT: movq %rsi, (%rax)
1091 %z = call <2 x i128> @llvm.usub.sat.v2i128(<2 x i128> %x, <2 x i128> %y)
1095 define void @PR48223(ptr %p0) {
1096 ; SSE-LABEL: PR48223:
1098 ; SSE-NEXT: movdqa (%rdi), %xmm0
1099 ; SSE-NEXT: movdqa 16(%rdi), %xmm1
1100 ; SSE-NEXT: movdqa 32(%rdi), %xmm2
1101 ; SSE-NEXT: movdqa 48(%rdi), %xmm3
1102 ; SSE-NEXT: movdqa {{.*#+}} xmm4 = [64,64,64,64,64,64,64,64]
1103 ; SSE-NEXT: psubusw %xmm4, %xmm1
1104 ; SSE-NEXT: psubusw %xmm4, %xmm0
1105 ; SSE-NEXT: psubusw %xmm4, %xmm3
1106 ; SSE-NEXT: psubusw %xmm4, %xmm2
1107 ; SSE-NEXT: movdqa %xmm2, 32(%rdi)
1108 ; SSE-NEXT: movdqa %xmm3, 48(%rdi)
1109 ; SSE-NEXT: movdqa %xmm0, (%rdi)
1110 ; SSE-NEXT: movdqa %xmm1, 16(%rdi)
1113 ; AVX1-LABEL: PR48223:
1115 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
1116 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1
1117 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2
1118 ; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3
1119 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [64,64,64,64,64,64,64,64]
1120 ; AVX1-NEXT: vpsubusw %xmm4, %xmm3, %xmm3
1121 ; AVX1-NEXT: vpsubusw %xmm4, %xmm2, %xmm2
1122 ; AVX1-NEXT: vpsubusw %xmm4, %xmm1, %xmm1
1123 ; AVX1-NEXT: vpsubusw %xmm4, %xmm0, %xmm0
1124 ; AVX1-NEXT: vmovdqa %xmm0, (%rdi)
1125 ; AVX1-NEXT: vmovdqa %xmm1, 16(%rdi)
1126 ; AVX1-NEXT: vmovdqa %xmm2, 32(%rdi)
1127 ; AVX1-NEXT: vmovdqa %xmm3, 48(%rdi)
1130 ; AVX2-LABEL: PR48223:
1132 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
1133 ; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1
1134 ; AVX2-NEXT: vpbroadcastw {{.*#+}} ymm2 = [64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64]
1135 ; AVX2-NEXT: vpsubusw %ymm2, %ymm1, %ymm1
1136 ; AVX2-NEXT: vpsubusw %ymm2, %ymm0, %ymm0
1137 ; AVX2-NEXT: vmovdqa %ymm0, (%rdi)
1138 ; AVX2-NEXT: vmovdqa %ymm1, 32(%rdi)
1139 ; AVX2-NEXT: vzeroupper
1142 ; AVX512F-LABEL: PR48223:
1144 ; AVX512F-NEXT: vmovdqa (%rdi), %ymm0
1145 ; AVX512F-NEXT: vmovdqa 32(%rdi), %ymm1
1146 ; AVX512F-NEXT: vpbroadcastw {{.*#+}} ymm2 = [64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64]
1147 ; AVX512F-NEXT: vpsubusw %ymm2, %ymm1, %ymm1
1148 ; AVX512F-NEXT: vpsubusw %ymm2, %ymm0, %ymm0
1149 ; AVX512F-NEXT: vmovdqa %ymm0, (%rdi)
1150 ; AVX512F-NEXT: vmovdqa %ymm1, 32(%rdi)
1151 ; AVX512F-NEXT: vzeroupper
1152 ; AVX512F-NEXT: retq
1154 ; AVX512BW-LABEL: PR48223:
1155 ; AVX512BW: # %bb.0:
1156 ; AVX512BW-NEXT: vmovdqa64 (%rdi), %zmm0
1157 ; AVX512BW-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
1158 ; AVX512BW-NEXT: vmovdqa64 %zmm0, (%rdi)
1159 ; AVX512BW-NEXT: vzeroupper
1160 ; AVX512BW-NEXT: retq
1161 %1 = load <32 x i16>, ptr %p0, align 64
1162 %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>
1163 %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>
1164 %4 = select <32 x i1> %2, <32 x i16> %3, <32 x i16> zeroinitializer
1165 store <32 x i16> %4, ptr %p0, align 64