fad*_*bee 5 cpu-architecture llvm cpu-registers
我遇到的所有CPU架构都有对称寄存器 - 即您读取的值是您编写的值.
对于寄存器限制的16位指令,是否存在具有非对称寄存器的情况?
例如
每个功能级别的寄存器都有自己的硬件,只有当调用深度超过硬件时才会溢出到堆栈.
(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 | |
Run Code Online (Sandbox Code Playgroud)
这样的方案是否会减少每个函数调用中的寄存器压力两个或多个寄存器?
我不期待这是一个新想法,但我感兴趣的是它是否已经完成,如果没有,为什么不呢?如果它不是一个疯狂的想法,或已经完成,我可以在FPGA CPU上实现它.
是否过于复杂,不值得注册储蓄?
llvm-难度是不是这样做的主要原因吗?
PS我知道超标量处理器已经比这复杂得多,有寄存器重命名方案等等.我只是在思考微控制器级架构.
更新:看起来SPARC架构就是这样做的.为什么以后的ISA设计师认为它没用?
当调用一个过程时,寄存器窗口会移动十六个寄存器,隐藏旧的输入寄存器和旧的本地寄存器,并使旧的输出寄存器成为新的输入寄存器.
这就是 SPARC 寄存器窗口的工作原理。虽然单独来看这似乎是一个好主意,但与系统其他部分的交互降低了整体系统性能。
来自http://ieng9.ucsd.edu/~cs30x/sparcstack.html
无论如何,这就是想法。缺点是,在与系统交互时,需要将寄存器刷新到堆栈,从而需要对内存中的数据进行一长串写入,而这些数据通常大多是垃圾。寄存器窗口是一个坏主意,这是由于模拟研究仅考虑孤立的程序(而不是多任务工作负载)以及考虑优化不佳的编译器而引起的。尽管最近的实施已有效地解决了这些障碍,但它还在实施 SuperSparc 等高端 Sparc 处理器时造成了相当大的问题。寄存器窗口现在是兼容性遗留的一部分,并且不容易从体系结构中删除。
| 归档时间: |
|
| 查看次数: |
105 次 |
| 最近记录: |