NEON vs Intel SSE - эквивалентность определенных операций - PullRequest
12 голосов
/ 26 августа 2011

У меня возникли проблемы с определением NEON-эквивалентности пары операций Intel SSE.Кажется, что NEON не способен обрабатывать весь регистр Q одновременно (тип данных со значением 128 бит).Я не нашел ничего в заголовке arm_neon.h или в справочнике NEON .

. Я хочу сделать следующее:

// 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);

IЯ рассмотрел операции переключения, предоставляемые NEON, но не смог найти эквивалентный способ сделать это (у меня нет большого опыта работы с NEON).Можно ли сделать вышеизложенное (наверное, я просто не знаю как)?Любые указатели очень ценятся.

1 Ответ

6 голосов
/ 27 августа 2011

Вы хотите инструкцию VEXT. Ваш пример будет выглядеть примерно так:

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

После этого биты 0-111 val будут содержать биты 16-127 vector_of_8_s16, а биты 112-127 val будут содержать биты 0-15 another_vector_s16.

...