我在 SSE2 中使用以下联合声明。
typedef unsigned long uli;
typedef uli v4si __attribute__ ((vector_size(16)));
typedef union
{
v4si v;
uli data[2];
} uliv;
uliv a, b, c;
这个想法是为每个 a 和 b 分配两个无符号长变量(64 位长),对它们进行异或并将结果放在 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’
您能否建议一些替代方案(内在)?