手臂组件的速度ldm和ldr

时间:2013-11-25 07:42:09

标签: assembly arm

我正在编写一个arm汇编代码,我想将两个32位数据加载到寄存器,我可以使用两个指令,

1.   ldm             r0, {r1, r2}    
2.   ldr             r1, [r0]!
     ldr             r2, [r0]

我想知道哪一个更快

1 个答案:

答案 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]