首页 文章

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

提问于
浏览
4

来自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 回答

  • 2

    我没有看过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和DDS用于带有EVEX(或VEX)前缀的指令中 . 这些术语表明vvvv字段对编码和指定的寄存器用法有效 . 这些术语不再是必需的,并且与每条指令提供的指令操作数编码表是冗余的 . 指令操作数编码表给出了所有操作数的明确细节,指示每个操作数的存储位置以及是否读取或写入操作数 . 如果vvvv未在指令操作数编码表中列为操作数,则EVEX(或VEX)vvvv必须为0b1111 .

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


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

    我认为对 NDD 的明显解释是非破坏性目的地(其中SSE2版本的变换令人讨厌地具有破坏性) .

    目前还不清楚 DDS 应该代表什么 . "Destructive Destination-Source"不会被覆盖的其他源reg .


    Intel手册vol2第2.3.5节VEX前缀:

    VEX前缀的位字段可以通过其功能目的进行汇总:非破坏性源寄存器编码(适用于三个和四个操作数语法):这是指令语法中的第一个源操作数 . VEX.vvvv .

    (反转:x11为1111,xmm15为0000 . 如后所述,反转避免与32bit-only LES and LDS(加载远指针)指令的有效编码重叠.32位模式只能使用xmm0-7,所以第一位总是必需的1,使其无效 LES / LDS . )

    所以,是的,“非破坏性来源”是英特尔手册使用的一个短语 .


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

    某些VEX编码指令的语法少于三个操作数,例如VEX编码的包移位指令支持一个源操作数和一个目标操作数) . VEX.vvvv,modR / M字节的寄存器字段(ModR / M.reg),ModR / M字节的r / m字段(ModR / Mr / 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 (字节移位),它使用 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 .

相关问题