我遇到的所有CPU架构都有对称寄存器 - 即您读取的值是您编写的值。
对于寄存器限制的16位指令,是否存在具有非对称寄存器的情况?
e.g。
每个功能级别的寄存器都有自己的硬件,只有当呼叫深度超过硬件时才会溢出到堆栈。
(local) (global) ( call ) (ret)
global regset 07 .. 09
.
.
.
. | | ^ ^
. v v | |
regsetN-1 00 .. 06 10 .. 13 14 15
|^ |^ | | ^ ^
v| v| v v | |
fnN-1 RW RW RW RW RW RW
| | ^ ^
v v | |
regsetN 00 .. 06 10 .. 13 14 15
|^ |^ | | ^ ^
v| v| v v | |
fnN RW RW RW RW RW RW
| | ^ ^
v v | |
regsetN+1 00 .. 06 10 .. 13 14 15
|^ |^ | | ^ ^
v| v| v v | |
这样的方案会减少每个函数调用中的寄存器压力吗?
我没想到这是一个新想法,但我感兴趣的是它是否已经完成,如果没有,为什么不呢?如果它不是一个疯狂的想法,或者已经完成了,我可以在FPGA CPU上实现它。
是否过于复杂而无法节省寄存器费用?
llvm-难度是没有做到这一点的主要原因吗?
P.S。我知道超标量处理器已经比这复杂得多,有了寄存器重命名方案等等。我只是在思考微控制器级架构。
更新:看起来SPARC架构就是这样做的。为什么以后的ISA设计师认为它没用?
当调用一个过程时,寄存器窗口会移动十六个寄存器,隐藏旧的输入寄存器和旧的本地寄存器,并使旧的输出寄存器成为新的输入寄存器。
答案 0 :(得分:3)
这就是SPARC的注册窗口的工作原理。虽然它看起来是一个好主意,但与系统其他部分的交互降低了整体系统性能。
来自http://ieng9.ucsd.edu/~cs30x/sparcstack.html
无论如何,那是个主意。缺点是在与系统交互时,需要将寄存器刷新到堆栈,这需要对数据存储器的长序列写入,这通常主要是垃圾。注册窗口是一个坏主意,这是由模拟研究引起的,这些研究仅考虑隔离的程序,而不是多任务工作负载,并考虑优化不佳的编译器。它还在实施SuperSparc等高端Sparc处理器时引起了相当大的问题,尽管最近的实现已经有效地解决了这些障碍。注册窗口现在是兼容性遗留的一部分,不容易从架构中删除。