return 0; /* No match. */
}
-/* Forward declaration. */
-static void jit_init_hotcount(jit_State *J);
-
/* Parse optimization parameter. */
static int jitopt_param(jit_State *J, const char *str)
{
lj_str_numconv(&str[len+1], &tv)) {
J->param[i] = lj_num2int(tv.n);
if (i == JIT_P_hotloop)
- jit_init_hotcount(J);
+ lj_dispatch_init_hotcount(J2G(J));
return 1; /* Ok. */
}
lst += 1+len;
#undef JIT_PARAMINIT
0
};
-
-/* Initialize hotcount table. */
-static void jit_init_hotcount(jit_State *J)
-{
- HotCount start = (HotCount)J->param[JIT_P_hotloop];
- HotCount *hotcount = J2GG(J)->hotcount;
- uint32_t i;
- for (i = 0; i < HOTCOUNT_SIZE; i++)
- hotcount[i] = start;
-}
#endif
/* Arch-dependent CPU detection. */
jit_State *J = L2J(L);
J->flags = flags | JIT_F_ON | JIT_F_OPT_DEFAULT;
memcpy(J->param, jit_param_default, sizeof(J->param));
- jit_init_hotcount(J);
lj_dispatch_update(G(L));
#else
UNUSED(flags);
disp[BC_LOOP] = disp[BC_ILOOP];
}
+#if LJ_HASJIT
+/* Initialize hotcount table. */
+void lj_dispatch_init_hotcount(global_State *g)
+{
+ HotCount start = (HotCount)G2J(g)->param[JIT_P_hotloop];
+ HotCount *hotcount = G2GG(g)->hotcount;
+ uint32_t i;
+ for (i = 0; i < HOTCOUNT_SIZE; i++)
+ hotcount[i] = start;
+}
+#endif
+
/* Update dispatch table depending on various flags. */
void lj_dispatch_update(global_State *g)
{
disp[BC_ITERL] = f_iterl;
disp[BC_LOOP] = f_loop;
}
+#if LJ_HASJIT
+ if ((mode & 1) && !(oldmode & 1)) /* JIT off to on transition. */
+ lj_dispatch_init_hotcount(g);
+#endif
}
}
/* Dispatch table management. */
LJ_FUNC void lj_dispatch_init(GG_State *GG);
+LJ_FUNC void lj_dispatch_init_hotcount(global_State *g);
LJ_FUNC void lj_dispatch_update(global_State *g);
/* Instruction dispatch callback for instr/line hooks or when recording. */