stringtranslate.com

Prefijo VEX

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 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:

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:

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:

El prefijo VEX2 es una variante de 2 bytes del prefijo VEX3, que se diferencia de este último en los siguientes puntos:

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.

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:

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 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:

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

Referencias

  1. ^ Intel Corporation (enero de 2009). "Referencia de programación de extensiones vectoriales avanzadas de Intel".
  2. ^ 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.
  3. ^ 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.
  4. ^ 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
  5. ^ 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 .
  6. ^ Intel, Cómo evitar penalizaciones en la transición AVX-SSE, 2011. Archivado el 26 de octubre de 2023.
  7. ^ 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.
  8. ^ "Conjunto de instrucciones SSE5 de 128 bits". AMD Developer Central . Consultado el 2 de junio de 2009 .
  9. ^ Hruska, Joel (14 de noviembre de 2008). "AMD Fusion se retrasa hasta 2011". Ars Technica .
  10. ^ "Red de software de Intel". Intel . Archivado desde el original el 7 de abril de 2008 . Consultado el 5 de abril de 2008 .
  11. ^ "AMD e Intel no son compatibles: ¿qué hacer?". Foros para desarrolladores de AMD . Consultado el 10 de agosto de 2012 .
  12. ^ "Manual del programador de la arquitectura AMD64, volumen 4: instrucciones de medios de 128 y 256 bits" (PDF) . AMD . 22 de diciembre de 2010.
  13. ^ "Lograr un equilibrio". Dave Christie, blogs de desarrolladores de AMD. Archivado desde el original el 2013-11-09 . Consultado el 2012-08-10 .