brintos

brintos / llvm-project-archived public Read only

0
0
Text · 27.8 KiB · a43dba9 Raw
704 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown -mattr=+popcnt | FileCheck %s -check-prefixes=X86-POPCOUNT3; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+popcnt | FileCheck %s -check-prefixes=X64-POPCOUNT4; RUN: llc < %s -mtriple=i686-unknown -mattr=-popcnt | FileCheck %s -check-prefixes=X86-NO-POPCOUNT5; RUN: llc < %s -mtriple=i686-unknown -mattr=+sse2 -mattr=-popcnt | FileCheck %s -check-prefixes=X86-NO-POPCOUNT6; RUN: llc < %s -mtriple=x86_64-unknown -mattr=-popcnt | FileCheck %s -check-prefixes=X64-NO-POPCOUNT7 8declare i8 @llvm.ctpop.i8(i8) nounwind readnone9declare i16 @llvm.ctpop.i16(i16) nounwind readnone10declare i32 @llvm.ctpop.i32(i32) nounwind readnone11declare i64 @llvm.ctpop.i64(i64) nounwind readnone12 13; PR7982314; CTPOP tests where we know only some bits are non-zero.15; FIXME: Move shifted masked values to lsb to use smaller bitsize special cases.16 17define i64 @ctpop_mask2(i64 %x) nounwind readnone {18; X86-POPCOUNT-LABEL: ctpop_mask2:19; X86-POPCOUNT:       # %bb.0:20; X86-POPCOUNT-NEXT:    movl {{[0-9]+}}(%esp), %eax21; X86-POPCOUNT-NEXT:    andl $3, %eax22; X86-POPCOUNT-NEXT:    popcntl %eax, %eax23; X86-POPCOUNT-NEXT:    xorl %edx, %edx24; X86-POPCOUNT-NEXT:    retl25;26; X64-POPCOUNT-LABEL: ctpop_mask2:27; X64-POPCOUNT:       # %bb.0:28; X64-POPCOUNT-NEXT:    andl $3, %edi29; X64-POPCOUNT-NEXT:    popcntl %edi, %eax30; X64-POPCOUNT-NEXT:    retq31;32; X86-NO-POPCOUNT-LABEL: ctpop_mask2:33; X86-NO-POPCOUNT:       # %bb.0:34; X86-NO-POPCOUNT-NEXT:    movl {{[0-9]+}}(%esp), %eax35; X86-NO-POPCOUNT-NEXT:    andl $3, %eax36; X86-NO-POPCOUNT-NEXT:    movl %eax, %ecx37; X86-NO-POPCOUNT-NEXT:    shrl %ecx38; X86-NO-POPCOUNT-NEXT:    subl %ecx, %eax39; X86-NO-POPCOUNT-NEXT:    xorl %edx, %edx40; X86-NO-POPCOUNT-NEXT:    retl41;42; X64-NO-POPCOUNT-LABEL: ctpop_mask2:43; X64-NO-POPCOUNT:       # %bb.0:44; X64-NO-POPCOUNT-NEXT:    movq %rdi, %rax45; X64-NO-POPCOUNT-NEXT:    andl $3, %eax46; X64-NO-POPCOUNT-NEXT:    movl %eax, %ecx47; X64-NO-POPCOUNT-NEXT:    shrl %ecx48; X64-NO-POPCOUNT-NEXT:    subl %ecx, %eax49; X64-NO-POPCOUNT-NEXT:    retq50  %mask = and i64 %x, 351  %count = tail call i64 @llvm.ctpop.i64(i64 %mask)52  ret i64 %count53}54 55define i32 @ctpop_shifted_mask2(i32 %x) nounwind readnone {56; X86-POPCOUNT-LABEL: ctpop_shifted_mask2:57; X86-POPCOUNT:       # %bb.0:58; X86-POPCOUNT-NEXT:    movl $1572864, %eax # imm = 0x18000059; X86-POPCOUNT-NEXT:    andl {{[0-9]+}}(%esp), %eax60; X86-POPCOUNT-NEXT:    popcntl %eax, %eax61; X86-POPCOUNT-NEXT:    retl62;63; X64-POPCOUNT-LABEL: ctpop_shifted_mask2:64; X64-POPCOUNT:       # %bb.0:65; X64-POPCOUNT-NEXT:    andl $1572864, %edi # imm = 0x18000066; X64-POPCOUNT-NEXT:    popcntl %edi, %eax67; X64-POPCOUNT-NEXT:    retq68;69; X86-NO-POPCOUNT-LABEL: ctpop_shifted_mask2:70; X86-NO-POPCOUNT:       # %bb.0:71; X86-NO-POPCOUNT-NEXT:    movl $1572864, %eax # imm = 0x18000072; X86-NO-POPCOUNT-NEXT:    andl {{[0-9]+}}(%esp), %eax73; X86-NO-POPCOUNT-NEXT:    movl %eax, %ecx74; X86-NO-POPCOUNT-NEXT:    shrl $20, %ecx75; X86-NO-POPCOUNT-NEXT:    shrl $19, %eax76; X86-NO-POPCOUNT-NEXT:    subl %ecx, %eax77; X86-NO-POPCOUNT-NEXT:    retl78;79; X64-NO-POPCOUNT-LABEL: ctpop_shifted_mask2:80; X64-NO-POPCOUNT:       # %bb.0:81; X64-NO-POPCOUNT-NEXT:    movl %edi, %eax82; X64-NO-POPCOUNT-NEXT:    andl $1572864, %eax # imm = 0x18000083; X64-NO-POPCOUNT-NEXT:    movl %eax, %ecx84; X64-NO-POPCOUNT-NEXT:    shrl $20, %ecx85; X64-NO-POPCOUNT-NEXT:    shrl $19, %eax86; X64-NO-POPCOUNT-NEXT:    subl %ecx, %eax87; X64-NO-POPCOUNT-NEXT:    retq88  %mask = and i32 %x, 1572864 ; 3 << 1989  %count = tail call i32 @llvm.ctpop.i32(i32 %mask)90  ret i32 %count91}92 93define i32 @ctpop_mask3(i32 %x) nounwind readnone {94; X86-POPCOUNT-LABEL: ctpop_mask3:95; X86-POPCOUNT:       # %bb.0:96; X86-POPCOUNT-NEXT:    movl {{[0-9]+}}(%esp), %eax97; X86-POPCOUNT-NEXT:    andl $5, %eax98; X86-POPCOUNT-NEXT:    popcntl %eax, %eax99; X86-POPCOUNT-NEXT:    retl100;101; X64-POPCOUNT-LABEL: ctpop_mask3:102; X64-POPCOUNT:       # %bb.0:103; X64-POPCOUNT-NEXT:    andl $5, %edi104; X64-POPCOUNT-NEXT:    popcntl %edi, %eax105; X64-POPCOUNT-NEXT:    retq106;107; X86-NO-POPCOUNT-LABEL: ctpop_mask3:108; X86-NO-POPCOUNT:       # %bb.0:109; X86-NO-POPCOUNT-NEXT:    movl {{[0-9]+}}(%esp), %ecx110; X86-NO-POPCOUNT-NEXT:    andl $5, %ecx111; X86-NO-POPCOUNT-NEXT:    addl %ecx, %ecx112; X86-NO-POPCOUNT-NEXT:    movl $59796, %eax # imm = 0xE994113; X86-NO-POPCOUNT-NEXT:    # kill: def $cl killed $cl killed $ecx114; X86-NO-POPCOUNT-NEXT:    shrl %cl, %eax115; X86-NO-POPCOUNT-NEXT:    andl $3, %eax116; X86-NO-POPCOUNT-NEXT:    retl117;118; X64-NO-POPCOUNT-LABEL: ctpop_mask3:119; X64-NO-POPCOUNT:       # %bb.0:120; X64-NO-POPCOUNT-NEXT:    # kill: def $edi killed $edi def $rdi121; X64-NO-POPCOUNT-NEXT:    andl $5, %edi122; X64-NO-POPCOUNT-NEXT:    leal (%rdi,%rdi), %ecx123; X64-NO-POPCOUNT-NEXT:    movl $59796, %eax # imm = 0xE994124; X64-NO-POPCOUNT-NEXT:    # kill: def $cl killed $cl killed $ecx125; X64-NO-POPCOUNT-NEXT:    shrl %cl, %eax126; X64-NO-POPCOUNT-NEXT:    andl $3, %eax127; X64-NO-POPCOUNT-NEXT:    retq128  %mask = and i32 %x, 5 ; 0b101129  %count = tail call i32 @llvm.ctpop.i32(i32 %mask)130  ret i32 %count131}132 133define i16 @ctpop_shifted_mask3(i16 %x) nounwind readnone {134; X86-POPCOUNT-LABEL: ctpop_shifted_mask3:135; X86-POPCOUNT:       # %bb.0:136; X86-POPCOUNT-NEXT:    movzwl {{[0-9]+}}(%esp), %eax137; X86-POPCOUNT-NEXT:    andl $14, %eax138; X86-POPCOUNT-NEXT:    popcntl %eax, %eax139; X86-POPCOUNT-NEXT:    # kill: def $ax killed $ax killed $eax140; X86-POPCOUNT-NEXT:    retl141;142; X64-POPCOUNT-LABEL: ctpop_shifted_mask3:143; X64-POPCOUNT:       # %bb.0:144; X64-POPCOUNT-NEXT:    andl $14, %edi145; X64-POPCOUNT-NEXT:    popcntl %edi, %eax146; X64-POPCOUNT-NEXT:    # kill: def $ax killed $ax killed $eax147; X64-POPCOUNT-NEXT:    retq148;149; X86-NO-POPCOUNT-LABEL: ctpop_shifted_mask3:150; X86-NO-POPCOUNT:       # %bb.0:151; X86-NO-POPCOUNT-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx152; X86-NO-POPCOUNT-NEXT:    andl $14, %ecx153; X86-NO-POPCOUNT-NEXT:    movl $59796, %eax # imm = 0xE994154; X86-NO-POPCOUNT-NEXT:    # kill: def $cl killed $cl killed $ecx155; X86-NO-POPCOUNT-NEXT:    shrl %cl, %eax156; X86-NO-POPCOUNT-NEXT:    andl $3, %eax157; X86-NO-POPCOUNT-NEXT:    # kill: def $ax killed $ax killed $eax158; X86-NO-POPCOUNT-NEXT:    retl159;160; X64-NO-POPCOUNT-LABEL: ctpop_shifted_mask3:161; X64-NO-POPCOUNT:       # %bb.0:162; X64-NO-POPCOUNT-NEXT:    movl %edi, %ecx163; X64-NO-POPCOUNT-NEXT:    andl $14, %ecx164; X64-NO-POPCOUNT-NEXT:    movl $59796, %eax # imm = 0xE994165; X64-NO-POPCOUNT-NEXT:    # kill: def $cl killed $cl killed $ecx166; X64-NO-POPCOUNT-NEXT:    shrl %cl, %eax167; X64-NO-POPCOUNT-NEXT:    andl $3, %eax168; X64-NO-POPCOUNT-NEXT:    # kill: def $ax killed $ax killed $eax169; X64-NO-POPCOUNT-NEXT:    retq170  %mask = and i16 %x, 14 ; 7 << 1171  %count = tail call i16 @llvm.ctpop.i16(i16 %mask)172  ret i16 %count173}174 175define i64 @ctpop_mask4(i64 %x) nounwind readnone {176; X86-POPCOUNT-LABEL: ctpop_mask4:177; X86-POPCOUNT:       # %bb.0:178; X86-POPCOUNT-NEXT:    movl {{[0-9]+}}(%esp), %eax179; X86-POPCOUNT-NEXT:    andl $15, %eax180; X86-POPCOUNT-NEXT:    popcntl %eax, %eax181; X86-POPCOUNT-NEXT:    xorl %edx, %edx182; X86-POPCOUNT-NEXT:    retl183;184; X64-POPCOUNT-LABEL: ctpop_mask4:185; X64-POPCOUNT:       # %bb.0:186; X64-POPCOUNT-NEXT:    andl $15, %edi187; X64-POPCOUNT-NEXT:    popcntl %edi, %eax188; X64-POPCOUNT-NEXT:    retq189;190; X86-NO-POPCOUNT-LABEL: ctpop_mask4:191; X86-NO-POPCOUNT:       # %bb.0:192; X86-NO-POPCOUNT-NEXT:    movl {{[0-9]+}}(%esp), %eax193; X86-NO-POPCOUNT-NEXT:    andl $15, %eax194; X86-NO-POPCOUNT-NEXT:    imull $134480385, %eax, %eax # imm = 0x8040201195; X86-NO-POPCOUNT-NEXT:    shrl $3, %eax196; X86-NO-POPCOUNT-NEXT:    andl $17895697, %eax # imm = 0x1111111197; X86-NO-POPCOUNT-NEXT:    imull $286331153, %eax, %eax # imm = 0x11111111198; X86-NO-POPCOUNT-NEXT:    shrl $28, %eax199; X86-NO-POPCOUNT-NEXT:    xorl %edx, %edx200; X86-NO-POPCOUNT-NEXT:    retl201;202; X64-NO-POPCOUNT-LABEL: ctpop_mask4:203; X64-NO-POPCOUNT:       # %bb.0:204; X64-NO-POPCOUNT-NEXT:    andl $15, %edi205; X64-NO-POPCOUNT-NEXT:    leal (,%rdi,4), %ecx206; X64-NO-POPCOUNT-NEXT:    movabsq $4841987667533046032, %rax # imm = 0x4332322132212110207; X64-NO-POPCOUNT-NEXT:    # kill: def $cl killed $cl killed $ecx208; X64-NO-POPCOUNT-NEXT:    shrq %cl, %rax209; X64-NO-POPCOUNT-NEXT:    andl $7, %eax210; X64-NO-POPCOUNT-NEXT:    retq211  %mask = and i64 %x, 15212  %count = tail call i64 @llvm.ctpop.i64(i64 %mask)213  ret i64 %count214}215 216define i32 @ctpop_shifted_mask4(i32 %x) nounwind readnone {217; X86-POPCOUNT-LABEL: ctpop_shifted_mask4:218; X86-POPCOUNT:       # %bb.0:219; X86-POPCOUNT-NEXT:    movl $7680, %eax # imm = 0x1E00220; X86-POPCOUNT-NEXT:    andl {{[0-9]+}}(%esp), %eax221; X86-POPCOUNT-NEXT:    popcntl %eax, %eax222; X86-POPCOUNT-NEXT:    retl223;224; X64-POPCOUNT-LABEL: ctpop_shifted_mask4:225; X64-POPCOUNT:       # %bb.0:226; X64-POPCOUNT-NEXT:    andl $7680, %edi # imm = 0x1E00227; X64-POPCOUNT-NEXT:    popcntl %edi, %eax228; X64-POPCOUNT-NEXT:    retq229;230; X86-NO-POPCOUNT-LABEL: ctpop_shifted_mask4:231; X86-NO-POPCOUNT:       # %bb.0:232; X86-NO-POPCOUNT-NEXT:    movl {{[0-9]+}}(%esp), %eax233; X86-NO-POPCOUNT-NEXT:    shrl $9, %eax234; X86-NO-POPCOUNT-NEXT:    andl $15, %eax235; X86-NO-POPCOUNT-NEXT:    imull $134480385, %eax, %eax # imm = 0x8040201236; X86-NO-POPCOUNT-NEXT:    shrl $3, %eax237; X86-NO-POPCOUNT-NEXT:    andl $17895697, %eax # imm = 0x1111111238; X86-NO-POPCOUNT-NEXT:    imull $286331153, %eax, %eax # imm = 0x11111111239; X86-NO-POPCOUNT-NEXT:    shrl $28, %eax240; X86-NO-POPCOUNT-NEXT:    retl241;242; X64-NO-POPCOUNT-LABEL: ctpop_shifted_mask4:243; X64-NO-POPCOUNT:       # %bb.0:244; X64-NO-POPCOUNT-NEXT:    movl %edi, %ecx245; X64-NO-POPCOUNT-NEXT:    shrl $7, %ecx246; X64-NO-POPCOUNT-NEXT:    andl $60, %ecx247; X64-NO-POPCOUNT-NEXT:    movabsq $4841987667533046032, %rax # imm = 0x4332322132212110248; X64-NO-POPCOUNT-NEXT:    # kill: def $cl killed $cl killed $ecx249; X64-NO-POPCOUNT-NEXT:    shrq %cl, %rax250; X64-NO-POPCOUNT-NEXT:    andl $7, %eax251; X64-NO-POPCOUNT-NEXT:    # kill: def $eax killed $eax killed $rax252; X64-NO-POPCOUNT-NEXT:    retq253  %mask = and i32 %x, 7680 ; 15 << 9254  %count = tail call i32 @llvm.ctpop.i32(i32 %mask)255  ret i32 %count256}257 258define i64 @ctpop_mask5(i64 %x) nounwind readnone {259; X86-POPCOUNT-LABEL: ctpop_mask5:260; X86-POPCOUNT:       # %bb.0:261; X86-POPCOUNT-NEXT:    movl {{[0-9]+}}(%esp), %eax262; X86-POPCOUNT-NEXT:    andl $31, %eax263; X86-POPCOUNT-NEXT:    popcntl %eax, %eax264; X86-POPCOUNT-NEXT:    xorl %edx, %edx265; X86-POPCOUNT-NEXT:    retl266;267; X64-POPCOUNT-LABEL: ctpop_mask5:268; X64-POPCOUNT:       # %bb.0:269; X64-POPCOUNT-NEXT:    andl $31, %edi270; X64-POPCOUNT-NEXT:    popcntl %edi, %eax271; X64-POPCOUNT-NEXT:    retq272;273; X86-NO-POPCOUNT-LABEL: ctpop_mask5:274; X86-NO-POPCOUNT:       # %bb.0:275; X86-NO-POPCOUNT-NEXT:    movl {{[0-9]+}}(%esp), %eax276; X86-NO-POPCOUNT-NEXT:    andl $31, %eax277; X86-NO-POPCOUNT-NEXT:    imull $134480385, %eax, %eax # imm = 0x8040201278; X86-NO-POPCOUNT-NEXT:    shrl $3, %eax279; X86-NO-POPCOUNT-NEXT:    andl $286331153, %eax # imm = 0x11111111280; X86-NO-POPCOUNT-NEXT:    imull $286331153, %eax, %eax # imm = 0x11111111281; X86-NO-POPCOUNT-NEXT:    shrl $28, %eax282; X86-NO-POPCOUNT-NEXT:    xorl %edx, %edx283; X86-NO-POPCOUNT-NEXT:    retl284;285; X64-NO-POPCOUNT-LABEL: ctpop_mask5:286; X64-NO-POPCOUNT:       # %bb.0:287; X64-NO-POPCOUNT-NEXT:    andl $31, %edi288; X64-NO-POPCOUNT-NEXT:    imull $134480385, %edi, %eax # imm = 0x8040201289; X64-NO-POPCOUNT-NEXT:    shrl $3, %eax290; X64-NO-POPCOUNT-NEXT:    andl $286331153, %eax # imm = 0x11111111291; X64-NO-POPCOUNT-NEXT:    imull $286331153, %eax, %eax # imm = 0x11111111292; X64-NO-POPCOUNT-NEXT:    shrl $28, %eax293; X64-NO-POPCOUNT-NEXT:    retq294  %mask = and i64 %x, 31295  %count = tail call i64 @llvm.ctpop.i64(i64 %mask)296  ret i64 %count297}298 299define i32 @ctpop_shifted_mask5(i32 %x) nounwind readnone {300; X86-POPCOUNT-LABEL: ctpop_shifted_mask5:301; X86-POPCOUNT:       # %bb.0:302; X86-POPCOUNT-NEXT:    movl $11776, %eax # imm = 0x2E00303; X86-POPCOUNT-NEXT:    andl {{[0-9]+}}(%esp), %eax304; X86-POPCOUNT-NEXT:    popcntl %eax, %eax305; X86-POPCOUNT-NEXT:    retl306;307; X64-POPCOUNT-LABEL: ctpop_shifted_mask5:308; X64-POPCOUNT:       # %bb.0:309; X64-POPCOUNT-NEXT:    andl $11776, %edi # imm = 0x2E00310; X64-POPCOUNT-NEXT:    popcntl %edi, %eax311; X64-POPCOUNT-NEXT:    retq312;313; X86-NO-POPCOUNT-LABEL: ctpop_shifted_mask5:314; X86-NO-POPCOUNT:       # %bb.0:315; X86-NO-POPCOUNT-NEXT:    movl {{[0-9]+}}(%esp), %eax316; X86-NO-POPCOUNT-NEXT:    shrl $9, %eax317; X86-NO-POPCOUNT-NEXT:    andl $23, %eax318; X86-NO-POPCOUNT-NEXT:    imull $134480385, %eax, %eax # imm = 0x8040201319; X86-NO-POPCOUNT-NEXT:    shrl $3, %eax320; X86-NO-POPCOUNT-NEXT:    andl $286331153, %eax # imm = 0x11111111321; X86-NO-POPCOUNT-NEXT:    imull $286331153, %eax, %eax # imm = 0x11111111322; X86-NO-POPCOUNT-NEXT:    shrl $28, %eax323; X86-NO-POPCOUNT-NEXT:    retl324;325; X64-NO-POPCOUNT-LABEL: ctpop_shifted_mask5:326; X64-NO-POPCOUNT:       # %bb.0:327; X64-NO-POPCOUNT-NEXT:    shrl $9, %edi328; X64-NO-POPCOUNT-NEXT:    andl $23, %edi329; X64-NO-POPCOUNT-NEXT:    imull $134480385, %edi, %eax # imm = 0x8040201330; X64-NO-POPCOUNT-NEXT:    shrl $3, %eax331; X64-NO-POPCOUNT-NEXT:    andl $286331153, %eax # imm = 0x11111111332; X64-NO-POPCOUNT-NEXT:    imull $286331153, %eax, %eax # imm = 0x11111111333; X64-NO-POPCOUNT-NEXT:    shrl $28, %eax334; X64-NO-POPCOUNT-NEXT:    retq335  %mask = and i32 %x, 11776 ; 23 << 9336  %count = tail call i32 @llvm.ctpop.i32(i32 %mask)337  ret i32 %count338}339 340define i32 @ctpop_mask6(i32 %x) nounwind readnone {341; X86-POPCOUNT-LABEL: ctpop_mask6:342; X86-POPCOUNT:       # %bb.0:343; X86-POPCOUNT-NEXT:    movl {{[0-9]+}}(%esp), %eax344; X86-POPCOUNT-NEXT:    andl $63, %eax345; X86-POPCOUNT-NEXT:    popcntl %eax, %eax346; X86-POPCOUNT-NEXT:    retl347;348; X64-POPCOUNT-LABEL: ctpop_mask6:349; X64-POPCOUNT:       # %bb.0:350; X64-POPCOUNT-NEXT:    andl $63, %edi351; X64-POPCOUNT-NEXT:    popcntl %edi, %eax352; X64-POPCOUNT-NEXT:    retq353;354; X86-NO-POPCOUNT-LABEL: ctpop_mask6:355; X86-NO-POPCOUNT:       # %bb.0:356; X86-NO-POPCOUNT-NEXT:    movl {{[0-9]+}}(%esp), %eax357; X86-NO-POPCOUNT-NEXT:    andl $63, %eax358; X86-NO-POPCOUNT-NEXT:    imull $134480385, %eax, %eax # imm = 0x8040201359; X86-NO-POPCOUNT-NEXT:    shrl $3, %eax360; X86-NO-POPCOUNT-NEXT:    andl $286331153, %eax # imm = 0x11111111361; X86-NO-POPCOUNT-NEXT:    imull $286331153, %eax, %eax # imm = 0x11111111362; X86-NO-POPCOUNT-NEXT:    shrl $28, %eax363; X86-NO-POPCOUNT-NEXT:    retl364;365; X64-NO-POPCOUNT-LABEL: ctpop_mask6:366; X64-NO-POPCOUNT:       # %bb.0:367; X64-NO-POPCOUNT-NEXT:    andl $63, %edi368; X64-NO-POPCOUNT-NEXT:    imull $134480385, %edi, %eax # imm = 0x8040201369; X64-NO-POPCOUNT-NEXT:    shrl $3, %eax370; X64-NO-POPCOUNT-NEXT:    andl $286331153, %eax # imm = 0x11111111371; X64-NO-POPCOUNT-NEXT:    imull $286331153, %eax, %eax # imm = 0x11111111372; X64-NO-POPCOUNT-NEXT:    shrl $28, %eax373; X64-NO-POPCOUNT-NEXT:    retq374  %mask = and i32 %x, 63375  %count = tail call i32 @llvm.ctpop.i32(i32 %mask)376  ret i32 %count377}378 379define i64 @ctpop_shifted_mask6(i64 %x) nounwind readnone {380; X86-POPCOUNT-LABEL: ctpop_shifted_mask6:381; X86-POPCOUNT:       # %bb.0:382; X86-POPCOUNT-NEXT:    movl $26112, %eax # imm = 0x6600383; X86-POPCOUNT-NEXT:    andl {{[0-9]+}}(%esp), %eax384; X86-POPCOUNT-NEXT:    popcntl %eax, %eax385; X86-POPCOUNT-NEXT:    xorl %edx, %edx386; X86-POPCOUNT-NEXT:    retl387;388; X64-POPCOUNT-LABEL: ctpop_shifted_mask6:389; X64-POPCOUNT:       # %bb.0:390; X64-POPCOUNT-NEXT:    andl $26112, %edi # imm = 0x6600391; X64-POPCOUNT-NEXT:    popcntl %edi, %eax392; X64-POPCOUNT-NEXT:    retq393;394; X86-NO-POPCOUNT-LABEL: ctpop_shifted_mask6:395; X86-NO-POPCOUNT:       # %bb.0:396; X86-NO-POPCOUNT-NEXT:    movl {{[0-9]+}}(%esp), %eax397; X86-NO-POPCOUNT-NEXT:    shrl $9, %eax398; X86-NO-POPCOUNT-NEXT:    andl $51, %eax399; X86-NO-POPCOUNT-NEXT:    imull $134480385, %eax, %eax # imm = 0x8040201400; X86-NO-POPCOUNT-NEXT:    shrl $3, %eax401; X86-NO-POPCOUNT-NEXT:    andl $286331153, %eax # imm = 0x11111111402; X86-NO-POPCOUNT-NEXT:    imull $286331153, %eax, %eax # imm = 0x11111111403; X86-NO-POPCOUNT-NEXT:    shrl $28, %eax404; X86-NO-POPCOUNT-NEXT:    xorl %edx, %edx405; X86-NO-POPCOUNT-NEXT:    retl406;407; X64-NO-POPCOUNT-LABEL: ctpop_shifted_mask6:408; X64-NO-POPCOUNT:       # %bb.0:409; X64-NO-POPCOUNT-NEXT:    shrl $9, %edi410; X64-NO-POPCOUNT-NEXT:    andl $51, %edi411; X64-NO-POPCOUNT-NEXT:    imull $134480385, %edi, %eax # imm = 0x8040201412; X64-NO-POPCOUNT-NEXT:    shrl $3, %eax413; X64-NO-POPCOUNT-NEXT:    andl $286331153, %eax # imm = 0x11111111414; X64-NO-POPCOUNT-NEXT:    imull $286331153, %eax, %eax # imm = 0x11111111415; X64-NO-POPCOUNT-NEXT:    shrl $28, %eax416; X64-NO-POPCOUNT-NEXT:    retq417  %mask = and i64 %x, 26112 ; 51 << 9418  %count = tail call i64 @llvm.ctpop.i64(i64 %mask)419  ret i64 %count420}421 422define i16 @ctpop_mask7(i16 %x) nounwind readnone {423; X86-POPCOUNT-LABEL: ctpop_mask7:424; X86-POPCOUNT:       # %bb.0:425; X86-POPCOUNT-NEXT:    movzwl {{[0-9]+}}(%esp), %eax426; X86-POPCOUNT-NEXT:    andl $127, %eax427; X86-POPCOUNT-NEXT:    popcntl %eax, %eax428; X86-POPCOUNT-NEXT:    # kill: def $ax killed $ax killed $eax429; X86-POPCOUNT-NEXT:    retl430;431; X64-POPCOUNT-LABEL: ctpop_mask7:432; X64-POPCOUNT:       # %bb.0:433; X64-POPCOUNT-NEXT:    andl $127, %edi434; X64-POPCOUNT-NEXT:    popcntl %edi, %eax435; X64-POPCOUNT-NEXT:    # kill: def $ax killed $ax killed $eax436; X64-POPCOUNT-NEXT:    retq437;438; X86-NO-POPCOUNT-LABEL: ctpop_mask7:439; X86-NO-POPCOUNT:       # %bb.0:440; X86-NO-POPCOUNT-NEXT:    movzwl {{[0-9]+}}(%esp), %eax441; X86-NO-POPCOUNT-NEXT:    andl $127, %eax442; X86-NO-POPCOUNT-NEXT:    imull $134480385, %eax, %eax # imm = 0x8040201443; X86-NO-POPCOUNT-NEXT:    shrl $3, %eax444; X86-NO-POPCOUNT-NEXT:    andl $286331153, %eax # imm = 0x11111111445; X86-NO-POPCOUNT-NEXT:    imull $286331153, %eax, %eax # imm = 0x11111111446; X86-NO-POPCOUNT-NEXT:    shrl $28, %eax447; X86-NO-POPCOUNT-NEXT:    # kill: def $ax killed $ax killed $eax448; X86-NO-POPCOUNT-NEXT:    retl449;450; X64-NO-POPCOUNT-LABEL: ctpop_mask7:451; X64-NO-POPCOUNT:       # %bb.0:452; X64-NO-POPCOUNT-NEXT:    andl $127, %edi453; X64-NO-POPCOUNT-NEXT:    imull $134480385, %edi, %eax # imm = 0x8040201454; X64-NO-POPCOUNT-NEXT:    shrl $3, %eax455; X64-NO-POPCOUNT-NEXT:    andl $286331153, %eax # imm = 0x11111111456; X64-NO-POPCOUNT-NEXT:    imull $286331153, %eax, %eax # imm = 0x11111111457; X64-NO-POPCOUNT-NEXT:    shrl $28, %eax458; X64-NO-POPCOUNT-NEXT:    # kill: def $ax killed $ax killed $eax459; X64-NO-POPCOUNT-NEXT:    retq460  %mask = and i16 %x, 127461  %count = tail call i16 @llvm.ctpop.i16(i16 %mask)462  ret i16 %count463}464 465define i32 @ctpop_shift_mask7(i32 %x) nounwind readnone {466; X86-POPCOUNT-LABEL: ctpop_shift_mask7:467; X86-POPCOUNT:       # %bb.0:468; X86-POPCOUNT-NEXT:    movl $1040384, %eax # imm = 0xFE000469; X86-POPCOUNT-NEXT:    andl {{[0-9]+}}(%esp), %eax470; X86-POPCOUNT-NEXT:    popcntl %eax, %eax471; X86-POPCOUNT-NEXT:    retl472;473; X64-POPCOUNT-LABEL: ctpop_shift_mask7:474; X64-POPCOUNT:       # %bb.0:475; X64-POPCOUNT-NEXT:    andl $1040384, %edi # imm = 0xFE000476; X64-POPCOUNT-NEXT:    popcntl %edi, %eax477; X64-POPCOUNT-NEXT:    retq478;479; X86-NO-POPCOUNT-LABEL: ctpop_shift_mask7:480; X86-NO-POPCOUNT:       # %bb.0:481; X86-NO-POPCOUNT-NEXT:    movl {{[0-9]+}}(%esp), %eax482; X86-NO-POPCOUNT-NEXT:    shrl $13, %eax483; X86-NO-POPCOUNT-NEXT:    andl $127, %eax484; X86-NO-POPCOUNT-NEXT:    imull $134480385, %eax, %eax # imm = 0x8040201485; X86-NO-POPCOUNT-NEXT:    shrl $3, %eax486; X86-NO-POPCOUNT-NEXT:    andl $286331153, %eax # imm = 0x11111111487; X86-NO-POPCOUNT-NEXT:    imull $286331153, %eax, %eax # imm = 0x11111111488; X86-NO-POPCOUNT-NEXT:    shrl $28, %eax489; X86-NO-POPCOUNT-NEXT:    retl490;491; X64-NO-POPCOUNT-LABEL: ctpop_shift_mask7:492; X64-NO-POPCOUNT:       # %bb.0:493; X64-NO-POPCOUNT-NEXT:    shrl $13, %edi494; X64-NO-POPCOUNT-NEXT:    andl $127, %edi495; X64-NO-POPCOUNT-NEXT:    imull $134480385, %edi, %eax # imm = 0x8040201496; X64-NO-POPCOUNT-NEXT:    shrl $3, %eax497; X64-NO-POPCOUNT-NEXT:    andl $286331153, %eax # imm = 0x11111111498; X64-NO-POPCOUNT-NEXT:    imull $286331153, %eax, %eax # imm = 0x11111111499; X64-NO-POPCOUNT-NEXT:    shrl $28, %eax500; X64-NO-POPCOUNT-NEXT:    retq501  %mask = and i32 %x, 1040384 ; 127 << 13502  %count = tail call i32 @llvm.ctpop.i32(i32 %mask)503  ret i32 %count504}505 506define i32 @ctpop_mask8(i32 %x) nounwind readnone {507; X86-POPCOUNT-LABEL: ctpop_mask8:508; X86-POPCOUNT:       # %bb.0:509; X86-POPCOUNT-NEXT:    movzbl {{[0-9]+}}(%esp), %eax510; X86-POPCOUNT-NEXT:    popcntl %eax, %eax511; X86-POPCOUNT-NEXT:    retl512;513; X64-POPCOUNT-LABEL: ctpop_mask8:514; X64-POPCOUNT:       # %bb.0:515; X64-POPCOUNT-NEXT:    movzbl %dil, %eax516; X64-POPCOUNT-NEXT:    popcntl %eax, %eax517; X64-POPCOUNT-NEXT:    retq518;519; X86-NO-POPCOUNT-LABEL: ctpop_mask8:520; X86-NO-POPCOUNT:       # %bb.0:521; X86-NO-POPCOUNT-NEXT:    movzbl {{[0-9]+}}(%esp), %eax522; X86-NO-POPCOUNT-NEXT:    imull $134480385, %eax, %eax # imm = 0x8040201523; X86-NO-POPCOUNT-NEXT:    shrl $3, %eax524; X86-NO-POPCOUNT-NEXT:    andl $286331153, %eax # imm = 0x11111111525; X86-NO-POPCOUNT-NEXT:    imull $286331153, %eax, %eax # imm = 0x11111111526; X86-NO-POPCOUNT-NEXT:    shrl $28, %eax527; X86-NO-POPCOUNT-NEXT:    retl528;529; X64-NO-POPCOUNT-LABEL: ctpop_mask8:530; X64-NO-POPCOUNT:       # %bb.0:531; X64-NO-POPCOUNT-NEXT:    movzbl %dil, %eax532; X64-NO-POPCOUNT-NEXT:    imull $134480385, %eax, %eax # imm = 0x8040201533; X64-NO-POPCOUNT-NEXT:    shrl $3, %eax534; X64-NO-POPCOUNT-NEXT:    andl $286331153, %eax # imm = 0x11111111535; X64-NO-POPCOUNT-NEXT:    imull $286331153, %eax, %eax # imm = 0x11111111536; X64-NO-POPCOUNT-NEXT:    shrl $28, %eax537; X64-NO-POPCOUNT-NEXT:    retq538  %mask = and i32 %x, 255539  %count = tail call i32 @llvm.ctpop.i32(i32 %mask)540  ret i32 %count541}542 543define i64 @ctpop_shifted_mask8(i64 %x) nounwind readnone {544; X86-POPCOUNT-LABEL: ctpop_shifted_mask8:545; X86-POPCOUNT:       # %bb.0:546; X86-POPCOUNT-NEXT:    movzbl {{[0-9]+}}(%esp), %eax547; X86-POPCOUNT-NEXT:    popcntl %eax, %eax548; X86-POPCOUNT-NEXT:    xorl %edx, %edx549; X86-POPCOUNT-NEXT:    retl550;551; X64-POPCOUNT-LABEL: ctpop_shifted_mask8:552; X64-POPCOUNT:       # %bb.0:553; X64-POPCOUNT-NEXT:    andl $65280, %edi # imm = 0xFF00554; X64-POPCOUNT-NEXT:    popcntl %edi, %eax555; X64-POPCOUNT-NEXT:    retq556;557; X86-NO-POPCOUNT-LABEL: ctpop_shifted_mask8:558; X86-NO-POPCOUNT:       # %bb.0:559; X86-NO-POPCOUNT-NEXT:    movzbl {{[0-9]+}}(%esp), %eax560; X86-NO-POPCOUNT-NEXT:    imull $134480385, %eax, %eax # imm = 0x8040201561; X86-NO-POPCOUNT-NEXT:    shrl $3, %eax562; X86-NO-POPCOUNT-NEXT:    andl $286331153, %eax # imm = 0x11111111563; X86-NO-POPCOUNT-NEXT:    imull $286331153, %eax, %eax # imm = 0x11111111564; X86-NO-POPCOUNT-NEXT:    shrl $28, %eax565; X86-NO-POPCOUNT-NEXT:    xorl %edx, %edx566; X86-NO-POPCOUNT-NEXT:    retl567;568; X64-NO-POPCOUNT-LABEL: ctpop_shifted_mask8:569; X64-NO-POPCOUNT:       # %bb.0:570; X64-NO-POPCOUNT-NEXT:    movq %rdi, %rax571; X64-NO-POPCOUNT-NEXT:    movzbl %ah, %eax572; X64-NO-POPCOUNT-NEXT:    imull $134480385, %eax, %eax # imm = 0x8040201573; X64-NO-POPCOUNT-NEXT:    shrl $3, %eax574; X64-NO-POPCOUNT-NEXT:    andl $286331153, %eax # imm = 0x11111111575; X64-NO-POPCOUNT-NEXT:    imull $286331153, %eax, %eax # imm = 0x11111111576; X64-NO-POPCOUNT-NEXT:    shrl $28, %eax577; X64-NO-POPCOUNT-NEXT:    retq578  %mask = and i64 %x, 65280 ; 255 << 8579  %count = tail call i64 @llvm.ctpop.i64(i64 %mask)580  ret i64 %count581}582 583define i32 @ctpop_mask16(i32 %x) nounwind readnone {584; X86-POPCOUNT-LABEL: ctpop_mask16:585; X86-POPCOUNT:       # %bb.0:586; X86-POPCOUNT-NEXT:    movzwl {{[0-9]+}}(%esp), %eax587; X86-POPCOUNT-NEXT:    popcntl %eax, %eax588; X86-POPCOUNT-NEXT:    retl589;590; X64-POPCOUNT-LABEL: ctpop_mask16:591; X64-POPCOUNT:       # %bb.0:592; X64-POPCOUNT-NEXT:    movzwl %di, %eax593; X64-POPCOUNT-NEXT:    popcntl %eax, %eax594; X64-POPCOUNT-NEXT:    retq595;596; X86-NO-POPCOUNT-LABEL: ctpop_mask16:597; X86-NO-POPCOUNT:       # %bb.0:598; X86-NO-POPCOUNT-NEXT:    movzwl {{[0-9]+}}(%esp), %eax599; X86-NO-POPCOUNT-NEXT:    movl %eax, %ecx600; X86-NO-POPCOUNT-NEXT:    shrl %ecx601; X86-NO-POPCOUNT-NEXT:    andl $21845, %ecx # imm = 0x5555602; X86-NO-POPCOUNT-NEXT:    subl %ecx, %eax603; X86-NO-POPCOUNT-NEXT:    movl %eax, %ecx604; X86-NO-POPCOUNT-NEXT:    andl $858993459, %ecx # imm = 0x33333333605; X86-NO-POPCOUNT-NEXT:    shrl $2, %eax606; X86-NO-POPCOUNT-NEXT:    andl $858993459, %eax # imm = 0x33333333607; X86-NO-POPCOUNT-NEXT:    addl %ecx, %eax608; X86-NO-POPCOUNT-NEXT:    movl %eax, %ecx609; X86-NO-POPCOUNT-NEXT:    shrl $4, %ecx610; X86-NO-POPCOUNT-NEXT:    addl %eax, %ecx611; X86-NO-POPCOUNT-NEXT:    andl $252645135, %ecx # imm = 0xF0F0F0F612; X86-NO-POPCOUNT-NEXT:    imull $16843009, %ecx, %eax # imm = 0x1010101613; X86-NO-POPCOUNT-NEXT:    shrl $24, %eax614; X86-NO-POPCOUNT-NEXT:    retl615;616; X64-NO-POPCOUNT-LABEL: ctpop_mask16:617; X64-NO-POPCOUNT:       # %bb.0:618; X64-NO-POPCOUNT-NEXT:    movzwl %di, %eax619; X64-NO-POPCOUNT-NEXT:    shrl %edi620; X64-NO-POPCOUNT-NEXT:    andl $21845, %edi # imm = 0x5555621; X64-NO-POPCOUNT-NEXT:    subl %edi, %eax622; X64-NO-POPCOUNT-NEXT:    movl %eax, %ecx623; X64-NO-POPCOUNT-NEXT:    andl $858993459, %ecx # imm = 0x33333333624; X64-NO-POPCOUNT-NEXT:    shrl $2, %eax625; X64-NO-POPCOUNT-NEXT:    andl $858993459, %eax # imm = 0x33333333626; X64-NO-POPCOUNT-NEXT:    addl %ecx, %eax627; X64-NO-POPCOUNT-NEXT:    movl %eax, %ecx628; X64-NO-POPCOUNT-NEXT:    shrl $4, %ecx629; X64-NO-POPCOUNT-NEXT:    addl %eax, %ecx630; X64-NO-POPCOUNT-NEXT:    andl $252645135, %ecx # imm = 0xF0F0F0F631; X64-NO-POPCOUNT-NEXT:    imull $16843009, %ecx, %eax # imm = 0x1010101632; X64-NO-POPCOUNT-NEXT:    shrl $24, %eax633; X64-NO-POPCOUNT-NEXT:    retq634  %mask = and i32 %x, 65535635  %count = tail call i32 @llvm.ctpop.i32(i32 %mask)636  ret i32 %count637}638 639define i64 @ctpop_shifted_mask16(i64 %x) nounwind readnone {640; X86-POPCOUNT-LABEL: ctpop_shifted_mask16:641; X86-POPCOUNT:       # %bb.0:642; X86-POPCOUNT-NEXT:    movl $524280, %eax # imm = 0x7FFF8643; X86-POPCOUNT-NEXT:    andl {{[0-9]+}}(%esp), %eax644; X86-POPCOUNT-NEXT:    popcntl %eax, %eax645; X86-POPCOUNT-NEXT:    xorl %edx, %edx646; X86-POPCOUNT-NEXT:    retl647;648; X64-POPCOUNT-LABEL: ctpop_shifted_mask16:649; X64-POPCOUNT:       # %bb.0:650; X64-POPCOUNT-NEXT:    movabsq $2251765453946880, %rax # imm = 0x7FFF800000000651; X64-POPCOUNT-NEXT:    andq %rdi, %rax652; X64-POPCOUNT-NEXT:    popcntq %rax, %rax653; X64-POPCOUNT-NEXT:    retq654;655; X86-NO-POPCOUNT-LABEL: ctpop_shifted_mask16:656; X86-NO-POPCOUNT:       # %bb.0:657; X86-NO-POPCOUNT-NEXT:    movl {{[0-9]+}}(%esp), %ecx658; X86-NO-POPCOUNT-NEXT:    movl %ecx, %eax659; X86-NO-POPCOUNT-NEXT:    andl $524280, %eax # imm = 0x7FFF8660; X86-NO-POPCOUNT-NEXT:    shrl %ecx661; X86-NO-POPCOUNT-NEXT:    andl $87380, %ecx # imm = 0x15554662; X86-NO-POPCOUNT-NEXT:    subl %ecx, %eax663; X86-NO-POPCOUNT-NEXT:    movl %eax, %ecx664; X86-NO-POPCOUNT-NEXT:    andl $858993456, %ecx # imm = 0x33333330665; X86-NO-POPCOUNT-NEXT:    shrl $2, %eax666; X86-NO-POPCOUNT-NEXT:    andl $858993459, %eax # imm = 0x33333333667; X86-NO-POPCOUNT-NEXT:    addl %ecx, %eax668; X86-NO-POPCOUNT-NEXT:    movl %eax, %ecx669; X86-NO-POPCOUNT-NEXT:    shrl $4, %ecx670; X86-NO-POPCOUNT-NEXT:    addl %eax, %ecx671; X86-NO-POPCOUNT-NEXT:    andl $252645135, %ecx # imm = 0xF0F0F0F672; X86-NO-POPCOUNT-NEXT:    imull $16843009, %ecx, %eax # imm = 0x1010101673; X86-NO-POPCOUNT-NEXT:    shrl $24, %eax674; X86-NO-POPCOUNT-NEXT:    xorl %edx, %edx675; X86-NO-POPCOUNT-NEXT:    retl676;677; X64-NO-POPCOUNT-LABEL: ctpop_shifted_mask16:678; X64-NO-POPCOUNT:       # %bb.0:679; X64-NO-POPCOUNT-NEXT:    movabsq $2251765453946880, %rax # imm = 0x7FFF800000000680; X64-NO-POPCOUNT-NEXT:    andq %rdi, %rax681; X64-NO-POPCOUNT-NEXT:    shrq %rdi682; X64-NO-POPCOUNT-NEXT:    movabsq $375294242324480, %rcx # imm = 0x1555400000000683; X64-NO-POPCOUNT-NEXT:    andq %rdi, %rcx684; X64-NO-POPCOUNT-NEXT:    subq %rcx, %rax685; X64-NO-POPCOUNT-NEXT:    movabsq $3689348800998014976, %rcx # imm = 0x3333333000000000686; X64-NO-POPCOUNT-NEXT:    andq %rax, %rcx687; X64-NO-POPCOUNT-NEXT:    shrq $2, %rax688; X64-NO-POPCOUNT-NEXT:    movabsq $3689348813882916864, %rdx # imm = 0x3333333300000000689; X64-NO-POPCOUNT-NEXT:    andq %rax, %rdx690; X64-NO-POPCOUNT-NEXT:    addq %rcx, %rdx691; X64-NO-POPCOUNT-NEXT:    movq %rdx, %rax692; X64-NO-POPCOUNT-NEXT:    shrq $4, %rax693; X64-NO-POPCOUNT-NEXT:    addq %rdx, %rax694; X64-NO-POPCOUNT-NEXT:    movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F695; X64-NO-POPCOUNT-NEXT:    andq %rax, %rcx696; X64-NO-POPCOUNT-NEXT:    movabsq $72340172838076673, %rax # imm = 0x101010101010101697; X64-NO-POPCOUNT-NEXT:    imulq %rcx, %rax698; X64-NO-POPCOUNT-NEXT:    shrq $56, %rax699; X64-NO-POPCOUNT-NEXT:    retq700  %mask = and i64 %x, 2251765453946880 ; 65535 << 35701  %count = tail call i64 @llvm.ctpop.i64(i64 %mask)702  ret i64 %count703}704