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 ampliación o modificación de códigos de instrucciones previamente existentes . Esto sirve para los siguientes propósitos:
- El mapa de código de operación se amplía para dejar espacio para instrucciones futuras.
- Permite que los códigos de instrucción tengan hasta cuatro operandos (más el inmediato), mientras que el esquema original permite solo dos operandos (más el inmediato).
- Permite ampliar el tamaño de los registros vectoriales SIMD desde los registros XMM de 128 bits a los registros YMM de 256 bits. Hay espacio para futuras ampliaciones del tamaño del registro.
- 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 la instrucción cambia el registro a ).
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 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 modo de 32 bits, las instrucciones codificadas VEX solo pueden acceder a los primeros 8 registros YMM/XMM; las codificaciones de 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 pueden agregar a 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 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 combinarlo 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 í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 más bajos del código de operación, 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, ampliando el modo de direccionamiento, la enumeración de registros, el tamaño y ancho del operando:
- 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 (ModRM reg, índice SIB y ModRM r/m; base SIB; o campos de registro de código de operación, respectivamente) que permiten 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 que no son enteras, es un bit de extensión de código de operación general.
- Cuatro v̅ bits 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 instrucciones de punto flotante SSE: empaquetado simple, empaquetado doble, escalar simple y escalar doble, respectivamente.
- Se utilizan cinco m bits para especificar el mapa de código de operación que se utilizará. De los 32 posibles mapas de códigos de operación que se pueden codificar con m 4 m 3 m 2 m 1 m 0 , los mapas de códigos de operación 1, 2 y 3 se utilizan para proporcionar reemplazos compactos para códigos de operación heredados de 2 y 3 bytes: estos tres mapas de códigos 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] ).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.
- m bits 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 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 que se utilizan para codificar los 32 registros EGPR.
- El bit W es el mismo que en el prefijo REX.
- El bit M 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 inmediatos 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 del 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 se ha utilizado para otros tipos de instrucciones, así como en expansiones posteriores del conjunto de instrucciones. Por ejemplo:
- BMI introdujo instrucciones de manipulación de bits y aritmética codificadas por 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 utiliza para codificar un registro de máscara, pero VEX.R̅ y VEX.v̅ 3 no, y deben establecerse en 1 en modo de 64 bits. [4] )
- AMX introdujo 8 registros de mosaicos y agregó instrucciones codificadas en VEX para manipularlos.
Los valores de bytes iniciales del prefijo VEX, 0xC4 y 0xC5, son los mismos que los códigos de operación de las instrucciones LDS y LES. No compatible con el modo de 64 bits, la ambigüedad se resuelve en el modo de 32 bits aprovechando el hecho de que un byte LDS o ModR/M de LES legal 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 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 del procesador estándar; El código x86-64 debe utilizar las instrucciones ModR/M INC y DEC. [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 los argumentos de memoria estén alineados con 16 bytes ; las versiones codificadas con VEX permiten operandos de memoria desalineados.
Las instrucciones que utilizan todo el registro YMM 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 se admite en el modo real ni en el modo virtual-8086 (todas las instrucciones con el prefijo VEX causará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 fue cancelado y nunca implementado.
- 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 esperada incompatibilidad 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 del 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
- ^ Corporación Intel (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. 73. 327364-001. Archivado (PDF) desde el 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. 103. 314933-050. Archivado (PDF) desde el original el 12 de diciembre de 2023.
- ^ Intel, Manual para desarrolladores de software, n.º de pedido. 325462-081, septiembre de 2023, vol 2, sección 2.7.11.3, p. 588. Archivado el 6 de diciembre de 2023.
- ^ Corporación Intel (1 de septiembre de 2016). "Manual del desarrollador de arquitecturas Intel® 64 e IA-32: Vol. 2A". pag. 2-8 . Consultado el 13 de septiembre de 2021 .
- ^ Intel, Cómo evitar las sanciones por 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". Central de desarrolladores de AMD . Consultado el 2 de junio de 2009 .
- ^ Hruska, Joel (14 de noviembre de 2008). "AMD Fusion ahora se retrasó hasta 2011". Ars Técnica .
- ^ "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 arquitectura AMD64, volumen 4: instrucciones para 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 9 de noviembre de 2013 . Consultado el 10 de agosto de 2012 .