diff options
author | Mike Pall <mike> | 2011-02-05 18:54:08 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2011-02-05 18:54:08 +0100 |
commit | bf05209e1446aa13416b3dfffe021c85057b9a5d (patch) | |
tree | 7082cc97aab24dd010617e6001bfa8ee2548c116 /src/lj_record.c | |
parent | da3f256a52504ae6019875a80de1e0f7d1a19ebd (diff) | |
download | luajit-bf05209e1446aa13416b3dfffe021c85057b9a5d.tar.gz luajit-bf05209e1446aa13416b3dfffe021c85057b9a5d.tar.bz2 luajit-bf05209e1446aa13416b3dfffe021c85057b9a5d.zip |
FFI: Optimize snapshots for cdata comparisons.
Diffstat (limited to 'src/lj_record.c')
-rw-r--r-- | src/lj_record.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/lj_record.c b/src/lj_record.c index 94bd0ed4..d8c67499 100644 --- a/src/lj_record.c +++ b/src/lj_record.c | |||
@@ -1355,10 +1355,10 @@ static void rec_comp_prep(jit_State *J) | |||
1355 | } | 1355 | } |
1356 | 1356 | ||
1357 | /* Fixup comparison. */ | 1357 | /* Fixup comparison. */ |
1358 | static void rec_comp_fixup(jit_State *J, int cond) | 1358 | static void rec_comp_fixup(jit_State *J, const BCIns *pc, int cond) |
1359 | { | 1359 | { |
1360 | BCIns jmpins = J->pc[1]; | 1360 | BCIns jmpins = pc[1]; |
1361 | const BCIns *npc = J->pc + 2 + (cond ? bc_j(jmpins) : 0); | 1361 | const BCIns *npc = pc + 2 + (cond ? bc_j(jmpins) : 0); |
1362 | SnapShot *snap = &J->cur.snap[J->cur.nsnap-1]; | 1362 | SnapShot *snap = &J->cur.snap[J->cur.nsnap-1]; |
1363 | /* Set PC to opposite target to avoid re-recording the comp. in side trace. */ | 1363 | /* Set PC to opposite target to avoid re-recording the comp. in side trace. */ |
1364 | J->cur.snapmap[snap->mapofs + snap->nent] = SNAP_MKPC(npc); | 1364 | J->cur.snapmap[snap->mapofs + snap->nent] = SNAP_MKPC(npc); |
@@ -1383,6 +1383,10 @@ void lj_record_ins(jit_State *J) | |||
1383 | /* Perform post-processing action before recording the next instruction. */ | 1383 | /* Perform post-processing action before recording the next instruction. */ |
1384 | if (LJ_UNLIKELY(J->postproc != LJ_POST_NONE)) { | 1384 | if (LJ_UNLIKELY(J->postproc != LJ_POST_NONE)) { |
1385 | switch (J->postproc) { | 1385 | switch (J->postproc) { |
1386 | case LJ_POST_FIXCOMP: /* Fixup comparison. */ | ||
1387 | pc = frame_pc(&J2G(J)->tmptv); | ||
1388 | rec_comp_fixup(J, pc, (!tvistruecond(&J2G(J)->tmptv2) ^ (bc_op(*pc)&1))); | ||
1389 | /* fallthrough */ | ||
1386 | case LJ_POST_FIXGUARD: /* Fixup and emit pending guard. */ | 1390 | case LJ_POST_FIXGUARD: /* Fixup and emit pending guard. */ |
1387 | if (!tvistruecond(&J2G(J)->tmptv2)) { | 1391 | if (!tvistruecond(&J2G(J)->tmptv2)) { |
1388 | BCReg s; | 1392 | BCReg s; |
@@ -1505,7 +1509,7 @@ void lj_record_ins(jit_State *J) | |||
1505 | break; | 1509 | break; |
1506 | } | 1510 | } |
1507 | emitir(IRTG(irop, ta), ra, rc); | 1511 | emitir(IRTG(irop, ta), ra, rc); |
1508 | rec_comp_fixup(J, ((int)op ^ irop) & 1); | 1512 | rec_comp_fixup(J, J->pc, ((int)op ^ irop) & 1); |
1509 | } | 1513 | } |
1510 | break; | 1514 | break; |
1511 | 1515 | ||
@@ -1529,7 +1533,7 @@ void lj_record_ins(jit_State *J) | |||
1529 | rec_mm_equal(J, &ix, (int)op); | 1533 | rec_mm_equal(J, &ix, (int)op); |
1530 | break; | 1534 | break; |
1531 | } | 1535 | } |
1532 | rec_comp_fixup(J, ((int)op & 1) == !diff); | 1536 | rec_comp_fixup(J, J->pc, ((int)op & 1) == !diff); |
1533 | } | 1537 | } |
1534 | break; | 1538 | break; |
1535 | 1539 | ||