aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-03-15 17:56:55 +0100
committerMike Pall <mike>2011-03-15 18:14:18 +0100
commitdcbae09b1d462cc4ed7c11b0ff10d5c1f74eebd7 (patch)
tree97b8f9253d30f2c6310de9bf804e32181ff75451 /src
parenta226fb4cc7758e7ccbe308b69eeca64c68438788 (diff)
downloadluajit-dcbae09b1d462cc4ed7c11b0ff10d5c1f74eebd7.tar.gz
luajit-dcbae09b1d462cc4ed7c11b0ff10d5c1f74eebd7.tar.bz2
luajit-dcbae09b1d462cc4ed7c11b0ff10d5c1f74eebd7.zip
DUALNUM: Narrow unary minus.
Diffstat (limited to 'src')
-rw-r--r--src/lj_iropt.h1
-rw-r--r--src/lj_opt_fold.c14
-rw-r--r--src/lj_opt_narrow.c15
-rw-r--r--src/lj_record.c3
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
142LJ_FUNC TRef lj_opt_narrow_arith(jit_State *J, TRef rb, TRef rc, 142LJ_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);
144LJ_FUNC TRef lj_opt_narrow_unm(jit_State *J, TRef rc, TValue *vc);
144LJ_FUNC TRef lj_opt_narrow_mod(jit_State *J, TRef rb, TRef rc); 145LJ_FUNC TRef lj_opt_narrow_mod(jit_State *J, TRef rb, TRef rc);
145LJ_FUNC TRef lj_opt_narrow_pow(jit_State *J, TRef rb, TRef rc, TValue *vc); 146LJ_FUNC TRef lj_opt_narrow_pow(jit_State *J, TRef rb, TRef rc, TValue *vc);
146LJ_FUNC IRType lj_opt_narrow_forl(jit_State *J, cTValue *forbase); 147LJ_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"). */
704LJFOLD(NEG NEG KNUM) 704LJFOLD(NEG NEG any)
705LJFOLD(BNOT BNOT) 705LJFOLD(BNOT BNOT)
706LJFOLD(BSWAP BSWAP) 706LJFOLD(BSWAP BSWAP)
707LJFOLDF(shortcut_leftleft) 707LJFOLDF(shortcut_leftleft)
@@ -1067,6 +1067,18 @@ LJFOLDF(simplify_intsub_k)
1067 return RETRYFOLD; 1067 return RETRYFOLD;
1068} 1068}
1069 1069
1070LJFOLD(SUB KINT any)
1071LJFOLD(SUB KINT64 any)
1072LJFOLDF(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
1070LJFOLD(ADD any KINT64) 1082LJFOLD(ADD any KINT64)
1071LJFOLDF(simplify_intadd_k64) 1083LJFOLDF(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. */
539TRef 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. */
539TRef lj_opt_narrow_mod(jit_State *J, TRef rb, TRef rc) 554TRef 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);