El prefijo VEX (de "extensiones vectoriales") y el esquema de codificación VEX son una extensión de la arquitectura del conjunto de instrucciones IA-32 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 instrucciones ya existentes . Esto sirve para los siguientes propósitos:
- El mapa de código de operación se amplía para hacer espacio para futuras instrucciones.
- Permite que los códigos de instrucción tengan hasta cuatro operandos (más el inmediato), donde el esquema original solo permite dos operandos (más el 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. Hay espacio para más ampliaciones del tamaño de los registros.
- Permite modificar instrucciones de dos operandos existentes 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 el registro a es modificado por la instrucción).
El prefijo VEX reemplaza los bytes de prefijo de instrucción y los bytes 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 con VEX es la misma que la longitud del código de instrucción heredado. En otros casos, la versión codificada con VEX es más larga o más corta que el código heredado. En el modo de 32 bits, las instrucciones codificadas con 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.
Codificación de instrucciones
El esquema de codificación VEX utiliza un prefijo de código que consta de dos o tres bytes , que se puede agregar a códigos de instrucciones existentes o nuevos. [1]
En la arquitectura x86, las instrucciones con un operando de memoria pueden utilizar 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 de código de operación principal, 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 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 REX proporciona espacio adicional para codificar modos de direccionamiento de 64 bits y registros adicionales presentes en la arquitectura x86-64. 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 que codifican el registro en los 3 bits de código de operación más bajos, como "POP reg"), y X y B expanden el índice y la base en el byte SIB.
El prefijo VEX3 contiene todos los campos de bits del prefijo REX, así como varios otros prefijos, expandiendo 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 inversiones 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 campos de registro ModRM r/m; base SIB; o registro de código de operación, respectivamente), lo que permite el acceso a 16 en lugar de 8 registros.
- Un bit W, equivalente al bit W del prefijo REX, especifica un operando de 64 bits; para instrucciones no enteras, es un bit de extensión de código de operación general.
- Cuatro bits v̅ son la inversión 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. Estos codifican el tipo de operando para las instrucciones de punto flotante SSE: empaquetado simple, empaquetado doble, escalar simple y escalar doble, respectivamente.
- Se utilizan cinco bits m para especificar el mapa de código de operación a utilizar. De los 32 mapas de código de operación posibles que se pueden codificar con m 4 m 3 m 2 m 1 m 0 , los mapas de código de operación 1, 2 y 3 se utilizan para proporcionar reemplazos compactos para los códigos de operación heredados de 2 bytes y 3 bytes: estos tres mapas de código de operación son equivalentes a las secuencias de bytes de escape principales
0x0F
, 0x0F 0x38
y 0x0F 0x3A
, respectivamente. Los otros mapas de código de operación VEX han tenido poco uso: a diciembre de 2023, los únicos usos conocidos de otros mapas son el mapa 0 para las instrucciones / específicas de Xeon Phi [2] y el mapa 7 para las instrucciones / planificadas . [3] Los mapas 4/5/6 se utilizan con el prefijo EVEX , pero ninguna de las instrucciones en esos mapas es codificable con VEX.JKZD
JKNZD
URDMSR
UWRMSR
El prefijo VEX2 es una variante de 2 bytes del prefijo VEX3, que se diferencia de este último en los siguientes puntos:
- Los bits X̅, B̅ y W no están presentes.
- Los bits m no están presentes en el prefijo VEX2; el escape 0x0F está implícito.
Las instrucciones que requieren cualquiera de estos campos de bits deben codificarse con el prefijo VEX3.
El prefijo REX2 es una variante de 2 bytes del prefijo REX, introducido con las extensiones Intel APX que agregan 16 registros GPR extendidos.
- Los bits R 3 , X 3 y B 3 son los mismos que los bits R, X y B en el prefijo REX.
- Los bits R 4 , X 4 y B 4 son bits adicionales utilizados para codificar los 32 registros EGPR.
- El bit W es el mismo que en el prefijo REX.
- El bit 0 selecciona entre el mapa heredado 0 (códigos de operación de 1 byte, sin escape) y el mapa heredado 1 (códigos de operación de 2 bytes, escape 0x0F).
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 necesitan más de tres operandos variables utilizan bits de operando inmediato para especificar un cuarto operando de 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 de conjunto de instrucciones que utiliza el esquema de codificación VEX. El conjunto de instrucciones AVX utiliza el prefijo VEX solo para 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 ampliaciones 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 agregó 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, y deben configurarse en 1 en modo de 64 bits. [4] )
- AMX introdujo 8 registros de mosaico y agregó instrucciones codificadas en VEX para manipularlos.
Los valores de byte inicial del prefijo VEX, 0xC4 y 0xC5, son los mismos que los códigos de operación de las instrucciones LDS y LES. No se admite en el modo de 64 bits, la ambigüedad se resuelve en el modo de 32 bits explotando el hecho de que un byte ModR/M legal de LDS o LES no puede especificar un operando de origen de registro; es decir, tener la forma 11xxxxxx . Varios campos de bits en el segundo byte del prefijo VEX se invierten para garantizar que el byte siempre tenga esta forma. De manera similar, la forma de un byte del prefijo REX tiene los cuatro bits de orden superior establecidos en cuatro, lo que reemplaza a dieciséis códigos de operación numerados 0x40–0x4F. Anteriormente, esos códigos de operación eran instrucciones INC y DEC individuales para los ocho registros de procesador estándar; el código x86-64 debe usar instrucciones INC y DEC ModR/M. [5]
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 codificada con VEX establece la mitad superior en cero.
- Las instrucciones XMM de 128 bits sin prefijo VEX generalmente requieren que todos los argumentos de memoria estén alineados en 16 bytes : las versiones codificadas con VEX permiten operandos de memoria desalineados.
Las instrucciones que utilizan todo el registro YMM de 256 bits no se deben mezclar con instrucciones no VEX que dejan la mitad superior del registro sin cambios, por razones de eficiencia. [6] [7]
El prefijo VEX no es compatible con el modo real ni con 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 destinado al núcleo del procesador Bulldozer en 2011. [8] [9] Sin embargo, en 2009, SSE5 se canceló 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 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. [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]
- 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 son compatibles con el procesador AMD Bulldozer . [13]
- 2013. El conjunto de instrucciones FMA3 es compatible con los procesadores Intel Haswell.
- En julio de 2023, Intel anunció Extensiones de rendimiento avanzado (APX) que utilizan el prefijo REX2 y el prefijo EVEX actualizado.
Referencias
- ^ Intel Corporation (enero de 2009). "Referencia de programación de extensiones vectoriales avanzadas de Intel".
- ^ 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) . Sep 2023. p. 103. 314933-050. Archivado (PDF) del original el 12 de diciembre de 2023.
- ^ Intel, Software Developers Manual, 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 Corporation (1 de septiembre de 2016). "Manual del desarrollador de arquitecturas Intel® 64 e IA-32: vol. 2A". pág. 2-8 . Consultado el 13 de septiembre de 2021 .
- ^ Intel, Cómo evitar penalizaciones en la transición 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 hasta 2011". Ars Technica .
- ^ "Red de software de Intel". Intel . Archivado desde el original el 7 de abril de 2008 . Consultado el 5 de abril de 2008 .
- ^ "AMD e Intel no son compatibles: ¿qué hacer?". Foros para desarrolladores de AMD . Consultado el 10 de agosto de 2012 .
- ^ "Manual del programador de la arquitectura AMD64, volumen 4: instrucciones de medios de 128 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 2013-11-09 . Consultado el 2012-08-10 .