Я только начинаю работать с SSE, используя Visual C ++ 2012, и мне нужны некоторые указатели (без каламбура).
У меня есть два массива, содержащие 4 signed short
s каждый (таким образом, каждый массив является 64-битным, всего 128). Я хочу загрузить один в верхние биты регистра XMM, а другой в младшие биты. Могу ли я сделать это эффективно, используя встроенные функции SSE? Если так, то как?
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 байт.
Других решений пока нет …