summaryrefslogtreecommitdiff
path: root/src/lj_record.c
diff options
context:
space:
mode:
authorMike Pall <mike>2010-10-11 21:13:37 +0200
committerMike Pall <mike>2010-10-11 21:13:37 +0200
commitb3cf2c70f4250c80408399c591743e7b6667b840 (patch)
treef784294c5d13064f2509ea4bf86df506a1eed8d6 /src/lj_record.c
parentcc62edebfdf3fa451a745ee2936c8df72c9e7243 (diff)
downloadluajit-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.c20
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