ARMv8 NEON向量置换

时间:2017-08-21 08:09:24

标签: assembly arm simd neon armv8

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

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

任何人都能说出更好的方法吗?

1 个答案:

答案 0 :(得分: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。