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

时间:2017-05-09 11:36:43

标签: llvm cpu-architecture cpu-registers

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

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

e.g。

  • 寄存器0-6是"本地"到函数调用。在此函数调用中写入的值是将要读取的值。每个级别的函数调用都有自己的寄存器硬件,因此隐式保存本地寄存器。
  • 注册7-9是"全球",也许"线程本地"在SMP CPU上。
  • 写入"呼叫"寄存器10-13不会影响在此函数调用上下文中读取的内容
  • 读取" call"的值寄存器10-13是在调用函数中写入的值,即函数的寄存器参数是不可变的。
  • 写入&#34的值;返回"在这个函数调用上下文中,寄存器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   |  |

这样的方案会减少每个函数调用中的寄存器压力吗?

我没想到这是一个新想法,但我感兴趣的是它是否已经完成,如果没有,为什么不呢?如果它不是一个疯狂的想法,或者已经完成了,我可以在FPGA CPU上实现它。

是否过于复杂而无法节省寄存器费用?

llvm-难度是没有做到这一点的主要原因吗?

P.S。我知道超标量处理器已经比这复杂得多,有了寄存器重命名方案等等。我只是在思考微控制器级架构。

更新:看起来SPARC架构就是这样做的。为什么以后的ISA设计师认为它没用?

  

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

1 个答案:

答案 0 :(得分:3)

这就是SPARC的注册窗口的工作原理。虽然它看起来是一个好主意,但与系统其他部分的交互降低了整体系统性能。

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

  

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