【问题标题】:Add the upper and lower 64-bits of a 128-bit xmm register128位xmm寄存器的高低64位相加
【发布时间】:2009-12-11 21:06:05
【问题描述】:

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

int temp;
....   

   movdq2q mm0, xmm0
   psrldq xmm0, 8
   movdq2q mm1, xmm0
   paddq mm0,mm1
   movd temp, mm0

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: c++ assembly visual-c++-2005 sse2


    【解决方案1】:

    首先,为什么要使用四字来表示适合 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,如果您愿意,可以使用较窄的添加之一。

    edit 将四个双四字相加——你所拥有的非常好。鉴于您知道其中的所有数据都适合每个插槽的低位双字,您可以尝试以下操作:

    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
    

    这可能会或可能不会被证明更快。

    对于 EMMS,它只是另一条指令。在任何涉及 MMX 寄存器的代码之后,在任何使用 x87 浮点指令的代码之前,您需要有emms

    【讨论】:

    • @Stephen:前面的操作需要双四字同时处理 128 个字节的信息。之后,一系列的求和会产生具有上述上限的最终结果。
    • 耸耸肩,很公平。无论如何,我提出的任何序列都应该适合你,并避免使用传统的 mmx。
    • 谢谢!它实际上弄乱了我的其余代码,以至于所有的浮点数都减少到 -1.#IND!
    • 是的,如果您使用 MMX 寄存器,您需要确保在任何使用 x87 指令的代码之前执行EMMS
    猜你喜欢
    • 1970-01-01
    • 2017-10-16
    • 2019-04-28
    • 2011-01-14
    • 2011-11-04
    • 1970-01-01
    • 2017-07-15
    • 2012-01-30
    相关资源
    最近更新 更多