2013-04-26 6 views
6

Po prostu zaczynam od wewnętrznej integracji SSE, używając Visual C++ 2012 i potrzebuję wskazówek (gra słów nie jest przeznaczona).Jak załadować dwa zestawy 4 szorty do rejestru XMM?

Mam dwie macierze zawierające po 4 signed short (każda tablica ma 64-bitowy łączny poziom 128). Chcę załadować jeden do górnych bitów rejestru XMM, a drugi do niższych bitów. Czy mogę to zrobić skutecznie, wykorzystując wewnętrzne elementy SSE? Jeśli tak to jak?

+0

Czy dozwolony jest SSE4.1? – Mysticial

+0

Zgaduję, że tak, ale wolałbym raczej użyć dostępnej intrinsics niż pisać instrukcje bezpośrednio, jeśli to możliwe. – Asik

Odpowiedz

12

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 + 64:

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} 

Zauważ, że nie ma żadnych wymagań wyrównania dla A lub B. Ale polecam, aby oba były wyrównane do 8 bajtów.

+0

Dzięki. Co myślisz o zrobieniu dwóch loadl_epi64, jak w pierwszym przykładzie, a następnie rozwinięcie go za pomocą _mm_unpacklo_epi64? Czy to też działa? – Asik

+0

Tak, to jest lepsze. Zaktualizuję. Nawet nie przyszło mi przez myśl. :) – Mysticial

+2

Weee nauczyłem mistrza czegoś (tylko żartuję). Wielkie dzięki! – Asik

Powiązane problemy