【问题标题】:ARMv8 NEON vector permuteARMv8 NEON 向量置换
【发布时间】: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 是否有原因?

标签: assembly arm simd neon armv8


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2013-03-01
    • 1970-01-01
    相关资源
    最近更新 更多