Как загрузить два набора из 4 шорт в регистр XMM?

Я только начинаю работать с SSE, используя Visual C ++ 2012, и мне нужны некоторые указатели (без каламбура).

У меня есть два массива, содержащие 4 signed shorts каждый (таким образом, каждый массив является 64-битным, всего 128). Я хочу загрузить один в верхние биты регистра XMM, а другой в младшие биты. Могу ли я сделать это эффективно, используя встроенные функции SSE? Если так, то как?

6

Решение

SSE2:

short A[] = {0,1,2,3};
short B[] = {4,5,6,7};

__m128i a,b,v;
a = _mm_loadl_epi64((const __m128i*)A);
b = _mm_loadl_epi64((const __m128i*)B);
v = _mm_unpacklo_epi64(a,b);

// v = {0,1,2,3,4,5,6,7}

SSE4.1 + x64:

short A[] = {0,1,2,3};
short B[] = {4,5,6,7};

__m128i v;
v = _mm_loadl_epi64((const __m128i*)A);
v = _mm_insert_epi64(v,*(const long long*)B,1);

// v = {0,1,2,3,4,5,6,7}

Обратите внимание, что нет никаких требований к выравниванию для A или же B, Но я бы порекомендовал, чтобы они все равно были выровнены до 8 байт.

12

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]