ARMv8 NEON向量置换

问题描述:

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

我现在的做法是首先将[efgh]的64位二进制取反,得到[ghef]。然后我可以使用提取得到[abef][ghcd]。然后,我可以再次终止[ghcd]的64位二分之一,得到[cdgh]

任何人都可以说更好的方法吗?

+0

有没有原因你不使用'zip','uzp'或'trn'? – EOF

这正是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。