Squirrel JIT
はじめに
squirrel-2.1.2にJIT機能を付けたしたものです。 機能的には大したことをしていません。
しばらく手をつけないと思うので、こっそり公開します。 ダウンロード
現状での問題点
- OP_CALLでC++のコールスタックも消費します。
従来はSquirrel自身が持つコールスタックのみを消費し、C++のコールスタックは消費しません。これは深い関数呼び出しが生じる場合にはスタックオーバーフローとなることを意味します。
- 一部の命令には対応していません。
- suspendには対応していません。
- 最適化を行っていません。
LuaJITではMFP algorithm(http://www.program-analysis.com/example.html)によって最適化を行っています。また、プロセッサで用意されている命令(条件付きロードなど)を活用しません。 - jit_call時のスタックリサイズによってJITコール中の関数のスタック参照が無効になります。
ひどい話ですが対処していません。次のようなエラーが出る場合はスタックリサイズによるabortである可能性が高いです。sq: sqvm.cpp:422: bool SQVM::Return(SQInteger, SQInteger, SQObjectPtr&): Assertion `oldstackbase >= _stackbase' failed.
- x86にのみ対応しています。
これはxbyakがx86専用であるためです。 - 生成コードがOS、コンパイラ依存
確認環境はLinuxとWindowsXPのgcc-4.1、gcc-4.2のみです。
リンク
- xbyak - http://homepage1.nifty.com/herumi/soft/xbyak.html
x86用のJITアセンブラ。これを知らなかったら作る気になれなかったかも。 - GNU lightning - http://www.gnu.org/software/lightning/
xbyak以前に使えるかなあと思っていたもの。ドキュメントがわかりづらい…。 - DynASM - http://luajit.luaforge.net/dynasm.html
LuaJITで使用されているJITアセンブラ。Luaでのプリコンパイルが必要なのでやや微妙。ドキュメントがない。 - LuaJIT - http://luajit.luaforge.net/
SqJITを作成途中に発見してしまい、かなりへこんだ。
TODO
- テストコードの作成
(Last modified: 2008-03-01 17:05:01) [validate]