我正在尝试将一些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 block cipher)。
4x32和2x64是最大的AltiVec数据安排吗?是否可以在Altivec中旋转128位值?
如果打包旋转是唯一可用的操作,那么最好在C或AltiVec中进行旋转吗?
答案 0 :(得分:1)
您可以使用vsld
(vec_sld
)旋转8位的倍数,然后处理< 8位您可能需要使用vsl
+ vsr
+ vsel
(vec_sll
+ vec_srl
+ vec_sel
)。