最適化10

超絶地味な最適化を思いついたのでメモしておきます。

フラグレジスタをintにするかboolにするかはとても微妙な問題なんです。

フラグレジスタをintにすると、ADC命令のAレジスタの計算は、

a = a + m + (p & 1);

こんな感じです。

同様に、フラグレジスタをboolの場合は、

a = a + m + (flgC ? 1 : 0);

こんな感じです。

これは多分、intの方が高速です。

キャリーフラグが立っている場合に分岐する命令、BCSの場合ですが、
intの場合は、

if ((p & 1) != 0)
{
    pc = adr;
}

boolの場合は、

if (flgC)
{
    pc = adr;
}

こんな感じになり、たぶんboolの方が高速です。

場合によって、どちらが高速とも言えないわけです。
トランスレータだったら、事前に命令列を解析することにより、フラグレジスタが演算命令に使われるのか、分岐命令に使われるのかを知ることが可能なはずです。

だったら、演算命令に使われるならintで、分岐命令に使われるならboolで、という風に、都度フラグレジスタの持ち方を変えるコードを生成するという方法が考えられます。

きちんとしたエミュレーションをやりつつ、これをやるのはかなり至難の業かもしれませんが、理論上は出来なくもなさそうです。