From ff0a1f3f4eedf8e43eeb5cc3d2f8d051b648e0c0 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Wed, 15 Aug 2012 16:17:34 +0200 Subject: [PATCH] FOLD x / 2^k ==> x * 2^-k. --- src/lj_opt_fold.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index 74cea785..461fa621 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c @@ -816,6 +816,15 @@ LJFOLDF(simplify_nummuldiv_k) fins->o = IR_ADD; fins->op2 = fins->op1; return RETRYFOLD; + } else if (fins->o == IR_DIV) { /* x / 2^k ==> x * 2^-k */ + uint64_t u = ir_knum(fright)->u64; + if ((u & U64x(000fffff,ffffffff)) == 0 && + (uint32_t)(u = ((u >> 52) & 0x7ff)) - 1 < 0x7fd) { + u = (u & (uint64_t)1 << 63) | ((uint64_t)(0x7fe - (uint32_t)u) << 52); + fins->o = IR_MUL; /* Multiply by exact reciprocal. */ + fins->op2 = lj_ir_knum_u64(J, u); + return RETRYFOLD; + } } return NEXTFOLD; }