1

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

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

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

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

4x32 和 2x64 是最大的 AltiVec 数据排列吗?是否可以在 Altivec 中旋转 128 位值?

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

4

1 回答 1

1

您可以使用vsld( vec_sld) 进行 8 位的倍数旋转,然后要处理 < 8 位的任何剩余旋转,您可能需要使用vsl+ vsr+ vsel( vec_sll+ vec_srl+ vec_sel)。

于 2017-09-02T16:46:40.290 回答