949 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512F3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefix=AVX512VL --check-prefix=AVX512VL-FAST-ALL4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefix=AVX512VL --check-prefix=AVX512VL-FAST-PERLANE5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+avx512dq,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefix=VL_BW_DQ --check-prefix=VL_BW_DQ-FAST-ALL6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+avx512dq,+fast-variable-perlane-shuffle | FileCheck %s --check-prefix=VL_BW_DQ --check-prefix=VL_BW_DQ-FAST-PERLANE7 8define <2 x i1> @shuf2i1_1_0(<2 x i1> %a) {9; AVX512F-LABEL: shuf2i1_1_0:10; AVX512F: # %bb.0:11; AVX512F-NEXT: vpsllq $63, %xmm0, %xmm012; AVX512F-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]13; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k114; AVX512F-NEXT: vpternlogq {{.*#+}} zmm0 {%k1} {z} = -115; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm016; AVX512F-NEXT: vzeroupper17; AVX512F-NEXT: retq18;19; AVX512VL-LABEL: shuf2i1_1_0:20; AVX512VL: # %bb.0:21; AVX512VL-NEXT: vpsllq $63, %xmm0, %xmm022; AVX512VL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]23; AVX512VL-NEXT: vptestmq %xmm0, %xmm0, %k124; AVX512VL-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm025; AVX512VL-NEXT: vmovdqa64 %xmm0, %xmm0 {%k1} {z}26; AVX512VL-NEXT: retq27;28; VL_BW_DQ-LABEL: shuf2i1_1_0:29; VL_BW_DQ: # %bb.0:30; VL_BW_DQ-NEXT: vpsllq $63, %xmm0, %xmm031; VL_BW_DQ-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]32; VL_BW_DQ-NEXT: vpmovq2m %xmm0, %k033; VL_BW_DQ-NEXT: vpmovm2q %k0, %xmm034; VL_BW_DQ-NEXT: retq35 %b = shufflevector <2 x i1> %a, <2 x i1> undef, <2 x i32> <i32 1, i32 0>36 ret <2 x i1> %b37}38 39define <2 x i1> @shuf2i1_1_2(<2 x i1> %a) {40; AVX512F-LABEL: shuf2i1_1_2:41; AVX512F: # %bb.0:42; AVX512F-NEXT: vpsllq $63, %xmm0, %xmm043; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k144; AVX512F-NEXT: vpternlogq {{.*#+}} zmm0 {%k1} {z} = -145; AVX512F-NEXT: vpmovsxbq {{.*#+}} xmm1 = [18446744073709551615,0]46; AVX512F-NEXT: vpalignr {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]47; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k148; AVX512F-NEXT: vpternlogq {{.*#+}} zmm0 {%k1} {z} = -149; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm050; AVX512F-NEXT: vzeroupper51; AVX512F-NEXT: retq52;53; AVX512VL-LABEL: shuf2i1_1_2:54; AVX512VL: # %bb.0:55; AVX512VL-NEXT: vpsllq $63, %xmm0, %xmm056; AVX512VL-NEXT: vptestmq %xmm0, %xmm0, %k157; AVX512VL-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm058; AVX512VL-NEXT: vmovdqa64 %xmm0, %xmm1 {%k1} {z}59; AVX512VL-NEXT: vpmovsxbq {{.*#+}} xmm2 = [18446744073709551615,0]60; AVX512VL-NEXT: vpalignr {{.*#+}} xmm1 = xmm1[8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4,5,6,7]61; AVX512VL-NEXT: vptestmq %xmm1, %xmm1, %k162; AVX512VL-NEXT: vmovdqa64 %xmm0, %xmm0 {%k1} {z}63; AVX512VL-NEXT: retq64;65; VL_BW_DQ-LABEL: shuf2i1_1_2:66; VL_BW_DQ: # %bb.0:67; VL_BW_DQ-NEXT: vpsllq $63, %xmm0, %xmm068; VL_BW_DQ-NEXT: vpmovq2m %xmm0, %k069; VL_BW_DQ-NEXT: vpmovm2q %k0, %xmm070; VL_BW_DQ-NEXT: vpmovsxbq {{.*#+}} xmm1 = [18446744073709551615,0]71; VL_BW_DQ-NEXT: vpalignr {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]72; VL_BW_DQ-NEXT: vpmovq2m %xmm0, %k073; VL_BW_DQ-NEXT: vpmovm2q %k0, %xmm074; VL_BW_DQ-NEXT: retq75 %b = shufflevector <2 x i1> %a, <2 x i1> <i1 1, i1 0>, <2 x i32> <i32 1, i32 2>76 ret <2 x i1> %b77}78 79 80define <4 x i1> @shuf4i1_3_2_10(<4 x i1> %a) {81; AVX512F-LABEL: shuf4i1_3_2_10:82; AVX512F: # %bb.0:83; AVX512F-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]84; AVX512F-NEXT: vpslld $31, %xmm0, %xmm085; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k186; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -187; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm088; AVX512F-NEXT: vzeroupper89; AVX512F-NEXT: retq90;91; AVX512VL-LABEL: shuf4i1_3_2_10:92; AVX512VL: # %bb.0:93; AVX512VL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]94; AVX512VL-NEXT: vpslld $31, %xmm0, %xmm095; AVX512VL-NEXT: vptestmd %xmm0, %xmm0, %k196; AVX512VL-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm097; AVX512VL-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}98; AVX512VL-NEXT: retq99;100; VL_BW_DQ-LABEL: shuf4i1_3_2_10:101; VL_BW_DQ: # %bb.0:102; VL_BW_DQ-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]103; VL_BW_DQ-NEXT: vpslld $31, %xmm0, %xmm0104; VL_BW_DQ-NEXT: vpmovd2m %xmm0, %k0105; VL_BW_DQ-NEXT: vpmovm2d %k0, %xmm0106; VL_BW_DQ-NEXT: retq107 %b = shufflevector <4 x i1> %a, <4 x i1> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0>108 ret <4 x i1> %b109}110 111define <8 x i1> @shuf8i1_3_6_1_0_3_7_7_0(<8 x i64> %a, <8 x i64> %b, <8 x i64> %a1, <8 x i64> %b1) {112; AVX512F-LABEL: shuf8i1_3_6_1_0_3_7_7_0:113; AVX512F: # %bb.0:114; AVX512F-NEXT: vpmovsxbq {{.*#+}} zmm1 = [3,6,1,0,3,7,7,0]115; AVX512F-NEXT: vpermq %zmm2, %zmm1, %zmm2116; AVX512F-NEXT: vpermq %zmm0, %zmm1, %zmm0117; AVX512F-NEXT: vpcmpeqq %zmm2, %zmm0, %k1118; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1119; AVX512F-NEXT: vpmovdw %zmm0, %ymm0120; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0121; AVX512F-NEXT: vzeroupper122; AVX512F-NEXT: retq123;124; AVX512VL-LABEL: shuf8i1_3_6_1_0_3_7_7_0:125; AVX512VL: # %bb.0:126; AVX512VL-NEXT: vpmovsxbq {{.*#+}} zmm1 = [3,6,1,0,3,7,7,0]127; AVX512VL-NEXT: vpermq %zmm2, %zmm1, %zmm2128; AVX512VL-NEXT: vpermq %zmm0, %zmm1, %zmm0129; AVX512VL-NEXT: vpcmpeqq %zmm2, %zmm0, %k1130; AVX512VL-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0131; AVX512VL-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}132; AVX512VL-NEXT: vpmovdw %ymm0, %xmm0133; AVX512VL-NEXT: vzeroupper134; AVX512VL-NEXT: retq135;136; VL_BW_DQ-LABEL: shuf8i1_3_6_1_0_3_7_7_0:137; VL_BW_DQ: # %bb.0:138; VL_BW_DQ-NEXT: vpmovsxbq {{.*#+}} zmm1 = [3,6,1,0,3,7,7,0]139; VL_BW_DQ-NEXT: vpermq %zmm2, %zmm1, %zmm2140; VL_BW_DQ-NEXT: vpermq %zmm0, %zmm1, %zmm0141; VL_BW_DQ-NEXT: vpcmpeqq %zmm2, %zmm0, %k0142; VL_BW_DQ-NEXT: vpmovm2w %k0, %xmm0143; VL_BW_DQ-NEXT: vzeroupper144; VL_BW_DQ-NEXT: retq145 %a2 = icmp eq <8 x i64> %a, %a1146 %b2 = icmp eq <8 x i64> %b, %b1147 %c = shufflevector <8 x i1> %a2, <8 x i1> %b2, <8 x i32> <i32 3, i32 6, i32 1, i32 0, i32 3, i32 7, i32 7, i32 0>148 ret <8 x i1> %c149}150 151define <16 x i1> @shuf16i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0(<16 x i32> %a, <16 x i32> %b, <16 x i32> %a1, <16 x i32> %b1) {152; AVX512F-LABEL: shuf16i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0:153; AVX512F: # %bb.0:154; AVX512F-NEXT: vpcmpeqd %zmm2, %zmm0, %k1155; AVX512F-NEXT: vpcmpeqd %zmm3, %zmm1, %k2156; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k2} {z} = -1157; AVX512F-NEXT: vpternlogd {{.*#+}} zmm1 {%k1} {z} = -1158; AVX512F-NEXT: vpmovsxbd {{.*#+}} zmm2 = [3,6,22,12,3,7,7,0,3,6,1,13,3,21,7,0]159; AVX512F-NEXT: vpermi2d %zmm0, %zmm1, %zmm2160; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k1161; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1162; AVX512F-NEXT: vpmovdb %zmm0, %xmm0163; AVX512F-NEXT: vzeroupper164; AVX512F-NEXT: retq165;166; AVX512VL-LABEL: shuf16i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0:167; AVX512VL: # %bb.0:168; AVX512VL-NEXT: vpcmpeqd %zmm2, %zmm0, %k1169; AVX512VL-NEXT: vpcmpeqd %zmm3, %zmm1, %k2170; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm0 {%k2} {z} = -1171; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm1 {%k1} {z} = -1172; AVX512VL-NEXT: vpmovsxbd {{.*#+}} zmm2 = [3,6,22,12,3,7,7,0,3,6,1,13,3,21,7,0]173; AVX512VL-NEXT: vpermi2d %zmm0, %zmm1, %zmm2174; AVX512VL-NEXT: vptestmd %zmm2, %zmm2, %k1175; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1176; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0177; AVX512VL-NEXT: vzeroupper178; AVX512VL-NEXT: retq179;180; VL_BW_DQ-LABEL: shuf16i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0:181; VL_BW_DQ: # %bb.0:182; VL_BW_DQ-NEXT: vpcmpeqd %zmm2, %zmm0, %k0183; VL_BW_DQ-NEXT: vpcmpeqd %zmm3, %zmm1, %k1184; VL_BW_DQ-NEXT: vpmovm2d %k1, %zmm0185; VL_BW_DQ-NEXT: vpmovm2d %k0, %zmm1186; VL_BW_DQ-NEXT: vpmovsxbd {{.*#+}} zmm2 = [3,6,22,12,3,7,7,0,3,6,1,13,3,21,7,0]187; VL_BW_DQ-NEXT: vpermi2d %zmm0, %zmm1, %zmm2188; VL_BW_DQ-NEXT: vpmovd2m %zmm2, %k0189; VL_BW_DQ-NEXT: vpmovm2b %k0, %xmm0190; VL_BW_DQ-NEXT: vzeroupper191; VL_BW_DQ-NEXT: retq192 %a2 = icmp eq <16 x i32> %a, %a1193 %b2 = icmp eq <16 x i32> %b, %b1194 %c = shufflevector <16 x i1> %a2, <16 x i1> %b2, <16 x i32> <i32 3, i32 6, i32 22, i32 12, i32 3, i32 7, i32 7, i32 0, i32 3, i32 6, i32 1, i32 13, i32 3, i32 21, i32 7, i32 0>195 ret <16 x i1> %c196}197 198define <32 x i1> @shuf32i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0(<32 x i1> %a) {199; AVX512F-LABEL: shuf32i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0:200; AVX512F: # %bb.0:201; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm1202; AVX512F-NEXT: vpslld $31, %zmm1, %zmm1203; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k1204; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0205; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0206; AVX512F-NEXT: vpslld $31, %zmm0, %zmm0207; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k2208; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k2} {z} = -1209; AVX512F-NEXT: vpternlogd {{.*#+}} zmm1 {%k1} {z} = -1210; AVX512F-NEXT: vpmovsxbd {{.*#+}} zmm2 = [3,6,22,12,3,7,7,0,3,6,1,13,3,21,7,0]211; AVX512F-NEXT: vpermi2d %zmm0, %zmm1, %zmm2212; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k1213; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1214; AVX512F-NEXT: vpmovdb %zmm0, %xmm0215; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm0216; AVX512F-NEXT: retq217;218; AVX512VL-LABEL: shuf32i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0:219; AVX512VL: # %bb.0:220; AVX512VL-NEXT: vpmovsxbd %xmm0, %zmm1221; AVX512VL-NEXT: vpslld $31, %zmm1, %zmm1222; AVX512VL-NEXT: vptestmd %zmm1, %zmm1, %k1223; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm0224; AVX512VL-NEXT: vpmovsxbd %xmm0, %zmm0225; AVX512VL-NEXT: vpslld $31, %zmm0, %zmm0226; AVX512VL-NEXT: vptestmd %zmm0, %zmm0, %k2227; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm0 {%k2} {z} = -1228; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm1 {%k1} {z} = -1229; AVX512VL-NEXT: vpmovsxbd {{.*#+}} zmm2 = [3,6,22,12,3,7,7,0,3,6,1,13,3,21,7,0]230; AVX512VL-NEXT: vpermi2d %zmm0, %zmm1, %zmm2231; AVX512VL-NEXT: vptestmd %zmm2, %zmm2, %k1232; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1233; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0234; AVX512VL-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm0235; AVX512VL-NEXT: retq236;237; VL_BW_DQ-LABEL: shuf32i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0:238; VL_BW_DQ: # %bb.0:239; VL_BW_DQ-NEXT: vpsllw $7, %ymm0, %ymm0240; VL_BW_DQ-NEXT: vpmovb2m %ymm0, %k0241; VL_BW_DQ-NEXT: vpmovm2w %k0, %zmm0242; VL_BW_DQ-NEXT: vbroadcasti64x4 {{.*#+}} zmm1 = [3,6,22,12,3,7,7,0,3,6,1,13,3,21,7,0,3,6,22,12,3,7,7,0,3,6,1,13,3,21,7,0]243; VL_BW_DQ-NEXT: # zmm1 = mem[0,1,2,3,0,1,2,3]244; VL_BW_DQ-NEXT: vpermw %zmm0, %zmm1, %zmm0245; VL_BW_DQ-NEXT: vpmovw2m %zmm0, %k0246; VL_BW_DQ-NEXT: vpmovm2b %k0, %ymm0247; VL_BW_DQ-NEXT: retq248 %b = shufflevector <32 x i1> %a, <32 x i1> undef, <32 x i32> <i32 3, i32 6, i32 22, i32 12, i32 3, i32 7, i32 7, i32 0, i32 3, i32 6, i32 1, i32 13, i32 3, i32 21, i32 7, i32 0, i32 3, i32 6, i32 22, i32 12, i32 3, i32 7, i32 7, i32 0, i32 3, i32 6, i32 1, i32 13, i32 3, i32 21, i32 7, i32 0>249 ret <32 x i1> %b250}251 252define <32 x i16> @shuf32i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_icmp_v32i16(<32 x i16> %a, <32 x i16> %c, <32 x i16> %d) {253; AVX512F-LABEL: shuf32i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_icmp_v32i16:254; AVX512F: # %bb.0:255; AVX512F-NEXT: vpxor %xmm3, %xmm3, %xmm3256; AVX512F-NEXT: vpcmpeqw %ymm3, %ymm0, %ymm4257; AVX512F-NEXT: vpmovsxwd %ymm4, %zmm4258; AVX512F-NEXT: vptestmd %zmm4, %zmm4, %k1259; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm0260; AVX512F-NEXT: vpcmpeqw %ymm3, %ymm0, %ymm0261; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0262; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k2263; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k2} {z} = -1264; AVX512F-NEXT: vpternlogd {{.*#+}} zmm3 {%k1} {z} = -1265; AVX512F-NEXT: vpmovsxbd {{.*#+}} zmm4 = [3,6,22,12,3,7,7,0,3,6,1,13,3,21,7,0]266; AVX512F-NEXT: vpermi2d %zmm0, %zmm3, %zmm4267; AVX512F-NEXT: vptestmd %zmm4, %zmm4, %k1268; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1269; AVX512F-NEXT: vpmovdw %zmm0, %ymm0270; AVX512F-NEXT: vinserti64x4 $1, %ymm0, %zmm0, %zmm0271; AVX512F-NEXT: vpternlogq {{.*#+}} zmm0 = zmm2 ^ (zmm0 & (zmm1 ^ zmm2))272; AVX512F-NEXT: retq273;274; AVX512VL-LABEL: shuf32i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_icmp_v32i16:275; AVX512VL: # %bb.0:276; AVX512VL-NEXT: vpxor %xmm3, %xmm3, %xmm3277; AVX512VL-NEXT: vpcmpeqw %ymm3, %ymm0, %ymm4278; AVX512VL-NEXT: vpmovsxwd %ymm4, %zmm4279; AVX512VL-NEXT: vptestmd %zmm4, %zmm4, %k1280; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm0281; AVX512VL-NEXT: vpcmpeqw %ymm3, %ymm0, %ymm0282; AVX512VL-NEXT: vpmovsxwd %ymm0, %zmm0283; AVX512VL-NEXT: vptestmd %zmm0, %zmm0, %k2284; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm0 {%k2} {z} = -1285; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm3 {%k1} {z} = -1286; AVX512VL-NEXT: vpmovsxbd {{.*#+}} zmm4 = [3,6,22,12,3,7,7,0,3,6,1,13,3,21,7,0]287; AVX512VL-NEXT: vpermi2d %zmm0, %zmm3, %zmm4288; AVX512VL-NEXT: vptestmd %zmm4, %zmm4, %k1289; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1290; AVX512VL-NEXT: vpmovdw %zmm0, %ymm0291; AVX512VL-NEXT: vinserti64x4 $1, %ymm0, %zmm0, %zmm0292; AVX512VL-NEXT: vpternlogq {{.*#+}} zmm0 = zmm2 ^ (zmm0 & (zmm1 ^ zmm2))293; AVX512VL-NEXT: retq294;295; VL_BW_DQ-LABEL: shuf32i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_icmp_v32i16:296; VL_BW_DQ: # %bb.0:297; VL_BW_DQ-NEXT: vptestnmw %zmm0, %zmm0, %k0298; VL_BW_DQ-NEXT: vpmovm2w %k0, %zmm0299; VL_BW_DQ-NEXT: vbroadcasti64x4 {{.*#+}} zmm3 = [3,6,22,12,3,7,7,0,3,6,1,13,3,21,7,0,3,6,22,12,3,7,7,0,3,6,1,13,3,21,7,0]300; VL_BW_DQ-NEXT: # zmm3 = mem[0,1,2,3,0,1,2,3]301; VL_BW_DQ-NEXT: vpermw %zmm0, %zmm3, %zmm0302; VL_BW_DQ-NEXT: vpmovw2m %zmm0, %k1303; VL_BW_DQ-NEXT: vpblendmw %zmm1, %zmm2, %zmm0 {%k1}304; VL_BW_DQ-NEXT: retq305 %cmp = icmp eq <32 x i16> %a, zeroinitializer306 %shuf = shufflevector <32 x i1> %cmp, <32 x i1> undef, <32 x i32> <i32 3, i32 6, i32 22, i32 12, i32 3, i32 7, i32 7, i32 0, i32 3, i32 6, i32 1, i32 13, i32 3, i32 21, i32 7, i32 0, i32 3, i32 6, i32 22, i32 12, i32 3, i32 7, i32 7, i32 0, i32 3, i32 6, i32 1, i32 13, i32 3, i32 21, i32 7, i32 0>307 %sel = select <32 x i1> %shuf, <32 x i16> %c, <32 x i16> %d308 ret <32 x i16> %sel309}310 311define <32 x i8> @shuf32i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_icmp_v32i8(<32 x i8> %a, <32 x i8> %c, <32 x i8> %d) {312; AVX512F-LABEL: shuf32i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_icmp_v32i8:313; AVX512F: # %bb.0:314; AVX512F-NEXT: vpxor %xmm3, %xmm3, %xmm3315; AVX512F-NEXT: vpcmpeqb %ymm3, %ymm0, %ymm0316; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm3317; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k1318; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0319; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0320; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k2321; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k2} {z} = -1322; AVX512F-NEXT: vpternlogd {{.*#+}} zmm3 {%k1} {z} = -1323; AVX512F-NEXT: vpmovsxbd {{.*#+}} zmm4 = [3,6,22,12,3,7,7,0,3,6,1,13,3,21,7,0]324; AVX512F-NEXT: vpermi2d %zmm0, %zmm3, %zmm4325; AVX512F-NEXT: vptestmd %zmm4, %zmm4, %k1326; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1327; AVX512F-NEXT: vpmovdb %zmm0, %xmm0328; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm0329; AVX512F-NEXT: vpblendvb %ymm0, %ymm1, %ymm2, %ymm0330; AVX512F-NEXT: retq331;332; AVX512VL-LABEL: shuf32i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_icmp_v32i8:333; AVX512VL: # %bb.0:334; AVX512VL-NEXT: vpxor %xmm3, %xmm3, %xmm3335; AVX512VL-NEXT: vpcmpeqb %ymm3, %ymm0, %ymm0336; AVX512VL-NEXT: vpmovsxbd %xmm0, %zmm3337; AVX512VL-NEXT: vptestmd %zmm3, %zmm3, %k1338; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm0339; AVX512VL-NEXT: vpmovsxbd %xmm0, %zmm0340; AVX512VL-NEXT: vptestmd %zmm0, %zmm0, %k2341; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm0 {%k2} {z} = -1342; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm3 {%k1} {z} = -1343; AVX512VL-NEXT: vpmovsxbd {{.*#+}} zmm4 = [3,6,22,12,3,7,7,0,3,6,1,13,3,21,7,0]344; AVX512VL-NEXT: vpermi2d %zmm0, %zmm3, %zmm4345; AVX512VL-NEXT: vptestmd %zmm4, %zmm4, %k1346; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1347; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0348; AVX512VL-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm0349; AVX512VL-NEXT: vpternlogq {{.*#+}} ymm0 = ymm2 ^ (ymm0 & (ymm1 ^ ymm2))350; AVX512VL-NEXT: retq351;352; VL_BW_DQ-LABEL: shuf32i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_icmp_v32i8:353; VL_BW_DQ: # %bb.0:354; VL_BW_DQ-NEXT: vptestnmb %ymm0, %ymm0, %k0355; VL_BW_DQ-NEXT: vpmovm2w %k0, %zmm0356; VL_BW_DQ-NEXT: vbroadcasti64x4 {{.*#+}} zmm3 = [3,6,22,12,3,7,7,0,3,6,1,13,3,21,7,0,3,6,22,12,3,7,7,0,3,6,1,13,3,21,7,0]357; VL_BW_DQ-NEXT: # zmm3 = mem[0,1,2,3,0,1,2,3]358; VL_BW_DQ-NEXT: vpermw %zmm0, %zmm3, %zmm0359; VL_BW_DQ-NEXT: vpmovw2m %zmm0, %k1360; VL_BW_DQ-NEXT: vpblendmb %ymm1, %ymm2, %ymm0 {%k1}361; VL_BW_DQ-NEXT: retq362 %cmp = icmp eq <32 x i8> %a, zeroinitializer363 %shuf = shufflevector <32 x i1> %cmp, <32 x i1> undef, <32 x i32> <i32 3, i32 6, i32 22, i32 12, i32 3, i32 7, i32 7, i32 0, i32 3, i32 6, i32 1, i32 13, i32 3, i32 21, i32 7, i32 0, i32 3, i32 6, i32 22, i32 12, i32 3, i32 7, i32 7, i32 0, i32 3, i32 6, i32 1, i32 13, i32 3, i32 21, i32 7, i32 0>364 %sel = select <32 x i1> %shuf, <32 x i8> %c, <32 x i8> %d365 ret <32 x i8> %sel366}367 368define <32 x i16> @shuf32i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_icmp_v32i16_split(<16 x i32> %a, <16 x i32> %b, <32 x i16> %c, <32 x i16> %d) {369; AVX512F-LABEL: shuf32i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_icmp_v32i16_split:370; AVX512F: # %bb.0:371; AVX512F-NEXT: vptestnmd %zmm0, %zmm0, %k1372; AVX512F-NEXT: vptestnmd %zmm1, %zmm1, %k2373; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k2} {z} = -1374; AVX512F-NEXT: vpternlogd {{.*#+}} zmm1 {%k1} {z} = -1375; AVX512F-NEXT: vpmovsxbd {{.*#+}} zmm4 = [3,6,22,12,3,7,7,0,3,6,1,13,3,21,7,0]376; AVX512F-NEXT: vpermi2d %zmm0, %zmm1, %zmm4377; AVX512F-NEXT: vptestmd %zmm4, %zmm4, %k1378; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1379; AVX512F-NEXT: vpmovdw %zmm0, %ymm0380; AVX512F-NEXT: vinserti64x4 $1, %ymm0, %zmm0, %zmm0381; AVX512F-NEXT: vpternlogq {{.*#+}} zmm0 = zmm3 ^ (zmm0 & (zmm2 ^ zmm3))382; AVX512F-NEXT: retq383;384; AVX512VL-LABEL: shuf32i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_icmp_v32i16_split:385; AVX512VL: # %bb.0:386; AVX512VL-NEXT: vptestnmd %zmm0, %zmm0, %k1387; AVX512VL-NEXT: vptestnmd %zmm1, %zmm1, %k2388; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm0 {%k2} {z} = -1389; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm1 {%k1} {z} = -1390; AVX512VL-NEXT: vpmovsxbd {{.*#+}} zmm4 = [3,6,22,12,3,7,7,0,3,6,1,13,3,21,7,0]391; AVX512VL-NEXT: vpermi2d %zmm0, %zmm1, %zmm4392; AVX512VL-NEXT: vptestmd %zmm4, %zmm4, %k1393; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1394; AVX512VL-NEXT: vpmovdw %zmm0, %ymm0395; AVX512VL-NEXT: vinserti64x4 $1, %ymm0, %zmm0, %zmm0396; AVX512VL-NEXT: vpternlogq {{.*#+}} zmm0 = zmm3 ^ (zmm0 & (zmm2 ^ zmm3))397; AVX512VL-NEXT: retq398;399; VL_BW_DQ-LABEL: shuf32i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_icmp_v32i16_split:400; VL_BW_DQ: # %bb.0:401; VL_BW_DQ-NEXT: vptestnmd %zmm0, %zmm0, %k0402; VL_BW_DQ-NEXT: vptestnmd %zmm1, %zmm1, %k1403; VL_BW_DQ-NEXT: kunpckwd %k0, %k1, %k0404; VL_BW_DQ-NEXT: vpmovm2w %k0, %zmm0405; VL_BW_DQ-NEXT: vbroadcasti64x4 {{.*#+}} zmm1 = [3,6,22,12,3,7,7,0,3,6,1,13,3,21,7,0,3,6,22,12,3,7,7,0,3,6,1,13,3,21,7,0]406; VL_BW_DQ-NEXT: # zmm1 = mem[0,1,2,3,0,1,2,3]407; VL_BW_DQ-NEXT: vpermw %zmm0, %zmm1, %zmm0408; VL_BW_DQ-NEXT: vpmovw2m %zmm0, %k1409; VL_BW_DQ-NEXT: vpblendmw %zmm2, %zmm3, %zmm0 {%k1}410; VL_BW_DQ-NEXT: retq411 %cmp1 = icmp eq <16 x i32> %a, zeroinitializer412 %cmp2 = icmp eq <16 x i32> %b, zeroinitializer413 %concat = shufflevector <16 x i1> %cmp1, <16 x i1> %cmp2, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>414 %shuf = shufflevector <32 x i1> %concat, <32 x i1> undef, <32 x i32> <i32 3, i32 6, i32 22, i32 12, i32 3, i32 7, i32 7, i32 0, i32 3, i32 6, i32 1, i32 13, i32 3, i32 21, i32 7, i32 0, i32 3, i32 6, i32 22, i32 12, i32 3, i32 7, i32 7, i32 0, i32 3, i32 6, i32 1, i32 13, i32 3, i32 21, i32 7, i32 0>415 %sel = select <32 x i1> %shuf, <32 x i16> %c, <32 x i16> %d416 ret <32 x i16> %sel417}418 419define <32 x i8> @shuf32i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_icmp_v32i8_split(<16 x i32> %a, <16 x i32> %b, <32 x i8> %c, <32 x i8> %d) {420; AVX512F-LABEL: shuf32i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_icmp_v32i8_split:421; AVX512F: # %bb.0:422; AVX512F-NEXT: vptestnmd %zmm0, %zmm0, %k1423; AVX512F-NEXT: vptestnmd %zmm1, %zmm1, %k2424; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k2} {z} = -1425; AVX512F-NEXT: vpternlogd {{.*#+}} zmm1 {%k1} {z} = -1426; AVX512F-NEXT: vpmovsxbd {{.*#+}} zmm4 = [3,6,22,12,3,7,7,0,3,6,1,13,3,21,7,0]427; AVX512F-NEXT: vpermi2d %zmm0, %zmm1, %zmm4428; AVX512F-NEXT: vptestmd %zmm4, %zmm4, %k1429; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1430; AVX512F-NEXT: vpmovdb %zmm0, %xmm0431; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm0432; AVX512F-NEXT: vpblendvb %ymm0, %ymm2, %ymm3, %ymm0433; AVX512F-NEXT: retq434;435; AVX512VL-LABEL: shuf32i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_icmp_v32i8_split:436; AVX512VL: # %bb.0:437; AVX512VL-NEXT: vptestnmd %zmm0, %zmm0, %k1438; AVX512VL-NEXT: vptestnmd %zmm1, %zmm1, %k2439; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm0 {%k2} {z} = -1440; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm1 {%k1} {z} = -1441; AVX512VL-NEXT: vpmovsxbd {{.*#+}} zmm4 = [3,6,22,12,3,7,7,0,3,6,1,13,3,21,7,0]442; AVX512VL-NEXT: vpermi2d %zmm0, %zmm1, %zmm4443; AVX512VL-NEXT: vptestmd %zmm4, %zmm4, %k1444; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1445; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0446; AVX512VL-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm0447; AVX512VL-NEXT: vpternlogq {{.*#+}} ymm0 = ymm3 ^ (ymm0 & (ymm2 ^ ymm3))448; AVX512VL-NEXT: retq449;450; VL_BW_DQ-LABEL: shuf32i1_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_3_6_22_12_3_7_7_0_3_6_1_13_3_21_7_0_icmp_v32i8_split:451; VL_BW_DQ: # %bb.0:452; VL_BW_DQ-NEXT: vptestnmd %zmm0, %zmm0, %k0453; VL_BW_DQ-NEXT: vptestnmd %zmm1, %zmm1, %k1454; VL_BW_DQ-NEXT: kunpckwd %k0, %k1, %k0455; VL_BW_DQ-NEXT: vpmovm2w %k0, %zmm0456; VL_BW_DQ-NEXT: vbroadcasti64x4 {{.*#+}} zmm1 = [3,6,22,12,3,7,7,0,3,6,1,13,3,21,7,0,3,6,22,12,3,7,7,0,3,6,1,13,3,21,7,0]457; VL_BW_DQ-NEXT: # zmm1 = mem[0,1,2,3,0,1,2,3]458; VL_BW_DQ-NEXT: vpermw %zmm0, %zmm1, %zmm0459; VL_BW_DQ-NEXT: vpmovw2m %zmm0, %k1460; VL_BW_DQ-NEXT: vpblendmb %ymm2, %ymm3, %ymm0 {%k1}461; VL_BW_DQ-NEXT: retq462 %cmp1 = icmp eq <16 x i32> %a, zeroinitializer463 %cmp2 = icmp eq <16 x i32> %b, zeroinitializer464 %concat = shufflevector <16 x i1> %cmp1, <16 x i1> %cmp2, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>465 %shuf = shufflevector <32 x i1> %concat, <32 x i1> undef, <32 x i32> <i32 3, i32 6, i32 22, i32 12, i32 3, i32 7, i32 7, i32 0, i32 3, i32 6, i32 1, i32 13, i32 3, i32 21, i32 7, i32 0, i32 3, i32 6, i32 22, i32 12, i32 3, i32 7, i32 7, i32 0, i32 3, i32 6, i32 1, i32 13, i32 3, i32 21, i32 7, i32 0>466 %sel = select <32 x i1> %shuf, <32 x i8> %c, <32 x i8> %d467 ret <32 x i8> %sel468}469 470define <8 x i1> @shuf8i1_u_2_u_u_2_u_2_u(i8 %a) {471; AVX512F-LABEL: shuf8i1_u_2_u_u_2_u_2_u:472; AVX512F: # %bb.0:473; AVX512F-NEXT: kmovw %edi, %k1474; AVX512F-NEXT: vpternlogq {{.*#+}} zmm0 {%k1} {z} = -1475; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0476; AVX512F-NEXT: vpbroadcastq %xmm0, %zmm0477; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0478; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k1479; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1480; AVX512F-NEXT: vpmovdw %zmm0, %ymm0481; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0482; AVX512F-NEXT: vzeroupper483; AVX512F-NEXT: retq484;485; AVX512VL-FAST-ALL-LABEL: shuf8i1_u_2_u_u_2_u_2_u:486; AVX512VL-FAST-ALL: # %bb.0:487; AVX512VL-FAST-ALL-NEXT: kmovw %edi, %k1488; AVX512VL-FAST-ALL-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0489; AVX512VL-FAST-ALL-NEXT: vmovdqa32 %ymm0, %ymm1 {%k1} {z}490; AVX512VL-FAST-ALL-NEXT: vpbroadcastd {{.*#+}} ymm2 = [2,2,2,2,2,2,2,2]491; AVX512VL-FAST-ALL-NEXT: vpermd %ymm1, %ymm2, %ymm1492; AVX512VL-FAST-ALL-NEXT: vpslld $31, %ymm1, %ymm1493; AVX512VL-FAST-ALL-NEXT: vptestmd %ymm1, %ymm1, %k1494; AVX512VL-FAST-ALL-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}495; AVX512VL-FAST-ALL-NEXT: vpmovdw %ymm0, %xmm0496; AVX512VL-FAST-ALL-NEXT: vzeroupper497; AVX512VL-FAST-ALL-NEXT: retq498;499; AVX512VL-FAST-PERLANE-LABEL: shuf8i1_u_2_u_u_2_u_2_u:500; AVX512VL-FAST-PERLANE: # %bb.0:501; AVX512VL-FAST-PERLANE-NEXT: kmovw %edi, %k1502; AVX512VL-FAST-PERLANE-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0503; AVX512VL-FAST-PERLANE-NEXT: vmovdqa32 %ymm0, %ymm1 {%k1} {z}504; AVX512VL-FAST-PERLANE-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]505; AVX512VL-FAST-PERLANE-NEXT: vpbroadcastd %xmm1, %ymm1506; AVX512VL-FAST-PERLANE-NEXT: vpslld $31, %ymm1, %ymm1507; AVX512VL-FAST-PERLANE-NEXT: vptestmd %ymm1, %ymm1, %k1508; AVX512VL-FAST-PERLANE-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}509; AVX512VL-FAST-PERLANE-NEXT: vpmovdw %ymm0, %xmm0510; AVX512VL-FAST-PERLANE-NEXT: vzeroupper511; AVX512VL-FAST-PERLANE-NEXT: retq512;513; VL_BW_DQ-FAST-ALL-LABEL: shuf8i1_u_2_u_u_2_u_2_u:514; VL_BW_DQ-FAST-ALL: # %bb.0:515; VL_BW_DQ-FAST-ALL-NEXT: kmovd %edi, %k0516; VL_BW_DQ-FAST-ALL-NEXT: vpmovm2d %k0, %ymm0517; VL_BW_DQ-FAST-ALL-NEXT: vpbroadcastd {{.*#+}} ymm1 = [2,2,2,2,2,2,2,2]518; VL_BW_DQ-FAST-ALL-NEXT: vpermd %ymm0, %ymm1, %ymm0519; VL_BW_DQ-FAST-ALL-NEXT: vpmovd2m %ymm0, %k0520; VL_BW_DQ-FAST-ALL-NEXT: vpmovm2w %k0, %xmm0521; VL_BW_DQ-FAST-ALL-NEXT: vzeroupper522; VL_BW_DQ-FAST-ALL-NEXT: retq523;524; VL_BW_DQ-FAST-PERLANE-LABEL: shuf8i1_u_2_u_u_2_u_2_u:525; VL_BW_DQ-FAST-PERLANE: # %bb.0:526; VL_BW_DQ-FAST-PERLANE-NEXT: kmovd %edi, %k0527; VL_BW_DQ-FAST-PERLANE-NEXT: vpmovm2d %k0, %ymm0528; VL_BW_DQ-FAST-PERLANE-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]529; VL_BW_DQ-FAST-PERLANE-NEXT: vpbroadcastd %xmm0, %ymm0530; VL_BW_DQ-FAST-PERLANE-NEXT: vpmovd2m %ymm0, %k0531; VL_BW_DQ-FAST-PERLANE-NEXT: vpmovm2w %k0, %xmm0532; VL_BW_DQ-FAST-PERLANE-NEXT: vzeroupper533; VL_BW_DQ-FAST-PERLANE-NEXT: retq534 %b = bitcast i8 %a to <8 x i1>535 %c = shufflevector < 8 x i1> %b, <8 x i1>undef, <8 x i32> <i32 undef, i32 2, i32 undef, i32 undef, i32 2, i32 undef, i32 2, i32 undef>536 ret <8 x i1> %c537}538 539define i8 @shuf8i1_10_2_9_u_3_u_2_u(i8 %a) {540; AVX512F-LABEL: shuf8i1_10_2_9_u_3_u_2_u:541; AVX512F: # %bb.0:542; AVX512F-NEXT: kmovw %edi, %k1543; AVX512F-NEXT: vpternlogq {{.*#+}} zmm0 {%k1} {z} = -1544; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1545; AVX512F-NEXT: vpmovsxbq {{.*#+}} zmm2 = [8,2,10,0,3,0,2,0]546; AVX512F-NEXT: vpermi2q %zmm1, %zmm0, %zmm2547; AVX512F-NEXT: vpsllq $63, %zmm2, %zmm0548; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k0549; AVX512F-NEXT: kmovw %k0, %eax550; AVX512F-NEXT: # kill: def $al killed $al killed $eax551; AVX512F-NEXT: vzeroupper552; AVX512F-NEXT: retq553;554; AVX512VL-LABEL: shuf8i1_10_2_9_u_3_u_2_u:555; AVX512VL: # %bb.0:556; AVX512VL-NEXT: kmovw %edi, %k1557; AVX512VL-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0558; AVX512VL-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}559; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1560; AVX512VL-NEXT: vpmovsxbd {{.*#+}} ymm2 = [8,2,10,3,3,2,2,3]561; AVX512VL-NEXT: vpermi2d %ymm1, %ymm0, %ymm2562; AVX512VL-NEXT: vpslld $31, %ymm2, %ymm0563; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k0564; AVX512VL-NEXT: kmovw %k0, %eax565; AVX512VL-NEXT: # kill: def $al killed $al killed $eax566; AVX512VL-NEXT: vzeroupper567; AVX512VL-NEXT: retq568;569; VL_BW_DQ-LABEL: shuf8i1_10_2_9_u_3_u_2_u:570; VL_BW_DQ: # %bb.0:571; VL_BW_DQ-NEXT: kmovd %edi, %k0572; VL_BW_DQ-NEXT: vpmovm2d %k0, %ymm0573; VL_BW_DQ-NEXT: vpxor %xmm1, %xmm1, %xmm1574; VL_BW_DQ-NEXT: vpmovsxbd {{.*#+}} ymm2 = [8,2,10,3,3,2,2,3]575; VL_BW_DQ-NEXT: vpermi2d %ymm1, %ymm0, %ymm2576; VL_BW_DQ-NEXT: vpmovd2m %ymm2, %k0577; VL_BW_DQ-NEXT: kmovd %k0, %eax578; VL_BW_DQ-NEXT: # kill: def $al killed $al killed $eax579; VL_BW_DQ-NEXT: vzeroupper580; VL_BW_DQ-NEXT: retq581 %b = bitcast i8 %a to <8 x i1>582 %c = shufflevector < 8 x i1> %b, <8 x i1> zeroinitializer, <8 x i32> <i32 10, i32 2, i32 9, i32 undef, i32 3, i32 undef, i32 2, i32 undef>583 %d = bitcast <8 x i1> %c to i8584 ret i8 %d585}586 587define i8 @shuf8i1_0_1_4_5_u_u_u_u(i8 %a) {588; AVX512F-LABEL: shuf8i1_0_1_4_5_u_u_u_u:589; AVX512F: # %bb.0:590; AVX512F-NEXT: kmovw %edi, %k1591; AVX512F-NEXT: vpternlogq {{.*#+}} zmm0 {%k1} {z} = -1592; AVX512F-NEXT: vshufi64x2 {{.*#+}} zmm0 = zmm0[0,1,4,5,4,5,6,7]593; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0594; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k0595; AVX512F-NEXT: kmovw %k0, %eax596; AVX512F-NEXT: # kill: def $al killed $al killed $eax597; AVX512F-NEXT: vzeroupper598; AVX512F-NEXT: retq599;600; AVX512VL-LABEL: shuf8i1_0_1_4_5_u_u_u_u:601; AVX512VL: # %bb.0:602; AVX512VL-NEXT: kmovw %edi, %k1603; AVX512VL-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0604; AVX512VL-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}605; AVX512VL-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]606; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0607; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k0608; AVX512VL-NEXT: kmovw %k0, %eax609; AVX512VL-NEXT: # kill: def $al killed $al killed $eax610; AVX512VL-NEXT: vzeroupper611; AVX512VL-NEXT: retq612;613; VL_BW_DQ-LABEL: shuf8i1_0_1_4_5_u_u_u_u:614; VL_BW_DQ: # %bb.0:615; VL_BW_DQ-NEXT: kmovd %edi, %k0616; VL_BW_DQ-NEXT: vpmovm2d %k0, %ymm0617; VL_BW_DQ-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]618; VL_BW_DQ-NEXT: vpmovd2m %ymm0, %k0619; VL_BW_DQ-NEXT: kmovd %k0, %eax620; VL_BW_DQ-NEXT: # kill: def $al killed $al killed $eax621; VL_BW_DQ-NEXT: vzeroupper622; VL_BW_DQ-NEXT: retq623 %b = bitcast i8 %a to <8 x i1>624 %c = shufflevector < 8 x i1> %b, <8 x i1> undef, <8 x i32> <i32 0, i32 1, i32 4, i32 5, i32 undef, i32 undef, i32 undef, i32 undef>625 %d = bitcast <8 x i1> %c to i8626 ret i8 %d627}628 629define i8 @shuf8i1_9_6_1_0_3_7_7_0(i8 %a) {630; AVX512F-LABEL: shuf8i1_9_6_1_0_3_7_7_0:631; AVX512F: # %bb.0:632; AVX512F-NEXT: kmovw %edi, %k1633; AVX512F-NEXT: vpternlogq {{.*#+}} zmm0 {%k1} {z} = -1634; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1635; AVX512F-NEXT: vpmovsxbq {{.*#+}} zmm2 = [8,6,1,0,3,7,7,0]636; AVX512F-NEXT: vpermi2q %zmm1, %zmm0, %zmm2637; AVX512F-NEXT: vptestmq %zmm2, %zmm2, %k0638; AVX512F-NEXT: kmovw %k0, %eax639; AVX512F-NEXT: # kill: def $al killed $al killed $eax640; AVX512F-NEXT: vzeroupper641; AVX512F-NEXT: retq642;643; AVX512VL-LABEL: shuf8i1_9_6_1_0_3_7_7_0:644; AVX512VL: # %bb.0:645; AVX512VL-NEXT: kmovw %edi, %k1646; AVX512VL-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0647; AVX512VL-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}648; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1649; AVX512VL-NEXT: vpmovsxbd {{.*#+}} ymm2 = [8,6,1,0,3,7,7,0]650; AVX512VL-NEXT: vpermi2d %ymm1, %ymm0, %ymm2651; AVX512VL-NEXT: vptestmd %ymm2, %ymm2, %k0652; AVX512VL-NEXT: kmovw %k0, %eax653; AVX512VL-NEXT: # kill: def $al killed $al killed $eax654; AVX512VL-NEXT: vzeroupper655; AVX512VL-NEXT: retq656;657; VL_BW_DQ-LABEL: shuf8i1_9_6_1_0_3_7_7_0:658; VL_BW_DQ: # %bb.0:659; VL_BW_DQ-NEXT: kmovd %edi, %k0660; VL_BW_DQ-NEXT: vpmovm2d %k0, %ymm0661; VL_BW_DQ-NEXT: vpxor %xmm1, %xmm1, %xmm1662; VL_BW_DQ-NEXT: vpmovsxbd {{.*#+}} ymm2 = [8,6,1,0,3,7,7,0]663; VL_BW_DQ-NEXT: vpermi2d %ymm1, %ymm0, %ymm2664; VL_BW_DQ-NEXT: vpmovd2m %ymm2, %k0665; VL_BW_DQ-NEXT: kmovd %k0, %eax666; VL_BW_DQ-NEXT: # kill: def $al killed $al killed $eax667; VL_BW_DQ-NEXT: vzeroupper668; VL_BW_DQ-NEXT: retq669 %b = bitcast i8 %a to <8 x i1>670 %c = shufflevector <8 x i1> %b, <8 x i1> zeroinitializer, <8 x i32> <i32 9, i32 6, i32 1, i32 0, i32 3, i32 7, i32 7, i32 0>671 %d = bitcast <8 x i1>%c to i8672 ret i8 %d673}674 675define i8 @shuf8i1_9_6_1_10_3_7_7_0(i8 %a) {676; AVX512F-LABEL: shuf8i1_9_6_1_10_3_7_7_0:677; AVX512F: # %bb.0:678; AVX512F-NEXT: kmovw %edi, %k1679; AVX512F-NEXT: vpternlogq {{.*#+}} zmm0 {%k1} {z} = -1680; AVX512F-NEXT: vpmovsxbq {{.*#+}} zmm1 = [9,1,2,10,4,5,6,7]681; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2682; AVX512F-NEXT: vpermt2q %zmm0, %zmm1, %zmm2683; AVX512F-NEXT: vptestmq %zmm2, %zmm2, %k0684; AVX512F-NEXT: kmovw %k0, %eax685; AVX512F-NEXT: # kill: def $al killed $al killed $eax686; AVX512F-NEXT: vzeroupper687; AVX512F-NEXT: retq688;689; AVX512VL-LABEL: shuf8i1_9_6_1_10_3_7_7_0:690; AVX512VL: # %bb.0:691; AVX512VL-NEXT: kmovw %edi, %k1692; AVX512VL-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0693; AVX512VL-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}694; AVX512VL-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[4,5,6,7],zero,zero,zero,zero,zero,zero,zero,zero,ymm0[8,9,10,11],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero695; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k0696; AVX512VL-NEXT: kmovw %k0, %eax697; AVX512VL-NEXT: # kill: def $al killed $al killed $eax698; AVX512VL-NEXT: vzeroupper699; AVX512VL-NEXT: retq700;701; VL_BW_DQ-LABEL: shuf8i1_9_6_1_10_3_7_7_0:702; VL_BW_DQ: # %bb.0:703; VL_BW_DQ-NEXT: kmovd %edi, %k0704; VL_BW_DQ-NEXT: vpmovm2d %k0, %ymm0705; VL_BW_DQ-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[4,5,6,7],zero,zero,zero,zero,zero,zero,zero,zero,ymm0[8,9,10,11],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero706; VL_BW_DQ-NEXT: vpmovd2m %ymm0, %k0707; VL_BW_DQ-NEXT: kmovd %k0, %eax708; VL_BW_DQ-NEXT: # kill: def $al killed $al killed $eax709; VL_BW_DQ-NEXT: vzeroupper710; VL_BW_DQ-NEXT: retq711 %b = bitcast i8 %a to <8 x i1>712 %c = shufflevector <8 x i1> zeroinitializer, <8 x i1> %b, <8 x i32> <i32 9, i32 6, i32 1, i32 10, i32 3, i32 7, i32 7, i32 0>713 %d = bitcast <8 x i1>%c to i8714 ret i8 %d715}716 717define i8 @shuf8i1__9_6_1_10_3_7_7_1(i8 %a) {718; AVX512F-LABEL: shuf8i1__9_6_1_10_3_7_7_1:719; AVX512F: # %bb.0:720; AVX512F-NEXT: kmovw %edi, %k1721; AVX512F-NEXT: vpternlogq {{.*#+}} zmm0 {%k1} {z} = -1722; AVX512F-NEXT: vpmovsxbq {{.*#+}} zmm1 = [1,14,9,8,11,15,15,9]723; AVX512F-NEXT: vpermi2q {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm1724; AVX512F-NEXT: vptestmq %zmm1, %zmm1, %k0725; AVX512F-NEXT: kmovw %k0, %eax726; AVX512F-NEXT: # kill: def $al killed $al killed $eax727; AVX512F-NEXT: vzeroupper728; AVX512F-NEXT: retq729;730; AVX512VL-LABEL: shuf8i1__9_6_1_10_3_7_7_1:731; AVX512VL: # %bb.0:732; AVX512VL-NEXT: kmovw %edi, %k1733; AVX512VL-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0734; AVX512VL-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}735; AVX512VL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]736; AVX512VL-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0],mem[1,2,3,4,5,6,7]737; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k0738; AVX512VL-NEXT: kmovw %k0, %eax739; AVX512VL-NEXT: # kill: def $al killed $al killed $eax740; AVX512VL-NEXT: vzeroupper741; AVX512VL-NEXT: retq742;743; VL_BW_DQ-LABEL: shuf8i1__9_6_1_10_3_7_7_1:744; VL_BW_DQ: # %bb.0:745; VL_BW_DQ-NEXT: kmovd %edi, %k0746; VL_BW_DQ-NEXT: vpmovm2d %k0, %ymm0747; VL_BW_DQ-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]748; VL_BW_DQ-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0],mem[1,2,3,4,5,6,7]749; VL_BW_DQ-NEXT: vpmovd2m %ymm0, %k0750; VL_BW_DQ-NEXT: kmovd %k0, %eax751; VL_BW_DQ-NEXT: # kill: def $al killed $al killed $eax752; VL_BW_DQ-NEXT: vzeroupper753; VL_BW_DQ-NEXT: retq754 %b = bitcast i8 %a to <8 x i1>755 %c = shufflevector <8 x i1> <i1 1, i1 1, i1 0, i1 0, i1 1, i1 1, i1 0, i1 0>, <8 x i1> %b, <8 x i32> <i32 9, i32 6, i32 1, i32 0, i32 3, i32 7, i32 7, i32 1>756 %c1 = bitcast <8 x i1>%c to i8757 ret i8 %c1758}759 760define i8 @shuf8i1_9_6_1_10_3_7_7_0_all_ones(<8 x i1> %a) {761; AVX512F-LABEL: shuf8i1_9_6_1_10_3_7_7_0_all_ones:762; AVX512F: # %bb.0:763; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0764; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0765; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k1766; AVX512F-NEXT: vpternlogq {{.*#+}} zmm0 {%k1} {z} = -1767; AVX512F-NEXT: vpmovsxbq {{.*#+}} zmm1 = [9,1,2,3,4,5,6,7]768; AVX512F-NEXT: vpternlogd {{.*#+}} zmm2 = -1769; AVX512F-NEXT: vpermt2q %zmm0, %zmm1, %zmm2770; AVX512F-NEXT: vptestmq %zmm2, %zmm2, %k0771; AVX512F-NEXT: kmovw %k0, %eax772; AVX512F-NEXT: # kill: def $al killed $al killed $eax773; AVX512F-NEXT: vzeroupper774; AVX512F-NEXT: retq775;776; AVX512VL-LABEL: shuf8i1_9_6_1_10_3_7_7_0_all_ones:777; AVX512VL: # %bb.0:778; AVX512VL-NEXT: vpmovsxwd %xmm0, %ymm0779; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0780; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k1781; AVX512VL-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0782; AVX512VL-NEXT: vmovdqa32 %ymm0, %ymm1 {%k1} {z}783; AVX512VL-NEXT: vpmovsxbd {{.*#+}} ymm2 = [9,1,2,3,4,5,6,7]784; AVX512VL-NEXT: vpermi2d %ymm1, %ymm0, %ymm2785; AVX512VL-NEXT: vptestmd %ymm2, %ymm2, %k0786; AVX512VL-NEXT: kmovw %k0, %eax787; AVX512VL-NEXT: # kill: def $al killed $al killed $eax788; AVX512VL-NEXT: vzeroupper789; AVX512VL-NEXT: retq790;791; VL_BW_DQ-LABEL: shuf8i1_9_6_1_10_3_7_7_0_all_ones:792; VL_BW_DQ: # %bb.0:793; VL_BW_DQ-NEXT: vpsllw $15, %xmm0, %xmm0794; VL_BW_DQ-NEXT: vpmovw2m %xmm0, %k0795; VL_BW_DQ-NEXT: vpmovm2d %k0, %ymm0796; VL_BW_DQ-NEXT: vpmovsxbd {{.*#+}} ymm1 = [9,1,2,3,4,5,6,7]797; VL_BW_DQ-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2798; VL_BW_DQ-NEXT: vpermt2d %ymm0, %ymm1, %ymm2799; VL_BW_DQ-NEXT: vpmovd2m %ymm2, %k0800; VL_BW_DQ-NEXT: kmovd %k0, %eax801; VL_BW_DQ-NEXT: # kill: def $al killed $al killed $eax802; VL_BW_DQ-NEXT: vzeroupper803; VL_BW_DQ-NEXT: retq804 %c = shufflevector <8 x i1> <i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1>, <8 x i1> %a, <8 x i32> <i32 9, i32 6, i32 1, i32 0, i32 3, i32 7, i32 7, i32 0>805 %c1 = bitcast <8 x i1>%c to i8806 ret i8 %c1807}808 809define i16 @shuf16i1_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0(i16 %a) {810; AVX512F-LABEL: shuf16i1_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0:811; AVX512F: # %bb.0:812; AVX512F-NEXT: kmovw %edi, %k1813; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1814; AVX512F-NEXT: vpbroadcastd %xmm0, %zmm0815; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0816; AVX512F-NEXT: kmovw %k0, %eax817; AVX512F-NEXT: # kill: def $ax killed $ax killed $eax818; AVX512F-NEXT: vzeroupper819; AVX512F-NEXT: retq820;821; AVX512VL-LABEL: shuf16i1_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0:822; AVX512VL: # %bb.0:823; AVX512VL-NEXT: kmovw %edi, %k1824; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1825; AVX512VL-NEXT: vpbroadcastd %xmm0, %zmm0826; AVX512VL-NEXT: vptestmd %zmm0, %zmm0, %k0827; AVX512VL-NEXT: kmovw %k0, %eax828; AVX512VL-NEXT: # kill: def $ax killed $ax killed $eax829; AVX512VL-NEXT: vzeroupper830; AVX512VL-NEXT: retq831;832; VL_BW_DQ-LABEL: shuf16i1_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0:833; VL_BW_DQ: # %bb.0:834; VL_BW_DQ-NEXT: kmovd %edi, %k0835; VL_BW_DQ-NEXT: vpmovm2d %k0, %zmm0836; VL_BW_DQ-NEXT: vpbroadcastd %xmm0, %zmm0837; VL_BW_DQ-NEXT: vpmovd2m %zmm0, %k0838; VL_BW_DQ-NEXT: kmovd %k0, %eax839; VL_BW_DQ-NEXT: # kill: def $ax killed $ax killed $eax840; VL_BW_DQ-NEXT: vzeroupper841; VL_BW_DQ-NEXT: retq842 %b = bitcast i16 %a to <16 x i1>843 %c = shufflevector < 16 x i1> %b, <16 x i1> undef, <16 x i32> zeroinitializer844 %d = bitcast <16 x i1> %c to i16845 ret i16 %d846}847 848define i64 @shuf64i1_zero(i64 %a) {849; AVX512F-LABEL: shuf64i1_zero:850; AVX512F: # %bb.0:851; AVX512F-NEXT: kmovw %edi, %k1852; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1853; AVX512F-NEXT: vpbroadcastd %xmm0, %zmm0854; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0855; AVX512F-NEXT: kmovw %k0, %eax856; AVX512F-NEXT: kmovw %k0, %ecx857; AVX512F-NEXT: shll $16, %ecx858; AVX512F-NEXT: orl %eax, %ecx859; AVX512F-NEXT: movq %rcx, %rax860; AVX512F-NEXT: shlq $32, %rax861; AVX512F-NEXT: orq %rcx, %rax862; AVX512F-NEXT: vzeroupper863; AVX512F-NEXT: retq864;865; AVX512VL-LABEL: shuf64i1_zero:866; AVX512VL: # %bb.0:867; AVX512VL-NEXT: kmovw %edi, %k1868; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1869; AVX512VL-NEXT: vpbroadcastd %xmm0, %zmm0870; AVX512VL-NEXT: vptestmd %zmm0, %zmm0, %k0871; AVX512VL-NEXT: kmovw %k0, %eax872; AVX512VL-NEXT: kmovw %k0, %ecx873; AVX512VL-NEXT: shll $16, %ecx874; AVX512VL-NEXT: orl %eax, %ecx875; AVX512VL-NEXT: movq %rcx, %rax876; AVX512VL-NEXT: shlq $32, %rax877; AVX512VL-NEXT: orq %rcx, %rax878; AVX512VL-NEXT: vzeroupper879; AVX512VL-NEXT: retq880;881; VL_BW_DQ-LABEL: shuf64i1_zero:882; VL_BW_DQ: # %bb.0:883; VL_BW_DQ-NEXT: kmovq %rdi, %k0884; VL_BW_DQ-NEXT: vpmovm2b %k0, %zmm0885; VL_BW_DQ-NEXT: vpbroadcastb %xmm0, %zmm0886; VL_BW_DQ-NEXT: vpmovb2m %zmm0, %k0887; VL_BW_DQ-NEXT: kmovq %k0, %rax888; VL_BW_DQ-NEXT: vzeroupper889; VL_BW_DQ-NEXT: retq890 %b = bitcast i64 %a to <64 x i1>891 %c = shufflevector < 64 x i1> %b, <64 x i1> undef, <64 x i32> zeroinitializer892 %d = bitcast <64 x i1> %c to i64893 ret i64 %d894}895 896define <16 x i1> @PR52500(<16 x i1> %msk, i32 %in) {897; AVX512F-LABEL: PR52500:898; AVX512F: # %bb.0:899; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0900; AVX512F-NEXT: vpslld $31, %zmm0, %zmm0901; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k1902; AVX512F-NEXT: vmovd %edi, %xmm0903; AVX512F-NEXT: movl $789, %eax # imm = 0x315904; AVX512F-NEXT: vmovd %eax, %xmm1905; AVX512F-NEXT: vpmulld %xmm1, %xmm0, %xmm0906; AVX512F-NEXT: vpbroadcastd %xmm0, %zmm0907; AVX512F-NEXT: vptestnmd %zmm0, %zmm0, %k1 {%k1}908; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1909; AVX512F-NEXT: vpmovdb %zmm0, %xmm0910; AVX512F-NEXT: vzeroupper911; AVX512F-NEXT: retq912;913; AVX512VL-LABEL: PR52500:914; AVX512VL: # %bb.0:915; AVX512VL-NEXT: vpmovsxbd %xmm0, %zmm0916; AVX512VL-NEXT: vpslld $31, %zmm0, %zmm0917; AVX512VL-NEXT: vptestmd %zmm0, %zmm0, %k1918; AVX512VL-NEXT: vmovd %edi, %xmm0919; AVX512VL-NEXT: movl $789, %eax # imm = 0x315920; AVX512VL-NEXT: vmovd %eax, %xmm1921; AVX512VL-NEXT: vpmulld %xmm1, %xmm0, %xmm0922; AVX512VL-NEXT: vpbroadcastd %xmm0, %zmm0923; AVX512VL-NEXT: vptestnmd %zmm0, %zmm0, %k1 {%k1}924; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1925; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0926; AVX512VL-NEXT: vzeroupper927; AVX512VL-NEXT: retq928;929; VL_BW_DQ-LABEL: PR52500:930; VL_BW_DQ: # %bb.0:931; VL_BW_DQ-NEXT: vpsllw $7, %xmm0, %xmm0932; VL_BW_DQ-NEXT: vpmovb2m %xmm0, %k1933; VL_BW_DQ-NEXT: vmovd %edi, %xmm0934; VL_BW_DQ-NEXT: movl $789, %eax # imm = 0x315935; VL_BW_DQ-NEXT: vmovd %eax, %xmm1936; VL_BW_DQ-NEXT: vpmulld %xmm1, %xmm0, %xmm0937; VL_BW_DQ-NEXT: vpbroadcastd %xmm0, %zmm0938; VL_BW_DQ-NEXT: vptestnmd %zmm0, %zmm0, %k0 {%k1}939; VL_BW_DQ-NEXT: vpmovm2b %k0, %xmm0940; VL_BW_DQ-NEXT: vzeroupper941; VL_BW_DQ-NEXT: retq942 %insrt = insertelement <16 x i32> undef, i32 %in, i32 0943 %mul = mul <16 x i32> %insrt, <i32 789, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>944 %eq = icmp eq <16 x i32> %mul, zeroinitializer945 %cmp1 = shufflevector <16 x i1> %eq, <16 x i1> poison, <16 x i32> zeroinitializer946 %and = and <16 x i1> %cmp1, %msk947 ret <16 x i1> %and948}949