OPTION AVXENCODING
Seleciona a codificação preferencial de instruções AVX.
Sintaxe
OPTION AVXENCODING:
preferência
Tela de fundo
As instruções Intel AVX e AVX-512 são codificadas de modo diferente de outras instruções da Arquitetura Intel. Em vez de depender de bytes de prefixo de instrução e bytes de entrada de opcode para selecionar uma instrução, eles usam um único prefixo de vários bytes. Esse prefixo pode codificar um operando de registro adicional. No modo de 64 bits, ele também tem bits para selecionar os registros de 8 a 15 para os outros operandos, e um prefixo REX não é necessário.
São usados três prefixos de multibyte diferentes. As instruções AVX podem ser codificadas com um prefixo VEX de 3 bytes, em que o segundo e o terceiro bytes ajudam a selecionar a operação específica executada. Se alguns dos campos no prefixo VEX de 3 bytes tiverem valores específicos, um formato de 2 bytes do prefixo VEX poderá ser usado. Por fim, algumas instruções AVX também têm um formato AVX-512, que é codificada com um prefixo EVEX de 4 bytes. O prefixo EVEX tem campos adicionais para selecionar o comprimento do vetor de 512 bits e outras opções específicas das instruções do AVX-512.
Como algumas instruções do AVX podem ser codificadas de até três maneiras diferentes, há regras para selecionar qual formato usar. A diretiva OPTION AVXENCODING
é usada para selecionar qual conjunto de regras usar.
Preferências
Preferência | Prioridade de preferência de codificação |
---|---|
PREFER_FIRST |
Use o primeiro formato definido, se possível. |
PREFER_VEX |
Dê preferência para a codificação VEX em vez da EVEX . |
PREFER_VEX3 |
Dê preferência para a codificação VEX de 3 bytes em vez da EVEX . |
PREFER_EVEX |
Dê preferência para a codificação EVEX em vez da VEX . |
NO_EVEX |
Não codifique usando EVEX . |
A ordem AVXENCODING só se aplicará se o formato de prefixo da instrução não for especificado para a instrução. Se o prefixo da instrução for codificado explicitamente, ele terá precedência sobre a opção AVXENCODING
. Por exemplo, evex vpmaddwd
usará VPMADDWD
com prefixo EVEX
mesmo se OPTION AVXENCODING:no_EVEX
for especificado.
Se uma fonte de assembly não usar OPTION AVXENCODING
para selecionar preferências de codificação, as regras PREFER_FIRST
serão usadas por padrão. Por essas regras, as primeiras codificações de instrução adicionadas ao MASM (Microsoft Macro Assembler) têm precedência e, entre essas possibilidades, a codificação com o formato de prefixo mais curto é preferencial. Essas regras garantem que o código montado pelo MASM ainda gere o mesmo código de objeto se novas formas de instrução forem adicionadas posteriormente.
As regras PREFER_VEX
sempre tentam codificar com um prefixo VEX
antes de tentar codificar com EVEX
. Se possível, o formato de 2 bytes de VEX
é usado em vez do formato de 3 bytes.
A preferência PREFER_VEX3
sempre tenta codificar com um prefixo VEX
de 3 bytes antes de tentar codificar com EVEX
. O formato de 2 bytes de VEX
não será usado.
A opção PREFER_EVEX
sempre tenta codificar com um prefixo EVEX
e só tentará usar VEX
se a instrução não tiver um formato AVX-512.
A preferência NO_EVEX
só tenta codificar usando um prefixo VEX
. Nenhuma forma de instrução AVX-512 é permitida. Essa opção permite que você monte código para uso em plataformas que não dão suporte a AVX-512.
A diretiva OPTION AVXENCODING
está disponível no Visual Studio 2019 versão 16.7 e posterior.
Exemplo
Este exemplo usa as instruções VPDPBUSD
e VPMADDWD
para ilustrar como a opção AVXENCODING
funciona. VPDPBUSD
foi definido pela primeira vez para ser codificado apenas com EVEX
, e mais tarde foi estendido com um formato codificado em VEX para plataformas sem suporte a AVX-512, enquanto VPMADDWD
era AVX e estendido para AVX-512. A saída de listagem da montagem do exemplo mostra como a alteração do modo AVXENCODING
afeta o código de objeto gerado para cada instrução. O prefixo para cada instrução termina em '/".
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