2138 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,AVX17; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX28; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512cd,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512CDVL9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512cd,-avx512vl | FileCheck %s --check-prefixes=AVX,AVX512CD10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vpopcntdq | FileCheck %s --check-prefix=AVX512VPOPCNTDQ11; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vpopcntdq,+avx512vl | FileCheck %s --check-prefix=AVX512VPOPCNTDQVL12; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bitalg | FileCheck %s --check-prefix=BITALG_NOVLX13; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bitalg,+avx512vl | FileCheck %s --check-prefix=BITALG14;15; Just one 32-bit run to make sure we do reasonable things for i64 tzcnt.16; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=X86-SSE17 18define <2 x i64> @testv2i64(<2 x i64> %in) nounwind {19; SSE2-LABEL: testv2i64:20; SSE2: # %bb.0:21; SSE2-NEXT: pcmpeqd %xmm1, %xmm122; SSE2-NEXT: paddq %xmm0, %xmm123; SSE2-NEXT: pandn %xmm1, %xmm024; SSE2-NEXT: movdqa %xmm0, %xmm125; SSE2-NEXT: psrlw $1, %xmm126; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm127; SSE2-NEXT: psubb %xmm1, %xmm028; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]29; SSE2-NEXT: movdqa %xmm0, %xmm230; SSE2-NEXT: pand %xmm1, %xmm231; SSE2-NEXT: psrlw $2, %xmm032; SSE2-NEXT: pand %xmm1, %xmm033; SSE2-NEXT: paddb %xmm2, %xmm034; SSE2-NEXT: movdqa %xmm0, %xmm135; SSE2-NEXT: psrlw $4, %xmm136; SSE2-NEXT: paddb %xmm1, %xmm037; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm038; SSE2-NEXT: pxor %xmm1, %xmm139; SSE2-NEXT: psadbw %xmm1, %xmm040; SSE2-NEXT: retq41;42; SSE3-LABEL: testv2i64:43; SSE3: # %bb.0:44; SSE3-NEXT: pcmpeqd %xmm1, %xmm145; SSE3-NEXT: paddq %xmm0, %xmm146; SSE3-NEXT: pandn %xmm1, %xmm047; SSE3-NEXT: movdqa %xmm0, %xmm148; SSE3-NEXT: psrlw $1, %xmm149; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm150; SSE3-NEXT: psubb %xmm1, %xmm051; SSE3-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]52; SSE3-NEXT: movdqa %xmm0, %xmm253; SSE3-NEXT: pand %xmm1, %xmm254; SSE3-NEXT: psrlw $2, %xmm055; SSE3-NEXT: pand %xmm1, %xmm056; SSE3-NEXT: paddb %xmm2, %xmm057; SSE3-NEXT: movdqa %xmm0, %xmm158; SSE3-NEXT: psrlw $4, %xmm159; SSE3-NEXT: paddb %xmm1, %xmm060; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm061; SSE3-NEXT: pxor %xmm1, %xmm162; SSE3-NEXT: psadbw %xmm1, %xmm063; SSE3-NEXT: retq64;65; SSSE3-LABEL: testv2i64:66; SSSE3: # %bb.0:67; SSSE3-NEXT: pcmpeqd %xmm1, %xmm168; SSSE3-NEXT: paddq %xmm0, %xmm169; SSSE3-NEXT: pandn %xmm1, %xmm070; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]71; SSSE3-NEXT: movdqa %xmm0, %xmm272; SSSE3-NEXT: pand %xmm1, %xmm273; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]74; SSSE3-NEXT: movdqa %xmm3, %xmm475; SSSE3-NEXT: pshufb %xmm2, %xmm476; SSSE3-NEXT: psrlw $4, %xmm077; SSSE3-NEXT: pand %xmm1, %xmm078; SSSE3-NEXT: pshufb %xmm0, %xmm379; SSSE3-NEXT: paddb %xmm4, %xmm380; SSSE3-NEXT: pxor %xmm0, %xmm081; SSSE3-NEXT: psadbw %xmm3, %xmm082; SSSE3-NEXT: retq83;84; SSE41-LABEL: testv2i64:85; SSE41: # %bb.0:86; SSE41-NEXT: pcmpeqd %xmm1, %xmm187; SSE41-NEXT: paddq %xmm0, %xmm188; SSE41-NEXT: pandn %xmm1, %xmm089; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]90; SSE41-NEXT: movdqa %xmm0, %xmm291; SSE41-NEXT: pand %xmm1, %xmm292; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]93; SSE41-NEXT: movdqa %xmm3, %xmm494; SSE41-NEXT: pshufb %xmm2, %xmm495; SSE41-NEXT: psrlw $4, %xmm096; SSE41-NEXT: pand %xmm1, %xmm097; SSE41-NEXT: pshufb %xmm0, %xmm398; SSE41-NEXT: paddb %xmm4, %xmm399; SSE41-NEXT: pxor %xmm0, %xmm0100; SSE41-NEXT: psadbw %xmm3, %xmm0101; SSE41-NEXT: retq102;103; AVX1-LABEL: testv2i64:104; AVX1: # %bb.0:105; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1106; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm1107; AVX1-NEXT: vpandn %xmm1, %xmm0, %xmm0108; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]109; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm2110; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]111; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2112; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0113; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0114; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm0115; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0116; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1117; AVX1-NEXT: vpsadbw %xmm1, %xmm0, %xmm0118; AVX1-NEXT: retq119;120; AVX2-LABEL: testv2i64:121; AVX2: # %bb.0:122; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1123; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm1124; AVX2-NEXT: vpandn %xmm1, %xmm0, %xmm0125; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]126; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm2127; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]128; AVX2-NEXT: vpshufb %xmm2, %xmm3, %xmm2129; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm0130; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0131; AVX2-NEXT: vpshufb %xmm0, %xmm3, %xmm0132; AVX2-NEXT: vpaddb %xmm2, %xmm0, %xmm0133; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1134; AVX2-NEXT: vpsadbw %xmm1, %xmm0, %xmm0135; AVX2-NEXT: retq136;137; AVX512CDVL-LABEL: testv2i64:138; AVX512CDVL: # %bb.0:139; AVX512CDVL-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1140; AVX512CDVL-NEXT: vpaddq %xmm1, %xmm0, %xmm1141; AVX512CDVL-NEXT: vpandn %xmm1, %xmm0, %xmm0142; AVX512CDVL-NEXT: vplzcntq %xmm0, %xmm0143; AVX512CDVL-NEXT: vpbroadcastq {{.*#+}} xmm1 = [64,64]144; AVX512CDVL-NEXT: vpsubq %xmm0, %xmm1, %xmm0145; AVX512CDVL-NEXT: retq146;147; AVX512CD-LABEL: testv2i64:148; AVX512CD: # %bb.0:149; AVX512CD-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1150; AVX512CD-NEXT: vpaddq %xmm1, %xmm0, %xmm1151; AVX512CD-NEXT: vpandn %xmm1, %xmm0, %xmm0152; AVX512CD-NEXT: vplzcntq %zmm0, %zmm0153; AVX512CD-NEXT: vpmovsxbq {{.*#+}} xmm1 = [64,64]154; AVX512CD-NEXT: vpsubq %xmm0, %xmm1, %xmm0155; AVX512CD-NEXT: vzeroupper156; AVX512CD-NEXT: retq157;158; AVX512VPOPCNTDQ-LABEL: testv2i64:159; AVX512VPOPCNTDQ: # %bb.0:160; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1161; AVX512VPOPCNTDQ-NEXT: vpaddq %xmm1, %xmm0, %xmm1162; AVX512VPOPCNTDQ-NEXT: vpandn %xmm1, %xmm0, %xmm0163; AVX512VPOPCNTDQ-NEXT: vpopcntq %zmm0, %zmm0164; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0165; AVX512VPOPCNTDQ-NEXT: vzeroupper166; AVX512VPOPCNTDQ-NEXT: retq167;168; AVX512VPOPCNTDQVL-LABEL: testv2i64:169; AVX512VPOPCNTDQVL: # %bb.0:170; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1171; AVX512VPOPCNTDQVL-NEXT: vpaddq %xmm1, %xmm0, %xmm1172; AVX512VPOPCNTDQVL-NEXT: vpandn %xmm1, %xmm0, %xmm0173; AVX512VPOPCNTDQVL-NEXT: vpopcntq %xmm0, %xmm0174; AVX512VPOPCNTDQVL-NEXT: retq175;176; BITALG_NOVLX-LABEL: testv2i64:177; BITALG_NOVLX: # %bb.0:178; BITALG_NOVLX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1179; BITALG_NOVLX-NEXT: vpaddq %xmm1, %xmm0, %xmm1180; BITALG_NOVLX-NEXT: vpandn %xmm1, %xmm0, %xmm0181; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm0182; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm1, %xmm1183; BITALG_NOVLX-NEXT: vpsadbw %xmm1, %xmm0, %xmm0184; BITALG_NOVLX-NEXT: vzeroupper185; BITALG_NOVLX-NEXT: retq186;187; BITALG-LABEL: testv2i64:188; BITALG: # %bb.0:189; BITALG-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1190; BITALG-NEXT: vpaddq %xmm1, %xmm0, %xmm1191; BITALG-NEXT: vpandn %xmm1, %xmm0, %xmm0192; BITALG-NEXT: vpopcntb %xmm0, %xmm0193; BITALG-NEXT: vpxor %xmm1, %xmm1, %xmm1194; BITALG-NEXT: vpsadbw %xmm1, %xmm0, %xmm0195; BITALG-NEXT: retq196;197; X86-SSE-LABEL: testv2i64:198; X86-SSE: # %bb.0:199; X86-SSE-NEXT: pcmpeqd %xmm1, %xmm1200; X86-SSE-NEXT: paddq %xmm0, %xmm1201; X86-SSE-NEXT: pandn %xmm1, %xmm0202; X86-SSE-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]203; X86-SSE-NEXT: movdqa %xmm0, %xmm2204; X86-SSE-NEXT: pand %xmm1, %xmm2205; X86-SSE-NEXT: movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]206; X86-SSE-NEXT: movdqa %xmm3, %xmm4207; X86-SSE-NEXT: pshufb %xmm2, %xmm4208; X86-SSE-NEXT: psrlw $4, %xmm0209; X86-SSE-NEXT: pand %xmm1, %xmm0210; X86-SSE-NEXT: pshufb %xmm0, %xmm3211; X86-SSE-NEXT: paddb %xmm4, %xmm3212; X86-SSE-NEXT: pxor %xmm0, %xmm0213; X86-SSE-NEXT: psadbw %xmm3, %xmm0214; X86-SSE-NEXT: retl215 %out = call <2 x i64> @llvm.cttz.v2i64(<2 x i64> %in, i1 0)216 ret <2 x i64> %out217}218 219define <2 x i64> @testv2i64u(<2 x i64> %in) nounwind {220; SSE2-LABEL: testv2i64u:221; SSE2: # %bb.0:222; SSE2-NEXT: pcmpeqd %xmm1, %xmm1223; SSE2-NEXT: paddq %xmm0, %xmm1224; SSE2-NEXT: pandn %xmm1, %xmm0225; SSE2-NEXT: movdqa %xmm0, %xmm1226; SSE2-NEXT: psrlw $1, %xmm1227; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1228; SSE2-NEXT: psubb %xmm1, %xmm0229; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]230; SSE2-NEXT: movdqa %xmm0, %xmm2231; SSE2-NEXT: pand %xmm1, %xmm2232; SSE2-NEXT: psrlw $2, %xmm0233; SSE2-NEXT: pand %xmm1, %xmm0234; SSE2-NEXT: paddb %xmm2, %xmm0235; SSE2-NEXT: movdqa %xmm0, %xmm1236; SSE2-NEXT: psrlw $4, %xmm1237; SSE2-NEXT: paddb %xmm1, %xmm0238; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0239; SSE2-NEXT: pxor %xmm1, %xmm1240; SSE2-NEXT: psadbw %xmm1, %xmm0241; SSE2-NEXT: retq242;243; SSE3-LABEL: testv2i64u:244; SSE3: # %bb.0:245; SSE3-NEXT: pcmpeqd %xmm1, %xmm1246; SSE3-NEXT: paddq %xmm0, %xmm1247; SSE3-NEXT: pandn %xmm1, %xmm0248; SSE3-NEXT: movdqa %xmm0, %xmm1249; SSE3-NEXT: psrlw $1, %xmm1250; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1251; SSE3-NEXT: psubb %xmm1, %xmm0252; SSE3-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]253; SSE3-NEXT: movdqa %xmm0, %xmm2254; SSE3-NEXT: pand %xmm1, %xmm2255; SSE3-NEXT: psrlw $2, %xmm0256; SSE3-NEXT: pand %xmm1, %xmm0257; SSE3-NEXT: paddb %xmm2, %xmm0258; SSE3-NEXT: movdqa %xmm0, %xmm1259; SSE3-NEXT: psrlw $4, %xmm1260; SSE3-NEXT: paddb %xmm1, %xmm0261; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0262; SSE3-NEXT: pxor %xmm1, %xmm1263; SSE3-NEXT: psadbw %xmm1, %xmm0264; SSE3-NEXT: retq265;266; SSSE3-LABEL: testv2i64u:267; SSSE3: # %bb.0:268; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1269; SSSE3-NEXT: paddq %xmm0, %xmm1270; SSSE3-NEXT: pandn %xmm1, %xmm0271; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]272; SSSE3-NEXT: movdqa %xmm0, %xmm2273; SSSE3-NEXT: pand %xmm1, %xmm2274; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]275; SSSE3-NEXT: movdqa %xmm3, %xmm4276; SSSE3-NEXT: pshufb %xmm2, %xmm4277; SSSE3-NEXT: psrlw $4, %xmm0278; SSSE3-NEXT: pand %xmm1, %xmm0279; SSSE3-NEXT: pshufb %xmm0, %xmm3280; SSSE3-NEXT: paddb %xmm4, %xmm3281; SSSE3-NEXT: pxor %xmm0, %xmm0282; SSSE3-NEXT: psadbw %xmm3, %xmm0283; SSSE3-NEXT: retq284;285; SSE41-LABEL: testv2i64u:286; SSE41: # %bb.0:287; SSE41-NEXT: pcmpeqd %xmm1, %xmm1288; SSE41-NEXT: paddq %xmm0, %xmm1289; SSE41-NEXT: pandn %xmm1, %xmm0290; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]291; SSE41-NEXT: movdqa %xmm0, %xmm2292; SSE41-NEXT: pand %xmm1, %xmm2293; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]294; SSE41-NEXT: movdqa %xmm3, %xmm4295; SSE41-NEXT: pshufb %xmm2, %xmm4296; SSE41-NEXT: psrlw $4, %xmm0297; SSE41-NEXT: pand %xmm1, %xmm0298; SSE41-NEXT: pshufb %xmm0, %xmm3299; SSE41-NEXT: paddb %xmm4, %xmm3300; SSE41-NEXT: pxor %xmm0, %xmm0301; SSE41-NEXT: psadbw %xmm3, %xmm0302; SSE41-NEXT: retq303;304; AVX1-LABEL: testv2i64u:305; AVX1: # %bb.0:306; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1307; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm1308; AVX1-NEXT: vpandn %xmm1, %xmm0, %xmm0309; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]310; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm2311; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]312; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2313; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0314; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0315; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm0316; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0317; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1318; AVX1-NEXT: vpsadbw %xmm1, %xmm0, %xmm0319; AVX1-NEXT: retq320;321; AVX2-LABEL: testv2i64u:322; AVX2: # %bb.0:323; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1324; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm1325; AVX2-NEXT: vpandn %xmm1, %xmm0, %xmm0326; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]327; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm2328; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]329; AVX2-NEXT: vpshufb %xmm2, %xmm3, %xmm2330; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm0331; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0332; AVX2-NEXT: vpshufb %xmm0, %xmm3, %xmm0333; AVX2-NEXT: vpaddb %xmm2, %xmm0, %xmm0334; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1335; AVX2-NEXT: vpsadbw %xmm1, %xmm0, %xmm0336; AVX2-NEXT: retq337;338; AVX512CDVL-LABEL: testv2i64u:339; AVX512CDVL: # %bb.0:340; AVX512CDVL-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1341; AVX512CDVL-NEXT: vpaddq %xmm1, %xmm0, %xmm1342; AVX512CDVL-NEXT: vpandn %xmm1, %xmm0, %xmm0343; AVX512CDVL-NEXT: vplzcntq %xmm0, %xmm0344; AVX512CDVL-NEXT: vpbroadcastq {{.*#+}} xmm1 = [64,64]345; AVX512CDVL-NEXT: vpsubq %xmm0, %xmm1, %xmm0346; AVX512CDVL-NEXT: retq347;348; AVX512CD-LABEL: testv2i64u:349; AVX512CD: # %bb.0:350; AVX512CD-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1351; AVX512CD-NEXT: vpaddq %xmm1, %xmm0, %xmm1352; AVX512CD-NEXT: vpandn %xmm1, %xmm0, %xmm0353; AVX512CD-NEXT: vplzcntq %zmm0, %zmm0354; AVX512CD-NEXT: vpmovsxbq {{.*#+}} xmm1 = [64,64]355; AVX512CD-NEXT: vpsubq %xmm0, %xmm1, %xmm0356; AVX512CD-NEXT: vzeroupper357; AVX512CD-NEXT: retq358;359; AVX512VPOPCNTDQ-LABEL: testv2i64u:360; AVX512VPOPCNTDQ: # %bb.0:361; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1362; AVX512VPOPCNTDQ-NEXT: vpaddq %xmm1, %xmm0, %xmm1363; AVX512VPOPCNTDQ-NEXT: vpandn %xmm1, %xmm0, %xmm0364; AVX512VPOPCNTDQ-NEXT: vpopcntq %zmm0, %zmm0365; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0366; AVX512VPOPCNTDQ-NEXT: vzeroupper367; AVX512VPOPCNTDQ-NEXT: retq368;369; AVX512VPOPCNTDQVL-LABEL: testv2i64u:370; AVX512VPOPCNTDQVL: # %bb.0:371; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1372; AVX512VPOPCNTDQVL-NEXT: vpaddq %xmm1, %xmm0, %xmm1373; AVX512VPOPCNTDQVL-NEXT: vpandn %xmm1, %xmm0, %xmm0374; AVX512VPOPCNTDQVL-NEXT: vpopcntq %xmm0, %xmm0375; AVX512VPOPCNTDQVL-NEXT: retq376;377; BITALG_NOVLX-LABEL: testv2i64u:378; BITALG_NOVLX: # %bb.0:379; BITALG_NOVLX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1380; BITALG_NOVLX-NEXT: vpaddq %xmm1, %xmm0, %xmm1381; BITALG_NOVLX-NEXT: vpandn %xmm1, %xmm0, %xmm0382; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm0383; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm1, %xmm1384; BITALG_NOVLX-NEXT: vpsadbw %xmm1, %xmm0, %xmm0385; BITALG_NOVLX-NEXT: vzeroupper386; BITALG_NOVLX-NEXT: retq387;388; BITALG-LABEL: testv2i64u:389; BITALG: # %bb.0:390; BITALG-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1391; BITALG-NEXT: vpaddq %xmm1, %xmm0, %xmm1392; BITALG-NEXT: vpandn %xmm1, %xmm0, %xmm0393; BITALG-NEXT: vpopcntb %xmm0, %xmm0394; BITALG-NEXT: vpxor %xmm1, %xmm1, %xmm1395; BITALG-NEXT: vpsadbw %xmm1, %xmm0, %xmm0396; BITALG-NEXT: retq397;398; X86-SSE-LABEL: testv2i64u:399; X86-SSE: # %bb.0:400; X86-SSE-NEXT: pcmpeqd %xmm1, %xmm1401; X86-SSE-NEXT: paddq %xmm0, %xmm1402; X86-SSE-NEXT: pandn %xmm1, %xmm0403; X86-SSE-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]404; X86-SSE-NEXT: movdqa %xmm0, %xmm2405; X86-SSE-NEXT: pand %xmm1, %xmm2406; X86-SSE-NEXT: movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]407; X86-SSE-NEXT: movdqa %xmm3, %xmm4408; X86-SSE-NEXT: pshufb %xmm2, %xmm4409; X86-SSE-NEXT: psrlw $4, %xmm0410; X86-SSE-NEXT: pand %xmm1, %xmm0411; X86-SSE-NEXT: pshufb %xmm0, %xmm3412; X86-SSE-NEXT: paddb %xmm4, %xmm3413; X86-SSE-NEXT: pxor %xmm0, %xmm0414; X86-SSE-NEXT: psadbw %xmm3, %xmm0415; X86-SSE-NEXT: retl416 %out = call <2 x i64> @llvm.cttz.v2i64(<2 x i64> %in, i1 -1)417 ret <2 x i64> %out418}419 420define <4 x i32> @testv4i32(<4 x i32> %in) nounwind {421; SSE2-LABEL: testv4i32:422; SSE2: # %bb.0:423; SSE2-NEXT: pcmpeqd %xmm1, %xmm1424; SSE2-NEXT: paddd %xmm0, %xmm1425; SSE2-NEXT: pandn %xmm1, %xmm0426; SSE2-NEXT: movdqa %xmm0, %xmm1427; SSE2-NEXT: psrlw $1, %xmm1428; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1429; SSE2-NEXT: psubb %xmm1, %xmm0430; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]431; SSE2-NEXT: movdqa %xmm0, %xmm2432; SSE2-NEXT: pand %xmm1, %xmm2433; SSE2-NEXT: psrlw $2, %xmm0434; SSE2-NEXT: pand %xmm1, %xmm0435; SSE2-NEXT: paddb %xmm2, %xmm0436; SSE2-NEXT: movdqa %xmm0, %xmm1437; SSE2-NEXT: psrlw $4, %xmm1438; SSE2-NEXT: paddb %xmm1, %xmm0439; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0440; SSE2-NEXT: pxor %xmm1, %xmm1441; SSE2-NEXT: movdqa %xmm0, %xmm2442; SSE2-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]443; SSE2-NEXT: psadbw %xmm1, %xmm2444; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]445; SSE2-NEXT: psadbw %xmm1, %xmm0446; SSE2-NEXT: packuswb %xmm2, %xmm0447; SSE2-NEXT: retq448;449; SSE3-LABEL: testv4i32:450; SSE3: # %bb.0:451; SSE3-NEXT: pcmpeqd %xmm1, %xmm1452; SSE3-NEXT: paddd %xmm0, %xmm1453; SSE3-NEXT: pandn %xmm1, %xmm0454; SSE3-NEXT: movdqa %xmm0, %xmm1455; SSE3-NEXT: psrlw $1, %xmm1456; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1457; SSE3-NEXT: psubb %xmm1, %xmm0458; SSE3-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]459; SSE3-NEXT: movdqa %xmm0, %xmm2460; SSE3-NEXT: pand %xmm1, %xmm2461; SSE3-NEXT: psrlw $2, %xmm0462; SSE3-NEXT: pand %xmm1, %xmm0463; SSE3-NEXT: paddb %xmm2, %xmm0464; SSE3-NEXT: movdqa %xmm0, %xmm1465; SSE3-NEXT: psrlw $4, %xmm1466; SSE3-NEXT: paddb %xmm1, %xmm0467; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0468; SSE3-NEXT: pxor %xmm1, %xmm1469; SSE3-NEXT: movdqa %xmm0, %xmm2470; SSE3-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]471; SSE3-NEXT: psadbw %xmm1, %xmm2472; SSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]473; SSE3-NEXT: psadbw %xmm1, %xmm0474; SSE3-NEXT: packuswb %xmm2, %xmm0475; SSE3-NEXT: retq476;477; SSSE3-LABEL: testv4i32:478; SSSE3: # %bb.0:479; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1480; SSSE3-NEXT: paddd %xmm0, %xmm1481; SSSE3-NEXT: pandn %xmm1, %xmm0482; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]483; SSSE3-NEXT: movdqa %xmm0, %xmm3484; SSSE3-NEXT: pand %xmm2, %xmm3485; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]486; SSSE3-NEXT: movdqa %xmm1, %xmm4487; SSSE3-NEXT: pshufb %xmm3, %xmm4488; SSSE3-NEXT: psrlw $4, %xmm0489; SSSE3-NEXT: pand %xmm2, %xmm0490; SSSE3-NEXT: pshufb %xmm0, %xmm1491; SSSE3-NEXT: paddb %xmm4, %xmm1492; SSSE3-NEXT: pxor %xmm0, %xmm0493; SSSE3-NEXT: movdqa %xmm1, %xmm2494; SSSE3-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm0[2],xmm2[3],xmm0[3]495; SSSE3-NEXT: psadbw %xmm0, %xmm2496; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]497; SSSE3-NEXT: psadbw %xmm0, %xmm1498; SSSE3-NEXT: packuswb %xmm2, %xmm1499; SSSE3-NEXT: movdqa %xmm1, %xmm0500; SSSE3-NEXT: retq501;502; SSE41-LABEL: testv4i32:503; SSE41: # %bb.0:504; SSE41-NEXT: pcmpeqd %xmm1, %xmm1505; SSE41-NEXT: paddd %xmm0, %xmm1506; SSE41-NEXT: pandn %xmm1, %xmm0507; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]508; SSE41-NEXT: movdqa %xmm0, %xmm2509; SSE41-NEXT: pand %xmm1, %xmm2510; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]511; SSE41-NEXT: movdqa %xmm3, %xmm4512; SSE41-NEXT: pshufb %xmm2, %xmm4513; SSE41-NEXT: psrlw $4, %xmm0514; SSE41-NEXT: pand %xmm1, %xmm0515; SSE41-NEXT: pshufb %xmm0, %xmm3516; SSE41-NEXT: paddb %xmm4, %xmm3517; SSE41-NEXT: pxor %xmm1, %xmm1518; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm3[0],zero,xmm3[1],zero519; SSE41-NEXT: punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm1[2],xmm3[3],xmm1[3]520; SSE41-NEXT: psadbw %xmm1, %xmm3521; SSE41-NEXT: psadbw %xmm1, %xmm0522; SSE41-NEXT: packuswb %xmm3, %xmm0523; SSE41-NEXT: retq524;525; AVX1-LABEL: testv4i32:526; AVX1: # %bb.0:527; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1528; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1529; AVX1-NEXT: vpandn %xmm1, %xmm0, %xmm0530; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]531; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm2532; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]533; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2534; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0535; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0536; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm0537; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0538; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1539; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]540; AVX1-NEXT: vpsadbw %xmm1, %xmm2, %xmm2541; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero542; AVX1-NEXT: vpsadbw %xmm1, %xmm0, %xmm0543; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0544; AVX1-NEXT: retq545;546; AVX2-LABEL: testv4i32:547; AVX2: # %bb.0:548; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1549; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm1550; AVX2-NEXT: vpandn %xmm1, %xmm0, %xmm0551; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]552; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm2553; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]554; AVX2-NEXT: vpshufb %xmm2, %xmm3, %xmm2555; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm0556; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0557; AVX2-NEXT: vpshufb %xmm0, %xmm3, %xmm0558; AVX2-NEXT: vpaddb %xmm2, %xmm0, %xmm0559; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1560; AVX2-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]561; AVX2-NEXT: vpsadbw %xmm1, %xmm2, %xmm2562; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero563; AVX2-NEXT: vpsadbw %xmm1, %xmm0, %xmm0564; AVX2-NEXT: vpackuswb %xmm2, %xmm0, %xmm0565; AVX2-NEXT: retq566;567; AVX512CDVL-LABEL: testv4i32:568; AVX512CDVL: # %bb.0:569; AVX512CDVL-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1570; AVX512CDVL-NEXT: vpaddd %xmm1, %xmm0, %xmm1571; AVX512CDVL-NEXT: vpandn %xmm1, %xmm0, %xmm0572; AVX512CDVL-NEXT: vplzcntd %xmm0, %xmm0573; AVX512CDVL-NEXT: vpbroadcastd {{.*#+}} xmm1 = [32,32,32,32]574; AVX512CDVL-NEXT: vpsubd %xmm0, %xmm1, %xmm0575; AVX512CDVL-NEXT: retq576;577; AVX512CD-LABEL: testv4i32:578; AVX512CD: # %bb.0:579; AVX512CD-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1580; AVX512CD-NEXT: vpaddd %xmm1, %xmm0, %xmm1581; AVX512CD-NEXT: vpandn %xmm1, %xmm0, %xmm0582; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0583; AVX512CD-NEXT: vpbroadcastd {{.*#+}} xmm1 = [32,32,32,32]584; AVX512CD-NEXT: vpsubd %xmm0, %xmm1, %xmm0585; AVX512CD-NEXT: vzeroupper586; AVX512CD-NEXT: retq587;588; AVX512VPOPCNTDQ-LABEL: testv4i32:589; AVX512VPOPCNTDQ: # %bb.0:590; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1591; AVX512VPOPCNTDQ-NEXT: vpaddd %xmm1, %xmm0, %xmm1592; AVX512VPOPCNTDQ-NEXT: vpandn %xmm1, %xmm0, %xmm0593; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm0594; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0595; AVX512VPOPCNTDQ-NEXT: vzeroupper596; AVX512VPOPCNTDQ-NEXT: retq597;598; AVX512VPOPCNTDQVL-LABEL: testv4i32:599; AVX512VPOPCNTDQVL: # %bb.0:600; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1601; AVX512VPOPCNTDQVL-NEXT: vpaddd %xmm1, %xmm0, %xmm1602; AVX512VPOPCNTDQVL-NEXT: vpandn %xmm1, %xmm0, %xmm0603; AVX512VPOPCNTDQVL-NEXT: vpopcntd %xmm0, %xmm0604; AVX512VPOPCNTDQVL-NEXT: retq605;606; BITALG_NOVLX-LABEL: testv4i32:607; BITALG_NOVLX: # %bb.0:608; BITALG_NOVLX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1609; BITALG_NOVLX-NEXT: vpaddd %xmm1, %xmm0, %xmm1610; BITALG_NOVLX-NEXT: vpandn %xmm1, %xmm0, %xmm0611; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm0612; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm1, %xmm1613; BITALG_NOVLX-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]614; BITALG_NOVLX-NEXT: vpsadbw %xmm1, %xmm2, %xmm2615; BITALG_NOVLX-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero616; BITALG_NOVLX-NEXT: vpsadbw %xmm1, %xmm0, %xmm0617; BITALG_NOVLX-NEXT: vpackuswb %xmm2, %xmm0, %xmm0618; BITALG_NOVLX-NEXT: vzeroupper619; BITALG_NOVLX-NEXT: retq620;621; BITALG-LABEL: testv4i32:622; BITALG: # %bb.0:623; BITALG-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1624; BITALG-NEXT: vpaddd %xmm1, %xmm0, %xmm1625; BITALG-NEXT: vpandn %xmm1, %xmm0, %xmm0626; BITALG-NEXT: vpopcntb %xmm0, %xmm0627; BITALG-NEXT: vpxor %xmm1, %xmm1, %xmm1628; BITALG-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]629; BITALG-NEXT: vpsadbw %xmm1, %xmm2, %xmm2630; BITALG-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero631; BITALG-NEXT: vpsadbw %xmm1, %xmm0, %xmm0632; BITALG-NEXT: vpackuswb %xmm2, %xmm0, %xmm0633; BITALG-NEXT: retq634;635; X86-SSE-LABEL: testv4i32:636; X86-SSE: # %bb.0:637; X86-SSE-NEXT: pcmpeqd %xmm1, %xmm1638; X86-SSE-NEXT: paddd %xmm0, %xmm1639; X86-SSE-NEXT: pandn %xmm1, %xmm0640; X86-SSE-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]641; X86-SSE-NEXT: movdqa %xmm0, %xmm3642; X86-SSE-NEXT: pand %xmm2, %xmm3643; X86-SSE-NEXT: movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]644; X86-SSE-NEXT: movdqa %xmm1, %xmm4645; X86-SSE-NEXT: pshufb %xmm3, %xmm4646; X86-SSE-NEXT: psrlw $4, %xmm0647; X86-SSE-NEXT: pand %xmm2, %xmm0648; X86-SSE-NEXT: pshufb %xmm0, %xmm1649; X86-SSE-NEXT: paddb %xmm4, %xmm1650; X86-SSE-NEXT: pxor %xmm2, %xmm2651; X86-SSE-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero652; X86-SSE-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]653; X86-SSE-NEXT: psadbw %xmm2, %xmm1654; X86-SSE-NEXT: psadbw %xmm2, %xmm0655; X86-SSE-NEXT: packuswb %xmm1, %xmm0656; X86-SSE-NEXT: retl657 %out = call <4 x i32> @llvm.cttz.v4i32(<4 x i32> %in, i1 0)658 ret <4 x i32> %out659}660 661define <4 x i32> @testv4i32u(<4 x i32> %in) nounwind {662; SSE2-LABEL: testv4i32u:663; SSE2: # %bb.0:664; SSE2-NEXT: pcmpeqd %xmm1, %xmm1665; SSE2-NEXT: paddd %xmm0, %xmm1666; SSE2-NEXT: pandn %xmm1, %xmm0667; SSE2-NEXT: movdqa %xmm0, %xmm1668; SSE2-NEXT: psrlw $1, %xmm1669; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1670; SSE2-NEXT: psubb %xmm1, %xmm0671; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]672; SSE2-NEXT: movdqa %xmm0, %xmm2673; SSE2-NEXT: pand %xmm1, %xmm2674; SSE2-NEXT: psrlw $2, %xmm0675; SSE2-NEXT: pand %xmm1, %xmm0676; SSE2-NEXT: paddb %xmm2, %xmm0677; SSE2-NEXT: movdqa %xmm0, %xmm1678; SSE2-NEXT: psrlw $4, %xmm1679; SSE2-NEXT: paddb %xmm1, %xmm0680; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0681; SSE2-NEXT: pxor %xmm1, %xmm1682; SSE2-NEXT: movdqa %xmm0, %xmm2683; SSE2-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]684; SSE2-NEXT: psadbw %xmm1, %xmm2685; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]686; SSE2-NEXT: psadbw %xmm1, %xmm0687; SSE2-NEXT: packuswb %xmm2, %xmm0688; SSE2-NEXT: retq689;690; SSE3-LABEL: testv4i32u:691; SSE3: # %bb.0:692; SSE3-NEXT: pcmpeqd %xmm1, %xmm1693; SSE3-NEXT: paddd %xmm0, %xmm1694; SSE3-NEXT: pandn %xmm1, %xmm0695; SSE3-NEXT: movdqa %xmm0, %xmm1696; SSE3-NEXT: psrlw $1, %xmm1697; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1698; SSE3-NEXT: psubb %xmm1, %xmm0699; SSE3-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]700; SSE3-NEXT: movdqa %xmm0, %xmm2701; SSE3-NEXT: pand %xmm1, %xmm2702; SSE3-NEXT: psrlw $2, %xmm0703; SSE3-NEXT: pand %xmm1, %xmm0704; SSE3-NEXT: paddb %xmm2, %xmm0705; SSE3-NEXT: movdqa %xmm0, %xmm1706; SSE3-NEXT: psrlw $4, %xmm1707; SSE3-NEXT: paddb %xmm1, %xmm0708; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0709; SSE3-NEXT: pxor %xmm1, %xmm1710; SSE3-NEXT: movdqa %xmm0, %xmm2711; SSE3-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]712; SSE3-NEXT: psadbw %xmm1, %xmm2713; SSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]714; SSE3-NEXT: psadbw %xmm1, %xmm0715; SSE3-NEXT: packuswb %xmm2, %xmm0716; SSE3-NEXT: retq717;718; SSSE3-LABEL: testv4i32u:719; SSSE3: # %bb.0:720; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1721; SSSE3-NEXT: paddd %xmm0, %xmm1722; SSSE3-NEXT: pandn %xmm1, %xmm0723; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]724; SSSE3-NEXT: movdqa %xmm0, %xmm3725; SSSE3-NEXT: pand %xmm2, %xmm3726; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]727; SSSE3-NEXT: movdqa %xmm1, %xmm4728; SSSE3-NEXT: pshufb %xmm3, %xmm4729; SSSE3-NEXT: psrlw $4, %xmm0730; SSSE3-NEXT: pand %xmm2, %xmm0731; SSSE3-NEXT: pshufb %xmm0, %xmm1732; SSSE3-NEXT: paddb %xmm4, %xmm1733; SSSE3-NEXT: pxor %xmm0, %xmm0734; SSSE3-NEXT: movdqa %xmm1, %xmm2735; SSSE3-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm0[2],xmm2[3],xmm0[3]736; SSSE3-NEXT: psadbw %xmm0, %xmm2737; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]738; SSSE3-NEXT: psadbw %xmm0, %xmm1739; SSSE3-NEXT: packuswb %xmm2, %xmm1740; SSSE3-NEXT: movdqa %xmm1, %xmm0741; SSSE3-NEXT: retq742;743; SSE41-LABEL: testv4i32u:744; SSE41: # %bb.0:745; SSE41-NEXT: pcmpeqd %xmm1, %xmm1746; SSE41-NEXT: paddd %xmm0, %xmm1747; SSE41-NEXT: pandn %xmm1, %xmm0748; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]749; SSE41-NEXT: movdqa %xmm0, %xmm2750; SSE41-NEXT: pand %xmm1, %xmm2751; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]752; SSE41-NEXT: movdqa %xmm3, %xmm4753; SSE41-NEXT: pshufb %xmm2, %xmm4754; SSE41-NEXT: psrlw $4, %xmm0755; SSE41-NEXT: pand %xmm1, %xmm0756; SSE41-NEXT: pshufb %xmm0, %xmm3757; SSE41-NEXT: paddb %xmm4, %xmm3758; SSE41-NEXT: pxor %xmm1, %xmm1759; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm3[0],zero,xmm3[1],zero760; SSE41-NEXT: punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm1[2],xmm3[3],xmm1[3]761; SSE41-NEXT: psadbw %xmm1, %xmm3762; SSE41-NEXT: psadbw %xmm1, %xmm0763; SSE41-NEXT: packuswb %xmm3, %xmm0764; SSE41-NEXT: retq765;766; AVX1-LABEL: testv4i32u:767; AVX1: # %bb.0:768; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1769; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1770; AVX1-NEXT: vpandn %xmm1, %xmm0, %xmm0771; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]772; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm2773; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]774; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2775; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0776; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0777; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm0778; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0779; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1780; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]781; AVX1-NEXT: vpsadbw %xmm1, %xmm2, %xmm2782; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero783; AVX1-NEXT: vpsadbw %xmm1, %xmm0, %xmm0784; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0785; AVX1-NEXT: retq786;787; AVX2-LABEL: testv4i32u:788; AVX2: # %bb.0:789; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1790; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm1791; AVX2-NEXT: vpandn %xmm1, %xmm0, %xmm0792; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]793; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm2794; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]795; AVX2-NEXT: vpshufb %xmm2, %xmm3, %xmm2796; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm0797; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0798; AVX2-NEXT: vpshufb %xmm0, %xmm3, %xmm0799; AVX2-NEXT: vpaddb %xmm2, %xmm0, %xmm0800; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1801; AVX2-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]802; AVX2-NEXT: vpsadbw %xmm1, %xmm2, %xmm2803; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero804; AVX2-NEXT: vpsadbw %xmm1, %xmm0, %xmm0805; AVX2-NEXT: vpackuswb %xmm2, %xmm0, %xmm0806; AVX2-NEXT: retq807;808; AVX512CDVL-LABEL: testv4i32u:809; AVX512CDVL: # %bb.0:810; AVX512CDVL-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1811; AVX512CDVL-NEXT: vpaddd %xmm1, %xmm0, %xmm1812; AVX512CDVL-NEXT: vpandn %xmm1, %xmm0, %xmm0813; AVX512CDVL-NEXT: vplzcntd %xmm0, %xmm0814; AVX512CDVL-NEXT: vpbroadcastd {{.*#+}} xmm1 = [32,32,32,32]815; AVX512CDVL-NEXT: vpsubd %xmm0, %xmm1, %xmm0816; AVX512CDVL-NEXT: retq817;818; AVX512CD-LABEL: testv4i32u:819; AVX512CD: # %bb.0:820; AVX512CD-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1821; AVX512CD-NEXT: vpaddd %xmm1, %xmm0, %xmm1822; AVX512CD-NEXT: vpandn %xmm1, %xmm0, %xmm0823; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0824; AVX512CD-NEXT: vpbroadcastd {{.*#+}} xmm1 = [32,32,32,32]825; AVX512CD-NEXT: vpsubd %xmm0, %xmm1, %xmm0826; AVX512CD-NEXT: vzeroupper827; AVX512CD-NEXT: retq828;829; AVX512VPOPCNTDQ-LABEL: testv4i32u:830; AVX512VPOPCNTDQ: # %bb.0:831; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1832; AVX512VPOPCNTDQ-NEXT: vpaddd %xmm1, %xmm0, %xmm1833; AVX512VPOPCNTDQ-NEXT: vpandn %xmm1, %xmm0, %xmm0834; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm0835; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0836; AVX512VPOPCNTDQ-NEXT: vzeroupper837; AVX512VPOPCNTDQ-NEXT: retq838;839; AVX512VPOPCNTDQVL-LABEL: testv4i32u:840; AVX512VPOPCNTDQVL: # %bb.0:841; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1842; AVX512VPOPCNTDQVL-NEXT: vpaddd %xmm1, %xmm0, %xmm1843; AVX512VPOPCNTDQVL-NEXT: vpandn %xmm1, %xmm0, %xmm0844; AVX512VPOPCNTDQVL-NEXT: vpopcntd %xmm0, %xmm0845; AVX512VPOPCNTDQVL-NEXT: retq846;847; BITALG_NOVLX-LABEL: testv4i32u:848; BITALG_NOVLX: # %bb.0:849; BITALG_NOVLX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1850; BITALG_NOVLX-NEXT: vpaddd %xmm1, %xmm0, %xmm1851; BITALG_NOVLX-NEXT: vpandn %xmm1, %xmm0, %xmm0852; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm0853; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm1, %xmm1854; BITALG_NOVLX-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]855; BITALG_NOVLX-NEXT: vpsadbw %xmm1, %xmm2, %xmm2856; BITALG_NOVLX-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero857; BITALG_NOVLX-NEXT: vpsadbw %xmm1, %xmm0, %xmm0858; BITALG_NOVLX-NEXT: vpackuswb %xmm2, %xmm0, %xmm0859; BITALG_NOVLX-NEXT: vzeroupper860; BITALG_NOVLX-NEXT: retq861;862; BITALG-LABEL: testv4i32u:863; BITALG: # %bb.0:864; BITALG-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1865; BITALG-NEXT: vpaddd %xmm1, %xmm0, %xmm1866; BITALG-NEXT: vpandn %xmm1, %xmm0, %xmm0867; BITALG-NEXT: vpopcntb %xmm0, %xmm0868; BITALG-NEXT: vpxor %xmm1, %xmm1, %xmm1869; BITALG-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]870; BITALG-NEXT: vpsadbw %xmm1, %xmm2, %xmm2871; BITALG-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero872; BITALG-NEXT: vpsadbw %xmm1, %xmm0, %xmm0873; BITALG-NEXT: vpackuswb %xmm2, %xmm0, %xmm0874; BITALG-NEXT: retq875;876; X86-SSE-LABEL: testv4i32u:877; X86-SSE: # %bb.0:878; X86-SSE-NEXT: pcmpeqd %xmm1, %xmm1879; X86-SSE-NEXT: paddd %xmm0, %xmm1880; X86-SSE-NEXT: pandn %xmm1, %xmm0881; X86-SSE-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]882; X86-SSE-NEXT: movdqa %xmm0, %xmm3883; X86-SSE-NEXT: pand %xmm2, %xmm3884; X86-SSE-NEXT: movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]885; X86-SSE-NEXT: movdqa %xmm1, %xmm4886; X86-SSE-NEXT: pshufb %xmm3, %xmm4887; X86-SSE-NEXT: psrlw $4, %xmm0888; X86-SSE-NEXT: pand %xmm2, %xmm0889; X86-SSE-NEXT: pshufb %xmm0, %xmm1890; X86-SSE-NEXT: paddb %xmm4, %xmm1891; X86-SSE-NEXT: pxor %xmm2, %xmm2892; X86-SSE-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero893; X86-SSE-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]894; X86-SSE-NEXT: psadbw %xmm2, %xmm1895; X86-SSE-NEXT: psadbw %xmm2, %xmm0896; X86-SSE-NEXT: packuswb %xmm1, %xmm0897; X86-SSE-NEXT: retl898 %out = call <4 x i32> @llvm.cttz.v4i32(<4 x i32> %in, i1 -1)899 ret <4 x i32> %out900}901 902define <8 x i16> @testv8i16(<8 x i16> %in) nounwind {903; SSE2-LABEL: testv8i16:904; SSE2: # %bb.0:905; SSE2-NEXT: pcmpeqd %xmm1, %xmm1906; SSE2-NEXT: paddw %xmm0, %xmm1907; SSE2-NEXT: pandn %xmm1, %xmm0908; SSE2-NEXT: movdqa %xmm0, %xmm1909; SSE2-NEXT: psrlw $1, %xmm1910; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1911; SSE2-NEXT: psubb %xmm1, %xmm0912; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]913; SSE2-NEXT: movdqa %xmm0, %xmm2914; SSE2-NEXT: pand %xmm1, %xmm2915; SSE2-NEXT: psrlw $2, %xmm0916; SSE2-NEXT: pand %xmm1, %xmm0917; SSE2-NEXT: paddb %xmm2, %xmm0918; SSE2-NEXT: movdqa %xmm0, %xmm1919; SSE2-NEXT: psrlw $4, %xmm1920; SSE2-NEXT: paddb %xmm1, %xmm0921; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0922; SSE2-NEXT: movdqa %xmm0, %xmm1923; SSE2-NEXT: psllw $8, %xmm1924; SSE2-NEXT: paddb %xmm1, %xmm0925; SSE2-NEXT: psrlw $8, %xmm0926; SSE2-NEXT: retq927;928; SSE3-LABEL: testv8i16:929; SSE3: # %bb.0:930; SSE3-NEXT: pcmpeqd %xmm1, %xmm1931; SSE3-NEXT: paddw %xmm0, %xmm1932; SSE3-NEXT: pandn %xmm1, %xmm0933; SSE3-NEXT: movdqa %xmm0, %xmm1934; SSE3-NEXT: psrlw $1, %xmm1935; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1936; SSE3-NEXT: psubb %xmm1, %xmm0937; SSE3-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]938; SSE3-NEXT: movdqa %xmm0, %xmm2939; SSE3-NEXT: pand %xmm1, %xmm2940; SSE3-NEXT: psrlw $2, %xmm0941; SSE3-NEXT: pand %xmm1, %xmm0942; SSE3-NEXT: paddb %xmm2, %xmm0943; SSE3-NEXT: movdqa %xmm0, %xmm1944; SSE3-NEXT: psrlw $4, %xmm1945; SSE3-NEXT: paddb %xmm1, %xmm0946; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0947; SSE3-NEXT: movdqa %xmm0, %xmm1948; SSE3-NEXT: psllw $8, %xmm1949; SSE3-NEXT: paddb %xmm1, %xmm0950; SSE3-NEXT: psrlw $8, %xmm0951; SSE3-NEXT: retq952;953; SSSE3-LABEL: testv8i16:954; SSSE3: # %bb.0:955; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1956; SSSE3-NEXT: paddw %xmm0, %xmm1957; SSSE3-NEXT: pandn %xmm1, %xmm0958; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]959; SSSE3-NEXT: movdqa %xmm0, %xmm2960; SSSE3-NEXT: pand %xmm1, %xmm2961; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]962; SSSE3-NEXT: movdqa %xmm3, %xmm4963; SSSE3-NEXT: pshufb %xmm2, %xmm4964; SSSE3-NEXT: psrlw $4, %xmm0965; SSSE3-NEXT: pand %xmm1, %xmm0966; SSSE3-NEXT: pshufb %xmm0, %xmm3967; SSSE3-NEXT: paddb %xmm4, %xmm3968; SSSE3-NEXT: movdqa %xmm3, %xmm0969; SSSE3-NEXT: psllw $8, %xmm0970; SSSE3-NEXT: paddb %xmm3, %xmm0971; SSSE3-NEXT: psrlw $8, %xmm0972; SSSE3-NEXT: retq973;974; SSE41-LABEL: testv8i16:975; SSE41: # %bb.0:976; SSE41-NEXT: pcmpeqd %xmm1, %xmm1977; SSE41-NEXT: paddw %xmm0, %xmm1978; SSE41-NEXT: pandn %xmm1, %xmm0979; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]980; SSE41-NEXT: movdqa %xmm0, %xmm2981; SSE41-NEXT: pand %xmm1, %xmm2982; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]983; SSE41-NEXT: movdqa %xmm3, %xmm4984; SSE41-NEXT: pshufb %xmm2, %xmm4985; SSE41-NEXT: psrlw $4, %xmm0986; SSE41-NEXT: pand %xmm1, %xmm0987; SSE41-NEXT: pshufb %xmm0, %xmm3988; SSE41-NEXT: paddb %xmm4, %xmm3989; SSE41-NEXT: movdqa %xmm3, %xmm0990; SSE41-NEXT: psllw $8, %xmm0991; SSE41-NEXT: paddb %xmm3, %xmm0992; SSE41-NEXT: psrlw $8, %xmm0993; SSE41-NEXT: retq994;995; AVX1-LABEL: testv8i16:996; AVX1: # %bb.0:997; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1998; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm1999; AVX1-NEXT: vpandn %xmm1, %xmm0, %xmm01000; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1001; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm21002; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1003; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm21004; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm01005; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm01006; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm01007; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm01008; AVX1-NEXT: vpsllw $8, %xmm0, %xmm11009; AVX1-NEXT: vpaddb %xmm0, %xmm1, %xmm01010; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm01011; AVX1-NEXT: retq1012;1013; AVX2-LABEL: testv8i16:1014; AVX2: # %bb.0:1015; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11016; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm11017; AVX2-NEXT: vpandn %xmm1, %xmm0, %xmm01018; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1019; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm21020; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1021; AVX2-NEXT: vpshufb %xmm2, %xmm3, %xmm21022; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm01023; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm01024; AVX2-NEXT: vpshufb %xmm0, %xmm3, %xmm01025; AVX2-NEXT: vpaddb %xmm2, %xmm0, %xmm01026; AVX2-NEXT: vpsllw $8, %xmm0, %xmm11027; AVX2-NEXT: vpaddb %xmm0, %xmm1, %xmm01028; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm01029; AVX2-NEXT: retq1030;1031; AVX512CDVL-LABEL: testv8i16:1032; AVX512CDVL: # %bb.0:1033; AVX512CDVL-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11034; AVX512CDVL-NEXT: vpaddw %xmm1, %xmm0, %xmm11035; AVX512CDVL-NEXT: vpandn %xmm1, %xmm0, %xmm01036; AVX512CDVL-NEXT: vpbroadcastd {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1037; AVX512CDVL-NEXT: vpand %xmm1, %xmm0, %xmm21038; AVX512CDVL-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1039; AVX512CDVL-NEXT: vpshufb %xmm2, %xmm3, %xmm21040; AVX512CDVL-NEXT: vpsrlw $4, %xmm0, %xmm01041; AVX512CDVL-NEXT: vpand %xmm1, %xmm0, %xmm01042; AVX512CDVL-NEXT: vpshufb %xmm0, %xmm3, %xmm01043; AVX512CDVL-NEXT: vpaddb %xmm2, %xmm0, %xmm01044; AVX512CDVL-NEXT: vpsllw $8, %xmm0, %xmm11045; AVX512CDVL-NEXT: vpaddb %xmm0, %xmm1, %xmm01046; AVX512CDVL-NEXT: vpsrlw $8, %xmm0, %xmm01047; AVX512CDVL-NEXT: retq1048;1049; AVX512CD-LABEL: testv8i16:1050; AVX512CD: # %bb.0:1051; AVX512CD-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11052; AVX512CD-NEXT: vpaddw %xmm1, %xmm0, %xmm11053; AVX512CD-NEXT: vpandn %xmm1, %xmm0, %xmm01054; AVX512CD-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1055; AVX512CD-NEXT: vpand %xmm1, %xmm0, %xmm21056; AVX512CD-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1057; AVX512CD-NEXT: vpshufb %xmm2, %xmm3, %xmm21058; AVX512CD-NEXT: vpsrlw $4, %xmm0, %xmm01059; AVX512CD-NEXT: vpand %xmm1, %xmm0, %xmm01060; AVX512CD-NEXT: vpshufb %xmm0, %xmm3, %xmm01061; AVX512CD-NEXT: vpaddb %xmm2, %xmm0, %xmm01062; AVX512CD-NEXT: vpsllw $8, %xmm0, %xmm11063; AVX512CD-NEXT: vpaddb %xmm0, %xmm1, %xmm01064; AVX512CD-NEXT: vpsrlw $8, %xmm0, %xmm01065; AVX512CD-NEXT: retq1066;1067; AVX512VPOPCNTDQ-LABEL: testv8i16:1068; AVX512VPOPCNTDQ: # %bb.0:1069; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11070; AVX512VPOPCNTDQ-NEXT: vpaddw %xmm1, %xmm0, %xmm11071; AVX512VPOPCNTDQ-NEXT: vpandn %xmm1, %xmm0, %xmm01072; 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],zero1073; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm01074; AVX512VPOPCNTDQ-NEXT: vpmovdw %zmm0, %ymm01075; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01076; AVX512VPOPCNTDQ-NEXT: vzeroupper1077; AVX512VPOPCNTDQ-NEXT: retq1078;1079; AVX512VPOPCNTDQVL-LABEL: testv8i16:1080; AVX512VPOPCNTDQVL: # %bb.0:1081; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11082; AVX512VPOPCNTDQVL-NEXT: vpaddw %xmm1, %xmm0, %xmm11083; AVX512VPOPCNTDQVL-NEXT: vpandn %xmm1, %xmm0, %xmm01084; 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],zero1085; AVX512VPOPCNTDQVL-NEXT: vpopcntd %ymm0, %ymm01086; AVX512VPOPCNTDQVL-NEXT: vpmovdw %ymm0, %xmm01087; AVX512VPOPCNTDQVL-NEXT: vzeroupper1088; AVX512VPOPCNTDQVL-NEXT: retq1089;1090; BITALG_NOVLX-LABEL: testv8i16:1091; BITALG_NOVLX: # %bb.0:1092; BITALG_NOVLX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11093; BITALG_NOVLX-NEXT: vpaddw %xmm1, %xmm0, %xmm11094; BITALG_NOVLX-NEXT: vpandn %xmm1, %xmm0, %xmm01095; BITALG_NOVLX-NEXT: vpopcntw %zmm0, %zmm01096; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01097; BITALG_NOVLX-NEXT: vzeroupper1098; BITALG_NOVLX-NEXT: retq1099;1100; BITALG-LABEL: testv8i16:1101; BITALG: # %bb.0:1102; BITALG-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11103; BITALG-NEXT: vpaddw %xmm1, %xmm0, %xmm11104; BITALG-NEXT: vpandn %xmm1, %xmm0, %xmm01105; BITALG-NEXT: vpopcntw %xmm0, %xmm01106; BITALG-NEXT: retq1107;1108; X86-SSE-LABEL: testv8i16:1109; X86-SSE: # %bb.0:1110; X86-SSE-NEXT: pcmpeqd %xmm1, %xmm11111; X86-SSE-NEXT: paddw %xmm0, %xmm11112; X86-SSE-NEXT: pandn %xmm1, %xmm01113; X86-SSE-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1114; X86-SSE-NEXT: movdqa %xmm0, %xmm21115; X86-SSE-NEXT: pand %xmm1, %xmm21116; X86-SSE-NEXT: movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1117; X86-SSE-NEXT: movdqa %xmm3, %xmm41118; X86-SSE-NEXT: pshufb %xmm2, %xmm41119; X86-SSE-NEXT: psrlw $4, %xmm01120; X86-SSE-NEXT: pand %xmm1, %xmm01121; X86-SSE-NEXT: pshufb %xmm0, %xmm31122; X86-SSE-NEXT: paddb %xmm4, %xmm31123; X86-SSE-NEXT: movdqa %xmm3, %xmm01124; X86-SSE-NEXT: psllw $8, %xmm01125; X86-SSE-NEXT: paddb %xmm3, %xmm01126; X86-SSE-NEXT: psrlw $8, %xmm01127; X86-SSE-NEXT: retl1128 %out = call <8 x i16> @llvm.cttz.v8i16(<8 x i16> %in, i1 0)1129 ret <8 x i16> %out1130}1131 1132define <8 x i16> @testv8i16u(<8 x i16> %in) nounwind {1133; SSE2-LABEL: testv8i16u:1134; SSE2: # %bb.0:1135; SSE2-NEXT: pcmpeqd %xmm1, %xmm11136; SSE2-NEXT: paddw %xmm0, %xmm11137; SSE2-NEXT: pandn %xmm1, %xmm01138; SSE2-NEXT: movdqa %xmm0, %xmm11139; SSE2-NEXT: psrlw $1, %xmm11140; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11141; SSE2-NEXT: psubb %xmm1, %xmm01142; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]1143; SSE2-NEXT: movdqa %xmm0, %xmm21144; SSE2-NEXT: pand %xmm1, %xmm21145; SSE2-NEXT: psrlw $2, %xmm01146; SSE2-NEXT: pand %xmm1, %xmm01147; SSE2-NEXT: paddb %xmm2, %xmm01148; SSE2-NEXT: movdqa %xmm0, %xmm11149; SSE2-NEXT: psrlw $4, %xmm11150; SSE2-NEXT: paddb %xmm1, %xmm01151; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01152; SSE2-NEXT: movdqa %xmm0, %xmm11153; SSE2-NEXT: psllw $8, %xmm11154; SSE2-NEXT: paddb %xmm1, %xmm01155; SSE2-NEXT: psrlw $8, %xmm01156; SSE2-NEXT: retq1157;1158; SSE3-LABEL: testv8i16u:1159; SSE3: # %bb.0:1160; SSE3-NEXT: pcmpeqd %xmm1, %xmm11161; SSE3-NEXT: paddw %xmm0, %xmm11162; SSE3-NEXT: pandn %xmm1, %xmm01163; SSE3-NEXT: movdqa %xmm0, %xmm11164; SSE3-NEXT: psrlw $1, %xmm11165; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11166; SSE3-NEXT: psubb %xmm1, %xmm01167; SSE3-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]1168; SSE3-NEXT: movdqa %xmm0, %xmm21169; SSE3-NEXT: pand %xmm1, %xmm21170; SSE3-NEXT: psrlw $2, %xmm01171; SSE3-NEXT: pand %xmm1, %xmm01172; SSE3-NEXT: paddb %xmm2, %xmm01173; SSE3-NEXT: movdqa %xmm0, %xmm11174; SSE3-NEXT: psrlw $4, %xmm11175; SSE3-NEXT: paddb %xmm1, %xmm01176; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01177; SSE3-NEXT: movdqa %xmm0, %xmm11178; SSE3-NEXT: psllw $8, %xmm11179; SSE3-NEXT: paddb %xmm1, %xmm01180; SSE3-NEXT: psrlw $8, %xmm01181; SSE3-NEXT: retq1182;1183; SSSE3-LABEL: testv8i16u:1184; SSSE3: # %bb.0:1185; SSSE3-NEXT: pcmpeqd %xmm1, %xmm11186; SSSE3-NEXT: paddw %xmm0, %xmm11187; SSSE3-NEXT: pandn %xmm1, %xmm01188; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1189; SSSE3-NEXT: movdqa %xmm0, %xmm21190; SSSE3-NEXT: pand %xmm1, %xmm21191; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1192; SSSE3-NEXT: movdqa %xmm3, %xmm41193; SSSE3-NEXT: pshufb %xmm2, %xmm41194; SSSE3-NEXT: psrlw $4, %xmm01195; SSSE3-NEXT: pand %xmm1, %xmm01196; SSSE3-NEXT: pshufb %xmm0, %xmm31197; SSSE3-NEXT: paddb %xmm4, %xmm31198; SSSE3-NEXT: movdqa %xmm3, %xmm01199; SSSE3-NEXT: psllw $8, %xmm01200; SSSE3-NEXT: paddb %xmm3, %xmm01201; SSSE3-NEXT: psrlw $8, %xmm01202; SSSE3-NEXT: retq1203;1204; SSE41-LABEL: testv8i16u:1205; SSE41: # %bb.0:1206; SSE41-NEXT: pcmpeqd %xmm1, %xmm11207; SSE41-NEXT: paddw %xmm0, %xmm11208; SSE41-NEXT: pandn %xmm1, %xmm01209; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1210; SSE41-NEXT: movdqa %xmm0, %xmm21211; SSE41-NEXT: pand %xmm1, %xmm21212; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1213; SSE41-NEXT: movdqa %xmm3, %xmm41214; SSE41-NEXT: pshufb %xmm2, %xmm41215; SSE41-NEXT: psrlw $4, %xmm01216; SSE41-NEXT: pand %xmm1, %xmm01217; SSE41-NEXT: pshufb %xmm0, %xmm31218; SSE41-NEXT: paddb %xmm4, %xmm31219; SSE41-NEXT: movdqa %xmm3, %xmm01220; SSE41-NEXT: psllw $8, %xmm01221; SSE41-NEXT: paddb %xmm3, %xmm01222; SSE41-NEXT: psrlw $8, %xmm01223; SSE41-NEXT: retq1224;1225; AVX1-LABEL: testv8i16u:1226; AVX1: # %bb.0:1227; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11228; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm11229; AVX1-NEXT: vpandn %xmm1, %xmm0, %xmm01230; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1231; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm21232; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1233; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm21234; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm01235; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm01236; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm01237; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm01238; AVX1-NEXT: vpsllw $8, %xmm0, %xmm11239; AVX1-NEXT: vpaddb %xmm0, %xmm1, %xmm01240; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm01241; AVX1-NEXT: retq1242;1243; AVX2-LABEL: testv8i16u:1244; AVX2: # %bb.0:1245; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11246; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm11247; AVX2-NEXT: vpandn %xmm1, %xmm0, %xmm01248; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1249; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm21250; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1251; AVX2-NEXT: vpshufb %xmm2, %xmm3, %xmm21252; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm01253; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm01254; AVX2-NEXT: vpshufb %xmm0, %xmm3, %xmm01255; AVX2-NEXT: vpaddb %xmm2, %xmm0, %xmm01256; AVX2-NEXT: vpsllw $8, %xmm0, %xmm11257; AVX2-NEXT: vpaddb %xmm0, %xmm1, %xmm01258; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm01259; AVX2-NEXT: retq1260;1261; AVX512CDVL-LABEL: testv8i16u:1262; AVX512CDVL: # %bb.0:1263; AVX512CDVL-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11264; AVX512CDVL-NEXT: vpaddw %xmm1, %xmm0, %xmm11265; AVX512CDVL-NEXT: vpandn %xmm1, %xmm0, %xmm01266; AVX512CDVL-NEXT: vpbroadcastd {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1267; AVX512CDVL-NEXT: vpand %xmm1, %xmm0, %xmm21268; AVX512CDVL-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1269; AVX512CDVL-NEXT: vpshufb %xmm2, %xmm3, %xmm21270; AVX512CDVL-NEXT: vpsrlw $4, %xmm0, %xmm01271; AVX512CDVL-NEXT: vpand %xmm1, %xmm0, %xmm01272; AVX512CDVL-NEXT: vpshufb %xmm0, %xmm3, %xmm01273; AVX512CDVL-NEXT: vpaddb %xmm2, %xmm0, %xmm01274; AVX512CDVL-NEXT: vpsllw $8, %xmm0, %xmm11275; AVX512CDVL-NEXT: vpaddb %xmm0, %xmm1, %xmm01276; AVX512CDVL-NEXT: vpsrlw $8, %xmm0, %xmm01277; AVX512CDVL-NEXT: retq1278;1279; AVX512CD-LABEL: testv8i16u:1280; AVX512CD: # %bb.0:1281; AVX512CD-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11282; AVX512CD-NEXT: vpaddw %xmm1, %xmm0, %xmm11283; AVX512CD-NEXT: vpandn %xmm1, %xmm0, %xmm01284; AVX512CD-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1285; AVX512CD-NEXT: vpand %xmm1, %xmm0, %xmm21286; AVX512CD-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1287; AVX512CD-NEXT: vpshufb %xmm2, %xmm3, %xmm21288; AVX512CD-NEXT: vpsrlw $4, %xmm0, %xmm01289; AVX512CD-NEXT: vpand %xmm1, %xmm0, %xmm01290; AVX512CD-NEXT: vpshufb %xmm0, %xmm3, %xmm01291; AVX512CD-NEXT: vpaddb %xmm2, %xmm0, %xmm01292; AVX512CD-NEXT: vpsllw $8, %xmm0, %xmm11293; AVX512CD-NEXT: vpaddb %xmm0, %xmm1, %xmm01294; AVX512CD-NEXT: vpsrlw $8, %xmm0, %xmm01295; AVX512CD-NEXT: retq1296;1297; AVX512VPOPCNTDQ-LABEL: testv8i16u:1298; AVX512VPOPCNTDQ: # %bb.0:1299; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11300; AVX512VPOPCNTDQ-NEXT: vpaddw %xmm1, %xmm0, %xmm11301; AVX512VPOPCNTDQ-NEXT: vpandn %xmm1, %xmm0, %xmm01302; 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],zero1303; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm01304; AVX512VPOPCNTDQ-NEXT: vpmovdw %zmm0, %ymm01305; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01306; AVX512VPOPCNTDQ-NEXT: vzeroupper1307; AVX512VPOPCNTDQ-NEXT: retq1308;1309; AVX512VPOPCNTDQVL-LABEL: testv8i16u:1310; AVX512VPOPCNTDQVL: # %bb.0:1311; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11312; AVX512VPOPCNTDQVL-NEXT: vpaddw %xmm1, %xmm0, %xmm11313; AVX512VPOPCNTDQVL-NEXT: vpandn %xmm1, %xmm0, %xmm01314; 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],zero1315; AVX512VPOPCNTDQVL-NEXT: vpopcntd %ymm0, %ymm01316; AVX512VPOPCNTDQVL-NEXT: vpmovdw %ymm0, %xmm01317; AVX512VPOPCNTDQVL-NEXT: vzeroupper1318; AVX512VPOPCNTDQVL-NEXT: retq1319;1320; BITALG_NOVLX-LABEL: testv8i16u:1321; BITALG_NOVLX: # %bb.0:1322; BITALG_NOVLX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11323; BITALG_NOVLX-NEXT: vpaddw %xmm1, %xmm0, %xmm11324; BITALG_NOVLX-NEXT: vpandn %xmm1, %xmm0, %xmm01325; BITALG_NOVLX-NEXT: vpopcntw %zmm0, %zmm01326; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01327; BITALG_NOVLX-NEXT: vzeroupper1328; BITALG_NOVLX-NEXT: retq1329;1330; BITALG-LABEL: testv8i16u:1331; BITALG: # %bb.0:1332; BITALG-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11333; BITALG-NEXT: vpaddw %xmm1, %xmm0, %xmm11334; BITALG-NEXT: vpandn %xmm1, %xmm0, %xmm01335; BITALG-NEXT: vpopcntw %xmm0, %xmm01336; BITALG-NEXT: retq1337;1338; X86-SSE-LABEL: testv8i16u:1339; X86-SSE: # %bb.0:1340; X86-SSE-NEXT: pcmpeqd %xmm1, %xmm11341; X86-SSE-NEXT: paddw %xmm0, %xmm11342; X86-SSE-NEXT: pandn %xmm1, %xmm01343; X86-SSE-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1344; X86-SSE-NEXT: movdqa %xmm0, %xmm21345; X86-SSE-NEXT: pand %xmm1, %xmm21346; X86-SSE-NEXT: movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1347; X86-SSE-NEXT: movdqa %xmm3, %xmm41348; X86-SSE-NEXT: pshufb %xmm2, %xmm41349; X86-SSE-NEXT: psrlw $4, %xmm01350; X86-SSE-NEXT: pand %xmm1, %xmm01351; X86-SSE-NEXT: pshufb %xmm0, %xmm31352; X86-SSE-NEXT: paddb %xmm4, %xmm31353; X86-SSE-NEXT: movdqa %xmm3, %xmm01354; X86-SSE-NEXT: psllw $8, %xmm01355; X86-SSE-NEXT: paddb %xmm3, %xmm01356; X86-SSE-NEXT: psrlw $8, %xmm01357; X86-SSE-NEXT: retl1358 %out = call <8 x i16> @llvm.cttz.v8i16(<8 x i16> %in, i1 -1)1359 ret <8 x i16> %out1360}1361 1362define <16 x i8> @testv16i8(<16 x i8> %in) nounwind {1363; SSE2-LABEL: testv16i8:1364; SSE2: # %bb.0:1365; SSE2-NEXT: pcmpeqd %xmm1, %xmm11366; SSE2-NEXT: paddb %xmm0, %xmm11367; SSE2-NEXT: pandn %xmm1, %xmm01368; SSE2-NEXT: movdqa %xmm0, %xmm11369; SSE2-NEXT: psrlw $1, %xmm11370; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11371; SSE2-NEXT: psubb %xmm1, %xmm01372; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]1373; SSE2-NEXT: movdqa %xmm0, %xmm21374; SSE2-NEXT: pand %xmm1, %xmm21375; SSE2-NEXT: psrlw $2, %xmm01376; SSE2-NEXT: pand %xmm1, %xmm01377; SSE2-NEXT: paddb %xmm2, %xmm01378; SSE2-NEXT: movdqa %xmm0, %xmm11379; SSE2-NEXT: psrlw $4, %xmm11380; SSE2-NEXT: paddb %xmm1, %xmm01381; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01382; SSE2-NEXT: retq1383;1384; SSE3-LABEL: testv16i8:1385; SSE3: # %bb.0:1386; SSE3-NEXT: pcmpeqd %xmm1, %xmm11387; SSE3-NEXT: paddb %xmm0, %xmm11388; SSE3-NEXT: pandn %xmm1, %xmm01389; SSE3-NEXT: movdqa %xmm0, %xmm11390; SSE3-NEXT: psrlw $1, %xmm11391; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11392; SSE3-NEXT: psubb %xmm1, %xmm01393; SSE3-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]1394; SSE3-NEXT: movdqa %xmm0, %xmm21395; SSE3-NEXT: pand %xmm1, %xmm21396; SSE3-NEXT: psrlw $2, %xmm01397; SSE3-NEXT: pand %xmm1, %xmm01398; SSE3-NEXT: paddb %xmm2, %xmm01399; SSE3-NEXT: movdqa %xmm0, %xmm11400; SSE3-NEXT: psrlw $4, %xmm11401; SSE3-NEXT: paddb %xmm1, %xmm01402; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01403; SSE3-NEXT: retq1404;1405; SSSE3-LABEL: testv16i8:1406; SSSE3: # %bb.0:1407; SSSE3-NEXT: pcmpeqd %xmm1, %xmm11408; SSSE3-NEXT: paddb %xmm0, %xmm11409; SSSE3-NEXT: pandn %xmm1, %xmm01410; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1411; SSSE3-NEXT: movdqa %xmm0, %xmm31412; SSSE3-NEXT: pand %xmm2, %xmm31413; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1414; SSSE3-NEXT: movdqa %xmm1, %xmm41415; SSSE3-NEXT: pshufb %xmm3, %xmm41416; SSSE3-NEXT: psrlw $4, %xmm01417; SSSE3-NEXT: pand %xmm2, %xmm01418; SSSE3-NEXT: pshufb %xmm0, %xmm11419; SSSE3-NEXT: paddb %xmm4, %xmm11420; SSSE3-NEXT: movdqa %xmm1, %xmm01421; SSSE3-NEXT: retq1422;1423; SSE41-LABEL: testv16i8:1424; SSE41: # %bb.0:1425; SSE41-NEXT: pcmpeqd %xmm1, %xmm11426; SSE41-NEXT: paddb %xmm0, %xmm11427; SSE41-NEXT: pandn %xmm1, %xmm01428; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1429; SSE41-NEXT: movdqa %xmm0, %xmm31430; SSE41-NEXT: pand %xmm2, %xmm31431; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1432; SSE41-NEXT: movdqa %xmm1, %xmm41433; SSE41-NEXT: pshufb %xmm3, %xmm41434; SSE41-NEXT: psrlw $4, %xmm01435; SSE41-NEXT: pand %xmm2, %xmm01436; SSE41-NEXT: pshufb %xmm0, %xmm11437; SSE41-NEXT: paddb %xmm4, %xmm11438; SSE41-NEXT: movdqa %xmm1, %xmm01439; SSE41-NEXT: retq1440;1441; AVX1-LABEL: testv16i8:1442; AVX1: # %bb.0:1443; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11444; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm11445; AVX1-NEXT: vpandn %xmm1, %xmm0, %xmm01446; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1447; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm21448; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1449; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm21450; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm01451; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm01452; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm01453; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm01454; AVX1-NEXT: retq1455;1456; AVX2-LABEL: testv16i8:1457; AVX2: # %bb.0:1458; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11459; AVX2-NEXT: vpaddb %xmm1, %xmm0, %xmm11460; AVX2-NEXT: vpandn %xmm1, %xmm0, %xmm01461; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1462; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm21463; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1464; AVX2-NEXT: vpshufb %xmm2, %xmm3, %xmm21465; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm01466; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm01467; AVX2-NEXT: vpshufb %xmm0, %xmm3, %xmm01468; AVX2-NEXT: vpaddb %xmm2, %xmm0, %xmm01469; AVX2-NEXT: retq1470;1471; AVX512CDVL-LABEL: testv16i8:1472; AVX512CDVL: # %bb.0:1473; AVX512CDVL-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11474; AVX512CDVL-NEXT: vpaddb %xmm1, %xmm0, %xmm11475; AVX512CDVL-NEXT: vpandn %xmm1, %xmm0, %xmm01476; AVX512CDVL-NEXT: vpbroadcastd {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1477; AVX512CDVL-NEXT: vpand %xmm1, %xmm0, %xmm21478; AVX512CDVL-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1479; AVX512CDVL-NEXT: vpshufb %xmm2, %xmm3, %xmm21480; AVX512CDVL-NEXT: vpsrlw $4, %xmm0, %xmm01481; AVX512CDVL-NEXT: vpand %xmm1, %xmm0, %xmm01482; AVX512CDVL-NEXT: vpshufb %xmm0, %xmm3, %xmm01483; AVX512CDVL-NEXT: vpaddb %xmm2, %xmm0, %xmm01484; AVX512CDVL-NEXT: retq1485;1486; AVX512CD-LABEL: testv16i8:1487; AVX512CD: # %bb.0:1488; AVX512CD-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11489; AVX512CD-NEXT: vpaddb %xmm1, %xmm0, %xmm11490; AVX512CD-NEXT: vpandn %xmm1, %xmm0, %xmm01491; AVX512CD-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1492; AVX512CD-NEXT: vpand %xmm1, %xmm0, %xmm21493; AVX512CD-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1494; AVX512CD-NEXT: vpshufb %xmm2, %xmm3, %xmm21495; AVX512CD-NEXT: vpsrlw $4, %xmm0, %xmm01496; AVX512CD-NEXT: vpand %xmm1, %xmm0, %xmm01497; AVX512CD-NEXT: vpshufb %xmm0, %xmm3, %xmm01498; AVX512CD-NEXT: vpaddb %xmm2, %xmm0, %xmm01499; AVX512CD-NEXT: retq1500;1501; AVX512VPOPCNTDQ-LABEL: testv16i8:1502; AVX512VPOPCNTDQ: # %bb.0:1503; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11504; AVX512VPOPCNTDQ-NEXT: vpaddb %xmm1, %xmm0, %xmm11505; AVX512VPOPCNTDQ-NEXT: vpandn %xmm1, %xmm0, %xmm01506; AVX512VPOPCNTDQ-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,zero1507; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm01508; AVX512VPOPCNTDQ-NEXT: vpmovdb %zmm0, %xmm01509; AVX512VPOPCNTDQ-NEXT: vzeroupper1510; AVX512VPOPCNTDQ-NEXT: retq1511;1512; AVX512VPOPCNTDQVL-LABEL: testv16i8:1513; AVX512VPOPCNTDQVL: # %bb.0:1514; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11515; AVX512VPOPCNTDQVL-NEXT: vpaddb %xmm1, %xmm0, %xmm11516; AVX512VPOPCNTDQVL-NEXT: vpandn %xmm1, %xmm0, %xmm01517; AVX512VPOPCNTDQVL-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,zero1518; AVX512VPOPCNTDQVL-NEXT: vpopcntd %zmm0, %zmm01519; AVX512VPOPCNTDQVL-NEXT: vpmovdb %zmm0, %xmm01520; AVX512VPOPCNTDQVL-NEXT: vzeroupper1521; AVX512VPOPCNTDQVL-NEXT: retq1522;1523; BITALG_NOVLX-LABEL: testv16i8:1524; BITALG_NOVLX: # %bb.0:1525; BITALG_NOVLX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11526; BITALG_NOVLX-NEXT: vpaddb %xmm1, %xmm0, %xmm11527; BITALG_NOVLX-NEXT: vpandn %xmm1, %xmm0, %xmm01528; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm01529; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01530; BITALG_NOVLX-NEXT: vzeroupper1531; BITALG_NOVLX-NEXT: retq1532;1533; BITALG-LABEL: testv16i8:1534; BITALG: # %bb.0:1535; BITALG-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11536; BITALG-NEXT: vpaddb %xmm1, %xmm0, %xmm11537; BITALG-NEXT: vpandn %xmm1, %xmm0, %xmm01538; BITALG-NEXT: vpopcntb %xmm0, %xmm01539; BITALG-NEXT: retq1540;1541; X86-SSE-LABEL: testv16i8:1542; X86-SSE: # %bb.0:1543; X86-SSE-NEXT: pcmpeqd %xmm1, %xmm11544; X86-SSE-NEXT: paddb %xmm0, %xmm11545; X86-SSE-NEXT: pandn %xmm1, %xmm01546; X86-SSE-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1547; X86-SSE-NEXT: movdqa %xmm0, %xmm31548; X86-SSE-NEXT: pand %xmm2, %xmm31549; X86-SSE-NEXT: movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1550; X86-SSE-NEXT: movdqa %xmm1, %xmm41551; X86-SSE-NEXT: pshufb %xmm3, %xmm41552; X86-SSE-NEXT: psrlw $4, %xmm01553; X86-SSE-NEXT: pand %xmm2, %xmm01554; X86-SSE-NEXT: pshufb %xmm0, %xmm11555; X86-SSE-NEXT: paddb %xmm4, %xmm11556; X86-SSE-NEXT: movdqa %xmm1, %xmm01557; X86-SSE-NEXT: retl1558 %out = call <16 x i8> @llvm.cttz.v16i8(<16 x i8> %in, i1 0)1559 ret <16 x i8> %out1560}1561 1562define <16 x i8> @testv16i8u(<16 x i8> %in) nounwind {1563; SSE2-LABEL: testv16i8u:1564; SSE2: # %bb.0:1565; SSE2-NEXT: pcmpeqd %xmm1, %xmm11566; SSE2-NEXT: paddb %xmm0, %xmm11567; SSE2-NEXT: pandn %xmm1, %xmm01568; SSE2-NEXT: movdqa %xmm0, %xmm11569; SSE2-NEXT: psrlw $1, %xmm11570; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11571; SSE2-NEXT: psubb %xmm1, %xmm01572; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]1573; SSE2-NEXT: movdqa %xmm0, %xmm21574; SSE2-NEXT: pand %xmm1, %xmm21575; SSE2-NEXT: psrlw $2, %xmm01576; SSE2-NEXT: pand %xmm1, %xmm01577; SSE2-NEXT: paddb %xmm2, %xmm01578; SSE2-NEXT: movdqa %xmm0, %xmm11579; SSE2-NEXT: psrlw $4, %xmm11580; SSE2-NEXT: paddb %xmm1, %xmm01581; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01582; SSE2-NEXT: retq1583;1584; SSE3-LABEL: testv16i8u:1585; SSE3: # %bb.0:1586; SSE3-NEXT: pcmpeqd %xmm1, %xmm11587; SSE3-NEXT: paddb %xmm0, %xmm11588; SSE3-NEXT: pandn %xmm1, %xmm01589; SSE3-NEXT: movdqa %xmm0, %xmm11590; SSE3-NEXT: psrlw $1, %xmm11591; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11592; SSE3-NEXT: psubb %xmm1, %xmm01593; SSE3-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]1594; SSE3-NEXT: movdqa %xmm0, %xmm21595; SSE3-NEXT: pand %xmm1, %xmm21596; SSE3-NEXT: psrlw $2, %xmm01597; SSE3-NEXT: pand %xmm1, %xmm01598; SSE3-NEXT: paddb %xmm2, %xmm01599; SSE3-NEXT: movdqa %xmm0, %xmm11600; SSE3-NEXT: psrlw $4, %xmm11601; SSE3-NEXT: paddb %xmm1, %xmm01602; SSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01603; SSE3-NEXT: retq1604;1605; SSSE3-LABEL: testv16i8u:1606; SSSE3: # %bb.0:1607; SSSE3-NEXT: pcmpeqd %xmm1, %xmm11608; SSSE3-NEXT: paddb %xmm0, %xmm11609; SSSE3-NEXT: pandn %xmm1, %xmm01610; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1611; SSSE3-NEXT: movdqa %xmm0, %xmm31612; SSSE3-NEXT: pand %xmm2, %xmm31613; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1614; SSSE3-NEXT: movdqa %xmm1, %xmm41615; SSSE3-NEXT: pshufb %xmm3, %xmm41616; SSSE3-NEXT: psrlw $4, %xmm01617; SSSE3-NEXT: pand %xmm2, %xmm01618; SSSE3-NEXT: pshufb %xmm0, %xmm11619; SSSE3-NEXT: paddb %xmm4, %xmm11620; SSSE3-NEXT: movdqa %xmm1, %xmm01621; SSSE3-NEXT: retq1622;1623; SSE41-LABEL: testv16i8u:1624; SSE41: # %bb.0:1625; SSE41-NEXT: pcmpeqd %xmm1, %xmm11626; SSE41-NEXT: paddb %xmm0, %xmm11627; SSE41-NEXT: pandn %xmm1, %xmm01628; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1629; SSE41-NEXT: movdqa %xmm0, %xmm31630; SSE41-NEXT: pand %xmm2, %xmm31631; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1632; SSE41-NEXT: movdqa %xmm1, %xmm41633; SSE41-NEXT: pshufb %xmm3, %xmm41634; SSE41-NEXT: psrlw $4, %xmm01635; SSE41-NEXT: pand %xmm2, %xmm01636; SSE41-NEXT: pshufb %xmm0, %xmm11637; SSE41-NEXT: paddb %xmm4, %xmm11638; SSE41-NEXT: movdqa %xmm1, %xmm01639; SSE41-NEXT: retq1640;1641; AVX1-LABEL: testv16i8u:1642; AVX1: # %bb.0:1643; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11644; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm11645; AVX1-NEXT: vpandn %xmm1, %xmm0, %xmm01646; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1647; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm21648; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1649; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm21650; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm01651; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm01652; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm01653; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm01654; AVX1-NEXT: retq1655;1656; AVX2-LABEL: testv16i8u:1657; AVX2: # %bb.0:1658; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11659; AVX2-NEXT: vpaddb %xmm1, %xmm0, %xmm11660; AVX2-NEXT: vpandn %xmm1, %xmm0, %xmm01661; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1662; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm21663; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1664; AVX2-NEXT: vpshufb %xmm2, %xmm3, %xmm21665; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm01666; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm01667; AVX2-NEXT: vpshufb %xmm0, %xmm3, %xmm01668; AVX2-NEXT: vpaddb %xmm2, %xmm0, %xmm01669; AVX2-NEXT: retq1670;1671; AVX512CDVL-LABEL: testv16i8u:1672; AVX512CDVL: # %bb.0:1673; AVX512CDVL-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11674; AVX512CDVL-NEXT: vpaddb %xmm1, %xmm0, %xmm11675; AVX512CDVL-NEXT: vpandn %xmm1, %xmm0, %xmm01676; AVX512CDVL-NEXT: vpbroadcastd {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1677; AVX512CDVL-NEXT: vpand %xmm1, %xmm0, %xmm21678; AVX512CDVL-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1679; AVX512CDVL-NEXT: vpshufb %xmm2, %xmm3, %xmm21680; AVX512CDVL-NEXT: vpsrlw $4, %xmm0, %xmm01681; AVX512CDVL-NEXT: vpand %xmm1, %xmm0, %xmm01682; AVX512CDVL-NEXT: vpshufb %xmm0, %xmm3, %xmm01683; AVX512CDVL-NEXT: vpaddb %xmm2, %xmm0, %xmm01684; AVX512CDVL-NEXT: retq1685;1686; AVX512CD-LABEL: testv16i8u:1687; AVX512CD: # %bb.0:1688; AVX512CD-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11689; AVX512CD-NEXT: vpaddb %xmm1, %xmm0, %xmm11690; AVX512CD-NEXT: vpandn %xmm1, %xmm0, %xmm01691; AVX512CD-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1692; AVX512CD-NEXT: vpand %xmm1, %xmm0, %xmm21693; AVX512CD-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1694; AVX512CD-NEXT: vpshufb %xmm2, %xmm3, %xmm21695; AVX512CD-NEXT: vpsrlw $4, %xmm0, %xmm01696; AVX512CD-NEXT: vpand %xmm1, %xmm0, %xmm01697; AVX512CD-NEXT: vpshufb %xmm0, %xmm3, %xmm01698; AVX512CD-NEXT: vpaddb %xmm2, %xmm0, %xmm01699; AVX512CD-NEXT: retq1700;1701; AVX512VPOPCNTDQ-LABEL: testv16i8u:1702; AVX512VPOPCNTDQ: # %bb.0:1703; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11704; AVX512VPOPCNTDQ-NEXT: vpaddb %xmm1, %xmm0, %xmm11705; AVX512VPOPCNTDQ-NEXT: vpandn %xmm1, %xmm0, %xmm01706; AVX512VPOPCNTDQ-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,zero1707; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm01708; AVX512VPOPCNTDQ-NEXT: vpmovdb %zmm0, %xmm01709; AVX512VPOPCNTDQ-NEXT: vzeroupper1710; AVX512VPOPCNTDQ-NEXT: retq1711;1712; AVX512VPOPCNTDQVL-LABEL: testv16i8u:1713; AVX512VPOPCNTDQVL: # %bb.0:1714; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11715; AVX512VPOPCNTDQVL-NEXT: vpaddb %xmm1, %xmm0, %xmm11716; AVX512VPOPCNTDQVL-NEXT: vpandn %xmm1, %xmm0, %xmm01717; AVX512VPOPCNTDQVL-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,zero1718; AVX512VPOPCNTDQVL-NEXT: vpopcntd %zmm0, %zmm01719; AVX512VPOPCNTDQVL-NEXT: vpmovdb %zmm0, %xmm01720; AVX512VPOPCNTDQVL-NEXT: vzeroupper1721; AVX512VPOPCNTDQVL-NEXT: retq1722;1723; BITALG_NOVLX-LABEL: testv16i8u:1724; BITALG_NOVLX: # %bb.0:1725; BITALG_NOVLX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11726; BITALG_NOVLX-NEXT: vpaddb %xmm1, %xmm0, %xmm11727; BITALG_NOVLX-NEXT: vpandn %xmm1, %xmm0, %xmm01728; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm01729; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01730; BITALG_NOVLX-NEXT: vzeroupper1731; BITALG_NOVLX-NEXT: retq1732;1733; BITALG-LABEL: testv16i8u:1734; BITALG: # %bb.0:1735; BITALG-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11736; BITALG-NEXT: vpaddb %xmm1, %xmm0, %xmm11737; BITALG-NEXT: vpandn %xmm1, %xmm0, %xmm01738; BITALG-NEXT: vpopcntb %xmm0, %xmm01739; BITALG-NEXT: retq1740;1741; X86-SSE-LABEL: testv16i8u:1742; X86-SSE: # %bb.0:1743; X86-SSE-NEXT: pcmpeqd %xmm1, %xmm11744; X86-SSE-NEXT: paddb %xmm0, %xmm11745; X86-SSE-NEXT: pandn %xmm1, %xmm01746; X86-SSE-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1747; X86-SSE-NEXT: movdqa %xmm0, %xmm31748; X86-SSE-NEXT: pand %xmm2, %xmm31749; X86-SSE-NEXT: movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1750; X86-SSE-NEXT: movdqa %xmm1, %xmm41751; X86-SSE-NEXT: pshufb %xmm3, %xmm41752; X86-SSE-NEXT: psrlw $4, %xmm01753; X86-SSE-NEXT: pand %xmm2, %xmm01754; X86-SSE-NEXT: pshufb %xmm0, %xmm11755; X86-SSE-NEXT: paddb %xmm4, %xmm11756; X86-SSE-NEXT: movdqa %xmm1, %xmm01757; X86-SSE-NEXT: retl1758 %out = call <16 x i8> @llvm.cttz.v16i8(<16 x i8> %in, i1 -1)1759 ret <16 x i8> %out1760}1761 1762define <2 x i64> @foldv2i64() nounwind {1763; SSE-LABEL: foldv2i64:1764; SSE: # %bb.0:1765; SSE-NEXT: movss {{.*#+}} xmm0 = [8,0,0,0]1766; SSE-NEXT: retq1767;1768; AVX1-LABEL: foldv2i64:1769; AVX1: # %bb.0:1770; AVX1-NEXT: vmovss {{.*#+}} xmm0 = [8,0,0,0]1771; AVX1-NEXT: retq1772;1773; AVX2-LABEL: foldv2i64:1774; AVX2: # %bb.0:1775; AVX2-NEXT: vmovss {{.*#+}} xmm0 = [8,0,0,0]1776; AVX2-NEXT: retq1777;1778; AVX512CDVL-LABEL: foldv2i64:1779; AVX512CDVL: # %bb.0:1780; AVX512CDVL-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,0]1781; AVX512CDVL-NEXT: retq1782;1783; AVX512CD-LABEL: foldv2i64:1784; AVX512CD: # %bb.0:1785; AVX512CD-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,0]1786; AVX512CD-NEXT: retq1787;1788; AVX512VPOPCNTDQ-LABEL: foldv2i64:1789; AVX512VPOPCNTDQ: # %bb.0:1790; AVX512VPOPCNTDQ-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,0]1791; AVX512VPOPCNTDQ-NEXT: retq1792;1793; AVX512VPOPCNTDQVL-LABEL: foldv2i64:1794; AVX512VPOPCNTDQVL: # %bb.0:1795; AVX512VPOPCNTDQVL-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,0]1796; AVX512VPOPCNTDQVL-NEXT: retq1797;1798; BITALG_NOVLX-LABEL: foldv2i64:1799; BITALG_NOVLX: # %bb.0:1800; BITALG_NOVLX-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,0]1801; BITALG_NOVLX-NEXT: retq1802;1803; BITALG-LABEL: foldv2i64:1804; BITALG: # %bb.0:1805; BITALG-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,0]1806; BITALG-NEXT: retq1807;1808; X86-SSE-LABEL: foldv2i64:1809; X86-SSE: # %bb.0:1810; X86-SSE-NEXT: movss {{.*#+}} xmm0 = [8,0,0,0]1811; X86-SSE-NEXT: retl1812 %out = call <2 x i64> @llvm.cttz.v2i64(<2 x i64> <i64 256, i64 -1>, i1 0)1813 ret <2 x i64> %out1814}1815 1816define <2 x i64> @foldv2i64u() nounwind {1817; SSE-LABEL: foldv2i64u:1818; SSE: # %bb.0:1819; SSE-NEXT: movss {{.*#+}} xmm0 = [8,0,0,0]1820; SSE-NEXT: retq1821;1822; AVX1-LABEL: foldv2i64u:1823; AVX1: # %bb.0:1824; AVX1-NEXT: vmovss {{.*#+}} xmm0 = [8,0,0,0]1825; AVX1-NEXT: retq1826;1827; AVX2-LABEL: foldv2i64u:1828; AVX2: # %bb.0:1829; AVX2-NEXT: vmovss {{.*#+}} xmm0 = [8,0,0,0]1830; AVX2-NEXT: retq1831;1832; AVX512CDVL-LABEL: foldv2i64u:1833; AVX512CDVL: # %bb.0:1834; AVX512CDVL-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,0]1835; AVX512CDVL-NEXT: retq1836;1837; AVX512CD-LABEL: foldv2i64u:1838; AVX512CD: # %bb.0:1839; AVX512CD-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,0]1840; AVX512CD-NEXT: retq1841;1842; AVX512VPOPCNTDQ-LABEL: foldv2i64u:1843; AVX512VPOPCNTDQ: # %bb.0:1844; AVX512VPOPCNTDQ-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,0]1845; AVX512VPOPCNTDQ-NEXT: retq1846;1847; AVX512VPOPCNTDQVL-LABEL: foldv2i64u:1848; AVX512VPOPCNTDQVL: # %bb.0:1849; AVX512VPOPCNTDQVL-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,0]1850; AVX512VPOPCNTDQVL-NEXT: retq1851;1852; BITALG_NOVLX-LABEL: foldv2i64u:1853; BITALG_NOVLX: # %bb.0:1854; BITALG_NOVLX-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,0]1855; BITALG_NOVLX-NEXT: retq1856;1857; BITALG-LABEL: foldv2i64u:1858; BITALG: # %bb.0:1859; BITALG-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,0]1860; BITALG-NEXT: retq1861;1862; X86-SSE-LABEL: foldv2i64u:1863; X86-SSE: # %bb.0:1864; X86-SSE-NEXT: movss {{.*#+}} xmm0 = [8,0,0,0]1865; X86-SSE-NEXT: retl1866 %out = call <2 x i64> @llvm.cttz.v2i64(<2 x i64> <i64 256, i64 -1>, i1 -1)1867 ret <2 x i64> %out1868}1869 1870define <4 x i32> @foldv4i32() nounwind {1871; SSE-LABEL: foldv4i32:1872; SSE: # %bb.0:1873; SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,32,0]1874; SSE-NEXT: retq1875;1876; AVX1-LABEL: foldv4i32:1877; AVX1: # %bb.0:1878; AVX1-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,32,0]1879; AVX1-NEXT: retq1880;1881; AVX2-LABEL: foldv4i32:1882; AVX2: # %bb.0:1883; AVX2-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,32,0]1884; AVX2-NEXT: retq1885;1886; AVX512CDVL-LABEL: foldv4i32:1887; AVX512CDVL: # %bb.0:1888; AVX512CDVL-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,32]1889; AVX512CDVL-NEXT: retq1890;1891; AVX512CD-LABEL: foldv4i32:1892; AVX512CD: # %bb.0:1893; AVX512CD-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,32]1894; AVX512CD-NEXT: retq1895;1896; AVX512VPOPCNTDQ-LABEL: foldv4i32:1897; AVX512VPOPCNTDQ: # %bb.0:1898; AVX512VPOPCNTDQ-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,32]1899; AVX512VPOPCNTDQ-NEXT: retq1900;1901; AVX512VPOPCNTDQVL-LABEL: foldv4i32:1902; AVX512VPOPCNTDQVL: # %bb.0:1903; AVX512VPOPCNTDQVL-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,32]1904; AVX512VPOPCNTDQVL-NEXT: retq1905;1906; BITALG_NOVLX-LABEL: foldv4i32:1907; BITALG_NOVLX: # %bb.0:1908; BITALG_NOVLX-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,32]1909; BITALG_NOVLX-NEXT: retq1910;1911; BITALG-LABEL: foldv4i32:1912; BITALG: # %bb.0:1913; BITALG-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,32]1914; BITALG-NEXT: retq1915;1916; X86-SSE-LABEL: foldv4i32:1917; X86-SSE: # %bb.0:1918; X86-SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,32,0]1919; X86-SSE-NEXT: retl1920 %out = call <4 x i32> @llvm.cttz.v4i32(<4 x i32> <i32 256, i32 -1, i32 0, i32 255>, i1 0)1921 ret <4 x i32> %out1922}1923 1924define <4 x i32> @foldv4i32u() nounwind {1925; SSE-LABEL: foldv4i32u:1926; SSE: # %bb.0:1927; SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,32,0]1928; SSE-NEXT: retq1929;1930; AVX1-LABEL: foldv4i32u:1931; AVX1: # %bb.0:1932; AVX1-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,32,0]1933; AVX1-NEXT: retq1934;1935; AVX2-LABEL: foldv4i32u:1936; AVX2: # %bb.0:1937; AVX2-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,32,0]1938; AVX2-NEXT: retq1939;1940; AVX512CDVL-LABEL: foldv4i32u:1941; AVX512CDVL: # %bb.0:1942; AVX512CDVL-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,32]1943; AVX512CDVL-NEXT: retq1944;1945; AVX512CD-LABEL: foldv4i32u:1946; AVX512CD: # %bb.0:1947; AVX512CD-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,32]1948; AVX512CD-NEXT: retq1949;1950; AVX512VPOPCNTDQ-LABEL: foldv4i32u:1951; AVX512VPOPCNTDQ: # %bb.0:1952; AVX512VPOPCNTDQ-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,32]1953; AVX512VPOPCNTDQ-NEXT: retq1954;1955; AVX512VPOPCNTDQVL-LABEL: foldv4i32u:1956; AVX512VPOPCNTDQVL: # %bb.0:1957; AVX512VPOPCNTDQVL-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,32]1958; AVX512VPOPCNTDQVL-NEXT: retq1959;1960; BITALG_NOVLX-LABEL: foldv4i32u:1961; BITALG_NOVLX: # %bb.0:1962; BITALG_NOVLX-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,32]1963; BITALG_NOVLX-NEXT: retq1964;1965; BITALG-LABEL: foldv4i32u:1966; BITALG: # %bb.0:1967; BITALG-NEXT: vpmovsxbq {{.*#+}} xmm0 = [8,32]1968; BITALG-NEXT: retq1969;1970; X86-SSE-LABEL: foldv4i32u:1971; X86-SSE: # %bb.0:1972; X86-SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,32,0]1973; X86-SSE-NEXT: retl1974 %out = call <4 x i32> @llvm.cttz.v4i32(<4 x i32> <i32 256, i32 -1, i32 0, i32 255>, i1 -1)1975 ret <4 x i32> %out1976}1977 1978define <8 x i16> @foldv8i16() nounwind {1979; SSE-LABEL: foldv8i16:1980; SSE: # %bb.0:1981; SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,16,0,16,0,3,3]1982; SSE-NEXT: retq1983;1984; AVX-LABEL: foldv8i16:1985; AVX: # %bb.0:1986; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,16,0,16,0,3,3]1987; AVX-NEXT: retq1988;1989; AVX512VPOPCNTDQ-LABEL: foldv8i16:1990; AVX512VPOPCNTDQ: # %bb.0:1991; AVX512VPOPCNTDQ-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,16,0,16,0,3,3]1992; AVX512VPOPCNTDQ-NEXT: retq1993;1994; AVX512VPOPCNTDQVL-LABEL: foldv8i16:1995; AVX512VPOPCNTDQVL: # %bb.0:1996; AVX512VPOPCNTDQVL-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,16,0,16,0,3,3]1997; AVX512VPOPCNTDQVL-NEXT: retq1998;1999; BITALG_NOVLX-LABEL: foldv8i16:2000; BITALG_NOVLX: # %bb.0:2001; BITALG_NOVLX-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,16,0,16,0,3,3]2002; BITALG_NOVLX-NEXT: retq2003;2004; BITALG-LABEL: foldv8i16:2005; BITALG: # %bb.0:2006; BITALG-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,16,0,16,0,3,3]2007; BITALG-NEXT: retq2008;2009; X86-SSE-LABEL: foldv8i16:2010; X86-SSE: # %bb.0:2011; X86-SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,16,0,16,0,3,3]2012; X86-SSE-NEXT: retl2013 %out = call <8 x i16> @llvm.cttz.v8i16(<8 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88>, i1 0)2014 ret <8 x i16> %out2015}2016 2017define <8 x i16> @foldv8i16u() nounwind {2018; SSE-LABEL: foldv8i16u:2019; SSE: # %bb.0:2020; SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,16,0,16,0,3,3]2021; SSE-NEXT: retq2022;2023; AVX-LABEL: foldv8i16u:2024; AVX: # %bb.0:2025; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,16,0,16,0,3,3]2026; AVX-NEXT: retq2027;2028; AVX512VPOPCNTDQ-LABEL: foldv8i16u:2029; AVX512VPOPCNTDQ: # %bb.0:2030; AVX512VPOPCNTDQ-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,16,0,16,0,3,3]2031; AVX512VPOPCNTDQ-NEXT: retq2032;2033; AVX512VPOPCNTDQVL-LABEL: foldv8i16u:2034; AVX512VPOPCNTDQVL: # %bb.0:2035; AVX512VPOPCNTDQVL-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,16,0,16,0,3,3]2036; AVX512VPOPCNTDQVL-NEXT: retq2037;2038; BITALG_NOVLX-LABEL: foldv8i16u:2039; BITALG_NOVLX: # %bb.0:2040; BITALG_NOVLX-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,16,0,16,0,3,3]2041; BITALG_NOVLX-NEXT: retq2042;2043; BITALG-LABEL: foldv8i16u:2044; BITALG: # %bb.0:2045; BITALG-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,16,0,16,0,3,3]2046; BITALG-NEXT: retq2047;2048; X86-SSE-LABEL: foldv8i16u:2049; X86-SSE: # %bb.0:2050; X86-SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,16,0,16,0,3,3]2051; X86-SSE-NEXT: retl2052 %out = call <8 x i16> @llvm.cttz.v8i16(<8 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88>, i1 -1)2053 ret <8 x i16> %out2054}2055 2056define <16 x i8> @foldv16i8() nounwind {2057; SSE-LABEL: foldv16i8:2058; SSE: # %bb.0:2059; SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5]2060; SSE-NEXT: retq2061;2062; AVX-LABEL: foldv16i8:2063; AVX: # %bb.0:2064; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5]2065; AVX-NEXT: retq2066;2067; AVX512VPOPCNTDQ-LABEL: foldv16i8:2068; AVX512VPOPCNTDQ: # %bb.0:2069; AVX512VPOPCNTDQ-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5]2070; AVX512VPOPCNTDQ-NEXT: retq2071;2072; AVX512VPOPCNTDQVL-LABEL: foldv16i8:2073; AVX512VPOPCNTDQVL: # %bb.0:2074; AVX512VPOPCNTDQVL-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5]2075; AVX512VPOPCNTDQVL-NEXT: retq2076;2077; BITALG_NOVLX-LABEL: foldv16i8:2078; BITALG_NOVLX: # %bb.0:2079; BITALG_NOVLX-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5]2080; BITALG_NOVLX-NEXT: retq2081;2082; BITALG-LABEL: foldv16i8:2083; BITALG: # %bb.0:2084; BITALG-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5]2085; BITALG-NEXT: retq2086;2087; X86-SSE-LABEL: foldv16i8:2088; X86-SSE: # %bb.0:2089; X86-SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5]2090; X86-SSE-NEXT: retl2091 %out = call <16 x i8> @llvm.cttz.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>, i1 0)2092 ret <16 x i8> %out2093}2094 2095define <16 x i8> @foldv16i8u() nounwind {2096; SSE-LABEL: foldv16i8u:2097; SSE: # %bb.0:2098; SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5]2099; SSE-NEXT: retq2100;2101; AVX-LABEL: foldv16i8u:2102; AVX: # %bb.0:2103; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5]2104; AVX-NEXT: retq2105;2106; AVX512VPOPCNTDQ-LABEL: foldv16i8u:2107; AVX512VPOPCNTDQ: # %bb.0:2108; AVX512VPOPCNTDQ-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5]2109; AVX512VPOPCNTDQ-NEXT: retq2110;2111; AVX512VPOPCNTDQVL-LABEL: foldv16i8u:2112; AVX512VPOPCNTDQVL: # %bb.0:2113; AVX512VPOPCNTDQVL-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5]2114; AVX512VPOPCNTDQVL-NEXT: retq2115;2116; BITALG_NOVLX-LABEL: foldv16i8u:2117; BITALG_NOVLX: # %bb.0:2118; BITALG_NOVLX-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5]2119; BITALG_NOVLX-NEXT: retq2120;2121; BITALG-LABEL: foldv16i8u:2122; BITALG: # %bb.0:2123; BITALG-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5]2124; BITALG-NEXT: retq2125;2126; X86-SSE-LABEL: foldv16i8u:2127; X86-SSE: # %bb.0:2128; X86-SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5]2129; X86-SSE-NEXT: retl2130 %out = call <16 x i8> @llvm.cttz.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>, i1 -1)2131 ret <16 x i8> %out2132}2133 2134declare <2 x i64> @llvm.cttz.v2i64(<2 x i64>, i1)2135declare <4 x i32> @llvm.cttz.v4i32(<4 x i32>, i1)2136declare <8 x i16> @llvm.cttz.v8i16(<8 x i16>, i1)2137declare <16 x i8> @llvm.cttz.v16i8(<16 x i8>, i1)2138