1416 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=SSE,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse3 | FileCheck %s --check-prefixes=SSE,SSE34; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE,SSSE35; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE416; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX17; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX28; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop | FileCheck %s --check-prefixes=AVX,XOP9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vpopcntdq | FileCheck %s --check-prefixes=AVX,AVX512,AVX512VPOPCNTDQ10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vpopcntdq,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512VPOPCNTDQVL11; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bitalg | FileCheck %s --check-prefix=BITALG_NOVLX12; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bitalg,+avx512vl | FileCheck %s --check-prefix=BITALG13 14define <2 x i64> @testv2i64(<2 x i64> %in) nounwind {15; SSE2-LABEL: testv2i64:16; SSE2: # %bb.0:17; SSE2-NEXT: movdqa %xmm0, %xmm118; SSE2-NEXT: psrlw $1, %xmm119; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm120; SSE2-NEXT: psubb %xmm1, %xmm021; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]22; SSE2-NEXT: movdqa %xmm0, %xmm223; SSE2-NEXT: pand %xmm1, %xmm224; SSE2-NEXT: psrlw $2, %xmm025; SSE2-NEXT: pand %xmm1, %xmm026; SSE2-NEXT: paddb %xmm2, %xmm027; SSE2-NEXT: movdqa %xmm0, %xmm128; SSE2-NEXT: psrlw $4, %xmm129; SSE2-NEXT: paddb %xmm1, %xmm030; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm031; SSE2-NEXT: pxor %xmm1, %xmm132; SSE2-NEXT: psadbw %xmm1, %xmm033; SSE2-NEXT: retq34;35; SSE3-LABEL: testv2i64:36; SSE3: # %bb.0:37; SSE3-NEXT: movdqa %xmm0, %xmm138; SSE3-NEXT: psrlw $1, %xmm139; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm140; SSE3-NEXT: psubb %xmm1, %xmm041; SSE3-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]42; SSE3-NEXT: movdqa %xmm0, %xmm243; SSE3-NEXT: pand %xmm1, %xmm244; SSE3-NEXT: psrlw $2, %xmm045; SSE3-NEXT: pand %xmm1, %xmm046; SSE3-NEXT: paddb %xmm2, %xmm047; SSE3-NEXT: movdqa %xmm0, %xmm148; SSE3-NEXT: psrlw $4, %xmm149; SSE3-NEXT: paddb %xmm1, %xmm050; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm051; SSE3-NEXT: pxor %xmm1, %xmm152; SSE3-NEXT: psadbw %xmm1, %xmm053; SSE3-NEXT: retq54;55; SSSE3-LABEL: testv2i64:56; SSSE3: # %bb.0:57; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]58; SSSE3-NEXT: movdqa %xmm0, %xmm259; SSSE3-NEXT: pand %xmm1, %xmm260; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]61; SSSE3-NEXT: movdqa %xmm3, %xmm462; SSSE3-NEXT: pshufb %xmm2, %xmm463; SSSE3-NEXT: psrlw $4, %xmm064; SSSE3-NEXT: pand %xmm1, %xmm065; SSSE3-NEXT: pshufb %xmm0, %xmm366; SSSE3-NEXT: paddb %xmm4, %xmm367; SSSE3-NEXT: pxor %xmm0, %xmm068; SSSE3-NEXT: psadbw %xmm3, %xmm069; SSSE3-NEXT: retq70;71; SSE41-LABEL: testv2i64:72; SSE41: # %bb.0:73; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]74; SSE41-NEXT: movdqa %xmm0, %xmm275; SSE41-NEXT: pand %xmm1, %xmm276; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]77; SSE41-NEXT: movdqa %xmm3, %xmm478; SSE41-NEXT: pshufb %xmm2, %xmm479; SSE41-NEXT: psrlw $4, %xmm080; SSE41-NEXT: pand %xmm1, %xmm081; SSE41-NEXT: pshufb %xmm0, %xmm382; SSE41-NEXT: paddb %xmm4, %xmm383; SSE41-NEXT: pxor %xmm0, %xmm084; SSE41-NEXT: psadbw %xmm3, %xmm085; SSE41-NEXT: retq86;87; AVX1-LABEL: testv2i64:88; AVX1: # %bb.0:89; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]90; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm291; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]92; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm293; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm094; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm095; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm096; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm097; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm198; AVX1-NEXT: vpsadbw %xmm1, %xmm0, %xmm099; AVX1-NEXT: retq100;101; AVX2-LABEL: testv2i64:102; AVX2: # %bb.0:103; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]104; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm2105; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]106; AVX2-NEXT: vpshufb %xmm2, %xmm3, %xmm2107; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm0108; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0109; AVX2-NEXT: vpshufb %xmm0, %xmm3, %xmm0110; AVX2-NEXT: vpaddb %xmm2, %xmm0, %xmm0111; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1112; AVX2-NEXT: vpsadbw %xmm1, %xmm0, %xmm0113; AVX2-NEXT: retq114;115; XOP-LABEL: testv2i64:116; XOP: # %bb.0:117; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1118; XOP-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]119; XOP-NEXT: vpshufb %xmm1, %xmm2, %xmm1120; XOP-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0121; XOP-NEXT: vpshufb %xmm0, %xmm2, %xmm0122; XOP-NEXT: vpaddb %xmm1, %xmm0, %xmm0123; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1124; XOP-NEXT: vpsadbw %xmm1, %xmm0, %xmm0125; XOP-NEXT: retq126;127; AVX512VPOPCNTDQ-LABEL: testv2i64:128; AVX512VPOPCNTDQ: # %bb.0:129; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0130; AVX512VPOPCNTDQ-NEXT: vpopcntq %zmm0, %zmm0131; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0132; AVX512VPOPCNTDQ-NEXT: vzeroupper133; AVX512VPOPCNTDQ-NEXT: retq134;135; AVX512VPOPCNTDQVL-LABEL: testv2i64:136; AVX512VPOPCNTDQVL: # %bb.0:137; AVX512VPOPCNTDQVL-NEXT: vpopcntq %xmm0, %xmm0138; AVX512VPOPCNTDQVL-NEXT: retq139;140; BITALG_NOVLX-LABEL: testv2i64:141; BITALG_NOVLX: # %bb.0:142; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0143; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm0144; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm1, %xmm1145; BITALG_NOVLX-NEXT: vpsadbw %xmm1, %xmm0, %xmm0146; BITALG_NOVLX-NEXT: vzeroupper147; BITALG_NOVLX-NEXT: retq148;149; BITALG-LABEL: testv2i64:150; BITALG: # %bb.0:151; BITALG-NEXT: vpopcntb %xmm0, %xmm0152; BITALG-NEXT: vpxor %xmm1, %xmm1, %xmm1153; BITALG-NEXT: vpsadbw %xmm1, %xmm0, %xmm0154; BITALG-NEXT: retq155 %out = call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %in)156 ret <2 x i64> %out157}158 159define <4 x i32> @testv4i32(<4 x i32> %in) nounwind {160; SSE2-LABEL: testv4i32:161; SSE2: # %bb.0:162; SSE2-NEXT: movdqa %xmm0, %xmm1163; SSE2-NEXT: psrlw $1, %xmm1164; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1165; SSE2-NEXT: psubb %xmm1, %xmm0166; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]167; SSE2-NEXT: movdqa %xmm0, %xmm2168; SSE2-NEXT: pand %xmm1, %xmm2169; SSE2-NEXT: psrlw $2, %xmm0170; SSE2-NEXT: pand %xmm1, %xmm0171; SSE2-NEXT: paddb %xmm2, %xmm0172; SSE2-NEXT: movdqa %xmm0, %xmm1173; SSE2-NEXT: psrlw $4, %xmm1174; SSE2-NEXT: paddb %xmm1, %xmm0175; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0176; SSE2-NEXT: pxor %xmm1, %xmm1177; SSE2-NEXT: movdqa %xmm0, %xmm2178; SSE2-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]179; SSE2-NEXT: psadbw %xmm1, %xmm2180; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]181; SSE2-NEXT: psadbw %xmm1, %xmm0182; SSE2-NEXT: packuswb %xmm2, %xmm0183; SSE2-NEXT: retq184;185; SSE3-LABEL: testv4i32:186; SSE3: # %bb.0:187; SSE3-NEXT: movdqa %xmm0, %xmm1188; SSE3-NEXT: psrlw $1, %xmm1189; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1190; SSE3-NEXT: psubb %xmm1, %xmm0191; SSE3-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]192; SSE3-NEXT: movdqa %xmm0, %xmm2193; SSE3-NEXT: pand %xmm1, %xmm2194; SSE3-NEXT: psrlw $2, %xmm0195; SSE3-NEXT: pand %xmm1, %xmm0196; SSE3-NEXT: paddb %xmm2, %xmm0197; SSE3-NEXT: movdqa %xmm0, %xmm1198; SSE3-NEXT: psrlw $4, %xmm1199; SSE3-NEXT: paddb %xmm1, %xmm0200; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0201; SSE3-NEXT: pxor %xmm1, %xmm1202; SSE3-NEXT: movdqa %xmm0, %xmm2203; SSE3-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]204; SSE3-NEXT: psadbw %xmm1, %xmm2205; SSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]206; SSE3-NEXT: psadbw %xmm1, %xmm0207; SSE3-NEXT: packuswb %xmm2, %xmm0208; SSE3-NEXT: retq209;210; SSSE3-LABEL: testv4i32:211; SSSE3: # %bb.0:212; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]213; SSSE3-NEXT: movdqa %xmm0, %xmm3214; SSSE3-NEXT: pand %xmm2, %xmm3215; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]216; SSSE3-NEXT: movdqa %xmm1, %xmm4217; SSSE3-NEXT: pshufb %xmm3, %xmm4218; SSSE3-NEXT: psrlw $4, %xmm0219; SSSE3-NEXT: pand %xmm2, %xmm0220; SSSE3-NEXT: pshufb %xmm0, %xmm1221; SSSE3-NEXT: paddb %xmm4, %xmm1222; SSSE3-NEXT: pxor %xmm0, %xmm0223; SSSE3-NEXT: movdqa %xmm1, %xmm2224; SSSE3-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm0[2],xmm2[3],xmm0[3]225; SSSE3-NEXT: psadbw %xmm0, %xmm2226; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]227; SSSE3-NEXT: psadbw %xmm0, %xmm1228; SSSE3-NEXT: packuswb %xmm2, %xmm1229; SSSE3-NEXT: movdqa %xmm1, %xmm0230; SSSE3-NEXT: retq231;232; SSE41-LABEL: testv4i32:233; SSE41: # %bb.0:234; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]235; SSE41-NEXT: movdqa %xmm0, %xmm2236; SSE41-NEXT: pand %xmm1, %xmm2237; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]238; SSE41-NEXT: movdqa %xmm3, %xmm4239; SSE41-NEXT: pshufb %xmm2, %xmm4240; SSE41-NEXT: psrlw $4, %xmm0241; SSE41-NEXT: pand %xmm1, %xmm0242; SSE41-NEXT: pshufb %xmm0, %xmm3243; SSE41-NEXT: paddb %xmm4, %xmm3244; SSE41-NEXT: pxor %xmm1, %xmm1245; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm3[0],zero,xmm3[1],zero246; SSE41-NEXT: punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm1[2],xmm3[3],xmm1[3]247; SSE41-NEXT: psadbw %xmm1, %xmm3248; SSE41-NEXT: psadbw %xmm1, %xmm0249; SSE41-NEXT: packuswb %xmm3, %xmm0250; SSE41-NEXT: retq251;252; AVX1-LABEL: testv4i32:253; AVX1: # %bb.0:254; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]255; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm2256; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]257; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2258; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0259; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0260; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm0261; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0262; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1263; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]264; AVX1-NEXT: vpsadbw %xmm1, %xmm2, %xmm2265; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero266; AVX1-NEXT: vpsadbw %xmm1, %xmm0, %xmm0267; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0268; AVX1-NEXT: retq269;270; AVX2-LABEL: testv4i32:271; AVX2: # %bb.0:272; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]273; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm2274; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]275; AVX2-NEXT: vpshufb %xmm2, %xmm3, %xmm2276; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm0277; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0278; AVX2-NEXT: vpshufb %xmm0, %xmm3, %xmm0279; AVX2-NEXT: vpaddb %xmm2, %xmm0, %xmm0280; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1281; AVX2-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]282; AVX2-NEXT: vpsadbw %xmm1, %xmm2, %xmm2283; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero284; AVX2-NEXT: vpsadbw %xmm1, %xmm0, %xmm0285; AVX2-NEXT: vpackuswb %xmm2, %xmm0, %xmm0286; AVX2-NEXT: retq287;288; XOP-LABEL: testv4i32:289; XOP: # %bb.0:290; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1291; XOP-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]292; XOP-NEXT: vpshufb %xmm1, %xmm2, %xmm1293; XOP-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0294; XOP-NEXT: vpshufb %xmm0, %xmm2, %xmm0295; XOP-NEXT: vpaddb %xmm1, %xmm0, %xmm0296; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1297; XOP-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]298; XOP-NEXT: vpsadbw %xmm1, %xmm2, %xmm2299; XOP-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero300; XOP-NEXT: vpsadbw %xmm1, %xmm0, %xmm0301; XOP-NEXT: vpackuswb %xmm2, %xmm0, %xmm0302; XOP-NEXT: retq303;304; AVX512VPOPCNTDQ-LABEL: testv4i32:305; AVX512VPOPCNTDQ: # %bb.0:306; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0307; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm0308; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0309; AVX512VPOPCNTDQ-NEXT: vzeroupper310; AVX512VPOPCNTDQ-NEXT: retq311;312; AVX512VPOPCNTDQVL-LABEL: testv4i32:313; AVX512VPOPCNTDQVL: # %bb.0:314; AVX512VPOPCNTDQVL-NEXT: vpopcntd %xmm0, %xmm0315; AVX512VPOPCNTDQVL-NEXT: retq316;317; BITALG_NOVLX-LABEL: testv4i32:318; BITALG_NOVLX: # %bb.0:319; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0320; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm0321; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm1, %xmm1322; BITALG_NOVLX-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]323; BITALG_NOVLX-NEXT: vpsadbw %xmm1, %xmm2, %xmm2324; BITALG_NOVLX-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero325; BITALG_NOVLX-NEXT: vpsadbw %xmm1, %xmm0, %xmm0326; BITALG_NOVLX-NEXT: vpackuswb %xmm2, %xmm0, %xmm0327; BITALG_NOVLX-NEXT: vzeroupper328; BITALG_NOVLX-NEXT: retq329;330; BITALG-LABEL: testv4i32:331; BITALG: # %bb.0:332; BITALG-NEXT: vpopcntb %xmm0, %xmm0333; BITALG-NEXT: vpxor %xmm1, %xmm1, %xmm1334; BITALG-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]335; BITALG-NEXT: vpsadbw %xmm1, %xmm2, %xmm2336; BITALG-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero337; BITALG-NEXT: vpsadbw %xmm1, %xmm0, %xmm0338; BITALG-NEXT: vpackuswb %xmm2, %xmm0, %xmm0339; BITALG-NEXT: retq340 %out = call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %in)341 ret <4 x i32> %out342}343 344define <8 x i16> @testv8i16(<8 x i16> %in) nounwind {345; SSE2-LABEL: testv8i16:346; SSE2: # %bb.0:347; SSE2-NEXT: movdqa %xmm0, %xmm1348; SSE2-NEXT: psrlw $1, %xmm1349; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1350; SSE2-NEXT: psubb %xmm1, %xmm0351; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]352; SSE2-NEXT: movdqa %xmm0, %xmm2353; SSE2-NEXT: pand %xmm1, %xmm2354; SSE2-NEXT: psrlw $2, %xmm0355; SSE2-NEXT: pand %xmm1, %xmm0356; SSE2-NEXT: paddb %xmm2, %xmm0357; SSE2-NEXT: movdqa %xmm0, %xmm1358; SSE2-NEXT: psrlw $4, %xmm1359; SSE2-NEXT: paddb %xmm1, %xmm0360; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0361; SSE2-NEXT: movdqa %xmm0, %xmm1362; SSE2-NEXT: psllw $8, %xmm1363; SSE2-NEXT: paddb %xmm1, %xmm0364; SSE2-NEXT: psrlw $8, %xmm0365; SSE2-NEXT: retq366;367; SSE3-LABEL: testv8i16:368; SSE3: # %bb.0:369; SSE3-NEXT: movdqa %xmm0, %xmm1370; SSE3-NEXT: psrlw $1, %xmm1371; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1372; SSE3-NEXT: psubb %xmm1, %xmm0373; SSE3-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]374; SSE3-NEXT: movdqa %xmm0, %xmm2375; SSE3-NEXT: pand %xmm1, %xmm2376; SSE3-NEXT: psrlw $2, %xmm0377; SSE3-NEXT: pand %xmm1, %xmm0378; SSE3-NEXT: paddb %xmm2, %xmm0379; SSE3-NEXT: movdqa %xmm0, %xmm1380; SSE3-NEXT: psrlw $4, %xmm1381; SSE3-NEXT: paddb %xmm1, %xmm0382; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0383; SSE3-NEXT: movdqa %xmm0, %xmm1384; SSE3-NEXT: psllw $8, %xmm1385; SSE3-NEXT: paddb %xmm1, %xmm0386; SSE3-NEXT: psrlw $8, %xmm0387; SSE3-NEXT: retq388;389; SSSE3-LABEL: testv8i16:390; SSSE3: # %bb.0:391; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]392; SSSE3-NEXT: movdqa %xmm0, %xmm2393; SSSE3-NEXT: pand %xmm1, %xmm2394; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]395; SSSE3-NEXT: movdqa %xmm3, %xmm4396; SSSE3-NEXT: pshufb %xmm2, %xmm4397; SSSE3-NEXT: psrlw $4, %xmm0398; SSSE3-NEXT: pand %xmm1, %xmm0399; SSSE3-NEXT: pshufb %xmm0, %xmm3400; SSSE3-NEXT: paddb %xmm4, %xmm3401; SSSE3-NEXT: movdqa %xmm3, %xmm0402; SSSE3-NEXT: psllw $8, %xmm0403; SSSE3-NEXT: paddb %xmm3, %xmm0404; SSSE3-NEXT: psrlw $8, %xmm0405; SSSE3-NEXT: retq406;407; SSE41-LABEL: testv8i16:408; SSE41: # %bb.0:409; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]410; SSE41-NEXT: movdqa %xmm0, %xmm2411; SSE41-NEXT: pand %xmm1, %xmm2412; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]413; SSE41-NEXT: movdqa %xmm3, %xmm4414; SSE41-NEXT: pshufb %xmm2, %xmm4415; SSE41-NEXT: psrlw $4, %xmm0416; SSE41-NEXT: pand %xmm1, %xmm0417; SSE41-NEXT: pshufb %xmm0, %xmm3418; SSE41-NEXT: paddb %xmm4, %xmm3419; SSE41-NEXT: movdqa %xmm3, %xmm0420; SSE41-NEXT: psllw $8, %xmm0421; SSE41-NEXT: paddb %xmm3, %xmm0422; SSE41-NEXT: psrlw $8, %xmm0423; SSE41-NEXT: retq424;425; AVX1-LABEL: testv8i16:426; AVX1: # %bb.0:427; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]428; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm2429; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]430; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2431; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0432; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0433; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm0434; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0435; AVX1-NEXT: vpsllw $8, %xmm0, %xmm1436; AVX1-NEXT: vpaddb %xmm0, %xmm1, %xmm0437; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0438; AVX1-NEXT: retq439;440; AVX2-LABEL: testv8i16:441; AVX2: # %bb.0:442; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]443; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm2444; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]445; AVX2-NEXT: vpshufb %xmm2, %xmm3, %xmm2446; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm0447; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0448; AVX2-NEXT: vpshufb %xmm0, %xmm3, %xmm0449; AVX2-NEXT: vpaddb %xmm2, %xmm0, %xmm0450; AVX2-NEXT: vpsllw $8, %xmm0, %xmm1451; AVX2-NEXT: vpaddb %xmm0, %xmm1, %xmm0452; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm0453; AVX2-NEXT: retq454;455; XOP-LABEL: testv8i16:456; XOP: # %bb.0:457; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1458; XOP-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]459; XOP-NEXT: vpshufb %xmm1, %xmm2, %xmm1460; XOP-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0461; XOP-NEXT: vpshufb %xmm0, %xmm2, %xmm0462; XOP-NEXT: vpaddb %xmm1, %xmm0, %xmm0463; XOP-NEXT: vpsllw $8, %xmm0, %xmm1464; XOP-NEXT: vpaddb %xmm0, %xmm1, %xmm0465; XOP-NEXT: vpsrlw $8, %xmm0, %xmm0466; XOP-NEXT: retq467;468; AVX512VPOPCNTDQ-LABEL: testv8i16:469; AVX512VPOPCNTDQ: # %bb.0:470; AVX512VPOPCNTDQ-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero471; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm0472; AVX512VPOPCNTDQ-NEXT: vpmovdw %zmm0, %ymm0473; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0474; AVX512VPOPCNTDQ-NEXT: vzeroupper475; AVX512VPOPCNTDQ-NEXT: retq476;477; AVX512VPOPCNTDQVL-LABEL: testv8i16:478; AVX512VPOPCNTDQVL: # %bb.0:479; AVX512VPOPCNTDQVL-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero480; AVX512VPOPCNTDQVL-NEXT: vpopcntd %ymm0, %ymm0481; AVX512VPOPCNTDQVL-NEXT: vpmovdw %ymm0, %xmm0482; AVX512VPOPCNTDQVL-NEXT: vzeroupper483; AVX512VPOPCNTDQVL-NEXT: retq484;485; BITALG_NOVLX-LABEL: testv8i16:486; BITALG_NOVLX: # %bb.0:487; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0488; BITALG_NOVLX-NEXT: vpopcntw %zmm0, %zmm0489; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0490; BITALG_NOVLX-NEXT: vzeroupper491; BITALG_NOVLX-NEXT: retq492;493; BITALG-LABEL: testv8i16:494; BITALG: # %bb.0:495; BITALG-NEXT: vpopcntw %xmm0, %xmm0496; BITALG-NEXT: retq497 %out = call <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %in)498 ret <8 x i16> %out499}500 501define <16 x i8> @testv16i8(<16 x i8> %in) nounwind {502; SSE2-LABEL: testv16i8:503; SSE2: # %bb.0:504; SSE2-NEXT: movdqa %xmm0, %xmm1505; SSE2-NEXT: psrlw $1, %xmm1506; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1507; SSE2-NEXT: psubb %xmm1, %xmm0508; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]509; SSE2-NEXT: movdqa %xmm0, %xmm2510; SSE2-NEXT: pand %xmm1, %xmm2511; SSE2-NEXT: psrlw $2, %xmm0512; SSE2-NEXT: pand %xmm1, %xmm0513; SSE2-NEXT: paddb %xmm2, %xmm0514; SSE2-NEXT: movdqa %xmm0, %xmm1515; SSE2-NEXT: psrlw $4, %xmm1516; SSE2-NEXT: paddb %xmm1, %xmm0517; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0518; SSE2-NEXT: retq519;520; SSE3-LABEL: testv16i8:521; SSE3: # %bb.0:522; SSE3-NEXT: movdqa %xmm0, %xmm1523; SSE3-NEXT: psrlw $1, %xmm1524; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1525; SSE3-NEXT: psubb %xmm1, %xmm0526; SSE3-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]527; SSE3-NEXT: movdqa %xmm0, %xmm2528; SSE3-NEXT: pand %xmm1, %xmm2529; SSE3-NEXT: psrlw $2, %xmm0530; SSE3-NEXT: pand %xmm1, %xmm0531; SSE3-NEXT: paddb %xmm2, %xmm0532; SSE3-NEXT: movdqa %xmm0, %xmm1533; SSE3-NEXT: psrlw $4, %xmm1534; SSE3-NEXT: paddb %xmm1, %xmm0535; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0536; SSE3-NEXT: retq537;538; SSSE3-LABEL: testv16i8:539; SSSE3: # %bb.0:540; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]541; SSSE3-NEXT: movdqa %xmm0, %xmm3542; SSSE3-NEXT: pand %xmm2, %xmm3543; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]544; SSSE3-NEXT: movdqa %xmm1, %xmm4545; SSSE3-NEXT: pshufb %xmm3, %xmm4546; SSSE3-NEXT: psrlw $4, %xmm0547; SSSE3-NEXT: pand %xmm2, %xmm0548; SSSE3-NEXT: pshufb %xmm0, %xmm1549; SSSE3-NEXT: paddb %xmm4, %xmm1550; SSSE3-NEXT: movdqa %xmm1, %xmm0551; SSSE3-NEXT: retq552;553; SSE41-LABEL: testv16i8:554; SSE41: # %bb.0:555; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]556; SSE41-NEXT: movdqa %xmm0, %xmm3557; SSE41-NEXT: pand %xmm2, %xmm3558; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]559; SSE41-NEXT: movdqa %xmm1, %xmm4560; SSE41-NEXT: pshufb %xmm3, %xmm4561; SSE41-NEXT: psrlw $4, %xmm0562; SSE41-NEXT: pand %xmm2, %xmm0563; SSE41-NEXT: pshufb %xmm0, %xmm1564; SSE41-NEXT: paddb %xmm4, %xmm1565; SSE41-NEXT: movdqa %xmm1, %xmm0566; SSE41-NEXT: retq567;568; AVX1-LABEL: testv16i8:569; AVX1: # %bb.0:570; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]571; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm2572; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]573; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2574; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0575; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0576; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm0577; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0578; AVX1-NEXT: retq579;580; AVX2-LABEL: testv16i8:581; AVX2: # %bb.0:582; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]583; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm2584; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]585; AVX2-NEXT: vpshufb %xmm2, %xmm3, %xmm2586; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm0587; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0588; AVX2-NEXT: vpshufb %xmm0, %xmm3, %xmm0589; AVX2-NEXT: vpaddb %xmm2, %xmm0, %xmm0590; AVX2-NEXT: retq591;592; XOP-LABEL: testv16i8:593; XOP: # %bb.0:594; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1595; XOP-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]596; XOP-NEXT: vpshufb %xmm1, %xmm2, %xmm1597; XOP-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0598; XOP-NEXT: vpshufb %xmm0, %xmm2, %xmm0599; XOP-NEXT: vpaddb %xmm1, %xmm0, %xmm0600; XOP-NEXT: retq601;602; AVX512-LABEL: testv16i8:603; AVX512: # %bb.0:604; AVX512-NEXT: vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero605; AVX512-NEXT: vpopcntd %zmm0, %zmm0606; AVX512-NEXT: vpmovdb %zmm0, %xmm0607; AVX512-NEXT: vzeroupper608; AVX512-NEXT: retq609;610; BITALG_NOVLX-LABEL: testv16i8:611; BITALG_NOVLX: # %bb.0:612; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0613; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm0614; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0615; BITALG_NOVLX-NEXT: vzeroupper616; BITALG_NOVLX-NEXT: retq617;618; BITALG-LABEL: testv16i8:619; BITALG: # %bb.0:620; BITALG-NEXT: vpopcntb %xmm0, %xmm0621; BITALG-NEXT: retq622 %out = call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %in)623 ret <16 x i8> %out624}625 626define <2 x i64> @foldv2i64() nounwind {627; SSE-LABEL: foldv2i64:628; SSE: # %bb.0:629; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,64]630; SSE-NEXT: retq631;632; AVX1OR2-LABEL: foldv2i64:633; AVX1OR2: # %bb.0:634; AVX1OR2-NEXT: vmovaps {{.*#+}} xmm0 = [1,64]635; AVX1OR2-NEXT: retq636;637; XOP-LABEL: foldv2i64:638; XOP: # %bb.0:639; XOP-NEXT: vmovaps {{.*#+}} xmm0 = [1,64]640; XOP-NEXT: retq641;642; AVX512-LABEL: foldv2i64:643; AVX512: # %bb.0:644; AVX512-NEXT: vpmovsxbq {{.*#+}} xmm0 = [1,64]645; AVX512-NEXT: retq646;647; BITALG_NOVLX-LABEL: foldv2i64:648; BITALG_NOVLX: # %bb.0:649; BITALG_NOVLX-NEXT: vpmovsxbq {{.*#+}} xmm0 = [1,64]650; BITALG_NOVLX-NEXT: retq651;652; BITALG-LABEL: foldv2i64:653; BITALG: # %bb.0:654; BITALG-NEXT: vpmovsxbq {{.*#+}} xmm0 = [1,64]655; BITALG-NEXT: retq656 %out = call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> <i64 256, i64 -1>)657 ret <2 x i64> %out658}659 660define <4 x i32> @foldv4i32() nounwind {661; SSE-LABEL: foldv4i32:662; SSE: # %bb.0:663; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,32,0,8]664; SSE-NEXT: retq665;666; AVX1OR2-LABEL: foldv4i32:667; AVX1OR2: # %bb.0:668; AVX1OR2-NEXT: vmovaps {{.*#+}} xmm0 = [1,32,0,8]669; AVX1OR2-NEXT: retq670;671; XOP-LABEL: foldv4i32:672; XOP: # %bb.0:673; XOP-NEXT: vmovaps {{.*#+}} xmm0 = [1,32,0,8]674; XOP-NEXT: retq675;676; AVX512-LABEL: foldv4i32:677; AVX512: # %bb.0:678; AVX512-NEXT: vpmovsxbd {{.*#+}} xmm0 = [1,32,0,8]679; AVX512-NEXT: retq680;681; BITALG_NOVLX-LABEL: foldv4i32:682; BITALG_NOVLX: # %bb.0:683; BITALG_NOVLX-NEXT: vpmovsxbd {{.*#+}} xmm0 = [1,32,0,8]684; BITALG_NOVLX-NEXT: retq685;686; BITALG-LABEL: foldv4i32:687; BITALG: # %bb.0:688; BITALG-NEXT: vpmovsxbd {{.*#+}} xmm0 = [1,32,0,8]689; BITALG-NEXT: retq690 %out = call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> <i32 256, i32 -1, i32 0, i32 255>)691 ret <4 x i32> %out692}693 694define <8 x i16> @foldv8i16() nounwind {695; SSE-LABEL: foldv8i16:696; SSE: # %bb.0:697; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,16,0,8,0,3,2,3]698; SSE-NEXT: retq699;700; AVX-LABEL: foldv8i16:701; AVX: # %bb.0:702; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [1,16,0,8,0,3,2,3]703; AVX-NEXT: retq704;705; BITALG_NOVLX-LABEL: foldv8i16:706; BITALG_NOVLX: # %bb.0:707; BITALG_NOVLX-NEXT: vmovaps {{.*#+}} xmm0 = [1,16,0,8,0,3,2,3]708; BITALG_NOVLX-NEXT: retq709;710; BITALG-LABEL: foldv8i16:711; BITALG: # %bb.0:712; BITALG-NEXT: vmovaps {{.*#+}} xmm0 = [1,16,0,8,0,3,2,3]713; BITALG-NEXT: retq714 %out = call <8 x i16> @llvm.ctpop.v8i16(<8 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88>)715 ret <8 x i16> %out716}717 718define <16 x i8> @foldv16i8() nounwind {719; SSE-LABEL: foldv16i8:720; SSE: # %bb.0:721; SSE-NEXT: movaps {{.*#+}} xmm0 = [0,8,0,8,0,3,2,3,7,7,1,1,1,1,1,1]722; SSE-NEXT: retq723;724; AVX-LABEL: foldv16i8:725; AVX: # %bb.0:726; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [0,8,0,8,0,3,2,3,7,7,1,1,1,1,1,1]727; AVX-NEXT: retq728;729; BITALG_NOVLX-LABEL: foldv16i8:730; BITALG_NOVLX: # %bb.0:731; BITALG_NOVLX-NEXT: vmovaps {{.*#+}} xmm0 = [0,8,0,8,0,3,2,3,7,7,1,1,1,1,1,1]732; BITALG_NOVLX-NEXT: retq733;734; BITALG-LABEL: foldv16i8:735; BITALG: # %bb.0:736; BITALG-NEXT: vmovaps {{.*#+}} xmm0 = [0,8,0,8,0,3,2,3,7,7,1,1,1,1,1,1]737; BITALG-NEXT: retq738 %out = call <16 x i8> @llvm.ctpop.v16i8(<16 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>)739 ret <16 x i8> %out740}741 742define <2 x i64> @eq_1_v2i64(<2 x i64> %0) {743; SSE-LABEL: eq_1_v2i64:744; SSE: # %bb.0:745; SSE-NEXT: pcmpeqd %xmm1, %xmm1746; SSE-NEXT: paddq %xmm0, %xmm1747; SSE-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1748; SSE-NEXT: pxor %xmm1, %xmm0749; SSE-NEXT: movdqa %xmm0, %xmm2750; SSE-NEXT: pcmpgtd %xmm1, %xmm2751; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]752; SSE-NEXT: pcmpeqd %xmm1, %xmm0753; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]754; SSE-NEXT: pand %xmm3, %xmm1755; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]756; SSE-NEXT: por %xmm1, %xmm0757; SSE-NEXT: retq758;759; AVX1OR2-LABEL: eq_1_v2i64:760; AVX1OR2: # %bb.0:761; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1762; AVX1OR2-NEXT: vpaddq %xmm1, %xmm0, %xmm1763; AVX1OR2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1764; AVX1OR2-NEXT: vpxor %xmm0, %xmm1, %xmm0765; AVX1OR2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0766; AVX1OR2-NEXT: retq767;768; XOP-LABEL: eq_1_v2i64:769; XOP: # %bb.0:770; XOP-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1771; XOP-NEXT: vpaddq %xmm1, %xmm0, %xmm1772; XOP-NEXT: vpxor %xmm1, %xmm0, %xmm0773; XOP-NEXT: vpcomgtuq %xmm1, %xmm0, %xmm0774; XOP-NEXT: retq775;776; AVX512VPOPCNTDQ-LABEL: eq_1_v2i64:777; AVX512VPOPCNTDQ: # %bb.0:778; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0779; AVX512VPOPCNTDQ-NEXT: vpopcntq %zmm0, %zmm0780; AVX512VPOPCNTDQ-NEXT: vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0781; AVX512VPOPCNTDQ-NEXT: vzeroupper782; AVX512VPOPCNTDQ-NEXT: retq783;784; AVX512VPOPCNTDQVL-LABEL: eq_1_v2i64:785; AVX512VPOPCNTDQVL: # %bb.0:786; AVX512VPOPCNTDQVL-NEXT: vpopcntq %xmm0, %xmm0787; AVX512VPOPCNTDQVL-NEXT: vpbroadcastq {{.*#+}} xmm1 = [1,1]788; AVX512VPOPCNTDQVL-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0789; AVX512VPOPCNTDQVL-NEXT: retq790;791; BITALG_NOVLX-LABEL: eq_1_v2i64:792; BITALG_NOVLX: # %bb.0:793; BITALG_NOVLX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1794; BITALG_NOVLX-NEXT: vpaddq %xmm1, %xmm0, %xmm1795; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm0, %xmm0796; BITALG_NOVLX-NEXT: vpminuq %zmm1, %zmm0, %zmm1797; BITALG_NOVLX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0798; BITALG_NOVLX-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm0799; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0800; BITALG_NOVLX-NEXT: vzeroupper801; BITALG_NOVLX-NEXT: retq802;803; BITALG-LABEL: eq_1_v2i64:804; BITALG: # %bb.0:805; BITALG-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1806; BITALG-NEXT: vpaddq %xmm1, %xmm0, %xmm2807; BITALG-NEXT: vpxor %xmm2, %xmm0, %xmm0808; BITALG-NEXT: vpcmpnleuq %xmm2, %xmm0, %k1809; BITALG-NEXT: vmovdqa64 %xmm1, %xmm0 {%k1} {z}810; BITALG-NEXT: retq811 %2 = tail call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %0)812 %3 = icmp eq <2 x i64> %2, <i64 1, i64 1>813 %4 = sext <2 x i1> %3 to <2 x i64>814 ret <2 x i64> %4815}816 817define <2 x i64> @ne_1_v2i64(<2 x i64> %0) {818; SSE-LABEL: ne_1_v2i64:819; SSE: # %bb.0:820; SSE-NEXT: pcmpeqd %xmm1, %xmm1821; SSE-NEXT: movdqa %xmm0, %xmm2822; SSE-NEXT: paddq %xmm1, %xmm2823; SSE-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2824; SSE-NEXT: pxor %xmm2, %xmm0825; SSE-NEXT: movdqa %xmm0, %xmm3826; SSE-NEXT: pcmpgtd %xmm2, %xmm3827; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]828; SSE-NEXT: pcmpeqd %xmm2, %xmm0829; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]830; SSE-NEXT: pand %xmm4, %xmm2831; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]832; SSE-NEXT: por %xmm2, %xmm0833; SSE-NEXT: pxor %xmm1, %xmm0834; SSE-NEXT: retq835;836; AVX1OR2-LABEL: ne_1_v2i64:837; AVX1OR2: # %bb.0:838; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1839; AVX1OR2-NEXT: vpaddq %xmm1, %xmm0, %xmm2840; AVX1OR2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2841; AVX1OR2-NEXT: vpxor %xmm0, %xmm2, %xmm0842; AVX1OR2-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm0843; AVX1OR2-NEXT: vpxor %xmm1, %xmm0, %xmm0844; AVX1OR2-NEXT: retq845;846; XOP-LABEL: ne_1_v2i64:847; XOP: # %bb.0:848; XOP-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1849; XOP-NEXT: vpaddq %xmm1, %xmm0, %xmm1850; XOP-NEXT: vpxor %xmm1, %xmm0, %xmm0851; XOP-NEXT: vpcomleuq %xmm1, %xmm0, %xmm0852; XOP-NEXT: retq853;854; AVX512VPOPCNTDQ-LABEL: ne_1_v2i64:855; AVX512VPOPCNTDQ: # %bb.0:856; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0857; AVX512VPOPCNTDQ-NEXT: vpopcntq %zmm0, %zmm0858; AVX512VPOPCNTDQ-NEXT: vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0859; AVX512VPOPCNTDQ-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm0860; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0861; AVX512VPOPCNTDQ-NEXT: vzeroupper862; AVX512VPOPCNTDQ-NEXT: retq863;864; AVX512VPOPCNTDQVL-LABEL: ne_1_v2i64:865; AVX512VPOPCNTDQVL: # %bb.0:866; AVX512VPOPCNTDQVL-NEXT: vpopcntq %xmm0, %xmm0867; AVX512VPOPCNTDQVL-NEXT: vpbroadcastq {{.*#+}} xmm1 = [1,1]868; AVX512VPOPCNTDQVL-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0869; AVX512VPOPCNTDQVL-NEXT: vpternlogq {{.*#+}} xmm0 = ~xmm0870; AVX512VPOPCNTDQVL-NEXT: retq871;872; BITALG_NOVLX-LABEL: ne_1_v2i64:873; BITALG_NOVLX: # %bb.0:874; BITALG_NOVLX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1875; BITALG_NOVLX-NEXT: vpaddq %xmm1, %xmm0, %xmm1876; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm0, %xmm0877; BITALG_NOVLX-NEXT: vpminuq %zmm1, %zmm0, %zmm1878; BITALG_NOVLX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0879; BITALG_NOVLX-NEXT: vzeroupper880; BITALG_NOVLX-NEXT: retq881;882; BITALG-LABEL: ne_1_v2i64:883; BITALG: # %bb.0:884; BITALG-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1885; BITALG-NEXT: vpaddq %xmm1, %xmm0, %xmm2886; BITALG-NEXT: vpxor %xmm2, %xmm0, %xmm0887; BITALG-NEXT: vpcmpleuq %xmm2, %xmm0, %k1888; BITALG-NEXT: vmovdqa64 %xmm1, %xmm0 {%k1} {z}889; BITALG-NEXT: retq890 %2 = tail call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %0)891 %3 = icmp ne <2 x i64> %2, <i64 1, i64 1>892 %4 = sext <2 x i1> %3 to <2 x i64>893 ret <2 x i64> %4894}895 896define <4 x i32> @eq_1_v4i32(<4 x i32> %0) {897; SSE2-LABEL: eq_1_v4i32:898; SSE2: # %bb.0:899; SSE2-NEXT: pcmpeqd %xmm1, %xmm1900; SSE2-NEXT: paddd %xmm0, %xmm1901; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1902; SSE2-NEXT: pxor %xmm1, %xmm0903; SSE2-NEXT: pcmpgtd %xmm1, %xmm0904; SSE2-NEXT: retq905;906; SSE3-LABEL: eq_1_v4i32:907; SSE3: # %bb.0:908; SSE3-NEXT: pcmpeqd %xmm1, %xmm1909; SSE3-NEXT: paddd %xmm0, %xmm1910; SSE3-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1911; SSE3-NEXT: pxor %xmm1, %xmm0912; SSE3-NEXT: pcmpgtd %xmm1, %xmm0913; SSE3-NEXT: retq914;915; SSSE3-LABEL: eq_1_v4i32:916; SSSE3: # %bb.0:917; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1918; SSSE3-NEXT: paddd %xmm0, %xmm1919; SSSE3-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1920; SSSE3-NEXT: pxor %xmm1, %xmm0921; SSSE3-NEXT: pcmpgtd %xmm1, %xmm0922; SSSE3-NEXT: retq923;924; SSE41-LABEL: eq_1_v4i32:925; SSE41: # %bb.0:926; SSE41-NEXT: pcmpeqd %xmm1, %xmm1927; SSE41-NEXT: movdqa %xmm0, %xmm2928; SSE41-NEXT: paddd %xmm1, %xmm2929; SSE41-NEXT: pxor %xmm2, %xmm0930; SSE41-NEXT: pminud %xmm0, %xmm2931; SSE41-NEXT: pcmpeqd %xmm2, %xmm0932; SSE41-NEXT: pxor %xmm1, %xmm0933; SSE41-NEXT: retq934;935; AVX1OR2-LABEL: eq_1_v4i32:936; AVX1OR2: # %bb.0:937; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1938; AVX1OR2-NEXT: vpaddd %xmm1, %xmm0, %xmm2939; AVX1OR2-NEXT: vpxor %xmm2, %xmm0, %xmm0940; AVX1OR2-NEXT: vpminud %xmm2, %xmm0, %xmm2941; AVX1OR2-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm0942; AVX1OR2-NEXT: vpxor %xmm1, %xmm0, %xmm0943; AVX1OR2-NEXT: retq944;945; XOP-LABEL: eq_1_v4i32:946; XOP: # %bb.0:947; XOP-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1948; XOP-NEXT: vpaddd %xmm1, %xmm0, %xmm1949; XOP-NEXT: vpxor %xmm1, %xmm0, %xmm0950; XOP-NEXT: vpcomgtud %xmm1, %xmm0, %xmm0951; XOP-NEXT: retq952;953; AVX512VPOPCNTDQ-LABEL: eq_1_v4i32:954; AVX512VPOPCNTDQ: # %bb.0:955; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0956; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm0957; AVX512VPOPCNTDQ-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]958; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0959; AVX512VPOPCNTDQ-NEXT: vzeroupper960; AVX512VPOPCNTDQ-NEXT: retq961;962; AVX512VPOPCNTDQVL-LABEL: eq_1_v4i32:963; AVX512VPOPCNTDQVL: # %bb.0:964; AVX512VPOPCNTDQVL-NEXT: vpopcntd %xmm0, %xmm0965; AVX512VPOPCNTDQVL-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]966; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0967; AVX512VPOPCNTDQVL-NEXT: retq968;969; BITALG_NOVLX-LABEL: eq_1_v4i32:970; BITALG_NOVLX: # %bb.0:971; BITALG_NOVLX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1972; BITALG_NOVLX-NEXT: vpaddd %xmm1, %xmm0, %xmm1973; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm0, %xmm0974; BITALG_NOVLX-NEXT: vpminud %xmm1, %xmm0, %xmm1975; BITALG_NOVLX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0976; BITALG_NOVLX-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm0977; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0978; BITALG_NOVLX-NEXT: vzeroupper979; BITALG_NOVLX-NEXT: retq980;981; BITALG-LABEL: eq_1_v4i32:982; BITALG: # %bb.0:983; BITALG-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1984; BITALG-NEXT: vpaddd %xmm1, %xmm0, %xmm2985; BITALG-NEXT: vpxor %xmm2, %xmm0, %xmm0986; BITALG-NEXT: vpcmpnleud %xmm2, %xmm0, %k1987; BITALG-NEXT: vmovdqa32 %xmm1, %xmm0 {%k1} {z}988; BITALG-NEXT: retq989 %2 = tail call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %0)990 %3 = icmp eq <4 x i32> %2, <i32 1, i32 1, i32 1, i32 1>991 %4 = sext <4 x i1> %3 to <4 x i32>992 ret <4 x i32> %4993}994 995define <4 x i32> @ne_1_v4i32(<4 x i32> %0) {996; SSE2-LABEL: ne_1_v4i32:997; SSE2: # %bb.0:998; SSE2-NEXT: pcmpeqd %xmm1, %xmm1999; SSE2-NEXT: movdqa %xmm0, %xmm21000; SSE2-NEXT: paddd %xmm1, %xmm21001; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm21002; SSE2-NEXT: pxor %xmm2, %xmm01003; SSE2-NEXT: pcmpgtd %xmm2, %xmm01004; SSE2-NEXT: pxor %xmm1, %xmm01005; SSE2-NEXT: retq1006;1007; SSE3-LABEL: ne_1_v4i32:1008; SSE3: # %bb.0:1009; SSE3-NEXT: pcmpeqd %xmm1, %xmm11010; SSE3-NEXT: movdqa %xmm0, %xmm21011; SSE3-NEXT: paddd %xmm1, %xmm21012; SSE3-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm21013; SSE3-NEXT: pxor %xmm2, %xmm01014; SSE3-NEXT: pcmpgtd %xmm2, %xmm01015; SSE3-NEXT: pxor %xmm1, %xmm01016; SSE3-NEXT: retq1017;1018; SSSE3-LABEL: ne_1_v4i32:1019; SSSE3: # %bb.0:1020; SSSE3-NEXT: pcmpeqd %xmm1, %xmm11021; SSSE3-NEXT: movdqa %xmm0, %xmm21022; SSSE3-NEXT: paddd %xmm1, %xmm21023; SSSE3-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm21024; SSSE3-NEXT: pxor %xmm2, %xmm01025; SSSE3-NEXT: pcmpgtd %xmm2, %xmm01026; SSSE3-NEXT: pxor %xmm1, %xmm01027; SSSE3-NEXT: retq1028;1029; SSE41-LABEL: ne_1_v4i32:1030; SSE41: # %bb.0:1031; SSE41-NEXT: pcmpeqd %xmm1, %xmm11032; SSE41-NEXT: paddd %xmm0, %xmm11033; SSE41-NEXT: pxor %xmm1, %xmm01034; SSE41-NEXT: pminud %xmm0, %xmm11035; SSE41-NEXT: pcmpeqd %xmm1, %xmm01036; SSE41-NEXT: retq1037;1038; AVX1OR2-LABEL: ne_1_v4i32:1039; AVX1OR2: # %bb.0:1040; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11041; AVX1OR2-NEXT: vpaddd %xmm1, %xmm0, %xmm11042; AVX1OR2-NEXT: vpxor %xmm1, %xmm0, %xmm01043; AVX1OR2-NEXT: vpminud %xmm1, %xmm0, %xmm11044; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01045; AVX1OR2-NEXT: retq1046;1047; XOP-LABEL: ne_1_v4i32:1048; XOP: # %bb.0:1049; XOP-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11050; XOP-NEXT: vpaddd %xmm1, %xmm0, %xmm11051; XOP-NEXT: vpxor %xmm1, %xmm0, %xmm01052; XOP-NEXT: vpcomleud %xmm1, %xmm0, %xmm01053; XOP-NEXT: retq1054;1055; AVX512VPOPCNTDQ-LABEL: ne_1_v4i32:1056; AVX512VPOPCNTDQ: # %bb.0:1057; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01058; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm01059; AVX512VPOPCNTDQ-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]1060; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01061; AVX512VPOPCNTDQ-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm01062; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01063; AVX512VPOPCNTDQ-NEXT: vzeroupper1064; AVX512VPOPCNTDQ-NEXT: retq1065;1066; AVX512VPOPCNTDQVL-LABEL: ne_1_v4i32:1067; AVX512VPOPCNTDQVL: # %bb.0:1068; AVX512VPOPCNTDQVL-NEXT: vpopcntd %xmm0, %xmm01069; AVX512VPOPCNTDQVL-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]1070; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01071; AVX512VPOPCNTDQVL-NEXT: vpternlogq {{.*#+}} xmm0 = ~xmm01072; AVX512VPOPCNTDQVL-NEXT: retq1073;1074; BITALG_NOVLX-LABEL: ne_1_v4i32:1075; BITALG_NOVLX: # %bb.0:1076; BITALG_NOVLX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11077; BITALG_NOVLX-NEXT: vpaddd %xmm1, %xmm0, %xmm11078; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm0, %xmm01079; BITALG_NOVLX-NEXT: vpminud %xmm1, %xmm0, %xmm11080; BITALG_NOVLX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01081; BITALG_NOVLX-NEXT: retq1082;1083; BITALG-LABEL: ne_1_v4i32:1084; BITALG: # %bb.0:1085; BITALG-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11086; BITALG-NEXT: vpaddd %xmm1, %xmm0, %xmm21087; BITALG-NEXT: vpxor %xmm2, %xmm0, %xmm01088; BITALG-NEXT: vpcmpleud %xmm2, %xmm0, %k11089; BITALG-NEXT: vmovdqa32 %xmm1, %xmm0 {%k1} {z}1090; BITALG-NEXT: retq1091 %2 = tail call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %0)1092 %3 = icmp ne <4 x i32> %2, <i32 1, i32 1, i32 1, i32 1>1093 %4 = sext <4 x i1> %3 to <4 x i32>1094 ret <4 x i32> %41095}1096 1097define <8 x i16> @eq_1_v8i16(<8 x i16> %0) {1098; SSE2-LABEL: eq_1_v8i16:1099; SSE2: # %bb.0:1100; SSE2-NEXT: pcmpeqd %xmm1, %xmm11101; SSE2-NEXT: paddw %xmm0, %xmm11102; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11103; SSE2-NEXT: pxor %xmm1, %xmm01104; SSE2-NEXT: pcmpgtw %xmm1, %xmm01105; SSE2-NEXT: retq1106;1107; SSE3-LABEL: eq_1_v8i16:1108; SSE3: # %bb.0:1109; SSE3-NEXT: pcmpeqd %xmm1, %xmm11110; SSE3-NEXT: paddw %xmm0, %xmm11111; SSE3-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11112; SSE3-NEXT: pxor %xmm1, %xmm01113; SSE3-NEXT: pcmpgtw %xmm1, %xmm01114; SSE3-NEXT: retq1115;1116; SSSE3-LABEL: eq_1_v8i16:1117; SSSE3: # %bb.0:1118; SSSE3-NEXT: pcmpeqd %xmm1, %xmm11119; SSSE3-NEXT: paddw %xmm0, %xmm11120; SSSE3-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11121; SSSE3-NEXT: pxor %xmm1, %xmm01122; SSSE3-NEXT: pcmpgtw %xmm1, %xmm01123; SSSE3-NEXT: retq1124;1125; SSE41-LABEL: eq_1_v8i16:1126; SSE41: # %bb.0:1127; SSE41-NEXT: pcmpeqd %xmm1, %xmm11128; SSE41-NEXT: movdqa %xmm0, %xmm21129; SSE41-NEXT: paddw %xmm1, %xmm21130; SSE41-NEXT: pxor %xmm2, %xmm01131; SSE41-NEXT: pminuw %xmm0, %xmm21132; SSE41-NEXT: pcmpeqw %xmm2, %xmm01133; SSE41-NEXT: pxor %xmm1, %xmm01134; SSE41-NEXT: retq1135;1136; AVX1OR2-LABEL: eq_1_v8i16:1137; AVX1OR2: # %bb.0:1138; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11139; AVX1OR2-NEXT: vpaddw %xmm1, %xmm0, %xmm21140; AVX1OR2-NEXT: vpxor %xmm2, %xmm0, %xmm01141; AVX1OR2-NEXT: vpminuw %xmm2, %xmm0, %xmm21142; AVX1OR2-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm01143; AVX1OR2-NEXT: vpxor %xmm1, %xmm0, %xmm01144; AVX1OR2-NEXT: retq1145;1146; XOP-LABEL: eq_1_v8i16:1147; XOP: # %bb.0:1148; XOP-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11149; XOP-NEXT: vpaddw %xmm1, %xmm0, %xmm11150; XOP-NEXT: vpxor %xmm1, %xmm0, %xmm01151; XOP-NEXT: vpcomgtuw %xmm1, %xmm0, %xmm01152; XOP-NEXT: retq1153;1154; AVX512VPOPCNTDQ-LABEL: eq_1_v8i16:1155; AVX512VPOPCNTDQ: # %bb.0:1156; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11157; AVX512VPOPCNTDQ-NEXT: vpaddw %xmm1, %xmm0, %xmm11158; AVX512VPOPCNTDQ-NEXT: vpxor %xmm1, %xmm0, %xmm01159; AVX512VPOPCNTDQ-NEXT: vpminuw %xmm1, %xmm0, %xmm11160; AVX512VPOPCNTDQ-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm01161; AVX512VPOPCNTDQ-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm01162; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01163; AVX512VPOPCNTDQ-NEXT: vzeroupper1164; AVX512VPOPCNTDQ-NEXT: retq1165;1166; AVX512VPOPCNTDQVL-LABEL: eq_1_v8i16:1167; AVX512VPOPCNTDQVL: # %bb.0:1168; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11169; AVX512VPOPCNTDQVL-NEXT: vpaddw %xmm1, %xmm0, %xmm11170; AVX512VPOPCNTDQVL-NEXT: vpxor %xmm1, %xmm0, %xmm01171; AVX512VPOPCNTDQVL-NEXT: vpminuw %xmm1, %xmm0, %xmm11172; AVX512VPOPCNTDQVL-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm01173; AVX512VPOPCNTDQVL-NEXT: vpternlogq {{.*#+}} xmm0 = ~xmm01174; AVX512VPOPCNTDQVL-NEXT: retq1175;1176; BITALG_NOVLX-LABEL: eq_1_v8i16:1177; BITALG_NOVLX: # %bb.0:1178; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01179; BITALG_NOVLX-NEXT: vpopcntw %zmm0, %zmm01180; BITALG_NOVLX-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01181; BITALG_NOVLX-NEXT: vzeroupper1182; BITALG_NOVLX-NEXT: retq1183;1184; BITALG-LABEL: eq_1_v8i16:1185; BITALG: # %bb.0:1186; BITALG-NEXT: vpopcntw %xmm0, %xmm01187; BITALG-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01188; BITALG-NEXT: retq1189 %2 = tail call <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %0)1190 %3 = icmp eq <8 x i16> %2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>1191 %4 = sext <8 x i1> %3 to <8 x i16>1192 ret <8 x i16> %41193}1194 1195define <8 x i16> @ne_1_v8i16(<8 x i16> %0) {1196; SSE2-LABEL: ne_1_v8i16:1197; SSE2: # %bb.0:1198; SSE2-NEXT: pcmpeqd %xmm1, %xmm11199; SSE2-NEXT: paddw %xmm0, %xmm11200; SSE2-NEXT: pxor %xmm1, %xmm01201; SSE2-NEXT: psubusw %xmm1, %xmm01202; SSE2-NEXT: pxor %xmm1, %xmm11203; SSE2-NEXT: pcmpeqw %xmm1, %xmm01204; SSE2-NEXT: retq1205;1206; SSE3-LABEL: ne_1_v8i16:1207; SSE3: # %bb.0:1208; SSE3-NEXT: pcmpeqd %xmm1, %xmm11209; SSE3-NEXT: paddw %xmm0, %xmm11210; SSE3-NEXT: pxor %xmm1, %xmm01211; SSE3-NEXT: psubusw %xmm1, %xmm01212; SSE3-NEXT: pxor %xmm1, %xmm11213; SSE3-NEXT: pcmpeqw %xmm1, %xmm01214; SSE3-NEXT: retq1215;1216; SSSE3-LABEL: ne_1_v8i16:1217; SSSE3: # %bb.0:1218; SSSE3-NEXT: pcmpeqd %xmm1, %xmm11219; SSSE3-NEXT: paddw %xmm0, %xmm11220; SSSE3-NEXT: pxor %xmm1, %xmm01221; SSSE3-NEXT: psubusw %xmm1, %xmm01222; SSSE3-NEXT: pxor %xmm1, %xmm11223; SSSE3-NEXT: pcmpeqw %xmm1, %xmm01224; SSSE3-NEXT: retq1225;1226; SSE41-LABEL: ne_1_v8i16:1227; SSE41: # %bb.0:1228; SSE41-NEXT: pcmpeqd %xmm1, %xmm11229; SSE41-NEXT: paddw %xmm0, %xmm11230; SSE41-NEXT: pxor %xmm1, %xmm01231; SSE41-NEXT: pminuw %xmm0, %xmm11232; SSE41-NEXT: pcmpeqw %xmm1, %xmm01233; SSE41-NEXT: retq1234;1235; AVX1OR2-LABEL: ne_1_v8i16:1236; AVX1OR2: # %bb.0:1237; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11238; AVX1OR2-NEXT: vpaddw %xmm1, %xmm0, %xmm11239; AVX1OR2-NEXT: vpxor %xmm1, %xmm0, %xmm01240; AVX1OR2-NEXT: vpminuw %xmm1, %xmm0, %xmm11241; AVX1OR2-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm01242; AVX1OR2-NEXT: retq1243;1244; XOP-LABEL: ne_1_v8i16:1245; XOP: # %bb.0:1246; XOP-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11247; XOP-NEXT: vpaddw %xmm1, %xmm0, %xmm11248; XOP-NEXT: vpxor %xmm1, %xmm0, %xmm01249; XOP-NEXT: vpcomleuw %xmm1, %xmm0, %xmm01250; XOP-NEXT: retq1251;1252; AVX512-LABEL: ne_1_v8i16:1253; AVX512: # %bb.0:1254; AVX512-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11255; AVX512-NEXT: vpaddw %xmm1, %xmm0, %xmm11256; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm01257; AVX512-NEXT: vpminuw %xmm1, %xmm0, %xmm11258; AVX512-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm01259; AVX512-NEXT: retq1260;1261; BITALG_NOVLX-LABEL: ne_1_v8i16:1262; BITALG_NOVLX: # %bb.0:1263; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01264; BITALG_NOVLX-NEXT: vpopcntw %zmm0, %zmm01265; BITALG_NOVLX-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01266; BITALG_NOVLX-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm01267; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01268; BITALG_NOVLX-NEXT: vzeroupper1269; BITALG_NOVLX-NEXT: retq1270;1271; BITALG-LABEL: ne_1_v8i16:1272; BITALG: # %bb.0:1273; BITALG-NEXT: vpopcntw %xmm0, %xmm01274; BITALG-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01275; BITALG-NEXT: vpternlogq {{.*#+}} xmm0 = ~xmm01276; BITALG-NEXT: retq1277 %2 = tail call <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %0)1278 %3 = icmp ne <8 x i16> %2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>1279 %4 = sext <8 x i1> %3 to <8 x i16>1280 ret <8 x i16> %41281}1282 1283define <16 x i8> @eq_1_v16i8(<16 x i8> %0) {1284; SSE-LABEL: eq_1_v16i8:1285; SSE: # %bb.0:1286; SSE-NEXT: pcmpeqd %xmm1, %xmm11287; SSE-NEXT: movdqa %xmm0, %xmm21288; SSE-NEXT: paddb %xmm1, %xmm21289; SSE-NEXT: pxor %xmm2, %xmm01290; SSE-NEXT: pminub %xmm0, %xmm21291; SSE-NEXT: pcmpeqb %xmm2, %xmm01292; SSE-NEXT: pxor %xmm1, %xmm01293; SSE-NEXT: retq1294;1295; AVX1OR2-LABEL: eq_1_v16i8:1296; AVX1OR2: # %bb.0:1297; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11298; AVX1OR2-NEXT: vpaddb %xmm1, %xmm0, %xmm21299; AVX1OR2-NEXT: vpxor %xmm2, %xmm0, %xmm01300; AVX1OR2-NEXT: vpminub %xmm2, %xmm0, %xmm21301; AVX1OR2-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm01302; AVX1OR2-NEXT: vpxor %xmm1, %xmm0, %xmm01303; AVX1OR2-NEXT: retq1304;1305; XOP-LABEL: eq_1_v16i8:1306; XOP: # %bb.0:1307; XOP-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11308; XOP-NEXT: vpaddb %xmm1, %xmm0, %xmm11309; XOP-NEXT: vpxor %xmm1, %xmm0, %xmm01310; XOP-NEXT: vpcomgtub %xmm1, %xmm0, %xmm01311; XOP-NEXT: retq1312;1313; AVX512VPOPCNTDQ-LABEL: eq_1_v16i8:1314; AVX512VPOPCNTDQ: # %bb.0:1315; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11316; AVX512VPOPCNTDQ-NEXT: vpaddb %xmm1, %xmm0, %xmm11317; AVX512VPOPCNTDQ-NEXT: vpxor %xmm1, %xmm0, %xmm01318; AVX512VPOPCNTDQ-NEXT: vpminub %xmm1, %xmm0, %xmm11319; AVX512VPOPCNTDQ-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm01320; AVX512VPOPCNTDQ-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm01321; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01322; AVX512VPOPCNTDQ-NEXT: vzeroupper1323; AVX512VPOPCNTDQ-NEXT: retq1324;1325; AVX512VPOPCNTDQVL-LABEL: eq_1_v16i8:1326; AVX512VPOPCNTDQVL: # %bb.0:1327; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11328; AVX512VPOPCNTDQVL-NEXT: vpaddb %xmm1, %xmm0, %xmm11329; AVX512VPOPCNTDQVL-NEXT: vpxor %xmm1, %xmm0, %xmm01330; AVX512VPOPCNTDQVL-NEXT: vpminub %xmm1, %xmm0, %xmm11331; AVX512VPOPCNTDQVL-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm01332; AVX512VPOPCNTDQVL-NEXT: vpternlogq {{.*#+}} xmm0 = ~xmm01333; AVX512VPOPCNTDQVL-NEXT: retq1334;1335; BITALG_NOVLX-LABEL: eq_1_v16i8:1336; BITALG_NOVLX: # %bb.0:1337; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01338; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm01339; BITALG_NOVLX-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01340; BITALG_NOVLX-NEXT: vzeroupper1341; BITALG_NOVLX-NEXT: retq1342;1343; BITALG-LABEL: eq_1_v16i8:1344; BITALG: # %bb.0:1345; BITALG-NEXT: vpopcntb %xmm0, %xmm01346; BITALG-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01347; BITALG-NEXT: retq1348 %2 = tail call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %0)1349 %3 = icmp eq <16 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>1350 %4 = sext <16 x i1> %3 to <16 x i8>1351 ret <16 x i8> %41352}1353 1354define <16 x i8> @ne_1_v16i8(<16 x i8> %0) {1355; SSE-LABEL: ne_1_v16i8:1356; SSE: # %bb.0:1357; SSE-NEXT: pcmpeqd %xmm1, %xmm11358; SSE-NEXT: paddb %xmm0, %xmm11359; SSE-NEXT: pxor %xmm1, %xmm01360; SSE-NEXT: pminub %xmm0, %xmm11361; SSE-NEXT: pcmpeqb %xmm1, %xmm01362; SSE-NEXT: retq1363;1364; AVX1OR2-LABEL: ne_1_v16i8:1365; AVX1OR2: # %bb.0:1366; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11367; AVX1OR2-NEXT: vpaddb %xmm1, %xmm0, %xmm11368; AVX1OR2-NEXT: vpxor %xmm1, %xmm0, %xmm01369; AVX1OR2-NEXT: vpminub %xmm1, %xmm0, %xmm11370; AVX1OR2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm01371; AVX1OR2-NEXT: retq1372;1373; XOP-LABEL: ne_1_v16i8:1374; XOP: # %bb.0:1375; XOP-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11376; XOP-NEXT: vpaddb %xmm1, %xmm0, %xmm11377; XOP-NEXT: vpxor %xmm1, %xmm0, %xmm01378; XOP-NEXT: vpcomleub %xmm1, %xmm0, %xmm01379; XOP-NEXT: retq1380;1381; AVX512-LABEL: ne_1_v16i8:1382; AVX512: # %bb.0:1383; AVX512-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11384; AVX512-NEXT: vpaddb %xmm1, %xmm0, %xmm11385; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm01386; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm11387; AVX512-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm01388; AVX512-NEXT: retq1389;1390; BITALG_NOVLX-LABEL: ne_1_v16i8:1391; BITALG_NOVLX: # %bb.0:1392; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01393; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm01394; BITALG_NOVLX-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01395; BITALG_NOVLX-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm01396; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01397; BITALG_NOVLX-NEXT: vzeroupper1398; BITALG_NOVLX-NEXT: retq1399;1400; BITALG-LABEL: ne_1_v16i8:1401; BITALG: # %bb.0:1402; BITALG-NEXT: vpopcntb %xmm0, %xmm01403; BITALG-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01404; BITALG-NEXT: vpternlogq {{.*#+}} xmm0 = ~xmm01405; BITALG-NEXT: retq1406 %2 = tail call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %0)1407 %3 = icmp ne <16 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>1408 %4 = sext <16 x i1> %3 to <16 x i8>1409 ret <16 x i8> %41410}1411 1412declare <2 x i64> @llvm.ctpop.v2i64(<2 x i64>)1413declare <4 x i32> @llvm.ctpop.v4i32(<4 x i32>)1414declare <8 x i16> @llvm.ctpop.v8i16(<8 x i16>)1415declare <16 x i8> @llvm.ctpop.v16i8(<16 x i8>)1416