MMX-Register内で4つの値を並列に使用して次の計算を実行できるかどうか疑問に思っています。
(a*b)/256
ここで、aは符号付きの単語で、bは0〜256の範囲の符号なしの値(ブレンド係数)です。
私の問題は、pmullwとpmulhwがこのタスクでどのように役立つか(または役立つかどうか)がわからないことだと思います。
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);