我想知道是否有可能做内有四个平行值以下计算一个MMX寄存器:(A * B)/ 256和MMX
(a*b)/256
其中一个是一个符号字和b是无符号的值在0-256
范围(混合因子),我想我的问题是,我不知道如何(或者)pmullw和pmulhw会帮助我完成这项任务。
我想知道是否有可能做内有四个平行值以下计算一个MMX寄存器:(A * B)/ 256和MMX
(a*b)/256
其中一个是一个符号字和b是无符号的值在0-256
范围(混合因子),我想我的问题是,我不知道如何(或者)pmullw和pmulhw会帮助我完成这项任务。
如果你知道A * B不会溢出带符号的16位字段,那么你可以使用pmullw(内在_mm_mullo_pi16
,或SSE内在_mm_mullo_epi16
),然后通过256
凡
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);
问题是,a * b **会溢出16位字段。有没有办法让管理呢?我会仔细看看SSE2。谢谢mattst88! – jsi1
如果a * b溢出16位,则可以将a或b向左移8位,然后执行pmulhw。 – user434507
结果将是正确的,因为结果的那些位仅取决于a和b的较低位 –
这是否只能用MMX来完成?它非常过时。 – Mysticial
所以它怎么能做得更快? – jsi1
您可以与SSE2并行执行8个值,而不只是使用MMX的4个值。 – mattst88