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 (IA-32) de 32 bits y x86-64 ( AMD64) de 64 bits . EVEX se basa en el prefijo MVEX [1] 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 operandos de 64 bits.
Con Advanced Performance Extensions , el prefijo EVEX extendido redefine la semántica de varios bits de carga útil. [2]
Características
La codificación EVEX puede direccionar 8 registros de máscara de operandos, 16 registros de uso general y 32 registros vectoriales en modo de 64 bits (de lo contrario, 8 de uso general y 8 vectoriales) y puede admitir hasta 4 operandos.
Al igual que el esquema de codificación VEX, el prefijo EVEX unifica los prefijos de códigos de operación y códigos de escape existentes, el direccionamiento de memoria y los modificadores de longitud de operandos 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 operandos de memoria
EVEX también amplía VEX con capacidades adicionales:
- Codificación de registros 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;
- Transmitir desde el origen al destino instrucciones que toman el vector de memoria como operando de origen: el segundo operando se transmite antes de usarse 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 integrado 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 instrucción; 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 condicionales en forma de
VADDPS zmm1 {k1}{z}, zmm2, zmm3
donde el modificador {k1} junto al operando de destino codifica el uso del registro de máscara de operación k1 para procesamiento condicional y 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 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. [3]
El byte ModR/M especifica un operando (siempre un registro) con el campo reg , y el segundo operando está codificado con los 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 un factor de escala de 2 bits , así como un índice de 3 bits y registros 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 VEX, almacenados en forma invertida. W expande el tamaño del operando a 64 bits o sirve como código de operación adicional, R expande reg , B expande r/m o reg y X y B expanden el índice y la base en el byte SIB.
- Cuatro bits denominados v̅, almacenados en forma invertida. vvvv especifica un segundo operando de registro fuente no destructivo.
- Bit L que especifica una longitud de vector de 256 bits.
- Dos bits denominados p para reemplazar los prefijos de tamaño de operando y los prefijos de tipo de operando (66h, F2h, F3h).
- Dos de los bits m para reemplazar códigos de escape existentes (0Fh, 0F 38h y 0F 3Ah).
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̅' en forma invertida; R' expande reg .
- Bit V̅' en forma invertida; V' expande vvvv .
- 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 transmisión de fuente, control de redondeo (combinado con L'L) o supresión de 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:
La siguiente tabla enumera posibles combinaciones de direccionamiento de registros (el bit 4 siempre es cero al codificar los 16 registros de uso general):
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 cuarto operando (un registro vectorial) en bits Imm8[7:4] de la constante inmediata. Instrucciones de mezcla similares codificadas en EVEX tienen su cuarto operando en un registro de máscara. Ninguna instrucción codificada en EVEX utiliza codificación en modo de direccionamiento IS4.
Prefijo EVEX extendido
Las extensiones de rendimiento avanzado de Intel introducen varias variantes nuevas de la carga útil de 3 bytes en el prefijo EVEX, que se utilizan para codificar los registros GPR extendidos R16-R31 y nuevas instrucciones condicionales.
Extensión EVEX de las instrucciones EVEX:
- Los bits R̅ 3 , X̅ 3 y B̅ 3 son inversiones de los bits R 3 , X 3 y B 3 del prefijo REX2 . Estos son los mismos que los bits R̅, X̅ y B̅ de los prefijos VEX y EVEX.
- R̅ 4 , X̅ 4 , B 4 bits se utilizan para codificar los 32 registros EGPR. Almacenado en forma invertida, excepto B4.
- Cinco bits denominados v̅, almacenados en forma invertida. vvvvv especifica un índice de registro fuente adicional, que puede codificar los 32 registros EGPR.
- Los bits z, m, b, L, p, a son los mismos que en el prefijo EVEX heredado.
Extensión EVEX de instrucciones VEX:
Extensión EVEX para instrucciones heredadas:
- NF es la supresión de actualización de indicadores de estado ("sin indicadores") para varias instrucciones BMI (ANDN, BEXTR, BLSI, BLSMSK, BLSR, BZHI).
- ND es el indicador de nuevo destino de datos (NDD). Cuando ND = 1, el índice del registro EGPR está codificado por v̅ bits.
Prefijo EVEX para CMP y PRUEBA condicionales:
- Los bits SC son código de condición fuente (SCC).
- OF, SF, ZF, CF son indicadores de desbordamiento, signo, cero y acarreo para probar (no hay codificación para el indicador de paridad).
Cuando los nuevos registros EGPR y destinos de operandos pueden codificarse mediante prefijos EVEX y REX2 extendidos, se prefiere este último.
Referencias
- ^ Manual de referencia de la arquitectura del conjunto de instrucciones del coprocesador Intel® Xeon Phi ™ (PDF) . 7 de septiembre de 2012. p. 42. 327364-001. Archivado (PDF) desde el original el 4 de agosto de 2021.
- ^ Especificación de arquitectura Intel® Advanced Performance Extensions (Intel® APX) (PDF) (2 ed.). Agosto de 2023. pág. 21. 355828-002US. Archivado (PDF) desde el original el 10 de septiembre de 2023.
- ^ Intel Corporation (julio de 2013). "Referencia de programación de extensiones del conjunto de instrucciones de la arquitectura Intel".