OPTION AVXENCODING
Wählt die bevorzugte Codierung von AVX-Anweisungen aus.
Syntax
OPTION AVXENCODING:
Vorliebe
Hintergrund
Intel AVX- und AVX-512-Anweisungen werden anders codiert als andere Intel Architecture-Anweisungen. Anstatt sich auf Anweisungspräfixbytes und Opcode-Lead-In-Bytes zu verlassen, um eine Anweisung auszuwählen, verwenden sie ein einzelnes Multibytepräfix. Dieses Präfix kann einen zusätzlichen Registeropernden codieren. Im 64-Bit-Modus verfügt es auch über Bits, um 8 bis 15 für die anderen Operanden auszuwählen, und ein REX-Präfix ist nicht erforderlich.
Es werden drei verschiedene Multibytepräfixe verwendet. AVX-Anweisungen können mit einem 3-Byte-VEX-Präfix codiert werden, wobei die zweite und dritte Byte helfen, den bestimmten Vorgang auszuwählen, der ausgeführt wird. Wenn einige felder im 3-Byte-VEX-Präfix bestimmte Werte aufweisen, kann stattdessen ein 2-Byte-Formular des VEX-Präfixes verwendet werden. Schließlich verfügen einige AVX-Anweisungen auch über ein AVX-512-Formular, das mit einem 4-Byte EVEX-Präfix codiert ist. Das EVEX-Präfix enthält zusätzliche Felder, um die Länge des Vektors 512 Bit und andere optionen auszuwählen, die für AVX-512-Anweisungen spezifisch sind.
Da einige AVX-Anweisungen auf bis zu drei verschiedene Arten codiert werden können, gibt es Regeln zum Auswählen des zu verwendenden Formulars. Die OPTION AVXENCODING
Direktive wird verwendet, um auszuwählen, welche Regelsätze verwendet werden sollen.
Einstellungen
Einstellung | Priorität der Codierungseinstellung |
---|---|
PREFER_FIRST |
Verwenden Sie nach Möglichkeit das erste definierte Formular. |
PREFER_VEX |
Verwenden Sie VEX die Codierung in der Voreinstellung für die EVEX Codierung. |
PREFER_VEX3 |
Verwenden Sie die 3-Byte-Codierung VEX vor der EVEX Codierung. |
PREFER_EVEX |
Verwenden Sie EVEX die Codierung in der Voreinstellung für die VEX Codierung. |
NO_EVEX |
Codieren Sie nicht mit EVEX . |
Die AVXENCODING-Reihenfolge gilt nur, wenn das Anweisungspräfixformular für die Anweisung nicht angegeben ist. Wenn das Anweisungspräfix explizit codiert ist, hat sie Vorrang vor der AVXENCODING
Option. Verwenden Sie EVEX
z. B. das Präfix "-präfix"VPMADDWD
, evex vpmaddwd
auch wenn OPTION AVXENCODING:no_EVEX
sie angegeben ist.
Wenn eine Assemblyquelle nicht zum Auswählen von Codierungseinstellungen verwendet OPTION AVXENCODING
wird, werden die PREFER_FIRST
Regeln standardmäßig verwendet. Durch diese Regeln haben die frühesten Anweisungscodierungen, die Microsoft Macro Assembler (MASM) hinzugefügt haben, Vorrang, und unter diesen Möglichkeiten wird die Codierung mit der kürzesten Präfixform bevorzugt. Diese Regeln stellen sicher, dass code, der von MASM zusammengestellt wurde, weiterhin denselben Objektcode generiert, wenn später neue Anweisungsformulare hinzugefügt werden.
Die PREFER_VEX
Regeln versuchen immer, mit einem VEX
Präfix zu codieren, bevor versucht wird, mit EVEX
. Wenn möglich, wird das 2-Byte-Formular VEX
anstelle des 3-Byte-Formulars verwendet.
Die PREFER_VEX3
Einstellung versucht immer, mit einem 3-Byte-Präfix VEX
zu codieren, bevor versucht wird, mit EVEX
. Die 2-Byte-Form VEX
wird nicht verwendet.
Die PREFER_EVEX
Option versucht immer, ein EVEX
Präfix zu codieren und nur zu verwenden VEX
, wenn die Anweisung kein AVX-512-Formular aufweist.
Die NO_EVEX
Einstellung versucht nur, mithilfe eines Präfixes VEX
zu codieren. Es sind keine AVX-512-Anweisungsformulare zulässig. Mit dieser Option können Sie Code für die Verwendung auf Plattformen zusammenstellen, die über keine AVX-512-Unterstützung verfügen.
Die OPTION AVXENCODING
Direktive ist in Visual Studio 2019, Version 16.7 und höher, verfügbar.
Beispiel
In diesem Beispiel wird VPDPBUSD
VPMADDWD
gezeigt, wie die AVXENCODING
Option funktioniert. VPDPBUSD
wurde zuerst so definiert, dass sie nur mit EVEX
, und später mit einer VEX-codierten Form für Plattformen ohne AVX-512-Unterstützung erweitert wurde, während VPMADDWD
AVX und auf AVX-512 erweitert wurde. Die Auflistungsausgabe aus der Zusammenstellung des Beispiels zeigt, wie sich das Ändern des Modus auf den AVXENCODING
für jede Anweisung generierten Objektcode auswirkt. Das Präfix für jede Anweisung endet am "/".
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