Assembly NDS、NDD和DDS在编码VEX指令时代表什么?
来自,第3.1.1.2节:指令汇总表中的操作码列(带有VEX前缀的指令) NDS,NDD,DDS:指定VEX.vvvv字段对寄存器操作数的编码有效: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
- 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前缀的位字段可根据其功能目的进行总结:
- 无损源寄存器编码(适用于三操作数和四操作数语法):这是指令语法中的第一个源操作数。维克斯
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
case更新)DDS
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
66 0F xx
SSE2编码空间中有一些免费的操作码,英特尔本可以使用这些操作码来代替这些常用指令。不过,我想他们已经决定将/r
字段用于0F xx
MMX版本了。制作新wi