是否可以在Altivec中旋转128位值?

我正在尝试将一些ARM NEON代码移植到AltiVec。 我们的NEON代码有两个LOAD,一个ROT,一个XOR和一个STORE,所以它看起来像一个简单的测试用例。 根据IBM的vec_rl文档:

结果的每个元素是通过将左边的相应元素旋转由b的相应元素指定的位数来获得的。

除了-qarch=power8 ,doc继续说vector unsigned int是最大的数据类型,在这种情况下, vector unsigned long long适用。

我想执行128位旋转,而不是单个元素的32位或64位旋转。 位位置为19,31,67,97和109.它们不是字节对齐的。 (常量来自ARIA分组密码 )。

4×32和2×64是最大的AltiVec数据安排吗? 是否可以在Altivec中旋转128位值?

如果打包旋转是唯一可用的操作,那么最好在C或AltiVec中进行操作吗?

您可以使用vsldvec_sld )以8位的倍数旋转,然后处理<8位的任何剩余旋转,您可能需要使用vsr + vsr + vselvec_sll + vec_srl + vec_sel )。

Interesting Posts