为什么ARM只有16个寄存器?这是理想的数字吗?
寄存器与更多寄存器的距离是否也会增加处理时间/功率?
答案 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)
仅考虑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相同的速度运行,那么它的速度会快两倍。事实上,它只是有点慢。