OPTION AVXENCODING
Sélectionne l’encodage préféré des instructions AVX.
Syntaxe
OPTION AVXENCODING:
préférence
Background
Les instructions Intel AVX et AVX-512 sont encodées différemment des autres instructions de l’architecture Intel. Au lieu de compter sur des octets de préfixe d’instruction et des octets de prospects pour sélectionner une instruction, ils utilisent un préfixe multioctet unique. Ce préfixe peut encoder un opérande de registre supplémentaire. En mode 64 bits, il a également des bits pour sélectionner les registres 8 à 15 pour les autres opérandes, et un préfixe REX n’est pas nécessaire.
Trois préfixes multioctets différents sont utilisés. Les instructions AVX peuvent être encodées avec un préfixe VEX de 3 octets, où les deuxième et troisième octets permettent de sélectionner l’opération spécifique exécutée. Si certains des champs du préfixe VEX de 3 octets ont des valeurs spécifiques, une forme de 2 octets du préfixe VEX peut être utilisée à la place. Enfin, certaines instructions AVX ont également un formulaire AVX-512, qui est encodé avec un préfixe EVEX de 4 octets. Le préfixe EVEX comporte des champs supplémentaires pour sélectionner la longueur du vecteur 512 bits et d’autres options spécifiques aux instructions AVX-512.
Étant donné que certaines instructions AVX peuvent être encodées de trois façons différentes, il existe des règles pour sélectionner le formulaire à utiliser. La OPTION AVXENCODING
directive est utilisée pour sélectionner l’ensemble de règles à utiliser.
Préférences
Préférence | Priorité de préférence d’encodage |
---|---|
PREFER_FIRST |
Utilisez le formulaire défini en premier si possible. |
PREFER_VEX |
Utilisez l’encodage VEX en préférence pour l’encodage EVEX . |
PREFER_VEX3 |
Utilisez l’encodage de 3 octets VEX en préférence pour l’encodage EVEX . |
PREFER_EVEX |
Utilisez l’encodage EVEX en préférence pour l’encodage VEX . |
NO_EVEX |
N’encodez pas à l’aide EVEX de . |
L’ordre AVXENCODING s’applique uniquement si le formulaire de préfixe d’instruction n’est pas spécifié pour l’instruction. Si le préfixe d’instruction est explicitement codé, il est prioritaire sur l’option AVXENCODING
. Par exemple, evex vpmaddwd
utilise EVEX
-prefixed VPMADDWD
même si OPTION AVXENCODING:no_EVEX
elle est spécifiée.
Si une source d’assembly n’est pas utilisée OPTION AVXENCODING
pour sélectionner les préférences d’encodage, les PREFER_FIRST
règles sont utilisées par défaut. Par ces règles, les encodages d’instructions les plus anciens ajoutés à Microsoft Macro Assembleur (MASM) sont prioritaires et, parmi ces possibilités, l’encodage avec le formulaire de préfixe le plus court est préféré. Ces règles garantissent que le code assemblé par MASM génère toujours le même code objet si de nouveaux formulaires d’instruction sont ajoutés ultérieurement.
Les PREFER_VEX
règles essaient toujours d’encoder avec un VEX
préfixe avant d’essayer d’encoder avec EVEX
. Si possible, la forme de 2 octets est VEX
utilisée au lieu du formulaire de 3 octets.
La PREFER_VEX3
préférence tente toujours d’encoder avec un préfixe de 3 octets VEX
avant d’essayer d’encoder avec EVEX
. La forme de 2 octets de VEX
ne sera pas utilisée.
L’option PREFER_EVEX
tente toujours d’encoder avec un EVEX
préfixe et tente uniquement d’utiliser VEX
si l’instruction n’a pas de formulaire AVX-512.
La NO_EVEX
préférence tente uniquement d’encoder à l’aide d’un VEX
préfixe. Aucun formulaire d’instruction AVX-512 n’est autorisé. Cette option vous permet d’assembler du code à utiliser sur des plateformes qui n’ont pas de prise en charge AVX-512 du tout.
La OPTION AVXENCODING
directive est disponible dans Visual Studio 2019 version 16.7 et ultérieures.
Exemple
Cet exemple utilise VPDPBUSD
et VPMADDWD
des instructions pour illustrer le fonctionnement de l’option AVXENCODING
. VPDPBUSD
a d’abord été défini pour être encodé uniquement avec EVEX
, et a été étendu ultérieurement avec un formulaire encodé VEX pour les plateformes sans prise en charge AVX-512, tandis que VPMADDWD
AVX et étendu à AVX-512. La sortie de liste de l’assemblage de l’exemple montre comment modifier le AVXENCODING
mode affecte le code d’objet généré pour chaque instruction. Le préfixe de chaque instruction se termine à « / ».
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