; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,avx512vl | FileCheck %s --check-prefixes=AVX512 define <16 x i8> @_mm_mask_packus_epi16_manual(<16 x i8> %src, i16 noundef %k, <8 x i16> %a, <8 x i16> %b) nounwind { ; AVX2-LABEL: _mm_mask_packus_epi16_manual: ; AVX2: # %bb.0: ; AVX2-NEXT: vpackuswb %xmm2, %xmm1, %xmm1 ; AVX2-NEXT: vmovd %edi, %xmm2 ; AVX2-NEXT: vpshufb {{.*#+}} xmm2 = xmm2[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1] ; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm3 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128] ; AVX2-NEXT: vpand %xmm3, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm3, %xmm2, %xmm2 ; AVX2-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0 ; AVX2-NEXT: retq ; ; AVX512-LABEL: _mm_mask_packus_epi16_manual: ; AVX512: # %bb.0: ; AVX512-NEXT: kmovd %edi, %k1 ; AVX512-NEXT: vpackuswb %xmm2, %xmm1, %xmm0 {%k1} ; AVX512-NEXT: retq %sh = shufflevector <8 x i16> %a, <8 x i16> %b, <16 x i32> %minv = tail call <16 x i16> @llvm.smax.v16i16(<16 x i16> %sh, <16 x i16> splat (i16 0)) %sat = tail call <16 x i16> @llvm.smin.v16i16(<16 x i16> %minv, <16 x i16> splat (i16 255)) %tr = trunc nuw <16 x i16> %sat to <16 x i8> %mk = bitcast i16 %k to <16 x i1> %res = select <16 x i1> %mk, <16 x i8> %tr, <16 x i8> %src ret <16 x i8> %res } define <32 x i8> @_mm256_mask_packus_epi16_manual(<32 x i8> %src, i32 noundef %k, <16 x i16> %a, <16 x i16> %b) nounwind { ; AVX2-LABEL: _mm256_mask_packus_epi16_manual: ; AVX2: # %bb.0: ; AVX2-NEXT: vpackuswb %ymm2, %ymm1, %ymm1 ; AVX2-NEXT: vmovd %edi, %xmm2 ; AVX2-NEXT: vpbroadcastd %xmm2, %ymm2 ; AVX2-NEXT: vpshufb {{.*#+}} ymm2 = ymm2[0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,9,18,18,18,18,18,18,18,18,27,27,27,27,27,27,27,27] ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128] ; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2 ; AVX2-NEXT: vpcmpeqb %ymm3, %ymm2, %ymm2 ; AVX2-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0 ; AVX2-NEXT: retq ; ; AVX512-LABEL: _mm256_mask_packus_epi16_manual: ; AVX512: # %bb.0: ; AVX512-NEXT: kmovd %edi, %k1 ; AVX512-NEXT: vpackuswb %ymm2, %ymm1, %ymm0 {%k1} ; AVX512-NEXT: retq %sh = shufflevector <16 x i16> %a, <16 x i16> %b, <32 x i32> %minv = tail call <32 x i16> @llvm.smax.v32i16(<32 x i16> %sh, <32 x i16> splat (i16 0)) %sat = tail call <32 x i16> @llvm.smin.v32i16(<32 x i16> %minv, <32 x i16> splat (i16 255)) %tr = trunc nuw <32 x i16> %sat to <32 x i8> %mk = bitcast i32 %k to <32 x i1> %res = select <32 x i1> %mk, <32 x i8> %tr, <32 x i8> %src ret <32 x i8> %res } define <64 x i8> @_mm512_mask_packus_epi16_manual(<64 x i8> %src, i64 noundef %k, <32 x i16> %a, <32 x i16> %b) nounwind { ; AVX2-LABEL: _mm512_mask_packus_epi16_manual: ; AVX2: # %bb.0: ; AVX2-NEXT: vpackuswb %ymm5, %ymm3, %ymm3 ; AVX2-NEXT: vpackuswb %ymm4, %ymm2, %ymm2 ; AVX2-NEXT: vmovq %rdi, %xmm4 ; AVX2-NEXT: vpbroadcastq %xmm4, %ymm4 ; AVX2-NEXT: vpshufb {{.*#+}} ymm5 = ymm4[0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,9,18,18,18,18,18,18,18,18,27,27,27,27,27,27,27,27] ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm6 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128] ; AVX2-NEXT: vpand %ymm6, %ymm5, %ymm5 ; AVX2-NEXT: vpcmpeqb %ymm6, %ymm5, %ymm5 ; AVX2-NEXT: vpblendvb %ymm5, %ymm2, %ymm0, %ymm0 ; AVX2-NEXT: vpshufb {{.*#+}} ymm2 = ymm4[4,4,4,4,4,4,4,4,13,13,13,13,13,13,13,13,22,22,22,22,22,22,22,22,31,31,31,31,31,31,31,31] ; AVX2-NEXT: vpand %ymm6, %ymm2, %ymm2 ; AVX2-NEXT: vpcmpeqb %ymm6, %ymm2, %ymm2 ; AVX2-NEXT: vpblendvb %ymm2, %ymm3, %ymm1, %ymm1 ; AVX2-NEXT: retq ; ; AVX512-LABEL: _mm512_mask_packus_epi16_manual: ; AVX512: # %bb.0: ; AVX512-NEXT: kmovq %rdi, %k1 ; AVX512-NEXT: vpackuswb %zmm2, %zmm1, %zmm0 {%k1} ; AVX512-NEXT: retq %sh = shufflevector <32 x i16> %a, <32 x i16> %b, <64 x i32> %minv = tail call <64 x i16> @llvm.smax.v64i16(<64 x i16> %sh, <64 x i16> splat (i16 0)) %sat = tail call <64 x i16> @llvm.smin.v64i16(<64 x i16> %minv, <64 x i16> splat (i16 255)) %tr = trunc nuw <64 x i16> %sat to <64 x i8> %mk = bitcast i64 %k to <64 x i1> %res = select <64 x i1> %mk, <64 x i8> %tr, <64 x i8> %src ret <64 x i8> %res } define <8 x i16> @_mm_mask_packus_epi32_manual(<8 x i16> %src, i8 noundef %k, <4 x i32> %a, <4 x i32> %b) nounwind { ; AVX2-LABEL: _mm_mask_packus_epi32_manual: ; AVX2: # %bb.0: ; AVX2-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 ; AVX2-NEXT: vmovd %edi, %xmm2 ; AVX2-NEXT: vpbroadcastb %xmm2, %xmm2 ; AVX2-NEXT: vpmovzxbw {{.*#+}} xmm3 = [1,2,4,8,16,32,64,128] ; AVX2-NEXT: vpand %xmm3, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqw %xmm3, %xmm2, %xmm2 ; AVX2-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0 ; AVX2-NEXT: retq ; ; AVX512-LABEL: _mm_mask_packus_epi32_manual: ; AVX512: # %bb.0: ; AVX512-NEXT: kmovd %edi, %k1 ; AVX512-NEXT: vpackusdw %xmm2, %xmm1, %xmm0 {%k1} ; AVX512-NEXT: retq %sh = shufflevector <4 x i32> %a, <4 x i32> %b, <8 x i32> %minv = tail call <8 x i32> @llvm.smax.v8i32(<8 x i32> %sh, <8 x i32> splat (i32 0)) %sat = tail call <8 x i32> @llvm.smin.v8i32(<8 x i32> %minv, <8 x i32> splat (i32 65535)) %tr = trunc nuw <8 x i32> %sat to <8 x i16> %mk = bitcast i8 %k to <8 x i1> %res = select <8 x i1> %mk, <8 x i16> %tr, <8 x i16> %src ret <8 x i16> %res } define <16 x i16> @_mm256_mask_packus_epi32_manual(<16 x i16> %src, i16 noundef %k, <8 x i32> %a, <8 x i32> %b) nounwind { ; AVX2-LABEL: _mm256_mask_packus_epi32_manual: ; AVX2: # %bb.0: ; AVX2-NEXT: vpackusdw %ymm2, %ymm1, %ymm1 ; AVX2-NEXT: vmovd %edi, %xmm2 ; AVX2-NEXT: vpbroadcastw %xmm2, %ymm2 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768] ; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2 ; AVX2-NEXT: vpcmpeqw %ymm3, %ymm2, %ymm2 ; AVX2-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0 ; AVX2-NEXT: retq ; ; AVX512-LABEL: _mm256_mask_packus_epi32_manual: ; AVX512: # %bb.0: ; AVX512-NEXT: kmovd %edi, %k1 ; AVX512-NEXT: vpackusdw %ymm2, %ymm1, %ymm0 {%k1} ; AVX512-NEXT: retq %sh = shufflevector <8 x i32> %a, <8 x i32> %b, <16 x i32> %minv = tail call <16 x i32> @llvm.smax.v16i32(<16 x i32> %sh, <16 x i32> splat (i32 0)) %sat = tail call <16 x i32> @llvm.smin.v16i32(<16 x i32> %minv, <16 x i32> splat (i32 65535)) %tr = trunc nuw <16 x i32> %sat to <16 x i16> %mk = bitcast i16 %k to <16 x i1> %res = select <16 x i1> %mk, <16 x i16> %tr, <16 x i16> %src ret <16 x i16> %res } define <32 x i16> @_mm512_mask_packus_epi32_manual(<32 x i16> %src, i32 noundef %k, <16 x i32> %a, <16 x i32> %b) nounwind { ; AVX2-LABEL: _mm512_mask_packus_epi32_manual: ; AVX2: # %bb.0: ; AVX2-NEXT: vpackusdw %ymm5, %ymm3, %ymm3 ; AVX2-NEXT: vpackusdw %ymm4, %ymm2, %ymm2 ; AVX2-NEXT: vmovd %edi, %xmm4 ; AVX2-NEXT: vpbroadcastw %xmm4, %ymm4 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768] ; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm4 ; AVX2-NEXT: vpcmpeqw %ymm5, %ymm4, %ymm4 ; AVX2-NEXT: vpblendvb %ymm4, %ymm2, %ymm0, %ymm0 ; AVX2-NEXT: shrl $16, %edi ; AVX2-NEXT: vmovd %edi, %xmm2 ; AVX2-NEXT: vpbroadcastw %xmm2, %ymm2 ; AVX2-NEXT: vpand %ymm5, %ymm2, %ymm2 ; AVX2-NEXT: vpcmpeqw %ymm5, %ymm2, %ymm2 ; AVX2-NEXT: vpblendvb %ymm2, %ymm3, %ymm1, %ymm1 ; AVX2-NEXT: retq ; ; AVX512-LABEL: _mm512_mask_packus_epi32_manual: ; AVX512: # %bb.0: ; AVX512-NEXT: kmovd %edi, %k1 ; AVX512-NEXT: vpackusdw %zmm2, %zmm1, %zmm0 {%k1} ; AVX512-NEXT: retq %sh = shufflevector <16 x i32> %a, <16 x i32> %b, <32 x i32> %minv = tail call <32 x i32> @llvm.smax.v32i32(<32 x i32> %sh, <32 x i32> splat (i32 0)) %sat = tail call <32 x i32> @llvm.smin.v32i32(<32 x i32> %minv, <32 x i32> splat (i32 65535)) %tr = trunc nuw <32 x i32> %sat to <32 x i16> %mk = bitcast i32 %k to <32 x i1> %res = select <32 x i1> %mk, <32 x i16> %tr, <32 x i16> %src ret <32 x i16> %res } declare <16 x i16> @llvm.smin.v16i16(<16 x i16>, <16 x i16>) declare <32 x i16> @llvm.smin.v32i16(<32 x i16>, <32 x i16>) declare <64 x i16> @llvm.smin.v64i16(<64 x i16>, <64 x i16>) declare <8 x i32> @llvm.smin.v8i32(<8 x i32>, <8 x i32>) declare <16 x i32> @llvm.smin.v16i32(<16 x i32>, <16 x i32>) declare <32 x i32> @llvm.smin.v32i32(<32 x i32>, <32 x i32>)