POPCNT

Devuelve el número de bits a 1

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
F3 0F B8 /rPOPCNT r16, r/m16RMValidoValidoPOPCNT en r/m16
F3 0F B8 /rPOPCNT r32, r/m32RMValidoValidoPOPCNT en r/m32
F3 REX.W 0F B8 /rPOPCNT r64, r/m64RMValidoNo codificablePOPCNT en r/m64

Codificacion de operandos

Cada modo es un valor de la columna Op/En de arriba. Dice en que campo de la instruccion codificada va cada operando, en el orden en que se escriben, y si la instruccion lo lee, lo escribe o ambas cosas.

RM

  1. modrm.reg escriturabyte ModRM, campo reg (bits 5-3)
  2. modrm.rm lecturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide

Coste medido

Cargando las mediciones de arch-data...

Banderas nombradas

Descripción

Esta instrucción calcula el número de bits fijados a 1 en el segundo operando (fuente) y devuelve el conteo en el primer operando (un registro de destino).

Operación

Count = 0;

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

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

     THEN Count++; FI;

}

DEST := Count;

Banderas afectadas

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

Intel C/C++ compilador intrínseco

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

Excepciones

Modo protegido
#GP(0)Si un operando de memoria dirección efectiva está fuera de los segmentos CS, DS, ES, FS o GS.
#SS(0)Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. #PF (código predeterminado) Para un fallo de pagina.
#AC(0)Si se hace una referencia de memoria no alineada mientras que el nivel actual de privilegios es 3 y la comprobación de alineación está habilitada.
#UDSi CPUID.01H:ECX.POPCNT[23] = 0. Si el prefijo LOCK es usado.
Modo real
#GP(0)Si alguna parte del operando está fuera del espacio de dirección eficaz de 0 a 0FFFFH.
#SS(0)Si un operando de memoria dirección efectiva está fuera del límite del segmento SS.
#UDSi CPUID.01H:ECX.POPCNT[23] = 0. Si el prefijo LOCK es usado.
#GP(0)Si alguna parte del operando está fuera del espacio de dirección eficaz de 0 a 0FFFFH.
#SS(0)Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. #PF (código predeterminado) Para un fallo de pagina.
#AC(0)Si se hace una referencia de memoria no alineada mientras se activa la comprobación de alineación.
#UDSi CPUID.01H:ECX.POPCNT[23] = 0. Si el prefijo LOCK es usado.
Modo de compatibilidad
Las mismas excepciones que en modo protegido.
Modo de 64 bits
#GP(0)Si la dirección de memoria está en forma no canónica.
#SS(0)Si una dirección de memoria que hace referencia al segmento SS está en forma no canónica. #PF (código predeterminado) Para un fallo de pagina.
#AC(0)Si la comprobación de alineación está habilitada y se hace una referencia de memoria no alineada mientras que el nivel de privilegio actual es 3.
#UDSi CPUID.01H:ECX.POPCNT[23] = 0. Si el prefijo LOCK es usado.

Fuentes