0

SSE2 命令を使用して最適化されたコードを作成しようとしています。現在、次のようにインライン アセンブリで記述しています。

...
__m128 zero = {0};
__asm {
    ...
LINE_LOOP_1:
    MOVQ        xmm0, QWORD PTR [eax]    ; no problem
    PUNPCKLBW   xmm0, zero               ; PROBLEM IS HERE
    ...
    LOOP        LINE_LOOP_1
}

それは非常にうまく機能しますが、変更が容易になるように組み込み関数を使用して書き直したいと思います(最適化したい計算のバージョンがわずかに異なります)。

ただし、どの組み込み関数を使用すればよいかわかりません。私が見つけたドキュメントには、SSE2命令の約半分がリストされており、残りの半分は組み込みとして利用できないようです! MS が SSE の実装を途中でやめた可能性は非常に低いようです。

PUNPCKLBWでは、命令などを生成するためにどの組み込み関数を使用できますか?

MS Visual Studio 2005 を使用しています。

PS 一部の MSDNドキュメントでは の使用_mm_unpacklo_pi8が推奨されていますが、機能しません。

#include "xmmintrin.h"

int main()
{
    __m128 x = {0}, y = {0};
    x = _mm_unpacklo_pi8(x, y);
}

これにより、コンパイル エラーが発生します。

エラー C2664: '_m_punpcklbw': パラメーター 1 を '_ m128' から ' _m64 ' に変換できません

4

1 に答える 1

2

_mm_unpacklo_epi8 see hereを使用する必要があります。

epi置組み込み関数は SSE レジスタpi用で、MMX レジスタ用です。

于 2012-05-31T08:43:34.960 に答える