diff options
author | Mike Pall <mike> | 2011-03-15 17:56:55 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2011-03-15 18:14:18 +0100 |
commit | dcbae09b1d462cc4ed7c11b0ff10d5c1f74eebd7 (patch) | |
tree | 97b8f9253d30f2c6310de9bf804e32181ff75451 /src | |
parent | a226fb4cc7758e7ccbe308b69eeca64c68438788 (diff) | |
download | luajit-dcbae09b1d462cc4ed7c11b0ff10d5c1f74eebd7.tar.gz luajit-dcbae09b1d462cc4ed7c11b0ff10d5c1f74eebd7.tar.bz2 luajit-dcbae09b1d462cc4ed7c11b0ff10d5c1f74eebd7.zip |
DUALNUM: Narrow unary minus.
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); |