Можно ли повернуть 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
).