将64位数据加载到32位寄存器中

问题描述 投票:0回答:1

假设我有一个包含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]

问题是,有更优雅的方法吗?例如,在一条指令中说?

assembly arm keil arm7
1个回答
0
投票

根据我的评论:如果无论出于何种原因你必须使用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)来访问'高半'。当然,确切的指令序列取决于对阵列执行的操作。如果你在一个循环中走过它,你最有可能得到ldm + add Rx,#8等。

© www.soinside.com 2019 - 2024. All rights reserved.