为什么ARM有16个寄存器?

时间:2011-12-11 19:55:24

标签: arm cpu-registers cpu-architecture

为什么ARM只有16个寄存器?这是理想的数字吗?

寄存器与更多寄存器的距离是否也会增加处理时间/功率?

5 个答案:

答案 0 :(得分:15)

随着通用寄存器的数量变小,您需要开始使用堆栈作为变量。使用堆栈需要更多指令,因此代码大小会增加。使用堆栈还会增加内存访问次数,从而影响性能和功耗。权衡的是,为了代表更多的寄存器,您需要在指令中使用更多的位,并且芯片上需要更多的空间用于寄存器文件,这会增加功耗要求。通过使用不同数量的寄存器编译同一组代码,您可以看到不同的寄存器计数如何影响代码大小和加载/存储指令的频率。这种练习的结果可以在本文表1中看到:

Extendable Instruction Set Computing

Register   Program   Load/Store  
Count      Size      Frequency  

27         100.00    27.90%  
16         101.62    30.22%  
8          114.76    44.45%  

(他们使用27作为基础,因为这是MIPS处理器上可用的GPR数量)

正如您所看到的,当您将寄存器数量降至16时,程序大小和加载/存储数量都只有微小的改进。真正的惩罚不会发生直到你下降到8个寄存器。我怀疑ARM设计师认为当你寻找每瓦最佳性能时,16个寄存器是一种最佳点。

答案 1 :(得分:4)

要选择16个寄存器中的一个,您需要4位,因此可能是这是操作码(机器命令)的最佳匹配,否则您将不得不引入更复杂的指令集,这将导致更大的编码器,这意味着额外的成本(执行时间)。

Wikipedia表示它具有“固定指令宽度为32位以简化解码和流水线操作” 所以这是一个合理的权衡。

答案 2 :(得分:4)

32位ARM有16个寄存器,因为它只使用4位来编码寄存器,而不是因为16是理想的数字。同样,x86只有8个寄存器,因为在历史上它们使用3位来编码寄存器,以便某些指令适合一个字节。

这是一个有限的数字,所以x86和ARM在64位时分别将数字加倍到16和32个寄存器。旧的ARM指令编码没有足够的剩余位用于较大的寄存器编号,因此它们必须通过放弃几乎每条指令有条件地执行并使用4位条件进行新功能来进行权衡(这是过于简单化的,实际上它并不完全是这样,因为编码是新的,但是你需要为新寄存器再增加3位。

答案 3 :(得分:2)

回到80年代(IIRC),发表了一篇学术论文,研究了许多不同的工作量,比较了不同数量寄存器的预期性能优势。这正是RISC处理器从学术思想转变为主流硬件的时候,决定什么是最优的很重要。 CPU已经在速度上领先于内存,RISC通过限制寻址模式和单独的加载和存储指令使情况变得更糟。拥有更多寄存器意味着您可以“缓存”更多数据以便立即访问,从而减少访问主内存。

仅考虑2的幂,发现32个寄存器是最佳的,尽管16个并不是非常落后。

答案 4 :(得分:0)

ARM的独特之处在于每个寄存器都可以有一个条件执行代码,避免了测试和分支机构。不要忘记,许多32台注册机将R0固定为0,因此通过与R0比较完成条件测试。我从经验中知道。 20年前,我不得不编制一个模式7' (来自SNES术语)楼。对于32x(或者更确切地说是2个),MIPS3000(Playstation)和3DO(ARM),CPU是SH2,代码的内环是19,15& 11.如果3DO以与其他2相同的速度运行,那么它的速度会快两倍。事实上,它只是有点慢。