POPCNT

Return the Count of Number of Bits Set to 1

stableVMJITAOTinstruction

Encodings

OpcodeInstructionOp/En64-bitCompat/LegacyDescription
F3 0F B8 /rPOPCNT r16, r/m16RMValidValidPOPCNT on r/m16
F3 0F B8 /rPOPCNT r32, r/m32RMValidValidPOPCNT on r/m32
F3 REX.W 0F B8 /rPOPCNT r64, r/m64RMValidNot encodablePOPCNT on r/m64

Operand encoding

Each mode is a value of the Op/En column above. It says which field of the encoded instruction carries each operand, in the order they are written, and whether the instruction reads it, writes it or both.

RM

  1. modrm.reg escrituraModRM byte, reg field (bits 5-3)
  2. modrm.rm lecturaModRM byte, r/m field (bits 2-0); with the SIB byte and the displacement when the mod field asks for them

Measured cost

Loading measurements from arch-data...

Flags named

Description

This instruction calculates the number of bits set to 1 in the second operand (source) and returns the count in the first operand (a destination register).

Operation

Count = 0;

For (i=0; i < OperandSize; i++)

{    IF (SRC[ i] = 1) // i'th bit

     THEN Count++; FI;

}

DEST := Count;

Flags affected

OF, SF, ZF, AF, CF, PF are all cleared. ZF is set if SRC = 0, otherwise ZF is cleared.

Intel C/C++ compiler intrinsics

POPCNT int _mm_popcnt_u32(unsigned int a);
POPCNT int64_t _mm_popcnt_u64(unsigned __int64 a);

Exceptions

Protected mode
#GP(0)If a memory operand effective address is outside the CS, DS, ES, FS or GS segments.
#SS(0)If a memory operand effective address is outside the SS segment limit. #PF (fault-code) For a page fault.
#AC(0)If an unaligned memory reference is made while the current privilege level is 3 and alignment checking is enabled.
#UDIf CPUID.01H:ECX.POPCNT[23] = 0. If LOCK prefix is used.
Real address mode
#GP(0)If any part of the operand lies outside of the effective address space from 0 to 0FFFFH.
#SS(0)If a memory operand effective address is outside the SS segment limit.
#UDIf CPUID.01H:ECX.POPCNT[23] = 0. If LOCK prefix is used. Virtual 8086 Mode Exceptions
#GP(0)If any part of the operand lies outside of the effective address space from 0 to 0FFFFH.
#SS(0)If a memory operand effective address is outside the SS segment limit. #PF (fault-code) For a page fault.
#AC(0)If an unaligned memory reference is made while alignment checking is enabled.
#UDIf CPUID.01H:ECX.POPCNT[23] = 0. If LOCK prefix is used.
Compatibility mode
Same exceptions as in Protected Mode.
64-bit mode
#GP(0)If the memory address is in a non-canonical form.
#SS(0)If a memory address referencing the SS segment is in a non-canonical form. #PF (fault-code) For a page fault.
#AC(0)If alignment checking is enabled and an unaligned memory reference is made while the current privilege level is 3.
#UDIf CPUID.01H:ECX.POPCNT[23] = 0. If LOCK prefix is used.

Sources