Bon jour
In last couple of days I was thinking about "CJP". Major change in approach — I will actually "JIT" few ops in one go. It doesn't makes any sense to JIT one op only even for prototype.
I'm currently playing with JITting small sub like this:
.sub 'main' :main say "Answer" say 42 say "Correct" .end
Bytecode for this sub is:
0000: 00000000 00000000 say_sc
0002: 00000001 0000002a say_ic
0004: 00000000 00000001 say_sc
0006: 00000002 end
Basically now I can:
- Create basic structure for "jitted sub". Including "entry", "leave" and blocks for each opcode.
- Handle parameters inside "jitted sub"
- Handle return from "jitted sub"
- Handle
goto offset
bracnhes.
~/src/parrot (jit_prototype)$ ./parrot-nqp t/jit/test.t ok 1 - Unpacked ok 2 - Got PF Directory ok 3 - Got bytecode ok 4 - Got OpMap # Parsing t/jit/jitted.ops... # Parsed t/jit/jitted.ops in 0.232 seconds; found 14 ops. ok 5 - Got Ops::Trans::JIT ok 6 - jit_context ok 7 - VTABLE ok 8 - PMC ok 9 - interp_struct ok 10 - opcode_t * # say_sc # say_ic # say_sc # end # 0 say_sc # 2 say_ic # 4 say_sc # 6 end ; ModuleID = 'foo' %0 = type { %1, i32, i32, i32 } %1 = type opaque %opcode_ptr = type i32* %struct.PMC = type { i32, %struct.VTABLE*, i8*, %struct.PMC* } %struct.VTABLE = type { } %struct.parrot_interp_t = type { %struct.PMC* } define i32* @foo(i32* %cur_opcode, %struct.parrot_interp_t* %interp) { entry: %cur_opcode_addr = alloca i32* ; <i32**> [#uses=1] store i32* %cur_opcode, i32** %cur_opcode_addr %interp_addr = alloca %struct.parrot_interp_t* ; <%struct.parrot_interp_t**> [#uses=1] store %struct.parrot_interp_t* %interp, %struct.parrot_interp_t** %interp_addr %retval = alloca i32* ; <i32**> [#uses=2] %CUR_CTX = alloca %0* ; <%0**> [#uses=0] br label %L0 L0: ; preds = %entry br label %L2 L2: ; preds = %L0 br label %L4 L4: ; preds = %L2 br label %L6 L6: ; preds = %L4 store i32* null, i32** %retval br label %leave leave: ; preds = %L6 %0 = load i32** %retval ; <i32*> [#uses=1] ret i32* %0 } ok 11 - Module verified ~/src/parrot (jit_prototype)$
Stay tuned! We can have first functional prototype in just few days :)