POPCNT
Devuelve el número de bits a 1
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
F3 0F B8 /r | POPCNT r16, r/m16 | RM | Valido | Valido | POPCNT en r/m16 |
F3 0F B8 /r | POPCNT r32, r/m32 | RM | Valido | Valido | POPCNT en r/m32 |
F3 REX.W 0F B8 /r | POPCNT r64, r/m64 | RM | Valido | No codificable | POPCNT 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
modrm.regescriturabyte ModRM, campo reg (bits 5-3)modrm.rmlecturabyte 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
CFAcarreoPFParidadAFAcarreo auxiliarZFCeroSFSignoOFDesbordamiento
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. |
#UD | Si 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. |
#UD | Si 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. |
#UD | Si 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. |
#UD | Si CPUID.01H:ECX.POPCNT[23] = 0. Si el prefijo LOCK es usado. |