brintos

brintos / llvm-project-archived public Read only

0
0
Text · 71.9 KiB · 3004b8b Raw
1922 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown | FileCheck %s --check-prefixes=X86,X86-NOSSE3; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefixes=X64,X64-BASE4; RUN: llc < %s -mtriple=i686-unknown -mattr=+popcnt | FileCheck %s --check-prefixes=X86-POPCNT5; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+popcnt | FileCheck %s --check-prefixes=X64-POPCNT6; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ndd | FileCheck %s --check-prefixes=X64,X64-NDD7; RUN: llc < %s -mtriple=i686-unknown -mattr=sse2 | FileCheck %s --check-prefixes=X86,X86-SSE28; RUN: llc < %s -mtriple=i686-unknown -mattr=ssse3 | FileCheck %s --check-prefixes=X86,X86-SSSE39 10define i8 @cnt8(i8 %x) nounwind readnone {11; X86-LABEL: cnt8:12; X86:       # %bb.0:13; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax14; X86-NEXT:    imull $134480385, %eax, %eax # imm = 0x804020115; X86-NEXT:    shrl $3, %eax16; X86-NEXT:    andl $286331153, %eax # imm = 0x1111111117; X86-NEXT:    imull $286331153, %eax, %eax # imm = 0x1111111118; X86-NEXT:    shrl $28, %eax19; X86-NEXT:    # kill: def $al killed $al killed $eax20; X86-NEXT:    retl21;22; X64-LABEL: cnt8:23; X64:       # %bb.0:24; X64-NEXT:    movzbl %dil, %eax25; X64-NEXT:    imull $134480385, %eax, %eax # imm = 0x804020126; X64-NEXT:    shrl $3, %eax27; X64-NEXT:    andl $286331153, %eax # imm = 0x1111111128; X64-NEXT:    imull $286331153, %eax, %eax # imm = 0x1111111129; X64-NEXT:    shrl $28, %eax30; X64-NEXT:    # kill: def $al killed $al killed $eax31; X64-NEXT:    retq32;33; X86-POPCNT-LABEL: cnt8:34; X86-POPCNT:       # %bb.0:35; X86-POPCNT-NEXT:    movzbl {{[0-9]+}}(%esp), %eax36; X86-POPCNT-NEXT:    popcntl %eax, %eax37; X86-POPCNT-NEXT:    # kill: def $al killed $al killed $eax38; X86-POPCNT-NEXT:    retl39;40; X64-POPCNT-LABEL: cnt8:41; X64-POPCNT:       # %bb.0:42; X64-POPCNT-NEXT:    movzbl %dil, %eax43; X64-POPCNT-NEXT:    popcntl %eax, %eax44; X64-POPCNT-NEXT:    # kill: def $al killed $al killed $eax45; X64-POPCNT-NEXT:    retq46  %cnt = tail call i8 @llvm.ctpop.i8(i8 %x)47  ret i8 %cnt48}49 50define i16 @cnt16(i16 %x) nounwind readnone {51; X86-LABEL: cnt16:52; X86:       # %bb.0:53; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax54; X86-NEXT:    movl %eax, %ecx55; X86-NEXT:    shrl %ecx56; X86-NEXT:    andl $21845, %ecx # imm = 0x555557; X86-NEXT:    subl %ecx, %eax58; X86-NEXT:    movl %eax, %ecx59; X86-NEXT:    andl $13107, %ecx # imm = 0x333360; X86-NEXT:    shrl $2, %eax61; X86-NEXT:    andl $13107, %eax # imm = 0x333362; X86-NEXT:    addl %ecx, %eax63; X86-NEXT:    movl %eax, %ecx64; X86-NEXT:    shrl $4, %ecx65; X86-NEXT:    addl %eax, %ecx66; X86-NEXT:    andl $3855, %ecx # imm = 0xF0F67; X86-NEXT:    movl %ecx, %eax68; X86-NEXT:    shrl $8, %eax69; X86-NEXT:    addl %ecx, %eax70; X86-NEXT:    movzbl %al, %eax71; X86-NEXT:    # kill: def $ax killed $ax killed $eax72; X86-NEXT:    retl73;74; X64-BASE-LABEL: cnt16:75; X64-BASE:       # %bb.0:76; X64-BASE-NEXT:    movl %edi, %eax77; X64-BASE-NEXT:    shrl %eax78; X64-BASE-NEXT:    andl $21845, %eax # imm = 0x555579; X64-BASE-NEXT:    subl %eax, %edi80; X64-BASE-NEXT:    movl %edi, %eax81; X64-BASE-NEXT:    andl $13107, %eax # imm = 0x333382; X64-BASE-NEXT:    shrl $2, %edi83; X64-BASE-NEXT:    andl $13107, %edi # imm = 0x333384; X64-BASE-NEXT:    addl %eax, %edi85; X64-BASE-NEXT:    movl %edi, %eax86; X64-BASE-NEXT:    shrl $4, %eax87; X64-BASE-NEXT:    addl %edi, %eax88; X64-BASE-NEXT:    andl $3855, %eax # imm = 0xF0F89; X64-BASE-NEXT:    movl %eax, %ecx90; X64-BASE-NEXT:    shrl $8, %ecx91; X64-BASE-NEXT:    addl %eax, %ecx92; X64-BASE-NEXT:    movzbl %cl, %eax93; X64-BASE-NEXT:    # kill: def $ax killed $ax killed $eax94; X64-BASE-NEXT:    retq95;96; X86-POPCNT-LABEL: cnt16:97; X86-POPCNT:       # %bb.0:98; X86-POPCNT-NEXT:    movzwl {{[0-9]+}}(%esp), %eax99; X86-POPCNT-NEXT:    popcntl %eax, %eax100; X86-POPCNT-NEXT:    # kill: def $ax killed $ax killed $eax101; X86-POPCNT-NEXT:    retl102;103; X64-POPCNT-LABEL: cnt16:104; X64-POPCNT:       # %bb.0:105; X64-POPCNT-NEXT:    movzwl %di, %eax106; X64-POPCNT-NEXT:    popcntl %eax, %eax107; X64-POPCNT-NEXT:    # kill: def $ax killed $ax killed $eax108; X64-POPCNT-NEXT:    retq109;110; X64-NDD-LABEL: cnt16:111; X64-NDD:       # %bb.0:112; X64-NDD-NEXT:    shrw %di, %ax113; X64-NDD-NEXT:    andw $21845, %ax # imm = 0x5555114; X64-NDD-NEXT:    subw %ax, %di, %ax115; X64-NDD-NEXT:    andw $13107, %ax, %cx # imm = 0x3333116; X64-NDD-NEXT:    shrw $2, %ax117; X64-NDD-NEXT:    andw $13107, %ax # imm = 0x3333118; X64-NDD-NEXT:    addw %cx, %ax119; X64-NDD-NEXT:    shrw $4, %ax, %cx120; X64-NDD-NEXT:    addw %cx, %ax121; X64-NDD-NEXT:    andw $3855, %ax # imm = 0xF0F122; X64-NDD-NEXT:    movzbl %ah, %ecx123; X64-NDD-NEXT:    addw %cx, %ax124; X64-NDD-NEXT:    movzbl %al, %eax125; X64-NDD-NEXT:    # kill: def $ax killed $ax killed $eax126; X64-NDD-NEXT:    retq127  %cnt = tail call i16 @llvm.ctpop.i16(i16 %x)128  ret i16 %cnt129}130 131define i32 @cnt32(i32 %x) nounwind readnone {132; X86-LABEL: cnt32:133; X86:       # %bb.0:134; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax135; X86-NEXT:    movl %eax, %ecx136; X86-NEXT:    shrl %ecx137; X86-NEXT:    andl $1431655765, %ecx # imm = 0x55555555138; X86-NEXT:    subl %ecx, %eax139; X86-NEXT:    movl %eax, %ecx140; X86-NEXT:    andl $858993459, %ecx # imm = 0x33333333141; X86-NEXT:    shrl $2, %eax142; X86-NEXT:    andl $858993459, %eax # imm = 0x33333333143; X86-NEXT:    addl %ecx, %eax144; X86-NEXT:    movl %eax, %ecx145; X86-NEXT:    shrl $4, %ecx146; X86-NEXT:    addl %eax, %ecx147; X86-NEXT:    andl $252645135, %ecx # imm = 0xF0F0F0F148; X86-NEXT:    imull $16843009, %ecx, %eax # imm = 0x1010101149; X86-NEXT:    shrl $24, %eax150; X86-NEXT:    retl151;152; X64-BASE-LABEL: cnt32:153; X64-BASE:       # %bb.0:154; X64-BASE-NEXT:    movl %edi, %eax155; X64-BASE-NEXT:    shrl %eax156; X64-BASE-NEXT:    andl $1431655765, %eax # imm = 0x55555555157; X64-BASE-NEXT:    subl %eax, %edi158; X64-BASE-NEXT:    movl %edi, %eax159; X64-BASE-NEXT:    andl $858993459, %eax # imm = 0x33333333160; X64-BASE-NEXT:    shrl $2, %edi161; X64-BASE-NEXT:    andl $858993459, %edi # imm = 0x33333333162; X64-BASE-NEXT:    addl %eax, %edi163; X64-BASE-NEXT:    movl %edi, %eax164; X64-BASE-NEXT:    shrl $4, %eax165; X64-BASE-NEXT:    addl %edi, %eax166; X64-BASE-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F167; X64-BASE-NEXT:    imull $16843009, %eax, %eax # imm = 0x1010101168; X64-BASE-NEXT:    shrl $24, %eax169; X64-BASE-NEXT:    retq170;171; X86-POPCNT-LABEL: cnt32:172; X86-POPCNT:       # %bb.0:173; X86-POPCNT-NEXT:    popcntl {{[0-9]+}}(%esp), %eax174; X86-POPCNT-NEXT:    retl175;176; X64-POPCNT-LABEL: cnt32:177; X64-POPCNT:       # %bb.0:178; X64-POPCNT-NEXT:    popcntl %edi, %eax179; X64-POPCNT-NEXT:    retq180;181; X64-NDD-LABEL: cnt32:182; X64-NDD:       # %bb.0:183; X64-NDD-NEXT:    shrl %edi, %eax184; X64-NDD-NEXT:    andl $1431655765, %eax # imm = 0x55555555185; X64-NDD-NEXT:    subl %eax, %edi186; X64-NDD-NEXT:    andl $858993459, %edi, %eax # imm = 0x33333333187; X64-NDD-NEXT:    shrl $2, %edi188; X64-NDD-NEXT:    andl $858993459, %edi # imm = 0x33333333189; X64-NDD-NEXT:    addl %edi, %eax190; X64-NDD-NEXT:    shrl $4, %eax, %ecx191; X64-NDD-NEXT:    addl %ecx, %eax192; X64-NDD-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F193; X64-NDD-NEXT:    imull $16843009, %eax, %eax # imm = 0x1010101194; X64-NDD-NEXT:    shrl $24, %eax195; X64-NDD-NEXT:    retq196  %cnt = tail call i32 @llvm.ctpop.i32(i32 %x)197  ret i32 %cnt198}199 200define i64 @cnt64(i64 %x) nounwind readnone {201; X86-NOSSE-LABEL: cnt64:202; X86-NOSSE:       # %bb.0:203; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax204; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx205; X86-NOSSE-NEXT:    movl %ecx, %edx206; X86-NOSSE-NEXT:    shrl %edx207; X86-NOSSE-NEXT:    andl $1431655765, %edx # imm = 0x55555555208; X86-NOSSE-NEXT:    subl %edx, %ecx209; X86-NOSSE-NEXT:    movl %ecx, %edx210; X86-NOSSE-NEXT:    andl $858993459, %edx # imm = 0x33333333211; X86-NOSSE-NEXT:    shrl $2, %ecx212; X86-NOSSE-NEXT:    andl $858993459, %ecx # imm = 0x33333333213; X86-NOSSE-NEXT:    addl %edx, %ecx214; X86-NOSSE-NEXT:    movl %ecx, %edx215; X86-NOSSE-NEXT:    shrl $4, %edx216; X86-NOSSE-NEXT:    addl %ecx, %edx217; X86-NOSSE-NEXT:    andl $252645135, %edx # imm = 0xF0F0F0F218; X86-NOSSE-NEXT:    imull $16843009, %edx, %ecx # imm = 0x1010101219; X86-NOSSE-NEXT:    shrl $24, %ecx220; X86-NOSSE-NEXT:    movl %eax, %edx221; X86-NOSSE-NEXT:    shrl %edx222; X86-NOSSE-NEXT:    andl $1431655765, %edx # imm = 0x55555555223; X86-NOSSE-NEXT:    subl %edx, %eax224; X86-NOSSE-NEXT:    movl %eax, %edx225; X86-NOSSE-NEXT:    andl $858993459, %edx # imm = 0x33333333226; X86-NOSSE-NEXT:    shrl $2, %eax227; X86-NOSSE-NEXT:    andl $858993459, %eax # imm = 0x33333333228; X86-NOSSE-NEXT:    addl %edx, %eax229; X86-NOSSE-NEXT:    movl %eax, %edx230; X86-NOSSE-NEXT:    shrl $4, %edx231; X86-NOSSE-NEXT:    addl %eax, %edx232; X86-NOSSE-NEXT:    andl $252645135, %edx # imm = 0xF0F0F0F233; X86-NOSSE-NEXT:    imull $16843009, %edx, %eax # imm = 0x1010101234; X86-NOSSE-NEXT:    shrl $24, %eax235; X86-NOSSE-NEXT:    addl %ecx, %eax236; X86-NOSSE-NEXT:    xorl %edx, %edx237; X86-NOSSE-NEXT:    retl238;239; X64-BASE-LABEL: cnt64:240; X64-BASE:       # %bb.0:241; X64-BASE-NEXT:    movq %rdi, %rax242; X64-BASE-NEXT:    shrq %rax243; X64-BASE-NEXT:    movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555244; X64-BASE-NEXT:    andq %rax, %rcx245; X64-BASE-NEXT:    subq %rcx, %rdi246; X64-BASE-NEXT:    movabsq $3689348814741910323, %rax # imm = 0x3333333333333333247; X64-BASE-NEXT:    movq %rdi, %rcx248; X64-BASE-NEXT:    andq %rax, %rcx249; X64-BASE-NEXT:    shrq $2, %rdi250; X64-BASE-NEXT:    andq %rdi, %rax251; X64-BASE-NEXT:    addq %rcx, %rax252; X64-BASE-NEXT:    movq %rax, %rcx253; X64-BASE-NEXT:    shrq $4, %rcx254; X64-BASE-NEXT:    addq %rax, %rcx255; X64-BASE-NEXT:    movabsq $1085102592571150095, %rdx # imm = 0xF0F0F0F0F0F0F0F256; X64-BASE-NEXT:    andq %rcx, %rdx257; X64-BASE-NEXT:    movabsq $72340172838076673, %rax # imm = 0x101010101010101258; X64-BASE-NEXT:    imulq %rdx, %rax259; X64-BASE-NEXT:    shrq $56, %rax260; X64-BASE-NEXT:    retq261;262; X86-POPCNT-LABEL: cnt64:263; X86-POPCNT:       # %bb.0:264; X86-POPCNT-NEXT:    popcntl {{[0-9]+}}(%esp), %ecx265; X86-POPCNT-NEXT:    popcntl {{[0-9]+}}(%esp), %eax266; X86-POPCNT-NEXT:    addl %ecx, %eax267; X86-POPCNT-NEXT:    xorl %edx, %edx268; X86-POPCNT-NEXT:    retl269;270; X64-POPCNT-LABEL: cnt64:271; X64-POPCNT:       # %bb.0:272; X64-POPCNT-NEXT:    popcntq %rdi, %rax273; X64-POPCNT-NEXT:    retq274;275; X64-NDD-LABEL: cnt64:276; X64-NDD:       # %bb.0:277; X64-NDD-NEXT:    shrq %rdi, %rax278; X64-NDD-NEXT:    movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555279; X64-NDD-NEXT:    andq %rcx, %rax280; X64-NDD-NEXT:    subq %rax, %rdi281; X64-NDD-NEXT:    movabsq $3689348814741910323, %rax # imm = 0x3333333333333333282; X64-NDD-NEXT:    andq %rax, %rdi, %rcx283; X64-NDD-NEXT:    shrq $2, %rdi284; X64-NDD-NEXT:    andq %rdi, %rax285; X64-NDD-NEXT:    addq %rcx, %rax286; X64-NDD-NEXT:    shrq $4, %rax, %rcx287; X64-NDD-NEXT:    addq %rcx, %rax288; X64-NDD-NEXT:    movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F289; X64-NDD-NEXT:    andq %rcx, %rax290; X64-NDD-NEXT:    movabsq $72340172838076673, %rcx # imm = 0x101010101010101291; X64-NDD-NEXT:    imulq %rcx, %rax292; X64-NDD-NEXT:    shrq $56, %rax293; X64-NDD-NEXT:    retq294;295; X86-SSE2-LABEL: cnt64:296; X86-SSE2:       # %bb.0:297; X86-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero298; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1299; X86-SSE2-NEXT:    psrlw $1, %xmm1300; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1301; X86-SSE2-NEXT:    psubb %xmm1, %xmm0302; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]303; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2304; X86-SSE2-NEXT:    pand %xmm1, %xmm2305; X86-SSE2-NEXT:    psrlw $2, %xmm0306; X86-SSE2-NEXT:    pand %xmm1, %xmm0307; X86-SSE2-NEXT:    paddb %xmm2, %xmm0308; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1309; X86-SSE2-NEXT:    psrlw $4, %xmm1310; X86-SSE2-NEXT:    paddb %xmm0, %xmm1311; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1312; X86-SSE2-NEXT:    pxor %xmm0, %xmm0313; X86-SSE2-NEXT:    psadbw %xmm1, %xmm0314; X86-SSE2-NEXT:    movd %xmm0, %eax315; X86-SSE2-NEXT:    xorl %edx, %edx316; X86-SSE2-NEXT:    retl317;318; X86-SSSE3-LABEL: cnt64:319; X86-SSSE3:       # %bb.0:320; X86-SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]321; X86-SSSE3-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero322; X86-SSSE3-NEXT:    movdqa %xmm1, %xmm2323; X86-SSSE3-NEXT:    pand %xmm0, %xmm2324; X86-SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]325; X86-SSSE3-NEXT:    movdqa %xmm3, %xmm4326; X86-SSSE3-NEXT:    pshufb %xmm2, %xmm4327; X86-SSSE3-NEXT:    psrlw $4, %xmm1328; X86-SSSE3-NEXT:    pand %xmm0, %xmm1329; X86-SSSE3-NEXT:    pshufb %xmm1, %xmm3330; X86-SSSE3-NEXT:    paddb %xmm4, %xmm3331; X86-SSSE3-NEXT:    pxor %xmm0, %xmm0332; X86-SSSE3-NEXT:    psadbw %xmm3, %xmm0333; X86-SSSE3-NEXT:    movd %xmm0, %eax334; X86-SSSE3-NEXT:    xorl %edx, %edx335; X86-SSSE3-NEXT:    retl336  %cnt = tail call i64 @llvm.ctpop.i64(i64 %x)337  ret i64 %cnt338}339 340define i128 @cnt128(i128 %x) nounwind readnone {341; X86-NOSSE-LABEL: cnt128:342; X86-NOSSE:       # %bb.0:343; X86-NOSSE-NEXT:    pushl %ebp344; X86-NOSSE-NEXT:    movl %esp, %ebp345; X86-NOSSE-NEXT:    pushl %edi346; X86-NOSSE-NEXT:    pushl %esi347; X86-NOSSE-NEXT:    andl $-16, %esp348; X86-NOSSE-NEXT:    movl 24(%ebp), %eax349; X86-NOSSE-NEXT:    movl 32(%ebp), %ecx350; X86-NOSSE-NEXT:    movl 36(%ebp), %esi351; X86-NOSSE-NEXT:    movl %esi, %edx352; X86-NOSSE-NEXT:    shrl %edx353; X86-NOSSE-NEXT:    andl $1431655765, %edx # imm = 0x55555555354; X86-NOSSE-NEXT:    subl %edx, %esi355; X86-NOSSE-NEXT:    movl %esi, %edx356; X86-NOSSE-NEXT:    andl $858993459, %edx # imm = 0x33333333357; X86-NOSSE-NEXT:    shrl $2, %esi358; X86-NOSSE-NEXT:    andl $858993459, %esi # imm = 0x33333333359; X86-NOSSE-NEXT:    addl %edx, %esi360; X86-NOSSE-NEXT:    movl %esi, %edx361; X86-NOSSE-NEXT:    shrl $4, %edx362; X86-NOSSE-NEXT:    addl %esi, %edx363; X86-NOSSE-NEXT:    movl %ecx, %esi364; X86-NOSSE-NEXT:    shrl %esi365; X86-NOSSE-NEXT:    andl $1431655765, %esi # imm = 0x55555555366; X86-NOSSE-NEXT:    subl %esi, %ecx367; X86-NOSSE-NEXT:    movl %ecx, %esi368; X86-NOSSE-NEXT:    andl $858993459, %esi # imm = 0x33333333369; X86-NOSSE-NEXT:    shrl $2, %ecx370; X86-NOSSE-NEXT:    andl $858993459, %ecx # imm = 0x33333333371; X86-NOSSE-NEXT:    addl %esi, %ecx372; X86-NOSSE-NEXT:    movl %ecx, %edi373; X86-NOSSE-NEXT:    shrl $4, %edi374; X86-NOSSE-NEXT:    addl %ecx, %edi375; X86-NOSSE-NEXT:    movl 28(%ebp), %esi376; X86-NOSSE-NEXT:    andl $252645135, %edx # imm = 0xF0F0F0F377; X86-NOSSE-NEXT:    imull $16843009, %edx, %edx # imm = 0x1010101378; X86-NOSSE-NEXT:    shrl $24, %edx379; X86-NOSSE-NEXT:    andl $252645135, %edi # imm = 0xF0F0F0F380; X86-NOSSE-NEXT:    imull $16843009, %edi, %ecx # imm = 0x1010101381; X86-NOSSE-NEXT:    shrl $24, %ecx382; X86-NOSSE-NEXT:    addl %edx, %ecx383; X86-NOSSE-NEXT:    movl %esi, %edx384; X86-NOSSE-NEXT:    shrl %edx385; X86-NOSSE-NEXT:    andl $1431655765, %edx # imm = 0x55555555386; X86-NOSSE-NEXT:    subl %edx, %esi387; X86-NOSSE-NEXT:    movl %esi, %edx388; X86-NOSSE-NEXT:    andl $858993459, %edx # imm = 0x33333333389; X86-NOSSE-NEXT:    shrl $2, %esi390; X86-NOSSE-NEXT:    andl $858993459, %esi # imm = 0x33333333391; X86-NOSSE-NEXT:    addl %edx, %esi392; X86-NOSSE-NEXT:    movl %esi, %edx393; X86-NOSSE-NEXT:    shrl $4, %edx394; X86-NOSSE-NEXT:    addl %esi, %edx395; X86-NOSSE-NEXT:    movl %eax, %esi396; X86-NOSSE-NEXT:    shrl %esi397; X86-NOSSE-NEXT:    andl $1431655765, %esi # imm = 0x55555555398; X86-NOSSE-NEXT:    subl %esi, %eax399; X86-NOSSE-NEXT:    movl %eax, %esi400; X86-NOSSE-NEXT:    andl $858993459, %esi # imm = 0x33333333401; X86-NOSSE-NEXT:    shrl $2, %eax402; X86-NOSSE-NEXT:    andl $858993459, %eax # imm = 0x33333333403; X86-NOSSE-NEXT:    addl %esi, %eax404; X86-NOSSE-NEXT:    movl %eax, %esi405; X86-NOSSE-NEXT:    shrl $4, %esi406; X86-NOSSE-NEXT:    addl %eax, %esi407; X86-NOSSE-NEXT:    andl $252645135, %edx # imm = 0xF0F0F0F408; X86-NOSSE-NEXT:    imull $16843009, %edx, %eax # imm = 0x1010101409; X86-NOSSE-NEXT:    shrl $24, %eax410; X86-NOSSE-NEXT:    andl $252645135, %esi # imm = 0xF0F0F0F411; X86-NOSSE-NEXT:    imull $16843009, %esi, %edx # imm = 0x1010101412; X86-NOSSE-NEXT:    shrl $24, %edx413; X86-NOSSE-NEXT:    addl %eax, %edx414; X86-NOSSE-NEXT:    addl %ecx, %edx415; X86-NOSSE-NEXT:    movl 8(%ebp), %eax416; X86-NOSSE-NEXT:    movl %edx, (%eax)417; X86-NOSSE-NEXT:    movl $0, 12(%eax)418; X86-NOSSE-NEXT:    movl $0, 8(%eax)419; X86-NOSSE-NEXT:    movl $0, 4(%eax)420; X86-NOSSE-NEXT:    leal -8(%ebp), %esp421; X86-NOSSE-NEXT:    popl %esi422; X86-NOSSE-NEXT:    popl %edi423; X86-NOSSE-NEXT:    popl %ebp424; X86-NOSSE-NEXT:    retl $4425;426; X64-BASE-LABEL: cnt128:427; X64-BASE:       # %bb.0:428; X64-BASE-NEXT:    movq %rsi, %rax429; X64-BASE-NEXT:    shrq %rax430; X64-BASE-NEXT:    movabsq $6148914691236517205, %r8 # imm = 0x5555555555555555431; X64-BASE-NEXT:    andq %r8, %rax432; X64-BASE-NEXT:    subq %rax, %rsi433; X64-BASE-NEXT:    movabsq $3689348814741910323, %rcx # imm = 0x3333333333333333434; X64-BASE-NEXT:    movq %rsi, %rax435; X64-BASE-NEXT:    andq %rcx, %rax436; X64-BASE-NEXT:    shrq $2, %rsi437; X64-BASE-NEXT:    andq %rcx, %rsi438; X64-BASE-NEXT:    addq %rsi, %rax439; X64-BASE-NEXT:    movq %rax, %rdx440; X64-BASE-NEXT:    shrq $4, %rdx441; X64-BASE-NEXT:    addq %rax, %rdx442; X64-BASE-NEXT:    movabsq $1085102592571150095, %rsi # imm = 0xF0F0F0F0F0F0F0F443; X64-BASE-NEXT:    andq %rsi, %rdx444; X64-BASE-NEXT:    movabsq $72340172838076673, %r9 # imm = 0x101010101010101445; X64-BASE-NEXT:    imulq %r9, %rdx446; X64-BASE-NEXT:    shrq $56, %rdx447; X64-BASE-NEXT:    movq %rdi, %rax448; X64-BASE-NEXT:    shrq %rax449; X64-BASE-NEXT:    andq %r8, %rax450; X64-BASE-NEXT:    subq %rax, %rdi451; X64-BASE-NEXT:    movq %rdi, %rax452; X64-BASE-NEXT:    andq %rcx, %rax453; X64-BASE-NEXT:    shrq $2, %rdi454; X64-BASE-NEXT:    andq %rdi, %rcx455; X64-BASE-NEXT:    addq %rax, %rcx456; X64-BASE-NEXT:    movq %rcx, %rax457; X64-BASE-NEXT:    shrq $4, %rax458; X64-BASE-NEXT:    addq %rcx, %rax459; X64-BASE-NEXT:    andq %rsi, %rax460; X64-BASE-NEXT:    imulq %r9, %rax461; X64-BASE-NEXT:    shrq $56, %rax462; X64-BASE-NEXT:    addq %rdx, %rax463; X64-BASE-NEXT:    xorl %edx, %edx464; X64-BASE-NEXT:    retq465;466; X86-POPCNT-LABEL: cnt128:467; X86-POPCNT:       # %bb.0:468; X86-POPCNT-NEXT:    pushl %ebp469; X86-POPCNT-NEXT:    movl %esp, %ebp470; X86-POPCNT-NEXT:    pushl %esi471; X86-POPCNT-NEXT:    andl $-16, %esp472; X86-POPCNT-NEXT:    subl $16, %esp473; X86-POPCNT-NEXT:    movl 8(%ebp), %eax474; X86-POPCNT-NEXT:    popcntl 36(%ebp), %ecx475; X86-POPCNT-NEXT:    popcntl 32(%ebp), %edx476; X86-POPCNT-NEXT:    addl %ecx, %edx477; X86-POPCNT-NEXT:    popcntl 28(%ebp), %ecx478; X86-POPCNT-NEXT:    popcntl 24(%ebp), %esi479; X86-POPCNT-NEXT:    addl %ecx, %esi480; X86-POPCNT-NEXT:    addl %edx, %esi481; X86-POPCNT-NEXT:    movl %esi, (%eax)482; X86-POPCNT-NEXT:    movl $0, 12(%eax)483; X86-POPCNT-NEXT:    movl $0, 8(%eax)484; X86-POPCNT-NEXT:    movl $0, 4(%eax)485; X86-POPCNT-NEXT:    leal -4(%ebp), %esp486; X86-POPCNT-NEXT:    popl %esi487; X86-POPCNT-NEXT:    popl %ebp488; X86-POPCNT-NEXT:    retl $4489;490; X64-POPCNT-LABEL: cnt128:491; X64-POPCNT:       # %bb.0:492; X64-POPCNT-NEXT:    popcntq %rsi, %rcx493; X64-POPCNT-NEXT:    popcntq %rdi, %rax494; X64-POPCNT-NEXT:    addq %rcx, %rax495; X64-POPCNT-NEXT:    xorl %edx, %edx496; X64-POPCNT-NEXT:    retq497;498; X64-NDD-LABEL: cnt128:499; X64-NDD:       # %bb.0:500; X64-NDD-NEXT:    shrq %rsi, %rax501; X64-NDD-NEXT:    movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555502; X64-NDD-NEXT:    andq %rcx, %rax503; X64-NDD-NEXT:    subq %rax, %rsi504; X64-NDD-NEXT:    movabsq $3689348814741910323, %rax # imm = 0x3333333333333333505; X64-NDD-NEXT:    andq %rax, %rsi, %rdx506; X64-NDD-NEXT:    shrq $2, %rsi507; X64-NDD-NEXT:    andq %rax, %rsi508; X64-NDD-NEXT:    addq %rsi, %rdx509; X64-NDD-NEXT:    shrq $4, %rdx, %rsi510; X64-NDD-NEXT:    addq %rsi, %rdx511; X64-NDD-NEXT:    movabsq $1085102592571150095, %rsi # imm = 0xF0F0F0F0F0F0F0F512; X64-NDD-NEXT:    andq %rsi, %rdx513; X64-NDD-NEXT:    movabsq $72340172838076673, %r8 # imm = 0x101010101010101514; X64-NDD-NEXT:    imulq %r8, %rdx515; X64-NDD-NEXT:    shrq $56, %rdx516; X64-NDD-NEXT:    shrq %rdi, %r9517; X64-NDD-NEXT:    andq %r9, %rcx518; X64-NDD-NEXT:    subq %rcx, %rdi519; X64-NDD-NEXT:    andq %rax, %rdi, %rcx520; X64-NDD-NEXT:    shrq $2, %rdi521; X64-NDD-NEXT:    andq %rdi, %rax522; X64-NDD-NEXT:    addq %rcx, %rax523; X64-NDD-NEXT:    shrq $4, %rax, %rcx524; X64-NDD-NEXT:    addq %rcx, %rax525; X64-NDD-NEXT:    andq %rsi, %rax526; X64-NDD-NEXT:    imulq %r8, %rax527; X64-NDD-NEXT:    shrq $56, %rax528; X64-NDD-NEXT:    addq %rdx, %rax529; X64-NDD-NEXT:    xorl %edx, %edx530; X64-NDD-NEXT:    retq531;532; X86-SSE2-LABEL: cnt128:533; X86-SSE2:       # %bb.0:534; X86-SSE2-NEXT:    pushl %ebp535; X86-SSE2-NEXT:    movl %esp, %ebp536; X86-SSE2-NEXT:    andl $-16, %esp537; X86-SSE2-NEXT:    subl $16, %esp538; X86-SSE2-NEXT:    movl 8(%ebp), %eax539; X86-SSE2-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero540; X86-SSE2-NEXT:    movdqa %xmm2, %xmm0541; X86-SSE2-NEXT:    psrlw $1, %xmm0542; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]543; X86-SSE2-NEXT:    pand %xmm1, %xmm0544; X86-SSE2-NEXT:    psubb %xmm0, %xmm2545; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]546; X86-SSE2-NEXT:    movdqa %xmm2, %xmm3547; X86-SSE2-NEXT:    pand %xmm0, %xmm3548; X86-SSE2-NEXT:    psrlw $2, %xmm2549; X86-SSE2-NEXT:    pand %xmm0, %xmm2550; X86-SSE2-NEXT:    paddb %xmm3, %xmm2551; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4552; X86-SSE2-NEXT:    psrlw $4, %xmm4553; X86-SSE2-NEXT:    paddb %xmm2, %xmm4554; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]555; X86-SSE2-NEXT:    pand %xmm2, %xmm4556; X86-SSE2-NEXT:    pxor %xmm3, %xmm3557; X86-SSE2-NEXT:    psadbw %xmm3, %xmm4558; X86-SSE2-NEXT:    movd %xmm4, %ecx559; X86-SSE2-NEXT:    movq {{.*#+}} xmm4 = mem[0],zero560; X86-SSE2-NEXT:    movdqa %xmm4, %xmm5561; X86-SSE2-NEXT:    psrlw $1, %xmm5562; X86-SSE2-NEXT:    pand %xmm1, %xmm5563; X86-SSE2-NEXT:    psubb %xmm5, %xmm4564; X86-SSE2-NEXT:    movdqa %xmm4, %xmm1565; X86-SSE2-NEXT:    pand %xmm0, %xmm1566; X86-SSE2-NEXT:    psrlw $2, %xmm4567; X86-SSE2-NEXT:    pand %xmm0, %xmm4568; X86-SSE2-NEXT:    paddb %xmm1, %xmm4569; X86-SSE2-NEXT:    movdqa %xmm4, %xmm0570; X86-SSE2-NEXT:    psrlw $4, %xmm0571; X86-SSE2-NEXT:    paddb %xmm4, %xmm0572; X86-SSE2-NEXT:    pand %xmm2, %xmm0573; X86-SSE2-NEXT:    psadbw %xmm3, %xmm0574; X86-SSE2-NEXT:    movd %xmm0, %edx575; X86-SSE2-NEXT:    addl %ecx, %edx576; X86-SSE2-NEXT:    movl %edx, (%eax)577; X86-SSE2-NEXT:    movl $0, 12(%eax)578; X86-SSE2-NEXT:    movl $0, 8(%eax)579; X86-SSE2-NEXT:    movl $0, 4(%eax)580; X86-SSE2-NEXT:    movl %ebp, %esp581; X86-SSE2-NEXT:    popl %ebp582; X86-SSE2-NEXT:    retl $4583;584; X86-SSSE3-LABEL: cnt128:585; X86-SSSE3:       # %bb.0:586; X86-SSSE3-NEXT:    pushl %ebp587; X86-SSSE3-NEXT:    movl %esp, %ebp588; X86-SSSE3-NEXT:    andl $-16, %esp589; X86-SSSE3-NEXT:    subl $16, %esp590; X86-SSSE3-NEXT:    movl 8(%ebp), %eax591; X86-SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]592; X86-SSSE3-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero593; X86-SSSE3-NEXT:    movdqa %xmm2, %xmm3594; X86-SSSE3-NEXT:    pand %xmm1, %xmm3595; X86-SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]596; X86-SSSE3-NEXT:    movdqa %xmm0, %xmm4597; X86-SSSE3-NEXT:    pshufb %xmm3, %xmm4598; X86-SSSE3-NEXT:    psrlw $4, %xmm2599; X86-SSSE3-NEXT:    pand %xmm1, %xmm2600; X86-SSSE3-NEXT:    movdqa %xmm0, %xmm3601; X86-SSSE3-NEXT:    pshufb %xmm2, %xmm3602; X86-SSSE3-NEXT:    paddb %xmm4, %xmm3603; X86-SSSE3-NEXT:    pxor %xmm2, %xmm2604; X86-SSSE3-NEXT:    psadbw %xmm2, %xmm3605; X86-SSSE3-NEXT:    movd %xmm3, %ecx606; X86-SSSE3-NEXT:    movq {{.*#+}} xmm3 = mem[0],zero607; X86-SSSE3-NEXT:    movdqa %xmm3, %xmm4608; X86-SSSE3-NEXT:    pand %xmm1, %xmm4609; X86-SSSE3-NEXT:    movdqa %xmm0, %xmm5610; X86-SSSE3-NEXT:    pshufb %xmm4, %xmm5611; X86-SSSE3-NEXT:    psrlw $4, %xmm3612; X86-SSSE3-NEXT:    pand %xmm1, %xmm3613; X86-SSSE3-NEXT:    pshufb %xmm3, %xmm0614; X86-SSSE3-NEXT:    paddb %xmm5, %xmm0615; X86-SSSE3-NEXT:    psadbw %xmm2, %xmm0616; X86-SSSE3-NEXT:    movd %xmm0, %edx617; X86-SSSE3-NEXT:    addl %ecx, %edx618; X86-SSSE3-NEXT:    movl %edx, (%eax)619; X86-SSSE3-NEXT:    movl $0, 12(%eax)620; X86-SSSE3-NEXT:    movl $0, 8(%eax)621; X86-SSSE3-NEXT:    movl $0, 4(%eax)622; X86-SSSE3-NEXT:    movl %ebp, %esp623; X86-SSSE3-NEXT:    popl %ebp624; X86-SSSE3-NEXT:    retl $4625  %cnt = tail call i128 @llvm.ctpop.i128(i128 %x)626  ret i128 %cnt627}628 629define i64 @cnt64_noimplicitfloat(i64 %x) nounwind readnone noimplicitfloat  {630; X86-LABEL: cnt64_noimplicitfloat:631; X86:       # %bb.0:632; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax633; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx634; X86-NEXT:    movl %ecx, %edx635; X86-NEXT:    shrl %edx636; X86-NEXT:    andl $1431655765, %edx # imm = 0x55555555637; X86-NEXT:    subl %edx, %ecx638; X86-NEXT:    movl %ecx, %edx639; X86-NEXT:    andl $858993459, %edx # imm = 0x33333333640; X86-NEXT:    shrl $2, %ecx641; X86-NEXT:    andl $858993459, %ecx # imm = 0x33333333642; X86-NEXT:    addl %edx, %ecx643; X86-NEXT:    movl %ecx, %edx644; X86-NEXT:    shrl $4, %edx645; X86-NEXT:    addl %ecx, %edx646; X86-NEXT:    andl $252645135, %edx # imm = 0xF0F0F0F647; X86-NEXT:    imull $16843009, %edx, %ecx # imm = 0x1010101648; X86-NEXT:    shrl $24, %ecx649; X86-NEXT:    movl %eax, %edx650; X86-NEXT:    shrl %edx651; X86-NEXT:    andl $1431655765, %edx # imm = 0x55555555652; X86-NEXT:    subl %edx, %eax653; X86-NEXT:    movl %eax, %edx654; X86-NEXT:    andl $858993459, %edx # imm = 0x33333333655; X86-NEXT:    shrl $2, %eax656; X86-NEXT:    andl $858993459, %eax # imm = 0x33333333657; X86-NEXT:    addl %edx, %eax658; X86-NEXT:    movl %eax, %edx659; X86-NEXT:    shrl $4, %edx660; X86-NEXT:    addl %eax, %edx661; X86-NEXT:    andl $252645135, %edx # imm = 0xF0F0F0F662; X86-NEXT:    imull $16843009, %edx, %eax # imm = 0x1010101663; X86-NEXT:    shrl $24, %eax664; X86-NEXT:    addl %ecx, %eax665; X86-NEXT:    xorl %edx, %edx666; X86-NEXT:    retl667;668; X64-BASE-LABEL: cnt64_noimplicitfloat:669; X64-BASE:       # %bb.0:670; X64-BASE-NEXT:    movq %rdi, %rax671; X64-BASE-NEXT:    shrq %rax672; X64-BASE-NEXT:    movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555673; X64-BASE-NEXT:    andq %rax, %rcx674; X64-BASE-NEXT:    subq %rcx, %rdi675; X64-BASE-NEXT:    movabsq $3689348814741910323, %rax # imm = 0x3333333333333333676; X64-BASE-NEXT:    movq %rdi, %rcx677; X64-BASE-NEXT:    andq %rax, %rcx678; X64-BASE-NEXT:    shrq $2, %rdi679; X64-BASE-NEXT:    andq %rdi, %rax680; X64-BASE-NEXT:    addq %rcx, %rax681; X64-BASE-NEXT:    movq %rax, %rcx682; X64-BASE-NEXT:    shrq $4, %rcx683; X64-BASE-NEXT:    addq %rax, %rcx684; X64-BASE-NEXT:    movabsq $1085102592571150095, %rdx # imm = 0xF0F0F0F0F0F0F0F685; X64-BASE-NEXT:    andq %rcx, %rdx686; X64-BASE-NEXT:    movabsq $72340172838076673, %rax # imm = 0x101010101010101687; X64-BASE-NEXT:    imulq %rdx, %rax688; X64-BASE-NEXT:    shrq $56, %rax689; X64-BASE-NEXT:    retq690;691; X86-POPCNT-LABEL: cnt64_noimplicitfloat:692; X86-POPCNT:       # %bb.0:693; X86-POPCNT-NEXT:    popcntl {{[0-9]+}}(%esp), %ecx694; X86-POPCNT-NEXT:    popcntl {{[0-9]+}}(%esp), %eax695; X86-POPCNT-NEXT:    addl %ecx, %eax696; X86-POPCNT-NEXT:    xorl %edx, %edx697; X86-POPCNT-NEXT:    retl698;699; X64-POPCNT-LABEL: cnt64_noimplicitfloat:700; X64-POPCNT:       # %bb.0:701; X64-POPCNT-NEXT:    popcntq %rdi, %rax702; X64-POPCNT-NEXT:    retq703;704; X64-NDD-LABEL: cnt64_noimplicitfloat:705; X64-NDD:       # %bb.0:706; X64-NDD-NEXT:    shrq %rdi, %rax707; X64-NDD-NEXT:    movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555708; X64-NDD-NEXT:    andq %rcx, %rax709; X64-NDD-NEXT:    subq %rax, %rdi710; X64-NDD-NEXT:    movabsq $3689348814741910323, %rax # imm = 0x3333333333333333711; X64-NDD-NEXT:    andq %rax, %rdi, %rcx712; X64-NDD-NEXT:    shrq $2, %rdi713; X64-NDD-NEXT:    andq %rdi, %rax714; X64-NDD-NEXT:    addq %rcx, %rax715; X64-NDD-NEXT:    shrq $4, %rax, %rcx716; X64-NDD-NEXT:    addq %rcx, %rax717; X64-NDD-NEXT:    movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F718; X64-NDD-NEXT:    andq %rcx, %rax719; X64-NDD-NEXT:    movabsq $72340172838076673, %rcx # imm = 0x101010101010101720; X64-NDD-NEXT:    imulq %rcx, %rax721; X64-NDD-NEXT:    shrq $56, %rax722; X64-NDD-NEXT:    retq723  %cnt = tail call i64 @llvm.ctpop.i64(i64 %x)724  ret i64 %cnt725}726 727define i32 @cnt32_optsize(i32 %x) nounwind readnone optsize {728; X86-LABEL: cnt32_optsize:729; X86:       # %bb.0:730; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax731; X86-NEXT:    movl %eax, %ecx732; X86-NEXT:    shrl %ecx733; X86-NEXT:    andl $1431655765, %ecx # imm = 0x55555555734; X86-NEXT:    subl %ecx, %eax735; X86-NEXT:    movl $858993459, %ecx # imm = 0x33333333736; X86-NEXT:    movl %eax, %edx737; X86-NEXT:    andl %ecx, %edx738; X86-NEXT:    shrl $2, %eax739; X86-NEXT:    andl %ecx, %eax740; X86-NEXT:    addl %edx, %eax741; X86-NEXT:    movl %eax, %ecx742; X86-NEXT:    shrl $4, %ecx743; X86-NEXT:    addl %eax, %ecx744; X86-NEXT:    andl $252645135, %ecx # imm = 0xF0F0F0F745; X86-NEXT:    imull $16843009, %ecx, %eax # imm = 0x1010101746; X86-NEXT:    shrl $24, %eax747; X86-NEXT:    retl748;749; X64-BASE-LABEL: cnt32_optsize:750; X64-BASE:       # %bb.0:751; X64-BASE-NEXT:    movl %edi, %eax752; X64-BASE-NEXT:    shrl %eax753; X64-BASE-NEXT:    andl $1431655765, %eax # imm = 0x55555555754; X64-BASE-NEXT:    subl %eax, %edi755; X64-BASE-NEXT:    movl $858993459, %eax # imm = 0x33333333756; X64-BASE-NEXT:    movl %edi, %ecx757; X64-BASE-NEXT:    andl %eax, %ecx758; X64-BASE-NEXT:    shrl $2, %edi759; X64-BASE-NEXT:    andl %eax, %edi760; X64-BASE-NEXT:    addl %ecx, %edi761; X64-BASE-NEXT:    movl %edi, %eax762; X64-BASE-NEXT:    shrl $4, %eax763; X64-BASE-NEXT:    addl %edi, %eax764; X64-BASE-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F765; X64-BASE-NEXT:    imull $16843009, %eax, %eax # imm = 0x1010101766; X64-BASE-NEXT:    shrl $24, %eax767; X64-BASE-NEXT:    retq768;769; X86-POPCNT-LABEL: cnt32_optsize:770; X86-POPCNT:       # %bb.0:771; X86-POPCNT-NEXT:    popcntl {{[0-9]+}}(%esp), %eax772; X86-POPCNT-NEXT:    retl773;774; X64-POPCNT-LABEL: cnt32_optsize:775; X64-POPCNT:       # %bb.0:776; X64-POPCNT-NEXT:    popcntl %edi, %eax777; X64-POPCNT-NEXT:    retq778;779; X64-NDD-LABEL: cnt32_optsize:780; X64-NDD:       # %bb.0:781; X64-NDD-NEXT:    shrl %edi, %eax782; X64-NDD-NEXT:    andl $1431655765, %eax # imm = 0x55555555783; X64-NDD-NEXT:    subl %eax, %edi784; X64-NDD-NEXT:    movl $858993459, %eax # imm = 0x33333333785; X64-NDD-NEXT:    andl %eax, %edi, %ecx786; X64-NDD-NEXT:    shrl $2, %edi787; X64-NDD-NEXT:    andl %edi, %eax788; X64-NDD-NEXT:    addl %ecx, %eax789; X64-NDD-NEXT:    shrl $4, %eax, %ecx790; X64-NDD-NEXT:    addl %ecx, %eax791; X64-NDD-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F792; X64-NDD-NEXT:    imull $16843009, %eax, %eax # imm = 0x1010101793; X64-NDD-NEXT:    shrl $24, %eax794; X64-NDD-NEXT:    retq795  %cnt = tail call i32 @llvm.ctpop.i32(i32 %x)796  ret i32 %cnt797}798 799define i64 @cnt64_optsize(i64 %x) nounwind readnone optsize {800; X86-NOSSE-LABEL: cnt64_optsize:801; X86-NOSSE:       # %bb.0:802; X86-NOSSE-NEXT:    pushl %ebx803; X86-NOSSE-NEXT:    pushl %edi804; X86-NOSSE-NEXT:    pushl %esi805; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax806; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %esi807; X86-NOSSE-NEXT:    movl %esi, %ecx808; X86-NOSSE-NEXT:    shrl %ecx809; X86-NOSSE-NEXT:    movl $1431655765, %edx # imm = 0x55555555810; X86-NOSSE-NEXT:    andl %edx, %ecx811; X86-NOSSE-NEXT:    subl %ecx, %esi812; X86-NOSSE-NEXT:    movl $858993459, %ecx # imm = 0x33333333813; X86-NOSSE-NEXT:    movl %esi, %edi814; X86-NOSSE-NEXT:    andl %ecx, %edi815; X86-NOSSE-NEXT:    shrl $2, %esi816; X86-NOSSE-NEXT:    andl %ecx, %esi817; X86-NOSSE-NEXT:    addl %edi, %esi818; X86-NOSSE-NEXT:    movl %esi, %ebx819; X86-NOSSE-NEXT:    shrl $4, %ebx820; X86-NOSSE-NEXT:    addl %esi, %ebx821; X86-NOSSE-NEXT:    movl $252645135, %edi # imm = 0xF0F0F0F822; X86-NOSSE-NEXT:    andl %edi, %ebx823; X86-NOSSE-NEXT:    imull $16843009, %ebx, %esi # imm = 0x1010101824; X86-NOSSE-NEXT:    shrl $24, %esi825; X86-NOSSE-NEXT:    movl %eax, %ebx826; X86-NOSSE-NEXT:    shrl %ebx827; X86-NOSSE-NEXT:    andl %edx, %ebx828; X86-NOSSE-NEXT:    subl %ebx, %eax829; X86-NOSSE-NEXT:    movl %eax, %edx830; X86-NOSSE-NEXT:    andl %ecx, %edx831; X86-NOSSE-NEXT:    shrl $2, %eax832; X86-NOSSE-NEXT:    andl %ecx, %eax833; X86-NOSSE-NEXT:    addl %edx, %eax834; X86-NOSSE-NEXT:    movl %eax, %ecx835; X86-NOSSE-NEXT:    shrl $4, %ecx836; X86-NOSSE-NEXT:    addl %eax, %ecx837; X86-NOSSE-NEXT:    andl %edi, %ecx838; X86-NOSSE-NEXT:    imull $16843009, %ecx, %eax # imm = 0x1010101839; X86-NOSSE-NEXT:    shrl $24, %eax840; X86-NOSSE-NEXT:    addl %esi, %eax841; X86-NOSSE-NEXT:    xorl %edx, %edx842; X86-NOSSE-NEXT:    popl %esi843; X86-NOSSE-NEXT:    popl %edi844; X86-NOSSE-NEXT:    popl %ebx845; X86-NOSSE-NEXT:    retl846;847; X64-BASE-LABEL: cnt64_optsize:848; X64-BASE:       # %bb.0:849; X64-BASE-NEXT:    movq %rdi, %rax850; X64-BASE-NEXT:    shrq %rax851; X64-BASE-NEXT:    movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555852; X64-BASE-NEXT:    andq %rax, %rcx853; X64-BASE-NEXT:    subq %rcx, %rdi854; X64-BASE-NEXT:    movabsq $3689348814741910323, %rax # imm = 0x3333333333333333855; X64-BASE-NEXT:    movq %rdi, %rcx856; X64-BASE-NEXT:    andq %rax, %rcx857; X64-BASE-NEXT:    shrq $2, %rdi858; X64-BASE-NEXT:    andq %rdi, %rax859; X64-BASE-NEXT:    addq %rcx, %rax860; X64-BASE-NEXT:    movq %rax, %rcx861; X64-BASE-NEXT:    shrq $4, %rcx862; X64-BASE-NEXT:    addq %rax, %rcx863; X64-BASE-NEXT:    movabsq $1085102592571150095, %rdx # imm = 0xF0F0F0F0F0F0F0F864; X64-BASE-NEXT:    andq %rcx, %rdx865; X64-BASE-NEXT:    movabsq $72340172838076673, %rax # imm = 0x101010101010101866; X64-BASE-NEXT:    imulq %rdx, %rax867; X64-BASE-NEXT:    shrq $56, %rax868; X64-BASE-NEXT:    retq869;870; X86-POPCNT-LABEL: cnt64_optsize:871; X86-POPCNT:       # %bb.0:872; X86-POPCNT-NEXT:    popcntl {{[0-9]+}}(%esp), %ecx873; X86-POPCNT-NEXT:    popcntl {{[0-9]+}}(%esp), %eax874; X86-POPCNT-NEXT:    addl %ecx, %eax875; X86-POPCNT-NEXT:    xorl %edx, %edx876; X86-POPCNT-NEXT:    retl877;878; X64-POPCNT-LABEL: cnt64_optsize:879; X64-POPCNT:       # %bb.0:880; X64-POPCNT-NEXT:    popcntq %rdi, %rax881; X64-POPCNT-NEXT:    retq882;883; X64-NDD-LABEL: cnt64_optsize:884; X64-NDD:       # %bb.0:885; X64-NDD-NEXT:    shrq %rdi, %rax886; X64-NDD-NEXT:    movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555887; X64-NDD-NEXT:    andq %rcx, %rax888; X64-NDD-NEXT:    subq %rax, %rdi889; X64-NDD-NEXT:    movabsq $3689348814741910323, %rax # imm = 0x3333333333333333890; X64-NDD-NEXT:    andq %rax, %rdi, %rcx891; X64-NDD-NEXT:    shrq $2, %rdi892; X64-NDD-NEXT:    andq %rdi, %rax893; X64-NDD-NEXT:    addq %rcx, %rax894; X64-NDD-NEXT:    shrq $4, %rax, %rcx895; X64-NDD-NEXT:    addq %rcx, %rax896; X64-NDD-NEXT:    movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F897; X64-NDD-NEXT:    andq %rcx, %rax898; X64-NDD-NEXT:    movabsq $72340172838076673, %rcx # imm = 0x101010101010101899; X64-NDD-NEXT:    imulq %rcx, %rax900; X64-NDD-NEXT:    shrq $56, %rax901; X64-NDD-NEXT:    retq902;903; X86-SSE2-LABEL: cnt64_optsize:904; X86-SSE2:       # %bb.0:905; X86-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero906; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1907; X86-SSE2-NEXT:    psrlw $1, %xmm1908; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1909; X86-SSE2-NEXT:    psubb %xmm1, %xmm0910; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]911; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2912; X86-SSE2-NEXT:    pand %xmm1, %xmm2913; X86-SSE2-NEXT:    psrlw $2, %xmm0914; X86-SSE2-NEXT:    pand %xmm1, %xmm0915; X86-SSE2-NEXT:    paddb %xmm2, %xmm0916; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1917; X86-SSE2-NEXT:    psrlw $4, %xmm1918; X86-SSE2-NEXT:    paddb %xmm0, %xmm1919; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1920; X86-SSE2-NEXT:    pxor %xmm0, %xmm0921; X86-SSE2-NEXT:    psadbw %xmm1, %xmm0922; X86-SSE2-NEXT:    movd %xmm0, %eax923; X86-SSE2-NEXT:    xorl %edx, %edx924; X86-SSE2-NEXT:    retl925;926; X86-SSSE3-LABEL: cnt64_optsize:927; X86-SSSE3:       # %bb.0:928; X86-SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]929; X86-SSSE3-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero930; X86-SSSE3-NEXT:    movdqa %xmm1, %xmm2931; X86-SSSE3-NEXT:    pand %xmm0, %xmm2932; X86-SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]933; X86-SSSE3-NEXT:    movdqa %xmm3, %xmm4934; X86-SSSE3-NEXT:    pshufb %xmm2, %xmm4935; X86-SSSE3-NEXT:    psrlw $4, %xmm1936; X86-SSSE3-NEXT:    pand %xmm0, %xmm1937; X86-SSSE3-NEXT:    pshufb %xmm1, %xmm3938; X86-SSSE3-NEXT:    paddb %xmm4, %xmm3939; X86-SSSE3-NEXT:    pxor %xmm0, %xmm0940; X86-SSSE3-NEXT:    psadbw %xmm3, %xmm0941; X86-SSSE3-NEXT:    movd %xmm0, %eax942; X86-SSSE3-NEXT:    xorl %edx, %edx943; X86-SSSE3-NEXT:    retl944  %cnt = tail call i64 @llvm.ctpop.i64(i64 %x)945  ret i64 %cnt946}947 948define i128 @cnt128_optsize(i128 %x) nounwind readnone optsize {949; X86-NOSSE-LABEL: cnt128_optsize:950; X86-NOSSE:       # %bb.0:951; X86-NOSSE-NEXT:    pushl %ebp952; X86-NOSSE-NEXT:    movl %esp, %ebp953; X86-NOSSE-NEXT:    pushl %ebx954; X86-NOSSE-NEXT:    pushl %edi955; X86-NOSSE-NEXT:    pushl %esi956; X86-NOSSE-NEXT:    andl $-16, %esp957; X86-NOSSE-NEXT:    subl $16, %esp958; X86-NOSSE-NEXT:    movl 32(%ebp), %edx959; X86-NOSSE-NEXT:    movl 36(%ebp), %esi960; X86-NOSSE-NEXT:    movl %esi, %eax961; X86-NOSSE-NEXT:    shrl %eax962; X86-NOSSE-NEXT:    movl $1431655765, %ecx # imm = 0x55555555963; X86-NOSSE-NEXT:    andl %ecx, %eax964; X86-NOSSE-NEXT:    subl %eax, %esi965; X86-NOSSE-NEXT:    movl $858993459, %ecx # imm = 0x33333333966; X86-NOSSE-NEXT:    movl %esi, %edi967; X86-NOSSE-NEXT:    andl %ecx, %edi968; X86-NOSSE-NEXT:    shrl $2, %esi969; X86-NOSSE-NEXT:    andl %ecx, %esi970; X86-NOSSE-NEXT:    addl %edi, %esi971; X86-NOSSE-NEXT:    movl %esi, %edi972; X86-NOSSE-NEXT:    shrl $4, %edi973; X86-NOSSE-NEXT:    addl %esi, %edi974; X86-NOSSE-NEXT:    movl %edx, %esi975; X86-NOSSE-NEXT:    shrl %esi976; X86-NOSSE-NEXT:    movl $1431655765, %eax # imm = 0x55555555977; X86-NOSSE-NEXT:    andl %eax, %esi978; X86-NOSSE-NEXT:    subl %esi, %edx979; X86-NOSSE-NEXT:    movl %edx, %esi980; X86-NOSSE-NEXT:    andl %ecx, %esi981; X86-NOSSE-NEXT:    shrl $2, %edx982; X86-NOSSE-NEXT:    andl %ecx, %edx983; X86-NOSSE-NEXT:    addl %esi, %edx984; X86-NOSSE-NEXT:    movl %edx, %ebx985; X86-NOSSE-NEXT:    shrl $4, %ebx986; X86-NOSSE-NEXT:    addl %edx, %ebx987; X86-NOSSE-NEXT:    movl $252645135, %edx # imm = 0xF0F0F0F988; X86-NOSSE-NEXT:    andl %edx, %edi989; X86-NOSSE-NEXT:    imull $16843009, %edi, %edi # imm = 0x1010101990; X86-NOSSE-NEXT:    shrl $24, %edi991; X86-NOSSE-NEXT:    andl %edx, %ebx992; X86-NOSSE-NEXT:    imull $16843009, %ebx, %edx # imm = 0x1010101993; X86-NOSSE-NEXT:    shrl $24, %edx994; X86-NOSSE-NEXT:    addl %edi, %edx995; X86-NOSSE-NEXT:    movl 28(%ebp), %ebx996; X86-NOSSE-NEXT:    movl %ebx, %edi997; X86-NOSSE-NEXT:    shrl %edi998; X86-NOSSE-NEXT:    andl %eax, %edi999; X86-NOSSE-NEXT:    subl %edi, %ebx1000; X86-NOSSE-NEXT:    movl %ebx, %edi1001; X86-NOSSE-NEXT:    andl %ecx, %edi1002; X86-NOSSE-NEXT:    shrl $2, %ebx1003; X86-NOSSE-NEXT:    andl %ecx, %ebx1004; X86-NOSSE-NEXT:    addl %edi, %ebx1005; X86-NOSSE-NEXT:    movl %ebx, %edi1006; X86-NOSSE-NEXT:    shrl $4, %edi1007; X86-NOSSE-NEXT:    addl %ebx, %edi1008; X86-NOSSE-NEXT:    movl 24(%ebp), %eax1009; X86-NOSSE-NEXT:    movl %eax, %ebx1010; X86-NOSSE-NEXT:    shrl %ebx1011; X86-NOSSE-NEXT:    movl $1431655765, %esi # imm = 0x555555551012; X86-NOSSE-NEXT:    andl %esi, %ebx1013; X86-NOSSE-NEXT:    subl %ebx, %eax1014; X86-NOSSE-NEXT:    movl %eax, %ebx1015; X86-NOSSE-NEXT:    andl %ecx, %ebx1016; X86-NOSSE-NEXT:    shrl $2, %eax1017; X86-NOSSE-NEXT:    andl %ecx, %eax1018; X86-NOSSE-NEXT:    addl %ebx, %eax1019; X86-NOSSE-NEXT:    movl %eax, %ecx1020; X86-NOSSE-NEXT:    shrl $4, %ecx1021; X86-NOSSE-NEXT:    addl %eax, %ecx1022; X86-NOSSE-NEXT:    movl $252645135, %eax # imm = 0xF0F0F0F1023; X86-NOSSE-NEXT:    andl %eax, %edi1024; X86-NOSSE-NEXT:    andl %eax, %ecx1025; X86-NOSSE-NEXT:    imull $16843009, %edi, %eax # imm = 0x10101011026; X86-NOSSE-NEXT:    shrl $24, %eax1027; X86-NOSSE-NEXT:    imull $16843009, %ecx, %ecx # imm = 0x10101011028; X86-NOSSE-NEXT:    shrl $24, %ecx1029; X86-NOSSE-NEXT:    addl %eax, %ecx1030; X86-NOSSE-NEXT:    movl 8(%ebp), %eax1031; X86-NOSSE-NEXT:    addl %edx, %ecx1032; X86-NOSSE-NEXT:    xorl %edx, %edx1033; X86-NOSSE-NEXT:    movl %edx, 12(%eax)1034; X86-NOSSE-NEXT:    movl %edx, 8(%eax)1035; X86-NOSSE-NEXT:    movl %edx, 4(%eax)1036; X86-NOSSE-NEXT:    movl %ecx, (%eax)1037; X86-NOSSE-NEXT:    leal -12(%ebp), %esp1038; X86-NOSSE-NEXT:    popl %esi1039; X86-NOSSE-NEXT:    popl %edi1040; X86-NOSSE-NEXT:    popl %ebx1041; X86-NOSSE-NEXT:    popl %ebp1042; X86-NOSSE-NEXT:    retl $41043;1044; X64-BASE-LABEL: cnt128_optsize:1045; X64-BASE:       # %bb.0:1046; X64-BASE-NEXT:    movq %rsi, %rax1047; X64-BASE-NEXT:    shrq %rax1048; X64-BASE-NEXT:    movabsq $6148914691236517205, %r8 # imm = 0x55555555555555551049; X64-BASE-NEXT:    andq %r8, %rax1050; X64-BASE-NEXT:    subq %rax, %rsi1051; X64-BASE-NEXT:    movabsq $3689348814741910323, %rcx # imm = 0x33333333333333331052; X64-BASE-NEXT:    movq %rsi, %rax1053; X64-BASE-NEXT:    andq %rcx, %rax1054; X64-BASE-NEXT:    shrq $2, %rsi1055; X64-BASE-NEXT:    andq %rcx, %rsi1056; X64-BASE-NEXT:    addq %rsi, %rax1057; X64-BASE-NEXT:    movq %rax, %rdx1058; X64-BASE-NEXT:    shrq $4, %rdx1059; X64-BASE-NEXT:    addq %rax, %rdx1060; X64-BASE-NEXT:    movabsq $1085102592571150095, %rsi # imm = 0xF0F0F0F0F0F0F0F1061; X64-BASE-NEXT:    andq %rsi, %rdx1062; X64-BASE-NEXT:    movabsq $72340172838076673, %r9 # imm = 0x1010101010101011063; X64-BASE-NEXT:    imulq %r9, %rdx1064; X64-BASE-NEXT:    shrq $56, %rdx1065; X64-BASE-NEXT:    movq %rdi, %rax1066; X64-BASE-NEXT:    shrq %rax1067; X64-BASE-NEXT:    andq %r8, %rax1068; X64-BASE-NEXT:    subq %rax, %rdi1069; X64-BASE-NEXT:    movq %rdi, %rax1070; X64-BASE-NEXT:    andq %rcx, %rax1071; X64-BASE-NEXT:    shrq $2, %rdi1072; X64-BASE-NEXT:    andq %rdi, %rcx1073; X64-BASE-NEXT:    addq %rax, %rcx1074; X64-BASE-NEXT:    movq %rcx, %rax1075; X64-BASE-NEXT:    shrq $4, %rax1076; X64-BASE-NEXT:    addq %rcx, %rax1077; X64-BASE-NEXT:    andq %rsi, %rax1078; X64-BASE-NEXT:    imulq %r9, %rax1079; X64-BASE-NEXT:    shrq $56, %rax1080; X64-BASE-NEXT:    addq %rdx, %rax1081; X64-BASE-NEXT:    xorl %edx, %edx1082; X64-BASE-NEXT:    retq1083;1084; X86-POPCNT-LABEL: cnt128_optsize:1085; X86-POPCNT:       # %bb.0:1086; X86-POPCNT-NEXT:    pushl %ebp1087; X86-POPCNT-NEXT:    movl %esp, %ebp1088; X86-POPCNT-NEXT:    pushl %esi1089; X86-POPCNT-NEXT:    andl $-16, %esp1090; X86-POPCNT-NEXT:    subl $16, %esp1091; X86-POPCNT-NEXT:    movl 8(%ebp), %eax1092; X86-POPCNT-NEXT:    popcntl 36(%ebp), %ecx1093; X86-POPCNT-NEXT:    popcntl 32(%ebp), %edx1094; X86-POPCNT-NEXT:    addl %ecx, %edx1095; X86-POPCNT-NEXT:    popcntl 28(%ebp), %ecx1096; X86-POPCNT-NEXT:    popcntl 24(%ebp), %esi1097; X86-POPCNT-NEXT:    addl %ecx, %esi1098; X86-POPCNT-NEXT:    addl %edx, %esi1099; X86-POPCNT-NEXT:    xorl %ecx, %ecx1100; X86-POPCNT-NEXT:    movl %ecx, 12(%eax)1101; X86-POPCNT-NEXT:    movl %ecx, 8(%eax)1102; X86-POPCNT-NEXT:    movl %ecx, 4(%eax)1103; X86-POPCNT-NEXT:    movl %esi, (%eax)1104; X86-POPCNT-NEXT:    leal -4(%ebp), %esp1105; X86-POPCNT-NEXT:    popl %esi1106; X86-POPCNT-NEXT:    popl %ebp1107; X86-POPCNT-NEXT:    retl $41108;1109; X64-POPCNT-LABEL: cnt128_optsize:1110; X64-POPCNT:       # %bb.0:1111; X64-POPCNT-NEXT:    popcntq %rsi, %rcx1112; X64-POPCNT-NEXT:    popcntq %rdi, %rax1113; X64-POPCNT-NEXT:    addq %rcx, %rax1114; X64-POPCNT-NEXT:    xorl %edx, %edx1115; X64-POPCNT-NEXT:    retq1116;1117; X64-NDD-LABEL: cnt128_optsize:1118; X64-NDD:       # %bb.0:1119; X64-NDD-NEXT:    shrq %rsi, %rax1120; X64-NDD-NEXT:    movabsq $6148914691236517205, %rcx # imm = 0x55555555555555551121; X64-NDD-NEXT:    andq %rcx, %rax1122; X64-NDD-NEXT:    subq %rax, %rsi1123; X64-NDD-NEXT:    movabsq $3689348814741910323, %rax # imm = 0x33333333333333331124; X64-NDD-NEXT:    andq %rax, %rsi, %rdx1125; X64-NDD-NEXT:    shrq $2, %rsi1126; X64-NDD-NEXT:    andq %rax, %rsi1127; X64-NDD-NEXT:    addq %rsi, %rdx1128; X64-NDD-NEXT:    shrq $4, %rdx, %rsi1129; X64-NDD-NEXT:    addq %rsi, %rdx1130; X64-NDD-NEXT:    movabsq $1085102592571150095, %rsi # imm = 0xF0F0F0F0F0F0F0F1131; X64-NDD-NEXT:    andq %rsi, %rdx1132; X64-NDD-NEXT:    movabsq $72340172838076673, %r8 # imm = 0x1010101010101011133; X64-NDD-NEXT:    imulq %r8, %rdx1134; X64-NDD-NEXT:    shrq $56, %rdx1135; X64-NDD-NEXT:    shrq %rdi, %r91136; X64-NDD-NEXT:    andq %r9, %rcx1137; X64-NDD-NEXT:    subq %rcx, %rdi1138; X64-NDD-NEXT:    andq %rax, %rdi, %rcx1139; X64-NDD-NEXT:    shrq $2, %rdi1140; X64-NDD-NEXT:    andq %rdi, %rax1141; X64-NDD-NEXT:    addq %rcx, %rax1142; X64-NDD-NEXT:    shrq $4, %rax, %rcx1143; X64-NDD-NEXT:    addq %rcx, %rax1144; X64-NDD-NEXT:    andq %rsi, %rax1145; X64-NDD-NEXT:    imulq %r8, %rax1146; X64-NDD-NEXT:    shrq $56, %rax1147; X64-NDD-NEXT:    addq %rdx, %rax1148; X64-NDD-NEXT:    xorl %edx, %edx1149; X64-NDD-NEXT:    retq1150;1151; X86-SSE2-LABEL: cnt128_optsize:1152; X86-SSE2:       # %bb.0:1153; X86-SSE2-NEXT:    pushl %ebp1154; X86-SSE2-NEXT:    movl %esp, %ebp1155; X86-SSE2-NEXT:    andl $-16, %esp1156; X86-SSE2-NEXT:    subl $16, %esp1157; X86-SSE2-NEXT:    movl 8(%ebp), %eax1158; X86-SSE2-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero1159; X86-SSE2-NEXT:    movdqa %xmm2, %xmm01160; X86-SSE2-NEXT:    psrlw $1, %xmm01161; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]1162; X86-SSE2-NEXT:    pand %xmm1, %xmm01163; X86-SSE2-NEXT:    psubb %xmm0, %xmm21164; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]1165; X86-SSE2-NEXT:    movdqa %xmm2, %xmm31166; X86-SSE2-NEXT:    pand %xmm0, %xmm31167; X86-SSE2-NEXT:    psrlw $2, %xmm21168; X86-SSE2-NEXT:    pand %xmm0, %xmm21169; X86-SSE2-NEXT:    paddb %xmm3, %xmm21170; X86-SSE2-NEXT:    movdqa %xmm2, %xmm41171; X86-SSE2-NEXT:    psrlw $4, %xmm41172; X86-SSE2-NEXT:    paddb %xmm2, %xmm41173; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1174; X86-SSE2-NEXT:    pand %xmm2, %xmm41175; X86-SSE2-NEXT:    pxor %xmm3, %xmm31176; X86-SSE2-NEXT:    psadbw %xmm3, %xmm41177; X86-SSE2-NEXT:    movd %xmm4, %ecx1178; X86-SSE2-NEXT:    movq {{.*#+}} xmm4 = mem[0],zero1179; X86-SSE2-NEXT:    movdqa %xmm4, %xmm51180; X86-SSE2-NEXT:    psrlw $1, %xmm51181; X86-SSE2-NEXT:    pand %xmm1, %xmm51182; X86-SSE2-NEXT:    psubb %xmm5, %xmm41183; X86-SSE2-NEXT:    movdqa %xmm4, %xmm11184; X86-SSE2-NEXT:    pand %xmm0, %xmm11185; X86-SSE2-NEXT:    psrlw $2, %xmm41186; X86-SSE2-NEXT:    pand %xmm0, %xmm41187; X86-SSE2-NEXT:    paddb %xmm1, %xmm41188; X86-SSE2-NEXT:    movdqa %xmm4, %xmm01189; X86-SSE2-NEXT:    psrlw $4, %xmm01190; X86-SSE2-NEXT:    paddb %xmm4, %xmm01191; X86-SSE2-NEXT:    pand %xmm2, %xmm01192; X86-SSE2-NEXT:    psadbw %xmm3, %xmm01193; X86-SSE2-NEXT:    movd %xmm0, %edx1194; X86-SSE2-NEXT:    addl %ecx, %edx1195; X86-SSE2-NEXT:    xorl %ecx, %ecx1196; X86-SSE2-NEXT:    movl %ecx, 12(%eax)1197; X86-SSE2-NEXT:    movl %ecx, 8(%eax)1198; X86-SSE2-NEXT:    movl %ecx, 4(%eax)1199; X86-SSE2-NEXT:    movl %edx, (%eax)1200; X86-SSE2-NEXT:    movl %ebp, %esp1201; X86-SSE2-NEXT:    popl %ebp1202; X86-SSE2-NEXT:    retl $41203;1204; X86-SSSE3-LABEL: cnt128_optsize:1205; X86-SSSE3:       # %bb.0:1206; X86-SSSE3-NEXT:    pushl %ebp1207; X86-SSSE3-NEXT:    movl %esp, %ebp1208; X86-SSSE3-NEXT:    andl $-16, %esp1209; X86-SSSE3-NEXT:    subl $16, %esp1210; X86-SSSE3-NEXT:    movl 8(%ebp), %eax1211; X86-SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1212; X86-SSSE3-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero1213; X86-SSSE3-NEXT:    movdqa %xmm2, %xmm31214; X86-SSSE3-NEXT:    pand %xmm1, %xmm31215; X86-SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1216; X86-SSSE3-NEXT:    movdqa %xmm0, %xmm41217; X86-SSSE3-NEXT:    pshufb %xmm3, %xmm41218; X86-SSSE3-NEXT:    psrlw $4, %xmm21219; X86-SSSE3-NEXT:    pand %xmm1, %xmm21220; X86-SSSE3-NEXT:    movdqa %xmm0, %xmm31221; X86-SSSE3-NEXT:    pshufb %xmm2, %xmm31222; X86-SSSE3-NEXT:    paddb %xmm4, %xmm31223; X86-SSSE3-NEXT:    pxor %xmm2, %xmm21224; X86-SSSE3-NEXT:    psadbw %xmm2, %xmm31225; X86-SSSE3-NEXT:    movd %xmm3, %ecx1226; X86-SSSE3-NEXT:    movq {{.*#+}} xmm3 = mem[0],zero1227; X86-SSSE3-NEXT:    movdqa %xmm3, %xmm41228; X86-SSSE3-NEXT:    pand %xmm1, %xmm41229; X86-SSSE3-NEXT:    movdqa %xmm0, %xmm51230; X86-SSSE3-NEXT:    pshufb %xmm4, %xmm51231; X86-SSSE3-NEXT:    psrlw $4, %xmm31232; X86-SSSE3-NEXT:    pand %xmm1, %xmm31233; X86-SSSE3-NEXT:    pshufb %xmm3, %xmm01234; X86-SSSE3-NEXT:    paddb %xmm5, %xmm01235; X86-SSSE3-NEXT:    psadbw %xmm2, %xmm01236; X86-SSSE3-NEXT:    movd %xmm0, %edx1237; X86-SSSE3-NEXT:    addl %ecx, %edx1238; X86-SSSE3-NEXT:    xorl %ecx, %ecx1239; X86-SSSE3-NEXT:    movl %ecx, 12(%eax)1240; X86-SSSE3-NEXT:    movl %ecx, 8(%eax)1241; X86-SSSE3-NEXT:    movl %ecx, 4(%eax)1242; X86-SSSE3-NEXT:    movl %edx, (%eax)1243; X86-SSSE3-NEXT:    movl %ebp, %esp1244; X86-SSSE3-NEXT:    popl %ebp1245; X86-SSSE3-NEXT:    retl $41246  %cnt = tail call i128 @llvm.ctpop.i128(i128 %x)1247  ret i128 %cnt1248}1249 1250define i32 @cnt32_pgso(i32 %x) nounwind readnone !prof !14 {1251; X86-LABEL: cnt32_pgso:1252; X86:       # %bb.0:1253; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1254; X86-NEXT:    movl %eax, %ecx1255; X86-NEXT:    shrl %ecx1256; X86-NEXT:    andl $1431655765, %ecx # imm = 0x555555551257; X86-NEXT:    subl %ecx, %eax1258; X86-NEXT:    movl %eax, %ecx1259; X86-NEXT:    andl $858993459, %ecx # imm = 0x333333331260; X86-NEXT:    shrl $2, %eax1261; X86-NEXT:    andl $858993459, %eax # imm = 0x333333331262; X86-NEXT:    addl %ecx, %eax1263; X86-NEXT:    movl %eax, %ecx1264; X86-NEXT:    shrl $4, %ecx1265; X86-NEXT:    addl %eax, %ecx1266; X86-NEXT:    andl $252645135, %ecx # imm = 0xF0F0F0F1267; X86-NEXT:    imull $16843009, %ecx, %eax # imm = 0x10101011268; X86-NEXT:    shrl $24, %eax1269; X86-NEXT:    retl1270;1271; X64-BASE-LABEL: cnt32_pgso:1272; X64-BASE:       # %bb.0:1273; X64-BASE-NEXT:    movl %edi, %eax1274; X64-BASE-NEXT:    shrl %eax1275; X64-BASE-NEXT:    andl $1431655765, %eax # imm = 0x555555551276; X64-BASE-NEXT:    subl %eax, %edi1277; X64-BASE-NEXT:    movl %edi, %eax1278; X64-BASE-NEXT:    andl $858993459, %eax # imm = 0x333333331279; X64-BASE-NEXT:    shrl $2, %edi1280; X64-BASE-NEXT:    andl $858993459, %edi # imm = 0x333333331281; X64-BASE-NEXT:    addl %eax, %edi1282; X64-BASE-NEXT:    movl %edi, %eax1283; X64-BASE-NEXT:    shrl $4, %eax1284; X64-BASE-NEXT:    addl %edi, %eax1285; X64-BASE-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F1286; X64-BASE-NEXT:    imull $16843009, %eax, %eax # imm = 0x10101011287; X64-BASE-NEXT:    shrl $24, %eax1288; X64-BASE-NEXT:    retq1289;1290; X86-POPCNT-LABEL: cnt32_pgso:1291; X86-POPCNT:       # %bb.0:1292; X86-POPCNT-NEXT:    popcntl {{[0-9]+}}(%esp), %eax1293; X86-POPCNT-NEXT:    retl1294;1295; X64-POPCNT-LABEL: cnt32_pgso:1296; X64-POPCNT:       # %bb.0:1297; X64-POPCNT-NEXT:    popcntl %edi, %eax1298; X64-POPCNT-NEXT:    retq1299;1300; X64-NDD-LABEL: cnt32_pgso:1301; X64-NDD:       # %bb.0:1302; X64-NDD-NEXT:    shrl %edi, %eax1303; X64-NDD-NEXT:    andl $1431655765, %eax # imm = 0x555555551304; X64-NDD-NEXT:    subl %eax, %edi1305; X64-NDD-NEXT:    andl $858993459, %edi, %eax # imm = 0x333333331306; X64-NDD-NEXT:    shrl $2, %edi1307; X64-NDD-NEXT:    andl $858993459, %edi # imm = 0x333333331308; X64-NDD-NEXT:    addl %edi, %eax1309; X64-NDD-NEXT:    shrl $4, %eax, %ecx1310; X64-NDD-NEXT:    addl %ecx, %eax1311; X64-NDD-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F1312; X64-NDD-NEXT:    imull $16843009, %eax, %eax # imm = 0x10101011313; X64-NDD-NEXT:    shrl $24, %eax1314; X64-NDD-NEXT:    retq1315  %cnt = tail call i32 @llvm.ctpop.i32(i32 %x)1316  ret i32 %cnt1317}1318 1319define i64 @cnt64_pgso(i64 %x) nounwind readnone !prof !14 {1320; X86-NOSSE-LABEL: cnt64_pgso:1321; X86-NOSSE:       # %bb.0:1322; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax1323; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx1324; X86-NOSSE-NEXT:    movl %ecx, %edx1325; X86-NOSSE-NEXT:    shrl %edx1326; X86-NOSSE-NEXT:    andl $1431655765, %edx # imm = 0x555555551327; X86-NOSSE-NEXT:    subl %edx, %ecx1328; X86-NOSSE-NEXT:    movl %ecx, %edx1329; X86-NOSSE-NEXT:    andl $858993459, %edx # imm = 0x333333331330; X86-NOSSE-NEXT:    shrl $2, %ecx1331; X86-NOSSE-NEXT:    andl $858993459, %ecx # imm = 0x333333331332; X86-NOSSE-NEXT:    addl %edx, %ecx1333; X86-NOSSE-NEXT:    movl %ecx, %edx1334; X86-NOSSE-NEXT:    shrl $4, %edx1335; X86-NOSSE-NEXT:    addl %ecx, %edx1336; X86-NOSSE-NEXT:    andl $252645135, %edx # imm = 0xF0F0F0F1337; X86-NOSSE-NEXT:    imull $16843009, %edx, %ecx # imm = 0x10101011338; X86-NOSSE-NEXT:    shrl $24, %ecx1339; X86-NOSSE-NEXT:    movl %eax, %edx1340; X86-NOSSE-NEXT:    shrl %edx1341; X86-NOSSE-NEXT:    andl $1431655765, %edx # imm = 0x555555551342; X86-NOSSE-NEXT:    subl %edx, %eax1343; X86-NOSSE-NEXT:    movl %eax, %edx1344; X86-NOSSE-NEXT:    andl $858993459, %edx # imm = 0x333333331345; X86-NOSSE-NEXT:    shrl $2, %eax1346; X86-NOSSE-NEXT:    andl $858993459, %eax # imm = 0x333333331347; X86-NOSSE-NEXT:    addl %edx, %eax1348; X86-NOSSE-NEXT:    movl %eax, %edx1349; X86-NOSSE-NEXT:    shrl $4, %edx1350; X86-NOSSE-NEXT:    addl %eax, %edx1351; X86-NOSSE-NEXT:    andl $252645135, %edx # imm = 0xF0F0F0F1352; X86-NOSSE-NEXT:    imull $16843009, %edx, %eax # imm = 0x10101011353; X86-NOSSE-NEXT:    shrl $24, %eax1354; X86-NOSSE-NEXT:    addl %ecx, %eax1355; X86-NOSSE-NEXT:    xorl %edx, %edx1356; X86-NOSSE-NEXT:    retl1357;1358; X64-BASE-LABEL: cnt64_pgso:1359; X64-BASE:       # %bb.0:1360; X64-BASE-NEXT:    movq %rdi, %rax1361; X64-BASE-NEXT:    shrq %rax1362; X64-BASE-NEXT:    movabsq $6148914691236517205, %rcx # imm = 0x55555555555555551363; X64-BASE-NEXT:    andq %rax, %rcx1364; X64-BASE-NEXT:    subq %rcx, %rdi1365; X64-BASE-NEXT:    movabsq $3689348814741910323, %rax # imm = 0x33333333333333331366; X64-BASE-NEXT:    movq %rdi, %rcx1367; X64-BASE-NEXT:    andq %rax, %rcx1368; X64-BASE-NEXT:    shrq $2, %rdi1369; X64-BASE-NEXT:    andq %rdi, %rax1370; X64-BASE-NEXT:    addq %rcx, %rax1371; X64-BASE-NEXT:    movq %rax, %rcx1372; X64-BASE-NEXT:    shrq $4, %rcx1373; X64-BASE-NEXT:    addq %rax, %rcx1374; X64-BASE-NEXT:    movabsq $1085102592571150095, %rdx # imm = 0xF0F0F0F0F0F0F0F1375; X64-BASE-NEXT:    andq %rcx, %rdx1376; X64-BASE-NEXT:    movabsq $72340172838076673, %rax # imm = 0x1010101010101011377; X64-BASE-NEXT:    imulq %rdx, %rax1378; X64-BASE-NEXT:    shrq $56, %rax1379; X64-BASE-NEXT:    retq1380;1381; X86-POPCNT-LABEL: cnt64_pgso:1382; X86-POPCNT:       # %bb.0:1383; X86-POPCNT-NEXT:    popcntl {{[0-9]+}}(%esp), %ecx1384; X86-POPCNT-NEXT:    popcntl {{[0-9]+}}(%esp), %eax1385; X86-POPCNT-NEXT:    addl %ecx, %eax1386; X86-POPCNT-NEXT:    xorl %edx, %edx1387; X86-POPCNT-NEXT:    retl1388;1389; X64-POPCNT-LABEL: cnt64_pgso:1390; X64-POPCNT:       # %bb.0:1391; X64-POPCNT-NEXT:    popcntq %rdi, %rax1392; X64-POPCNT-NEXT:    retq1393;1394; X64-NDD-LABEL: cnt64_pgso:1395; X64-NDD:       # %bb.0:1396; X64-NDD-NEXT:    shrq %rdi, %rax1397; X64-NDD-NEXT:    movabsq $6148914691236517205, %rcx # imm = 0x55555555555555551398; X64-NDD-NEXT:    andq %rcx, %rax1399; X64-NDD-NEXT:    subq %rax, %rdi1400; X64-NDD-NEXT:    movabsq $3689348814741910323, %rax # imm = 0x33333333333333331401; X64-NDD-NEXT:    andq %rax, %rdi, %rcx1402; X64-NDD-NEXT:    shrq $2, %rdi1403; X64-NDD-NEXT:    andq %rdi, %rax1404; X64-NDD-NEXT:    addq %rcx, %rax1405; X64-NDD-NEXT:    shrq $4, %rax, %rcx1406; X64-NDD-NEXT:    addq %rcx, %rax1407; X64-NDD-NEXT:    movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F1408; X64-NDD-NEXT:    andq %rcx, %rax1409; X64-NDD-NEXT:    movabsq $72340172838076673, %rcx # imm = 0x1010101010101011410; X64-NDD-NEXT:    imulq %rcx, %rax1411; X64-NDD-NEXT:    shrq $56, %rax1412; X64-NDD-NEXT:    retq1413;1414; X86-SSE2-LABEL: cnt64_pgso:1415; X86-SSE2:       # %bb.0:1416; X86-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero1417; X86-SSE2-NEXT:    movdqa %xmm0, %xmm11418; X86-SSE2-NEXT:    psrlw $1, %xmm11419; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11420; X86-SSE2-NEXT:    psubb %xmm1, %xmm01421; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]1422; X86-SSE2-NEXT:    movdqa %xmm0, %xmm21423; X86-SSE2-NEXT:    pand %xmm1, %xmm21424; X86-SSE2-NEXT:    psrlw $2, %xmm01425; X86-SSE2-NEXT:    pand %xmm1, %xmm01426; X86-SSE2-NEXT:    paddb %xmm2, %xmm01427; X86-SSE2-NEXT:    movdqa %xmm0, %xmm11428; X86-SSE2-NEXT:    psrlw $4, %xmm11429; X86-SSE2-NEXT:    paddb %xmm0, %xmm11430; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11431; X86-SSE2-NEXT:    pxor %xmm0, %xmm01432; X86-SSE2-NEXT:    psadbw %xmm1, %xmm01433; X86-SSE2-NEXT:    movd %xmm0, %eax1434; X86-SSE2-NEXT:    xorl %edx, %edx1435; X86-SSE2-NEXT:    retl1436;1437; X86-SSSE3-LABEL: cnt64_pgso:1438; X86-SSSE3:       # %bb.0:1439; X86-SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1440; X86-SSSE3-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero1441; X86-SSSE3-NEXT:    movdqa %xmm1, %xmm21442; X86-SSSE3-NEXT:    pand %xmm0, %xmm21443; X86-SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1444; X86-SSSE3-NEXT:    movdqa %xmm3, %xmm41445; X86-SSSE3-NEXT:    pshufb %xmm2, %xmm41446; X86-SSSE3-NEXT:    psrlw $4, %xmm11447; X86-SSSE3-NEXT:    pand %xmm0, %xmm11448; X86-SSSE3-NEXT:    pshufb %xmm1, %xmm31449; X86-SSSE3-NEXT:    paddb %xmm4, %xmm31450; X86-SSSE3-NEXT:    pxor %xmm0, %xmm01451; X86-SSSE3-NEXT:    psadbw %xmm3, %xmm01452; X86-SSSE3-NEXT:    movd %xmm0, %eax1453; X86-SSSE3-NEXT:    xorl %edx, %edx1454; X86-SSSE3-NEXT:    retl1455  %cnt = tail call i64 @llvm.ctpop.i64(i64 %x)1456  ret i64 %cnt1457}1458 1459define i128 @cnt128_pgso(i128 %x) nounwind readnone !prof !14 {1460; X86-NOSSE-LABEL: cnt128_pgso:1461; X86-NOSSE:       # %bb.0:1462; X86-NOSSE-NEXT:    pushl %ebp1463; X86-NOSSE-NEXT:    movl %esp, %ebp1464; X86-NOSSE-NEXT:    pushl %edi1465; X86-NOSSE-NEXT:    pushl %esi1466; X86-NOSSE-NEXT:    andl $-16, %esp1467; X86-NOSSE-NEXT:    movl 24(%ebp), %eax1468; X86-NOSSE-NEXT:    movl 32(%ebp), %ecx1469; X86-NOSSE-NEXT:    movl 36(%ebp), %esi1470; X86-NOSSE-NEXT:    movl %esi, %edx1471; X86-NOSSE-NEXT:    shrl %edx1472; X86-NOSSE-NEXT:    andl $1431655765, %edx # imm = 0x555555551473; X86-NOSSE-NEXT:    subl %edx, %esi1474; X86-NOSSE-NEXT:    movl %esi, %edx1475; X86-NOSSE-NEXT:    andl $858993459, %edx # imm = 0x333333331476; X86-NOSSE-NEXT:    shrl $2, %esi1477; X86-NOSSE-NEXT:    andl $858993459, %esi # imm = 0x333333331478; X86-NOSSE-NEXT:    addl %edx, %esi1479; X86-NOSSE-NEXT:    movl %esi, %edx1480; X86-NOSSE-NEXT:    shrl $4, %edx1481; X86-NOSSE-NEXT:    addl %esi, %edx1482; X86-NOSSE-NEXT:    movl %ecx, %esi1483; X86-NOSSE-NEXT:    shrl %esi1484; X86-NOSSE-NEXT:    andl $1431655765, %esi # imm = 0x555555551485; X86-NOSSE-NEXT:    subl %esi, %ecx1486; X86-NOSSE-NEXT:    movl %ecx, %esi1487; X86-NOSSE-NEXT:    andl $858993459, %esi # imm = 0x333333331488; X86-NOSSE-NEXT:    shrl $2, %ecx1489; X86-NOSSE-NEXT:    andl $858993459, %ecx # imm = 0x333333331490; X86-NOSSE-NEXT:    addl %esi, %ecx1491; X86-NOSSE-NEXT:    movl %ecx, %edi1492; X86-NOSSE-NEXT:    shrl $4, %edi1493; X86-NOSSE-NEXT:    addl %ecx, %edi1494; X86-NOSSE-NEXT:    movl 28(%ebp), %esi1495; X86-NOSSE-NEXT:    andl $252645135, %edx # imm = 0xF0F0F0F1496; X86-NOSSE-NEXT:    imull $16843009, %edx, %edx # imm = 0x10101011497; X86-NOSSE-NEXT:    shrl $24, %edx1498; X86-NOSSE-NEXT:    andl $252645135, %edi # imm = 0xF0F0F0F1499; X86-NOSSE-NEXT:    imull $16843009, %edi, %ecx # imm = 0x10101011500; X86-NOSSE-NEXT:    shrl $24, %ecx1501; X86-NOSSE-NEXT:    addl %edx, %ecx1502; X86-NOSSE-NEXT:    movl %esi, %edx1503; X86-NOSSE-NEXT:    shrl %edx1504; X86-NOSSE-NEXT:    andl $1431655765, %edx # imm = 0x555555551505; X86-NOSSE-NEXT:    subl %edx, %esi1506; X86-NOSSE-NEXT:    movl %esi, %edx1507; X86-NOSSE-NEXT:    andl $858993459, %edx # imm = 0x333333331508; X86-NOSSE-NEXT:    shrl $2, %esi1509; X86-NOSSE-NEXT:    andl $858993459, %esi # imm = 0x333333331510; X86-NOSSE-NEXT:    addl %edx, %esi1511; X86-NOSSE-NEXT:    movl %esi, %edx1512; X86-NOSSE-NEXT:    shrl $4, %edx1513; X86-NOSSE-NEXT:    addl %esi, %edx1514; X86-NOSSE-NEXT:    movl %eax, %esi1515; X86-NOSSE-NEXT:    shrl %esi1516; X86-NOSSE-NEXT:    andl $1431655765, %esi # imm = 0x555555551517; X86-NOSSE-NEXT:    subl %esi, %eax1518; X86-NOSSE-NEXT:    movl %eax, %esi1519; X86-NOSSE-NEXT:    andl $858993459, %esi # imm = 0x333333331520; X86-NOSSE-NEXT:    shrl $2, %eax1521; X86-NOSSE-NEXT:    andl $858993459, %eax # imm = 0x333333331522; X86-NOSSE-NEXT:    addl %esi, %eax1523; X86-NOSSE-NEXT:    movl %eax, %esi1524; X86-NOSSE-NEXT:    shrl $4, %esi1525; X86-NOSSE-NEXT:    addl %eax, %esi1526; X86-NOSSE-NEXT:    andl $252645135, %edx # imm = 0xF0F0F0F1527; X86-NOSSE-NEXT:    imull $16843009, %edx, %eax # imm = 0x10101011528; X86-NOSSE-NEXT:    shrl $24, %eax1529; X86-NOSSE-NEXT:    andl $252645135, %esi # imm = 0xF0F0F0F1530; X86-NOSSE-NEXT:    imull $16843009, %esi, %edx # imm = 0x10101011531; X86-NOSSE-NEXT:    shrl $24, %edx1532; X86-NOSSE-NEXT:    addl %eax, %edx1533; X86-NOSSE-NEXT:    movl 8(%ebp), %eax1534; X86-NOSSE-NEXT:    addl %ecx, %edx1535; X86-NOSSE-NEXT:    xorl %ecx, %ecx1536; X86-NOSSE-NEXT:    movl %ecx, 12(%eax)1537; X86-NOSSE-NEXT:    movl %ecx, 8(%eax)1538; X86-NOSSE-NEXT:    movl %ecx, 4(%eax)1539; X86-NOSSE-NEXT:    movl %edx, (%eax)1540; X86-NOSSE-NEXT:    leal -8(%ebp), %esp1541; X86-NOSSE-NEXT:    popl %esi1542; X86-NOSSE-NEXT:    popl %edi1543; X86-NOSSE-NEXT:    popl %ebp1544; X86-NOSSE-NEXT:    retl $41545;1546; X64-BASE-LABEL: cnt128_pgso:1547; X64-BASE:       # %bb.0:1548; X64-BASE-NEXT:    movq %rsi, %rax1549; X64-BASE-NEXT:    shrq %rax1550; X64-BASE-NEXT:    movabsq $6148914691236517205, %r8 # imm = 0x55555555555555551551; X64-BASE-NEXT:    andq %r8, %rax1552; X64-BASE-NEXT:    subq %rax, %rsi1553; X64-BASE-NEXT:    movabsq $3689348814741910323, %rcx # imm = 0x33333333333333331554; X64-BASE-NEXT:    movq %rsi, %rax1555; X64-BASE-NEXT:    andq %rcx, %rax1556; X64-BASE-NEXT:    shrq $2, %rsi1557; X64-BASE-NEXT:    andq %rcx, %rsi1558; X64-BASE-NEXT:    addq %rsi, %rax1559; X64-BASE-NEXT:    movq %rax, %rdx1560; X64-BASE-NEXT:    shrq $4, %rdx1561; X64-BASE-NEXT:    addq %rax, %rdx1562; X64-BASE-NEXT:    movabsq $1085102592571150095, %rsi # imm = 0xF0F0F0F0F0F0F0F1563; X64-BASE-NEXT:    andq %rsi, %rdx1564; X64-BASE-NEXT:    movabsq $72340172838076673, %r9 # imm = 0x1010101010101011565; X64-BASE-NEXT:    imulq %r9, %rdx1566; X64-BASE-NEXT:    shrq $56, %rdx1567; X64-BASE-NEXT:    movq %rdi, %rax1568; X64-BASE-NEXT:    shrq %rax1569; X64-BASE-NEXT:    andq %r8, %rax1570; X64-BASE-NEXT:    subq %rax, %rdi1571; X64-BASE-NEXT:    movq %rdi, %rax1572; X64-BASE-NEXT:    andq %rcx, %rax1573; X64-BASE-NEXT:    shrq $2, %rdi1574; X64-BASE-NEXT:    andq %rdi, %rcx1575; X64-BASE-NEXT:    addq %rax, %rcx1576; X64-BASE-NEXT:    movq %rcx, %rax1577; X64-BASE-NEXT:    shrq $4, %rax1578; X64-BASE-NEXT:    addq %rcx, %rax1579; X64-BASE-NEXT:    andq %rsi, %rax1580; X64-BASE-NEXT:    imulq %r9, %rax1581; X64-BASE-NEXT:    shrq $56, %rax1582; X64-BASE-NEXT:    addq %rdx, %rax1583; X64-BASE-NEXT:    xorl %edx, %edx1584; X64-BASE-NEXT:    retq1585;1586; X86-POPCNT-LABEL: cnt128_pgso:1587; X86-POPCNT:       # %bb.0:1588; X86-POPCNT-NEXT:    pushl %ebp1589; X86-POPCNT-NEXT:    movl %esp, %ebp1590; X86-POPCNT-NEXT:    pushl %esi1591; X86-POPCNT-NEXT:    andl $-16, %esp1592; X86-POPCNT-NEXT:    subl $16, %esp1593; X86-POPCNT-NEXT:    movl 8(%ebp), %eax1594; X86-POPCNT-NEXT:    popcntl 36(%ebp), %ecx1595; X86-POPCNT-NEXT:    popcntl 32(%ebp), %edx1596; X86-POPCNT-NEXT:    addl %ecx, %edx1597; X86-POPCNT-NEXT:    popcntl 28(%ebp), %ecx1598; X86-POPCNT-NEXT:    popcntl 24(%ebp), %esi1599; X86-POPCNT-NEXT:    addl %ecx, %esi1600; X86-POPCNT-NEXT:    addl %edx, %esi1601; X86-POPCNT-NEXT:    xorl %ecx, %ecx1602; X86-POPCNT-NEXT:    movl %ecx, 12(%eax)1603; X86-POPCNT-NEXT:    movl %ecx, 8(%eax)1604; X86-POPCNT-NEXT:    movl %ecx, 4(%eax)1605; X86-POPCNT-NEXT:    movl %esi, (%eax)1606; X86-POPCNT-NEXT:    leal -4(%ebp), %esp1607; X86-POPCNT-NEXT:    popl %esi1608; X86-POPCNT-NEXT:    popl %ebp1609; X86-POPCNT-NEXT:    retl $41610;1611; X64-POPCNT-LABEL: cnt128_pgso:1612; X64-POPCNT:       # %bb.0:1613; X64-POPCNT-NEXT:    popcntq %rsi, %rcx1614; X64-POPCNT-NEXT:    popcntq %rdi, %rax1615; X64-POPCNT-NEXT:    addq %rcx, %rax1616; X64-POPCNT-NEXT:    xorl %edx, %edx1617; X64-POPCNT-NEXT:    retq1618;1619; X64-NDD-LABEL: cnt128_pgso:1620; X64-NDD:       # %bb.0:1621; X64-NDD-NEXT:    shrq %rsi, %rax1622; X64-NDD-NEXT:    movabsq $6148914691236517205, %rcx # imm = 0x55555555555555551623; X64-NDD-NEXT:    andq %rcx, %rax1624; X64-NDD-NEXT:    subq %rax, %rsi1625; X64-NDD-NEXT:    movabsq $3689348814741910323, %rax # imm = 0x33333333333333331626; X64-NDD-NEXT:    andq %rax, %rsi, %rdx1627; X64-NDD-NEXT:    shrq $2, %rsi1628; X64-NDD-NEXT:    andq %rax, %rsi1629; X64-NDD-NEXT:    addq %rsi, %rdx1630; X64-NDD-NEXT:    shrq $4, %rdx, %rsi1631; X64-NDD-NEXT:    addq %rsi, %rdx1632; X64-NDD-NEXT:    movabsq $1085102592571150095, %rsi # imm = 0xF0F0F0F0F0F0F0F1633; X64-NDD-NEXT:    andq %rsi, %rdx1634; X64-NDD-NEXT:    movabsq $72340172838076673, %r8 # imm = 0x1010101010101011635; X64-NDD-NEXT:    imulq %r8, %rdx1636; X64-NDD-NEXT:    shrq $56, %rdx1637; X64-NDD-NEXT:    shrq %rdi, %r91638; X64-NDD-NEXT:    andq %r9, %rcx1639; X64-NDD-NEXT:    subq %rcx, %rdi1640; X64-NDD-NEXT:    andq %rax, %rdi, %rcx1641; X64-NDD-NEXT:    shrq $2, %rdi1642; X64-NDD-NEXT:    andq %rdi, %rax1643; X64-NDD-NEXT:    addq %rcx, %rax1644; X64-NDD-NEXT:    shrq $4, %rax, %rcx1645; X64-NDD-NEXT:    addq %rcx, %rax1646; X64-NDD-NEXT:    andq %rsi, %rax1647; X64-NDD-NEXT:    imulq %r8, %rax1648; X64-NDD-NEXT:    shrq $56, %rax1649; X64-NDD-NEXT:    addq %rdx, %rax1650; X64-NDD-NEXT:    xorl %edx, %edx1651; X64-NDD-NEXT:    retq1652;1653; X86-SSE2-LABEL: cnt128_pgso:1654; X86-SSE2:       # %bb.0:1655; X86-SSE2-NEXT:    pushl %ebp1656; X86-SSE2-NEXT:    movl %esp, %ebp1657; X86-SSE2-NEXT:    andl $-16, %esp1658; X86-SSE2-NEXT:    subl $16, %esp1659; X86-SSE2-NEXT:    movl 8(%ebp), %eax1660; X86-SSE2-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero1661; X86-SSE2-NEXT:    movdqa %xmm2, %xmm01662; X86-SSE2-NEXT:    psrlw $1, %xmm01663; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]1664; X86-SSE2-NEXT:    pand %xmm1, %xmm01665; X86-SSE2-NEXT:    psubb %xmm0, %xmm21666; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]1667; X86-SSE2-NEXT:    movdqa %xmm2, %xmm31668; X86-SSE2-NEXT:    pand %xmm0, %xmm31669; X86-SSE2-NEXT:    psrlw $2, %xmm21670; X86-SSE2-NEXT:    pand %xmm0, %xmm21671; X86-SSE2-NEXT:    paddb %xmm3, %xmm21672; X86-SSE2-NEXT:    movdqa %xmm2, %xmm41673; X86-SSE2-NEXT:    psrlw $4, %xmm41674; X86-SSE2-NEXT:    paddb %xmm2, %xmm41675; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1676; X86-SSE2-NEXT:    pand %xmm2, %xmm41677; X86-SSE2-NEXT:    pxor %xmm3, %xmm31678; X86-SSE2-NEXT:    psadbw %xmm3, %xmm41679; X86-SSE2-NEXT:    movd %xmm4, %ecx1680; X86-SSE2-NEXT:    movq {{.*#+}} xmm4 = mem[0],zero1681; X86-SSE2-NEXT:    movdqa %xmm4, %xmm51682; X86-SSE2-NEXT:    psrlw $1, %xmm51683; X86-SSE2-NEXT:    pand %xmm1, %xmm51684; X86-SSE2-NEXT:    psubb %xmm5, %xmm41685; X86-SSE2-NEXT:    movdqa %xmm4, %xmm11686; X86-SSE2-NEXT:    pand %xmm0, %xmm11687; X86-SSE2-NEXT:    psrlw $2, %xmm41688; X86-SSE2-NEXT:    pand %xmm0, %xmm41689; X86-SSE2-NEXT:    paddb %xmm1, %xmm41690; X86-SSE2-NEXT:    movdqa %xmm4, %xmm01691; X86-SSE2-NEXT:    psrlw $4, %xmm01692; X86-SSE2-NEXT:    paddb %xmm4, %xmm01693; X86-SSE2-NEXT:    pand %xmm2, %xmm01694; X86-SSE2-NEXT:    psadbw %xmm3, %xmm01695; X86-SSE2-NEXT:    movd %xmm0, %edx1696; X86-SSE2-NEXT:    addl %ecx, %edx1697; X86-SSE2-NEXT:    xorl %ecx, %ecx1698; X86-SSE2-NEXT:    movl %ecx, 12(%eax)1699; X86-SSE2-NEXT:    movl %ecx, 8(%eax)1700; X86-SSE2-NEXT:    movl %ecx, 4(%eax)1701; X86-SSE2-NEXT:    movl %edx, (%eax)1702; X86-SSE2-NEXT:    movl %ebp, %esp1703; X86-SSE2-NEXT:    popl %ebp1704; X86-SSE2-NEXT:    retl $41705;1706; X86-SSSE3-LABEL: cnt128_pgso:1707; X86-SSSE3:       # %bb.0:1708; X86-SSSE3-NEXT:    pushl %ebp1709; X86-SSSE3-NEXT:    movl %esp, %ebp1710; X86-SSSE3-NEXT:    andl $-16, %esp1711; X86-SSSE3-NEXT:    subl $16, %esp1712; X86-SSSE3-NEXT:    movl 8(%ebp), %eax1713; X86-SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1714; X86-SSSE3-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero1715; X86-SSSE3-NEXT:    movdqa %xmm2, %xmm31716; X86-SSSE3-NEXT:    pand %xmm1, %xmm31717; X86-SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1718; X86-SSSE3-NEXT:    movdqa %xmm0, %xmm41719; X86-SSSE3-NEXT:    pshufb %xmm3, %xmm41720; X86-SSSE3-NEXT:    psrlw $4, %xmm21721; X86-SSSE3-NEXT:    pand %xmm1, %xmm21722; X86-SSSE3-NEXT:    movdqa %xmm0, %xmm31723; X86-SSSE3-NEXT:    pshufb %xmm2, %xmm31724; X86-SSSE3-NEXT:    paddb %xmm4, %xmm31725; X86-SSSE3-NEXT:    pxor %xmm2, %xmm21726; X86-SSSE3-NEXT:    psadbw %xmm2, %xmm31727; X86-SSSE3-NEXT:    movd %xmm3, %ecx1728; X86-SSSE3-NEXT:    movq {{.*#+}} xmm3 = mem[0],zero1729; X86-SSSE3-NEXT:    movdqa %xmm3, %xmm41730; X86-SSSE3-NEXT:    pand %xmm1, %xmm41731; X86-SSSE3-NEXT:    movdqa %xmm0, %xmm51732; X86-SSSE3-NEXT:    pshufb %xmm4, %xmm51733; X86-SSSE3-NEXT:    psrlw $4, %xmm31734; X86-SSSE3-NEXT:    pand %xmm1, %xmm31735; X86-SSSE3-NEXT:    pshufb %xmm3, %xmm01736; X86-SSSE3-NEXT:    paddb %xmm5, %xmm01737; X86-SSSE3-NEXT:    psadbw %xmm2, %xmm01738; X86-SSSE3-NEXT:    movd %xmm0, %edx1739; X86-SSSE3-NEXT:    addl %ecx, %edx1740; X86-SSSE3-NEXT:    xorl %ecx, %ecx1741; X86-SSSE3-NEXT:    movl %ecx, 12(%eax)1742; X86-SSSE3-NEXT:    movl %ecx, 8(%eax)1743; X86-SSSE3-NEXT:    movl %ecx, 4(%eax)1744; X86-SSSE3-NEXT:    movl %edx, (%eax)1745; X86-SSSE3-NEXT:    movl %ebp, %esp1746; X86-SSSE3-NEXT:    popl %ebp1747; X86-SSSE3-NEXT:    retl $41748  %cnt = tail call i128 @llvm.ctpop.i128(i128 %x)1749  ret i128 %cnt1750}1751 1752define i32 @popcount_zext_i32(i16 zeroext %x) {1753; X86-LABEL: popcount_zext_i32:1754; X86:       # %bb.0:1755; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax1756; X86-NEXT:    movl %eax, %ecx1757; X86-NEXT:    shrl %ecx1758; X86-NEXT:    andl $21845, %ecx # imm = 0x55551759; X86-NEXT:    subl %ecx, %eax1760; X86-NEXT:    movl %eax, %ecx1761; X86-NEXT:    andl $858993459, %ecx # imm = 0x333333331762; X86-NEXT:    shrl $2, %eax1763; X86-NEXT:    andl $858993459, %eax # imm = 0x333333331764; X86-NEXT:    addl %ecx, %eax1765; X86-NEXT:    movl %eax, %ecx1766; X86-NEXT:    shrl $4, %ecx1767; X86-NEXT:    addl %eax, %ecx1768; X86-NEXT:    andl $252645135, %ecx # imm = 0xF0F0F0F1769; X86-NEXT:    imull $16843009, %ecx, %eax # imm = 0x10101011770; X86-NEXT:    shrl $24, %eax1771; X86-NEXT:    retl1772;1773; X64-BASE-LABEL: popcount_zext_i32:1774; X64-BASE:       # %bb.0:1775; X64-BASE-NEXT:    movl %edi, %eax1776; X64-BASE-NEXT:    shrl %eax1777; X64-BASE-NEXT:    andl $21845, %eax # imm = 0x55551778; X64-BASE-NEXT:    subl %eax, %edi1779; X64-BASE-NEXT:    movl %edi, %eax1780; X64-BASE-NEXT:    andl $858993459, %eax # imm = 0x333333331781; X64-BASE-NEXT:    shrl $2, %edi1782; X64-BASE-NEXT:    andl $858993459, %edi # imm = 0x333333331783; X64-BASE-NEXT:    addl %eax, %edi1784; X64-BASE-NEXT:    movl %edi, %eax1785; X64-BASE-NEXT:    shrl $4, %eax1786; X64-BASE-NEXT:    addl %edi, %eax1787; X64-BASE-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F1788; X64-BASE-NEXT:    imull $16843009, %eax, %eax # imm = 0x10101011789; X64-BASE-NEXT:    shrl $24, %eax1790; X64-BASE-NEXT:    retq1791;1792; X86-POPCNT-LABEL: popcount_zext_i32:1793; X86-POPCNT:       # %bb.0:1794; X86-POPCNT-NEXT:    movzwl {{[0-9]+}}(%esp), %eax1795; X86-POPCNT-NEXT:    popcntl %eax, %eax1796; X86-POPCNT-NEXT:    retl1797;1798; X64-POPCNT-LABEL: popcount_zext_i32:1799; X64-POPCNT:       # %bb.0:1800; X64-POPCNT-NEXT:    popcntl %edi, %eax1801; X64-POPCNT-NEXT:    retq1802;1803; X64-NDD-LABEL: popcount_zext_i32:1804; X64-NDD:       # %bb.0:1805; X64-NDD-NEXT:    shrl %edi, %eax1806; X64-NDD-NEXT:    andl $21845, %eax # imm = 0x55551807; X64-NDD-NEXT:    subl %eax, %edi1808; X64-NDD-NEXT:    andl $858993459, %edi, %eax # imm = 0x333333331809; X64-NDD-NEXT:    shrl $2, %edi1810; X64-NDD-NEXT:    andl $858993459, %edi # imm = 0x333333331811; X64-NDD-NEXT:    addl %edi, %eax1812; X64-NDD-NEXT:    shrl $4, %eax, %ecx1813; X64-NDD-NEXT:    addl %ecx, %eax1814; X64-NDD-NEXT:    andl $252645135, %eax # imm = 0xF0F0F0F1815; X64-NDD-NEXT:    imull $16843009, %eax, %eax # imm = 0x10101011816; X64-NDD-NEXT:    shrl $24, %eax1817; X64-NDD-NEXT:    retq1818  %z = zext i16 %x to i321819  %cnt = tail call i32 @llvm.ctpop.i32(i32 %z)1820  ret i32 %cnt1821}1822 1823define i32 @popcount_i16_zext(i16 zeroext %x) {1824; X86-LABEL: popcount_i16_zext:1825; X86:       # %bb.0:1826; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax1827; X86-NEXT:    movl %eax, %ecx1828; X86-NEXT:    shrl %ecx1829; X86-NEXT:    andl $21845, %ecx # imm = 0x55551830; X86-NEXT:    subl %ecx, %eax1831; X86-NEXT:    movl %eax, %ecx1832; X86-NEXT:    andl $13107, %ecx # imm = 0x33331833; X86-NEXT:    shrl $2, %eax1834; X86-NEXT:    andl $13107, %eax # imm = 0x33331835; X86-NEXT:    addl %ecx, %eax1836; X86-NEXT:    movl %eax, %ecx1837; X86-NEXT:    shrl $4, %ecx1838; X86-NEXT:    addl %eax, %ecx1839; X86-NEXT:    andl $3855, %ecx # imm = 0xF0F1840; X86-NEXT:    movl %ecx, %eax1841; X86-NEXT:    shrl $8, %eax1842; X86-NEXT:    addl %ecx, %eax1843; X86-NEXT:    movzbl %al, %eax1844; X86-NEXT:    retl1845;1846; X64-BASE-LABEL: popcount_i16_zext:1847; X64-BASE:       # %bb.0:1848; X64-BASE-NEXT:    movl %edi, %eax1849; X64-BASE-NEXT:    shrl %eax1850; X64-BASE-NEXT:    andl $21845, %eax # imm = 0x55551851; X64-BASE-NEXT:    subl %eax, %edi1852; X64-BASE-NEXT:    movl %edi, %eax1853; X64-BASE-NEXT:    andl $13107, %eax # imm = 0x33331854; X64-BASE-NEXT:    shrl $2, %edi1855; X64-BASE-NEXT:    andl $13107, %edi # imm = 0x33331856; X64-BASE-NEXT:    addl %eax, %edi1857; X64-BASE-NEXT:    movl %edi, %eax1858; X64-BASE-NEXT:    shrl $4, %eax1859; X64-BASE-NEXT:    addl %edi, %eax1860; X64-BASE-NEXT:    andl $3855, %eax # imm = 0xF0F1861; X64-BASE-NEXT:    movl %eax, %ecx1862; X64-BASE-NEXT:    shrl $8, %ecx1863; X64-BASE-NEXT:    addl %eax, %ecx1864; X64-BASE-NEXT:    movzbl %cl, %eax1865; X64-BASE-NEXT:    retq1866;1867; X86-POPCNT-LABEL: popcount_i16_zext:1868; X86-POPCNT:       # %bb.0:1869; X86-POPCNT-NEXT:    movzwl {{[0-9]+}}(%esp), %eax1870; X86-POPCNT-NEXT:    popcntl %eax, %eax1871; X86-POPCNT-NEXT:    retl1872;1873; X64-POPCNT-LABEL: popcount_i16_zext:1874; X64-POPCNT:       # %bb.0:1875; X64-POPCNT-NEXT:    popcntl %edi, %eax1876; X64-POPCNT-NEXT:    retq1877;1878; X64-NDD-LABEL: popcount_i16_zext:1879; X64-NDD:       # %bb.0:1880; X64-NDD-NEXT:    shrw %di, %ax1881; X64-NDD-NEXT:    andw $21845, %ax # imm = 0x55551882; X64-NDD-NEXT:    subw %ax, %di, %ax1883; X64-NDD-NEXT:    andw $13107, %ax, %cx # imm = 0x33331884; X64-NDD-NEXT:    shrw $2, %ax1885; X64-NDD-NEXT:    andw $13107, %ax # imm = 0x33331886; X64-NDD-NEXT:    addw %cx, %ax1887; X64-NDD-NEXT:    shrw $4, %ax, %cx1888; X64-NDD-NEXT:    addw %cx, %ax1889; X64-NDD-NEXT:    andw $3855, %ax # imm = 0xF0F1890; X64-NDD-NEXT:    movzbl %ah, %ecx1891; X64-NDD-NEXT:    addw %cx, %ax1892; X64-NDD-NEXT:    movzbl %al, %eax1893; X64-NDD-NEXT:    movzwl %ax, %eax1894; X64-NDD-NEXT:    retq1895  %cnt = tail call i16 @llvm.ctpop.i16(i16 %x)1896  %z = zext i16 %cnt to i321897  ret i32 %z1898}1899 1900declare i8 @llvm.ctpop.i8(i8) nounwind readnone1901declare i16 @llvm.ctpop.i16(i16) nounwind readnone1902declare i32 @llvm.ctpop.i32(i32) nounwind readnone1903declare i64 @llvm.ctpop.i64(i64) nounwind readnone1904declare i128 @llvm.ctpop.i128(i128) nounwind readnone1905 1906!llvm.module.flags = !{!0}1907!0 = !{i32 1, !"ProfileSummary", !1}1908!1 = !{!2, !3, !4, !5, !6, !7, !8, !9}1909!2 = !{!"ProfileFormat", !"InstrProf"}1910!3 = !{!"TotalCount", i64 10000}1911!4 = !{!"MaxCount", i64 10}1912!5 = !{!"MaxInternalCount", i64 1}1913!6 = !{!"MaxFunctionCount", i64 1000}1914!7 = !{!"NumCounts", i64 3}1915!8 = !{!"NumFunctions", i64 3}1916!9 = !{!"DetailedSummary", !10}1917!10 = !{!11, !12, !13}1918!11 = !{i32 10000, i64 100, i32 1}1919!12 = !{i32 999000, i64 100, i32 1}1920!13 = !{i32 999999, i64 1, i32 2}1921!14 = !{!"function_entry_count", i64 0}1922