ToDo:
でけた。適当にとりあえずこんなかんじでできた。
% ./configure --target=i386-linux --program-suffix=86 % make CFLAGS='-fPIC -O -g -m32' LDSHARED='gcc -m32 -shared -Wl,-R' % sudo make LDFLAGS='-m32 -L.' LDSHARED='gcc -m32 -shared' CFLAGS='-m32 -O -g' prefix=/usr/local/stow/ruby_x86 PREFIX=/usr/local/stow/ruby_x86 install-nodoc % ruby86 -v ruby 1.9.0 (2008-05-25 revision 0) [i386-linux]
でも extconf.rb 実行してもうまいこといかんので 手作業コンパイルするか。
(21:12)
が悲惨すぎる。 結局スタックの積み方が逆なんだよというのが一番大きい問題である。
f(a, b)
とかを呼ぶ時、
push b push a call f
となって欲しいのだけど、 YARV は a から順に積んでくので、 順番を逆向きにしなくてはならない。
あーうーん rb_funcall を直接呼んでるのがアホなんだな。 rb_funcall2_rev とか作ってやれば良い気がする。
案外簡単だった。
(22:28)
落ち着いて考えるべき
YARV は
putnil putstring "%d\n" putobject 4
とかしてくるので、 CPU スタックの上では、
←若いアドレス 4 "%d\n" self SP
となる。向きを逆向ける必要はやはりあるだろー。
まぁ逆向けるコード入れることによって解決。 だいぶ簡潔になったのでやっと x86 に行く気が起きる、か
(23:08)
i@u4 ~/wrk/yajit > time ruby1.7 euler55.rb zsh: correct 'ruby1.7' to 'ruby1.8' [nyae]? y 249 ruby1.8 euler55.rb 2.40s user 0.04s system 99% cpu 2.449 total i@u4 ~/wrk/yajit > time ruby1.9 euler55.rb 249 ruby1.9 euler55.rb 1.71s user 0.00s system 98% cpu 1.743 total i@u4 ~/wrk/yajit > time ./rubyjit.rb euler55.rb 249 ./rubyjit.rb euler55.rb 1.66s user 0.10s system 99% cpu 1.775 total
(23:22)
だと全部スタックで渡すので、
← 4 "%d\n" self SP
とかなってるのだが、 受け手としては
← argv argc mid self SP
を期待しているため、
← argv argc mid self 4 "%d\n" self SP argv
とすれば良いか。 つまり普通通りだな
あと argv の引っくり返しは C 側でやっても tail call が jmp になるので良さげ。
(23:35)
前 | 2008年 5月 |
次 | ||||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。