2011-08-26 15 views
11

Mam problem z ustaleniem równoważności NEON kilku operacji Intel SSE. Wydaje się, że NEON nie jest w stanie obsłużyć całego rejestru Q naraz (typ danych o wartości 128 bitowej). Nie znalazłem nic w nagłówku arm_neon.h lub w NEON intrinsics reference.NEON kontra Intel SSE - równoważność niektórych operacji

Co chcę zrobić jest następujący:

// Intel SSE 
// shift the entire 128 bit value with 2 bytes to the right; this is done 
// without sign extension by shifting in zeros 
__m128i val = _mm_srli_si128(vector_of_8_s16, 2); 
// insert the least significant 16 bits of "some_16_bit_val" 
// the whole thing in this case, into the selected 16 bit 
// integer of vector "val"(the 16 bit element with index 7 in this case) 
val = _mm_insert_epi16(val, some_16_bit_val, 7); 

Szukałem w operacjach ruchomych świadczonych przez neon, ale nie mógł znaleźć równoważny sposób prowadzenia wyżej (nie mam dużego doświadczenia z NEON). Czy można to zrobić (myślę, że po prostu nie wiem jak)? Wszelkie wskazówki są mile widziane.

Odpowiedz

6

Chcesz instrukcję VEXT. Twój przykład mogłoby wyglądać podobnie jak:

int16x8_t val = vextq_s16(vector_of_8_s16, another_vector_s16, 1); 

Po tym, bity 0-111 z val będzie zawierał bity 16-127 z vector_of_8_s16 i bity 112-127 z val będzie zawierać bity 0-15 z another_vector_s16.

+0

Faktycznie zaimplementowałem to już teraz. Czy mógłbyś podać przykład, aby potwierdzić moje podejście? – celavek

+0

usunąłem moją odpowiedź na temat vtbl i vtbx. vext jest drogą do wyjścia! –

+0

@celavek: Podałem przykład, ale sposobem na sprawdzenie swojego podejścia jest testowanie go, a nie porównywanie go z przykładem. Działa albo nie. –