为什么没有处理器有不对称寄存器?

fad*_*bee 5 cpu-architecture llvm cpu-registers

我遇到的所有CPU架构都有对称寄存器 - 即您读取的值是您编写的值.

对于寄存器限制的16位指令,是否存在具有非对称寄存器的情况?

例如

  • 寄存器0-6是函数调用的"本地".在此函数调用中写入的值是将要读取的值.每个级别的函数调用都有自己的寄存器硬件,因此隐式保存本地寄存器.
  • 寄存器7-9是"全局的",可能是SMP CPU上的"线程本地".
  • 写入"调用"寄存器10-13的值不会影响在此函数调用上下文中从它们读取的内容.
  • 从"调用"寄存器10-13读取的值是在调用函数中写入的值,即函数的寄存器参数是不可变的.
  • 写入"返回"寄存器14-15的值不影响在此函数调用上下文中从它们读取的值.
  • 从"返回"寄存器14-15读取的值是在函数中写入的值,该值最近返回到当前函数.

每个功能级别的寄存器都有自己的硬件,只有当调用深度超过硬件时才会溢出到堆栈.

               (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设计师认为它没用?

当调用一个过程时,寄存器窗口会移动十六个寄存器,隐藏旧的输入寄存器和旧的本地寄存器,并使旧的输出寄存器成为新的输入寄存器.

fad*_*bee 4

这就是 SPARC 寄存器窗口的工作原理。虽然单独来看这似乎是一个好主意,但与系统其他部分的交互降低了整体系统性能。

来自http://ieng9.ucsd.edu/~cs30x/sparcstack.html

无论如何,这就是想法。缺点是,在与系统交互时,需要将寄存器刷新到堆栈,从而需要对内存中的数据进行一长串写入,而这些数据通常大多是垃圾。寄存器窗口是一个坏主意,这是由于模拟研究仅考虑孤立的程序(而不是多任务工作负载)以及考虑优化不佳的编译器而引起的。尽管最近的实施已有效地解决了这些障碍,但它还在实施 SuperSparc 等高端 Sparc 处理器时造成了相当大的问题。寄存器窗口现在是兼容性遗留的一部分,并且不容易从体系结构中删除。