是否有可能在Altivec中旋转一个128位的值?
问题描述:
我试图将一些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中执行位操作是否是最佳做法?
答
您可以通过8位的倍数使用vsld
(vec_sld
)做旋转,然后处理的< 8位的任何剩余转动你可能需要使用vsl
+ vsr
+ vsel
(vec_sll
+ vec_srl
+ vec_sel
) 。
谢谢保罗。我很难找到有关'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
刚刚在移动设备上,但Google“AltiVec PIM”,您应该在顶部几个命中中看到一个PDF文件,它记录了所有内部函数等。伴随手册是“AltiVec PEM”,它记录了实际指令。 –
注意:你的问题被标记为'PowerPC' - 你真的使用PowerPC/AltiiVec还是IBM POWER/VMX(类似但不同)? –