Intel's x86 manuals, Vol2的第3.1.1.2节:“指令摘要”表中的“操作码”列(带VEX前缀的指令)


NDS,NDD,DDS:指定VEX.vvvv字段对于寄存器操作数的编码有效:


VEX.NDS:VEX.vvvv使用指令语法对第一个源寄存器进行编码,其中源寄存器的内容将是
保留。
VEX.NDD:VEX.vvvv对不能由ModR / M:reg字段编码的目标寄存器进行编码。
VEX.DDS:VEX.vvvv使用三操作数指令语法对第二个源寄存器进行编码,其中第一个源的内容
寄存器将被结果覆盖。



我认为这与“非破坏性来源”有关,我想这就是NDS所代表的意思。其他指令代表什么,又如何影响指令的编码?类似地,为什么它们甚至很重要-因为据我所知,AMD手册不包含任何参考?

最佳答案

我没有看过AMD手册,但我假设他们选择了其他方式来表示VEX.vvvv字段编码的操作数,以获取使用它的说明。

英特尔使用这种表示法来提醒您/明确哪个操作数是vvvv字段。这已经是多余的了,因为每条指令的“操作数编码”表显示了哪个操作数在哪个字段中编码。



更新:英特尔可能在2018年11月更新中将其从手册中删除了。它们也于2018年10月从"future extensions" manual修订版035中删除,该修订版具有与vol.2手册相同的格式的指令清单,并具有一个修订表,其中提供了此变更日志:


从说明中删除NDD / DDS / NDS条款。注意:以前,
EVEX(或VEX)的说明中使用了NDS,NDD和DDS术语
字首。这些条款表明vvvv字段对
编码和指定的寄存器用法。这些条款不再
必要,并且与指令操作数编码无关
每个指令随附的表格。指令操作数
编码表给出了所有操作数的明确细节,指示
每个操作数的存储位置以及是否读取或写入它们。如果是vvvv
在指令操作数编码表中未作为操作数列出,
则EVEX(或VEX)vvvv必须为0b1111。


因此,这告诉我们,这些NDD / DDS / NDS标签的目的是指示哪个操作数是哪个,以及是否读取或写入它们。



非破坏性来源是手册同一卷中其他地方使用的短语(请参见下文),因此我非常有信心这是对NDS的正确解释。

我认为NDD的明显解释是“非破坏性目的地”(其中,令人讨厌的SSE2版本的移位具有破坏性)。

目前尚不清楚DDS应该代表什么。 “破坏性目标-源”不适合,因为它是另一个源reg被覆盖。



Intel manual vol2第2.3.5节VEX前缀:


VEX前缀的位字段可以按其功能用途进行概括:


非破坏性源寄存器编码(适用于三个和四个操作数语法):这是指令语法中的第一个源操作数。 VEX.vvvv。



(取反:对于xmm0为1111,对于xmm15为0000。如后所述,该取反避免了与仅32位LES and LDS(装入远端指针)指令的有效编码重叠。32位模式只能使用xmm0-7,因此第一位始终是必填项1,因此它不是有效的LES / LDS。)

因此,是的,“非破坏性来源”是英特尔手册中使用的短语。



第2.3.6节:指令操作数编码和VEX.vvvv,ModR / M


某些VEX编码指令的语法少于三个
操作数,例如VEX编码的包装转移指令支持一种来源
操作数和一个目标操作数)。

VEX.vvvv的作用,ModR / M字节的reg字段(ModR / M.reg),ModR / M字节的r / m字段(ModR / M.r / m)与
编码目标和源操作数的方式因指令语法的类型不同而异。

VEX.vvvv的作用可以概括为三种情况:


VEX.vvvv对第一个源寄存器操作数进行编码,以反转(1的补码)形式指定,并且对
具有2个或更多源操作数的指令。 (这是NDS的情况)
VEX.vvvv对目标寄存器操作数进行编码,以1的补码形式为某些矢量移位指定。
表2-9中列出了将VEX.vvvv用作目标的说明。 “操作码”中的表示法
表2-9中的“列”将在3.1.1节中详细介绍。 (问题中引用的部分)
VEX.vvvv不对任何操作数进行编码(对于FMA DDS情况显然没有更新)。



有问题的向量移位是VPS{R,L}L{W,D,Q}VPSRA{W,D,Q}VPS{R,L}LDQ(字节移位),它们将/rmod/rm字段用作额外的操作码位,例如一些单操作数整数指令(例如,)。例如


and r/m32, imm8 VEX.NDD.128.66.0F 73 /7 ib
VPSLLDQ VEX.NDD.128.66.0F 73 /3 ib


这就是为什么SSE版本进行就地位/字节移位,通常需要movdqa指令的原因。 VPSRLDQ SSE2编码空间中有一些免费的操作码,英特尔本可以使用这些操作码来代替,使这些常用指令具有破坏性。不过,我想他们已经决定将66 0F xx字段用于/r MMX版本了。我认为,也无需使带有SSE2的新字节移位insn具有破坏性。至少他们设法进行了一种无损洗牌,0F xx

08-16 13:15