1151 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=ALL,AVX13; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=ALL,AVX24; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop | FileCheck %s --check-prefixes=ALL,XOP5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vpopcntdq | FileCheck %s --check-prefixes=ALL,AVX512VPOPCNTDQ6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vpopcntdq,+avx512vl | FileCheck %s --check-prefixes=ALL,AVX512VPOPCNTDQVL7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bitalg | FileCheck %s --check-prefixes=ALL,BITALG_NOVLX8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bitalg,+avx512vl | FileCheck %s --check-prefixes=ALL,BITALG9 10define <4 x i64> @testv4i64(<4 x i64> %in) nounwind {11; AVX1-LABEL: testv4i64:12; AVX1: # %bb.0:13; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm114; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]15; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm316; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]17; AVX1-NEXT: vpshufb %xmm3, %xmm4, %xmm318; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm119; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm120; AVX1-NEXT: vpshufb %xmm1, %xmm4, %xmm121; AVX1-NEXT: vpaddb %xmm3, %xmm1, %xmm122; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm323; AVX1-NEXT: vpsadbw %xmm3, %xmm1, %xmm124; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm525; AVX1-NEXT: vpshufb %xmm5, %xmm4, %xmm526; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm027; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm028; AVX1-NEXT: vpshufb %xmm0, %xmm4, %xmm029; AVX1-NEXT: vpaddb %xmm5, %xmm0, %xmm030; AVX1-NEXT: vpsadbw %xmm3, %xmm0, %xmm031; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm032; AVX1-NEXT: retq33;34; AVX2-LABEL: testv4i64:35; AVX2: # %bb.0:36; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]37; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm238; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]39; AVX2-NEXT: # ymm3 = mem[0,1,0,1]40; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm241; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm042; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm043; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm044; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm045; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm146; AVX2-NEXT: vpsadbw %ymm1, %ymm0, %ymm047; AVX2-NEXT: retq48;49; XOP-LABEL: testv4i64:50; XOP: # %bb.0:51; XOP-NEXT: vextractf128 $1, %ymm0, %xmm152; XOP-NEXT: vbroadcastss {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]53; XOP-NEXT: vpand %xmm2, %xmm1, %xmm354; XOP-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]55; XOP-NEXT: vpshufb %xmm3, %xmm4, %xmm356; XOP-NEXT: vbroadcastss {{.*#+}} xmm5 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]57; XOP-NEXT: vpshlb %xmm5, %xmm1, %xmm158; XOP-NEXT: vpshufb %xmm1, %xmm4, %xmm159; XOP-NEXT: vpaddb %xmm3, %xmm1, %xmm160; XOP-NEXT: vpxor %xmm3, %xmm3, %xmm361; XOP-NEXT: vpsadbw %xmm3, %xmm1, %xmm162; XOP-NEXT: vpand %xmm2, %xmm0, %xmm263; XOP-NEXT: vpshufb %xmm2, %xmm4, %xmm264; XOP-NEXT: vpshlb %xmm5, %xmm0, %xmm065; XOP-NEXT: vpshufb %xmm0, %xmm4, %xmm066; XOP-NEXT: vpaddb %xmm2, %xmm0, %xmm067; XOP-NEXT: vpsadbw %xmm3, %xmm0, %xmm068; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm069; XOP-NEXT: retq70;71; AVX512VPOPCNTDQ-LABEL: testv4i64:72; AVX512VPOPCNTDQ: # %bb.0:73; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm074; AVX512VPOPCNTDQ-NEXT: vpopcntq %zmm0, %zmm075; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm076; AVX512VPOPCNTDQ-NEXT: retq77;78; AVX512VPOPCNTDQVL-LABEL: testv4i64:79; AVX512VPOPCNTDQVL: # %bb.0:80; AVX512VPOPCNTDQVL-NEXT: vpopcntq %ymm0, %ymm081; AVX512VPOPCNTDQVL-NEXT: retq82;83; BITALG_NOVLX-LABEL: testv4i64:84; BITALG_NOVLX: # %bb.0:85; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm086; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm087; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm1, %xmm188; BITALG_NOVLX-NEXT: vpsadbw %ymm1, %ymm0, %ymm089; BITALG_NOVLX-NEXT: retq90;91; BITALG-LABEL: testv4i64:92; BITALG: # %bb.0:93; BITALG-NEXT: vpopcntb %ymm0, %ymm094; BITALG-NEXT: vpxor %xmm1, %xmm1, %xmm195; BITALG-NEXT: vpsadbw %ymm1, %ymm0, %ymm096; BITALG-NEXT: retq97 %out = call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %in)98 ret <4 x i64> %out99}100 101define <8 x i32> @testv8i32(<8 x i32> %in) nounwind {102; AVX1-LABEL: testv8i32:103; AVX1: # %bb.0:104; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1105; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]106; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm3107; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]108; AVX1-NEXT: vpshufb %xmm3, %xmm4, %xmm3109; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1110; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1111; AVX1-NEXT: vpshufb %xmm1, %xmm4, %xmm1112; AVX1-NEXT: vpaddb %xmm3, %xmm1, %xmm1113; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3114; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm5 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]115; AVX1-NEXT: vpsadbw %xmm3, %xmm5, %xmm5116; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero117; AVX1-NEXT: vpsadbw %xmm3, %xmm1, %xmm1118; AVX1-NEXT: vpackuswb %xmm5, %xmm1, %xmm1119; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm5120; AVX1-NEXT: vpshufb %xmm5, %xmm4, %xmm5121; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0122; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0123; AVX1-NEXT: vpshufb %xmm0, %xmm4, %xmm0124; AVX1-NEXT: vpaddb %xmm5, %xmm0, %xmm0125; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm3[2],xmm0[3],xmm3[3]126; AVX1-NEXT: vpsadbw %xmm3, %xmm2, %xmm2127; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero128; AVX1-NEXT: vpsadbw %xmm3, %xmm0, %xmm0129; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0130; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0131; AVX1-NEXT: retq132;133; AVX2-LABEL: testv8i32:134; AVX2: # %bb.0:135; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]136; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2137; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]138; AVX2-NEXT: # ymm3 = mem[0,1,0,1]139; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2140; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0141; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0142; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm0143; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0144; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1145; AVX2-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]146; AVX2-NEXT: vpsadbw %ymm1, %ymm2, %ymm2147; AVX2-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]148; AVX2-NEXT: vpsadbw %ymm1, %ymm0, %ymm0149; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0150; AVX2-NEXT: retq151;152; XOP-LABEL: testv8i32:153; XOP: # %bb.0:154; XOP-NEXT: vextractf128 $1, %ymm0, %xmm1155; XOP-NEXT: vbroadcastss {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]156; XOP-NEXT: vpand %xmm2, %xmm1, %xmm3157; XOP-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]158; XOP-NEXT: vpshufb %xmm3, %xmm4, %xmm3159; XOP-NEXT: vbroadcastss {{.*#+}} xmm5 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]160; XOP-NEXT: vpshlb %xmm5, %xmm1, %xmm1161; XOP-NEXT: vpshufb %xmm1, %xmm4, %xmm1162; XOP-NEXT: vpaddb %xmm3, %xmm1, %xmm1163; XOP-NEXT: vpxor %xmm3, %xmm3, %xmm3164; XOP-NEXT: vpunpckhdq {{.*#+}} xmm6 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]165; XOP-NEXT: vpsadbw %xmm3, %xmm6, %xmm6166; XOP-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero167; XOP-NEXT: vpsadbw %xmm3, %xmm1, %xmm1168; XOP-NEXT: vpackuswb %xmm6, %xmm1, %xmm1169; XOP-NEXT: vpand %xmm2, %xmm0, %xmm2170; XOP-NEXT: vpshufb %xmm2, %xmm4, %xmm2171; XOP-NEXT: vpshlb %xmm5, %xmm0, %xmm0172; XOP-NEXT: vpshufb %xmm0, %xmm4, %xmm0173; XOP-NEXT: vpaddb %xmm2, %xmm0, %xmm0174; XOP-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm3[2],xmm0[3],xmm3[3]175; XOP-NEXT: vpsadbw %xmm3, %xmm2, %xmm2176; XOP-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero177; XOP-NEXT: vpsadbw %xmm3, %xmm0, %xmm0178; XOP-NEXT: vpackuswb %xmm2, %xmm0, %xmm0179; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0180; XOP-NEXT: retq181;182; AVX512VPOPCNTDQ-LABEL: testv8i32:183; AVX512VPOPCNTDQ: # %bb.0:184; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0185; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm0186; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0187; AVX512VPOPCNTDQ-NEXT: retq188;189; AVX512VPOPCNTDQVL-LABEL: testv8i32:190; AVX512VPOPCNTDQVL: # %bb.0:191; AVX512VPOPCNTDQVL-NEXT: vpopcntd %ymm0, %ymm0192; AVX512VPOPCNTDQVL-NEXT: retq193;194; BITALG_NOVLX-LABEL: testv8i32:195; BITALG_NOVLX: # %bb.0:196; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0197; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm0198; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm1, %xmm1199; BITALG_NOVLX-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]200; BITALG_NOVLX-NEXT: vpsadbw %ymm1, %ymm2, %ymm2201; BITALG_NOVLX-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]202; BITALG_NOVLX-NEXT: vpsadbw %ymm1, %ymm0, %ymm0203; BITALG_NOVLX-NEXT: vpackuswb %ymm2, %ymm0, %ymm0204; BITALG_NOVLX-NEXT: retq205;206; BITALG-LABEL: testv8i32:207; BITALG: # %bb.0:208; BITALG-NEXT: vpopcntb %ymm0, %ymm0209; BITALG-NEXT: vpxor %xmm1, %xmm1, %xmm1210; BITALG-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]211; BITALG-NEXT: vpsadbw %ymm1, %ymm2, %ymm2212; BITALG-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]213; BITALG-NEXT: vpsadbw %ymm1, %ymm0, %ymm0214; BITALG-NEXT: vpackuswb %ymm2, %ymm0, %ymm0215; BITALG-NEXT: retq216 %out = call <8 x i32> @llvm.ctpop.v8i32(<8 x i32> %in)217 ret <8 x i32> %out218}219 220define <16 x i16> @testv16i16(<16 x i16> %in) nounwind {221; AVX1-LABEL: testv16i16:222; AVX1: # %bb.0:223; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]224; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm2225; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]226; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2227; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm4228; AVX1-NEXT: vpand %xmm1, %xmm4, %xmm4229; AVX1-NEXT: vpshufb %xmm4, %xmm3, %xmm4230; AVX1-NEXT: vpaddb %xmm2, %xmm4, %xmm2231; AVX1-NEXT: vpsllw $8, %xmm2, %xmm4232; AVX1-NEXT: vpaddb %xmm2, %xmm4, %xmm2233; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2234; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0235; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm4236; AVX1-NEXT: vpshufb %xmm4, %xmm3, %xmm4237; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0238; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0239; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm0240; AVX1-NEXT: vpaddb %xmm4, %xmm0, %xmm0241; AVX1-NEXT: vpsllw $8, %xmm0, %xmm1242; AVX1-NEXT: vpaddb %xmm0, %xmm1, %xmm0243; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0244; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0245; AVX1-NEXT: retq246;247; AVX2-LABEL: testv16i16:248; AVX2: # %bb.0:249; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]250; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2251; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]252; AVX2-NEXT: # ymm3 = mem[0,1,0,1]253; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2254; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0255; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0256; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm0257; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0258; AVX2-NEXT: vpsllw $8, %ymm0, %ymm1259; AVX2-NEXT: vpaddb %ymm0, %ymm1, %ymm0260; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0261; AVX2-NEXT: retq262;263; XOP-LABEL: testv16i16:264; XOP: # %bb.0:265; XOP-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]266; XOP-NEXT: vpand %xmm1, %xmm0, %xmm2267; XOP-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]268; XOP-NEXT: vpshufb %xmm2, %xmm3, %xmm2269; XOP-NEXT: vbroadcastss {{.*#+}} xmm4 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]270; XOP-NEXT: vpshlb %xmm4, %xmm0, %xmm5271; XOP-NEXT: vpshufb %xmm5, %xmm3, %xmm5272; XOP-NEXT: vpaddb %xmm2, %xmm5, %xmm2273; XOP-NEXT: vpsllw $8, %xmm2, %xmm5274; XOP-NEXT: vpaddb %xmm2, %xmm5, %xmm2275; XOP-NEXT: vpsrlw $8, %xmm2, %xmm2276; XOP-NEXT: vextractf128 $1, %ymm0, %xmm0277; XOP-NEXT: vpand %xmm1, %xmm0, %xmm1278; XOP-NEXT: vpshufb %xmm1, %xmm3, %xmm1279; XOP-NEXT: vpshlb %xmm4, %xmm0, %xmm0280; XOP-NEXT: vpshufb %xmm0, %xmm3, %xmm0281; XOP-NEXT: vpaddb %xmm1, %xmm0, %xmm0282; XOP-NEXT: vpsllw $8, %xmm0, %xmm1283; XOP-NEXT: vpaddb %xmm0, %xmm1, %xmm0284; XOP-NEXT: vpsrlw $8, %xmm0, %xmm0285; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0286; XOP-NEXT: retq287;288; AVX512VPOPCNTDQ-LABEL: testv16i16:289; AVX512VPOPCNTDQ: # %bb.0:290; AVX512VPOPCNTDQ-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],zero291; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm0292; AVX512VPOPCNTDQ-NEXT: vpmovdw %zmm0, %ymm0293; AVX512VPOPCNTDQ-NEXT: retq294;295; AVX512VPOPCNTDQVL-LABEL: testv16i16:296; AVX512VPOPCNTDQVL: # %bb.0:297; AVX512VPOPCNTDQVL-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],zero298; AVX512VPOPCNTDQVL-NEXT: vpopcntd %zmm0, %zmm0299; AVX512VPOPCNTDQVL-NEXT: vpmovdw %zmm0, %ymm0300; AVX512VPOPCNTDQVL-NEXT: retq301;302; BITALG_NOVLX-LABEL: testv16i16:303; BITALG_NOVLX: # %bb.0:304; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0305; BITALG_NOVLX-NEXT: vpopcntw %zmm0, %zmm0306; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0307; BITALG_NOVLX-NEXT: retq308;309; BITALG-LABEL: testv16i16:310; BITALG: # %bb.0:311; BITALG-NEXT: vpopcntw %ymm0, %ymm0312; BITALG-NEXT: retq313 %out = call <16 x i16> @llvm.ctpop.v16i16(<16 x i16> %in)314 ret <16 x i16> %out315}316 317define <32 x i8> @testv32i8(<32 x i8> %in) nounwind {318; AVX1-LABEL: testv32i8:319; AVX1: # %bb.0:320; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1321; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]322; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm3323; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]324; AVX1-NEXT: vpshufb %xmm3, %xmm4, %xmm3325; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1326; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1327; AVX1-NEXT: vpshufb %xmm1, %xmm4, %xmm1328; AVX1-NEXT: vpaddb %xmm3, %xmm1, %xmm1329; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm3330; AVX1-NEXT: vpshufb %xmm3, %xmm4, %xmm3331; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0332; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0333; AVX1-NEXT: vpshufb %xmm0, %xmm4, %xmm0334; AVX1-NEXT: vpaddb %xmm3, %xmm0, %xmm0335; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0336; AVX1-NEXT: retq337;338; AVX2-LABEL: testv32i8:339; AVX2: # %bb.0:340; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]341; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2342; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]343; AVX2-NEXT: # ymm3 = mem[0,1,0,1]344; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2345; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0346; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0347; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm0348; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0349; AVX2-NEXT: retq350;351; XOP-LABEL: testv32i8:352; XOP: # %bb.0:353; XOP-NEXT: vextractf128 $1, %ymm0, %xmm1354; XOP-NEXT: vbroadcastss {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]355; XOP-NEXT: vpand %xmm2, %xmm1, %xmm3356; XOP-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]357; XOP-NEXT: vpshufb %xmm3, %xmm4, %xmm3358; XOP-NEXT: vbroadcastss {{.*#+}} xmm5 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]359; XOP-NEXT: vpshlb %xmm5, %xmm1, %xmm1360; XOP-NEXT: vpshufb %xmm1, %xmm4, %xmm1361; XOP-NEXT: vpaddb %xmm3, %xmm1, %xmm1362; XOP-NEXT: vpand %xmm2, %xmm0, %xmm2363; XOP-NEXT: vpshufb %xmm2, %xmm4, %xmm2364; XOP-NEXT: vpshlb %xmm5, %xmm0, %xmm0365; XOP-NEXT: vpshufb %xmm0, %xmm4, %xmm0366; XOP-NEXT: vpaddb %xmm2, %xmm0, %xmm0367; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0368; XOP-NEXT: retq369;370; AVX512VPOPCNTDQ-LABEL: testv32i8:371; AVX512VPOPCNTDQ: # %bb.0:372; AVX512VPOPCNTDQ-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]373; AVX512VPOPCNTDQ-NEXT: vpand %ymm1, %ymm0, %ymm2374; AVX512VPOPCNTDQ-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]375; AVX512VPOPCNTDQ-NEXT: # ymm3 = mem[0,1,0,1]376; AVX512VPOPCNTDQ-NEXT: vpshufb %ymm2, %ymm3, %ymm2377; AVX512VPOPCNTDQ-NEXT: vpsrlw $4, %ymm0, %ymm0378; AVX512VPOPCNTDQ-NEXT: vpand %ymm1, %ymm0, %ymm0379; AVX512VPOPCNTDQ-NEXT: vpshufb %ymm0, %ymm3, %ymm0380; AVX512VPOPCNTDQ-NEXT: vpaddb %ymm2, %ymm0, %ymm0381; AVX512VPOPCNTDQ-NEXT: retq382;383; AVX512VPOPCNTDQVL-LABEL: testv32i8:384; AVX512VPOPCNTDQVL: # %bb.0:385; AVX512VPOPCNTDQVL-NEXT: vpbroadcastd {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]386; AVX512VPOPCNTDQVL-NEXT: vpand %ymm1, %ymm0, %ymm2387; AVX512VPOPCNTDQVL-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]388; AVX512VPOPCNTDQVL-NEXT: # ymm3 = mem[0,1,0,1]389; AVX512VPOPCNTDQVL-NEXT: vpshufb %ymm2, %ymm3, %ymm2390; AVX512VPOPCNTDQVL-NEXT: vpsrlw $4, %ymm0, %ymm0391; AVX512VPOPCNTDQVL-NEXT: vpand %ymm1, %ymm0, %ymm0392; AVX512VPOPCNTDQVL-NEXT: vpshufb %ymm0, %ymm3, %ymm0393; AVX512VPOPCNTDQVL-NEXT: vpaddb %ymm2, %ymm0, %ymm0394; AVX512VPOPCNTDQVL-NEXT: retq395;396; BITALG_NOVLX-LABEL: testv32i8:397; BITALG_NOVLX: # %bb.0:398; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0399; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm0400; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0401; BITALG_NOVLX-NEXT: retq402;403; BITALG-LABEL: testv32i8:404; BITALG: # %bb.0:405; BITALG-NEXT: vpopcntb %ymm0, %ymm0406; BITALG-NEXT: retq407 %out = call <32 x i8> @llvm.ctpop.v32i8(<32 x i8> %in)408 ret <32 x i8> %out409}410 411define <4 x i64> @foldv4i64() nounwind {412; AVX1-LABEL: foldv4i64:413; AVX1: # %bb.0:414; AVX1-NEXT: vmovaps {{.*#+}} ymm0 = [1,64,0,8]415; AVX1-NEXT: retq416;417; AVX2-LABEL: foldv4i64:418; AVX2: # %bb.0:419; AVX2-NEXT: vmovaps {{.*#+}} ymm0 = [1,64,0,8]420; AVX2-NEXT: retq421;422; XOP-LABEL: foldv4i64:423; XOP: # %bb.0:424; XOP-NEXT: vmovaps {{.*#+}} ymm0 = [1,64,0,8]425; XOP-NEXT: retq426;427; AVX512VPOPCNTDQ-LABEL: foldv4i64:428; AVX512VPOPCNTDQ: # %bb.0:429; AVX512VPOPCNTDQ-NEXT: vpmovsxbq {{.*#+}} ymm0 = [1,64,0,8]430; AVX512VPOPCNTDQ-NEXT: retq431;432; AVX512VPOPCNTDQVL-LABEL: foldv4i64:433; AVX512VPOPCNTDQVL: # %bb.0:434; AVX512VPOPCNTDQVL-NEXT: vpmovsxbq {{.*#+}} ymm0 = [1,64,0,8]435; AVX512VPOPCNTDQVL-NEXT: retq436;437; BITALG_NOVLX-LABEL: foldv4i64:438; BITALG_NOVLX: # %bb.0:439; BITALG_NOVLX-NEXT: vpmovsxbq {{.*#+}} ymm0 = [1,64,0,8]440; BITALG_NOVLX-NEXT: retq441;442; BITALG-LABEL: foldv4i64:443; BITALG: # %bb.0:444; BITALG-NEXT: vpmovsxbq {{.*#+}} ymm0 = [1,64,0,8]445; BITALG-NEXT: retq446 %out = call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> <i64 256, i64 -1, i64 0, i64 255>)447 ret <4 x i64> %out448}449 450define <8 x i32> @foldv8i32() nounwind {451; AVX1-LABEL: foldv8i32:452; AVX1: # %bb.0:453; AVX1-NEXT: vmovaps {{.*#+}} ymm0 = [1,32,0,8,16,3,2,3]454; AVX1-NEXT: retq455;456; AVX2-LABEL: foldv8i32:457; AVX2: # %bb.0:458; AVX2-NEXT: vmovaps {{.*#+}} ymm0 = [1,32,0,8,16,3,2,3]459; AVX2-NEXT: retq460;461; XOP-LABEL: foldv8i32:462; XOP: # %bb.0:463; XOP-NEXT: vmovaps {{.*#+}} ymm0 = [1,32,0,8,16,3,2,3]464; XOP-NEXT: retq465;466; AVX512VPOPCNTDQ-LABEL: foldv8i32:467; AVX512VPOPCNTDQ: # %bb.0:468; AVX512VPOPCNTDQ-NEXT: vpmovsxbd {{.*#+}} ymm0 = [1,32,0,8,16,3,2,3]469; AVX512VPOPCNTDQ-NEXT: retq470;471; AVX512VPOPCNTDQVL-LABEL: foldv8i32:472; AVX512VPOPCNTDQVL: # %bb.0:473; AVX512VPOPCNTDQVL-NEXT: vpmovsxbd {{.*#+}} ymm0 = [1,32,0,8,16,3,2,3]474; AVX512VPOPCNTDQVL-NEXT: retq475;476; BITALG_NOVLX-LABEL: foldv8i32:477; BITALG_NOVLX: # %bb.0:478; BITALG_NOVLX-NEXT: vpmovsxbd {{.*#+}} ymm0 = [1,32,0,8,16,3,2,3]479; BITALG_NOVLX-NEXT: retq480;481; BITALG-LABEL: foldv8i32:482; BITALG: # %bb.0:483; BITALG-NEXT: vpmovsxbd {{.*#+}} ymm0 = [1,32,0,8,16,3,2,3]484; BITALG-NEXT: retq485 %out = call <8 x i32> @llvm.ctpop.v8i32(<8 x i32> <i32 256, i32 -1, i32 0, i32 255, i32 -65536, i32 7, i32 24, i32 88>)486 ret <8 x i32> %out487}488 489define <16 x i16> @foldv16i16() nounwind {490; ALL-LABEL: foldv16i16:491; ALL: # %bb.0:492; ALL-NEXT: vmovaps {{.*#+}} ymm0 = [1,16,0,8,0,3,2,3,15,7,1,1,1,1,1,1]493; ALL-NEXT: retq494 %out = call <16 x i16> @llvm.ctpop.v16i16(<16 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88, i16 -2, i16 254, i16 1, i16 2, i16 4, i16 8, i16 16, i16 32>)495 ret <16 x i16> %out496}497 498define <32 x i8> @foldv32i8() nounwind {499; ALL-LABEL: foldv32i8:500; ALL: # %bb.0:501; ALL-NEXT: vmovaps {{.*#+}} ymm0 = [0,8,0,8,0,3,2,3,7,7,1,1,1,1,1,1,1,1,0,0,1,2,3,4,5,6,7,8,2,2,3,7]502; ALL-NEXT: retq503 %out = call <32 x i8> @llvm.ctpop.v32i8(<32 x i8> <i8 256, i8 -1, i8 0, i8 255, i8 -65536, i8 7, i8 24, i8 88, i8 -2, i8 254, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 128, i8 256, i8 -256, i8 -128, i8 -64, i8 -32, i8 -16, i8 -8, i8 -4, i8 -2, i8 -1, i8 3, i8 5, i8 7, i8 127>)504 ret <32 x i8> %out505}506 507define <4 x i64> @eq_1_v4i64(<4 x i64> %0) {508; AVX1-LABEL: eq_1_v4i64:509; AVX1: # %bb.0:510; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1511; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm2512; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3513; AVX1-NEXT: vpaddq %xmm1, %xmm3, %xmm1514; AVX1-NEXT: vmovddup {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]515; AVX1-NEXT: # xmm4 = mem[0,0]516; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1517; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm3518; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1519; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2520; AVX1-NEXT: vpxor %xmm0, %xmm2, %xmm0521; AVX1-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm0522; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0523; AVX1-NEXT: retq524;525; AVX2-LABEL: eq_1_v4i64:526; AVX2: # %bb.0:527; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1528; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm1529; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]530; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1531; AVX2-NEXT: vpxor %ymm0, %ymm1, %ymm0532; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm0533; AVX2-NEXT: retq534;535; XOP-LABEL: eq_1_v4i64:536; XOP: # %bb.0:537; XOP-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1538; XOP-NEXT: vpaddq %xmm1, %xmm0, %xmm2539; XOP-NEXT: vextractf128 $1, %ymm0, %xmm3540; XOP-NEXT: vpaddq %xmm1, %xmm3, %xmm1541; XOP-NEXT: vpxor %xmm1, %xmm3, %xmm3542; XOP-NEXT: vpcomgtuq %xmm1, %xmm3, %xmm1543; XOP-NEXT: vpxor %xmm2, %xmm0, %xmm0544; XOP-NEXT: vpcomgtuq %xmm2, %xmm0, %xmm0545; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0546; XOP-NEXT: retq547;548; AVX512VPOPCNTDQ-LABEL: eq_1_v4i64:549; AVX512VPOPCNTDQ: # %bb.0:550; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0551; AVX512VPOPCNTDQ-NEXT: vpopcntq %zmm0, %zmm0552; AVX512VPOPCNTDQ-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]553; AVX512VPOPCNTDQ-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0554; AVX512VPOPCNTDQ-NEXT: retq555;556; AVX512VPOPCNTDQVL-LABEL: eq_1_v4i64:557; AVX512VPOPCNTDQVL: # %bb.0:558; AVX512VPOPCNTDQVL-NEXT: vpopcntq %ymm0, %ymm0559; AVX512VPOPCNTDQVL-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]560; AVX512VPOPCNTDQVL-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0561; AVX512VPOPCNTDQVL-NEXT: retq562;563; BITALG_NOVLX-LABEL: eq_1_v4i64:564; BITALG_NOVLX: # %bb.0:565; BITALG_NOVLX-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1566; BITALG_NOVLX-NEXT: vpaddq %ymm1, %ymm0, %ymm1567; BITALG_NOVLX-NEXT: vpxor %ymm1, %ymm0, %ymm0568; BITALG_NOVLX-NEXT: vpminuq %zmm1, %zmm0, %zmm1569; BITALG_NOVLX-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0570; BITALG_NOVLX-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm0571; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0572; BITALG_NOVLX-NEXT: retq573;574; BITALG-LABEL: eq_1_v4i64:575; BITALG: # %bb.0:576; BITALG-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1577; BITALG-NEXT: vpaddq %ymm1, %ymm0, %ymm2578; BITALG-NEXT: vpxor %ymm2, %ymm0, %ymm0579; BITALG-NEXT: vpcmpnleuq %ymm2, %ymm0, %k1580; BITALG-NEXT: vmovdqa64 %ymm1, %ymm0 {%k1} {z}581; BITALG-NEXT: retq582 %2 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %0)583 %3 = icmp eq <4 x i64> %2, <i64 1, i64 1, i64 1, i64 1>584 %4 = sext <4 x i1> %3 to <4 x i64>585 ret <4 x i64> %4586}587 588define <4 x i64> @ne_1_v4i64(<4 x i64> %0) {589; AVX1-LABEL: ne_1_v4i64:590; AVX1: # %bb.0:591; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1592; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm2593; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3594; AVX1-NEXT: vpaddq %xmm1, %xmm3, %xmm4595; AVX1-NEXT: vmovddup {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808]596; AVX1-NEXT: # xmm5 = mem[0,0]597; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4598; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm3599; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm3600; AVX1-NEXT: vpxor %xmm1, %xmm3, %xmm3601; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2602; AVX1-NEXT: vpxor %xmm0, %xmm2, %xmm0603; AVX1-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm0604; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0605; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0606; AVX1-NEXT: retq607;608; AVX2-LABEL: ne_1_v4i64:609; AVX2: # %bb.0:610; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1611; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm2612; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]613; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2614; AVX2-NEXT: vpxor %ymm0, %ymm2, %ymm0615; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm0616; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0617; AVX2-NEXT: retq618;619; XOP-LABEL: ne_1_v4i64:620; XOP: # %bb.0:621; XOP-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1622; XOP-NEXT: vpaddq %xmm1, %xmm0, %xmm2623; XOP-NEXT: vextractf128 $1, %ymm0, %xmm3624; XOP-NEXT: vpaddq %xmm1, %xmm3, %xmm1625; XOP-NEXT: vpxor %xmm1, %xmm3, %xmm3626; XOP-NEXT: vpcomleuq %xmm1, %xmm3, %xmm1627; XOP-NEXT: vpxor %xmm2, %xmm0, %xmm0628; XOP-NEXT: vpcomleuq %xmm2, %xmm0, %xmm0629; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0630; XOP-NEXT: retq631;632; AVX512VPOPCNTDQ-LABEL: ne_1_v4i64:633; AVX512VPOPCNTDQ: # %bb.0:634; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0635; AVX512VPOPCNTDQ-NEXT: vpopcntq %zmm0, %zmm0636; AVX512VPOPCNTDQ-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]637; AVX512VPOPCNTDQ-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0638; AVX512VPOPCNTDQ-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm0639; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0640; AVX512VPOPCNTDQ-NEXT: retq641;642; AVX512VPOPCNTDQVL-LABEL: ne_1_v4i64:643; AVX512VPOPCNTDQVL: # %bb.0:644; AVX512VPOPCNTDQVL-NEXT: vpopcntq %ymm0, %ymm0645; AVX512VPOPCNTDQVL-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]646; AVX512VPOPCNTDQVL-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0647; AVX512VPOPCNTDQVL-NEXT: vpternlogq {{.*#+}} ymm0 = ~ymm0648; AVX512VPOPCNTDQVL-NEXT: retq649;650; BITALG_NOVLX-LABEL: ne_1_v4i64:651; BITALG_NOVLX: # %bb.0:652; BITALG_NOVLX-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1653; BITALG_NOVLX-NEXT: vpaddq %ymm1, %ymm0, %ymm1654; BITALG_NOVLX-NEXT: vpxor %ymm1, %ymm0, %ymm0655; BITALG_NOVLX-NEXT: vpminuq %zmm1, %zmm0, %zmm1656; BITALG_NOVLX-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0657; BITALG_NOVLX-NEXT: retq658;659; BITALG-LABEL: ne_1_v4i64:660; BITALG: # %bb.0:661; BITALG-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1662; BITALG-NEXT: vpaddq %ymm1, %ymm0, %ymm2663; BITALG-NEXT: vpxor %ymm2, %ymm0, %ymm0664; BITALG-NEXT: vpcmpleuq %ymm2, %ymm0, %k1665; BITALG-NEXT: vmovdqa64 %ymm1, %ymm0 {%k1} {z}666; BITALG-NEXT: retq667 %2 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %0)668 %3 = icmp ne <4 x i64> %2, <i64 1, i64 1, i64 1, i64 1>669 %4 = sext <4 x i1> %3 to <4 x i64>670 ret <4 x i64> %4671}672 673define <8 x i32> @eq_1_v8i32(<8 x i32> %0) {674; AVX1-LABEL: eq_1_v8i32:675; AVX1: # %bb.0:676; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1677; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm2678; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3679; AVX1-NEXT: vpaddd %xmm1, %xmm3, %xmm4680; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3681; AVX1-NEXT: vpminud %xmm4, %xmm3, %xmm4682; AVX1-NEXT: vpcmpeqd %xmm4, %xmm3, %xmm3683; AVX1-NEXT: vpxor %xmm1, %xmm3, %xmm3684; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0685; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm2686; AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm0687; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0688; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0689; AVX1-NEXT: retq690;691; AVX2-LABEL: eq_1_v8i32:692; AVX2: # %bb.0:693; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1694; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm2695; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0696; AVX2-NEXT: vpminud %ymm2, %ymm0, %ymm2697; AVX2-NEXT: vpcmpeqd %ymm2, %ymm0, %ymm0698; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0699; AVX2-NEXT: retq700;701; XOP-LABEL: eq_1_v8i32:702; XOP: # %bb.0:703; XOP-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1704; XOP-NEXT: vpaddd %xmm1, %xmm0, %xmm2705; XOP-NEXT: vextractf128 $1, %ymm0, %xmm3706; XOP-NEXT: vpaddd %xmm1, %xmm3, %xmm1707; XOP-NEXT: vpxor %xmm1, %xmm3, %xmm3708; XOP-NEXT: vpcomgtud %xmm1, %xmm3, %xmm1709; XOP-NEXT: vpxor %xmm2, %xmm0, %xmm0710; XOP-NEXT: vpcomgtud %xmm2, %xmm0, %xmm0711; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0712; XOP-NEXT: retq713;714; AVX512VPOPCNTDQ-LABEL: eq_1_v8i32:715; AVX512VPOPCNTDQ: # %bb.0:716; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0717; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm0718; AVX512VPOPCNTDQ-NEXT: vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]719; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0720; AVX512VPOPCNTDQ-NEXT: retq721;722; AVX512VPOPCNTDQVL-LABEL: eq_1_v8i32:723; AVX512VPOPCNTDQVL: # %bb.0:724; AVX512VPOPCNTDQVL-NEXT: vpopcntd %ymm0, %ymm0725; AVX512VPOPCNTDQVL-NEXT: vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]726; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0727; AVX512VPOPCNTDQVL-NEXT: retq728;729; BITALG_NOVLX-LABEL: eq_1_v8i32:730; BITALG_NOVLX: # %bb.0:731; BITALG_NOVLX-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1732; BITALG_NOVLX-NEXT: vpaddd %ymm1, %ymm0, %ymm1733; BITALG_NOVLX-NEXT: vpxor %ymm1, %ymm0, %ymm0734; BITALG_NOVLX-NEXT: vpminud %ymm1, %ymm0, %ymm1735; BITALG_NOVLX-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0736; BITALG_NOVLX-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm0737; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0738; BITALG_NOVLX-NEXT: retq739;740; BITALG-LABEL: eq_1_v8i32:741; BITALG: # %bb.0:742; BITALG-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1743; BITALG-NEXT: vpaddd %ymm1, %ymm0, %ymm2744; BITALG-NEXT: vpxor %ymm2, %ymm0, %ymm0745; BITALG-NEXT: vpcmpnleud %ymm2, %ymm0, %k1746; BITALG-NEXT: vmovdqa32 %ymm1, %ymm0 {%k1} {z}747; BITALG-NEXT: retq748 %2 = tail call <8 x i32> @llvm.ctpop.v8i32(<8 x i32> %0)749 %3 = icmp eq <8 x i32> %2, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>750 %4 = sext <8 x i1> %3 to <8 x i32>751 ret <8 x i32> %4752}753 754define <8 x i32> @ne_1_v8i32(<8 x i32> %0) {755; AVX1-LABEL: ne_1_v8i32:756; AVX1: # %bb.0:757; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1758; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm2759; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3760; AVX1-NEXT: vpaddd %xmm1, %xmm3, %xmm1761; AVX1-NEXT: vpxor %xmm1, %xmm3, %xmm3762; AVX1-NEXT: vpminud %xmm1, %xmm3, %xmm1763; AVX1-NEXT: vpcmpeqd %xmm1, %xmm3, %xmm1764; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0765; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm2766; AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm0767; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0768; AVX1-NEXT: retq769;770; AVX2-LABEL: ne_1_v8i32:771; AVX2: # %bb.0:772; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1773; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm1774; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0775; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm1776; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0777; AVX2-NEXT: retq778;779; XOP-LABEL: ne_1_v8i32:780; XOP: # %bb.0:781; XOP-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1782; XOP-NEXT: vpaddd %xmm1, %xmm0, %xmm2783; XOP-NEXT: vextractf128 $1, %ymm0, %xmm3784; XOP-NEXT: vpaddd %xmm1, %xmm3, %xmm1785; XOP-NEXT: vpxor %xmm1, %xmm3, %xmm3786; XOP-NEXT: vpcomleud %xmm1, %xmm3, %xmm1787; XOP-NEXT: vpxor %xmm2, %xmm0, %xmm0788; XOP-NEXT: vpcomleud %xmm2, %xmm0, %xmm0789; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0790; XOP-NEXT: retq791;792; AVX512VPOPCNTDQ-LABEL: ne_1_v8i32:793; AVX512VPOPCNTDQ: # %bb.0:794; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0795; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm0796; AVX512VPOPCNTDQ-NEXT: vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]797; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0798; AVX512VPOPCNTDQ-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm0799; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0800; AVX512VPOPCNTDQ-NEXT: retq801;802; AVX512VPOPCNTDQVL-LABEL: ne_1_v8i32:803; AVX512VPOPCNTDQVL: # %bb.0:804; AVX512VPOPCNTDQVL-NEXT: vpopcntd %ymm0, %ymm0805; AVX512VPOPCNTDQVL-NEXT: vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]806; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0807; AVX512VPOPCNTDQVL-NEXT: vpternlogq {{.*#+}} ymm0 = ~ymm0808; AVX512VPOPCNTDQVL-NEXT: retq809;810; BITALG_NOVLX-LABEL: ne_1_v8i32:811; BITALG_NOVLX: # %bb.0:812; BITALG_NOVLX-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1813; BITALG_NOVLX-NEXT: vpaddd %ymm1, %ymm0, %ymm1814; BITALG_NOVLX-NEXT: vpxor %ymm1, %ymm0, %ymm0815; BITALG_NOVLX-NEXT: vpminud %ymm1, %ymm0, %ymm1816; BITALG_NOVLX-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0817; BITALG_NOVLX-NEXT: retq818;819; BITALG-LABEL: ne_1_v8i32:820; BITALG: # %bb.0:821; BITALG-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1822; BITALG-NEXT: vpaddd %ymm1, %ymm0, %ymm2823; BITALG-NEXT: vpxor %ymm2, %ymm0, %ymm0824; BITALG-NEXT: vpcmpleud %ymm2, %ymm0, %k1825; BITALG-NEXT: vmovdqa32 %ymm1, %ymm0 {%k1} {z}826; BITALG-NEXT: retq827 %2 = tail call <8 x i32> @llvm.ctpop.v8i32(<8 x i32> %0)828 %3 = icmp ne <8 x i32> %2, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>829 %4 = sext <8 x i1> %3 to <8 x i32>830 ret <8 x i32> %4831}832 833define <16 x i16> @eq_1_v16i16(<16 x i16> %0) {834; AVX1-LABEL: eq_1_v16i16:835; AVX1: # %bb.0:836; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1837; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm2838; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3839; AVX1-NEXT: vpaddw %xmm1, %xmm3, %xmm4840; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3841; AVX1-NEXT: vpminuw %xmm4, %xmm3, %xmm4842; AVX1-NEXT: vpcmpeqw %xmm4, %xmm3, %xmm3843; AVX1-NEXT: vpxor %xmm1, %xmm3, %xmm3844; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0845; AVX1-NEXT: vpminuw %xmm2, %xmm0, %xmm2846; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm0847; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0848; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0849; AVX1-NEXT: retq850;851; AVX2-LABEL: eq_1_v16i16:852; AVX2: # %bb.0:853; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1854; AVX2-NEXT: vpaddw %ymm1, %ymm0, %ymm2855; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0856; AVX2-NEXT: vpminuw %ymm2, %ymm0, %ymm2857; AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm0858; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0859; AVX2-NEXT: retq860;861; XOP-LABEL: eq_1_v16i16:862; XOP: # %bb.0:863; XOP-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1864; XOP-NEXT: vpaddw %xmm1, %xmm0, %xmm2865; XOP-NEXT: vextractf128 $1, %ymm0, %xmm3866; XOP-NEXT: vpaddw %xmm1, %xmm3, %xmm1867; XOP-NEXT: vpxor %xmm1, %xmm3, %xmm3868; XOP-NEXT: vpcomgtuw %xmm1, %xmm3, %xmm1869; XOP-NEXT: vpxor %xmm2, %xmm0, %xmm0870; XOP-NEXT: vpcomgtuw %xmm2, %xmm0, %xmm0871; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0872; XOP-NEXT: retq873;874; AVX512VPOPCNTDQ-LABEL: eq_1_v16i16:875; AVX512VPOPCNTDQ: # %bb.0:876; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1877; AVX512VPOPCNTDQ-NEXT: vpaddw %ymm1, %ymm0, %ymm1878; AVX512VPOPCNTDQ-NEXT: vpxor %ymm1, %ymm0, %ymm0879; AVX512VPOPCNTDQ-NEXT: vpminuw %ymm1, %ymm0, %ymm1880; AVX512VPOPCNTDQ-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0881; AVX512VPOPCNTDQ-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm0882; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0883; AVX512VPOPCNTDQ-NEXT: retq884;885; AVX512VPOPCNTDQVL-LABEL: eq_1_v16i16:886; AVX512VPOPCNTDQVL: # %bb.0:887; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1888; AVX512VPOPCNTDQVL-NEXT: vpaddw %ymm1, %ymm0, %ymm1889; AVX512VPOPCNTDQVL-NEXT: vpxor %ymm1, %ymm0, %ymm0890; AVX512VPOPCNTDQVL-NEXT: vpminuw %ymm1, %ymm0, %ymm1891; AVX512VPOPCNTDQVL-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0892; AVX512VPOPCNTDQVL-NEXT: vpternlogq {{.*#+}} ymm0 = ~ymm0893; AVX512VPOPCNTDQVL-NEXT: retq894;895; BITALG_NOVLX-LABEL: eq_1_v16i16:896; BITALG_NOVLX: # %bb.0:897; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0898; BITALG_NOVLX-NEXT: vpopcntw %zmm0, %zmm0899; BITALG_NOVLX-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0900; BITALG_NOVLX-NEXT: retq901;902; BITALG-LABEL: eq_1_v16i16:903; BITALG: # %bb.0:904; BITALG-NEXT: vpopcntw %ymm0, %ymm0905; BITALG-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0906; BITALG-NEXT: retq907 %2 = tail call <16 x i16> @llvm.ctpop.v16i16(<16 x i16> %0)908 %3 = icmp eq <16 x i16> %2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>909 %4 = sext <16 x i1> %3 to <16 x i16>910 ret <16 x i16> %4911}912 913define <16 x i16> @ne_1_v16i16(<16 x i16> %0) {914; AVX1-LABEL: ne_1_v16i16:915; AVX1: # %bb.0:916; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1917; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm2918; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3919; AVX1-NEXT: vpaddw %xmm1, %xmm3, %xmm1920; AVX1-NEXT: vpxor %xmm1, %xmm3, %xmm3921; AVX1-NEXT: vpminuw %xmm1, %xmm3, %xmm1922; AVX1-NEXT: vpcmpeqw %xmm1, %xmm3, %xmm1923; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0924; AVX1-NEXT: vpminuw %xmm2, %xmm0, %xmm2925; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm0926; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0927; AVX1-NEXT: retq928;929; AVX2-LABEL: ne_1_v16i16:930; AVX2: # %bb.0:931; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1932; AVX2-NEXT: vpaddw %ymm1, %ymm0, %ymm1933; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0934; AVX2-NEXT: vpminuw %ymm1, %ymm0, %ymm1935; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0936; AVX2-NEXT: retq937;938; XOP-LABEL: ne_1_v16i16:939; XOP: # %bb.0:940; XOP-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1941; XOP-NEXT: vpaddw %xmm1, %xmm0, %xmm2942; XOP-NEXT: vextractf128 $1, %ymm0, %xmm3943; XOP-NEXT: vpaddw %xmm1, %xmm3, %xmm1944; XOP-NEXT: vpxor %xmm1, %xmm3, %xmm3945; XOP-NEXT: vpcomleuw %xmm1, %xmm3, %xmm1946; XOP-NEXT: vpxor %xmm2, %xmm0, %xmm0947; XOP-NEXT: vpcomleuw %xmm2, %xmm0, %xmm0948; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0949; XOP-NEXT: retq950;951; AVX512VPOPCNTDQ-LABEL: ne_1_v16i16:952; AVX512VPOPCNTDQ: # %bb.0:953; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1954; AVX512VPOPCNTDQ-NEXT: vpaddw %ymm1, %ymm0, %ymm1955; AVX512VPOPCNTDQ-NEXT: vpxor %ymm1, %ymm0, %ymm0956; AVX512VPOPCNTDQ-NEXT: vpminuw %ymm1, %ymm0, %ymm1957; AVX512VPOPCNTDQ-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0958; AVX512VPOPCNTDQ-NEXT: retq959;960; AVX512VPOPCNTDQVL-LABEL: ne_1_v16i16:961; AVX512VPOPCNTDQVL: # %bb.0:962; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1963; AVX512VPOPCNTDQVL-NEXT: vpaddw %ymm1, %ymm0, %ymm1964; AVX512VPOPCNTDQVL-NEXT: vpxor %ymm1, %ymm0, %ymm0965; AVX512VPOPCNTDQVL-NEXT: vpminuw %ymm1, %ymm0, %ymm1966; AVX512VPOPCNTDQVL-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0967; AVX512VPOPCNTDQVL-NEXT: retq968;969; BITALG_NOVLX-LABEL: ne_1_v16i16:970; BITALG_NOVLX: # %bb.0:971; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0972; BITALG_NOVLX-NEXT: vpopcntw %zmm0, %zmm0973; BITALG_NOVLX-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0974; BITALG_NOVLX-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm0975; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0976; BITALG_NOVLX-NEXT: retq977;978; BITALG-LABEL: ne_1_v16i16:979; BITALG: # %bb.0:980; BITALG-NEXT: vpopcntw %ymm0, %ymm0981; BITALG-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0982; BITALG-NEXT: vpternlogq {{.*#+}} ymm0 = ~ymm0983; BITALG-NEXT: retq984 %2 = tail call <16 x i16> @llvm.ctpop.v16i16(<16 x i16> %0)985 %3 = icmp ne <16 x i16> %2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>986 %4 = sext <16 x i1> %3 to <16 x i16>987 ret <16 x i16> %4988}989 990define <32 x i8> @eq_1_v32i8(<32 x i8> %0) {991; AVX1-LABEL: eq_1_v32i8:992; AVX1: # %bb.0:993; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1994; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm2995; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3996; AVX1-NEXT: vpaddb %xmm1, %xmm3, %xmm4997; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3998; AVX1-NEXT: vpminub %xmm4, %xmm3, %xmm4999; AVX1-NEXT: vpcmpeqb %xmm4, %xmm3, %xmm31000; AVX1-NEXT: vpxor %xmm1, %xmm3, %xmm31001; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm01002; AVX1-NEXT: vpminub %xmm2, %xmm0, %xmm21003; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm01004; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm01005; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm01006; AVX1-NEXT: retq1007;1008; AVX2-LABEL: eq_1_v32i8:1009; AVX2: # %bb.0:1010; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm11011; AVX2-NEXT: vpaddb %ymm1, %ymm0, %ymm21012; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm01013; AVX2-NEXT: vpminub %ymm2, %ymm0, %ymm21014; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm01015; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm01016; AVX2-NEXT: retq1017;1018; XOP-LABEL: eq_1_v32i8:1019; XOP: # %bb.0:1020; XOP-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11021; XOP-NEXT: vpaddb %xmm1, %xmm0, %xmm21022; XOP-NEXT: vextractf128 $1, %ymm0, %xmm31023; XOP-NEXT: vpaddb %xmm1, %xmm3, %xmm11024; XOP-NEXT: vpxor %xmm1, %xmm3, %xmm31025; XOP-NEXT: vpcomgtub %xmm1, %xmm3, %xmm11026; XOP-NEXT: vpxor %xmm2, %xmm0, %xmm01027; XOP-NEXT: vpcomgtub %xmm2, %xmm0, %xmm01028; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01029; XOP-NEXT: retq1030;1031; AVX512VPOPCNTDQ-LABEL: eq_1_v32i8:1032; AVX512VPOPCNTDQ: # %bb.0:1033; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm11034; AVX512VPOPCNTDQ-NEXT: vpaddb %ymm1, %ymm0, %ymm11035; AVX512VPOPCNTDQ-NEXT: vpxor %ymm1, %ymm0, %ymm01036; AVX512VPOPCNTDQ-NEXT: vpminub %ymm1, %ymm0, %ymm11037; AVX512VPOPCNTDQ-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm01038; AVX512VPOPCNTDQ-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm01039; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01040; AVX512VPOPCNTDQ-NEXT: retq1041;1042; AVX512VPOPCNTDQVL-LABEL: eq_1_v32i8:1043; AVX512VPOPCNTDQVL: # %bb.0:1044; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm11045; AVX512VPOPCNTDQVL-NEXT: vpaddb %ymm1, %ymm0, %ymm11046; AVX512VPOPCNTDQVL-NEXT: vpxor %ymm1, %ymm0, %ymm01047; AVX512VPOPCNTDQVL-NEXT: vpminub %ymm1, %ymm0, %ymm11048; AVX512VPOPCNTDQVL-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm01049; AVX512VPOPCNTDQVL-NEXT: vpternlogq {{.*#+}} ymm0 = ~ymm01050; AVX512VPOPCNTDQVL-NEXT: retq1051;1052; BITALG_NOVLX-LABEL: eq_1_v32i8:1053; BITALG_NOVLX: # %bb.0:1054; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01055; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm01056; BITALG_NOVLX-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01057; BITALG_NOVLX-NEXT: retq1058;1059; BITALG-LABEL: eq_1_v32i8:1060; BITALG: # %bb.0:1061; BITALG-NEXT: vpopcntb %ymm0, %ymm01062; BITALG-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01063; BITALG-NEXT: retq1064 %2 = tail call <32 x i8> @llvm.ctpop.v32i8(<32 x i8> %0)1065 %3 = icmp eq <32 x i8> %2, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>1066 %4 = sext <32 x i1> %3 to <32 x i8>1067 ret <32 x i8> %41068}1069 1070define <32 x i8> @ne_1_v32i8(<32 x i8> %0) {1071; AVX1-LABEL: ne_1_v32i8:1072; AVX1: # %bb.0:1073; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11074; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm21075; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31076; AVX1-NEXT: vpaddb %xmm1, %xmm3, %xmm11077; AVX1-NEXT: vpxor %xmm1, %xmm3, %xmm31078; AVX1-NEXT: vpminub %xmm1, %xmm3, %xmm11079; AVX1-NEXT: vpcmpeqb %xmm1, %xmm3, %xmm11080; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm01081; AVX1-NEXT: vpminub %xmm2, %xmm0, %xmm21082; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm01083; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01084; AVX1-NEXT: retq1085;1086; AVX2-LABEL: ne_1_v32i8:1087; AVX2: # %bb.0:1088; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm11089; AVX2-NEXT: vpaddb %ymm1, %ymm0, %ymm11090; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm01091; AVX2-NEXT: vpminub %ymm1, %ymm0, %ymm11092; AVX2-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm01093; AVX2-NEXT: retq1094;1095; XOP-LABEL: ne_1_v32i8:1096; XOP: # %bb.0:1097; XOP-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11098; XOP-NEXT: vpaddb %xmm1, %xmm0, %xmm21099; XOP-NEXT: vextractf128 $1, %ymm0, %xmm31100; XOP-NEXT: vpaddb %xmm1, %xmm3, %xmm11101; XOP-NEXT: vpxor %xmm1, %xmm3, %xmm31102; XOP-NEXT: vpcomleub %xmm1, %xmm3, %xmm11103; XOP-NEXT: vpxor %xmm2, %xmm0, %xmm01104; XOP-NEXT: vpcomleub %xmm2, %xmm0, %xmm01105; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01106; XOP-NEXT: retq1107;1108; AVX512VPOPCNTDQ-LABEL: ne_1_v32i8:1109; AVX512VPOPCNTDQ: # %bb.0:1110; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm11111; AVX512VPOPCNTDQ-NEXT: vpaddb %ymm1, %ymm0, %ymm11112; AVX512VPOPCNTDQ-NEXT: vpxor %ymm1, %ymm0, %ymm01113; AVX512VPOPCNTDQ-NEXT: vpminub %ymm1, %ymm0, %ymm11114; AVX512VPOPCNTDQ-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm01115; AVX512VPOPCNTDQ-NEXT: retq1116;1117; AVX512VPOPCNTDQVL-LABEL: ne_1_v32i8:1118; AVX512VPOPCNTDQVL: # %bb.0:1119; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm11120; AVX512VPOPCNTDQVL-NEXT: vpaddb %ymm1, %ymm0, %ymm11121; AVX512VPOPCNTDQVL-NEXT: vpxor %ymm1, %ymm0, %ymm01122; AVX512VPOPCNTDQVL-NEXT: vpminub %ymm1, %ymm0, %ymm11123; AVX512VPOPCNTDQVL-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm01124; AVX512VPOPCNTDQVL-NEXT: retq1125;1126; BITALG_NOVLX-LABEL: ne_1_v32i8:1127; BITALG_NOVLX: # %bb.0:1128; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01129; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm01130; BITALG_NOVLX-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01131; BITALG_NOVLX-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm01132; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01133; BITALG_NOVLX-NEXT: retq1134;1135; BITALG-LABEL: ne_1_v32i8:1136; BITALG: # %bb.0:1137; BITALG-NEXT: vpopcntb %ymm0, %ymm01138; BITALG-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01139; BITALG-NEXT: vpternlogq {{.*#+}} ymm0 = ~ymm01140; BITALG-NEXT: retq1141 %2 = tail call <32 x i8> @llvm.ctpop.v32i8(<32 x i8> %0)1142 %3 = icmp ne <32 x i8> %2, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>1143 %4 = sext <32 x i1> %3 to <32 x i8>1144 ret <32 x i8> %41145}1146 1147declare <4 x i64> @llvm.ctpop.v4i64(<4 x i64>)1148declare <8 x i32> @llvm.ctpop.v8i32(<8 x i32>)1149declare <16 x i16> @llvm.ctpop.v16i16(<16 x i16>)1150declare <32 x i8> @llvm.ctpop.v32i8(<32 x i8>)1151