Можно ли повернуть 128-битное значение в Altivec?

Я пытаюсь перенести код ARM NEON в AltiVec. Наш код NEON имеет две LOAD, одну ROT, одну XOR и STORE, так что это похоже на простой тестовый пример. По словам IBM vec_rl документация:

Каждый элемент результата получается вращением соответствующего элемента влево на количество битов, указанное соответствующим элементом b.

Документы продолжают говорить vector unsigned int самый большой тип данных, если -qarch=power8, в таком случае vector unsigned long long применяется.

Я хотел бы выполнить 128-битное вращение, а не 32-битное или 64-битное вращение отдельных элементов. Позиции битов: 19, 31, 67, 97 и 109. Они не выровнены в байтах. (Константы возникают из блочного шифра ARIA).

Являются ли 4x32 и 2x64 самыми большими схемами передачи данных AltiVec? Можно ли повернуть 128-битное значение в Altivec?

Если упакованное вращение является единственной доступной операцией, то лучше ли делать битовую перестановку в C или в AltiVec?

1 ответ

Вы можете сделать поворот кратным 8 битам, используя vsld (vec_sld), то для обработки любого оставшегося вращения < 8 битов вам, вероятно, понадобится vsl + vsr + vsel (vec_sll + vec_srl + vec_sel).

Другие вопросы по тегам