簡體   English   中英

將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等。

暫無
暫無

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM