最適化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命令分ぐらい短いコードになると思います。

これらの最適化は、当然機械的に出来るはずです。