2008-08-22 (金)
*avr-gcc
久しぶりに以前AVR用に書いたプログラムをいじってみる.
コンパイル結果を見ながらサイズが最小になるように試行錯誤したプログラムなので,コンパイラのバージョンを変えたら駄目っぽい….100バイトもサイズオーバーするんですがどうしたら良いんでしょうか?
gcc 4.3を使っているっぽいけど,レジスタ割り当てのアルゴリズムが前より悪化している気がします.特に,AVRのX,Y,Zレジスタの使い方が下手です.明らかに一度Yレジスタにコピーしてlddで参照すべきところを,Xレジスタの中身をいじって,ld命令で参照したあと,またレジスタを元に戻しています.というか,そもそもポインタ8ビットで良くないですか?他にも気に食わないところがたくさんあるのですが…
ループや関数の展開とか,そういうマクロな最適化はC言語上でもできますが,レジスタ割り当てのアルゴリズムとかは,C言語上から見えないので,最適化に苦戦します.
Cで書くのがそもそもの間違いな気がしてきました.この場合,アセンブラの方が明らかに保守性が高いし.
とりあえず,WinAVRを20060421のバージョンに戻しておく.