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