diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lj_iropt.h | 1 | ||||
| -rw-r--r-- | src/lj_opt_fold.c | 14 | ||||
| -rw-r--r-- | src/lj_opt_narrow.c | 15 | ||||
| -rw-r--r-- | src/lj_record.c | 3 |
4 files changed, 30 insertions, 3 deletions
diff --git a/src/lj_iropt.h b/src/lj_iropt.h index dd1128bc..82dc2e27 100644 --- a/src/lj_iropt.h +++ b/src/lj_iropt.h | |||
| @@ -141,6 +141,7 @@ LJ_FUNC TRef LJ_FASTCALL lj_opt_narrow_cindex(jit_State *J, TRef key); | |||
| 141 | #endif | 141 | #endif |
| 142 | LJ_FUNC TRef lj_opt_narrow_arith(jit_State *J, TRef rb, TRef rc, | 142 | LJ_FUNC TRef lj_opt_narrow_arith(jit_State *J, TRef rb, TRef rc, |
| 143 | TValue *vb, TValue *vc, IROp op); | 143 | TValue *vb, TValue *vc, IROp op); |
| 144 | LJ_FUNC TRef lj_opt_narrow_unm(jit_State *J, TRef rc, TValue *vc); | ||
| 144 | LJ_FUNC TRef lj_opt_narrow_mod(jit_State *J, TRef rb, TRef rc); | 145 | LJ_FUNC TRef lj_opt_narrow_mod(jit_State *J, TRef rb, TRef rc); |
| 145 | LJ_FUNC TRef lj_opt_narrow_pow(jit_State *J, TRef rb, TRef rc, TValue *vc); | 146 | LJ_FUNC TRef lj_opt_narrow_pow(jit_State *J, TRef rb, TRef rc, TValue *vc); |
| 146 | LJ_FUNC IRType lj_opt_narrow_forl(jit_State *J, cTValue *forbase); | 147 | LJ_FUNC IRType lj_opt_narrow_forl(jit_State *J, cTValue *forbase); |
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index 325b0372..edd376c9 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c | |||
| @@ -701,7 +701,7 @@ LJFOLDF(shortcut_dropleft) | |||
| 701 | } | 701 | } |
| 702 | 702 | ||
| 703 | /* Note: no safe shortcuts with STRTO and TOSTR ("1e2" ==> +100 ==> "100"). */ | 703 | /* Note: no safe shortcuts with STRTO and TOSTR ("1e2" ==> +100 ==> "100"). */ |
| 704 | LJFOLD(NEG NEG KNUM) | 704 | LJFOLD(NEG NEG any) |
| 705 | LJFOLD(BNOT BNOT) | 705 | LJFOLD(BNOT BNOT) |
| 706 | LJFOLD(BSWAP BSWAP) | 706 | LJFOLD(BSWAP BSWAP) |
| 707 | LJFOLDF(shortcut_leftleft) | 707 | LJFOLDF(shortcut_leftleft) |
| @@ -1067,6 +1067,18 @@ LJFOLDF(simplify_intsub_k) | |||
| 1067 | return RETRYFOLD; | 1067 | return RETRYFOLD; |
| 1068 | } | 1068 | } |
| 1069 | 1069 | ||
| 1070 | LJFOLD(SUB KINT any) | ||
| 1071 | LJFOLD(SUB KINT64 any) | ||
| 1072 | LJFOLDF(simplify_intsub_kleft) | ||
| 1073 | { | ||
| 1074 | if (fleft->o == IR_KINT ? (fleft->i == 0) : (ir_kint64(fleft)->u64 == 0)) { | ||
| 1075 | fins->o = IR_NEG; /* 0 - i ==> -i */ | ||
| 1076 | fins->op1 = fins->op2; | ||
| 1077 | return RETRYFOLD; | ||
| 1078 | } | ||
| 1079 | return NEXTFOLD; | ||
| 1080 | } | ||
| 1081 | |||
| 1070 | LJFOLD(ADD any KINT64) | 1082 | LJFOLD(ADD any KINT64) |
| 1071 | LJFOLDF(simplify_intadd_k64) | 1083 | LJFOLDF(simplify_intadd_k64) |
| 1072 | { | 1084 | { |
diff --git a/src/lj_opt_narrow.c b/src/lj_opt_narrow.c index 1727e9b5..e7f280ec 100644 --- a/src/lj_opt_narrow.c +++ b/src/lj_opt_narrow.c | |||
| @@ -535,6 +535,21 @@ TRef lj_opt_narrow_arith(jit_State *J, TRef rb, TRef rc, | |||
| 535 | return emitir(IRTN(op), rb, rc); | 535 | return emitir(IRTN(op), rb, rc); |
| 536 | } | 536 | } |
| 537 | 537 | ||
| 538 | /* Narrowing of unary minus operator. */ | ||
| 539 | TRef lj_opt_narrow_unm(jit_State *J, TRef rc, TValue *vc) | ||
| 540 | { | ||
| 541 | if (tref_isstr(rc)) { | ||
| 542 | rc = emitir(IRTG(IR_STRTO, IRT_NUM), rc, 0); | ||
| 543 | lj_str_tonum(strV(vc), vc); | ||
| 544 | } | ||
| 545 | if (tref_isinteger(rc)) { | ||
| 546 | if ((uint32_t)numberVint(vc) != 0x80000000u) | ||
| 547 | return emitir(IRTGI(IR_SUBOV), lj_ir_kint(J, 0), rc); | ||
| 548 | rc = emitir(IRTN(IR_CONV), rc, IRCONV_NUM_INT); | ||
| 549 | } | ||
| 550 | return emitir(IRTN(IR_NEG), rc, lj_ir_knum_neg(J)); | ||
| 551 | } | ||
| 552 | |||
| 538 | /* Narrowing of modulo operator. */ | 553 | /* Narrowing of modulo operator. */ |
| 539 | TRef lj_opt_narrow_mod(jit_State *J, TRef rb, TRef rc) | 554 | TRef lj_opt_narrow_mod(jit_State *J, TRef rb, TRef rc) |
| 540 | { | 555 | { |
diff --git a/src/lj_record.c b/src/lj_record.c index 613e458e..ea23c758 100644 --- a/src/lj_record.c +++ b/src/lj_record.c | |||
| @@ -1666,8 +1666,7 @@ void lj_record_ins(jit_State *J) | |||
| 1666 | 1666 | ||
| 1667 | case BC_UNM: | 1667 | case BC_UNM: |
| 1668 | if (tref_isnumber_str(rc)) { | 1668 | if (tref_isnumber_str(rc)) { |
| 1669 | rc = lj_ir_tonum(J, rc); | 1669 | rc = lj_opt_narrow_unm(J, rc, &ix.tabv); |
| 1670 | rc = emitir(IRTN(IR_NEG), rc, lj_ir_knum_neg(J)); | ||
| 1671 | } else { | 1670 | } else { |
| 1672 | ix.tab = rc; | 1671 | ix.tab = rc; |
| 1673 | copyTV(J->L, &ix.tabv, &ix.keyv); | 1672 | copyTV(J->L, &ix.tabv, &ix.keyv); |
