我正在编写一个arm汇编代码,我想将两个32位数据加载到寄存器,我可以使用两个指令,
1. ldm r0, {r1, r2}
2. ldr r1, [r0]!
ldr r2, [r0]
我想知道哪一个更快?
答案 0 :(得分:0)
指令周期时间略有不同,具体取决于架构。
理论上,当加载两个或多个寄存器时,ldm更快,只计算循环次数。但这有关系吗?很难,因为大多数周期都是由于缓存未命中的惩罚而浪费的。根据缓存行对齐地址非常重要。这不是性能,但可能是减少的代码大小,这是有益的。
总结一下,当它们没有削弱你的算法/实现时,尝试利用ldm / stm。
如果您想尽快访问内存,无论成本如何,ldrd / strd都是最佳候选者。
什么是“成本”?存储器对齐8个PLUS两个连续寄存器。
这是你的电话。
PS:在Aarch64上不推荐使用类似ldm / stm的指令 - 这是有充分理由的,而ldrd / strd等效指令没有上面提到的“成本”。
PS2:您的问题中存在一些错误
1. ldm r0, {r1, r2}
2. ldr r1, [r0]
ldr r2, [r0, #4]