我正在尝试使用ARMv7 NEON向量化开发汇编代码。在某些时候,我需要将一个32位值(单字)从一个NEON向量复制到另一个NEON向量,类似于mov dm[0], dn[1]
。当我查看手册时,我找不到任何可以执行此逻辑的mov
或vmov
操作,因为它们需要在源或目标中具有ARM寄存器r
。任何想法或替代品?
答案 0 :(得分:2)
如果你想:
1)mov d0 [0],d1 [0]
vext d0, d0, d1, #4
vrev64.32 d0, d0
2)mov d0 [0],d1 [1]
vtrn.32 d1, d0
3)mov d0 [1],d1 [0]
vtrn.32 d0, d1
4)mov d0 [1],d1 [1]
vext d0, d1, d0, #4
vrev64.32 d0, d0
请注意,{2}和2)的情况下d1
会被破坏。为了避免这种情况,您应该将d1
复制到临时注册d2
并使用它。
答案 1 :(得分:1)
在32位模式(ARMv7及更早版本,而非ARMv8)中,每个Q寄存器别名为2 d
个寄存器/ 4 s
个寄存器。例如q1
是d2..3
,也是s4..7
。你可以单独复制它们。
我不确定在编写s
寄存器然后在任何ARM搜索中读取包含q
寄存器时是否存在合并惩罚。
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dht0002a/ch01s03s02.html有一个寄存器映射:只有q0..q7有s
- 寄存别名。 q8..q15只有d
个寄存器组件。 (即,只有32个s
寄存器,32个d
寄存器和16个q
寄存器,因此d16..31
的子组件不能单独寻址,q8..15
1}}只有64位双字元素单独公开。
如果没有更好的方法可以做到这一点,那么请在低8 q
寄存器中保留切片和切块所需的矢量。
ARMv8(AArch64)引入了可以索引到向量寄存器的指令,因为s3
是q3
的低位字:重叠/打包被更改。