El prefijo EVEX (extensión vectorial mejorada) y el esquema de codificación correspondiente es una extensión de la arquitectura del conjunto de instrucciones x86 de 32 bits (IA-32) y x86-64 de 64 bits (AMD64) . EVEX se basa en el prefijo MVEX utilizado por el procesador Knights Corner , pero no debe confundirse con él .
El esquema EVEX es una extensión de 4 bytes del esquema VEX que admite el conjunto de instrucciones AVX-512 y permite direccionar nuevos registros ZMM de 512 bits y nuevos registros de máscara de operando de 64 bits.
Características
La codificación EVEX puede direccionar 8 registros de máscara de operando, 16 registros de propósito general y 32 registros de vector en modo de 64 bits (de lo contrario, 8 de propósito general y 8 de vector), y puede admitir hasta 4 operandos.
Al igual que el esquema de codificación VEX, el prefijo EVEX unifica prefijos de código de operación y códigos de escape existentes, direccionamiento de memoria y modificadores de longitud de operando del conjunto de instrucciones x86.
Las siguientes características se transfieren del esquema VEX:
- Codificación directa de tres registros SIMD (XMM, YMM o ZMM) como operandos de origen (no se admiten registros MMX o x87);
- Prefijo REX compactado para modo de 64 bits;
- Prefijo SIMD compactado (66H, F2H, F3H), código de operación de escape (0FH) y escape de dos bytes (0F38H, 0F3AH);
- Requisitos de alineación de memoria menos estrictos para el operando de memoria
EVEX también extiende VEX con capacidades adicionales:
- Codificación de registro SIMD extendida: un total de 32 nuevos registros SIMD de 512 bits ZMM0-ZMM31 en modo de 64 bits;
- Codificación de máscara de operando: 8 nuevos registros de máscara de operación de 64 bits k0-k7 para ejecución condicional y fusión de operandos de destino;
- Difusión de origen a destino para instrucciones que toman el vector de memoria como operando de origen: el segundo operando se difunde antes de ser utilizado en la operación real;
- Control de redondeo integrado directo para instrucciones que operan en registros SIMD de punto flotante con semántica de redondeo;
- Control de excepciones incorporado para instrucciones de punto flotante sin semántica de redondeo;
- Desplazamiento comprimido (DISP8 * N), nuevo modo de direccionamiento de memoria para mejorar la densidad de codificación del flujo de bytes de instrucciones; el factor de escala N depende de la longitud del vector y del modo de transmisión.
Por ejemplo, el esquema de codificación EVEX permite la adición de vectores condicional en forma de
VADDPS zmm1 {k1} {z}, zmm2, zmm3
donde el modificador {k1} junto al operando de destino codifica el uso del registro opmask k1 para el procesamiento condicional y las actualizaciones al destino, y el modificador {z} (codificado por EVEX.z) proporciona los dos tipos de enmascaramiento (fusión y puesta a cero), con fusionándose de forma predeterminada cuando no se adjunta ningún modificador.
Descripción técnica
El esquema de codificación EVEX utiliza un prefijo de código que consta de 4 bytes ; el primer byte es siempre 62h y se deriva de un código de operación no utilizado de la instrucción BOUND de 32 bits, que no se admite en el modo de 64 bits. [1]
# de bytes | 4 | 1 | 1 | 1 | 4/1 | 1 |
---|---|---|---|---|---|---|
[Prefijos] | EVEX | Código de operación | ModR / M | [HERMANO] | [Disp32] / [Disp8 * N] | [Inmediato] |
El byte ModR / M especifica un operando (siempre un registro) con campo reg , y el segundo operando se codifica con campos mod y r / m , especificando un registro o una ubicación en la memoria. El direccionamiento de base más índice y escala más índice requiere el byte SIB, que codifica el factor de escala de 2 bits , así como el índice de 3 bits y los registros de base de 3 bits . Dependiendo del modo de direccionamiento, el campo Disp8 / Disp16 / Disp32 puede seguir con un desplazamiento que debe agregarse a la dirección.
El prefijo EVEX conserva los campos introducidos en el prefijo VEX :
- Cuatro bits R, X, B y W del prefijo REX. W se expande el tamaño del operando a 64 bits o sirve como un código de operación adicional, R se expande reg , se expande B r / m o reg , y X y B expandir índice y la base en el byte SIB. Al igual que en el prefijo VEX, los RXB se proporcionan en forma invertida.
- Cuatro bits denominados v, que especifican un segundo operando de registro fuente no destructivo. Al igual que en el prefijo VEX, vvvv se proporciona en forma invertida.
- Bit 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).
- Dos de los m bits para reemplazar los códigos de escape existentes (0F, 0F 38 y 0F 3A).
Nuevas funciones de los campos existentes:
- El bit X ahora expande r / m junto con el bit B cuando el byte SIB no está presente, lo que permite 32 registros SIMD.
Hay varios campos de bits nuevos:
- Bit R 'expande reg . Como el bit R, R 'se proporciona en forma invertida.
- El bit V 'expande vvvv . Al igual que los bits vvvv, V 'se proporciona en forma invertida.
- Tres bits denominados a, que especifican el registro de máscara de operando (k0-k7) para instrucciones vectoriales.
- Bit z para especificar el modo de fusión (fusión o cero).
- Bit b para difusión de fuente, control de redondeo (combinado con L'L) o suprimir excepciones.
- Bit L 'para especificar la longitud del vector de 512 bits, o el modo de control de redondeo cuando se combina con L.
La codificación del prefijo EVEX es la siguiente:
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
---|---|---|---|---|---|---|---|---|---|
Byte 0 (62h) | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | |
Byte 1 (P0) | R | X | B | R ' | 0 | 0 | m 1 | m 0 | P [7: 0] |
Byte 2 (P1) | W | v 3 | v 2 | v 1 | v 0 | 1 | p 1 | p 0 | P [15: 8] |
Byte 3 (P2) | z | L ' | L | B | V ' | un 2 | un 1 | un 0 | P [23:16] |
La siguiente tabla enumera posibles combinaciones de direccionamiento de registros (el bit 4 siempre es cero cuando se codifican los 16 registros de propósito general):
Modo de direccionamiento | Poco 4 | Bit 3 | Bits [2: 0] | Tipo de registro | Uso común |
---|---|---|---|---|---|
REG | EVEX.R ' | EVEX.R | ModRM.reg | Propósito general, Vector | Registrar operando |
RM (si ModRM.mod = 11) | EVEX.X | EVEX.B | ModRM.r / m | GPR, Vector | Registrar operando |
RM | 0 | EVEX.B | ModRM.r / m | GPR | Registrar dirección de memoria |
BASE | 0 | EVEX.B | SIB.base | GPR | Base + Índice * Dirección de memoria de la báscula |
ÍNDICE | 0 | EVEX.X | SIB.index | GPR | Base + Índice * Dirección de memoria de la báscula |
VIDX | EVEX.V ' | EVEX.X | SIB.index | Vector | Base + VectorIndex * Dirección de memoria de la báscula |
NDS / NDD | EVEX.V ' | EVEX.v 3 contra 2 contra 1 contra 0 | GPR, Vector | Registrar operando | |
K | 0 | 0 | EVEX. A 2 a 1 a 0 | Máscara | Operando de registro de máscara |
Algunas instrucciones de combinación AVX codificadas en VEX tienen 4 operandos. Para adaptarse a esto, VEX tiene el modo de direccionamiento IS4, que codifica el 4º operando (un registro vectorial) en los bits Imm8 [7: 4] de la constante inmediata. Las instrucciones de mezcla codificadas en EVEX similares tienen su cuarto operando en un registro de máscara. Ninguna instrucción codificada en EVEX utiliza codificación en modo de direccionamiento IS4.
Referencias
- ^ Intel Corporation (julio de 2013). "Referencia de programación de extensiones del conjunto de instrucciones de la arquitectura Intel" .