mirror of
https://github.com/love2d/megasource.git
synced 2026-08-19 20:20:11 +02:00
Update LuaJIT to LuaJIT/LuaJIT@03080b7
This commit is contained in:
+22
-12
@@ -664,17 +664,24 @@ static LoopEvent rec_itern(jit_State *J, BCReg ra, BCReg rb)
|
||||
RecordIndex ix;
|
||||
/* Since ITERN is recorded at the start, we need our own loop detection. */
|
||||
if (J->pc == J->startpc &&
|
||||
(J->cur.nins > REF_FIRST+1 ||
|
||||
(J->cur.nins == REF_FIRST+1 && J->cur.ir[REF_FIRST].o != IR_PROF)) &&
|
||||
J->framedepth + J->retdepth == 0 && J->parent == 0 && J->exitno == 0) {
|
||||
lj_record_stop(J, LJ_TRLINK_LOOP, J->cur.traceno); /* Looping trace. */
|
||||
return LOOPEV_ENTER;
|
||||
IRRef ref = REF_FIRST + LJ_HASPROFILE;
|
||||
#ifdef LUAJIT_ENABLE_CHECKHOOK
|
||||
ref += 3;
|
||||
#endif
|
||||
if (J->cur.nins > ref ||
|
||||
(LJ_HASPROFILE && J->cur.nins == ref && J->cur.ir[ref-1].o != IR_PROF)) {
|
||||
J->instunroll = 0; /* Cannot continue unrolling across an ITERN. */
|
||||
lj_record_stop(J, LJ_TRLINK_LOOP, J->cur.traceno); /* Looping trace. */
|
||||
return LOOPEV_ENTER;
|
||||
}
|
||||
}
|
||||
J->maxslot = ra;
|
||||
lj_snap_add(J); /* Required to make JLOOP the first ins in a side-trace. */
|
||||
ix.tab = getslot(J, ra-2);
|
||||
ix.key = J->base[ra-1] ? J->base[ra-1] :
|
||||
sloadt(J, (int32_t)(ra-1), IRT_INT, IRSLOAD_KEYINDEX);
|
||||
sloadt(J, (int32_t)(ra-1), IRT_GUARD|IRT_INT,
|
||||
IRSLOAD_TYPECHECK|IRSLOAD_KEYINDEX);
|
||||
copyTV(J->L, &ix.tabv, &J->L->base[ra-2]);
|
||||
copyTV(J->L, &ix.keyv, &J->L->base[ra-1]);
|
||||
ix.idxchain = (rb < 3); /* Omit value type check, if unused. */
|
||||
@@ -1446,16 +1453,16 @@ static TRef rec_idx_key(jit_State *J, RecordIndex *ix, IRRef *rbref,
|
||||
key = emitir(IRTN(IR_CONV), key, IRCONV_NUM_INT);
|
||||
if (tref_isk(key)) {
|
||||
/* Optimize lookup of constant hash keys. */
|
||||
MSize hslot = (MSize)((char *)ix->oldv - (char *)&noderef(t->node)[0].val);
|
||||
if (t->hmask > 0 && hslot <= t->hmask*(MSize)sizeof(Node) &&
|
||||
hslot <= 65535*(MSize)sizeof(Node)) {
|
||||
GCSize hslot = (GCSize)((char *)ix->oldv-(char *)&noderef(t->node)[0].val);
|
||||
if (hslot <= t->hmask*(GCSize)sizeof(Node) &&
|
||||
hslot <= 65535*(GCSize)sizeof(Node)) {
|
||||
TRef node, kslot, hm;
|
||||
*rbref = J->cur.nins; /* Mark possible rollback point. */
|
||||
*rbguard = J->guardemit;
|
||||
hm = emitir(IRTI(IR_FLOAD), ix->tab, IRFL_TAB_HMASK);
|
||||
emitir(IRTGI(IR_EQ), hm, lj_ir_kint(J, (int32_t)t->hmask));
|
||||
node = emitir(IRT(IR_FLOAD, IRT_PGC), ix->tab, IRFL_TAB_NODE);
|
||||
kslot = lj_ir_kslot(J, key, hslot / sizeof(Node));
|
||||
kslot = lj_ir_kslot(J, key, (IRRef)(hslot / sizeof(Node)));
|
||||
return emitir(IRTG(IR_HREFK, IRT_PGC), node, kslot);
|
||||
}
|
||||
}
|
||||
@@ -1954,7 +1961,7 @@ static void rec_varg(jit_State *J, BCReg dst, ptrdiff_t nresults)
|
||||
emitir(IRTGI(IR_EQ), fr,
|
||||
lj_ir_kint(J, (int32_t)frame_ftsz(J->L->base-1)));
|
||||
vbase = emitir(IRT(IR_SUB, IRT_IGC), REF_BASE, fr);
|
||||
vbase = emitir(IRT(IR_ADD, IRT_PGC), vbase, lj_ir_kint(J, frofs-8));
|
||||
vbase = emitir(IRT(IR_ADD, IRT_PGC), vbase, lj_ir_kint(J, frofs-8*(1+LJ_FR2)));
|
||||
for (i = 0; i < nload; i++) {
|
||||
IRType t = itype2irt(&J->L->base[i-1-LJ_FR2-nvararg]);
|
||||
J->base[dst+i] = lj_record_vload(J, vbase, i, t);
|
||||
@@ -2041,7 +2048,7 @@ static TRef rec_tnew(jit_State *J, uint32_t ah)
|
||||
static TRef rec_cat(jit_State *J, BCReg baseslot, BCReg topslot)
|
||||
{
|
||||
TRef *top = &J->base[topslot];
|
||||
TValue savetv[5];
|
||||
TValue savetv[5+LJ_FR2];
|
||||
BCReg s;
|
||||
RecordIndex ix;
|
||||
lj_assertJ(baseslot < topslot, "bad CAT arg");
|
||||
@@ -2231,6 +2238,7 @@ void lj_record_ins(jit_State *J)
|
||||
case BCMpri: setpriV(rcv, ~rc); ix.key = rc = TREF_PRI(IRT_NIL+rc); break;
|
||||
case BCMnum: { cTValue *tv = proto_knumtv(J->pt, rc);
|
||||
copyTV(J->L, rcv, tv); ix.key = rc = tvisint(tv) ? lj_ir_kint(J, intV(tv)) :
|
||||
tv->u32.hi == LJ_KEYINDEX ? (lj_ir_kint(J, 0) | TREF_KEYINDEX) :
|
||||
lj_ir_knumint(J, numV(tv)); } break;
|
||||
case BCMstr: { GCstr *s = gco2str(proto_kgc(J->pt, ~(ptrdiff_t)rc));
|
||||
setstrV(J->L, rcv, s); ix.key = rc = lj_ir_kstr(J, s); } break;
|
||||
@@ -2393,7 +2401,7 @@ void lj_record_ins(jit_State *J)
|
||||
|
||||
case BC_POW:
|
||||
if (tref_isnumber_str(rb) && tref_isnumber_str(rc))
|
||||
rc = lj_opt_narrow_pow(J, rb, rc, rbv, rcv);
|
||||
rc = lj_opt_narrow_arith(J, rb, rc, rbv, rcv, IR_POW);
|
||||
else
|
||||
rc = rec_mm_arith(J, &ix, MM_pow);
|
||||
break;
|
||||
@@ -2657,6 +2665,8 @@ static const BCIns *rec_setup_root(jit_State *J)
|
||||
J->bc_min = pc;
|
||||
break;
|
||||
case BC_ITERL:
|
||||
if (bc_op(pc[-1]) == BC_JLOOP)
|
||||
lj_trace_err(J, LJ_TRERR_LINNER);
|
||||
lj_assertJ(bc_op(pc[-1]) == BC_ITERC, "no ITERC before ITERL");
|
||||
J->maxslot = ra + bc_b(pc[-1]) - 1;
|
||||
J->bc_extent = (MSize)(-bc_j(ins))*sizeof(BCIns);
|
||||
|
||||
Reference in New Issue
Block a user