2017-01-23 66 views
1

我想通过多次操作和一次优化我们的汇编算法。这可以通过使用手臂装配器中的霓虹灯模块的矢量来完成。如何将一个值加载到霓虹灯s寄存器?

我想添加一个向量(2x32bit)到另一个。 如果我正确理解它,s0和s1的d0常量。 我想加载一个值到s0,另一个加载到s1。 所以我可以添加s0和s1,同时添加s2和s3(d1)。

VADD.I32 d1, d0 

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

VMOV s0, d5 

VMOV d0[0], d5 

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

感谢您的帮助!

+0

你在使用浮点吗? – InfinitelyManic

+0

@InfinitelyManic无符号,无符号整数(32位) – michidk

回答

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 & D1的无符号32位部分的值是可行的。

(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) 
+0

谢谢,不知道vorr ..还有一种方法可以复制第一部分而不是第二个d寄存器吗? – michidk

+0

@michidk好吧,如果你打算使用vorr,那么dx.u32 [0]&dx.u32 [1]将会有值。这就是为什么使用调试器很有价值。这是班级任务吗? – InfinitelyManic

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] 

GDB成绩为8个无符号字节大小整数在D0

(gdb) print $d0.u8 
$8 = {3, 1, 4, 1, 5, 9, 2, 6} 
+0

我正在使用Raspberry Pi 3(ARM Cortex-A53)。你是如何调试/输出这些寄存器的值的? 所以我必须首先加载拇指寄存器中的值?因此,要从d寄存器加载它们,我必须首先将它们加载到一个缩略寄存器中,然后再加载到s寄存器中?必须有更有效的方法吗? 如果我想将s2加载到s6中,我该怎么办? – michidk

+0

@michidk调试使用GNU Debugger GDB完成。你使用什么工具? – InfinitelyManic

+0

@michidk查看https://people.xiph.org/~tterribe/daala/neon_tutorial.pdf以供参考。我无法登录到ARM。com目前 – InfinitelyManic