OPTION AVXENCODING
AVX 命令の優先エンコードを選択します。
構文
OPTION AVXENCODING:
preference
背景
Intel AVX および AVX-512 命令は、他の Intel アーキテクチャの命令とは異なる方法でエンコードされます。 命令の選択のために命令プレフィックス バイトおよびオペコードの先行バイトに依存するのではなく、1 つのマルチバイト プレフィックスを使用します。 このプレフィックスは、追加のレジスタ オペランドをエンコードできます。 64 ビットモードでは、他のオペランドに対して 8 から 15 のレジスタを選択するビットもあります。また、REX のプレフィックスは必要ありません。
3 つの異なるマルチバイト プレフィックスが使用されます。 AVX 命令は、3 バイトの VEX プレフィックスを使用してエンコードできます。2 番目と 3 番目のバイトは、実行された特定の操作を選択するのに役立ちます。 3 バイトの VEX プレフィックスの一部のフィールドに特定の値が含まれている場合は、代わりに、VEX プレフィックスの 2 バイト形式を使用できます。 最後に、一部の AVX 命令には、4 バイトの EVEX プレフィックスでエンコードされる AVX-512 形式もあります。 EVEX プレフィックスには、512 ビットのベクター長を選択する追加のフィールドと、AVX-512 命令に固有のその他のオプションがあります。
いくつかの AVX 命令は、最大 3 つの異なる方法でエンコードされる可能性があるため、使用する形式を選択するための規則があります。 OPTION AVXENCODING
ディレクティブは、使用する規則のセットを選択するために使用されます。
ユーザー設定
基本設定 | エンコードの優先順位 |
---|---|
PREFER_FIRST |
可能であれば、最初に定義した形式を使用します。 |
PREFER_VEX |
EVEX エンコードよりも VEX エンコードを優先して使用します。 |
PREFER_VEX3 |
EVEX エンコードよりも 3 バイトの VEX エンコードを優先して使用します。 |
PREFER_EVEX |
VEX エンコードよりも EVEX エンコードを優先して使用します。 |
NO_EVEX |
EVEX を使用してエンコードしないでください。 |
AVXENCODING の順序は、命令のプレフィックス形式がその命令用に指定されていない場合にのみ適用されます。 命令プレフィックスが明示的にコード化されている場合は、AVXENCODING
オプションよりも優先されます。 たとえば、OPTION AVXENCODING:no_EVEX
が指定されている場合でも、evex vpmaddwd
は EVEX
がプレフィックスとして付けられた VPMADDWD
を使用します。
アセンブリ ソースがエンコード設定を選択するために OPTION AVXENCODING
を使用していない場合は、既定で PREFER_FIRST
規則が使用されます。 これらの規則により、Microsoft Macro Assembler (MASM) に追加された最も古い命令エンコーディングが優先されます。また、このような場合は、最も短いプレフィックス形式を使用したエンコーディングが優先されます。 これらの規則により、新しい命令形式が後で追加された場合でも、MASM によってアセンブルされたコードは同じオブジェクト コードを生成します。
PREFER_VEX
規則は、EVEX
を使用してエンコードを試行する前に、常に VEX
プレフィックスを使用してエンコードしようとします。 可能な場合は、3 バイト形式の代わりに、VEX
の 2 バイト形式が使用されます。
PREFER_VEX3
設定は、EVEX
を使用してエンコードを試行する前に、常に 3 バイトの VEX
プレフィックスを使用してエンコードしようとします。 VEX
の 2 バイト形式は使用されません。
PREFER_EVEX
オプションは常に EVEX
プレフィックスを使用してエンコードを試み、命令に AVX-512 形式がない場合にのみ、VEX
の使用を試みます。
NO_EVEX
設定では、VEX
プレフィックスを使用したエンコードのみが試行されます。 AVX-512 命令形式は使用できません。 このオプションを使用すると、AVX-512 がまったくサポートされていないプラットフォームで使用するためのコードをアセンブルすることができます。
OPTION AVXENCODING
ディレクティブは、Visual Studio 2019 バージョン 16.7 以降で使用できます。
例
この例では、VPDPBUSD
と VPMADDWD
の命令を使用して、AVXENCODING
オプションの動作を説明します。 VPDPBUSD
は、最初に EVEX
でのみエンコードされるように定義されていましたが、後で AVX 512 がサポートされていないプラットフォーム用に VEX でエンコードされた形式で拡張され、VPMADDWD
が AVX で AVX-512 に拡張されました。 例のアセンブルからの一覧出力では、AVXENCODING
モードの変更が、各命令に対して生成されたオブジェクト コードに与える影響を示しています。 各命令のプレフィックスは、'/' で終了します。
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