NEON vs Intel SSE - эквивалентность определенных операций
У меня возникли проблемы с выяснением эквивалентности 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);
Я просмотрел операции переключения, выполняемые NEON, но не смог найти эквивалентный способ сделать это (у меня не так много опыта с NEON). Можно ли сделать выше (я думаю, что я просто не знаю, как)?
Любые указатели очень благодарны.
Ответы
Ответ 1
Вам нужна инструкция 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
.