在arm汇编程序中访问数组的某些元素

时间:2016-12-31 14:10:36

标签: arrays assembly arm neon

我有一个问题,现在困扰我多天...... 我从c调用一个函数,它是使用neon模块在树莓派上用arm汇编程序实现的。签名如下所示: void doStuff(const uint32_t key[4])

我可以使用VLD4.32 {d6-d9}, [r0]将所有值加载到d寄存器中。 问题是我必须在运行时计算的数组的某个索引处使用一个值。所以我必须在一个我只在运行时知道的索引访问该数组。 在c中,我想要实现的代码如下所示:

// calculations
int i = ... // 'i' is the index of value in the array
int result = key[i];

在汇编程序中我尝试了这个:

VMOV        r8, s22         ;@ copy the calculated index into an arm register
MOV         r8, r8, LSL #0x2;@ multiply with 4
ADD         r8, r5, r8      ;@ add offset to base adress
VLDR.32     d14, [r8]         ;@ load from adress into d-register

我也试过乘以2和32而不是4.但我总是得到值3。

我得到了这个愚蠢且非常缓慢的解决方案:

;@ <--- very slow and ugly --->
VLD4.32     {d6-d9}, [r1]   ;@ load 4x32bit from adress *r1

VMOV        r6, s22         ;@ r6 now contains the offset which is either 0,1,2 or 3
CMP         r6, #0x0        ;@ 3 - 0 == 0 -> Z set
BEQ         equal0

CMP         r6, #0x1
BEQ         equal1

CMP         r6, #0x2
BEQ         equal2

VMOV        d12, d9         ;@ has to be 3 
B           continue

equal0:
VMOV        d12, d6
B           continue

equal1:
VMOV        d12, d7
B           continue

equal2:
VMOV        d12, d8
B           continue

continue:
;@ <---                           --->

我基本上每个可能的数字都有一个if,然后选择相应的寄存器。

谢谢!

修改

好的,它适用于VLD1.32 d14, [r8]。但是,请不要理解为什么它不适用于VLDR.32。

0 个答案:

没有答案