如何在ARMv7 NEON向量之间移动单字数据

时间:2018-05-23 18:16:56

标签: assembly arm neon armv7

我正在尝试使用ARMv7 NEON向量化开发汇编代码。在某些时候,我需要将一个32位值(单字)从一个NEON向量复制到另一个NEON向量,类似于mov dm[0], dn[1]。当我查看手册时,我找不到任何可以执行此逻辑的movvmov操作,因为它们需要在源或目标中具有ARM寄存器r。任何想法或替代品?

2 个答案:

答案 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个寄存器。例如q1d2..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)引入了可以索引到向量寄存器的指令,因为s3q3的低位字:重叠/打包被更改。

AArch32 vs 64 SIMD registers