我想通过多次操作和一次来优化我们的汇编算法。这可以通过使用臂装配器中的氖模块的矢量来完成。
我试图将一个向量(2x32位)添加到另一个向量。 如果我理解正确,d0是s0和s1的组成部分。 我想将一个值加载到s0中,将另一个加载到s1中。 所以我可以将s0和s1同时添加到s2和s3(d1)。
VADD.I32 d1, d0
但要做到这一点,我首先必须将数据加载到d1和d0。 我试过了
VMOV s0, d5
和
VMOV d0[0], d5
但是他们在编译时都会抛出错误。
感谢您的帮助!
答案 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)