[英]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
等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.