$r0
),它始终给出零值。这使处理器能够:
- 任何产生要丢弃结果的指令都可以将其目标指向此寄存器
- 成为
0
的来源。
$r0 不是通用寄存器。它被硬连线接到 0 上。无论你对这个寄存器做什么,它始终具有0的值。您可能会想知道为什么 MIPs 需要这样一个寄存器。
MIPS 的设计人员使用基准测试(用于确定 CPU 性能的程序)使他们相信,将寄存器硬连线接到0会改善 CPU 的性能(速度)而不是没有它。并非每个人都同意硬连线接到0的寄存器是必需的,因此并不是所有的ISA都有零寄存器。
$r0
),它始终给出零值。这使处理器能够:
0
的来源。$r0 不是通用寄存器。它被硬连线接到 0 上。无论你对这个寄存器做什么,它始终具有0的值。您可能会想知道为什么 MIPs 需要这样一个寄存器。
MIPS 的设计人员使用基准测试(用于确定 CPU 性能的程序)使他们相信,将寄存器硬连线接到0会改善 CPU 的性能(速度)而不是没有它。并非每个人都同意硬连线接到0的寄存器是必需的,因此并不是所有的ISA都有零寄存器。
这可能有几种方式可以提高性能,不清楚哪些适用于特定的处理器,但我大致按照从最可能到最不可能的顺序列出了它们。
cmp
可以是目标为$zero
的sub
。 - Peter Cordes0x00000000
这样的形式,这很长),然后使用它。因此,可以节省一条指令,并减小程序大小。零寄存器允许在设计新的指令集架构(ISA)时节省一些操作码。
例如,主RISC-V规范有32个伪指令依赖于零寄存器(参见表26.2和26.3)。伪指令是由汇编器映射到另一个实际指令的指令(例如,等于零时分支被映射为等于分支)。相比之下:主要的RISV-V规范列出了164个真实指令操作码(即计算RV(32|64)[IMAFD]基础/扩展,也称为RV64G)。这意味着如果没有零寄存器,RISC-V RV64G将占用32个操作码来处理这些指令(即增加20%)。对于具体的RISC-V CPU实现,这种真实到伪指令的比率可能会根据选择的扩展而向任一方向移动。
较少的操作码简化了指令解码器。
更复杂的解码器需要更多时间来解码指令或占用更多门(不能用于更有用的CPU单元),或者两者都需要。
现有的、逐步开发的指令集架构必须处理向后兼容性。因此,如果您最初的ISA设计不包括零寄存器,您不能在以后的修订中添加它而不破坏兼容性。此外,如果您现有的ISA已经需要一个非常复杂的译码器,那么添加一个零寄存器也得不偿失。
除了现代RISC-V ISA(自2010年以来开发,2019年首次批准)外,ARMv8 AArch64(一种于2011年发布的64位ISA)与以前的ARM 32位ISA相比,也具有零寄存器。由于这个和其他变化,AArch64 ISA与以前的ARM 32位ISA相比,共同点要少得多,比如x86和x86-64 ISA。
与AArch64相比,x86-64没有零寄存器。虽然x86-64比以前的32位x86 ISA更现代,但其ISA只是逐步改变。因此,它包含所有现有的x86操作码和64位变体,因此译码器已经非常复杂。