目录
1 代码生成器的主要任务
(1)指令选择
选择适当的目标机指令来实现中间表示(IR)语句
(2)寄存器分配和指派
把哪个值放在哪个寄存器中
(3)
指令排序
按照什么顺序来安排指令的执行
2 一个简单的目标机模型
三地址机器模型
加载、保存、运算、跳转等操作
内存按字节寻址
n个通用寄存器
R0
,
R1
, …,
Rn
-1
假设所有的运算分量都是整数
指令之间可能有一个标号
![](https://i-blog.csdnimg.cn/blog_migrate/ee0cc544bdc7da0f72ee2454e75d80c2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2397fcd089a6fa9ff33ca09e2a4bf198.png)
3 指令选择
指令选择:为中间表示语句选择合适的目标指令序列
4 寄存器的选择
(1)三地址语句的目标代码生成
![](https://i-blog.csdnimg.cn/blog_migrate/b880f2c24a61624b87408092a813c75b.png)
(2)寄存器描述符和地址描述符
![](https://i-blog.csdnimg.cn/blog_migrate/db50af4fd8d0b1768473dac8149fa3a8.png)
(3)基本块的收尾处理
对于一个在基本块的出口处可能
活跃
的变量
x
,
如果它
的地址描述符表明它的值没有存放在
x
的内存位置上
,
则生成指令“
ST x
,
R
”
(
R
是在基本块结尾处存放
x
值
的寄存器 )
(4)管理寄存器和地址描述符
![](https://i-blog.csdnimg.cn/blog_migrate/16ce33c2621e467216ab6bb4c86c6c58.png)
![](https://i-blog.csdnimg.cn/blog_migrate/acf7c4343726d47bd5c81485d62ae5a8.png)
5 寄存器选择函数getReg的设计
6 窥孔优化
窥孔
(
peephole
)是程序上的一个小的滑动窗口
窥孔优化
是指在优化的时候,检查目标指令的一个滑动
窗口
(
即窥孔
)
,并且只要有可能就在窥孔内用更快或更短的指令来替换窗口中的指令序列
也可以在
中间代码生成
之后直接应用窥孔优化来提高中间表示形式的质量
![](https://i-blog.csdnimg.cn/blog_migrate/ba29cc0328b0b16150cbdec554454537.png)