El prefijo VEX (de "extensiones vectoriales") y el esquema de codificación VEX son una extensión de la arquitectura del conjunto de instrucciones x86-64 para microprocesadores de Intel , AMD y otros. Se introdujo con el conjunto de instrucciones AVX .
El prefijo VEX consta de tres bytes y puede añadirse a instrucciones nuevas y existentes. Es un superconjunto del prefijo REX y proporciona un total de 16 bits de información. El prefijo VEX también puede codificarse en una variante más corta de dos bytes si los bits omitidos tienen valores específicos.
Características
El esquema de codificación VEX permite la definición de nuevas instrucciones y la extensión o modificación de códigos de instrucciones previamente existentes . Esto cumple los siguientes propósitos:
- El mapa de códigos de operación se amplía para dejar espacio para futuras instrucciones.
- Permite que los códigos de instrucción tengan hasta cuatro operandos (más el valor inmediato), mientras que el esquema original solo permite dos operandos (más el valor inmediato).
- Permite ampliar el tamaño de los registros vectoriales SIMD desde los registros XMM de 128 bits hasta los registros YMM de 256 bits. Existe la posibilidad de ampliar aún más el tamaño de los registros.
- Permite modificar instrucciones existentes de dos operandos para convertirlas en instrucciones no destructivas de tres operandos, donde el registro de destino es diferente de ambos registros de origen. Por ejemplo, c ← a + b en lugar de a ← a + b (donde la instrucción modifica el registro a ).
El prefijo VEX reemplaza los bytes de prefijo y de escape de las instrucciones más comunes. En muchos casos, la cantidad de bytes de prefijo y de escape reemplazados coincide con la cantidad de bytes del prefijo VEX, de modo que la longitud total de la instrucción codificada con VEX es la misma que la del código de instrucción original. En otros casos, la versión codificada con VEX es más larga o más corta que el código original. En modo de 32 bits, las instrucciones codificadas con VEX solo pueden acceder a los primeros 8 registros YMM/XMM; las codificaciones para los demás registros se interpretarían como las instrucciones LDS y LES originales, que no son compatibles con el modo de 64 bits.
Diferencia semántica SSE
Si bien es necesario para las operaciones AVX de 256 bits , el prefijo VEX simplemente proporciona una codificación alternativa para las operaciones SSE de 128 bits. En general, la operación es idéntica independientemente de la codificación utilizada. Sin embargo, existe una diferencia importante:
Cuando se utiliza un prefijo VEX, los bits altos del registro de destino se borran (se ponen a cero), mientras que las operaciones SSE sin VEX dejan los bits altos de los registros SIMD de destino sin modificar.
Esto no afecta al cálculo en sí, pero sí a las operaciones de guardado y restauración necesarias. En concreto, una función llamada, escrita sin conocimiento de AVX o VEX, puede guardar un registro guardado por la función llamada , usar dicho registro y restaurar su valor mediante operaciones de 128 bits, todo ello sin alterar los bits más significativos.
Esta fusión de porciones no modificadas y recién calculadas de un registro es difícil para la optimización (ahora omnipresente) del cambio de nombre de registros , ya que las porciones sin cambios del registro de destino deben copiarse al registro de destino renombrado. Los procesadores x86 utilizan técnicas especiales para optimizar esto (como la vzeroupperinstrucción ), pero aún así conlleva una penalización en el rendimiento. [ 1 ]
Codificación de instrucciones
El esquema de codificación VEX utiliza un prefijo de código de operación que consta de dos o tres bytes , que se puede agregar a códigos de instrucción existentes o nuevos. [ 2 ]
Dos instrucciones (que anteriormente se definían como códigos de operación no válidos en el modo de 64 bits) se reutilizaron como el byte inicial de los nuevos prefijos VEX: 0xC4para la variante de tres bytes y 0xC5para la variante de dos bytes.
El prefijo VEX reemplaza los prefijos de código de operación 0x66, 0xF2y 0xF3, el prefijo REX y los prefijos de código de operación , o . No se puede 0x0Fusar 0x0F 0x38con códigos de operación de un byte que no comiencen con , ni con el prefijo LOCK ( ). Solo puede ir precedido por prefijos de tamaño de dirección ( ) o segmento ( , , , , , ).0x0F 0x3A0x0F0xF00x670x260x2E0x360x3E0x640x65
En la arquitectura x86, las instrucciones con un operando de memoria casi siempre utilizan el byte ModR/M que especifica el modo de direccionamiento . Este byte tiene tres campos de bits:
- mod , bits [7:6] - combinado con el campo r/m , codifica 8 registros o 24 modos de direccionamiento. También codifica información de código de operación para algunas instrucciones.
- reg/opcode , bits [5:3]: dependiendo del byte del código de operación principal, especifica un registro o tres bits más de información del código de operación.
- r/m , bits [2:0]: puede especificar un registro como operando o combinarse con el campo mod para codificar un modo de direccionamiento.
Las formas de direccionamiento de 32 bits de base más índice y escala más índice (codificadas con r/m = 100 y mod ≠ 11) requieren otro byte de direccionamiento, el byte SIB. Tiene los siguientes campos:
- factor de escala , codificado con bits [7:6]
- Registro de índice , bits [5:3]
- registro base , bits [2:0].
El prefijo VEX3 contiene todos los campos de bits del prefijo REX, así como otros prefijos, ampliando el modo de direccionamiento, la enumeración de registros, el tamaño y el ancho de los operandos:
- Los bits R̅, X̅ y B̅ son complementos de los bits R, X y B del prefijo REX; estos proporcionan un cuarto bit (alto) para los campos de índice de registro (registro ModRM, índice SIB y registros ModRM r/m; base SIB; o campos de registro de código de operación, respectivamente) lo que permite el acceso a 16 registros en lugar de 8.
- Un bit W, equivalente al bit W del prefijo REX, especifica un operando de 64 bits; para instrucciones que no son de tipo entero, es un bit de extensión de código de operación general.
- Cuatro bits v̅ son el complemento de un índice de registro fuente adicional.
- Un bit L indica la longitud del vector; 0 para registros SSE (XMM) de 128 bits y 1 para registros AVX (YMM) de 256 bits.
- Dos bits p codifican bytes de prefijo adicionales. Los valores 0, 1, 2 y 3 corresponden a los prefijos implícitos no, 0x66, 0xF3 y 0xF2, respectivamente. Estos codifican el tipo de operando para las instrucciones de punto flotante SSE: simple empaquetado, doble empaquetado, simple escalar y doble escalar.
- Cinco m bits se utilizan para especificar el mapa de opcode a utilizar. De los 32 mapas de opcode posibles que se pueden codificar con m 4 m 3 m 2 m 1 m 0 , los mapas de opcode 1, 2 y 3 se utilizan para proporcionar reemplazos compactos para los opcodes heredados de 2 bytes y 3 bytes; estos tres mapas de opcode son equivalentes a las secuencias de bytes de escape iniciales
0x0F,0x0F 0x38y0x0F 0x3A, respectivamente. Los otros mapas de opcode VEX se han utilizado poco; a diciembre de 2023, los únicos usos conocidos de otros mapas son el mapa 0 para las instrucciones / específicas de Xeon Phi [ 3 ] y el mapa 7 para las instrucciones / planificadas. [ 4 ] Los mapas 4/5/6 se utilizan con el prefijo EVEX , pero ninguna de las instrucciones en esos mapas es codificable en VEX.JKZDJKNZDURDMSRUWRMSR
El prefijo VEX2 es una abreviatura de 2 bytes del prefijo VEX3, que puede utilizarse cuando los campos omitidos tienen los siguientes valores:
- W = 0: tamaño del operando de 32 bits
- B̅ = 1 (B = 0): El registro base se encuentra entre los primeros 8
- X̅ = 1 (X = 0): El registro de índice (si hay un byte SIB presente) está entre los primeros 8
- m = 00001: código de operación de 2 bytes que comienza con 0x0F
Las instrucciones que requieren valores diferentes para estos campos deben codificarse con el prefijo VEX3. VEX2 incluye un bit R̅, un bit L, dos bits p y un registro fuente adicional de 4 bits (v), por lo que resulta útil para muchas instrucciones SSE y AVX siempre que el operando de registro/memoria utilice únicamente los primeros 8 registros.
Descripción técnica
Las instrucciones codificadas con el prefijo VEX pueden tener hasta cuatro operandos variables (en registros o memoria) y un operando constante (valor inmediato). Las instrucciones que requieren más de tres operandos variables utilizan bits de operando inmediato para especificar un cuarto operando de registro (IS4, como se indica arriba). Como máximo, uno de los operandos puede ser un operando de memoria; y como máximo, uno de los operandos puede ser una constante inmediata de 4 u 8 bits. Los operandos restantes son registros.
El conjunto de instrucciones AVX es la primera extensión de conjunto de instrucciones que utiliza el esquema de codificación VEX. El conjunto de instrucciones AVX utiliza el prefijo VEX únicamente para las instrucciones que utilizan los registros SIMD XMM .
Sin embargo, el esquema de codificación VEX también se ha utilizado para otros tipos de instrucciones en expansiones posteriores del conjunto de instrucciones. Por ejemplo:
- BMI introdujo instrucciones aritméticas y de manipulación de bits codificadas en VEX que operan en registros de propósito general.
- AVX-512 introdujo 8 registros de máscara y añadió instrucciones codificadas en VEX para manipularlos. (VEX.B̅ se ignora cuando el campo se usa para codificar un registro de máscara, pero VEX.R̅ y VEX.v̅ 3 no se ignoran y deben establecerse en 1 en modo de 64 bits. [ 5 ] )
- AMX introdujo 8 registros de mosaicos y añadió instrucciones codificadas en VEX para manipularlos.
Los valores del byte inicial del prefijo VEX, 0xC4 y 0xC5, coinciden con los códigos de operación de las instrucciones LDS y LES. Esta ambigüedad, que no es compatible con el modo de 64 bits, se resuelve en el modo de 32 bits aprovechando que un byte ModR/M válido de LDS o LES no puede especificar un operando de fuente de registro; es decir, no puede tener el formato 11xxxxxx . Varios campos de bits del segundo byte del prefijo VEX se invierten para garantizar que el byte siempre tenga este formato.
Las instrucciones SIMD heredadas con el prefijo VEX añadido son equivalentes a las mismas instrucciones sin el prefijo VEX, con las siguientes diferencias:
- La instrucción codificada en VEX puede tener un operando más, lo que la hace no destructiva.
- Una instrucción XMM de 128 bits sin el prefijo VEX deja sin cambios la mitad superior del registro YMM completo de 256 bits, mientras que la versión codificada con VEX establece la mitad superior a cero.
- Las instrucciones XMM de 128 bits sin prefijo VEX generalmente requieren que cualquier argumento de memoria esté alineado a 16 bytes ; las versiones codificadas con VEX permiten operandos de memoria no alineados.
Las instrucciones que utilizan el registro YMM completo de 256 bits no deben mezclarse con instrucciones que no sean VEX y que dejen la mitad superior del registro sin cambios, por razones de eficiencia. [ 6 ] [ 7 ]
El prefijo VEX no es compatible en el modo real ni en el modo virtual-8086 (todas las instrucciones con el prefijo VEX provocarán #UD en estos modos).
Historia
- En agosto de 2007, AMD propuso la extensión del conjunto de instrucciones SSE5 , que incluye un nuevo esquema de codificación para instrucciones con tres operandos, utilizando un byte adicional llamado DREX, y que estaba destinada al núcleo del procesador Bulldozer en 2011. [ 8 ] [ 9 ] Sin embargo, en 2009, SSE5 fue cancelada y nunca se implementó.
- En marzo de 2008, Intel propuso el conjunto de instrucciones AVX , utilizando el nuevo esquema de codificación VEX. [ 10 ]
- En agosto de 2008, los comentaristas lamentaron la esperada incompatibilidad entre los conjuntos de instrucciones de AMD e Intel, y propusieron que AMD revisara sus planes y reemplazara el esquema DREX por el esquema VEX, más flexible y extensible. [ 11 ]
- En mayo de 2009, AMD anunció una revisión del conjunto de instrucciones SSE5 propuesto para hacerlo compatible con el conjunto de instrucciones AVX y el esquema de codificación VEX. El SSE5 revisado se llama XOP . [ 12 ]
- 2011. El conjunto de instrucciones AVX es compatible con la arquitectura de microprocesador Sandy Bridge de Intel , mientras que los conjuntos de instrucciones AVX , XOP y FMA4 son compatibles con el procesador AMD Bulldozer . [ 13 ]
- El conjunto de instrucciones FMA3 codificadas en VEX viene incluido con los procesadores AMD Piledriver (en 2012) y los procesadores Intel Haswell (en 2013).
- En julio de 2023, Intel anunció las Extensiones de Rendimiento Avanzado (APX), que ampliaron el prefijo EVEX e introdujeron el prefijo REX2.
Véase también
Referencias
- ↑ Kelly, John Harry (mayo de 2020). "Penalizaciones de transición AVX -> SSE, codificación VEX y por qué importan" .
- ↑ Intel Corporation (enero de 2009). "Intel Advanced Vector Extensions Programming Reference" .
- ↑ Manual de referencia de la arquitectura del conjunto de instrucciones del coprocesador Intel® Xeon Phi™ (PDF) . 7 de septiembre de 2012. pág. 73. 327364-001. Archivado (PDF) del original el 4 de agosto de 2021.
- ↑ Extensiones del conjunto de instrucciones de la arquitectura Intel® y características futuras (PDF) . Septiembre de 2023. pág. 103. 314933-050. Archivado (PDF) del original el 12 de diciembre de 2023.
- ↑ Intel, Manual para desarrolladores de software , número de pedido 325462-081, septiembre de 2023, vol. 2, sección 2.7.11.3, pág. 588. Archivado el 6 de diciembre de 2023.
- ↑ Intel, Cómo evitar penalizaciones en la transición a AVX-SSE , 2011. Archivado el 26 de octubre de 2023.
- ↑ Stack Overflow, ¿Por qué este código SSE es 6 veces más lento sin VZEROUPPER en Skylake?, diciembre de 2016. Archivado el 6 de julio de 2023.
- ↑ "Conjunto de instrucciones SSE5 de 128 bits" . AMD Developer Central . Consultado el 2 de junio de 2009 .
- ↑ Hruska, Joel (14 de noviembre de 2008). "AMD Fusion se retrasa ahora hasta 2011" . Ars Technica .
- ↑ "Red de software de Intel" . Intel . Archivado del original el 7 de abril de 2008. Consultado el 5 de abril de 2008 .
- ↑ "AMD e Intel son incompatibles: ¿qué hacer?" . Foros de desarrolladores de AMD . Consultado el 10 de agosto de 2012 .
- ↑ "Manual del programador de la arquitectura AMD64, volumen 4: instrucciones para medios de 128 y 256 bits" (PDF) . AMD . 22 de diciembre de 2010.
- ↑ "Encontrar el equilibrio" . Dave Christie, blogs de desarrolladores de AMD . Consultado el 10 de agosto de 2012 .
{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace )
- Instrucciones X86
- computación SIMD