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 ampliación o modificación de códigos de instrucciones previamente 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 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:

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

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

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:

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

Referencias

  1. ^ Corporación Intel (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. 73. 327364-001. Archivado (PDF) desde el original el 4 de agosto de 2021.
  3. ^ 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.
  4. ^ 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.
  5. ^ 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 .
  6. ^ Intel, Cómo evitar las sanciones por 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". Central de desarrolladores de AMD . Consultado el 2 de junio de 2009 .
  9. ^ Hruska, Joel (14 de noviembre de 2008). "AMD Fusion ahora se retrasó hasta 2011". Ars Técnica .
  10. ^ "Red de software Intel". Intel . Archivado desde el original el 7 de abril de 2008 . Consultado el 5 de abril de 2008 .
  11. ^ "AMD e Intel incompatibles: ¿qué hacer?". Foros de desarrolladores de AMD . Consultado el 10 de agosto de 2012 .
  12. ^ "Manual del programador de arquitectura AMD64, volumen 4: instrucciones para 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 9 de noviembre de 2013 . Consultado el 10 de agosto de 2012 .