以下ではintのサイズが4バイトのままになっているけど、これはもちろん本番では2に直すとする。
LbI(9); // fib()
SubAI(SP,24); ADD fp,-24;
StoAMd(RP,SP,20); (なし) // あえてRPの管理をしないで、CPUの機能に任せるモードを作る。このモードの時はsetjmp/longjmp的なことはしない想定。
LodRMd(R0,SP,24); LD fp+24;
CgtRI(R0,1); PUSH 1; LE; NOT; // GT命令がないので、LE+NOTにした。
StoRMd(R0,SP,8); (無視) // ムダ命令なので無視
LodRMd(R0,SP,8); (無視)
FreI(8); (無視)
CmpJeqRII(R0,0,12); NOT; JZ xxx; // これはNOTが連続しているので、あとで最適化でNOTを相殺させよう。そして直後にR0へのLodがあるので、DUPは入れない。
LodRMd(R0,SP,24); LD fp+24;
SubRI(R0,2); PUSH 2; SUB;
StoRMd(R0,SP,8); (無視)
LodRMd(R0,SP,8); (無視)
FreI(8); (無視)
StoRMd(R0,SP,0); ST fp+0; // これはDUPするべきか迷うけど、Calの直前もDUPしないということにしよう。
CalII(9,10); CALL xxx;
StoRMd(R0,SP,8); ST fp+8; // 次にR0へのLodがあるので、DUPしない。
LodRMd(R0,SP,24); LD fp+24;
SubRI(R0,1); PUSH 1; SUB; // INCやINC2があるのに、DECはないんだなー。
StoRMd(R0,SP,12); (無視)
LodRMd(R0,SP,12); (無視)
FreI(12); (無視)
StoRMd(R0,SP,0); ST fp+0; // Cal直前なのでDUPしない。
CalII(9,11); CALL xxx;
StoRMd(R0,SP,12); ST fp+12; // 次にR0へのLodがあるので、DUPしない。
LodRMd(R0,SP,8); LD fp+8;
LodRMd(R1,SP,12); LD fp+12; ST gp+2;
AddRR(R0,R1); LD gp+2; ADD; // この時、ST gp+12; LD gp+12; のペアが無駄だと気づけるとよい。FreR(R1);があるなら最適化できるなあ。これは対応しよう。
StoRMd(R0,SP,16); (無視)
FreI(8); (無視)
FreI(12); (無視)
LodRMd(R0,SP,16); (無視)
StoRMd(R0,SP,24); ST fp+24; // 次にR0へのLodがあるので、DUPしない。
FreI(16); (無視)
LbI(12);
LodRMd(R0,SP,24); LD fp+24;
JmpI(13); (無視)
LbI(13); // fib().ret: (無視)
LodAMd(RP,SP,20); (なし)
AddAI(SP,24); ADD fp,24
Ret(); RET