最適化13
昨日のコードですが、以下のような感じにまでは最適化が出来ると思うんですよね。
switch (pc) { case 0xC002: clk -= 6; pc += 3; a = ppu.StatusRegister; if ((a & 0x80) != 0) { clk--; pc = 0xC002; if (clk > 0) { goto case 0xC002; } else break; } pc += 4; clk -= 2; x = 0; break; case 0xC01D: StMem(LdWramW(0) + y, a); clk -= 9; pc += 3; y = (y - 1) & 0xff; if (y != 0) { clk--; pc = 0xC01D; if (clk > 0) { goto case 0xC01D; } else break; } pc += 4; clk -= 5; m = (LdWramB(1) - 1) & 0xff; StWramB(1, m); flgN = (m & 0x80) != 0; break; case 0xC04F: pc += 6; clk -= 10; a = 0; StWramB(32, a); a = LdWramB(48); if (a == 0) { clk--; pc = 0xC05D; if (clk > 0) { goto case 0xC05D; } else break; } pc += 6; clk -= 7; a = LdWramB(80); t = a - 1; if ((t & 0xff) != 0) { clk--; pc = 0xC060; if (clk > 0) { goto case 0xC060; } else break; } pc += 2; goto case 0xC05D; // 以下略
これはトランスレータが生成したコードを手作業で最適化したものです。
clkとpcに対する演算で、一度の演算にまとめてしまえるものは、まとめてます。
また、
flgN = (a & 0x80) != 0; /* 中略 */ if (!flgN)
を、
if ((a & 0x80) == 0)
にするという変形を行っています。
下の場合、JavaVMの命令にコンパイルしたときに、たぶん3〜4命令分ぐらい短いコードになると思います。
これらの最適化は、当然機械的に出来るはずです。