将 64 位数据加载到 32 位寄存器中
Loading a 64-bit data into a 32-bit register
假设我有一个 64 位数据的 3 元素数组:
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]
问题是,有没有更优雅的方法来做到这一点?比方说,在一条指令中?
根据我的评论:如果出于某种原因必须像使用 uint64_t 数组一样使用索引来处理数据,我认为您不能在此处没有额外的说明。
对于 '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
) 来访问 'high half'。
当然,确切的指令顺序取决于对数组执行的操作。如果你循环遍历它,你很可能会得到 ldm
+ add Rx,#8
,等等
假设我有一个 64 位数据的 3 元素数组:
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]
问题是,有没有更优雅的方法来做到这一点?比方说,在一条指令中?
根据我的评论:如果出于某种原因必须像使用 uint64_t 数组一样使用索引来处理数据,我认为您不能在此处没有额外的说明。
对于 '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
) 来访问 'high half'。
当然,确切的指令顺序取决于对数组执行的操作。如果你循环遍历它,你很可能会得到 ldm
+ add Rx,#8
,等等