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_EVEX
,evex 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 及更高版本中可用。
示例
此示例使用 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