loi*_*ois 5 performance assembly mips cpu-architecture micro-optimization
在MIPS汇编中清除寄存器(= 0)的最快方法是什么?
一些例子:
xor    $t0, $t0, $t0
and    $t0, $t0, $0
move   $t0, $0
li     $t0, 0
add    $t0, $0, $0
哪个效率最高?
在许多MIPS实现中,这些操作都将编译为同一条指令,因为通常'mov $ a,$ b'是一个成语,or $a, $b, $0并且li $r, x是以下简称ori $r, $0, x:
move $t0, $0
li $t0, 0
这些都将在同一管道上发生,在架构上是等效的:
xor $t0, $t0, $t0
and $t0, $t0, $0
在我曾经使用过的每个RISC实现中,add与xor / and / nor / etc位于同一管道上。
基本上,这都是特定芯片的实现所特有的,但是它们都应该是单个时钟。如果芯片故障,li或者and x, $0, $0 可能最快,因为它们可以最大程度地减少对其他寄存器的错误依赖。
鉴于所有这些指令都需要一个管道周期,因此它们之间应该没有太大区别。
如果有的话,我希望xor $t0, $t0, $t0速度最好,因为它不使用任何其他寄存器,从而使它们可以自由用于其他值,并可能减少寄存器文件争用。
异或方法在某些处理器上也被视为特定的习惯用法,这使得它可以使用更少的资源(例如不需要执行异或 ALU 操作)。