128 -чередование битов с использованием встроенных функций ARM Neon

Я пытаюсь оптимизировать свой код, используя встроенные функции Neon. У меня есть 24 -битное вращение по 128 -битному массиву (8 каждыйuint16_t).

Вот мой код c:

uint16_t rotated[8];
uint16_t temp[8];
uint16_t j;
for(j = 0; j < 8; j++)
{
     //Rotation <<< 24  over 128 bits (x << shift) | (x >> (16 - shift)
     rotated[j] = ((temp[(j+1) % 8] << 8) & 0xffff) | ((temp[(j+2) % 8] >> 8) & 0x00ff);
}

Я проверил документацию gcc о Neon Intrinsics , и в ней нет инструкций для вращения векторов. Более того, я пытался сделать это с помощью vshlq_n_u16(temp, 8), но все биты, сдвинутые за пределы слова uint16_t, теряются.

Как добиться этого, используя неоновые свойства? Кстати, есть ли лучшая документация о GCC Neon Intrinsics?

6
задан jww 23 November 2017 в 06:36
поделиться