aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-03-07 20:21:38 +0100
committerMike Pall <mike>2011-03-07 20:21:38 +0100
commit54978e481befa5988df1dc3edc76c9467d5c47b4 (patch)
tree5095152718f54b08f0f4d3f9fe4f566a4c5ee590 /src
parenta30f58b54ba645ec0b1efe7087f615451033eb38 (diff)
downloadluajit-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.c3
-rw-r--r--src/lj_ir.h7
-rw-r--r--src/lj_opt_fold.c29
-rw-r--r--src/lj_record.c5
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
250LJFOLD(ADDOV KINT KINT)
251LJFOLD(SUBOV KINT KINT)
252LJFOLD(MULOV KINT KINT)
253LJFOLDF(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
250LJFOLD(BNOT KINT) 263LJFOLD(BNOT KINT)
251LJFOLDF(kfold_bnot) 264LJFOLDF(kfold_bnot)
252{ 265{
@@ -992,6 +1005,21 @@ LJFOLDF(simplify_intadd_k)
992 return NEXTFOLD; 1005 return NEXTFOLD;
993} 1006}
994 1007
1008LJFOLD(MULOV any KINT)
1009LJFOLDF(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
995LJFOLD(SUB any KINT) 1023LJFOLD(SUB any KINT)
996LJFOLDF(simplify_intsub_k) 1024LJFOLDF(simplify_intsub_k)
997{ 1025{
@@ -1484,6 +1512,7 @@ LJFOLDF(abc_invar)
1484LJFOLD(ADD any any) 1512LJFOLD(ADD any any)
1485LJFOLD(MUL any any) 1513LJFOLD(MUL any any)
1486LJFOLD(ADDOV any any) 1514LJFOLD(ADDOV any any)
1515LJFOLD(MULOV any any)
1487LJFOLDF(comm_swap) 1516LJFOLDF(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)) {