2009-12-11 106 views
3

我在xmm0有兩個打包的四字整數,我需要將它們加在一起並將結果存儲在內存位置。我可以保證每個整數的值小於2^15。現在,我正在做以下事情:添加一個128位xmm寄存器的高64位和低64位

int temp; 
.... 

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

有沒有更好的方法來做到這一點?

回答

3

首先,您爲什麼要使用四字來表示適合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 

可能會或可能不會被證明是更快。

至於EMMS,這只是另一條指令。在任何接觸MMX寄存器的代碼之後,在任何使用x87浮點指令的代碼之前,您需要有emms

+0

@Stephen:以前的操作需要雙四字同時處理128字節的信息。在那之後,一系列的求和產生了上述上限的最終結果。 – Jacob 2009-12-11 22:12:36

+0

*聳肩*,夠公平。無論如何,我提出的任何序列都應該爲你工作,並避免傳統的mmx用法。 – 2009-12-11 22:16:21

+0

謝謝!它實際上弄亂了我的代碼的其餘部分,所有的浮點數都減少到-1。 – Jacob 2009-12-11 22:18:55