2017-05-09 45 views
5

我遇到的所有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 | | 

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

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

它是否太复杂,不值得注册储蓄?

llvm-困难是否这是没有完成的主要原因?

P.S.我知道超标量处理器已经比这更复杂了,包括寄存器重命名方案等。我只是在谈论微控制器级架构。


更新:它看起来像SPARC架构做到了这一点。为什么后来的ISA设计者不觉得有用?

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

+1

我不清楚为什么这需要在微观架构(硬件)级别实现。这可能很容易成为由设计人员建立并通过软件加以遵守的惯例。我的意思是,我想你不会得到硬件辅助的保护*来防止*写入你不应该注册的寄存器,但是在这些低级别中,通常不会保证这些类型的保护。除此之外,一旦你有16个寄存器,它几乎不会被归类为“寄存器限制”的ISA。 –

+1

此外,*有*架构实现[注册窗口](https://en.wikipedia.org/wiki/Register_window),这听起来与您所描述的非常相似,认为不完全相同。 –

+0

你是对的,没有理由为什么这需要硬件,它可能只是一个ISA。 “保护”不是目标,只是一个幸福的巧合。关键在于函数可以在调用函数之前将值写入“调用寄存器”(不调用函数本身被调用的参数等),从而缓解ISA中的寄存器压力。 – fadedbee

回答

3

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

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

这是想法,反正。缺点是,在与系统交互时,寄存器需要刷新到堆栈,因此需要对数据的内存进行长时间的写入操作,这往往是垃圾。注册窗口是一个糟糕的主意,这是由仅考虑程序的模拟研究引起的,与多任务工作负载相反,并且考虑了编译器的优化不佳。它还在实施诸如SuperSparc等高端Sparc处理器方面造成了相当大的问题,尽管最近的实施已经有效地解决了这些障碍。注册窗口现在是兼容性遗留问题的一部分,不容易从体系结构中删除。

相关问题