brintos

brintos / llvm-project-archived public Read only

0
0
Text · 60.7 KiB · 3c35f7b Raw
1380 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=ALL,AVX,AVX13; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=ALL,AVX,AVX24; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512cd,+avx512vl | FileCheck %s --check-prefixes=ALL,AVX,AVX512CDVL5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512cd,-avx512vl | FileCheck %s --check-prefixes=ALL,AVX,AVX512CD6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vpopcntdq | FileCheck %s --check-prefixes=ALL,AVX,AVX512VPOPCNTDQ7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vpopcntdq,+avx512vl | FileCheck %s --check-prefixes=ALL,AVX,AVX512VPOPCNTDQVL8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bitalg | FileCheck %s --check-prefixes=ALL,BITALG_NOVLX9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bitalg,+avx512vl | FileCheck %s --check-prefixes=ALL,BITALG10;11; Just one 32-bit run to make sure we do reasonable things for i64 tzcnt.12; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=ALL,X86-AVX13 14define <4 x i64> @testv4i64(<4 x i64> %in) nounwind {15; AVX1-LABEL: testv4i64:16; AVX1:       # %bb.0:17; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm118; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm219; AVX1-NEXT:    vpaddq %xmm2, %xmm1, %xmm320; AVX1-NEXT:    vpandn %xmm3, %xmm1, %xmm121; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]22; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm423; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]24; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm425; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm126; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm127; AVX1-NEXT:    vpshufb %xmm1, %xmm5, %xmm128; AVX1-NEXT:    vpaddb %xmm4, %xmm1, %xmm129; AVX1-NEXT:    vpxor %xmm4, %xmm4, %xmm430; AVX1-NEXT:    vpsadbw %xmm4, %xmm1, %xmm131; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm232; AVX1-NEXT:    vpandn %xmm2, %xmm0, %xmm033; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm234; AVX1-NEXT:    vpshufb %xmm2, %xmm5, %xmm235; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm036; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm037; AVX1-NEXT:    vpshufb %xmm0, %xmm5, %xmm038; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm039; AVX1-NEXT:    vpsadbw %xmm4, %xmm0, %xmm040; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm041; AVX1-NEXT:    retq42;43; AVX2-LABEL: testv4i64:44; AVX2:       # %bb.0:45; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm146; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm147; AVX2-NEXT:    vpandn %ymm1, %ymm0, %ymm048; AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]49; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm250; AVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]51; AVX2-NEXT:    # ymm3 = mem[0,1,0,1]52; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm253; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm054; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm055; AVX2-NEXT:    vpshufb %ymm0, %ymm3, %ymm056; AVX2-NEXT:    vpaddb %ymm2, %ymm0, %ymm057; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm158; AVX2-NEXT:    vpsadbw %ymm1, %ymm0, %ymm059; AVX2-NEXT:    retq60;61; AVX512CDVL-LABEL: testv4i64:62; AVX512CDVL:       # %bb.0:63; AVX512CDVL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm164; AVX512CDVL-NEXT:    vpaddq %ymm1, %ymm0, %ymm165; AVX512CDVL-NEXT:    vpandn %ymm1, %ymm0, %ymm066; AVX512CDVL-NEXT:    vplzcntq %ymm0, %ymm067; AVX512CDVL-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [64,64,64,64]68; AVX512CDVL-NEXT:    vpsubq %ymm0, %ymm1, %ymm069; AVX512CDVL-NEXT:    retq70;71; AVX512CD-LABEL: testv4i64:72; AVX512CD:       # %bb.0:73; AVX512CD-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm174; AVX512CD-NEXT:    vpaddq %ymm1, %ymm0, %ymm175; AVX512CD-NEXT:    vpandn %ymm1, %ymm0, %ymm076; AVX512CD-NEXT:    vplzcntq %zmm0, %zmm077; AVX512CD-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [64,64,64,64]78; AVX512CD-NEXT:    vpsubq %ymm0, %ymm1, %ymm079; AVX512CD-NEXT:    retq80;81; AVX512VPOPCNTDQ-LABEL: testv4i64:82; AVX512VPOPCNTDQ:       # %bb.0:83; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm184; AVX512VPOPCNTDQ-NEXT:    vpaddq %ymm1, %ymm0, %ymm185; AVX512VPOPCNTDQ-NEXT:    vpandn %ymm1, %ymm0, %ymm086; AVX512VPOPCNTDQ-NEXT:    vpopcntq %zmm0, %zmm087; AVX512VPOPCNTDQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm088; AVX512VPOPCNTDQ-NEXT:    retq89;90; AVX512VPOPCNTDQVL-LABEL: testv4i64:91; AVX512VPOPCNTDQVL:       # %bb.0:92; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm193; AVX512VPOPCNTDQVL-NEXT:    vpaddq %ymm1, %ymm0, %ymm194; AVX512VPOPCNTDQVL-NEXT:    vpandn %ymm1, %ymm0, %ymm095; AVX512VPOPCNTDQVL-NEXT:    vpopcntq %ymm0, %ymm096; AVX512VPOPCNTDQVL-NEXT:    retq97;98; BITALG_NOVLX-LABEL: testv4i64:99; BITALG_NOVLX:       # %bb.0:100; BITALG_NOVLX-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1101; BITALG_NOVLX-NEXT:    vpaddq %ymm1, %ymm0, %ymm1102; BITALG_NOVLX-NEXT:    vpandn %ymm1, %ymm0, %ymm0103; BITALG_NOVLX-NEXT:    vpopcntb %zmm0, %zmm0104; BITALG_NOVLX-NEXT:    vpxor %xmm1, %xmm1, %xmm1105; BITALG_NOVLX-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0106; BITALG_NOVLX-NEXT:    retq107;108; BITALG-LABEL: testv4i64:109; BITALG:       # %bb.0:110; BITALG-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1111; BITALG-NEXT:    vpaddq %ymm1, %ymm0, %ymm1112; BITALG-NEXT:    vpandn %ymm1, %ymm0, %ymm0113; BITALG-NEXT:    vpopcntb %ymm0, %ymm0114; BITALG-NEXT:    vpxor %xmm1, %xmm1, %xmm1115; BITALG-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0116; BITALG-NEXT:    retq117;118; X86-AVX-LABEL: testv4i64:119; X86-AVX:       # %bb.0:120; X86-AVX-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1121; X86-AVX-NEXT:    vpaddq %ymm1, %ymm0, %ymm1122; X86-AVX-NEXT:    vpandn %ymm1, %ymm0, %ymm0123; X86-AVX-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]124; X86-AVX-NEXT:    vpand %ymm1, %ymm0, %ymm2125; X86-AVX-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]126; X86-AVX-NEXT:    # ymm3 = mem[0,1,0,1]127; X86-AVX-NEXT:    vpshufb %ymm2, %ymm3, %ymm2128; X86-AVX-NEXT:    vpsrlw $4, %ymm0, %ymm0129; X86-AVX-NEXT:    vpand %ymm1, %ymm0, %ymm0130; X86-AVX-NEXT:    vpshufb %ymm0, %ymm3, %ymm0131; X86-AVX-NEXT:    vpaddb %ymm2, %ymm0, %ymm0132; X86-AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1133; X86-AVX-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0134; X86-AVX-NEXT:    retl135  %out = call <4 x i64> @llvm.cttz.v4i64(<4 x i64> %in, i1 0)136  ret <4 x i64> %out137}138 139define <4 x i64> @testv4i64u(<4 x i64> %in) nounwind {140; AVX1-LABEL: testv4i64u:141; AVX1:       # %bb.0:142; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1143; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2144; AVX1-NEXT:    vpaddq %xmm2, %xmm1, %xmm3145; AVX1-NEXT:    vpandn %xmm3, %xmm1, %xmm1146; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]147; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm4148; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]149; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm4150; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1151; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1152; AVX1-NEXT:    vpshufb %xmm1, %xmm5, %xmm1153; AVX1-NEXT:    vpaddb %xmm4, %xmm1, %xmm1154; AVX1-NEXT:    vpxor %xmm4, %xmm4, %xmm4155; AVX1-NEXT:    vpsadbw %xmm4, %xmm1, %xmm1156; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm2157; AVX1-NEXT:    vpandn %xmm2, %xmm0, %xmm0158; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm2159; AVX1-NEXT:    vpshufb %xmm2, %xmm5, %xmm2160; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0161; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0162; AVX1-NEXT:    vpshufb %xmm0, %xmm5, %xmm0163; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm0164; AVX1-NEXT:    vpsadbw %xmm4, %xmm0, %xmm0165; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0166; AVX1-NEXT:    retq167;168; AVX2-LABEL: testv4i64u:169; AVX2:       # %bb.0:170; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1171; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm1172; AVX2-NEXT:    vpandn %ymm1, %ymm0, %ymm0173; AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]174; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2175; AVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]176; AVX2-NEXT:    # ymm3 = mem[0,1,0,1]177; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2178; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0179; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0180; AVX2-NEXT:    vpshufb %ymm0, %ymm3, %ymm0181; AVX2-NEXT:    vpaddb %ymm2, %ymm0, %ymm0182; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1183; AVX2-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0184; AVX2-NEXT:    retq185;186; AVX512CDVL-LABEL: testv4i64u:187; AVX512CDVL:       # %bb.0:188; AVX512CDVL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1189; AVX512CDVL-NEXT:    vpaddq %ymm1, %ymm0, %ymm1190; AVX512CDVL-NEXT:    vpandn %ymm1, %ymm0, %ymm0191; AVX512CDVL-NEXT:    vplzcntq %ymm0, %ymm0192; AVX512CDVL-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [64,64,64,64]193; AVX512CDVL-NEXT:    vpsubq %ymm0, %ymm1, %ymm0194; AVX512CDVL-NEXT:    retq195;196; AVX512CD-LABEL: testv4i64u:197; AVX512CD:       # %bb.0:198; AVX512CD-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1199; AVX512CD-NEXT:    vpaddq %ymm1, %ymm0, %ymm1200; AVX512CD-NEXT:    vpandn %ymm1, %ymm0, %ymm0201; AVX512CD-NEXT:    vplzcntq %zmm0, %zmm0202; AVX512CD-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [64,64,64,64]203; AVX512CD-NEXT:    vpsubq %ymm0, %ymm1, %ymm0204; AVX512CD-NEXT:    retq205;206; AVX512VPOPCNTDQ-LABEL: testv4i64u:207; AVX512VPOPCNTDQ:       # %bb.0:208; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1209; AVX512VPOPCNTDQ-NEXT:    vpaddq %ymm1, %ymm0, %ymm1210; AVX512VPOPCNTDQ-NEXT:    vpandn %ymm1, %ymm0, %ymm0211; AVX512VPOPCNTDQ-NEXT:    vpopcntq %zmm0, %zmm0212; AVX512VPOPCNTDQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0213; AVX512VPOPCNTDQ-NEXT:    retq214;215; AVX512VPOPCNTDQVL-LABEL: testv4i64u:216; AVX512VPOPCNTDQVL:       # %bb.0:217; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1218; AVX512VPOPCNTDQVL-NEXT:    vpaddq %ymm1, %ymm0, %ymm1219; AVX512VPOPCNTDQVL-NEXT:    vpandn %ymm1, %ymm0, %ymm0220; AVX512VPOPCNTDQVL-NEXT:    vpopcntq %ymm0, %ymm0221; AVX512VPOPCNTDQVL-NEXT:    retq222;223; BITALG_NOVLX-LABEL: testv4i64u:224; BITALG_NOVLX:       # %bb.0:225; BITALG_NOVLX-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1226; BITALG_NOVLX-NEXT:    vpaddq %ymm1, %ymm0, %ymm1227; BITALG_NOVLX-NEXT:    vpandn %ymm1, %ymm0, %ymm0228; BITALG_NOVLX-NEXT:    vpopcntb %zmm0, %zmm0229; BITALG_NOVLX-NEXT:    vpxor %xmm1, %xmm1, %xmm1230; BITALG_NOVLX-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0231; BITALG_NOVLX-NEXT:    retq232;233; BITALG-LABEL: testv4i64u:234; BITALG:       # %bb.0:235; BITALG-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1236; BITALG-NEXT:    vpaddq %ymm1, %ymm0, %ymm1237; BITALG-NEXT:    vpandn %ymm1, %ymm0, %ymm0238; BITALG-NEXT:    vpopcntb %ymm0, %ymm0239; BITALG-NEXT:    vpxor %xmm1, %xmm1, %xmm1240; BITALG-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0241; BITALG-NEXT:    retq242;243; X86-AVX-LABEL: testv4i64u:244; X86-AVX:       # %bb.0:245; X86-AVX-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1246; X86-AVX-NEXT:    vpaddq %ymm1, %ymm0, %ymm1247; X86-AVX-NEXT:    vpandn %ymm1, %ymm0, %ymm0248; X86-AVX-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]249; X86-AVX-NEXT:    vpand %ymm1, %ymm0, %ymm2250; X86-AVX-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]251; X86-AVX-NEXT:    # ymm3 = mem[0,1,0,1]252; X86-AVX-NEXT:    vpshufb %ymm2, %ymm3, %ymm2253; X86-AVX-NEXT:    vpsrlw $4, %ymm0, %ymm0254; X86-AVX-NEXT:    vpand %ymm1, %ymm0, %ymm0255; X86-AVX-NEXT:    vpshufb %ymm0, %ymm3, %ymm0256; X86-AVX-NEXT:    vpaddb %ymm2, %ymm0, %ymm0257; X86-AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1258; X86-AVX-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0259; X86-AVX-NEXT:    retl260  %out = call <4 x i64> @llvm.cttz.v4i64(<4 x i64> %in, i1 -1)261  ret <4 x i64> %out262}263 264define <8 x i32> @testv8i32(<8 x i32> %in) nounwind {265; AVX1-LABEL: testv8i32:266; AVX1:       # %bb.0:267; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1268; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2269; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm3270; AVX1-NEXT:    vpandn %xmm3, %xmm1, %xmm1271; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]272; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm4273; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]274; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm4275; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1276; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1277; AVX1-NEXT:    vpshufb %xmm1, %xmm5, %xmm1278; AVX1-NEXT:    vpaddb %xmm4, %xmm1, %xmm1279; AVX1-NEXT:    vpxor %xmm4, %xmm4, %xmm4280; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm6 = xmm1[2],xmm4[2],xmm1[3],xmm4[3]281; AVX1-NEXT:    vpsadbw %xmm4, %xmm6, %xmm6282; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero283; AVX1-NEXT:    vpsadbw %xmm4, %xmm1, %xmm1284; AVX1-NEXT:    vpackuswb %xmm6, %xmm1, %xmm1285; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm2286; AVX1-NEXT:    vpandn %xmm2, %xmm0, %xmm0287; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm2288; AVX1-NEXT:    vpshufb %xmm2, %xmm5, %xmm2289; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0290; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0291; AVX1-NEXT:    vpshufb %xmm0, %xmm5, %xmm0292; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm0293; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm4[2],xmm0[3],xmm4[3]294; AVX1-NEXT:    vpsadbw %xmm4, %xmm2, %xmm2295; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero296; AVX1-NEXT:    vpsadbw %xmm4, %xmm0, %xmm0297; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0298; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0299; AVX1-NEXT:    retq300;301; AVX2-LABEL: testv8i32:302; AVX2:       # %bb.0:303; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1304; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm1305; AVX2-NEXT:    vpandn %ymm1, %ymm0, %ymm0306; AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]307; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2308; AVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]309; AVX2-NEXT:    # ymm3 = mem[0,1,0,1]310; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2311; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0312; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0313; AVX2-NEXT:    vpshufb %ymm0, %ymm3, %ymm0314; AVX2-NEXT:    vpaddb %ymm2, %ymm0, %ymm0315; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1316; AVX2-NEXT:    vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]317; AVX2-NEXT:    vpsadbw %ymm1, %ymm2, %ymm2318; AVX2-NEXT:    vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]319; AVX2-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0320; AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0321; AVX2-NEXT:    retq322;323; AVX512CDVL-LABEL: testv8i32:324; AVX512CDVL:       # %bb.0:325; AVX512CDVL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1326; AVX512CDVL-NEXT:    vpaddd %ymm1, %ymm0, %ymm1327; AVX512CDVL-NEXT:    vpandn %ymm1, %ymm0, %ymm0328; AVX512CDVL-NEXT:    vplzcntd %ymm0, %ymm0329; AVX512CDVL-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [32,32,32,32,32,32,32,32]330; AVX512CDVL-NEXT:    vpsubd %ymm0, %ymm1, %ymm0331; AVX512CDVL-NEXT:    retq332;333; AVX512CD-LABEL: testv8i32:334; AVX512CD:       # %bb.0:335; AVX512CD-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1336; AVX512CD-NEXT:    vpaddd %ymm1, %ymm0, %ymm1337; AVX512CD-NEXT:    vpandn %ymm1, %ymm0, %ymm0338; AVX512CD-NEXT:    vplzcntd %zmm0, %zmm0339; AVX512CD-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [32,32,32,32,32,32,32,32]340; AVX512CD-NEXT:    vpsubd %ymm0, %ymm1, %ymm0341; AVX512CD-NEXT:    retq342;343; AVX512VPOPCNTDQ-LABEL: testv8i32:344; AVX512VPOPCNTDQ:       # %bb.0:345; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1346; AVX512VPOPCNTDQ-NEXT:    vpaddd %ymm1, %ymm0, %ymm1347; AVX512VPOPCNTDQ-NEXT:    vpandn %ymm1, %ymm0, %ymm0348; AVX512VPOPCNTDQ-NEXT:    vpopcntd %zmm0, %zmm0349; AVX512VPOPCNTDQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0350; AVX512VPOPCNTDQ-NEXT:    retq351;352; AVX512VPOPCNTDQVL-LABEL: testv8i32:353; AVX512VPOPCNTDQVL:       # %bb.0:354; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1355; AVX512VPOPCNTDQVL-NEXT:    vpaddd %ymm1, %ymm0, %ymm1356; AVX512VPOPCNTDQVL-NEXT:    vpandn %ymm1, %ymm0, %ymm0357; AVX512VPOPCNTDQVL-NEXT:    vpopcntd %ymm0, %ymm0358; AVX512VPOPCNTDQVL-NEXT:    retq359;360; BITALG_NOVLX-LABEL: testv8i32:361; BITALG_NOVLX:       # %bb.0:362; BITALG_NOVLX-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1363; BITALG_NOVLX-NEXT:    vpaddd %ymm1, %ymm0, %ymm1364; BITALG_NOVLX-NEXT:    vpandn %ymm1, %ymm0, %ymm0365; BITALG_NOVLX-NEXT:    vpopcntb %zmm0, %zmm0366; BITALG_NOVLX-NEXT:    vpxor %xmm1, %xmm1, %xmm1367; BITALG_NOVLX-NEXT:    vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]368; BITALG_NOVLX-NEXT:    vpsadbw %ymm1, %ymm2, %ymm2369; BITALG_NOVLX-NEXT:    vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]370; BITALG_NOVLX-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0371; BITALG_NOVLX-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0372; BITALG_NOVLX-NEXT:    retq373;374; BITALG-LABEL: testv8i32:375; BITALG:       # %bb.0:376; BITALG-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1377; BITALG-NEXT:    vpaddd %ymm1, %ymm0, %ymm1378; BITALG-NEXT:    vpandn %ymm1, %ymm0, %ymm0379; BITALG-NEXT:    vpopcntb %ymm0, %ymm0380; BITALG-NEXT:    vpxor %xmm1, %xmm1, %xmm1381; BITALG-NEXT:    vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]382; BITALG-NEXT:    vpsadbw %ymm1, %ymm2, %ymm2383; BITALG-NEXT:    vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]384; BITALG-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0385; BITALG-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0386; BITALG-NEXT:    retq387;388; X86-AVX-LABEL: testv8i32:389; X86-AVX:       # %bb.0:390; X86-AVX-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1391; X86-AVX-NEXT:    vpaddd %ymm1, %ymm0, %ymm1392; X86-AVX-NEXT:    vpandn %ymm1, %ymm0, %ymm0393; X86-AVX-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]394; X86-AVX-NEXT:    vpand %ymm1, %ymm0, %ymm2395; X86-AVX-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]396; X86-AVX-NEXT:    # ymm3 = mem[0,1,0,1]397; X86-AVX-NEXT:    vpshufb %ymm2, %ymm3, %ymm2398; X86-AVX-NEXT:    vpsrlw $4, %ymm0, %ymm0399; X86-AVX-NEXT:    vpand %ymm1, %ymm0, %ymm0400; X86-AVX-NEXT:    vpshufb %ymm0, %ymm3, %ymm0401; X86-AVX-NEXT:    vpaddb %ymm2, %ymm0, %ymm0402; X86-AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1403; X86-AVX-NEXT:    vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]404; X86-AVX-NEXT:    vpsadbw %ymm1, %ymm2, %ymm2405; X86-AVX-NEXT:    vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]406; X86-AVX-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0407; X86-AVX-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0408; X86-AVX-NEXT:    retl409  %out = call <8 x i32> @llvm.cttz.v8i32(<8 x i32> %in, i1 0)410  ret <8 x i32> %out411}412 413define <8 x i32> @testv8i32u(<8 x i32> %in) nounwind {414; AVX1-LABEL: testv8i32u:415; AVX1:       # %bb.0:416; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1417; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2418; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm3419; AVX1-NEXT:    vpandn %xmm3, %xmm1, %xmm1420; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]421; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm4422; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]423; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm4424; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1425; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1426; AVX1-NEXT:    vpshufb %xmm1, %xmm5, %xmm1427; AVX1-NEXT:    vpaddb %xmm4, %xmm1, %xmm1428; AVX1-NEXT:    vpxor %xmm4, %xmm4, %xmm4429; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm6 = xmm1[2],xmm4[2],xmm1[3],xmm4[3]430; AVX1-NEXT:    vpsadbw %xmm4, %xmm6, %xmm6431; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero432; AVX1-NEXT:    vpsadbw %xmm4, %xmm1, %xmm1433; AVX1-NEXT:    vpackuswb %xmm6, %xmm1, %xmm1434; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm2435; AVX1-NEXT:    vpandn %xmm2, %xmm0, %xmm0436; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm2437; AVX1-NEXT:    vpshufb %xmm2, %xmm5, %xmm2438; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0439; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0440; AVX1-NEXT:    vpshufb %xmm0, %xmm5, %xmm0441; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm0442; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm4[2],xmm0[3],xmm4[3]443; AVX1-NEXT:    vpsadbw %xmm4, %xmm2, %xmm2444; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero445; AVX1-NEXT:    vpsadbw %xmm4, %xmm0, %xmm0446; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0447; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0448; AVX1-NEXT:    retq449;450; AVX2-LABEL: testv8i32u:451; AVX2:       # %bb.0:452; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1453; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm1454; AVX2-NEXT:    vpandn %ymm1, %ymm0, %ymm0455; AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]456; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2457; AVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]458; AVX2-NEXT:    # ymm3 = mem[0,1,0,1]459; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2460; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0461; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0462; AVX2-NEXT:    vpshufb %ymm0, %ymm3, %ymm0463; AVX2-NEXT:    vpaddb %ymm2, %ymm0, %ymm0464; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1465; AVX2-NEXT:    vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]466; AVX2-NEXT:    vpsadbw %ymm1, %ymm2, %ymm2467; AVX2-NEXT:    vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]468; AVX2-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0469; AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0470; AVX2-NEXT:    retq471;472; AVX512CDVL-LABEL: testv8i32u:473; AVX512CDVL:       # %bb.0:474; AVX512CDVL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1475; AVX512CDVL-NEXT:    vpaddd %ymm1, %ymm0, %ymm1476; AVX512CDVL-NEXT:    vpandn %ymm1, %ymm0, %ymm0477; AVX512CDVL-NEXT:    vplzcntd %ymm0, %ymm0478; AVX512CDVL-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [32,32,32,32,32,32,32,32]479; AVX512CDVL-NEXT:    vpsubd %ymm0, %ymm1, %ymm0480; AVX512CDVL-NEXT:    retq481;482; AVX512CD-LABEL: testv8i32u:483; AVX512CD:       # %bb.0:484; AVX512CD-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1485; AVX512CD-NEXT:    vpaddd %ymm1, %ymm0, %ymm1486; AVX512CD-NEXT:    vpandn %ymm1, %ymm0, %ymm0487; AVX512CD-NEXT:    vplzcntd %zmm0, %zmm0488; AVX512CD-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [32,32,32,32,32,32,32,32]489; AVX512CD-NEXT:    vpsubd %ymm0, %ymm1, %ymm0490; AVX512CD-NEXT:    retq491;492; AVX512VPOPCNTDQ-LABEL: testv8i32u:493; AVX512VPOPCNTDQ:       # %bb.0:494; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1495; AVX512VPOPCNTDQ-NEXT:    vpaddd %ymm1, %ymm0, %ymm1496; AVX512VPOPCNTDQ-NEXT:    vpandn %ymm1, %ymm0, %ymm0497; AVX512VPOPCNTDQ-NEXT:    vpopcntd %zmm0, %zmm0498; AVX512VPOPCNTDQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0499; AVX512VPOPCNTDQ-NEXT:    retq500;501; AVX512VPOPCNTDQVL-LABEL: testv8i32u:502; AVX512VPOPCNTDQVL:       # %bb.0:503; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1504; AVX512VPOPCNTDQVL-NEXT:    vpaddd %ymm1, %ymm0, %ymm1505; AVX512VPOPCNTDQVL-NEXT:    vpandn %ymm1, %ymm0, %ymm0506; AVX512VPOPCNTDQVL-NEXT:    vpopcntd %ymm0, %ymm0507; AVX512VPOPCNTDQVL-NEXT:    retq508;509; BITALG_NOVLX-LABEL: testv8i32u:510; BITALG_NOVLX:       # %bb.0:511; BITALG_NOVLX-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1512; BITALG_NOVLX-NEXT:    vpaddd %ymm1, %ymm0, %ymm1513; BITALG_NOVLX-NEXT:    vpandn %ymm1, %ymm0, %ymm0514; BITALG_NOVLX-NEXT:    vpopcntb %zmm0, %zmm0515; BITALG_NOVLX-NEXT:    vpxor %xmm1, %xmm1, %xmm1516; BITALG_NOVLX-NEXT:    vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]517; BITALG_NOVLX-NEXT:    vpsadbw %ymm1, %ymm2, %ymm2518; BITALG_NOVLX-NEXT:    vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]519; BITALG_NOVLX-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0520; BITALG_NOVLX-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0521; BITALG_NOVLX-NEXT:    retq522;523; BITALG-LABEL: testv8i32u:524; BITALG:       # %bb.0:525; BITALG-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1526; BITALG-NEXT:    vpaddd %ymm1, %ymm0, %ymm1527; BITALG-NEXT:    vpandn %ymm1, %ymm0, %ymm0528; BITALG-NEXT:    vpopcntb %ymm0, %ymm0529; BITALG-NEXT:    vpxor %xmm1, %xmm1, %xmm1530; BITALG-NEXT:    vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]531; BITALG-NEXT:    vpsadbw %ymm1, %ymm2, %ymm2532; BITALG-NEXT:    vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]533; BITALG-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0534; BITALG-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0535; BITALG-NEXT:    retq536;537; X86-AVX-LABEL: testv8i32u:538; X86-AVX:       # %bb.0:539; X86-AVX-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1540; X86-AVX-NEXT:    vpaddd %ymm1, %ymm0, %ymm1541; X86-AVX-NEXT:    vpandn %ymm1, %ymm0, %ymm0542; X86-AVX-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]543; X86-AVX-NEXT:    vpand %ymm1, %ymm0, %ymm2544; X86-AVX-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]545; X86-AVX-NEXT:    # ymm3 = mem[0,1,0,1]546; X86-AVX-NEXT:    vpshufb %ymm2, %ymm3, %ymm2547; X86-AVX-NEXT:    vpsrlw $4, %ymm0, %ymm0548; X86-AVX-NEXT:    vpand %ymm1, %ymm0, %ymm0549; X86-AVX-NEXT:    vpshufb %ymm0, %ymm3, %ymm0550; X86-AVX-NEXT:    vpaddb %ymm2, %ymm0, %ymm0551; X86-AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1552; X86-AVX-NEXT:    vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]553; X86-AVX-NEXT:    vpsadbw %ymm1, %ymm2, %ymm2554; X86-AVX-NEXT:    vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]555; X86-AVX-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0556; X86-AVX-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0557; X86-AVX-NEXT:    retl558  %out = call <8 x i32> @llvm.cttz.v8i32(<8 x i32> %in, i1 -1)559  ret <8 x i32> %out560}561 562define <16 x i16> @testv16i16(<16 x i16> %in) nounwind {563; AVX1-LABEL: testv16i16:564; AVX1:       # %bb.0:565; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1566; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm2567; AVX1-NEXT:    vpandn %xmm2, %xmm0, %xmm2568; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]569; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm4570; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]571; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm4572; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm2573; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2574; AVX1-NEXT:    vpshufb %xmm2, %xmm5, %xmm2575; AVX1-NEXT:    vpaddb %xmm4, %xmm2, %xmm2576; AVX1-NEXT:    vpsllw $8, %xmm2, %xmm4577; AVX1-NEXT:    vpaddb %xmm2, %xmm4, %xmm2578; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2579; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0580; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm1581; AVX1-NEXT:    vpandn %xmm1, %xmm0, %xmm0582; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm1583; AVX1-NEXT:    vpshufb %xmm1, %xmm5, %xmm1584; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0585; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0586; AVX1-NEXT:    vpshufb %xmm0, %xmm5, %xmm0587; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0588; AVX1-NEXT:    vpsllw $8, %xmm0, %xmm1589; AVX1-NEXT:    vpaddb %xmm0, %xmm1, %xmm0590; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0591; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0592; AVX1-NEXT:    retq593;594; AVX2-LABEL: testv16i16:595; AVX2:       # %bb.0:596; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1597; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm1598; AVX2-NEXT:    vpandn %ymm1, %ymm0, %ymm0599; AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]600; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2601; AVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]602; AVX2-NEXT:    # ymm3 = mem[0,1,0,1]603; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2604; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0605; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0606; AVX2-NEXT:    vpshufb %ymm0, %ymm3, %ymm0607; AVX2-NEXT:    vpaddb %ymm2, %ymm0, %ymm0608; AVX2-NEXT:    vpsllw $8, %ymm0, %ymm1609; AVX2-NEXT:    vpaddb %ymm0, %ymm1, %ymm0610; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0611; AVX2-NEXT:    retq612;613; AVX512CDVL-LABEL: testv16i16:614; AVX512CDVL:       # %bb.0:615; AVX512CDVL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1616; AVX512CDVL-NEXT:    vpaddw %ymm1, %ymm0, %ymm1617; AVX512CDVL-NEXT:    vpandn %ymm1, %ymm0, %ymm0618; AVX512CDVL-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]619; AVX512CDVL-NEXT:    vpand %ymm1, %ymm0, %ymm2620; AVX512CDVL-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]621; AVX512CDVL-NEXT:    # ymm3 = mem[0,1,0,1]622; AVX512CDVL-NEXT:    vpshufb %ymm2, %ymm3, %ymm2623; AVX512CDVL-NEXT:    vpsrlw $4, %ymm0, %ymm0624; AVX512CDVL-NEXT:    vpand %ymm1, %ymm0, %ymm0625; AVX512CDVL-NEXT:    vpshufb %ymm0, %ymm3, %ymm0626; AVX512CDVL-NEXT:    vpaddb %ymm2, %ymm0, %ymm0627; AVX512CDVL-NEXT:    vpsllw $8, %ymm0, %ymm1628; AVX512CDVL-NEXT:    vpaddb %ymm0, %ymm1, %ymm0629; AVX512CDVL-NEXT:    vpsrlw $8, %ymm0, %ymm0630; AVX512CDVL-NEXT:    retq631;632; AVX512CD-LABEL: testv16i16:633; AVX512CD:       # %bb.0:634; AVX512CD-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1635; AVX512CD-NEXT:    vpaddw %ymm1, %ymm0, %ymm1636; AVX512CD-NEXT:    vpandn %ymm1, %ymm0, %ymm0637; AVX512CD-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]638; AVX512CD-NEXT:    vpand %ymm1, %ymm0, %ymm2639; AVX512CD-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]640; AVX512CD-NEXT:    # ymm3 = mem[0,1,0,1]641; AVX512CD-NEXT:    vpshufb %ymm2, %ymm3, %ymm2642; AVX512CD-NEXT:    vpsrlw $4, %ymm0, %ymm0643; AVX512CD-NEXT:    vpand %ymm1, %ymm0, %ymm0644; AVX512CD-NEXT:    vpshufb %ymm0, %ymm3, %ymm0645; AVX512CD-NEXT:    vpaddb %ymm2, %ymm0, %ymm0646; AVX512CD-NEXT:    vpsllw $8, %ymm0, %ymm1647; AVX512CD-NEXT:    vpaddb %ymm0, %ymm1, %ymm0648; AVX512CD-NEXT:    vpsrlw $8, %ymm0, %ymm0649; AVX512CD-NEXT:    retq650;651; AVX512VPOPCNTDQ-LABEL: testv16i16:652; AVX512VPOPCNTDQ:       # %bb.0:653; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1654; AVX512VPOPCNTDQ-NEXT:    vpaddw %ymm1, %ymm0, %ymm1655; AVX512VPOPCNTDQ-NEXT:    vpandn %ymm1, %ymm0, %ymm0656; AVX512VPOPCNTDQ-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero657; AVX512VPOPCNTDQ-NEXT:    vpopcntd %zmm0, %zmm0658; AVX512VPOPCNTDQ-NEXT:    vpmovdw %zmm0, %ymm0659; AVX512VPOPCNTDQ-NEXT:    retq660;661; AVX512VPOPCNTDQVL-LABEL: testv16i16:662; AVX512VPOPCNTDQVL:       # %bb.0:663; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1664; AVX512VPOPCNTDQVL-NEXT:    vpaddw %ymm1, %ymm0, %ymm1665; AVX512VPOPCNTDQVL-NEXT:    vpandn %ymm1, %ymm0, %ymm0666; AVX512VPOPCNTDQVL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero667; AVX512VPOPCNTDQVL-NEXT:    vpopcntd %zmm0, %zmm0668; AVX512VPOPCNTDQVL-NEXT:    vpmovdw %zmm0, %ymm0669; AVX512VPOPCNTDQVL-NEXT:    retq670;671; BITALG_NOVLX-LABEL: testv16i16:672; BITALG_NOVLX:       # %bb.0:673; BITALG_NOVLX-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1674; BITALG_NOVLX-NEXT:    vpaddw %ymm1, %ymm0, %ymm1675; BITALG_NOVLX-NEXT:    vpandn %ymm1, %ymm0, %ymm0676; BITALG_NOVLX-NEXT:    vpopcntw %zmm0, %zmm0677; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0678; BITALG_NOVLX-NEXT:    retq679;680; BITALG-LABEL: testv16i16:681; BITALG:       # %bb.0:682; BITALG-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1683; BITALG-NEXT:    vpaddw %ymm1, %ymm0, %ymm1684; BITALG-NEXT:    vpandn %ymm1, %ymm0, %ymm0685; BITALG-NEXT:    vpopcntw %ymm0, %ymm0686; BITALG-NEXT:    retq687;688; X86-AVX-LABEL: testv16i16:689; X86-AVX:       # %bb.0:690; X86-AVX-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1691; X86-AVX-NEXT:    vpaddw %ymm1, %ymm0, %ymm1692; X86-AVX-NEXT:    vpandn %ymm1, %ymm0, %ymm0693; X86-AVX-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]694; X86-AVX-NEXT:    vpand %ymm1, %ymm0, %ymm2695; X86-AVX-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]696; X86-AVX-NEXT:    # ymm3 = mem[0,1,0,1]697; X86-AVX-NEXT:    vpshufb %ymm2, %ymm3, %ymm2698; X86-AVX-NEXT:    vpsrlw $4, %ymm0, %ymm0699; X86-AVX-NEXT:    vpand %ymm1, %ymm0, %ymm0700; X86-AVX-NEXT:    vpshufb %ymm0, %ymm3, %ymm0701; X86-AVX-NEXT:    vpaddb %ymm2, %ymm0, %ymm0702; X86-AVX-NEXT:    vpsllw $8, %ymm0, %ymm1703; X86-AVX-NEXT:    vpaddb %ymm0, %ymm1, %ymm0704; X86-AVX-NEXT:    vpsrlw $8, %ymm0, %ymm0705; X86-AVX-NEXT:    retl706  %out = call <16 x i16> @llvm.cttz.v16i16(<16 x i16> %in, i1 0)707  ret <16 x i16> %out708}709 710define <16 x i16> @testv16i16u(<16 x i16> %in) nounwind {711; AVX1-LABEL: testv16i16u:712; AVX1:       # %bb.0:713; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1714; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm2715; AVX1-NEXT:    vpandn %xmm2, %xmm0, %xmm2716; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]717; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm4718; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]719; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm4720; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm2721; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2722; AVX1-NEXT:    vpshufb %xmm2, %xmm5, %xmm2723; AVX1-NEXT:    vpaddb %xmm4, %xmm2, %xmm2724; AVX1-NEXT:    vpsllw $8, %xmm2, %xmm4725; AVX1-NEXT:    vpaddb %xmm2, %xmm4, %xmm2726; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2727; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0728; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm1729; AVX1-NEXT:    vpandn %xmm1, %xmm0, %xmm0730; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm1731; AVX1-NEXT:    vpshufb %xmm1, %xmm5, %xmm1732; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0733; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0734; AVX1-NEXT:    vpshufb %xmm0, %xmm5, %xmm0735; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0736; AVX1-NEXT:    vpsllw $8, %xmm0, %xmm1737; AVX1-NEXT:    vpaddb %xmm0, %xmm1, %xmm0738; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0739; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0740; AVX1-NEXT:    retq741;742; AVX2-LABEL: testv16i16u:743; AVX2:       # %bb.0:744; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1745; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm1746; AVX2-NEXT:    vpandn %ymm1, %ymm0, %ymm0747; AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]748; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2749; AVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]750; AVX2-NEXT:    # ymm3 = mem[0,1,0,1]751; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2752; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0753; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0754; AVX2-NEXT:    vpshufb %ymm0, %ymm3, %ymm0755; AVX2-NEXT:    vpaddb %ymm2, %ymm0, %ymm0756; AVX2-NEXT:    vpsllw $8, %ymm0, %ymm1757; AVX2-NEXT:    vpaddb %ymm0, %ymm1, %ymm0758; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0759; AVX2-NEXT:    retq760;761; AVX512CDVL-LABEL: testv16i16u:762; AVX512CDVL:       # %bb.0:763; AVX512CDVL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1764; AVX512CDVL-NEXT:    vpaddw %ymm1, %ymm0, %ymm1765; AVX512CDVL-NEXT:    vpandn %ymm1, %ymm0, %ymm0766; AVX512CDVL-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]767; AVX512CDVL-NEXT:    vpand %ymm1, %ymm0, %ymm2768; AVX512CDVL-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]769; AVX512CDVL-NEXT:    # ymm3 = mem[0,1,0,1]770; AVX512CDVL-NEXT:    vpshufb %ymm2, %ymm3, %ymm2771; AVX512CDVL-NEXT:    vpsrlw $4, %ymm0, %ymm0772; AVX512CDVL-NEXT:    vpand %ymm1, %ymm0, %ymm0773; AVX512CDVL-NEXT:    vpshufb %ymm0, %ymm3, %ymm0774; AVX512CDVL-NEXT:    vpaddb %ymm2, %ymm0, %ymm0775; AVX512CDVL-NEXT:    vpsllw $8, %ymm0, %ymm1776; AVX512CDVL-NEXT:    vpaddb %ymm0, %ymm1, %ymm0777; AVX512CDVL-NEXT:    vpsrlw $8, %ymm0, %ymm0778; AVX512CDVL-NEXT:    retq779;780; AVX512CD-LABEL: testv16i16u:781; AVX512CD:       # %bb.0:782; AVX512CD-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1783; AVX512CD-NEXT:    vpaddw %ymm1, %ymm0, %ymm1784; AVX512CD-NEXT:    vpandn %ymm1, %ymm0, %ymm0785; AVX512CD-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]786; AVX512CD-NEXT:    vpand %ymm1, %ymm0, %ymm2787; AVX512CD-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]788; AVX512CD-NEXT:    # ymm3 = mem[0,1,0,1]789; AVX512CD-NEXT:    vpshufb %ymm2, %ymm3, %ymm2790; AVX512CD-NEXT:    vpsrlw $4, %ymm0, %ymm0791; AVX512CD-NEXT:    vpand %ymm1, %ymm0, %ymm0792; AVX512CD-NEXT:    vpshufb %ymm0, %ymm3, %ymm0793; AVX512CD-NEXT:    vpaddb %ymm2, %ymm0, %ymm0794; AVX512CD-NEXT:    vpsllw $8, %ymm0, %ymm1795; AVX512CD-NEXT:    vpaddb %ymm0, %ymm1, %ymm0796; AVX512CD-NEXT:    vpsrlw $8, %ymm0, %ymm0797; AVX512CD-NEXT:    retq798;799; AVX512VPOPCNTDQ-LABEL: testv16i16u:800; AVX512VPOPCNTDQ:       # %bb.0:801; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1802; AVX512VPOPCNTDQ-NEXT:    vpaddw %ymm1, %ymm0, %ymm1803; AVX512VPOPCNTDQ-NEXT:    vpandn %ymm1, %ymm0, %ymm0804; AVX512VPOPCNTDQ-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero805; AVX512VPOPCNTDQ-NEXT:    vpopcntd %zmm0, %zmm0806; AVX512VPOPCNTDQ-NEXT:    vpmovdw %zmm0, %ymm0807; AVX512VPOPCNTDQ-NEXT:    retq808;809; AVX512VPOPCNTDQVL-LABEL: testv16i16u:810; AVX512VPOPCNTDQVL:       # %bb.0:811; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1812; AVX512VPOPCNTDQVL-NEXT:    vpaddw %ymm1, %ymm0, %ymm1813; AVX512VPOPCNTDQVL-NEXT:    vpandn %ymm1, %ymm0, %ymm0814; AVX512VPOPCNTDQVL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero815; AVX512VPOPCNTDQVL-NEXT:    vpopcntd %zmm0, %zmm0816; AVX512VPOPCNTDQVL-NEXT:    vpmovdw %zmm0, %ymm0817; AVX512VPOPCNTDQVL-NEXT:    retq818;819; BITALG_NOVLX-LABEL: testv16i16u:820; BITALG_NOVLX:       # %bb.0:821; BITALG_NOVLX-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1822; BITALG_NOVLX-NEXT:    vpaddw %ymm1, %ymm0, %ymm1823; BITALG_NOVLX-NEXT:    vpandn %ymm1, %ymm0, %ymm0824; BITALG_NOVLX-NEXT:    vpopcntw %zmm0, %zmm0825; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0826; BITALG_NOVLX-NEXT:    retq827;828; BITALG-LABEL: testv16i16u:829; BITALG:       # %bb.0:830; BITALG-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1831; BITALG-NEXT:    vpaddw %ymm1, %ymm0, %ymm1832; BITALG-NEXT:    vpandn %ymm1, %ymm0, %ymm0833; BITALG-NEXT:    vpopcntw %ymm0, %ymm0834; BITALG-NEXT:    retq835;836; X86-AVX-LABEL: testv16i16u:837; X86-AVX:       # %bb.0:838; X86-AVX-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1839; X86-AVX-NEXT:    vpaddw %ymm1, %ymm0, %ymm1840; X86-AVX-NEXT:    vpandn %ymm1, %ymm0, %ymm0841; X86-AVX-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]842; X86-AVX-NEXT:    vpand %ymm1, %ymm0, %ymm2843; X86-AVX-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]844; X86-AVX-NEXT:    # ymm3 = mem[0,1,0,1]845; X86-AVX-NEXT:    vpshufb %ymm2, %ymm3, %ymm2846; X86-AVX-NEXT:    vpsrlw $4, %ymm0, %ymm0847; X86-AVX-NEXT:    vpand %ymm1, %ymm0, %ymm0848; X86-AVX-NEXT:    vpshufb %ymm0, %ymm3, %ymm0849; X86-AVX-NEXT:    vpaddb %ymm2, %ymm0, %ymm0850; X86-AVX-NEXT:    vpsllw $8, %ymm0, %ymm1851; X86-AVX-NEXT:    vpaddb %ymm0, %ymm1, %ymm0852; X86-AVX-NEXT:    vpsrlw $8, %ymm0, %ymm0853; X86-AVX-NEXT:    retl854  %out = call <16 x i16> @llvm.cttz.v16i16(<16 x i16> %in, i1 -1)855  ret <16 x i16> %out856}857 858define <32 x i8> @testv32i8(<32 x i8> %in) nounwind {859; AVX1-LABEL: testv32i8:860; AVX1:       # %bb.0:861; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1862; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2863; AVX1-NEXT:    vpaddb %xmm2, %xmm1, %xmm3864; AVX1-NEXT:    vpandn %xmm3, %xmm1, %xmm1865; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]866; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm4867; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]868; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm4869; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1870; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1871; AVX1-NEXT:    vpshufb %xmm1, %xmm5, %xmm1872; AVX1-NEXT:    vpaddb %xmm4, %xmm1, %xmm1873; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm2874; AVX1-NEXT:    vpandn %xmm2, %xmm0, %xmm0875; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm2876; AVX1-NEXT:    vpshufb %xmm2, %xmm5, %xmm2877; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0878; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0879; AVX1-NEXT:    vpshufb %xmm0, %xmm5, %xmm0880; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm0881; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0882; AVX1-NEXT:    retq883;884; AVX2-LABEL: testv32i8:885; AVX2:       # %bb.0:886; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1887; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm1888; AVX2-NEXT:    vpandn %ymm1, %ymm0, %ymm0889; AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]890; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2891; AVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]892; AVX2-NEXT:    # ymm3 = mem[0,1,0,1]893; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2894; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0895; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0896; AVX2-NEXT:    vpshufb %ymm0, %ymm3, %ymm0897; AVX2-NEXT:    vpaddb %ymm2, %ymm0, %ymm0898; AVX2-NEXT:    retq899;900; AVX512CDVL-LABEL: testv32i8:901; AVX512CDVL:       # %bb.0:902; AVX512CDVL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1903; AVX512CDVL-NEXT:    vpaddb %ymm1, %ymm0, %ymm1904; AVX512CDVL-NEXT:    vpandn %ymm1, %ymm0, %ymm0905; AVX512CDVL-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]906; AVX512CDVL-NEXT:    vpand %ymm1, %ymm0, %ymm2907; AVX512CDVL-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]908; AVX512CDVL-NEXT:    # ymm3 = mem[0,1,0,1]909; AVX512CDVL-NEXT:    vpshufb %ymm2, %ymm3, %ymm2910; AVX512CDVL-NEXT:    vpsrlw $4, %ymm0, %ymm0911; AVX512CDVL-NEXT:    vpand %ymm1, %ymm0, %ymm0912; AVX512CDVL-NEXT:    vpshufb %ymm0, %ymm3, %ymm0913; AVX512CDVL-NEXT:    vpaddb %ymm2, %ymm0, %ymm0914; AVX512CDVL-NEXT:    retq915;916; AVX512CD-LABEL: testv32i8:917; AVX512CD:       # %bb.0:918; AVX512CD-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1919; AVX512CD-NEXT:    vpaddb %ymm1, %ymm0, %ymm1920; AVX512CD-NEXT:    vpandn %ymm1, %ymm0, %ymm0921; AVX512CD-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]922; AVX512CD-NEXT:    vpand %ymm1, %ymm0, %ymm2923; AVX512CD-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]924; AVX512CD-NEXT:    # ymm3 = mem[0,1,0,1]925; AVX512CD-NEXT:    vpshufb %ymm2, %ymm3, %ymm2926; AVX512CD-NEXT:    vpsrlw $4, %ymm0, %ymm0927; AVX512CD-NEXT:    vpand %ymm1, %ymm0, %ymm0928; AVX512CD-NEXT:    vpshufb %ymm0, %ymm3, %ymm0929; AVX512CD-NEXT:    vpaddb %ymm2, %ymm0, %ymm0930; AVX512CD-NEXT:    retq931;932; AVX512VPOPCNTDQ-LABEL: testv32i8:933; AVX512VPOPCNTDQ:       # %bb.0:934; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1935; AVX512VPOPCNTDQ-NEXT:    vpaddb %ymm1, %ymm0, %ymm1936; AVX512VPOPCNTDQ-NEXT:    vpandn %ymm1, %ymm0, %ymm0937; AVX512VPOPCNTDQ-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]938; AVX512VPOPCNTDQ-NEXT:    vpand %ymm1, %ymm0, %ymm2939; AVX512VPOPCNTDQ-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]940; AVX512VPOPCNTDQ-NEXT:    # ymm3 = mem[0,1,0,1]941; AVX512VPOPCNTDQ-NEXT:    vpshufb %ymm2, %ymm3, %ymm2942; AVX512VPOPCNTDQ-NEXT:    vpsrlw $4, %ymm0, %ymm0943; AVX512VPOPCNTDQ-NEXT:    vpand %ymm1, %ymm0, %ymm0944; AVX512VPOPCNTDQ-NEXT:    vpshufb %ymm0, %ymm3, %ymm0945; AVX512VPOPCNTDQ-NEXT:    vpaddb %ymm2, %ymm0, %ymm0946; AVX512VPOPCNTDQ-NEXT:    retq947;948; AVX512VPOPCNTDQVL-LABEL: testv32i8:949; AVX512VPOPCNTDQVL:       # %bb.0:950; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1951; AVX512VPOPCNTDQVL-NEXT:    vpaddb %ymm1, %ymm0, %ymm1952; AVX512VPOPCNTDQVL-NEXT:    vpandn %ymm1, %ymm0, %ymm0953; AVX512VPOPCNTDQVL-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]954; AVX512VPOPCNTDQVL-NEXT:    vpand %ymm1, %ymm0, %ymm2955; AVX512VPOPCNTDQVL-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]956; AVX512VPOPCNTDQVL-NEXT:    # ymm3 = mem[0,1,0,1]957; AVX512VPOPCNTDQVL-NEXT:    vpshufb %ymm2, %ymm3, %ymm2958; AVX512VPOPCNTDQVL-NEXT:    vpsrlw $4, %ymm0, %ymm0959; AVX512VPOPCNTDQVL-NEXT:    vpand %ymm1, %ymm0, %ymm0960; AVX512VPOPCNTDQVL-NEXT:    vpshufb %ymm0, %ymm3, %ymm0961; AVX512VPOPCNTDQVL-NEXT:    vpaddb %ymm2, %ymm0, %ymm0962; AVX512VPOPCNTDQVL-NEXT:    retq963;964; BITALG_NOVLX-LABEL: testv32i8:965; BITALG_NOVLX:       # %bb.0:966; BITALG_NOVLX-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1967; BITALG_NOVLX-NEXT:    vpaddb %ymm1, %ymm0, %ymm1968; BITALG_NOVLX-NEXT:    vpandn %ymm1, %ymm0, %ymm0969; BITALG_NOVLX-NEXT:    vpopcntb %zmm0, %zmm0970; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0971; BITALG_NOVLX-NEXT:    retq972;973; BITALG-LABEL: testv32i8:974; BITALG:       # %bb.0:975; BITALG-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1976; BITALG-NEXT:    vpaddb %ymm1, %ymm0, %ymm1977; BITALG-NEXT:    vpandn %ymm1, %ymm0, %ymm0978; BITALG-NEXT:    vpopcntb %ymm0, %ymm0979; BITALG-NEXT:    retq980;981; X86-AVX-LABEL: testv32i8:982; X86-AVX:       # %bb.0:983; X86-AVX-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1984; X86-AVX-NEXT:    vpaddb %ymm1, %ymm0, %ymm1985; X86-AVX-NEXT:    vpandn %ymm1, %ymm0, %ymm0986; X86-AVX-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]987; X86-AVX-NEXT:    vpand %ymm1, %ymm0, %ymm2988; X86-AVX-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]989; X86-AVX-NEXT:    # ymm3 = mem[0,1,0,1]990; X86-AVX-NEXT:    vpshufb %ymm2, %ymm3, %ymm2991; X86-AVX-NEXT:    vpsrlw $4, %ymm0, %ymm0992; X86-AVX-NEXT:    vpand %ymm1, %ymm0, %ymm0993; X86-AVX-NEXT:    vpshufb %ymm0, %ymm3, %ymm0994; X86-AVX-NEXT:    vpaddb %ymm2, %ymm0, %ymm0995; X86-AVX-NEXT:    retl996  %out = call <32 x i8> @llvm.cttz.v32i8(<32 x i8> %in, i1 0)997  ret <32 x i8> %out998}999 1000define <32 x i8> @testv32i8u(<32 x i8> %in) nounwind {1001; AVX1-LABEL: testv32i8u:1002; AVX1:       # %bb.0:1003; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11004; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm21005; AVX1-NEXT:    vpaddb %xmm2, %xmm1, %xmm31006; AVX1-NEXT:    vpandn %xmm3, %xmm1, %xmm11007; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1008; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm41009; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1010; AVX1-NEXT:    vpshufb %xmm4, %xmm5, %xmm41011; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm11012; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm11013; AVX1-NEXT:    vpshufb %xmm1, %xmm5, %xmm11014; AVX1-NEXT:    vpaddb %xmm4, %xmm1, %xmm11015; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm21016; AVX1-NEXT:    vpandn %xmm2, %xmm0, %xmm01017; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm21018; AVX1-NEXT:    vpshufb %xmm2, %xmm5, %xmm21019; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm01020; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm01021; AVX1-NEXT:    vpshufb %xmm0, %xmm5, %xmm01022; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm01023; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01024; AVX1-NEXT:    retq1025;1026; AVX2-LABEL: testv32i8u:1027; AVX2:       # %bb.0:1028; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm11029; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm11030; AVX2-NEXT:    vpandn %ymm1, %ymm0, %ymm01031; AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1032; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm21033; AVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1034; AVX2-NEXT:    # ymm3 = mem[0,1,0,1]1035; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm21036; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm01037; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm01038; AVX2-NEXT:    vpshufb %ymm0, %ymm3, %ymm01039; AVX2-NEXT:    vpaddb %ymm2, %ymm0, %ymm01040; AVX2-NEXT:    retq1041;1042; AVX512CDVL-LABEL: testv32i8u:1043; AVX512CDVL:       # %bb.0:1044; AVX512CDVL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm11045; AVX512CDVL-NEXT:    vpaddb %ymm1, %ymm0, %ymm11046; AVX512CDVL-NEXT:    vpandn %ymm1, %ymm0, %ymm01047; AVX512CDVL-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1048; AVX512CDVL-NEXT:    vpand %ymm1, %ymm0, %ymm21049; AVX512CDVL-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1050; AVX512CDVL-NEXT:    # ymm3 = mem[0,1,0,1]1051; AVX512CDVL-NEXT:    vpshufb %ymm2, %ymm3, %ymm21052; AVX512CDVL-NEXT:    vpsrlw $4, %ymm0, %ymm01053; AVX512CDVL-NEXT:    vpand %ymm1, %ymm0, %ymm01054; AVX512CDVL-NEXT:    vpshufb %ymm0, %ymm3, %ymm01055; AVX512CDVL-NEXT:    vpaddb %ymm2, %ymm0, %ymm01056; AVX512CDVL-NEXT:    retq1057;1058; AVX512CD-LABEL: testv32i8u:1059; AVX512CD:       # %bb.0:1060; AVX512CD-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm11061; AVX512CD-NEXT:    vpaddb %ymm1, %ymm0, %ymm11062; AVX512CD-NEXT:    vpandn %ymm1, %ymm0, %ymm01063; AVX512CD-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1064; AVX512CD-NEXT:    vpand %ymm1, %ymm0, %ymm21065; AVX512CD-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1066; AVX512CD-NEXT:    # ymm3 = mem[0,1,0,1]1067; AVX512CD-NEXT:    vpshufb %ymm2, %ymm3, %ymm21068; AVX512CD-NEXT:    vpsrlw $4, %ymm0, %ymm01069; AVX512CD-NEXT:    vpand %ymm1, %ymm0, %ymm01070; AVX512CD-NEXT:    vpshufb %ymm0, %ymm3, %ymm01071; AVX512CD-NEXT:    vpaddb %ymm2, %ymm0, %ymm01072; AVX512CD-NEXT:    retq1073;1074; AVX512VPOPCNTDQ-LABEL: testv32i8u:1075; AVX512VPOPCNTDQ:       # %bb.0:1076; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm11077; AVX512VPOPCNTDQ-NEXT:    vpaddb %ymm1, %ymm0, %ymm11078; AVX512VPOPCNTDQ-NEXT:    vpandn %ymm1, %ymm0, %ymm01079; AVX512VPOPCNTDQ-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1080; AVX512VPOPCNTDQ-NEXT:    vpand %ymm1, %ymm0, %ymm21081; AVX512VPOPCNTDQ-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1082; AVX512VPOPCNTDQ-NEXT:    # ymm3 = mem[0,1,0,1]1083; AVX512VPOPCNTDQ-NEXT:    vpshufb %ymm2, %ymm3, %ymm21084; AVX512VPOPCNTDQ-NEXT:    vpsrlw $4, %ymm0, %ymm01085; AVX512VPOPCNTDQ-NEXT:    vpand %ymm1, %ymm0, %ymm01086; AVX512VPOPCNTDQ-NEXT:    vpshufb %ymm0, %ymm3, %ymm01087; AVX512VPOPCNTDQ-NEXT:    vpaddb %ymm2, %ymm0, %ymm01088; AVX512VPOPCNTDQ-NEXT:    retq1089;1090; AVX512VPOPCNTDQVL-LABEL: testv32i8u:1091; AVX512VPOPCNTDQVL:       # %bb.0:1092; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm11093; AVX512VPOPCNTDQVL-NEXT:    vpaddb %ymm1, %ymm0, %ymm11094; AVX512VPOPCNTDQVL-NEXT:    vpandn %ymm1, %ymm0, %ymm01095; AVX512VPOPCNTDQVL-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1096; AVX512VPOPCNTDQVL-NEXT:    vpand %ymm1, %ymm0, %ymm21097; AVX512VPOPCNTDQVL-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1098; AVX512VPOPCNTDQVL-NEXT:    # ymm3 = mem[0,1,0,1]1099; AVX512VPOPCNTDQVL-NEXT:    vpshufb %ymm2, %ymm3, %ymm21100; AVX512VPOPCNTDQVL-NEXT:    vpsrlw $4, %ymm0, %ymm01101; AVX512VPOPCNTDQVL-NEXT:    vpand %ymm1, %ymm0, %ymm01102; AVX512VPOPCNTDQVL-NEXT:    vpshufb %ymm0, %ymm3, %ymm01103; AVX512VPOPCNTDQVL-NEXT:    vpaddb %ymm2, %ymm0, %ymm01104; AVX512VPOPCNTDQVL-NEXT:    retq1105;1106; BITALG_NOVLX-LABEL: testv32i8u:1107; BITALG_NOVLX:       # %bb.0:1108; BITALG_NOVLX-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm11109; BITALG_NOVLX-NEXT:    vpaddb %ymm1, %ymm0, %ymm11110; BITALG_NOVLX-NEXT:    vpandn %ymm1, %ymm0, %ymm01111; BITALG_NOVLX-NEXT:    vpopcntb %zmm0, %zmm01112; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm01113; BITALG_NOVLX-NEXT:    retq1114;1115; BITALG-LABEL: testv32i8u:1116; BITALG:       # %bb.0:1117; BITALG-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm11118; BITALG-NEXT:    vpaddb %ymm1, %ymm0, %ymm11119; BITALG-NEXT:    vpandn %ymm1, %ymm0, %ymm01120; BITALG-NEXT:    vpopcntb %ymm0, %ymm01121; BITALG-NEXT:    retq1122;1123; X86-AVX-LABEL: testv32i8u:1124; X86-AVX:       # %bb.0:1125; X86-AVX-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm11126; X86-AVX-NEXT:    vpaddb %ymm1, %ymm0, %ymm11127; X86-AVX-NEXT:    vpandn %ymm1, %ymm0, %ymm01128; X86-AVX-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1129; X86-AVX-NEXT:    vpand %ymm1, %ymm0, %ymm21130; X86-AVX-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1131; X86-AVX-NEXT:    # ymm3 = mem[0,1,0,1]1132; X86-AVX-NEXT:    vpshufb %ymm2, %ymm3, %ymm21133; X86-AVX-NEXT:    vpsrlw $4, %ymm0, %ymm01134; X86-AVX-NEXT:    vpand %ymm1, %ymm0, %ymm01135; X86-AVX-NEXT:    vpshufb %ymm0, %ymm3, %ymm01136; X86-AVX-NEXT:    vpaddb %ymm2, %ymm0, %ymm01137; X86-AVX-NEXT:    retl1138  %out = call <32 x i8> @llvm.cttz.v32i8(<32 x i8> %in, i1 -1)1139  ret <32 x i8> %out1140}1141 1142define <4 x i64> @foldv4i64() nounwind {1143; AVX1-LABEL: foldv4i64:1144; AVX1:       # %bb.0:1145; AVX1-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,64,0]1146; AVX1-NEXT:    retq1147;1148; AVX2-LABEL: foldv4i64:1149; AVX2:       # %bb.0:1150; AVX2-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,64,0]1151; AVX2-NEXT:    retq1152;1153; AVX512CDVL-LABEL: foldv4i64:1154; AVX512CDVL:       # %bb.0:1155; AVX512CDVL-NEXT:    vpmovsxbq {{.*#+}} ymm0 = [8,0,64,0]1156; AVX512CDVL-NEXT:    retq1157;1158; AVX512CD-LABEL: foldv4i64:1159; AVX512CD:       # %bb.0:1160; AVX512CD-NEXT:    vpmovsxbq {{.*#+}} ymm0 = [8,0,64,0]1161; AVX512CD-NEXT:    retq1162;1163; AVX512VPOPCNTDQ-LABEL: foldv4i64:1164; AVX512VPOPCNTDQ:       # %bb.0:1165; AVX512VPOPCNTDQ-NEXT:    vpmovsxbq {{.*#+}} ymm0 = [8,0,64,0]1166; AVX512VPOPCNTDQ-NEXT:    retq1167;1168; AVX512VPOPCNTDQVL-LABEL: foldv4i64:1169; AVX512VPOPCNTDQVL:       # %bb.0:1170; AVX512VPOPCNTDQVL-NEXT:    vpmovsxbq {{.*#+}} ymm0 = [8,0,64,0]1171; AVX512VPOPCNTDQVL-NEXT:    retq1172;1173; BITALG_NOVLX-LABEL: foldv4i64:1174; BITALG_NOVLX:       # %bb.0:1175; BITALG_NOVLX-NEXT:    vpmovsxbq {{.*#+}} ymm0 = [8,0,64,0]1176; BITALG_NOVLX-NEXT:    retq1177;1178; BITALG-LABEL: foldv4i64:1179; BITALG:       # %bb.0:1180; BITALG-NEXT:    vpmovsxbq {{.*#+}} ymm0 = [8,0,64,0]1181; BITALG-NEXT:    retq1182;1183; X86-AVX-LABEL: foldv4i64:1184; X86-AVX:       # %bb.0:1185; X86-AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,0,0,64,0,0,0]1186; X86-AVX-NEXT:    retl1187  %out = call <4 x i64> @llvm.cttz.v4i64(<4 x i64> <i64 256, i64 -1, i64 0, i64 255>, i1 0)1188  ret <4 x i64> %out1189}1190 1191define <4 x i64> @foldv4i64u() nounwind {1192; AVX1-LABEL: foldv4i64u:1193; AVX1:       # %bb.0:1194; AVX1-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,64,0]1195; AVX1-NEXT:    retq1196;1197; AVX2-LABEL: foldv4i64u:1198; AVX2:       # %bb.0:1199; AVX2-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,64,0]1200; AVX2-NEXT:    retq1201;1202; AVX512CDVL-LABEL: foldv4i64u:1203; AVX512CDVL:       # %bb.0:1204; AVX512CDVL-NEXT:    vpmovsxbq {{.*#+}} ymm0 = [8,0,64,0]1205; AVX512CDVL-NEXT:    retq1206;1207; AVX512CD-LABEL: foldv4i64u:1208; AVX512CD:       # %bb.0:1209; AVX512CD-NEXT:    vpmovsxbq {{.*#+}} ymm0 = [8,0,64,0]1210; AVX512CD-NEXT:    retq1211;1212; AVX512VPOPCNTDQ-LABEL: foldv4i64u:1213; AVX512VPOPCNTDQ:       # %bb.0:1214; AVX512VPOPCNTDQ-NEXT:    vpmovsxbq {{.*#+}} ymm0 = [8,0,64,0]1215; AVX512VPOPCNTDQ-NEXT:    retq1216;1217; AVX512VPOPCNTDQVL-LABEL: foldv4i64u:1218; AVX512VPOPCNTDQVL:       # %bb.0:1219; AVX512VPOPCNTDQVL-NEXT:    vpmovsxbq {{.*#+}} ymm0 = [8,0,64,0]1220; AVX512VPOPCNTDQVL-NEXT:    retq1221;1222; BITALG_NOVLX-LABEL: foldv4i64u:1223; BITALG_NOVLX:       # %bb.0:1224; BITALG_NOVLX-NEXT:    vpmovsxbq {{.*#+}} ymm0 = [8,0,64,0]1225; BITALG_NOVLX-NEXT:    retq1226;1227; BITALG-LABEL: foldv4i64u:1228; BITALG:       # %bb.0:1229; BITALG-NEXT:    vpmovsxbq {{.*#+}} ymm0 = [8,0,64,0]1230; BITALG-NEXT:    retq1231;1232; X86-AVX-LABEL: foldv4i64u:1233; X86-AVX:       # %bb.0:1234; X86-AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,0,0,64,0,0,0]1235; X86-AVX-NEXT:    retl1236  %out = call <4 x i64> @llvm.cttz.v4i64(<4 x i64> <i64 256, i64 -1, i64 0, i64 255>, i1 -1)1237  ret <4 x i64> %out1238}1239 1240define <8 x i32> @foldv8i32() nounwind {1241; AVX1-LABEL: foldv8i32:1242; AVX1:       # %bb.0:1243; AVX1-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,32,0,16,0,3,3]1244; AVX1-NEXT:    retq1245;1246; AVX2-LABEL: foldv8i32:1247; AVX2:       # %bb.0:1248; AVX2-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,32,0,16,0,3,3]1249; AVX2-NEXT:    retq1250;1251; AVX512CDVL-LABEL: foldv8i32:1252; AVX512CDVL:       # %bb.0:1253; AVX512CDVL-NEXT:    vpmovsxbd {{.*#+}} ymm0 = [8,0,32,0,16,0,3,3]1254; AVX512CDVL-NEXT:    retq1255;1256; AVX512CD-LABEL: foldv8i32:1257; AVX512CD:       # %bb.0:1258; AVX512CD-NEXT:    vpmovsxbd {{.*#+}} ymm0 = [8,0,32,0,16,0,3,3]1259; AVX512CD-NEXT:    retq1260;1261; AVX512VPOPCNTDQ-LABEL: foldv8i32:1262; AVX512VPOPCNTDQ:       # %bb.0:1263; AVX512VPOPCNTDQ-NEXT:    vpmovsxbd {{.*#+}} ymm0 = [8,0,32,0,16,0,3,3]1264; AVX512VPOPCNTDQ-NEXT:    retq1265;1266; AVX512VPOPCNTDQVL-LABEL: foldv8i32:1267; AVX512VPOPCNTDQVL:       # %bb.0:1268; AVX512VPOPCNTDQVL-NEXT:    vpmovsxbd {{.*#+}} ymm0 = [8,0,32,0,16,0,3,3]1269; AVX512VPOPCNTDQVL-NEXT:    retq1270;1271; BITALG_NOVLX-LABEL: foldv8i32:1272; BITALG_NOVLX:       # %bb.0:1273; BITALG_NOVLX-NEXT:    vpmovsxbd {{.*#+}} ymm0 = [8,0,32,0,16,0,3,3]1274; BITALG_NOVLX-NEXT:    retq1275;1276; BITALG-LABEL: foldv8i32:1277; BITALG:       # %bb.0:1278; BITALG-NEXT:    vpmovsxbd {{.*#+}} ymm0 = [8,0,32,0,16,0,3,3]1279; BITALG-NEXT:    retq1280;1281; X86-AVX-LABEL: foldv8i32:1282; X86-AVX:       # %bb.0:1283; X86-AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,32,0,16,0,3,3]1284; X86-AVX-NEXT:    retl1285  %out = call <8 x i32> @llvm.cttz.v8i32(<8 x i32> <i32 256, i32 -1, i32 0, i32 255, i32 -65536, i32 7, i32 24, i32 88>, i1 0)1286  ret <8 x i32> %out1287}1288 1289define <8 x i32> @foldv8i32u() nounwind {1290; AVX1-LABEL: foldv8i32u:1291; AVX1:       # %bb.0:1292; AVX1-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,32,0,16,0,3,3]1293; AVX1-NEXT:    retq1294;1295; AVX2-LABEL: foldv8i32u:1296; AVX2:       # %bb.0:1297; AVX2-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,32,0,16,0,3,3]1298; AVX2-NEXT:    retq1299;1300; AVX512CDVL-LABEL: foldv8i32u:1301; AVX512CDVL:       # %bb.0:1302; AVX512CDVL-NEXT:    vpmovsxbd {{.*#+}} ymm0 = [8,0,32,0,16,0,3,3]1303; AVX512CDVL-NEXT:    retq1304;1305; AVX512CD-LABEL: foldv8i32u:1306; AVX512CD:       # %bb.0:1307; AVX512CD-NEXT:    vpmovsxbd {{.*#+}} ymm0 = [8,0,32,0,16,0,3,3]1308; AVX512CD-NEXT:    retq1309;1310; AVX512VPOPCNTDQ-LABEL: foldv8i32u:1311; AVX512VPOPCNTDQ:       # %bb.0:1312; AVX512VPOPCNTDQ-NEXT:    vpmovsxbd {{.*#+}} ymm0 = [8,0,32,0,16,0,3,3]1313; AVX512VPOPCNTDQ-NEXT:    retq1314;1315; AVX512VPOPCNTDQVL-LABEL: foldv8i32u:1316; AVX512VPOPCNTDQVL:       # %bb.0:1317; AVX512VPOPCNTDQVL-NEXT:    vpmovsxbd {{.*#+}} ymm0 = [8,0,32,0,16,0,3,3]1318; AVX512VPOPCNTDQVL-NEXT:    retq1319;1320; BITALG_NOVLX-LABEL: foldv8i32u:1321; BITALG_NOVLX:       # %bb.0:1322; BITALG_NOVLX-NEXT:    vpmovsxbd {{.*#+}} ymm0 = [8,0,32,0,16,0,3,3]1323; BITALG_NOVLX-NEXT:    retq1324;1325; BITALG-LABEL: foldv8i32u:1326; BITALG:       # %bb.0:1327; BITALG-NEXT:    vpmovsxbd {{.*#+}} ymm0 = [8,0,32,0,16,0,3,3]1328; BITALG-NEXT:    retq1329;1330; X86-AVX-LABEL: foldv8i32u:1331; X86-AVX:       # %bb.0:1332; X86-AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,32,0,16,0,3,3]1333; X86-AVX-NEXT:    retl1334  %out = call <8 x i32> @llvm.cttz.v8i32(<8 x i32> <i32 256, i32 -1, i32 0, i32 255, i32 -65536, i32 7, i32 24, i32 88>, i1 -1)1335  ret <8 x i32> %out1336}1337 1338define <16 x i16> @foldv16i16() nounwind {1339; ALL-LABEL: foldv16i16:1340; ALL:       # %bb.0:1341; ALL-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,16,0,16,0,3,3,1,1,0,1,2,3,4,5]1342; ALL-NEXT:    ret{{[l|q]}}1343  %out = call <16 x i16> @llvm.cttz.v16i16(<16 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88, i16 -2, i16 254, i16 1, i16 2, i16 4, i16 8, i16 16, i16 32>, i1 0)1344  ret <16 x i16> %out1345}1346 1347define <16 x i16> @foldv16i16u() nounwind {1348; ALL-LABEL: foldv16i16u:1349; ALL:       # %bb.0:1350; ALL-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,16,0,16,0,3,3,1,1,0,1,2,3,4,5]1351; ALL-NEXT:    ret{{[l|q]}}1352  %out = call <16 x i16> @llvm.cttz.v16i16(<16 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88, i16 -2, i16 254, i16 1, i16 2, i16 4, i16 8, i16 16, i16 32>, i1 -1)1353  ret <16 x i16> %out1354}1355 1356define <32 x i8> @foldv32i8() nounwind {1357; ALL-LABEL: foldv32i8:1358; ALL:       # %bb.0:1359; ALL-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5,6,7,8,8,7,6,5,4,3,2,1,0,0,0,0,0]1360; ALL-NEXT:    ret{{[l|q]}}1361  %out = call <32 x i8> @llvm.cttz.v32i8(<32 x i8> <i8 256, i8 -1, i8 0, i8 255, i8 -65536, i8 7, i8 24, i8 88, i8 -2, i8 254, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 128, i8 256, i8 -256, i8 -128, i8 -64, i8 -32, i8 -16, i8 -8, i8 -4, i8 -2, i8 -1, i8 3, i8 5, i8 7, i8 127>, i1 0)1362  ret <32 x i8> %out1363}1364 1365define <32 x i8> @foldv32i8u() nounwind {1366; ALL-LABEL: foldv32i8u:1367; ALL:       # %bb.0:1368; ALL-NEXT:    vmovaps {{.*#+}} ymm0 = [8,0,8,0,8,0,3,3,1,1,0,1,2,3,4,5,6,7,8,8,7,6,5,4,3,2,1,0,0,0,0,0]1369; ALL-NEXT:    ret{{[l|q]}}1370  %out = call <32 x i8> @llvm.cttz.v32i8(<32 x i8> <i8 256, i8 -1, i8 0, i8 255, i8 -65536, i8 7, i8 24, i8 88, i8 -2, i8 254, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 128, i8 256, i8 -256, i8 -128, i8 -64, i8 -32, i8 -16, i8 -8, i8 -4, i8 -2, i8 -1, i8 3, i8 5, i8 7, i8 127>, i1 -1)1371  ret <32 x i8> %out1372}1373 1374declare <4 x i64> @llvm.cttz.v4i64(<4 x i64>, i1)1375declare <8 x i32> @llvm.cttz.v8i32(<8 x i32>, i1)1376declare <16 x i16> @llvm.cttz.v16i16(<16 x i16>, i1)1377declare <32 x i8> @llvm.cttz.v32i8(<32 x i8>, i1)1378;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:1379; AVX: {{.*}}1380