ARMv8 NEON 向量置换

Posted

技术标签:

【中文标题】ARMv8 NEON 向量置换【英文标题】:ARMv8 NEON vector permute 【发布时间】:2017-08-21 08:09:23 【问题描述】:

考虑内存布局使得八个连续的 4 字节块读取[abcdefgh]。我将它们加载到两个寄存器v0.4sv1.4s,所以我得到v0.4s = [abcd]v1.4s = [efgh],其中每个字符代表一个32 位块。我想重新排序它们以在两个(可能不同的)寄存器中获得[abef][cdgh]

我目前的方法是首先将 [efgh] 的 64 位一半反转为 [ghef]。然后我可以使用提取来获取[abef][ghcd]。然后,我终于可以再次将 [ghcd] 的 64 位部分反转为 [cdgh]

谁能说出更好的方法?

【问题讨论】:

您不使用zipuzptrn 是否有原因? 【参考方案1】:

这正是 TRN 指令的用途:

// v0: abcd // v1: efgh

trn1 v2.2d, v0.2d, v1.2d
trn2 v3.2d, v0.2d, v1.2d

// v2: abef // v3: cdgh

请不要问我为什么是 2d 而不是 4s。

【讨论】:

以上是关于ARMv8 NEON 向量置换的主要内容,如果未能解决你的问题,请参考以下文章

Armv8a NEON 内联汇编代码:如何将 16x8 位向量转换为四个 4x32 位(整数)向量?

将 NEON 组件与非向量函数混合

如何在 ARMv7 NEON 向量之间移动单字数据

性能优化篇:NEON快速入门指南

GCC 向量扩展和 ARM NEON 的内存对齐问题

ARM NEON Intrinsics:将向量的值限制为 0-255