Загрузка 64-битных данных в 32-битный регистр - PullRequest
0 голосов
/ 30 апреля 2019

Допустим, у меня есть 3-х элементный массив 64-битных данных:

   src    DCQ    0x0200200AD00236DD
          DCQ    0x00003401AAC4D097
          DCQ    0X0001FC219AC931BE

при условии, что я знаю адрес "src" (с именем srcAdr), я могу загрузить нижний 32-битныйсодержимое элемента src по определенному индексу в регистр с именем srcLo, говоря:

   LDR    srcLo, [srcAdr, index, LSL#3]

Чтобы получить более высокое 32-битное содержимое этого элемента, я знаю, что могу:

   ADD    srcAdrHi, srcAdr, #4
   LDR    srcHi, [srcAdrHi, index, LSL#3]

Вопрос в том, есть ли более элегантный способ сделать это?Скажем, например, в одной инструкции?

1 Ответ

0 голосов
/ 01 мая 2019

После моего комментария: я не думаю, что вы можете обойтись без дополнительной инструкции, если по какой-либо причине вы должны работать с данными, как с массивом uint64_t, используя индекс.

Для 'C'function:

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 и т. Д.

...