1

只是为了好玩,我正在查看3DNow 的旧版(已弃用)说明!由AMD 介绍,我试图了解它们是如何使用的。所有指令似乎都按照这种模式编码:

instruction destination_MMn_register_operand, source_MMn_register_or_memory_operand

其中destinationRegister= -destinationRegister操作-source

例如,pfadd mm0, mmword ptr [rcx]0F 0F 01 9E):

在此处输入图像描述

会将 2 个压缩浮点数从指向的内存添加rcx到 2 个压缩浮点数,mm0并将结果保存在mm0.

所以看起来那些 3DNow 指令总是有一个mm寄存器作为目标。

但是你应该如何从这些mm寄存器中得到结果呢?

换句话说,没有mov mmword ptr [rcx], mm0, 或mov rax, mm0指令。

4

2 回答 2

3

正如@harold 所说,存储到内存已经被 MMX 覆盖movd,或者pshufw+movd只提取 high float

您不能做的一件事是打开 3dNow!在没有存储/重新加载的情况下浮动到 x87 80 位浮点数。

可能有用的是一个 EMMS 版本,它将 32 位扩展float为 80 位 x87 long doublein st0,同时将 FPU 设置回 x87 模式而不是 MMX 模式1。或者甚至可以将多个mm寄存器转换为多个 x87 寄存器?

即,这将是movd dword [esp], mm0/ emms/fld dword [esp]在 SIMD 减少后设置进一步标量 FP 的捷径。

请记住,这些是 IEEE754 float;您通常不希望它们在整数寄存器中,除非您要分离它们的位域(例如,对于exporlog实现),但您可以使用 MMX 移位/掩码指令来做到这一点。


但是 movd 和 fld 很便宜,所以他们不会为了节省重新加载延迟而费心制作特殊指令。此外,作为单条指令实施可能会很慢。尽管 x86 不是 RISC ISA,但拥有一条非常复杂的指令通常比多条更简单的指令慢(尤其是在完全解码为多个微指令之前。)例如,英特尔和 AMDsysenter以及syscall替换int 0x80系统调用的指令需要额外的指令之前/之后保存更多状态,但总体上仍然更快。

3dNow!femms离开 MMX/3dNow! 寄存器内容未定义,仅将标记字设置为未使用,而不是保留从 MMX 寄存器到/从 x87 寄存器内容的映射。有关AMD 官方手册,请参阅http://refspecs.linuxbase.org/AMD-3Dnow.pdf 。IDK,如果 AMD 的微架构刚刚删除了寄存器重命名信息或什么,但可能使 store / femms / x87-load 成为快速方式可以节省大量晶体管。

甚至 FEMMS 仍然有些慢,所以他们不想鼓励编码人员离开/重新进入 MMX/3dNow!经常模式。


有趣的事实:3dNow!PREFETCHW(带有写入意图的预取)仍在使用,并且有自己的 CPUID 功能位。

请参阅我对_builtin_prefetch() 中第二个参数的影响是什么的回答?

英特尔 CPU 很快增加了对将其解码为 NOP 的支持(因此 64 位 Windows 之类的软件可以在不检查的情况下使用它),但 Broadwell 和后来实际上使用 RFO 预取以使缓存线处于 MESI 独占状态,而不是共享状态,所以它可以在没有额外的非核心流量的情况下翻转到 Modified。

CPUID 特性位表明它确实会预取。


脚注 1

请记住,MMX 寄存器是 x87 寄存器的别名,因此不需要新的操作系统支持来保存/恢复上下文切换上的架构状态。直到SSE,我们才获得了新的架构状态。所以直到SSE2+3dNow!那是一个 3dNow!无需切换回 x87 模式float即可使用 SSE2 。double你可以movq2dq xmm0, mm0+ cvtps2pd xmm0, xmm0

他们本可以在寄存器中有一个 float->double mm,但fld/fst硬件仅设计用于floator double->80-bit 和 80-bit-> floator double。并且用例是有限的;如果您使用的是 3dNow!,请坚持使用float.

于 2018-08-06T22:24:03.730 回答
3

实际上有,即movdmovq。这些指令不是 3DNow! 的一部分,它们已经存在于 MMX which 3DNow! 是对。这也是为什么 3DNow!包括一组看起来非常不完整的整数运算。

于 2018-08-06T20:58:43.257 回答