SSE2では次のユニオン宣言を使用しています。
typedef unsigned long uli;
typedef uli v4si __attribute__ ((vector_size(16)));
typedef union
{
v4si v;
uli data[2];
} uliv;
uliv a, b, c;
アイデアは、2つの符号なしlong変数(64ビット長)をそれぞれaとbに割り当て、それらをXORして、結果をcに配置することです。
ここでは明示的な割り当て(a.data[0] = something
)が機能しますが、より多くの時間が必要です。
組み込み関数を使用する予定です。を使用する_mm_set_epi64 (unsigned long x, unsigned long y)
と、変数を要求し__m64
ます。これらの変数をキャストすると正常に(__m64)x
機能しますが、間違った結果になります。
for (k = 0; k < 10; k++)
{
simda.v = _mm_set_epi64 (_mulpre1[u1][k], _mulpre2[u2][k]);
simdb.v = _mm_set_epi64 (res1[i+k], res2[i+k]);
simdc.v = _mm_xor_si128 (simda.v, simdb.v);
}
上記のコードはエラーになります:
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/include/emmintrin.h:578: note: expected ‘__m64’
but argument is of type ‘long unsigned int’
いくつかの代替案(組み込み関数)を提案できますか?