寄存器和地址描述符

我们的代码生成算法依次考虑了各个三地址指令,并决定需要哪些加载指令来把必需的运算分量加载进寄存器。在生成加载指令之后,它开始生成运算代码。然后,如果有必要把结果存放人一个内存位置,它还会生成相应的保存指令。

为了做出这些必要的决定,我们需要一个数据结构来说明哪些程序变量的值当前被存放在哪个或哪些寄存器里面。我们还需要知道当前存放在一个给定变量的内存位置上的值是否就是这个变量的正确值。因为变量的新值可能已经在寄存器中计算出来但还没有存放到内存中。这个数据结构具有下列描述符:

全局寄存器分配

代码生成算法在单个基本块的运行期间使用寄存器来存放值。但是,在每个基本块的结尾处,所有活跃变量的值都被保存到内存中。为了省略一部分这样的保存及相应的加载指令,我们可以把一些寄存器指派给频繁使用的变量,并且使得这些寄存器在不同基本块中的(即全局的)指派保持一致。因为程序的大部分时间花在它的内部循环上,所以一个自然的全局寄存器指派方法是试图在整个循环中把频繁使用的值存放在固定的寄存器中。从现在开始,假设我们知道一个流图的循环结构,并且我们知道在一个基本块中计算的哪些值会在该基本块外使用。

寄存器使用和并行性之间的折衷与代码调度阶段之间的顺序

我们将假设源程序的机器无关中间表示形式使用了无限多个伪寄存器(pseudoregister)。 这些伪寄存器代表了可以分配到寄存器的变量。这些变量包括源程序中不能通过任何其他名字访问的标量,也包括由编译器生成的用于存放表达式的部分结果的临时变量。和内存位置不同,寄存器的命名是唯一的。因此可以很容易地为寄存器访问生成精确的数据依赖约束。

在中间表示形式中使用的无限多个伪寄存器最终必须被映射到在目标机器上可用的少量物理寄存器。把几个伪寄存器映射为同一个物理寄存器有一个副作用。这种映射会生成人为的存储依赖,这限制了指令级的并行性。反过来,并行执行指令产生了更多的存储需求,以便存放同时计算出来的值。因此,尽量降低寄存器使用数量的目标和最大化指令级并行性的目标直接冲突。

«1»
最近发表
控制面板
您好,欢迎到访网站!
  [查看权限]
网站分类
搜索
Tags列表
网站收藏
图标汇集
  • 订阅本站的 RSS 2.0 新闻聚合
友情链接

热门搜索: 外链域名 高外链域名 高收录域名

Copyright www.thyst.cn. Some Rights Reserved.