gpt4 book ai didi

c++ - 将一个128位xmm寄存器的上下64位相加

转载 作者:太空狗 更新时间:2023-10-29 21:30:46 25 4
gpt4 key购买 nike

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

int temp;
....

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

有更好的方法吗?

最佳答案

首先,为什么要使用四字来表示适合 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

关于c++ - 将一个128位xmm寄存器的上下64位相加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1890867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com