假设我有一个3个元素数组的64位数据:
src DCQ 0x0200200AD00236DD
DCQ 0x00003401AAC4D097
DCQ 0X0001FC219AC931BE
假设我知道" src"的地址(命名为srcadr(,我可以通过说:
来将Src元素的较低32位内容加载到一个名为SRCLO的寄存器中: LDR srcLo, [srcAdr, index, LSL#3]
为了获得此元素的更高的32位内容,我知道我可以:
ADD srcAdrHi, srcAdr, #4
LDR srcHi, [srcAdrHi, index, LSL#3]
问题是,有什么更优雅的方法可以做到这一点吗?例如,在一个指令中?
遵循我的评论:我认为如果由于任何原因您必须使用intex。
对于" C"功能:
int foo(unsigned long long *srcT, int index) {
unsigned int temp=0;
temp = (unsigned int)(srcT[index]);
temp += (unsigned int)(srcT[index] >> 32);
return temp;
}
生产的编译器(ARM GCC 8.2 -O3 -MCPU = ARM7TDMI(:
foo:
add r3, r0, r1, lsl #3
ldr r3, [r3, #4]
ldr r0, [r0, r1, lsl #3]
add r0, r0, r3
bx lr
您可以看到它也产生了额外的指令(add
(以访问"高半"。当然,确切的指令顺序取决于对数组的操作。如果您在循环中浏览它,您很可能会获得ldm
add Rx,#8
,等等。