Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly (a*b)/256和MMX_Assembly_Sse_Mmx - Fatal编程技术网

Assembly (a*b)/256和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来完成?它已经非常过

我想知道是否可以在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);