Assembly (a*b)/256和MMX
我想知道是否可以在MMX寄存器中使用四个并行值进行以下计算:Assembly (a*b)/256和MMX,assembly,sse,mmx,Assembly,Sse,Mmx,我想知道是否可以在MMX寄存器中使用四个并行值进行以下计算: (a*b)/256 其中,a是有符号字,b是0-256范围内的无符号值(混合因子) 我想我的问题是,我不确定pmullw和pmulhw将如何(或是否)帮助我完成这项任务。如果你知道a*b不会溢出有符号的16位字段,那么你可以使用pmullw(内在的\u mm_mullo_pi16,或者SSE内在的\u mm_mullo_epi16),然后向右移位8以256除法 在哪里 MMX: SSE2: 这是否必须仅使用MMX来完成?它已经非常过
(a*b)/256
其中,a是有符号字,b是0-256范围内的无符号值(混合因子)
我想我的问题是,我不确定pmullw和pmulhw将如何(或是否)帮助我完成这项任务。如果你知道a*b不会溢出有符号的16位字段,那么你可以使用pmullw(内在的
\u mm_mullo_pi16
,或者SSE内在的\u mm_mullo_epi16
),然后向右移位8以256除法
在哪里
MMX:
SSE2:
这是否必须仅使用MMX来完成?它已经非常过时了。那么如何才能更快地完成呢?您可以使用SSE2并行执行8个值,而不是使用MMX并行执行4个值。问题是,a*b将溢出16位字段。不管怎样,有没有办法管理好它?我会仔细看看SSE2。谢谢你!如果a*b溢出16位,则您可以将a或b向左移位8位,然后执行pmulhw。结果将是正确的,因为结果的这些位仅取决于a和b的低位
__m64 a, b;
...
a = _mm_mullo_pi16 (a, b);
a = _mm_srli_pi16 (a, 8);
__m128i a, b;
...
a = _mm_mullo_epi16 (a, b);
a = _mm_srli_epi16 (a, 8);