Я использую следующее объявление объединения в SSE2.
typedef unsigned long uli;
typedef uli v4si __attribute__ ((vector_size(16)));
typedef union
{
v4si v;
uli data[2];
} uliv;
uliv a, b, c;
Идея состоит в назначении двух переменных без знака (длиной 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’
Не могли бы вы предложить несколько альтернатив (встроенных)?