Assembly NDS、NDD和DDS在编码VEX指令时代表什么?

Assembly NDS、NDD和DDS在编码VEX指令时代表什么?,assembly,x86,x86-64,intel,machine-code,Assembly,X86,X86 64,Intel,Machine Code,来自,第3.1.1.2节:指令汇总表中的操作码列(带有VEX前缀的指令) NDS,NDD,DDS:指定VEX.vvvv字段对寄存器操作数的编码有效: VEX.NDS:VEX.VVV以指令语法对第一个源寄存器进行编码,其中源寄存器的内容将 保存 VEX.NDD:VEX.vvv对ModR/M:reg字段无法编码的目标寄存器进行编码 VEX.DDS:VEX.VVV以三操作数指令语法对第二个源寄存器进行编码,其中第一个源寄存器的内容 寄存器将被结果覆盖 我认为这与“非破坏性来源”有关,我想这就是ND

来自,第3.1.1.2节:指令汇总表中的操作码列(带有VEX前缀的指令)

NDSNDDDDS:指定VEX.vvvv字段对寄存器操作数的编码有效:

  • VEX.NDS:VEX.VVV以指令语法对第一个源寄存器进行编码,其中源寄存器的内容将 保存
  • VEX.NDD:VEX.vvv对ModR/M:reg字段无法编码的目标寄存器进行编码
  • VEX.DDS:VEX.VVV以三操作数指令语法对第二个源寄存器进行编码,其中第一个源寄存器的内容 寄存器将被结果覆盖

我认为这与“非破坏性来源”有关,我想这就是NDS的意思。其他代码代表什么?它们如何影响指令的编码?同样的,为什么它们很重要?因为AMD手册中没有任何关于这些术语的参考资料?

我没有看过AMD手册,但我认为它们选择了其他方式来指示使用它的指令的操作数是由
VEX.vvv
字段编码的

Intel使用此表示法提醒/明确哪个操作数是VV字段。它已经是多余的,因为每条指令的“操作数编码”表显示了在哪个字段中编码哪个操作数


更新:英特尔将其从手册中删除可能在2018年11月的更新中。它们也于2018年10月从版本035中删除,该版本具有与第2卷手册相同格式的说明列表,并且有一个修订表,其中提供了此变更日志:

从指令中删除NDD/DDS/NDS术语。注:之前 术语NDS、NDD和DDS在带有EVEX(或VEX)的指令中使用 前缀这些术语表明VVV字段对以下各项有效: 编码和指定的寄存器用法。这些条款不再适用 必需和与指令操作数编码是冗余的 每个说明都提供了表格。指令操作数 编码表给出所有操作数的显式详细信息,表示 存储每个操作数的位置以及它们是否被读取或写入。如果VVV 未列为指令操作数编码表中的操作数, 那么EVEX(或VEX)VVV必须是0b1111

这告诉我们,这些NDD/DDS/NDS标记的目的是指示哪个操作数是哪个操作数,以及它们是读还是写


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

我认为
NDD
的明显解释是非破坏性目的地(令人烦恼的是,SSE2版本的移位具有破坏性)

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


第2.3.5节VEX前缀: VEX前缀的位字段可根据其功能目的进行总结:

  • 无损源寄存器编码(适用于三操作数和四操作数语法):这是指令语法中的第一个源操作数。维克斯
(反转:1111表示xmm0,0000表示xmm15。如后所述,反转避免与仅32位(加载远指针)指令的有效编码重叠。32位模式只能使用xmm0-7,因此第一位始终是必需的1,使其不是有效的
LES
/
LDS

是的,“无损源”是英特尔手册中使用的一个短语


第2.3.6节:指令操作数编码和VEX.vv、ModR/M 某些VEX编码指令的语法少于三个字符 操作数,例如VEX编码的包移位指令支持一个源 操作数和一个目标操作数)

VEX.VVV、ModR/M字节的reg字段(ModR/M.reg)、ModR/M字节的r/M字段(ModR/M.r/M)的角色 编码目标操作数和源操作数随指令语法类型的不同而不同

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

  • VEX.VVV编码第一个源寄存器操作数,以倒(1的补码)形式指定,对 具有2个或更多源操作数的指令。(这是NDS的情况)

  • VEX.VVV对目标寄存器操作数进行编码,以1的补码形式为某些向量移位指定。 将VEX.VVV用作目的地的说明如表2-9所示。“操作码”中的符号 第3.1.1节详细描述了表2-9中的列。(问题中引用的部分)

  • VEX.vvv不编码任何操作数(显然没有针对FMA
    DDS
    case更新)
所讨论的向量移位是
VPS{R,L}L{W,D,Q}
VPSRA{W,D,Q}
,和
VPS{R,L}LDQ
(字节移位),它们使用
mod/rm
/R
字段作为额外的操作码位,如一些单操作数整数指令(例如
和R/m32,imm8
)。e、 g

  • 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版本了。制作新wi