I'm little bit tired and doesn't have energy to write lengthly post about “Crazy JIT prototype”. And I didn't make a lot of progress since last post. But still there is some good news and some roadblocks.
Firstly — I reworked test suite for JIT to be little bit more robust. Just simple embedding of expected result into
PIRfile. Something like this:
.sub 'main' :main say "Answer" say 42 say 3.1415926 .end # BEGIN_RESULTS # Answer # 42 # 3.1415926 # END_RESULTS
Handling of this “embedded test” took only few lines of code:
# Embedded test results my $pir_src := slurp($pir); my $/ := $pir_src ~~ / '# BEGIN_RESULTS' \n [ '# ' (\N+ \n) ]+ '# END_RESULTS' /; my $expected := $/.join('');
Perl6 version of regexps is awesome!
Second — register access and simple math. Still some work have to be done but most things are in place already. Not all of registers are covered in test suite, so “patches are welcome”
Third — I actually implemented handling of local branches and now Ops::JIT can handle simple loops, etc.
Further development will require some kind of “mostly full C compiler”. Let's take simple line of code from core.ops:
Parrot_pcc_set_signature(interp, CURRENT_CONTEXT(interp), call_sig);
Looks pretty trivial: call of function
, passing variable
interp, result of call to
CURRENT_CONTEXT, and another variable
call_sig. Unfortunately life is more complex.
CURRENT_CONTEXTis not a function. It's C macro
#define CURRENT_CONTEXT(interp) ((interp)->ctx). Which is expanded to access field
parrot_interp_tstructure. To properly implement JITting of it we have to:
First task is quite big in terms of code. And it will be quite slow to parse all header files on startup. And I can't preparse them and just
- Parse macro definitions and have some kind “cpp” step inside opsc to expand them.
- Parse structure definitions to map field to offset.
freezeobjects to disk. Because there is some very annoying bug in parrot which prevent proper thawing of Objects. I didn't caught it yet.
Second one is bit smaller and can be implemented much easier in combination with first one.
But for now I'm little bit stuck in thinking “how to implement it without implementing good big proportion of C compiler”. Any ideas?