diff options
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)) { |
