代码之家  ›  专栏  ›  技术社区  ›  Jacob

添加128位xmm寄存器的上下64位

  •  3
  • Jacob  · 技术社区  · 15 年前

    我有两个压缩四字整数 xmm0 我需要将它们加在一起,并将结果存储在一个内存位置。我可以保证每个整数的值小于 2:15分 . 现在,我要做的是:

    int temp;
    ....   
    
       movdq2q mm0, xmm0
       psrldq xmm0, 8
       movdq2q mm1, xmm0
       paddq mm0,mm1
       movd temp, mm0
    

    有更好的方法吗?

    1 回复  |  直到 15 年前
        1
  •  3
  •   Stephen Canon    15 年前

    首先,为什么要使用四字来表示适合16位格式的值?撇开这些不谈,有几个解决方案:

    pshufd xmm1, xmm0, EEh
    paddq  xmm0, xmm1
    movd   temp, xmm0
    

    movdqa xmm1, xmm0
    psrldq xmm1, 8
    paddq  xmm0, xmm1
    movd   temp, xmm0
    

    movhlps xmm1, xmm0
    paddq   xmm0, xmm1
    movd    temp, xmm0
    

    请注意,您实际上不需要使用 paddq 如果你愿意的话,你可以选择一个更窄的加法。

    编辑 把四个双四字加起来——你有的就差不多了。考虑到您知道它们中的所有数据都适合每个插槽的低位双字,您可以尝试如下操作:

    shufps  xmm0, xmm2, 88h
    shufps  xmm4, xmm6, 88h
    paddd   xmm0, xmm4
    psrlq   xmm1, xmm0, 32
    paddd   xmm0, xmm1
    movhlps xmm1, xmm0
    paddd   xmm0, xmm0
    movd    temp, xmm0
    

    可能会更快,也可能不会更快。

    至于EMM,这只是另一条指令。在任何接触MMX寄存器的代码之后,在任何使用X87浮点指令的代码之前 emms .