MIPS(好奇心)更快的方式清除寄存器?

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
Run Code Online (Sandbox Code Playgroud)

哪个效率最高?

Cra*_*rks 5

在许多MIPS实现中,这些操作都将编译为同一条指令,因为通常'mov $ a,$ b'是一个成语,or $a, $b, $0并且li $r, x是以下简称ori $r, $0, x

move $t0, $0
li $t0, 0
Run Code Online (Sandbox Code Playgroud)

这些都将在同一管道上发生,在架构上是等效的:

xor $t0, $t0, $t0
and $t0, $t0, $0
Run Code Online (Sandbox Code Playgroud)

在我曾经使用过的每个RISC实现中,add与xor / and / nor / etc位于同一管道上。

基本上,这都是特定芯片的实现所特有的,但是它们都应该是单个时钟。如果芯片故障,li或者and x, $0, $0 可能最快,因为它们可以最大程度地减少对其他寄存器的错误依赖。


and*_*wmu 1

鉴于所有这些指令都需要一个管道周期,因此它们之间应该没有太大区别。

如果有的话,我希望xor $t0, $t0, $t0速度最好,因为它不使用任何其他寄存器,从而使它们可以自由用于其他值,并可能减少寄存器文件争用。

异或方法在某些处理器上也被视为特定的习惯用法,这使得它可以使用更少的资源(例如不需要执行异或 ALU 操作)。