El prefijo VEX (de "extensiones vectoriales") y el esquema de codificación VEX comprenden una extensión de la arquitectura del conjunto de instrucciones x86 y x86-64 para microprocesadores de Intel , AMD y otros.
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 instrucción previamente existentes . Esto sirve para los siguientes propósitos:
- El mapa de código 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 inmediato), donde el esquema original permite solo dos operandos (más el inmediato).
- Se permite que el tamaño de SIMD vector registros que se extiende desde los 128 bits de registros XMM a 256 bits registros nombrados YMM. Hay espacio para más ampliaciones del tamaño del registro.
- Permite que las instrucciones de dos operandos existentes se modifiquen en formas 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 cambia el registro a ).
El prefijo VEX reemplaza los bytes de prefijo de instrucción y los códigos de escape más utilizados . En muchos casos, la cantidad de bytes de prefijo y bytes de escape que se reemplazan es la misma que la cantidad de bytes en el prefijo VEX, de modo que la longitud total de la instrucción codificada en VEX es la misma que la longitud del código de instrucción heredado. . En otros casos, la versión codificada en VEX es más larga o más corta que el código heredado. En el modo de 32 bits, las instrucciones codificadas VEX solo pueden acceder a los primeros 8 registros YMM / XMM; las codificaciones para los otros registros se interpretarían como las instrucciones LDS y LES heredadas que no son compatibles con el modo de 64 bits.
El prefijo VEX de dos bytes contiene los siguientes componentes:
- El bit, R̅, similar al bit de prefijo REX.R utilizado en la extensión del conjunto de instrucciones x86-64 .
- Cuatro bits denominados v̅, que especifican un segundo operando de registro fuente.
- Un bit llamado L que especifica la longitud del vector de 256 bits.
- Dos bits denominados p para reemplazar los prefijos de tamaño de operando y los prefijos de tipo de operando (66, F2, F3).
El prefijo VEX de tres bytes contiene además:
- Los tres bits, X̅; B; y W, también similar a los bits correspondientes en el prefijo REX.
- Cinco bits llamados m. Dos de los m bits se utilizan para reemplazar los códigos de escape existentes y para especificar la longitud de la instrucción. Los tres m bits restantes están reservados para uso futuro, como especificar longitudes de vector> 256 bits, especificar diferentes longitudes de instrucciones o ampliar el espacio del código de operación; sin embargo, a partir de 2013, Intel decidió introducir un nuevo esquema de codificación, el prefijo EVEX , en lugar de que expandir los m bits restantes.
Descripción técnica
# de bytes | 0,2,3 | 1 | 1 | 0,1 | 0,1,2,4 | 0,1 |
---|---|---|---|---|---|---|
[Prefijos] | [VEJAR] | OPCODE | ModR / M | [HERMANO] | [DISP] | [IMM] |
El esquema de codificación VEX utiliza un prefijo de código que consta de dos o tres bytes , que se agrega a los códigos de instrucción nuevos o existentes . [1]
En la arquitectura x86, las instrucciones con un operando de memoria pueden usar 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 la información del código de operación para algunas instrucciones.
- reg / opcode , bits [5: 3]: según el byte del código de operación primario, especifica un registro o tres bits más de información de código de operación.
- r / m , bits [2: 0]: puede especificar un registro como operando o combinarlo con el campo mod para codificar un modo de direccionamiento.
Las formas base-más-índice y escala-más-índice de direccionamiento de 32 bits (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].
Para utilizar el direccionamiento de 64 bits y los registros adicionales presentes en la arquitectura x86-64, se ha introducido el prefijo REX que proporciona espacio adicional para codificar los modos de direccionamiento. El campo de bits W cambia el tamaño del operando a 64 bits, R expande reg a 4 bits, B expande r / m (u opreg en los pocos códigos de operación como "POP reg" que codifican el número de registro en sus 3 bits de código de operación más bajos), y X y B expanden el índice y la base en el byte SIB. Sin embargo, el prefijo REX está codificado de manera bastante ineficiente, desperdiciando la mitad de sus 8 bits.
REX | ||||||||
---|---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
Byte 0 | 0 | 1 | 0 | 0 | W | R | X | B |
VEX de 3 bytes | ||||||||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
Byte 0 (C4h) | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
Byte 1 | R̅ | X | B | m 4 | m 3 | m 2 | m 1 | m 0 |
Byte 2 | W | v̅ 3 | v̅ 2 | v̅ 1 | v̅ 0 | L | p 1 | p 0 |
VEX de 2 bytes | ||||||||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
Byte 0 (C5h) | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 1 |
Byte 1 | R̅ | v̅ 3 | v̅ 2 | v̅ 1 | v̅ 0 | L | p 1 | p 0 |
El prefijo VEX proporciona una representación compacta del prefijo REX, así como varios otros prefijos, para expandir el modo de direccionamiento, la enumeración de registros y el tamaño y ancho del operando:
- Los bits R̅, X̅ y B̅ son inversión de los bits R, X y B del prefijo REX; estos proporcionan un cuarto bit (alto) para los campos de índice de registro (ModRM reg, SIB index y ModRM r / m; SIB base; o campos de registro de código de operación, respectivamente) permitiendo el acceso a 16 en lugar de 8 registros. El bit W es equivalente al bit W del prefijo REX y especifica un operando de 64 bits; para instrucciones que no son enteros, es un bit de extensión de código de operación general.
- v̅ es la inversión de un índice de registro de fuente adicional.
- m reemplaza los primeros bytes del prefijo del código de operación. Los valores 1, 2 y 3 son equivalentes a los prefijos de código de operación 0F, 0F 38 y 0F 3A; Los demás valores están reservados. El prefijo VEX de 2 bytes siempre corresponde al prefijo 0F.
- L indica la longitud del vector; 0 para registros SSE (XMM) de 128 bits y 1 para registros AVX (YMM) de 256 bits.
- p codifica bytes de prefijo adicionales. Los valores 0, 1, 2 y 3 corresponden a los prefijos implícitos de none, 66, F3 y F2. Estos codifican el tipo de operando para las instrucciones SSE: empaquetado simple, empaquetado doble, escalar simple y escalar doble, respectivamente.
Modo de direccionamiento | Bit 3 | Bits [2: 0] | Tipo de registro | Uso común |
---|---|---|---|---|
REG | VEX.R | ModRM.reg | Propósito general, Máscara, Vector | Registrar operando |
RM (si ModRM.mod = 11) | VEX.B | ModRM.r / m | GPR, Máscara, Vector | Registrar operando |
RM | VEX.B | ModRM.r / m | GPR | Registrar dirección de memoria |
BASE | VEX.B | SIB.base | GPR | Base + Índice * Dirección de memoria de la báscula |
ÍNDICE | VEX.X | SIB.index | GPR | Base + Índice * Dirección de memoria de la báscula |
VIDX | VEX.X | SIB.index | Vector | Base + VectorIndex * Dirección de memoria de la báscula |
NDS / NDD | VEX.v 3 contra 2 contra 1 contra 0 | GPR, Máscara, Vector | Registrar operando | |
IS4 | Imm8 [7: 4] | Vector | Registrar operando |
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 necesitan más de tres operandos variables usan bits de operandos inmediatos para especificar un operando de cuarto registro (IS4 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 del conjunto de instrucciones que utiliza el esquema de codificación VEX. El conjunto de instrucciones AVX usa el prefijo VEX solo para las instrucciones que usan los registros SIMD XMM .
Sin embargo, el esquema de codificación VEX se ha utilizado para otros tipos de instrucciones, así como en la expansión posterior del conjunto de instrucciones. Por ejemplo, BMI introdujo instrucciones de manipulación de bits y aritmética codificadas VEX que operan en registros de propósito general. AVX-512 introdujo 8 registros de máscara y agregó instrucciones para manipularlos. Estas instrucciones utilizan codificación VEX. VEX.R, VEX.B o VEX.v3 se ignora cuando el campo se utiliza para codificar un registro de máscara.
Los valores de bytes iniciales del prefijo VEX, C4h y C5h, son los mismos que los códigos de operación de las instrucciones LDS y LES. Estas instrucciones no se admiten en el modo de 64 bits. Para resolver la ambigüedad en el modo de 32 bits, la especificación de VEX aprovecha el hecho de que un LDS legal o un byte ModRM de LES no puede tener la forma 11xxxxxx (que especificaría un operando de registro). Varios campos de bits en el segundo byte del prefijo VEX se invierten para garantizar que el byte siempre tenga esta forma en el modo de 32 bits.
Las instrucciones SIMD heredadas con un prefijo VEX agregado 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 prefijo VEX deja la mitad superior del registro YMM completo de 256 bits sin cambios, mientras que la versión con codificación VEX establece la mitad superior en cero.
Las instrucciones que usan todo el registro YMM de 256 bits no deben mezclarse con instrucciones que no sean VEX que dejan la mitad superior del registro sin cambios, por razones de eficiencia.
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 destinado al núcleo del procesador Bulldozer , que comenzará a producirse en 2011. [2] [3]
- En marzo de 2008, Intel propuso el conjunto de instrucciones AVX , utilizando el nuevo esquema de codificación VEX. [4]
- En agosto de 2008, los comentaristas deploraron la incompatibilidad esperada entre los conjuntos de instrucciones de AMD e Intel y propusieron que AMD revisara sus planes y reemplazara el esquema DREX con el esquema VEX más flexible y extensible. [5]
- 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 . [6]
- Enero de 2011. El conjunto de instrucciones AVX es compatible con la arquitectura de microprocesador Sandy Bridge de Intel .
- 2011. Los conjuntos de instrucciones AVX , XOP y FMA4 , todos usando el esquema VEX, son compatibles con el procesador AMD Bulldozer . [7]
- 2013. El conjunto de instrucciones FMA3 es compatible con los procesadores Intel Haswell.
Ver también
Referencias
- ^ Intel Corporation (enero de 2009). "Referencia de programación de Intel Advanced Vector Extensions" .
- ^ "Conjunto de instrucciones SSE5 de 128 bits" . Central de desarrolladores de AMD . Consultado el 2 de junio de 2009 .
- ^ Hruska, Joel (14 de noviembre de 2008). "AMD Fusion ahora se retrasa hasta 2011" . Ars Technica .
- ^ "Red de software Intel" . Intel . Archivado desde el original el 7 de abril de 2008 . Consultado el 5 de abril de 2008 .
- ^ "AMD e Intel 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 de medios de 128 bits y 256 bits" (PDF) . AMD . 22 de diciembre de 2010.
- ^ "Lograr un equilibrio" . Dave Christie, blogs de desarrolladores de AMD. Archivado desde el original el 9 de noviembre de 2013 . Consultado el 10 de agosto de 2012 .