原理
寄存器重命名法将原来的32个寄存器映射到两组寄存器,分别是标准规定的32个寄存器,我们称作虚拟寄存器或者架构寄存器和CPU内置的物理寄存器。我们建立虚拟寄存器到物理寄存器的映射关系,并将数据(指令产生的结果)存放于CPU内置的物理寄存器。这样一来我们在解码阶段将会得到虚拟寄存器的地址,并根据这个地址找到物理寄存器的地址并进行操作。
实现
为了实现映射关系,我们使用分配法。一旦某条指令将结果写入某个寄存器,那么寄存器原来的值将丢失,而我们不需要关心寄存器原来的值,因此相当于我们申请了一个新的寄存器,存放这条指令的结果。并且后面这个做法将不会改变值,只是改变了值存放的位置,只要我们建立了映射关系,我们就能找到新的存放位置,那么就不会影响CPU的正确性。
分配
现在我们开设就像内存池一样的一个物理寄存器堆,一旦我们需要申请使用某个寄存器(就像我们申请内存一样),我们就从空闲的物理寄存器队列中取出一个寄存器,并将编号的对应关系写入一个映射表(map_table
)中,这样我们需要访问哪个寄存器,就在映射表中找到对应的物理寄存器,然后读取哪个物理寄存器的值即可。
回收
另外,对于写操作,由于寄存器原来的值丢掉了,因此这个虚拟的寄存器对应的物理寄存器存储的值将不会被再次使用,因此这个物理寄存器被废弃,我们予以回收。我们将这个物理寄存器从占用的物理寄存器列表中移出,插入空闲队列中,这个物理寄存器就被释放了,我们就可以在下次再利用上这个寄存器。
例子
汇编指令 | 寄存器映射关系 | 注释 |
---|---|---|
ld r7, 0(r6) | r7 |