Reset the hotcount table after a JIT off to on transition.

This commit is contained in:
Mike Pall 2010-02-04 20:40:00 +01:00
parent 7256690364
commit 5d2690c608
3 changed files with 18 additions and 15 deletions

View File

@ -437,9 +437,6 @@ static int jitopt_flag(jit_State *J, const char *str)
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)
{
@ -453,7 +450,7 @@ 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;
@ -498,16 +495,6 @@ JIT_PARAMDEF(JIT_PARAMINIT)
#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. */
@ -570,7 +557,6 @@ static void jit_init(lua_State *L)
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);

View File

@ -34,6 +34,18 @@ void lj_dispatch_init(GG_State *GG)
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)
{
@ -77,6 +89,10 @@ 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
}
}

View File

@ -56,6 +56,7 @@ typedef struct GG_State {
/* 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. */