OPTION AVXENCODING

选择 AVX 指令的首选编码。

语法

OPTION AVXENCODING:偏好

背景

Intel AVX 和 AVX-512 指令的编码方式与其他 Intel 体系结构指令不同。 它们不依赖指令前缀字节和操作码导入字节来选择指令,而是使用单个多字节前缀。 此前缀可以编码其他寄存器操作数。 在 64 位模式下,此前缀还具有位来为其他操作数选择 8 到 15 个寄存器,并且不需要 REX 前缀。

使用三个不同的多字节前缀。 AVX 指令可以使用 3 字节 VEX 前缀进行编码,其中第二个和第三个字节有助于选择执行的特定操作。 如果 3 字节 VEX 前缀中的某些字段具有特定值,则可以改为使用 2 字节格式的 VEX 前缀。 最后,一些 AVX 指令也有 AVX-512 格式,此格式使用 4 字节的 EVEX 前缀进行编码。 EVEX 前缀具有其他字段,用于选择 512 位矢量长度,以及特定于 AVX-512 指令的其他选项。

由于某些 AVX 指令可能以三种不同的方式进行编码,因此有一些规则可以选择要使用的格式。 OPTION AVXENCODING 指令用于选择要使用的规则集。

首选项

首选项 编码首选项优先级
PREFER_FIRST 如果可能,请使用第一个定义窗体。
PREFER_VEX 优先使用 VEX 编码,而不是 EVEX 编码。
PREFER_VEX3 优先使用 3 字节 VEX 编码,而不是 EVEX 编码。
PREFER_EVEX 优先使用 EVEX 编码,而不是 VEX 编码。
NO_EVEX 不要使用 EVEX 进行编码。

仅当没有为指令指定指令前缀格式时,AVXENCODING 顺序才适用。 如果显式编码指令前缀,则优先于 AVXENCODING 选项。 例如,即使指定了 OPTION AVXENCODING:no_EVEXevex vpmaddwd 也会使用以 EVEX 为前缀的 VPMADDWD

如果程序集源没有使用 OPTION AVXENCODING 来选择编码首选项,则默认使用 PREFER_FIRST 规则。 根据这些规则,添加到 Microsoft 宏汇编程序 (MASM) 的最早指令编码具有优先权,并且在这些可能性中,首选具有最短前缀格式的编码。 这些规则确保 MASM 汇编的代码在以后添加新的指令格式时仍然生成相同的目标代码。

PREFER_VEX 规则始终首先尝试用 VEX 前缀进行编码,然后才会尝试用 EVEX 进行编码。 请尽量使用 2 字节格式的 VEX,而不是 3 字节格式。

PREFER_VEX3 首选项始终首先尝试用 3 字节 VEX 前缀进行编码,然后才会尝试用 EVEX 进行编码。 将不会使用 2 字节格式的 VEX

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

另请参阅

选项 (MASM)
指令参考