PADDD 指令的操作数

Operands for PADDD instruction

我在 C 中使用向量内在运算编写了一个简单的向量加法程序。这里我加载 2 个向量并将它们相加,最后将结果向量存储回全局内存。

当我检查汇编代码时,它有以下指令序列

movdqa  0(%rbp,%rax), %xmm7    
paddd (%r12,%rax), %xmm7
movdqa  %xmm7, (%rbx,%rax)

如您所见,它仅将 paddd 指令的一个操作数移动到寄存器 (xmm7)。在 paddd 指令中,第一个操作数指的是全局内存中的地址,而不是先将其移动到寄存器。

这是否意味着当paddd被执行时,它首先从全局内存中移动到注册然后添加两个在寄存器中的操作数?相当于下面的代码序列

movdqa  0(%rbp,%rax), %xmm7
movdqa  0(%r12,%rax), %xmm8    
paddd %xmm8, %xmm7
movdqa  %xmm7, (%rbx,%rax)

如果您需要更多信息(例如可编译程序),请告诉我,以便您自己生成程序集。

大多数 x86 指令都可以与内存源操作数一起使用。不需要额外的寄存器。读取-修改指令与加载然后操作的组合一样快。优点是它需要更少的指令字节,并且不需要额外的寄存器。

它在某些情况下也可以在 Intel CPUs(uop 微融合)上更有效地执行。因此,如果您很快不再需要该内存地址处的数据,则更喜欢将加载折叠到其他指令中。

有关 CPU 内部结构以及如何优化您的 asm 和 C 代码的文档,请参阅 http://agner.org/optimize/