« ショック! | トップページ | SMF2MML(さくら用) ver,1.00 リリース! »

2009/03/10

WonderSwan用音源ドライバー(WTD)更新しました。

今年は、演奏会本番他、その他用事でM3-2009春には参加できないです。ゴメンナサイ。

本体側の機能は変わってないのですが、MMLコンパイラのバグに気がついたので、デバッグしておきました。
WTDβ20090307.LZH

<変更点>
◆MMLコンパイラ (WTC.COM)
MMLにてマクロのネストが出来なかったバグを修正。
8回位まで、ネストができるはずです。

◆音源ドライバー本体
機能は変わってないのですが、コードの最適化を図ってます。
 NEC V30MZ(CPU)のアプリケーションマニュアル
 MASM(Microsoft Macro Assembler) version 6.11の英語版ヘルプファイル、
 MSDN(Microsoft Developer's Network)のドキュメント
 等、技術資料を読み漁って、主に、以下の最適化、コードのスマート化をしました。
 ・実効アドレスの計算より数命令前に、計算に必要なレジスターへ数値を代入した。
 ・条件分岐で、分岐の回数を減らした。(確立が少ない方を、分岐するようにした。)
 ・callの次にretが来る場合、callとretを削除し、jmpでサブルーチンコールした。
   (Microsoft Visual C++ 9.0 が、そういう最適化していた。)
 ・無駄な事をやっていたルーチンがあったので、無駄を削除。
 ・MASM 6.00から追加になった擬似命令を活用し、アセンブリ言語のソースをスマート化(継続中)
    .if (~ .elseif) (~ .else) ~ .endif
    .while (~ .break) (~ .contnue) ~ .endw
    .repeat (~ .break) (~ .contnue) ~ (.until) (.untilcxz)
この辺のMASM擬似命令が以外に賢く、C言語のコンパイラ並の最適化をしてくれる。
.endifの後ろに.endwや.untilがあると、.elseや.elseifでは、.endwや.untilの後ろにjmpしてくれる。
.whileでは、条件の評価を、.endwを書いた所にコーディングしてくれ、.whileを書いたところではそこ(.endw)にjmpするだけになる。
なので、ループ回数が1回以上の場合に、jmpや条件jmp命令への遭遇回数が、ループの先頭で条件評価するよりも減るので、パイプラインの中身?が無くなる回数が減る。
・・・のだが、V30MZではアプリケーション・マニュアルに分岐によるパイプライン・リセットは書いてなかったので、1命令減る分のクロックアップしか期待できないかも。

流石に、ループの後にretがある場合、callをjmpに置き換えたりはしてくれないが、そこは、自分でcall命令をjmpに書き換えるしかない。

元々、パイプラインは考慮してて、奇数アドレスへの分岐や、実効アドレスの計算へは配慮していたんだけど、改めてソースを見てみると、まだクロック数を減らせるところがあった。
ペンティアム以降のCPUで、マニュアル最適化をする気にはならないけど、まぁ、V30Mzなら人間でも出来る範囲というか、C言語に任せるよりも人間がアセンブリ言語で最適化したほうが良いので、アセンブリ言語で書くわけです。


C言語も、どんなアセンブリ言語吐くのか想像してコーディングすれば早いんだけどね。
Microsoft Visual C++もそうみたい。
無駄なソースを書くと、無駄な機械語コードを吐くので、そこまでの最適化はしてくれない。
例えば、以下のコードをC言語で書いたとして、

a = (b+d) / (c+e);
d = (b+d) % (c+e);

これをコンパイルすると、IDIV命令が2つ吐かれる。クロックの無駄。
機械語のIDIV命令は、余りと商を同時に計算する仕様なので、

x = b+d;
y = c+e;
a = x / y;
b = x % y;

と処理させれば、IDIV命令は、1つになって、クロックが早くなる。
変数確保しても、VC++なら、メモリじゃなく、出来る限りレジスターを使うように最適化してくれるので、スタックに変数を確保する命令は出力しないので、クロック数が早くなる。

この辺は、まだ、Microsoft Visual C++ もソースに正直なんだよな。
最適化してくれればいいのに。

|

« ショック! | トップページ | SMF2MML(さくら用) ver,1.00 リリース! »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/36969/44300938

この記事へのトラックバック一覧です: WonderSwan用音源ドライバー(WTD)更新しました。:

« ショック! | トップページ | SMF2MML(さくら用) ver,1.00 リリース! »