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

Llvm 为什么没有处理器有非对称寄存器?,llvm,cpu-architecture,cpu-registers,Llvm,Cpu Architecture,Cpu Registers,我遇到的所有CPU体系结构都有对称寄存器,即读取的值就是写入的值 对于寄存器受限的16位指令,是否存在非对称寄存器的情况 e、 g 寄存器0-6是函数调用的“本地”。此函数调用中写入的值是将要读取的值。每个级别的函数调用都有自己的寄存器硬件,因此本地寄存器隐式保存 寄存器7-9是“全局的”,可能是SMP CPU上的“线程本地的” 写入“调用”寄存器10-13的值不会影响在此函数调用上下文中从寄存器中读取的内容 从“调用”寄存器10-13读取的值是在调用函数中写入的值,即函数的寄存器参数是不可变

我遇到的所有CPU体系结构都有对称寄存器,即读取的值就是写入的值

对于寄存器受限的16位指令,是否存在非对称寄存器的情况

e、 g

  • 寄存器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困难是否是不这样做的主要原因

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


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

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


SPARC的注册窗口就是这样工作的。虽然单独来看这似乎是个好主意,但与系统其余部分的交互降低了系统的总体性能

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


我不清楚为什么需要在微体系结构(硬件)级别实现。这可以很容易地成为由设计师建立并由软件遵守的惯例。我的意思是,我猜你不会得到硬件辅助的保护,防止写入寄存器。你不应该这样做,但在这样低的级别上,你通常不能保证这些类型的保护。除此之外,一旦你有16个寄存器,你就很难被归类为“寄存器受限”ISA。此外,有一些架构实现了,听起来与你描述的非常相似,但却不完全相同。你是对的,没有理由需要硬件,它可能只是一个ISA。“保护”不是一个目标,只是一个令人高兴的巧合。关键是,函数可以将值写入“调用寄存器”(在调用函数之前),而不必破坏它本身被调用的参数等,从而减轻ISA.re:寄存器窗口中的寄存器压力-是的,这是寄存器窗口的一种形式,但也允许读写较高和较低的窗口,根据寄存器编号和访问类型,“经典”版本的Zilog Z8可以有144或256个8位寄存器,它们通常成对(偶数/奇数)形成16位地址。有一个简短的指令,它使用基址寄存器的16位索引来选择寄存器。通过对每个“线程”使用基址寄存器(或更多),您可以获得您提到的一些功能。对于代码获取和数据读/写,有一个pin码,使其成为哈佛体系结构。。