最適化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で、という風に、都度フラグレジスタの持ち方を変えるコードを生成するという方法が考えられます。
きちんとしたエミュレーションをやりつつ、これをやるのはかなり至難の業かもしれませんが、理論上は出来なくもなさそうです。