Los conjuntos de instrucciones de manipulación de bits ( conjuntos BMI ) son extensiones de la arquitectura del conjunto de instrucciones x86 para microprocesadores de Intel y AMD . El propósito de estos conjuntos de instrucciones es mejorar la velocidad de manipulación de bits . Todas las instrucciones en estos conjuntos no son SIMD y operan solo en registros de propósito general .
Hay dos conjuntos publicados por Intel: BMI (aquí denominado BMI1) e BMI2; ambos fueron introducidos con la microarquitectura Haswell . AMD publicó otros dos conjuntos: ABM ( Advanced Bit Manipulation , que también es un subconjunto de SSE4a implementado por Intel como parte de SSE4.2 y BMI1), y TBM ( Trailing Bit Manipulation , una extensión introducida con procesadores basados en Piledriver como una extensión de BMI1, pero volvió a caer en los procesadores basados en Zen ). [1]
ABM (manipulación de bits avanzada)
ABM solo se implementa como una única instrucción establecida por AMD; todos los procesadores AMD admiten ambas instrucciones o ninguna. Intel considera POPCNT
como parte de SSE4.2 y LZCNT
como parte de BMI1. POPCNT
tiene una bandera CPUID separada ; sin embargo, Intel usa la ABM
bandera de AMD para indicar LZCNT
soporte (ya que LZCNT
completa el ABM). [2]
Codificación | Instrucción | Descripción [3] |
---|---|---|
F3 0F B8 /r | POPCNT | Recuento de población |
F3 0F BD /r | LZCNT | Cuenta de ceros iniciales |
LZCNT
está relacionado con la BSR
instrucción Bit Scan Reverse ( ), pero establece los indicadores ZF (si el resultado es cero) y CF (si la fuente es cero) en lugar de establecer ZF (si la fuente es cero). Además, produce un resultado definido (el tamaño del operando fuente en bits) si el operando fuente es cero. Para un argumento distinto de cero, la suma de LZCNT
y los BSR
resultados es el ancho de bits del argumento menos 1 (por ejemplo, si el argumento de 32 bits es 0x000f0000
, LZCNT da 12 y BSR da 19).
La codificación de LZCNT
es tal que si no se admite ABM, la BSR
instrucción se ejecuta en su lugar. [3] : 227
BMI1 (conjunto de instrucciones de manipulación de bits 1)
Las instrucciones siguientes son las habilitadas por el BMI
bit en CPUID. Intel lo considera oficialmente LZCNT
como parte de BMI, pero anuncia LZCNT
soporte utilizando la ABM
marca de función CPUID. [2] BMI1 está disponible en AMD Jaguar , [4] Piledriver [5] y procesadores más nuevos, y en Intel Haswell [6] y procesadores más nuevos.
Codificación | Instrucción | Descripción [2] | Expresión de C equivalente [7] [8] |
---|---|---|---|
VEX.LZ.0F38 F2 /r | ANDN | Lógico y no | ~ x & y |
VEX.LZ.0F38 F7 /r | BEXTR | Extracto de campo de bits (con registro) | (src >> inicio) & ((1 << len) - 1) |
VEX.LZ.0F38 F3 /3 | BLSI | Extraer el bit aislado del conjunto más bajo | x y -x |
VEX.LZ.0F38 F3 /2 | BLSMSK | Lleva la máscara hasta el bit más bajo | x ^ (x - 1) |
VEX.LZ.0F38 F3 /1 | BLSR | Restablecer el bit establecido más bajo | x y (x - 1) |
F3 0F BC /r | TZCNT | Cuente el número de bits cero finales | 31 + (! X) - (((x & -x) & 0x0000FFFF)? 16: 0) - (((x & -x) & 0x00FF00FF)? 8: 0) - (((x & -x) & 0x0F0F0F0F)? 4: 0) - (((x & -x) y 0x33333333)? 2: 0) - (((x & -x) & 0x55555555)? 1: 0) |
TZCNT
es casi idéntica a la BSF
instrucción Bit Scan Forward ( ), pero establece los indicadores ZF (si el resultado es cero) y CF (si la fuente es cero) en lugar de establecer la ZF (si la fuente es cero). Para un argumento distinto de cero, el resultado de TZCNT
y BSF
es igual.
Al igual que con LZCNT
, la codificación de TZCNT
es tal que si no se admite BMI1, la BSF
instrucción se ejecuta en su lugar. [3] : 352
BMI2 (conjunto de instrucciones de manipulación de bits 2)
Intel introdujo BMI2 junto con BMI1 en su línea de procesadores Haswell. Solo AMD ha producido procesadores compatibles con BMI1 sin BMI2; BMI2 es compatible con la arquitectura Excavator de AMD y versiones posteriores. [9]
Codificación | Instrucción | Descripción |
---|---|---|
VEX.LZ.0F38 F5 /r | BZHI | Cero bits altos comenzando con la posición de bit especificada [src & (1 << inx) -1]; |
VEX.LZ.F2.0F38 F6 /r | MULX | Multiplicar sin firmar sin afectar las banderas y los registros de destino arbitrarios |
VEX.LZ.F2.0F38 F5 /r | PDEP | Depósito de bits en paralelo |
VEX.LZ.F3.0F38 F5 /r | PEXT | Extracto de bits paralelos |
VEX.LZ.F2.0F3A F0 /r ib | RORX | Gire a la derecha lógica sin afectar las banderas |
VEX.LZ.F3.0F38 F7 /r | SARX | Desplazar la aritmética a la derecha sin afectar las banderas |
VEX.LZ.F2.0F38 F7 /r | SHRX | Desplazar a la derecha lógica sin afectar las banderas |
VEX.LZ.66.0F38 F7 /r | SHLX | Desplazar a la izquierda lógica sin afectar las banderas |
Depósito y extracción de bits en paralelo
Las instrucciones PDEP
y PEXT
son nuevas instrucciones de compresión y expansión a nivel de bits generalizadas. Toman dos entradas; uno es una fuente y el otro es un selector. El selector es un mapa de bits que selecciona los bits que se van a empaquetar o desempacar. PEXT
copia los bits seleccionados del origen a los bits contiguos de orden inferior del destino; los bits de destino de orden superior se borran. PDEP
hace lo contrario para los bits seleccionados: los bits contiguos de orden inferior se copian en los bits seleccionados del destino; otros bits de destino se borran. Esto se puede utilizar para extraer cualquier campo de bits de la entrada, e incluso realizar una gran cantidad de reorganización a nivel de bits que anteriormente habría sido costosa. Mientras que lo que hacen estas instrucciones es similar a nivel de bit recopilar la dispersión frontal instrucciones SIMD, PDEP
y PEXT
las instrucciones (como el resto de los conjuntos de instrucciones IMC) operan en un registro de propósito general. [10]
Las instrucciones están disponibles en versiones de 32 y 64 bits. Un ejemplo que utiliza una fuente arbitraria y un selector en modo de 32 bits es:
Instrucción | Máscara selectora | Fuente | Destino |
---|---|---|---|
PEXT | 0xff00fff0 | 0x12345678 | 0x00012567 |
PDEP | 0xff00fff0 | 0x00012567 | 0x12005670 |
Los procesadores AMD anteriores a Zen 3 [11] que implementan PDEP y PEXT lo hacen en microcódigo, con una latencia de 18 ciclos [12] en lugar de un solo ciclo. Como resultado, si se conoce la máscara, a menudo es más rápido usar otras instrucciones en AMD.
TBM (manipulación de bits de seguimiento)
TBM consta de instrucciones complementarias al conjunto de instrucciones iniciado por BMI1; su naturaleza complementaria significa que no es necesario que se utilicen directamente, sino que pueden ser generados por un compilador optimizador cuando se admiten. AMD introdujo TBM junto con BMI1 en su línea de procesadores Piledriver [5] ; Los procesadores posteriores AMD Jaguar y basados en Zen no son compatibles con TBM. [4] Ningún procesador Intel (al menos a través de Coffee Lake) es compatible con TBM.
Codificación | Instrucción | Descripción [3] | Expresión de C equivalente [13] |
---|---|---|---|
XOP.LZ.0A 10 /r id | BEXTR | Extracto de campo de bits (con inmediato) | (src >> inicio) & ((1 << len) - 1) |
XOP.LZ.09 01 /1 | BLCFILL | Llenar desde el bit claro más bajo | x y (x + 1) |
XOP.LZ.09 02 /6 | BLCI | Aislar el bit claro más bajo | x | ~ (x + 1) |
XOP.LZ.09 01 /5 | BLCIC | Aislar el bit claro más bajo y complementar | ~ x y (x + 1) |
XOP.LZ.09 02 /1 | BLCMSK | Máscara del bit claro más bajo | x ^ (x + 1) |
XOP.LZ.09 01 /3 | BLCS | Establecer el bit de borrado más bajo | x | (x + 1) |
XOP.LZ.09 01 /2 | BLSFILL | Llenar desde el bit más bajo | x | (x - 1) |
XOP.LZ.09 01 /6 | BLSIC | Aísle el bit y el complemento más bajos | ~ x | (x - 1) |
XOP.LZ.09 01 /7 | T1MSKC | Máscara inversa de los finales | ~ x | (x + 1) |
XOP.LZ.09 01 /4 | TZMSK | Máscara de ceros finales | ~ x y (x - 1) |
CPU de apoyo
- Intel
- Procesadores Intel Nehalem y más nuevos (como Sandy Bridge , Ivy Bridge ) (compatible con POPCNT)
- Procesadores Intel Silvermont (compatible con POPCNT)
- Procesadores Intel Haswell y más nuevos (como Skylake , Broadwell ) (compatibles con ABM, BMI1 y BMI2) [6]
- AMD
- Procesadores basados en K10 (compatibles con ABM)
- Procesadores "Cat" de bajo consumo
- Procesadores basados en Bobcat (compatibles con ABM) [14]
- Procesadores basados en Jaguar y más nuevos (compatibles con ABM y BMI1) [4]
- Procesadores basados en Puma y más nuevos (compatibles con ABM y BMI1) [4]
- Procesadores de "equipo pesado"
- Procesadores basados en bulldozer (compatible con ABM)
- Procesadores basados en Piledriver (compatibles con ABM, BMI1 y TBM) [1]
- Procesadores basados en apisonadora (compatibles con ABM, BMI1 y TBM)
- Procesadores basados en excavadoras y más nuevos (compatibles con ABM, BMI1, BMI2 y TBM; PEXT y PDEP microcodificados) [9]
- Procesadores basados en Zen , basados en Zen + (compatibles con ABM, BMI1 y BMI2; PEXT y PDEP microcodificados)
- Procesadores Zen 3 y posteriores (compatibles con ABM, BMI1 y BMI2; implementación completa de hardware)
Tenga en cuenta que la compatibilidad con la extensión de instrucciones significa que el procesador es capaz de ejecutar las instrucciones admitidas con fines de compatibilidad de software. Es posible que el procesador no funcione bien al hacerlo. Por ejemplo, los procesadores Excavator a Zen 2 implementan instrucciones PEXT y PDEP usando microcódigo, lo que hace que las instrucciones se ejecuten significativamente más lentamente que el mismo comportamiento recreado usando otras instrucciones. [15] (Un método de software llamado "zp7" es, de hecho, más rápido en estas máquinas). [16] Para un rendimiento óptimo, se recomienda que los desarrolladores de compiladores elijan usar instrucciones individuales en las extensiones basadas en perfiles de rendimiento específicos de la arquitectura en lugar de sobre la disponibilidad de la extensión.
Ver también
- Extensiones vectoriales avanzadas (AVX)
- Conjunto de instrucciones AES
- Conjunto de instrucciones CLMUL
- F16C
- Conjunto de instrucciones FMA
- Intel ADX
- Conjunto de instrucciones XOP
- Códigos de operación Intel BCD (también utilizados para técnicas avanzadas de manipulación de bits)
Referencias
- ^ a b "Nuevo" Bulldozer "y" Piledriver "Instrucciones" (PDF) . Consultado el 3 de enero de 2014 .
- ^ a b c "Referencia de programación de Intel Advanced Vector Extensions" (PDF) . intel.com . Intel . Junio de 2011 . Consultado el 3 de enero de 2014 .
- ^ a b c d "Manual del programador de la arquitectura AMD64, volumen 3: instrucciones de uso general y del sistema" (PDF) . Revisión 3.32. AMD . Marzo de 2021. Archivado (PDF) desde el original el 8 de abril de 2021 . Consultado el 8 de abril de 2021 .
- ^ a b c d "Ficha técnica de la serie A de AMD 16h de la familia" (PDF) . amd.com . AMD . Octubre de 2013 . Consultado el 2 de enero de 2014 .
- ^ a b Hollingsworth, Brent. Instrucciones "Nuevo" Bulldozer "y" Piledriver " (pdf) . Advanced Micro Devices, Inc . Consultado el 11 de diciembre de 2014 .
- ^ a b Locktyukhin, Max. "Cómo detectar el soporte de instrucciones nuevas en la familia de procesadores Intel® Core ™ de cuarta generación" . www.intel.com . Intel . Consultado el 11 de diciembre de 2014 .
- ^ "bmiintrin.h de GCC 4.8" . Consultado el 17 de marzo de 2014 .
- ^ https://github.com/abseil/abseil-cpp/blob/ce4bc927755fdf0ed03d679d9c7fa041175bb3cb/absl/base/internal/bits.h#L188
- ^ a b "AMD Excavator Core puede traer aumentos dramáticos de rendimiento" . Laboratorios X-bit. 18 de octubre de 2013. Archivado desde el original el 23 de octubre de 2013 . Consultado el 24 de noviembre de 2013 .
- ^ Yedidya Hilewitz; Ruby B. Lee (agosto de 2009). "Una nueva base para cambiadores en procesadores de propósito general para manipulaciones de bits existentes y avanzadas" (PDF) . palms.princeton.edu . Transacciones IEEE en computadoras. págs. 1035-1048 . Consultado el 10 de febrero de 2014 .
- ^ https://en.wikichip.org/wiki/amd/microarchitectures/zen_3#Key_changes_from_Zen_2
- ^ https://www.agner.org/optimize/instruction_tables.pdf
- ^ "tbmintrin.h de GCC 4.8" . Consultado el 17 de marzo de 2014 .
- ^ "Guía para desarrolladores de BIOS y kernel para la familia AMD 14h" (PDF) . Consultado el 3 de enero de 2014 .
- ^ "Informe de progreso de los delfines: diciembre de 2019 y enero de 2020" . Emulador de delfines . Consultado el 7 de febrero de 2020 .
- ^ Wegner, Zach (4 de noviembre de 2020). "zwegner / zp7" .
Otras lecturas
- Warren Jr., Henry S. (2013). Hacker's Delight (2 ed.). Addison Wesley - Pearson Education, Inc. ISBN 978-0-321-84268-8.
enlaces externos
- Guía de intrínsecos de Intel