1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefix=AVX512
4
5; This matter of this test is ensuring that vpackus* is not used for umin+trunc combination, since vpackus* input is a signed number.
6
7define <16 x i8> @usat_trunc_wb_256(<16 x i16> %i) {
8; AVX-LABEL: usat_trunc_wb_256:
9; AVX:       # %bb.0:
10; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
11; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
12; AVX-NEXT:    vpminuw %xmm2, %xmm1, %xmm1
13; AVX-NEXT:    vpminuw %xmm2, %xmm0, %xmm0
14; AVX-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
15; AVX-NEXT:    vzeroupper
16; AVX-NEXT:    retq
17;
18; AVX512-LABEL: usat_trunc_wb_256:
19; AVX512:       # %bb.0:
20; AVX512-NEXT:    vpmovuswb %ymm0, %xmm0
21; AVX512-NEXT:    vzeroupper
22; AVX512-NEXT:    retq
23  %x3 = icmp ult <16 x i16> %i, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
24  %x5 = select <16 x i1> %x3, <16 x i16> %i, <16 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
25  %x6 = trunc <16 x i16> %x5 to <16 x i8>
26  ret <16 x i8> %x6
27}
28
29define <8 x i16> @usat_trunc_dw_256(<8 x i32> %i) {
30; AVX-LABEL: usat_trunc_dw_256:
31; AVX:       # %bb.0:
32; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
33; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
34; AVX-NEXT:    vpminud %xmm2, %xmm1, %xmm1
35; AVX-NEXT:    vpminud %xmm2, %xmm0, %xmm0
36; AVX-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
37; AVX-NEXT:    vzeroupper
38; AVX-NEXT:    retq
39;
40; AVX512-LABEL: usat_trunc_dw_256:
41; AVX512:       # %bb.0:
42; AVX512-NEXT:    vpmovusdw %ymm0, %xmm0
43; AVX512-NEXT:    vzeroupper
44; AVX512-NEXT:    retq
45  %x3 = icmp ult <8 x i32> %i, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
46  %x5 = select <8 x i1> %x3, <8 x i32> %i, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
47  %x6 = trunc <8 x i32> %x5 to <8 x i16>
48  ret <8 x i16> %x6
49}
50