代码之家  ›  专栏  ›  技术社区  ›  warunapww Krishna

PADDD指令的操作数

  •  1
  • warunapww Krishna  · 技术社区  · 9 年前

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

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

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

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

    这是否意味着当 有衬垫的 在执行时,它会从全局内存中执行mov,先注册,然后添加寄存器中的两个操作数?相当于以下代码序列

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

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

    1 回复  |  直到 9 年前
        1
  •  6
  •   Peter Cordes    9 年前

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

    在某些情况下,它还可以在Intel CPU(uop micro fusion)上更高效地执行。因此,如果您不需要很快在该内存地址处再次存储数据,请选择将加载内容折叠到其他指令中。

    看见 http://agner.org/optimize/ 有关CPU内部的文档,以及如何优化asm和C代码。