来自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手册中没有包含任何参考,据我所知这些条款?
1 回答
我没有看过AMD手册,但我认为他们选择了其他方式来指示哪个操作数由
VEX.vvvv
字段编码,以获取使用它的指令 .英特尔使用此表示法提醒您/清楚哪个操作数是vvvv字段 . 它已经是冗余的,因为每条指令的“操作数编码”表显示哪个操作数在哪个字段中编码 .
更新: Intel removed them from their manual 可能在2018年11月更新 . 它们也从2018年10月的"future extensions" manual rev 035中删除,其中指令列表的格式与vol.2手册相同,并且有一个修订表,他们提供了这个更改日志:
这告诉我们,那些NDD / DDS / NDS标签的目的是指示哪个操作数是哪个,以及它们是读还是写 .
非破坏性来源是本手册同一卷中其他地方使用的短语(见下文),因此我对
NDS
的正确解释 .我认为对
NDD
的明显解释是非破坏性目的地(其中SSE2版本的变换令人讨厌地具有破坏性) .目前还不清楚
DDS
应该代表什么 . "Destructive Destination-Source"不会被覆盖的其他源reg .Intel手册vol2第2.3.5节VEX前缀:
(反转:x11为1111,xmm15为0000 . 如后所述,反转避免与32bit-only LES and LDS(加载远指针)指令的有效编码重叠.32位模式只能使用xmm0-7,所以第一位总是必需的1,使其无效
LES
/LDS
. )所以,是的,“非破坏性来源”是英特尔手册使用的一个短语 .
第2.3.6节:指令操作数编码和VEX.vvvv,ModR / M.
有问题的向量移位是
VPS{R,L}L{W,D,Q}
,VPSRA{W,D,Q}
和VPS{R,L}LDQ
(字节移位),它使用mod/rm
的/r
字段作为额外的操作码位,如某些单操作数整数指令(例如and r/m32, imm8
) . 例如VEX.NDD.128.66.0F 73 /7 ib
VPSLLDQ
VEX.NDD.128.66.0F 73 /3 ib
VPSRLDQ
这就是SSE版本就地位/字节移位的原因,经常需要一个movdqa指令 . 在
66 0F xx
SSE2编码空间中有一些免费的操作码,英特尔可以使用这些操作码,而不是使这些经常使用的指令具有破坏性 . 我猜他们已经坚持决定将/r
字段用于0F xx
MMX版本 . 我认为,新的SSE2字节移位也不具备破坏性 . 至少他们设法做了一次非破坏性的洗牌,pshufd
.