2007年5月6日日曜日

コードを1byte小さくする事に命を賭ける

 DOS とかで,config.sys をいじって○○を UMB にロードしたりとか,メインメモリの空きを 1バイトでも多くする事に命をかけてた事ってあったじゃん? アセンブラでも自己可変コードとか使ってクロック数単位で実行速度を上げたりとかしたよね.あ,俺だけ? はいはい,どうせあたしゃ変ですよ.

 で,めでたく CFW3.30OE-A' に対応できた gpshook だが,どうもメモリがきついらしい.いや,単体だとまだ余裕ありげなんだけど,mp3prx がでかい (俺的にはこれははずせない) ので,もうぎりぎりっぽい.なので,gpshook.prx のサイズを小さくしようと,かつてのメモリ節約魂が復活したわけ.

 で,いろいろ試して面白かったのは,整数/浮動少数演算が混在している箇所で,コードサイズが結構変わる.

例1)
int_a = int_val + float_val * 100;
-----
int_a = int_val + ( int )float_val * 100;

こりゃ当たり前レベルなので分かりやすい.浮動小数点演算を行う範囲が減ってるもんね.

例2)
unsigned int uint_val = float_val;
-----
unsigned int uint_val = ( int )float_val;

float_val が正数しかとらない場合,結果はどちらも同じだが,なんとこれもコードサイズが違う.
上のほうでは,なんか符号をいろいろいじるコードが余計についていた.

例3)
int int_val = int_val2 % 360;
-----
unsigned uint_val = uint_val2 % 360;
これも差がないと思ってたら,下のほうが小さかった.

とにかく,変数が signed か unsigned かだけでも 数10バイトの差が出てくる.
(あくまでも psp-gcc (MIPSコンパイラ) の場合だが)
たまには gcc が吐いたアセンブラを眺めるのもいいなぁとおもった.え,そんなことないって? はいはい,どうせあたしゃ変ですよ.

てか,gpshook.prx でちまちま削るより,mp3prx をいじったほうがザクっと削れそうだということに今氣が付いた.

0 件のコメント:

コメントを投稿