2012-06-22 79 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的较低位 –

相关问题