OPTION AVXENCODING
Selecciona la codificación preferida de las instrucciones AVX.
Sintaxis
OPTION AVXENCODING:
preferencia
Fondo
Las instrucciones Intel AVX y AVX-512 se codifican de forma diferente a otras instrucciones de arquitectura de Intel. En lugar de depender de bytes de prefijo de instrucción y bytes de código de operación para seleccionar una instrucción, usan un único prefijo de varios bytes. Este prefijo puede codificar un operando de registro adicional. En el modo de 64 bits, también tiene bits para seleccionar los registros de 8 a 15 para los otros operandos y no se necesita un prefijo REX.
Se usan tres prefijos de varios bytes diferentes. Las instrucciones AVX se pueden codificar con un prefijo VEX de 3 bytes, donde el segundo y el tercer byte ayudan a seleccionar la operación específica ejecutada. Si algunos de los campos del prefijo VEX de 3 bytes tienen valores específicos, se puede usar en su lugar una forma de 2 bytes del prefijo VEX. Por último, algunas instrucciones AVX también tienen un formulario AVX-512, que se codifica con un prefijo EVEX de 4 bytes. El prefijo EVEX tiene campos adicionales para seleccionar la longitud de vector de 512 bits y otras opciones específicas de las instrucciones AVX-512.
Como algunas instrucciones AVX se pueden codificar de hasta tres maneras diferentes, hay reglas para seleccionar qué formulario usar. La directiva OPTION AVXENCODING
se usa para seleccionar el conjunto de reglas que se van a usar.
Preferencias
Referencia | Prioridad de preferencia de codificación |
---|---|
PREFER_FIRST |
Use el primer formulario definido si es posible. |
PREFER_VEX |
Use la codificación VEX en preferencia para codificar EVEX . |
PREFER_VEX3 |
Use la codificación VEX de 3 bytes en preferencia para codificar EVEX . |
PREFER_EVEX |
Use la codificación EVEX en preferencia para codificar VEX . |
NO_EVEX |
No codifique con EVEX . |
El orden AVXENCODING solo se aplica si no se especifica el formulario de prefijo de instrucción para la instrucción. Si el prefijo de instrucción se codifica explícitamente, tiene prioridad sobre la opción AVXENCODING
. Por ejemplo, evex vpmaddwd
usará VPMADDWD
con prefijo EVEX
incluso si se especifica OPTION AVXENCODING:no_EVEX
.
Si un origen de ensamblado no usa OPTION AVXENCODING
para seleccionar las preferencias de codificación, las reglas PREFER_FIRST
se usan de forma predeterminada. Por estas reglas, las codificaciones de instrucción más tempranas agregadas a Macro Assembler de Microsoft (MASM) tienen prioridad, y entre esas posibilidades se prefiere la codificación con el formato de prefijo más corto. Estas reglas garantizan que el código ensamblado por MASM siga generando el mismo código de objeto si se agregan nuevos formularios de instrucción luego.
Las reglas PREFER_VEX
siempre intentan codificar con un prefijo VEX
antes de intentar codificar con EVEX
. Si es posible, se usa el formulario de 2 bytes de VEX
en lugar del de 3 bytes.
La preferencia PREFER_VEX3
siempre intenta codificar con un prefijo VEX
de 3 bytes antes de intentar codificar con EVEX
. No se usará la forma de 2 bytes de VEX
.
La opción PREFER_EVEX
siempre intenta codificar con un prefijo EVEX
y solo intenta usar VEX
si la instrucción no tiene ningún formulario AVX-512.
La preferencia NO_EVEX
solo intenta codificar mediante un prefijo VEX
. No se permiten formularios de instrucción AVX-512. Esta opción le permite ensamblar código para su uso en plataformas que no tienen compatibilidad con AVX-512.
La directiva OPTION AVXENCODING
está disponible en Visual Studio 2019 versión 16.7 y posteriores.
Ejemplo
En este ejemplo se usan instrucciones VPDPBUSD
y VPMADDWD
para ilustrar cómo funciona la opción AVXENCODING
. VPDPBUSD
se definió por primera vez para codificarse solo con EVEX
, y luego se extendió con un formulario codificado por VEX para plataformas sin compatibilidad con AVX-512, mientras que VPMADDWD
era AVX y se extendió a AVX-512. La salida de la lista del ensamblado del ejemplo muestra cómo cambiar el modo AVXENCODING
afecta al código de objeto generado para cada instrucción. El prefijo de cada instrucción termina en "/".
00000000 62 F2 6D 08/ 50 vpdpbusd xmm1, xmm2, xmm3
CB
00000006 C5 E9/ F5 CB vpmaddwd xmm1, xmm2, xmm3
option avxencoding:no_EVEX
0000000A C4 E2 69/ 50 CB vpdpbusd xmm1, xmm2, xmm3
0000000F C5 E9/ F5 CB vpmaddwd xmm1, xmm2, xmm3
option avxencoding:prefer_VEX
00000013 C4 E2 69/ 50 CB vpdpbusd xmm1, xmm2, xmm3
00000018 C5 E9/ F5 CB vpmaddwd xmm1, xmm2, xmm3
option avxencoding:prefer_VEX3
0000001C C4 E2 69/ 50 CB vpdpbusd xmm1, xmm2, xmm3
00000021 C4 E1 69/ F5 CB vpmaddwd xmm1, xmm2, xmm3
option avxencoding:prefer_EVEX
00000026 62 F2 6D 08/ 50 vpdpbusd xmm1, xmm2, xmm3
CB
0000002C 62 F1 6D 08/ F5 vpmaddwd xmm1, xmm2, xmm3
CB
option avxencoding:prefer_first
00000032 62 F2 6D 08/ 50 vpdpbusd xmm1, xmm2, xmm3
CB
00000038 C5 E9/ F5 CB vpmaddwd xmm1, xmm2, xmm3