条件判断语句的代码生成
st1
if(r1<r2)
st2
else
st3
st4
st1
BB1 com_LT r1,r2 → r3
cbr r3 → L1,L2
L1 : st2
BB2 jumpI L3
BB3 L2 : st3
BB4 L3 : st4
这里的com_LT是比较less than 如果r1比r2小 返回true到r3
cbr是condition branch 如果r3是true 走L1 否则走L2
BB代表的basic block 这里遇到分支branch 或 jump 或 一个新的label 都是一个basic block
Control Flow Graph(CFG)
在优化代码的时候 划分成这些basic block会使逻辑更加清晰 使得优化工作更加简单
在得到AST之后 编译器会构建这样的一个CFG作为一部分中间表达 每一个baisc block里面有一些线性的汇编指令
循环的代码生成
st1
while(r1==r2)
st2
st3
第一种写法:
st1
BB1 com_EQ r1,r2 → r3
cbr r3 → L1,L2
L1 : st2
BB3 com_EQ r1,r2 → r3
cbr r3 → L1,L2
BB3 L2 : st3
CFG:
第二种写法
BB1 st1
BB2 L0 : com_EQ r1,r2 → r3
cbr r3 → L1,L2
BB3 L1 : st2
jumpI L0
BB4 L2 : st3
因为L0 这时候就有4个basic block
CFG:
boolean类型
a > b && c==d || e<=f
loadAI rarp,@a → r1
loadAI rarp,@b → r2
comp_GT r1,r2 → r3
loadAI rarp,@c → r4
loadAI rarp,@d → r5
cmp_EQ r4,r5 → r6
and r3,r6 → r7
loadAI rarp,@e → r8
loadAI rarp,@f → r9
cmp_LE r8,r9 → r10
or r7,r10 → r11
嵌套循环:
st1;
while(r1>r2)
{
st2;
while(r3<=r4)
{
st3;
}
st4;
}
st5;
L1_B : Loop body
L1_O : Loop out
L1_C : Loop condition
st1
L1_C : cmp_GT r1,r2 → r5
cbr r5 → L1_B,L1_O
L1_B st2
L1_C cmp_LE r3,r4 → r6
cbr r6 → L2_B,L2_O
L2_B : st3
jumpI L2_C
L2_O : st4
jumpI L1_C
L1_O : st5