diff options
author | Mike Pall <mike> | 2010-10-11 21:13:37 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2010-10-11 21:13:37 +0200 |
commit | b3cf2c70f4250c80408399c591743e7b6667b840 (patch) | |
tree | f784294c5d13064f2509ea4bf86df506a1eed8d6 /src/lj_record.c | |
parent | cc62edebfdf3fa451a745ee2936c8df72c9e7243 (diff) | |
download | luajit-b3cf2c70f4250c80408399c591743e7b6667b840.tar.gz luajit-b3cf2c70f4250c80408399c591743e7b6667b840.tar.bz2 luajit-b3cf2c70f4250c80408399c591743e7b6667b840.zip |
Decouple SLOAD type and optional conversion.
Diffstat (limited to 'src/lj_record.c')
-rw-r--r-- | src/lj_record.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/src/lj_record.c b/src/lj_record.c index 4845eeac..00cdcfe6 100644 --- a/src/lj_record.c +++ b/src/lj_record.c | |||
@@ -298,11 +298,11 @@ static TRef fori_arg(jit_State *J, const BCIns *fori, BCReg slot, IRType t) | |||
298 | TRef tr = J->base[slot]; | 298 | TRef tr = J->base[slot]; |
299 | if (!tr) { | 299 | if (!tr) { |
300 | tr = find_kinit(J, fori, slot, t); | 300 | tr = find_kinit(J, fori, slot, t); |
301 | if (!tr) { | 301 | if (!tr) |
302 | if (t == IRT_INT) | 302 | tr = sloadt(J, (int32_t)slot, |
303 | t |= IRT_GUARD; | 303 | t == IRT_INT ? (IRT_INT|IRT_GUARD) : t, |
304 | tr = sloadt(J, (int32_t)slot, t, IRSLOAD_READONLY|IRSLOAD_INHERIT); | 304 | t == IRT_INT ? (IRSLOAD_CONVERT|IRSLOAD_READONLY|IRSLOAD_INHERIT) : |
305 | } | 305 | (IRSLOAD_READONLY|IRSLOAD_INHERIT)); |
306 | } | 306 | } |
307 | return tr; | 307 | return tr; |
308 | } | 308 | } |
@@ -2512,6 +2512,7 @@ static void rec_setup_forl(jit_State *J, const BCIns *fori) | |||
2512 | cTValue *forbase = &J->L->base[ra]; | 2512 | cTValue *forbase = &J->L->base[ra]; |
2513 | IRType t = (J->flags & JIT_F_OPT_NARROW) ? lj_opt_narrow_forl(forbase) | 2513 | IRType t = (J->flags & JIT_F_OPT_NARROW) ? lj_opt_narrow_forl(forbase) |
2514 | : IRT_NUM; | 2514 | : IRT_NUM; |
2515 | TRef start; | ||
2515 | TRef stop = fori_arg(J, fori, ra+FORL_STOP, t); | 2516 | TRef stop = fori_arg(J, fori, ra+FORL_STOP, t); |
2516 | TRef step = fori_arg(J, fori, ra+FORL_STEP, t); | 2517 | TRef step = fori_arg(J, fori, ra+FORL_STEP, t); |
2517 | int dir = (0 <= numV(&forbase[FORL_STEP])); | 2518 | int dir = (0 <= numV(&forbase[FORL_STEP])); |
@@ -2548,10 +2549,11 @@ static void rec_setup_forl(jit_State *J, const BCIns *fori) | |||
2548 | emitir(IRTGI(dir ? IR_LE : IR_GE), stop, lj_ir_kint(J, k)); | 2549 | emitir(IRTGI(dir ? IR_LE : IR_GE), stop, lj_ir_kint(J, k)); |
2549 | } | 2550 | } |
2550 | J->scev.start = tref_ref(find_kinit(J, fori, ra+FORL_IDX, IRT_INT)); | 2551 | J->scev.start = tref_ref(find_kinit(J, fori, ra+FORL_IDX, IRT_INT)); |
2551 | if (t == IRT_INT && !J->scev.start) | 2552 | start = sloadt(J, (int32_t)(ra+FORL_IDX), |
2552 | t |= IRT_GUARD; | 2553 | (t == IRT_INT && !J->scev.start) ? (IRT_INT|IRT_GUARD) : t, |
2553 | J->base[ra+FORL_EXT] = sloadt(J, (int32_t)(ra+FORL_IDX), t, IRSLOAD_INHERIT); | 2554 | t == IRT_INT ? (IRSLOAD_CONVERT|IRSLOAD_INHERIT) : IRSLOAD_INHERIT); |
2554 | J->scev.idx = tref_ref(J->base[ra+FORL_EXT]); | 2555 | J->base[ra+FORL_EXT] = start; |
2556 | J->scev.idx = tref_ref(start); | ||
2555 | J->maxslot = ra+FORL_EXT+1; | 2557 | J->maxslot = ra+FORL_EXT+1; |
2556 | } | 2558 | } |
2557 | 2559 | ||