El conjunto de instrucciones XOP ( eXtended Operations [1] ) , anunciado por AMD el 1 de mayo de 2009, es una extensión de las instrucciones centrales SSE de 128 bits en el conjunto de instrucciones x86 y AMD64 para el núcleo del procesador Bulldozer , que se lanzó en octubre. 12, 2011. [2] Sin embargo, AMD eliminó el soporte para XOP desde Zen (microarquitectura) en adelante. [3]
El conjunto de instrucciones XOP contiene varios tipos diferentes de instrucciones vectoriales, ya que originalmente fue pensado como una actualización importante de SSE . La mayoría de las instrucciones son instrucciones de números enteros, pero también contienen instrucciones de permutación de punto flotante y extracción de fracciones de punto flotante. Consulte el índice para obtener una lista de tipos de instrucciones.
XOP es un subconjunto revisado de lo que originalmente se pretendía como SSE5 . Se cambió para que fuera similar pero sin superponerse con AVX , las partes que se superponían con AVX se eliminaron o se trasladaron a estándares separados como FMA4 ( multiplicación-acumulación de vectores de punto flotante ) y CVT16 ( conversión de punto flotante de media precisión implementada como F16C por Intel ). [1]
Todas las instrucciones SSE5 que eran equivalentes o similares a las instrucciones de los conjuntos de instrucciones AVX y FMA4 anunciados por Intel se han modificado para utilizar la codificación propuesta por Intel. Las instrucciones de números enteros sin equivalentes en AVX se clasificaron como la extensión XOP. [1] Las instrucciones XOP tienen un byte de código de operación 8F ( hexadecimal ), pero por lo demás un esquema de codificación casi idéntico al de AVX con el prefijo VEX de 3 bytes.
Los comentaristas [4] han visto esto como evidencia de que Intel no ha permitido a AMD usar ninguna parte del gran espacio de codificación VEX. AMD se ha visto obligada a utilizar códigos diferentes para evitar el uso de cualquier combinación de códigos que Intel podría estar utilizando en su proceso de desarrollo para otra cosa. El esquema de codificación XOP es lo más parecido técnicamente posible al esquema VEX sin correr el riesgo de que los códigos AMD se superpongan con futuros códigos Intel. Esta inferencia es especulativa, ya que no hay información pública disponible sobre las negociaciones entre las dos empresas sobre este tema.
El uso del byte 8F requiere que los m-bits (ver esquema de codificación VEX ) tengan un valor mayor o igual a 8 para evitar superposiciones con instrucciones existentes. [Nota 1] El byte C4 utilizado en el esquema VEX no tiene tal restricción. Esto puede impedir el uso de los m-bits para otros fines en el futuro en el esquema XOP, pero no en el esquema VEX. Otro posible problema es que los bits pp tengan el valor 00 en el esquema XOP, mientras que tienen el valor 01 en el esquema VEX para instrucciones que no tienen equivalente heredado. Esto puede complicar el uso de los bits pp para otros fines en el futuro.
Un problema de compatibilidad similar es la diferencia entre los conjuntos de instrucciones FMA3 y FMA4 . Intel propuso inicialmente FMA4 en la versión 3 de la especificación AVX/FMA para reemplazar el FMA de 3 operandos propuesto por AMD en SSE5. Después de que AMD adoptó FMA4, Intel canceló el soporte de FMA4 y volvió a FMA3 en la versión 5 de la especificación AVX/FMA (consulte el historial de FMA ). [1] [5] [6]
En marzo de 2015, AMD reveló explícitamente en la descripción del parche para el paquete GNU Binutils que Zen , su arquitectura x86-64 de tercera generación en su primera iteración (znver1 – Zen, versión 1), no soportará TBM
, FMA4
y las instrucciones desarrolladas XOP
. LWP
específicamente para la familia de microarquitecturas "Bulldozer". [7] [8]
Estas son versiones enteras del conjunto de instrucciones FMA . Estas son las cuatro instrucciones de operandos similares a FMA4 y todas operan con enteros con signo.
Las instrucciones de suma horizontal agregan valores adyacentes en el vector de entrada entre sí. El tamaño de salida en las instrucciones siguientes describe el ancho de la suma horizontal realizada. Por ejemplo, byte horizontal a palabra agrega dos bytes a la vez y devuelve el resultado como vector de palabras, pero byte a palabra cuádruple suma ocho bytes a la vez y devuelve el resultado como vector de cuatro palabras. En SSSE3 se pueden encontrar seis instrucciones horizontales adicionales de suma y resta , pero operan en dos vectores de entrada y solo realizan dos y dos operaciones.
Este conjunto de instrucciones de comparación de vectores toma un inmediato como argumento adicional. Lo inmediato controla qué tipo de comparación se realiza. Hay ocho comparaciones posibles para cada instrucción. Los vectores se comparan y todas las comparaciones que se evalúan como verdaderas establecen todos los bits correspondientes en el destino en 1, y las comparaciones falsas establecen todos los mismos bits en 0. Este resultado se puede usar directamente en la instrucción VPCMOV para un movimiento condicional vectorizado .
VPCMOV
funciona como una variante bit a bit de las instrucciones de mezcla en SSE4 . Al igual que la instrucción AVX VPBLENDVB, es una instrucción de cuatro operandos con tres operandos de origen y un destino. Para cada bit en el tercer operando (que actúa como selector), 1 selecciona el mismo bit en la primera fuente y 0 selecciona el mismo bit en la segunda fuente. Cuando se usa junto con las instrucciones de comparación de vectores XOP anteriores, esto se puede usar para implementar un movimiento ternario vectorizado, o si la segunda entrada es la misma que el destino, un movimiento condicional ( CMOV
).
Las instrucciones de desplazamiento aquí difieren de las de SSE2 en que pueden desplazar cada unidad en una cantidad diferente utilizando un registro vectorial interpretado como enteros empaquetados con signo. El signo indica la dirección de desplazamiento o rotación, con valores positivos que provocan un desplazamiento a la izquierda y un desplazamiento negativo a la derecha [10]. Intel ha especificado un conjunto diferente e incompatible de instrucciones de desplazamiento de vector variable en AVX2. [11]
VPPERM
es una instrucción única que combina la instrucción SSSE3 PALIGNR y PSHUFB y agrega más a ambas. Algunos lo comparan con la instrucción AltivecVPERM
. [12] Toma tres registros como entrada, los dos primeros son registros fuente y el tercero el registro selector. Cada byte en el selector selecciona uno de los bytes en uno de los dos registros de entrada para la salida. El selector también puede aplicar efectos en los bytes seleccionados, como establecerlo en 0, invertir el orden de los bits y repetir el bit más significativo. Además, todos los efectos o la entrada se pueden invertir.
Las instrucciones VPERMIL2PD
y VPERMIL2PS
son dos versiones fuente de las instrucciones VPERMILPD
y VPERMILPS
en AVX, lo que significa que VPPERM
pueden seleccionar la salida de cualquiera de los campos en las dos entradas.
Estas instrucciones extraen la parte fraccionaria del punto flotante, es decir, la parte que se perdería en la conversión a entero.
Pero dado que Zen es un diseño limpio, hay algunas extensiones de conjunto de instrucciones que se encuentran en los procesadores Bulldozer que no se encuentran en Zen/znver1. Los que ya no están presentes incluyen FMA4 y XOP.