; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 ; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=X64-AVX512 ; RUN: llc < %s -mtriple=x86_64-- -mcpu=knl | FileCheck %s --check-prefixes=X64-KNL define <2 x i1> @i8_mask_extract2(i8 %mask) { ; X64-AVX512-LABEL: i8_mask_extract2: ; X64-AVX512: # %bb.0: ; X64-AVX512-NEXT: kmovd %edi, %k0 ; X64-AVX512-NEXT: vpmovm2q %k0, %xmm0 ; X64-AVX512-NEXT: retq ; ; X64-KNL-LABEL: i8_mask_extract2: ; X64-KNL: # %bb.0: ; X64-KNL-NEXT: vmovd %edi, %xmm0 ; X64-KNL-NEXT: vpbroadcastw {{.*#+}} xmm1 = [1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2] ; X64-KNL-NEXT: vpbroadcastb %xmm0, %xmm0 ; X64-KNL-NEXT: vpand %xmm1, %xmm0, %xmm0 ; X64-KNL-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 ; X64-KNL-NEXT: vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero ; X64-KNL-NEXT: retq %.splatinsert = insertelement <2 x i8> poison, i8 %mask, i64 0 %.splat = shufflevector <2 x i8> %.splatinsert, <2 x i8> poison, <2 x i32> zeroinitializer %1 = and <2 x i8> %.splat, %cmp.45 = icmp ne <2 x i8> %1, zeroinitializer ret <2 x i1> %cmp.45 } define <2 x i1> @invert_i8_mask_extract2(i8 %mask) { ; X64-AVX512-LABEL: invert_i8_mask_extract2: ; X64-AVX512: # %bb.0: ; X64-AVX512-NEXT: kmovd %edi, %k0 ; X64-AVX512-NEXT: knotw %k0, %k0 ; X64-AVX512-NEXT: vpmovm2q %k0, %xmm0 ; X64-AVX512-NEXT: retq ; ; X64-KNL-LABEL: invert_i8_mask_extract2: ; X64-KNL: # %bb.0: ; X64-KNL-NEXT: vmovd %edi, %xmm0 ; X64-KNL-NEXT: vpbroadcastb %xmm0, %xmm0 ; X64-KNL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 ; X64-KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; X64-KNL-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 ; X64-KNL-NEXT: vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero ; X64-KNL-NEXT: retq %.splatinsert = insertelement <2 x i8> poison, i8 %mask, i64 0 %.splat = shufflevector <2 x i8> %.splatinsert, <2 x i8> poison, <2 x i32> zeroinitializer %1 = and <2 x i8> %.splat, %cmp.45 = icmp eq <2 x i8> %1, zeroinitializer ret <2 x i1> %cmp.45 } define <4 x i1> @i8_mask_extract_4(i8 %mask) { ; X64-AVX512-LABEL: i8_mask_extract_4: ; X64-AVX512: # %bb.0: ; X64-AVX512-NEXT: kmovd %edi, %k0 ; X64-AVX512-NEXT: vpmovm2d %k0, %xmm0 ; X64-AVX512-NEXT: retq ; ; X64-KNL-LABEL: i8_mask_extract_4: ; X64-KNL: # %bb.0: ; X64-KNL-NEXT: vmovd %edi, %xmm0 ; X64-KNL-NEXT: vpbroadcastb %xmm0, %xmm0 ; X64-KNL-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,2,4,8,1,2,4,8,1,2,4,8,1,2,4,8] ; X64-KNL-NEXT: vpand %xmm1, %xmm0, %xmm0 ; X64-KNL-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 ; X64-KNL-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero ; X64-KNL-NEXT: retq %.splatinsert = insertelement <4 x i8> poison, i8 %mask, i64 0 %.splat = shufflevector <4 x i8> %.splatinsert, <4 x i8> poison, <4 x i32> zeroinitializer %1 = and <4 x i8> %.splat, %cmp.45 = icmp ne <4 x i8> %1, zeroinitializer ret <4 x i1> %cmp.45 } define <4 x i1> @invert_i8_mask_extract_4(i8 %mask) { ; X64-AVX512-LABEL: invert_i8_mask_extract_4: ; X64-AVX512: # %bb.0: ; X64-AVX512-NEXT: kmovd %edi, %k0 ; X64-AVX512-NEXT: knotw %k0, %k0 ; X64-AVX512-NEXT: vpmovm2d %k0, %xmm0 ; X64-AVX512-NEXT: retq ; ; X64-KNL-LABEL: invert_i8_mask_extract_4: ; X64-KNL: # %bb.0: ; X64-KNL-NEXT: vmovd %edi, %xmm0 ; X64-KNL-NEXT: vpbroadcastb %xmm0, %xmm0 ; X64-KNL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 ; X64-KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; X64-KNL-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 ; X64-KNL-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero ; X64-KNL-NEXT: retq %.splatinsert = insertelement <4 x i8> poison, i8 %mask, i64 0 %.splat = shufflevector <4 x i8> %.splatinsert, <4 x i8> poison, <4 x i32> zeroinitializer %1 = and <4 x i8> %.splat, %cmp.45 = icmp eq <4 x i8> %1, zeroinitializer ret <4 x i1> %cmp.45 } define <8 x i1> @i8_mask_extract_8(i8 %mask) { ; X64-AVX512-LABEL: i8_mask_extract_8: ; X64-AVX512: # %bb.0: ; X64-AVX512-NEXT: kmovd %edi, %k0 ; X64-AVX512-NEXT: vpmovm2w %k0, %xmm0 ; X64-AVX512-NEXT: retq ; ; X64-KNL-LABEL: i8_mask_extract_8: ; X64-KNL: # %bb.0: ; X64-KNL-NEXT: vmovd %edi, %xmm0 ; X64-KNL-NEXT: vpbroadcastb %xmm0, %xmm0 ; X64-KNL-NEXT: vpbroadcastq {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128] ; X64-KNL-NEXT: vpand %xmm1, %xmm0, %xmm0 ; X64-KNL-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 ; X64-KNL-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero ; X64-KNL-NEXT: retq %.splatinsert = insertelement <8 x i8> poison, i8 %mask, i64 0 %.splat = shufflevector <8 x i8> %.splatinsert, <8 x i8> poison, <8 x i32> zeroinitializer %1 = and <8 x i8> %.splat, %cmp.45 = icmp ne <8 x i8> %1, zeroinitializer ret <8 x i1> %cmp.45 } define <8 x i1> @invert_i8_mask_extract_8(i8 %mask) { ; X64-AVX512-LABEL: invert_i8_mask_extract_8: ; X64-AVX512: # %bb.0: ; X64-AVX512-NEXT: kmovd %edi, %k0 ; X64-AVX512-NEXT: knotb %k0, %k0 ; X64-AVX512-NEXT: vpmovm2w %k0, %xmm0 ; X64-AVX512-NEXT: retq ; ; X64-KNL-LABEL: invert_i8_mask_extract_8: ; X64-KNL: # %bb.0: ; X64-KNL-NEXT: vmovd %edi, %xmm0 ; X64-KNL-NEXT: vpbroadcastb %xmm0, %xmm0 ; X64-KNL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 ; X64-KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; X64-KNL-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 ; X64-KNL-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero ; X64-KNL-NEXT: retq %.splatinsert = insertelement <8 x i8> poison, i8 %mask, i64 0 %.splat = shufflevector <8 x i8> %.splatinsert, <8 x i8> poison, <8 x i32> zeroinitializer %1 = and <8 x i8> %.splat, %cmp.45 = icmp eq <8 x i8> %1, zeroinitializer ret <8 x i1> %cmp.45 } define <4 x i1> @i16_mask_extract_4(i16 %mask) { ; X64-AVX512-LABEL: i16_mask_extract_4: ; X64-AVX512: # %bb.0: ; X64-AVX512-NEXT: kmovd %edi, %k0 ; X64-AVX512-NEXT: vpmovm2d %k0, %xmm0 ; X64-AVX512-NEXT: retq ; ; X64-KNL-LABEL: i16_mask_extract_4: ; X64-KNL: # %bb.0: ; X64-KNL-NEXT: vmovd %edi, %xmm0 ; X64-KNL-NEXT: vpbroadcastw %xmm0, %xmm0 ; X64-KNL-NEXT: vpbroadcastq {{.*#+}} xmm1 = [1,2,4,8,1,2,4,8] ; X64-KNL-NEXT: vpand %xmm1, %xmm0, %xmm0 ; X64-KNL-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 ; X64-KNL-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero ; X64-KNL-NEXT: retq %.splatinsert = insertelement <4 x i16> poison, i16 %mask, i64 0 %.splat = shufflevector <4 x i16> %.splatinsert, <4 x i16> poison, <4 x i32> zeroinitializer %1 = and <4 x i16> %.splat, %cmp.45 = icmp ne <4 x i16> %1, zeroinitializer ret <4 x i1> %cmp.45 } define <4 x i1> @invert_i16_mask_extract_4(i16 %mask) { ; X64-AVX512-LABEL: invert_i16_mask_extract_4: ; X64-AVX512: # %bb.0: ; X64-AVX512-NEXT: kmovd %edi, %k0 ; X64-AVX512-NEXT: knotw %k0, %k0 ; X64-AVX512-NEXT: vpmovm2d %k0, %xmm0 ; X64-AVX512-NEXT: retq ; ; X64-KNL-LABEL: invert_i16_mask_extract_4: ; X64-KNL: # %bb.0: ; X64-KNL-NEXT: vmovd %edi, %xmm0 ; X64-KNL-NEXT: vpbroadcastw %xmm0, %xmm0 ; X64-KNL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 ; X64-KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; X64-KNL-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 ; X64-KNL-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero ; X64-KNL-NEXT: retq %.splatinsert = insertelement <4 x i16> poison, i16 %mask, i64 0 %.splat = shufflevector <4 x i16> %.splatinsert, <4 x i16> poison, <4 x i32> zeroinitializer %1 = and <4 x i16> %.splat, %cmp.45 = icmp eq <4 x i16> %1, zeroinitializer ret <4 x i1> %cmp.45 } define <8 x i1> @i16_mask_extract_8(i16 %mask) { ; X64-AVX512-LABEL: i16_mask_extract_8: ; X64-AVX512: # %bb.0: ; X64-AVX512-NEXT: vpbroadcastw %edi, %xmm0 ; X64-AVX512-NEXT: vmovdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128] ; X64-AVX512-NEXT: vpand %xmm1, %xmm0, %xmm0 ; X64-AVX512-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 ; X64-AVX512-NEXT: retq ; ; X64-KNL-LABEL: i16_mask_extract_8: ; X64-KNL: # %bb.0: ; X64-KNL-NEXT: vmovd %edi, %xmm0 ; X64-KNL-NEXT: vpbroadcastw %xmm0, %xmm0 ; X64-KNL-NEXT: vmovdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128] ; X64-KNL-NEXT: vpand %xmm1, %xmm0, %xmm0 ; X64-KNL-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 ; X64-KNL-NEXT: retq %.splatinsert = insertelement <8 x i16> poison, i16 %mask, i64 0 %.splat = shufflevector <8 x i16> %.splatinsert, <8 x i16> poison, <8 x i32> zeroinitializer %1 = and <8 x i16> %.splat, %cmp.45 = icmp ne <8 x i16> %1, zeroinitializer ret <8 x i1> %cmp.45 } define <8 x i1> @invert_i16_mask_extract_8(i16 %mask) { ; X64-AVX512-LABEL: invert_i16_mask_extract_8: ; X64-AVX512: # %bb.0: ; X64-AVX512-NEXT: vpbroadcastw %edi, %xmm0 ; X64-AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 ; X64-AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; X64-AVX512-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 ; X64-AVX512-NEXT: retq ; ; X64-KNL-LABEL: invert_i16_mask_extract_8: ; X64-KNL: # %bb.0: ; X64-KNL-NEXT: vmovd %edi, %xmm0 ; X64-KNL-NEXT: vpbroadcastw %xmm0, %xmm0 ; X64-KNL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 ; X64-KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; X64-KNL-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 ; X64-KNL-NEXT: retq %.splatinsert = insertelement <8 x i16> poison, i16 %mask, i64 0 %.splat = shufflevector <8 x i16> %.splatinsert, <8 x i16> poison, <8 x i32> zeroinitializer %1 = and <8 x i16> %.splat, %cmp.45 = icmp eq <8 x i16> %1, zeroinitializer ret <8 x i1> %cmp.45 } define <16 x i1> @i16_mask_extract_16(i16 %mask) { ; X64-AVX512-LABEL: i16_mask_extract_16: ; X64-AVX512: # %bb.0: ; X64-AVX512-NEXT: kmovd %edi, %k0 ; X64-AVX512-NEXT: vpmovm2b %k0, %xmm0 ; X64-AVX512-NEXT: retq ; ; X64-KNL-LABEL: i16_mask_extract_16: ; X64-KNL: # %bb.0: ; X64-KNL-NEXT: vmovd %edi, %xmm0 ; X64-KNL-NEXT: vpbroadcastw %xmm0, %ymm0 ; X64-KNL-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768] ; X64-KNL-NEXT: vpand %ymm1, %ymm0, %ymm0 ; X64-KNL-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0 ; X64-KNL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero ; X64-KNL-NEXT: vpmovdb %zmm0, %xmm0 ; X64-KNL-NEXT: retq %.splatinsert = insertelement <16 x i16> poison, i16 %mask, i64 0 %.splat = shufflevector <16 x i16> %.splatinsert, <16 x i16> poison, <16 x i32> zeroinitializer %1 = and <16 x i16> %.splat, %cmp.45 = icmp ne <16 x i16> %1, zeroinitializer ret <16 x i1> %cmp.45 } define <16 x i1> @invert_i16_mask_extract_16(i16 %mask) { ; X64-AVX512-LABEL: invert_i16_mask_extract_16: ; X64-AVX512: # %bb.0: ; X64-AVX512-NEXT: kmovd %edi, %k0 ; X64-AVX512-NEXT: knotw %k0, %k0 ; X64-AVX512-NEXT: vpmovm2b %k0, %xmm0 ; X64-AVX512-NEXT: retq ; ; X64-KNL-LABEL: invert_i16_mask_extract_16: ; X64-KNL: # %bb.0: ; X64-KNL-NEXT: vmovd %edi, %xmm0 ; X64-KNL-NEXT: vpbroadcastw %xmm0, %ymm0 ; X64-KNL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 ; X64-KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; X64-KNL-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0 ; X64-KNL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero ; X64-KNL-NEXT: vpmovdb %zmm0, %xmm0 ; X64-KNL-NEXT: retq %.splatinsert = insertelement <16 x i16> poison, i16 %mask, i64 0 %.splat = shufflevector <16 x i16> %.splatinsert, <16 x i16> poison, <16 x i32> zeroinitializer %1 = and <16 x i16> %.splat, %cmp.45 = icmp eq <16 x i16> %1, zeroinitializer ret <16 x i1> %cmp.45 } define <16 x i1> @i32_mask_extract_16(i32 %mask) { ; X64-AVX512-LABEL: i32_mask_extract_16: ; X64-AVX512: # %bb.0: ; X64-AVX512-NEXT: kmovd %edi, %k0 ; X64-AVX512-NEXT: vpmovm2b %k0, %xmm0 ; X64-AVX512-NEXT: retq ; ; X64-KNL-LABEL: i32_mask_extract_16: ; X64-KNL: # %bb.0: ; X64-KNL-NEXT: kmovw %edi, %k1 ; X64-KNL-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1 ; X64-KNL-NEXT: vpmovdb %zmm0, %xmm0 ; X64-KNL-NEXT: retq %.splatinsert = insertelement <16 x i32> poison, i32 %mask, i64 0 %.splat = shufflevector <16 x i32> %.splatinsert, <16 x i32> poison, <16 x i32> zeroinitializer %1 = and <16 x i32> %.splat, %cmp.45 = icmp ne <16 x i32> %1, zeroinitializer ret <16 x i1> %cmp.45 } define <16 x i1> @invert_i32_mask_extract_16(i32 %mask) { ; X64-AVX512-LABEL: invert_i32_mask_extract_16: ; X64-AVX512: # %bb.0: ; X64-AVX512-NEXT: kmovd %edi, %k0 ; X64-AVX512-NEXT: knotw %k0, %k0 ; X64-AVX512-NEXT: vpmovm2b %k0, %xmm0 ; X64-AVX512-NEXT: retq ; ; X64-KNL-LABEL: invert_i32_mask_extract_16: ; X64-KNL: # %bb.0: ; X64-KNL-NEXT: kmovw %edi, %k0 ; X64-KNL-NEXT: knotw %k0, %k1 ; X64-KNL-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1 ; X64-KNL-NEXT: vpmovdb %zmm0, %xmm0 ; X64-KNL-NEXT: retq %.splatinsert = insertelement <16 x i32> poison, i32 %mask, i64 0 %.splat = shufflevector <16 x i32> %.splatinsert, <16 x i32> poison, <16 x i32> zeroinitializer %1 = and <16 x i32> %.splat, %cmp.45 = icmp eq <16 x i32> %1, zeroinitializer ret <16 x i1> %cmp.45 } define <32 x i1> @i32_mask_extract_32(i32 %mask) { ; X64-AVX512-LABEL: i32_mask_extract_32: ; X64-AVX512: # %bb.0: ; X64-AVX512-NEXT: kmovd %edi, %k0 ; X64-AVX512-NEXT: kshiftrd $16, %k0, %k1 ; X64-AVX512-NEXT: kunpckwd %k0, %k1, %k0 ; X64-AVX512-NEXT: vpmovm2b %k0, %ymm0 ; X64-AVX512-NEXT: retq ; ; X64-KNL-LABEL: i32_mask_extract_32: ; X64-KNL: # %bb.0: ; X64-KNL-NEXT: kmovw %edi, %k1 ; X64-KNL-NEXT: shrl $16, %edi ; X64-KNL-NEXT: kmovw %edi, %k2 ; X64-KNL-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1 ; X64-KNL-NEXT: vpmovdb %zmm0, %xmm0 ; X64-KNL-NEXT: vpternlogd {{.*#+}} zmm1 {%k2} {z} = -1 ; X64-KNL-NEXT: vpmovdb %zmm1, %xmm1 ; X64-KNL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 ; X64-KNL-NEXT: retq %.splatinsert = insertelement <32 x i32> poison, i32 %mask, i64 0 %.splat = shufflevector <32 x i32> %.splatinsert, <32 x i32> poison, <32 x i32> zeroinitializer %1 = and <32 x i32> %.splat, %cmp.45 = icmp ne <32 x i32> %1, zeroinitializer ret <32 x i1> %cmp.45 } define <32 x i1> @invert_i32_mask_extract_32(i32 %mask) { ; X64-AVX512-LABEL: invert_i32_mask_extract_32: ; X64-AVX512: # %bb.0: ; X64-AVX512-NEXT: kmovd %edi, %k0 ; X64-AVX512-NEXT: kshiftrd $16, %k0, %k1 ; X64-AVX512-NEXT: kunpckwd %k0, %k1, %k0 ; X64-AVX512-NEXT: vpmovm2b %k0, %ymm0 ; X64-AVX512-NEXT: retq ; ; X64-KNL-LABEL: invert_i32_mask_extract_32: ; X64-KNL: # %bb.0: ; X64-KNL-NEXT: kmovw %edi, %k1 ; X64-KNL-NEXT: shrl $16, %edi ; X64-KNL-NEXT: kmovw %edi, %k2 ; X64-KNL-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1 ; X64-KNL-NEXT: vpmovdb %zmm0, %xmm0 ; X64-KNL-NEXT: vpternlogd {{.*#+}} zmm1 {%k2} {z} = -1 ; X64-KNL-NEXT: vpmovdb %zmm1, %xmm1 ; X64-KNL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 ; X64-KNL-NEXT: retq %.splatinsert = insertelement <32 x i32> poison, i32 %mask, i64 0 %.splat = shufflevector <32 x i32> %.splatinsert, <32 x i32> poison, <32 x i32> zeroinitializer %1 = and <32 x i32> %.splat, %cmp.45 = icmp ne <32 x i32> %1, zeroinitializer ret <32 x i1> %cmp.45 } define <32 x i1> @i64_mask_extract_32(i64 %mask) { ; X64-AVX512-LABEL: i64_mask_extract_32: ; X64-AVX512: # %bb.0: ; X64-AVX512-NEXT: kmovq %rdi, %k0 ; X64-AVX512-NEXT: kshiftrd $8, %k0, %k1 ; X64-AVX512-NEXT: kunpckbw %k0, %k1, %k1 ; X64-AVX512-NEXT: kshiftrd $16, %k0, %k2 ; X64-AVX512-NEXT: kshiftrd $24, %k0, %k0 ; X64-AVX512-NEXT: kunpckbw %k2, %k0, %k0 ; X64-AVX512-NEXT: kunpckwd %k1, %k0, %k0 ; X64-AVX512-NEXT: vpmovm2b %k0, %ymm0 ; X64-AVX512-NEXT: retq ; ; X64-KNL-LABEL: i64_mask_extract_32: ; X64-KNL: # %bb.0: ; X64-KNL-NEXT: movl %edi, %eax ; X64-KNL-NEXT: shrl $16, %eax ; X64-KNL-NEXT: kmovw %eax, %k0 ; X64-KNL-NEXT: movl %edi, %eax ; X64-KNL-NEXT: shrl $24, %eax ; X64-KNL-NEXT: kmovw %eax, %k1 ; X64-KNL-NEXT: kunpckbw %k0, %k1, %k1 ; X64-KNL-NEXT: kmovw %edi, %k0 ; X64-KNL-NEXT: shrl $8, %edi ; X64-KNL-NEXT: kmovw %edi, %k2 ; X64-KNL-NEXT: kunpckbw %k0, %k2, %k2 ; X64-KNL-NEXT: vpternlogd {{.*#+}} zmm0 {%k2} {z} = -1 ; X64-KNL-NEXT: vpmovdb %zmm0, %xmm0 ; X64-KNL-NEXT: vpternlogd {{.*#+}} zmm1 {%k1} {z} = -1 ; X64-KNL-NEXT: vpmovdb %zmm1, %xmm1 ; X64-KNL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 ; X64-KNL-NEXT: retq %.splatinsert = insertelement <32 x i64> poison, i64 %mask, i64 0 %.splat = shufflevector <32 x i64> %.splatinsert, <32 x i64> poison, <32 x i32> zeroinitializer %1 = and <32 x i64> %.splat, %cmp.45 = icmp ne <32 x i64> %1, zeroinitializer ret <32 x i1> %cmp.45 } define <32 x i1> @invert_i64_mask_extract_32(i64 %mask) { ; X64-AVX512-LABEL: invert_i64_mask_extract_32: ; X64-AVX512: # %bb.0: ; X64-AVX512-NEXT: kmovq %rdi, %k0 ; X64-AVX512-NEXT: knotb %k0, %k1 ; X64-AVX512-NEXT: kshiftrd $8, %k0, %k2 ; X64-AVX512-NEXT: knotb %k2, %k2 ; X64-AVX512-NEXT: kunpckbw %k1, %k2, %k1 ; X64-AVX512-NEXT: kshiftrd $16, %k0, %k2 ; X64-AVX512-NEXT: knotb %k2, %k2 ; X64-AVX512-NEXT: kshiftrd $24, %k0, %k0 ; X64-AVX512-NEXT: knotb %k0, %k0 ; X64-AVX512-NEXT: kunpckbw %k2, %k0, %k0 ; X64-AVX512-NEXT: kunpckwd %k1, %k0, %k0 ; X64-AVX512-NEXT: vpmovm2b %k0, %ymm0 ; X64-AVX512-NEXT: retq ; ; X64-KNL-LABEL: invert_i64_mask_extract_32: ; X64-KNL: # %bb.0: ; X64-KNL-NEXT: movl %edi, %eax ; X64-KNL-NEXT: shrl $16, %eax ; X64-KNL-NEXT: kmovw %eax, %k0 ; X64-KNL-NEXT: knotw %k0, %k0 ; X64-KNL-NEXT: movl %edi, %eax ; X64-KNL-NEXT: shrl $24, %eax ; X64-KNL-NEXT: kmovw %eax, %k1 ; X64-KNL-NEXT: knotw %k1, %k1 ; X64-KNL-NEXT: kunpckbw %k0, %k1, %k1 ; X64-KNL-NEXT: kmovw %edi, %k0 ; X64-KNL-NEXT: knotw %k0, %k0 ; X64-KNL-NEXT: shrl $8, %edi ; X64-KNL-NEXT: kmovw %edi, %k2 ; X64-KNL-NEXT: knotw %k2, %k2 ; X64-KNL-NEXT: kunpckbw %k0, %k2, %k2 ; X64-KNL-NEXT: vpternlogd {{.*#+}} zmm0 {%k2} {z} = -1 ; X64-KNL-NEXT: vpmovdb %zmm0, %xmm0 ; X64-KNL-NEXT: vpternlogd {{.*#+}} zmm1 {%k1} {z} = -1 ; X64-KNL-NEXT: vpmovdb %zmm1, %xmm1 ; X64-KNL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 ; X64-KNL-NEXT: retq %.splatinsert = insertelement <32 x i64> poison, i64 %mask, i64 0 %.splat = shufflevector <32 x i64> %.splatinsert, <32 x i64> poison, <32 x i32> zeroinitializer %1 = and <32 x i64> %.splat, %cmp.45 = icmp eq <32 x i64> %1, zeroinitializer ret <32 x i1> %cmp.45 } define <64 x i1> @i64_mask_extract_64(i64 %mask) { ; X64-AVX512-LABEL: i64_mask_extract_64: ; X64-AVX512: # %bb.0: ; X64-AVX512-NEXT: kmovq %rdi, %k0 ; X64-AVX512-NEXT: kshiftrq $32, %k0, %k1 ; X64-AVX512-NEXT: kshiftrq $40, %k0, %k2 ; X64-AVX512-NEXT: kunpckbw %k1, %k2, %k1 ; X64-AVX512-NEXT: kshiftrq $48, %k0, %k2 ; X64-AVX512-NEXT: kshiftrq $56, %k0, %k3 ; X64-AVX512-NEXT: kunpckbw %k2, %k3, %k2 ; X64-AVX512-NEXT: kunpckwd %k1, %k2, %k1 ; X64-AVX512-NEXT: kshiftrd $8, %k0, %k2 ; X64-AVX512-NEXT: kunpckbw %k0, %k2, %k2 ; X64-AVX512-NEXT: kshiftrd $16, %k0, %k3 ; X64-AVX512-NEXT: kshiftrd $24, %k0, %k0 ; X64-AVX512-NEXT: kunpckbw %k3, %k0, %k0 ; X64-AVX512-NEXT: kunpckwd %k2, %k0, %k0 ; X64-AVX512-NEXT: kunpckdq %k0, %k1, %k0 ; X64-AVX512-NEXT: vpmovm2b %k0, %zmm0 ; X64-AVX512-NEXT: retq ; ; X64-KNL-LABEL: i64_mask_extract_64: ; X64-KNL: # %bb.0: ; X64-KNL-NEXT: movq %rdi, %rax ; X64-KNL-NEXT: kmovw %esi, %k0 ; X64-KNL-NEXT: movl %esi, %ecx ; X64-KNL-NEXT: shrl $8, %ecx ; X64-KNL-NEXT: kmovw %ecx, %k1 ; X64-KNL-NEXT: kunpckbw %k0, %k1, %k0 ; X64-KNL-NEXT: movl %esi, %ecx ; X64-KNL-NEXT: shrl $16, %ecx ; X64-KNL-NEXT: kmovw %ecx, %k1 ; X64-KNL-NEXT: movl %esi, %ecx ; X64-KNL-NEXT: shrl $24, %ecx ; X64-KNL-NEXT: kmovw %ecx, %k2 ; X64-KNL-NEXT: kunpckbw %k1, %k2, %k1 ; X64-KNL-NEXT: movq %rsi, %rcx ; X64-KNL-NEXT: shrq $32, %rcx ; X64-KNL-NEXT: kmovw %ecx, %k2 ; X64-KNL-NEXT: movq %rsi, %rcx ; X64-KNL-NEXT: shrq $40, %rcx ; X64-KNL-NEXT: kmovw %ecx, %k3 ; X64-KNL-NEXT: kunpckbw %k2, %k3, %k2 ; X64-KNL-NEXT: movq %rsi, %rcx ; X64-KNL-NEXT: shrq $48, %rcx ; X64-KNL-NEXT: kmovw %ecx, %k3 ; X64-KNL-NEXT: shrq $56, %rsi ; X64-KNL-NEXT: kmovw %esi, %k4 ; X64-KNL-NEXT: kunpckbw %k3, %k4, %k3 ; X64-KNL-NEXT: kmovw %k3, 6(%rdi) ; X64-KNL-NEXT: kmovw %k2, 4(%rdi) ; X64-KNL-NEXT: kmovw %k1, 2(%rdi) ; X64-KNL-NEXT: kmovw %k0, (%rdi) ; X64-KNL-NEXT: retq %.splatinsert = insertelement <64 x i64> poison, i64 %mask, i64 0 %.splat = shufflevector <64 x i64> %.splatinsert, <64 x i64> poison, <64 x i32> zeroinitializer %1 = and <64 x i64> %.splat, %cmp.45 = icmp ne <64 x i64> %1, zeroinitializer ret <64 x i1> %cmp.45 } define <64 x i1> @invert_i64_mask_extract_64(i64 %mask) { ; X64-AVX512-LABEL: invert_i64_mask_extract_64: ; X64-AVX512: # %bb.0: ; X64-AVX512-NEXT: kmovq %rdi, %k0 ; X64-AVX512-NEXT: kshiftrq $32, %k0, %k1 ; X64-AVX512-NEXT: knotb %k1, %k1 ; X64-AVX512-NEXT: kshiftrq $40, %k0, %k2 ; X64-AVX512-NEXT: knotb %k2, %k2 ; X64-AVX512-NEXT: kunpckbw %k1, %k2, %k1 ; X64-AVX512-NEXT: kshiftrq $48, %k0, %k2 ; X64-AVX512-NEXT: knotb %k2, %k2 ; X64-AVX512-NEXT: kshiftrq $56, %k0, %k3 ; X64-AVX512-NEXT: knotb %k3, %k3 ; X64-AVX512-NEXT: kunpckbw %k2, %k3, %k2 ; X64-AVX512-NEXT: kunpckwd %k1, %k2, %k1 ; X64-AVX512-NEXT: knotb %k0, %k2 ; X64-AVX512-NEXT: kshiftrd $8, %k0, %k3 ; X64-AVX512-NEXT: knotb %k3, %k3 ; X64-AVX512-NEXT: kunpckbw %k2, %k3, %k2 ; X64-AVX512-NEXT: kshiftrd $16, %k0, %k3 ; X64-AVX512-NEXT: knotb %k3, %k3 ; X64-AVX512-NEXT: kshiftrd $24, %k0, %k0 ; X64-AVX512-NEXT: knotb %k0, %k0 ; X64-AVX512-NEXT: kunpckbw %k3, %k0, %k0 ; X64-AVX512-NEXT: kunpckwd %k2, %k0, %k0 ; X64-AVX512-NEXT: kunpckdq %k0, %k1, %k0 ; X64-AVX512-NEXT: vpmovm2b %k0, %zmm0 ; X64-AVX512-NEXT: retq ; ; X64-KNL-LABEL: invert_i64_mask_extract_64: ; X64-KNL: # %bb.0: ; X64-KNL-NEXT: movq %rdi, %rax ; X64-KNL-NEXT: kmovw %esi, %k0 ; X64-KNL-NEXT: knotw %k0, %k0 ; X64-KNL-NEXT: movl %esi, %ecx ; X64-KNL-NEXT: shrl $8, %ecx ; X64-KNL-NEXT: kmovw %ecx, %k1 ; X64-KNL-NEXT: knotw %k1, %k1 ; X64-KNL-NEXT: kunpckbw %k0, %k1, %k0 ; X64-KNL-NEXT: movl %esi, %ecx ; X64-KNL-NEXT: shrl $16, %ecx ; X64-KNL-NEXT: kmovw %ecx, %k1 ; X64-KNL-NEXT: knotw %k1, %k1 ; X64-KNL-NEXT: movl %esi, %ecx ; X64-KNL-NEXT: shrl $24, %ecx ; X64-KNL-NEXT: kmovw %ecx, %k2 ; X64-KNL-NEXT: knotw %k2, %k2 ; X64-KNL-NEXT: kunpckbw %k1, %k2, %k1 ; X64-KNL-NEXT: movq %rsi, %rcx ; X64-KNL-NEXT: shrq $32, %rcx ; X64-KNL-NEXT: kmovw %ecx, %k2 ; X64-KNL-NEXT: knotw %k2, %k2 ; X64-KNL-NEXT: movq %rsi, %rcx ; X64-KNL-NEXT: shrq $40, %rcx ; X64-KNL-NEXT: kmovw %ecx, %k3 ; X64-KNL-NEXT: knotw %k3, %k3 ; X64-KNL-NEXT: kunpckbw %k2, %k3, %k2 ; X64-KNL-NEXT: movq %rsi, %rcx ; X64-KNL-NEXT: shrq $48, %rcx ; X64-KNL-NEXT: kmovw %ecx, %k3 ; X64-KNL-NEXT: knotw %k3, %k3 ; X64-KNL-NEXT: shrq $56, %rsi ; X64-KNL-NEXT: kmovw %esi, %k4 ; X64-KNL-NEXT: knotw %k4, %k4 ; X64-KNL-NEXT: kunpckbw %k3, %k4, %k3 ; X64-KNL-NEXT: kmovw %k3, 6(%rdi) ; X64-KNL-NEXT: kmovw %k2, 4(%rdi) ; X64-KNL-NEXT: kmovw %k1, 2(%rdi) ; X64-KNL-NEXT: kmovw %k0, (%rdi) ; X64-KNL-NEXT: retq %.splatinsert = insertelement <64 x i64> poison, i64 %mask, i64 0 %.splat = shufflevector <64 x i64> %.splatinsert, <64 x i64> poison, <64 x i32> zeroinitializer %1 = and <64 x i64> %.splat, %cmp.45 = icmp eq <64 x i64> %1, zeroinitializer ret <64 x i1> %cmp.45 }