コンパイラ - 条件付き/ループコード生成

条件判定文のコード生成

st1
if(r1<r2)
    st2
else 
    st3
st4

                st1

BB1 com_LT r1,r2 → r3

               cbr r3 → L1,L2

        L1 : st2

BB2ジャンプI L3

BB3 L2 : st3

BB4 L3 : st4

ここでの com_LT は未満です。r1 が r2 より小さい場合、r3 に true を返します。cbr
は条件分岐です。r3 が true の場合は L1 に進み、そうでない場合は L2 に進みます。

BBで表される基本ブロックは、分岐やジャンプ、あるいは新たなラベルに遭遇したときの基本ブロックである。

制御フローグラフ(CFG) 

コードをこれらの基本ブロックに分割すると、ロジックがより明確になり、最適化作業が容易になります。AST を
取得した後、コンパイラは中間式の一部としてそのような CFG を構築します。各 baisc ブロックにはいくつかの線形アセンブリ命令があります。

循環コード生成

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:
 

 2番目の書き方

BB1 st1

BB2 L0 : com_EQ r1,r2 → r3

               cbr r3 → L1,L2

BB3 L1 : st2

               ジャンプI L0

BB4 L2 : st3


現時点では、L0 には 4 つの基本ブロック CFG があるため、次のようになります。

ブール型

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

そしてr3、r6→r7

loadAI rarp,@e → r8

loadAI rarp,@f → r9

cmp_LE r8、r9 → r10

または r7、r10 → r11

 ネストされたループ:

st1;
while(r1>r2)
{
    st2;
    while(r3<=r4)
    {
        st3;
    }
    st4;
}
st5;

 L1_B : ループ本体
 L1_O : ループアウト
 L1_C : ループ条件

            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

            ジャンプI L2_C

L2_O : st4

            ジャンプI L1_C

L1_O : st5

おすすめ

転載: blog.csdn.net/weixin_43754049/article/details/126339166