2017-09-02 69 views
1

我试图将一些ARM NEON代码移植到AltiVec。我们的NEON代码有两个LOAD,一个ROT,一个XOR和一个存储,所以它看起来像一个简单的测试案例。根据IBM的vec_rl文档:是否有可能在Altivec中旋转一个128位的值?

结果的每个元素都是通过将左边的相应元素旋转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中执行位操作是否是最佳做法?

回答

1

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

+0

谢谢保罗。我很难找到有关'vec_sll'和'vec_srl'的信息。它们未在IBM的[Vector内置函数](https://www.ibm.com/support/knowledgecenter/en/SSGH2K_13.1.2/com.ibm.xlc131.aix.doc/compiler_ref/vec_intrin_cpp.html)中记录。 。你能分享更多的信息吗? – jww

+0

刚刚在移动设备上,但Google“AltiVec PIM”,您应该在顶部几个命中中看到一个PDF文件,它记录了所有内部函数等。伴随手册是“AltiVec PEM”,它记录了实际指令。 –

+0

注意:你的问题被标记为'PowerPC' - 你真的使用PowerPC/AltiiVec还是IBM POWER/VMX(类似但不同)? –

相关问题