2012-06-22 66 views
2

我想知道是否有可能做內有四個平行值以下計算一個MMX寄存器:(A * B)/ 256和MMX

(a*b)/256 

其中一個是一個符號字和b是無符號的值在0-256

範圍(混合因子),我想我的問題是,我不知道如何(或者)pmullwpmulhw會幫助我完成這項任務。

+2

這是否只能用MMX來完成?它非常過時。 – Mysticial

+0

所以它怎麼能做得更快? – jsi1

+2

您可以與SSE2並行執行8個值,而不只是使用MMX的4個值。 – mattst88

回答

1

如果你知道A * B不會溢出帶符號的16位字段,那麼你可以使用pmullw(內在_mm_mullo_pi16,或SSE內在_mm_mullo_epi16),然後通過256

右移8做除法

MMX:

__m64 a, b; 
... 
a = _mm_mullo_pi16 (a, b); 
a = _mm_srli_pi16 (a, 8); 

SSE2:

__m128i a, b; 
... 
a = _mm_mullo_epi16 (a, b); 
a = _mm_srli_epi16 (a, 8); 
+0

問題是,a * b **會溢出16位字段。有沒有辦法讓管理呢?我會仔細看看SSE2。謝謝mattst88! – jsi1

+0

如果a * b溢出16位,則可以將a或b向左移8位,然後執行pmulhw。 – user434507

+0

結果將是正確的,因爲結果的那些位僅取決於a和b的較低位 –

相關問題