ARMv8 NEON向量置换
问题描述:
考虑存储器布局,使得8个连续的4字节块读取[abcdefgh]
。我把它们加载到两个寄存器v0.4s
和v1.4s
,所以我得到v0.4s = [abcd]
和v1.4s = [efgh]
,其中每个字符代表一个32位块。我想重新排序它们以获得两个(可能不同)寄存器中的[abef]
和[cdgh]
。ARMv8 NEON向量置换
我现在的做法是首先将[efgh]
的64位二进制取反,得到[ghef]
。然后我可以使用提取得到[abef]
和[ghcd]
。然后,我可以再次终止[ghcd]
的64位二分之一,得到[cdgh]
。
任何人都可以说更好的方法吗?
答
这正是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。
有没有原因你不使用'zip','uzp'或'trn'? – EOF