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