如何将值加载到氖s寄存器?

时间:2017-01-23 20:11:02

标签: assembly arm neon

我想通过多次操作和一次来优化我们的汇编算法。这可以通过使用臂装配器中的氖模块的矢量来完成。

我试图将一个向量(2x32位)添加到另一个向量。 如果我理解正确,d0是s0和s1的组成部分。 我想将一个值加载到s0中,将另一个加载到s1中。 所以我可以将s0和s1同时添加到s2和s3(d1)。

VADD.I32    d1, d0 

但要做到这一点,我首先必须将数据加载到d1和d0。 我试过了

VMOV    s0, d5

VMOV    d0[0], d5

但是他们在编译时都会抛出错误。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可能需要检查目标计算机的汇编程序,处理器文档。这个粗略的例子由Scaleway在Cortex-A9 Marvell PJ4Bv7上运行。

movw r0, #0xc0de
movw r1, #0xdead
vmov s0, s1, r0, r1

movw r0, #0xf00d
movw r1, #0xbaad
vmov s2, s3, r0, r1


(gdb) i r a 
d0             1.2096437008836935e-309  (raw 0x0000dead0000c0de)
d1             1.0140805688480121e-309  (raw 0x0000baad0000f00d)

编辑: 您还可以将值加载到内存中,例如d0:

array: .byte 3,1,4,1,5,9,2,6,5,3,5,9
...
ldr r0,=array
vldr d0, [r0]

DDB

中8个无符号字节大小整数的GDB结果
(gdb) print $d0.u8
$8 = {3, 1, 4, 1, 5, 9, 2, 6}

答案 1 :(得分:1)

@michidk由于Sx寄存器可能与Dx寄存器配对;例如,{S0,S1} = D0。您通常会将Dm移动到Dd或执行类似vmov d1,d2的操作,因为我认为您不能将Dx移动到Sx。

所以让我们分别将一些值放入s1和s1。

movw r1, #0x123
movw r2, #0xabc
vmov s1, r1             // s1 in this case is d0.u32[1]
vmov s2, r2             // s2 in this case is d1.u32[0]

vorr d1, d0             // 

...

GDB显示原始值确实存在。此外,您可以看到D0&的无符号32位部分的值是可行的。 D1。

(gdb) info register all 
s1             4.07777853e-43   (raw 0x00000123)
s2             3.85076818e-42   (raw 0x00000abc)

(gdb) p/x $d0.u32
$24 = {0x0, 0x123}

(gdb) p/x $d1.u32
$25 = {0xabc, 0x0}

用指令“vorr d1,d0”,我们将d0.u32 [1]复制到d1.u32 [1],即s3;没有打扰d1.u32 [0],这是s2。所以在这个意义上我们将D0的一部分移动到S3。

(gdb) p/x $d1.u32
$28 = {0xabc, 0x123}

(geb) info register s3
s3             4.07777853e-43   (raw 0x00000123)