ARMv8 NEON 向量置换
Posted
技术标签:
【中文标题】ARMv8 NEON 向量置换【英文标题】:ARMv8 NEON vector permute 【发布时间】:2017-08-21 08:09:23 【问题描述】:考虑内存布局使得八个连续的 4 字节块读取[abcdefgh]
。我将它们加载到两个寄存器v0.4s
和v1.4s
,所以我得到v0.4s = [abcd]
和v1.4s = [efgh]
,其中每个字符代表一个32 位块。我想重新排序它们以在两个(可能不同的)寄存器中获得[abef]
和[cdgh]
。
我目前的方法是首先将 [efgh]
的 64 位一半反转为 [ghef]
。然后我可以使用提取来获取[abef]
和[ghcd]
。然后,我终于可以再次将 [ghcd]
的 64 位部分反转为 [cdgh]
。
谁能说出更好的方法?
【问题讨论】:
您不使用zip
、uzp
或trn
是否有原因?
【参考方案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 向量置换的主要内容,如果未能解决你的问题,请参考以下文章