From 54978e481befa5988df1dc3edc76c9467d5c47b4 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Mon, 7 Mar 2011 20:21:38 +0100 Subject: DUALNUM: Make overflow guards weak. Add IR_USE and IR_MULOV. --- src/lj_opt_fold.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'src/lj_opt_fold.c') 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) return INTFOLD(kfold_intop(fleft->i, fright->i, (IROp)fins->o)); } +LJFOLD(ADDOV KINT KINT) +LJFOLD(SUBOV KINT KINT) +LJFOLD(MULOV KINT KINT) +LJFOLDF(kfold_intovarith) +{ + lua_Number n = lj_vm_foldarith((lua_Number)fleft->i, (lua_Number)fright->i, + fins->o - IR_ADDOV); + int32_t k = lj_num2int(n); + if (n != (lua_Number)k) + return FAILFOLD; + return INTFOLD(k); +} + LJFOLD(BNOT KINT) LJFOLDF(kfold_bnot) { @@ -992,6 +1005,21 @@ LJFOLDF(simplify_intadd_k) return NEXTFOLD; } +LJFOLD(MULOV any KINT) +LJFOLDF(simplify_intmul_k) +{ + if (fright->i == 0) /* i * 0 ==> 0 */ + return RIGHTFOLD; + if (fright->i == 1) /* i * 1 ==> i */ + return LEFTFOLD; + if (fright->i == 2) { /* i * 2 ==> i + i */ + fins->o = IR_ADDOV; + fins->op2 = fins->op1; + return RETRYFOLD; + } + return NEXTFOLD; +} + LJFOLD(SUB any KINT) LJFOLDF(simplify_intsub_k) { @@ -1484,6 +1512,7 @@ LJFOLDF(abc_invar) LJFOLD(ADD any any) LJFOLD(MUL any any) LJFOLD(ADDOV any any) +LJFOLD(MULOV any any) LJFOLDF(comm_swap) { if (fins->op1 < fins->op2) { /* Move lower ref to the right. */ -- cgit v1.2.3-55-g6feb