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 de estos conjuntos no son SIMD y funcionan únicamente en registros de uso general .
Hay dos conjuntos publicados por Intel: BMI (ahora denominado BMI1) y BMI2; Ambos fueron presentados con la microarquitectura Haswell con funciones de coincidencia BMI1 ofrecidas por el conjunto de instrucciones ABM de AMD y BMI2 extendiéndolas. 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 ( Traling Bit Manipulation , una extensión introducida con los procesadores basados en Piledriver como una extensión de BMI1, pero cayó nuevamente en los procesadores basados en Zen ). [1]
AMD fue el primero en introducir las instrucciones que ahora forman BMI1 de Intel como parte de su conjunto de instrucciones ABM ( Advanced Bit Manipulation ), y luego agregó soporte para las nuevas instrucciones BMI2 de Intel. AMD anuncia hoy la disponibilidad de estas funciones a través de las cpuflags BMI1 y BMI2 de Intel e instruye a los programadores a orientarlas en consecuencia. [2]
Si bien Intel considera POPCNT
como parte de SSE4.2 y LZCNT
como parte de BMI1, tanto Intel como AMD anuncian la presencia de estas dos instrucciones individualmente. POPCNT
tiene un indicador CPUID separado con el mismo nombre, e Intel y AMD usan ABM
el indicador de AMD para indicar LZCNT
soporte (ya que LZCNT
combinado con BMI1 y BMI2 completa el conjunto de instrucciones ABM ampliado). [2] [3]
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 configurar 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 BSR
los 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. [4] : 227
Las instrucciones siguientes son las habilitadas por el BMI
bit en CPUID. Intel lo considera oficialmente LZCNT
parte de BMI, pero anuncia LZCNT
soporte utilizando el ABM
indicador de función CPUID. [3] BMI1 está disponible en Jaguar de AMD , [5] Piledriver [6] y procesadores más nuevos, y en Haswell de Intel [7] y procesadores más nuevos.
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 configurar 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 BMI1 no es compatible, entonces BSF
se ejecuta la instrucción. [4] : 352
Intel introdujo BMI2 junto con BMI1 en su línea de procesadores Haswell. Sólo AMD ha producido procesadores compatibles con BMI1 sin BMI2; BMI2 es compatible con la arquitectura Excavator de AMD y versiones más recientes. [10]
Las instrucciones PDEP
y PEXT
son nuevas instrucciones generalizadas de compresión y expansión a nivel de bits. 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 desempaquetar. PEXT
copia bits seleccionados del origen a 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; se borran otros bits de destino. Esto se puede utilizar para extraer cualquier campo de bits de la entrada, e incluso realizar una gran cantidad de mezclas a nivel de bits que antes habrían sido costosas. Si bien lo que hacen estas instrucciones es similar a las instrucciones SIMD de recopilación y dispersión a nivel de bits , PDEP
las PEXT
instrucciones (como el resto de los conjuntos de instrucciones de BMI) operan en registros de propósito general. [11]
Las instrucciones están disponibles en versiones de 32 y 64 bits. Un ejemplo que utiliza una fuente y un selector arbitrarios en modo de 32 bits es:
Los procesadores AMD anteriores a Zen 3 [12] que implementan PDEP y PEXT lo hacen en microcódigo, con una latencia de 18 ciclos [13] en lugar de 3 ciclos (Zen 3). [14] Como resultado, suele ser más rápido utilizar otras instrucciones en estos procesadores. [15]
TBM consta de instrucciones complementarias al conjunto de instrucciones iniciado por BMI1; su naturaleza complementaria significa que no necesariamente deben usarse directamente, sino que pueden generarse mediante un compilador de optimización cuando sean compatibles. AMD introdujo TBM junto con BMI1 en su línea de procesadores Piledriver [6] ; Los procesadores posteriores AMD Jaguar y Zen no son compatibles con TBM. [5] Ningún procesador Intel (al menos a través de Alder Lake ) admite TBM.
Tenga en cuenta que la compatibilidad con la extensión de instrucciones significa que el procesador es capaz de ejecutar las instrucciones admitidas por motivos de compatibilidad de software. Es posible que el procesador no funcione bien al hacerlo. Por ejemplo, los procesadores Excavator a través de 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. [19] (Un método de software llamado "zp7" es, de hecho, más rápido en estas máquinas). [20] Para un rendimiento óptimo, se recomienda que los desarrolladores de compiladores opten por utilizar instrucciones individuales en las extensiones basadas en perfiles de rendimiento específicos de la arquitectura en lugar de sobre la disponibilidad de extensiones.