(a*b)/256 и MMX
Мне интересно, возможно ли выполнить следующий расчет с четырьмя значениями параллельно в MMX-регистре:
(a*b)/256
где a - слово со знаком, а b - значение без знака (коэффициент смешивания) в диапазоне 0-256.
Я думаю, что моя проблема в том, что я не уверен, как (или если) pmullw и pmulhw помогут мне с этой задачей.
1 ответ
Решение
Если вы знаете, что a*b не будет переполнять 16-битное поле со знаком, тогда вы можете использовать pmullw (встроенный _mm_mullo_pi16
или SSE свойственный _mm_mullo_epi16
), а затем сдвиньте вправо на 8, чтобы сделать деление на 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);