(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);
Другие вопросы по тегам