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 向量置换的主要内容,如果未能解决你的问题,请参考以下文章