После моего комментария: я не думаю, что вы можете обойтись без дополнительной инструкции, если по какой-либо причине вы должны работать с данными, как с массивом 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
и т. Д.