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 vpmaddwdEVEX がプレフィックスとして付けられた 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 以降で使用できます。

この例では、VPDPBUSDVPMADDWD の命令を使用して、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

関連項目

Option (MASM)
ディレクティブ リファレンス