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

Posted

技术标签:

【中文标题】是否可以在 Altivec 中旋转 128 位值?【英文标题】:Is it possible to rotate a 128-bit value in Altivec? 【发布时间】:2017-09-02 13:46:57 【问题描述】:

我正在尝试将一些 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 block cipher)。

4x32 和 2x64 是最大的 AltiVec 数据排列吗?

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

【问题讨论】:

【参考方案1】:

您可以使用 vsld (vec_sld) 执行 8 位的倍数循环,然后要处理 vsl + vsr + @ 987654327@ (vec_sll + vec_srl + vec_sel)。

【讨论】:

谢谢保罗。我无法找到有关 vec_sllvec_srl 的信息。 IBM 的Vector built-in functions 中没有记录它们。你能分享更多信息吗? 刚刚在移动设备上,但谷歌“AltiVec PIM”,您应该会在前几条点击中看到一个 PDF,其中记录了所有内在函数等。配套手册是“AltiVec PEM”,它记录了实际说明。 注意:您的问题被标记为 PowerPC - 您实际上是在使用 PowerPC/AltiiVec 还是 IBM POWER/VMX(类似但不同)。 谢谢保罗。我正在研究GCC112 from the compile farm,它被描述为 IBM POWER8。 对,但是您的目标是什么硬件平台? POWER 还是 PowerPC?

以上是关于是否可以在 Altivec 中旋转 128 位值?的主要内容,如果未能解决你的问题,请参考以下文章

_mm_srli_si128 等效于 altivec

如何存储 128 位值?

将 16 位值的 __m256i 打包(饱和)到 8 位值的 __m128i?

在 SQL Server 中存储和处理 128 位值

QT中的64位int Spin Box

将 24 位值转换为浮点数并返回