Filed PR jit/66812 for the code generation issue
Dibyendu Majumdar
mobile@majumdar.org.uk
Thu Jan 1 00:00:00 GMT 2015
Here is what I think the flow is.
part 1
--------
1 [2] LOADNIL 0 0
entry:
cl = (struct ravi_LClosure *)L->ci->func->value_.gc;
(void)raviV_op_loadnil (L->ci, (int)0, (int)0);
This sets register 0 (local variable IX) to NIL
2 [3] LOADK 1 -1 ; 10
(&L->ci->u.l.base[(int)1])->value_.i = (&cl->p->k[(int)0])->value_.i;
(&L->ci->u.l.base[(int)1])->tt_ = (&cl->p->k[(int)0])->tt_;
This sets the register at 1 (temporary) to 10.
3 [3] TEST 1 1
4 [3] JMP 0 0 ; to 5
The above two bytecodes go together. This says that if register 1 is
true then skip the JMP else JMP.
So we get:
comparison_0_5 = (&L->ci->u.l.base[(int)1])->tt_ == (int)0;
comparison_0_6 = (&L->ci->u.l.base[(int)1])->tt_ == (int)1;
comparison_0_7 = (&L->ci->u.l.base[(int)1])->value_.b == (int)0;
isfalse_0_4 = comparison_0_5 || comparison_0_6 && comparison_0_7;
if (!(isfalse_0_4)) goto OP_TEST_do_jmp_2_8; else goto OP_TEST_do_skip_2_9;
The test is checking that register 1 is true (which it is as it has
the constant 10) - then goto skip_2_9.
More information about the Jit
mailing list