我有一个问题,现在困扰我多天......
我从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。