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



假设我有一个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,等等。

相关内容

  • 没有找到相关文章

最新更新