最近
記事書くのが面倒になって書いてないですが、こんな感じのことをやってます。
①VMのテスト環境をつくってみる
②XBYAKのD言語移植
③VMの命令を関数に分ける。2
④VMの関数内をXBYAKでJITコンパイルして実行する。2
⑤VMの関数をほとんど全てJITコンパイルして実行できるようにする。2
⑥JITコンパイラの完成。命令の保存と実行。でも、遅い。3
⑦JITコンパイラ最適化①複数命令の連結 3
⑧JITコンパイラ最適化②フラグの最適化。x86 CPUに近づける。 3a
⑨JITコンパイラ最適化③プログラムカウンタは静的に解決する。4
ジャンプ命令を無くす。
case OF_O: lahf(); jo("o1"); and(ah, ~OF);jmp("o2");L("o1");or(ah,OF); L("o2");break;
case OF_O: pushf(); pop(eax); shr(ah,1);and(ah, OF); or(ah,al);break;
部分的に関数コールを減らす。
⑩JITコンパイラ最適化④各ブロック間のジャンプ時の関数呼び出しをジャンプ命令に換える。5
⑪JITコンパイラ最適化⑤ネイティブなスタックを使う。6
⑫exe出力するぞ!①nasmでHello world
⑬exe出力するぞ!②nasmでインタラプタを作る。
⑭exe出力するぞ!③nasmインタラプタを出力してexeを作る。
⑮exe出力するぞ!④xbyakを使ってコンパイル!
⑯自己書き換え対策①命令書き換え時はリコンパイラを呼び出すようにジャンプ命令を入れる。
⑰自己書き換え対策②スタックを使った場合の書き換え対策。(たぶん、32bitにしてフラグもたせる。普通スタックの中身みないだろうと)
とりあえず、⑪までできてます。
あとは、アセンブラをきっちり出力してランタイムの依存をなくし、
xbyakを使うことでアセンブラの依存も無くすと。
いうかんじで。
id:sumiiさんもついに穴ゴルに手を出してしまったとか。笑
俺はやらんぞ。時間もったいない。
と思いつつ、PEゴルフは参考になってるので微妙です。
でも、面白いよなぁ。