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

lymnna71  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(121)

来自Intel's x86 manuals, Vol2,3.1.1.2部分:* 指令汇总表中的操作码列(带有VEX前缀的指令)*

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

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

我认为这与“非破坏性来源”有关,我想这就是NDS所代表的。其他的代表什么,这又如何影响指令的编码?在一个类似的说明,为什么他们甚至重要-作为AMD手册不包括任何参考,据我所知,这些条款?

a14dhokn

a14dhokn1#

根据英特尔APX docs(高级性能扩展:REX 2和EVEX用于传统整数指令,如sub,最后是setcc的编码,它写入完整的32/64位寄存器:Intel APX Architecture Specification - July 2023 Revision 1.0):

  • NDD代表新数据目的地
  • NDS代表无损源
  • 文件中没有提到DDS

据推测,2018年之前的SDM版本对首字母缩略词使用了相同的扩展。
我没有看过AMD手册,但我假设他们选择了其他方式来指示哪个操作数由VEX.vvvv字段编码,用于使用它的指令。
英特尔使用此符号提醒您/明确哪个操作数是vvvv字段。它已经是多余的,因为每条指令的“操作数编码”表显示了哪个操作数在哪个字段中编码。
更新:英特尔从手册中删除了它们可能在2018年11月的更新中。它们也在2018年10月从"future extensions" manual版本035中删除,该版本具有与第2卷手册相同格式的说明列表,并具有修订表,其中提供了此更新日志:
从说明书中删除NDD/DDS/NDS术语。注:以前,术语NDS、NDD和DDS用于带有EVEX(或VEX)前缀的说明中。这些术语指示vvvv字段对于编码是有效的,并且指定了寄存器使用。这些术语不再是必需的,并且对于每个指令提供的指令操作数编码表是冗余的。指令操作数编码表给予了所有操作数的详细信息,表示每个操作数的存储位置以及它们是读还是写。如果vvvv未在指令操作数编码表中列为操作数,则EVEX(或VEX)vvvv必须为0 b1111。
这告诉我们,这些NDD/DDS/NDS标记的目的是指示哪个操作数是哪个操作数,以及它们是读操作数还是写操作数。

  • 非破坏性源 * 是本手册中其他地方使用的短语(见下文),所以我很有信心这是对NDS的正确解释。

我认为NDD的明显解释是 * 非破坏性目的地 *(其中SSE 2版本的移位令人讨厌地是破坏性的)。
目前还不清楚DDS应该代表什么。“Destructive Destination-Source”不适合,因为它是 other 源reg被覆盖。

Intel manual vol2第2.3.5节VEX前缀:

VEX前缀的位字段可以通过其功能目的来概括:

*无损源寄存器编码(适用于三、四操作数语法):这是指令语法中的第一个源操作数。VEX.vvvv.

(倒置:xmm 0为1111,xmm 15为0000。如稍后所述,反转避免与仅32位LES and LDS(加载远指针)指令的有效编码重叠。32位模式只能使用xmm 0 -7,因此第一位始终是所需的1,使其不是有效的LES/LDS
所以,是的,“非破坏性来源”是英特尔手册使用的一个短语。

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

一些VEX编码指令具有少于三个操作数的语法,例如VX编码的包移位指令支持一个源操作数和一个目的地操作数)。
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的补码形式指定。VEX.vvvv用作目标的指令如表2-9所示。表2-9中的“操作码”列中的符号在第3.1.1节中详细描述。(* 问题所引述的部分 *)
  • VEX.vvvv不对任何操作数进行编码(* 显然未针对FMA DDS情况进行更新 *)。

所讨论的向量移位是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 ibVPSLLDQ
  • VEX.NDD.128.66.0F 73 /3 ibVPSRLDQ

这就是为什么SSE版本是在位/字节移位,经常需要一个movdqa指令。在66 0F xx SSE 2编码空间中有一些免费的操作码,英特尔本可以使用它们来代替这些常用的指令。不过,我猜他们已经决定在0F xx MMX版本中使用/r字段了。我认为,使新的SSE 2字节移位也具有破坏性是不必要的。至少他们成功地进行了一次非破坏性的 Shuffle ,pshufd

相关问题