diff options
author | Mike Pall <mike> | 2011-03-07 20:21:38 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2011-03-07 20:21:38 +0100 |
commit | 54978e481befa5988df1dc3edc76c9467d5c47b4 (patch) | |
tree | 5095152718f54b08f0f4d3f9fe4f566a4c5ee590 /src | |
parent | a30f58b54ba645ec0b1efe7087f615451033eb38 (diff) | |
download | luajit-54978e481befa5988df1dc3edc76c9467d5c47b4.tar.gz luajit-54978e481befa5988df1dc3edc76c9467d5c47b4.tar.bz2 luajit-54978e481befa5988df1dc3edc76c9467d5c47b4.zip |
DUALNUM: Make overflow guards weak. Add IR_USE and IR_MULOV.
Diffstat (limited to 'src')
-rw-r--r-- | src/lj_asm.c | 3 | ||||
-rw-r--r-- | src/lj_ir.h | 7 | ||||
-rw-r--r-- | src/lj_opt_fold.c | 29 | ||||
-rw-r--r-- | src/lj_record.c | 5 |
4 files changed, 40 insertions, 4 deletions
diff --git a/src/lj_asm.c b/src/lj_asm.c index f808dd4a..889ab668 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c | |||
@@ -3992,6 +3992,8 @@ static void asm_ir(ASMState *as, IRIns *ir) | |||
3992 | /* Miscellaneous ops. */ | 3992 | /* Miscellaneous ops. */ |
3993 | case IR_LOOP: asm_loop(as); break; | 3993 | case IR_LOOP: asm_loop(as); break; |
3994 | case IR_NOP: case IR_XBAR: lua_assert(!ra_used(ir)); break; | 3994 | case IR_NOP: case IR_XBAR: lua_assert(!ra_used(ir)); break; |
3995 | case IR_USE: | ||
3996 | ra_alloc1(as, ir->op1, irt_isfp(ir->t) ? RSET_FPR : RSET_GPR); break; | ||
3995 | case IR_PHI: asm_phi(as, ir); break; | 3997 | case IR_PHI: asm_phi(as, ir); break; |
3996 | case IR_HIOP: asm_hiop(as, ir); break; | 3998 | case IR_HIOP: asm_hiop(as, ir); break; |
3997 | 3999 | ||
@@ -4077,6 +4079,7 @@ static void asm_ir(ASMState *as, IRIns *ir) | |||
4077 | /* Overflow-checking arithmetic ops. Note: don't use LEA here! */ | 4079 | /* Overflow-checking arithmetic ops. Note: don't use LEA here! */ |
4078 | case IR_ADDOV: asm_intarith(as, ir, XOg_ADD); break; | 4080 | case IR_ADDOV: asm_intarith(as, ir, XOg_ADD); break; |
4079 | case IR_SUBOV: asm_intarith(as, ir, XOg_SUB); break; | 4081 | case IR_SUBOV: asm_intarith(as, ir, XOg_SUB); break; |
4082 | case IR_MULOV: asm_intarith(as, ir, XOg_X_IMUL); break; | ||
4080 | 4083 | ||
4081 | /* Memory references. */ | 4084 | /* Memory references. */ |
4082 | case IR_AREF: asm_aref(as, ir); break; | 4085 | case IR_AREF: asm_aref(as, ir); break; |
diff --git a/src/lj_ir.h b/src/lj_ir.h index 4813f250..060cf562 100644 --- a/src/lj_ir.h +++ b/src/lj_ir.h | |||
@@ -35,6 +35,7 @@ | |||
35 | _(BASE, N , lit, lit) \ | 35 | _(BASE, N , lit, lit) \ |
36 | _(HIOP, S , ref, ref) \ | 36 | _(HIOP, S , ref, ref) \ |
37 | _(LOOP, S , ___, ___) \ | 37 | _(LOOP, S , ___, ___) \ |
38 | _(USE, S , ref, ___) \ | ||
38 | _(PHI, S , ref, ref) \ | 39 | _(PHI, S , ref, ref) \ |
39 | _(RENAME, S , ref, lit) \ | 40 | _(RENAME, S , ref, lit) \ |
40 | \ | 41 | \ |
@@ -78,8 +79,9 @@ | |||
78 | _(FPMATH, N , ref, lit) \ | 79 | _(FPMATH, N , ref, lit) \ |
79 | \ | 80 | \ |
80 | /* Overflow-checking arithmetic ops. */ \ | 81 | /* Overflow-checking arithmetic ops. */ \ |
81 | _(ADDOV, C , ref, ref) \ | 82 | _(ADDOV, CW, ref, ref) \ |
82 | _(SUBOV, N , ref, ref) \ | 83 | _(SUBOV, NW, ref, ref) \ |
84 | _(MULOV, CW, ref, ref) \ | ||
83 | \ | 85 | \ |
84 | /* Memory ops. A = array, H = hash, U = upvalue, F = field, S = stack. */ \ | 86 | /* Memory ops. A = array, H = hash, U = upvalue, F = field, S = stack. */ \ |
85 | \ | 87 | \ |
@@ -339,6 +341,7 @@ typedef enum { | |||
339 | #define IRM_W 0x80 | 341 | #define IRM_W 0x80 |
340 | 342 | ||
341 | #define IRM_NW (IRM_N|IRM_W) | 343 | #define IRM_NW (IRM_N|IRM_W) |
344 | #define IRM_CW (IRM_C|IRM_W) | ||
342 | #define IRM_AW (IRM_A|IRM_W) | 345 | #define IRM_AW (IRM_A|IRM_W) |
343 | #define IRM_LW (IRM_L|IRM_W) | 346 | #define IRM_LW (IRM_L|IRM_W) |
344 | 347 | ||
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index e7a1ca54..495b784d 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c | |||
@@ -247,6 +247,19 @@ LJFOLDF(kfold_intarith) | |||
247 | return INTFOLD(kfold_intop(fleft->i, fright->i, (IROp)fins->o)); | 247 | return INTFOLD(kfold_intop(fleft->i, fright->i, (IROp)fins->o)); |
248 | } | 248 | } |
249 | 249 | ||
250 | LJFOLD(ADDOV KINT KINT) | ||
251 | LJFOLD(SUBOV KINT KINT) | ||
252 | LJFOLD(MULOV KINT KINT) | ||
253 | LJFOLDF(kfold_intovarith) | ||
254 | { | ||
255 | lua_Number n = lj_vm_foldarith((lua_Number)fleft->i, (lua_Number)fright->i, | ||
256 | fins->o - IR_ADDOV); | ||
257 | int32_t k = lj_num2int(n); | ||
258 | if (n != (lua_Number)k) | ||
259 | return FAILFOLD; | ||
260 | return INTFOLD(k); | ||
261 | } | ||
262 | |||
250 | LJFOLD(BNOT KINT) | 263 | LJFOLD(BNOT KINT) |
251 | LJFOLDF(kfold_bnot) | 264 | LJFOLDF(kfold_bnot) |
252 | { | 265 | { |
@@ -992,6 +1005,21 @@ LJFOLDF(simplify_intadd_k) | |||
992 | return NEXTFOLD; | 1005 | return NEXTFOLD; |
993 | } | 1006 | } |
994 | 1007 | ||
1008 | LJFOLD(MULOV any KINT) | ||
1009 | LJFOLDF(simplify_intmul_k) | ||
1010 | { | ||
1011 | if (fright->i == 0) /* i * 0 ==> 0 */ | ||
1012 | return RIGHTFOLD; | ||
1013 | if (fright->i == 1) /* i * 1 ==> i */ | ||
1014 | return LEFTFOLD; | ||
1015 | if (fright->i == 2) { /* i * 2 ==> i + i */ | ||
1016 | fins->o = IR_ADDOV; | ||
1017 | fins->op2 = fins->op1; | ||
1018 | return RETRYFOLD; | ||
1019 | } | ||
1020 | return NEXTFOLD; | ||
1021 | } | ||
1022 | |||
995 | LJFOLD(SUB any KINT) | 1023 | LJFOLD(SUB any KINT) |
996 | LJFOLDF(simplify_intsub_k) | 1024 | LJFOLDF(simplify_intsub_k) |
997 | { | 1025 | { |
@@ -1484,6 +1512,7 @@ LJFOLDF(abc_invar) | |||
1484 | LJFOLD(ADD any any) | 1512 | LJFOLD(ADD any any) |
1485 | LJFOLD(MUL any any) | 1513 | LJFOLD(MUL any any) |
1486 | LJFOLD(ADDOV any any) | 1514 | LJFOLD(ADDOV any any) |
1515 | LJFOLD(MULOV any any) | ||
1487 | LJFOLDF(comm_swap) | 1516 | LJFOLDF(comm_swap) |
1488 | { | 1517 | { |
1489 | if (fins->op1 < fins->op2) { /* Move lower ref to the right. */ | 1518 | if (fins->op1 < fins->op2) { /* Move lower ref to the right. */ |
diff --git a/src/lj_record.c b/src/lj_record.c index e20d142a..2bfd2608 100644 --- a/src/lj_record.c +++ b/src/lj_record.c | |||
@@ -1860,8 +1860,9 @@ static void rec_setup_forl(jit_State *J, const BCIns *fori) | |||
1860 | emitir(IRTGI(IR_GE), step, lj_ir_kint(J, (int32_t)0x80000000-k)); | 1860 | emitir(IRTGI(IR_GE), step, lj_ir_kint(J, (int32_t)0x80000000-k)); |
1861 | } | 1861 | } |
1862 | } else { | 1862 | } else { |
1863 | /* Stop+step variable: need full overflow check (with dead result). */ | 1863 | /* Stop+step variable: need full overflow check. */ |
1864 | emitir(IRTGI(IR_ADDOV), step, stop); | 1864 | TRef tr = emitir(IRTGI(IR_ADDOV), step, stop); |
1865 | emitir(IRTI(IR_USE), tr, 0); /* ADDOV is weak. Avoid dead result. */ | ||
1865 | } | 1866 | } |
1866 | } | 1867 | } |
1867 | } else if (t == IRT_INT && !tref_isk(stop)) { | 1868 | } else if (t == IRT_INT && !tref_isk(stop)) { |